diff options
author | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2008-07-23 13:55:51 -0400 |
---|---|---|
committer | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2008-07-23 13:55:51 -0400 |
commit | ebb00fb55d0566bb3e81518122a57b4b3bedf1e4 (patch) | |
tree | d8a717bf0e4556a71ba71579a6d5cedfa5bad980 | |
parent | 81e8d5a34f7d2a2acbe309cfa5810a9699a63239 (diff) |
ide: factor out simplex handling from ide_pci_dma_base()
* Factor out simplex handling from ide_pci_dma_base() to
ide_pci_check_simplex().
* Set hwif->dma_base early in ->init_dma method / ide_hwif_setup_dma()
and reset it in ide_init_port() if DMA initialization fails.
* Use ->read_sff_dma_status instead of ->INB in ide_pci_dma_base().
There should be no functional changes caused by this patch.
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
-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, |