From f44927fccbeee9153f0b4fcd038b429c9a1add54 Mon Sep 17 00:00:00 2001 From: Marcus Overhagen Date: Sun, 13 Jan 2008 00:00:58 +0000 Subject: [PATCH] Do a shorter wait during identify command, and retry it once to find atapi drives that report a wrong signature git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23463 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/add-ons/kernel/bus_managers/ata/ata.c | 2 +- src/add-ons/kernel/bus_managers/ata/devices.c | 18 +++++++++++------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/add-ons/kernel/bus_managers/ata/ata.c b/src/add-ons/kernel/bus_managers/ata/ata.c index a4b2fdb1e9..7ad67b58a0 100644 --- a/src/add-ons/kernel/bus_managers/ata/ata.c +++ b/src/add-ons/kernel/bus_managers/ata/ata.c @@ -1115,7 +1115,7 @@ ata_identify_device(ide_device_info *device, bool isAtapi) return B_ERROR; } - if (ata_wait(bus, ide_status_drq, ide_status_bsy, 0, 4000000) != B_OK) { + if (ata_wait(bus, ide_status_drq, ide_status_bsy, 0, 500000) != B_OK) { TRACE("ata_identify_device: wait failed\n"); return B_ERROR; } diff --git a/src/add-ons/kernel/bus_managers/ata/devices.c b/src/add-ons/kernel/bus_managers/ata/devices.c index 11616e011b..80aa2b7807 100644 --- a/src/add-ons/kernel/bus_managers/ata/devices.c +++ b/src/add-ons/kernel/bus_managers/ata/devices.c @@ -157,15 +157,19 @@ fix_infoblock_endian(ide_device_info *device) status_t scan_device(ide_device_info *device, bool isAtapi) { + status_t result; dprintf("ATA: scan_device\n"); - if (ata_identify_device(device, isAtapi) != B_OK) { - isAtapi = !isAtapi; - dprintf("ATA: scan_device: retrying identify for different device type (atapi=%d)\n", isAtapi); - if (ata_identify_device(device, isAtapi) != B_OK) { - dprintf("ATA: couldn't read infoblock for device %p\n", device); - return B_ERROR; - } +retry: + result = ata_identify_device(device, isAtapi); + if (result != B_OK && !isAtapi) { + dprintf("ATA: scan_device: possibly ATAPI, retrying identify\n"); + isAtapi = true; + goto retry; + } + if (result != B_OK) { + dprintf("ATA: couldn't read infoblock for device %p\n", device); + return B_ERROR; } fix_infoblock_endian(device);