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