Index: src/sys/dev/ata/ata-all.c =================================================================== RCS file: /ncvs/src/sys/dev/ata/ata-all.c,v retrieving revision 1.289 diff -u -b -p -r1.289 ata-all.c --- src/sys/dev/ata/ata-all.c 11 Jun 2008 06:44:58 -0000 1.289 +++ src/sys/dev/ata/ata-all.c 25 Jul 2008 10:06:00 -0000 @@ -889,6 +889,28 @@ ata_mode2str(int mode) } } +static int +ata_str2mode(const char *str) +{ + if (!strncasecmp(str, "BIOSPIO", 7)) return ATA_PIO; + if (!strncasecmp(str, "PIO0", 4)) return ATA_PIO0; + if (!strncasecmp(str, "PIO1", 4)) return ATA_PIO1; + if (!strncasecmp(str, "PIO2", 4)) return ATA_PIO2; + if (!strncasecmp(str, "PIO3", 4)) return ATA_PIO3; + if (!strncasecmp(str, "PIO4", 4)) return ATA_PIO4; + if (!strncasecmp(str, "WDMA2", 5)) return ATA_WDMA2; + if (!strncasecmp(str, "UDMA2", 5)) return ATA_UDMA2; + if (!strncasecmp(str, "UDMA33", 6)) return ATA_UDMA2; + if (!strncasecmp(str, "UDMA4", 5)) return ATA_UDMA4; + if (!strncasecmp(str, "UDMA66", 6)) return ATA_UDMA4; + if (!strncasecmp(str, "UDMA5", 5)) return ATA_UDMA5; + if (!strncasecmp(str, "UDMA100", 7)) return ATA_UDMA5; + if (!strncasecmp(str, "UDMA6", 5)) return ATA_UDMA6; + if (!strncasecmp(str, "UDMA133", 7)) return ATA_UDMA6; + if (!strncasecmp(str, "BIOSDMA", 7)) return ATA_DMA; + return -1; +} + int ata_pmode(struct ata_params *ap) { @@ -952,6 +974,19 @@ ata_limit_mode(device_t dev, int mode, i { struct ata_device *atadev = device_get_softc(dev); + if (ata_delayed_attach) { + driver_t *drv = device_get_driver(dev); + const char *str = NULL; + int m; + + if (drv && resource_string_value(drv->name, atadev->unit, + "mode", &str) == 0) { + m = ata_str2mode(str); + if (m >= ATA_PIO) + mode = m; + } + } + if (maxmode && mode > maxmode) mode = maxmode;