diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-12 12:29:42 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-12 12:29:42 -0400 |
commit | d614aec4752f8c61b2e7cb77806b6bd59aa50836 (patch) | |
tree | 3b0cfb3085c43415931dbf18666d582fb8ae3c75 /drivers/ide/pdc202xx_old.c | |
parent | db8e7f10ed67933ca272f4030eb7057b7f13de07 (diff) | |
parent | ad7c52d0988a8965989dc06d630c52a5bde849d5 (diff) |
Merge branch 'for-2.6.31' of git://git.kernel.org/pub/scm/linux/kernel/git/bart/ide-2.6
* 'for-2.6.31' of git://git.kernel.org/pub/scm/linux/kernel/git/bart/ide-2.6: (29 commits)
ide: re-implement ide_pci_init_one() on top of ide_pci_init_two()
ide: unexport ide_find_dma_mode()
ide: fix PowerMac bootup oops
ide: skip probe if there are no devices on the port (v2)
sl82c105: add printk() logging facility
ide-tape: fix proc warning
ide: add IDE_DFLAG_NIEN_QUIRK device flag
ide: respect quirk_drives[] list on all controllers
hpt366: enable all quirks for devices on quirk_drives[] list
hpt366: sync quirk_drives[] list with pdc202xx_{new,old}.c
ide: remove superfluous SELECT_MASK() call from do_rw_taskfile()
ide: remove superfluous SELECT_MASK() call from ide_driveid_update()
icside: remove superfluous ->maskproc method
ide-tape: fix IDE_AFLAG_* atomic accesses
ide-tape: change IDE_AFLAG_IGNORE_DSC non-atomically
pdc202xx_old: kill resetproc() method
pdc202xx_old: don't call pdc202xx_reset() on IRQ timeout
pdc202xx_old: use ide_dma_test_irq()
ide: preserve Host Protected Area by default (v2)
ide-gd: implement block device ->set_capacity method (v2)
...
Diffstat (limited to 'drivers/ide/pdc202xx_old.c')
-rw-r--r-- | drivers/ide/pdc202xx_old.c | 92 |
1 files changed, 3 insertions, 89 deletions
diff --git a/drivers/ide/pdc202xx_old.c b/drivers/ide/pdc202xx_old.c index e24ecc87a9b1..b6abf7e52cac 100644 --- a/drivers/ide/pdc202xx_old.c +++ b/drivers/ide/pdc202xx_old.c | |||
@@ -23,18 +23,6 @@ | |||
23 | 23 | ||
24 | #define PDC202XX_DEBUG_DRIVE_INFO 0 | 24 | #define PDC202XX_DEBUG_DRIVE_INFO 0 |
25 | 25 | ||
26 | static const char *pdc_quirk_drives[] = { | ||
27 | "QUANTUM FIREBALLlct08 08", | ||
28 | "QUANTUM FIREBALLP KA6.4", | ||
29 | "QUANTUM FIREBALLP KA9.1", | ||
30 | "QUANTUM FIREBALLP LM20.4", | ||
31 | "QUANTUM FIREBALLP KX13.6", | ||
32 | "QUANTUM FIREBALLP KX20.5", | ||
33 | "QUANTUM FIREBALLP KX27.3", | ||
34 | "QUANTUM FIREBALLP LM20.5", | ||
35 | NULL | ||
36 | }; | ||
37 | |||
38 | static void pdc_old_disable_66MHz_clock(ide_hwif_t *); | 26 | static void pdc_old_disable_66MHz_clock(ide_hwif_t *); |
39 | 27 | ||
40 | static void pdc202xx_set_mode(ide_drive_t *drive, const u8 speed) | 28 | static void pdc202xx_set_mode(ide_drive_t *drive, const u8 speed) |
@@ -151,19 +139,6 @@ static void pdc_old_disable_66MHz_clock(ide_hwif_t *hwif) | |||
151 | outb(clock & ~(hwif->channel ? 0x08 : 0x02), clock_reg); | 139 | outb(clock & ~(hwif->channel ? 0x08 : 0x02), clock_reg); |
152 | } | 140 | } |
153 | 141 | ||
154 | static void pdc202xx_quirkproc(ide_drive_t *drive) | ||
155 | { | ||
156 | const char **list, *m = (char *)&drive->id[ATA_ID_PROD]; | ||
157 | |||
158 | for (list = pdc_quirk_drives; *list != NULL; list++) | ||
159 | if (strstr(m, *list) != NULL) { | ||
160 | drive->quirk_list = 2; | ||
161 | return; | ||
162 | } | ||
163 | |||
164 | drive->quirk_list = 0; | ||
165 | } | ||
166 | |||
167 | static void pdc202xx_dma_start(ide_drive_t *drive) | 142 | static void pdc202xx_dma_start(ide_drive_t *drive) |
168 | { | 143 | { |
169 | if (drive->current_speed > XFER_UDMA_2) | 144 | if (drive->current_speed > XFER_UDMA_2) |
@@ -203,52 +178,6 @@ static int pdc202xx_dma_end(ide_drive_t *drive) | |||
203 | return ide_dma_end(drive); | 178 | return ide_dma_end(drive); |
204 | } | 179 | } |
205 | 180 | ||
206 | static int pdc202xx_dma_test_irq(ide_drive_t *drive) | ||
207 | { | ||
208 | ide_hwif_t *hwif = drive->hwif; | ||
209 | unsigned long high_16 = hwif->extra_base - 16; | ||
210 | u8 dma_stat = inb(hwif->dma_base + ATA_DMA_STATUS); | ||
211 | u8 sc1d = inb(high_16 + 0x001d); | ||
212 | |||
213 | if (hwif->channel) { | ||
214 | /* bit7: Error, bit6: Interrupting, bit5: FIFO Full, bit4: FIFO Empty */ | ||
215 | if ((sc1d & 0x50) == 0x50) | ||
216 | goto somebody_else; | ||
217 | else if ((sc1d & 0x40) == 0x40) | ||
218 | return (dma_stat & 4) == 4; | ||
219 | } else { | ||
220 | /* bit3: Error, bit2: Interrupting, bit1: FIFO Full, bit0: FIFO Empty */ | ||
221 | if ((sc1d & 0x05) == 0x05) | ||
222 | goto somebody_else; | ||
223 | else if ((sc1d & 0x04) == 0x04) | ||
224 | return (dma_stat & 4) == 4; | ||
225 | } | ||
226 | somebody_else: | ||
227 | return (dma_stat & 4) == 4; /* return 1 if INTR asserted */ | ||
228 | } | ||
229 | |||
230 | static void pdc202xx_reset(ide_drive_t *drive) | ||
231 | { | ||
232 | ide_hwif_t *hwif = drive->hwif; | ||
233 | unsigned long high_16 = hwif->extra_base - 16; | ||
234 | u8 udma_speed_flag = inb(high_16 | 0x001f); | ||
235 | |||
236 | printk(KERN_WARNING "PDC202xx: software reset...\n"); | ||
237 | |||
238 | outb(udma_speed_flag | 0x10, high_16 | 0x001f); | ||
239 | mdelay(100); | ||
240 | outb(udma_speed_flag & ~0x10, high_16 | 0x001f); | ||
241 | mdelay(2000); /* 2 seconds ?! */ | ||
242 | |||
243 | ide_set_max_pio(drive); | ||
244 | } | ||
245 | |||
246 | static void pdc202xx_dma_lost_irq(ide_drive_t *drive) | ||
247 | { | ||
248 | pdc202xx_reset(drive); | ||
249 | ide_dma_lost_irq(drive); | ||
250 | } | ||
251 | |||
252 | static int init_chipset_pdc202xx(struct pci_dev *dev) | 181 | static int init_chipset_pdc202xx(struct pci_dev *dev) |
253 | { | 182 | { |
254 | unsigned long dmabase = pci_resource_start(dev, 4); | 183 | unsigned long dmabase = pci_resource_start(dev, 4); |
@@ -302,37 +231,22 @@ static void __devinit pdc202ata4_fixup_irq(struct pci_dev *dev, | |||
302 | static const struct ide_port_ops pdc20246_port_ops = { | 231 | static const struct ide_port_ops pdc20246_port_ops = { |
303 | .set_pio_mode = pdc202xx_set_pio_mode, | 232 | .set_pio_mode = pdc202xx_set_pio_mode, |
304 | .set_dma_mode = pdc202xx_set_mode, | 233 | .set_dma_mode = pdc202xx_set_mode, |
305 | .quirkproc = pdc202xx_quirkproc, | ||
306 | }; | 234 | }; |
307 | 235 | ||
308 | static const struct ide_port_ops pdc2026x_port_ops = { | 236 | static const struct ide_port_ops pdc2026x_port_ops = { |
309 | .set_pio_mode = pdc202xx_set_pio_mode, | 237 | .set_pio_mode = pdc202xx_set_pio_mode, |
310 | .set_dma_mode = pdc202xx_set_mode, | 238 | .set_dma_mode = pdc202xx_set_mode, |
311 | .quirkproc = pdc202xx_quirkproc, | ||
312 | .resetproc = pdc202xx_reset, | ||
313 | .cable_detect = pdc2026x_cable_detect, | 239 | .cable_detect = pdc2026x_cable_detect, |
314 | }; | 240 | }; |
315 | 241 | ||
316 | static const struct ide_dma_ops pdc20246_dma_ops = { | ||
317 | .dma_host_set = ide_dma_host_set, | ||
318 | .dma_setup = ide_dma_setup, | ||
319 | .dma_start = ide_dma_start, | ||
320 | .dma_end = ide_dma_end, | ||
321 | .dma_test_irq = pdc202xx_dma_test_irq, | ||
322 | .dma_lost_irq = ide_dma_lost_irq, | ||
323 | .dma_timer_expiry = ide_dma_sff_timer_expiry, | ||
324 | .dma_sff_read_status = ide_dma_sff_read_status, | ||
325 | }; | ||
326 | |||
327 | static const struct ide_dma_ops pdc2026x_dma_ops = { | 242 | static const struct ide_dma_ops pdc2026x_dma_ops = { |
328 | .dma_host_set = ide_dma_host_set, | 243 | .dma_host_set = ide_dma_host_set, |
329 | .dma_setup = ide_dma_setup, | 244 | .dma_setup = ide_dma_setup, |
330 | .dma_start = pdc202xx_dma_start, | 245 | .dma_start = pdc202xx_dma_start, |
331 | .dma_end = pdc202xx_dma_end, | 246 | .dma_end = pdc202xx_dma_end, |
332 | .dma_test_irq = pdc202xx_dma_test_irq, | 247 | .dma_test_irq = ide_dma_test_irq, |
333 | .dma_lost_irq = pdc202xx_dma_lost_irq, | 248 | .dma_lost_irq = ide_dma_lost_irq, |
334 | .dma_timer_expiry = ide_dma_sff_timer_expiry, | 249 | .dma_timer_expiry = ide_dma_sff_timer_expiry, |
335 | .dma_clear = pdc202xx_reset, | ||
336 | .dma_sff_read_status = ide_dma_sff_read_status, | 250 | .dma_sff_read_status = ide_dma_sff_read_status, |
337 | }; | 251 | }; |
338 | 252 | ||
@@ -354,7 +268,7 @@ static const struct ide_port_info pdc202xx_chipsets[] __devinitdata = { | |||
354 | .name = DRV_NAME, | 268 | .name = DRV_NAME, |
355 | .init_chipset = init_chipset_pdc202xx, | 269 | .init_chipset = init_chipset_pdc202xx, |
356 | .port_ops = &pdc20246_port_ops, | 270 | .port_ops = &pdc20246_port_ops, |
357 | .dma_ops = &pdc20246_dma_ops, | 271 | .dma_ops = &sff_dma_ops, |
358 | .host_flags = IDE_HFLAGS_PDC202XX, | 272 | .host_flags = IDE_HFLAGS_PDC202XX, |
359 | .pio_mask = ATA_PIO4, | 273 | .pio_mask = ATA_PIO4, |
360 | .mwdma_mask = ATA_MWDMA2, | 274 | .mwdma_mask = ATA_MWDMA2, |