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(