mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-11-03 14:34:27 -05:00 
			
		
		
		
	ath9k: add back support for using tx99 with active monitor interfaces
Fixes controlling bitrate Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
		
							parent
							
								
									7decdf923a
								
							
						
					
					
						commit
						a32a70f4f2
					
				@ -0,0 +1,96 @@
 | 
			
		||||
From: Felix Fietkau <nbd@nbd.name>
 | 
			
		||||
Date: Sat, 22 Sep 2018 15:20:50 +0200
 | 
			
		||||
Subject: [PATCH] ath9k: add back support for using active monitor interfaces
 | 
			
		||||
 for tx99
 | 
			
		||||
 | 
			
		||||
Various documented examples on how to set up tx99 with ath9k rely
 | 
			
		||||
on setting up a regular monitor interface for setting the channel.
 | 
			
		||||
My previous patch "ath9k: fix tx99 with monitor mode interface" made
 | 
			
		||||
it possible to set it up this way again. However, it was removing support
 | 
			
		||||
for using an active monitor interface, which is required for controlling
 | 
			
		||||
the bitrate as well, since the bitrate is not passed down with a regular
 | 
			
		||||
monitor interface.
 | 
			
		||||
 | 
			
		||||
This patch partially reverts the previous one, but keeps support for using
 | 
			
		||||
a regular monitor interface to keep documented steps working in cases
 | 
			
		||||
where the bitrate does not matter
 | 
			
		||||
 | 
			
		||||
Fixes: d9c52fd17cb48 ("ath9k: fix tx99 with monitor mode interface")
 | 
			
		||||
Signed-off-by: Felix Fietkau <nbd@nbd.name>
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
 | 
			
		||||
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
 | 
			
		||||
@@ -1074,6 +1074,7 @@ struct ath_softc {
 | 
			
		||||
 
 | 
			
		||||
 	struct ath_spec_scan_priv spec_priv;
 | 
			
		||||
 
 | 
			
		||||
+	struct ieee80211_vif *tx99_vif;
 | 
			
		||||
 	struct sk_buff *tx99_skb;
 | 
			
		||||
 	bool tx99_state;
 | 
			
		||||
 	s16 tx99_power;
 | 
			
		||||
--- a/drivers/net/wireless/ath/ath9k/main.c
 | 
			
		||||
+++ b/drivers/net/wireless/ath/ath9k/main.c
 | 
			
		||||
@@ -1251,8 +1251,13 @@ static int ath9k_add_interface(struct ie
 | 
			
		||||
 	struct ath_vif *avp = (void *)vif->drv_priv;
 | 
			
		||||
 	struct ath_node *an = &avp->mcast_node;
 | 
			
		||||
 
 | 
			
		||||
-	if (IS_ENABLED(CPTCFG_ATH9K_TX99))
 | 
			
		||||
-		return -EOPNOTSUPP;
 | 
			
		||||
+	if (IS_ENABLED(CPTCFG_ATH9K_TX99)) {
 | 
			
		||||
+		if (sc->cur_chan->nvifs >= 1) {
 | 
			
		||||
+			mutex_unlock(&sc->mutex);
 | 
			
		||||
+			return -EOPNOTSUPP;
 | 
			
		||||
+		}
 | 
			
		||||
+		sc->tx99_vif = vif;
 | 
			
		||||
+	}
 | 
			
		||||
 
 | 
			
		||||
 	mutex_lock(&sc->mutex);
 | 
			
		||||
 
 | 
			
		||||
@@ -1337,6 +1342,7 @@ static void ath9k_remove_interface(struc
 | 
			
		||||
 	ath9k_p2p_remove_vif(sc, vif);
 | 
			
		||||
 
 | 
			
		||||
 	sc->cur_chan->nvifs--;
 | 
			
		||||
+	sc->tx99_vif = NULL;
 | 
			
		||||
 	if (!ath9k_is_chanctx_enabled())
 | 
			
		||||
 		list_del(&avp->list);
 | 
			
		||||
 
 | 
			
		||||
--- a/drivers/net/wireless/ath/ath9k/tx99.c
 | 
			
		||||
+++ b/drivers/net/wireless/ath/ath9k/tx99.c
 | 
			
		||||
@@ -54,6 +54,7 @@ static struct sk_buff *ath9k_build_tx99_
 | 
			
		||||
 	struct ieee80211_hdr *hdr;
 | 
			
		||||
 	struct ieee80211_tx_info *tx_info;
 | 
			
		||||
 	struct sk_buff *skb;
 | 
			
		||||
+	struct ath_vif *avp;
 | 
			
		||||
 
 | 
			
		||||
 	skb = alloc_skb(len, GFP_KERNEL);
 | 
			
		||||
 	if (!skb)
 | 
			
		||||
@@ -71,11 +72,17 @@ static struct sk_buff *ath9k_build_tx99_
 | 
			
		||||
 	memcpy(hdr->addr2, hw->wiphy->perm_addr, ETH_ALEN);
 | 
			
		||||
 	memcpy(hdr->addr3, hw->wiphy->perm_addr, ETH_ALEN);
 | 
			
		||||
 
 | 
			
		||||
+	if (sc->tx99_vif) {
 | 
			
		||||
+		avp = (struct ath_vif *) sc->tx99_vif->drv_priv;
 | 
			
		||||
+		hdr->seq_ctrl |= cpu_to_le16(avp->seq_no);
 | 
			
		||||
+	}
 | 
			
		||||
+
 | 
			
		||||
 	tx_info = IEEE80211_SKB_CB(skb);
 | 
			
		||||
 	memset(tx_info, 0, sizeof(*tx_info));
 | 
			
		||||
 	rate = &tx_info->control.rates[0];
 | 
			
		||||
 	tx_info->band = sc->cur_chan->chandef.chan->band;
 | 
			
		||||
 	tx_info->flags = IEEE80211_TX_CTL_NO_ACK;
 | 
			
		||||
+	tx_info->control.vif = sc->tx99_vif;
 | 
			
		||||
 	rate->count = 1;
 | 
			
		||||
 	if (ah->curchan && IS_CHAN_HT(ah->curchan)) {
 | 
			
		||||
 		rate->flags |= IEEE80211_TX_RC_MCS;
 | 
			
		||||
--- a/drivers/net/wireless/ath/ath9k/xmit.c
 | 
			
		||||
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
 | 
			
		||||
@@ -2973,7 +2973,7 @@ int ath9k_tx99_send(struct ath_softc *sc
 | 
			
		||||
 		return -EINVAL;
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
-	ath_set_rates(NULL, NULL, bf);
 | 
			
		||||
+	ath_set_rates(sc->tx99_vif, NULL, bf);
 | 
			
		||||
 
 | 
			
		||||
 	ath9k_hw_set_desc_link(sc->sc_ah, bf->bf_desc, bf->bf_daddr);
 | 
			
		||||
 	ath9k_hw_tx99_start(sc->sc_ah, txctl->txq->axq_qnum);
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user