Module Name: src Committed By: riastradh Date: Thu Mar 3 06:04:31 UTC 2022
Modified Files: src/sys/arch/mips/adm5120/dev: ahci.c src/sys/dev/ic: sl811hs.c src/sys/dev/usb: ehci.c motg.c ohci.c uhci.c usbdi.c usbdivar.h usbroothub.c vhci.c xhci.c src/sys/external/bsd/dwc2: dwc2.c src/sys/rump/dev/lib/libugenhc: ugenhc.c Log Message: usb: Factor usb_insert_transfer out of upm_transfer and make private. Almost every upm_transfer function starts with: mutex_enter(&sc->sc_lock); err = usb_insert_transfer(xfer); mutex_exit(&sc->sc_lock); if (err) return err; Some of them have debug messages sprinkled in here too, or assert that err == USBD_NORMAL_COMPLETION (alternative is USBD_IN_PROGRESS, only for pipes with up_running or up_serialise, presumably not applicable for these types of pipes). Some of them also assert xfer->ux_status == USBD_NOT_STARTED, which is guaranteed on entry and preserved by usb_insert_transer. Exceptions: - arch/mips/adm5120/dev/ahci.c ahci_device_isoc_transfer just returns USBD_NORMAL_COMPLETION, but I'm pretty sure this is and always has been broken anyway, so won't make anything worse (if anything, might make it better...) - external/bsd/dwc2/dwc2.c dwc2_device_bulk_transfer and dwc2_device_isoc_transfer _also_ issue dwc2_device_start(xfer) under the lock. This is probably a better way to do it, but let's do it uniformly across all HCIs at once. - rump/dev/lib/libugenhc/ugenhc.c rumpusb_device_bulk_transfer sometimes returns USBD_IN_PROGRESS _without_ queueing the transfer, in the !rump_threads case. Not really sure how this is supposed to work... If it actually breaks anything, we can figure it out. To generate a diff of this commit: cvs rdiff -u -r1.28 -r1.29 src/sys/arch/mips/adm5120/dev/ahci.c cvs rdiff -u -r1.108 -r1.109 src/sys/dev/ic/sl811hs.c cvs rdiff -u -r1.302 -r1.303 src/sys/dev/usb/ehci.c cvs rdiff -u -r1.37 -r1.38 src/sys/dev/usb/motg.c cvs rdiff -u -r1.318 -r1.319 src/sys/dev/usb/ohci.c cvs rdiff -u -r1.308 -r1.309 src/sys/dev/usb/uhci.c cvs rdiff -u -r1.222 -r1.223 src/sys/dev/usb/usbdi.c cvs rdiff -u -r1.131 -r1.132 src/sys/dev/usb/usbdivar.h cvs rdiff -u -r1.11 -r1.12 src/sys/dev/usb/usbroothub.c cvs rdiff -u -r1.23 -r1.24 src/sys/dev/usb/vhci.c cvs rdiff -u -r1.155 -r1.156 src/sys/dev/usb/xhci.c cvs rdiff -u -r1.77 -r1.78 src/sys/external/bsd/dwc2/dwc2.c cvs rdiff -u -r1.29 -r1.30 src/sys/rump/dev/lib/libugenhc/ugenhc.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/arch/mips/adm5120/dev/ahci.c diff -u src/sys/arch/mips/adm5120/dev/ahci.c:1.28 src/sys/arch/mips/adm5120/dev/ahci.c:1.29 --- src/sys/arch/mips/adm5120/dev/ahci.c:1.28 Tue Dec 21 09:51:22 2021 +++ src/sys/arch/mips/adm5120/dev/ahci.c Thu Mar 3 06:04:31 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: ahci.c,v 1.28 2021/12/21 09:51:22 skrll Exp $ */ +/* $NetBSD: ahci.c,v 1.29 2022/03/03 06:04:31 riastradh Exp $ */ /*- * Copyright (c) 2007 Ruslan Ermilov and Vsevolod Lobko. @@ -64,7 +64,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ahci.c,v 1.28 2021/12/21 09:51:22 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ahci.c,v 1.29 2022/03/03 06:04:31 riastradh Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -729,22 +729,10 @@ ahci_roothub_ctrl(struct usbd_bus *bus, static usbd_status ahci_root_intr_transfer(struct usbd_xfer *xfer) { - struct ahci_softc *sc = AHCI_XFER2SC(xfer); - usbd_status error; DPRINTF(D_TRACE, ("SLRItransfer ")); - /* Insert last in queue */ - mutex_enter(&sc->sc_lock); - error = usb_insert_transfer(xfer); - mutex_exit(&sc->sc_lock); - if (error) - return error; - - /* - * Pipe isn't running (otherwise error would be USBD_INPROG), - * start first. - */ + /* Pipe isn't running, start first. */ return ahci_root_intr_start(SIMPLEQ_FIRST(&xfer->ux_pipe->up_queue)); } @@ -827,17 +815,9 @@ ahci_root_intr_done(struct usbd_xfer *xf static usbd_status ahci_device_ctrl_transfer(struct usbd_xfer *xfer) { - struct ahci_softc *sc = AHCI_XFER2SC(xfer); - usbd_status error; DPRINTF(D_TRACE, ("C")); - mutex_enter(&sc->sc_lock); - error = usb_insert_transfer(xfer); - mutex_exit(&sc->sc_lock); - if (error) - return error; - return ahci_device_ctrl_start(SIMPLEQ_FIRST(&xfer->ux_pipe->up_queue)); } @@ -1017,17 +997,9 @@ ahci_device_ctrl_done(struct usbd_xfer * static usbd_status ahci_device_intr_transfer(struct usbd_xfer *xfer) { - struct ahci_softc *sc = AHCI_XFER2SC(xfer); - usbd_status error; DPRINTF(D_TRACE, ("INTRtrans ")); - mutex_enter(&sc->sc_lock); - error = usb_insert_transfer(xfer); - mutex_exit(&sc->sc_lock); - if (error) - return error; - return ahci_device_intr_start(SIMPLEQ_FIRST(&xfer->ux_pipe->up_queue)); } @@ -1161,17 +1133,9 @@ ahci_device_isoc_done(struct usbd_xfer * static usbd_status ahci_device_bulk_transfer(struct usbd_xfer *xfer) { - struct ahci_softc *sc = AHCI_XFER2SC(xfer); - usbd_status error; DPRINTF(D_TRACE, ("B")); - mutex_enter(&sc->sc_lock); - error = usb_insert_transfer(xfer); - mutex_exit(&sc->sc_lock); - if (error) - return error; - return ahci_device_bulk_start(SIMPLEQ_FIRST(&xfer->ux_pipe->up_queue)); } Index: src/sys/dev/ic/sl811hs.c diff -u src/sys/dev/ic/sl811hs.c:1.108 src/sys/dev/ic/sl811hs.c:1.109 --- src/sys/dev/ic/sl811hs.c:1.108 Fri Dec 10 20:36:03 2021 +++ src/sys/dev/ic/sl811hs.c Thu Mar 3 06:04:31 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: sl811hs.c,v 1.108 2021/12/10 20:36:03 andvar Exp $ */ +/* $NetBSD: sl811hs.c,v 1.109 2022/03/03 06:04:31 riastradh Exp $ */ /* * Not (c) 2007 Matthew Orgass @@ -68,7 +68,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sl811hs.c,v 1.108 2021/12/10 20:36:03 andvar Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sl811hs.c,v 1.109 2022/03/03 06:04:31 riastradh Exp $"); #ifdef _KERNEL_OPT #include "opt_slhci.h" @@ -839,28 +839,13 @@ usbd_status slhci_transfer(struct usbd_xfer *xfer) { SLHCIHIST_FUNC(); SLHCIHIST_CALLED(); - struct slhci_softc *sc = SLHCI_XFER2SC(xfer); usbd_status error; DLOG(D_TRACE, "transfer type %jd xfer %#jx spipe %#jx ", SLHCI_XFER_TYPE(xfer), (uintptr_t)xfer, (uintptr_t)xfer->ux_pipe, 0); - /* Insert last in queue */ - mutex_enter(&sc->sc_lock); - error = usb_insert_transfer(xfer); - mutex_exit(&sc->sc_lock); - if (error) { - if (error != USBD_IN_PROGRESS) - DLOG(D_ERR, "usb_insert_transfer returns %jd!", error, - 0,0,0); - return error; - } - - /* - * Pipe isn't running (otherwise error would be USBD_INPROG), - * so start it first. - */ + /* Pipe isn't running, so start it first. */ /* * Start will take the lock. Index: src/sys/dev/usb/ehci.c diff -u src/sys/dev/usb/ehci.c:1.302 src/sys/dev/usb/ehci.c:1.303 --- src/sys/dev/usb/ehci.c:1.302 Sat Feb 12 15:55:04 2022 +++ src/sys/dev/usb/ehci.c Thu Mar 3 06:04:31 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: ehci.c,v 1.302 2022/02/12 15:55:04 macallan Exp $ */ +/* $NetBSD: ehci.c,v 1.303 2022/03/03 06:04:31 riastradh Exp $ */ /* * Copyright (c) 2004-2012,2016,2020 The NetBSD Foundation, Inc. @@ -54,7 +54,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ehci.c,v 1.302 2022/02/12 15:55:04 macallan Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ehci.c,v 1.303 2022/03/03 06:04:31 riastradh Exp $"); #include "ohci.h" #include "uhci.h" @@ -2748,15 +2748,6 @@ ehci_disown(ehci_softc_t *sc, int index, Static usbd_status ehci_root_intr_transfer(struct usbd_xfer *xfer) { - ehci_softc_t *sc = EHCI_XFER2SC(xfer); - usbd_status err; - - /* Insert last in queue. */ - mutex_enter(&sc->sc_lock); - err = usb_insert_transfer(xfer); - mutex_exit(&sc->sc_lock); - if (err) - return err; /* Pipe isn't running, start first */ return ehci_root_intr_start(SIMPLEQ_FIRST(&xfer->ux_pipe->up_queue)); @@ -3606,15 +3597,6 @@ ehci_device_ctrl_fini(struct usbd_xfer * Static usbd_status ehci_device_ctrl_transfer(struct usbd_xfer *xfer) { - ehci_softc_t *sc = EHCI_XFER2SC(xfer); - usbd_status err; - - /* Insert last in queue. */ - mutex_enter(&sc->sc_lock); - err = usb_insert_transfer(xfer); - mutex_exit(&sc->sc_lock); - if (err) - return err; /* Pipe isn't running, start first */ return ehci_device_ctrl_start(SIMPLEQ_FIRST(&xfer->ux_pipe->up_queue)); @@ -3886,15 +3868,6 @@ ehci_device_bulk_fini(struct usbd_xfer * Static usbd_status ehci_device_bulk_transfer(struct usbd_xfer *xfer) { - ehci_softc_t *sc = EHCI_XFER2SC(xfer); - usbd_status err; - - /* Insert last in queue. */ - mutex_enter(&sc->sc_lock); - err = usb_insert_transfer(xfer); - mutex_exit(&sc->sc_lock); - if (err) - return err; /* Pipe isn't running, start first */ return ehci_device_bulk_start(SIMPLEQ_FIRST(&xfer->ux_pipe->up_queue)); @@ -4099,20 +4072,8 @@ ehci_device_intr_fini(struct usbd_xfer * Static usbd_status ehci_device_intr_transfer(struct usbd_xfer *xfer) { - ehci_softc_t *sc = EHCI_XFER2SC(xfer); - usbd_status err; - /* Insert last in queue. */ - mutex_enter(&sc->sc_lock); - err = usb_insert_transfer(xfer); - mutex_exit(&sc->sc_lock); - if (err) - return err; - - /* - * Pipe isn't running (otherwise err would be USBD_INPROG), - * so start it first. - */ + /* Pipe isn't running, so start it first. */ return ehci_device_intr_start(SIMPLEQ_FIRST(&xfer->ux_pipe->up_queue)); } @@ -4351,14 +4312,6 @@ Static usbd_status ehci_device_fs_isoc_transfer(struct usbd_xfer *xfer) { ehci_softc_t *sc = EHCI_XFER2SC(xfer); - usbd_status __diagused err; - - mutex_enter(&sc->sc_lock); - err = usb_insert_transfer(xfer); - mutex_exit(&sc->sc_lock); - - KASSERT(err == USBD_NORMAL_COMPLETION); - struct ehci_pipe *epipe = EHCI_XFER2EPIPE(xfer); struct usbd_device *dev = xfer->ux_pipe->up_dev; struct ehci_xfer *exfer = EHCI_XFER2EXFER(xfer); @@ -4724,14 +4677,6 @@ Static usbd_status ehci_device_isoc_transfer(struct usbd_xfer *xfer) { ehci_softc_t *sc = EHCI_XFER2SC(xfer); - usbd_status __diagused err; - - mutex_enter(&sc->sc_lock); - err = usb_insert_transfer(xfer); - mutex_exit(&sc->sc_lock); - - KASSERT(err == USBD_NORMAL_COMPLETION); - struct ehci_pipe *epipe = EHCI_XFER2EPIPE(xfer); struct ehci_xfer *exfer = EHCI_XFER2EXFER(xfer); ehci_soft_itd_t *itd, *prev; Index: src/sys/dev/usb/motg.c diff -u src/sys/dev/usb/motg.c:1.37 src/sys/dev/usb/motg.c:1.38 --- src/sys/dev/usb/motg.c:1.37 Sat Aug 7 16:19:16 2021 +++ src/sys/dev/usb/motg.c Thu Mar 3 06:04:31 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: motg.c,v 1.37 2021/08/07 16:19:16 thorpej Exp $ */ +/* $NetBSD: motg.c,v 1.38 2022/03/03 06:04:31 riastradh Exp $ */ /* * Copyright (c) 1998, 2004, 2011, 2012, 2014 The NetBSD Foundation, Inc. @@ -40,7 +40,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: motg.c,v 1.37 2021/08/07 16:19:16 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: motg.c,v 1.38 2022/03/03 06:04:31 riastradh Exp $"); #ifdef _KERNEL_OPT #include "opt_usb.h" @@ -1009,20 +1009,8 @@ motg_root_intr_abort(struct usbd_xfer *x usbd_status motg_root_intr_transfer(struct usbd_xfer *xfer) { - struct motg_softc *sc = MOTG_XFER2SC(xfer); - usbd_status err; - - /* Insert last in queue. */ - mutex_enter(&sc->sc_lock); - err = usb_insert_transfer(xfer); - mutex_exit(&sc->sc_lock); - if (err) - return err; - /* - * Pipe isn't running (otherwise err would be USBD_INPROG), - * start first - */ + /* Pipe isn't running, start first */ return motg_root_intr_start(SIMPLEQ_FIRST(&xfer->ux_pipe->up_queue)); } @@ -1279,21 +1267,8 @@ motg_setup_endpoint_rx(struct usbd_xfer static usbd_status motg_device_ctrl_transfer(struct usbd_xfer *xfer) { - struct motg_softc *sc = MOTG_XFER2SC(xfer); - usbd_status err; - /* Insert last in queue. */ - mutex_enter(&sc->sc_lock); - err = usb_insert_transfer(xfer); - KASSERT(xfer->ux_status == USBD_NOT_STARTED); - mutex_exit(&sc->sc_lock); - if (err) - return err; - - /* - * Pipe isn't running (otherwise err would be USBD_INPROG), - * so start it first. - */ + /* Pipe isn't running, so start it first. */ return motg_device_ctrl_start(SIMPLEQ_FIRST(&xfer->ux_pipe->up_queue)); } @@ -1731,24 +1706,9 @@ motg_device_ctrl_done(struct usbd_xfer * static usbd_status motg_device_data_transfer(struct usbd_xfer *xfer) { - struct motg_softc *sc = MOTG_XFER2SC(xfer); - usbd_status err; - MOTGHIST_FUNC(); MOTGHIST_CALLED(); - /* Insert last in queue. */ - mutex_enter(&sc->sc_lock); - DPRINTF("xfer %#jx status %jd", (uintptr_t)xfer, xfer->ux_status, 0, 0); - err = usb_insert_transfer(xfer); - KASSERT(xfer->ux_status == USBD_NOT_STARTED); - mutex_exit(&sc->sc_lock); - if (err) - return err; - - /* - * Pipe isn't running (otherwise err would be USBD_INPROG), - * so start it first. - */ + /* Pipe isn't running, so start it first. */ return motg_device_data_start(SIMPLEQ_FIRST(&xfer->ux_pipe->up_queue)); } Index: src/sys/dev/usb/ohci.c diff -u src/sys/dev/usb/ohci.c:1.318 src/sys/dev/usb/ohci.c:1.319 --- src/sys/dev/usb/ohci.c:1.318 Tue Dec 21 09:51:22 2021 +++ src/sys/dev/usb/ohci.c Thu Mar 3 06:04:31 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: ohci.c,v 1.318 2021/12/21 09:51:22 skrll Exp $ */ +/* $NetBSD: ohci.c,v 1.319 2022/03/03 06:04:31 riastradh Exp $ */ /* * Copyright (c) 1998, 2004, 2005, 2012, 2016, 2020 The NetBSD Foundation, Inc. @@ -42,7 +42,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ohci.c,v 1.318 2021/12/21 09:51:22 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ohci.c,v 1.319 2022/03/03 06:04:31 riastradh Exp $"); #ifdef _KERNEL_OPT #include "opt_usb.h" @@ -2616,15 +2616,6 @@ ohci_roothub_ctrl(struct usbd_bus *bus, Static usbd_status ohci_root_intr_transfer(struct usbd_xfer *xfer) { - ohci_softc_t *sc = OHCI_XFER2SC(xfer); - usbd_status err; - - /* Insert last in queue. */ - mutex_enter(&sc->sc_lock); - err = usb_insert_transfer(xfer); - mutex_exit(&sc->sc_lock); - if (err) - return err; /* Pipe isn't running, start first */ return ohci_root_intr_start(SIMPLEQ_FIRST(&xfer->ux_pipe->up_queue)); @@ -2774,15 +2765,6 @@ ohci_device_ctrl_fini(struct usbd_xfer * Static usbd_status ohci_device_ctrl_transfer(struct usbd_xfer *xfer) { - ohci_softc_t *sc = OHCI_XFER2SC(xfer); - usbd_status err; - - /* Insert last in queue. */ - mutex_enter(&sc->sc_lock); - err = usb_insert_transfer(xfer); - mutex_exit(&sc->sc_lock); - if (err) - return err; /* Pipe isn't running, start first */ return ohci_device_ctrl_start(SIMPLEQ_FIRST(&xfer->ux_pipe->up_queue)); @@ -3062,15 +3044,6 @@ ohci_device_bulk_fini(struct usbd_xfer * Static usbd_status ohci_device_bulk_transfer(struct usbd_xfer *xfer) { - ohci_softc_t *sc = OHCI_XFER2SC(xfer); - usbd_status err; - - /* Insert last in queue. */ - mutex_enter(&sc->sc_lock); - err = usb_insert_transfer(xfer); - mutex_exit(&sc->sc_lock); - if (err) - return err; /* Pipe isn't running, start first */ return ohci_device_bulk_start(SIMPLEQ_FIRST(&xfer->ux_pipe->up_queue)); @@ -3270,15 +3243,6 @@ ohci_device_intr_fini(struct usbd_xfer * Static usbd_status ohci_device_intr_transfer(struct usbd_xfer *xfer) { - ohci_softc_t *sc = OHCI_XFER2SC(xfer); - usbd_status err; - - /* Insert last in queue. */ - mutex_enter(&sc->sc_lock); - err = usb_insert_transfer(xfer); - mutex_exit(&sc->sc_lock); - if (err) - return err; /* Pipe isn't running, start first */ return ohci_device_intr_start(SIMPLEQ_FIRST(&xfer->ux_pipe->up_queue)); @@ -3574,20 +3538,10 @@ ohci_device_isoc_fini(struct usbd_xfer * usbd_status ohci_device_isoc_transfer(struct usbd_xfer *xfer) { - ohci_softc_t *sc = OHCI_XFER2SC(xfer); - usbd_status __diagused err; - OHCIHIST_FUNC(); OHCIHIST_CALLED(); DPRINTFN(5, "xfer=%#jx", (uintptr_t)xfer, 0, 0, 0); - /* Put it on our queue, */ - mutex_enter(&sc->sc_lock); - err = usb_insert_transfer(xfer); - mutex_exit(&sc->sc_lock); - - KASSERT(err == USBD_NORMAL_COMPLETION); - /* insert into schedule, */ ohci_device_isoc_enter(xfer); Index: src/sys/dev/usb/uhci.c diff -u src/sys/dev/usb/uhci.c:1.308 src/sys/dev/usb/uhci.c:1.309 --- src/sys/dev/usb/uhci.c:1.308 Tue Dec 21 09:51:22 2021 +++ src/sys/dev/usb/uhci.c Thu Mar 3 06:04:31 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: uhci.c,v 1.308 2021/12/21 09:51:22 skrll Exp $ */ +/* $NetBSD: uhci.c,v 1.309 2022/03/03 06:04:31 riastradh Exp $ */ /* * Copyright (c) 1998, 2004, 2011, 2012, 2016, 2020 The NetBSD Foundation, Inc. @@ -42,7 +42,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: uhci.c,v 1.308 2021/12/21 09:51:22 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uhci.c,v 1.309 2022/03/03 06:04:31 riastradh Exp $"); #ifdef _KERNEL_OPT #include "opt_usb.h" @@ -2258,20 +2258,8 @@ uhci_device_bulk_fini(struct usbd_xfer * usbd_status uhci_device_bulk_transfer(struct usbd_xfer *xfer) { - uhci_softc_t *sc = UHCI_XFER2SC(xfer); - usbd_status err; - - /* Insert last in queue. */ - mutex_enter(&sc->sc_lock); - err = usb_insert_transfer(xfer); - mutex_exit(&sc->sc_lock); - if (err) - return err; - /* - * Pipe isn't running (otherwise err would be USBD_INPROG), - * so start it first. - */ + /* Pipe isn't running, so start it first. */ return uhci_device_bulk_start(SIMPLEQ_FIRST(&xfer->ux_pipe->up_queue)); } @@ -2495,20 +2483,8 @@ uhci_device_ctrl_fini(struct usbd_xfer * usbd_status uhci_device_ctrl_transfer(struct usbd_xfer *xfer) { - uhci_softc_t *sc = UHCI_XFER2SC(xfer); - usbd_status err; - - /* Insert last in queue. */ - mutex_enter(&sc->sc_lock); - err = usb_insert_transfer(xfer); - mutex_exit(&sc->sc_lock); - if (err) - return err; - /* - * Pipe isn't running (otherwise err would be USBD_INPROG), - * so start it first. - */ + /* Pipe isn't running, so start it first. */ return uhci_device_ctrl_start(SIMPLEQ_FIRST(&xfer->ux_pipe->up_queue)); } @@ -2701,20 +2677,8 @@ uhci_device_intr_fini(struct usbd_xfer * usbd_status uhci_device_intr_transfer(struct usbd_xfer *xfer) { - uhci_softc_t *sc = UHCI_XFER2SC(xfer); - usbd_status err; - /* Insert last in queue. */ - mutex_enter(&sc->sc_lock); - err = usb_insert_transfer(xfer); - mutex_exit(&sc->sc_lock); - if (err) - return err; - - /* - * Pipe isn't running (otherwise err would be USBD_INPROG), - * so start it first. - */ + /* Pipe isn't running, so start it first. */ return uhci_device_intr_start(SIMPLEQ_FIRST(&xfer->ux_pipe->up_queue)); } @@ -2891,18 +2855,10 @@ usbd_status uhci_device_isoc_transfer(struct usbd_xfer *xfer) { uhci_softc_t *sc = UHCI_XFER2SC(xfer); - usbd_status err __diagused; UHCIHIST_FUNC(); UHCIHIST_CALLED(); DPRINTFN(5, "xfer=%#jx", (uintptr_t)xfer, 0, 0, 0); - /* Put it on our queue, */ - mutex_enter(&sc->sc_lock); - err = usb_insert_transfer(xfer); - mutex_exit(&sc->sc_lock); - - KASSERT(err == USBD_NORMAL_COMPLETION); - /* insert into schedule, */ struct uhci_pipe *upipe = UHCI_PIPE2UPIPE(xfer->ux_pipe); @@ -3890,20 +3846,8 @@ uhci_root_intr_abort(struct usbd_xfer *x usbd_status uhci_root_intr_transfer(struct usbd_xfer *xfer) { - uhci_softc_t *sc = UHCI_XFER2SC(xfer); - usbd_status err; - - /* Insert last in queue. */ - mutex_enter(&sc->sc_lock); - err = usb_insert_transfer(xfer); - mutex_exit(&sc->sc_lock); - if (err) - return err; - /* - * Pipe isn't running (otherwise err would be USBD_INPROG), - * start first - */ + /* Pipe isn't running, start first */ return uhci_root_intr_start(SIMPLEQ_FIRST(&xfer->ux_pipe->up_queue)); } Index: src/sys/dev/usb/usbdi.c diff -u src/sys/dev/usb/usbdi.c:1.222 src/sys/dev/usb/usbdi.c:1.223 --- src/sys/dev/usb/usbdi.c:1.222 Thu Jan 20 03:14:03 2022 +++ src/sys/dev/usb/usbdi.c Thu Mar 3 06:04:31 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: usbdi.c,v 1.222 2022/01/20 03:14:03 mrg Exp $ */ +/* $NetBSD: usbdi.c,v 1.223 2022/03/03 06:04:31 riastradh 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.222 2022/01/20 03:14:03 mrg Exp $"); +__KERNEL_RCSID(0, "$NetBSD: usbdi.c,v 1.223 2022/03/03 06:04:31 riastradh Exp $"); #ifdef _KERNEL_OPT #include "opt_usb.h" @@ -114,6 +114,7 @@ SDT_PROBE_DEFINE2(usb, device, xfer, don SDT_PROBE_DEFINE1(usb, device, xfer, destroy, "struct usbd_xfer *"/*xfer*/); Static usbd_status usbd_ar_pipe(struct usbd_pipe *); +static usbd_status usb_insert_transfer(struct usbd_xfer *); Static void usbd_start_next(struct usbd_pipe *); Static usbd_status usbd_open_pipe_ival (struct usbd_interface *, uint8_t, uint8_t, struct usbd_pipe **, int); @@ -406,7 +407,14 @@ usbd_transfer(struct usbd_xfer *xfer) /* xfer is not valid after the transfer method unless synchronous */ SDT_PROBE2(usb, device, pipe, transfer__start, pipe, xfer); - err = pipe->up_methods->upm_transfer(xfer); + do { + usbd_lock_pipe(pipe); + err = usb_insert_transfer(xfer); + usbd_unlock_pipe(pipe); + if (err) + break; + err = pipe->up_methods->upm_transfer(xfer); + } while (0); SDT_PROBE3(usb, device, pipe, transfer__done, pipe, xfer, err); if (err != USBD_IN_PROGRESS && err) { @@ -1136,7 +1144,7 @@ usb_transfer_complete(struct usbd_xfer * } /* Called with USB lock held. */ -usbd_status +static usbd_status usb_insert_transfer(struct usbd_xfer *xfer) { struct usbd_pipe *pipe = xfer->ux_pipe; Index: src/sys/dev/usb/usbdivar.h diff -u src/sys/dev/usb/usbdivar.h:1.131 src/sys/dev/usb/usbdivar.h:1.132 --- src/sys/dev/usb/usbdivar.h:1.131 Mon Feb 14 09:23:32 2022 +++ src/sys/dev/usb/usbdivar.h Thu Mar 3 06:04:31 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: usbdivar.h,v 1.131 2022/02/14 09:23:32 riastradh Exp $ */ +/* $NetBSD: usbdivar.h,v 1.132 2022/03/03 06:04:31 riastradh Exp $ */ /* * Copyright (c) 1998, 2012 The NetBSD Foundation, Inc. @@ -67,7 +67,6 @@ * USB functions known to expect the lock taken include (this list is * probably not exhaustive): * usb_transfer_complete() - * usb_insert_transfer() * usb_start_next() * */ @@ -359,7 +358,6 @@ void usbd_iface_pipeunref(struct usbd_i usbd_status usbd_fill_iface_data(struct usbd_device *, int, int); void usb_free_device(struct usbd_device *); -usbd_status usb_insert_transfer(struct usbd_xfer *); void usb_transfer_complete(struct usbd_xfer *); int usb_disconnect_port(struct usbd_port *, device_t, int); Index: src/sys/dev/usb/usbroothub.c diff -u src/sys/dev/usb/usbroothub.c:1.11 src/sys/dev/usb/usbroothub.c:1.12 --- src/sys/dev/usb/usbroothub.c:1.11 Thu Jan 20 03:14:03 2022 +++ src/sys/dev/usb/usbroothub.c Thu Mar 3 06:04:31 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: usbroothub.c,v 1.11 2022/01/20 03:14:03 mrg Exp $ */ +/* $NetBSD: usbroothub.c,v 1.12 2022/03/03 06:04:31 riastradh Exp $ */ /*- * Copyright (c) 1998, 2004, 2011, 2012 The NetBSD Foundation, Inc. @@ -58,7 +58,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: usbroothub.c,v 1.11 2022/01/20 03:14:03 mrg Exp $"); +__KERNEL_RCSID(0, "$NetBSD: usbroothub.c,v 1.12 2022/03/03 06:04:31 riastradh Exp $"); #include <sys/param.h> #include <sys/systm.h> /* for ostype */ @@ -343,16 +343,6 @@ static const usb_hub_descriptor_t usbroo usbd_status roothub_ctrl_transfer(struct usbd_xfer *xfer) { - struct usbd_pipe *pipe = xfer->ux_pipe; - struct usbd_bus *bus = pipe->up_dev->ud_bus; - usbd_status err; - - /* Insert last in queue. */ - mutex_enter(bus->ub_lock); - err = usb_insert_transfer(xfer); - mutex_exit(bus->ub_lock); - if (err) - return err; /* Pipe isn't running, start first */ return roothub_ctrl_start(SIMPLEQ_FIRST(&xfer->ux_pipe->up_queue)); Index: src/sys/dev/usb/vhci.c diff -u src/sys/dev/usb/vhci.c:1.23 src/sys/dev/usb/vhci.c:1.24 --- src/sys/dev/usb/vhci.c:1.23 Sat Feb 12 03:24:36 2022 +++ src/sys/dev/usb/vhci.c Thu Mar 3 06:04:31 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: vhci.c,v 1.23 2022/02/12 03:24:36 riastradh Exp $ */ +/* $NetBSD: vhci.c,v 1.24 2022/03/03 06:04:31 riastradh Exp $ */ /* * Copyright (c) 2019-2020 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: vhci.c,v 1.23 2022/02/12 03:24:36 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vhci.c,v 1.24 2022/03/03 06:04:31 riastradh Exp $"); #ifdef _KERNEL_OPT #include "opt_usb.h" @@ -590,18 +590,9 @@ vhci_roothub_ctrl(struct usbd_bus *bus, static usbd_status vhci_device_ctrl_transfer(struct usbd_xfer *xfer) { - vhci_softc_t *sc = xfer->ux_bus->ub_hcpriv; - usbd_status err; DPRINTF("%s: called\n", __func__); - /* Insert last in queue. */ - mutex_enter(&sc->sc_lock); - err = usb_insert_transfer(xfer); - mutex_exit(&sc->sc_lock); - if (err) - return err; - /* Pipe isn't running, start first */ return vhci_device_ctrl_start(SIMPLEQ_FIRST(&xfer->ux_pipe->up_queue)); } @@ -707,18 +698,9 @@ vhci_device_ctrl_done(struct usbd_xfer * static usbd_status vhci_root_intr_transfer(struct usbd_xfer *xfer) { - vhci_softc_t *sc = xfer->ux_bus->ub_hcpriv; - usbd_status err; DPRINTF("%s: called\n", __func__); - /* Insert last in queue. */ - mutex_enter(&sc->sc_lock); - err = usb_insert_transfer(xfer); - mutex_exit(&sc->sc_lock); - if (err) - return err; - /* Pipe isn't running, start first */ return vhci_root_intr_start(SIMPLEQ_FIRST(&xfer->ux_pipe->up_queue)); } Index: src/sys/dev/usb/xhci.c diff -u src/sys/dev/usb/xhci.c:1.155 src/sys/dev/usb/xhci.c:1.156 --- src/sys/dev/usb/xhci.c:1.155 Sat Jan 29 21:36:12 2022 +++ src/sys/dev/usb/xhci.c Thu Mar 3 06:04:31 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: xhci.c,v 1.155 2022/01/29 21:36:12 riastradh Exp $ */ +/* $NetBSD: xhci.c,v 1.156 2022/03/03 06:04:31 riastradh Exp $ */ /* * Copyright (c) 2013 Jonathan A. Kollasch @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: xhci.c,v 1.155 2022/01/29 21:36:12 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: xhci.c,v 1.156 2022/03/03 06:04:31 riastradh Exp $"); #ifdef _KERNEL_OPT #include "opt_usb.h" @@ -4129,18 +4129,8 @@ xhci_roothub_ctrl(struct usbd_bus *bus, static usbd_status xhci_root_intr_transfer(struct usbd_xfer *xfer) { - struct xhci_softc * const sc = XHCI_XFER2SC(xfer); - usbd_status err; - XHCIHIST_FUNC(); XHCIHIST_CALLED(); - /* Insert last in queue. */ - mutex_enter(&sc->sc_lock); - err = usb_insert_transfer(xfer); - mutex_exit(&sc->sc_lock); - if (err) - return err; - /* Pipe isn't running, start first */ return xhci_root_intr_start(SIMPLEQ_FIRST(&xfer->ux_pipe->up_queue)); } @@ -4233,18 +4223,8 @@ xhci_root_intr_done(struct usbd_xfer *xf static usbd_status xhci_device_ctrl_transfer(struct usbd_xfer *xfer) { - struct xhci_softc * const sc = XHCI_XFER2SC(xfer); - usbd_status err; - XHCIHIST_FUNC(); XHCIHIST_CALLED(); - /* Insert last in queue. */ - mutex_enter(&sc->sc_lock); - err = usb_insert_transfer(xfer); - mutex_exit(&sc->sc_lock); - if (err) - return err; - /* Pipe isn't running, start first */ return xhci_device_ctrl_start(SIMPLEQ_FIRST(&xfer->ux_pipe->up_queue)); } @@ -4378,18 +4358,8 @@ xhci_device_ctrl_close(struct usbd_pipe static usbd_status xhci_device_isoc_transfer(struct usbd_xfer *xfer) { - struct xhci_softc * const sc = XHCI_XFER2SC(xfer); - usbd_status err; - XHCIHIST_FUNC(); XHCIHIST_CALLED(); - /* Insert last in queue. */ - mutex_enter(&sc->sc_lock); - err = usb_insert_transfer(xfer); - mutex_exit(&sc->sc_lock); - if (err) - return err; - return xhci_device_isoc_enter(xfer); } @@ -4542,22 +4512,9 @@ xhci_device_isoc_done(struct usbd_xfer * static usbd_status xhci_device_bulk_transfer(struct usbd_xfer *xfer) { - struct xhci_softc * const sc = XHCI_XFER2SC(xfer); - usbd_status err; - XHCIHIST_FUNC(); XHCIHIST_CALLED(); - /* Insert last in queue. */ - mutex_enter(&sc->sc_lock); - err = usb_insert_transfer(xfer); - mutex_exit(&sc->sc_lock); - if (err) - return err; - - /* - * Pipe isn't running (otherwise err would be USBD_INPROG), - * so start it first. - */ + /* Pipe isn't running, so start it first. */ return xhci_device_bulk_start(SIMPLEQ_FIRST(&xfer->ux_pipe->up_queue)); } @@ -4680,22 +4637,9 @@ xhci_device_bulk_close(struct usbd_pipe static usbd_status xhci_device_intr_transfer(struct usbd_xfer *xfer) { - struct xhci_softc * const sc = XHCI_XFER2SC(xfer); - usbd_status err; - XHCIHIST_FUNC(); XHCIHIST_CALLED(); - /* Insert last in queue. */ - mutex_enter(&sc->sc_lock); - err = usb_insert_transfer(xfer); - mutex_exit(&sc->sc_lock); - if (err) - return err; - - /* - * Pipe isn't running (otherwise err would be USBD_INPROG), - * so start it first. - */ + /* Pipe isn't running, so start it first. */ return xhci_device_intr_start(SIMPLEQ_FIRST(&xfer->ux_pipe->up_queue)); } Index: src/sys/external/bsd/dwc2/dwc2.c diff -u src/sys/external/bsd/dwc2/dwc2.c:1.77 src/sys/external/bsd/dwc2/dwc2.c:1.78 --- src/sys/external/bsd/dwc2/dwc2.c:1.77 Tue Dec 21 09:51:22 2021 +++ src/sys/external/bsd/dwc2/dwc2.c Thu Mar 3 06:04:31 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: dwc2.c,v 1.77 2021/12/21 09:51:22 skrll Exp $ */ +/* $NetBSD: dwc2.c,v 1.78 2022/03/03 06:04:31 riastradh Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: dwc2.c,v 1.77 2021/12/21 09:51:22 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dwc2.c,v 1.78 2022/03/03 06:04:31 riastradh Exp $"); #include "opt_usb.h" @@ -614,18 +614,9 @@ dwc2_roothub_ctrl(struct usbd_bus *bus, Static usbd_status dwc2_root_intr_transfer(struct usbd_xfer *xfer) { - struct dwc2_softc *sc = DWC2_XFER2SC(xfer); - usbd_status err; DPRINTF("\n"); - /* Insert last in queue. */ - mutex_enter(&sc->sc_lock); - err = usb_insert_transfer(xfer); - mutex_exit(&sc->sc_lock); - if (err) - return err; - /* Pipe isn't running, start first */ return dwc2_root_intr_start(SIMPLEQ_FIRST(&xfer->ux_pipe->up_queue)); } @@ -711,18 +702,9 @@ dwc2_root_intr_done(struct usbd_xfer *xf Static usbd_status dwc2_device_ctrl_transfer(struct usbd_xfer *xfer) { - struct dwc2_softc *sc = DWC2_XFER2SC(xfer); - usbd_status err; DPRINTF("\n"); - /* Insert last in queue. */ - mutex_enter(&sc->sc_lock); - err = usb_insert_transfer(xfer); - mutex_exit(&sc->sc_lock); - if (err) - return err; - /* Pipe isn't running, start first */ return dwc2_device_ctrl_start(SIMPLEQ_FIRST(&xfer->ux_pipe->up_queue)); } @@ -788,12 +770,8 @@ dwc2_device_bulk_transfer(struct usbd_xf DPRINTF("xfer=%p\n", xfer); - /* Insert last in queue. */ mutex_enter(&sc->sc_lock); - err = usb_insert_transfer(xfer); - - KASSERT(err == USBD_NORMAL_COMPLETION); - + KASSERT(xfer->ux_status == USBD_NOT_STARTED); xfer->ux_status = USBD_IN_PROGRESS; err = dwc2_device_start(xfer); mutex_exit(&sc->sc_lock); @@ -833,18 +811,9 @@ dwc2_device_bulk_done(struct usbd_xfer * Static usbd_status dwc2_device_intr_transfer(struct usbd_xfer *xfer) { - struct dwc2_softc *sc = DWC2_XFER2SC(xfer); - usbd_status err; DPRINTF("xfer=%p\n", xfer); - /* Insert last in queue. */ - mutex_enter(&sc->sc_lock); - err = usb_insert_transfer(xfer); - mutex_exit(&sc->sc_lock); - if (err) - return err; - /* Pipe isn't running, start first */ return dwc2_device_intr_start(SIMPLEQ_FIRST(&xfer->ux_pipe->up_queue)); } @@ -909,12 +878,8 @@ dwc2_device_isoc_transfer(struct usbd_xf DPRINTF("xfer=%p\n", xfer); - /* Insert last in queue. */ mutex_enter(&sc->sc_lock); - err = usb_insert_transfer(xfer); - - KASSERT(err == USBD_NORMAL_COMPLETION); - + KASSERT(xfer->ux_status == USBD_NOT_STARTED); xfer->ux_status = USBD_IN_PROGRESS; err = dwc2_device_start(xfer); mutex_exit(&sc->sc_lock); Index: src/sys/rump/dev/lib/libugenhc/ugenhc.c diff -u src/sys/rump/dev/lib/libugenhc/ugenhc.c:1.29 src/sys/rump/dev/lib/libugenhc/ugenhc.c:1.30 --- src/sys/rump/dev/lib/libugenhc/ugenhc.c:1.29 Sat Aug 7 16:19:18 2021 +++ src/sys/rump/dev/lib/libugenhc/ugenhc.c Thu Mar 3 06:04:31 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: ugenhc.c,v 1.29 2021/08/07 16:19:18 thorpej Exp $ */ +/* $NetBSD: ugenhc.c,v 1.30 2022/03/03 06:04:31 riastradh Exp $ */ /* * Copyright (c) 2009, 2010 Antti Kantee. All Rights Reserved. @@ -61,7 +61,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ugenhc.c,v 1.29 2021/08/07 16:19:18 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ugenhc.c,v 1.30 2022/03/03 06:04:31 riastradh Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -401,14 +401,6 @@ rumpusb_device_ctrl_start(struct usbd_xf static usbd_status rumpusb_device_ctrl_transfer(struct usbd_xfer *xfer) { - struct ugenhc_softc *sc = UGENHC_XFER2SC(xfer); - usbd_status err; - - mutex_enter(&sc->sc_lock); - err = usb_insert_transfer(xfer); - mutex_exit(&sc->sc_lock); - if (err) - return err; return rumpusb_device_ctrl_start(SIMPLEQ_FIRST(&xfer->ux_pipe->up_queue)); } @@ -540,14 +532,6 @@ rumpusb_root_intr_start(struct usbd_xfer static usbd_status rumpusb_root_intr_transfer(struct usbd_xfer *xfer) { - struct ugenhc_softc *sc = UGENHC_XFER2SC(xfer); - usbd_status err; - - mutex_enter(&sc->sc_lock); - err = usb_insert_transfer(xfer); - mutex_exit(&sc->sc_lock); - if (err) - return err; return rumpusb_root_intr_start(SIMPLEQ_FIRST(&xfer->ux_pipe->up_queue)); } @@ -709,8 +693,6 @@ doxfer_kth(void *arg) static usbd_status rumpusb_device_bulk_transfer(struct usbd_xfer *xfer) { - struct ugenhc_softc *sc = UGENHC_XFER2SC(xfer); - usbd_status err; if (!rump_threads) { /* XXX: lie about supporting async transfers */ @@ -720,20 +702,9 @@ rumpusb_device_bulk_transfer(struct usbd return USBD_IN_PROGRESS; } - mutex_enter(&sc->sc_lock); - err = usb_insert_transfer(xfer); - mutex_exit(&sc->sc_lock); - if (err) - return err; - return rumpusb_device_bulk_start( SIMPLEQ_FIRST(&xfer->ux_pipe->up_queue)); } else { - mutex_enter(&sc->sc_lock); - err = usb_insert_transfer(xfer); - mutex_exit(&sc->sc_lock); - if (err) - return err; kthread_create(PRI_NONE, 0, NULL, doxfer_kth, xfer->ux_pipe, NULL, "rusbhcxf");