ath9k: disable phy error reporting on the rx queue to improve stability under noisy...
[oweals/openwrt.git] / package / mac80211 / patches / 551-ath9k_fix_keymiss_handling.patch
1 --- a/drivers/net/wireless/ath/ath9k/ar9003_mac.c
2 +++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c
3 @@ -525,8 +525,8 @@ int ath9k_hw_process_rxdesc_edma(struct 
4                         rxs->rs_status |= ATH9K_RXERR_DECRYPT;
5                 else if (rxsp->status11 & AR_MichaelErr)
6                         rxs->rs_status |= ATH9K_RXERR_MIC;
7 -               else if (rxsp->status11 & AR_KeyMiss)
8 -                       rxs->rs_status |= ATH9K_RXERR_DECRYPT;
9 +               if (rxsp->status11 & AR_KeyMiss)
10 +                       rxs->rs_status |= ATH9K_RXERR_KEYMISS;
11         }
12  
13         return 0;
14 --- a/drivers/net/wireless/ath/ath9k/mac.c
15 +++ b/drivers/net/wireless/ath/ath9k/mac.c
16 @@ -620,8 +620,8 @@ int ath9k_hw_rxprocdesc(struct ath_hw *a
17                         rs->rs_status |= ATH9K_RXERR_DECRYPT;
18                 else if (ads.ds_rxstatus8 & AR_MichaelErr)
19                         rs->rs_status |= ATH9K_RXERR_MIC;
20 -               else if (ads.ds_rxstatus8 & AR_KeyMiss)
21 -                       rs->rs_status |= ATH9K_RXERR_DECRYPT;
22 +               if (ads.ds_rxstatus8 & AR_KeyMiss)
23 +                       rs->rs_status |= ATH9K_RXERR_KEYMISS;
24         }
25  
26         return 0;
27 --- a/drivers/net/wireless/ath/ath9k/mac.h
28 +++ b/drivers/net/wireless/ath/ath9k/mac.h
29 @@ -181,6 +181,7 @@ struct ath_htc_rx_status {
30  #define ATH9K_RXERR_FIFO          0x04
31  #define ATH9K_RXERR_DECRYPT       0x08
32  #define ATH9K_RXERR_MIC           0x10
33 +#define ATH9K_RXERR_KEYMISS       0x20
34  
35  #define ATH9K_RX_MORE             0x01
36  #define ATH9K_RX_MORE_AGGR        0x02
37 --- a/drivers/net/wireless/ath/ath9k/recv.c
38 +++ b/drivers/net/wireless/ath/ath9k/recv.c
39 @@ -826,7 +826,8 @@ static bool ath9k_rx_accept(struct ath_c
40                 test_bit(rx_stats->rs_keyix, common->tkip_keymap);
41         strip_mic = is_valid_tkip && ieee80211_is_data(fc) &&
42                 !(rx_stats->rs_status &
43 -               (ATH9K_RXERR_DECRYPT | ATH9K_RXERR_CRC | ATH9K_RXERR_MIC));
44 +               (ATH9K_RXERR_DECRYPT | ATH9K_RXERR_CRC | ATH9K_RXERR_MIC |
45 +                ATH9K_RXERR_KEYMISS));
46  
47         if (!rx_stats->rs_datalen)
48                 return false;
49 @@ -854,6 +855,8 @@ static bool ath9k_rx_accept(struct ath_c
50          * descriptors.
51          */
52         if (rx_stats->rs_status != 0) {
53 +               u8 status_mask;
54 +
55                 if (rx_stats->rs_status & ATH9K_RXERR_CRC) {
56                         rxs->flag |= RX_FLAG_FAILED_FCS_CRC;
57                         mic_error = false;
58 @@ -861,7 +864,8 @@ static bool ath9k_rx_accept(struct ath_c
59                 if (rx_stats->rs_status & ATH9K_RXERR_PHY)
60                         return false;
61  
62 -               if (rx_stats->rs_status & ATH9K_RXERR_DECRYPT) {
63 +               if ((rx_stats->rs_status & ATH9K_RXERR_DECRYPT) ||
64 +                   (!is_mc && (rx_stats->rs_status & ATH9K_RXERR_KEYMISS))) {
65                         *decrypt_error = true;
66                         mic_error = false;
67                 }
68 @@ -871,17 +875,14 @@ static bool ath9k_rx_accept(struct ath_c
69                  * decryption and MIC failures. For monitor mode,
70                  * we also ignore the CRC error.
71                  */
72 -               if (ah->is_monitoring) {
73 -                       if (rx_stats->rs_status &
74 -                           ~(ATH9K_RXERR_DECRYPT | ATH9K_RXERR_MIC |
75 -                             ATH9K_RXERR_CRC))
76 -                               return false;
77 -               } else {
78 -                       if (rx_stats->rs_status &
79 -                           ~(ATH9K_RXERR_DECRYPT | ATH9K_RXERR_MIC)) {
80 -                               return false;
81 -                       }
82 -               }
83 +               status_mask = ATH9K_RXERR_DECRYPT | ATH9K_RXERR_MIC |
84 +                             ATH9K_RXERR_KEYMISS;
85 +
86 +               if (ah->is_monitoring)
87 +                       status_mask |= ATH9K_RXERR_CRC;
88 +
89 +               if (rx_stats->rs_status & ~status_mask)
90 +                       return false;
91         }
92  
93         /*