From b33bf95ae570d94cb4c6ce9c059f9d55aea7a13d Mon Sep 17 00:00:00 2001 From: Vivek Date: Fri, 26 Nov 2021 11:50:39 +0530 Subject: [PATCH] qcacmn: Add mlo mcast vdev flag for vdev start For MLO, we need to designate one of the link vdev as mlo vdev, on which FW will accept the multicast frames and for the other link will drop the mcast frames. So as part of vdev start, we indicate the mlo mcast vdev in the first vdev of the mlo. Change-Id: Ic962a6e1fead4a3cab7c622583392ecf373f4783 CRs-Fixed: 3080525 --- .../obj_mgr/inc/wlan_objmgr_vdev_obj.h | 23 +++++++++++++++++++ umac/mlme/vdev_mgr/core/src/vdev_mgr_ops.c | 13 +++++++++++ .../inc/wlan_vdev_mgr_tgt_if_tx_defs.h | 4 +++- wmi/src/wmi_unified_11be_tlv.c | 13 +++++++++++ 4 files changed, 52 insertions(+), 1 deletion(-) diff --git a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h index 1cfaf92f1b..08231513bc 100644 --- a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h +++ b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h @@ -163,6 +163,8 @@ #define WLAN_VDEV_FEXT2_MLO 0x00000001 /* STA VDEV is link type */ #define WLAN_VDEV_FEXT2_MLO_STA_LINK 0x00000002 + /* VDEV is MLO mcast primary*/ +#define WLAN_VDEV_FEXT2_MLO_MCAST 0x00000004 /* VDEV OP flags */ /* if the vap destroyed by user */ @@ -1392,6 +1394,27 @@ bool wlan_vdev_mlme_is_mlo_vdev(struct wlan_objmgr_vdev *vdev) return wlan_vdev_mlme_feat_ext2_cap_get(vdev, WLAN_VDEV_FEXT2_MLO); } +#ifdef WLAN_MLO_MCAST +/** + * wlan_vdev_mlme_is_mlo_mcast_vdev() - whether it is mlo mcast vdev or not + * @vdev: VDEV object + * + * Return: True if it is mlo mcast vdev, otherwise false. + */ +static inline +bool wlan_vdev_mlme_is_mlo_mcast_vdev(struct wlan_objmgr_vdev *vdev) +{ + return wlan_vdev_mlme_feat_ext2_cap_get(vdev, + WLAN_VDEV_FEXT2_MLO_MCAST); +} +#else +static inline +bool wlan_vdev_mlme_is_mlo_mcast_vdev(struct wlan_objmgr_vdev *vdev) +{ + return false; +} +#endif + /** * wlan_vdev_mlme_is_mlo_vdev() - whether it is mlo sta link vdev or not * @vdev: VDEV object diff --git a/umac/mlme/vdev_mgr/core/src/vdev_mgr_ops.c b/umac/mlme/vdev_mgr/core/src/vdev_mgr_ops.c index 342762289f..06091196c3 100644 --- a/umac/mlme/vdev_mgr/core/src/vdev_mgr_ops.c +++ b/umac/mlme/vdev_mgr/core/src/vdev_mgr_ops.c @@ -150,6 +150,17 @@ vdev_mgr_set_cur_chan_punc_pattern(struct wlan_channel *des_chan, #endif #ifdef WLAN_FEATURE_11BE_MLO +#ifdef WLAN_MLO_MCAST +static inline void +vdev_mgr_start_param_update_mlo_mcast(struct wlan_objmgr_vdev *vdev, + struct vdev_start_params *param) +{ + if (wlan_vdev_mlme_is_mlo_mcast_vdev(vdev)) + param->mlo_flags.mlo_macst_vdev = 1; +} +#else +#define vdev_mgr_start_param_update_mlo_mcast(vdev, param) +#endif static void vdev_mgr_start_param_update_mlo(struct vdev_mlme_obj *mlme_obj, struct vdev_start_params *param) @@ -169,6 +180,8 @@ vdev_mgr_start_param_update_mlo(struct vdev_mlme_obj *mlme_obj, if (!wlan_vdev_mlme_is_mlo_link_vdev(vdev)) param->mlo_flags.mlo_assoc_link = 1; + + vdev_mgr_start_param_update_mlo_mcast(vdev, param); } #else static void diff --git a/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mgr_tgt_if_tx_defs.h b/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mgr_tgt_if_tx_defs.h index 1212b1dc29..d6d0722300 100644 --- a/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mgr_tgt_if_tx_defs.h +++ b/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mgr_tgt_if_tx_defs.h @@ -512,11 +512,13 @@ struct vdev_scan_nac_rssi_params { * @mlo_enabled: indicate is MLO enabled * @mlo_assoc_link: indicate is the link used to initialize * the association of mlo connection + * @mlo_mcast_vdev: MLO cast vdev */ struct mlo_vdev_start_flags { uint32_t mlo_enabled:1, mlo_assoc_link:1, - rsvd:30; + mlo_mcast_vdev:1, + rsvd:29; }; /** diff --git a/wmi/src/wmi_unified_11be_tlv.c b/wmi/src/wmi_unified_11be_tlv.c index d67868affb..49d2781010 100644 --- a/wmi/src/wmi_unified_11be_tlv.c +++ b/wmi/src/wmi_unified_11be_tlv.c @@ -62,6 +62,17 @@ size_t vdev_start_mlo_params_size(struct vdev_start_params *req) return vdev_start_mlo_size; } +#ifdef WLAN_MCAST_MLO +static bool vdev_start_add_mlo_mcast_params(uint32_t mlo_flags, + struct vdev_start_params *req) +{ + WMI_MLO_FLAGS_SET_MCAST_VDEV(mlo_flags, + req->mlo_flags.mlo_mcast_vdev); +} +#else +#define vdev_start_add_mlo_mcast_params(mlo_flags, req) +#endif + uint8_t *vdev_start_add_mlo_params(uint8_t *buf_ptr, struct vdev_start_params *req) { @@ -82,6 +93,8 @@ uint8_t *vdev_start_add_mlo_params(uint8_t *buf_ptr, WMI_MLO_FLAGS_SET_ASSOC_LINK(mlo_params->mlo_flags.mlo_flags, req->mlo_flags.mlo_assoc_link); + vdev_start_add_mlo_mcast_params(mlo_params->mlo_flags.mlo_flags, req); + return buf_ptr + sizeof(wmi_vdev_start_mlo_params); }