diff options
author | Larry Finger <Larry.Finger@lwfinger.net> | 2006-10-03 00:48:54 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2006-10-16 20:09:48 -0400 |
commit | 8da81e52b743edac0bfbb7d0c1286f919b2f209b (patch) | |
tree | 7b55c4c8e26be4ecedcbe404139d16ae05b53e9f /drivers/net/wireless/bcm43xx/bcm43xx_dma.h | |
parent | 16bfa676a7cc64695f7e9694c380ebd26c461ae5 (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.h | 17 |
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); |
315 | void bcm43xx_dma_rx(struct bcm43xx_dmaring *ring); | 315 | void bcm43xx_dma_rx(struct bcm43xx_dmaring *ring); |
316 | 316 | ||
317 | /* Helper function that returns the dma mask for this device. */ | ||
318 | static inline | ||
319 | u64 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 | ||