From 8b0a21b1cadfafc0ffac105c1a4034f5ef45f07b Mon Sep 17 00:00:00 2001 From: Sean Khan Date: Sun, 29 Sep 2024 18:01:47 -0400 Subject: [PATCH] ath11k_nss: fix WDS instability by disabling NAWDS mode This patch replaces the problematic NAWDS stateless mode with standard WDS in the ath11k driver. NAWDS has shown incompatibility with WDS AP and STA modes in ath11k, leading to issues like MAC address duplication and unstable connections. By switching to standard WDS, this patch aims to resolve these issues. It also enables WDS backhaul in NSS for better handling of backhaul links. Testing is still ongoing, but early results indicate improved stability and fewer connection problems in affected environments Authored-by: Sebastian Gottschall Signed-off-by: Sean Khan --- ...902-ath11k-fix-WDS-by-disabling-nwds.patch | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 package/kernel/mac80211/patches/nss/ath11k/999-902-ath11k-fix-WDS-by-disabling-nwds.patch diff --git a/package/kernel/mac80211/patches/nss/ath11k/999-902-ath11k-fix-WDS-by-disabling-nwds.patch b/package/kernel/mac80211/patches/nss/ath11k/999-902-ath11k-fix-WDS-by-disabling-nwds.patch new file mode 100644 index 0000000000..73a471aaa4 --- /dev/null +++ b/package/kernel/mac80211/patches/nss/ath11k/999-902-ath11k-fix-WDS-by-disabling-nwds.patch @@ -0,0 +1,76 @@ +--- a/drivers/net/wireless/ath/ath11k/mac.c ++++ b/drivers/net/wireless/ath/ath11k/mac.c +@@ -5274,14 +5274,19 @@ skip_nss_ext: + * AP vif of the AP_VLAN vif + */ + ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, +- WMI_VDEV_PARAM_AP_ENABLE_NAWDS, +- MIN_IDLE_INACTIVE_TIME_SECS); ++ WMI_VDEV_PARAM_WDS, ++ 1); + if (ret) { +- ath11k_warn(ab, "failed to set vdev %i nawds parameters: %d\n", ++ ath11k_warn(ab, "failed to set vdev %i wds parameters: %d\n", + arvif->vdev_id, ret); + goto ext_vdev_down; + } + ++ ret = ath11k_nss_vdev_set_cmd(arvif, ATH11K_NSS_WIFI_VDEV_CFG_WDS_BACKHAUL_CMD, true); ++ if (ret) { ++ ath11k_warn(ab, "failed to cfg wds backhaul in nss %d\n", ret); ++ } ++ + return; + + ext_vdev_down: +@@ -7207,6 +7212,23 @@ static int ath11k_mac_op_add_interface(s + goto err_vdev_del; + } + ++ ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, ++ WMI_VDEV_PARAM_WDS, 1); ++ if (ret) { ++ ath11k_warn(ab, "failed to enable wds%d\n", ret); ++ } ++ ++ ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, ++ WMI_VDEV_PARAM_CAPABILITIES, ++ WMI_VDEV_WDS_LRN_ENABLED); ++ if (ret) { ++ ath11k_warn( ++ ab, ++ "failed to set vdev %d capability 0x%x, nss %d :%d\n", ++ arvif->vdev_id, WMI_VDEV_WDS_LRN_ENABLED, nss, ret); ++ goto err_vdev_del; ++ } ++ + nss = get_num_chains(ar->cfg_tx_chainmask) ? : 1; + ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, + WMI_VDEV_PARAM_NSS, nss); +--- a/drivers/net/wireless/ath/ath11k/nss.c ++++ b/drivers/net/wireless/ath/ath11k/nss.c +@@ -3255,6 +3255,11 @@ int ath11k_nss_ext_vdev_create(struct at + "nss ext vdev interface created ctx %pK, ifnum %d\n", + arvif->nss.ctx, arvif->nss.if_num); + ++ ret = ath11k_nss_vdev_set_cmd(arvif, ATH11K_NSS_WIFI_VDEV_CFG_WDS_BACKHAUL_CMD, true); ++ if (ret) { ++ ath11k_warn(ab, "failed to enable wds backhaul %d\n", ret); ++ } ++ + return ret; + + free_ext_vdev: +--- a/drivers/net/wireless/ath/ath11k/wmi.h ++++ b/drivers/net/wireless/ath/ath11k/wmi.h +@@ -1112,6 +1112,10 @@ enum wmi_tlv_vdev_param { + WMI_VDEV_PARAM_HEOPS_0_31 = 0x8003, + }; + ++#define WMI_VDEV_BEACON_SUPPORT 0x1 ++#define WMI_VDEV_WDS_LRN_ENABLED 0x2 ++#define WMI_VDEV_VOW_ENABLED 0x4 ++ + enum wmi_tlv_peer_flags { + WMI_PEER_AUTH = 0x00000001, + WMI_PEER_QOS = 0x00000002,