diff options
| -rw-r--r-- | drivers/net/wireless/bcm43xx/bcm43xx_dma.c | 31 |
1 files changed, 22 insertions, 9 deletions
diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_dma.c b/drivers/net/wireless/bcm43xx/bcm43xx_dma.c index bbecba02e697..d0318e525ba7 100644 --- a/drivers/net/wireless/bcm43xx/bcm43xx_dma.c +++ b/drivers/net/wireless/bcm43xx/bcm43xx_dma.c | |||
| @@ -624,25 +624,28 @@ err_destroy_tx0: | |||
| 624 | static u16 generate_cookie(struct bcm43xx_dmaring *ring, | 624 | static u16 generate_cookie(struct bcm43xx_dmaring *ring, |
| 625 | int slot) | 625 | int slot) |
| 626 | { | 626 | { |
| 627 | u16 cookie = 0x0000; | 627 | u16 cookie = 0xF000; |
| 628 | 628 | ||
| 629 | /* Use the upper 4 bits of the cookie as | 629 | /* Use the upper 4 bits of the cookie as |
| 630 | * DMA controller ID and store the slot number | 630 | * DMA controller ID and store the slot number |
| 631 | * in the lower 12 bits | 631 | * in the lower 12 bits. |
| 632 | * Note that the cookie must never be 0, as this | ||
| 633 | * is a special value used in RX path. | ||
| 632 | */ | 634 | */ |
| 633 | switch (ring->mmio_base) { | 635 | switch (ring->mmio_base) { |
| 634 | default: | 636 | default: |
| 635 | assert(0); | 637 | assert(0); |
| 636 | case BCM43xx_MMIO_DMA1_BASE: | 638 | case BCM43xx_MMIO_DMA1_BASE: |
| 639 | cookie = 0xA000; | ||
| 637 | break; | 640 | break; |
| 638 | case BCM43xx_MMIO_DMA2_BASE: | 641 | case BCM43xx_MMIO_DMA2_BASE: |
| 639 | cookie = 0x1000; | 642 | cookie = 0xB000; |
| 640 | break; | 643 | break; |
| 641 | case BCM43xx_MMIO_DMA3_BASE: | 644 | case BCM43xx_MMIO_DMA3_BASE: |
| 642 | cookie = 0x2000; | 645 | cookie = 0xC000; |
| 643 | break; | 646 | break; |
| 644 | case BCM43xx_MMIO_DMA4_BASE: | 647 | case BCM43xx_MMIO_DMA4_BASE: |
| 645 | cookie = 0x3000; | 648 | cookie = 0xD000; |
| 646 | break; | 649 | break; |
| 647 | } | 650 | } |
| 648 | assert(((u16)slot & 0xF000) == 0x0000); | 651 | assert(((u16)slot & 0xF000) == 0x0000); |
| @@ -660,16 +663,16 @@ struct bcm43xx_dmaring * parse_cookie(struct bcm43xx_private *bcm, | |||
| 660 | struct bcm43xx_dmaring *ring = NULL; | 663 | struct bcm43xx_dmaring *ring = NULL; |
| 661 | 664 | ||
| 662 | switch (cookie & 0xF000) { | 665 | switch (cookie & 0xF000) { |
| 663 | case 0x0000: | 666 | case 0xA000: |
| 664 | ring = dma->tx_ring0; | 667 | ring = dma->tx_ring0; |
| 665 | break; | 668 | break; |
| 666 | case 0x1000: | 669 | case 0xB000: |
| 667 | ring = dma->tx_ring1; | 670 | ring = dma->tx_ring1; |
| 668 | break; | 671 | break; |
| 669 | case 0x2000: | 672 | case 0xC000: |
| 670 | ring = dma->tx_ring2; | 673 | ring = dma->tx_ring2; |
| 671 | break; | 674 | break; |
| 672 | case 0x3000: | 675 | case 0xD000: |
| 673 | ring = dma->tx_ring3; | 676 | ring = dma->tx_ring3; |
| 674 | break; | 677 | break; |
| 675 | default: | 678 | default: |
| @@ -839,8 +842,18 @@ static void dma_rx(struct bcm43xx_dmaring *ring, | |||
| 839 | /* We received an xmit status. */ | 842 | /* We received an xmit status. */ |
| 840 | struct bcm43xx_hwxmitstatus *hw = (struct bcm43xx_hwxmitstatus *)skb->data; | 843 | struct bcm43xx_hwxmitstatus *hw = (struct bcm43xx_hwxmitstatus *)skb->data; |
| 841 | struct bcm43xx_xmitstatus stat; | 844 | struct bcm43xx_xmitstatus stat; |
| 845 | int i = 0; | ||
| 842 | 846 | ||
| 843 | stat.cookie = le16_to_cpu(hw->cookie); | 847 | stat.cookie = le16_to_cpu(hw->cookie); |
| 848 | while (stat.cookie == 0) { | ||
| 849 | if (unlikely(++i >= 10000)) { | ||
| 850 | assert(0); | ||
| 851 | break; | ||
| 852 | } | ||
| 853 | udelay(2); | ||
| 854 | barrier(); | ||
| 855 | stat.cookie = le16_to_cpu(hw->cookie); | ||
| 856 | } | ||
| 844 | stat.flags = hw->flags; | 857 | stat.flags = hw->flags; |
| 845 | stat.cnt1 = hw->cnt1; | 858 | stat.cnt1 = hw->cnt1; |
| 846 | stat.cnt2 = hw->cnt2; | 859 | stat.cnt2 = hw->cnt2; |
