ide: add ide_set{_max}_pio() (take 4)
* Add IDE_HFLAG_ABUSE_{PREFETCH,FAST_DEVSEL,DMA_MODES} flags and set them in ht6560, cmd640, cmd64x and sc1200 host drivers. * Add set_pio_mode_abuse() for checking if host driver has a non-standard ->tuneproc() implementation and use it in do_special(). * Add ide_set_pio() for setting PIO mode (it uses hwif->pio_mask to find the maximum PIO mode supported by the host), also add ide_set_max_pio() wrapper for ide_set_pio() to use for auto-tuning. Convert users of ->tuneproc to use ide_set{_max}_pio() where possible. This leaves only do_special(), set_using_pio(), ide_hwif_restore() and ide_set_pio() as a direct users of ->tuneproc. * Remove no longer needed ide_get_best_pio_mode() calls and printk-s reporting PIO mode selected from ->tuneproc implementations. * Rename ->tuneproc hook to ->set_pio_mode and make 'pio' argument const. * Remove stale comment from ide_config_drive_speed(). v2: * Fix "ata_" prefix (Noticed by Jeff). v3: * Minor cleanups/fixups per Sergei's suggestions. v4: * Fix compile problem in drivers/ide/pci/cmd640.c (Noticed by Andrew Morton). * Improve some ->set_pio_mode comments. Reviewed-by: Sergei Shtylyov <sshtylyov@ru.mvista.com> Cc: Jeff Garzik <jeff@garzik.org> Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
This commit is contained in:
@@ -68,8 +68,6 @@ static RegInitializer initData[] __initdata = {
|
||||
{0x35, 0x03}, {0x00, 0x00}
|
||||
};
|
||||
|
||||
#define ALI_MAX_PIO 4
|
||||
|
||||
/* timing parameter registers for each drive */
|
||||
static struct { u8 reg1, reg2, reg3, reg4; } regTab[4] = {
|
||||
{0x03, 0x26, 0x04, 0x27}, /* drive 0 */
|
||||
@@ -109,7 +107,7 @@ static void outReg (u8 data, u8 reg)
|
||||
* This function computes timing parameters
|
||||
* and sets controller registers accordingly.
|
||||
*/
|
||||
static void ali14xx_tune_drive (ide_drive_t *drive, u8 pio)
|
||||
static void ali14xx_set_pio_mode(ide_drive_t *drive, const u8 pio)
|
||||
{
|
||||
int driveNum;
|
||||
int time1, time2;
|
||||
@@ -117,8 +115,6 @@ static void ali14xx_tune_drive (ide_drive_t *drive, u8 pio)
|
||||
unsigned long flags;
|
||||
int bus_speed = system_bus_clock();
|
||||
|
||||
pio = ide_get_best_pio_mode(drive, pio, ALI_MAX_PIO);
|
||||
|
||||
/* calculate timing, according to PIO mode */
|
||||
time1 = ide_pio_cycle_time(drive, pio);
|
||||
time2 = ide_pio_timings[pio].active_time;
|
||||
@@ -212,12 +208,12 @@ static int __init ali14xx_probe(void)
|
||||
|
||||
hwif->chipset = ide_ali14xx;
|
||||
hwif->pio_mask = ATA_PIO4;
|
||||
hwif->tuneproc = &ali14xx_tune_drive;
|
||||
hwif->set_pio_mode = &ali14xx_set_pio_mode;
|
||||
hwif->mate = mate;
|
||||
|
||||
mate->chipset = ide_ali14xx;
|
||||
mate->pio_mask = ATA_PIO4;
|
||||
mate->tuneproc = &ali14xx_tune_drive;
|
||||
mate->set_pio_mode = &ali14xx_set_pio_mode;
|
||||
mate->mate = hwif;
|
||||
mate->channel = 1;
|
||||
|
||||
|
@@ -67,12 +67,10 @@ static void sub22 (char b, char c)
|
||||
}
|
||||
}
|
||||
|
||||
static void tune_dtc2278 (ide_drive_t *drive, u8 pio)
|
||||
static void dtc2278_set_pio_mode(ide_drive_t *drive, const u8 pio)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
pio = ide_get_best_pio_mode(drive, pio, 4);
|
||||
|
||||
if (pio >= 3) {
|
||||
spin_lock_irqsave(&ide_lock, flags);
|
||||
/*
|
||||
@@ -124,7 +122,7 @@ static int __init dtc2278_probe(void)
|
||||
hwif->serialized = 1;
|
||||
hwif->chipset = ide_dtc2278;
|
||||
hwif->pio_mask = ATA_PIO4;
|
||||
hwif->tuneproc = &tune_dtc2278;
|
||||
hwif->set_pio_mode = &dtc2278_set_pio_mode;
|
||||
hwif->drives[0].no_unmask = 1;
|
||||
hwif->drives[1].no_unmask = 1;
|
||||
hwif->mate = mate;
|
||||
|
@@ -199,7 +199,7 @@ static int __init try_to_init_ht6560b(void)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static u8 ht_pio2timings(ide_drive_t *drive, u8 pio)
|
||||
static u8 ht_pio2timings(ide_drive_t *drive, const u8 pio)
|
||||
{
|
||||
int active_time, recovery_time;
|
||||
int active_cycles, recovery_cycles;
|
||||
@@ -208,7 +208,6 @@ static u8 ht_pio2timings(ide_drive_t *drive, u8 pio)
|
||||
if (pio) {
|
||||
unsigned int cycle_time;
|
||||
|
||||
pio = ide_get_best_pio_mode(drive, pio, 5);
|
||||
cycle_time = ide_pio_cycle_time(drive, pio);
|
||||
|
||||
/*
|
||||
@@ -277,7 +276,7 @@ static void ht_set_prefetch(ide_drive_t *drive, u8 state)
|
||||
#endif
|
||||
}
|
||||
|
||||
static void tune_ht6560b (ide_drive_t *drive, u8 pio)
|
||||
static void ht6560b_set_pio_mode(ide_drive_t *drive, const u8 pio)
|
||||
{
|
||||
unsigned long flags;
|
||||
u8 timing;
|
||||
@@ -333,15 +332,17 @@ int __init ht6560b_init(void)
|
||||
|
||||
hwif->chipset = ide_ht6560b;
|
||||
hwif->selectproc = &ht6560b_selectproc;
|
||||
hwif->host_flags = IDE_HFLAG_ABUSE_PREFETCH;
|
||||
hwif->pio_mask = ATA_PIO5;
|
||||
hwif->tuneproc = &tune_ht6560b;
|
||||
hwif->set_pio_mode = &ht6560b_set_pio_mode;
|
||||
hwif->serialized = 1; /* is this needed? */
|
||||
hwif->mate = mate;
|
||||
|
||||
mate->chipset = ide_ht6560b;
|
||||
mate->selectproc = &ht6560b_selectproc;
|
||||
mate->host_flags = IDE_HFLAG_ABUSE_PREFETCH;
|
||||
mate->pio_mask = ATA_PIO5;
|
||||
mate->tuneproc = &tune_ht6560b;
|
||||
mate->set_pio_mode = &ht6560b_set_pio_mode;
|
||||
mate->serialized = 1; /* is this needed? */
|
||||
mate->mate = hwif;
|
||||
mate->channel = 1;
|
||||
|
@@ -224,15 +224,14 @@ static void qd_set_timing (ide_drive_t *drive, u8 timing)
|
||||
printk(KERN_DEBUG "%s: %#x\n", drive->name, timing);
|
||||
}
|
||||
|
||||
/*
|
||||
* qd6500_tune_drive
|
||||
*/
|
||||
|
||||
static void qd6500_tune_drive (ide_drive_t *drive, u8 pio)
|
||||
static void qd6500_set_pio_mode(ide_drive_t *drive, const u8 pio)
|
||||
{
|
||||
int active_time = 175;
|
||||
int recovery_time = 415; /* worst case values from the dos driver */
|
||||
|
||||
/*
|
||||
* FIXME: use "pio" value
|
||||
*/
|
||||
if (drive->id && !qd_find_disk_type(drive, &active_time, &recovery_time)
|
||||
&& drive->id->tPIO && (drive->id->field_valid & 0x02)
|
||||
&& drive->id->eide_pio >= 240) {
|
||||
@@ -246,11 +245,7 @@ static void qd6500_tune_drive (ide_drive_t *drive, u8 pio)
|
||||
qd_set_timing(drive, qd6500_compute_timing(HWIF(drive), active_time, recovery_time));
|
||||
}
|
||||
|
||||
/*
|
||||
* qd6580_tune_drive
|
||||
*/
|
||||
|
||||
static void qd6580_tune_drive (ide_drive_t *drive, u8 pio)
|
||||
static void qd6580_set_pio_mode(ide_drive_t *drive, const u8 pio)
|
||||
{
|
||||
int base = HWIF(drive)->select_data;
|
||||
unsigned int cycle_time;
|
||||
@@ -258,7 +253,6 @@ static void qd6580_tune_drive (ide_drive_t *drive, u8 pio)
|
||||
int recovery_time = 415; /* worst case values from the dos driver */
|
||||
|
||||
if (drive->id && !qd_find_disk_type(drive, &active_time, &recovery_time)) {
|
||||
pio = ide_get_best_pio_mode(drive, pio, 4);
|
||||
cycle_time = ide_pio_cycle_time(drive, pio);
|
||||
|
||||
switch (pio) {
|
||||
@@ -335,8 +329,7 @@ static int __init qd_testreg(int port)
|
||||
*/
|
||||
|
||||
static void __init qd_setup(ide_hwif_t *hwif, int base, int config,
|
||||
unsigned int data0, unsigned int data1,
|
||||
void (*tuneproc) (ide_drive_t *, u8 pio))
|
||||
unsigned int data0, unsigned int data1)
|
||||
{
|
||||
hwif->chipset = ide_qd65xx;
|
||||
hwif->channel = hwif->index;
|
||||
@@ -347,8 +340,6 @@ static void __init qd_setup(ide_hwif_t *hwif, int base, int config,
|
||||
hwif->drives[0].io_32bit =
|
||||
hwif->drives[1].io_32bit = 1;
|
||||
hwif->pio_mask = ATA_PIO4;
|
||||
hwif->tuneproc = tuneproc;
|
||||
probe_hwif_init(hwif);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -361,7 +352,7 @@ static void __exit qd_unsetup(ide_hwif_t *hwif)
|
||||
{
|
||||
u8 config = hwif->config_data;
|
||||
int base = hwif->select_data;
|
||||
void *tuneproc = (void *) hwif->tuneproc;
|
||||
void *set_pio_mode = (void *)hwif->set_pio_mode;
|
||||
|
||||
if (hwif->chipset != ide_qd65xx)
|
||||
return;
|
||||
@@ -369,12 +360,12 @@ static void __exit qd_unsetup(ide_hwif_t *hwif)
|
||||
printk(KERN_NOTICE "%s: back to defaults\n", hwif->name);
|
||||
|
||||
hwif->selectproc = NULL;
|
||||
hwif->tuneproc = NULL;
|
||||
hwif->set_pio_mode = NULL;
|
||||
|
||||
if (tuneproc == (void *) qd6500_tune_drive) {
|
||||
if (set_pio_mode == (void *)qd6500_set_pio_mode) {
|
||||
// will do it for both
|
||||
qd_write_reg(QD6500_DEF_DATA, QD_TIMREG(&hwif->drives[0]));
|
||||
} else if (tuneproc == (void *) qd6580_tune_drive) {
|
||||
} else if (set_pio_mode == (void *)qd6580_set_pio_mode) {
|
||||
if (QD_CONTROL(hwif) & QD_CONTR_SEC_DISABLED) {
|
||||
qd_write_reg(QD6580_DEF_DATA, QD_TIMREG(&hwif->drives[0]));
|
||||
qd_write_reg(QD6580_DEF_DATA2, QD_TIMREG(&hwif->drives[1]));
|
||||
@@ -424,8 +415,11 @@ static int __init qd_probe(int base)
|
||||
return 1;
|
||||
}
|
||||
|
||||
qd_setup(hwif, base, config, QD6500_DEF_DATA, QD6500_DEF_DATA,
|
||||
&qd6500_tune_drive);
|
||||
qd_setup(hwif, base, config, QD6500_DEF_DATA, QD6500_DEF_DATA);
|
||||
|
||||
hwif->set_pio_mode = &qd6500_set_pio_mode;
|
||||
|
||||
probe_hwif_init(hwif);
|
||||
|
||||
ide_proc_register_port(hwif);
|
||||
|
||||
@@ -455,8 +449,12 @@ static int __init qd_probe(int base)
|
||||
printk(KERN_INFO "%s: qd6580: single IDE board\n",
|
||||
hwif->name);
|
||||
qd_setup(hwif, base, config | (control << 8),
|
||||
QD6580_DEF_DATA, QD6580_DEF_DATA2,
|
||||
&qd6580_tune_drive);
|
||||
QD6580_DEF_DATA, QD6580_DEF_DATA2);
|
||||
|
||||
hwif->set_pio_mode = &qd6580_set_pio_mode;
|
||||
|
||||
probe_hwif_init(hwif);
|
||||
|
||||
qd_write_reg(QD_DEF_CONTR,QD_CONTROL_PORT);
|
||||
|
||||
ide_proc_register_port(hwif);
|
||||
@@ -472,11 +470,19 @@ static int __init qd_probe(int base)
|
||||
hwif->name, mate->name);
|
||||
|
||||
qd_setup(hwif, base, config | (control << 8),
|
||||
QD6580_DEF_DATA, QD6580_DEF_DATA,
|
||||
&qd6580_tune_drive);
|
||||
QD6580_DEF_DATA, QD6580_DEF_DATA);
|
||||
|
||||
hwif->set_pio_mode = &qd6580_set_pio_mode;
|
||||
|
||||
probe_hwif_init(hwif);
|
||||
|
||||
qd_setup(mate, base, config | (control << 8),
|
||||
QD6580_DEF_DATA2, QD6580_DEF_DATA2,
|
||||
&qd6580_tune_drive);
|
||||
QD6580_DEF_DATA2, QD6580_DEF_DATA2);
|
||||
|
||||
mate->set_pio_mode = &qd6580_set_pio_mode;
|
||||
|
||||
probe_hwif_init(mate);
|
||||
|
||||
qd_write_reg(QD_DEF_CONTR,QD_CONTROL_PORT);
|
||||
|
||||
ide_proc_register_port(hwif);
|
||||
|
@@ -105,12 +105,11 @@ static void umc_set_speeds (u8 speeds[])
|
||||
speeds[0], speeds[1], speeds[2], speeds[3]);
|
||||
}
|
||||
|
||||
static void tune_umc (ide_drive_t *drive, u8 pio)
|
||||
static void umc_set_pio_mode(ide_drive_t *drive, const u8 pio)
|
||||
{
|
||||
unsigned long flags;
|
||||
ide_hwgroup_t *hwgroup = ide_hwifs[HWIF(drive)->index^1].hwgroup;
|
||||
|
||||
pio = ide_get_best_pio_mode(drive, pio, 4);
|
||||
printk("%s: setting umc8672 to PIO mode%d (speed %d)\n",
|
||||
drive->name, pio, pio_to_umc[pio]);
|
||||
spin_lock_irqsave(&ide_lock, flags);
|
||||
@@ -150,12 +149,12 @@ static int __init umc8672_probe(void)
|
||||
|
||||
hwif->chipset = ide_umc8672;
|
||||
hwif->pio_mask = ATA_PIO4;
|
||||
hwif->tuneproc = &tune_umc;
|
||||
hwif->set_pio_mode = &umc_set_pio_mode;
|
||||
hwif->mate = mate;
|
||||
|
||||
mate->chipset = ide_umc8672;
|
||||
mate->pio_mask = ATA_PIO4;
|
||||
mate->tuneproc = &tune_umc;
|
||||
mate->set_pio_mode = &umc_set_pio_mode;
|
||||
mate->mate = hwif;
|
||||
mate->channel = 1;
|
||||
|
||||
|
Reference in New Issue
Block a user