Skip to content

Commit

Permalink
[PATCH] bcm43xx: add DMA rx poll workaround to DMA4
Browse files Browse the repository at this point in the history
Also add the Poll RX DMA Memory workaround to the DMA4
(xmitstatus) path.

Signed-off-by: Michael Buesch <[email protected]>
Signed-off-by: John W. Linville <[email protected]>
  • Loading branch information
Michael Buesch authored and linvjw committed Jun 5, 2006
1 parent 672c610 commit ea9a771
Showing 1 changed file with 22 additions and 9 deletions.
31 changes: 22 additions & 9 deletions drivers/net/wireless/bcm43xx/bcm43xx_dma.c
Original file line number Diff line number Diff line change
Expand Up @@ -624,25 +624,28 @@ int bcm43xx_dma_init(struct bcm43xx_private *bcm)
static u16 generate_cookie(struct bcm43xx_dmaring *ring,
int slot)
{
u16 cookie = 0x0000;
u16 cookie = 0xF000;

/* Use the upper 4 bits of the cookie as
* DMA controller ID and store the slot number
* in the lower 12 bits
* in the lower 12 bits.
* Note that the cookie must never be 0, as this
* is a special value used in RX path.
*/
switch (ring->mmio_base) {
default:
assert(0);
case BCM43xx_MMIO_DMA1_BASE:
cookie = 0xA000;
break;
case BCM43xx_MMIO_DMA2_BASE:
cookie = 0x1000;
cookie = 0xB000;
break;
case BCM43xx_MMIO_DMA3_BASE:
cookie = 0x2000;
cookie = 0xC000;
break;
case BCM43xx_MMIO_DMA4_BASE:
cookie = 0x3000;
cookie = 0xD000;
break;
}
assert(((u16)slot & 0xF000) == 0x0000);
Expand All @@ -660,16 +663,16 @@ struct bcm43xx_dmaring * parse_cookie(struct bcm43xx_private *bcm,
struct bcm43xx_dmaring *ring = NULL;

switch (cookie & 0xF000) {
case 0x0000:
case 0xA000:
ring = dma->tx_ring0;
break;
case 0x1000:
case 0xB000:
ring = dma->tx_ring1;
break;
case 0x2000:
case 0xC000:
ring = dma->tx_ring2;
break;
case 0x3000:
case 0xD000:
ring = dma->tx_ring3;
break;
default:
Expand Down Expand Up @@ -839,8 +842,18 @@ static void dma_rx(struct bcm43xx_dmaring *ring,
/* We received an xmit status. */
struct bcm43xx_hwxmitstatus *hw = (struct bcm43xx_hwxmitstatus *)skb->data;
struct bcm43xx_xmitstatus stat;
int i = 0;

stat.cookie = le16_to_cpu(hw->cookie);
while (stat.cookie == 0) {
if (unlikely(++i >= 10000)) {
assert(0);
break;
}
udelay(2);
barrier();
stat.cookie = le16_to_cpu(hw->cookie);
}
stat.flags = hw->flags;
stat.cnt1 = hw->cnt1;
stat.cnt2 = hw->cnt2;
Expand Down

0 comments on commit ea9a771

Please sign in to comment.