|
@@ -28,6 +28,33 @@ static inline bool ath_is_alt_ant_ratio_better(int alt_ratio, int maxdelta,
|
|
|
(alt_rssi_avg > main_rssi_avg + mindelta)) && (pkt_count > 50);
|
|
|
}
|
|
|
|
|
|
+static inline bool ath_ant_div_comb_alt_check(u8 div_group, int alt_ratio,
|
|
|
+ int curr_main_set, int curr_alt_set,
|
|
|
+ int alt_rssi_avg, int main_rssi_avg)
|
|
|
+{
|
|
|
+ bool result = false;
|
|
|
+ switch (div_group) {
|
|
|
+ case 0:
|
|
|
+ if (alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO)
|
|
|
+ result = true;
|
|
|
+ break;
|
|
|
+ case 1:
|
|
|
+ if ((((curr_main_set == ATH_ANT_DIV_COMB_LNA2) &&
|
|
|
+ (curr_alt_set == ATH_ANT_DIV_COMB_LNA1) &&
|
|
|
+ (alt_rssi_avg >= (main_rssi_avg - 5))) ||
|
|
|
+ ((curr_main_set == ATH_ANT_DIV_COMB_LNA1) &&
|
|
|
+ (curr_alt_set == ATH_ANT_DIV_COMB_LNA2) &&
|
|
|
+ (alt_rssi_avg >= (main_rssi_avg - 2)))) &&
|
|
|
+ (alt_rssi_avg >= 4))
|
|
|
+ result = true;
|
|
|
+ else
|
|
|
+ result = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
static inline bool ath9k_check_auto_sleep(struct ath_softc *sc)
|
|
|
{
|
|
|
return sc->ps_enabled &&
|
|
@@ -1413,7 +1440,9 @@ static void ath_ant_comb_scan(struct ath_softc *sc, struct ath_rx_status *rs)
|
|
|
}
|
|
|
|
|
|
if (!antcomb->scan) {
|
|
|
- if (alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO) {
|
|
|
+ if (ath_ant_div_comb_alt_check(div_ant_conf.div_group,
|
|
|
+ alt_ratio, curr_main_set, curr_alt_set,
|
|
|
+ alt_rssi_avg, main_rssi_avg)) {
|
|
|
if (curr_alt_set == ATH_ANT_DIV_COMB_LNA2) {
|
|
|
/* Switch main and alt LNA */
|
|
|
div_ant_conf.main_lna_conf =
|