summaryrefslogtreecommitdiffstats
path: root/sys/dev/ata
diff options
context:
space:
mode:
authorsos <sos@FreeBSD.org>2003-08-27 11:21:30 +0000
committersos <sos@FreeBSD.org>2003-08-27 11:21:30 +0000
commit3eeccddac7a7ccffb312cfe4d642d74d3b16603e (patch)
tree229d7e77b2a893196be868db4595bad6ba1af7d2 /sys/dev/ata
parent1010fab1ccdee6dd6f66586dca275d281489da50 (diff)
downloadFreeBSD-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.c29
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);
OpenPOWER on IntegriCloud