ath9k: add an extra boolean parameter to ath9k_hw_apply_txpower
PATCH 1/2 ath9k: add an extra boolean parameter to ath9k_hw_apply_txpower
In order to unifying regulatory limit handling commit ca2c68cc7bc80fc4504fb420df04cce99c9ee6ec (ath9k_hw: clean up tx power handling) introduced a new helper function 'ath9k_hw_apply_txpower', and the direct calls of 'ah->eep_ops->set_txpower' has been replaced by a call of the helper function.
This caused a change in the behaviour of the 'ath9k_hw_set_txpowerlimit' function. The purpose of that function is to calculate and store the rate txpower table and the regulatory limit without touching the hardware registers. Before the commit, the 'test' parameter of the function was passed to the 'ah->eep_ops->set_txpower'. Now the calling of the 'set_txpower' function happens indirectly through 'ath9k_hw_apply_txpower', so the 'test' argument of the 'set_txpower' is always 'false'.
This patch restores the original behaviour of 'ath9k_hw_set_txpowerlimit' by adding a new argument to 'ath9k_hw_apply_txpower.'
--- drivers/net/wireless/ath/ath9k/ar5008_phy.c | 2 +- drivers/net/wireless/ath/ath9k/ar9003_paprd.c | 2 +- drivers/net/wireless/ath/ath9k/ar9003_phy.c | 2 +- drivers/net/wireless/ath/ath9k/hw.c | 9 +++++---- drivers/net/wireless/ath/ath9k/hw.h | 3 ++- 5 files changed, 10 insertions(+), 8 deletions(-)
drivers/net/wireless/ath/ath9k/ar5008_phy.c +1 -1
@@ -868,7 +868,7 @@ static int ar5008_hw_process_ini(struct ath_hw *ah,ar5008_hw_set_channel_regs (ah, chan);ar5008_hw_init_chain_masks (ah);ath9k_olc_init (ah); -ath9k_hw_apply_txpower (ah, chan); +ath9k_hw_apply_txpower (ah, chan, false);/* Write analog registers */ if (!ath9k_hw_set_rf_regs (ah, chan, freqIndex)) {
drivers/net/wireless/ath/ath9k/ar9003_paprd.c +1 -1
@@ -54,7 +54,7 @@ void ar9003_paprd_enable(struct ath_hw *ah, bool val)if (val) { ah->paprd_table_write_done = true; -ath9k_hw_apply_txpower (ah, chan); +ath9k_hw_apply_txpower (ah, chan, false); } REG_RMW_FIELD(ah, AR_PHY_PAPRD_CTRL0_B0,
drivers/net/wireless/ath/ath9k/ar9003_phy.c +1 -1
@@ -690,7 +690,7 @@ static int ar9003_hw_process_ini(struct ath_hw *ah,ar9003_hw_override_ini (ah);ar9003_hw_set_channel_regs (ah, chan);ar9003_hw_set_chain_masks (ah, ah->rxchainmask, ah->txchainmask); -ath9k_hw_apply_txpower (ah, chan); +ath9k_hw_apply_txpower (ah, chan, false);if (AR_SREV_9462 (ah)) { if (REG_READ_FIELD(ah, AR_PHY_TX_IQCAL_CONTROL_0,
drivers/net/wireless/ath/ath9k/hw.c +5 -4
@@ -1453,7 +1453,7 @@ static bool ath9k_hw_channel_change(struct ath_hw *ah,return false; }ath9k_hw_set_clockrate (ah); -ath9k_hw_apply_txpower (ah, chan); +ath9k_hw_apply_txpower (ah, chan, false);ath9k_hw_rfbus_done (ah);if (IS_CHAN_OFDM (chan) ||IS_CHAN_HT (chan))
@@ -2724,7 +2724,8 @@ static int get_antenna_gain(struct ath_hw *ah, struct ath9k_channel *chan)return ah->eep_ops->get_eeprom (ah, gain_param); } -void ath9k_hw_apply_txpower (struct ath_hw *ah,struct ath9k_channel *chan) +void ath9k_hw_apply_txpower (struct ath_hw *ah,struct ath9k_channel *chan, +bool test) {struct ath_regulatory *reg =ath9k_hw_regulatory (ah);struct ieee80211_channel *channel;
@@ -2745,7 +2746,7 @@ void ath9k_hw_apply_txpower(struct ath_hw *ah, struct ath9k_channel *chan) ah->eep_ops->set_txpower (ah, chan,ath9k_regd_get_ctl (reg, chan), - ant_reduction, new_pwr, false); + ant_reduction, new_pwr, test); }void ath9k_hw_set_txpowerlimit (struct ath_hw *ah,u32 limit,bool test)
@@ -2758,7 +2759,7 @@ void ath9k_hw_set_txpowerlimit(struct ath_hw *ah, u32 limit, bool test)if (test) channel->max_power =MAX_RATE_POWER /2 ; -ath9k_hw_apply_txpower (ah, chan); +ath9k_hw_apply_txpower (ah, chan, test);if (test) channel->max_power =DIV_ROUND_UP (reg->max_power_level,2 );
drivers/net/wireless/ath/ath9k/hw.h +2 -1
@@ -976,7 +976,8 @@ void ath9k_hw_name(struct ath_hw *ah, char *hw_name, size_t len);/* PHY */ void ath9k_hw_get_delta_slope_vals (struct ath_hw *ah,u32 coef_scaled,u32 *coef_mantissa,u32 *coef_exponent); -void ath9k_hw_apply_txpower (struct ath_hw *ah,struct ath9k_channel *chan); +void ath9k_hw_apply_txpower (struct ath_hw *ah,struct ath9k_channel *chan, +bool test);/* * Code Specific to AR5008, AR9001 or AR9002,
Signature · 1 line
1.7.2.1
PATCH 2/2 ath9k: fix tx power settings for AR9287
The 'ath9k_hw_update_regulatory_maxpower' helper function has been introduced by commit a55f858852e4345d0a31af593c46738ca8614bff (ath9k_hw: Cleanup TX power calculation for AR9287).
Updating of the max_power_level value has been moved into the helper function in that change, however the removed code from 'ath9k_hw_ar9287_set_txpower' has not been replaced with a call of the new helper function.
Due to that missing call, retrieving tx power for 2x2 and 3x3 chainmask is not handled properly. During the calculation of the tx power for 2x2 and 3x3 chainmasks the values are reduced. Those reductions must be compensated during retrieving.
Fix this by adding the missing call of the helper function.
--- drivers/net/wireless/ath/ath9k/eeprom_9287.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-)
drivers/net/wireless/ath/ath9k/eeprom_9287.c +2 -0
@@ -824,6 +824,8 @@ static void ath9k_hw_ar9287_set_txpower(struct ath_hw *ah, regulatory->max_power_level = ratesArray[i]; } +ath9k_hw_update_regulatory_maxpower (ah); +if (test)return ;
Signature · 1 line
1.7.2.1
PATCH 1/2 ath9k: add an extra boolean parameter to ath9k_hw_apply_txpower
In reply to Gabor JuhosAre these intended as fixes for 3.4?
Quoted 130 lines · Gabor Juhos
In order to unifying regulatory limit handling commit
ca2c68cc7bc80fc4504fb420df04cce99c9ee6ec(ath9k_hw: clean up tx power handling) introduced a new helper function 'ath9k_hw_apply_txpower', and the direct calls of 'ah->eep_ops->set_txpower' has been replaced by a call of the helper function.This caused a change in the behaviour of the '
ath9k_hw_set_txpowerlimit' function. The purpose of that function is to calculate and store the rate txpower table and the regulatory limit without touching the hardware registers. Before the commit, the 'test' parameter of the function was passed to the 'ah->eep_ops->set_txpower'. Now the calling of the 'set_txpower' function happens indirectly through 'ath9k_hw_apply_txpower', so the 'test' argument of the 'set_txpower' is always 'false'.This patch restores the original behaviour of '
ath9k_hw_set_txpowerlimit' by adding a new argument to 'ath9k_hw_apply_txpower.'Signed-off-by Gabor Juhos <[email protected]>Acked-by Felix Fietkau <[email protected]>--- drivers/net/wireless/ath/ath9k/ar5008_phy.c | 2 +- drivers/net/wireless/ath/ath9k/ar9003_paprd.c | 2 +- drivers/net/wireless/ath/ath9k/ar9003_phy.c | 2 +- drivers/net/wireless/ath/ath9k/hw.c | 9 +++++---- drivers/net/wireless/ath/ath9k/hw.h | 3 ++- 5 files changed, 10 insertions(+), 8 deletions(-)drivers/net/wireless/ath/ath9k/ar5008_phy.c +1
-1@@ -868,7 +868,7 @@ static int ar5008_hw_process_ini(struct ath_hw *ah,ar5008_hw_set_channel_regs (ah, chan);ar5008_hw_init_chain_masks (ah);ath9k_olc_init (ah); -ath9k_hw_apply_txpower (ah, chan); +ath9k_hw_apply_txpower (ah, chan, false);/* Write analog registers */ if (!ath9k_hw_set_rf_regs (ah, chan, freqIndex)) {drivers/net/wireless/ath/ath9k/ar9003_paprd.c +1
-1@@ -54,7 +54,7 @@ void ar9003_paprd_enable(struct ath_hw *ah, bool val)if (val) { ah->paprd_table_write_done = true; -ath9k_hw_apply_txpower (ah, chan); +ath9k_hw_apply_txpower (ah, chan, false); } REG_RMW_FIELD(ah, AR_PHY_PAPRD_CTRL0_B0,drivers/net/wireless/ath/ath9k/ar9003_phy.c +1
-1@@ -690,7 +690,7 @@ static int ar9003_hw_process_ini(struct ath_hw *ah,ar9003_hw_override_ini (ah);ar9003_hw_set_channel_regs (ah, chan);ar9003_hw_set_chain_masks (ah, ah->rxchainmask, ah->txchainmask); -ath9k_hw_apply_txpower (ah, chan); +ath9k_hw_apply_txpower (ah, chan, false);if (AR_SREV_9462 (ah)) { if (REG_READ_FIELD(ah, AR_PHY_TX_IQCAL_CONTROL_0,drivers/net/wireless/ath/ath9k/hw.c +5
-4@@ -1453,7 +1453,7 @@ static bool ath9k_hw_channel_change(struct ath_hw *ah,return false; }ath9k_hw_set_clockrate (ah); -ath9k_hw_apply_txpower (ah, chan); +ath9k_hw_apply_txpower (ah, chan, false);ath9k_hw_rfbus_done (ah);if (IS_CHAN_OFDM (chan) ||IS_CHAN_HT (chan))@@ -2724,7 +2724,8 @@ static int get_antenna_gain(struct ath_hw *ah, struct ath9k_channel *chan)return ah->eep_ops->get_eeprom (ah, gain_param); } -void ath9k_hw_apply_txpower (struct ath_hw *ah,struct ath9k_channel *chan) +void ath9k_hw_apply_txpower (struct ath_hw *ah,struct ath9k_channel *chan, +bool test) {struct ath_regulatory *reg =ath9k_hw_regulatory (ah);struct ieee80211_channel *channel;@@ -2745,7 +2746,7 @@ void ath9k_hw_apply_txpower(struct ath_hw *ah, struct ath9k_channel *chan) ah->eep_ops->set_txpower (ah, chan,ath9k_regd_get_ctl (reg, chan), - ant_reduction, new_pwr, false); + ant_reduction, new_pwr, test); }void ath9k_hw_set_txpowerlimit (struct ath_hw *ah,u32 limit,bool test)@@ -2758,7 +2759,7 @@ void ath9k_hw_set_txpowerlimit(struct ath_hw *ah, u32 limit, bool test)if (test) channel->max_power =MAX_RATE_POWER /2 ; -ath9k_hw_apply_txpower (ah, chan); +ath9k_hw_apply_txpower (ah, chan, test);if (test) channel->max_power =DIV_ROUND_UP (reg->max_power_level,2 );drivers/net/wireless/ath/ath9k/hw.h +2
-1@@ -976,7 +976,8 @@ void ath9k_hw_name(struct ath_hw *ah, char *hw_name, size_t len);/* PHY */ void ath9k_hw_get_delta_slope_vals (struct ath_hw *ah,u32 coef_scaled,u32 *coef_mantissa,u32 *coef_exponent); -void ath9k_hw_apply_txpower (struct ath_hw *ah,struct ath9k_channel *chan); +void ath9k_hw_apply_txpower (struct ath_hw *ah,struct ath9k_channel *chan, +bool test);/* * Code Specific to AR5008, AR9001 or AR9002, Signature · 1 line
1.7.2.1
Signature · 2 lines
John W. Linville Someday the world will need a hero, and you linville at tuxdriver.com might be all we have. Be ready.
PATCH 1/2 ath9k: add an extra boolean parameter to ath9k_hw_apply_txpower
2012.04.17. 20:42 keltezéssel, John W. Linville írta:
Quoted 1 line
Are these intended as fixes for 3.4?
Yes. Sorry, I forgot to mention that.
-Gabor
Quoted 133 lines · Gabor Juhos
Quoted 130 lines
In order to unifying regulatory limit handling commit
ca2c68cc7bc80fc4504fb420df04cce99c9ee6ec(ath9k_hw: clean up tx power handling) introduced a new helper function 'ath9k_hw_apply_txpower', and the direct calls of 'ah->eep_ops->set_txpower' has been replaced by a call of the helper function.This caused a change in the behaviour of the '
ath9k_hw_set_txpowerlimit' function. The purpose of that function is to calculate and store the rate txpower table and the regulatory limit without touching the hardware registers. Before the commit, the 'test' parameter of the function was passed to the 'ah->eep_ops->set_txpower'. Now the calling of the 'set_txpower' function happens indirectly through 'ath9k_hw_apply_txpower', so the 'test' argument of the 'set_txpower' is always 'false'.This patch restores the original behaviour of '
ath9k_hw_set_txpowerlimit' by adding a new argument to 'ath9k_hw_apply_txpower.'Signed-off-by Gabor Juhos <[email protected]>Acked-by Felix Fietkau <[email protected]>--- drivers/net/wireless/ath/ath9k/ar5008_phy.c | 2 +- drivers/net/wireless/ath/ath9k/ar9003_paprd.c | 2 +- drivers/net/wireless/ath/ath9k/ar9003_phy.c | 2 +- drivers/net/wireless/ath/ath9k/hw.c | 9 +++++---- drivers/net/wireless/ath/ath9k/hw.h | 3 ++- 5 files changed, 10 insertions(+), 8 deletions(-)drivers/net/wireless/ath/ath9k/ar5008_phy.c +1
-1@@ -868,7 +868,7 @@ static int ar5008_hw_process_ini(struct ath_hw *ah,ar5008_hw_set_channel_regs (ah, chan);ar5008_hw_init_chain_masks (ah);ath9k_olc_init (ah); -ath9k_hw_apply_txpower (ah, chan); +ath9k_hw_apply_txpower (ah, chan, false);/* Write analog registers */ if (!ath9k_hw_set_rf_regs (ah, chan, freqIndex)) {drivers/net/wireless/ath/ath9k/ar9003_paprd.c +1
-1@@ -54,7 +54,7 @@ void ar9003_paprd_enable(struct ath_hw *ah, bool val)if (val) { ah->paprd_table_write_done = true; -ath9k_hw_apply_txpower (ah, chan); +ath9k_hw_apply_txpower (ah, chan, false); } REG_RMW_FIELD(ah, AR_PHY_PAPRD_CTRL0_B0,drivers/net/wireless/ath/ath9k/ar9003_phy.c +1
-1@@ -690,7 +690,7 @@ static int ar9003_hw_process_ini(struct ath_hw *ah,ar9003_hw_override_ini (ah);ar9003_hw_set_channel_regs (ah, chan);ar9003_hw_set_chain_masks (ah, ah->rxchainmask, ah->txchainmask); -ath9k_hw_apply_txpower (ah, chan); +ath9k_hw_apply_txpower (ah, chan, false);if (AR_SREV_9462 (ah)) { if (REG_READ_FIELD(ah, AR_PHY_TX_IQCAL_CONTROL_0,drivers/net/wireless/ath/ath9k/hw.c +5
-4@@ -1453,7 +1453,7 @@ static bool ath9k_hw_channel_change(struct ath_hw *ah,return false; }ath9k_hw_set_clockrate (ah); -ath9k_hw_apply_txpower (ah, chan); +ath9k_hw_apply_txpower (ah, chan, false);ath9k_hw_rfbus_done (ah);if (IS_CHAN_OFDM (chan) ||IS_CHAN_HT (chan))@@ -2724,7 +2724,8 @@ static int get_antenna_gain(struct ath_hw *ah, struct ath9k_channel *chan)return ah->eep_ops->get_eeprom (ah, gain_param); } -void ath9k_hw_apply_txpower (struct ath_hw *ah,struct ath9k_channel *chan) +void ath9k_hw_apply_txpower (struct ath_hw *ah,struct ath9k_channel *chan, +bool test) {struct ath_regulatory *reg =ath9k_hw_regulatory (ah);struct ieee80211_channel *channel;@@ -2745,7 +2746,7 @@ void ath9k_hw_apply_txpower(struct ath_hw *ah, struct ath9k_channel *chan) ah->eep_ops->set_txpower (ah, chan,ath9k_regd_get_ctl (reg, chan), - ant_reduction, new_pwr, false); + ant_reduction, new_pwr, test); }void ath9k_hw_set_txpowerlimit (struct ath_hw *ah,u32 limit,bool test)@@ -2758,7 +2759,7 @@ void ath9k_hw_set_txpowerlimit(struct ath_hw *ah, u32 limit, bool test)if (test) channel->max_power =MAX_RATE_POWER /2 ; -ath9k_hw_apply_txpower (ah, chan); +ath9k_hw_apply_txpower (ah, chan, test);if (test) channel->max_power =DIV_ROUND_UP (reg->max_power_level,2 );drivers/net/wireless/ath/ath9k/hw.h +2
-1@@ -976,7 +976,8 @@ void ath9k_hw_name(struct ath_hw *ah, char *hw_name, size_t len);/* PHY */ void ath9k_hw_get_delta_slope_vals (struct ath_hw *ah,u32 coef_scaled,u32 *coef_mantissa,u32 *coef_exponent); -void ath9k_hw_apply_txpower (struct ath_hw *ah,struct ath9k_channel *chan); +void ath9k_hw_apply_txpower (struct ath_hw *ah,struct ath9k_channel *chan, +bool test);/* * Code Specific to AR5008, AR9001 or AR9002, Signature · 1 line
1.7.2.1