[ide-dev 2/5] fix drive->ready_stat for ATAPI

From: Bartlomiej Zolnierkiewicz
Date: Fri Jan 21 2005 - 18:23:24 EST



ATAPI devices ignore DRDY bit so drive->ready_stat must be set to zero.
It is currently done by device drivers (including ide-default fake driver)
but for PMAC driver it is too late as wait_for_ready() may be called during
probe: probe_hwif()->pmac_ide_dma_check()->pmac_ide_{mdma,udma}_enable()->
->pmac_ide_do_setfeature()->wait_for_ready().

Fixup drive->ready_stat just after detecting ATAPI device.

diff -Nru a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c
--- a/drivers/ide/ide-cd.c 2005-01-21 23:53:20 +01:00
+++ b/drivers/ide/ide-cd.c 2005-01-21 23:53:20 +01:00
@@ -3088,7 +3088,6 @@
drive->queue->unplug_delay = 1;

drive->special.all = 0;
- drive->ready_stat = 0;

CDROM_STATE_FLAGS(drive)->media_changed = 1;
CDROM_STATE_FLAGS(drive)->toc_valid = 0;
diff -Nru a/drivers/ide/ide-default.c b/drivers/ide/ide-default.c
--- a/drivers/ide/ide-default.c 2005-01-21 23:53:20 +01:00
+++ b/drivers/ide/ide-default.c 2005-01-21 23:53:20 +01:00
@@ -57,13 +57,6 @@
"driver with ide.c\n", drive->name);
return 1;
}
-
- /* For the sake of the request layer, we must make sure we have a
- * correct ready_stat value, that is 0 for ATAPI devices or we will
- * fail any request like Power Management
- */
- if (drive->media != ide_disk)
- drive->ready_stat = 0;

return 0;
}
diff -Nru a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c
--- a/drivers/ide/ide-floppy.c 2005-01-21 23:53:20 +01:00
+++ b/drivers/ide/ide-floppy.c 2005-01-21 23:53:20 +01:00
@@ -1793,7 +1793,6 @@

*((u16 *) &gcw) = drive->id->config;
drive->driver_data = floppy;
- drive->ready_stat = 0;
memset(floppy, 0, sizeof(idefloppy_floppy_t));
floppy->drive = drive;
floppy->pc = floppy->pc_stack;
diff -Nru a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c
--- a/drivers/ide/ide-probe.c 2005-01-21 23:53:20 +01:00
+++ b/drivers/ide/ide-probe.c 2005-01-21 23:53:20 +01:00
@@ -221,6 +221,8 @@
}
printk (" drive\n");
drive->media = type;
+ /* an ATAPI device ignores DRDY */
+ drive->ready_stat = 0;
return;
}

diff -Nru a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c
--- a/drivers/ide/ide-tape.c 2005-01-21 23:53:20 +01:00
+++ b/drivers/ide/ide-tape.c 2005-01-21 23:53:20 +01:00
@@ -4530,8 +4530,6 @@
memset(tape, 0, sizeof (idetape_tape_t));
spin_lock_init(&tape->spinlock);
drive->driver_data = tape;
- /* An ATAPI device ignores DRDY */
- drive->ready_stat = 0;
drive->dsc_overlap = 1;
#ifdef CONFIG_BLK_DEV_IDEPCI
if (HWIF(drive)->pci_dev != NULL) {
diff -Nru a/drivers/ide/ide.c b/drivers/ide/ide.c
--- a/drivers/ide/ide.c 2005-01-21 23:53:20 +01:00
+++ b/drivers/ide/ide.c 2005-01-21 23:53:20 +01:00
@@ -1747,6 +1747,8 @@
case -4: /* "cdrom" */
drive->present = 1;
drive->media = ide_cdrom;
+ /* an ATAPI device ignores DRDY */
+ drive->ready_stat = 0;
hwif->noprobe = 0;
goto done;
case -5: /* "serialize" */
diff -Nru a/drivers/scsi/ide-scsi.c b/drivers/scsi/ide-scsi.c
--- a/drivers/scsi/ide-scsi.c 2005-01-21 23:53:20 +01:00
+++ b/drivers/scsi/ide-scsi.c 2005-01-21 23:53:20 +01:00
@@ -679,7 +679,6 @@
static void idescsi_setup (ide_drive_t *drive, idescsi_scsi_t *scsi)
{
DRIVER(drive)->busy++;
- drive->ready_stat = 0;
if (drive->id && (drive->id->config & 0x0060) == 0x20)
set_bit (IDESCSI_DRQ_INTERRUPT, &scsi->flags);
set_bit(IDESCSI_TRANSFORM, &scsi->transform);
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/