[PATCH 6/8] wifi: ath12k: add multi-link flag in peer create command
Jeff Johnson
quic_jjohnson at quicinc.com
Wed Oct 23 08:54:51 PDT 2024
On 10/23/2024 6:30 AM, Kalle Valo wrote:
> From: Sriram R <quic_srirrama at quicinc.com>
>
> 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 at quicinc.com>
> Signed-off-by: Harshitha Prem <quic_hprem at quicinc.com>
> Signed-off-by: Kalle Valo <quic_kvalo at quicinc.com>
> ---
> drivers/net/wireless/ath/ath12k/mac.c | 5 +++--
> drivers/net/wireless/ath/ath12k/wmi.c | 27 +++++++++++++++++++++++----
> drivers/net/wireless/ath/ath12k/wmi.h | 6 ++++++
> 3 files changed, 32 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/net/wireless/ath/ath12k/mac.c b/drivers/net/wireless/ath/ath12k/mac.c
> index 019a1a6c6777..b628bc2fd0f5 100644
> --- a/drivers/net/wireless/ath/ath12k/mac.c
> +++ b/drivers/net/wireless/ath/ath12k/mac.c
> @@ -4981,8 +4981,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) {
> @@ -7016,7 +7017,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;
> diff --git a/drivers/net/wireless/ath/ath12k/wmi.c b/drivers/net/wireless/ath/ath12k/wmi.c
> index e089b58bbea1..0583d832fac7 100644
> --- a/drivers/net/wireless/ath/ath12k/wmi.c
> +++ b/drivers/net/wireless/ath/ath12k/wmi.c
> @@ -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));
using the same TLV size both here and for the TLV that follows doesn't seem
logical. is this missing + TLV_HDR_SIZE to account for its own TLV header?
> + 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) {
> diff --git a/drivers/net/wireless/ath/ath12k/wmi.h b/drivers/net/wireless/ath/ath12k/wmi.h
> index 33b9643644c6..07bd275608bf 100644
> --- a/drivers/net/wireless/ath/ath12k/wmi.h
> +++ b/drivers/net/wireless/ath/ath12k/wmi.h
> @@ -3026,6 +3026,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 {
More information about the ath12k
mailing list