| From foo@baz Mon Sep 17 12:33:31 CEST 2018 |
| From: Felix Fietkau <nbd@nbd.name> |
| Date: Mon, 30 Jul 2018 21:31:28 +0300 |
| Subject: ath9k_hw: fix channel maximum power level test |
| |
| From: Felix Fietkau <nbd@nbd.name> |
| |
| [ Upstream commit 461d8a6bb9879b0e619752d040292e67aa06f1d2 ] |
| |
| The tx power applied by set_txpower is limited by the CTL (conformance |
| test limit) entries in the EEPROM. These can change based on the user |
| configured regulatory domain. |
| Depending on the EEPROM data this can cause the tx power to become too |
| limited, if the original regdomain CTLs impose lower limits than the CTLs |
| of the user configured regdomain. |
| |
| To fix this issue, set the initial channel limits without any CTL |
| restrictions and only apply the CTL at run time when setting the channel |
| and the real tx power. |
| |
| Signed-off-by: Felix Fietkau <nbd@nbd.name> |
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/net/wireless/ath/ath9k/hw.c | 7 +++++-- |
| 1 file changed, 5 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/net/wireless/ath/ath9k/hw.c |
| +++ b/drivers/net/wireless/ath/ath9k/hw.c |
| @@ -2915,16 +2915,19 @@ void ath9k_hw_apply_txpower(struct ath_h |
| struct ath_regulatory *reg = ath9k_hw_regulatory(ah); |
| struct ieee80211_channel *channel; |
| int chan_pwr, new_pwr; |
| + u16 ctl = NO_CTL; |
| |
| if (!chan) |
| return; |
| |
| + if (!test) |
| + ctl = ath9k_regd_get_ctl(reg, chan); |
| + |
| channel = chan->chan; |
| chan_pwr = min_t(int, channel->max_power * 2, MAX_RATE_POWER); |
| new_pwr = min_t(int, chan_pwr, reg->power_limit); |
| |
| - ah->eep_ops->set_txpower(ah, chan, |
| - ath9k_regd_get_ctl(reg, chan), |
| + ah->eep_ops->set_txpower(ah, chan, ctl, |
| get_antenna_gain(ah, chan), new_pwr, test); |
| } |
| |