ssb: return correct translation bit for 64-bit DMA
authorRafał Miłecki <zajec5@gmail.com>
Wed, 20 Jul 2011 17:52:14 +0000 (19:52 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 22 Jul 2011 13:51:12 +0000 (09:51 -0400)
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>
drivers/net/wireless/b43/dma.c
drivers/ssb/main.c

index 78c5c82dec8d0ec8d50f5c0d2501b95ff63cf7b8..efff2419388dc4a81b9fec2456dc509b7e80a373 100644 (file)
@@ -174,7 +174,7 @@ static void op64_fill_descriptor(struct b43_dmaring *ring,
        addrhi = (((u64) dmaaddr >> 32) & ~SSB_DMA_TRANSLATION_MASK);
        addrext = (((u64) dmaaddr >> 32) & SSB_DMA_TRANSLATION_MASK)
            >> SSB_DMA_TRANSLATION_SHIFT;
-       addrhi |= (ring->dev->dma.translation << 1);
+       addrhi |= ring->dev->dma.translation;
        if (slot == ring->nr_slots - 1)
                ctl0 |= B43_DMA64_DCTL0_DTABLEEND;
        if (start)
@@ -678,7 +678,7 @@ static int dmacontroller_setup(struct b43_dmaring *ring)
                        b43_dma_write(ring, B43_DMA64_TXRINGHI,
                                      ((ringbase >> 32) &
                                       ~SSB_DMA_TRANSLATION_MASK)
-                                     | (trans << 1));
+                                     | trans);
                } else {
                        u32 ringbase = (u32) (ring->dmabase);
 
@@ -715,7 +715,7 @@ static int dmacontroller_setup(struct b43_dmaring *ring)
                        b43_dma_write(ring, B43_DMA64_RXRINGHI,
                                      ((ringbase >> 32) &
                                       ~SSB_DMA_TRANSLATION_MASK)
-                                     | (trans << 1));
+                                     | trans);
                        b43_dma_write(ring, B43_DMA64_RXINDEX, ring->nr_slots *
                                      sizeof(struct b43_dmadesc64));
                } else {
index 57b7b6460896a271d972ac4b998693901bac6a9a..6ec6e099fe041da1f74c904151d1fe28d8588a7d 100644 (file)
@@ -1266,7 +1266,10 @@ u32 ssb_dma_translation(struct ssb_device *dev)
        case SSB_BUSTYPE_SSB:
                return 0;
        case SSB_BUSTYPE_PCI:
-               return SSB_PCI_DMA;
+               if (ssb_read32(dev, SSB_TMSHIGH) & SSB_TMSHIGH_DMA64)
+                       return SSB_PCIE_DMA_H32;
+               else
+                       return SSB_PCI_DMA;
        default:
                __ssb_dma_not_implemented(dev);
        }