c0cdcd0b3e
- In uhci_intr() check to see if sc->sc_bus.bdev is NULL, and if it is, ack any pending interrupts and disable them, then return. It is possible for interrupts to be delivered the moment a handler is set up at attach time in uhci_pci.c, particularly when attempting to kldload the usb.ko module after the system is already up. However the driver isn't ready to field interrupts at that time and certain pointers in the softc struct aren't initialized yet, and we invariably end up falling off the end of one of them. The effect is that kldloading the usb module will panic the system in uhci_intr(). This added sanity check stops this from happening: I can now kldload the usb.ko module without any problems and load/attach other USB drivers after it. Of course the uhci driver has no detach method, but that's another problem. - In uhci_run(), set the UHCI_CMD_MAXP bit in the command register to allow 64-byte packets to be used for full speed bandwidth reclamation. Certain high speed devices (in this case the ADMtek USB ethernet adapter) require this bit to be set, otherwise babble errors occur at the end of large (between 1100 and 1500 byte) transfers. This should not affect other devices, although supposedly it is less efficient than the 32-byte setting. Unfortunately, this is a per-bus setting, not a per-device setting, so we can't just enable it for certain devices on the USB bus. |
||
---|---|---|
.. | ||
devlist2h.awk | ||
FILES | ||
hid.c | ||
hid.h | ||
Makefile.usbdevs | ||
ohci_pci.c | ||
ohci.c | ||
ohcireg.h | ||
ohcivar.h | ||
ugen.c | ||
uhci_pci.c | ||
uhci.c | ||
uhcireg.h | ||
uhcivar.h | ||
uhid.c | ||
uhub.c | ||
ukbd.c | ||
ulpt.c | ||
umass.c | ||
umodem.c | ||
ums.c | ||
usb_if.m | ||
usb_mem.h | ||
usb_port.h | ||
usb_quirks.c | ||
usb_quirks.h | ||
usb_subr.c | ||
usb.c | ||
usb.h | ||
usbcdc.h | ||
usbdevs | ||
usbdevs_data.h | ||
usbdevs.h | ||
usbdi_util.c | ||
usbdi_util.h | ||
usbdi.c | ||
usbdi.h | ||
usbdivar.h | ||
usbhid.h |