aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2009-06-10 20:33:57 -0400
committerKevin O'Connor <kevin@koconnor.net>2009-06-10 20:33:57 -0400
commitc79637bfce2e90d724ae2d2cebb3d15c39b5a38e (patch)
tree27e2cf3e213f3d5c5bd95394f4466ef95fec44a5
parent414d0738df44c970815ec435a142f308719bb4ad (diff)
downloadseabios-c79637bfce2e90d724ae2d2cebb3d15c39b5a38e.tar.gz
Try to check for IDE drive 0 responding to drive 1 commands.
If the IDE primary drive is responding to secondary drive, it's hard to detect if the secondary drive is really present - skip test.
-rw-r--r--src/ata.c52
1 files changed, 31 insertions, 21 deletions
diff --git a/src/ata.c b/src/ata.c
index db0996a5..3b609c5b 100644
--- a/src/ata.c
+++ b/src/ata.c
@@ -647,11 +647,10 @@ extract_identify(int driveid, u16 *buffer)
}
static int
-init_drive_atapi(int driveid)
+init_drive_atapi(int driveid, u16 *buffer)
{
// Send an IDENTIFY_DEVICE_PACKET command to device
- u16 buffer[256];
- memset(buffer, 0, sizeof(buffer));
+ memset(buffer, 0, IDE_SECTOR_SIZE);
struct disk_op_s dop;
dop.driveid = driveid;
dop.command = ATA_CMD_IDENTIFY_DEVICE_PACKET;
@@ -685,11 +684,10 @@ init_drive_atapi(int driveid)
}
static int
-init_drive_ata(int driveid)
+init_drive_ata(int driveid, u16 *buffer)
{
// Send an IDENTIFY_DEVICE command to device
- u16 buffer[256];
- memset(buffer, 0, sizeof(buffer));
+ memset(buffer, 0, IDE_SECTOR_SIZE);
struct disk_op_s dop;
dop.driveid = driveid;
dop.command = ATA_CMD_IDENTIFY_DEVICE;
@@ -807,23 +805,35 @@ ata_detect()
}
// check for ATAPI
- int ret = init_drive_atapi(driveid);
- if (!ret)
+ u16 buffer[256];
+ int ret = init_drive_atapi(driveid, buffer);
+ if (!ret) {
// Found an ATAPI drive.
- continue;
-
- u8 st = inb(iobase1+ATA_CB_STAT);
- if (!st)
- // Status not set - can't be a valid drive.
- continue;
-
- // Wait for RDY.
- ret = await_rdy(iobase1);
- if (ret < 0)
- continue;
+ } else {
+ u8 st = inb(iobase1+ATA_CB_STAT);
+ if (!st)
+ // Status not set - can't be a valid drive.
+ continue;
+
+ // Wait for RDY.
+ ret = await_rdy(iobase1);
+ if (ret < 0)
+ continue;
+
+ // check for ATA.
+ ret = init_drive_ata(driveid, buffer);
+ if (ret)
+ // No ATA drive found
+ continue;
+ }
- // check for ATA.
- init_drive_ata(driveid);
+ u16 resetresult = buffer[93];
+ dprintf(6, "ata_detect resetresult=%04x\n", resetresult);
+ if (!slave && (resetresult & 0xdf61) == 0x4041)
+ // resetresult looks valid and device 0 is responding to
+ // device 1 requests - device 1 must not be present - skip
+ // detection.
+ driveid++;
}
printf("\n");