aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath/ath9k/antenna.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/antenna.c')
-rw-r--r--drivers/net/wireless/ath/ath9k/antenna.c173
1 files changed, 79 insertions, 94 deletions
diff --git a/drivers/net/wireless/ath/ath9k/antenna.c b/drivers/net/wireless/ath/ath9k/antenna.c
index 6495fc620b40..ea4ee08cddf2 100644
--- a/drivers/net/wireless/ath/ath9k/antenna.c
+++ b/drivers/net/wireless/ath/ath9k/antenna.c
@@ -125,6 +125,74 @@ static void ath_lnaconf_alt_good_scan(struct ath_ant_comb *antcomb,
125 } 125 }
126} 126}
127 127
128static void ath_ant_set_alt_ratio(struct ath_ant_comb *antcomb,
129 struct ath_hw_antcomb_conf *conf)
130{
131 /* set alt to the conf with maximun ratio */
132 if (antcomb->first_ratio && antcomb->second_ratio) {
133 if (antcomb->rssi_second > antcomb->rssi_third) {
134 /* first alt*/
135 if ((antcomb->first_quick_scan_conf == ATH_ANT_DIV_COMB_LNA1) ||
136 (antcomb->first_quick_scan_conf == ATH_ANT_DIV_COMB_LNA2))
137 /* Set alt LNA1 or LNA2*/
138 if (conf->main_lna_conf == ATH_ANT_DIV_COMB_LNA2)
139 conf->alt_lna_conf = ATH_ANT_DIV_COMB_LNA1;
140 else
141 conf->alt_lna_conf = ATH_ANT_DIV_COMB_LNA2;
142 else
143 /* Set alt to A+B or A-B */
144 conf->alt_lna_conf =
145 antcomb->first_quick_scan_conf;
146 } else if ((antcomb->second_quick_scan_conf == ATH_ANT_DIV_COMB_LNA1) ||
147 (antcomb->second_quick_scan_conf == ATH_ANT_DIV_COMB_LNA2)) {
148 /* Set alt LNA1 or LNA2 */
149 if (conf->main_lna_conf == ATH_ANT_DIV_COMB_LNA2)
150 conf->alt_lna_conf = ATH_ANT_DIV_COMB_LNA1;
151 else
152 conf->alt_lna_conf = ATH_ANT_DIV_COMB_LNA2;
153 } else {
154 /* Set alt to A+B or A-B */
155 conf->alt_lna_conf = antcomb->second_quick_scan_conf;
156 }
157 } else if (antcomb->first_ratio) {
158 /* first alt */
159 if ((antcomb->first_quick_scan_conf == ATH_ANT_DIV_COMB_LNA1) ||
160 (antcomb->first_quick_scan_conf == ATH_ANT_DIV_COMB_LNA2))
161 /* Set alt LNA1 or LNA2 */
162 if (conf->main_lna_conf == ATH_ANT_DIV_COMB_LNA2)
163 conf->alt_lna_conf = ATH_ANT_DIV_COMB_LNA1;
164 else
165 conf->alt_lna_conf = ATH_ANT_DIV_COMB_LNA2;
166 else
167 /* Set alt to A+B or A-B */
168 conf->alt_lna_conf = antcomb->first_quick_scan_conf;
169 } else if (antcomb->second_ratio) {
170 /* second alt */
171 if ((antcomb->second_quick_scan_conf == ATH_ANT_DIV_COMB_LNA1) ||
172 (antcomb->second_quick_scan_conf == ATH_ANT_DIV_COMB_LNA2))
173 /* Set alt LNA1 or LNA2 */
174 if (conf->main_lna_conf == ATH_ANT_DIV_COMB_LNA2)
175 conf->alt_lna_conf = ATH_ANT_DIV_COMB_LNA1;
176 else
177 conf->alt_lna_conf = ATH_ANT_DIV_COMB_LNA2;
178 else
179 /* Set alt to A+B or A-B */
180 conf->alt_lna_conf = antcomb->second_quick_scan_conf;
181 } else {
182 /* main is largest */
183 if ((antcomb->main_conf == ATH_ANT_DIV_COMB_LNA1) ||
184 (antcomb->main_conf == ATH_ANT_DIV_COMB_LNA2))
185 /* Set alt LNA1 or LNA2 */
186 if (conf->main_lna_conf == ATH_ANT_DIV_COMB_LNA2)
187 conf->alt_lna_conf = ATH_ANT_DIV_COMB_LNA1;
188 else
189 conf->alt_lna_conf = ATH_ANT_DIV_COMB_LNA2;
190 else
191 /* Set alt to A+B or A-B */
192 conf->alt_lna_conf = antcomb->main_conf;
193 }
194}
195
128static void ath_select_ant_div_from_quick_scan(struct ath_ant_comb *antcomb, 196static void ath_select_ant_div_from_quick_scan(struct ath_ant_comb *antcomb,
129 struct ath_hw_antcomb_conf *div_ant_conf, 197 struct ath_hw_antcomb_conf *div_ant_conf,
130 int main_rssi_avg, int alt_rssi_avg, 198 int main_rssi_avg, int alt_rssi_avg,
@@ -181,17 +249,21 @@ static void ath_select_ant_div_from_quick_scan(struct ath_ant_comb *antcomb,
181 antcomb->rssi_first = main_rssi_avg; 249 antcomb->rssi_first = main_rssi_avg;
182 antcomb->rssi_third = alt_rssi_avg; 250 antcomb->rssi_third = alt_rssi_avg;
183 251
184 if (antcomb->second_quick_scan_conf == ATH_ANT_DIV_COMB_LNA1) 252 switch(antcomb->second_quick_scan_conf) {
253 case ATH_ANT_DIV_COMB_LNA1:
185 antcomb->rssi_lna1 = alt_rssi_avg; 254 antcomb->rssi_lna1 = alt_rssi_avg;
186 else if (antcomb->second_quick_scan_conf == 255 break;
187 ATH_ANT_DIV_COMB_LNA2) 256 case ATH_ANT_DIV_COMB_LNA2:
188 antcomb->rssi_lna2 = alt_rssi_avg; 257 antcomb->rssi_lna2 = alt_rssi_avg;
189 else if (antcomb->second_quick_scan_conf == 258 break;
190 ATH_ANT_DIV_COMB_LNA1_PLUS_LNA2) { 259 case ATH_ANT_DIV_COMB_LNA1_PLUS_LNA2:
191 if (antcomb->main_conf == ATH_ANT_DIV_COMB_LNA2) 260 if (antcomb->main_conf == ATH_ANT_DIV_COMB_LNA2)
192 antcomb->rssi_lna2 = main_rssi_avg; 261 antcomb->rssi_lna2 = main_rssi_avg;
193 else if (antcomb->main_conf == ATH_ANT_DIV_COMB_LNA1) 262 else if (antcomb->main_conf == ATH_ANT_DIV_COMB_LNA1)
194 antcomb->rssi_lna1 = main_rssi_avg; 263 antcomb->rssi_lna1 = main_rssi_avg;
264 break;
265 default:
266 break;
195 } 267 }
196 268
197 if (antcomb->rssi_lna2 > antcomb->rssi_lna1 + 269 if (antcomb->rssi_lna2 > antcomb->rssi_lna1 +
@@ -229,95 +301,8 @@ static void ath_select_ant_div_from_quick_scan(struct ath_ant_comb *antcomb,
229 antcomb->second_ratio = false; 301 antcomb->second_ratio = false;
230 } 302 }
231 303
232 /* set alt to the conf with maximun ratio */ 304 ath_ant_set_alt_ratio(antcomb, div_ant_conf);
233 if (antcomb->first_ratio && antcomb->second_ratio) { 305
234 if (antcomb->rssi_second > antcomb->rssi_third) {
235 /* first alt*/
236 if ((antcomb->first_quick_scan_conf ==
237 ATH_ANT_DIV_COMB_LNA1) ||
238 (antcomb->first_quick_scan_conf ==
239 ATH_ANT_DIV_COMB_LNA2))
240 /* Set alt LNA1 or LNA2*/
241 if (div_ant_conf->main_lna_conf ==
242 ATH_ANT_DIV_COMB_LNA2)
243 div_ant_conf->alt_lna_conf =
244 ATH_ANT_DIV_COMB_LNA1;
245 else
246 div_ant_conf->alt_lna_conf =
247 ATH_ANT_DIV_COMB_LNA2;
248 else
249 /* Set alt to A+B or A-B */
250 div_ant_conf->alt_lna_conf =
251 antcomb->first_quick_scan_conf;
252 } else if ((antcomb->second_quick_scan_conf ==
253 ATH_ANT_DIV_COMB_LNA1) ||
254 (antcomb->second_quick_scan_conf ==
255 ATH_ANT_DIV_COMB_LNA2)) {
256 /* Set alt LNA1 or LNA2 */
257 if (div_ant_conf->main_lna_conf ==
258 ATH_ANT_DIV_COMB_LNA2)
259 div_ant_conf->alt_lna_conf =
260 ATH_ANT_DIV_COMB_LNA1;
261 else
262 div_ant_conf->alt_lna_conf =
263 ATH_ANT_DIV_COMB_LNA2;
264 } else {
265 /* Set alt to A+B or A-B */
266 div_ant_conf->alt_lna_conf =
267 antcomb->second_quick_scan_conf;
268 }
269 } else if (antcomb->first_ratio) {
270 /* first alt */
271 if ((antcomb->first_quick_scan_conf ==
272 ATH_ANT_DIV_COMB_LNA1) ||
273 (antcomb->first_quick_scan_conf ==
274 ATH_ANT_DIV_COMB_LNA2))
275 /* Set alt LNA1 or LNA2 */
276 if (div_ant_conf->main_lna_conf ==
277 ATH_ANT_DIV_COMB_LNA2)
278 div_ant_conf->alt_lna_conf =
279 ATH_ANT_DIV_COMB_LNA1;
280 else
281 div_ant_conf->alt_lna_conf =
282 ATH_ANT_DIV_COMB_LNA2;
283 else
284 /* Set alt to A+B or A-B */
285 div_ant_conf->alt_lna_conf =
286 antcomb->first_quick_scan_conf;
287 } else if (antcomb->second_ratio) {
288 /* second alt */
289 if ((antcomb->second_quick_scan_conf ==
290 ATH_ANT_DIV_COMB_LNA1) ||
291 (antcomb->second_quick_scan_conf ==
292 ATH_ANT_DIV_COMB_LNA2))
293 /* Set alt LNA1 or LNA2 */
294 if (div_ant_conf->main_lna_conf ==
295 ATH_ANT_DIV_COMB_LNA2)
296 div_ant_conf->alt_lna_conf =
297 ATH_ANT_DIV_COMB_LNA1;
298 else
299 div_ant_conf->alt_lna_conf =
300 ATH_ANT_DIV_COMB_LNA2;
301 else
302 /* Set alt to A+B or A-B */
303 div_ant_conf->alt_lna_conf =
304 antcomb->second_quick_scan_conf;
305 } else {
306 /* main is largest */
307 if ((antcomb->main_conf == ATH_ANT_DIV_COMB_LNA1) ||
308 (antcomb->main_conf == ATH_ANT_DIV_COMB_LNA2))
309 /* Set alt LNA1 or LNA2 */
310 if (div_ant_conf->main_lna_conf ==
311 ATH_ANT_DIV_COMB_LNA2)
312 div_ant_conf->alt_lna_conf =
313 ATH_ANT_DIV_COMB_LNA1;
314 else
315 div_ant_conf->alt_lna_conf =
316 ATH_ANT_DIV_COMB_LNA2;
317 else
318 /* Set alt to A+B or A-B */
319 div_ant_conf->alt_lna_conf = antcomb->main_conf;
320 }
321 break; 306 break;
322 default: 307 default:
323 break; 308 break;