improved PIO transfer speed and system responsiveness.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23448 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Marcus Overhagen
2008-01-12 21:58:33 +00:00
parent aa5d2a2df2
commit cf3c203afa
2 changed files with 14 additions and 14 deletions
+8 -12
View File
@@ -110,10 +110,14 @@ ata_wait(ide_bus_info *bus, uint8 set, uint8 cleared,
if (elapsedTime > timeout) if (elapsedTime > timeout)
return B_TIMED_OUT; return B_TIMED_OUT;
if (elapsedTime < 4000) // The device may be ready almost immediatelly. If it isn't,
// poll often during the first 20ms, otherwise poll lazyly.
if (elapsedTime < 500)
spin(1); spin(1);
else if (elapsedTime < 20000)
snooze(1000);
else else
snooze(4000); snooze(50000);
} }
} }
@@ -149,16 +153,6 @@ ata_wait_idle(ide_bus_info *bus)
return ata_wait(bus, 0, ide_status_bsy | ide_status_drq, 0, 20000); return ata_wait(bus, 0, ide_status_bsy | ide_status_drq, 0, 20000);
} }
/*
// busy wait for device beeing ready,
// using the timeout set by the previous ata_send_command
status_t
ata_pio_wait_drdy(ide_device_info *device)
{
ASSERT(device->bus->state == ata_state_pio);
return ata_wait(device->bus, ide_status_drdy, ide_status_bsy, 0, device->pio_timeout);
}
*/
status_t status_t
ata_send_command(ide_device_info *device, ata_request *request, ata_flags flags, bigtime_t timeout) ata_send_command(ide_device_info *device, ata_request *request, ata_flags flags, bigtime_t timeout)
@@ -170,6 +164,7 @@ ata_send_command(ide_device_info *device, ata_request *request, ata_flags flags,
ASSERT((flags & ATA_DMA_TRANSFER) == 0); // XXX only pio for now ASSERT((flags & ATA_DMA_TRANSFER) == 0); // XXX only pio for now
/*
FLOW("ata_send_command: %d:%d, request %p, ccb %p, tf %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n", FLOW("ata_send_command: %d:%d, request %p, ccb %p, tf %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
device->target_id, device->is_device1, device->target_id, device->is_device1,
request, request ? request->ccb : NULL, request, request ? request->ccb : NULL,
@@ -177,6 +172,7 @@ ata_send_command(ide_device_info *device, ata_request *request, ata_flags flags,
device->tf.raw.r[3], device->tf.raw.r[4], device->tf.raw.r[5], device->tf.raw.r[3], device->tf.raw.r[4], device->tf.raw.r[5],
device->tf.raw.r[6], device->tf.raw.r[7], device->tf.raw.r[8], device->tf.raw.r[6], device->tf.raw.r[7], device->tf.raw.r[8],
device->tf.raw.r[9], device->tf.raw.r[10], device->tf.raw.r[11]); device->tf.raw.r[9], device->tf.raw.r[10], device->tf.raw.r[11]);
*/
// disable Interrupts for PIO transfers // disable Interrupts for PIO transfers
if ((flags & ATA_DMA_TRANSFER) == 0) { if ((flags & ATA_DMA_TRANSFER) == 0) {
@@ -160,8 +160,12 @@ scan_device(ide_device_info *device, bool isAtapi)
dprintf("ATA: scan_device\n"); dprintf("ATA: scan_device\n");
if (ata_identify_device(device, isAtapi) != B_OK) { if (ata_identify_device(device, isAtapi) != B_OK) {
dprintf("ATA: couldn't read infoblock for device %p\n", device); isAtapi = !isAtapi;
return B_ERROR; 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;
}
} }
fix_infoblock_endian(device); fix_infoblock_endian(device);