xhci: isoc trbs forward traversal

2017-11-06 Thread Paul Irofti
Hi,

The following diff makes the trb iteration code easier to read and
understand. I don't know why it needed to be done the other way around.

General agreement and support from stsp@.

Paul


Index: dev/usb/xhci.c
===
RCS file: /cvs/src/sys/dev/usb/xhci.c,v
retrieving revision 1.77
diff -u -p -u -p -r1.77 xhci.c
--- dev/usb/xhci.c  8 Sep 2017 10:25:19 -   1.77
+++ dev/usb/xhci.c  6 Nov 2017 11:58:01 -
@@ -2763,17 +2768,18 @@ xhci_device_isoc_start(struct usbd_xfer 
paddr = DMAADDR(&xfer->dmabuf, offs);
 
/* Chain more TRBs if needed. */
-   for (i = ntrb - 1; i > 0; i--) {
-   len = xfer->frlengths[ntrb - i];
+   for (i = 1; i < ntrb; i++) {
+   int last = (i == ntrb - 1);
+   len = xfer->frlengths[i];
 
KASSERT(len <= UGETW(ed->wMaxPacketSize));
 
/* Next (or Last) TRB. */
-   trb = xhci_xfer_get_trb(sc, xfer, &toggle, (i == 1));
+   trb = xhci_xfer_get_trb(sc, xfer, &toggle, last);
flags = XHCI_TRB_TYPE_NORMAL | toggle;
if (usbd_xfer_isread(xfer))
flags |= XHCI_TRB_ISP;
-   flags |= (i == 1) ? XHCI_TRB_IOC : XHCI_TRB_CHAIN;
+   flags |= last ? XHCI_TRB_IOC : XHCI_TRB_CHAIN;
 
trb->trb_paddr = htole64(paddr);
trb->trb_status = htole32(



Re: xhci: isoc trbs forward traversal

2017-11-06 Thread Martin Pieuchot
On 06/11/17(Mon) 14:12, Paul Irofti wrote:
> Hi,
> 
> The following diff makes the trb iteration code easier to read and
> understand. I don't know why it needed to be done the other way around.

Could you keep xhci_device_generic_start() in sync with this change?

With that ok.

> General agreement and support from stsp@.
> 
> Paul
> 
> 
> Index: dev/usb/xhci.c
> ===
> RCS file: /cvs/src/sys/dev/usb/xhci.c,v
> retrieving revision 1.77
> diff -u -p -u -p -r1.77 xhci.c
> --- dev/usb/xhci.c8 Sep 2017 10:25:19 -   1.77
> +++ dev/usb/xhci.c6 Nov 2017 11:58:01 -
> @@ -2763,17 +2768,18 @@ xhci_device_isoc_start(struct usbd_xfer 
>   paddr = DMAADDR(&xfer->dmabuf, offs);
>  
>   /* Chain more TRBs if needed. */
> - for (i = ntrb - 1; i > 0; i--) {
> - len = xfer->frlengths[ntrb - i];
> + for (i = 1; i < ntrb; i++) {
> + int last = (i == ntrb - 1);
> + len = xfer->frlengths[i];
>  
>   KASSERT(len <= UGETW(ed->wMaxPacketSize));
>  
>   /* Next (or Last) TRB. */
> - trb = xhci_xfer_get_trb(sc, xfer, &toggle, (i == 1));
> + trb = xhci_xfer_get_trb(sc, xfer, &toggle, last);
>   flags = XHCI_TRB_TYPE_NORMAL | toggle;
>   if (usbd_xfer_isread(xfer))
>   flags |= XHCI_TRB_ISP;
> - flags |= (i == 1) ? XHCI_TRB_IOC : XHCI_TRB_CHAIN;
> + flags |= last ? XHCI_TRB_IOC : XHCI_TRB_CHAIN;
>  
>   trb->trb_paddr = htole64(paddr);
>   trb->trb_status = htole32(