]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: ath12k: add multi-link flag in peer create command
authorSriram R <quic_srirrama@quicinc.com>
Fri, 1 Nov 2024 15:17:03 +0000 (17:17 +0200)
committerJeff Johnson <quic_jjohnson@quicinc.com>
Wed, 6 Nov 2024 19:36:28 +0000 (11:36 -0800)
Driver should indicate to firmware whether a peer is multi-link or not in peer
create command using multi-link flag. Add changes to support
WMI_TAG_MLO_PEER_CREATE_PARAMS in WMI_PEER_CREATE_CMDID.

Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.0.1-00029-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: Sriram R <quic_srirrama@quicinc.com>
Signed-off-by: Harshitha Prem <quic_hprem@quicinc.com>
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
Link: https://patch.msgid.link/20241101151705.165987-7-kvalo@kernel.org
Signed-off-by: Jeff Johnson <quic_jjohnson@quicinc.com>
drivers/net/wireless/ath/ath12k/mac.c
drivers/net/wireless/ath/ath12k/wmi.c
drivers/net/wireless/ath/ath12k/wmi.h

index 61d05ffa364a5479d1a14d5fa68970001872a28d..076e4da4875f8904f53d221d7cb8899794b27bcc 100644 (file)
@@ -4969,8 +4969,9 @@ static int ath12k_mac_station_add(struct ath12k *ar,
        }
 
        peer_param.vdev_id = arvif->vdev_id;
-       peer_param.peer_addr = sta->addr;
+       peer_param.peer_addr = arsta->addr;
        peer_param.peer_type = WMI_PEER_TYPE_DEFAULT;
+       peer_param.ml_enabled = sta->mlo;
 
        ret = ath12k_peer_create(ar, arvif, sta, &peer_param);
        if (ret) {
@@ -7005,7 +7006,7 @@ int ath12k_mac_vdev_create(struct ath12k *ar, struct ath12k_link_vif *arvif)
        struct ath12k_vif *ahvif = arvif->ahvif;
        struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
        struct ath12k_wmi_vdev_create_arg vdev_arg = {0};
-       struct ath12k_wmi_peer_create_arg peer_param;
+       struct ath12k_wmi_peer_create_arg peer_param = {0};
        struct ieee80211_bss_conf *link_conf;
        u32 param_id, param_value;
        u16 nss;
index e089b58bbea1bf22a920ad62466fc609b1104a5e..0583d832fac7c2ce63eb7bd5a7d06fc45d88cb29 100644 (file)
@@ -1230,9 +1230,14 @@ int ath12k_wmi_send_peer_create_cmd(struct ath12k *ar,
        struct ath12k_wmi_pdev *wmi = ar->wmi;
        struct wmi_peer_create_cmd *cmd;
        struct sk_buff *skb;
-       int ret;
+       int ret, len;
+       struct wmi_peer_create_mlo_params *ml_param;
+       void *ptr;
+       struct wmi_tlv *tlv;
 
-       skb = ath12k_wmi_alloc_skb(wmi->wmi_ab, sizeof(*cmd));
+       len = sizeof(*cmd) + TLV_HDR_SIZE + sizeof(*ml_param);
+
+       skb = ath12k_wmi_alloc_skb(wmi->wmi_ab, len);
        if (!skb)
                return -ENOMEM;
 
@@ -1244,9 +1249,23 @@ int ath12k_wmi_send_peer_create_cmd(struct ath12k *ar,
        cmd->peer_type = cpu_to_le32(arg->peer_type);
        cmd->vdev_id = cpu_to_le32(arg->vdev_id);
 
+       ptr = skb->data + sizeof(*cmd);
+       tlv = ptr;
+       tlv->header = ath12k_wmi_tlv_hdr(WMI_TAG_ARRAY_STRUCT,
+                                        sizeof(*ml_param));
+       ptr += TLV_HDR_SIZE;
+       ml_param = ptr;
+       ml_param->tlv_header =
+                       ath12k_wmi_tlv_cmd_hdr(WMI_TAG_MLO_PEER_CREATE_PARAMS,
+                                              sizeof(*ml_param));
+       if (arg->ml_enabled)
+               ml_param->flags = cpu_to_le32(ATH12K_WMI_FLAG_MLO_ENABLED);
+
+       ptr += sizeof(*ml_param);
+
        ath12k_dbg(ar->ab, ATH12K_DBG_WMI,
-                  "WMI peer create vdev_id %d peer_addr %pM\n",
-                  arg->vdev_id, arg->peer_addr);
+                  "WMI peer create vdev_id %d peer_addr %pM ml_flags 0x%x\n",
+                  arg->vdev_id, arg->peer_addr, ml_param->flags);
 
        ret = ath12k_wmi_cmd_send(wmi, skb, WMI_PEER_CREATE_CMDID);
        if (ret) {
index 0ddd7ce9738512faab83f5e29a2091fb4fbb785e..2378d94b2409843721f107b84764207dedb8d2da 100644 (file)
@@ -3015,6 +3015,12 @@ struct ath12k_wmi_peer_create_arg {
        const u8 *peer_addr;
        u32 peer_type;
        u32 vdev_id;
+       bool ml_enabled;
+};
+
+struct wmi_peer_create_mlo_params {
+       __le32 tlv_header;
+       __le32 flags;
 };
 
 struct ath12k_wmi_pdev_set_regdomain_arg {