Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/dev Deallocate resources (bus space and interrupts) when...
details: https://anonhg.NetBSD.org/src/rev/82c7a352227a
branches: trunk
changeset: 477140:82c7a352227a
user: augustss <augustss%NetBSD.org@localhost>
date: Tue Oct 12 11:21:24 1999 +0000
description:
Deallocate resources (bus space and interrupts) when detaching from
the bus.
diffstat:
sys/dev/pci/ohci_pci.c | 79 +++++++++++++++++++++++++++++++++++--------------
sys/dev/pci/uhci_pci.c | 78 ++++++++++++++++++++++++++++++++++--------------
sys/dev/usb/ohci.c | 7 +--
sys/dev/usb/ohcivar.h | 9 +----
sys/dev/usb/uhci.c | 7 +--
sys/dev/usb/uhcivar.h | 9 +----
6 files changed, 121 insertions(+), 68 deletions(-)
diffs (truncated from 419 to 300 lines):
diff -r 09fa5c7425df -r 82c7a352227a sys/dev/pci/ohci_pci.c
--- a/sys/dev/pci/ohci_pci.c Tue Oct 12 08:41:55 1999 +0000
+++ b/sys/dev/pci/ohci_pci.c Tue Oct 12 11:21:24 1999 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: ohci_pci.c,v 1.13 1999/09/15 10:25:30 augustss Exp $ */
+/* $NetBSD: ohci_pci.c,v 1.14 1999/10/12 11:21:24 augustss Exp $ */
/*
* Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -65,10 +65,18 @@
int ohci_pci_match __P((struct device *, struct cfdata *, void *));
void ohci_pci_attach __P((struct device *, struct device *, void *));
+int ohci_pci_detach __P((device_ptr_t, int));
+
+struct ohci_pci_softc {
+ ohci_softc_t sc;
+ pci_chipset_tag_t sc_pc;
+ bus_size_t sc_size;
+ void *sc_ih; /* interrupt vectoring */
+};
struct cfattach ohci_pci_ca = {
- sizeof(struct ohci_softc), ohci_pci_match, ohci_pci_attach,
- ohci_detach, ohci_activate
+ sizeof(struct ohci_pci_softc), ohci_pci_match, ohci_pci_attach,
+ ohci_pci_detach, ohci_activate
};
int
@@ -82,9 +90,9 @@
if (PCI_CLASS(pa->pa_class) == PCI_CLASS_SERIALBUS &&
PCI_SUBCLASS(pa->pa_class) == PCI_SUBCLASS_SERIALBUS_USB &&
PCI_INTERFACE(pa->pa_class) == PCI_INTERFACE_OHCI)
- return 1;
+ return (1);
- return 0;
+ return (0);
}
void
@@ -93,7 +101,7 @@
struct device *self;
void *aux;
{
- struct ohci_softc *sc = (struct ohci_softc *)self;
+ struct ohci_pci_softc *sc = (struct ohci_pci_softc *)self;
struct pci_attach_args *pa = (struct pci_attach_args *)aux;
pci_chipset_tag_t pc = pa->pa_pc;
char const *intrstr;
@@ -102,21 +110,24 @@
char devinfo[256];
usbd_status r;
char *vendor;
+ char *devname = sc->sc.sc_bus.bdev.dv_xname;
pci_devinfo(pa->pa_id, pa->pa_class, 0, devinfo);
printf(": %s (rev. 0x%02x)\n", devinfo, PCI_REVISION(pa->pa_class));
/* Map I/O registers */
if (pci_mapreg_map(pa, PCI_CBMEM, PCI_MAPREG_TYPE_MEM, 0,
- &sc->iot, &sc->ioh, NULL, NULL)) {
- printf("%s: can't map mem space\n", sc->sc_bus.bdev.dv_xname);
+ &sc->sc.iot, &sc->sc.ioh, NULL, &sc->sc_size)) {
+ printf("%s: can't map mem space\n", devname);
return;
}
- /* Disable interrupts, so we don't can any spurious ones. */
- bus_space_write_4(sc->iot, sc->ioh, OHCI_INTERRUPT_DISABLE, OHCI_ALL_INTRS);
+ /* Disable interrupts, so we don't get any spurious ones. */
+ bus_space_write_4(sc->sc.iot, sc->sc.ioh, OHCI_INTERRUPT_DISABLE,
+ OHCI_ALL_INTRS);
- sc->sc_bus.dmatag = pa->pa_dmat;
+ sc->sc_pc = pc;
+ sc->sc.sc_bus.dmatag = pa->pa_dmat;
/* Enable the device. */
csr = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG);
@@ -126,37 +137,59 @@
/* Map and establish the interrupt. */
if (pci_intr_map(pc, pa->pa_intrtag, pa->pa_intrpin,
pa->pa_intrline, &ih)) {
- printf("%s: couldn't map interrupt\n",
- sc->sc_bus.bdev.dv_xname);
+ printf("%s: couldn't map interrupt\n", devname);
return;
}
intrstr = pci_intr_string(pc, ih);
sc->sc_ih = pci_intr_establish(pc, ih, IPL_USB, ohci_intr, sc);
if (sc->sc_ih == NULL) {
- printf("%s: couldn't establish interrupt",
- sc->sc_bus.bdev.dv_xname);
+ printf("%s: couldn't establish interrupt", devname);
if (intrstr != NULL)
printf(" at %s", intrstr);
printf("\n");
return;
}
- printf("%s: interrupting at %s\n", sc->sc_bus.bdev.dv_xname, intrstr);
+ printf("%s: interrupting at %s\n", devname, intrstr);
/* Figure out vendor for root hub descriptor. */
vendor = pci_findvendor(pa->pa_id);
- sc->sc_id_vendor = PCI_VENDOR(pa->pa_id);
+ sc->sc.sc_id_vendor = PCI_VENDOR(pa->pa_id);
if (vendor)
- strncpy(sc->sc_vendor, vendor, sizeof(sc->sc_vendor) - 1);
+ strncpy(sc->sc.sc_vendor, vendor,
+ sizeof(sc->sc.sc_vendor) - 1);
else
- sprintf(sc->sc_vendor, "vendor 0x%04x", PCI_VENDOR(pa->pa_id));
+ sprintf(sc->sc.sc_vendor, "vendor 0x%04x",
+ PCI_VENDOR(pa->pa_id));
- r = ohci_init(sc);
+ r = ohci_init(&sc->sc);
if (r != USBD_NORMAL_COMPLETION) {
- printf("%s: init failed, error=%d\n", sc->sc_bus.bdev.dv_xname,
- r);
+ printf("%s: init failed, error=%d\n", devname, r);
return;
}
/* Attach usb device. */
- sc->sc_child = config_found((void *)sc, &sc->sc_bus, usbctlprint);
+ sc->sc.sc_child = config_found((void *)sc, &sc->sc.sc_bus,
+ usbctlprint);
}
+
+int
+ohci_pci_detach(self, flags)
+ device_ptr_t self;
+ int flags;
+{
+ struct ohci_pci_softc *sc = (struct ohci_pci_softc *)self;
+ int rv;
+
+ rv = ohci_detach(&sc->sc, flags);
+ if (rv)
+ return (rv);
+ if (sc->sc_ih) {
+ pci_intr_disestablish(sc->sc_pc, sc->sc_ih);
+ sc->sc_ih = 0;
+ }
+ if (sc->sc_size) {
+ bus_space_unmap(sc->sc.iot, sc->sc.ioh, sc->sc_size);
+ sc->sc_size = 0;
+ }
+ return (0);
+}
diff -r 09fa5c7425df -r 82c7a352227a sys/dev/pci/uhci_pci.c
--- a/sys/dev/pci/uhci_pci.c Tue Oct 12 08:41:55 1999 +0000
+++ b/sys/dev/pci/uhci_pci.c Tue Oct 12 11:21:24 1999 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: uhci_pci.c,v 1.11 1999/09/15 10:25:30 augustss Exp $ */
+/* $NetBSD: uhci_pci.c,v 1.12 1999/10/12 11:21:24 augustss Exp $ */
/*
* Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -58,10 +58,18 @@
int uhci_pci_match __P((struct device *, struct cfdata *, void *));
void uhci_pci_attach __P((struct device *, struct device *, void *));
+int uhci_pci_detach __P((device_ptr_t, int));
+
+struct uhci_pci_softc {
+ uhci_softc_t sc;
+ pci_chipset_tag_t sc_pc;
+ bus_size_t sc_size;
+ void *sc_ih; /* interrupt vectoring */
+};
struct cfattach uhci_pci_ca = {
- sizeof(uhci_softc_t), uhci_pci_match, uhci_pci_attach,
- uhci_detach, uhci_activate
+ sizeof(struct uhci_pci_softc), uhci_pci_match, uhci_pci_attach,
+ uhci_pci_detach, uhci_activate
};
int
@@ -75,9 +83,9 @@
if (PCI_CLASS(pa->pa_class) == PCI_CLASS_SERIALBUS &&
PCI_SUBCLASS(pa->pa_class) == PCI_SUBCLASS_SERIALBUS_USB &&
PCI_INTERFACE(pa->pa_class) == PCI_INTERFACE_UHCI)
- return 1;
+ return (1);
- return 0;
+ return (0);
}
void
@@ -86,13 +94,14 @@
struct device *self;
void *aux;
{
- uhci_softc_t *sc = (uhci_softc_t *)self;
+ struct uhci_pci_softc *sc = (struct uhci_pci_softc *)self;
struct pci_attach_args *pa = (struct pci_attach_args *)aux;
pci_chipset_tag_t pc = pa->pa_pc;
char const *intrstr;
pci_intr_handle_t ih;
pcireg_t csr;
char *typestr, *vendor;
+ char *devname = sc->sc.sc_bus.bdev.dv_xname;
char devinfo[256];
usbd_status r;
@@ -101,15 +110,16 @@
/* Map I/O registers */
if (pci_mapreg_map(pa, PCI_CBIO, PCI_MAPREG_TYPE_IO, 0,
- &sc->iot, &sc->ioh, NULL, NULL)) {
- printf("%s: can't map i/o space\n", sc->sc_bus.bdev.dv_xname);
+ &sc->sc.iot, &sc->sc.ioh, NULL, &sc->sc_size)) {
+ printf("%s: can't map i/o space\n", devname);
return;
}
/* Disable interrupts, so we don't get any spurious ones. */
- bus_space_write_2(sc->iot, sc->ioh, UHCI_INTR, 0);
+ bus_space_write_2(sc->sc.iot, sc->sc.ioh, UHCI_INTR, 0);
- sc->sc_bus.dmatag = pa->pa_dmat;
+ sc->sc_pc = pc;
+ sc->sc.sc_bus.dmatag = pa->pa_dmat;
/* Enable the device. */
csr = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG);
@@ -119,21 +129,19 @@
/* Map and establish the interrupt. */
if (pci_intr_map(pc, pa->pa_intrtag, pa->pa_intrpin,
pa->pa_intrline, &ih)) {
- printf("%s: couldn't map interrupt\n",
- sc->sc_bus.bdev.dv_xname);
+ printf("%s: couldn't map interrupt\n", devname);
return;
}
intrstr = pci_intr_string(pc, ih);
sc->sc_ih = pci_intr_establish(pc, ih, IPL_USB, uhci_intr, sc);
if (sc->sc_ih == NULL) {
- printf("%s: couldn't establish interrupt",
- sc->sc_bus.bdev.dv_xname);
+ printf("%s: couldn't establish interrupt", devname);
if (intrstr != NULL)
printf(" at %s", intrstr);
printf("\n");
return;
}
- printf("%s: interrupting at %s\n", sc->sc_bus.bdev.dv_xname, intrstr);
+ printf("%s: interrupting at %s\n", devname, intrstr);
switch(pci_conf_read(pc, pa->pa_tag, PCI_USBREV) & PCI_USBREV_MASK) {
case PCI_USBREV_PRE_1_0:
@@ -146,23 +154,47 @@
typestr = "unknown";
break;
}
- printf("%s: USB version %s\n", sc->sc_bus.bdev.dv_xname, typestr);
+ printf("%s: USB version %s\n", devname, typestr);
/* Figure out vendor for root hub descriptor. */
vendor = pci_findvendor(pa->pa_id);
- sc->sc_id_vendor = PCI_VENDOR(pa->pa_id);
+ sc->sc.sc_id_vendor = PCI_VENDOR(pa->pa_id);
if (vendor)
- strncpy(sc->sc_vendor, vendor, sizeof(sc->sc_vendor) - 1);
+ strncpy(sc->sc.sc_vendor, vendor,
+ sizeof(sc->sc.sc_vendor) - 1);
else
- sprintf(sc->sc_vendor, "vendor 0x%04x", PCI_VENDOR(pa->pa_id));
+ sprintf(sc->sc.sc_vendor, "vendor 0x%04x",
+ PCI_VENDOR(pa->pa_id));
- r = uhci_init(sc);
+ r = uhci_init(&sc->sc);
if (r != USBD_NORMAL_COMPLETION) {
- printf("%s: init failed, error=%d\n",
- sc->sc_bus.bdev.dv_xname, r);
+ printf("%s: init failed, error=%d\n", devname, r);
return;
}
/* Attach usb device. */
- sc->sc_child = config_found((void *)sc, &sc->sc_bus, usbctlprint);
+ sc->sc.sc_child = config_found((void *)sc, &sc->sc.sc_bus,
+ usbctlprint);
}
+
+int
+uhci_pci_detach(self, flags)
+ device_ptr_t self;
+ int flags;
+{
+ struct uhci_pci_softc *sc = (struct uhci_pci_softc *)self;
+ int rv;
+
Home |
Main Index |
Thread Index |
Old Index