diff options
author | imp <imp@FreeBSD.org> | 2006-02-07 18:38:51 +0000 |
---|---|---|
committer | imp <imp@FreeBSD.org> | 2006-02-07 18:38:51 +0000 |
commit | 529aebfbd88ec6e5451ac8cc35feafe2c13e227c (patch) | |
tree | b25ef061ac41a1042bb72aa464c25cce46a1787c /sys/dev/pccbb | |
parent | 27eaba310554b93d6461bb726f14c430d643ffa4 (diff) | |
download | FreeBSD-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.c | 28 |
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); |