diff options
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/antenna.c')
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/antenna.c | 117 | 
1 files changed, 69 insertions, 48 deletions
diff --git a/drivers/net/wireless/ath/ath9k/antenna.c b/drivers/net/wireless/ath/ath9k/antenna.c index bbcfeb3b2a6..664844c5d3d 100644 --- a/drivers/net/wireless/ath/ath9k/antenna.c +++ b/drivers/net/wireless/ath/ath9k/antenna.c @@ -311,6 +311,9 @@ static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf,  					  struct ath_ant_comb *antcomb,  					  int alt_ratio)  { +	ant_conf->main_gaintb = 0; +	ant_conf->alt_gaintb = 0; +  	if (ant_conf->div_group == 0) {  		/* Adjust the fast_div_bias based on main and alt lna conf */  		switch ((ant_conf->main_lna_conf << 4) | @@ -360,18 +363,12 @@ static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf,  			ant_conf->alt_lna_conf) {  		case 0x01: /* A-B LNA2 */  			ant_conf->fast_div_bias = 0x1; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0;  			break;  		case 0x02: /* A-B LNA1 */  			ant_conf->fast_div_bias = 0x1; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0;  			break;  		case 0x03: /* A-B A+B */  			ant_conf->fast_div_bias = 0x1; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0;  			break;  		case 0x10: /* LNA2 A-B */  			if (!(antcomb->scan) && @@ -379,13 +376,9 @@ static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf,  				ant_conf->fast_div_bias = 0x3f;  			else  				ant_conf->fast_div_bias = 0x1; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0;  			break;  		case 0x12: /* LNA2 LNA1 */  			ant_conf->fast_div_bias = 0x1; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0;  			break;  		case 0x13: /* LNA2 A+B */  			if (!(antcomb->scan) && @@ -393,8 +386,6 @@ static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf,  				ant_conf->fast_div_bias = 0x3f;  			else  				ant_conf->fast_div_bias = 0x1; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0;  			break;  		case 0x20: /* LNA1 A-B */  			if (!(antcomb->scan) && @@ -402,13 +393,9 @@ static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf,  				ant_conf->fast_div_bias = 0x3f;  			else  				ant_conf->fast_div_bias = 0x1; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0;  			break;  		case 0x21: /* LNA1 LNA2 */  			ant_conf->fast_div_bias = 0x1; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0;  			break;  		case 0x23: /* LNA1 A+B */  			if (!(antcomb->scan) && @@ -416,23 +403,15 @@ static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf,  				ant_conf->fast_div_bias = 0x3f;  			else  				ant_conf->fast_div_bias = 0x1; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0;  			break;  		case 0x30: /* A+B A-B */  			ant_conf->fast_div_bias = 0x1; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0;  			break;  		case 0x31: /* A+B LNA2 */  			ant_conf->fast_div_bias = 0x1; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0;  			break;  		case 0x32: /* A+B LNA1 */  			ant_conf->fast_div_bias = 0x1; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0;  			break;  		default:  			break; @@ -443,18 +422,12 @@ static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf,  				ant_conf->alt_lna_conf) {  		case 0x01: /* A-B LNA2 */  			ant_conf->fast_div_bias = 0x1; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0;  			break;  		case 0x02: /* A-B LNA1 */  			ant_conf->fast_div_bias = 0x1; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0;  			break;  		case 0x03: /* A-B A+B */  			ant_conf->fast_div_bias = 0x1; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0;  			break;  		case 0x10: /* LNA2 A-B */  			if (!(antcomb->scan) && @@ -462,13 +435,9 @@ static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf,  				ant_conf->fast_div_bias = 0x1;  			else  				ant_conf->fast_div_bias = 0x2; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0;  			break;  		case 0x12: /* LNA2 LNA1 */  			ant_conf->fast_div_bias = 0x1; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0;  			break;  		case 0x13: /* LNA2 A+B */  			if (!(antcomb->scan) && @@ -476,8 +445,6 @@ static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf,  				ant_conf->fast_div_bias = 0x1;  			else  				ant_conf->fast_div_bias = 0x2; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0;  			break;  		case 0x20: /* LNA1 A-B */  			if (!(antcomb->scan) && @@ -485,13 +452,9 @@ static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf,  				ant_conf->fast_div_bias = 0x1;  			else  				ant_conf->fast_div_bias = 0x2; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0;  			break;  		case 0x21: /* LNA1 LNA2 */  			ant_conf->fast_div_bias = 0x1; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0;  			break;  		case 0x23: /* LNA1 A+B */  			if (!(antcomb->scan) && @@ -499,23 +462,77 @@ static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf,  				ant_conf->fast_div_bias = 0x1;  			else  				ant_conf->fast_div_bias = 0x2; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0;  			break;  		case 0x30: /* A+B A-B */  			ant_conf->fast_div_bias = 0x1; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0;  			break;  		case 0x31: /* A+B LNA2 */  			ant_conf->fast_div_bias = 0x1; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0;  			break;  		case 0x32: /* A+B LNA1 */  			ant_conf->fast_div_bias = 0x1; -			ant_conf->main_gaintb = 0; -			ant_conf->alt_gaintb = 0; +			break; +		default: +			break; +		} +	} else if (ant_conf->div_group == 3) { +		switch ((ant_conf->main_lna_conf << 4) | +			ant_conf->alt_lna_conf) { +		case 0x01: /* A-B LNA2 */ +			ant_conf->fast_div_bias = 0x1; +			break; +		case 0x02: /* A-B LNA1 */ +			ant_conf->fast_div_bias = 0x39; +			break; +		case 0x03: /* A-B A+B */ +			ant_conf->fast_div_bias = 0x1; +			break; +		case 0x10: /* LNA2 A-B */ +			if ((antcomb->scan == 0) && +			    (alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO)) { +				ant_conf->fast_div_bias = 0x3f; +			} else { +				ant_conf->fast_div_bias = 0x1; +			} +			break; +		case 0x12: /* LNA2 LNA1 */ +			ant_conf->fast_div_bias = 0x39; +			break; +		case 0x13: /* LNA2 A+B */ +			if ((antcomb->scan == 0) && +			    (alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO)) { +				ant_conf->fast_div_bias = 0x3f; +			} else { +				ant_conf->fast_div_bias = 0x1; +			} +			break; +		case 0x20: /* LNA1 A-B */ +			if ((antcomb->scan == 0) && +			    (alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO)) { +				ant_conf->fast_div_bias = 0x3f; +			} else { +				ant_conf->fast_div_bias = 0x4; +			} +			break; +		case 0x21: /* LNA1 LNA2 */ +			ant_conf->fast_div_bias = 0x6; +			break; +		case 0x23: /* LNA1 A+B */ +			if ((antcomb->scan == 0) && +			    (alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO)) { +				ant_conf->fast_div_bias = 0x3f; +			} else { +				ant_conf->fast_div_bias = 0x6; +			} +			break; +		case 0x30: /* A+B A-B */ +			ant_conf->fast_div_bias = 0x1; +			break; +		case 0x31: /* A+B LNA2 */ +			ant_conf->fast_div_bias = 0x6; +			break; +		case 0x32: /* A+B LNA1 */ +			ant_conf->fast_div_bias = 0x1;  			break;  		default:  			break; @@ -759,6 +776,7 @@ div_comb_done:  void ath_ant_comb_update(struct ath_softc *sc)  {  	struct ath_hw *ah = sc->sc_ah; +	struct ath_common *common = ath9k_hw_common(ah);  	struct ath_hw_antcomb_conf div_ant_conf;  	u8 lna_conf; @@ -773,4 +791,7 @@ void ath_ant_comb_update(struct ath_softc *sc)  	div_ant_conf.alt_lna_conf = lna_conf;  	ath9k_hw_antdiv_comb_conf_set(ah, &div_ant_conf); + +	if (common->antenna_diversity) +		ath9k_hw_antctrl_shared_chain_lnadiv(ah, true);  }  |