diff options
Diffstat (limited to 'drivers/net/wireless/b43')
| -rw-r--r-- | drivers/net/wireless/b43/b43.h | 1 | ||||
| -rw-r--r-- | drivers/net/wireless/b43/dma.c | 65 | ||||
| -rw-r--r-- | drivers/net/wireless/b43/main.c | 16 |
3 files changed, 42 insertions, 40 deletions
diff --git a/drivers/net/wireless/b43/b43.h b/drivers/net/wireless/b43/b43.h index dfa4bdd5597c..d3db298c05fc 100644 --- a/drivers/net/wireless/b43/b43.h +++ b/drivers/net/wireless/b43/b43.h | |||
| @@ -630,7 +630,6 @@ struct b43_pio { | |||
| 630 | 630 | ||
| 631 | /* Context information for a noise calculation (Link Quality). */ | 631 | /* Context information for a noise calculation (Link Quality). */ |
| 632 | struct b43_noise_calculation { | 632 | struct b43_noise_calculation { |
| 633 | u8 channel_at_start; | ||
| 634 | bool calculation_running; | 633 | bool calculation_running; |
| 635 | u8 nr_samples; | 634 | u8 nr_samples; |
| 636 | s8 samples[8][4]; | 635 | s8 samples[8][4]; |
diff --git a/drivers/net/wireless/b43/dma.c b/drivers/net/wireless/b43/dma.c index 6dcbb3c87e72..e23f2f172bd7 100644 --- a/drivers/net/wireless/b43/dma.c +++ b/drivers/net/wireless/b43/dma.c | |||
| @@ -795,24 +795,49 @@ struct b43_dmaring *b43_setup_dmaring(struct b43_wldev *dev, | |||
| 795 | { | 795 | { |
| 796 | struct b43_dmaring *ring; | 796 | struct b43_dmaring *ring; |
| 797 | int err; | 797 | int err; |
| 798 | int nr_slots; | ||
| 799 | dma_addr_t dma_test; | 798 | dma_addr_t dma_test; |
| 800 | 799 | ||
| 801 | ring = kzalloc(sizeof(*ring), GFP_KERNEL); | 800 | ring = kzalloc(sizeof(*ring), GFP_KERNEL); |
| 802 | if (!ring) | 801 | if (!ring) |
| 803 | goto out; | 802 | goto out; |
| 804 | ring->type = type; | ||
| 805 | 803 | ||
| 806 | nr_slots = B43_RXRING_SLOTS; | 804 | ring->nr_slots = B43_RXRING_SLOTS; |
| 807 | if (for_tx) | 805 | if (for_tx) |
| 808 | nr_slots = B43_TXRING_SLOTS; | 806 | ring->nr_slots = B43_TXRING_SLOTS; |
| 809 | 807 | ||
| 810 | ring->meta = kcalloc(nr_slots, sizeof(struct b43_dmadesc_meta), | 808 | ring->meta = kcalloc(ring->nr_slots, sizeof(struct b43_dmadesc_meta), |
| 811 | GFP_KERNEL); | 809 | GFP_KERNEL); |
| 812 | if (!ring->meta) | 810 | if (!ring->meta) |
| 813 | goto err_kfree_ring; | 811 | goto err_kfree_ring; |
| 812 | |||
| 813 | ring->type = type; | ||
| 814 | ring->dev = dev; | ||
| 815 | ring->mmio_base = b43_dmacontroller_base(type, controller_index); | ||
| 816 | ring->index = controller_index; | ||
| 817 | if (type == B43_DMA_64BIT) | ||
| 818 | ring->ops = &dma64_ops; | ||
| 819 | else | ||
| 820 | ring->ops = &dma32_ops; | ||
| 814 | if (for_tx) { | 821 | if (for_tx) { |
| 815 | ring->txhdr_cache = kcalloc(nr_slots, | 822 | ring->tx = 1; |
| 823 | ring->current_slot = -1; | ||
| 824 | } else { | ||
| 825 | if (ring->index == 0) { | ||
| 826 | ring->rx_buffersize = B43_DMA0_RX_BUFFERSIZE; | ||
| 827 | ring->frameoffset = B43_DMA0_RX_FRAMEOFFSET; | ||
| 828 | } else if (ring->index == 3) { | ||
| 829 | ring->rx_buffersize = B43_DMA3_RX_BUFFERSIZE; | ||
| 830 | ring->frameoffset = B43_DMA3_RX_FRAMEOFFSET; | ||
| 831 | } else | ||
| 832 | B43_WARN_ON(1); | ||
| 833 | } | ||
| 834 | spin_lock_init(&ring->lock); | ||
| 835 | #ifdef CONFIG_B43_DEBUG | ||
| 836 | ring->last_injected_overflow = jiffies; | ||
| 837 | #endif | ||
| 838 | |||
| 839 | if (for_tx) { | ||
| 840 | ring->txhdr_cache = kcalloc(ring->nr_slots, | ||
| 816 | b43_txhdr_size(dev), | 841 | b43_txhdr_size(dev), |
| 817 | GFP_KERNEL); | 842 | GFP_KERNEL); |
| 818 | if (!ring->txhdr_cache) | 843 | if (!ring->txhdr_cache) |
| @@ -828,7 +853,7 @@ struct b43_dmaring *b43_setup_dmaring(struct b43_wldev *dev, | |||
| 828 | b43_txhdr_size(dev), 1)) { | 853 | b43_txhdr_size(dev), 1)) { |
| 829 | /* ugh realloc */ | 854 | /* ugh realloc */ |
| 830 | kfree(ring->txhdr_cache); | 855 | kfree(ring->txhdr_cache); |
| 831 | ring->txhdr_cache = kcalloc(nr_slots, | 856 | ring->txhdr_cache = kcalloc(ring->nr_slots, |
| 832 | b43_txhdr_size(dev), | 857 | b43_txhdr_size(dev), |
| 833 | GFP_KERNEL | GFP_DMA); | 858 | GFP_KERNEL | GFP_DMA); |
| 834 | if (!ring->txhdr_cache) | 859 | if (!ring->txhdr_cache) |
| @@ -853,32 +878,6 @@ struct b43_dmaring *b43_setup_dmaring(struct b43_wldev *dev, | |||
| 853 | DMA_TO_DEVICE); | 878 | DMA_TO_DEVICE); |
| 854 | } | 879 | } |
| 855 | 880 | ||
| 856 | ring->dev = dev; | ||
| 857 | ring->nr_slots = nr_slots; | ||
| 858 | ring->mmio_base = b43_dmacontroller_base(type, controller_index); | ||
| 859 | ring->index = controller_index; | ||
| 860 | if (type == B43_DMA_64BIT) | ||
| 861 | ring->ops = &dma64_ops; | ||
| 862 | else | ||
| 863 | ring->ops = &dma32_ops; | ||
| 864 | if (for_tx) { | ||
| 865 | ring->tx = 1; | ||
| 866 | ring->current_slot = -1; | ||
| 867 | } else { | ||
| 868 | if (ring->index == 0) { | ||
| 869 | ring->rx_buffersize = B43_DMA0_RX_BUFFERSIZE; | ||
| 870 | ring->frameoffset = B43_DMA0_RX_FRAMEOFFSET; | ||
| 871 | } else if (ring->index == 3) { | ||
| 872 | ring->rx_buffersize = B43_DMA3_RX_BUFFERSIZE; | ||
| 873 | ring->frameoffset = B43_DMA3_RX_FRAMEOFFSET; | ||
| 874 | } else | ||
| 875 | B43_WARN_ON(1); | ||
| 876 | } | ||
| 877 | spin_lock_init(&ring->lock); | ||
| 878 | #ifdef CONFIG_B43_DEBUG | ||
| 879 | ring->last_injected_overflow = jiffies; | ||
| 880 | #endif | ||
| 881 | |||
| 882 | err = alloc_ringmemory(ring); | 881 | err = alloc_ringmemory(ring); |
| 883 | if (err) | 882 | if (err) |
| 884 | goto err_kfree_txhdr_cache; | 883 | goto err_kfree_txhdr_cache; |
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c index 6c3d9ea0a9f8..fa4b0d8b74a2 100644 --- a/drivers/net/wireless/b43/main.c +++ b/drivers/net/wireless/b43/main.c | |||
| @@ -1145,7 +1145,6 @@ static void b43_generate_noise_sample(struct b43_wldev *dev) | |||
| 1145 | b43_jssi_write(dev, 0x7F7F7F7F); | 1145 | b43_jssi_write(dev, 0x7F7F7F7F); |
| 1146 | b43_write32(dev, B43_MMIO_MACCMD, | 1146 | b43_write32(dev, B43_MMIO_MACCMD, |
| 1147 | b43_read32(dev, B43_MMIO_MACCMD) | B43_MACCMD_BGNOISE); | 1147 | b43_read32(dev, B43_MMIO_MACCMD) | B43_MACCMD_BGNOISE); |
| 1148 | B43_WARN_ON(dev->noisecalc.channel_at_start != dev->phy.channel); | ||
| 1149 | } | 1148 | } |
| 1150 | 1149 | ||
| 1151 | static void b43_calculate_link_quality(struct b43_wldev *dev) | 1150 | static void b43_calculate_link_quality(struct b43_wldev *dev) |
| @@ -1154,7 +1153,6 @@ static void b43_calculate_link_quality(struct b43_wldev *dev) | |||
| 1154 | 1153 | ||
| 1155 | if (dev->noisecalc.calculation_running) | 1154 | if (dev->noisecalc.calculation_running) |
| 1156 | return; | 1155 | return; |
| 1157 | dev->noisecalc.channel_at_start = dev->phy.channel; | ||
| 1158 | dev->noisecalc.calculation_running = 1; | 1156 | dev->noisecalc.calculation_running = 1; |
| 1159 | dev->noisecalc.nr_samples = 0; | 1157 | dev->noisecalc.nr_samples = 0; |
| 1160 | 1158 | ||
| @@ -1171,9 +1169,16 @@ static void handle_irq_noise(struct b43_wldev *dev) | |||
| 1171 | 1169 | ||
| 1172 | /* Bottom half of Link Quality calculation. */ | 1170 | /* Bottom half of Link Quality calculation. */ |
| 1173 | 1171 | ||
| 1172 | /* Possible race condition: It might be possible that the user | ||
| 1173 | * changed to a different channel in the meantime since we | ||
| 1174 | * started the calculation. We ignore that fact, since it's | ||
| 1175 | * not really that much of a problem. The background noise is | ||
| 1176 | * an estimation only anyway. Slightly wrong results will get damped | ||
| 1177 | * by the averaging of the 8 sample rounds. Additionally the | ||
| 1178 | * value is shortlived. So it will be replaced by the next noise | ||
| 1179 | * calculation round soon. */ | ||
| 1180 | |||
| 1174 | B43_WARN_ON(!dev->noisecalc.calculation_running); | 1181 | B43_WARN_ON(!dev->noisecalc.calculation_running); |
| 1175 | if (dev->noisecalc.channel_at_start != phy->channel) | ||
| 1176 | goto drop_calculation; | ||
| 1177 | *((__le32 *)noise) = cpu_to_le32(b43_jssi_read(dev)); | 1182 | *((__le32 *)noise) = cpu_to_le32(b43_jssi_read(dev)); |
| 1178 | if (noise[0] == 0x7F || noise[1] == 0x7F || | 1183 | if (noise[0] == 0x7F || noise[1] == 0x7F || |
| 1179 | noise[2] == 0x7F || noise[3] == 0x7F) | 1184 | noise[2] == 0x7F || noise[3] == 0x7F) |
| @@ -1214,11 +1219,10 @@ static void handle_irq_noise(struct b43_wldev *dev) | |||
| 1214 | average -= 48; | 1219 | average -= 48; |
| 1215 | 1220 | ||
| 1216 | dev->stats.link_noise = average; | 1221 | dev->stats.link_noise = average; |
| 1217 | drop_calculation: | ||
| 1218 | dev->noisecalc.calculation_running = 0; | 1222 | dev->noisecalc.calculation_running = 0; |
| 1219 | return; | 1223 | return; |
| 1220 | } | 1224 | } |
| 1221 | generate_new: | 1225 | generate_new: |
| 1222 | b43_generate_noise_sample(dev); | 1226 | b43_generate_noise_sample(dev); |
| 1223 | } | 1227 | } |
| 1224 | 1228 | ||
