Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys usb: Factor usb_insert_transfer out of upm_transfer and ...
details: https://anonhg.NetBSD.org/src/rev/0ce31c64c67b
branches: trunk
changeset: 362559:0ce31c64c67b
user: riastradh <riastradh%NetBSD.org@localhost>
date: Thu Mar 03 06:04:31 2022 +0000
description:
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.
diffstat:
sys/arch/mips/adm5120/dev/ahci.c | 42 +------------------
sys/dev/ic/sl811hs.c | 21 +--------
sys/dev/usb/ehci.c | 63 +----------------------------
sys/dev/usb/motg.c | 50 ++---------------------
sys/dev/usb/ohci.c | 50 +-----------------------
sys/dev/usb/uhci.c | 76 ++++--------------------------------
sys/dev/usb/usbdi.c | 16 +++++-
sys/dev/usb/usbdivar.h | 4 +-
sys/dev/usb/usbroothub.c | 14 +-----
sys/dev/usb/vhci.c | 22 +---------
sys/dev/usb/xhci.c | 64 +-----------------------------
sys/external/bsd/dwc2/dwc2.c | 43 +------------------
sys/rump/dev/lib/libugenhc/ugenhc.c | 33 +---------------
13 files changed, 54 insertions(+), 444 deletions(-)
diffs (truncated from 1055 to 300 lines):
diff -r d9c83642011f -r 0ce31c64c67b sys/arch/mips/adm5120/dev/ahci.c
--- a/sys/arch/mips/adm5120/dev/ahci.c Thu Mar 03 05:57:05 2022 +0000
+++ b/sys/arch/mips/adm5120/dev/ahci.c Thu Mar 03 06:04:31 2022 +0000
@@ -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 @@
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 @@
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 @@
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 @@
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));
}
diff -r d9c83642011f -r 0ce31c64c67b sys/dev/ic/sl811hs.c
--- a/sys/dev/ic/sl811hs.c Thu Mar 03 05:57:05 2022 +0000
+++ b/sys/dev/ic/sl811hs.c Thu Mar 03 06:04:31 2022 +0000
@@ -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 @@
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.
diff -r d9c83642011f -r 0ce31c64c67b sys/dev/usb/ehci.c
--- a/sys/dev/usb/ehci.c Thu Mar 03 05:57:05 2022 +0000
+++ b/sys/dev/usb/ehci.c Thu Mar 03 06:04:31 2022 +0000
@@ -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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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;
diff -r d9c83642011f -r 0ce31c64c67b sys/dev/usb/motg.c
--- a/sys/dev/usb/motg.c Thu Mar 03 05:57:05 2022 +0000
+++ b/sys/dev/usb/motg.c Thu Mar 03 06:04:31 2022 +0000
@@ -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 @@
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 */
Home |
Main Index |
Thread Index |
Old Index