aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/bcm43xx/bcm43xx_dma.h
diff options
context:
space:
mode:
authorLarry Finger <Larry.Finger@lwfinger.net>2006-10-03 00:48:54 -0400
committerJohn W. Linville <linville@tuxdriver.com>2006-10-16 20:09:48 -0400
commit8da81e52b743edac0bfbb7d0c1286f919b2f209b (patch)
tree7b55c4c8e26be4ecedcbe404139d16ae05b53e9f /drivers/net/wireless/bcm43xx/bcm43xx_dma.h
parent16bfa676a7cc64695f7e9694c380ebd26c461ae5 (diff)
[PATCH] bcm43xx-softmac: Fix system hang for x86-64 with >1GB RAM
The bcm43xx-softmac software currently fails when running on x86_64 systems with more than 1GB RAM and one of the card variants with 30-bit DMA addressing. This patch uses the address extension bits in the hardware to set the correct DMA mask for the specific card in use. Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/bcm43xx/bcm43xx_dma.h')
-rw-r--r--drivers/net/wireless/bcm43xx/bcm43xx_dma.h17
1 files changed, 17 insertions, 0 deletions
diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_dma.h b/drivers/net/wireless/bcm43xx/bcm43xx_dma.h
index e04bcaddd1d0..ea16078cfe98 100644
--- a/drivers/net/wireless/bcm43xx/bcm43xx_dma.h
+++ b/drivers/net/wireless/bcm43xx/bcm43xx_dma.h
@@ -314,6 +314,23 @@ int bcm43xx_dma_tx(struct bcm43xx_private *bcm,
314 struct ieee80211_txb *txb); 314 struct ieee80211_txb *txb);
315void bcm43xx_dma_rx(struct bcm43xx_dmaring *ring); 315void bcm43xx_dma_rx(struct bcm43xx_dmaring *ring);
316 316
317/* Helper function that returns the dma mask for this device. */
318static inline
319u64 bcm43xx_get_supported_dma_mask(struct bcm43xx_private *bcm)
320{
321 int dma64 = bcm43xx_read32(bcm, BCM43xx_CIR_SBTMSTATEHIGH) &
322 BCM43xx_SBTMSTATEHIGH_DMA64BIT;
323 u16 mmio_base = bcm43xx_dmacontroller_base(dma64, 0);
324 u32 mask = BCM43xx_DMA32_TXADDREXT_MASK;
325
326 if (dma64)
327 return DMA_64BIT_MASK;
328 bcm43xx_write32(bcm, mmio_base + BCM43xx_DMA32_TXCTL, mask);
329 if (bcm43xx_read32(bcm, mmio_base + BCM43xx_DMA32_TXCTL) & mask)
330 return DMA_32BIT_MASK;
331 return DMA_30BIT_MASK;
332}
333
317#else /* CONFIG_BCM43XX_DMA */ 334#else /* CONFIG_BCM43XX_DMA */
318 335
319 336