|
@@ -214,28 +214,25 @@ static void program_cycle_times (ide_drive_t *drive, int cycle_time, int active_
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
- * This routine selects drive's best PIO mode and writes into the chipset
|
|
|
- * registers setup/active/recovery timings.
|
|
|
+ * This routine writes into the chipset registers
|
|
|
+ * PIO setup/active/recovery timings.
|
|
|
*/
|
|
|
-static u8 cmd64x_tune_pio (ide_drive_t *drive, u8 mode_wanted)
|
|
|
+static void cmd64x_tune_pio(ide_drive_t *drive, const u8 pio)
|
|
|
{
|
|
|
ide_hwif_t *hwif = HWIF(drive);
|
|
|
struct pci_dev *dev = hwif->pci_dev;
|
|
|
unsigned int cycle_time;
|
|
|
- u8 pio_mode, setup_count, arttim = 0;
|
|
|
+ u8 setup_count, arttim = 0;
|
|
|
+
|
|
|
static const u8 setup_values[] = {0x40, 0x40, 0x40, 0x80, 0, 0xc0};
|
|
|
static const u8 arttim_regs[4] = {ARTTIM0, ARTTIM1, ARTTIM23, ARTTIM23};
|
|
|
|
|
|
- pio_mode = ide_get_best_pio_mode(drive, mode_wanted, 5);
|
|
|
- cycle_time = ide_pio_cycle_time(drive, pio_mode);
|
|
|
-
|
|
|
- cmdprintk("%s: PIO mode wanted %d, selected %d (%d ns)\n",
|
|
|
- drive->name, mode_wanted, pio_mode, cycle_time);
|
|
|
+ cycle_time = ide_pio_cycle_time(drive, pio);
|
|
|
|
|
|
program_cycle_times(drive, cycle_time,
|
|
|
- ide_pio_timings[pio_mode].active_time);
|
|
|
+ ide_pio_timings[pio].active_time);
|
|
|
|
|
|
- setup_count = quantize_timing(ide_pio_timings[pio_mode].setup_time,
|
|
|
+ setup_count = quantize_timing(ide_pio_timings[pio].setup_time,
|
|
|
1000 / system_bus_clock());
|
|
|
|
|
|
/*
|
|
@@ -266,16 +263,14 @@ static u8 cmd64x_tune_pio (ide_drive_t *drive, u8 mode_wanted)
|
|
|
arttim |= setup_values[setup_count];
|
|
|
(void) pci_write_config_byte(dev, arttim_regs[drive->dn], arttim);
|
|
|
cmdprintk("Write 0x%02x to reg 0x%x\n", arttim, arttim_regs[drive->dn]);
|
|
|
-
|
|
|
- return pio_mode;
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
* Attempts to set drive's PIO mode.
|
|
|
- * Special cases are 8: prefetch off, 9: prefetch on (both never worked),
|
|
|
- * and 255: auto-select best mode (used at boot time).
|
|
|
+ * Special cases are 8: prefetch off, 9: prefetch on (both never worked)
|
|
|
*/
|
|
|
-static void cmd64x_tune_drive (ide_drive_t *drive, u8 pio)
|
|
|
+
|
|
|
+static void cmd64x_set_pio_mode(ide_drive_t *drive, const u8 pio)
|
|
|
{
|
|
|
/*
|
|
|
* Filter out the prefetch control values
|
|
@@ -284,7 +279,7 @@ static void cmd64x_tune_drive (ide_drive_t *drive, u8 pio)
|
|
|
if (pio == 8 || pio == 9)
|
|
|
return;
|
|
|
|
|
|
- pio = cmd64x_tune_pio(drive, pio);
|
|
|
+ cmd64x_tune_pio(drive, pio);
|
|
|
(void) ide_config_drive_speed(drive, XFER_PIO_0 + pio);
|
|
|
}
|
|
|
|
|
@@ -334,7 +329,7 @@ static int cmd64x_tune_chipset(ide_drive_t *drive, const u8 speed)
|
|
|
case XFER_PIO_2:
|
|
|
case XFER_PIO_1:
|
|
|
case XFER_PIO_0:
|
|
|
- (void) cmd64x_tune_pio(drive, speed - XFER_PIO_0);
|
|
|
+ cmd64x_tune_pio(drive, speed - XFER_PIO_0);
|
|
|
break;
|
|
|
default:
|
|
|
return 1;
|
|
@@ -352,7 +347,7 @@ static int cmd64x_config_drive_for_dma (ide_drive_t *drive)
|
|
|
return 0;
|
|
|
|
|
|
if (ide_use_fast_pio(drive))
|
|
|
- cmd64x_tune_drive(drive, 255);
|
|
|
+ ide_set_max_pio(drive);
|
|
|
|
|
|
return -1;
|
|
|
}
|
|
@@ -536,7 +531,7 @@ static void __devinit init_hwif_cmd64x(ide_hwif_t *hwif)
|
|
|
|
|
|
pci_read_config_byte(dev, PCI_REVISION_ID, &rev);
|
|
|
|
|
|
- hwif->tuneproc = &cmd64x_tune_drive;
|
|
|
+ hwif->set_pio_mode = &cmd64x_set_pio_mode;
|
|
|
hwif->speedproc = &cmd64x_tune_chipset;
|
|
|
|
|
|
hwif->drives[0].autotune = hwif->drives[1].autotune = 1;
|
|
@@ -620,6 +615,7 @@ static ide_pci_device_t cmd64x_chipsets[] __devinitdata = {
|
|
|
.autodma = AUTODMA,
|
|
|
.enablebits = {{0x00,0x00,0x00}, {0x51,0x08,0x08}},
|
|
|
.bootable = ON_BOARD,
|
|
|
+ .host_flags = IDE_HFLAG_ABUSE_PREFETCH,
|
|
|
.pio_mask = ATA_PIO5,
|
|
|
.udma_mask = 0x00, /* no udma */
|
|
|
},{ /* 1 */
|
|
@@ -630,6 +626,7 @@ static ide_pci_device_t cmd64x_chipsets[] __devinitdata = {
|
|
|
.autodma = AUTODMA,
|
|
|
.enablebits = {{0x51,0x04,0x04}, {0x51,0x08,0x08}},
|
|
|
.bootable = ON_BOARD,
|
|
|
+ .host_flags = IDE_HFLAG_ABUSE_PREFETCH,
|
|
|
.pio_mask = ATA_PIO5,
|
|
|
.udma_mask = 0x07, /* udma0-2 */
|
|
|
},{ /* 2 */
|
|
@@ -640,6 +637,7 @@ static ide_pci_device_t cmd64x_chipsets[] __devinitdata = {
|
|
|
.autodma = AUTODMA,
|
|
|
.enablebits = {{0x51,0x04,0x04}, {0x51,0x08,0x08}},
|
|
|
.bootable = ON_BOARD,
|
|
|
+ .host_flags = IDE_HFLAG_ABUSE_PREFETCH,
|
|
|
.pio_mask = ATA_PIO5,
|
|
|
.udma_mask = 0x1f, /* udma0-4 */
|
|
|
},{ /* 3 */
|
|
@@ -650,6 +648,7 @@ static ide_pci_device_t cmd64x_chipsets[] __devinitdata = {
|
|
|
.autodma = AUTODMA,
|
|
|
.enablebits = {{0x51,0x04,0x04}, {0x51,0x08,0x08}},
|
|
|
.bootable = ON_BOARD,
|
|
|
+ .host_flags = IDE_HFLAG_ABUSE_PREFETCH,
|
|
|
.pio_mask = ATA_PIO5,
|
|
|
.udma_mask = 0x3f, /* udma0-5 */
|
|
|
}
|