aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ide/setup-pci.c
diff options
context:
space:
mode:
authorBartlomiej Zolnierkiewicz <bzolnier@gmail.com>2008-04-26 16:25:22 -0400
committerBartlomiej Zolnierkiewicz <bzolnier@gmail.com>2008-04-26 16:25:22 -0400
commitb123f56e04c7c112f754f948198d1ea5a80e649d (patch)
treec58e83e954159d7755aa7f04d433e4c7e25dc330 /drivers/ide/setup-pci.c
parentf629b38beddf2ff8bc3fda1754bbd6cc7d3acc03 (diff)
ide: do complete DMA setup in ->init_dma method (take 2)
* Make ide_hwif_setup_dma() return an error value. * Pass 'const struct ide_port_info *d' instead of 'unsigned long dmabase' to ->init_dma method and make it return an error value. * Rename ide_get_or_set_dma_base() to ide_pci_dma_base(), change ordering of its arguments and then export it. * Export ide_pci_set_master(). * Do complete DMA setup inside ->init_dma method and update ->init_dma users accordingly. * Sanitize code for DMA setup in ide_init_port(). v2: * Fix for CONFIG_BLK_DEV_IDEDMA_PCI=n configs (from Jiri Slaby <jirislaby@gmail.com>): Fix following compiler warning by returning EINVAL: In file included from ANYTHING-INCLUDING-IDE.H:45: include/linux/ide.h: In function ‘ide_hwif_setup_dma’: include/linux/ide.h:1022: warning: no return statement in function returning non-void Cc: Jiri Slaby <jirislaby@gmail.com> Cc: Andrew Morton <akpm@linux-foundation.org> Acked-by: Sergei Shtylyov <sshtylyov@ru.mvista.com> Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Diffstat (limited to 'drivers/ide/setup-pci.c')
-rw-r--r--drivers/ide/setup-pci.c31
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
84static unsigned long ide_get_or_set_dma_base(const struct ide_port_info *d, ide_hwif_t *hwif) 84unsigned 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_
132out: 132out:
133 return dma_base; 133 return dma_base;
134} 134}
135EXPORT_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 */
139static int ide_pci_set_master(struct pci_dev *dev, const char *name) 140int 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}
159EXPORT_SYMBOL_GPL(ide_pci_set_master);
158#endif /* CONFIG_BLK_DEV_IDEDMA_PCI */ 160#endif /* CONFIG_BLK_DEV_IDEDMA_PCI */
159 161
160void ide_setup_pci_noise(struct pci_dev *dev, const struct ide_port_info *d) 162void 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
363void ide_hwif_setup_dma(ide_hwif_t *hwif, const struct ide_port_info *d) 365int 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
392out_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