diff options
author | sos <sos@FreeBSD.org> | 2003-08-27 11:21:30 +0000 |
---|---|---|
committer | sos <sos@FreeBSD.org> | 2003-08-27 11:21:30 +0000 |
commit | 3eeccddac7a7ccffb312cfe4d642d74d3b16603e (patch) | |
tree | 229d7e77b2a893196be868db4595bad6ba1af7d2 /sys/dev/ata | |
parent | 1010fab1ccdee6dd6f66586dca275d281489da50 (diff) | |
download | FreeBSD-src-3eeccddac7a7ccffb312cfe4d642d74d3b16603e.zip FreeBSD-src-3eeccddac7a7ccffb312cfe4d642d74d3b16603e.tar.gz |
Hopefully Fix problem with probing some ATAPI devices, while still
trying to avoid the "fake slave" problem.
Diffstat (limited to 'sys/dev/ata')
-rw-r--r-- | sys/dev/ata/ata-lowlevel.c | 29 |
1 files changed, 15 insertions, 14 deletions
diff --git a/sys/dev/ata/ata-lowlevel.c b/sys/dev/ata/ata-lowlevel.c index 865cb0f..2bea58a 100644 --- a/sys/dev/ata/ata-lowlevel.c +++ b/sys/dev/ata/ata-lowlevel.c @@ -520,22 +520,22 @@ ata_reset(struct ata_channel *ch) ATA_IDX_OUTB(ch, ATA_ALTSTAT, ATA_A_IDS | ATA_A_RESET); DELAY(10000); ATA_IDX_OUTB(ch, ATA_ALTSTAT, ATA_A_IDS); - DELAY(100000); - ATA_IDX_INB(ch, ATA_ERROR); + DELAY(10000); /* wait for BUSY to go inactive */ - for (timeout = 0; timeout < 310000; timeout++) { + for (timeout = 0; timeout < 310; timeout++) { if (stat0 & ATA_S_BUSY) { ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_MASTER); DELAY(10); + ATA_IDX_INB(ch, ATA_ERROR); - /* check for ATAPI signature while its still there */ - lsb = ATA_IDX_INB(ch, ATA_CYL_LSB); - msb = ATA_IDX_INB(ch, ATA_CYL_MSB); stat0 = ATA_IDX_INB(ch, ATA_STATUS); - ATA_IDX_OUTB(ch, ATA_CYL_LSB, 0x00); - ATA_IDX_OUTB(ch, ATA_CYL_MSB, 0x00); if (!(stat0 & ATA_S_BUSY)) { + /* check for ATAPI signature while its still there */ + lsb = ATA_IDX_INB(ch, ATA_CYL_LSB); + msb = ATA_IDX_INB(ch, ATA_CYL_MSB); + ATA_IDX_OUTB(ch, ATA_CYL_LSB, 0x00); + ATA_IDX_OUTB(ch, ATA_CYL_MSB, 0x00); if (bootverbose) ata_printf(ch, ATA_MASTER, "ATAPI %02x %02x\n", lsb, msb); if (lsb == ATAPI_MAGIC_LSB && msb == ATAPI_MAGIC_MSB) @@ -545,14 +545,15 @@ ata_reset(struct ata_channel *ch) if (stat1 & ATA_S_BUSY) { ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_SLAVE); DELAY(10); + ATA_IDX_INB(ch, ATA_ERROR); - /* check for ATAPI signature while its still there */ - lsb = ATA_IDX_INB(ch, ATA_CYL_LSB); - msb = ATA_IDX_INB(ch, ATA_CYL_MSB); stat1 = ATA_IDX_INB(ch, ATA_STATUS); - ATA_IDX_OUTB(ch, ATA_CYL_LSB, 0x00); - ATA_IDX_OUTB(ch, ATA_CYL_MSB, 0x00); if (!(stat1 & ATA_S_BUSY)) { + /* check for ATAPI signature while its still there */ + lsb = ATA_IDX_INB(ch, ATA_CYL_LSB); + msb = ATA_IDX_INB(ch, ATA_CYL_MSB); + ATA_IDX_OUTB(ch, ATA_CYL_LSB, 0x00); + ATA_IDX_OUTB(ch, ATA_CYL_MSB, 0x00); if (bootverbose) ata_printf(ch, ATA_SLAVE, "ATAPI %02x %02x\n", lsb, msb); if (lsb == ATAPI_MAGIC_LSB && msb == ATAPI_MAGIC_MSB) @@ -568,7 +569,7 @@ ata_reset(struct ata_channel *ch) if (mask == 0x03) /* wait for both master & slave */ if (!(stat0 & ATA_S_BUSY) && !(stat1 & ATA_S_BUSY)) break; - DELAY(100); + DELAY(100000); } DELAY(10); ATA_IDX_OUTB(ch, ATA_ALTSTAT, ATA_A_4BIT); |