diff --git a/umac/cmn_services/mgmt_txrx/dispatcher/inc/wlan_mgmt_txrx_utils_api.h b/umac/cmn_services/mgmt_txrx/dispatcher/inc/wlan_mgmt_txrx_utils_api.h index e01e2ca18e..9ace901887 100644 --- a/umac/cmn_services/mgmt_txrx/dispatcher/inc/wlan_mgmt_txrx_utils_api.h +++ b/umac/cmn_services/mgmt_txrx/dispatcher/inc/wlan_mgmt_txrx_utils_api.h @@ -803,6 +803,16 @@ struct frame_pn_params { uint8_t prev_pn[WLAN_MGMT_TXRX_HOST_MAX_PN_LEN]; }; +/** + * struct mgmt_rx_event_ext_params - Host mgmt extended params + * @ba_win_size: Block-Ack window size + * @reo_win_size: Reo win size + */ +struct mgmt_rx_event_ext_params { + uint16_t ba_win_size; + uint16_t reo_win_size; +}; + /** * struct mgmt_rx_event_params - host mgmt header params * @chan_freq: channel frequency on which this frame is received @@ -827,6 +837,7 @@ struct frame_pn_params { * (win specific, will be removed in phase 4) * @reo_params: Pointer to MGMT Rx REO params * @pn_params: Frame PN params + * @ext_params: Extended params */ struct mgmt_rx_event_params { uint32_t chan_freq; @@ -847,6 +858,7 @@ struct mgmt_rx_event_params { struct mgmt_rx_reo_params *reo_params; #endif struct frame_pn_params pn_params; + struct mgmt_rx_event_ext_params *ext_params; }; #ifdef WLAN_MGMT_RX_REO_SUPPORT @@ -867,14 +879,25 @@ struct mgmt_rx_event_params *alloc_mgmt_rx_event_params(void) return NULL; } + rx_params->ext_params = + qdf_mem_malloc(sizeof(struct mgmt_rx_event_ext_params)); + + if (!rx_params->ext_params) { + qdf_mem_free(rx_params->reo_params); + qdf_mem_free(rx_params); + return NULL; + } + return rx_params; } static inline void free_mgmt_rx_event_params(struct mgmt_rx_event_params *rx_params) { - if (rx_params) + if (rx_params) { + qdf_mem_free(rx_params->ext_params); qdf_mem_free(rx_params->reo_params); + } qdf_mem_free(rx_params); } @@ -888,10 +911,25 @@ struct mgmt_rx_event_params *alloc_mgmt_rx_event_params(void) if (!rx_params) return NULL; + rx_params->ext_params = + qdf_mem_malloc(sizeof(struct mgmt_rx_event_ext_params)); + + if (!rx_params->ext_params) { + qdf_mem_free(rx_params); + return NULL; + } + return rx_params; } -#define free_mgmt_rx_event_params(rx_params) qdf_mem_free((rx_params)) +static inline void +free_mgmt_rx_event_params(struct mgmt_rx_event_params *rx_params) +{ + if (rx_params) + qdf_mem_free(rx_params->ext_params); + + qdf_mem_free(rx_params); +} #endif /** diff --git a/wmi/inc/wmi_unified_api.h b/wmi/inc/wmi_unified_api.h index 0774581b49..a2774575e1 100644 --- a/wmi/inc/wmi_unified_api.h +++ b/wmi/inc/wmi_unified_api.h @@ -2916,6 +2916,18 @@ QDF_STATUS wmi_extract_mgmt_rx_params(wmi_unified_t wmi_handle, void *evt_buf, struct mgmt_rx_event_params *hdr, uint8_t **bufp); +/** + * wmi_extract_mgmt_rx_ext_params() - extract extended rx params from event + * @wmi_handle: wmi handle + * @evt_buf: pointer to event buffer + * @params: Pointer to hold ext params + * + * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure + */ +QDF_STATUS +wmi_extract_mgmt_rx_ext_params(wmi_unified_t wmi_handle, void *evt_buf, + struct mgmt_rx_event_ext_params *params); + #ifdef WLAN_MGMT_RX_REO_SUPPORT /** * wmi_extract_mgmt_rx_fw_consumed() - extract MGMT Rx FW consumed event diff --git a/wmi/inc/wmi_unified_priv.h b/wmi/inc/wmi_unified_priv.h index 5945a364a6..983e9087a2 100644 --- a/wmi/inc/wmi_unified_priv.h +++ b/wmi/inc/wmi_unified_priv.h @@ -2899,6 +2899,10 @@ QDF_STATUS void *evt_buf, struct wmi_host_pdev_set_halphy_cal_event *param); +QDF_STATUS (*extract_mgmt_rx_ext_params)(wmi_unified_t wmi_handle, + void *evt_buf, + struct mgmt_rx_event_ext_params *params); + #ifdef WLAN_MGMT_RX_REO_SUPPORT QDF_STATUS (*extract_mgmt_rx_fw_consumed)(wmi_unified_t wmi_handle, void *evt_buf, diff --git a/wmi/src/wmi_unified_api.c b/wmi/src/wmi_unified_api.c index 170cb0fca2..43195a2cb8 100644 --- a/wmi/src/wmi_unified_api.c +++ b/wmi/src/wmi_unified_api.c @@ -2045,6 +2045,17 @@ wmi_extract_mgmt_rx_params(wmi_unified_t wmi_handle, void *evt_buf, return QDF_STATUS_E_FAILURE; } +QDF_STATUS +wmi_extract_mgmt_rx_ext_params(wmi_unified_t wmi_handle, void *evt_buf, + struct mgmt_rx_event_ext_params *params) +{ + if (wmi_handle->ops->extract_mgmt_rx_ext_params) + return wmi_handle->ops->extract_mgmt_rx_ext_params( + wmi_handle, evt_buf, params); + + return QDF_STATUS_E_FAILURE; +} + #ifdef WLAN_MGMT_RX_REO_SUPPORT QDF_STATUS wmi_extract_mgmt_rx_fw_consumed(wmi_unified_t wmi_handle, void *evt_buf, diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c index 7c03d25a4e..c1e36755ce 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -11596,6 +11596,48 @@ static QDF_STATUS extract_mgmt_rx_params_tlv(wmi_unified_t wmi_handle, return QDF_STATUS_SUCCESS; } +static QDF_STATUS extract_mgmt_rx_ext_params_tlv(wmi_unified_t wmi_handle, + void *evt_buf, struct mgmt_rx_event_ext_params *ext_params) +{ + WMI_MGMT_RX_EVENTID_param_tlvs *param_tlvs; + wmi_mgmt_rx_params_ext *ext_params_tlv; + wmi_mgmt_rx_hdr *ev_hdr; + + param_tlvs = (WMI_MGMT_RX_EVENTID_param_tlvs *) evt_buf; + if (!param_tlvs) { + wmi_err("param_tlvs is NULL"); + return QDF_STATUS_E_INVAL; + } + + ev_hdr = param_tlvs->hdr; + if (!ev_hdr) { + wmi_err("Rx event is NULL"); + return QDF_STATUS_E_INVAL; + } + + ext_params_tlv = param_tlvs->mgmt_rx_params_ext; + if (ext_params_tlv) { + ext_params->ba_win_size = WMI_RX_PARAM_EXT_BA_WIN_SIZE_GET( + ext_params_tlv->mgmt_rx_params_ext_dword1); + if (ext_params->ba_win_size > 1024) { + wmi_err("ba win size from TLV is Invalid"); + return QDF_STATUS_E_INVAL; + } + + ext_params->reo_win_size = WMI_RX_PARAM_EXT_REO_WIN_SIZE_GET( + ext_params_tlv->mgmt_rx_params_ext_dword1); + if (ext_params->reo_win_size > 2048) { + wmi_err("reo win size from TLV is Invalid"); + return QDF_STATUS_E_INVAL; + } + } else { + ext_params->ba_win_size = 0; + ext_params->reo_win_size = 0; + } + + return QDF_STATUS_SUCCESS; +} + #ifdef WLAN_MGMT_RX_REO_SUPPORT /** * extract_mgmt_rx_fw_consumed_tlv() - extract MGMT Rx FW consumed event @@ -18344,6 +18386,7 @@ struct wmi_ops tlv_ops = { .extract_pktlog_decode_info_event = extract_pktlog_decode_info_event_tlv, .extract_pdev_telemetry_stats = extract_pdev_telemetry_stats_tlv, + .extract_mgmt_rx_ext_params = extract_mgmt_rx_ext_params_tlv, }; #ifdef WLAN_FEATURE_11BE_MLO