On Fri, Nov 26, 2010 at 01:39:24PM +0100, MERIGHI Marcus wrote: > Hello Jacob, > > [email protected] (Jacob Meuser), 2010.11.25 (Thu) 20:29 (CET):
> > hub interrupts is, well, sloppy. we totally ignore the status bit > > field, which tells us which port had a status change, or whether the > > hub had a status change. uhub_explore() only deals with port status > > changes, so we only need to run it when there is a port status > > change. uhub_explore() should also use the status bit field to know > > what ports need to be checked, instead of checking every port, but > > I'll leave that for later. > > > > I'm also interested if you see the following kernel messages when > > running with this diff: > > > > uhub_intr: no change > > uhub_intr: hub changed but not ports > > not yet. You mean on unplugging the pcmcia uhub, don't you? yes. well, at any time actually. > below output of the session, see "# unplug pcmcia uhub". > # unplug pcmcia uhub > uhci3: host system error > uhci3: host controller process error > uhci3: host controller halted > uhci4: host system error > uhci4: host controller process error > uhci4: host controller halted > ehci0: unrecoverable error, controller halted > ehci0: blocking intrs 0x10 > uhub3 detached > usb3 detached > uhci3 detached > uhub4 detached > usb4 detached > uhci4 detached > uhub5 detached > uvm_fault(0xd09f8080, 0xeffff000, 0, 1) -> d > kernel: page fault trap, code=0 > Stopped at usbd_do_request_flags_pipe+0x18: movl > 0x258(%eax),%ec > x > ddb> trace > usbd_do_request_flags_pipe(d1f34c80,efff0062,dc16aef8,0,0) at > usbd_do_request_f > lags_pipe+0x18 > usbd_do_request_flags(d1f34c80,dc16aef8,0,0,0) at usbd_do_request_flags+0x3c > usbd_do_request(d1f34c80,dc16aef8,0,d079adad,d0a0f200) at usbd_do_request+0x37 > usbd_reset_port(d1f34c80,1,d1f34100,d03e20f7,40) at usbd_reset_port+0x42 > uhub_explore(d1f34c80,d1f3484c,dc16af8c,d0797b46,d1f34800) at > uhub_explore+0x16 > f > usb_explore(d1f34800,20,d097eaf6,0,d6d7f768) at usb_explore+0x3f > usb_task_thread(d6d7f768) at usb_task_thread+0x76 hmm. well, uhci doesn't stop hub interrupts before it detaches. can you try the following? -- [email protected] SDF Public Access UNIX System - http://sdf.lonestar.org Index: uhci.c =================================================================== RCS file: /cvs/src/sys/dev/usb/uhci.c,v retrieving revision 1.86 diff -u -p uhci.c --- uhci.c 21 Nov 2010 01:29:07 -0000 1.86 +++ uhci.c 26 Nov 2010 17:21:11 -0000 @@ -608,6 +608,11 @@ uhci_detach(struct uhci_softc *sc, int flags) if (sc->sc_shutdownhook != NULL) shutdownhook_disestablish(sc->sc_shutdownhook); + if (sc->sc_intr_xfer != NULL) { + timeout_del(&sc->sc_poll_handle); + sc->sc_intr_xfer = NULL; + } + /* Free all xfers associated with this HC. */ for (;;) { xfer = SIMPLEQ_FIRST(&sc->sc_free_xfers); @@ -923,6 +928,9 @@ uhci_poll_hub(void *addr) u_char *p; DPRINTFN(20, ("uhci_poll_hub\n")); + + if (sc->sc_dying) + return; timeout_del(&sc->sc_poll_handle); timeout_set(&sc->sc_poll_handle, uhci_poll_hub, xfer);
