diff options
author | scottl <scottl@FreeBSD.org> | 2004-10-05 04:03:00 +0000 |
---|---|---|
committer | scottl <scottl@FreeBSD.org> | 2004-10-05 04:03:00 +0000 |
commit | 4a0945bc22b3ab2778127bb3beacf1fd455ac628 (patch) | |
tree | 997a213492dfe396598c5246af8727fe4d3adf09 | |
parent | c5a7af07683552f446d813fc33c8e3c7dcbe95eb (diff) | |
download | FreeBSD-src-4a0945bc22b3ab2778127bb3beacf1fd455ac628.zip FreeBSD-src-4a0945bc22b3ab2778127bb3beacf1fd455ac628.tar.gz |
Use a taskqueue rather than an swi to handle deferred notifications.
-rw-r--r-- | sys/dev/usb/umct.c | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/sys/dev/usb/umct.c b/sys/dev/usb/umct.c index 2d42e76..c04f473 100644 --- a/sys/dev/usb/umct.c +++ b/sys/dev/usb/umct.c @@ -46,7 +46,7 @@ __FBSDID("$FreeBSD$"); #include <sys/module.h> #include <sys/bus.h> #include <sys/tty.h> -#include <sys/interrupt.h> +#include <sys/taskqueue.h> #include <dev/usb/usb.h> #include <dev/usb/usbdi.h> @@ -82,7 +82,7 @@ struct umct_softc { uint8_t sc_msr; uint8_t sc_lcr; uint8_t sc_mcr; - void *sc_swicookie; + struct task sc_task; }; Static void umct_intr(usbd_xfer_handle, usbd_private_handle, usbd_status); @@ -91,7 +91,7 @@ Static void umct_set(void *, int, int, int); Static int umct_param(void *, int, struct termios *); Static int umct_open(void *, int); Static void umct_close(void *, int); -Static void umct_notify(void *); +Static void umct_notify(void *, int count); Static struct ucom_callback umct_callback = { umct_get_status, /* ucom_get_status */ @@ -138,8 +138,6 @@ MODULE_DEPEND(umct, usb, 1, 1, 1); MODULE_DEPEND(umct, ucom, UCOM_MINVER, UCOM_PREFVER, UCOM_MAXVER); MODULE_VERSION(umct, 1); -Static struct ithd *umct_ithd; - USB_MATCH(umct) { USB_MATCH_START(umct, uaa); @@ -275,8 +273,7 @@ USB_ATTACH(umct) ucom->sc_opkthdrlen = 0; ucom->sc_callback = &umct_callback; ucom_attach(ucom); - swi_add(&umct_ithd, "ucom", umct_notify, sc, SWI_TTY, 0, - &sc->sc_swicookie); + TASK_INIT(&sc->sc_task, 0, umct_notify, sc); free(devinfo, M_USBDEV); USB_ATTACH_SUCCESS_RETURN; @@ -299,7 +296,9 @@ USB_DETACH(umct) } sc->sc_ucom.sc_dying = 1; - ithread_remove_handler(sc->sc_swicookie); +#if 0 + taskqueue_drain(taskqueue_swi_giant); +#endif rv = ucom_detach(&sc->sc_ucom); return (rv); } @@ -351,11 +350,11 @@ umct_intr(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status) * Defer notifying the ucom layer as it doesn't like to be bothered * from an interrupt context. */ - swi_sched(sc->sc_swicookie, 0); + taskqueue_enqueue(taskqueue_swi_giant, &sc->sc_task); } Static void -umct_notify(void *arg) +umct_notify(void *arg, int count) { struct umct_softc *sc; |