summaryrefslogtreecommitdiff
path: root/sys/dev/usb
diff options
context:
space:
mode:
authorPeter Wemm <peter@FreeBSD.org>1999-04-16 21:22:55 +0000
committerPeter Wemm <peter@FreeBSD.org>1999-04-16 21:22:55 +0000
commit6182fdbda82d66e069d86382987606cbba1972b1 (patch)
tree8b86f578632961e1cd2aed57a2be13d993257d35 /sys/dev/usb
parent24c38be4da1f835f2125da7d5fa3632bc028131d (diff)
Notes
Diffstat (limited to 'sys/dev/usb')
-rw-r--r--sys/dev/usb/ohci.c10
-rw-r--r--sys/dev/usb/ohci_pci.c154
-rw-r--r--sys/dev/usb/ohcivar.h3
-rw-r--r--sys/dev/usb/ucom.c7
-rw-r--r--sys/dev/usb/ugen.c7
-rw-r--r--sys/dev/usb/uhci.c13
-rw-r--r--sys/dev/usb/uhci_pci.c166
-rw-r--r--sys/dev/usb/uhcivar.h3
-rw-r--r--sys/dev/usb/uhid.c7
-rw-r--r--sys/dev/usb/uhub.c24
-rw-r--r--sys/dev/usb/ulpt.c7
-rw-r--r--sys/dev/usb/umodem.c7
-rw-r--r--sys/dev/usb/ums.c6
-rw-r--r--sys/dev/usb/usb.c3
-rw-r--r--sys/dev/usb/usb_if.m9
-rw-r--r--sys/dev/usb/usb_port.h2
-rw-r--r--sys/dev/usb/usbdi.c25
-rw-r--r--sys/dev/usb/usbdi.h1
18 files changed, 236 insertions, 218 deletions
diff --git a/sys/dev/usb/ohci.c b/sys/dev/usb/ohci.c
index 334a998aa277..b97fee07909e 100644
--- a/sys/dev/usb/ohci.c
+++ b/sys/dev/usb/ohci.c
@@ -59,6 +59,10 @@
#include <sys/queue.h>
#include <sys/select.h>
+#ifdef __FreeBSD__
+#include <machine/bus_pio.h>
+#include <machine/bus_memio.h>
+#endif
#include <machine/bus.h>
#include <machine/endian.h>
@@ -162,15 +166,9 @@ void ohci_dump_td __P((ohci_soft_td_t *));
void ohci_dump_ed __P((ohci_soft_ed_t *));
#endif
-#if defined(__NetBSD__)
#define OWRITE4(sc, r, x) bus_space_write_4((sc)->iot, (sc)->ioh, (r), (x))
#define OREAD4(sc, r) bus_space_read_4((sc)->iot, (sc)->ioh, (r))
#define OREAD2(sc, r) bus_space_read_2((sc)->iot, (sc)->ioh, (r))
-#elif defined(__FreeBSD__)
-#define OWRITE4(sc, r, x) *(u_int32_t *) ((sc)->sc_iobase + (r)) = x
-#define OREAD4(sc, r) (*(u_int32_t *) ((sc)->sc_iobase + (r)))
-#define OREAD2(sc, r) (*(u_int16_t *) ((sc)->sc_iobase + (r)))
-#endif
/* Reverse the bits in a value 0 .. 31 */
static u_int8_t revbits[OHCI_NO_INTRS] =
diff --git a/sys/dev/usb/ohci_pci.c b/sys/dev/usb/ohci_pci.c
index 3c20ff723e05..1aea5f1db15d 100644
--- a/sys/dev/usb/ohci_pci.c
+++ b/sys/dev/usb/ohci_pci.c
@@ -44,6 +44,8 @@
* USB spec: http://www.teleport.com/cgi-bin/mailmerge.cgi/~usb/cgiform.tpl
*/
+#include "opt_bus.h"
+
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
@@ -52,23 +54,13 @@
#include <sys/device.h>
#include <sys/proc.h>
#include <sys/queue.h>
+#include <machine/bus.h>
+#include <sys/rman.h>
+#include <machine/resource.h>
#include <pci/pcivar.h>
#include <pci/pcireg.h>
-#define PCI_CLASS_SERIALBUS 0x0c000000
-#define PCI_SUBCLASS_COMMUNICATIONS_SERIAL 0x00000000
-#define PCI_SUBCLASS_SERIALBUS_FIREWIRE 0x00000000
-#define PCI_SUBCLASS_SERIALBUS_ACCESS 0x00010000
-#define PCI_SUBCLASS_SERIALBUS_SSA 0x00020000
-#define PCI_SUBCLASS_SERIALBUS_USB 0x00030000
-#define PCI_SUBCLASS_SERIALBUS_FIBER 0x00040000
-
-#define PCI_INTERFACE(d) (((d) >> 8) & 0xff)
-#define PCI_SUBCLASS(d) ((d) & PCI_SUBCLASS_MASK)
-#define PCI_CLASS(d) ((d) & PCI_CLASS_MASK)
-
-
#include <dev/usb/usb.h>
#include <dev/usb/usbdi.h>
#include <dev/usb/usbdivar.h>
@@ -77,7 +69,6 @@
#include <dev/usb/ohcireg.h>
#include <dev/usb/ohcivar.h>
-
#define PCI_OHCI_VENDORID_ALI 0x10b9
#define PCI_OHCI_VENDORID_CMDTECH 0x1095
#define PCI_OHCI_VENDORID_COMPAQ 0x0e11
@@ -98,27 +89,12 @@ static const char *ohci_device_usb0673 = "CMD Tech 673 (USB0673) USB Host Contr
static const char *ohci_device_generic = "OHCI (generic) USB Host Controller";
-
-static const char *ohci_pci_probe __P((pcici_t, pcidi_t));
-static void ohci_pci_attach __P((pcici_t, int));
-
-static u_long ohci_count = 0;
-
-static struct pci_device ohci_pci_device = {
- "ohci",
- ohci_pci_probe,
- ohci_pci_attach,
- &ohci_count,
- NULL
-};
-
-DATA_SET(pcidevice_set, ohci_pci_device);
-
+#define PCI_OHCI_BASE_REG 0x10
static const char *
-ohci_pci_probe(pcici_t config_id, pcidi_t device_id)
+ohci_pci_match(device_t dev)
{
- u_int32_t class;
+ u_int32_t device_id = pci_get_devid(dev);
switch(device_id) {
case PCI_OHCI_DEVICEID_ALADDIN_V:
@@ -132,54 +108,72 @@ ohci_pci_probe(pcici_t config_id, pcidi_t device_id)
case PCI_OHCI_DEVICEID_NEC:
return (ohci_device_nec);
default:
- class = pci_conf_read(config_id, PCI_CLASS_REG);
- if ( (PCI_CLASS(class) == PCI_CLASS_SERIALBUS)
- && (PCI_SUBCLASS(class) == PCI_SUBCLASS_SERIALBUS_USB)
- && (PCI_INTERFACE(class) == PCI_INTERFACE_OHCI)) {
- return(ohci_device_generic);
+ if ( pci_get_class(dev) == PCIC_SERIALBUS
+ && pci_get_subclass(dev) == PCIS_SERIALBUS_USB
+ && pci_get_progif(dev) == PCI_INTERFACE_OHCI) {
+ return (ohci_device_generic);
}
}
return NULL; /* dunno */
}
-static void
-ohci_pci_attach(pcici_t config_id, int unit)
+static int
+ohci_pci_probe(device_t dev)
{
- vm_offset_t pbase;
+ const char *desc = ohci_pci_match(dev);
+ if (desc) {
+ device_set_desc(dev, desc);
+ return 0;
+ } else {
+ return ENXIO;
+ }
+}
+
+static int
+ohci_pci_attach(device_t dev)
+{
+ int unit = device_get_unit(dev);
+ ohci_softc_t *sc = device_get_softc(dev);
device_t usbus;
- ohci_softc_t *sc;
usbd_status err;
- int id;
+ int rid;
+ struct resource *res;
+ void *ih;
+ int error;
+
+ rid = PCI_CBMEM;
+ res = bus_alloc_resource(dev, SYS_RES_MEMORY, &rid,
+ 0, ~0, 1, RF_ACTIVE);
+ if (!res) {
+ device_printf(dev, "could not map memory\n");
+ return ENXIO;
+ }
- sc = malloc(sizeof(ohci_softc_t), M_DEVBUF, M_NOWAIT);
- /* Do not free it below, intr might use the sc */
- if ( sc == NULL ) {
- printf("ohci%d: could not allocate memory", unit);
- return;
- }
- memset(sc, 0, sizeof(ohci_softc_t));
+ sc->iot = rman_get_bustag(res);
+ sc->ioh = rman_get_bushandle(res);
- if(!pci_map_mem(config_id, PCI_CBMEM,
- (vm_offset_t *)&sc->sc_iobase, &pbase)) {
- printf("ohci%d: could not map memory\n", unit);
- return;
- }
+ rid = 0;
+ res = bus_alloc_resource(dev, SYS_RES_IRQ, &rid, 0, ~0, 1,
+ RF_SHAREABLE | RF_ACTIVE);
+ if (res == NULL) {
+ device_printf(dev, "could not allocate irq\n");
+ return ENOMEM;
+ }
- if ( !pci_map_int(config_id, (pci_inthand_t *)ohci_intr,
- (void *) sc, &bio_imask)) {
- printf("ohci%d: could not map irq\n", unit);
- return;
+ error = bus_setup_intr(dev, res, (driver_intr_t *) ohci_intr, sc, &ih);
+ if (error) {
+ device_printf(dev, "could not setup irq\n");
+ return error;
}
- usbus = device_add_child(root_bus, "usb", -1, sc);
+ usbus = device_add_child(dev, "usb", -1, sc);
if (!usbus) {
- printf("ohci%d: could not add USB device to root bus\n", unit);
- return;
+ printf("ohci%d: could not add USB device\n", unit);
+ return ENOMEM;
}
- id = pci_conf_read(config_id, PCI_ID_REG);
- switch(id) {
+ switch (pci_get_devid(dev)) {
case PCI_OHCI_DEVICEID_ALADDIN_V:
device_set_desc(usbus, ohci_device_aladdin_v);
sprintf(sc->sc_vendor, "AcerLabs");
@@ -202,7 +196,7 @@ ohci_pci_attach(pcici_t config_id, int unit)
break;
default:
if (bootverbose)
- printf("(New OHCI DeviceId=0x%08x)\n", id);
+ printf("(New OHCI DeviceId=0x%08x)\n", pci_get_devid(dev));
device_set_desc(usbus, ohci_device_generic);
sprintf(sc->sc_vendor, "(unknown)");
}
@@ -211,8 +205,36 @@ ohci_pci_attach(pcici_t config_id, int unit)
err = ohci_init(sc);
if (err != USBD_NORMAL_COMPLETION) {
printf("ohci%d: init failed, error=%d\n", unit, err);
- device_delete_child(root_bus, usbus);
+ device_delete_child(dev, usbus);
}
- return;
+ return device_probe_and_attach(sc->sc_bus.bdev);
}
+
+static device_method_t ohci_methods[] = {
+ /* Device interface */
+ DEVMETHOD(device_probe, ohci_pci_probe),
+ DEVMETHOD(device_attach, ohci_pci_attach),
+
+ /* Bus interface */
+ DEVMETHOD(bus_print_child, bus_generic_print_child),
+ DEVMETHOD(bus_alloc_resource, bus_generic_alloc_resource),
+ DEVMETHOD(bus_release_resource, bus_generic_release_resource),
+ DEVMETHOD(bus_activate_resource, bus_generic_activate_resource),
+ DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource),
+ DEVMETHOD(bus_setup_intr, bus_generic_setup_intr),
+ DEVMETHOD(bus_teardown_intr, bus_generic_teardown_intr),
+
+ { 0, 0 }
+};
+
+static driver_t ohci_driver = {
+ "ohci",
+ ohci_methods,
+ DRIVER_TYPE_BIO,
+ sizeof(ohci_softc_t),
+};
+
+static devclass_t ohci_devclass;
+
+DRIVER_MODULE(ohci, pci, ohci_driver, ohci_devclass, 0, 0);
diff --git a/sys/dev/usb/ohcivar.h b/sys/dev/usb/ohcivar.h
index 90630734648a..b485f50eabe9 100644
--- a/sys/dev/usb/ohcivar.h
+++ b/sys/dev/usb/ohcivar.h
@@ -72,7 +72,8 @@ typedef struct ohci_softc {
/* XXX should keep track of all DMA memory */
#elif defined(__FreeBSD__)
- int sc_iobase;
+ bus_space_tag_t iot;
+ bus_space_handle_t ioh;
#endif /* __FreeBSD__ */
usb_dma_t sc_hccadma;
diff --git a/sys/dev/usb/ucom.c b/sys/dev/usb/ucom.c
index 07cc3f9b0554..00bb152fe932 100644
--- a/sys/dev/usb/ucom.c
+++ b/sys/dev/usb/ucom.c
@@ -126,13 +126,8 @@ USB_ATTACH(ucom)
static int
ucom_detach(device_t self)
{
- const char *devinfo = device_get_desc(self);
-
DPRINTF(("%s: disconnected\n", USBDEVNAME(self)));
- if (devinfo) {
- device_set_desc(self, NULL);
- free((void *)devinfo, M_USB);
- }
+ device_set_desc(self, NULL);
return 0;
}
#endif
diff --git a/sys/dev/usb/ugen.c b/sys/dev/usb/ugen.c
index cbd9e1ea71e7..cc14a7df0180 100644
--- a/sys/dev/usb/ugen.c
+++ b/sys/dev/usb/ugen.c
@@ -992,13 +992,8 @@ ugenpoll(dev, events, p)
static int
ugen_detach(device_t self)
{
- const char *devinfo = device_get_desc(self);
-
DPRINTF(("%s: disconnected\n", USBDEVNAME(self)));
- if (devinfo) {
- device_set_desc(self, NULL);
- free((void *)devinfo, M_USB);
- }
+ device_set_desc(self, NULL);
return 0;
}
diff --git a/sys/dev/usb/uhci.c b/sys/dev/usb/uhci.c
index 30c69fd3341c..62cb1068db11 100644
--- a/sys/dev/usb/uhci.c
+++ b/sys/dev/usb/uhci.c
@@ -63,6 +63,9 @@ cgiform.tpl
#include <sys/queue.h>
#include <sys/select.h>
+#if defined(__FreeBSD__)
+#include <machine/bus_pio.h>
+#endif
#include <machine/bus.h>
#include <dev/usb/usb.h>
@@ -225,11 +228,11 @@ void uhci_dump_td __P((uhci_soft_td_t *));
#define UREAD2(sc, r) bus_space_read_2((sc)->iot, (sc)->ioh, (r))
#define UREAD4(sc, r) bus_space_read_4((sc)->iot, (sc)->ioh, (r))
#elif defined(__FreeBSD__)
-#define UWRITE2(sc,r,x) outw((sc)->sc_iobase + (r), (x))
-#define UWRITE4(sc,r,x) outl((sc)->sc_iobase + (r), (x))
-#define UREAD1(sc,r) inb((sc)->sc_iobase + (r))
-#define UREAD2(sc,r) inw((sc)->sc_iobase + (r))
-#define UREAD4(sc,r) inl((sc)->sc_iobase + (r))
+#define UWRITE2(sc, r, x) bus_space_write_2((sc)->iot, (sc)->ioh, (r), (x))
+#define UWRITE4(sc, r, x) bus_space_write_4((sc)->iot, (sc)->ioh, (r), (x))
+#define UREAD1(sc, r) bus_space_read_1((sc)->iot, (sc)->ioh, (r))
+#define UREAD2(sc, r) bus_space_read_2((sc)->iot, (sc)->ioh, (r))
+#define UREAD4(sc, r) bus_space_read_4((sc)->iot, (sc)->ioh, (r))
#endif
#define UHCICMD(sc, cmd) UWRITE2(sc, UHCI_CMD, cmd)
diff --git a/sys/dev/usb/uhci_pci.c b/sys/dev/usb/uhci_pci.c
index 6ed3cee0381f..4bddf8b32786 100644
--- a/sys/dev/usb/uhci_pci.c
+++ b/sys/dev/usb/uhci_pci.c
@@ -1,4 +1,4 @@
-/* FreeBSD $Id: uhci_pci.c,v 1.4 1999/04/06 23:09:58 n_hibma Exp $ */
+/* FreeBSD $Id: uhci_pci.c,v 1.5 1999/04/11 14:24:20 n_hibma Exp $ */
/*
* Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -37,6 +37,8 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
+#include "opt_bus.h"
+
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
@@ -45,23 +47,13 @@
#include <sys/device.h>
#include <sys/proc.h>
#include <sys/queue.h>
+#include <machine/bus.h>
+#include <sys/rman.h>
+#include <machine/resource.h>
#include <pci/pcivar.h>
#include <pci/pcireg.h>
-#define PCI_CLASS_SERIALBUS 0x0c000000
-#define PCI_SUBCLASS_COMMUNICATIONS_SERIAL 0x00000000
-#define PCI_SUBCLASS_SERIALBUS_FIREWIRE 0x00000000
-#define PCI_SUBCLASS_SERIALBUS_ACCESS 0x00010000
-#define PCI_SUBCLASS_SERIALBUS_SSA 0x00020000
-#define PCI_SUBCLASS_SERIALBUS_USB 0x00030000
-#define PCI_SUBCLASS_SERIALBUS_FIBER 0x00040000
-
-#define PCI_INTERFACE(d) (((d)>>8)&0xff)
-#define PCI_SUBCLASS(d) ((d)&PCI_SUBCLASS_MASK)
-#define PCI_CLASS(d) ((d)&PCI_CLASS_MASK)
-
-
#include <dev/usb/usb.h>
#include <dev/usb/usbdi.h>
#include <dev/usb/usbdivar.h>
@@ -70,7 +62,6 @@
#include <dev/usb/uhcireg.h>
#include <dev/usb/uhcivar.h>
-
#define PCI_UHCI_VENDORID_INTEL 0x8086
#define PCI_UHCI_VENDORID_VIA 0x1106
@@ -85,26 +76,10 @@ static const char *uhci_device_generic = "UHCI (generic) USB Controller";
#define PCI_UHCI_BASE_REG 0x20
-static const char *uhci_pci_probe __P((pcici_t, pcidi_t));
-static void uhci_pci_attach __P((pcici_t, int));
-
-static u_long uhci_count = 0;
-
-static struct pci_device uhci_pci_device = {
- "uhci",
- uhci_pci_probe,
- uhci_pci_attach,
- &uhci_count,
- NULL
-};
-
-DATA_SET(pcidevice_set, uhci_pci_device);
-
-
static const char *
-uhci_pci_probe(pcici_t config_id, pcidi_t device_id)
+uhci_pci_match(device_t dev)
{
- u_int32_t class;
+ u_int32_t device_id = pci_get_devid(dev);
if (device_id == PCI_UHCI_DEVICEID_PIIX3) {
return (uhci_device_piix3);
@@ -113,10 +88,9 @@ uhci_pci_probe(pcici_t config_id, pcidi_t device_id)
} else if (device_id == PCI_UHCI_DEVICEID_VT83C572) {
return (uhci_device_vt83c572);
} else {
- class = pci_conf_read(config_id, PCI_CLASS_REG);
- if ( PCI_CLASS(class) == PCI_CLASS_SERIALBUS
- && PCI_SUBCLASS(class) == PCI_SUBCLASS_SERIALBUS_USB
- && PCI_INTERFACE(class) == PCI_INTERFACE_UHCI) {
+ if ( pci_get_class(dev) == PCIC_SERIALBUS
+ && pci_get_subclass(dev) == PCIS_SERIALBUS_USB
+ && pci_get_progif(dev) == PCI_INTERFACE_UHCI) {
return (uhci_device_generic);
}
}
@@ -124,42 +98,64 @@ uhci_pci_probe(pcici_t config_id, pcidi_t device_id)
return NULL; /* dunno... */
}
-static void
-uhci_pci_attach(pcici_t config_id, int unit)
+static int
+uhci_pci_probe(device_t dev)
+{
+ const char *desc = uhci_pci_match(dev);
+ if (desc) {
+ device_set_desc(dev, desc);
+ return 0;
+ } else {
+ return ENXIO;
+ }
+}
+
+static int
+uhci_pci_attach(device_t dev)
{
- int id, legsup;
+ int unit = device_get_unit(dev);
+ int legsup;
char *typestr;
usbd_status err;
- uhci_softc_t *sc = NULL;
device_t usbus;
-
- sc = malloc(sizeof(uhci_softc_t), M_DEVBUF, M_NOWAIT);
- /* Do not free it below, intr might use the sc */
- if ( sc == NULL ) {
- printf("uhci%d: could not allocate memory", unit);
- return;
+ uhci_softc_t *sc = device_get_softc(dev);
+ int rid;
+ struct resource *res;
+ void *ih;
+ int error;
+
+ rid = PCI_UHCI_BASE_REG;
+ res = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid,
+ 0, ~0, 1, RF_ACTIVE);
+ if (!res) {
+ device_printf(dev, "could not map ports\n");
+ return ENXIO;
+ }
+
+ sc->iot = rman_get_bustag(res);
+ sc->ioh = rman_get_bushandle(res);
+
+ rid = 0;
+ res = bus_alloc_resource(dev, SYS_RES_IRQ, &rid, 0, ~0, 1,
+ RF_SHAREABLE | RF_ACTIVE);
+ if (res == NULL) {
+ device_printf(dev, "could not allocate irq\n");
+ return ENOMEM;
}
- memset(sc, 0, sizeof(uhci_softc_t));
-
- if ( !pci_map_port(config_id, PCI_UHCI_BASE_REG, &sc->sc_iobase) ) {
- printf("uhci%d: could not map port\n", unit);
- return;
- }
-
- if ( !pci_map_int(config_id, (pci_inthand_t *)uhci_intr,
- (void *) sc, &bio_imask)) {
- printf("uhci%d: could not map irq\n", unit);
- return;
+
+ error = bus_setup_intr(dev, res, (driver_intr_t *) uhci_intr, sc, &ih);
+ if (error) {
+ device_printf(dev, "could not setup irq\n");
+ return error;
}
- usbus = device_add_child(root_bus, "usb", -1, sc);
+ usbus = device_add_child(dev, "usb", -1, sc);
if (!usbus) {
- printf("usb%d: could not add USB device to root bus\n", unit);
- return;
+ printf("usb%d: could not add USB device\n", unit);
+ return ENOMEM;
}
- id = pci_conf_read(config_id, PCI_ID_REG);
- switch (id) {
+ switch (pci_get_devid(dev)) {
case PCI_UHCI_DEVICEID_PIIX3:
device_set_desc(usbus, uhci_device_piix3);
sprintf(sc->sc_vendor, "Intel");
@@ -173,13 +169,13 @@ uhci_pci_attach(pcici_t config_id, int unit)
sprintf(sc->sc_vendor, "VIA");
break;
default:
- printf("(New UHCI DeviceId=0x%08x)\n", id);
+ printf("(New UHCI DeviceId=0x%08x)\n", pci_get_devid(dev));
device_set_desc(usbus, uhci_device_generic);
- sprintf(sc->sc_vendor, "(0x%08x)", id);
+ sprintf(sc->sc_vendor, "(0x%08x)", pci_get_devid(dev));
}
if (bootverbose) {
- switch(pci_conf_read(config_id, PCI_USBREV) & PCI_USBREV_MASK) {
+ switch(pci_read_config(dev, PCI_USBREV, 4) & PCI_USBREV_MASK) {
case PCI_USBREV_PRE_1_0:
typestr = "pre 1.0";
break;
@@ -191,25 +187,53 @@ uhci_pci_attach(pcici_t config_id, int unit)
break;
}
printf("uhci%d: USB version %s, chip rev. %d\n", unit, typestr,
- (int) pci_conf_read(config_id, PCIR_REVID) & 0xff);
+ pci_get_revid(dev));
}
- legsup = pci_conf_read(config_id, PCI_LEGSUP);
+ legsup = pci_read_config(dev, PCI_LEGSUP, 4);
if ( !(legsup & PCI_LEGSUP_USBPIRQDEN) ) {
#if ! (defined(USBVERBOSE) || defined(USB_DEBUG))
if (bootverbose)
#endif
printf("uhci%d: PIRQD enable not set\n", unit);
legsup |= PCI_LEGSUP_USBPIRQDEN;
- pci_conf_write(config_id, PCI_LEGSUP, legsup);
+ pci_write_config(dev, PCI_LEGSUP, legsup, 4);
}
sc->sc_bus.bdev = usbus;
err = uhci_init(sc);
if (err != USBD_NORMAL_COMPLETION) {
printf("uhci%d: init failed, error=%d\n", unit, err);
- device_delete_child(root_bus, usbus);
+ device_delete_child(dev, usbus);
}
- return;
+ return device_probe_and_attach(sc->sc_bus.bdev);
}
+
+static device_method_t uhci_methods[] = {
+ /* Device interface */
+ DEVMETHOD(device_probe, uhci_pci_probe),
+ DEVMETHOD(device_attach, uhci_pci_attach),
+
+ /* Bus interface */
+ DEVMETHOD(bus_print_child, bus_generic_print_child),
+ DEVMETHOD(bus_alloc_resource, bus_generic_alloc_resource),
+ DEVMETHOD(bus_release_resource, bus_generic_release_resource),
+ DEVMETHOD(bus_activate_resource, bus_generic_activate_resource),
+ DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource),
+ DEVMETHOD(bus_setup_intr, bus_generic_setup_intr),
+ DEVMETHOD(bus_teardown_intr, bus_generic_teardown_intr),
+
+ { 0, 0 }
+};
+
+static driver_t uhci_driver = {
+ "uhci",
+ uhci_methods,
+ DRIVER_TYPE_BIO,
+ sizeof(uhci_softc_t),
+};
+
+static devclass_t uhci_devclass;
+
+DRIVER_MODULE(uhci, pci, uhci_driver, uhci_devclass, 0, 0);
diff --git a/sys/dev/usb/uhcivar.h b/sys/dev/usb/uhcivar.h
index 2171374546bc..89fed85c6b35 100644
--- a/sys/dev/usb/uhcivar.h
+++ b/sys/dev/usb/uhcivar.h
@@ -125,7 +125,8 @@ typedef struct uhci_softc {
bus_dma_tag_t sc_dmatag; /* DMA tag */
/* XXX should keep track of all DMA memory */
#elif defined(__FreeBSD__)
- int sc_iobase;
+ bus_space_tag_t iot;
+ bus_space_handle_t ioh;
#endif /* defined(__FreeBSD__) */
uhci_physaddr_t *sc_pframes;
diff --git a/sys/dev/usb/uhid.c b/sys/dev/usb/uhid.c
index a55944bdd0fc..e43455630d68 100644
--- a/sys/dev/usb/uhid.c
+++ b/sys/dev/usb/uhid.c
@@ -200,13 +200,8 @@ USB_ATTACH(uhid)
static int
uhid_detach(device_t self)
{
- const char *devinfo = device_get_desc(self);
-
DPRINTF(("%s: disconnected\n", USBDEVNAME(self)));
- if (devinfo) {
- device_set_desc(self, NULL);
- free((void *)devinfo, M_USB);
- }
+ device_set_desc(self, NULL);
return 0;
}
#endif
diff --git a/sys/dev/usb/uhub.c b/sys/dev/usb/uhub.c
index 2f4029cf7b43..bf53c016fbb3 100644
--- a/sys/dev/usb/uhub.c
+++ b/sys/dev/usb/uhub.c
@@ -81,10 +81,15 @@ usbd_status uhub_init_port __P((struct usbd_port *));
void uhub_disconnect_port __P((struct usbd_port *up));
usbd_status uhub_explore __P((usbd_device_handle hub));
void uhub_intr __P((usbd_request_handle, usbd_private_handle, usbd_status));
+#ifdef __FreeBSD__
+#include "usb_if.h"
+static void uhub_disconnected __P((device_t));
+#endif
/* void uhub_disco __P((void *)); */
-USB_DECLARE_DRIVER(uhub);
+USB_DECLARE_DRIVER_INIT(uhub,
+ DEVMETHOD(usb_disconnected, uhub_disconnected));
#if defined(__FreeBSD__)
devclass_t uhubroot_devclass;
@@ -251,8 +256,8 @@ USB_ATTACH(uhub)
}
#if defined(__FreeBSD__)
-static int
-uhub_detach(device_t self)
+static void
+uhub_disconnected(device_t self)
{
struct uhub_softc *sc = device_get_softc(self);
struct usbd_port *up;
@@ -264,12 +269,20 @@ uhub_detach(device_t self)
nports = dev->hub->hubdesc.bNbrPorts;
for (p = 0; p < nports; p++) {
up = &sc->sc_hub->hub->ports[p];
- if (up->device)
+ if (up->device) {
uhub_disconnect_port(up);
+ }
}
- free(sc->sc_hub->hub, M_USB);
+ return;
+}
+static int
+uhub_detach(device_t self)
+{
+ struct uhub_softc *sc = device_get_softc(self);
+ DPRINTF(("%s: disconnected\n", USBDEVNAME(self)));
+ free(sc->sc_hub->hub, M_USB);
return 0;
}
#endif
@@ -502,6 +515,7 @@ uhub_disconnect_port(up)
}
}
#if defined(__FreeBSD__)
+ USB_DISCONNECTED(sc->sc_dev);
device_delete_child(scp->sc_dev, sc->sc_dev);
#endif
diff --git a/sys/dev/usb/ulpt.c b/sys/dev/usb/ulpt.c
index 098446036eb4..9aaf02478279 100644
--- a/sys/dev/usb/ulpt.c
+++ b/sys/dev/usb/ulpt.c
@@ -437,13 +437,8 @@ ulptioctl(dev, cmd, data, flag, p)
static int
ulpt_detach(device_t self)
{
- const char *devinfo = device_get_desc(self);
-
DPRINTF(("%s: disconnected\n", USBDEVNAME(self)));
- if (devinfo) {
- device_set_desc(self, NULL);
- free((void *)devinfo, M_USB);
- }
+ device_set_desc(self, NULL);
return 0;
}
diff --git a/sys/dev/usb/umodem.c b/sys/dev/usb/umodem.c
index 7a1b6007b63f..c624b8667d98 100644
--- a/sys/dev/usb/umodem.c
+++ b/sys/dev/usb/umodem.c
@@ -125,13 +125,8 @@ USB_ATTACH(umodem)
static int
umodem_detach(device_t self)
{
- const char *devinfo = device_get_desc(self);
-
DPRINTF(("%s: disconnected\n", USBDEVNAME(self)));
- if (devinfo) {
- device_set_desc(self, NULL);
- free((void *)devinfo, M_USB);
- }
+ device_set_desc(self, NULL);
return 0;
}
diff --git a/sys/dev/usb/ums.c b/sys/dev/usb/ums.c
index 946456632519..4d3578b7655c 100644
--- a/sys/dev/usb/ums.c
+++ b/sys/dev/usb/ums.c
@@ -363,7 +363,6 @@ static int
ums_detach(device_t self)
{
struct ums_softc *sc = device_get_softc(self);
- const char *devinfo = device_get_desc(self);
if (sc->sc_enabled) {
usbd_abort_pipe(sc->sc_intrpipe);
@@ -372,10 +371,7 @@ ums_detach(device_t self)
sc->sc_disconnected = 1;
DPRINTF(("%s: disconnected\n", USBDEVNAME(self)));
- if (devinfo) {
- device_set_desc(self, NULL);
- free((void *)devinfo, M_USB);
- }
+ device_set_desc(self, NULL);
free(sc->sc_loc_btn, M_USB);
free(sc->sc_ibuf, M_USB);
diff --git a/sys/dev/usb/usb.c b/sys/dev/usb/usb.c
index 935f951f1ee5..8d9689ad1e8f 100644
--- a/sys/dev/usb/usb.c
+++ b/sys/dev/usb/usb.c
@@ -408,5 +408,6 @@ usb_detach(device_t self)
return (1);
}
-DRIVER_MODULE(usb, root, usb_driver, usb_devclass, 0, 0);
+DRIVER_MODULE(usb, uhci, usb_driver, usb_devclass, 0, 0);
+DRIVER_MODULE(usb, ohci, usb_driver, usb_devclass, 0, 0);
#endif
diff --git a/sys/dev/usb/usb_if.m b/sys/dev/usb/usb_if.m
index 2c5e52194dbf..62ea1186337d 100644
--- a/sys/dev/usb/usb_if.m
+++ b/sys/dev/usb/usb_if.m
@@ -25,7 +25,7 @@
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
-# $Id: usb_if.m,v 1.3 1999/01/07 23:31:37 n_hibma Exp $
+# $Id: usb_if.m,v 1.4 1999/03/22 19:58:59 n_hibma Exp $
#
# USB interface description
@@ -38,3 +38,10 @@ INTERFACE usb;
METHOD int reconfigure {
device_t dev;
};
+
+# The device is being disconnected and should clean up before
+# being destroyed.
+#
+METHOD void disconnected {
+ device_t dev;
+};
diff --git a/sys/dev/usb/usb_port.h b/sys/dev/usb/usb_port.h
index f1dd74ae80e9..ea144b9beac1 100644
--- a/sys/dev/usb/usb_port.h
+++ b/sys/dev/usb/usb_port.h
@@ -126,7 +126,7 @@ __CONCAT(dname,_attach)(parent, self, aux) \
* because of includes in the wrong order.
*/
#define bdevice device_t
-#define USBDEVNAME(bdev) usbd_devname(&bdev)
+#define USBDEVNAME(bdev) device_get_nameunit(bdev)
/* XXX Change this when FreeBSD has memset
*/
diff --git a/sys/dev/usb/usbdi.c b/sys/dev/usb/usbdi.c
index d045a4d6b34a..8b88cd3312c3 100644
--- a/sys/dev/usb/usbdi.c
+++ b/sys/dev/usb/usbdi.c
@@ -1302,30 +1302,7 @@ usbd_driver_load(module_t mod, int what, void *arg)
void
usbd_device_set_desc(device_t device, char *devinfo)
{
- size_t l;
- char *desc;
-
- if ( devinfo ) {
- l = strlen(devinfo);
- desc = malloc(l+1, M_USB, M_NOWAIT);
- if (desc)
- memcpy(desc, devinfo, l+1);
- } else
- desc = NULL;
-
- device_set_desc(device, desc);
-}
-
-char *
-usbd_devname(bdevice *bdev)
-{
- static char buf[20];
- /* XXX a static buffer is not exactly a good idea, but the only
- * thing that goes wrong is the string that is being printed
- */
-
- sprintf(buf, "%s%d", device_get_name(*bdev), device_get_unit(*bdev));
- return (buf);
+ device_set_desc_copy(device, devinfo);
}
#endif
diff --git a/sys/dev/usb/usbdi.h b/sys/dev/usb/usbdi.h
index 8cdcfdbe3d6b..7a41f8bd42d9 100644
--- a/sys/dev/usb/usbdi.h
+++ b/sys/dev/usb/usbdi.h
@@ -336,7 +336,6 @@ usb_endpoint_descriptor_t *usbd_get_endpoint_descriptor
#if defined(__FreeBSD__)
int usbd_driver_load __P((module_t mod, int what, void *arg));
void usbd_device_set_desc __P((device_t device, char *devinfo));
-char *usbd_devname(bdevice *bdev);
bus_print_child_t usbd_print_child;
#endif