From: Kevin O'Connor Date: Thu, 11 Jun 2009 00:33:57 +0000 (-0400) Subject: Try to check for IDE drive 0 responding to drive 1 commands. X-Git-Tag: rel-0.4.1~26 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=c79637bfce2e90d724ae2d2cebb3d15c39b5a38e;p=seabios.git 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. --- diff --git a/src/ata.c b/src/ata.c index db0996a..3b609c5 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");