]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: ath12k: Fix the handling of TX packets in Ethernet mode
authorNithyanantham Paramasivam <nithyanantham.paramasivam@oss.qualcomm.com>
Fri, 18 Jul 2025 02:55:11 +0000 (08:25 +0530)
committerJeff Johnson <jeff.johnson@oss.qualcomm.com>
Sat, 19 Jul 2025 16:14:44 +0000 (09:14 -0700)
Currently, in the transmit (TX) direction, EAPOL, QoS NULL,
and multicast frames are sent in native Wi-Fi (802.11) format.
However, when the virtual interface is configured in Ethernet
mode, transmission fails for packets enqueued in native Wi-fi format.

To address this issue, the firmware should be instructed to
treat these packets as RAW type packets, ensuring proper
handling even when the interface operates in Ethernet mode.

Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.4.1-00217-QCAHKSWPL_SILICONZ-1
Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3

Signed-off-by: Nithyanantham Paramasivam <nithyanantham.paramasivam@oss.qualcomm.com>
Reviewed-by: Vasanthakumar Thiagarajan <vasanthakumar.thiagarajan@oss.qualcomm.com>
Link: https://patch.msgid.link/20250718025513.32982-2-nithyanantham.paramasivam@oss.qualcomm.com
[fix indentation]
Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
drivers/net/wireless/ath/ath12k/dp_tx.c
drivers/net/wireless/ath/ath12k/mac.c

index 7005f05d3aaaec35eadc36ddb24b108a31dafdac..899d1dc51eae03288e47c12b14d2ae2612eb3150 100644 (file)
@@ -244,6 +244,8 @@ int ath12k_dp_tx(struct ath12k *ar, struct ath12k_link_vif *arvif,
        bool msdu_ext_desc = false;
        bool add_htt_metadata = false;
        u32 iova_mask = ab->hw_params->iova_mask;
+       bool is_diff_encap = false;
+       bool is_null_frame = false;
 
        if (test_bit(ATH12K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags))
                return -ESHUTDOWN;
@@ -334,7 +336,19 @@ tcl_ring_sel:
 
        switch (ti.encap_type) {
        case HAL_TCL_ENCAP_TYPE_NATIVE_WIFI:
-               ath12k_dp_tx_encap_nwifi(skb);
+               is_null_frame = ieee80211_is_nullfunc(hdr->frame_control);
+               if (ahvif->vif->offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED) {
+                       if (skb->protocol == cpu_to_be16(ETH_P_PAE) || is_null_frame)
+                               is_diff_encap = true;
+
+                       /* Firmware expects msdu ext descriptor for nwifi/raw packets
+                        * received in ETH mode. Without this, observed tx fail for
+                        * Multicast packets in ETH mode.
+                        */
+                       msdu_ext_desc = true;
+               } else {
+                       ath12k_dp_tx_encap_nwifi(skb);
+               }
                break;
        case HAL_TCL_ENCAP_TYPE_RAW:
                if (!test_bit(ATH12K_FLAG_RAW_MODE, &ab->dev_flags)) {
@@ -378,15 +392,25 @@ map:
                goto fail_remove_tx_buf;
        }
 
-       if (!test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags) &&
-           !(skb_cb->flags & ATH12K_SKB_HW_80211_ENCAP) &&
-           !(skb_cb->flags & ATH12K_SKB_CIPHER_SET) &&
-           ieee80211_has_protected(hdr->frame_control)) {
-               /* Add metadata for sw encrypted vlan group traffic */
+       if ((!test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags) &&
+            !(skb_cb->flags & ATH12K_SKB_HW_80211_ENCAP) &&
+            !(skb_cb->flags & ATH12K_SKB_CIPHER_SET) &&
+            ieee80211_has_protected(hdr->frame_control)) ||
+           is_diff_encap) {
+               /* Firmware is not expecting meta data for qos null
+                * nwifi packet received in ETH encap mode.
+                */
+               if (is_null_frame && msdu_ext_desc)
+                       goto skip_htt_meta;
+
+               /* Add metadata for sw encrypted vlan group traffic
+                * and EAPOL nwifi packet received in ETH encap mode.
+                */
                add_htt_metadata = true;
                msdu_ext_desc = true;
-               ti.flags0 |= u32_encode_bits(1, HAL_TCL_DATA_CMD_INFO2_TO_FW);
                ti.meta_data_flags |= HTT_TCL_META_DATA_VALID_HTT;
+skip_htt_meta:
+               ti.flags0 |= u32_encode_bits(1, HAL_TCL_DATA_CMD_INFO2_TO_FW);
                ti.encap_type = HAL_TCL_ENCAP_TYPE_RAW;
                ti.encrypt_type = HAL_ENCRYPT_TYPE_OPEN;
        }
index bf612079b8bdae18a043913dbfe1ff7cbd9eaa34..c56201fbee7ad523cbcf6b36313d8edb17338c08 100644 (file)
@@ -8898,6 +8898,7 @@ static void ath12k_mac_op_tx(struct ieee80211_hw *hw,
                is_dvlan = true;
 
        if (!vif->valid_links || !is_mcast || is_dvlan ||
+           (skb_cb->flags & ATH12K_SKB_HW_80211_ENCAP) ||
            test_bit(ATH12K_FLAG_RAW_MODE, &ar->ab->dev_flags)) {
                ret = ath12k_dp_tx(ar, arvif, skb, false, 0, is_mcast);
                if (unlikely(ret)) {