ssb: fix DMA translation for some specific boards
authorRafał Miłecki <zajec5@gmail.com>
Sun, 14 Aug 2011 17:39:40 +0000 (19:39 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 24 Aug 2011 18:41:41 +0000 (14:41 -0400)
Signed-off-by: Michael Buesch <m@bues.ch>
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/ssb/main.c

index 29c7d4f9d1ae1b7b9a073b6bf223e949b3d3be24..d0cbdb0cf9d53a12099fdafd2cc5f14d291a36d2 100644 (file)
@@ -1260,16 +1260,34 @@ void ssb_device_disable(struct ssb_device *dev, u32 core_specific_flags)
 }
 EXPORT_SYMBOL(ssb_device_disable);
 
+/* Some chipsets need routing known for PCIe and 64-bit DMA */
+static bool ssb_dma_translation_special_bit(struct ssb_device *dev)
+{
+       u16 chip_id = dev->bus->chip_id;
+
+       if (dev->id.coreid == SSB_DEV_80211) {
+               return (chip_id == 0x4322 || chip_id == 43221 ||
+                       chip_id == 43231 || chip_id == 43222);
+       }
+
+       return 0;
+}
+
 u32 ssb_dma_translation(struct ssb_device *dev)
 {
        switch (dev->bus->bustype) {
        case SSB_BUSTYPE_SSB:
                return 0;
        case SSB_BUSTYPE_PCI:
-               if (ssb_read32(dev, SSB_TMSHIGH) & SSB_TMSHIGH_DMA64)
+               if (pci_is_pcie(dev->bus->host_pci) &&
+                   ssb_read32(dev, SSB_TMSHIGH) & SSB_TMSHIGH_DMA64) {
                        return SSB_PCIE_DMA_H32;
-               else
-                       return SSB_PCI_DMA;
+               } else {
+                       if (ssb_dma_translation_special_bit(dev))
+                               return SSB_PCIE_DMA_H32;
+                       else
+                               return SSB_PCI_DMA;
+               }
        default:
                __ssb_dma_not_implemented(dev);
        }