diff options
Diffstat (limited to 'drivers/ide/setup-pci.c')
-rw-r--r-- | drivers/ide/setup-pci.c | 31 |
1 files changed, 14 insertions, 17 deletions
diff --git a/drivers/ide/setup-pci.c b/drivers/ide/setup-pci.c index 5006ea98733b..5171601fb255 100644 --- a/drivers/ide/setup-pci.c +++ b/drivers/ide/setup-pci.c | |||
@@ -72,16 +72,16 @@ static void ide_pci_clear_simplex(unsigned long dma_base, const char *name) | |||
72 | } | 72 | } |
73 | 73 | ||
74 | /** | 74 | /** |
75 | * ide_get_or_set_dma_base - setup BMIBA | 75 | * ide_pci_dma_base - setup BMIBA |
76 | * @d: IDE port info | ||
77 | * @hwif: IDE interface | 76 | * @hwif: IDE interface |
77 | * @d: IDE port info | ||
78 | * | 78 | * |
79 | * Fetch the DMA Bus-Master-I/O-Base-Address (BMIBA) from PCI space. | 79 | * Fetch the DMA Bus-Master-I/O-Base-Address (BMIBA) from PCI space. |
80 | * Where a device has a partner that is already in DMA mode we check | 80 | * Where a device has a partner that is already in DMA mode we check |
81 | * and enforce IDE simplex rules. | 81 | * and enforce IDE simplex rules. |
82 | */ | 82 | */ |
83 | 83 | ||
84 | static unsigned long ide_get_or_set_dma_base(const struct ide_port_info *d, ide_hwif_t *hwif) | 84 | unsigned long ide_pci_dma_base(ide_hwif_t *hwif, const struct ide_port_info *d) |
85 | { | 85 | { |
86 | struct pci_dev *dev = to_pci_dev(hwif->dev); | 86 | struct pci_dev *dev = to_pci_dev(hwif->dev); |
87 | unsigned long dma_base = 0; | 87 | unsigned long dma_base = 0; |
@@ -132,11 +132,12 @@ static unsigned long ide_get_or_set_dma_base(const struct ide_port_info *d, ide_ | |||
132 | out: | 132 | out: |
133 | return dma_base; | 133 | return dma_base; |
134 | } | 134 | } |
135 | EXPORT_SYMBOL_GPL(ide_pci_dma_base); | ||
135 | 136 | ||
136 | /* | 137 | /* |
137 | * Set up BM-DMA capability (PnP BIOS should have done this) | 138 | * Set up BM-DMA capability (PnP BIOS should have done this) |
138 | */ | 139 | */ |
139 | static int ide_pci_set_master(struct pci_dev *dev, const char *name) | 140 | int ide_pci_set_master(struct pci_dev *dev, const char *name) |
140 | { | 141 | { |
141 | u16 pcicmd; | 142 | u16 pcicmd; |
142 | 143 | ||
@@ -155,6 +156,7 @@ static int ide_pci_set_master(struct pci_dev *dev, const char *name) | |||
155 | 156 | ||
156 | return 0; | 157 | return 0; |
157 | } | 158 | } |
159 | EXPORT_SYMBOL_GPL(ide_pci_set_master); | ||
158 | #endif /* CONFIG_BLK_DEV_IDEDMA_PCI */ | 160 | #endif /* CONFIG_BLK_DEV_IDEDMA_PCI */ |
159 | 161 | ||
160 | void ide_setup_pci_noise(struct pci_dev *dev, const struct ide_port_info *d) | 162 | void ide_setup_pci_noise(struct pci_dev *dev, const struct ide_port_info *d) |
@@ -360,20 +362,17 @@ static ide_hwif_t *ide_hwif_configure(struct pci_dev *dev, | |||
360 | * state | 362 | * state |
361 | */ | 363 | */ |
362 | 364 | ||
363 | void ide_hwif_setup_dma(ide_hwif_t *hwif, const struct ide_port_info *d) | 365 | int ide_hwif_setup_dma(ide_hwif_t *hwif, const struct ide_port_info *d) |
364 | { | 366 | { |
365 | struct pci_dev *dev = to_pci_dev(hwif->dev); | 367 | struct pci_dev *dev = to_pci_dev(hwif->dev); |
366 | 368 | ||
367 | if ((d->host_flags & IDE_HFLAG_NO_AUTODMA) == 0 || | 369 | if ((d->host_flags & IDE_HFLAG_NO_AUTODMA) == 0 || |
368 | ((dev->class >> 8) == PCI_CLASS_STORAGE_IDE && | 370 | ((dev->class >> 8) == PCI_CLASS_STORAGE_IDE && |
369 | (dev->class & 0x80))) { | 371 | (dev->class & 0x80))) { |
370 | unsigned long base = ide_get_or_set_dma_base(d, hwif); | 372 | unsigned long base = ide_pci_dma_base(hwif, d); |
371 | 373 | ||
372 | if (base == 0 || ide_pci_set_master(dev, d->name) < 0) | 374 | if (base == 0 || ide_pci_set_master(dev, d->name) < 0) |
373 | goto out_disabled; | 375 | return -1; |
374 | |||
375 | if (d->init_dma) | ||
376 | d->init_dma(hwif, base); | ||
377 | 376 | ||
378 | if (hwif->mmio) | 377 | if (hwif->mmio) |
379 | printk(KERN_INFO " %s: MMIO-DMA\n", hwif->name); | 378 | printk(KERN_INFO " %s: MMIO-DMA\n", hwif->name); |
@@ -383,15 +382,13 @@ void ide_hwif_setup_dma(ide_hwif_t *hwif, const struct ide_port_info *d) | |||
383 | 382 | ||
384 | hwif->extra_base = base + (hwif->channel ? 8 : 16); | 383 | hwif->extra_base = base + (hwif->channel ? 8 : 16); |
385 | 384 | ||
386 | if (ide_allocate_dma_engine(hwif) == 0) | 385 | if (ide_allocate_dma_engine(hwif)) |
387 | ide_setup_dma(hwif, base); | 386 | return -1; |
388 | } | ||
389 | 387 | ||
390 | return; | 388 | ide_setup_dma(hwif, base); |
389 | } | ||
391 | 390 | ||
392 | out_disabled: | 391 | return 0; |
393 | printk(KERN_INFO "%s: Bus-Master DMA disabled (BIOS) on %s\n", | ||
394 | d->name, pci_name(dev)); | ||
395 | } | 392 | } |
396 | #endif /* CONFIG_BLK_DEV_IDEDMA_PCI */ | 393 | #endif /* CONFIG_BLK_DEV_IDEDMA_PCI */ |
397 | 394 | ||