summaryrefslogtreecommitdiffstats
path: root/sys/dev/cardbus/cardbus.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/cardbus/cardbus.c')
-rw-r--r--sys/dev/cardbus/cardbus.c36
1 files changed, 18 insertions, 18 deletions
diff --git a/sys/dev/cardbus/cardbus.c b/sys/dev/cardbus/cardbus.c
index b33f462a..e785b0f 100644
--- a/sys/dev/cardbus/cardbus.c
+++ b/sys/dev/cardbus/cardbus.c
@@ -226,31 +226,30 @@ cardbus_attach_card(device_t cbdev)
return (ENOENT);
}
+static void
+cardbus_child_deleted(device_t cbdev, device_t child)
+{
+ struct cardbus_devinfo *dinfo = device_get_ivars(child);
+
+ if (dinfo->pci.cfg.dev != child)
+ device_printf(cbdev, "devinfo dev mismatch\n");
+ cardbus_device_destroy(dinfo);
+ pci_child_deleted(cbdev, child);
+}
+
static int
cardbus_detach_card(device_t cbdev)
{
- int numdevs;
- device_t *devlist;
- int tmp;
int err = 0;
- if (device_get_children(cbdev, &devlist, &numdevs) != 0)
- return (ENOENT);
- if (numdevs == 0) {
- free(devlist, M_TEMP);
- return (ENOENT);
- }
-
- for (tmp = 0; tmp < numdevs; tmp++) {
- struct cardbus_devinfo *dinfo = device_get_ivars(devlist[tmp]);
+ err = bus_generic_detach(cbdev);
+ if (err)
+ return (err);
+ err = device_delete_children(cbdev);
+ if (err)
+ return (err);
- if (dinfo->pci.cfg.dev != devlist[tmp])
- device_printf(cbdev, "devinfo dev mismatch\n");
- cardbus_device_destroy(dinfo);
- pci_delete_child(cbdev, devlist[tmp]);
- }
POWER_DISABLE_SOCKET(device_get_parent(cbdev), cbdev);
- free(devlist, M_TEMP);
return (err);
}
@@ -335,6 +334,7 @@ static device_method_t cardbus_methods[] = {
DEVMETHOD(device_resume, cardbus_resume),
/* Bus interface */
+ DEVMETHOD(bus_child_deleted, cardbus_child_deleted),
DEVMETHOD(bus_get_dma_tag, bus_generic_get_dma_tag),
DEVMETHOD(bus_read_ivar, cardbus_read_ivar),
DEVMETHOD(bus_driver_added, cardbus_driver_added),
OpenPOWER on IntegriCloud