diff -ru2 ../sys/dev/usb/usb.c ./dev/usb/usb.c --- ../sys/dev/usb/usb.c Tue May 1 06:41:37 2001 +++ ./dev/usb/usb.c Wed Jun 6 14:06:21 2001 @@ -51,8 +51,9 @@ #include #include +#include #if defined(__NetBSD__) || defined(__OpenBSD__) #include -#include #elif defined(__FreeBSD__) +#include #include #include @@ -117,10 +118,5 @@ struct usbd_port sc_port; /* dummy port for root hub */ -#if defined(__FreeBSD__) - /* This part should be deleted when kthreads is available */ - struct selinfo sc_consel; /* waiting for connect change */ -#else struct proc *sc_event_thread; -#endif char sc_dying; @@ -154,16 +150,14 @@ Static usbd_status usb_discover(struct usb_softc *); -#if defined(__NetBSD__) || defined(__OpenBSD__) Static void usb_create_event_thread(void *); Static void usb_event_thread(void *); -#endif #define USB_MAX_EVENTS 50 struct usb_event_q { struct usb_event ue; - SIMPLEQ_ENTRY(usb_event_q) next; + TAILQ_ENTRY(usb_event_q) next; }; -Static SIMPLEQ_HEAD(, usb_event_q) usb_events = - SIMPLEQ_HEAD_INITIALIZER(usb_events); +Static TAILQ_HEAD(, usb_event_q) usb_events = + TAILQ_HEAD_INITIALIZER(usb_events); Static int usb_nevents = 0; Static struct selinfo usb_selevent; @@ -258,8 +252,12 @@ } +#if defined(__NetBSD__) || defined(__OpenBSD__) kthread_create(usb_create_event_thread, sc); +#endif #if defined(__FreeBSD__) + usb_create_event_thread(sc); /* The per controller devices (used for usb_discover) */ + /* XXX This is redundant now, but old usbd's will want it */ make_dev(&usb_cdevsw, device_get_unit(self), UID_ROOT, GID_OPERATOR, 0660, "usb%d", device_get_unit(self)); @@ -275,5 +273,4 @@ } -#if defined(__NetBSD__) || defined(__OpenBSD__) void usb_create_event_thread(arg) @@ -283,7 +280,7 @@ if (kthread_create1(usb_event_thread, sc, &sc->sc_event_thread, - "%s", sc->sc_dev.dv_xname)) { + "%s", USBDEVNAME(sc->sc_dev))) { printf("%s: unable to create event thread for\n", - sc->sc_dev.dv_xname); + USBDEVNAME(sc->sc_dev)); panic("usb_create_event_thread"); } @@ -295,4 +292,7 @@ { struct usb_softc *sc = arg; + int to; + + mtx_lock(&Giant); DPRINTF(("usb_event_thread: start\n")); @@ -303,10 +303,10 @@ #endif usb_discover(sc); - (void)tsleep(&sc->sc_bus->needs_explore, PWAIT, "usbevt", + to = hz * 60; #ifdef USB_DEBUG - usb_noexplore ? 0 : + if (usb_noexplore) + to = 0; #endif - hz*60 - ); + (void)tsleep(&sc->sc_bus->needs_explore, PWAIT, "usbevt", to); DPRINTFN(2,("usb_event_thread: woke up\n")); } @@ -320,4 +320,5 @@ } +#if defined(__NetBSD__) || defined(__OpenBSD__) int usbctlprint(aux, pnp) @@ -447,7 +448,6 @@ switch (cmd) { #if defined(__FreeBSD__) - /* This part should be deleted when kthreads is available */ + /* This part should be deleted */ case USB_DISCOVER: - usb_discover(sc); break; #endif @@ -568,20 +568,5 @@ } else { #if defined(__FreeBSD__) - /* This part should be deleted when kthreads is available */ - struct usb_softc *sc; - - USB_GET_SC(usb, unit, sc); - - revents = 0; - mask = POLLOUT | POLLRDNORM; - - s = splusb(); - if ((events & mask) && sc->sc_bus->needs_explore) - revents |= events & mask; - if (revents == 0 && (events & mask)) - selrecord(p, &sc->sc_consel); - splx(s); - - return (revents); + return (0); /* select/poll never wakes up - back compat */ #else return (ENXIO); @@ -596,5 +581,5 @@ { #if defined(__FreeBSD__) - /* The splxxx parts should be deleted when kthreads is available */ + /* splxxx should be changed to mutexes for preemption safety some day */ int s; #endif @@ -630,8 +615,4 @@ { bus->needs_explore = 1; -#if defined(__FreeBSD__) - /* This part should be deleted when kthreads is available */ - selwakeup(&bus->usbctl->sc_consel); -#endif wakeup(&bus->needs_explore); } @@ -646,7 +627,12 @@ if (usb_nevents <= 0) return (0); - ueq = SIMPLEQ_FIRST(&usb_events); + ueq = TAILQ_FIRST(&usb_events); + if (ueq == NULL) { + printf("usb: usb_nevents got out of sync! %d\n", usb_nevents); + usb_nevents = 0; + return (0); + } *ue = ueq->ue; - SIMPLEQ_REMOVE_HEAD(&usb_events, ueq, next); + TAILQ_REMOVE(&usb_events, ueq, next); free(ueq, M_USBDEV); usb_nevents--; @@ -659,5 +645,5 @@ usbd_device_handle dev; { - struct usb_event_q *ueq; + struct usb_event_q *ueq, *ueq_next; struct usb_event ue; struct timeval thetime; @@ -665,5 +651,16 @@ s = splusb(); - if (++usb_nevents >= USB_MAX_EVENTS) { + if (type == USB_EVENT_DETACH) { + for (ueq = TAILQ_FIRST(&usb_events); ueq; ueq = ueq_next) { + ueq_next = TAILQ_NEXT(ueq, next); + if (ueq->ue.ue_cookie.cookie == dev->cookie.cookie) { + TAILQ_REMOVE(&usb_events, ueq, next); + free(ueq, M_USBDEV); + usb_nevents--; + ueq_next = TAILQ_FIRST(&usb_events); + } + } + } + if (usb_nevents >= USB_MAX_EVENTS) { /* Too many queued events, drop an old one. */ DPRINTF(("usb: event dropped\n")); @@ -682,5 +679,6 @@ microtime(&thetime); TIMEVAL_TO_TIMESPEC(&thetime, &ueq->ue.ue_time); - SIMPLEQ_INSERT_TAIL(&usb_events, ueq, next); + TAILQ_INSERT_TAIL(&usb_events, ueq, next); + usb_nevents++; wakeup(&usb_events); selwakeup(&usb_selevent); diff -ru2 ../sys/dev/usb/usb_port.h ./dev/usb/usb_port.h --- ../sys/dev/usb/usb_port.h Fri Jan 19 22:15:38 2001 +++ ./dev/usb/usb_port.h Wed Jun 6 14:05:17 2001 @@ -291,7 +291,6 @@ #define memset(d, v, l) bzero((d),(l)) #define bswap32(x) swap32(x) -#define kthread_create1(function, sc, priv, string, name) -#define kthread_create(create_function, sc) -#define kthread_exit(err) +#define kthread_create1(t, s, p, a0, a1) \ + kthread_create((t), (s), (p), RFHIGHPID, (a0), (a1)) #define usb_timeout(f, d, t, h) ((h) = timeout((f), (d), (t)))