b43: Pass more RX flags to mac80211
authorMichael Buesch <mb@bu3sch.de>
Mon, 2 Mar 2009 22:18:37 +0000 (23:18 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Thu, 5 Mar 2009 19:39:40 +0000 (14:39 -0500)
This changes the RX handler to pass more status flags to mac80211.
It also changes part of the drop policy, if bad frames were requested. (Note that
currently mac80211 will throw a WARN_ON in that case. But nothing bad will happen).

This also removes some obsolete unused timestamping code.

Signed-off-by: Michael Buesch <mb@bu3sch.de>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/b43/b43.h
drivers/net/wireless/b43/dma.c
drivers/net/wireless/b43/xmit.c

index b45731012782db3f58d54ccd97c496ff57a92627..beaf18d6e8a7c95f5f41f902de405c242f3254a2 100644 (file)
@@ -550,9 +550,6 @@ struct b43_noise_calculation {
 
 struct b43_stats {
        u8 link_noise;
-       /* Store the last TX/RX times here for updating the leds. */
-       unsigned long last_tx;
-       unsigned long last_rx;
 };
 
 struct b43_key {
index 92e1c0189a65f1947c6651e1f7b42061d91e2d62..0cc804d0a214fcad833c7dcdbd2afd6e7451aee3 100644 (file)
@@ -1425,7 +1425,6 @@ void b43_dma_handle_txstatus(struct b43_wldev *dev,
                        break;
                slot = next_slot(ring, slot);
        }
-       dev->stats.last_tx = jiffies;
        if (ring->stopped) {
                B43_WARN_ON(free_slots(ring) < TX_SLOTS_PER_FRAME);
                ieee80211_wake_queue(dev->wl->hw, ring->queue_prio);
index eae9b8052658c3c28de328df9016a0bb82917ff8..0f53c7e5e01e99d1377993acb772958cb2f6117e 100644 (file)
@@ -538,8 +538,14 @@ void b43_rx(struct b43_wldev *dev, struct sk_buff *skb, const void *_rxhdr)
        chanstat = le16_to_cpu(rxhdr->channel);
        phytype = chanstat & B43_RX_CHAN_PHYTYPE;
 
-       if (macstat & B43_RX_MAC_FCSERR)
+       if (unlikely(macstat & B43_RX_MAC_FCSERR)) {
                dev->wl->ieee_stats.dot11FCSErrorCount++;
+               status.flag |= RX_FLAG_FAILED_FCS_CRC;
+       }
+       if (unlikely(phystat0 & (B43_RX_PHYST0_PLCPHCF | B43_RX_PHYST0_PLCPFV)))
+               status.flag |= RX_FLAG_FAILED_PLCP_CRC;
+       if (phystat0 & B43_RX_PHYST0_SHORTPRMBL)
+               status.flag |= RX_FLAG_SHORTPRE;
        if (macstat & B43_RX_MAC_DECERR) {
                /* Decryption with the given key failed.
                 * Drop the packet. We also won't be able to decrypt it with
@@ -606,8 +612,12 @@ void b43_rx(struct b43_wldev *dev, struct sk_buff *skb, const void *_rxhdr)
                                                phytype == B43_PHYTYPE_A);
        else
                status.rate_idx = b43_plcp_get_bitrate_idx_cck(plcp);
-       if (unlikely(status.rate_idx == -1))
-               goto drop;
+       if (unlikely(status.rate_idx == -1)) {
+               /* PLCP seems to be corrupted.
+                * Drop the frame, if we are not interested in corrupted frames. */
+               if (!(dev->wl->filter_flags & FIF_PLCPFAIL))
+                       goto drop;
+       }
        status.antenna = !!(phystat0 & B43_RX_PHYST0_ANT);
 
        /*
@@ -661,7 +671,6 @@ void b43_rx(struct b43_wldev *dev, struct sk_buff *skb, const void *_rxhdr)
                goto drop;
        }
 
-       dev->stats.last_rx = jiffies;
        ieee80211_rx_irqsafe(dev->wl->hw, skb, &status);
 
        return;