mac80211: update to wireless-testing 2013-11-05
[openwrt.git] / package / kernel / mac80211 / patches / 522-ath9k_per_chain_signal_strength.patch
1 --- a/drivers/net/wireless/ath/ath9k/mac.h
2 +++ b/drivers/net/wireless/ath/ath9k/mac.h
3 @@ -133,12 +133,8 @@ struct ath_rx_status {
4         u8 rs_rate;
5         u8 rs_antenna;
6         u8 rs_more;
7 -       int8_t rs_rssi_ctl0;
8 -       int8_t rs_rssi_ctl1;
9 -       int8_t rs_rssi_ctl2;
10 -       int8_t rs_rssi_ext0;
11 -       int8_t rs_rssi_ext1;
12 -       int8_t rs_rssi_ext2;
13 +       int8_t rs_rssi_ctl[3];
14 +       int8_t rs_rssi_ext[3];
15         u8 rs_isaggr;
16         u8 rs_firstaggr;
17         u8 rs_moreaggr;
18 --- a/drivers/net/wireless/ath/ath9k/recv.c
19 +++ b/drivers/net/wireless/ath/ath9k/recv.c
20 @@ -906,6 +906,7 @@ static void ath9k_process_rssi(struct at
21         struct ath_hw *ah = common->ah;
22         int last_rssi;
23         int rssi = rx_stats->rs_rssi;
24 +       int i, j;
25  
26         /*
27          * RSSI is not available for subframes in an A-MPDU.
28 @@ -924,6 +925,20 @@ static void ath9k_process_rssi(struct at
29                 return;
30         }
31  
32 +       for (i = 0, j = 0; i < ARRAY_SIZE(rx_stats->rs_rssi_ctl); i++) {
33 +               s8 rssi;
34 +
35 +               if (!(ah->rxchainmask & BIT(i)))
36 +                       continue;
37 +
38 +               rssi = rx_stats->rs_rssi_ctl[i];
39 +               if (rssi != ATH9K_RSSI_BAD) {
40 +                   rxs->chains |= BIT(j);
41 +                   rxs->chain_signal[j] = ah->noise + rssi;
42 +               }
43 +               j++;
44 +       }
45 +
46         /*
47          * Update Beacon RSSI, this is used by ANI.
48          */
49 @@ -1073,14 +1088,14 @@ static int ath_process_fft(struct ath_so
50                 fft_sample_40.channel_type = chan_type;
51  
52                 if (chan_type == NL80211_CHAN_HT40PLUS) {
53 -                       lower_rssi = fix_rssi_inv_only(rs->rs_rssi_ctl0);
54 -                       upper_rssi = fix_rssi_inv_only(rs->rs_rssi_ext0);
55 +                       lower_rssi = fix_rssi_inv_only(rs->rs_rssi_ctl[0]);
56 +                       upper_rssi = fix_rssi_inv_only(rs->rs_rssi_ext[0]);
57  
58                         fft_sample_40.lower_noise = ah->noise;
59                         fft_sample_40.upper_noise = ext_nf;
60                 } else {
61 -                       lower_rssi = fix_rssi_inv_only(rs->rs_rssi_ext0);
62 -                       upper_rssi = fix_rssi_inv_only(rs->rs_rssi_ctl0);
63 +                       lower_rssi = fix_rssi_inv_only(rs->rs_rssi_ext[0]);
64 +                       upper_rssi = fix_rssi_inv_only(rs->rs_rssi_ctl[0]);
65  
66                         fft_sample_40.lower_noise = ext_nf;
67                         fft_sample_40.upper_noise = ah->noise;
68 @@ -1116,7 +1131,7 @@ static int ath_process_fft(struct ath_so
69                 fft_sample_20.tlv.length = __cpu_to_be16(length);
70                 fft_sample_20.freq = __cpu_to_be16(freq);
71  
72 -               fft_sample_20.rssi = fix_rssi_inv_only(rs->rs_rssi_ctl0);
73 +               fft_sample_20.rssi = fix_rssi_inv_only(rs->rs_rssi_ctl[0]);
74                 fft_sample_20.noise = ah->noise;
75  
76                 mag_info = ((struct ath_ht20_mag_info *)radar_info) - 1;
77 --- a/drivers/net/wireless/ath/ath9k/ar9003_mac.c
78 +++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c
79 @@ -476,12 +476,12 @@ int ath9k_hw_process_rxdesc_edma(struct 
80  
81         /* XXX: Keycache */
82         rxs->rs_rssi = MS(rxsp->status5, AR_RxRSSICombined);
83 -       rxs->rs_rssi_ctl0 = MS(rxsp->status1, AR_RxRSSIAnt00);
84 -       rxs->rs_rssi_ctl1 = MS(rxsp->status1, AR_RxRSSIAnt01);
85 -       rxs->rs_rssi_ctl2 = MS(rxsp->status1, AR_RxRSSIAnt02);
86 -       rxs->rs_rssi_ext0 = MS(rxsp->status5, AR_RxRSSIAnt10);
87 -       rxs->rs_rssi_ext1 = MS(rxsp->status5, AR_RxRSSIAnt11);
88 -       rxs->rs_rssi_ext2 = MS(rxsp->status5, AR_RxRSSIAnt12);
89 +       rxs->rs_rssi_ctl[0] = MS(rxsp->status1, AR_RxRSSIAnt00);
90 +       rxs->rs_rssi_ctl[1] = MS(rxsp->status1, AR_RxRSSIAnt01);
91 +       rxs->rs_rssi_ctl[2] = MS(rxsp->status1, AR_RxRSSIAnt02);
92 +       rxs->rs_rssi_ext[0] = MS(rxsp->status5, AR_RxRSSIAnt10);
93 +       rxs->rs_rssi_ext[1] = MS(rxsp->status5, AR_RxRSSIAnt11);
94 +       rxs->rs_rssi_ext[2] = MS(rxsp->status5, AR_RxRSSIAnt12);
95  
96         if (rxsp->status11 & AR_RxKeyIdxValid)
97                 rxs->rs_keyix = MS(rxsp->status11, AR_KeyIdx);
98 --- a/drivers/net/wireless/ath/ath9k/mac.c
99 +++ b/drivers/net/wireless/ath/ath9k/mac.c
100 @@ -550,25 +550,25 @@ int ath9k_hw_rxprocdesc(struct ath_hw *a
101  
102         if (ads.ds_rxstatus8 & AR_PostDelimCRCErr) {
103                 rs->rs_rssi = ATH9K_RSSI_BAD;
104 -               rs->rs_rssi_ctl0 = ATH9K_RSSI_BAD;
105 -               rs->rs_rssi_ctl1 = ATH9K_RSSI_BAD;
106 -               rs->rs_rssi_ctl2 = ATH9K_RSSI_BAD;
107 -               rs->rs_rssi_ext0 = ATH9K_RSSI_BAD;
108 -               rs->rs_rssi_ext1 = ATH9K_RSSI_BAD;
109 -               rs->rs_rssi_ext2 = ATH9K_RSSI_BAD;
110 +               rs->rs_rssi_ctl[0] = ATH9K_RSSI_BAD;
111 +               rs->rs_rssi_ctl[1] = ATH9K_RSSI_BAD;
112 +               rs->rs_rssi_ctl[2] = ATH9K_RSSI_BAD;
113 +               rs->rs_rssi_ext[0] = ATH9K_RSSI_BAD;
114 +               rs->rs_rssi_ext[1] = ATH9K_RSSI_BAD;
115 +               rs->rs_rssi_ext[2] = ATH9K_RSSI_BAD;
116         } else {
117                 rs->rs_rssi = MS(ads.ds_rxstatus4, AR_RxRSSICombined);
118 -               rs->rs_rssi_ctl0 = MS(ads.ds_rxstatus0,
119 +               rs->rs_rssi_ctl[0] = MS(ads.ds_rxstatus0,
120                                                 AR_RxRSSIAnt00);
121 -               rs->rs_rssi_ctl1 = MS(ads.ds_rxstatus0,
122 +               rs->rs_rssi_ctl[1] = MS(ads.ds_rxstatus0,
123                                                 AR_RxRSSIAnt01);
124 -               rs->rs_rssi_ctl2 = MS(ads.ds_rxstatus0,
125 +               rs->rs_rssi_ctl[2] = MS(ads.ds_rxstatus0,
126                                                 AR_RxRSSIAnt02);
127 -               rs->rs_rssi_ext0 = MS(ads.ds_rxstatus4,
128 +               rs->rs_rssi_ext[0] = MS(ads.ds_rxstatus4,
129                                                 AR_RxRSSIAnt10);
130 -               rs->rs_rssi_ext1 = MS(ads.ds_rxstatus4,
131 +               rs->rs_rssi_ext[1] = MS(ads.ds_rxstatus4,
132                                                 AR_RxRSSIAnt11);
133 -               rs->rs_rssi_ext2 = MS(ads.ds_rxstatus4,
134 +               rs->rs_rssi_ext[2] = MS(ads.ds_rxstatus4,
135                                                 AR_RxRSSIAnt12);
136         }
137         if (ads.ds_rxstatus8 & AR_RxKeyIdxValid)
138 --- a/drivers/net/wireless/ath/ath9k/dfs.c
139 +++ b/drivers/net/wireless/ath/ath9k/dfs.c
140 @@ -158,8 +158,8 @@ void ath9k_dfs_process_phyerr(struct ath
141                 return;
142         }
143  
144 -       ard.rssi = rs->rs_rssi_ctl0;
145 -       ard.ext_rssi = rs->rs_rssi_ext0;
146 +       ard.rssi = rs->rs_rssi_ctl[0];
147 +       ard.ext_rssi = rs->rs_rssi_ext[0];
148  
149         /*
150          * hardware stores this as 8 bit signed value.
151 --- a/drivers/net/wireless/ath/ath9k/antenna.c
152 +++ b/drivers/net/wireless/ath/ath9k/antenna.c
153 @@ -724,14 +724,14 @@ void ath_ant_comb_scan(struct ath_softc 
154         struct ath_ant_comb *antcomb = &sc->ant_comb;
155         int alt_ratio = 0, alt_rssi_avg = 0, main_rssi_avg = 0, curr_alt_set;
156         int curr_main_set;
157 -       int main_rssi = rs->rs_rssi_ctl0;
158 -       int alt_rssi = rs->rs_rssi_ctl1;
159 +       int main_rssi = rs->rs_rssi_ctl[0];
160 +       int alt_rssi = rs->rs_rssi_ctl[1];
161         int rx_ant_conf,  main_ant_conf;
162         bool short_scan = false, ret;
163  
164 -       rx_ant_conf = (rs->rs_rssi_ctl2 >> ATH_ANT_RX_CURRENT_SHIFT) &
165 +       rx_ant_conf = (rs->rs_rssi_ctl[2] >> ATH_ANT_RX_CURRENT_SHIFT) &
166                        ATH_ANT_RX_MASK;
167 -       main_ant_conf = (rs->rs_rssi_ctl2 >> ATH_ANT_RX_MAIN_SHIFT) &
168 +       main_ant_conf = (rs->rs_rssi_ctl[2] >> ATH_ANT_RX_MAIN_SHIFT) &
169                          ATH_ANT_RX_MASK;
170  
171         if (alt_rssi >= antcomb->low_rssi_thresh) {