summaryrefslogtreecommitdiffstats
path: root/sys/dev/pccbb
diff options
context:
space:
mode:
authorimp <imp@FreeBSD.org>2006-02-07 18:38:51 +0000
committerimp <imp@FreeBSD.org>2006-02-07 18:38:51 +0000
commit529aebfbd88ec6e5451ac8cc35feafe2c13e227c (patch)
treeb25ef061ac41a1042bb72aa464c25cce46a1787c /sys/dev/pccbb
parent27eaba310554b93d6461bb726f14c430d643ffa4 (diff)
downloadFreeBSD-src-529aebfbd88ec6e5451ac8cc35feafe2c13e227c.zip
FreeBSD-src-529aebfbd88ec6e5451ac8cc35feafe2c13e227c.tar.gz
Detach the children before we delete them. This is a little cleaner
than just deleting them. Also add comments about why we do this. Given the current behavior of delete_child, I don't think this changes anything. It just feels cleaner.
Diffstat (limited to 'sys/dev/pccbb')
-rw-r--r--sys/dev/pccbb/pccbb.c28
1 files changed, 18 insertions, 10 deletions
diff --git a/sys/dev/pccbb/pccbb.c b/sys/dev/pccbb/pccbb.c
index f994030..8f6d06a 100644
--- a/sys/dev/pccbb/pccbb.c
+++ b/sys/dev/pccbb/pccbb.c
@@ -287,18 +287,26 @@ cbb_detach(device_t brdev)
int tmp;
int error;
- device_get_children(brdev, &devlist, &numdevs);
+ /*
+ * Before we delete the children (which we have to do because
+ * attach doesn't check for children busses correctly), we have
+ * to detach the children. Even if we didn't need to delete the
+ * children, we have to detach them.
+ */
+ error = bus_generic_detach(brdev);
+ if (error != 0)
+ return (error);
- error = 0;
- for (tmp = 0; tmp < numdevs; tmp++) {
- if (device_detach(devlist[tmp]) == 0)
- device_delete_child(brdev, devlist[tmp]);
- else
- error++;
- }
+ /*
+ * Since the attach routine doesn't search for children before it
+ * attaches them to this device, we must delete them here in order
+ * for the kldload/unload case to work. If we failed to do that, then
+ * we'd get duplicate devices when cbb.ko was reloaded.
+ */
+ device_get_children(brdev, &devlist, &numdevs);
+ for (tmp = 0; tmp < numdevs; tmp++)
+ device_delete_child(brdev, devlist[tmp]);
free(devlist, M_TEMP);
- if (error > 0)
- return (ENXIO);
/* Turn off the interrupts */
cbb_set(sc, CBB_SOCKET_MASK, 0);
OpenPOWER on IntegriCloud