diff options
author | Kevin O'Connor <kevin@koconnor.net> | 2009-06-10 20:33:57 -0400 |
---|---|---|
committer | Kevin O'Connor <kevin@koconnor.net> | 2009-06-10 20:33:57 -0400 |
commit | c79637bfce2e90d724ae2d2cebb3d15c39b5a38e (patch) | |
tree | 27e2cf3e213f3d5c5bd95394f4466ef95fec44a5 | |
parent | 414d0738df44c970815ec435a142f308719bb4ad (diff) | |
download | seabios-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.c | 52 |
1 files changed, 31 insertions, 21 deletions
@@ -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"); |