On Tue, Nov 01, 2016 at 12:55:18PM +0200, Felipe Balbi wrote:
> 
> Hi,
> 
> Bin Liu <b-...@ti.com> writes:
> > On Wed, Sep 28, 2016 at 04:05:36PM +0300, Felipe Balbi wrote:
> >> We have introduced a helper to calculate multiplier
> >> value from wMaxPacketSize. Start using it.
> >> 
> >> Cc: Bin Liu <b-...@ti.com>
> >> Signed-off-by: Felipe Balbi <felipe.ba...@linux.intel.com>
> >> ---
> >>  drivers/usb/musb/musb_gadget.c | 6 +++---
> >>  drivers/usb/musb/musb_host.c   | 2 +-
> >>  2 files changed, 4 insertions(+), 4 deletions(-)
> >> 
> >> diff --git a/drivers/usb/musb/musb_gadget.c 
> >> b/drivers/usb/musb/musb_gadget.c
> >> index bff4869a57cd..8a0882cc446d 100644
> >> --- a/drivers/usb/musb/musb_gadget.c
> >> +++ b/drivers/usb/musb/musb_gadget.c
> >> @@ -974,8 +974,8 @@ static int musb_gadget_enable(struct usb_ep *ep,
> >>            goto fail;
> >>  
> >>    /* REVISIT this rules out high bandwidth periodic transfers */
> >> -  tmp = usb_endpoint_maxp(desc);
> >
> > The bit 10~0 in tmp is also needed in the original code, 
> 
> no it's not
> 
> >> -  if (tmp & ~0x07ff) {
> >> +  tmp = usb_endpoint_maxp_mult(desc) - 1;
> >
> > but here bit 10~0 is lost.
> 
> here's the whole thing unpatched:
> 
>       > /* REVISIT this rules out high bandwidth periodic transfers */
>       > tmp = usb_endpoint_maxp(desc);
>       > if (tmp & ~0x07ff) {
> 
> so, if we have a mult setting
> 
>       >       int ok;
>       >
>       >       if (usb_endpoint_dir_in(desc))
>       >               ok = musb->hb_iso_tx;
>       >       else
>       >               ok = musb->hb_iso_rx;
>       >
>       >       if (!ok) {
>       >               musb_dbg(musb, "no support for high bandwidth ISO");
>       >               goto fail;
>       >       }
>       >       musb_ep->hb_mult = (tmp >> 11) & 3;
> 
> then we save the zero-based value in hb_mult
> 
>       > } else {
>       >       musb_ep->hb_mult = 0;
> 
> otherwise, set it to 0.
> 
> IOW, this could be rewritten as:
> 
>       int ok;
> 
> [...]
>       
>       /* REVISIT this rules out high bandwidth periodic transfers */
>       tmp = usb_endpoint_maxp_mult(desc) - 1;
>       if (usb_endpoint_dir_in(desc))
>               ok = musb->hb_iso_tx & tmp;
>       else
>               ok = musb->hb_iso_rx & tmp;
> 
>       if (!ok) {
>               musb_dbg(musb, "no support for high bandwidth ISO");
>               goto fail;
>       }
>       musb_ep->hb_mult = tmp;

I like this new version, one level less in indentation.

> 
> And nothing would change. There is, however, one small problem with this
> patch, but that's a few lines after this chunk. Here's the incremental
> patch to fix it:
> 
> diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c
> index 0e3404ce9465..47304560f105 100644
> --- a/drivers/usb/musb/musb_gadget.c
> +++ b/drivers/usb/musb/musb_gadget.c
> @@ -992,7 +992,7 @@ static int musb_gadget_enable(struct usb_ep *ep,
>                 musb_ep->hb_mult = 0;
>         }
>  
> -       musb_ep->packet_sz = tmp & 0x7ff;

This is the problem I meant, tmp is used here again.

> +       musb_ep->packet_sz = usb_endpoint_maxp(desc);

This should fix it.

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

Reply via email to