94e0154551da00d773e2fe7d6a04a682215e13a6
[openwrt/staging/wigyori.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) {