ide: add ide_set{_max}_pio() (take 4)
[deliverable/linux.git] / drivers / ide / pci / cmd640.c
index 9689494efa24a8673ba39aedb6b9c0bcb8916ad1..f369645e4d1645ce91651df6742c78302fc3752b 100644 (file)
@@ -628,45 +628,40 @@ static void cmd640_set_mode (unsigned int index, u8 pio_mode, unsigned int cycle
        program_drive_counts (index);
 }
 
-/*
- * Drive PIO mode selection:
- */
-static void cmd640_tune_drive (ide_drive_t *drive, u8 mode_wanted)
+static void cmd640_set_pio_mode(ide_drive_t *drive, const u8 pio)
 {
        unsigned int index = 0, cycle_time;
        u8 b;
 
        while (drive != cmd_drives[index]) {
                if (++index > 3) {
-                       printk("%s: bad news in cmd640_tune_drive\n", drive->name);
+                       printk(KERN_ERR "%s: bad news in %s\n",
+                                       drive->name, __FUNCTION__);
                        return;
                }
        }
-       switch (mode_wanted) {
+       switch (pio) {
                case 6: /* set fast-devsel off */
                case 7: /* set fast-devsel on */
-                       mode_wanted &= 1;
                        b = get_cmd640_reg(CNTRL) & ~0x27;
-                       if (mode_wanted)
+                       if (pio & 1)
                                b |= 0x27;
                        put_cmd640_reg(CNTRL, b);
-                       printk("%s: %sabled cmd640 fast host timing (devsel)\n", drive->name, mode_wanted ? "en" : "dis");
+                       printk("%s: %sabled cmd640 fast host timing (devsel)\n", drive->name, (pio & 1) ? "en" : "dis");
                        return;
 
                case 8: /* set prefetch off */
                case 9: /* set prefetch on */
-                       mode_wanted &= 1;
-                       set_prefetch_mode(index, mode_wanted);
-                       printk("%s: %sabled cmd640 prefetch\n", drive->name, mode_wanted ? "en" : "dis");
+                       set_prefetch_mode(index, pio & 1);
+                       printk("%s: %sabled cmd640 prefetch\n", drive->name, (pio & 1) ? "en" : "dis");
                        return;
        }
 
-       mode_wanted = ide_get_best_pio_mode(drive, mode_wanted, 5);
-       cycle_time = ide_pio_cycle_time(drive, mode_wanted);
-       cmd640_set_mode(index, mode_wanted, cycle_time);
+       cycle_time = ide_pio_cycle_time(drive, pio);
+       cmd640_set_mode(index, pio, cycle_time);
 
        printk("%s: selected cmd640 PIO mode%d (%dns)",
-               drive->name, mode_wanted, cycle_time);
+               drive->name, pio, cycle_time);
 
        display_clocks(index);
 }
@@ -766,8 +761,10 @@ int __init ide_probe_for_cmd640x (void)
               cmd_hwif0->name, 'a' + cmd640_chip_version - 1, bus_type, cfr);
        cmd_hwif0->chipset = ide_cmd640;
 #ifdef CONFIG_BLK_DEV_CMD640_ENHANCED
+       cmd_hwif0->host_flags = IDE_HFLAG_ABUSE_PREFETCH |
+                               IDE_HFLAG_ABUSE_FAST_DEVSEL;
        cmd_hwif0->pio_mask = ATA_PIO5;
-       cmd_hwif0->tuneproc = &cmd640_tune_drive;
+       cmd_hwif0->set_pio_mode = &cmd640_set_pio_mode;
 #endif /* CONFIG_BLK_DEV_CMD640_ENHANCED */
 
        /*
@@ -822,8 +819,10 @@ int __init ide_probe_for_cmd640x (void)
                cmd_hwif1->mate = cmd_hwif0;
                cmd_hwif1->channel = 1;
 #ifdef CONFIG_BLK_DEV_CMD640_ENHANCED
+               cmd_hwif1->host_flags = IDE_HFLAG_ABUSE_PREFETCH |
+                                       IDE_HFLAG_ABUSE_FAST_DEVSEL;
                cmd_hwif1->pio_mask = ATA_PIO5;
-               cmd_hwif1->tuneproc = &cmd640_tune_drive;
+               cmd_hwif1->set_pio_mode = &cmd640_set_pio_mode;
 #endif /* CONFIG_BLK_DEV_CMD640_ENHANCED */
        }
        printk(KERN_INFO "%s: %sserialized, secondary interface %s\n", cmd_hwif1->name,
This page took 0.029564 seconds and 5 git commands to generate.