diff options
author | joe <joe@FreeBSD.org> | 2002-04-01 21:34:01 +0000 |
---|---|---|
committer | joe <joe@FreeBSD.org> | 2002-04-01 21:34:01 +0000 |
commit | 0ddcf62ed59f8c10287786d52a41bd0772e9abdb (patch) | |
tree | ff1f5fd46d7a589f06bfe013341f1605847c95e5 /sys/dev/usb/usb.c | |
parent | dc2e474f79c1287592679cd5e0c4c2307feccd60 (diff) | |
download | FreeBSD-src-0ddcf62ed59f8c10287786d52a41bd0772e9abdb.zip FreeBSD-src-0ddcf62ed59f8c10287786d52a41bd0772e9abdb.tar.gz |
MFNetBSD: ohci.c (1.99), uhci.c (1.133), usb.c (1.49), usb_port.h
(1.39), usbdi.c (1.79), usbdi.h (1.47), usbdivar.h (1.62)
date: 2001/01/21 02:39:52; author: augustss;
Add code to use soft interrupt to handle USB interrupt processing.
Don't enable the code since it doesn't work with the kludgy Ethernet
drivers.
Diffstat (limited to 'sys/dev/usb/usb.c')
-rw-r--r-- | sys/dev/usb/usb.c | 43 |
1 files changed, 41 insertions, 2 deletions
diff --git a/sys/dev/usb/usb.c b/sys/dev/usb/usb.c index 1e59ec4..d7cfcd5 100644 --- a/sys/dev/usb/usb.c +++ b/sys/dev/usb/usb.c @@ -1,4 +1,4 @@ -/* $NetBSD: usb.c,v 1.48 2000/12/13 04:05:14 augustss Exp $ */ +/* $NetBSD: usb.c,v 1.49 2001/01/21 02:39:53 augustss Exp $ */ /* $FreeBSD$ */ /* @@ -229,6 +229,20 @@ USB_ATTACH(usb) ue.u.ue_ctrlr.ue_bus = USBDEVUNIT(sc->sc_dev); usb_add_event(USB_EVENT_CTRLR_ATTACH, &ue); +#ifdef USB_USE_SOFTINTR +#ifdef __HAVE_GENERIC_SOFT_INTERRUPTS + /* XXX we should have our own level */ + sc->sc_bus->soft = softintr_establish(IPL_SOFTNET, + sc->sc_bus->methods->soft_intr, sc->sc_bus); + if (sc->sc_bus->soft == NULL) { + printf("%s: can't register softintr\n", USBDEVNAME(sc->sc_dev)); + sc->sc_dying = 1; + } +#else + callout_init(&sc->sc_bus->softi); +#endif +#endif + err = usbd_new_device(USBDEV(sc->sc_dev), sc->sc_bus, 0, 0, 0, &sc->sc_port); if (!err) { @@ -703,9 +717,23 @@ usb_add_event(int type, struct usb_event *uep) } void -usb_schedsoftintr(struct usbd_bus *bus) +usb_schedsoftintr(usbd_bus_handle bus) { +#ifdef USB_USE_SOFTINTR + if (bus->use_polling) { + bus->methods->soft_intr(bus); + } else { +#ifdef __HAVE_GENERIC_SOFT_INTERRUPTS + softintr_schedule(bus->soft); +#else + if (!callout_pending(&bus->softi)) + callout_reset(&bus->softi, 0, bus->methods->soft_intr, + bus); +#endif /* __HAVE_GENERIC_SOFT_INTERRUPTS */ + } +#else bus->methods->soft_intr(bus); +#endif } #if defined(__NetBSD__) || defined(__OpenBSD__) @@ -757,6 +785,17 @@ usb_detach(device_ptr_t self, int flags) usbd_finish(); +#ifdef USB_USE_SOFTINTR +#ifdef __HAVE_GENERIC_SOFT_INTERRUPTS + if (sc->sc_bus->soft != NULL) { + softintr_disestablish(sc->sc_bus->soft); + sc->sc_bus->soft = NULL; + } +#else + callout_stop(&sc->sc_bus->softi); +#endif +#endif + ue.u.ue_ctrlr.ue_bus = USBDEVUNIT(sc->sc_dev); usb_add_event(USB_EVENT_CTRLR_DETACH, &ue); |