Module Name: src Committed By: mrg Date: Sun Sep 16 20:21:56 UTC 2018
Modified Files: src/sys/dev/usb: ehci.c ohci.c uhci.c usb.c usbdi.c xhci.c src/sys/external/bsd/dwc2: dwc2.c Log Message: consolidate the handling of polling across HC drivers, and generic USB: - don't take mutexes if polling - normalise the code across all drivers - add some not yet code to block discovery to/from polling - minor CSE - adjust comment for usbd_set_polling() to reality now i properly understand what it is used for and why. this, with a hack to make RB_ASKNAME to wait 5 seconds allows boot -a work with USB keyboards. there are still multiple issues remaining: - discovery and polling need to be mutually exclusive - attachment of ukbd and wskbd is not handled by config_pending, and the 5 second delay isn't going to always be enough. To generate a diff of this commit: cvs rdiff -u -r1.263 -r1.264 src/sys/dev/usb/ehci.c cvs rdiff -u -r1.286 -r1.287 src/sys/dev/usb/ohci.c cvs rdiff -u -r1.283 -r1.284 src/sys/dev/usb/uhci.c cvs rdiff -u -r1.171 -r1.172 src/sys/dev/usb/usb.c cvs rdiff -u -r1.177 -r1.178 src/sys/dev/usb/usbdi.c cvs rdiff -u -r1.98 -r1.99 src/sys/dev/usb/xhci.c cvs rdiff -u -r1.54 -r1.55 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.263 src/sys/dev/usb/ehci.c:1.264 --- src/sys/dev/usb/ehci.c:1.263 Sun Sep 16 09:25:47 2018 +++ src/sys/dev/usb/ehci.c Sun Sep 16 20:21:56 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: ehci.c,v 1.263 2018/09/16 09:25:47 skrll Exp $ */ +/* $NetBSD: ehci.c,v 1.264 2018/09/16 20:21:56 mrg 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.263 2018/09/16 09:25:47 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ehci.c,v 1.264 2018/09/16 20:21:56 mrg Exp $"); #include "ohci.h" #include "uhci.h" @@ -2637,13 +2637,16 @@ Static usbd_status ehci_root_intr_start(struct usbd_xfer *xfer) { ehci_softc_t *sc = EHCI_XFER2SC(xfer); + const bool polling = sc->sc_bus.ub_usepolling; if (sc->sc_dying) return USBD_IOERROR; - mutex_enter(&sc->sc_lock); + if (!polling) + mutex_enter(&sc->sc_lock); sc->sc_intrxfer = xfer; - mutex_exit(&sc->sc_lock); + if (!polling) + mutex_exit(&sc->sc_lock); return USBD_IN_PROGRESS; } @@ -3538,6 +3541,7 @@ ehci_device_ctrl_start(struct usbd_xfer ehci_softc_t *sc = EHCI_XFER2SC(xfer); ehci_soft_qtd_t *setup, *status, *next; ehci_soft_qh_t *sqh; + const bool polling = sc->sc_bus.ub_usepolling; EHCIHIST_FUNC(); EHCIHIST_CALLED(); @@ -3657,7 +3661,8 @@ ehci_device_ctrl_start(struct usbd_xfer DPRINTFN(5, "--- dump end ---", 0, 0, 0, 0); #endif - mutex_enter(&sc->sc_lock); + if (!polling) + mutex_enter(&sc->sc_lock); /* Insert qTD in QH list - also does usb_syncmem(sqh) */ ehci_set_qh_qtd(sqh, setup); @@ -3667,7 +3672,8 @@ ehci_device_ctrl_start(struct usbd_xfer } ehci_add_intr_list(sc, exfer); xfer->ux_status = USBD_IN_PROGRESS; - mutex_exit(&sc->sc_lock); + if (!polling) + mutex_exit(&sc->sc_lock); #if 0 #ifdef EHCI_DEBUG @@ -3814,6 +3820,7 @@ ehci_device_bulk_start(struct usbd_xfer ehci_soft_qh_t *sqh; ehci_soft_qtd_t *end; int len, isread, endpt; + const bool polling = sc->sc_bus.ub_usepolling; EHCIHIST_FUNC(); EHCIHIST_CALLED(); @@ -3837,7 +3844,8 @@ ehci_device_bulk_start(struct usbd_xfer #endif /* Take lock here to protect nexttoggle */ - mutex_enter(&sc->sc_lock); + if (!polling) + mutex_enter(&sc->sc_lock); ehci_reset_sqtd_chain(sc, xfer, len, isread, &epipe->nexttoggle, &end); @@ -3864,7 +3872,8 @@ ehci_device_bulk_start(struct usbd_xfer } ehci_add_intr_list(sc, exfer); xfer->ux_status = USBD_IN_PROGRESS; - mutex_exit(&sc->sc_lock); + if (!polling) + mutex_exit(&sc->sc_lock); #if 0 #ifdef EHCI_DEBUG @@ -4029,6 +4038,7 @@ ehci_device_intr_start(struct usbd_xfer ehci_soft_qtd_t *end; ehci_soft_qh_t *sqh; int len, isread, endpt; + const bool polling = sc->sc_bus.ub_usepolling; EHCIHIST_FUNC(); EHCIHIST_CALLED(); @@ -4052,7 +4062,8 @@ ehci_device_intr_start(struct usbd_xfer #endif /* Take lock to protect nexttoggle */ - mutex_enter(&sc->sc_lock); + if (!polling) + mutex_enter(&sc->sc_lock); ehci_reset_sqtd_chain(sc, xfer, len, isread, &epipe->nexttoggle, &end); @@ -4079,7 +4090,8 @@ ehci_device_intr_start(struct usbd_xfer } ehci_add_intr_list(sc, exfer); xfer->ux_status = USBD_IN_PROGRESS; - mutex_exit(&sc->sc_lock); + if (!polling) + mutex_exit(&sc->sc_lock); #if 0 #ifdef EHCI_DEBUG Index: src/sys/dev/usb/ohci.c diff -u src/sys/dev/usb/ohci.c:1.286 src/sys/dev/usb/ohci.c:1.287 --- src/sys/dev/usb/ohci.c:1.286 Sun Sep 16 10:29:39 2018 +++ src/sys/dev/usb/ohci.c Sun Sep 16 20:21:56 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: ohci.c,v 1.286 2018/09/16 10:29:39 mrg Exp $ */ +/* $NetBSD: ohci.c,v 1.287 2018/09/16 20:21:56 mrg 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.286 2018/09/16 10:29:39 mrg Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ohci.c,v 1.287 2018/09/16 20:21:56 mrg Exp $"); #ifdef _KERNEL_OPT #include "opt_usb.h" @@ -2591,14 +2591,17 @@ Static usbd_status ohci_root_intr_start(struct usbd_xfer *xfer) { ohci_softc_t *sc = OHCI_XFER2SC(xfer); + const bool polling = sc->sc_bus.ub_usepolling; if (sc->sc_dying) return USBD_IOERROR; - mutex_enter(&sc->sc_lock); + if (!polling) + mutex_enter(&sc->sc_lock); KASSERT(sc->sc_intrxfer == NULL); sc->sc_intrxfer = xfer; - mutex_exit(&sc->sc_lock); + if (!polling) + mutex_exit(&sc->sc_lock); return USBD_IN_PROGRESS; } @@ -2732,6 +2735,7 @@ ohci_device_ctrl_start(struct usbd_xfer ohci_soft_ed_t *sed; int isread; int len; + const bool polling = sc->sc_bus.ub_usepolling; OHCIHIST_FUNC(); OHCIHIST_CALLED(); @@ -2750,7 +2754,8 @@ ohci_device_ctrl_start(struct usbd_xfer UGETW(req->wIndex)); /* Need to take lock here for pipe->tail.td */ - mutex_enter(&sc->sc_lock); + if (!polling) + mutex_enter(&sc->sc_lock); /* * Use the pipe "tail" TD as our first and loan our first TD to the @@ -2866,7 +2871,7 @@ ohci_device_ctrl_start(struct usbd_xfer sizeof(sed->ed.ed_tailp), BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD); OWRITE4(sc, OHCI_COMMAND_STATUS, OHCI_CLF); - if (xfer->ux_timeout && !sc->sc_bus.ub_usepolling) { + if (xfer->ux_timeout && !polling) { callout_reset(&xfer->ux_callout, mstohz(xfer->ux_timeout), ohci_timeout, xfer); } @@ -2874,7 +2879,8 @@ ohci_device_ctrl_start(struct usbd_xfer DPRINTF("done", 0, 0, 0, 0); xfer->ux_status = USBD_IN_PROGRESS; - mutex_exit(&sc->sc_lock); + if (!polling) + mutex_exit(&sc->sc_lock); return USBD_IN_PROGRESS; } @@ -3001,6 +3007,7 @@ ohci_device_bulk_start(struct usbd_xfer ohci_soft_td_t *data, *tail, *tdp; ohci_soft_ed_t *sed; int len, isread, endpt; + const bool polling = sc->sc_bus.ub_usepolling; OHCIHIST_FUNC(); OHCIHIST_CALLED(); @@ -3018,7 +3025,8 @@ ohci_device_bulk_start(struct usbd_xfer len, isread, xfer->ux_flags); DPRINTFN(4, "endpt=%jd", endpt, 0, 0, 0); - mutex_enter(&sc->sc_lock); + if (!polling) + mutex_enter(&sc->sc_lock); /* * Use the pipe "tail" TD as our first and loan our first TD to the @@ -3084,7 +3092,8 @@ ohci_device_bulk_start(struct usbd_xfer } xfer->ux_status = USBD_IN_PROGRESS; - mutex_exit(&sc->sc_lock); + if (!polling) + mutex_exit(&sc->sc_lock); return USBD_IN_PROGRESS; } @@ -3203,6 +3212,7 @@ ohci_device_intr_start(struct usbd_xfer ohci_soft_ed_t *sed = opipe->sed; ohci_soft_td_t *data, *last, *tail; int len, isread, endpt; + const bool polling = sc->sc_bus.ub_usepolling; OHCIHIST_FUNC(); OHCIHIST_CALLED(); @@ -3218,7 +3228,8 @@ ohci_device_intr_start(struct usbd_xfer endpt = xfer->ux_pipe->up_endpoint->ue_edesc->bEndpointAddress; isread = UE_GET_DIR(endpt) == UE_DIR_IN; - mutex_enter(&sc->sc_lock); + if (!polling) + mutex_enter(&sc->sc_lock); /* * Use the pipe "tail" TD as our first and loan our first TD to the @@ -3270,7 +3281,8 @@ ohci_device_intr_start(struct usbd_xfer BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD); xfer->ux_status = USBD_IN_PROGRESS; - mutex_exit(&sc->sc_lock); + if (!polling) + mutex_exit(&sc->sc_lock); return USBD_IN_PROGRESS; } Index: src/sys/dev/usb/uhci.c diff -u src/sys/dev/usb/uhci.c:1.283 src/sys/dev/usb/uhci.c:1.284 --- src/sys/dev/usb/uhci.c:1.283 Mon Sep 3 16:29:34 2018 +++ src/sys/dev/usb/uhci.c Sun Sep 16 20:21:56 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: uhci.c,v 1.283 2018/09/03 16:29:34 riastradh Exp $ */ +/* $NetBSD: uhci.c,v 1.284 2018/09/16 20:21:56 mrg 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.283 2018/09/03 16:29:34 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uhci.c,v 1.284 2018/09/16 20:21:56 mrg Exp $"); #ifdef _KERNEL_OPT #include "opt_usb.h" @@ -1555,7 +1555,7 @@ uhci_idone(struct uhci_xfer *ux, ux_comp struct uhci_pipe *upipe = UHCI_PIPE2UPIPE(xfer->ux_pipe); uhci_soft_td_t *std; uint32_t status = 0, nstatus; - bool polling __diagused = sc->sc_bus.ub_usepolling; + const bool polling __diagused = sc->sc_bus.ub_usepolling; int actlen; KASSERT(polling || mutex_owned(&sc->sc_lock)); @@ -2257,6 +2257,7 @@ uhci_device_bulk_start(struct usbd_xfer uhci_softc_t *sc = UHCI_XFER2SC(xfer); uhci_soft_td_t *data, *dataend; uhci_soft_qh_t *sqh; + const bool polling = sc->sc_bus.ub_usepolling; int len; int endpt; int isread; @@ -2277,7 +2278,8 @@ uhci_device_bulk_start(struct usbd_xfer sqh = upipe->bulk.sqh; /* Take lock here to protect nexttoggle */ - mutex_enter(&sc->sc_lock); + if (!polling) + mutex_enter(&sc->sc_lock); uhci_reset_std_chain(sc, xfer, len, isread, &upipe->nexttoggle, &dataend); @@ -2311,12 +2313,13 @@ uhci_device_bulk_start(struct usbd_xfer uhci_add_bulk(sc, sqh); uhci_add_intr_list(sc, ux); - if (xfer->ux_timeout && !sc->sc_bus.ub_usepolling) { + if (xfer->ux_timeout && !polling) { callout_reset(&xfer->ux_callout, mstohz(xfer->ux_timeout), uhci_timeout, xfer); } xfer->ux_status = USBD_IN_PROGRESS; - mutex_exit(&sc->sc_lock); + if (!polling) + mutex_exit(&sc->sc_lock); return USBD_IN_PROGRESS; } @@ -2541,6 +2544,7 @@ uhci_device_ctrl_start(struct usbd_xfer int endpt = upipe->pipe.up_endpoint->ue_edesc->bEndpointAddress; uhci_soft_td_t *setup, *stat, *next, *dataend; uhci_soft_qh_t *sqh; + const bool polling = sc->sc_bus.ub_usepolling; int len; int isread; @@ -2568,7 +2572,8 @@ uhci_device_ctrl_start(struct usbd_xfer memcpy(KERNADDR(&upipe->ctrl.reqdma, 0), req, sizeof(*req)); usb_syncmem(&upipe->ctrl.reqdma, 0, sizeof(*req), BUS_DMASYNC_PREWRITE); - mutex_enter(&sc->sc_lock); + if (!polling) + mutex_enter(&sc->sc_lock); /* Set up data transaction */ if (len != 0) { @@ -2665,12 +2670,13 @@ uhci_device_ctrl_start(struct usbd_xfer DPRINTF("--- dump end ---", 0, 0, 0, 0); } #endif - if (xfer->ux_timeout && !sc->sc_bus.ub_usepolling) { + if (xfer->ux_timeout && !polling) { callout_reset(&xfer->ux_callout, mstohz(xfer->ux_timeout), uhci_timeout, xfer); } xfer->ux_status = USBD_IN_PROGRESS; - mutex_exit(&sc->sc_lock); + if (!polling) + mutex_exit(&sc->sc_lock); return USBD_IN_PROGRESS; } @@ -2743,6 +2749,7 @@ uhci_device_intr_start(struct usbd_xfer uhci_softc_t *sc = UHCI_XFER2SC(xfer); uhci_soft_td_t *data, *dataend; uhci_soft_qh_t *sqh; + const bool polling = sc->sc_bus.ub_usepolling; int isread, endpt; int i; @@ -2768,7 +2775,7 @@ uhci_device_intr_start(struct usbd_xfer #endif /* Take lock to protect nexttoggle */ - if (!sc->sc_bus.ub_usepolling) + if (!polling) mutex_enter(&sc->sc_lock); uhci_reset_std_chain(sc, xfer, xfer->ux_length, isread, &upipe->nexttoggle, &dataend); @@ -2801,7 +2808,7 @@ uhci_device_intr_start(struct usbd_xfer } uhci_add_intr_list(sc, ux); xfer->ux_status = USBD_IN_PROGRESS; - if (!sc->sc_bus.ub_usepolling) + if (!polling) mutex_exit(&sc->sc_lock); #ifdef UHCI_DEBUG Index: src/sys/dev/usb/usb.c diff -u src/sys/dev/usb/usb.c:1.171 src/sys/dev/usb/usb.c:1.172 --- src/sys/dev/usb/usb.c:1.171 Thu Aug 2 06:09:04 2018 +++ src/sys/dev/usb/usb.c Sun Sep 16 20:21:56 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: usb.c,v 1.171 2018/08/02 06:09:04 riastradh Exp $ */ +/* $NetBSD: usb.c,v 1.172 2018/09/16 20:21:56 mrg Exp $ */ /* * Copyright (c) 1998, 2002, 2008, 2012 The NetBSD Foundation, Inc. @@ -37,7 +37,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: usb.c,v 1.171 2018/08/02 06:09:04 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: usb.c,v 1.172 2018/09/16 20:21:56 mrg Exp $"); #ifdef _KERNEL_OPT #include "opt_usb.h" @@ -375,6 +375,10 @@ usb_doattach(device_t self) sc->sc_dying = 1; } + /* + * Drop this reference after the first set of attachments in the + * event thread. + */ config_pending_incr(self); if (!pmf_device_register(self, NULL, NULL)) @@ -529,6 +533,7 @@ void usb_event_thread(void *arg) { struct usb_softc *sc = arg; + struct usbd_bus *bus = sc->sc_bus; USBHIST_FUNC(); USBHIST_CALLED(usbdebug); @@ -540,30 +545,37 @@ usb_event_thread(void *arg) * know how to synchronize the creation of the threads so it * will work. */ - usb_delay_ms(sc->sc_bus, 500); + usb_delay_ms(bus, 500); /* Make sure first discover does something. */ - mutex_enter(sc->sc_bus->ub_lock); + mutex_enter(bus->ub_lock); sc->sc_bus->ub_needsexplore = 1; usb_discover(sc); - mutex_exit(sc->sc_bus->ub_lock); - config_pending_decr(sc->sc_bus->ub_usbctl); + mutex_exit(bus->ub_lock); + + /* Drop the config_pending reference from attach. */ + config_pending_decr(bus->ub_usbctl); - mutex_enter(sc->sc_bus->ub_lock); + mutex_enter(bus->ub_lock); while (!sc->sc_dying) { +#if 0 /* not yet */ + while (sc->sc_bus->ub_usepolling) + kpause("usbpoll", true, hz, bus->ub_lock); +#endif + if (usb_noexplore < 2) usb_discover(sc); - cv_timedwait(&sc->sc_bus->ub_needsexplore_cv, - sc->sc_bus->ub_lock, usb_noexplore ? 0 : hz * 60); + cv_timedwait(&bus->ub_needsexplore_cv, + bus->ub_lock, usb_noexplore ? 0 : hz * 60); DPRINTFN(2, "sc %#jx woke up", (uintptr_t)sc, 0, 0, 0); } sc->sc_event_thread = NULL; /* In case parent is waiting for us to exit. */ - cv_signal(&sc->sc_bus->ub_needsexplore_cv); - mutex_exit(sc->sc_bus->ub_lock); + cv_signal(&bus->ub_needsexplore_cv); + mutex_exit(bus->ub_lock); DPRINTF("sc %#jx exit", (uintptr_t)sc, 0, 0, 0); kthread_exit(0); @@ -997,25 +1009,28 @@ usbkqfilter(dev_t dev, struct knote *kn) Static void usb_discover(struct usb_softc *sc) { + struct usbd_bus *bus = sc->sc_bus; USBHIST_FUNC(); USBHIST_CALLED(usbdebug); - KASSERT(mutex_owned(sc->sc_bus->ub_lock)); + KASSERT(mutex_owned(bus->ub_lock)); if (usb_noexplore > 1) return; + /* * We need mutual exclusion while traversing the device tree, * but this is guaranteed since this function is only called * from the event thread for the controller. * - * Also, we now have sc_bus->ub_lock held. + * Also, we now have bus->ub_lock held, and in combination + * with ub_exploring, avoids interferring with polling. */ - while (sc->sc_bus->ub_needsexplore && !sc->sc_dying) { - sc->sc_bus->ub_needsexplore = 0; + while (bus->ub_needsexplore && !sc->sc_dying) { + bus->ub_needsexplore = 0; mutex_exit(sc->sc_bus->ub_lock); - sc->sc_bus->ub_roothub->ud_hub->uh_explore(sc->sc_bus->ub_roothub); - mutex_enter(sc->sc_bus->ub_lock); + bus->ub_roothub->ud_hub->uh_explore(bus->ub_roothub); + mutex_enter(bus->ub_lock); } } Index: src/sys/dev/usb/usbdi.c diff -u src/sys/dev/usb/usbdi.c:1.177 src/sys/dev/usb/usbdi.c:1.178 --- src/sys/dev/usb/usbdi.c:1.177 Thu Aug 9 06:26:47 2018 +++ src/sys/dev/usb/usbdi.c Sun Sep 16 20:21:56 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: usbdi.c,v 1.177 2018/08/09 06:26:47 mrg Exp $ */ +/* $NetBSD: usbdi.c,v 1.178 2018/09/16 20:21:56 mrg 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.177 2018/08/09 06:26:47 mrg Exp $"); +__KERNEL_RCSID(0, "$NetBSD: usbdi.c,v 1.178 2018/09/16 20:21:56 mrg Exp $"); #ifdef _KERNEL_OPT #include "opt_usb.h" @@ -964,19 +964,19 @@ usb_transfer_complete(struct usbd_xfer * (uintptr_t)xfer, (uintptr_t)xfer->ux_callback, xfer->ux_status, 0); if (xfer->ux_callback) { - if (!polling) + if (!polling) { mutex_exit(pipe->up_dev->ud_bus->ub_lock); - - if (!(pipe->up_flags & USBD_MPSAFE)) - KERNEL_LOCK(1, curlwp); + if (!(pipe->up_flags & USBD_MPSAFE)) + KERNEL_LOCK(1, curlwp); + } xfer->ux_callback(xfer, xfer->ux_priv, xfer->ux_status); - if (!(pipe->up_flags & USBD_MPSAFE)) - KERNEL_UNLOCK_ONE(curlwp); - - if (!polling) + if (!polling) { + if (!(pipe->up_flags & USBD_MPSAFE)) + KERNEL_UNLOCK_ONE(curlwp); mutex_enter(pipe->up_dev->ud_bus->ub_lock); + } } if (sync && !polling) { @@ -1175,7 +1175,8 @@ usbd_dopoll(struct usbd_interface *iface } /* - * XXX use this more??? ub_usepolling it touched manually all over + * This is for keyboard driver as well, which only operates in polling + * mode from the ask root, etc., prompt and from DDB. */ void usbd_set_polling(struct usbd_device *dev, int on) Index: src/sys/dev/usb/xhci.c diff -u src/sys/dev/usb/xhci.c:1.98 src/sys/dev/usb/xhci.c:1.99 --- src/sys/dev/usb/xhci.c:1.98 Mon Sep 3 16:29:34 2018 +++ src/sys/dev/usb/xhci.c Sun Sep 16 20:21:56 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: xhci.c,v 1.98 2018/09/03 16:29:34 riastradh Exp $ */ +/* $NetBSD: xhci.c,v 1.99 2018/09/16 20:21:56 mrg Exp $ */ /* * Copyright (c) 2013 Jonathan A. Kollasch @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: xhci.c,v 1.98 2018/09/03 16:29:34 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: xhci.c,v 1.99 2018/09/16 20:21:56 mrg Exp $"); #ifdef _KERNEL_OPT #include "opt_usb.h" @@ -3705,15 +3705,18 @@ xhci_root_intr_start(struct usbd_xfer *x { struct xhci_softc * const sc = XHCI_XFER2SC(xfer); const size_t bn = XHCI_XFER2BUS(xfer) == &sc->sc_bus ? 0 : 1; + const bool polling = sc->sc_bus.ub_usepolling; XHCIHIST_FUNC(); XHCIHIST_CALLED(); if (sc->sc_dying) return USBD_IOERROR; - mutex_enter(&sc->sc_lock); + if (!polling) + mutex_enter(&sc->sc_lock); sc->sc_intrxfer[bn] = xfer; - mutex_exit(&sc->sc_lock); + if (!polling) + mutex_exit(&sc->sc_lock); return USBD_IN_PROGRESS; } @@ -3791,6 +3794,7 @@ xhci_device_ctrl_start(struct usbd_xfer uint32_t status; uint32_t control; u_int i; + const bool polling = sc->sc_bus.ub_usepolling; XHCIHIST_FUNC(); XHCIHIST_CALLED(); DPRINTFN(12, "req: %04jx %04jx %04jx %04jx", @@ -3837,9 +3841,11 @@ xhci_device_ctrl_start(struct usbd_xfer xhci_trb_put(&xx->xx_trb[i++], parameter, status, control); xfer->ux_status = USBD_IN_PROGRESS; - mutex_enter(&tr->xr_lock); + if (!polling) + mutex_enter(&tr->xr_lock); xhci_ring_put(sc, tr, xfer, xx->xx_trb, i); - mutex_exit(&tr->xr_lock); + if (!polling) + mutex_exit(&tr->xr_lock); xhci_db_write_4(sc, XHCI_DOORBELL(xs->xs_idx), dci); @@ -3922,6 +3928,7 @@ xhci_device_bulk_start(struct usbd_xfer uint32_t status; uint32_t control; u_int i = 0; + const bool polling = sc->sc_bus.ub_usepolling; XHCIHIST_FUNC(); XHCIHIST_CALLED(); @@ -3955,9 +3962,11 @@ xhci_device_bulk_start(struct usbd_xfer xhci_trb_put(&xx->xx_trb[i++], parameter, status, control); xfer->ux_status = USBD_IN_PROGRESS; - mutex_enter(&tr->xr_lock); + if (!polling) + mutex_enter(&tr->xr_lock); xhci_ring_put(sc, tr, xfer, xx->xx_trb, i); - mutex_exit(&tr->xr_lock); + if (!polling) + mutex_exit(&tr->xr_lock); xhci_db_write_4(sc, XHCI_DOORBELL(xs->xs_idx), dci); Index: src/sys/external/bsd/dwc2/dwc2.c diff -u src/sys/external/bsd/dwc2/dwc2.c:1.54 src/sys/external/bsd/dwc2/dwc2.c:1.55 --- src/sys/external/bsd/dwc2/dwc2.c:1.54 Tue Aug 28 08:17:10 2018 +++ src/sys/external/bsd/dwc2/dwc2.c Sun Sep 16 20:21:56 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: dwc2.c,v 1.54 2018/08/28 08:17:10 skrll Exp $ */ +/* $NetBSD: dwc2.c,v 1.55 2018/09/16 20:21:56 mrg Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: dwc2.c,v 1.54 2018/08/28 08:17:10 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dwc2.c,v 1.55 2018/09/16 20:21:56 mrg Exp $"); #include "opt_usb.h" @@ -625,16 +625,19 @@ Static usbd_status dwc2_root_intr_start(struct usbd_xfer *xfer) { struct dwc2_softc *sc = DWC2_XFER2SC(xfer); + const bool polling = sc->sc_bus.ub_usepolling; DPRINTF("\n"); if (sc->sc_dying) return USBD_IOERROR; - mutex_enter(&sc->sc_lock); + if (!polling) + mutex_enter(&sc->sc_lock); KASSERT(sc->sc_intrxfer == NULL); sc->sc_intrxfer = xfer; - mutex_exit(&sc->sc_lock); + if (!polling) + mutex_exit(&sc->sc_lock); return USBD_IN_PROGRESS; } @@ -702,13 +705,16 @@ dwc2_device_ctrl_start(struct usbd_xfer { struct dwc2_softc *sc = DWC2_XFER2SC(xfer); usbd_status err; + const bool polling = sc->sc_bus.ub_usepolling; DPRINTF("\n"); - mutex_enter(&sc->sc_lock); + if (!polling) + mutex_enter(&sc->sc_lock); xfer->ux_status = USBD_IN_PROGRESS; err = dwc2_device_start(xfer); - mutex_exit(&sc->sc_lock); + if (!polling) + mutex_exit(&sc->sc_lock); if (err) return err; @@ -822,11 +828,14 @@ dwc2_device_intr_start(struct usbd_xfer struct usbd_device *dev = dpipe->pipe.up_dev; struct dwc2_softc *sc = dev->ud_bus->ub_hcpriv; usbd_status err; + const bool polling = sc->sc_bus.ub_usepolling; - mutex_enter(&sc->sc_lock); + if (!polling) + mutex_enter(&sc->sc_lock); xfer->ux_status = USBD_IN_PROGRESS; err = dwc2_device_start(xfer); - mutex_exit(&sc->sc_lock); + if (!polling) + mutex_exit(&sc->sc_lock); if (err) return err;