Module Name: src Committed By: mrg Date: Sat Feb 25 20:46:34 UTC 2012
Modified Files: src/sys/dev/usb [jmcneill-usbmp]: ehci.c ohci.c uhci.c usbdi.c usbdivar.h Log Message: replace the (diagnostic-only) intr_context with checks against LP_INTR and cpu_intr_p(). XXX: there's one check that changes behaviour To generate a diff of this commit: cvs rdiff -u -r1.181.6.12 -r1.181.6.13 src/sys/dev/usb/ehci.c cvs rdiff -u -r1.218.6.14 -r1.218.6.15 src/sys/dev/usb/ohci.c cvs rdiff -u -r1.240.6.13 -r1.240.6.14 src/sys/dev/usb/uhci.c cvs rdiff -u -r1.134.2.12 -r1.134.2.13 src/sys/dev/usb/usbdi.c cvs rdiff -u -r1.93.8.9 -r1.93.8.10 src/sys/dev/usb/usbdivar.h 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.181.6.12 src/sys/dev/usb/ehci.c:1.181.6.13 --- src/sys/dev/usb/ehci.c:1.181.6.12 Sat Feb 25 10:26:23 2012 +++ src/sys/dev/usb/ehci.c Sat Feb 25 20:46:33 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: ehci.c,v 1.181.6.12 2012/02/25 10:26:23 mrg Exp $ */ +/* $NetBSD: ehci.c,v 1.181.6.13 2012/02/25 20:46:33 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.181.6.12 2012/02/25 10:26:23 mrg Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ehci.c,v 1.181.6.13 2012/02/25 20:46:33 mrg Exp $"); #include "ohci.h" #include "uhci.h" @@ -69,6 +69,7 @@ __KERNEL_RCSID(0, "$NetBSD: ehci.c,v 1.1 #include <sys/queue.h> #include <sys/mutex.h> #include <sys/bus.h> +#include <sys/cpu.h> #include <machine/endian.h> @@ -648,7 +649,6 @@ ehci_intr1(ehci_softc_t *sc) return (0); EOWRITE4(sc, EHCI_USBSTS, intrs); /* Acknowledge */ - sc->sc_bus.intr_context++; sc->sc_bus.no_intrs++; if (eintrs & EHCI_STS_IAA) { DPRINTF(("ehci_intr1: door bell\n")); @@ -676,8 +676,6 @@ ehci_intr1(ehci_softc_t *sc) eintrs &= ~EHCI_STS_PCD; } - sc->sc_bus.intr_context--; - if (eintrs != 0) { /* Block unprocessed interrupts. */ sc->sc_eintrs &= ~eintrs; @@ -745,10 +743,7 @@ ehci_softintr(void *v) KASSERT(sc->sc_bus.use_polling || mutex_owned(&sc->sc_lock)); - DPRINTFN(10,("%s: ehci_softintr (%d)\n", device_xname(sc->sc_dev), - sc->sc_bus.intr_context)); - - sc->sc_bus.intr_context++; + DPRINTFN(10,("%s: ehci_softintr\n", device_xname(sc->sc_dev))); /* * The only explanation I can think of for why EHCI is as brain dead @@ -771,8 +766,6 @@ ehci_softintr(void *v) sc->sc_softwake = 0; cv_broadcast(&sc->sc_softwake_cv); } - - sc->sc_bus.intr_context--; } /* Check for an interrupt. */ @@ -3010,7 +3003,7 @@ ehci_abort_xfer(usbd_xfer_handle xfer, u return; } - if (xfer->device->bus->intr_context) + if (cpu_intr_p() || (curlwp->l_pflag & LP_INTR) != 0) panic("ehci_abort_xfer: not in process context"); /* Index: src/sys/dev/usb/ohci.c diff -u src/sys/dev/usb/ohci.c:1.218.6.14 src/sys/dev/usb/ohci.c:1.218.6.15 --- src/sys/dev/usb/ohci.c:1.218.6.14 Sat Feb 25 12:53:34 2012 +++ src/sys/dev/usb/ohci.c Sat Feb 25 20:46:34 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: ohci.c,v 1.218.6.14 2012/02/25 12:53:34 mrg Exp $ */ +/* $NetBSD: ohci.c,v 1.218.6.15 2012/02/25 20:46:34 mrg Exp $ */ /* $FreeBSD: src/sys/dev/usb/ohci.c,v 1.22 1999/11/17 22:33:40 n_hibma Exp $ */ /* @@ -42,7 +42,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ohci.c,v 1.218.6.14 2012/02/25 12:53:34 mrg Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ohci.c,v 1.218.6.15 2012/02/25 20:46:34 mrg Exp $"); #include "opt_usb.h" @@ -54,6 +54,7 @@ __KERNEL_RCSID(0, "$NetBSD: ohci.c,v 1.2 #include <sys/select.h> #include <sys/proc.h> #include <sys/queue.h> +#include <sys/cpu.h> #include <sys/bus.h> #include <machine/endian.h> @@ -1187,7 +1188,6 @@ ohci_intr1(ohci_softc_t *sc) return (0); } - sc->sc_bus.intr_context++; sc->sc_bus.no_intrs++; if (eintrs & OHCI_SO) { sc->sc_overrun_cnt++; @@ -1224,8 +1224,6 @@ ohci_intr1(ohci_softc_t *sc) softint_schedule(sc->sc_rhsc_si); } - sc->sc_bus.intr_context--; - if (eintrs != 0) { /* Block unprocessed interrupts. */ OWRITE4(sc, OHCI_INTERRUPT_DISABLE, eintrs); @@ -1287,8 +1285,6 @@ ohci_softintr(void *v) DPRINTFN(10,("ohci_softintr: enter\n")); - sc->sc_bus.intr_context++; - usb_syncmem(&sc->sc_hccadma, offsetof(struct ohci_hcca, hcca_done_head), sizeof(sc->sc_hcca->hcca_done_head), BUS_DMASYNC_POSTWRITE | BUS_DMASYNC_POSTREAD); @@ -1486,8 +1482,6 @@ ohci_softintr(void *v) cv_broadcast(&sc->sc_softwake_cv); } - sc->sc_bus.intr_context--; - DPRINTFN(10,("ohci_softintr: done:\n")); } @@ -2323,7 +2317,7 @@ ohci_abort_xfer(usbd_xfer_handle xfer, u return; } - if (xfer->device->bus->intr_context) + if (cpu_intr_p() || (curlwp->l_pflag & LP_INTR) != 0) panic("ohci_abort_xfer: not in process context"); /* Index: src/sys/dev/usb/uhci.c diff -u src/sys/dev/usb/uhci.c:1.240.6.13 src/sys/dev/usb/uhci.c:1.240.6.14 --- src/sys/dev/usb/uhci.c:1.240.6.13 Sat Feb 25 12:53:34 2012 +++ src/sys/dev/usb/uhci.c Sat Feb 25 20:46:33 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: uhci.c,v 1.240.6.13 2012/02/25 12:53:34 mrg Exp $ */ +/* $NetBSD: uhci.c,v 1.240.6.14 2012/02/25 20:46:33 mrg Exp $ */ /* $FreeBSD: src/sys/dev/usb/uhci.c,v 1.33 1999/11/17 22:33:41 n_hibma Exp $ */ /* @@ -43,7 +43,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: uhci.c,v 1.240.6.13 2012/02/25 12:53:34 mrg Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uhci.c,v 1.240.6.14 2012/02/25 20:46:33 mrg Exp $"); #include "opt_usb.h" @@ -57,6 +57,7 @@ __KERNEL_RCSID(0, "$NetBSD: uhci.c,v 1.2 #include <sys/proc.h> #include <sys/queue.h> #include <sys/bus.h> +#include <sys/cpu.h> #include <machine/endian.h> @@ -1033,9 +1034,7 @@ uhci_poll_hub(void *addr) xfer->actlen = 1; xfer->status = USBD_NORMAL_COMPLETION; mutex_enter(&sc->sc_lock); - xfer->device->bus->intr_context++; usb_transfer_complete(xfer); - xfer->device->bus->intr_context--; mutex_exit(&sc->sc_lock); } @@ -1391,10 +1390,7 @@ uhci_softintr(void *v) KASSERT(sc->sc_bus.use_polling || mutex_owned(&sc->sc_lock)); - DPRINTFN(10,("%s: uhci_softintr (%d)\n", device_xname(sc->sc_dev), - sc->sc_bus.intr_context)); - - sc->sc_bus.intr_context++; + DPRINTFN(10,("%s: uhci_softintr\n", device_xname(sc->sc_dev))); /* * Interrupts on UHCI really suck. When the host controller @@ -1416,8 +1412,6 @@ uhci_softintr(void *v) sc->sc_softwake = 0; cv_broadcast(&sc->sc_softwake_cv); } - - sc->sc_bus.intr_context--; } /* Check for an interrupt. */ @@ -2152,7 +2146,7 @@ uhci_abort_xfer(usbd_xfer_handle xfer, u return; } - if (xfer->device->bus->intr_context) + if (cpu_intr_p() || (curlwp->l_pflag & LP_INTR) != 0) panic("uhci_abort_xfer: not in process context"); /* Index: src/sys/dev/usb/usbdi.c diff -u src/sys/dev/usb/usbdi.c:1.134.2.12 src/sys/dev/usb/usbdi.c:1.134.2.13 --- src/sys/dev/usb/usbdi.c:1.134.2.12 Sat Feb 25 10:26:24 2012 +++ src/sys/dev/usb/usbdi.c Sat Feb 25 20:46:34 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: usbdi.c,v 1.134.2.12 2012/02/25 10:26:24 mrg Exp $ */ +/* $NetBSD: usbdi.c,v 1.134.2.13 2012/02/25 20:46:34 mrg Exp $ */ /* $FreeBSD: src/sys/dev/usb/usbdi.c,v 1.28 1999/11/17 22:33:49 n_hibma Exp $ */ /* @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: usbdi.c,v 1.134.2.12 2012/02/25 10:26:24 mrg Exp $"); +__KERNEL_RCSID(0, "$NetBSD: usbdi.c,v 1.134.2.13 2012/02/25 20:46:34 mrg Exp $"); #include "opt_compat_netbsd.h" #include "opt_usb.h" @@ -43,8 +43,8 @@ __KERNEL_RCSID(0, "$NetBSD: usbdi.c,v 1. #include <sys/device.h> #include <sys/malloc.h> #include <sys/proc.h> - #include <sys/bus.h> +#include <sys/cpu.h> #include <dev/usb/usb.h> #include <dev/usb/usbdi.h> @@ -968,7 +968,7 @@ usbd_do_request_flags_pipe(usbd_device_h usbd_status err; #ifdef DIAGNOSTIC - if (dev->bus->intr_context) { + if (cpu_intr_p() || (curlwp->l_pflag & LP_INTR) != 0) { printf("usbd_do_request: not in process context\n"); return (USBD_INVAL); } Index: src/sys/dev/usb/usbdivar.h diff -u src/sys/dev/usb/usbdivar.h:1.93.8.9 src/sys/dev/usb/usbdivar.h:1.93.8.10 --- src/sys/dev/usb/usbdivar.h:1.93.8.9 Sat Feb 25 10:26:24 2012 +++ src/sys/dev/usb/usbdivar.h Sat Feb 25 20:46:34 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: usbdivar.h,v 1.93.8.9 2012/02/25 10:26:24 mrg Exp $ */ +/* $NetBSD: usbdivar.h,v 1.93.8.10 2012/02/25 20:46:34 mrg Exp $ */ /* $FreeBSD: src/sys/dev/usb/usbdivar.h,v 1.11 1999/11/17 22:33:51 n_hibma Exp $ */ /* @@ -62,7 +62,8 @@ * cleartoggle - * done x * - * The above semantics are likely to change. + * The above semantics are likely to change. Little performance + * evaluation has been done on this code and the locking strategy. * * USB functions known to expect the lock taken include (this list is * probably not exhaustive): @@ -152,7 +153,6 @@ struct usbd_bus { char use_polling; device_t usbctl; struct usb_device_stats stats; - int intr_context; u_int no_intrs; int usbrev; /* USB revision */ #define USBREV_UNKNOWN 0