Module Name: src Committed By: skrll Date: Fri May 15 06:15:42 UTC 2020
Modified Files: src/sys/dev/usb: ehci.c ohci.c uhci.c usbdi.c src/sys/external/bsd/dwc2: dwc2.c Log Message: Update ux_length in usbd_setup_isoc_xfer and use this to usb_syncmem in the HCDs To generate a diff of this commit: cvs rdiff -u -r1.278 -r1.279 src/sys/dev/usb/ehci.c cvs rdiff -u -r1.303 -r1.304 src/sys/dev/usb/ohci.c cvs rdiff -u -r1.300 -r1.301 src/sys/dev/usb/uhci.c cvs rdiff -u -r1.200 -r1.201 src/sys/dev/usb/usbdi.c cvs rdiff -u -r1.73 -r1.74 src/sys/external/bsd/dwc2/dwc2.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/usb/ehci.c diff -u src/sys/dev/usb/ehci.c:1.278 src/sys/dev/usb/ehci.c:1.279 --- src/sys/dev/usb/ehci.c:1.278 Sun Apr 5 20:59:38 2020 +++ src/sys/dev/usb/ehci.c Fri May 15 06:15:42 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: ehci.c,v 1.278 2020/04/05 20:59:38 skrll Exp $ */ +/* $NetBSD: ehci.c,v 1.279 2020/05/15 06:15:42 skrll Exp $ */ /* * Copyright (c) 2004-2012 The NetBSD Foundation, Inc. @@ -53,7 +53,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ehci.c,v 1.278 2020/04/05 20:59:38 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ehci.c,v 1.279 2020/05/15 06:15:42 skrll Exp $"); #include "ohci.h" #include "uhci.h" @@ -4301,14 +4301,13 @@ ehci_device_fs_isoc_transfer(struct usbd ehci_soft_sitd_t *sitd; usb_dma_t *dma_buf; int i, j, k, frames; - int offs, total_length; + int offs; int frindex; u_int dir; EHCIHIST_FUNC(); EHCIHIST_CALLED(); sitd = NULL; - total_length = 0; DPRINTF("xfer %#jx len %jd flags %jd", (uintptr_t)xfer, xfer->ux_length, xfer->ux_flags, 0); @@ -4354,7 +4353,6 @@ ehci_device_fs_isoc_transfer(struct usbd /* Set page0 index and offset - TP and T-offset are set below */ sitd->sitd.sitd_buffer[0] = htole32(DMAADDR(dma_buf, offs)); - total_length += xfer->ux_frlengths[i]; offs += xfer->ux_frlengths[i]; sitd->sitd.sitd_buffer[1] = @@ -4432,8 +4430,8 @@ ehci_device_fs_isoc_transfer(struct usbd sizeof(sitd->sitd.sitd_trans), BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD); - if (total_length) - usb_syncmem(&exfer->ex_xfer.ux_dmabuf, 0, total_length, + if (xfer->ux_length) + usb_syncmem(&exfer->ex_xfer.ux_dmabuf, 0, xfer->ux_length, BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); /* @@ -4672,7 +4670,7 @@ ehci_device_isoc_transfer(struct usbd_xf usb_dma_t *dma_buf; int i, j; int frames, uframes, ufrperframe; - int trans_count, offs, total_length; + int trans_count, offs; int frindex; EHCIHIST_FUNC(); EHCIHIST_CALLED(); @@ -4680,7 +4678,6 @@ ehci_device_isoc_transfer(struct usbd_xf prev = NULL; itd = NULL; trans_count = 0; - total_length = 0; DPRINTF("xfer %#jx flags %jd", (uintptr_t)xfer, xfer->ux_flags, 0, 0); @@ -4765,7 +4762,6 @@ ehci_device_isoc_transfer(struct usbd_xf EHCI_ITD_SET_PG(addr) | EHCI_ITD_SET_OFFS(EHCI_PAGE_OFFSET(DMAADDR(dma_buf,offs)))); - total_length += xfer->ux_frlengths[trans_count]; offs += xfer->ux_frlengths[trans_count]; trans_count++; @@ -4820,8 +4816,8 @@ ehci_device_isoc_transfer(struct usbd_xf prev = itd; } /* End of frame */ - if (total_length) - usb_syncmem(&exfer->ex_xfer.ux_dmabuf, 0, total_length, + if (xfer->ux_length) + usb_syncmem(&exfer->ex_xfer.ux_dmabuf, 0, xfer->ux_length, BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); /* Index: src/sys/dev/usb/ohci.c diff -u src/sys/dev/usb/ohci.c:1.303 src/sys/dev/usb/ohci.c:1.304 --- src/sys/dev/usb/ohci.c:1.303 Wed May 13 19:33:48 2020 +++ src/sys/dev/usb/ohci.c Fri May 15 06:15:42 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: ohci.c,v 1.303 2020/05/13 19:33:48 jakllsch Exp $ */ +/* $NetBSD: ohci.c,v 1.304 2020/05/15 06:15:42 skrll Exp $ */ /* * Copyright (c) 1998, 2004, 2005, 2012 The NetBSD Foundation, Inc. @@ -41,7 +41,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ohci.c,v 1.303 2020/05/13 19:33:48 jakllsch Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ohci.c,v 1.304 2020/05/15 06:15:42 skrll Exp $"); #ifdef _KERNEL_OPT #include "opt_usb.h" @@ -3463,8 +3463,9 @@ ohci_device_isoc_enter(struct usbd_xfer int isread = (UE_GET_DIR(xfer->ux_pipe->up_endpoint->ue_edesc->bEndpointAddress) == UE_DIR_IN); - usb_syncmem(&xfer->ux_dmabuf, 0, xfer->ux_bufsize, - isread ? BUS_DMASYNC_PREREAD : BUS_DMASYNC_PREWRITE); + if (xfer->ux_length) + usb_syncmem(&xfer->ux_dmabuf, 0, xfer->ux_bufsize, + isread ? BUS_DMASYNC_PREREAD : BUS_DMASYNC_PREWRITE); if (isoc->next == -1) { /* Not in use yet, schedule it a few frames ahead. */ Index: src/sys/dev/usb/uhci.c diff -u src/sys/dev/usb/uhci.c:1.300 src/sys/dev/usb/uhci.c:1.301 --- src/sys/dev/usb/uhci.c:1.300 Sun Apr 5 20:59:38 2020 +++ src/sys/dev/usb/uhci.c Fri May 15 06:15:42 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: uhci.c,v 1.300 2020/04/05 20:59:38 skrll Exp $ */ +/* $NetBSD: uhci.c,v 1.301 2020/05/15 06:15:42 skrll Exp $ */ /* * Copyright (c) 1998, 2004, 2011, 2012 The NetBSD Foundation, Inc. @@ -42,7 +42,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: uhci.c,v 1.300 2020/04/05 20:59:38 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uhci.c,v 1.301 2020/05/15 06:15:42 skrll Exp $"); #ifdef _KERNEL_OPT #include "opt_usb.h" @@ -2918,8 +2918,9 @@ uhci_device_isoc_transfer(struct usbd_xf KASSERT(xfer->ux_nframes != 0); - usb_syncmem(&xfer->ux_dmabuf, 0, xfer->ux_length, - rd ? BUS_DMASYNC_PREREAD : BUS_DMASYNC_PREWRITE); + if (xfer->ux_length) + usb_syncmem(&xfer->ux_dmabuf, 0, xfer->ux_length, + rd ? BUS_DMASYNC_PREREAD : BUS_DMASYNC_PREWRITE); mutex_enter(&sc->sc_lock); next = isoc->next; Index: src/sys/dev/usb/usbdi.c diff -u src/sys/dev/usb/usbdi.c:1.200 src/sys/dev/usb/usbdi.c:1.201 --- src/sys/dev/usb/usbdi.c:1.200 Sun Apr 5 20:59:38 2020 +++ src/sys/dev/usb/usbdi.c Fri May 15 06:15:42 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: usbdi.c,v 1.200 2020/04/05 20:59:38 skrll Exp $ */ +/* $NetBSD: usbdi.c,v 1.201 2020/05/15 06:15:42 skrll Exp $ */ /* * Copyright (c) 1998, 2012, 2015 The NetBSD Foundation, Inc. @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: usbdi.c,v 1.200 2020/04/05 20:59:38 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: usbdi.c,v 1.201 2020/05/15 06:15:42 skrll Exp $"); #ifdef _KERNEL_OPT #include "opt_usb.h" @@ -685,6 +685,9 @@ usbd_setup_isoc_xfer(struct usbd_xfer *x xfer->ux_rqflags &= ~URQ_REQUEST; xfer->ux_frlengths = frlengths; xfer->ux_nframes = nframes; + + for (size_t i = 0; i < xfer->ux_nframes; i++) + xfer->ux_length += xfer->ux_frlengths[i]; } void Index: src/sys/external/bsd/dwc2/dwc2.c diff -u src/sys/external/bsd/dwc2/dwc2.c:1.73 src/sys/external/bsd/dwc2/dwc2.c:1.74 --- src/sys/external/bsd/dwc2/dwc2.c:1.73 Sun Apr 5 20:59:38 2020 +++ src/sys/external/bsd/dwc2/dwc2.c Fri May 15 06:15:42 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: dwc2.c,v 1.73 2020/04/05 20:59:38 skrll Exp $ */ +/* $NetBSD: dwc2.c,v 1.74 2020/05/15 06:15:42 skrll Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: dwc2.c,v 1.73 2020/04/05 20:59:38 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dwc2.c,v 1.74 2020/05/15 06:15:42 skrll Exp $"); #include "opt_usb.h" @@ -1017,9 +1017,15 @@ dwc2_device_start(struct usbd_xfer *xfer " mps=%d dir %s\n", xfer, xfer->ux_nframes, xfer->ux_flags, addr, epnum, mps, dir == UT_READ ? "in" :"out"); +#ifdef DIAGNOSTIC len = 0; for (size_t i = 0; i < xfer->ux_nframes; i++) len += xfer->ux_frlengths[i]; + if (len != xfer->ux_length) + panic("len (%d) != xfer->ux_length (%d)", len, + xfer->ux_length); +#endif + len = xfer->ux_length; } else { DPRINTFN(3, "xfer=%p len=%d flags=%d addr=%d endpt=%d," " mps=%d dir %s\n", xfer, xfer->ux_length, xfer->ux_flags, addr,