Skip to content

Commit f673821

Browse files
LorenzoBianconiKalle Valo
authored andcommitted
ath9k: fix per-packet tx power configuration
Do not use ieee80211_vif pointer in ath_get_rate_txpower() since it has been overwritten by setup_frame_info() and it will result in a corrupted tx power configuration. Set per-packet tx power in setup_frame_info() according to current vif tx power. Signed-off-by: Lorenzo Bianconi <[email protected]> Signed-off-by: Kalle Valo <[email protected]>
1 parent 0581276 commit f673821

File tree

1 file changed

+25
-27
lines changed
  • drivers/net/wireless/ath/ath9k

1 file changed

+25
-27
lines changed

drivers/net/wireless/ath/ath9k/xmit.c

Lines changed: 25 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1103,28 +1103,14 @@ static u8 ath_get_rate_txpower(struct ath_softc *sc, struct ath_buf *bf,
11031103
struct sk_buff *skb;
11041104
struct ath_frame_info *fi;
11051105
struct ieee80211_tx_info *info;
1106-
struct ieee80211_vif *vif;
11071106
struct ath_hw *ah = sc->sc_ah;
11081107

11091108
if (sc->tx99_state || !ah->tpc_enabled)
11101109
return MAX_RATE_POWER;
11111110

11121111
skb = bf->bf_mpdu;
1113-
info = IEEE80211_SKB_CB(skb);
1114-
vif = info->control.vif;
1115-
1116-
if (!vif) {
1117-
max_power = sc->cur_chan->cur_txpower;
1118-
goto out;
1119-
}
1120-
1121-
if (vif->bss_conf.txpower_type != NL80211_TX_POWER_LIMITED) {
1122-
max_power = min_t(u8, sc->cur_chan->cur_txpower,
1123-
2 * vif->bss_conf.txpower);
1124-
goto out;
1125-
}
1126-
11271112
fi = get_frame_info(skb);
1113+
info = IEEE80211_SKB_CB(skb);
11281114

11291115
if (!AR_SREV_9300_20_OR_LATER(ah)) {
11301116
int txpower = fi->tx_power;
@@ -1161,25 +1147,26 @@ static u8 ath_get_rate_txpower(struct ath_softc *sc, struct ath_buf *bf,
11611147
txpower -= 2;
11621148

11631149
txpower = max(txpower, 0);
1164-
max_power = min_t(u8, ah->tx_power[rateidx],
1165-
2 * vif->bss_conf.txpower);
1166-
max_power = min_t(u8, max_power, txpower);
1150+
max_power = min_t(u8, ah->tx_power[rateidx], txpower);
1151+
1152+
/* XXX: clamp minimum TX power at 1 for AR9160 since if
1153+
* max_power is set to 0, frames are transmitted at max
1154+
* TX power
1155+
*/
1156+
if (!max_power && !AR_SREV_9280_20_OR_LATER(ah))
1157+
max_power = 1;
11671158
} else if (!bf->bf_state.bfs_paprd) {
11681159
if (rateidx < 8 && (info->flags & IEEE80211_TX_CTL_STBC))
11691160
max_power = min_t(u8, ah->tx_power_stbc[rateidx],
1170-
2 * vif->bss_conf.txpower);
1161+
fi->tx_power);
11711162
else
11721163
max_power = min_t(u8, ah->tx_power[rateidx],
1173-
2 * vif->bss_conf.txpower);
1174-
max_power = min(max_power, fi->tx_power);
1164+
fi->tx_power);
11751165
} else {
11761166
max_power = ah->paprd_training_power;
11771167
}
1178-
out:
1179-
/* XXX: clamp minimum TX power at 1 for AR9160 since if max_power
1180-
* is set to 0, frames are transmitted at max TX power
1181-
*/
1182-
return (!max_power && !AR_SREV_9280_20_OR_LATER(ah)) ? 1 : max_power;
1168+
1169+
return max_power;
11831170
}
11841171

11851172
static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf,
@@ -2129,6 +2116,7 @@ static void setup_frame_info(struct ieee80211_hw *hw,
21292116
struct ath_node *an = NULL;
21302117
enum ath9k_key_type keytype;
21312118
bool short_preamble = false;
2119+
u8 txpower;
21322120

21332121
/*
21342122
* We check if Short Preamble is needed for the CTS rate by
@@ -2145,6 +2133,16 @@ static void setup_frame_info(struct ieee80211_hw *hw,
21452133
if (sta)
21462134
an = (struct ath_node *) sta->drv_priv;
21472135

2136+
if (tx_info->control.vif) {
2137+
struct ieee80211_vif *vif = tx_info->control.vif;
2138+
2139+
txpower = 2 * vif->bss_conf.txpower;
2140+
} else {
2141+
struct ath_softc *sc = hw->priv;
2142+
2143+
txpower = sc->cur_chan->cur_txpower;
2144+
}
2145+
21482146
memset(fi, 0, sizeof(*fi));
21492147
fi->txq = -1;
21502148
if (hw_key)
@@ -2155,7 +2153,7 @@ static void setup_frame_info(struct ieee80211_hw *hw,
21552153
fi->keyix = ATH9K_TXKEYIX_INVALID;
21562154
fi->keytype = keytype;
21572155
fi->framelen = framelen;
2158-
fi->tx_power = MAX_RATE_POWER;
2156+
fi->tx_power = txpower;
21592157

21602158
if (!rate)
21612159
return;

0 commit comments

Comments
 (0)