Re: [PATCH 2/2] USB: musb: support ISO high bandwidth for gadget mode(v1)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



2010/8/3  <tom.leiming@xxxxxxxxx>:
> From: Ming Lei <tom.leiming@xxxxxxxxx>
>
> This has been tested OK on beagle B5 board.
>
> Signed-off-by: Ming Lei <tom.leiming@xxxxxxxxx>
> ---
>
> V1: This version fixes some csr configuration errors, which is pointed by
> Sergei.

Greg, could you queue this patch into your tree since it has
been reviewed by Sergei and other guys have no objections?

I have other patches which may depend this one.

>
> ---
>  drivers/usb/musb/musb_gadget.c |   49 ++++++++++++++++++++++++++++++---------
>  drivers/usb/musb/musb_gadget.h |    2 +
>  2 files changed, 39 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c
> index de0ca90..550b397 100644
> --- a/drivers/usb/musb/musb_gadget.c
> +++ b/drivers/usb/musb/musb_gadget.c
> @@ -337,13 +337,15 @@ static void txstate(struct musb *musb, struct musb_request *req)
>                                        csr |= (MUSB_TXCSR_DMAENAB |
>                                                        MUSB_TXCSR_MODE);
>                                        /* against programming guide */
> -                               } else
> -                                       csr |= (MUSB_TXCSR_AUTOSET
> -                                                       | MUSB_TXCSR_DMAENAB
> +                               } else {
> +                                       csr |= (MUSB_TXCSR_DMAENAB
>                                                        | MUSB_TXCSR_DMAMODE
>                                                        | MUSB_TXCSR_MODE);
> -
> +                                       if (!musb_ep->hb_mult)
> +                                               csr |= MUSB_TXCSR_AUTOSET;
> +                               }
>                                csr &= ~MUSB_TXCSR_P_UNDERRUN;
> +
>                                musb_writew(epio, MUSB_TXCSR, csr);
>                        }
>                }
> @@ -656,7 +658,8 @@ static void rxstate(struct musb *musb, struct musb_request *req)
>
>                                csr |= MUSB_RXCSR_DMAENAB;
>  #ifdef USE_MODE1
> -                               csr |= MUSB_RXCSR_AUTOCLEAR;
> +                               if (!musb_ep->hb_mult)
> +                                       csr |= MUSB_RXCSR_AUTOCLEAR;
>                                /* csr |= MUSB_RXCSR_DMAMODE; */
>
>                                /* this special sequence (enabling and then
> @@ -886,9 +889,25 @@ static int musb_gadget_enable(struct usb_ep *ep,
>
>        /* REVISIT this rules out high bandwidth periodic transfers */
>        tmp = le16_to_cpu(desc->wMaxPacketSize);
> -       if (tmp & ~0x07ff)
> -               goto fail;
> -       musb_ep->packet_sz = tmp;
> +       if (tmp & ~0x07ff) {
> +               int ok;
> +
> +               if (usb_endpoint_dir_in(desc))
> +                       ok = musb->hb_iso_tx;
> +               else
> +                       ok = musb->hb_iso_rx;
> +
> +               if (!ok) {
> +                       DBG(4, "%s: not support ISO high bandwidth\n", __func__);
> +                       goto fail;
> +               }
> +               musb_ep->hb_mult = (tmp >> 11) & 3;
> +       } else {
> +               musb_ep->hb_mult = 0;
> +       }
> +
> +       musb_ep->packet_sz = tmp & 0x7ff;
> +       tmp = musb_ep->packet_sz * (musb_ep->hb_mult + 1);
>
>        /* enable the interrupts for the endpoint, set the endpoint
>         * packet size (or fail), set the mode, clear the fifo
> @@ -901,8 +920,11 @@ static int musb_gadget_enable(struct usb_ep *ep,
>                        musb_ep->is_in = 1;
>                if (!musb_ep->is_in)
>                        goto fail;
> -               if (tmp > hw_ep->max_packet_sz_tx)
> +
> +               if (tmp > hw_ep->max_packet_sz_tx) {
> +                       DBG(4, "%s: packet size beyond hw fifo size\n", __func__);
>                        goto fail;
> +               }
>
>                int_txe |= (1 << epnum);
>                musb_writew(mbase, MUSB_INTRTXE, int_txe);
> @@ -917,7 +939,7 @@ static int musb_gadget_enable(struct usb_ep *ep,
>                if (musb->hwvers < MUSB_HWVERS_2000)
>                        musb_writew(regs, MUSB_TXMAXP, hw_ep->max_packet_sz_tx);
>                else
> -                       musb_writew(regs, MUSB_TXMAXP, tmp);
> +                       musb_writew(regs, MUSB_TXMAXP, musb_ep->packet_sz | (musb_ep->hb_mult << 11));
>
>                csr = MUSB_TXCSR_MODE | MUSB_TXCSR_CLRDATATOG;
>                if (musb_readw(regs, MUSB_TXCSR)
> @@ -938,8 +960,11 @@ static int musb_gadget_enable(struct usb_ep *ep,
>                        musb_ep->is_in = 0;
>                if (musb_ep->is_in)
>                        goto fail;
> -               if (tmp > hw_ep->max_packet_sz_rx)
> +
> +               if (tmp > hw_ep->max_packet_sz_rx) {
> +                       DBG(4, "%s: packet size beyond hw fifo size\n", __func__);
>                        goto fail;
> +               }
>
>                int_rxe |= (1 << epnum);
>                musb_writew(mbase, MUSB_INTRRXE, int_rxe);
> @@ -953,7 +978,7 @@ static int musb_gadget_enable(struct usb_ep *ep,
>                if (musb->hwvers < MUSB_HWVERS_2000)
>                        musb_writew(regs, MUSB_RXMAXP, hw_ep->max_packet_sz_rx);
>                else
> -                       musb_writew(regs, MUSB_RXMAXP, tmp);
> +                       musb_writew(regs, MUSB_RXMAXP, musb_ep->packet_sz | (musb_ep->hb_mult << 11));
>
>                /* force shared fifo to OUT-only mode */
>                if (hw_ep->is_shared_fifo) {
> diff --git a/drivers/usb/musb/musb_gadget.h b/drivers/usb/musb/musb_gadget.h
> index c8b1403..23a2bd5 100644
> --- a/drivers/usb/musb/musb_gadget.h
> +++ b/drivers/usb/musb/musb_gadget.h
> @@ -79,6 +79,8 @@ struct musb_ep {
>
>        /* true if lock must be dropped but req_list may not be advanced */
>        u8                              busy;
> +
> +       u8                              hb_mult;
>  };
>
>  static inline struct musb_ep *to_musb_ep(struct usb_ep *ep)
> --
> 1.6.2.5
>
>



-- 
Lei Ming
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux