svn commit: r195893 - head/sys/dev/ata
Alexander Motin
mav at FreeBSD.org
Sun Jul 26 14:04:48 UTC 2009
Author: mav
Date: Sun Jul 26 14:04:48 2009
New Revision: 195893
URL: http://svn.freebsd.org/changeset/base/195893
Log:
Restore PATA device probe order, broken by PMP support implementation,
requesting IDENTIFY from slave device first. This order is important
for proper cable type detection by master device.
PR: kern/136438
Approved by: re (kib)
Modified:
head/sys/dev/ata/ata-all.c
Modified: head/sys/dev/ata/ata-all.c
==============================================================================
--- head/sys/dev/ata/ata-all.c Sun Jul 26 12:20:07 2009 (r195892)
+++ head/sys/dev/ata/ata-all.c Sun Jul 26 14:04:48 2009 (r195893)
@@ -711,7 +711,7 @@ ata_identify(device_t dev)
struct ata_channel *ch = device_get_softc(dev);
struct ata_device *atadev;
device_t *children;
- device_t child;
+ device_t child, master = NULL;
int nchildren, i, n = ch->devices;
if (bootverbose)
@@ -748,6 +748,15 @@ ata_identify(device_t dev)
unit = (device_get_unit(dev) << 1) + i;
#endif
if ((child = ata_add_child(dev, atadev, unit))) {
+ /*
+ * PATA slave should be identified first, to allow
+ * device cable detection on master to work properly.
+ */
+ if (i == 0 && (n & ATA_PORTMULTIPLIER) == 0 &&
+ (n & ((ATA_ATA_MASTER | ATA_ATAPI_MASTER) << 1)) != 0) {
+ master = child;
+ continue;
+ }
if (ata_getparam(atadev, 1)) {
device_delete_child(dev, child);
free(atadev, M_ATA);
@@ -757,6 +766,13 @@ ata_identify(device_t dev)
free(atadev, M_ATA);
}
}
+ if (master) {
+ atadev = device_get_softc(master);
+ if (ata_getparam(atadev, 1)) {
+ device_delete_child(dev, master);
+ free(atadev, M_ATA);
+ }
+ }
bus_generic_probe(dev);
bus_generic_attach(dev);
mtx_unlock(&Giant);
More information about the svn-src-head
mailing list