diff --git a/umac/mlo_mgr/inc/wlan_mlo_mgr_public_structs.h b/umac/mlo_mgr/inc/wlan_mlo_mgr_public_structs.h index 91f6f728ed..45ec13bf0c 100644 --- a/umac/mlo_mgr/inc/wlan_mlo_mgr_public_structs.h +++ b/umac/mlo_mgr/inc/wlan_mlo_mgr_public_structs.h @@ -1008,7 +1008,7 @@ struct mlo_vdev_host_tid_to_link_map_resp { uint8_t mapping_switch_tsf; }; -/* +/** * struct mlo_link_removal_cmd_params - MLO link removal command parameters * @vdev_id: vdev ID of the link to be removed * @reconfig_ml_ie: Entire ML reconfiguration element @@ -1020,11 +1020,26 @@ struct mlo_link_removal_cmd_params { uint32_t reconfig_ml_ie_size; }; -/* +/** + * struct mlo_link_removal_tbtt_info - MLO link removal TBTT info. This + * information will be in correspondence with an outgoing beacon instance. + * @tbtt_count: Delete timer TBTT count in the reported beacon + * @qtimer_reading: Q-timer reading when the reported beacon is sent out + * @tsf: TSF of the reported beacon + */ +struct mlo_link_removal_tbtt_info { + uint32_t tbtt_count; + uint64_t qtimer_reading; + uint64_t tsf; +}; + +/** * struct mlo_link_removal_evt_params - MLO link removal event parameters - * @vdev_id: vdev ID of the link to be removed + * @vdev_id: vdev ID of the link undergoing removal + * @tbtt_info: TBTT information of the link undergoing removal */ struct mlo_link_removal_evt_params { uint8_t vdev_id; + struct mlo_link_removal_tbtt_info tbtt_info; }; #endif diff --git a/wmi/inc/wmi_unified_11be_api.h b/wmi/inc/wmi_unified_11be_api.h index 98c20e464f..daa7dc0d06 100644 --- a/wmi/inc/wmi_unified_11be_api.h +++ b/wmi/inc/wmi_unified_11be_api.h @@ -44,7 +44,7 @@ wmi_extract_mlo_link_set_active_resp(wmi_unified_t wmi, /** * wmi_send_mlo_link_set_active_cmd() - send mlo link set active command - * @wmi: WMI handle for this pdev + * @wmi_handle: WMI handle for this pdev * @param: Pointer to mlo link set active param * * Return: QDF_STATUS code @@ -89,6 +89,20 @@ QDF_STATUS wmi_extract_mlo_link_removal_evt_fixed_param( struct wmi_unified *wmi_handle, void *buf, struct mlo_link_removal_evt_params *params); + +/** + * wmi_extract_mlo_link_removal_tbtt_update() - Extract TBTT update TLV + * from the MLO link removal WMI event + * @wmi_handle: wmi handle + * @buf: pointer to event buffer + * @tbtt_info: TBTT information + * + * Return: QDF_STATUS of operation + */ +QDF_STATUS wmi_extract_mlo_link_removal_tbtt_update( + struct wmi_unified *wmi_handle, + void *buf, + struct mlo_link_removal_tbtt_info *tbtt_info); #endif /*WLAN_FEATURE_11BE_MLO*/ #ifdef WLAN_FEATURE_11BE diff --git a/wmi/inc/wmi_unified_priv.h b/wmi/inc/wmi_unified_priv.h index 3c7513d274..804524fa6e 100644 --- a/wmi/inc/wmi_unified_priv.h +++ b/wmi/inc/wmi_unified_priv.h @@ -3044,6 +3044,11 @@ QDF_STATUS (*extract_mlo_link_removal_evt_fixed_param)( struct wmi_unified *wmi_handle, void *buf, struct mlo_link_removal_evt_params *params); + +QDF_STATUS (*extract_mlo_link_removal_tbtt_update)( + struct wmi_unified *wmi_handle, + void *buf, + struct mlo_link_removal_tbtt_info *tbtt_info); #endif #ifdef WLAN_FEATURE_SON diff --git a/wmi/src/wmi_unified_11be_api.c b/wmi/src/wmi_unified_11be_api.c index 4d8aa7ea3a..aeb1d9d3b7 100644 --- a/wmi/src/wmi_unified_11be_api.c +++ b/wmi/src/wmi_unified_11be_api.c @@ -141,3 +141,15 @@ QDF_STATUS wmi_extract_mlo_link_removal_evt_fixed_param( return QDF_STATUS_E_FAILURE; } + +QDF_STATUS wmi_extract_mlo_link_removal_tbtt_update( + struct wmi_unified *wmi, + void *buf, + struct mlo_link_removal_tbtt_info *tbtt_info) +{ + if (wmi->ops->extract_mlo_link_removal_tbtt_update) + return wmi->ops->extract_mlo_link_removal_tbtt_update( + wmi, buf, tbtt_info); + + return QDF_STATUS_E_FAILURE; +} diff --git a/wmi/src/wmi_unified_11be_tlv.c b/wmi/src/wmi_unified_11be_tlv.c index 2e22d78c95..9972be6ab7 100644 --- a/wmi/src/wmi_unified_11be_tlv.c +++ b/wmi/src/wmi_unified_11be_tlv.c @@ -702,6 +702,44 @@ extract_mlo_link_removal_evt_fixed_param_tlv( return QDF_STATUS_SUCCESS; } +/** + * extract_mlo_link_removal_tbtt_update_tlv() - Extract TBTT update TLV + * from the MLO link removal WMI event + * @wmi_handle: wmi handle + * @buf: pointer to event buffer + * @tbtt_info: TBTT information to be populated + * + * Return: QDF_STATUS of operation + */ +static QDF_STATUS +extract_mlo_link_removal_tbtt_update_tlv( + struct wmi_unified *wmi_handle, + void *buf, + struct mlo_link_removal_tbtt_info *tbtt_info) +{ + WMI_MLO_LINK_REMOVAL_EVENTID_param_tlvs *param_buf = buf; + wmi_mlo_link_removal_tbtt_update *tlv; + + if (!param_buf) { + wmi_err_rl("Param_buf is NULL"); + return QDF_STATUS_E_NULL_VALUE; + } + + if (!tbtt_info) { + wmi_err_rl("Writable argument is NULL"); + return QDF_STATUS_E_NULL_VALUE; + } + + tlv = param_buf->tbtt_update; + + tbtt_info->tbtt_count = tlv->tbtt_count; + tbtt_info->tsf = ((uint64_t)tlv->tsf_high << 32) | tlv->tsf_low; + tbtt_info->qtimer_reading = + ((uint64_t)tlv->qtimer_ts_high << 32) | tlv->qtimer_ts_low; + + return QDF_STATUS_SUCCESS; +} + #ifdef WLAN_FEATURE_11BE size_t peer_assoc_t2lm_params_size(struct peer_assoc_params *req) { @@ -1419,4 +1457,6 @@ void wmi_11be_attach_tlv(wmi_unified_t wmi_handle) ops->send_mlo_link_removal_cmd = send_mlo_link_removal_cmd_tlv; ops->extract_mlo_link_removal_evt_fixed_param = extract_mlo_link_removal_evt_fixed_param_tlv; + ops->extract_mlo_link_removal_tbtt_update = + extract_mlo_link_removal_tbtt_update_tlv; }