mac80211: ath11k: sync with ath-next
[openwrt/openwrt.git] / package / kernel / mac80211 / patches / ath11k / 0074-wifi-ath11k-MBSSID-parameter-configuration-in-AP-mod.patch
diff --git a/package/kernel/mac80211/patches/ath11k/0074-wifi-ath11k-MBSSID-parameter-configuration-in-AP-mod.patch b/package/kernel/mac80211/patches/ath11k/0074-wifi-ath11k-MBSSID-parameter-configuration-in-AP-mod.patch
new file mode 100644 (file)
index 0000000..d93e27d
--- /dev/null
@@ -0,0 +1,138 @@
+From c82dc33f252fd8883be66f2d0230af0fd734c683 Mon Sep 17 00:00:00 2001
+From: Aloka Dixit <quic_alokad@quicinc.com>
+Date: Fri, 5 May 2023 16:11:27 +0300
+Subject: [PATCH 74/77] wifi: ath11k: MBSSID parameter configuration in AP mode
+
+Include MBSSID parameters in WMI vdev up operation.
+
+Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1
+
+Signed-off-by: Aloka Dixit <quic_alokad@quicinc.com>
+Co-developed-by: John Crispin <john@phrozen.org>
+Signed-off-by: John Crispin <john@phrozen.org>
+Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
+Link: https://lore.kernel.org/r/20230405221648.17950-5-quic_alokad@quicinc.com
+---
+ drivers/net/wireless/ath/ath11k/mac.c | 29 +++++++++++++++++++++------
+ drivers/net/wireless/ath/ath11k/wmi.c |  8 +++++++-
+ drivers/net/wireless/ath/ath11k/wmi.h |  3 ++-
+ 3 files changed, 32 insertions(+), 8 deletions(-)
+
+--- a/drivers/net/wireless/ath/ath11k/mac.c
++++ b/drivers/net/wireless/ath/ath11k/mac.c
+@@ -964,7 +964,7 @@ static int ath11k_mac_monitor_vdev_start
+               return ret;
+       }
+-      ret = ath11k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr);
++      ret = ath11k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr, NULL, 0, 0);
+       if (ret) {
+               ath11k_warn(ar->ab, "failed to put up monitor vdev %i: %d\n",
+                           vdev_id, ret);
+@@ -1423,6 +1423,7 @@ static void ath11k_control_beaconing(str
+                                    struct ieee80211_bss_conf *info)
+ {
+       struct ath11k *ar = arvif->ar;
++      struct ath11k_vif *tx_arvif = NULL;
+       int ret = 0;
+       lockdep_assert_held(&arvif->ar->conf_mutex);
+@@ -1451,8 +1452,14 @@ static void ath11k_control_beaconing(str
+       ether_addr_copy(arvif->bssid, info->bssid);
++      if (arvif->vif->mbssid_tx_vif)
++              tx_arvif = (struct ath11k_vif *)arvif->vif->mbssid_tx_vif->drv_priv;
++
+       ret = ath11k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
+-                               arvif->bssid);
++                               arvif->bssid,
++                               tx_arvif ? tx_arvif->bssid : NULL,
++                               info->bssid_index,
++                               1 << info->bssid_indicator);
+       if (ret) {
+               ath11k_warn(ar->ab, "failed to bring up vdev %d: %i\n",
+                           arvif->vdev_id, ret);
+@@ -2879,7 +2886,8 @@ static void ath11k_bss_assoc(struct ieee
+       arvif->aid = vif->cfg.aid;
+       ether_addr_copy(arvif->bssid, bss_conf->bssid);
+-      ret = ath11k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid);
++      ret = ath11k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid,
++                               NULL, 0, 0);
+       if (ret) {
+               ath11k_warn(ar->ab, "failed to set vdev %d up: %d\n",
+                           arvif->vdev_id, ret);
+@@ -7133,7 +7141,8 @@ ath11k_mac_update_vif_chan(struct ath11k
+                          int n_vifs)
+ {
+       struct ath11k_base *ab = ar->ab;
+-      struct ath11k_vif *arvif;
++      struct ath11k_vif *arvif, *tx_arvif = NULL;
++      struct ieee80211_vif *mbssid_tx_vif;
+       int ret;
+       int i;
+       bool monitor_vif = false;
+@@ -7187,8 +7196,15 @@ ath11k_mac_update_vif_chan(struct ath11k
+                       ath11k_warn(ab, "failed to update bcn tmpl during csa: %d\n",
+                                   ret);
++              mbssid_tx_vif = arvif->vif->mbssid_tx_vif;
++              if (mbssid_tx_vif)
++                      tx_arvif = (struct ath11k_vif *)mbssid_tx_vif->drv_priv;
++
+               ret = ath11k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
+-                                       arvif->bssid);
++                                       arvif->bssid,
++                                       tx_arvif ? tx_arvif->bssid : NULL,
++                                       arvif->vif->bss_conf.bssid_index,
++                                       1 << arvif->vif->bss_conf.bssid_indicator);
+               if (ret) {
+                       ath11k_warn(ab, "failed to bring vdev up %d: %d\n",
+                                   arvif->vdev_id, ret);
+@@ -7306,7 +7322,8 @@ static int ath11k_start_vdev_delay(struc
+       }
+       if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
+-              ret = ath11k_wmi_vdev_up(ar, arvif->vdev_id, 0, ar->mac_addr);
++              ret = ath11k_wmi_vdev_up(ar, arvif->vdev_id, 0, ar->mac_addr,
++                                       NULL, 0, 0);
+               if (ret) {
+                       ath11k_warn(ab, "failed put monitor up: %d\n", ret);
+                       return ret;
+--- a/drivers/net/wireless/ath/ath11k/wmi.c
++++ b/drivers/net/wireless/ath/ath11k/wmi.c
+@@ -1001,7 +1001,8 @@ int ath11k_wmi_vdev_start(struct ath11k
+       return ret;
+ }
+-int ath11k_wmi_vdev_up(struct ath11k *ar, u32 vdev_id, u32 aid, const u8 *bssid)
++int ath11k_wmi_vdev_up(struct ath11k *ar, u32 vdev_id, u32 aid, const u8 *bssid,
++                     u8 *tx_bssid, u32 nontx_profile_idx, u32 nontx_profile_cnt)
+ {
+       struct ath11k_pdev_wmi *wmi = ar->wmi;
+       struct wmi_vdev_up_cmd *cmd;
+@@ -1025,6 +1026,11 @@ int ath11k_wmi_vdev_up(struct ath11k *ar
+       ether_addr_copy(cmd->vdev_bssid.addr, bssid);
++      cmd->nontx_profile_idx = nontx_profile_idx;
++      cmd->nontx_profile_cnt = nontx_profile_cnt;
++      if (tx_bssid)
++              ether_addr_copy(cmd->tx_vdev_bssid.addr, tx_bssid);
++
+       if (arvif && arvif->vif->type == NL80211_IFTYPE_STATION) {
+               bss_conf = &arvif->vif->bss_conf;
+--- a/drivers/net/wireless/ath/ath11k/wmi.h
++++ b/drivers/net/wireless/ath/ath11k/wmi.h
+@@ -6301,7 +6301,8 @@ int ath11k_wmi_bcn_tmpl(struct ath11k *a
+                       struct sk_buff *bcn);
+ int ath11k_wmi_vdev_down(struct ath11k *ar, u8 vdev_id);
+ int ath11k_wmi_vdev_up(struct ath11k *ar, u32 vdev_id, u32 aid,
+-                     const u8 *bssid);
++                     const u8 *bssid, u8 *tx_bssid, u32 nontx_profile_idx,
++                     u32 nontx_profile_cnt);
+ int ath11k_wmi_vdev_stop(struct ath11k *ar, u8 vdev_id);
+ int ath11k_wmi_vdev_start(struct ath11k *ar, struct wmi_vdev_start_req_arg *arg,
+                         bool restart);