ath9k: Use a subroutine to try LNA switch
Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
552bde40dd
commit
ef999114ee
@ -25,7 +25,7 @@ static inline bool ath_is_alt_ant_ratio_better(int alt_ratio, int maxdelta,
|
|||||||
(alt_rssi_avg > main_rssi_avg + mindelta)) && (pkt_count > 50);
|
(alt_rssi_avg > main_rssi_avg + mindelta)) && (pkt_count > 50);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool ath_ant_div_comb_alt_check(struct ath_hw_antcomb_conf conf,
|
static inline bool ath_ant_div_comb_alt_check(struct ath_hw_antcomb_conf *conf,
|
||||||
int alt_ratio, int alt_rssi_avg,
|
int alt_ratio, int alt_rssi_avg,
|
||||||
int main_rssi_avg)
|
int main_rssi_avg)
|
||||||
{
|
{
|
||||||
@ -33,15 +33,15 @@ static inline bool ath_ant_div_comb_alt_check(struct ath_hw_antcomb_conf conf,
|
|||||||
|
|
||||||
result = set1 = set2 = false;
|
result = set1 = set2 = false;
|
||||||
|
|
||||||
if (conf.main_lna_conf == ATH_ANT_DIV_COMB_LNA2 &&
|
if (conf->main_lna_conf == ATH_ANT_DIV_COMB_LNA2 &&
|
||||||
conf.alt_lna_conf == ATH_ANT_DIV_COMB_LNA1)
|
conf->alt_lna_conf == ATH_ANT_DIV_COMB_LNA1)
|
||||||
set1 = true;
|
set1 = true;
|
||||||
|
|
||||||
if (conf.main_lna_conf == ATH_ANT_DIV_COMB_LNA1 &&
|
if (conf->main_lna_conf == ATH_ANT_DIV_COMB_LNA1 &&
|
||||||
conf.alt_lna_conf == ATH_ANT_DIV_COMB_LNA2)
|
conf->alt_lna_conf == ATH_ANT_DIV_COMB_LNA2)
|
||||||
set2 = true;
|
set2 = true;
|
||||||
|
|
||||||
switch (conf.div_group) {
|
switch (conf->div_group) {
|
||||||
case 0:
|
case 0:
|
||||||
if (alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO)
|
if (alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO)
|
||||||
result = true;
|
result = true;
|
||||||
@ -557,6 +557,43 @@ static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool ath_ant_try_switch(struct ath_hw_antcomb_conf *div_ant_conf,
|
||||||
|
int alt_ratio, int alt_rssi_avg,
|
||||||
|
int main_rssi_avg, int curr_main_set,
|
||||||
|
int curr_alt_set)
|
||||||
|
{
|
||||||
|
bool ret = false;
|
||||||
|
|
||||||
|
if (ath_ant_div_comb_alt_check(div_ant_conf, alt_ratio,
|
||||||
|
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 = ATH_ANT_DIV_COMB_LNA2;
|
||||||
|
div_ant_conf->alt_lna_conf = ATH_ANT_DIV_COMB_LNA1;
|
||||||
|
} else if (curr_alt_set == ATH_ANT_DIV_COMB_LNA1) {
|
||||||
|
div_ant_conf->main_lna_conf = ATH_ANT_DIV_COMB_LNA1;
|
||||||
|
div_ant_conf->alt_lna_conf = ATH_ANT_DIV_COMB_LNA2;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = true;
|
||||||
|
} else if ((curr_alt_set != ATH_ANT_DIV_COMB_LNA1) &&
|
||||||
|
(curr_alt_set != ATH_ANT_DIV_COMB_LNA2)) {
|
||||||
|
/*
|
||||||
|
Set alt to another LNA.
|
||||||
|
*/
|
||||||
|
if (curr_main_set == ATH_ANT_DIV_COMB_LNA2)
|
||||||
|
div_ant_conf->alt_lna_conf = ATH_ANT_DIV_COMB_LNA1;
|
||||||
|
else if (curr_main_set == ATH_ANT_DIV_COMB_LNA1)
|
||||||
|
div_ant_conf->alt_lna_conf = ATH_ANT_DIV_COMB_LNA2;
|
||||||
|
|
||||||
|
ret = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static bool ath_ant_short_scan_check(struct ath_ant_comb *antcomb)
|
static bool ath_ant_short_scan_check(struct ath_ant_comb *antcomb)
|
||||||
{
|
{
|
||||||
int alt_ratio;
|
int alt_ratio;
|
||||||
@ -587,7 +624,7 @@ void ath_ant_comb_scan(struct ath_softc *sc, struct ath_rx_status *rs)
|
|||||||
int main_rssi = rs->rs_rssi_ctl0;
|
int main_rssi = rs->rs_rssi_ctl0;
|
||||||
int alt_rssi = rs->rs_rssi_ctl1;
|
int alt_rssi = rs->rs_rssi_ctl1;
|
||||||
int rx_ant_conf, main_ant_conf;
|
int rx_ant_conf, main_ant_conf;
|
||||||
bool short_scan = false;
|
bool short_scan = false, ret;
|
||||||
|
|
||||||
rx_ant_conf = (rs->rs_rssi_ctl2 >> ATH_ANT_RX_CURRENT_SHIFT) &
|
rx_ant_conf = (rs->rs_rssi_ctl2 >> ATH_ANT_RX_CURRENT_SHIFT) &
|
||||||
ATH_ANT_RX_MASK;
|
ATH_ANT_RX_MASK;
|
||||||
@ -627,11 +664,9 @@ void ath_ant_comb_scan(struct ath_softc *sc, struct ath_rx_status *rs)
|
|||||||
antcomb->total_pkt_count);
|
antcomb->total_pkt_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ath9k_hw_antdiv_comb_conf_get(sc->sc_ah, &div_ant_conf);
|
ath9k_hw_antdiv_comb_conf_get(sc->sc_ah, &div_ant_conf);
|
||||||
curr_alt_set = div_ant_conf.alt_lna_conf;
|
curr_alt_set = div_ant_conf.alt_lna_conf;
|
||||||
curr_main_set = div_ant_conf.main_lna_conf;
|
curr_main_set = div_ant_conf.main_lna_conf;
|
||||||
|
|
||||||
antcomb->count++;
|
antcomb->count++;
|
||||||
|
|
||||||
if (antcomb->count == ATH_ANT_DIV_COMB_MAX_COUNT) {
|
if (antcomb->count == ATH_ANT_DIV_COMB_MAX_COUNT) {
|
||||||
@ -649,40 +684,17 @@ void ath_ant_comb_scan(struct ath_softc *sc, struct ath_rx_status *rs)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!antcomb->scan) {
|
if (!antcomb->scan) {
|
||||||
if (ath_ant_div_comb_alt_check(div_ant_conf, alt_ratio,
|
ret = ath_ant_try_switch(&div_ant_conf, alt_ratio,
|
||||||
alt_rssi_avg, main_rssi_avg)) {
|
alt_rssi_avg, main_rssi_avg,
|
||||||
if (curr_alt_set == ATH_ANT_DIV_COMB_LNA2) {
|
curr_main_set, curr_alt_set);
|
||||||
/* Switch main and alt LNA */
|
if (ret)
|
||||||
div_ant_conf.main_lna_conf =
|
|
||||||
ATH_ANT_DIV_COMB_LNA2;
|
|
||||||
div_ant_conf.alt_lna_conf =
|
|
||||||
ATH_ANT_DIV_COMB_LNA1;
|
|
||||||
} else if (curr_alt_set == ATH_ANT_DIV_COMB_LNA1) {
|
|
||||||
div_ant_conf.main_lna_conf =
|
|
||||||
ATH_ANT_DIV_COMB_LNA1;
|
|
||||||
div_ant_conf.alt_lna_conf =
|
|
||||||
ATH_ANT_DIV_COMB_LNA2;
|
|
||||||
}
|
|
||||||
|
|
||||||
goto div_comb_done;
|
|
||||||
} else if ((curr_alt_set != ATH_ANT_DIV_COMB_LNA1) &&
|
|
||||||
(curr_alt_set != ATH_ANT_DIV_COMB_LNA2)) {
|
|
||||||
/* Set alt to another LNA */
|
|
||||||
if (curr_main_set == ATH_ANT_DIV_COMB_LNA2)
|
|
||||||
div_ant_conf.alt_lna_conf =
|
|
||||||
ATH_ANT_DIV_COMB_LNA1;
|
|
||||||
else if (curr_main_set == ATH_ANT_DIV_COMB_LNA1)
|
|
||||||
div_ant_conf.alt_lna_conf =
|
|
||||||
ATH_ANT_DIV_COMB_LNA2;
|
|
||||||
|
|
||||||
goto div_comb_done;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((alt_rssi_avg < (main_rssi_avg +
|
|
||||||
div_ant_conf.lna1_lna2_delta)))
|
|
||||||
goto div_comb_done;
|
goto div_comb_done;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!antcomb->scan &&
|
||||||
|
(alt_rssi_avg < (main_rssi_avg + div_ant_conf.lna1_lna2_delta)))
|
||||||
|
goto div_comb_done;
|
||||||
|
|
||||||
if (!antcomb->scan_not_start) {
|
if (!antcomb->scan_not_start) {
|
||||||
switch (curr_alt_set) {
|
switch (curr_alt_set) {
|
||||||
case ATH_ANT_DIV_COMB_LNA2:
|
case ATH_ANT_DIV_COMB_LNA2:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user