diff options
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/xmit.c')
-rw-r--r-- | drivers/net/wireless/ath/ath9k/xmit.c | 37 |
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 | ||
1099 | static 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 | |||
1099 | static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf, | 1130 | static 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; |