diff options
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/ar9003_hw.c')
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/ar9003_hw.c | 185 | 
1 files changed, 159 insertions, 26 deletions
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_hw.c b/drivers/net/wireless/ath/ath9k/ar9003_hw.c index b15309caf1d..06416890910 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_hw.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_hw.c @@ -16,7 +16,8 @@  #include "hw.h"  #include "ar9003_mac.h" -#include "ar9003_initvals.h" +#include "ar9003_2p0_initvals.h" +#include "ar9003_2p2_initvals.h"  /* General hardware code for the AR9003 hadware family */ @@ -31,12 +32,8 @@ static bool ar9003_hw_macversion_supported(u32 macversion)  	return false;  } -/* AR9003 2.0 - new INI format (pre, core, post arrays per subsystem) */ -/* - * XXX: move TX/RX gain INI to its own init_mode_gain_regs after - * ensuring it does not affect hardware bring up - */ -static void ar9003_hw_init_mode_regs(struct ath_hw *ah) +/* AR9003 2.0 */ +static void ar9003_2p0_hw_init_mode_regs(struct ath_hw *ah)  {  	/* mac */  	INIT_INI_ARRAY(&ah->iniMac[ATH_INI_PRE], NULL, 0, 0); @@ -106,27 +103,128 @@ static void ar9003_hw_init_mode_regs(struct ath_hw *ah)  		       3);  } +/* AR9003 2.2 */ +static void ar9003_2p2_hw_init_mode_regs(struct ath_hw *ah) +{ +	/* mac */ +	INIT_INI_ARRAY(&ah->iniMac[ATH_INI_PRE], NULL, 0, 0); +	INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE], +		       ar9300_2p2_mac_core, +		       ARRAY_SIZE(ar9300_2p2_mac_core), 2); +	INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST], +		       ar9300_2p2_mac_postamble, +		       ARRAY_SIZE(ar9300_2p2_mac_postamble), 5); + +	/* bb */ +	INIT_INI_ARRAY(&ah->iniBB[ATH_INI_PRE], NULL, 0, 0); +	INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE], +		       ar9300_2p2_baseband_core, +		       ARRAY_SIZE(ar9300_2p2_baseband_core), 2); +	INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST], +		       ar9300_2p2_baseband_postamble, +		       ARRAY_SIZE(ar9300_2p2_baseband_postamble), 5); + +	/* radio */ +	INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_PRE], NULL, 0, 0); +	INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE], +		       ar9300_2p2_radio_core, +		       ARRAY_SIZE(ar9300_2p2_radio_core), 2); +	INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST], +		       ar9300_2p2_radio_postamble, +		       ARRAY_SIZE(ar9300_2p2_radio_postamble), 5); + +	/* soc */ +	INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE], +		       ar9300_2p2_soc_preamble, +		       ARRAY_SIZE(ar9300_2p2_soc_preamble), 2); +	INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_CORE], NULL, 0, 0); +	INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST], +		       ar9300_2p2_soc_postamble, +		       ARRAY_SIZE(ar9300_2p2_soc_postamble), 5); + +	/* rx/tx gain */ +	INIT_INI_ARRAY(&ah->iniModesRxGain, +		       ar9300Common_rx_gain_table_2p2, +		       ARRAY_SIZE(ar9300Common_rx_gain_table_2p2), 2); +	INIT_INI_ARRAY(&ah->iniModesTxGain, +		       ar9300Modes_lowest_ob_db_tx_gain_table_2p2, +		       ARRAY_SIZE(ar9300Modes_lowest_ob_db_tx_gain_table_2p2), +		       5); + +	/* Load PCIE SERDES settings from INI */ + +	/* Awake Setting */ + +	INIT_INI_ARRAY(&ah->iniPcieSerdes, +		       ar9300PciePhy_pll_on_clkreq_disable_L1_2p2, +		       ARRAY_SIZE(ar9300PciePhy_pll_on_clkreq_disable_L1_2p2), +		       2); + +	/* Sleep Setting */ + +	INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower, +		       ar9300PciePhy_clkreq_enable_L1_2p2, +		       ARRAY_SIZE(ar9300PciePhy_clkreq_enable_L1_2p2), +		       2); + +	/* Fast clock modal settings */ +	INIT_INI_ARRAY(&ah->iniModesAdditional, +		       ar9300Modes_fast_clock_2p2, +		       ARRAY_SIZE(ar9300Modes_fast_clock_2p2), +		       3); +} + +/* + * The AR9003 family uses a new INI format (pre, core, post + * arrays per subsystem). + */ +static void ar9003_hw_init_mode_regs(struct ath_hw *ah) +{ +	if (AR_SREV_9300_20(ah)) +		ar9003_2p0_hw_init_mode_regs(ah); +	else +		ar9003_2p2_hw_init_mode_regs(ah); +} +  static void ar9003_tx_gain_table_apply(struct ath_hw *ah)  {  	switch (ar9003_hw_get_tx_gain_idx(ah)) {  	case 0:  	default: -		INIT_INI_ARRAY(&ah->iniModesTxGain, -			       ar9300Modes_lowest_ob_db_tx_gain_table_2p0, -			       ARRAY_SIZE(ar9300Modes_lowest_ob_db_tx_gain_table_2p0), -			       5); +		if (AR_SREV_9300_20(ah)) +			INIT_INI_ARRAY(&ah->iniModesTxGain, +				       ar9300Modes_lowest_ob_db_tx_gain_table_2p0, +				       ARRAY_SIZE(ar9300Modes_lowest_ob_db_tx_gain_table_2p0), +				       5); +		else +			INIT_INI_ARRAY(&ah->iniModesTxGain, +				       ar9300Modes_lowest_ob_db_tx_gain_table_2p2, +				       ARRAY_SIZE(ar9300Modes_lowest_ob_db_tx_gain_table_2p2), +				       5);  		break;  	case 1: -		INIT_INI_ARRAY(&ah->iniModesTxGain, -			       ar9300Modes_high_ob_db_tx_gain_table_2p0, -			       ARRAY_SIZE(ar9300Modes_high_ob_db_tx_gain_table_2p0), -			       5); +		if (AR_SREV_9300_20(ah)) +			INIT_INI_ARRAY(&ah->iniModesTxGain, +				       ar9300Modes_high_ob_db_tx_gain_table_2p0, +				       ARRAY_SIZE(ar9300Modes_high_ob_db_tx_gain_table_2p0), +				       5); +		else +			INIT_INI_ARRAY(&ah->iniModesTxGain, +				       ar9300Modes_high_ob_db_tx_gain_table_2p2, +				       ARRAY_SIZE(ar9300Modes_high_ob_db_tx_gain_table_2p2), +				       5);  		break;  	case 2: -		INIT_INI_ARRAY(&ah->iniModesTxGain, -			       ar9300Modes_low_ob_db_tx_gain_table_2p0, -			       ARRAY_SIZE(ar9300Modes_low_ob_db_tx_gain_table_2p0), -			       5); +		if (AR_SREV_9300_20(ah)) +			INIT_INI_ARRAY(&ah->iniModesTxGain, +				       ar9300Modes_low_ob_db_tx_gain_table_2p0, +				       ARRAY_SIZE(ar9300Modes_low_ob_db_tx_gain_table_2p0), +				       5); +		else +			INIT_INI_ARRAY(&ah->iniModesTxGain, +				       ar9300Modes_low_ob_db_tx_gain_table_2p2, +				       ARRAY_SIZE(ar9300Modes_low_ob_db_tx_gain_table_2p2), +				       5);  		break;  	}  } @@ -136,15 +234,28 @@ static void ar9003_rx_gain_table_apply(struct ath_hw *ah)  	switch (ar9003_hw_get_rx_gain_idx(ah)) {  	case 0:  	default: -		INIT_INI_ARRAY(&ah->iniModesRxGain, ar9300Common_rx_gain_table_2p0, -			       ARRAY_SIZE(ar9300Common_rx_gain_table_2p0), -			       2); +		if (AR_SREV_9300_20(ah)) +			INIT_INI_ARRAY(&ah->iniModesRxGain, +				       ar9300Common_rx_gain_table_2p0, +				       ARRAY_SIZE(ar9300Common_rx_gain_table_2p0), +				       2); +		else +			INIT_INI_ARRAY(&ah->iniModesRxGain, +				       ar9300Common_rx_gain_table_2p2, +				       ARRAY_SIZE(ar9300Common_rx_gain_table_2p2), +				       2);  		break;  	case 1: -		INIT_INI_ARRAY(&ah->iniModesRxGain, -			       ar9300Common_wo_xlna_rx_gain_table_2p0, -			       ARRAY_SIZE(ar9300Common_wo_xlna_rx_gain_table_2p0), -			       2); +		if (AR_SREV_9300_20(ah)) +			INIT_INI_ARRAY(&ah->iniModesRxGain, +				       ar9300Common_wo_xlna_rx_gain_table_2p0, +				       ARRAY_SIZE(ar9300Common_wo_xlna_rx_gain_table_2p0), +				       2); +		else +			INIT_INI_ARRAY(&ah->iniModesRxGain, +				       ar9300Common_wo_xlna_rx_gain_table_2p2, +				       ARRAY_SIZE(ar9300Common_wo_xlna_rx_gain_table_2p2), +				       2);  		break;  	}  } @@ -184,6 +295,26 @@ static void ar9003_hw_configpcipowersave(struct ath_hw *ah,  		/* Several PCIe massages to ensure proper behaviour */  		if (ah->config.pcie_waen)  			REG_WRITE(ah, AR_WA, ah->config.pcie_waen); +		else +			REG_WRITE(ah, AR_WA, ah->WARegVal); +	} + +	/* +	 * Configire PCIE after Ini init. SERDES values now come from ini file +	 * This enables PCIe low power mode. +	 */ +	if (ah->config.pcieSerDesWrite) { +		unsigned int i; +		struct ar5416IniArray *array; + +		array = power_off ? &ah->iniPcieSerdes : +				    &ah->iniPcieSerdesLowPower; + +		for (i = 0; i < array->ia_rows; i++) { +			REG_WRITE(ah, +				  INI_RA(array, i, 0), +				  INI_RA(array, i, 1)); +		}  	}  } @@ -202,4 +333,6 @@ void ar9003_hw_attach_ops(struct ath_hw *ah)  	ar9003_hw_attach_phy_ops(ah);  	ar9003_hw_attach_calib_ops(ah);  	ar9003_hw_attach_mac_ops(ah); + +	ath9k_hw_attach_ani_ops_new(ah);  }  |