Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ssb: return correct translation bit for 64-bit DMA

Remove b43's workarounds at the same time. Other users of
ssb_dma_translation do not support any 64-bit DMA devices, so they are
not affected.

Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>

authored by

Rafał Miłecki and committed by
John W. Linville
a9770a81 78c1ee7e

+7 -4
+3 -3
drivers/net/wireless/b43/dma.c
··· 174 174 addrhi = (((u64) dmaaddr >> 32) & ~SSB_DMA_TRANSLATION_MASK); 175 175 addrext = (((u64) dmaaddr >> 32) & SSB_DMA_TRANSLATION_MASK) 176 176 >> SSB_DMA_TRANSLATION_SHIFT; 177 - addrhi |= (ring->dev->dma.translation << 1); 177 + addrhi |= ring->dev->dma.translation; 178 178 if (slot == ring->nr_slots - 1) 179 179 ctl0 |= B43_DMA64_DCTL0_DTABLEEND; 180 180 if (start) ··· 678 678 b43_dma_write(ring, B43_DMA64_TXRINGHI, 679 679 ((ringbase >> 32) & 680 680 ~SSB_DMA_TRANSLATION_MASK) 681 - | (trans << 1)); 681 + | trans); 682 682 } else { 683 683 u32 ringbase = (u32) (ring->dmabase); 684 684 ··· 715 715 b43_dma_write(ring, B43_DMA64_RXRINGHI, 716 716 ((ringbase >> 32) & 717 717 ~SSB_DMA_TRANSLATION_MASK) 718 - | (trans << 1)); 718 + | trans); 719 719 b43_dma_write(ring, B43_DMA64_RXINDEX, ring->nr_slots * 720 720 sizeof(struct b43_dmadesc64)); 721 721 } else {
+4 -1
drivers/ssb/main.c
··· 1266 1266 case SSB_BUSTYPE_SSB: 1267 1267 return 0; 1268 1268 case SSB_BUSTYPE_PCI: 1269 - return SSB_PCI_DMA; 1269 + if (ssb_read32(dev, SSB_TMSHIGH) & SSB_TMSHIGH_DMA64) 1270 + return SSB_PCIE_DMA_H32; 1271 + else 1272 + return SSB_PCI_DMA; 1270 1273 default: 1271 1274 __ssb_dma_not_implemented(dev); 1272 1275 }