Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 07c1e852 authored by Bob Copeland's avatar Bob Copeland Committed by John W. Linville
Browse files

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: default avatarBob Copeland <me@bobcopeland.com>
Acked-by: default avatarNick Kossifidis <mickflemm@gmail.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 8902ff4e
Loading
Loading
Loading
Loading
+17 −1
Original line number Original line Diff line number Diff line
@@ -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;