aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath/ath9k/xmit.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/xmit.c')
-rw-r--r--drivers/net/wireless/ath/ath9k/xmit.c37
1 files changed, 36 insertions, 1 deletions
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c
index d6e54a3c88f6..e9bd02c2e844 100644
--- a/drivers/net/wireless/ath/ath9k/xmit.c
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
@@ -1096,6 +1096,37 @@ void ath_update_max_aggr_framelen(struct ath_softc *sc, int queue, int txop)
1096 } 1096 }
1097} 1097}
1098 1098
1099static u8 ath_get_rate_txpower(struct ath_softc *sc, struct ath_buf *bf,
1100 u8 rateidx)
1101{
1102 u8 max_power;
1103 struct ath_hw *ah = sc->sc_ah;
1104
1105 if (sc->tx99_state)
1106 return MAX_RATE_POWER;
1107
1108 if (!AR_SREV_9300_20_OR_LATER(ah)) {
1109 /* ar9002 is not sipported for the moment */
1110 return MAX_RATE_POWER;
1111 }
1112
1113 if (!bf->bf_state.bfs_paprd) {
1114 struct sk_buff *skb = bf->bf_mpdu;
1115 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
1116 struct ath_frame_info *fi = get_frame_info(skb);
1117
1118 if (rateidx < 8 && (info->flags & IEEE80211_TX_CTL_STBC))
1119 max_power = min(ah->tx_power_stbc[rateidx],
1120 fi->tx_power);
1121 else
1122 max_power = min(ah->tx_power[rateidx], fi->tx_power);
1123 } else {
1124 max_power = ah->paprd_training_power;
1125 }
1126
1127 return max_power;
1128}
1129
1099static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf, 1130static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf,
1100 struct ath_tx_info *info, int len, bool rts) 1131 struct ath_tx_info *info, int len, bool rts)
1101{ 1132{
@@ -1166,6 +1197,8 @@ static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf,
1166 is_40, is_sgi, is_sp); 1197 is_40, is_sgi, is_sp);
1167 if (rix < 8 && (tx_info->flags & IEEE80211_TX_CTL_STBC)) 1198 if (rix < 8 && (tx_info->flags & IEEE80211_TX_CTL_STBC))
1168 info->rates[i].RateFlags |= ATH9K_RATESERIES_STBC; 1199 info->rates[i].RateFlags |= ATH9K_RATESERIES_STBC;
1200
1201 info->txpower[i] = ath_get_rate_txpower(sc, bf, rix);
1169 continue; 1202 continue;
1170 } 1203 }
1171 1204
@@ -1193,6 +1226,8 @@ static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf,
1193 1226
1194 info->rates[i].PktDuration = ath9k_hw_computetxtime(sc->sc_ah, 1227 info->rates[i].PktDuration = ath9k_hw_computetxtime(sc->sc_ah,
1195 phy, rate->bitrate * 100, len, rix, is_sp); 1228 phy, rate->bitrate * 100, len, rix, is_sp);
1229
1230 info->txpower[i] = ath_get_rate_txpower(sc, bf, rix);
1196 } 1231 }
1197 1232
1198 /* For AR5416 - RTS cannot be followed by a frame larger than 8K */ 1233 /* For AR5416 - RTS cannot be followed by a frame larger than 8K */
@@ -1239,7 +1274,6 @@ static void ath_tx_fill_desc(struct ath_softc *sc, struct ath_buf *bf,
1239 memset(&info, 0, sizeof(info)); 1274 memset(&info, 0, sizeof(info));
1240 info.is_first = true; 1275 info.is_first = true;
1241 info.is_last = true; 1276 info.is_last = true;
1242 info.txpower = MAX_RATE_POWER;
1243 info.qcu = txq->axq_qnum; 1277 info.qcu = txq->axq_qnum;
1244 1278
1245 while (bf) { 1279 while (bf) {
@@ -2063,6 +2097,7 @@ static void setup_frame_info(struct ieee80211_hw *hw,
2063 fi->keyix = ATH9K_TXKEYIX_INVALID; 2097 fi->keyix = ATH9K_TXKEYIX_INVALID;
2064 fi->keytype = keytype; 2098 fi->keytype = keytype;
2065 fi->framelen = framelen; 2099 fi->framelen = framelen;
2100 fi->tx_power = MAX_RATE_POWER;
2066 2101
2067 if (!rate) 2102 if (!rate)
2068 return; 2103 return;