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");