diff options
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/ar5008_phy.c')
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/ar5008_phy.c | 724 | 
1 files changed, 163 insertions, 561 deletions
diff --git a/drivers/net/wireless/ath/ath9k/ar5008_phy.c b/drivers/net/wireless/ath/ath9k/ar5008_phy.c index 06e34d293dc..00fb8badbac 100644 --- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c +++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c @@ -1,5 +1,5 @@  /* - * Copyright (c) 2008-2010 Atheros Communications Inc. + * Copyright (c) 2008-2011 Atheros Communications Inc.   *   * Permission to use, copy, modify, and/or distribute this software for any   * purpose with or without fee is hereby granted, provided that the above @@ -18,6 +18,7 @@  #include "hw-ops.h"  #include "../regd.h"  #include "ar9002_phy.h" +#include "ar5008_initvals.h"  /* All code below is for AR5008, AR9001, AR9002 */ @@ -25,10 +26,6 @@ static const int firstep_table[] =  /* level:  0   1   2   3   4   5   6   7   8  */  	{ -4, -2,  0,  2,  4,  6,  8, 10, 12 }; /* lvl 0-8, default 2 */ -static const int cycpwrThr1_table[] = -/* level:  0   1   2   3   4   5   6   7   8  */ -	{ -6, -4, -2,  0,  2,  4,  6,  8 };     /* lvl 0-7, default 3 */ -  /*   * register values to turn OFDM weak signal detection OFF   */ @@ -43,6 +40,27 @@ static const int m2ThreshLowExt_off = 127;  static const int m1ThreshExt_off = 127;  static const int m2ThreshExt_off = 127; +static const struct ar5416IniArray bank0 = STATIC_INI_ARRAY(ar5416Bank0); +static const struct ar5416IniArray bank1 = STATIC_INI_ARRAY(ar5416Bank1); +static const struct ar5416IniArray bank2 = STATIC_INI_ARRAY(ar5416Bank2); +static const struct ar5416IniArray bank3 = STATIC_INI_ARRAY(ar5416Bank3); +static const struct ar5416IniArray bank7 = STATIC_INI_ARRAY(ar5416Bank7); + +static void ar5008_write_bank6(struct ath_hw *ah, unsigned int *writecnt) +{ +	struct ar5416IniArray *array = &ah->iniBank6; +	u32 *data = ah->analogBank6Data; +	int r; + +	ENABLE_REGWRITE_BUFFER(ah); + +	for (r = 0; r < array->ia_rows; r++) { +		REG_WRITE(ah, INI_RA(array, r, 0), data[r]); +		DO_DELAY(*writecnt); +	} + +	REGWRITE_BUFFER_FLUSH(ah); +}  /**   * ar5008_hw_phy_modify_rx_buffer() - perform analog swizzling of parameters @@ -130,20 +148,19 @@ static void ar5008_hw_force_bias(struct ath_hw *ah, u16 synth_freq)  	/* pre-reverse this field */  	tmp_reg = ath9k_hw_reverse_bits(new_bias, 3); -	ath_print(common, ATH_DBG_CONFIG, -		  "Force rf_pwd_icsyndiv to %1d on %4d\n", -		  new_bias, synth_freq); +	ath_dbg(common, CONFIG, "Force rf_pwd_icsyndiv to %1d on %4d\n", +		new_bias, synth_freq);  	/* swizzle rf_pwd_icsyndiv */  	ar5008_hw_phy_modify_rx_buffer(ah->analogBank6Data, tmp_reg, 3, 181, 3);  	/* write Bank 6 with new params */ -	REG_WRITE_RF_ARRAY(&ah->iniBank6, ah->analogBank6Data, reg_writes); +	ar5008_write_bank6(ah, ®_writes);  }  /**   * ar5008_hw_set_channel - tune to a channel on the external AR2133/AR5133 radios - * @ah: atheros hardware stucture + * @ah: atheros hardware structure   * @chan:   *   * For the external AR2133/AR5133 radios, takes the MHz channel value and set @@ -173,8 +190,7 @@ static int ar5008_hw_set_channel(struct ath_hw *ah, struct ath9k_channel *chan)  			channelSel = ((freq - 704) * 2 - 3040) / 10;  			bModeSynth = 1;  		} else { -			ath_print(common, ATH_DBG_FATAL, -				  "Invalid channel %u MHz\n", freq); +			ath_err(common, "Invalid channel %u MHz\n", freq);  			return -EINVAL;  		} @@ -206,8 +222,7 @@ static int ar5008_hw_set_channel(struct ath_hw *ah, struct ath9k_channel *chan)  		channelSel = ath9k_hw_reverse_bits((freq - 4800) / 5, 8);  		aModeRefSel = ath9k_hw_reverse_bits(1, 2);  	} else { -		ath_print(common, ATH_DBG_FATAL, -			  "Invalid channel %u MHz\n", freq); +		ath_err(common, "Invalid channel %u MHz\n", freq);  		return -EINVAL;  	} @@ -220,7 +235,6 @@ static int ar5008_hw_set_channel(struct ath_hw *ah, struct ath9k_channel *chan)  	REG_WRITE(ah, AR_PHY(0x37), reg32);  	ah->curchan = chan; -	ah->curchan_rad_index = -1;  	return 0;  } @@ -445,62 +459,19 @@ static void ar5008_hw_spur_mitigate(struct ath_hw *ah,   */  static int ar5008_hw_rf_alloc_ext_banks(struct ath_hw *ah)  { -#define ATH_ALLOC_BANK(bank, size) do { \ -		bank = kzalloc((sizeof(u32) * size), GFP_KERNEL); \ -		if (!bank) { \ -			ath_print(common, ATH_DBG_FATAL, \ -				  "Cannot allocate RF banks\n"); \ -			return -ENOMEM; \ -		} \ -	} while (0); - -	struct ath_common *common = ath9k_hw_common(ah); +	int size = ah->iniBank6.ia_rows * sizeof(u32); -	BUG_ON(AR_SREV_9280_20_OR_LATER(ah)); +	if (AR_SREV_9280_20_OR_LATER(ah)) +	    return 0; -	ATH_ALLOC_BANK(ah->analogBank0Data, ah->iniBank0.ia_rows); -	ATH_ALLOC_BANK(ah->analogBank1Data, ah->iniBank1.ia_rows); -	ATH_ALLOC_BANK(ah->analogBank2Data, ah->iniBank2.ia_rows); -	ATH_ALLOC_BANK(ah->analogBank3Data, ah->iniBank3.ia_rows); -	ATH_ALLOC_BANK(ah->analogBank6Data, ah->iniBank6.ia_rows); -	ATH_ALLOC_BANK(ah->analogBank6TPCData, ah->iniBank6TPC.ia_rows); -	ATH_ALLOC_BANK(ah->analogBank7Data, ah->iniBank7.ia_rows); -	ATH_ALLOC_BANK(ah->addac5416_21, -		       ah->iniAddac.ia_rows * ah->iniAddac.ia_columns); -	ATH_ALLOC_BANK(ah->bank6Temp, ah->iniBank6.ia_rows); +	ah->analogBank6Data = devm_kzalloc(ah->dev, size, GFP_KERNEL); +	if (!ah->analogBank6Data) +		return -ENOMEM;  	return 0; -#undef ATH_ALLOC_BANK  } -/** - * ar5008_hw_rf_free_ext_banks - Free memory for analog bank scratch buffers - * @ah: atheros hardware struture - * For the external AR2133/AR5133 radios banks. - */ -static void ar5008_hw_rf_free_ext_banks(struct ath_hw *ah) -{ -#define ATH_FREE_BANK(bank) do { \ -		kfree(bank); \ -		bank = NULL; \ -	} while (0); - -	BUG_ON(AR_SREV_9280_20_OR_LATER(ah)); - -	ATH_FREE_BANK(ah->analogBank0Data); -	ATH_FREE_BANK(ah->analogBank1Data); -	ATH_FREE_BANK(ah->analogBank2Data); -	ATH_FREE_BANK(ah->analogBank3Data); -	ATH_FREE_BANK(ah->analogBank6Data); -	ATH_FREE_BANK(ah->analogBank6TPCData); -	ATH_FREE_BANK(ah->analogBank7Data); -	ATH_FREE_BANK(ah->addac5416_21); -	ATH_FREE_BANK(ah->bank6Temp); - -#undef ATH_FREE_BANK -} -  /* *   * ar5008_hw_set_rf_regs - programs rf registers based on EEPROM   * @ah: atheros hardware structure @@ -521,6 +492,7 @@ static bool ar5008_hw_set_rf_regs(struct ath_hw *ah,  	u32 ob5GHz = 0, db5GHz = 0;  	u32 ob2GHz = 0, db2GHz = 0;  	int regWrites = 0; +	int i;  	/*  	 * Software does not need to program bank data @@ -533,25 +505,8 @@ static bool ar5008_hw_set_rf_regs(struct ath_hw *ah,  	/* Setup rf parameters */  	eepMinorRev = ah->eep_ops->get_eeprom(ah, EEP_MINOR_REV); -	/* Setup Bank 0 Write */ -	RF_BANK_SETUP(ah->analogBank0Data, &ah->iniBank0, 1); - -	/* Setup Bank 1 Write */ -	RF_BANK_SETUP(ah->analogBank1Data, &ah->iniBank1, 1); - -	/* Setup Bank 2 Write */ -	RF_BANK_SETUP(ah->analogBank2Data, &ah->iniBank2, 1); - -	/* Setup Bank 6 Write */ -	RF_BANK_SETUP(ah->analogBank3Data, &ah->iniBank3, -		      modesIndex); -	{ -		int i; -		for (i = 0; i < ah->iniBank6TPC.ia_rows; i++) { -			ah->analogBank6Data[i] = -			    INI_RA(&ah->iniBank6TPC, i, modesIndex); -		} -	} +	for (i = 0; i < ah->iniBank6.ia_rows; i++) +		ah->analogBank6Data[i] = INI_RA(&ah->iniBank6, i, modesIndex);  	/* Only the 5 or 2 GHz OB/DB need to be set for a mode */  	if (eepMinorRev >= 2) { @@ -572,22 +527,13 @@ static bool ar5008_hw_set_rf_regs(struct ath_hw *ah,  		}  	} -	/* Setup Bank 7 Setup */ -	RF_BANK_SETUP(ah->analogBank7Data, &ah->iniBank7, 1); -  	/* Write Analog registers */ -	REG_WRITE_RF_ARRAY(&ah->iniBank0, ah->analogBank0Data, -			   regWrites); -	REG_WRITE_RF_ARRAY(&ah->iniBank1, ah->analogBank1Data, -			   regWrites); -	REG_WRITE_RF_ARRAY(&ah->iniBank2, ah->analogBank2Data, -			   regWrites); -	REG_WRITE_RF_ARRAY(&ah->iniBank3, ah->analogBank3Data, -			   regWrites); -	REG_WRITE_RF_ARRAY(&ah->iniBank6TPC, ah->analogBank6Data, -			   regWrites); -	REG_WRITE_RF_ARRAY(&ah->iniBank7, ah->analogBank7Data, -			   regWrites); +	REG_WRITE_ARRAY(&bank0, 1, regWrites); +	REG_WRITE_ARRAY(&bank1, 1, regWrites); +	REG_WRITE_ARRAY(&bank2, 1, regWrites); +	REG_WRITE_ARRAY(&bank3, modesIndex, regWrites); +	ar5008_write_bank6(ah, ®Writes); +	REG_WRITE_ARRAY(&bank7, 1, regWrites);  	return true;  } @@ -598,14 +544,10 @@ static void ar5008_hw_init_bb(struct ath_hw *ah,  	u32 synthDelay;  	synthDelay = REG_READ(ah, AR_PHY_RX_DELAY) & AR_PHY_RX_DELAY_DELAY; -	if (IS_CHAN_B(chan)) -		synthDelay = (4 * synthDelay) / 22; -	else -		synthDelay /= 10;  	REG_WRITE(ah, AR_PHY_ACTIVE, AR_PHY_ACTIVE_EN); -	udelay(synthDelay + BASE_ACTIVATE_DELAY); +	ath9k_hw_synth_delay(ah, chan, synthDelay);  }  static void ar5008_hw_init_chain_masks(struct ath_hw *ah) @@ -664,7 +606,15 @@ static void ar5008_hw_override_ini(struct ath_hw *ah,  	REG_SET_BIT(ah, AR_DIAG_SW, (AR_DIAG_RX_DIS | AR_DIAG_RX_ABORT));  	if (AR_SREV_9280_20_OR_LATER(ah)) { -		val = REG_READ(ah, AR_PCU_MISC_MODE2); +		/* +		 * For AR9280 and above, there is a new feature that allows +		 * Multicast search based on both MAC Address and Key ID. +		 * By default, this feature is enabled. But since the driver +		 * is not using this feature, we switch it off; otherwise +		 * multicast search based on MAC addr only will fail. +		 */ +		val = REG_READ(ah, AR_PCU_MISC_MODE2) & +			(~AR_ADHOC_MCAST_KEYID_ENABLE);  		if (!AR_SREV_9271(ah))  			val &= ~AR_PCU_MISC_MODE2_HWWAR1; @@ -672,11 +622,12 @@ static void ar5008_hw_override_ini(struct ath_hw *ah,  		if (AR_SREV_9287_11_OR_LATER(ah))  			val = val & (~AR_PCU_MISC_MODE2_HWWAR2); +		val |= AR_PCU_MISC_MODE2_CFP_IGNORE; +  		REG_WRITE(ah, AR_PCU_MISC_MODE2, val);  	} -	if (!AR_SREV_5416_20_OR_LATER(ah) || -	    AR_SREV_9280_20_OR_LATER(ah)) +	if (AR_SREV_9280_20_OR_LATER(ah))  		return;  	/*  	 * Disable BB clock gating @@ -711,14 +662,13 @@ static void ar5008_hw_set_channel_regs(struct ath_hw *ah,  	if (IS_CHAN_HT40(chan)) {  		phymode |= AR_PHY_FC_DYN2040_EN; -		if ((chan->chanmode == CHANNEL_A_HT40PLUS) || -		    (chan->chanmode == CHANNEL_G_HT40PLUS)) +		if (IS_CHAN_HT40PLUS(chan))  			phymode |= AR_PHY_FC_DYN2040_PRI_CH;  	}  	REG_WRITE(ah, AR_PHY_TURBO, phymode); -	ath9k_hw_set11nmac2040(ah); +	ath9k_hw_set11nmac2040(ah, chan);  	ENABLE_REGWRITE_BUFFER(ah); @@ -732,36 +682,16 @@ static void ar5008_hw_set_channel_regs(struct ath_hw *ah,  static int ar5008_hw_process_ini(struct ath_hw *ah,  				 struct ath9k_channel *chan)  { -	struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah); +	struct ath_common *common = ath9k_hw_common(ah);  	int i, regWrites = 0; -	struct ieee80211_channel *channel = chan->chan;  	u32 modesIndex, freqIndex; -	switch (chan->chanmode) { -	case CHANNEL_A: -	case CHANNEL_A_HT20: -		modesIndex = 1; +	if (IS_CHAN_5GHZ(chan)) {  		freqIndex = 1; -		break; -	case CHANNEL_A_HT40PLUS: -	case CHANNEL_A_HT40MINUS: -		modesIndex = 2; -		freqIndex = 1; -		break; -	case CHANNEL_G: -	case CHANNEL_G_HT20: -	case CHANNEL_B: -		modesIndex = 4; -		freqIndex = 2; -		break; -	case CHANNEL_G_HT40PLUS: -	case CHANNEL_G_HT40MINUS: -		modesIndex = 3; +		modesIndex = IS_CHAN_HT40(chan) ? 2 : 1; +	} else {  		freqIndex = 2; -		break; - -	default: -		return -EINVAL; +		modesIndex = IS_CHAN_HT40(chan) ? 3 : 4;  	}  	/* @@ -772,29 +702,10 @@ static int ar5008_hw_process_ini(struct ath_hw *ah,  	/* Write ADDAC shifts */  	REG_WRITE(ah, AR_PHY_ADC_SERIAL_CTL, AR_PHY_SEL_EXTERNAL_RADIO); -	ah->eep_ops->set_addac(ah, chan); - -	if (AR_SREV_5416_22_OR_LATER(ah)) { -		REG_WRITE_ARRAY(&ah->iniAddac, 1, regWrites); -	} else { -		struct ar5416IniArray temp; -		u32 addacSize = -			sizeof(u32) * ah->iniAddac.ia_rows * -			ah->iniAddac.ia_columns; - -		/* For AR5416 2.0/2.1 */ -		memcpy(ah->addac5416_21, -		       ah->iniAddac.ia_array, addacSize); - -		/* override CLKDRV value at [row, column] = [31, 1] */ -		(ah->addac5416_21)[31 * ah->iniAddac.ia_columns + 1] = 0; - -		temp.ia_array = ah->addac5416_21; -		temp.ia_columns = ah->iniAddac.ia_columns; -		temp.ia_rows = ah->iniAddac.ia_rows; -		REG_WRITE_ARRAY(&temp, 1, regWrites); -	} +	if (ah->eep_ops->set_addac) +		ah->eep_ops->set_addac(ah, chan); +	REG_WRITE_ARRAY(&ah->iniAddac, 1, regWrites);  	REG_WRITE(ah, AR_PHY_ADC_SERIAL_CTL, AR_PHY_SEL_INTERNAL_ADDAC);  	ENABLE_REGWRITE_BUFFER(ah); @@ -809,7 +720,8 @@ static int ar5008_hw_process_ini(struct ath_hw *ah,  		REG_WRITE(ah, reg, val);  		if (reg >= 0x7800 && reg < 0x78a0 -		    && ah->config.analog_shiftreg) { +		    && ah->config.analog_shiftreg +		    && (common->bus_ops->ath_bus_type != ATH_USB)) {  			udelay(100);  		} @@ -825,9 +737,10 @@ static int ar5008_hw_process_ini(struct ath_hw *ah,  	    AR_SREV_9287_11_OR_LATER(ah))  		REG_WRITE_ARRAY(&ah->iniModesTxGain, modesIndex, regWrites); -	if (AR_SREV_9271_10(ah)) -		REG_WRITE_ARRAY(&ah->iniModes_9271_1_0_only, -				modesIndex, regWrites); +	if (AR_SREV_9271_10(ah)) { +		REG_SET_BIT(ah, AR_PHY_SPECTRAL_SCAN, AR_PHY_SPECTRAL_SCAN_ENA); +		REG_RMW_FIELD(ah, AR_PHY_RF_CTL3, AR_PHY_TX_END_TO_ADC_ON, 0xa); +	}  	ENABLE_REGWRITE_BUFFER(ah); @@ -839,7 +752,8 @@ static int ar5008_hw_process_ini(struct ath_hw *ah,  		REG_WRITE(ah, reg, val);  		if (reg >= 0x7800 && reg < 0x78a0 -		    && ah->config.analog_shiftreg) { +		    && ah->config.analog_shiftreg +		    && (common->bus_ops->ath_bus_type != ATH_USB)) {  			udelay(100);  		} @@ -848,39 +762,21 @@ static int ar5008_hw_process_ini(struct ath_hw *ah,  	REGWRITE_BUFFER_FLUSH(ah); -	if (AR_SREV_9271(ah)) { -		if (ah->eep_ops->get_eeprom(ah, EEP_TXGAIN_TYPE) == 1) -			REG_WRITE_ARRAY(&ah->iniModes_high_power_tx_gain_9271, -					modesIndex, regWrites); -		else -			REG_WRITE_ARRAY(&ah->iniModes_normal_power_tx_gain_9271, -					modesIndex, regWrites); -	} -  	REG_WRITE_ARRAY(&ah->iniBB_RfGain, freqIndex, regWrites); -	if (IS_CHAN_A_FAST_CLOCK(ah, chan)) { -		REG_WRITE_ARRAY(&ah->iniModesAdditional, modesIndex, +	if (IS_CHAN_A_FAST_CLOCK(ah, chan)) +		REG_WRITE_ARRAY(&ah->iniModesFastClock, modesIndex,  				regWrites); -	}  	ar5008_hw_override_ini(ah, chan);  	ar5008_hw_set_channel_regs(ah, chan);  	ar5008_hw_init_chain_masks(ah);  	ath9k_olc_init(ah); - -	/* Set TX power */ -	ah->eep_ops->set_txpower(ah, chan, -				 ath9k_regd_get_ctl(regulatory, chan), -				 channel->max_antenna_gain * 2, -				 channel->max_power * 2, -				 min((u32) MAX_RATE_POWER, -				 (u32) regulatory->power_limit), false); +	ath9k_hw_apply_txpower(ah, chan, false);  	/* Write analog registers */  	if (!ath9k_hw_set_rf_regs(ah, chan, freqIndex)) { -		ath_print(ath9k_hw_common(ah), ATH_DBG_FATAL, -			  "ar5416SetRfRegs failed\n"); +		ath_err(ath9k_hw_common(ah), "ar5416SetRfRegs failed\n");  		return -EIO;  	} @@ -894,8 +790,10 @@ static void ar5008_hw_set_rfmode(struct ath_hw *ah, struct ath9k_channel *chan)  	if (chan == NULL)  		return; -	rfMode |= (IS_CHAN_B(chan) || IS_CHAN_G(chan)) -		? AR_PHY_MODE_DYNAMIC : AR_PHY_MODE_OFDM; +	if (IS_CHAN_2GHZ(chan)) +		rfMode |= AR_PHY_MODE_DYNAMIC; +	else +		rfMode |= AR_PHY_MODE_OFDM;  	if (!AR_SREV_9280_20_OR_LATER(ah))  		rfMode |= (IS_CHAN_5GHZ(chan)) ? @@ -956,28 +854,12 @@ static bool ar5008_hw_rfbus_req(struct ath_hw *ah)  static void ar5008_hw_rfbus_done(struct ath_hw *ah)  {  	u32 synthDelay = REG_READ(ah, AR_PHY_RX_DELAY) & AR_PHY_RX_DELAY_DELAY; -	if (IS_CHAN_B(ah->curchan)) -		synthDelay = (4 * synthDelay) / 22; -	else -		synthDelay /= 10; -	udelay(synthDelay + BASE_ACTIVATE_DELAY); +	ath9k_hw_synth_delay(ah, ah->curchan, synthDelay);  	REG_WRITE(ah, AR_PHY_RFBUS_REQ, 0);  } -static void ar5008_hw_enable_rfkill(struct ath_hw *ah) -{ -	REG_SET_BIT(ah, AR_GPIO_INPUT_EN_VAL, -		    AR_GPIO_INPUT_EN_VAL_RFSILENT_BB); - -	REG_CLR_BIT(ah, AR_GPIO_INPUT_MUX2, -		    AR_GPIO_INPUT_MUX2_RFSILENT); - -	ath9k_hw_cfg_gpio_input(ah, ah->rfkill_gpio); -	REG_SET_BIT(ah, AR_PHY_TEST, RFSILENT_BB); -} -  static void ar5008_restore_chainmask(struct ath_hw *ah)  {  	int rx_chainmask = ah->rxchainmask; @@ -988,24 +870,6 @@ static void ar5008_restore_chainmask(struct ath_hw *ah)  	}  } -static void ar5008_set_diversity(struct ath_hw *ah, bool value) -{ -	u32 v = REG_READ(ah, AR_PHY_CCK_DETECT); -	if (value) -		v |= AR_PHY_CCK_DETECT_BB_ENABLE_ANT_FAST_DIV; -	else -		v &= ~AR_PHY_CCK_DETECT_BB_ENABLE_ANT_FAST_DIV; -	REG_WRITE(ah, AR_PHY_CCK_DETECT, v); -} - -static u32 ar9100_hw_compute_pll_control(struct ath_hw *ah, -					 struct ath9k_channel *chan) -{ -	if (chan && IS_CHAN_5GHZ(chan)) -		return 0x1450; -	return 0x1458; -} -  static u32 ar9160_hw_compute_pll_control(struct ath_hw *ah,  					 struct ath9k_channel *chan)  { @@ -1046,197 +910,14 @@ static u32 ar5008_hw_compute_pll_control(struct ath_hw *ah,  	return pll;  } -static bool ar5008_hw_ani_control_old(struct ath_hw *ah, -				      enum ath9k_ani_cmd cmd, -				      int param) -{ -	struct ar5416AniState *aniState = &ah->curchan->ani; -	struct ath_common *common = ath9k_hw_common(ah); - -	switch (cmd & ah->ani_function) { -	case ATH9K_ANI_NOISE_IMMUNITY_LEVEL:{ -		u32 level = param; - -		if (level >= ARRAY_SIZE(ah->totalSizeDesired)) { -			ath_print(common, ATH_DBG_ANI, -				  "level out of range (%u > %u)\n", -				  level, -				  (unsigned)ARRAY_SIZE(ah->totalSizeDesired)); -			return false; -		} - -		REG_RMW_FIELD(ah, AR_PHY_DESIRED_SZ, -			      AR_PHY_DESIRED_SZ_TOT_DES, -			      ah->totalSizeDesired[level]); -		REG_RMW_FIELD(ah, AR_PHY_AGC_CTL1, -			      AR_PHY_AGC_CTL1_COARSE_LOW, -			      ah->coarse_low[level]); -		REG_RMW_FIELD(ah, AR_PHY_AGC_CTL1, -			      AR_PHY_AGC_CTL1_COARSE_HIGH, -			      ah->coarse_high[level]); -		REG_RMW_FIELD(ah, AR_PHY_FIND_SIG, -			      AR_PHY_FIND_SIG_FIRPWR, -			      ah->firpwr[level]); - -		if (level > aniState->noiseImmunityLevel) -			ah->stats.ast_ani_niup++; -		else if (level < aniState->noiseImmunityLevel) -			ah->stats.ast_ani_nidown++; -		aniState->noiseImmunityLevel = level; -		break; -	} -	case ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION:{ -		static const int m1ThreshLow[] = { 127, 50 }; -		static const int m2ThreshLow[] = { 127, 40 }; -		static const int m1Thresh[] = { 127, 0x4d }; -		static const int m2Thresh[] = { 127, 0x40 }; -		static const int m2CountThr[] = { 31, 16 }; -		static const int m2CountThrLow[] = { 63, 48 }; -		u32 on = param ? 1 : 0; - -		REG_RMW_FIELD(ah, AR_PHY_SFCORR_LOW, -			      AR_PHY_SFCORR_LOW_M1_THRESH_LOW, -			      m1ThreshLow[on]); -		REG_RMW_FIELD(ah, AR_PHY_SFCORR_LOW, -			      AR_PHY_SFCORR_LOW_M2_THRESH_LOW, -			      m2ThreshLow[on]); -		REG_RMW_FIELD(ah, AR_PHY_SFCORR, -			      AR_PHY_SFCORR_M1_THRESH, -			      m1Thresh[on]); -		REG_RMW_FIELD(ah, AR_PHY_SFCORR, -			      AR_PHY_SFCORR_M2_THRESH, -			      m2Thresh[on]); -		REG_RMW_FIELD(ah, AR_PHY_SFCORR, -			      AR_PHY_SFCORR_M2COUNT_THR, -			      m2CountThr[on]); -		REG_RMW_FIELD(ah, AR_PHY_SFCORR_LOW, -			      AR_PHY_SFCORR_LOW_M2COUNT_THR_LOW, -			      m2CountThrLow[on]); - -		REG_RMW_FIELD(ah, AR_PHY_SFCORR_EXT, -			      AR_PHY_SFCORR_EXT_M1_THRESH_LOW, -			      m1ThreshLow[on]); -		REG_RMW_FIELD(ah, AR_PHY_SFCORR_EXT, -			      AR_PHY_SFCORR_EXT_M2_THRESH_LOW, -			      m2ThreshLow[on]); -		REG_RMW_FIELD(ah, AR_PHY_SFCORR_EXT, -			      AR_PHY_SFCORR_EXT_M1_THRESH, -			      m1Thresh[on]); -		REG_RMW_FIELD(ah, AR_PHY_SFCORR_EXT, -			      AR_PHY_SFCORR_EXT_M2_THRESH, -			      m2Thresh[on]); - -		if (on) -			REG_SET_BIT(ah, AR_PHY_SFCORR_LOW, -				    AR_PHY_SFCORR_LOW_USE_SELF_CORR_LOW); -		else -			REG_CLR_BIT(ah, AR_PHY_SFCORR_LOW, -				    AR_PHY_SFCORR_LOW_USE_SELF_CORR_LOW); - -		if (!on != aniState->ofdmWeakSigDetectOff) { -			if (on) -				ah->stats.ast_ani_ofdmon++; -			else -				ah->stats.ast_ani_ofdmoff++; -			aniState->ofdmWeakSigDetectOff = !on; -		} -		break; -	} -	case ATH9K_ANI_CCK_WEAK_SIGNAL_THR:{ -		static const int weakSigThrCck[] = { 8, 6 }; -		u32 high = param ? 1 : 0; - -		REG_RMW_FIELD(ah, AR_PHY_CCK_DETECT, -			      AR_PHY_CCK_DETECT_WEAK_SIG_THR_CCK, -			      weakSigThrCck[high]); -		if (high != aniState->cckWeakSigThreshold) { -			if (high) -				ah->stats.ast_ani_cckhigh++; -			else -				ah->stats.ast_ani_ccklow++; -			aniState->cckWeakSigThreshold = high; -		} -		break; -	} -	case ATH9K_ANI_FIRSTEP_LEVEL:{ -		static const int firstep[] = { 0, 4, 8 }; -		u32 level = param; - -		if (level >= ARRAY_SIZE(firstep)) { -			ath_print(common, ATH_DBG_ANI, -				  "level out of range (%u > %u)\n", -				  level, -				  (unsigned) ARRAY_SIZE(firstep)); -			return false; -		} -		REG_RMW_FIELD(ah, AR_PHY_FIND_SIG, -			      AR_PHY_FIND_SIG_FIRSTEP, -			      firstep[level]); -		if (level > aniState->firstepLevel) -			ah->stats.ast_ani_stepup++; -		else if (level < aniState->firstepLevel) -			ah->stats.ast_ani_stepdown++; -		aniState->firstepLevel = level; -		break; -	} -	case ATH9K_ANI_SPUR_IMMUNITY_LEVEL:{ -		static const int cycpwrThr1[] = { 2, 4, 6, 8, 10, 12, 14, 16 }; -		u32 level = param; - -		if (level >= ARRAY_SIZE(cycpwrThr1)) { -			ath_print(common, ATH_DBG_ANI, -				  "level out of range (%u > %u)\n", -				  level, -				  (unsigned) ARRAY_SIZE(cycpwrThr1)); -			return false; -		} -		REG_RMW_FIELD(ah, AR_PHY_TIMING5, -			      AR_PHY_TIMING5_CYCPWR_THR1, -			      cycpwrThr1[level]); -		if (level > aniState->spurImmunityLevel) -			ah->stats.ast_ani_spurup++; -		else if (level < aniState->spurImmunityLevel) -			ah->stats.ast_ani_spurdown++; -		aniState->spurImmunityLevel = level; -		break; -	} -	case ATH9K_ANI_PRESENT: -		break; -	default: -		ath_print(common, ATH_DBG_ANI, -			  "invalid cmd %u\n", cmd); -		return false; -	} - -	ath_print(common, ATH_DBG_ANI, "ANI parameters:\n"); -	ath_print(common, ATH_DBG_ANI, -		  "noiseImmunityLevel=%d, spurImmunityLevel=%d, " -		  "ofdmWeakSigDetectOff=%d\n", -		  aniState->noiseImmunityLevel, -		  aniState->spurImmunityLevel, -		  !aniState->ofdmWeakSigDetectOff); -	ath_print(common, ATH_DBG_ANI, -		  "cckWeakSigThreshold=%d, " -		  "firstepLevel=%d, listenTime=%d\n", -		  aniState->cckWeakSigThreshold, -		  aniState->firstepLevel, -		  aniState->listenTime); -	ath_print(common, ATH_DBG_ANI, -		"ofdmPhyErrCount=%d, cckPhyErrCount=%d\n\n", -		aniState->ofdmPhyErrCount, -		aniState->cckPhyErrCount); - -	return true; -} -  static bool ar5008_hw_ani_control_new(struct ath_hw *ah,  				      enum ath9k_ani_cmd cmd,  				      int param)  {  	struct ath_common *common = ath9k_hw_common(ah);  	struct ath9k_channel *chan = ah->curchan; -	struct ar5416AniState *aniState = &chan->ani; -	s32 value, value2; +	struct ar5416AniState *aniState = &ah->ani; +	s32 value;  	switch (cmd & ah->ani_function) {  	case ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION:{ @@ -1305,82 +986,45 @@ static bool ar5008_hw_ani_control_new(struct ath_hw *ah,  			REG_CLR_BIT(ah, AR_PHY_SFCORR_LOW,  				    AR_PHY_SFCORR_LOW_USE_SELF_CORR_LOW); -		if (!on != aniState->ofdmWeakSigDetectOff) { -			ath_print(common, ATH_DBG_ANI, -				  "** ch %d: ofdm weak signal: %s=>%s\n", -				  chan->channel, -				  !aniState->ofdmWeakSigDetectOff ? -					"on" : "off", -				  on ? "on" : "off"); +		if (on != aniState->ofdmWeakSigDetect) { +			ath_dbg(common, ANI, +				"** ch %d: ofdm weak signal: %s=>%s\n", +				chan->channel, +				aniState->ofdmWeakSigDetect ? +				"on" : "off", +				on ? "on" : "off");  			if (on)  				ah->stats.ast_ani_ofdmon++;  			else  				ah->stats.ast_ani_ofdmoff++; -			aniState->ofdmWeakSigDetectOff = !on; +			aniState->ofdmWeakSigDetect = on;  		}  		break;  	}  	case ATH9K_ANI_FIRSTEP_LEVEL:{  		u32 level = param; -		if (level >= ARRAY_SIZE(firstep_table)) { -			ath_print(common, ATH_DBG_ANI, -				  "ATH9K_ANI_FIRSTEP_LEVEL: level " -				  "out of range (%u > %u)\n", -				  level, -				  (unsigned) ARRAY_SIZE(firstep_table)); -			return false; -		} - -		/* -		 * make register setting relative to default -		 * from INI file & cap value -		 */ -		value = firstep_table[level] - -			firstep_table[ATH9K_ANI_FIRSTEP_LVL_NEW] + -			aniState->iniDef.firstep; -		if (value < ATH9K_SIG_FIRSTEP_SETTING_MIN) -			value = ATH9K_SIG_FIRSTEP_SETTING_MIN; -		if (value > ATH9K_SIG_FIRSTEP_SETTING_MAX) -			value = ATH9K_SIG_FIRSTEP_SETTING_MAX; +		value = level;  		REG_RMW_FIELD(ah, AR_PHY_FIND_SIG, -			      AR_PHY_FIND_SIG_FIRSTEP, -			      value); -		/* -		 * we need to set first step low register too -		 * make register setting relative to default -		 * from INI file & cap value -		 */ -		value2 = firstep_table[level] - -			 firstep_table[ATH9K_ANI_FIRSTEP_LVL_NEW] + -			 aniState->iniDef.firstepLow; -		if (value2 < ATH9K_SIG_FIRSTEP_SETTING_MIN) -			value2 = ATH9K_SIG_FIRSTEP_SETTING_MIN; -		if (value2 > ATH9K_SIG_FIRSTEP_SETTING_MAX) -			value2 = ATH9K_SIG_FIRSTEP_SETTING_MAX; - -		REG_RMW_FIELD(ah, AR_PHY_FIND_SIG_LOW, -			      AR_PHY_FIND_SIG_FIRSTEP_LOW, value2); +			      AR_PHY_FIND_SIG_FIRSTEP, value);  		if (level != aniState->firstepLevel) { -			ath_print(common, ATH_DBG_ANI, -				  "** ch %d: level %d=>%d[def:%d] " -				  "firstep[level]=%d ini=%d\n", -				  chan->channel, -				  aniState->firstepLevel, -				  level, -				  ATH9K_ANI_FIRSTEP_LVL_NEW, -				  value, -				  aniState->iniDef.firstep); -			ath_print(common, ATH_DBG_ANI, -				  "** ch %d: level %d=>%d[def:%d] " -				  "firstep_low[level]=%d ini=%d\n", -				  chan->channel, -				  aniState->firstepLevel, -				  level, -				  ATH9K_ANI_FIRSTEP_LVL_NEW, -				  value2, -				  aniState->iniDef.firstepLow); +			ath_dbg(common, ANI, +				"** ch %d: level %d=>%d[def:%d] firstep[level]=%d ini=%d\n", +				chan->channel, +				aniState->firstepLevel, +				level, +				ATH9K_ANI_FIRSTEP_LVL, +				value, +				aniState->iniDef.firstep); +			ath_dbg(common, ANI, +				"** ch %d: level %d=>%d[def:%d] firstep_low[level]=%d ini=%d\n", +				chan->channel, +				aniState->firstepLevel, +				level, +				ATH9K_ANI_FIRSTEP_LVL, +				value, +				aniState->iniDef.firstepLow);  			if (level > aniState->firstepLevel)  				ah->stats.ast_ani_stepup++;  			else if (level < aniState->firstepLevel) @@ -1392,63 +1036,31 @@ static bool ar5008_hw_ani_control_new(struct ath_hw *ah,  	case ATH9K_ANI_SPUR_IMMUNITY_LEVEL:{  		u32 level = param; -		if (level >= ARRAY_SIZE(cycpwrThr1_table)) { -			ath_print(common, ATH_DBG_ANI, -				  "ATH9K_ANI_SPUR_IMMUNITY_LEVEL: level " -				  "out of range (%u > %u)\n", -				  level, -				  (unsigned) ARRAY_SIZE(cycpwrThr1_table)); -			return false; -		} -		/* -		 * make register setting relative to default -		 * from INI file & cap value -		 */ -		value = cycpwrThr1_table[level] - -			cycpwrThr1_table[ATH9K_ANI_SPUR_IMMUNE_LVL_NEW] + -			aniState->iniDef.cycpwrThr1; -		if (value < ATH9K_SIG_SPUR_IMM_SETTING_MIN) -			value = ATH9K_SIG_SPUR_IMM_SETTING_MIN; -		if (value > ATH9K_SIG_SPUR_IMM_SETTING_MAX) -			value = ATH9K_SIG_SPUR_IMM_SETTING_MAX; +		value = (level + 1) * 2;  		REG_RMW_FIELD(ah, AR_PHY_TIMING5, -			      AR_PHY_TIMING5_CYCPWR_THR1, -			      value); +			      AR_PHY_TIMING5_CYCPWR_THR1, value); -		/* -		 * set AR_PHY_EXT_CCA for extension channel -		 * make register setting relative to default -		 * from INI file & cap value -		 */ -		value2 = cycpwrThr1_table[level] - -			 cycpwrThr1_table[ATH9K_ANI_SPUR_IMMUNE_LVL_NEW] + -			 aniState->iniDef.cycpwrThr1Ext; -		if (value2 < ATH9K_SIG_SPUR_IMM_SETTING_MIN) -			value2 = ATH9K_SIG_SPUR_IMM_SETTING_MIN; -		if (value2 > ATH9K_SIG_SPUR_IMM_SETTING_MAX) -			value2 = ATH9K_SIG_SPUR_IMM_SETTING_MAX; -		REG_RMW_FIELD(ah, AR_PHY_EXT_CCA, -			      AR_PHY_EXT_TIMING5_CYCPWR_THR1, value2); +		if (IS_CHAN_HT40(ah->curchan)) +			REG_RMW_FIELD(ah, AR_PHY_EXT_CCA, +				      AR_PHY_EXT_TIMING5_CYCPWR_THR1, value);  		if (level != aniState->spurImmunityLevel) { -			ath_print(common, ATH_DBG_ANI, -				  "** ch %d: level %d=>%d[def:%d] " -				  "cycpwrThr1[level]=%d ini=%d\n", -				  chan->channel, -				  aniState->spurImmunityLevel, -				  level, -				  ATH9K_ANI_SPUR_IMMUNE_LVL_NEW, -				  value, -				  aniState->iniDef.cycpwrThr1); -			ath_print(common, ATH_DBG_ANI, -				  "** ch %d: level %d=>%d[def:%d] " -				  "cycpwrThr1Ext[level]=%d ini=%d\n", -				  chan->channel, -				  aniState->spurImmunityLevel, -				  level, -				  ATH9K_ANI_SPUR_IMMUNE_LVL_NEW, -				  value2, -				  aniState->iniDef.cycpwrThr1Ext); +			ath_dbg(common, ANI, +				"** ch %d: level %d=>%d[def:%d] cycpwrThr1[level]=%d ini=%d\n", +				chan->channel, +				aniState->spurImmunityLevel, +				level, +				ATH9K_ANI_SPUR_IMMUNE_LVL, +				value, +				aniState->iniDef.cycpwrThr1); +			ath_dbg(common, ANI, +				"** ch %d: level %d=>%d[def:%d] cycpwrThr1Ext[level]=%d ini=%d\n", +				chan->channel, +				aniState->spurImmunityLevel, +				level, +				ATH9K_ANI_SPUR_IMMUNE_LVL, +				value, +				aniState->iniDef.cycpwrThr1Ext);  			if (level > aniState->spurImmunityLevel)  				ah->stats.ast_ani_spurup++;  			else if (level < aniState->spurImmunityLevel) @@ -1464,25 +1076,20 @@ static bool ar5008_hw_ani_control_new(struct ath_hw *ah,  		 */  		WARN_ON(1);  		break; -	case ATH9K_ANI_PRESENT: -		break;  	default: -		ath_print(common, ATH_DBG_ANI, -			  "invalid cmd %u\n", cmd); +		ath_dbg(common, ANI, "invalid cmd %u\n", cmd);  		return false;  	} -	ath_print(common, ATH_DBG_ANI, -		  "ANI parameters: SI=%d, ofdmWS=%s FS=%d " -		  "MRCcck=%s listenTime=%d " -		  "ofdmErrs=%d cckErrs=%d\n", -		  aniState->spurImmunityLevel, -		  !aniState->ofdmWeakSigDetectOff ? "on" : "off", -		  aniState->firstepLevel, -		  !aniState->mrcCCKOff ? "on" : "off", -		  aniState->listenTime, -		  aniState->ofdmPhyErrCount, -		  aniState->cckPhyErrCount); +	ath_dbg(common, ANI, +		"ANI parameters: SI=%d, ofdmWS=%s FS=%d MRCcck=%s listenTime=%d ofdmErrs=%d cckErrs=%d\n", +		aniState->spurImmunityLevel, +		aniState->ofdmWeakSigDetect ? "on" : "off", +		aniState->firstepLevel, +		aniState->mrcCCK ? "on" : "off", +		aniState->listenTime, +		aniState->ofdmPhyErrCount, +		aniState->cckPhyErrCount);  	return true;  } @@ -1522,19 +1129,17 @@ static void ar5008_hw_ani_cache_ini_regs(struct ath_hw *ah)  {  	struct ath_common *common = ath9k_hw_common(ah);  	struct ath9k_channel *chan = ah->curchan; -	struct ar5416AniState *aniState = &chan->ani; +	struct ar5416AniState *aniState = &ah->ani;  	struct ath9k_ani_default *iniDef;  	u32 val;  	iniDef = &aniState->iniDef; -	ath_print(common, ATH_DBG_ANI, -		  "ver %d.%d opmode %u chan %d Mhz/0x%x\n", -		  ah->hw_version.macVersion, -		  ah->hw_version.macRev, -		  ah->opmode, -		  chan->channel, -		  chan->channelFlags); +	ath_dbg(common, ANI, "ver %d.%d opmode %u chan %d Mhz\n", +		ah->hw_version.macVersion, +		ah->hw_version.macRev, +		ah->opmode, +		chan->channel);  	val = REG_READ(ah, AR_PHY_SFCORR);  	iniDef->m1Thresh = MS(val, AR_PHY_SFCORR_M1_THRESH); @@ -1565,10 +1170,10 @@ static void ar5008_hw_ani_cache_ini_regs(struct ath_hw *ah)  					       AR_PHY_EXT_TIMING5_CYCPWR_THR1);  	/* these levels just got reset to defaults by the INI */ -	aniState->spurImmunityLevel = ATH9K_ANI_SPUR_IMMUNE_LVL_NEW; -	aniState->firstepLevel = ATH9K_ANI_FIRSTEP_LVL_NEW; -	aniState->ofdmWeakSigDetectOff = !ATH9K_ANI_USE_OFDM_WEAK_SIG; -	aniState->mrcCCKOff = true; /* not available on pre AR9003 */ +	aniState->spurImmunityLevel = ATH9K_ANI_SPUR_IMMUNE_LVL; +	aniState->firstepLevel = ATH9K_ANI_FIRSTEP_LVL; +	aniState->ofdmWeakSigDetect = true; +	aniState->mrcCCK = false; /* not available on pre AR9003 */  }  static void ar5008_hw_set_nf_limits(struct ath_hw *ah) @@ -1626,7 +1231,7 @@ static void ar5008_hw_set_radar_conf(struct ath_hw *ah)  	conf->radar_inband = 8;  } -void ar5008_hw_attach_phy_ops(struct ath_hw *ah) +int ar5008_hw_attach_phy_ops(struct ath_hw *ah)  {  	struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah);  	static const u32 ar5416_cca_regs[6] = { @@ -1637,12 +1242,15 @@ void ar5008_hw_attach_phy_ops(struct ath_hw *ah)  		AR_PHY_CH1_EXT_CCA,  		AR_PHY_CH2_EXT_CCA  	}; +	int ret; + +	ret = ar5008_hw_rf_alloc_ext_banks(ah); +	if (ret) +	    return ret;  	priv_ops->rf_set_freq = ar5008_hw_set_channel;  	priv_ops->spur_mitigate_freq = ar5008_hw_spur_mitigate; -	priv_ops->rf_alloc_ext_banks = ar5008_hw_rf_alloc_ext_banks; -	priv_ops->rf_free_ext_banks = ar5008_hw_rf_free_ext_banks;  	priv_ops->set_rf_regs = ar5008_hw_set_rf_regs;  	priv_ops->set_channel_regs = ar5008_hw_set_channel_regs;  	priv_ops->init_bb = ar5008_hw_init_bb; @@ -1652,21 +1260,14 @@ void ar5008_hw_attach_phy_ops(struct ath_hw *ah)  	priv_ops->set_delta_slope = ar5008_hw_set_delta_slope;  	priv_ops->rfbus_req = ar5008_hw_rfbus_req;  	priv_ops->rfbus_done = ar5008_hw_rfbus_done; -	priv_ops->enable_rfkill = ar5008_hw_enable_rfkill;  	priv_ops->restore_chainmask = ar5008_restore_chainmask; -	priv_ops->set_diversity = ar5008_set_diversity;  	priv_ops->do_getnf = ar5008_hw_do_getnf;  	priv_ops->set_radar_params = ar5008_hw_set_radar_params; -	if (modparam_force_new_ani) { -		priv_ops->ani_control = ar5008_hw_ani_control_new; -		priv_ops->ani_cache_ini_regs = ar5008_hw_ani_cache_ini_regs; -	} else -		priv_ops->ani_control = ar5008_hw_ani_control_old; +	priv_ops->ani_control = ar5008_hw_ani_control_new; +	priv_ops->ani_cache_ini_regs = ar5008_hw_ani_cache_ini_regs; -	if (AR_SREV_9100(ah)) -		priv_ops->compute_pll_control = ar9100_hw_compute_pll_control; -	else if (AR_SREV_9160_10_OR_LATER(ah)) +	if (AR_SREV_9100(ah) || AR_SREV_9160_10_OR_LATER(ah))  		priv_ops->compute_pll_control = ar9160_hw_compute_pll_control;  	else  		priv_ops->compute_pll_control = ar5008_hw_compute_pll_control; @@ -1674,4 +1275,5 @@ void ar5008_hw_attach_phy_ops(struct ath_hw *ah)  	ar5008_hw_set_nf_limits(ah);  	ar5008_hw_set_radar_conf(ah);  	memcpy(ah->nf_regs, ar5416_cca_regs, sizeof(ah->nf_regs)); +	return 0;  }  | 
