diff options
author | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2009-06-15 12:52:53 -0400 |
---|---|---|
committer | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2009-06-15 12:52:53 -0400 |
commit | c9ef59ff01b6bd1c7360a64fcc8556a1193c2ed0 (patch) | |
tree | 5bd24f0d0f720ab29f9a5b5a2156a620e2ff2113 /drivers/ide | |
parent | 6dae44f9a55f13765c877687602cd2bf1a057cfd (diff) |
ide: IORDY handling fixes
Add ide_pio_need_iordy() helper and convert host drivers to use it.
This fixes it8172, it8213, pdc202xx_old, piix, slc90e66 and siimage
host drivers to handle IORDY correctly.
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Diffstat (limited to 'drivers/ide')
-rw-r--r-- | drivers/ide/at91_ide.c | 3 | ||||
-rw-r--r-- | drivers/ide/ide-xfer-mode.c | 6 | ||||
-rw-r--r-- | drivers/ide/it8172.c | 2 | ||||
-rw-r--r-- | drivers/ide/it8213.c | 2 | ||||
-rw-r--r-- | drivers/ide/pdc202xx_old.c | 2 | ||||
-rw-r--r-- | drivers/ide/piix.c | 2 | ||||
-rw-r--r-- | drivers/ide/siimage.c | 15 | ||||
-rw-r--r-- | drivers/ide/sl82c105.c | 3 | ||||
-rw-r--r-- | drivers/ide/slc90e66.c | 2 |
9 files changed, 21 insertions, 16 deletions
diff --git a/drivers/ide/at91_ide.c b/drivers/ide/at91_ide.c index fc0949a8cfde..dbfeda42b940 100644 --- a/drivers/ide/at91_ide.c +++ b/drivers/ide/at91_ide.c | |||
@@ -185,8 +185,7 @@ static void at91_ide_set_pio_mode(ide_drive_t *drive, const u8 pio) | |||
185 | timing = ide_timing_find_mode(XFER_PIO_0 + pio); | 185 | timing = ide_timing_find_mode(XFER_PIO_0 + pio); |
186 | BUG_ON(!timing); | 186 | BUG_ON(!timing); |
187 | 187 | ||
188 | if ((pio > 2 || ata_id_has_iordy(drive->id)) && | 188 | if (ide_pio_need_iordy(drive, pio)) |
189 | !(ata_id_is_cfa(drive->id) && pio > 4)) | ||
190 | use_iordy = 1; | 189 | use_iordy = 1; |
191 | 190 | ||
192 | apply_timings(chipselect, pio, timing, use_iordy); | 191 | apply_timings(chipselect, pio, timing, use_iordy); |
diff --git a/drivers/ide/ide-xfer-mode.c b/drivers/ide/ide-xfer-mode.c index af44be9d546c..0b47ca139079 100644 --- a/drivers/ide/ide-xfer-mode.c +++ b/drivers/ide/ide-xfer-mode.c | |||
@@ -107,6 +107,12 @@ u8 ide_get_best_pio_mode(ide_drive_t *drive, u8 mode_wanted, u8 max_mode) | |||
107 | } | 107 | } |
108 | EXPORT_SYMBOL_GPL(ide_get_best_pio_mode); | 108 | EXPORT_SYMBOL_GPL(ide_get_best_pio_mode); |
109 | 109 | ||
110 | int ide_pio_need_iordy(ide_drive_t *drive, const u8 pio) | ||
111 | { | ||
112 | return ata_id_pio_need_iordy(drive->id, pio); | ||
113 | } | ||
114 | EXPORT_SYMBOL_GPL(ide_pio_need_iordy); | ||
115 | |||
110 | int ide_set_pio_mode(ide_drive_t *drive, const u8 mode) | 116 | int ide_set_pio_mode(ide_drive_t *drive, const u8 mode) |
111 | { | 117 | { |
112 | ide_hwif_t *hwif = drive->hwif; | 118 | ide_hwif_t *hwif = drive->hwif; |
diff --git a/drivers/ide/it8172.c b/drivers/ide/it8172.c index e021078cd06b..0d266a5b524d 100644 --- a/drivers/ide/it8172.c +++ b/drivers/ide/it8172.c | |||
@@ -66,7 +66,7 @@ static void it8172_set_pio_mode(ide_drive_t *drive, const u8 pio) | |||
66 | if (drive->media == ide_disk) | 66 | if (drive->media == ide_disk) |
67 | /* enable prefetch */ | 67 | /* enable prefetch */ |
68 | drive_enables |= 0x0004 << (drive->dn * 4); | 68 | drive_enables |= 0x0004 << (drive->dn * 4); |
69 | if (ata_id_has_iordy(drive->id)) | 69 | if (ide_pio_need_iordy(drive, pio)) |
70 | /* enable IORDY sample-point */ | 70 | /* enable IORDY sample-point */ |
71 | drive_enables |= 0x0002 << (drive->dn * 4); | 71 | drive_enables |= 0x0002 << (drive->dn * 4); |
72 | 72 | ||
diff --git a/drivers/ide/it8213.c b/drivers/ide/it8213.c index d7969b6d139e..47976167796a 100644 --- a/drivers/ide/it8213.c +++ b/drivers/ide/it8213.c | |||
@@ -50,7 +50,7 @@ static void it8213_set_pio_mode(ide_drive_t *drive, const u8 pio) | |||
50 | control |= 1; /* Programmable timing on */ | 50 | control |= 1; /* Programmable timing on */ |
51 | if (drive->media != ide_disk) | 51 | if (drive->media != ide_disk) |
52 | control |= 4; /* ATAPI */ | 52 | control |= 4; /* ATAPI */ |
53 | if (pio > 2) | 53 | if (ide_pio_need_iordy(drive, pio)) |
54 | control |= 2; /* IORDY */ | 54 | control |= 2; /* IORDY */ |
55 | if (is_slave) { | 55 | if (is_slave) { |
56 | master_data |= 0x4000; | 56 | master_data |= 0x4000; |
diff --git a/drivers/ide/pdc202xx_old.c b/drivers/ide/pdc202xx_old.c index b6abf7e52cac..4f5b536282af 100644 --- a/drivers/ide/pdc202xx_old.c +++ b/drivers/ide/pdc202xx_old.c | |||
@@ -73,7 +73,7 @@ static void pdc202xx_set_mode(ide_drive_t *drive, const u8 speed) | |||
73 | * Prefetch_EN / IORDY_EN / PA[3:0] bits of register A | 73 | * Prefetch_EN / IORDY_EN / PA[3:0] bits of register A |
74 | */ | 74 | */ |
75 | AP &= ~0x3f; | 75 | AP &= ~0x3f; |
76 | if (ata_id_iordy_disable(drive->id)) | 76 | if (ide_pio_need_iordy(drive, speed - XFER_PIO_0)) |
77 | AP |= 0x20; /* set IORDY_EN bit */ | 77 | AP |= 0x20; /* set IORDY_EN bit */ |
78 | if (drive->media == ide_disk) | 78 | if (drive->media == ide_disk) |
79 | AP |= 0x10; /* set Prefetch_EN bit */ | 79 | AP |= 0x10; /* set Prefetch_EN bit */ |
diff --git a/drivers/ide/piix.c b/drivers/ide/piix.c index 69860dea3820..bf14f39bd3a7 100644 --- a/drivers/ide/piix.c +++ b/drivers/ide/piix.c | |||
@@ -98,7 +98,7 @@ static void piix_set_pio_mode(ide_drive_t *drive, const u8 pio) | |||
98 | control |= 1; /* Programmable timing on */ | 98 | control |= 1; /* Programmable timing on */ |
99 | if (drive->media == ide_disk) | 99 | if (drive->media == ide_disk) |
100 | control |= 4; /* Prefetch, post write */ | 100 | control |= 4; /* Prefetch, post write */ |
101 | if (pio > 2) | 101 | if (ide_pio_need_iordy(drive, pio)) |
102 | control |= 2; /* IORDY */ | 102 | control |= 2; /* IORDY */ |
103 | if (is_slave) { | 103 | if (is_slave) { |
104 | master_data |= 0x4000; | 104 | master_data |= 0x4000; |
diff --git a/drivers/ide/siimage.c b/drivers/ide/siimage.c index bd82d228608c..6a643fdf0e6e 100644 --- a/drivers/ide/siimage.c +++ b/drivers/ide/siimage.c | |||
@@ -32,7 +32,6 @@ | |||
32 | * smarter code in libata. | 32 | * smarter code in libata. |
33 | * | 33 | * |
34 | * TODO: | 34 | * TODO: |
35 | * - IORDY fixes | ||
36 | * - VDMA support | 35 | * - VDMA support |
37 | */ | 36 | */ |
38 | 37 | ||
@@ -234,8 +233,7 @@ static u8 sil_sata_udma_filter(ide_drive_t *drive) | |||
234 | * @pio: PIO mode number | 233 | * @pio: PIO mode number |
235 | * | 234 | * |
236 | * Load the timing settings for this device mode into the | 235 | * Load the timing settings for this device mode into the |
237 | * controller. If we are in PIO mode 3 or 4 turn on IORDY | 236 | * controller. |
238 | * monitoring (bit 9). The TF timing is bits 31:16 | ||
239 | */ | 237 | */ |
240 | 238 | ||
241 | static void sil_set_pio_mode(ide_drive_t *drive, u8 pio) | 239 | static void sil_set_pio_mode(ide_drive_t *drive, u8 pio) |
@@ -276,13 +274,16 @@ static void sil_set_pio_mode(ide_drive_t *drive, u8 pio) | |||
276 | /* now set up IORDY */ | 274 | /* now set up IORDY */ |
277 | speedp = sil_ioread16(dev, tfaddr - 2); | 275 | speedp = sil_ioread16(dev, tfaddr - 2); |
278 | speedp &= ~0x200; | 276 | speedp &= ~0x200; |
279 | if (pio > 2) | ||
280 | speedp |= 0x200; | ||
281 | sil_iowrite16(dev, speedp, tfaddr - 2); | ||
282 | 277 | ||
283 | mode = sil_ioread8(dev, base + addr_mask); | 278 | mode = sil_ioread8(dev, base + addr_mask); |
284 | mode &= ~(unit ? 0x30 : 0x03); | 279 | mode &= ~(unit ? 0x30 : 0x03); |
285 | mode |= unit ? 0x10 : 0x01; | 280 | |
281 | if (ide_pio_need_iordy(drive, pio)) { | ||
282 | speedp |= 0x200; | ||
283 | mode |= unit ? 0x10 : 0x01; | ||
284 | } | ||
285 | |||
286 | sil_iowrite16(dev, speedp, tfaddr - 2); | ||
286 | sil_iowrite8(dev, mode, base + addr_mask); | 287 | sil_iowrite8(dev, mode, base + addr_mask); |
287 | } | 288 | } |
288 | 289 | ||
diff --git a/drivers/ide/sl82c105.c b/drivers/ide/sl82c105.c index 0924abff52ff..88ac47085cd9 100644 --- a/drivers/ide/sl82c105.c +++ b/drivers/ide/sl82c105.c | |||
@@ -61,8 +61,7 @@ static unsigned int get_pio_timings(ide_drive_t *drive, u8 pio) | |||
61 | if (cmd_off == 0) | 61 | if (cmd_off == 0) |
62 | cmd_off = 1; | 62 | cmd_off = 1; |
63 | 63 | ||
64 | if ((pio > 2 || ata_id_has_iordy(drive->id)) && | 64 | if (ide_pio_need_iordy(drive, pio)) |
65 | !(pio > 4 && ata_id_is_cfa(drive->id))) | ||
66 | iordy = 0x40; | 65 | iordy = 0x40; |
67 | 66 | ||
68 | return (cmd_on - 1) << 8 | (cmd_off - 1) | iordy; | 67 | return (cmd_on - 1) << 8 | (cmd_off - 1) | iordy; |
diff --git a/drivers/ide/slc90e66.c b/drivers/ide/slc90e66.c index f55d7d6313e8..9aec78d3bcff 100644 --- a/drivers/ide/slc90e66.c +++ b/drivers/ide/slc90e66.c | |||
@@ -44,7 +44,7 @@ static void slc90e66_set_pio_mode(ide_drive_t *drive, const u8 pio) | |||
44 | control |= 1; /* Programmable timing on */ | 44 | control |= 1; /* Programmable timing on */ |
45 | if (drive->media == ide_disk) | 45 | if (drive->media == ide_disk) |
46 | control |= 4; /* Prefetch, post write */ | 46 | control |= 4; /* Prefetch, post write */ |
47 | if (pio > 2) | 47 | if (ide_pio_need_iordy(drive, pio)) |
48 | control |= 2; /* IORDY */ | 48 | control |= 2; /* IORDY */ |
49 | if (is_slave) { | 49 | if (is_slave) { |
50 | master_data |= 0x4000; | 50 | master_data |= 0x4000; |