From: Alan Cox IDE core code had the mmio==2 (ioremap) mode supported but two small changes had been missed for ide-dma.c. Without this fix mmio IDE controllers bomb if you have plenty of memory as it uses request_mem_region on an ioremap return. 25-akpm/drivers/ide/ide-dma.c | 23 +++++++++++++++++++++-- 1 files changed, 21 insertions(+), 2 deletions(-) diff -puN drivers/ide/ide-dma.c~ide-mmio-fix drivers/ide/ide-dma.c --- 25/drivers/ide/ide-dma.c~ide-mmio-fix Thu Dec 18 14:18:37 2003 +++ 25-akpm/drivers/ide/ide-dma.c Thu Dec 18 14:18:37 2003 @@ -929,11 +929,13 @@ int ide_release_iomio_dma (ide_hwif_t *h */ int ide_release_dma (ide_hwif_t *hwif) { + if (hwif->mmio == 2) + return 1; if (hwif->chipset == ide_etrax100) return 1; ide_release_dma_engine(hwif); - if (hwif->mmio) + if (hwif->mmio == 1) return ide_release_mmio_dma(hwif); return ide_release_iomio_dma(hwif); } @@ -990,6 +992,21 @@ fail: return 1; } +int ide_mapped_mmio_dma (ide_hwif_t *hwif, unsigned long base, unsigned int ports) +{ + printk(KERN_INFO " %s: MMIO-DMA ", hwif->name); + + hwif->dma_base = base; + if (hwif->cds->extra && hwif->channel == 0) + hwif->dma_extra = hwif->cds->extra; + + if(hwif->mate) + hwif->dma_master = (hwif->channel) ? hwif->mate->dma_base : base; + else + hwif->dma_master = base; + return 0; +} + int ide_iomio_dma (ide_hwif_t *hwif, unsigned long base, unsigned int ports) { printk(KERN_INFO " %s: BM-DMA at 0x%04lx-0x%04lx", @@ -1024,7 +1041,9 @@ int ide_iomio_dma (ide_hwif_t *hwif, uns */ int ide_dma_iobase (ide_hwif_t *hwif, unsigned long base, unsigned int ports) { - if (hwif->mmio) + if (hwif->mmio == 2) + return ide_mapped_mmio_dma(hwif, base,ports); + if (hwif->mmio == 1) return ide_mmio_dma(hwif, base, ports); return ide_iomio_dma(hwif, base, ports); } _