ide: switch to DMA-mapping API part #2
Follow-up to commit 5c05ff68b9
("ide: switch to DMA-mapping API"):
* pci_{alloc,free}_consistent() -> dma_{alloc,free}_coherent()
in ide_{allocate,release}_dma_engine().
* Add ->prd_max_nents and ->prd_ent_size fields to ide_hwif_t
(+ set default values in ide_allocate_dma_engine()).
* Make ide_{allocate,release}_dma_engine() available also
for CONFIG_BLK_DEV_IDEDMA_SFF=n. Then convert au1xxx-ide.c,
scc_pata.c and sgiioc4.c to use them.
* Add missing ->init_dma method to scc_pata.
This patch also fixes:
- ->dmatable_cpu leak for au1xxx-ide
- too early realease of ->dmatable_cpu for scc_pata
- wrong amount of ->dmatable_cpu memory being freed for sgiioc4
While at it:
- remove superfluous ->dma_base check from ide_unregister()
- return -ENOMEM on error in ide_release_dma_engine()
- beautify error message in ide_release_dma_engine()
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
This commit is contained in:
@@ -844,36 +844,43 @@ void ide_dma_timeout(ide_drive_t *drive)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ide_dma_timeout);
|
||||
|
||||
#ifdef CONFIG_BLK_DEV_IDEDMA_SFF
|
||||
void ide_release_dma_engine(ide_hwif_t *hwif)
|
||||
{
|
||||
if (hwif->dmatable_cpu) {
|
||||
struct pci_dev *pdev = to_pci_dev(hwif->dev);
|
||||
int prd_size = hwif->prd_max_nents * hwif->prd_ent_size;
|
||||
|
||||
pci_free_consistent(pdev, PRD_ENTRIES * PRD_BYTES,
|
||||
hwif->dmatable_cpu, hwif->dmatable_dma);
|
||||
dma_free_coherent(hwif->dev, prd_size,
|
||||
hwif->dmatable_cpu, hwif->dmatable_dma);
|
||||
hwif->dmatable_cpu = NULL;
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ide_release_dma_engine);
|
||||
|
||||
int ide_allocate_dma_engine(ide_hwif_t *hwif)
|
||||
{
|
||||
struct pci_dev *pdev = to_pci_dev(hwif->dev);
|
||||
int prd_size;
|
||||
|
||||
hwif->dmatable_cpu = pci_alloc_consistent(pdev,
|
||||
PRD_ENTRIES * PRD_BYTES,
|
||||
&hwif->dmatable_dma);
|
||||
if (hwif->prd_max_nents == 0)
|
||||
hwif->prd_max_nents = PRD_ENTRIES;
|
||||
if (hwif->prd_ent_size == 0)
|
||||
hwif->prd_ent_size = PRD_BYTES;
|
||||
|
||||
if (hwif->dmatable_cpu)
|
||||
return 0;
|
||||
prd_size = hwif->prd_max_nents * hwif->prd_ent_size;
|
||||
|
||||
printk(KERN_ERR "%s: -- Error, unable to allocate DMA table.\n",
|
||||
hwif->dmatable_cpu = dma_alloc_coherent(hwif->dev, prd_size,
|
||||
&hwif->dmatable_dma,
|
||||
GFP_ATOMIC);
|
||||
if (hwif->dmatable_cpu == NULL) {
|
||||
printk(KERN_ERR "%s: unable to allocate PRD table\n",
|
||||
hwif->name);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ide_allocate_dma_engine);
|
||||
|
||||
#ifdef CONFIG_BLK_DEV_IDEDMA_SFF
|
||||
const struct ide_dma_ops sff_dma_ops = {
|
||||
.dma_host_set = ide_dma_host_set,
|
||||
.dma_setup = ide_dma_setup,
|
||||
|
||||
Reference in New Issue
Block a user