It was wasteful to keep it in the struct because
it can be passed as function argument down the tx
path.

Signed-off-by: Michal Kazior <[email protected]>
---
 drivers/net/wireless/ath/ath10k/core.h   |  1 -
 drivers/net/wireless/ath/ath10k/htt.h    |  3 ++-
 drivers/net/wireless/ath/ath10k/htt_tx.c |  9 +++----
 drivers/net/wireless/ath/ath10k/mac.c    | 40 ++++++++++++++++++++++++--------
 4 files changed, 37 insertions(+), 16 deletions(-)

diff --git a/drivers/net/wireless/ath/ath10k/core.h 
b/drivers/net/wireless/ath/ath10k/core.h
index 64d9a63e6b48..efc34b1412b4 100644
--- a/drivers/net/wireless/ath/ath10k/core.h
+++ b/drivers/net/wireless/ath/ath10k/core.h
@@ -85,7 +85,6 @@ struct ath10k_skb_cb {
        dma_addr_t paddr;
        u8 eid;
        u8 vdev_id;
-       enum ath10k_hw_txrx_mode txmode;
 
        struct {
                u8 tid;
diff --git a/drivers/net/wireless/ath/ath10k/htt.h 
b/drivers/net/wireless/ath/ath10k/htt.h
index 2bad50e520b5..9d15924b1f90 100644
--- a/drivers/net/wireless/ath/ath10k/htt.h
+++ b/drivers/net/wireless/ath/ath10k/htt.h
@@ -1597,6 +1597,7 @@ void __ath10k_htt_tx_dec_pending(struct ath10k_htt *htt, 
bool limit_mgmt_desc);
 int ath10k_htt_tx_alloc_msdu_id(struct ath10k_htt *htt, struct sk_buff *skb);
 void ath10k_htt_tx_free_msdu_id(struct ath10k_htt *htt, u16 msdu_id);
 int ath10k_htt_mgmt_tx(struct ath10k_htt *htt, struct sk_buff *);
-int ath10k_htt_tx(struct ath10k_htt *htt, struct sk_buff *);
+int ath10k_htt_tx(struct ath10k_htt *htt, enum ath10k_hw_txrx_mode txmode,
+                 struct sk_buff *msdu);
 
 #endif
diff --git a/drivers/net/wireless/ath/ath10k/htt_tx.c 
b/drivers/net/wireless/ath/ath10k/htt_tx.c
index eaa9263f6151..bada9695a4fb 100644
--- a/drivers/net/wireless/ath/ath10k/htt_tx.c
+++ b/drivers/net/wireless/ath/ath10k/htt_tx.c
@@ -525,7 +525,8 @@ err:
        return res;
 }
 
-int ath10k_htt_tx(struct ath10k_htt *htt, struct sk_buff *msdu)
+int ath10k_htt_tx(struct ath10k_htt *htt, enum ath10k_hw_txrx_mode txmode,
+                 struct sk_buff *msdu)
 {
        struct ath10k *ar = htt->ar;
        struct device *dev = ar->dev;
@@ -577,7 +578,7 @@ int ath10k_htt_tx(struct ath10k_htt *htt, struct sk_buff 
*msdu)
             ieee80211_has_protected(hdr->frame_control)) {
                skb_put(msdu, IEEE80211_CCMP_MIC_LEN);
        } else if (!skb_cb->htt.nohwcrypt &&
-                  skb_cb->txmode == ATH10K_HW_TXRX_RAW &&
+                  txmode == ATH10K_HW_TXRX_RAW &&
                   ieee80211_has_protected(hdr->frame_control)) {
                skb_put(msdu, IEEE80211_CCMP_MIC_LEN);
        }
@@ -590,7 +591,7 @@ int ath10k_htt_tx(struct ath10k_htt *htt, struct sk_buff 
*msdu)
                goto err_free_msdu_id;
        }
 
-       switch (skb_cb->txmode) {
+       switch (txmode) {
        case ATH10K_HW_TXRX_RAW:
        case ATH10K_HW_TXRX_NATIVE_WIFI:
                flags0 |= HTT_DATA_TX_DESC_FLAGS0_MAC_HDR_PRESENT;
@@ -619,7 +620,7 @@ int ath10k_htt_tx(struct ath10k_htt *htt, struct sk_buff 
*msdu)
 
                        frags_paddr = skb_cb->htt.txbuf_paddr;
                }
-               flags0 |= SM(skb_cb->txmode, HTT_DATA_TX_DESC_FLAGS0_PKT_TYPE);
+               flags0 |= SM(txmode, HTT_DATA_TX_DESC_FLAGS0_PKT_TYPE);
                break;
        case ATH10K_HW_TXRX_MGMT:
                flags0 |= SM(ATH10K_HW_TXRX_MGMT,
diff --git a/drivers/net/wireless/ath/ath10k/mac.c 
b/drivers/net/wireless/ath/ath10k/mac.c
index 14a705ca87b2..dd24bc970b00 100644
--- a/drivers/net/wireless/ath/ath10k/mac.c
+++ b/drivers/net/wireless/ath/ath10k/mac.c
@@ -3324,24 +3324,24 @@ unlock:
        return ret;
 }
 
-static void ath10k_mac_tx(struct ath10k *ar, struct sk_buff *skb)
+static void ath10k_mac_tx(struct ath10k *ar, enum ath10k_hw_txrx_mode txmode,
+                         struct sk_buff *skb)
 {
-       struct ath10k_skb_cb *cb = ATH10K_SKB_CB(skb);
        struct ath10k_htt *htt = &ar->htt;
        int ret = 0;
 
-       switch (cb->txmode) {
+       switch (txmode) {
        case ATH10K_HW_TXRX_RAW:
        case ATH10K_HW_TXRX_NATIVE_WIFI:
        case ATH10K_HW_TXRX_ETHERNET:
-               ret = ath10k_htt_tx(htt, skb);
+               ret = ath10k_htt_tx(htt, txmode, skb);
                break;
        case ATH10K_HW_TXRX_MGMT:
                if (test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
                             ar->fw_features))
                        ret = ath10k_mac_tx_wmi_mgmt(ar, skb);
                else if (ar->htt.target_version_major >= 3)
-                       ret = ath10k_htt_tx(htt, skb);
+                       ret = ath10k_htt_tx(htt, txmode, skb);
                else
                        ret = ath10k_htt_mgmt_tx(htt, skb);
                break;
@@ -3371,9 +3371,13 @@ void ath10k_offchan_tx_work(struct work_struct *work)
 {
        struct ath10k *ar = container_of(work, struct ath10k, offchan_tx_work);
        struct ath10k_peer *peer;
+       struct ath10k_vif *arvif;
        struct ieee80211_hdr *hdr;
+       struct ieee80211_vif *vif;
+       struct ieee80211_sta *sta;
        struct sk_buff *skb;
        const u8 *peer_addr;
+       enum ath10k_hw_txrx_mode txmode;
        int vdev_id;
        int ret;
        unsigned long time_left;
@@ -3423,7 +3427,22 @@ void ath10k_offchan_tx_work(struct work_struct *work)
                ar->offchan_tx_skb = skb;
                spin_unlock_bh(&ar->data_lock);
 
-               ath10k_mac_tx(ar, skb);
+               /* It's safe to access vif and sta - conf_mutex guarantees that
+                * sta_state() and remove_interface() are locked exclusively
+                * out wrt to this offchannel worker.
+                */
+               arvif = ath10k_get_arvif(ar, vdev_id);
+               if (arvif) {
+                       vif = arvif->vif;
+                       sta = ieee80211_find_sta(vif, peer_addr);
+               } else {
+                       vif = NULL;
+                       sta = NULL;
+               }
+
+               txmode = ath10k_mac_tx_h_get_txmode(ar, vif, sta, skb);
+
+               ath10k_mac_tx(ar, txmode, skb);
 
                time_left =
                wait_for_completion_timeout(&ar->offchan_tx_completed, 3 * HZ);
@@ -3645,20 +3664,21 @@ static void ath10k_tx(struct ieee80211_hw *hw,
        struct ieee80211_vif *vif = info->control.vif;
        struct ieee80211_sta *sta = control->sta;
        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
+       enum ath10k_hw_txrx_mode txmode;
 
        /* We should disable CCK RATE due to P2P */
        if (info->flags & IEEE80211_TX_CTL_NO_CCK_RATE)
                ath10k_dbg(ar, ATH10K_DBG_MAC, 
"IEEE80211_TX_CTL_NO_CCK_RATE\n");
 
+       txmode = ath10k_mac_tx_h_get_txmode(ar, vif, sta, skb);
+
        ATH10K_SKB_CB(skb)->htt.is_offchan = false;
        ATH10K_SKB_CB(skb)->htt.freq = 0;
        ATH10K_SKB_CB(skb)->htt.tid = ath10k_tx_h_get_tid(hdr);
        ATH10K_SKB_CB(skb)->htt.nohwcrypt = !ath10k_tx_h_use_hwcrypto(vif, skb);
        ATH10K_SKB_CB(skb)->vdev_id = ath10k_tx_h_get_vdev_id(ar, vif);
-       ATH10K_SKB_CB(skb)->txmode = ath10k_mac_tx_h_get_txmode(ar, vif, sta,
-                                                               skb);
 
-       switch (ATH10K_SKB_CB(skb)->txmode) {
+       switch (txmode) {
        case ATH10K_HW_TXRX_MGMT:
        case ATH10K_HW_TXRX_NATIVE_WIFI:
                ath10k_tx_h_nwifi(hw, skb);
@@ -3695,7 +3715,7 @@ static void ath10k_tx(struct ieee80211_hw *hw,
                }
        }
 
-       ath10k_mac_tx(ar, skb);
+       ath10k_mac_tx(ar, txmode, skb);
 }
 
 /* Must not be called with conf_mutex held as workers can use that also. */
-- 
2.1.4


_______________________________________________
ath10k mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/ath10k

Reply via email to