mac80211: update encap offload patches to the latest version
[openwrt/openwrt.git] / package / kernel / mac80211 / patches / subsys / 322-mac80211-swap-NEED_TXPROCESSING-and-HW_80211_ENCAP-t.patch
diff --git a/package/kernel/mac80211/patches/subsys/322-mac80211-swap-NEED_TXPROCESSING-and-HW_80211_ENCAP-t.patch b/package/kernel/mac80211/patches/subsys/322-mac80211-swap-NEED_TXPROCESSING-and-HW_80211_ENCAP-t.patch
new file mode 100644 (file)
index 0000000..b9069ef
--- /dev/null
@@ -0,0 +1,227 @@
+From: Felix Fietkau <nbd@nbd.name>
+Date: Mon, 17 Aug 2020 13:35:32 +0200
+Subject: [PATCH] mac80211: swap NEED_TXPROCESSING and HW_80211_ENCAP tx
+ flags
+
+In order to unify the tx status path, the hw 802.11 encapsulation flag
+needs to survive the trip to the tx status call.
+Since we don't have any free bits in info->flags, we need to move one.
+IEEE80211_TX_INTFL_NEED_TXPROCESSING is only used internally in mac80211,
+and only before the call into the driver.
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+
+--- a/drivers/net/wireless/ath/ath11k/dp_tx.c
++++ b/drivers/net/wireless/ath/ath11k/dp_tx.c
+@@ -14,7 +14,7 @@ ath11k_dp_tx_get_encap_type(struct ath11
+ {
+       struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
+-      if (tx_info->control.flags & IEEE80211_TX_CTRL_HW_80211_ENCAP)
++      if (tx_info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)
+               return HAL_TCL_ENCAP_TYPE_ETHERNET;
+       return HAL_TCL_ENCAP_TYPE_NATIVE_WIFI;
+@@ -93,7 +93,7 @@ int ath11k_dp_tx(struct ath11k *ar, stru
+       if (test_bit(ATH11K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags))
+               return -ESHUTDOWN;
+-      if (!(info->control.flags & IEEE80211_TX_CTRL_HW_80211_ENCAP) &&
++      if (!(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP) &&
+           !ieee80211_is_data(hdr->frame_control))
+               return -ENOTSUPP;
+--- a/drivers/net/wireless/ath/ath11k/mac.c
++++ b/drivers/net/wireless/ath/ath11k/mac.c
+@@ -3749,7 +3749,7 @@ static int ath11k_mac_mgmt_tx_wmi(struct
+               return -ENOSPC;
+       info = IEEE80211_SKB_CB(skb);
+-      if (!(info->control.flags & IEEE80211_TX_CTRL_HW_80211_ENCAP)) {
++      if (!(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)) {
+               if ((ieee80211_is_action(hdr->frame_control) ||
+                    ieee80211_is_deauth(hdr->frame_control) ||
+                    ieee80211_is_disassoc(hdr->frame_control)) &&
+@@ -3876,7 +3876,7 @@ static void ath11k_mac_op_tx(struct ieee
+       bool is_prb_rsp;
+       int ret;
+-      if (info->control.flags & IEEE80211_TX_CTRL_HW_80211_ENCAP) {
++      if (info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP) {
+               skb_cb->flags |= ATH11K_SKB_HW_80211_ENCAP;
+       } else if (ieee80211_is_mgmt(hdr->frame_control)) {
+               is_prb_rsp = ieee80211_is_probe_resp(hdr->frame_control);
+--- a/include/net/mac80211.h
++++ b/include/net/mac80211.h
+@@ -720,9 +720,8 @@ struct ieee80211_bss_conf {
+  * @IEEE80211_TX_INTFL_OFFCHAN_TX_OK: Internal to mac80211. Used to indicate
+  *    that a frame can be transmitted while the queues are stopped for
+  *    off-channel operation.
+- * @IEEE80211_TX_INTFL_NEED_TXPROCESSING: completely internal to mac80211,
+- *    used to indicate that a pending frame requires TX processing before
+- *    it can be sent out.
++ * @IEEE80211_TX_CTL_HW_80211_ENCAP: This frame uses hardware encapsulation
++ *    (header conversion)
+  * @IEEE80211_TX_INTFL_RETRIED: completely internal to mac80211,
+  *    used to indicate that a frame was already retried due to PS
+  * @IEEE80211_TX_INTFL_DONT_ENCRYPT: completely internal to mac80211,
+@@ -791,7 +790,7 @@ enum mac80211_tx_info_flags {
+       IEEE80211_TX_STAT_AMPDU_NO_BACK         = BIT(11),
+       IEEE80211_TX_CTL_RATE_CTRL_PROBE        = BIT(12),
+       IEEE80211_TX_INTFL_OFFCHAN_TX_OK        = BIT(13),
+-      IEEE80211_TX_INTFL_NEED_TXPROCESSING    = BIT(14),
++      IEEE80211_TX_CTL_HW_80211_ENCAP         = BIT(14),
+       IEEE80211_TX_INTFL_RETRIED              = BIT(15),
+       IEEE80211_TX_INTFL_DONT_ENCRYPT         = BIT(16),
+       IEEE80211_TX_CTL_NO_PS_BUFFER           = BIT(17),
+@@ -823,8 +822,9 @@ enum mac80211_tx_info_flags {
+  * @IEEE80211_TX_CTRL_AMSDU: This frame is an A-MSDU frame
+  * @IEEE80211_TX_CTRL_FAST_XMIT: This frame is going through the fast_xmit path
+  * @IEEE80211_TX_CTRL_SKIP_MPATH_LOOKUP: This frame skips mesh path lookup
+- * @IEEE80211_TX_CTRL_HW_80211_ENCAP: This frame uses hardware encapsulation
+- *    (header conversion)
++ * @IEEE80211_TX_INTCFL_NEED_TXPROCESSING: completely internal to mac80211,
++ *    used to indicate that a pending frame requires TX processing before
++ *    it can be sent out.
+  *
+  * These flags are used in tx_info->control.flags.
+  */
+@@ -835,7 +835,7 @@ enum mac80211_tx_control_flags {
+       IEEE80211_TX_CTRL_AMSDU                 = BIT(3),
+       IEEE80211_TX_CTRL_FAST_XMIT             = BIT(4),
+       IEEE80211_TX_CTRL_SKIP_MPATH_LOOKUP     = BIT(5),
+-      IEEE80211_TX_CTRL_HW_80211_ENCAP        = BIT(6),
++      IEEE80211_TX_INTCFL_NEED_TXPROCESSING   = BIT(6),
+ };
+ /*
+--- a/net/mac80211/mesh_hwmp.c
++++ b/net/mac80211/mesh_hwmp.c
+@@ -212,7 +212,7 @@ static void prepare_frame_for_deferred_t
+       skb->priority = 7;
+       info->control.vif = &sdata->vif;
+-      info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING;
++      info->control.flags |= IEEE80211_TX_INTCFL_NEED_TXPROCESSING;
+       ieee80211_set_qos_hdr(sdata, skb);
+       ieee80211_mps_set_frame_flags(sdata, NULL, hdr);
+ }
+@@ -1163,7 +1163,7 @@ int mesh_nexthop_resolve(struct ieee8021
+       if (skb_queue_len(&mpath->frame_queue) >= MESH_FRAME_QUEUE_LEN)
+               skb_to_free = skb_dequeue(&mpath->frame_queue);
+-      info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING;
++      info->control.flags |= IEEE80211_TX_INTCFL_NEED_TXPROCESSING;
+       ieee80211_set_qos_hdr(sdata, skb);
+       skb_queue_tail(&mpath->frame_queue, skb);
+       if (skb_to_free)
+--- a/net/mac80211/mesh_ps.c
++++ b/net/mac80211/mesh_ps.c
+@@ -432,7 +432,7 @@ static void mpsp_qos_null_append(struct
+       info = IEEE80211_SKB_CB(new_skb);
+       info->control.vif = &sdata->vif;
+-      info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING;
++      info->control.flags |= IEEE80211_TX_INTCFL_NEED_TXPROCESSING;
+       __skb_queue_tail(frames, new_skb);
+ }
+--- a/net/mac80211/rx.c
++++ b/net/mac80211/rx.c
+@@ -2896,7 +2896,7 @@ ieee80211_rx_h_mesh_fwding(struct ieee80
+       fwd_hdr->frame_control &= ~cpu_to_le16(IEEE80211_FCTL_RETRY);
+       info = IEEE80211_SKB_CB(fwd_skb);
+       memset(info, 0, sizeof(*info));
+-      info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING;
++      info->control.flags |= IEEE80211_TX_INTCFL_NEED_TXPROCESSING;
+       info->control.vif = &rx->sdata->vif;
+       info->control.jiffies = jiffies;
+       if (is_multicast_ether_addr(fwd_hdr->addr1)) {
+--- a/net/mac80211/status.c
++++ b/net/mac80211/status.c
+@@ -66,8 +66,8 @@ static void ieee80211_handle_filtered_fr
+       info->control.jiffies = jiffies;
+       info->control.vif = &sta->sdata->vif;
+-      info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING |
+-                     IEEE80211_TX_INTFL_RETRANSMISSION;
++      info->control.flags |= IEEE80211_TX_INTCFL_NEED_TXPROCESSING;
++      info->flags |= IEEE80211_TX_INTFL_RETRANSMISSION;
+       info->flags &= ~IEEE80211_TX_TEMPORARY_FLAGS;
+       sta->status_stats.filtered++;
+--- a/net/mac80211/tx.c
++++ b/net/mac80211/tx.c
+@@ -530,7 +530,7 @@ ieee80211_tx_h_unicast_ps_buf(struct iee
+               info->control.jiffies = jiffies;
+               info->control.vif = &tx->sdata->vif;
+-              info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING;
++              info->control.flags |= IEEE80211_TX_INTCFL_NEED_TXPROCESSING;
+               info->flags &= ~IEEE80211_TX_TEMPORARY_FLAGS;
+               skb_queue_tail(&sta->ps_tx_buf[ac], tx->skb);
+               spin_unlock(&sta->ps_lock);
+@@ -1132,7 +1132,7 @@ static bool ieee80211_tx_prep_agg(struct
+                                      tx->sta->sta.addr, tx->sta->sta.aid);
+                       }
+                       info->control.vif = &tx->sdata->vif;
+-                      info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING;
++                      info->control.flags |= IEEE80211_TX_INTCFL_NEED_TXPROCESSING;
+                       info->flags &= ~IEEE80211_TX_TEMPORARY_FLAGS;
+                       __skb_queue_tail(&tid_tx->pending, skb);
+                       if (skb_queue_len(&tid_tx->pending) > STA_MAX_TX_BUFFER)
+@@ -1177,7 +1177,7 @@ ieee80211_tx_prepare(struct ieee80211_su
+        * we are doing the needed processing, so remove the flag
+        * now.
+        */
+-      info->flags &= ~IEEE80211_TX_INTFL_NEED_TXPROCESSING;
++      info->control.flags &= ~IEEE80211_TX_INTCFL_NEED_TXPROCESSING;
+       hdr = (struct ieee80211_hdr *) skb->data;
+@@ -1256,7 +1256,7 @@ static struct txq_info *ieee80211_get_tx
+           (info->control.flags & IEEE80211_TX_CTRL_PS_RESPONSE))
+               return NULL;
+-      if (!(info->control.flags & IEEE80211_TX_CTRL_HW_80211_ENCAP) &&
++      if (!(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP) &&
+           unlikely(!ieee80211_is_data_present(hdr->frame_control))) {
+               if ((!ieee80211_is_mgmt(hdr->frame_control) ||
+                    ieee80211_is_bufferable_mmpdu(hdr->frame_control) ||
+@@ -3640,7 +3640,7 @@ begin:
+       else
+               info->flags &= ~IEEE80211_TX_CTL_AMPDU;
+-      if (info->control.flags & IEEE80211_TX_CTRL_HW_80211_ENCAP)
++      if (info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)
+               goto encap_out;
+       if (info->control.flags & IEEE80211_TX_CTRL_FAST_XMIT) {
+@@ -4230,7 +4230,7 @@ static void ieee80211_8023_xmit(struct i
+               sdata = container_of(sdata->bss,
+                                    struct ieee80211_sub_if_data, u.ap);
+-      info->control.flags |= IEEE80211_TX_CTRL_HW_80211_ENCAP;
++      info->flags |= IEEE80211_TX_CTL_HW_80211_ENCAP;
+       info->control.vif = &sdata->vif;
+       if (key)
+@@ -4355,7 +4355,7 @@ static bool ieee80211_tx_pending_skb(str
+       sdata = vif_to_sdata(info->control.vif);
+-      if (info->flags & IEEE80211_TX_INTFL_NEED_TXPROCESSING) {
++      if (info->control.flags & IEEE80211_TX_INTCFL_NEED_TXPROCESSING) {
+               chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
+               if (unlikely(!chanctx_conf)) {
+                       dev_kfree_skb(skb);
+@@ -4363,7 +4363,7 @@ static bool ieee80211_tx_pending_skb(str
+               }
+               info->band = chanctx_conf->def.chan->band;
+               result = ieee80211_tx(sdata, NULL, skb, true, 0);
+-      } else if (info->control.flags & IEEE80211_TX_CTRL_HW_80211_ENCAP) {
++      } else if (info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP) {
+               if (ieee80211_lookup_ra_sta(sdata, skb, &sta)) {
+                       dev_kfree_skb(skb);
+                       return true;