Patchwork powerpc/pmac: Fix DMA ops for MacIO devices

login
register
mail settings
Submitter Benjamin Herrenschmidt
Date June 19, 2009, 5:20 a.m.
Message ID <20090619052052.3AA73DDDA0@ozlabs.org>
Download mbox | patch
Permalink /patch/28897/
State Accepted, archived
Commit 3514141aedc16c7344117d5bd79ec1310edf8fb3
Delegated to: Benjamin Herrenschmidt
Headers show

Comments

Benjamin Herrenschmidt - June 19, 2009, 5:20 a.m.
The macio_dev's created to map devices inside the MacIO ASICs
don't have proper dma_ops. This causes crashes on some machines
since the SCSI code calls dma_map_* on our behalf using the
device we hang from.

This fixes it by copying the parent PCI device dma_ops into
the macio_dev when creating it.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
---

 drivers/macintosh/macio_asic.c |   11 +++++++++++
 1 file changed, 11 insertions(+)

Patch

--- linux-work.orig/drivers/macintosh/macio_asic.c	2009-06-19 10:38:17.000000000 +1000
+++ linux-work/drivers/macintosh/macio_asic.c	2009-06-19 10:38:33.000000000 +1000
@@ -378,6 +378,17 @@  static struct macio_dev * macio_add_one_
 	dev->ofdev.dev.bus = &macio_bus_type;
 	dev->ofdev.dev.release = macio_release_dev;
 
+#ifdef CONFIG_PCI
+	/* Set the DMA ops to the ones from the PCI device, this could be
+	 * fishy if we didn't know that on PowerMac it's always direct ops
+	 * or iommu ops that will work fine
+	 */
+	dev->ofdev.dev.archdata.dma_ops =
+		chip->lbus.pdev->dev.archdata.dma_ops;
+	dev->ofdev.dev.archdata.dma_data =
+		chip->lbus.pdev->dev.archdata.dma_data;
+#endif /* CONFIG_PCI */
+
 #ifdef DEBUG
 	printk("preparing mdev @%p, ofdev @%p, dev @%p, kobj @%p\n",
 	       dev, &dev->ofdev, &dev->ofdev.dev, &dev->ofdev.dev.kobj);