diff options
| author | Nick Hibma <n_hibma@FreeBSD.org> | 1999-10-03 20:23:25 +0000 |
|---|---|---|
| committer | Nick Hibma <n_hibma@FreeBSD.org> | 1999-10-03 20:23:25 +0000 |
| commit | aa9b0faecb44aeaf541a848cfe3bc8777d41c8e9 (patch) | |
| tree | aa8a8bc7431e270b3707419867b735067beba1e9 /sys/dev/usb | |
| parent | bf3367d09131ea9a66d7e8301407e77e59078829 (diff) | |
Notes
Diffstat (limited to 'sys/dev/usb')
| -rw-r--r-- | sys/dev/usb/ohci_pci.c | 10 | ||||
| -rw-r--r-- | sys/dev/usb/uhci_pci.c | 17 |
2 files changed, 23 insertions, 4 deletions
diff --git a/sys/dev/usb/ohci_pci.c b/sys/dev/usb/ohci_pci.c index 28dff3e8269b..6c90da4c25fc 100644 --- a/sys/dev/usb/ohci_pci.c +++ b/sys/dev/usb/ohci_pci.c @@ -56,7 +56,6 @@ #include <sys/kernel.h> #include <sys/module.h> #include <sys/bus.h> -#include <sys/device.h> #include <sys/proc.h> #include <sys/queue.h> #include <machine/bus.h> @@ -145,6 +144,7 @@ ohci_pci_attach(device_t self) int rid; struct resource *res; void *ih; + int intr; rid = PCI_CBMEM; res = bus_alloc_resource(self, SYS_RES_MEMORY, &rid, @@ -200,6 +200,14 @@ ohci_pci_attach(device_t self) sprintf(sc->sc_vendor, "(unknown)"); } + intr = pci_read_config(self, PCIR_INTLINE, 1); + if (intr == 0 || intr == 255) { + device_printf(self, "Invalid irq %d\n", intr); + device_printf(self, "Please switch on USB support and switch PNP-OS to 'No' in BIOS\n"); + device_delete_child(self, usbus); + return ENXIO; + } + err = BUS_SETUP_INTR(parent, self, res, INTR_TYPE_BIO, (driver_intr_t *) ohci_intr, sc, &ih); if (err) { diff --git a/sys/dev/usb/uhci_pci.c b/sys/dev/usb/uhci_pci.c index 83bca9b79ab0..1f40ebe7b4e3 100644 --- a/sys/dev/usb/uhci_pci.c +++ b/sys/dev/usb/uhci_pci.c @@ -54,7 +54,6 @@ #include <sys/kernel.h> #include <sys/module.h> #include <sys/bus.h> -#include <sys/device.h> #include <sys/proc.h> #include <sys/queue.h> #if defined(__FreeBSD__) @@ -158,6 +157,7 @@ uhci_pci_attach(device_t self) struct resource *res; device_t usbus; char *typestr; + int intr; int legsup; int err; @@ -225,6 +225,14 @@ uhci_pci_attach(device_t self) typestr, pci_get_revid(self)); } + intr = pci_read_config(self, PCIR_INTLINE, 1); + if (intr == 0 || intr == 255) { + device_printf(self, "Invalid irq %d\n", intr); + device_printf(self, "Please switch on USB support and switch PNP-OS to 'No' in BIOS\n"); + device_delete_child(self, usbus); + return ENXIO; + } + err = BUS_SETUP_INTR(parent, self, res, INTR_TYPE_BIO, (driver_intr_t *) uhci_intr, sc, &ih); if (err) { @@ -233,6 +241,7 @@ uhci_pci_attach(device_t self) return err; } + /* Verify that the PIRQD enable bit is set, some BIOS's don't do that */ legsup = pci_read_config(self, PCI_LEGSUP, 4); if ( !(legsup & PCI_LEGSUP_USBPIRQDEN) ) { #ifndef USB_DEBUG @@ -248,11 +257,13 @@ uhci_pci_attach(device_t self) if (!err) err = device_probe_and_attach(sc->sc_bus.bdev); - + if (err) { device_printf(self, "init failed\n"); - /* disable interrupts */ + /* disable interrupts that might have been switched on + * in uhci_init + */ bus_space_write_2(sc->iot, sc->ioh, UHCI_INTR, 0); err = BUS_TEARDOWN_INTR(parent, self, res, ih); |
