mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-12 21:44:06 +08:00
ath5k: honor the RTS/CTS bits
The ath5k driver didn't use set_rts_threshold or use_cts_prot, and also didn't check the IEEE80211_TX_RC_USE_{RTS_CTS,CTS_PROTECT} RC flags. Tell the hardware about these so RTS/CTS will work, and so the device will work better in mixed b/g environments. Changes-licensed-under: 3-Clause-BSD Signed-off-by: Bob Copeland <me@bobcopeland.com> Acked-by: Nick Kossifidis <mickflemm@gmail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
8902ff4e56
commit
07c1e85251
@ -1180,6 +1180,8 @@ ath5k_txbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf)
|
|||||||
unsigned int mrr_rate[3], mrr_tries[3];
|
unsigned int mrr_rate[3], mrr_tries[3];
|
||||||
int i, ret;
|
int i, ret;
|
||||||
u16 hw_rate;
|
u16 hw_rate;
|
||||||
|
u16 cts_rate = 0;
|
||||||
|
u16 duration = 0;
|
||||||
u8 rc_flags;
|
u8 rc_flags;
|
||||||
|
|
||||||
flags = AR5K_TXDESC_INTREQ | AR5K_TXDESC_CLRDMASK;
|
flags = AR5K_TXDESC_INTREQ | AR5K_TXDESC_CLRDMASK;
|
||||||
@ -1199,6 +1201,19 @@ ath5k_txbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf)
|
|||||||
|
|
||||||
pktlen = skb->len;
|
pktlen = skb->len;
|
||||||
|
|
||||||
|
if (rc_flags & IEEE80211_TX_RC_USE_RTS_CTS) {
|
||||||
|
flags |= AR5K_TXDESC_RTSENA;
|
||||||
|
cts_rate = ieee80211_get_rts_cts_rate(sc->hw, info)->hw_value;
|
||||||
|
duration = le16_to_cpu(ieee80211_rts_duration(sc->hw,
|
||||||
|
sc->vif, pktlen, info));
|
||||||
|
}
|
||||||
|
if (rc_flags & IEEE80211_TX_RC_USE_CTS_PROTECT) {
|
||||||
|
flags |= AR5K_TXDESC_CTSENA;
|
||||||
|
cts_rate = ieee80211_get_rts_cts_rate(sc->hw, info)->hw_value;
|
||||||
|
duration = le16_to_cpu(ieee80211_ctstoself_duration(sc->hw,
|
||||||
|
sc->vif, pktlen, info));
|
||||||
|
}
|
||||||
|
|
||||||
if (info->control.hw_key) {
|
if (info->control.hw_key) {
|
||||||
keyidx = info->control.hw_key->hw_key_idx;
|
keyidx = info->control.hw_key->hw_key_idx;
|
||||||
pktlen += info->control.hw_key->icv_len;
|
pktlen += info->control.hw_key->icv_len;
|
||||||
@ -1207,7 +1222,8 @@ ath5k_txbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf)
|
|||||||
ieee80211_get_hdrlen_from_skb(skb), AR5K_PKT_TYPE_NORMAL,
|
ieee80211_get_hdrlen_from_skb(skb), AR5K_PKT_TYPE_NORMAL,
|
||||||
(sc->power_level * 2),
|
(sc->power_level * 2),
|
||||||
hw_rate,
|
hw_rate,
|
||||||
info->control.rates[0].count, keyidx, 0, flags, 0, 0);
|
info->control.rates[0].count, keyidx, 0, flags,
|
||||||
|
cts_rate, duration);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err_unmap;
|
goto err_unmap;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user