diff options
Diffstat (limited to 'drivers/ide/pci/pdc202xx_old.c')
-rw-r--r-- | drivers/ide/pci/pdc202xx_old.c | 126 |
1 files changed, 59 insertions, 67 deletions
diff --git a/drivers/ide/pci/pdc202xx_old.c b/drivers/ide/pci/pdc202xx_old.c index 150422ec3cfa..fca89eda5c02 100644 --- a/drivers/ide/pci/pdc202xx_old.c +++ b/drivers/ide/pci/pdc202xx_old.c | |||
@@ -115,7 +115,7 @@ static void pdc202xx_set_pio_mode(ide_drive_t *drive, const u8 pio) | |||
115 | pdc202xx_set_mode(drive, XFER_PIO_0 + pio); | 115 | pdc202xx_set_mode(drive, XFER_PIO_0 + pio); |
116 | } | 116 | } |
117 | 117 | ||
118 | static u8 __devinit pdc2026x_old_cable_detect(ide_hwif_t *hwif) | 118 | static u8 __devinit pdc2026x_cable_detect(ide_hwif_t *hwif) |
119 | { | 119 | { |
120 | struct pci_dev *dev = to_pci_dev(hwif->dev); | 120 | struct pci_dev *dev = to_pci_dev(hwif->dev); |
121 | u16 CIS, mask = hwif->channel ? (1 << 11) : (1 << 10); | 121 | u16 CIS, mask = hwif->channel ? (1 << 11) : (1 << 10); |
@@ -163,7 +163,7 @@ static void pdc202xx_quirkproc(ide_drive_t *drive) | |||
163 | drive->quirk_list = 0; | 163 | drive->quirk_list = 0; |
164 | } | 164 | } |
165 | 165 | ||
166 | static void pdc202xx_old_ide_dma_start(ide_drive_t *drive) | 166 | static void pdc202xx_dma_start(ide_drive_t *drive) |
167 | { | 167 | { |
168 | if (drive->current_speed > XFER_UDMA_2) | 168 | if (drive->current_speed > XFER_UDMA_2) |
169 | pdc_old_enable_66MHz_clock(drive->hwif); | 169 | pdc_old_enable_66MHz_clock(drive->hwif); |
@@ -185,7 +185,7 @@ static void pdc202xx_old_ide_dma_start(ide_drive_t *drive) | |||
185 | ide_dma_start(drive); | 185 | ide_dma_start(drive); |
186 | } | 186 | } |
187 | 187 | ||
188 | static int pdc202xx_old_ide_dma_end(ide_drive_t *drive) | 188 | static int pdc202xx_dma_end(ide_drive_t *drive) |
189 | { | 189 | { |
190 | if (drive->media != ide_disk || drive->addressing == 1) { | 190 | if (drive->media != ide_disk || drive->addressing == 1) { |
191 | ide_hwif_t *hwif = HWIF(drive); | 191 | ide_hwif_t *hwif = HWIF(drive); |
@@ -202,7 +202,7 @@ static int pdc202xx_old_ide_dma_end(ide_drive_t *drive) | |||
202 | return __ide_dma_end(drive); | 202 | return __ide_dma_end(drive); |
203 | } | 203 | } |
204 | 204 | ||
205 | static int pdc202xx_old_ide_dma_test_irq(ide_drive_t *drive) | 205 | static int pdc202xx_dma_test_irq(ide_drive_t *drive) |
206 | { | 206 | { |
207 | ide_hwif_t *hwif = HWIF(drive); | 207 | ide_hwif_t *hwif = HWIF(drive); |
208 | unsigned long high_16 = hwif->extra_base - 16; | 208 | unsigned long high_16 = hwif->extra_base - 16; |
@@ -226,26 +226,6 @@ somebody_else: | |||
226 | return (dma_stat & 4) == 4; /* return 1 if INTR asserted */ | 226 | return (dma_stat & 4) == 4; /* return 1 if INTR asserted */ |
227 | } | 227 | } |
228 | 228 | ||
229 | static void pdc202xx_dma_lost_irq(ide_drive_t *drive) | ||
230 | { | ||
231 | ide_hwif_t *hwif = HWIF(drive); | ||
232 | |||
233 | if (hwif->resetproc != NULL) | ||
234 | hwif->resetproc(drive); | ||
235 | |||
236 | ide_dma_lost_irq(drive); | ||
237 | } | ||
238 | |||
239 | static void pdc202xx_dma_timeout(ide_drive_t *drive) | ||
240 | { | ||
241 | ide_hwif_t *hwif = HWIF(drive); | ||
242 | |||
243 | if (hwif->resetproc != NULL) | ||
244 | hwif->resetproc(drive); | ||
245 | |||
246 | ide_dma_timeout(drive); | ||
247 | } | ||
248 | |||
249 | static void pdc202xx_reset_host (ide_hwif_t *hwif) | 229 | static void pdc202xx_reset_host (ide_hwif_t *hwif) |
250 | { | 230 | { |
251 | unsigned long high_16 = hwif->extra_base - 16; | 231 | unsigned long high_16 = hwif->extra_base - 16; |
@@ -271,68 +251,46 @@ static void pdc202xx_reset (ide_drive_t *drive) | |||
271 | ide_set_max_pio(drive); | 251 | ide_set_max_pio(drive); |
272 | } | 252 | } |
273 | 253 | ||
274 | static unsigned int __devinit init_chipset_pdc202xx(struct pci_dev *dev, | 254 | static void pdc202xx_dma_lost_irq(ide_drive_t *drive) |
275 | const char *name) | ||
276 | { | 255 | { |
277 | return dev->irq; | 256 | pdc202xx_reset(drive); |
257 | ide_dma_lost_irq(drive); | ||
278 | } | 258 | } |
279 | 259 | ||
280 | static void __devinit init_hwif_pdc202xx(ide_hwif_t *hwif) | 260 | static void pdc202xx_dma_timeout(ide_drive_t *drive) |
281 | { | 261 | { |
282 | struct pci_dev *dev = to_pci_dev(hwif->dev); | 262 | pdc202xx_reset(drive); |
283 | 263 | ide_dma_timeout(drive); | |
284 | hwif->set_pio_mode = &pdc202xx_set_pio_mode; | ||
285 | hwif->set_dma_mode = &pdc202xx_set_mode; | ||
286 | |||
287 | hwif->quirkproc = &pdc202xx_quirkproc; | ||
288 | |||
289 | if (dev->device != PCI_DEVICE_ID_PROMISE_20246) { | ||
290 | hwif->resetproc = &pdc202xx_reset; | ||
291 | |||
292 | hwif->cable_detect = pdc2026x_old_cable_detect; | ||
293 | } | ||
294 | |||
295 | if (hwif->dma_base == 0) | ||
296 | return; | ||
297 | |||
298 | hwif->dma_lost_irq = &pdc202xx_dma_lost_irq; | ||
299 | hwif->dma_timeout = &pdc202xx_dma_timeout; | ||
300 | |||
301 | if (dev->device != PCI_DEVICE_ID_PROMISE_20246) { | ||
302 | hwif->dma_start = &pdc202xx_old_ide_dma_start; | ||
303 | hwif->ide_dma_end = &pdc202xx_old_ide_dma_end; | ||
304 | } | ||
305 | hwif->ide_dma_test_irq = &pdc202xx_old_ide_dma_test_irq; | ||
306 | } | 264 | } |
307 | 265 | ||
308 | static void __devinit init_dma_pdc202xx(ide_hwif_t *hwif, unsigned long dmabase) | 266 | static unsigned int __devinit init_chipset_pdc202xx(struct pci_dev *dev, |
267 | const char *name) | ||
309 | { | 268 | { |
269 | unsigned long dmabase = pci_resource_start(dev, 4); | ||
310 | u8 udma_speed_flag = 0, primary_mode = 0, secondary_mode = 0; | 270 | u8 udma_speed_flag = 0, primary_mode = 0, secondary_mode = 0; |
311 | 271 | ||
312 | if (hwif->channel) { | 272 | if (dmabase == 0) |
313 | ide_setup_dma(hwif, dmabase); | 273 | goto out; |
314 | return; | ||
315 | } | ||
316 | 274 | ||
317 | udma_speed_flag = inb(dmabase | 0x1f); | 275 | udma_speed_flag = inb(dmabase | 0x1f); |
318 | primary_mode = inb(dmabase | 0x1a); | 276 | primary_mode = inb(dmabase | 0x1a); |
319 | secondary_mode = inb(dmabase | 0x1b); | 277 | secondary_mode = inb(dmabase | 0x1b); |
320 | printk(KERN_INFO "%s: (U)DMA Burst Bit %sABLED " \ | 278 | printk(KERN_INFO "%s: (U)DMA Burst Bit %sABLED " \ |
321 | "Primary %s Mode " \ | 279 | "Primary %s Mode " \ |
322 | "Secondary %s Mode.\n", hwif->cds->name, | 280 | "Secondary %s Mode.\n", pci_name(dev), |
323 | (udma_speed_flag & 1) ? "EN" : "DIS", | 281 | (udma_speed_flag & 1) ? "EN" : "DIS", |
324 | (primary_mode & 1) ? "MASTER" : "PCI", | 282 | (primary_mode & 1) ? "MASTER" : "PCI", |
325 | (secondary_mode & 1) ? "MASTER" : "PCI" ); | 283 | (secondary_mode & 1) ? "MASTER" : "PCI" ); |
326 | 284 | ||
327 | if (!(udma_speed_flag & 1)) { | 285 | if (!(udma_speed_flag & 1)) { |
328 | printk(KERN_INFO "%s: FORCING BURST BIT 0x%02x->0x%02x ", | 286 | printk(KERN_INFO "%s: FORCING BURST BIT 0x%02x->0x%02x ", |
329 | hwif->cds->name, udma_speed_flag, | 287 | pci_name(dev), udma_speed_flag, |
330 | (udma_speed_flag|1)); | 288 | (udma_speed_flag|1)); |
331 | outb(udma_speed_flag | 1, dmabase | 0x1f); | 289 | outb(udma_speed_flag | 1, dmabase | 0x1f); |
332 | printk("%sACTIVE\n", (inb(dmabase | 0x1f) & 1) ? "" : "IN"); | 290 | printk("%sACTIVE\n", (inb(dmabase | 0x1f) & 1) ? "" : "IN"); |
333 | } | 291 | } |
334 | 292 | out: | |
335 | ide_setup_dma(hwif, dmabase); | 293 | return dev->irq; |
336 | } | 294 | } |
337 | 295 | ||
338 | static void __devinit pdc202ata4_fixup_irq(struct pci_dev *dev, | 296 | static void __devinit pdc202ata4_fixup_irq(struct pci_dev *dev, |
@@ -357,13 +315,48 @@ static void __devinit pdc202ata4_fixup_irq(struct pci_dev *dev, | |||
357 | IDE_HFLAG_ABUSE_SET_DMA_MODE | \ | 315 | IDE_HFLAG_ABUSE_SET_DMA_MODE | \ |
358 | IDE_HFLAG_OFF_BOARD) | 316 | IDE_HFLAG_OFF_BOARD) |
359 | 317 | ||
318 | static const struct ide_port_ops pdc20246_port_ops = { | ||
319 | .set_pio_mode = pdc202xx_set_pio_mode, | ||
320 | .set_dma_mode = pdc202xx_set_mode, | ||
321 | .quirkproc = pdc202xx_quirkproc, | ||
322 | }; | ||
323 | |||
324 | static const struct ide_port_ops pdc2026x_port_ops = { | ||
325 | .set_pio_mode = pdc202xx_set_pio_mode, | ||
326 | .set_dma_mode = pdc202xx_set_mode, | ||
327 | .quirkproc = pdc202xx_quirkproc, | ||
328 | .resetproc = pdc202xx_reset, | ||
329 | .cable_detect = pdc2026x_cable_detect, | ||
330 | }; | ||
331 | |||
332 | static const struct ide_dma_ops pdc20246_dma_ops = { | ||
333 | .dma_host_set = ide_dma_host_set, | ||
334 | .dma_setup = ide_dma_setup, | ||
335 | .dma_exec_cmd = ide_dma_exec_cmd, | ||
336 | .dma_start = ide_dma_start, | ||
337 | .dma_end = __ide_dma_end, | ||
338 | .dma_test_irq = pdc202xx_dma_test_irq, | ||
339 | .dma_lost_irq = pdc202xx_dma_lost_irq, | ||
340 | .dma_timeout = pdc202xx_dma_timeout, | ||
341 | }; | ||
342 | |||
343 | static const struct ide_dma_ops pdc2026x_dma_ops = { | ||
344 | .dma_host_set = ide_dma_host_set, | ||
345 | .dma_setup = ide_dma_setup, | ||
346 | .dma_exec_cmd = ide_dma_exec_cmd, | ||
347 | .dma_start = pdc202xx_dma_start, | ||
348 | .dma_end = pdc202xx_dma_end, | ||
349 | .dma_test_irq = pdc202xx_dma_test_irq, | ||
350 | .dma_lost_irq = pdc202xx_dma_lost_irq, | ||
351 | .dma_timeout = pdc202xx_dma_timeout, | ||
352 | }; | ||
353 | |||
360 | #define DECLARE_PDC2026X_DEV(name_str, udma, extra_flags) \ | 354 | #define DECLARE_PDC2026X_DEV(name_str, udma, extra_flags) \ |
361 | { \ | 355 | { \ |
362 | .name = name_str, \ | 356 | .name = name_str, \ |
363 | .init_chipset = init_chipset_pdc202xx, \ | 357 | .init_chipset = init_chipset_pdc202xx, \ |
364 | .init_hwif = init_hwif_pdc202xx, \ | 358 | .port_ops = &pdc2026x_port_ops, \ |
365 | .init_dma = init_dma_pdc202xx, \ | 359 | .dma_ops = &pdc2026x_dma_ops, \ |
366 | .extra = 48, \ | ||
367 | .host_flags = IDE_HFLAGS_PDC202XX | extra_flags, \ | 360 | .host_flags = IDE_HFLAGS_PDC202XX | extra_flags, \ |
368 | .pio_mask = ATA_PIO4, \ | 361 | .pio_mask = ATA_PIO4, \ |
369 | .mwdma_mask = ATA_MWDMA2, \ | 362 | .mwdma_mask = ATA_MWDMA2, \ |
@@ -374,9 +367,8 @@ static const struct ide_port_info pdc202xx_chipsets[] __devinitdata = { | |||
374 | { /* 0 */ | 367 | { /* 0 */ |
375 | .name = "PDC20246", | 368 | .name = "PDC20246", |
376 | .init_chipset = init_chipset_pdc202xx, | 369 | .init_chipset = init_chipset_pdc202xx, |
377 | .init_hwif = init_hwif_pdc202xx, | 370 | .port_ops = &pdc20246_port_ops, |
378 | .init_dma = init_dma_pdc202xx, | 371 | .dma_ops = &pdc20246_dma_ops, |
379 | .extra = 16, | ||
380 | .host_flags = IDE_HFLAGS_PDC202XX, | 372 | .host_flags = IDE_HFLAGS_PDC202XX, |
381 | .pio_mask = ATA_PIO4, | 373 | .pio_mask = ATA_PIO4, |
382 | .mwdma_mask = ATA_MWDMA2, | 374 | .mwdma_mask = ATA_MWDMA2, |