ath9k: fix tx99 with monitor mode interface
authorFelix Fietkau <nbd@nbd.name>
Mon, 20 Aug 2018 09:37:51 +0000 (11:37 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 20 Nov 2019 17:45:28 +0000 (18:45 +0100)
[ Upstream commit d9c52fd17cb483bd8a470398afcb79f86c1b77c8 ]

Tx99 is typically configured via a monitor mode interface, which does
not get added to the driver as a vif. Since the code currently expects
a configured virtual interface for tx99, enabling tx99 via debugfs fails.
Since the vif is not needed anyway, remove all checks for it.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
[kvalo@codeaurora.org: s/CPTCFG/CONFIG/]
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/wireless/ath/ath9k/ath9k.h
drivers/net/wireless/ath/ath9k/main.c
drivers/net/wireless/ath/ath9k/tx99.c
drivers/net/wireless/ath/ath9k/xmit.c

index 0fca44e..50206a6 100644 (file)
@@ -1074,7 +1074,6 @@ 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;
index 1049773..6ce4b9f 100644 (file)
@@ -1251,15 +1251,10 @@ static int ath9k_add_interface(struct ieee80211_hw *hw,
        struct ath_vif *avp = (void *)vif->drv_priv;
        struct ath_node *an = &avp->mcast_node;
 
-       mutex_lock(&sc->mutex);
+       if (IS_ENABLED(CONFIG_ATH9K_TX99))
+               return -EOPNOTSUPP;
 
-       if (IS_ENABLED(CONFIG_ATH9K_TX99)) {
-               if (sc->cur_chan->nvifs >= 1) {
-                       mutex_unlock(&sc->mutex);
-                       return -EOPNOTSUPP;
-               }
-               sc->tx99_vif = vif;
-       }
+       mutex_lock(&sc->mutex);
 
        ath_dbg(common, CONFIG, "Attach a VIF of type: %d\n", vif->type);
        sc->cur_chan->nvifs++;
@@ -1342,7 +1337,6 @@ static void ath9k_remove_interface(struct ieee80211_hw *hw,
        ath9k_p2p_remove_vif(sc, vif);
 
        sc->cur_chan->nvifs--;
-       sc->tx99_vif = NULL;
        if (!ath9k_is_chanctx_enabled())
                list_del(&avp->list);
 
index ce50d8f..9b05ffb 100644 (file)
@@ -54,12 +54,6 @@ static struct sk_buff *ath9k_build_tx99_skb(struct ath_softc *sc)
        struct ieee80211_hdr *hdr;
        struct ieee80211_tx_info *tx_info;
        struct sk_buff *skb;
-       struct ath_vif *avp;
-
-       if (!sc->tx99_vif)
-               return NULL;
-
-       avp = (struct ath_vif *)sc->tx99_vif->drv_priv;
 
        skb = alloc_skb(len, GFP_KERNEL);
        if (!skb)
@@ -77,14 +71,11 @@ static struct sk_buff *ath9k_build_tx99_skb(struct ath_softc *sc)
        memcpy(hdr->addr2, hw->wiphy->perm_addr, ETH_ALEN);
        memcpy(hdr->addr3, hw->wiphy->perm_addr, ETH_ALEN);
 
-       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;
index 4b7a7fc..3ae8d05 100644 (file)
@@ -2974,7 +2974,7 @@ int ath9k_tx99_send(struct ath_softc *sc, struct sk_buff *skb,
                return -EINVAL;
        }
 
-       ath_set_rates(sc->tx99_vif, NULL, bf);
+       ath_set_rates(NULL, 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);