On Thu, Nov 21, 2019 at 06:52:36AM +0000, [email protected] wrote:
> Hi,
> 
> On 2019/11/18 20:34, Marcus Glocker wrote:
> > On Sun, Nov 17, 2019 at 12:36:49PM +0100, Marcus Glocker wrote:
> > 
> >> While recently testing UDL on XHCI I faced a lot of USB timeouts, and
> >> therefore screen rendering issues.
> >> The reason is that XHCI currently only supports single bulk transfers
> >> up to 64k, while UDL can schedule a bulk transfer up to 1m.
> >>
> >> The following diff adds XHCI bulk transfer support >64k and makes UDL
> >> work fine for me on XHCI.
> >>
> >> mpi@ already did an initial re-view, and I have adapted some of his
> >> comments already in this diff.
> >>
> >> More testing and comments welcome.
> > 
> > After patrick@ did feedback that the current bulk transfer code in
> > XHCI should also work for larger transfers as is, we have found the
> > bug which resulted in a much smaller diff :-)
> > 
> > Attached for your reference.  It just has been committed.
> > 
> > 
> > Index: xhci.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/usb/xhci.c,v
> > retrieving revision 1.106
> > diff -u -p -u -p -r1.106 xhci.c
> > --- xhci.c  6 Oct 2019 17:30:00 -0000       1.106
> > +++ xhci.c  18 Nov 2019 19:32:30 -0000
> > @@ -2871,7 +2871,7 @@ xhci_device_generic_start(struct usbd_xf
> >     /* If the buffer crosses a 64k boundary, we need one more. */
> >     len = XHCI_TRB_MAXSIZE - (paddr & (XHCI_TRB_MAXSIZE - 1));
> >     if (len < xfer->length)
> > -           ntrb++;
> > +           ntrb = howmany(xfer->length - len, XHCI_TRB_MAXSIZE) + 1;
> >     else
> >             len = xfer->length;
> >  
> > 
> 
> Should xhci_device_isoc_start also count up the chunks after boundary?
> 

We had discussed this as well, but since a frame cannot be bigger than
64k, a hard boundary which is visible when you realize frlengths is a
uint16_t *, that change would essentially be a no-op.

We could change it for the sake of having the same calculation in all
places.

Thanks,
Patrick

> 
> --- sys/dev/usb/xhci.c.orig   Mon Nov 18 22:47:25 2019
> +++ sys/dev/usb/xhci.c        Thu Nov 21 05:13:02 2019
> @@ -3049,7 +3049,8 @@ xhci_device_isoc_start(struct usbd_xfer *xfer)
>               /* If the buffer crosses a 64k boundary, we need one more. */
>               len = XHCI_TRB_MAXSIZE - (paddr & (XHCI_TRB_MAXSIZE - 1));
>               if (len < xfer->frlengths[i])
> -                     ntrb++;
> +                     ntrb = howmany(xfer->frlengths[i] - len,
> +                         XHCI_TRB_MAXSIZE) + 1;
>  
>               paddr += xfer->frlengths[i];
>       }
> @@ -3066,7 +3067,8 @@ xhci_device_isoc_start(struct usbd_xfer *xfer)
>               /* If the buffer crosses a 64k boundary, we need one more. */
>               len = XHCI_TRB_MAXSIZE - (paddr & (XHCI_TRB_MAXSIZE - 1));
>               if (len < xfer->frlengths[i])
> -                     ntrb++;
> +                     ntrb = howmany(xfer->frlengths[i] - len,
> +                         XHCI_TRB_MAXSIZE) + 1;
>               else
>                       len = xfer->frlengths[i];
>  
> 

Reply via email to