From: Rafał Miłecki Date: Sun, 14 Aug 2011 17:39:40 +0000 (+0200) Subject: ssb: fix DMA translation for some specific boards X-Git-Tag: MMI-PSA29.97-13-9~18194^2~254^2~258 X-Git-Url: https://git.stricted.de/?a=commitdiff_plain;h=04023afcce2eaff4f66d19ca21b106512fffabe7;p=GitHub%2FMotorolaMobilityLLC%2Fkernel-slsi.git ssb: fix DMA translation for some specific boards Signed-off-by: Michael Buesch Signed-off-by: Rafał Miłecki Signed-off-by: John W. Linville --- diff --git a/drivers/ssb/main.c b/drivers/ssb/main.c index 29c7d4f9d1ae..d0cbdb0cf9d5 100644 --- a/drivers/ssb/main.c +++ b/drivers/ssb/main.c @@ -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); }