]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: ath12k: Set WDS vdev parameter for 4-address station interface
authorTamizh Chelvam Raja <tamizh.raja@oss.qualcomm.com>
Mon, 25 May 2026 11:09:37 +0000 (16:39 +0530)
committerJeff Johnson <jeff.johnson@oss.qualcomm.com>
Mon, 1 Jun 2026 16:58:05 +0000 (09:58 -0700)
Set WDS vdev parameter during station interface creation to enable
4-address mode. Unlike AP interfaces that set peer-specific 4-address
mode parameters after receiving 4-address frames from stations, station
interfaces must send all data frames in 4-address mode immediately after
association, including 4-address NULL frames.

Firmware requires 4-address notification for station interfaces during
vdev creation. Configure the WDS vdev parameter for station interfaces.

Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.6-01243-QCAHKSWPL_SILICONZ-1

Co-developed-by: Ramya Gnanasekar <ramya.gnanasekar@oss.qualcomm.com>
Signed-off-by: Ramya Gnanasekar <ramya.gnanasekar@oss.qualcomm.com>
Signed-off-by: Tamizh Chelvam Raja <tamizh.raja@oss.qualcomm.com>
Reviewed-by: Rameshkumar Sundaram <rameshkumar.sundaram@oss.qualcomm.com>
Reviewed-by: Baochen Qiang <baochen.qiang@oss.qualcomm.com>
Link: https://patch.msgid.link/20260525110942.2890212-2-tamizh.raja@oss.qualcomm.com
Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
drivers/net/wireless/ath/ath12k/mac.c

index d13936be857d5994aeabc53d6c85fad7840489f1..0f68b4beeb6b3195869c4fde5f15f256f2263aa0 100644 (file)
@@ -10235,6 +10235,7 @@ int ath12k_mac_vdev_create(struct ath12k *ar, struct ath12k_link_vif *arvif)
        struct ieee80211_hw *hw = ah->hw;
        struct ath12k_vif *ahvif = arvif->ahvif;
        struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
+       struct wireless_dev *wdev = ieee80211_vif_to_wdev(vif);
        struct ath12k_wmi_vdev_create_arg vdev_arg = {};
        struct ath12k_wmi_peer_create_arg peer_param = {};
        struct ieee80211_bss_conf *link_conf = NULL;
@@ -10403,6 +10404,25 @@ int ath12k_mac_vdev_create(struct ath12k *ar, struct ath12k_link_vif *arvif)
                        goto err_peer_del;
                }
 
+               /*
+                * There could be race condition in firmware for the station
+                * interface between enabling 4-address peer WMI param and
+                * sending 4-address frame (NULL or EAPOL via TCL).
+                * Make the station as WDS while bringup itself
+                * to avoid the race condition
+                */
+               if (vif->type == NL80211_IFTYPE_STATION &&
+                   (wdev && wdev->use_4addr)) {
+                       ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
+                                                           WMI_VDEV_PARAM_WDS,
+                                                           1);
+                       if (ret) {
+                               ath12k_warn(ar->ab, "failed to set WDS vdev param: %d\n",
+                                           ret);
+                               goto err_peer_del;
+                       }
+               }
+
                if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ab->wmi_ab.svc_map) &&
                    ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
                    ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) {