H A D | antenna.c | 71 static inline bool ath_is_alt_ant_ratio_better(struct ath_ant_comb *antcomb, ath_is_alt_ant_ratio_better() argument 82 if (alt_ratio >= antcomb->ant_ratio2 && ath_is_alt_ant_ratio_better() 83 alt_rssi_avg >= antcomb->low_rssi_thresh && ath_is_alt_ant_ratio_better() 91 struct ath_ant_comb *antcomb, ath_ant_div_comb_alt_check() 114 if (alt_rssi_avg < 4 || alt_rssi_avg < antcomb->low_rssi_thresh) ath_ant_div_comb_alt_check() 119 (alt_ratio > antcomb->ant_ratio)) ath_ant_div_comb_alt_check() 124 if (alt_rssi_avg < 4 || alt_rssi_avg < antcomb->low_rssi_thresh) ath_ant_div_comb_alt_check() 129 (alt_ratio > antcomb->ant_ratio)) ath_ant_div_comb_alt_check() 138 static void ath_lnaconf_alt_good_scan(struct ath_ant_comb *antcomb, ath_lnaconf_alt_good_scan() argument 142 antcomb->quick_scan_cnt = 0; ath_lnaconf_alt_good_scan() 145 antcomb->rssi_lna2 = main_rssi_avg; ath_lnaconf_alt_good_scan() 147 antcomb->rssi_lna1 = main_rssi_avg; ath_lnaconf_alt_good_scan() 151 antcomb->main_conf = ATH_ANT_DIV_COMB_LNA1_MINUS_LNA2; ath_lnaconf_alt_good_scan() 152 antcomb->first_quick_scan_conf = ath_lnaconf_alt_good_scan() 154 antcomb->second_quick_scan_conf = ATH_ANT_DIV_COMB_LNA1; ath_lnaconf_alt_good_scan() 157 antcomb->main_conf = ATH_ANT_DIV_COMB_LNA1_MINUS_LNA2; ath_lnaconf_alt_good_scan() 158 antcomb->first_quick_scan_conf = ath_lnaconf_alt_good_scan() 160 antcomb->second_quick_scan_conf = ATH_ANT_DIV_COMB_LNA2; ath_lnaconf_alt_good_scan() 163 antcomb->main_conf = ATH_ANT_DIV_COMB_LNA2; ath_lnaconf_alt_good_scan() 164 antcomb->first_quick_scan_conf = ath_lnaconf_alt_good_scan() 166 antcomb->second_quick_scan_conf = ath_lnaconf_alt_good_scan() 170 antcomb->main_conf = ATH_ANT_DIV_COMB_LNA1; ath_lnaconf_alt_good_scan() 171 antcomb->first_quick_scan_conf = ath_lnaconf_alt_good_scan() 173 antcomb->second_quick_scan_conf = ath_lnaconf_alt_good_scan() 177 antcomb->main_conf = ATH_ANT_DIV_COMB_LNA1_PLUS_LNA2; ath_lnaconf_alt_good_scan() 178 antcomb->first_quick_scan_conf = ath_lnaconf_alt_good_scan() 180 antcomb->second_quick_scan_conf = ATH_ANT_DIV_COMB_LNA1; ath_lnaconf_alt_good_scan() 183 antcomb->main_conf = ATH_ANT_DIV_COMB_LNA1_PLUS_LNA2; ath_lnaconf_alt_good_scan() 184 antcomb->first_quick_scan_conf = ath_lnaconf_alt_good_scan() 186 antcomb->second_quick_scan_conf = ATH_ANT_DIV_COMB_LNA2; ath_lnaconf_alt_good_scan() 193 static void ath_ant_set_alt_ratio(struct ath_ant_comb *antcomb, ath_ant_set_alt_ratio() argument 197 if (antcomb->first_ratio && antcomb->second_ratio) { ath_ant_set_alt_ratio() 198 if (antcomb->rssi_second > antcomb->rssi_third) { ath_ant_set_alt_ratio() 200 if ((antcomb->first_quick_scan_conf == ATH_ANT_DIV_COMB_LNA1) || ath_ant_set_alt_ratio() 201 (antcomb->first_quick_scan_conf == ATH_ANT_DIV_COMB_LNA2)) ath_ant_set_alt_ratio() 210 antcomb->first_quick_scan_conf; ath_ant_set_alt_ratio() 211 } else if ((antcomb->second_quick_scan_conf == ATH_ANT_DIV_COMB_LNA1) || ath_ant_set_alt_ratio() 212 (antcomb->second_quick_scan_conf == ATH_ANT_DIV_COMB_LNA2)) { ath_ant_set_alt_ratio() 220 conf->alt_lna_conf = antcomb->second_quick_scan_conf; ath_ant_set_alt_ratio() 222 } else if (antcomb->first_ratio) { ath_ant_set_alt_ratio() 224 if ((antcomb->first_quick_scan_conf == ATH_ANT_DIV_COMB_LNA1) || ath_ant_set_alt_ratio() 225 (antcomb->first_quick_scan_conf == ATH_ANT_DIV_COMB_LNA2)) ath_ant_set_alt_ratio() 233 conf->alt_lna_conf = antcomb->first_quick_scan_conf; ath_ant_set_alt_ratio() 234 } else if (antcomb->second_ratio) { ath_ant_set_alt_ratio() 236 if ((antcomb->second_quick_scan_conf == ATH_ANT_DIV_COMB_LNA1) || ath_ant_set_alt_ratio() 237 (antcomb->second_quick_scan_conf == ATH_ANT_DIV_COMB_LNA2)) ath_ant_set_alt_ratio() 245 conf->alt_lna_conf = antcomb->second_quick_scan_conf; ath_ant_set_alt_ratio() 248 if ((antcomb->main_conf == ATH_ANT_DIV_COMB_LNA1) || ath_ant_set_alt_ratio() 249 (antcomb->main_conf == ATH_ANT_DIV_COMB_LNA2)) ath_ant_set_alt_ratio() 257 conf->alt_lna_conf = antcomb->main_conf; ath_ant_set_alt_ratio() 261 static void ath_select_ant_div_from_quick_scan(struct ath_ant_comb *antcomb, ath_select_ant_div_from_quick_scan() argument 267 switch (antcomb->quick_scan_cnt) { ath_select_ant_div_from_quick_scan() 270 div_ant_conf->main_lna_conf = antcomb->main_conf; ath_select_ant_div_from_quick_scan() 271 div_ant_conf->alt_lna_conf = antcomb->first_quick_scan_conf; ath_select_ant_div_from_quick_scan() 275 div_ant_conf->main_lna_conf = antcomb->main_conf; ath_select_ant_div_from_quick_scan() 276 div_ant_conf->alt_lna_conf = antcomb->second_quick_scan_conf; ath_select_ant_div_from_quick_scan() 277 antcomb->rssi_first = main_rssi_avg; ath_select_ant_div_from_quick_scan() 278 antcomb->rssi_second = alt_rssi_avg; ath_select_ant_div_from_quick_scan() 280 if (antcomb->main_conf == ATH_ANT_DIV_COMB_LNA1) { ath_select_ant_div_from_quick_scan() 282 if (ath_is_alt_ant_ratio_better(antcomb, alt_ratio, ath_select_ant_div_from_quick_scan() 286 antcomb->total_pkt_count)) ath_select_ant_div_from_quick_scan() 287 antcomb->first_ratio = true; ath_select_ant_div_from_quick_scan() 289 antcomb->first_ratio = false; ath_select_ant_div_from_quick_scan() 290 } else if (antcomb->main_conf == ATH_ANT_DIV_COMB_LNA2) { ath_select_ant_div_from_quick_scan() 291 if (ath_is_alt_ant_ratio_better(antcomb, alt_ratio, ath_select_ant_div_from_quick_scan() 295 antcomb->total_pkt_count)) ath_select_ant_div_from_quick_scan() 296 antcomb->first_ratio = true; ath_select_ant_div_from_quick_scan() 298 antcomb->first_ratio = false; ath_select_ant_div_from_quick_scan() 300 if (ath_is_alt_ant_ratio_better(antcomb, alt_ratio, ath_select_ant_div_from_quick_scan() 304 antcomb->total_pkt_count)) ath_select_ant_div_from_quick_scan() 305 antcomb->first_ratio = true; ath_select_ant_div_from_quick_scan() 307 antcomb->first_ratio = false; ath_select_ant_div_from_quick_scan() 311 antcomb->alt_good = false; ath_select_ant_div_from_quick_scan() 312 antcomb->scan_not_start = false; ath_select_ant_div_from_quick_scan() 313 antcomb->scan = false; ath_select_ant_div_from_quick_scan() 314 antcomb->rssi_first = main_rssi_avg; ath_select_ant_div_from_quick_scan() 315 antcomb->rssi_third = alt_rssi_avg; ath_select_ant_div_from_quick_scan() 317 switch(antcomb->second_quick_scan_conf) { ath_select_ant_div_from_quick_scan() 319 antcomb->rssi_lna1 = alt_rssi_avg; ath_select_ant_div_from_quick_scan() 322 antcomb->rssi_lna2 = alt_rssi_avg; ath_select_ant_div_from_quick_scan() 325 if (antcomb->main_conf == ATH_ANT_DIV_COMB_LNA2) ath_select_ant_div_from_quick_scan() 326 antcomb->rssi_lna2 = main_rssi_avg; ath_select_ant_div_from_quick_scan() 327 else if (antcomb->main_conf == ATH_ANT_DIV_COMB_LNA1) ath_select_ant_div_from_quick_scan() 328 antcomb->rssi_lna1 = main_rssi_avg; ath_select_ant_div_from_quick_scan() 334 if (antcomb->rssi_lna2 > antcomb->rssi_lna1 + ath_select_ant_div_from_quick_scan() 340 if (antcomb->main_conf == ATH_ANT_DIV_COMB_LNA1) { ath_select_ant_div_from_quick_scan() 341 if (ath_is_alt_ant_ratio_better(antcomb, alt_ratio, ath_select_ant_div_from_quick_scan() 345 antcomb->total_pkt_count)) ath_select_ant_div_from_quick_scan() 346 antcomb->second_ratio = true; ath_select_ant_div_from_quick_scan() 348 antcomb->second_ratio = false; ath_select_ant_div_from_quick_scan() 349 } else if (antcomb->main_conf == ATH_ANT_DIV_COMB_LNA2) { ath_select_ant_div_from_quick_scan() 350 if (ath_is_alt_ant_ratio_better(antcomb, alt_ratio, ath_select_ant_div_from_quick_scan() 354 antcomb->total_pkt_count)) ath_select_ant_div_from_quick_scan() 355 antcomb->second_ratio = true; ath_select_ant_div_from_quick_scan() 357 antcomb->second_ratio = false; ath_select_ant_div_from_quick_scan() 359 if (ath_is_alt_ant_ratio_better(antcomb, alt_ratio, ath_select_ant_div_from_quick_scan() 363 antcomb->total_pkt_count)) ath_select_ant_div_from_quick_scan() 364 antcomb->second_ratio = true; ath_select_ant_div_from_quick_scan() 366 antcomb->second_ratio = false; ath_select_ant_div_from_quick_scan() 369 ath_ant_set_alt_ratio(antcomb, div_ant_conf); ath_select_ant_div_from_quick_scan() 378 struct ath_ant_comb *antcomb, ath_ant_div_conf_fast_divbias() 441 if (!(antcomb->scan) && ath_ant_div_conf_fast_divbias() 451 if (!(antcomb->scan) && ath_ant_div_conf_fast_divbias() 458 if (!(antcomb->scan) && ath_ant_div_conf_fast_divbias() 468 if (!(antcomb->scan) && ath_ant_div_conf_fast_divbias() 500 if (!antcomb->scan && (alt_ratio > antcomb->ant_ratio)) ath_ant_div_conf_fast_divbias() 509 if (!antcomb->scan && (alt_ratio > antcomb->ant_ratio)) ath_ant_div_conf_fast_divbias() 515 if (!antcomb->scan && (alt_ratio > antcomb->ant_ratio)) ath_ant_div_conf_fast_divbias() 524 if (!antcomb->scan && (alt_ratio > antcomb->ant_ratio)) ath_ant_div_conf_fast_divbias() 542 if (antcomb->fast_div_bias) ath_ant_div_conf_fast_divbias() 543 ant_conf->fast_div_bias = antcomb->fast_div_bias; ath_ant_div_conf_fast_divbias() 589 static void ath_ant_try_scan(struct ath_ant_comb *antcomb, ath_ant_try_scan() argument 596 antcomb->rssi_lna2 = alt_rssi_avg; ath_ant_try_scan() 597 antcomb->rssi_lna1 = main_rssi_avg; ath_ant_try_scan() 598 antcomb->scan = true; ath_ant_try_scan() 604 antcomb->rssi_lna1 = alt_rssi_avg; ath_ant_try_scan() 605 antcomb->rssi_lna2 = main_rssi_avg; ath_ant_try_scan() 606 antcomb->scan = true; ath_ant_try_scan() 612 antcomb->rssi_add = alt_rssi_avg; ath_ant_try_scan() 613 antcomb->scan = true; ath_ant_try_scan() 618 antcomb->rssi_sub = alt_rssi_avg; ath_ant_try_scan() 619 antcomb->scan = false; ath_ant_try_scan() 620 if (antcomb->rssi_lna2 > ath_ant_try_scan() 621 (antcomb->rssi_lna1 + conf->lna1_lna2_switch_delta)) { ath_ant_try_scan() 623 if ((antcomb->rssi_add > antcomb->rssi_lna1) && ath_ant_try_scan() 624 (antcomb->rssi_add > antcomb->rssi_sub)) { ath_ant_try_scan() 628 } else if (antcomb->rssi_sub > ath_ant_try_scan() 629 antcomb->rssi_lna1) { ath_ant_try_scan() 640 if ((antcomb->rssi_add > antcomb->rssi_lna2) && ath_ant_try_scan() 641 (antcomb->rssi_add > antcomb->rssi_sub)) { ath_ant_try_scan() 645 } else if (antcomb->rssi_sub > ath_ant_try_scan() 646 antcomb->rssi_lna1) { ath_ant_try_scan() 663 struct ath_ant_comb *antcomb, ath_ant_try_switch() 670 if (ath_ant_div_comb_alt_check(div_ant_conf, antcomb, alt_ratio, ath_ant_try_switch() 700 static bool ath_ant_short_scan_check(struct ath_ant_comb *antcomb) ath_ant_short_scan_check() argument 704 if (!antcomb->scan || !antcomb->alt_good) ath_ant_short_scan_check() 707 if (time_after(jiffies, antcomb->scan_start_time + ath_ant_short_scan_check() 711 if (antcomb->total_pkt_count == ATH_ANT_DIV_COMB_SHORT_SCAN_PKTCOUNT) { ath_ant_short_scan_check() 712 alt_ratio = ((antcomb->alt_recv_cnt * 100) / ath_ant_short_scan_check() 713 antcomb->total_pkt_count); ath_ant_short_scan_check() 714 if (alt_ratio < antcomb->ant_ratio) ath_ant_short_scan_check() 724 struct ath_ant_comb *antcomb = &sc->ant_comb; ath_ant_comb_scan() local 737 if (alt_rssi >= antcomb->low_rssi_thresh) { ath_ant_comb_scan() 738 antcomb->ant_ratio = ATH_ANT_DIV_COMB_ALT_ANT_RATIO; ath_ant_comb_scan() 739 antcomb->ant_ratio2 = ATH_ANT_DIV_COMB_ALT_ANT_RATIO2; ath_ant_comb_scan() 741 antcomb->ant_ratio = ATH_ANT_DIV_COMB_ALT_ANT_RATIO_LOW_RSSI; ath_ant_comb_scan() 742 antcomb->ant_ratio2 = ATH_ANT_DIV_COMB_ALT_ANT_RATIO2_LOW_RSSI; ath_ant_comb_scan() 747 antcomb->total_pkt_count++; ath_ant_comb_scan() 748 antcomb->main_total_rssi += main_rssi; ath_ant_comb_scan() 749 antcomb->alt_total_rssi += alt_rssi; ath_ant_comb_scan() 752 antcomb->main_recv_cnt++; ath_ant_comb_scan() 754 antcomb->alt_recv_cnt++; ath_ant_comb_scan() 766 short_scan = ath_ant_short_scan_check(antcomb); ath_ant_comb_scan() 768 if (((antcomb->total_pkt_count < ATH_ANT_DIV_COMB_MAX_PKTCOUNT) || ath_ant_comb_scan() 772 if (antcomb->total_pkt_count) { ath_ant_comb_scan() 773 alt_ratio = ((antcomb->alt_recv_cnt * 100) / ath_ant_comb_scan() 774 antcomb->total_pkt_count); ath_ant_comb_scan() 775 main_rssi_avg = (antcomb->main_total_rssi / ath_ant_comb_scan() 776 antcomb->total_pkt_count); ath_ant_comb_scan() 777 alt_rssi_avg = (antcomb->alt_total_rssi / ath_ant_comb_scan() 778 antcomb->total_pkt_count); ath_ant_comb_scan() 784 antcomb->count++; ath_ant_comb_scan() 786 if (antcomb->count == ATH_ANT_DIV_COMB_MAX_COUNT) { ath_ant_comb_scan() 787 if (alt_ratio > antcomb->ant_ratio) { ath_ant_comb_scan() 788 ath_lnaconf_alt_good_scan(antcomb, div_ant_conf, ath_ant_comb_scan() 790 antcomb->alt_good = true; ath_ant_comb_scan() 792 antcomb->alt_good = false; ath_ant_comb_scan() 795 antcomb->count = 0; ath_ant_comb_scan() 796 antcomb->scan = true; ath_ant_comb_scan() 797 antcomb->scan_not_start = true; ath_ant_comb_scan() 800 if (!antcomb->scan) { ath_ant_comb_scan() 801 ret = ath_ant_try_switch(&div_ant_conf, antcomb, alt_ratio, ath_ant_comb_scan() 808 if (!antcomb->scan && ath_ant_comb_scan() 812 if (!antcomb->scan_not_start) { ath_ant_comb_scan() 813 ath_ant_try_scan(antcomb, &div_ant_conf, curr_alt_set, ath_ant_comb_scan() 816 if (!antcomb->alt_good) { ath_ant_comb_scan() 817 antcomb->scan_not_start = false; ath_ant_comb_scan() 832 ath_select_ant_div_from_quick_scan(antcomb, &div_ant_conf, ath_ant_comb_scan() 835 antcomb->quick_scan_cnt++; ath_ant_comb_scan() 839 ath_ant_div_conf_fast_divbias(&div_ant_conf, antcomb, alt_ratio); ath_ant_comb_scan() 843 antcomb->scan_start_time = jiffies; ath_ant_comb_scan() 844 antcomb->total_pkt_count = 0; ath_ant_comb_scan() 845 antcomb->main_total_rssi = 0; ath_ant_comb_scan() 846 antcomb->alt_total_rssi = 0; ath_ant_comb_scan() 847 antcomb->main_recv_cnt = 0; ath_ant_comb_scan() 848 antcomb->alt_recv_cnt = 0; ath_ant_comb_scan() 90 ath_ant_div_comb_alt_check(struct ath_hw_antcomb_conf *conf, struct ath_ant_comb *antcomb, int alt_ratio, int alt_rssi_avg, int main_rssi_avg) ath_ant_div_comb_alt_check() argument 377 ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf, struct ath_ant_comb *antcomb, int alt_ratio) ath_ant_div_conf_fast_divbias() argument 662 ath_ant_try_switch(struct ath_hw_antcomb_conf *div_ant_conf, struct ath_ant_comb *antcomb, int alt_ratio, int alt_rssi_avg, int main_rssi_avg, int curr_main_set, int curr_alt_set) ath_ant_try_switch() argument
|