Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

b43: disable parity check on BCMA devices

Analyze of MMIO dumps from BCM43224, BCM43225, BCM4313 and BCM4331 has
shown that wl disables parity check for all that cards. This is required
for receiving any packets from the hardware.

Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>

authored by

Rafał Miłecki and committed by
John W. Linville
78c1ee7e 292b1192

+21
+1
drivers/net/wireless/b43/b43.h
··· 594 594 struct b43_dmaring *rx_ring; 595 595 596 596 u32 translation; /* Routing bits */ 597 + bool parity; /* Check for parity */ 597 598 }; 598 599 599 600 struct b43_pio_txqueue;
+16
drivers/net/wireless/b43/dma.c
··· 659 659 u32 value; 660 660 u32 addrext; 661 661 u32 trans = ring->dev->dma.translation; 662 + bool parity = ring->dev->dma.parity; 662 663 663 664 if (ring->tx) { 664 665 if (ring->type == B43_DMA_64BIT) { ··· 670 669 value = B43_DMA64_TXENABLE; 671 670 value |= (addrext << B43_DMA64_TXADDREXT_SHIFT) 672 671 & B43_DMA64_TXADDREXT_MASK; 672 + if (!parity) 673 + value |= B43_DMA64_TXPARITYDISABLE; 673 674 b43_dma_write(ring, B43_DMA64_TXCTL, value); 674 675 b43_dma_write(ring, B43_DMA64_TXRINGLO, 675 676 (ringbase & 0xFFFFFFFF)); ··· 687 684 value = B43_DMA32_TXENABLE; 688 685 value |= (addrext << B43_DMA32_TXADDREXT_SHIFT) 689 686 & B43_DMA32_TXADDREXT_MASK; 687 + if (!parity) 688 + value |= B43_DMA32_TXPARITYDISABLE; 690 689 b43_dma_write(ring, B43_DMA32_TXCTL, value); 691 690 b43_dma_write(ring, B43_DMA32_TXRING, 692 691 (ringbase & ~SSB_DMA_TRANSLATION_MASK) ··· 707 702 value |= B43_DMA64_RXENABLE; 708 703 value |= (addrext << B43_DMA64_RXADDREXT_SHIFT) 709 704 & B43_DMA64_RXADDREXT_MASK; 705 + if (!parity) 706 + value |= B43_DMA64_RXPARITYDISABLE; 710 707 b43_dma_write(ring, B43_DMA64_RXCTL, value); 711 708 b43_dma_write(ring, B43_DMA64_RXRINGLO, 712 709 (ringbase & 0xFFFFFFFF)); ··· 727 720 value |= B43_DMA32_RXENABLE; 728 721 value |= (addrext << B43_DMA32_RXADDREXT_SHIFT) 729 722 & B43_DMA32_RXADDREXT_MASK; 723 + if (!parity) 724 + value |= B43_DMA32_RXPARITYDISABLE; 730 725 b43_dma_write(ring, B43_DMA32_RXCTL, value); 731 726 b43_dma_write(ring, B43_DMA32_RXRING, 732 727 (ringbase & ~SSB_DMA_TRANSLATION_MASK) ··· 1072 1063 break; 1073 1064 #endif 1074 1065 } 1066 + 1067 + dma->parity = true; 1068 + #ifdef CONFIG_B43_BCMA 1069 + /* TODO: find out which SSB devices need disabling parity */ 1070 + if (dev->dev->bus_type == B43_BUS_BCMA) 1071 + dma->parity = false; 1072 + #endif 1075 1073 1076 1074 err = -ENOMEM; 1077 1075 /* setup TX DMA channels. */
+4
drivers/net/wireless/b43/dma.h
··· 20 20 #define B43_DMA32_TXSUSPEND 0x00000002 21 21 #define B43_DMA32_TXLOOPBACK 0x00000004 22 22 #define B43_DMA32_TXFLUSH 0x00000010 23 + #define B43_DMA32_TXPARITYDISABLE 0x00000800 23 24 #define B43_DMA32_TXADDREXT_MASK 0x00030000 24 25 #define B43_DMA32_TXADDREXT_SHIFT 16 25 26 #define B43_DMA32_TXRING 0x04 ··· 45 44 #define B43_DMA32_RXFROFF_MASK 0x000000FE 46 45 #define B43_DMA32_RXFROFF_SHIFT 1 47 46 #define B43_DMA32_RXDIRECTFIFO 0x00000100 47 + #define B43_DMA32_RXPARITYDISABLE 0x00000800 48 48 #define B43_DMA32_RXADDREXT_MASK 0x00030000 49 49 #define B43_DMA32_RXADDREXT_SHIFT 16 50 50 #define B43_DMA32_RXRING 0x14 ··· 86 84 #define B43_DMA64_TXSUSPEND 0x00000002 87 85 #define B43_DMA64_TXLOOPBACK 0x00000004 88 86 #define B43_DMA64_TXFLUSH 0x00000010 87 + #define B43_DMA64_TXPARITYDISABLE 0x00000800 89 88 #define B43_DMA64_TXADDREXT_MASK 0x00030000 90 89 #define B43_DMA64_TXADDREXT_SHIFT 16 91 90 #define B43_DMA64_TXINDEX 0x04 ··· 114 111 #define B43_DMA64_RXFROFF_MASK 0x000000FE 115 112 #define B43_DMA64_RXFROFF_SHIFT 1 116 113 #define B43_DMA64_RXDIRECTFIFO 0x00000100 114 + #define B43_DMA64_RXPARITYDISABLE 0x00000800 117 115 #define B43_DMA64_RXADDREXT_MASK 0x00030000 118 116 #define B43_DMA64_RXADDREXT_SHIFT 16 119 117 #define B43_DMA64_RXINDEX 0x24