mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-20 17:17:05 +07:00
ath9k: Differentiate between max combined and per chain power
The ath9k driver uses as maximum allowed txpower the constant MAX_RATE_POWER. It is used to set a maximum txpower limit for the PHY (which is combined txpower) and also the maximum txpower for per chain rates. Its value 63 is derived from the maximum number the registers can store for the per chain txpower. The max txpower a user can set because of this is 31 dBm (floor(63 / 2)). This also means that a device with multiple tx chains is even limited further: * 1 chain: 31 dBm per chain * 2 chains: 28 dBm per chain * 3 chains: 26 dBm per chain This combined txpower limit of 31 dBm becomes even more problematic when some extra antenna gain is set in the EEPROM. A high power device is then no longer able to reach its potential limits. Instead the code dealing with the combined txpower must use a higher limit than 63 and only the code dealing with the per chain txpower have to use the limit of 63. Since the antenna gain can be quite large and 8 bit variables are often used in ath9k for txpower, a large, divisible by two number like 254 is a good choice for this new limit. Signed-off-by: Sven Eckelmann <sven@narfation.org> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
This commit is contained in:
parent
2f90c7e5d0
commit
b037b10756
@ -428,7 +428,7 @@ u16 ath9k_hw_get_scaled_power(struct ath_hw *ah, u16 power_limit,
|
|||||||
else
|
else
|
||||||
power_limit = 0;
|
power_limit = 0;
|
||||||
|
|
||||||
return power_limit;
|
return min_t(u16, power_limit, MAX_RATE_POWER);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ath9k_hw_update_regulatory_maxpower(struct ath_hw *ah)
|
void ath9k_hw_update_regulatory_maxpower(struct ath_hw *ah)
|
||||||
|
@ -424,6 +424,7 @@ static void ath9k_hw_set_4k_power_per_rate_table(struct ath_hw *ah,
|
|||||||
ath9k_hw_get_channel_centers(ah, chan, ¢ers);
|
ath9k_hw_get_channel_centers(ah, chan, ¢ers);
|
||||||
|
|
||||||
scaledPower = powerLimit - antenna_reduction;
|
scaledPower = powerLimit - antenna_reduction;
|
||||||
|
scaledPower = min_t(u16, scaledPower, MAX_RATE_POWER);
|
||||||
numCtlModes = ARRAY_SIZE(ctlModesFor11g) - SUB_NUM_CTL_MODES_AT_2G_40;
|
numCtlModes = ARRAY_SIZE(ctlModesFor11g) - SUB_NUM_CTL_MODES_AT_2G_40;
|
||||||
pCtlMode = ctlModesFor11g;
|
pCtlMode = ctlModesFor11g;
|
||||||
|
|
||||||
|
@ -457,7 +457,7 @@ static void ath9k_hw_init_defaults(struct ath_hw *ah)
|
|||||||
struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
|
struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
|
||||||
|
|
||||||
regulatory->country_code = CTRY_DEFAULT;
|
regulatory->country_code = CTRY_DEFAULT;
|
||||||
regulatory->power_limit = MAX_RATE_POWER;
|
regulatory->power_limit = MAX_COMBINED_POWER;
|
||||||
|
|
||||||
ah->hw_version.magic = AR5416_MAGIC;
|
ah->hw_version.magic = AR5416_MAGIC;
|
||||||
ah->hw_version.subvendorid = 0;
|
ah->hw_version.subvendorid = 0;
|
||||||
@ -2966,7 +2966,7 @@ void ath9k_hw_apply_txpower(struct ath_hw *ah, struct ath9k_channel *chan,
|
|||||||
ctl = ath9k_regd_get_ctl(reg, chan);
|
ctl = ath9k_regd_get_ctl(reg, chan);
|
||||||
|
|
||||||
channel = chan->chan;
|
channel = chan->chan;
|
||||||
chan_pwr = min_t(int, channel->max_power * 2, MAX_RATE_POWER);
|
chan_pwr = min_t(int, channel->max_power * 2, MAX_COMBINED_POWER);
|
||||||
new_pwr = min_t(int, chan_pwr, reg->power_limit);
|
new_pwr = min_t(int, chan_pwr, reg->power_limit);
|
||||||
|
|
||||||
ah->eep_ops->set_txpower(ah, chan, ctl,
|
ah->eep_ops->set_txpower(ah, chan, ctl,
|
||||||
@ -2979,9 +2979,9 @@ void ath9k_hw_set_txpowerlimit(struct ath_hw *ah, u32 limit, bool test)
|
|||||||
struct ath9k_channel *chan = ah->curchan;
|
struct ath9k_channel *chan = ah->curchan;
|
||||||
struct ieee80211_channel *channel = chan->chan;
|
struct ieee80211_channel *channel = chan->chan;
|
||||||
|
|
||||||
reg->power_limit = min_t(u32, limit, MAX_RATE_POWER);
|
reg->power_limit = min_t(u32, limit, MAX_COMBINED_POWER);
|
||||||
if (test)
|
if (test)
|
||||||
channel->max_power = MAX_RATE_POWER / 2;
|
channel->max_power = MAX_COMBINED_POWER / 2;
|
||||||
|
|
||||||
ath9k_hw_apply_txpower(ah, chan, test);
|
ath9k_hw_apply_txpower(ah, chan, test);
|
||||||
|
|
||||||
|
@ -173,6 +173,7 @@
|
|||||||
#define ATH9K_NUM_QUEUES 10
|
#define ATH9K_NUM_QUEUES 10
|
||||||
|
|
||||||
#define MAX_RATE_POWER 63
|
#define MAX_RATE_POWER 63
|
||||||
|
#define MAX_COMBINED_POWER 254 /* 128 dBm, chosen to fit in u8 */
|
||||||
#define AH_WAIT_TIMEOUT 100000 /* (us) */
|
#define AH_WAIT_TIMEOUT 100000 /* (us) */
|
||||||
#define AH_TSF_WRITE_TIMEOUT 100 /* (us) */
|
#define AH_TSF_WRITE_TIMEOUT 100 /* (us) */
|
||||||
#define AH_TIME_QUANTUM 10
|
#define AH_TIME_QUANTUM 10
|
||||||
|
@ -805,7 +805,7 @@ static void ath9k_init_band_txpower(struct ath_softc *sc, int band)
|
|||||||
ah->curchan = &ah->channels[chan->hw_value];
|
ah->curchan = &ah->channels[chan->hw_value];
|
||||||
cfg80211_chandef_create(&chandef, chan, NL80211_CHAN_HT20);
|
cfg80211_chandef_create(&chandef, chan, NL80211_CHAN_HT20);
|
||||||
ath9k_cmn_get_channel(sc->hw, ah, &chandef);
|
ath9k_cmn_get_channel(sc->hw, ah, &chandef);
|
||||||
ath9k_hw_set_txpowerlimit(ah, MAX_RATE_POWER, true);
|
ath9k_hw_set_txpowerlimit(ah, MAX_COMBINED_POWER, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user