diff options
| -rw-r--r-- | drivers/ide/ide-probe.c | 1 | ||||
| -rw-r--r-- | drivers/ide/pci/alim15x3.c | 12 | ||||
| -rw-r--r-- | drivers/ide/pci/hpt366.c | 12 | ||||
| -rw-r--r-- | drivers/ide/setup-pci.c | 35 | ||||
| -rw-r--r-- | include/linux/ide.h | 1 |
5 files changed, 43 insertions, 18 deletions
diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c index 9d8686a49fcf..ec5f58c6f19a 100644 --- a/drivers/ide/ide-probe.c +++ b/drivers/ide/ide-probe.c | |||
| @@ -1363,6 +1363,7 @@ static void ide_init_port(ide_hwif_t *hwif, unsigned int port, | |||
| 1363 | 1363 | ||
| 1364 | if (rc < 0) { | 1364 | if (rc < 0) { |
| 1365 | printk(KERN_INFO "%s: DMA disabled\n", hwif->name); | 1365 | printk(KERN_INFO "%s: DMA disabled\n", hwif->name); |
| 1366 | hwif->dma_base = 0; | ||
| 1366 | hwif->swdma_mask = 0; | 1367 | hwif->swdma_mask = 0; |
| 1367 | hwif->mwdma_mask = 0; | 1368 | hwif->mwdma_mask = 0; |
| 1368 | hwif->ultra_mask = 0; | 1369 | hwif->ultra_mask = 0; |
diff --git a/drivers/ide/pci/alim15x3.c b/drivers/ide/pci/alim15x3.c index 8015f6f65488..5ef7817ac64f 100644 --- a/drivers/ide/pci/alim15x3.c +++ b/drivers/ide/pci/alim15x3.c | |||
| @@ -471,7 +471,15 @@ static int __devinit init_dma_ali15x3(ide_hwif_t *hwif, | |||
| 471 | struct pci_dev *dev = to_pci_dev(hwif->dev); | 471 | struct pci_dev *dev = to_pci_dev(hwif->dev); |
| 472 | unsigned long base = ide_pci_dma_base(hwif, d); | 472 | unsigned long base = ide_pci_dma_base(hwif, d); |
| 473 | 473 | ||
| 474 | if (base == 0 || ide_pci_set_master(dev, d->name) < 0) | 474 | if (base == 0) |
| 475 | return -1; | ||
| 476 | |||
| 477 | hwif->dma_base = base; | ||
| 478 | |||
| 479 | if (ide_pci_check_simplex(hwif, d) < 0) | ||
| 480 | return -1; | ||
| 481 | |||
| 482 | if (ide_pci_set_master(dev, d->name) < 0) | ||
| 475 | return -1; | 483 | return -1; |
| 476 | 484 | ||
| 477 | if (!hwif->channel) | 485 | if (!hwif->channel) |
| @@ -483,8 +491,6 @@ static int __devinit init_dma_ali15x3(ide_hwif_t *hwif, | |||
| 483 | if (ide_allocate_dma_engine(hwif)) | 491 | if (ide_allocate_dma_engine(hwif)) |
| 484 | return -1; | 492 | return -1; |
| 485 | 493 | ||
| 486 | hwif->dma_base = base; | ||
| 487 | |||
| 488 | hwif->dma_ops = &sff_dma_ops; | 494 | hwif->dma_ops = &sff_dma_ops; |
| 489 | 495 | ||
| 490 | return 0; | 496 | return 0; |
diff --git a/drivers/ide/pci/hpt366.c b/drivers/ide/pci/hpt366.c index 201e5ddae921..e5651cefa395 100644 --- a/drivers/ide/pci/hpt366.c +++ b/drivers/ide/pci/hpt366.c | |||
| @@ -1320,7 +1320,15 @@ static int __devinit init_dma_hpt366(ide_hwif_t *hwif, | |||
| 1320 | unsigned long flags, base = ide_pci_dma_base(hwif, d); | 1320 | unsigned long flags, base = ide_pci_dma_base(hwif, d); |
| 1321 | u8 dma_old, dma_new, masterdma = 0, slavedma = 0; | 1321 | u8 dma_old, dma_new, masterdma = 0, slavedma = 0; |
| 1322 | 1322 | ||
| 1323 | if (base == 0 || ide_pci_set_master(dev, d->name) < 0) | 1323 | if (base == 0) |
| 1324 | return -1; | ||
| 1325 | |||
| 1326 | hwif->dma_base = base; | ||
| 1327 | |||
| 1328 | if (ide_pci_check_simplex(hwif, d) < 0) | ||
| 1329 | return -1; | ||
| 1330 | |||
| 1331 | if (ide_pci_set_master(dev, d->name) < 0) | ||
| 1324 | return -1; | 1332 | return -1; |
| 1325 | 1333 | ||
| 1326 | dma_old = inb(base + 2); | 1334 | dma_old = inb(base + 2); |
| @@ -1346,8 +1354,6 @@ static int __devinit init_dma_hpt366(ide_hwif_t *hwif, | |||
| 1346 | if (ide_allocate_dma_engine(hwif)) | 1354 | if (ide_allocate_dma_engine(hwif)) |
| 1347 | return -1; | 1355 | return -1; |
| 1348 | 1356 | ||
| 1349 | hwif->dma_base = base; | ||
| 1350 | |||
| 1351 | hwif->dma_ops = &sff_dma_ops; | 1357 | hwif->dma_ops = &sff_dma_ops; |
| 1352 | 1358 | ||
| 1353 | return 0; | 1359 | return 0; |
diff --git a/drivers/ide/setup-pci.c b/drivers/ide/setup-pci.c index b047013f3652..c1b609d9cb28 100644 --- a/drivers/ide/setup-pci.c +++ b/drivers/ide/setup-pci.c | |||
| @@ -73,15 +73,12 @@ static void ide_pci_clear_simplex(unsigned long dma_base, const char *name) | |||
| 73 | * @d: IDE port info | 73 | * @d: IDE port info |
| 74 | * | 74 | * |
| 75 | * Fetch the DMA Bus-Master-I/O-Base-Address (BMIBA) from PCI space. | 75 | * Fetch the DMA Bus-Master-I/O-Base-Address (BMIBA) from PCI space. |
| 76 | * Where a device has a partner that is already in DMA mode we check | ||
| 77 | * and enforce IDE simplex rules. | ||
| 78 | */ | 76 | */ |
| 79 | 77 | ||
| 80 | unsigned long ide_pci_dma_base(ide_hwif_t *hwif, const struct ide_port_info *d) | 78 | unsigned long ide_pci_dma_base(ide_hwif_t *hwif, const struct ide_port_info *d) |
| 81 | { | 79 | { |
| 82 | struct pci_dev *dev = to_pci_dev(hwif->dev); | 80 | struct pci_dev *dev = to_pci_dev(hwif->dev); |
| 83 | unsigned long dma_base = 0; | 81 | unsigned long dma_base = 0; |
| 84 | u8 dma_stat = 0; | ||
| 85 | 82 | ||
| 86 | if (hwif->host_flags & IDE_HFLAG_MMIO) | 83 | if (hwif->host_flags & IDE_HFLAG_MMIO) |
| 87 | return hwif->dma_base; | 84 | return hwif->dma_base; |
| @@ -102,11 +99,19 @@ unsigned long ide_pci_dma_base(ide_hwif_t *hwif, const struct ide_port_info *d) | |||
| 102 | if (hwif->channel) | 99 | if (hwif->channel) |
| 103 | dma_base += 8; | 100 | dma_base += 8; |
| 104 | 101 | ||
| 105 | if (d->host_flags & IDE_HFLAG_CS5520) | 102 | return dma_base; |
| 103 | } | ||
| 104 | EXPORT_SYMBOL_GPL(ide_pci_dma_base); | ||
| 105 | |||
| 106 | int ide_pci_check_simplex(ide_hwif_t *hwif, const struct ide_port_info *d) | ||
| 107 | { | ||
| 108 | u8 dma_stat; | ||
| 109 | |||
| 110 | if (d->host_flags & (IDE_HFLAG_MMIO | IDE_HFLAG_CS5520)) | ||
| 106 | goto out; | 111 | goto out; |
| 107 | 112 | ||
| 108 | if (d->host_flags & IDE_HFLAG_CLEAR_SIMPLEX) { | 113 | if (d->host_flags & IDE_HFLAG_CLEAR_SIMPLEX) { |
| 109 | ide_pci_clear_simplex(dma_base, d->name); | 114 | ide_pci_clear_simplex(hwif->dma_base, d->name); |
| 110 | goto out; | 115 | goto out; |
| 111 | } | 116 | } |
| 112 | 117 | ||
| @@ -120,15 +125,15 @@ unsigned long ide_pci_dma_base(ide_hwif_t *hwif, const struct ide_port_info *d) | |||
| 120 | * we tune the drive then try to grab DMA ownership if we want to be | 125 | * we tune the drive then try to grab DMA ownership if we want to be |
| 121 | * the DMA end. This has to be become dynamic to handle hot-plug. | 126 | * the DMA end. This has to be become dynamic to handle hot-plug. |
| 122 | */ | 127 | */ |
| 123 | dma_stat = hwif->INB(dma_base + 2); | 128 | dma_stat = hwif->read_sff_dma_status(hwif); |
| 124 | if ((dma_stat & 0x80) && hwif->mate && hwif->mate->dma_base) { | 129 | if ((dma_stat & 0x80) && hwif->mate && hwif->mate->dma_base) { |
| 125 | printk(KERN_INFO "%s: simplex device: DMA disabled\n", d->name); | 130 | printk(KERN_INFO "%s: simplex device: DMA disabled\n", d->name); |
| 126 | dma_base = 0; | 131 | return -1; |
| 127 | } | 132 | } |
| 128 | out: | 133 | out: |
| 129 | return dma_base; | 134 | return 0; |
| 130 | } | 135 | } |
| 131 | EXPORT_SYMBOL_GPL(ide_pci_dma_base); | 136 | EXPORT_SYMBOL_GPL(ide_pci_check_simplex); |
| 132 | 137 | ||
| 133 | /* | 138 | /* |
| 134 | * Set up BM-DMA capability (PnP BIOS should have done this) | 139 | * Set up BM-DMA capability (PnP BIOS should have done this) |
| @@ -363,7 +368,15 @@ int ide_hwif_setup_dma(ide_hwif_t *hwif, const struct ide_port_info *d) | |||
| 363 | (dev->class & 0x80))) { | 368 | (dev->class & 0x80))) { |
| 364 | unsigned long base = ide_pci_dma_base(hwif, d); | 369 | unsigned long base = ide_pci_dma_base(hwif, d); |
| 365 | 370 | ||
| 366 | if (base == 0 || ide_pci_set_master(dev, d->name) < 0) | 371 | if (base == 0) |
| 372 | return -1; | ||
| 373 | |||
| 374 | hwif->dma_base = base; | ||
| 375 | |||
| 376 | if (ide_pci_check_simplex(hwif, d) < 0) | ||
| 377 | return -1; | ||
| 378 | |||
| 379 | if (ide_pci_set_master(dev, d->name) < 0) | ||
| 367 | return -1; | 380 | return -1; |
| 368 | 381 | ||
| 369 | if (hwif->host_flags & IDE_HFLAG_MMIO) | 382 | if (hwif->host_flags & IDE_HFLAG_MMIO) |
| @@ -377,8 +390,6 @@ int ide_hwif_setup_dma(ide_hwif_t *hwif, const struct ide_port_info *d) | |||
| 377 | if (ide_allocate_dma_engine(hwif)) | 390 | if (ide_allocate_dma_engine(hwif)) |
| 378 | return -1; | 391 | return -1; |
| 379 | 392 | ||
| 380 | hwif->dma_base = base; | ||
| 381 | |||
| 382 | hwif->dma_ops = &sff_dma_ops; | 393 | hwif->dma_ops = &sff_dma_ops; |
| 383 | } | 394 | } |
| 384 | 395 | ||
diff --git a/include/linux/ide.h b/include/linux/ide.h index 6d774607e32a..a179a7f6e444 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h | |||
| @@ -1008,6 +1008,7 @@ void ide_setup_pci_noise(struct pci_dev *, const struct ide_port_info *); | |||
| 1008 | int ide_pci_set_master(struct pci_dev *, const char *); | 1008 | int ide_pci_set_master(struct pci_dev *, const char *); |
| 1009 | unsigned long ide_pci_dma_base(ide_hwif_t *, const struct ide_port_info *); | 1009 | unsigned long ide_pci_dma_base(ide_hwif_t *, const struct ide_port_info *); |
| 1010 | extern const struct ide_dma_ops sff_dma_ops; | 1010 | extern const struct ide_dma_ops sff_dma_ops; |
| 1011 | int ide_pci_check_simplex(ide_hwif_t *, const struct ide_port_info *); | ||
| 1011 | int ide_hwif_setup_dma(ide_hwif_t *, const struct ide_port_info *); | 1012 | int ide_hwif_setup_dma(ide_hwif_t *, const struct ide_port_info *); |
| 1012 | #else | 1013 | #else |
| 1013 | static inline int ide_hwif_setup_dma(ide_hwif_t *hwif, | 1014 | static inline int ide_hwif_setup_dma(ide_hwif_t *hwif, |
