diff --git a/wmi/inc/wmi_unified_api.h b/wmi/inc/wmi_unified_api.h index 66d3de25c7..3f0c303d05 100644 --- a/wmi/inc/wmi_unified_api.h +++ b/wmi/inc/wmi_unified_api.h @@ -1218,8 +1218,19 @@ QDF_STATUS wmi_extract_fips_event_data(void *wmi_hdl, void *evt_buf, QDF_STATUS wmi_extract_vdev_start_resp(void *wmi_hdl, void *evt_buf, wmi_host_vdev_start_resp *vdev_rsp); + QDF_STATUS wmi_extract_tbttoffset_update_params(void *wmi_hdl, void *evt_buf, - uint32_t *vdev_map, uint32_t **tbttoffset_list); + uint8_t idx, struct tbttoffset_params *tbtt_param); + +QDF_STATUS wmi_extract_ext_tbttoffset_update_params(void *wmi_hdl, + void *evt_buf, uint8_t idx, + struct tbttoffset_params *tbtt_param); + +QDF_STATUS wmi_extract_tbttoffset_num_vdevs(void *wmi_hdl, void *evt_buf, + uint32_t *num_vdevs); + +QDF_STATUS wmi_extract_ext_tbttoffset_num_vdevs(void *wmi_hdl, void *evt_buf, + uint32_t *num_vdevs); QDF_STATUS wmi_extract_mgmt_rx_params(void *wmi_hdl, void *evt_buf, struct mgmt_rx_event_params *hdr, uint8_t **bufp); @@ -1290,8 +1301,8 @@ QDF_STATUS wmi_extract_pdev_csa_switch_count_status(void *wmi_hdl, void *evt_buf, struct pdev_csa_switch_count_status *param); -QDF_STATUS wmi_extract_swba_vdev_map(void *wmi_hdl, void *evt_buf, - uint32_t *vdev_map); +QDF_STATUS wmi_extract_swba_num_vdevs(void *wmi_hdl, void *evt_buf, + uint32_t *num_vdevs); QDF_STATUS wmi_extract_swba_tim_info(void *wmi_hdl, void *evt_buf, uint32_t idx, wmi_host_tim_info *tim_info); diff --git a/wmi/inc/wmi_unified_param.h b/wmi/inc/wmi_unified_param.h index 327c5e8d0d..a529117978 100644 --- a/wmi/inc/wmi_unified_param.h +++ b/wmi/inc/wmi_unified_param.h @@ -4955,6 +4955,7 @@ typedef enum { wmi_offchan_data_tx_completion_event, wmi_dfs_cac_complete_id, wmi_dfs_radar_detection_event_id, + wmi_ext_tbttoffset_update_event_id, wmi_events_max, } wmi_conv_event_id; @@ -5860,6 +5861,7 @@ struct wmi_host_offchan_data_tx_compl_event { * @tim_bitmap: TIM bitmap * @tim_changed: TIM changed * @tim_num_ps_pending: TIM num PS sta pending + * @vdev_id: Vdev id */ typedef struct { uint32_t tim_len; @@ -5867,6 +5869,7 @@ typedef struct { uint32_t tim_bitmap[WMI_HOST_TIM_BITMAP_ARRAY_SIZE]; uint32_t tim_changed; uint32_t tim_num_ps_pending; + uint32_t vdev_id; } wmi_host_tim_info; /** @@ -5892,6 +5895,7 @@ typedef struct { * @ctwindow: CT window * @num_descriptors: number of descriptors * @noa_descriptors: noa descriptors + * @vdev_id: Vdev id */ typedef struct { uint8_t modified; @@ -5901,6 +5905,7 @@ typedef struct { uint8_t num_descriptors; wmi_host_p2p_noa_descriptor noa_descriptors[WMI_HOST_P2P_MAX_NOA_DESCRIPTORS]; + uint32_t vdev_id; } wmi_host_p2p_noa_info; /** @@ -7250,4 +7255,15 @@ struct coex_config_params { #define WMI_HOST_PDEV_ID_0 0 #define WMI_HOST_PDEV_ID_1 1 #define WMI_HOST_PDEV_ID_2 2 + +/** + * struct tbttoffset_params - Tbttoffset event params + * @vdev_id: Virtual AP device identifier + * @tbttoffset : Tbttoffset for the virtual AP device + */ +struct tbttoffset_params { + uint32_t vdev_id; + uint32_t tbttoffset; +}; + #endif /* _WMI_UNIFIED_PARAM_H_ */ diff --git a/wmi/inc/wmi_unified_priv.h b/wmi/inc/wmi_unified_priv.h index 56c52a2395..a1b75349bc 100644 --- a/wmi/inc/wmi_unified_priv.h +++ b/wmi/inc/wmi_unified_priv.h @@ -1058,7 +1058,16 @@ QDF_STATUS (*extract_vdev_start_resp)(wmi_unified_t wmi_handle, void *evt_buf, wmi_host_vdev_start_resp *vdev_rsp); QDF_STATUS (*extract_tbttoffset_update_params)(void *wmi_hdl, void *evt_buf, - uint32_t *vdev_map, uint32_t **tbttoffset_list); + uint8_t idx, struct tbttoffset_params *tbtt_param); + +QDF_STATUS (*extract_ext_tbttoffset_update_params)(void *wmi_hdl, void *evt_buf, + uint8_t idx, struct tbttoffset_params *tbtt_param); + +QDF_STATUS (*extract_tbttoffset_num_vdevs)(void *wmi_hdl, void *evt_buf, + uint32_t *num_vdevs); + +QDF_STATUS (*extract_ext_tbttoffset_num_vdevs)(void *wmi_hdl, void *evt_buf, + uint32_t *num_vdevs); QDF_STATUS (*extract_mgmt_rx_params)(wmi_unified_t wmi_handle, void *evt_buf, struct mgmt_rx_event_params *hdr, uint8_t **bufp); @@ -1122,8 +1131,8 @@ QDF_STATUS (*extract_offchan_data_tx_compl_param)(wmi_unified_t wmi_handle, QDF_STATUS (*extract_pdev_csa_switch_count_status)(wmi_unified_t wmi_handle, void *evt_buf, struct pdev_csa_switch_count_status *param); -QDF_STATUS (*extract_swba_vdev_map)(wmi_unified_t wmi_handle, void *evt_buf, - uint32_t *vdev_map); +QDF_STATUS (*extract_swba_num_vdevs)(wmi_unified_t wmi_handle, void *evt_buf, + uint32_t *num_vdevs); QDF_STATUS (*extract_swba_tim_info)(wmi_unified_t wmi_handle, void *evt_buf, uint32_t idx, wmi_host_tim_info *tim_info); @@ -1456,4 +1465,52 @@ static inline uint32_t wmi_align(uint32_t param) { return roundup(param, sizeof(uint32_t)); } + +/** + * wmi_vdev_map_to_vdev_id() - Provides vdev id corresponding to idx + * from vdev map + * @vdev_map: Bitmask containing information of active vdev ids + * @idx: Index referring to the i'th bit set from LSB in vdev map + * + * This API returns the vdev id for the i'th bit set from LSB in vdev map. + * Index runs through 1 from maximum number of vdevs set in the vdev map + * + * Return: vdev id of the vdev object + */ +static inline uint32_t wmi_vdev_map_to_vdev_id(uint32_t vdev_map, + uint32_t idx) +{ + uint32_t vdev_count = 0, vdev_set = 0, vdev_id = WLAN_INVALID_VDEV_ID; + + while (vdev_map) { + vdev_set += (vdev_map & 0x1); + if (vdev_set == (idx+1)) { + vdev_id = vdev_count; + break; + } + vdev_map >>= 1; + vdev_count++; + } + + return vdev_id; +} + +/** + * wmi_vdev_map_to_num_vdevs() - Provides number of vdevs active based on the + * vdev map received from FW + * @vdev_map: Bitmask containing information of active vdev ids + * + * Return: Number of vdevs set in the vdev bit mask + */ +static inline uint32_t wmi_vdev_map_to_num_vdevs(uint32_t vdev_map) +{ + uint32_t num_vdevs = 0; + + while (vdev_map) { + num_vdevs += (vdev_map & 0x1); + vdev_map >>= 1; + } + + return num_vdevs; +} #endif diff --git a/wmi/src/wmi_unified_api.c b/wmi/src/wmi_unified_api.c index bf405cf439..b9144df4fa 100644 --- a/wmi/src/wmi_unified_api.c +++ b/wmi/src/wmi_unified_api.c @@ -5060,23 +5060,84 @@ QDF_STATUS wmi_extract_vdev_start_resp(void *wmi_hdl, void *evt_buf, return QDF_STATUS_E_FAILURE; } +/** + * wmi_extract_tbttoffset_num_vdevs() - extract tbtt offset num vdev + * @wmi_handle: wmi handle + * @param evt_buf: pointer to event buffer + * @param vdev_map: Pointer to hold num vdev + * + * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure + */ +QDF_STATUS wmi_extract_tbttoffset_num_vdevs(void *wmi_hdl, void *evt_buf, + uint32_t *num_vdevs) +{ + wmi_unified_t wmi = (wmi_unified_t) wmi_hdl; + + if (wmi->ops->extract_tbttoffset_num_vdevs) + return wmi->ops->extract_tbttoffset_num_vdevs(wmi, + evt_buf, num_vdevs); + + return QDF_STATUS_E_FAILURE; +} + +/** + * wmi_extract_ext_tbttoffset_num_vdevs() - extract ext tbtt offset num vdev + * @wmi_handle: wmi handle + * @param evt_buf: pointer to event buffer + * @param vdev_map: Pointer to hold num vdev + * + * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure + */ +QDF_STATUS wmi_extract_ext_tbttoffset_num_vdevs(void *wmi_hdl, void *evt_buf, + uint32_t *num_vdevs) +{ + wmi_unified_t wmi = (wmi_unified_t) wmi_hdl; + + if (wmi->ops->extract_ext_tbttoffset_num_vdevs) + return wmi->ops->extract_ext_tbttoffset_num_vdevs(wmi, + evt_buf, num_vdevs); + + return QDF_STATUS_E_FAILURE; +} + /** * wmi_extract_tbttoffset_update_params() - extract tbtt offset update param * @wmi_handle: wmi handle * @param evt_buf: pointer to event buffer - * @param vdev_map: Pointer to hold vdev map - * @param tbttoffset_list: Pointer to tbtt offset list + * @param idx: Index refering to a vdev + * @param tbtt_param: Pointer to tbttoffset event param * * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure */ QDF_STATUS wmi_extract_tbttoffset_update_params(void *wmi_hdl, void *evt_buf, - uint32_t *vdev_map, uint32_t **tbttoffset_list) + uint8_t idx, struct tbttoffset_params *tbtt_param) { wmi_unified_t wmi = (wmi_unified_t) wmi_hdl; if (wmi->ops->extract_tbttoffset_update_params) return wmi->ops->extract_tbttoffset_update_params(wmi, - evt_buf, vdev_map, tbttoffset_list); + evt_buf, idx, tbtt_param); + + return QDF_STATUS_E_FAILURE; +} + +/** + * wmi_extract_ext_tbttoffset_update_params() - extract tbtt offset update param + * @wmi_handle: wmi handle + * @param evt_buf: pointer to event buffer + * @param idx: Index refering to a vdev + * @param tbtt_param: Pointer to tbttoffset event param + * + * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure + */ +QDF_STATUS wmi_extract_ext_tbttoffset_update_params(void *wmi_hdl, + void *evt_buf, uint8_t idx, struct tbttoffset_params *tbtt_param) +{ + wmi_unified_t wmi = (wmi_unified_t) wmi_hdl; + + if (wmi->ops->extract_ext_tbttoffset_update_params) + return wmi->ops->extract_ext_tbttoffset_update_params(wmi, + evt_buf, idx, tbtt_param); return QDF_STATUS_E_FAILURE; } @@ -5478,21 +5539,21 @@ QDF_STATUS wmi_extract_pdev_csa_switch_count_status(void *wmi_hdl, /** - * wmi_extract_swba_vdev_map() - extract swba vdev map from event + * wmi_extract_swba_num_vdevs() - extract swba num vdevs from event * @wmi_handle: wmi handle * @param evt_buf: pointer to event buffer - * @param vdev_map: Pointer to hold vdev map + * @param num_vdevs: Pointer to hold num vdevs * * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure */ -QDF_STATUS wmi_extract_swba_vdev_map(void *wmi_hdl, void *evt_buf, - uint32_t *vdev_map) +QDF_STATUS wmi_extract_swba_num_vdevs(void *wmi_hdl, void *evt_buf, + uint32_t *num_vdevs) { wmi_unified_t wmi_handle = (wmi_unified_t) wmi_hdl; - if (wmi_handle->ops->extract_swba_vdev_map) - return wmi_handle->ops->extract_swba_vdev_map(wmi_handle, - evt_buf, vdev_map); + if (wmi_handle->ops->extract_swba_num_vdevs) + return wmi_handle->ops->extract_swba_num_vdevs(wmi_handle, + evt_buf, num_vdevs); return QDF_STATUS_E_FAILURE; } diff --git a/wmi/src/wmi_unified_non_tlv.c b/wmi/src/wmi_unified_non_tlv.c index b7032c1f5b..7060a7ef6b 100644 --- a/wmi/src/wmi_unified_non_tlv.c +++ b/wmi/src/wmi_unified_non_tlv.c @@ -5886,24 +5886,52 @@ static QDF_STATUS extract_vdev_start_resp_non_tlv(wmi_unified_t wmi_handle, return QDF_STATUS_SUCCESS; } +/** + * extract_tbttoffset_num_vdevs_non_tlv() - extract tbtt offset num vdevs + * @wmi_handle: wmi handle + * @param evt_buf: pointer to event buffer + * @param num_vdev: Pointer to hold num vdev + * + * Return: 0 for success or error code + */ +static QDF_STATUS extract_tbttoffset_num_vdevs_non_tlv(void *wmi_hdl, + void *evt_buf, + uint32_t *num_vdevs) +{ + wmi_tbtt_offset_event *tbtt_offset_event = + (wmi_tbtt_offset_event *)evt_buf; + uint32_t vdev_map; + + vdev_map = tbtt_offset_event->vdev_map; + *num_vdevs = wmi_vdev_map_to_num_vdevs(vdev_map); + + return QDF_STATUS_SUCCESS; +} + /** * extract_tbttoffset_update_params_non_tlv() - extract tbtt offset update param * @wmi_handle: wmi handle * @param evt_buf: pointer to event buffer - * @param vdev_map: Pointer to hold vdev map - * @param tbttoffset_list: Pointer to tbtt offset list + * @param idx: Index refering to a vdev + * @param tbtt_param: Pointer to tbttoffset event param * * Return: 0 for success or error code */ static QDF_STATUS extract_tbttoffset_update_params_non_tlv(void *wmi_hdl, - void *evt_buf, - uint32_t *vdev_map, uint32_t **tbttoffset_list) + void *evt_buf, uint8_t idx, + struct tbttoffset_params *tbtt_param) { wmi_tbtt_offset_event *tbtt_offset_event = (wmi_tbtt_offset_event *)evt_buf; + uint32_t vdev_map; - *vdev_map = tbtt_offset_event->vdev_map; - *tbttoffset_list = tbtt_offset_event->tbttoffset_list; + vdev_map = tbtt_offset_event->vdev_map; + + tbtt_param->vdev_id = wmi_vdev_map_to_vdev_id(vdev_map, idx); + if (tbtt_param->vdev_id == WLAN_INVALID_VDEV_ID) + return QDF_STATUS_E_INVAL; + tbtt_param->tbttoffset = + tbtt_offset_event->tbttoffset_list[tbtt_param->vdev_id]; return QDF_STATUS_SUCCESS; } @@ -6331,20 +6359,22 @@ static QDF_STATUS extract_pdev_reserve_ast_ev_param_non_tlv( } /** - * extract_swba_vdev_map_non_tlv() - extract swba vdev map from event + * extract_swba_num_vdevs_non_tlv() - extract swba num vdevs from event * @wmi_handle: wmi handle * @param evt_buf: pointer to event buffer - * @param vdev_map: Pointer to hold vdev map + * @param num_vdevs: Pointer to hold num vdevs * * Return: 0 for success or error code */ -static QDF_STATUS extract_swba_vdev_map_non_tlv(wmi_unified_t wmi_handle, +static QDF_STATUS extract_swba_num_vdevs_non_tlv(wmi_unified_t wmi_handle, void *evt_buf, - uint32_t *vdev_map) + uint32_t *num_vdevs) { wmi_host_swba_event *swba_event = (wmi_host_swba_event *)evt_buf; + uint32_t vdev_map; - *vdev_map = swba_event->vdev_map; + vdev_map = swba_event->vdev_map; + *num_vdevs = wmi_vdev_map_to_num_vdevs(vdev_map); return QDF_STATUS_SUCCESS; } @@ -6364,9 +6394,14 @@ static QDF_STATUS extract_swba_tim_info_non_tlv(wmi_unified_t wmi_handle, { wmi_host_swba_event *swba_event = (wmi_host_swba_event *)evt_buf; wmi_bcn_info *bcn_info; + uint32_t vdev_map; bcn_info = &swba_event->bcn_info[idx]; + vdev_map = swba_event->vdev_map; + tim_info->vdev_id = wmi_vdev_map_to_vdev_id(vdev_map, idx); + if (tim_info->vdev_id == WLAN_INVALID_VDEV_ID) + return QDF_STATUS_E_INVAL; tim_info->tim_len = bcn_info->tim_info.tim_len; tim_info->tim_mcast = bcn_info->tim_info.tim_mcast; qdf_mem_copy(tim_info->tim_bitmap, bcn_info->tim_info.tim_bitmap, @@ -6393,11 +6428,15 @@ static QDF_STATUS extract_swba_noa_info_non_tlv(wmi_unified_t wmi_handle, wmi_p2p_noa_info *p2p_noa_info; wmi_bcn_info *bcn_info; uint8_t i = 0; + uint32_t vdev_map; bcn_info = &swba_event->bcn_info[idx]; - + vdev_map = swba_event->vdev_map; p2p_noa_info = &bcn_info->p2p_noa_info; + p2p_desc->vdev_id = wmi_vdev_map_to_vdev_id(vdev_map, idx); + if (p2p_desc->vdev_id == WLAN_INVALID_VDEV_ID) + return QDF_STATUS_E_INVAL; p2p_desc->modified = false; p2p_desc->num_descriptors = 0; if (WMI_UNIFIED_NOA_ATTR_IS_MODIFIED(p2p_noa_info)) { @@ -8077,6 +8116,8 @@ struct wmi_ops non_tlv_ops = { .extract_vdev_start_resp = extract_vdev_start_resp_non_tlv, .extract_tbttoffset_update_params = extract_tbttoffset_update_params_non_tlv, + .extract_tbttoffset_num_vdevs = + extract_tbttoffset_num_vdevs_non_tlv, .extract_mgmt_rx_params = extract_mgmt_rx_params_non_tlv, .extract_vdev_stopped_param = extract_vdev_stopped_param_non_tlv, .extract_vdev_roam_param = extract_vdev_roam_param_non_tlv, @@ -8091,7 +8132,7 @@ struct wmi_ops non_tlv_ops = { .extract_gpio_input_ev_param = extract_gpio_input_ev_param_non_tlv, .extract_pdev_reserve_ast_ev_param = extract_pdev_reserve_ast_ev_param_non_tlv, - .extract_swba_vdev_map = extract_swba_vdev_map_non_tlv, + .extract_swba_num_vdevs = extract_swba_num_vdevs_non_tlv, .extract_swba_tim_info = extract_swba_tim_info_non_tlv, .extract_swba_noa_info = extract_swba_noa_info_non_tlv, .extract_peer_sta_ps_statechange_ev = diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c index 7b62eef2cf..13f213c467 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -15413,29 +15413,117 @@ static QDF_STATUS extract_vdev_start_resp_tlv(wmi_unified_t wmi_handle, } /** - * extract_tbttoffset_update_params_tlv() - extract tbtt offset update param + * extract_tbttoffset_num_vdevs_tlv() - extract tbtt offset num vdev * @wmi_handle: wmi handle * @param evt_buf: pointer to event buffer - * @param vdev_map: Pointer to hold vdev map - * @param tbttoffset_list: Pointer to tbtt offset list + * @param num_vdevs: Pointer to hold num vdev + * + * Return: QDF_STATUS_SUCCESS for success or error code + */ +static QDF_STATUS extract_tbttoffset_num_vdevs_tlv(void *wmi_hdl, + void *evt_buf, uint32_t *num_vdevs) +{ + WMI_TBTTOFFSET_UPDATE_EVENTID_param_tlvs *param_buf; + wmi_tbtt_offset_event_fixed_param *tbtt_offset_event; + uint32_t vdev_map; + + param_buf = (WMI_TBTTOFFSET_UPDATE_EVENTID_param_tlvs *)evt_buf; + if (!param_buf) { + qdf_print("Invalid tbtt update ext event buffer\n"); + return QDF_STATUS_E_INVAL; + } + tbtt_offset_event = param_buf->fixed_param; + vdev_map = tbtt_offset_event->vdev_map; + *num_vdevs = wmi_vdev_map_to_num_vdevs(vdev_map); + + return QDF_STATUS_SUCCESS; +} + +/** + * extract_ext_tbttoffset_num_vdevs_tlv() - extract ext tbtt offset num vdev + * @wmi_handle: wmi handle + * @param evt_buf: pointer to event buffer + * @param num_vdevs: Pointer to hold num vdev + * + * Return: QDF_STATUS_SUCCESS for success or error code + */ +static QDF_STATUS extract_ext_tbttoffset_num_vdevs_tlv(void *wmi_hdl, + void *evt_buf, uint32_t *num_vdevs) +{ + WMI_TBTTOFFSET_EXT_UPDATE_EVENTID_param_tlvs *param_buf; + wmi_tbtt_offset_ext_event_fixed_param *tbtt_offset_ext_event; + + param_buf = (WMI_TBTTOFFSET_EXT_UPDATE_EVENTID_param_tlvs *)evt_buf; + if (!param_buf) { + qdf_print("Invalid tbtt update ext event buffer\n"); + return QDF_STATUS_E_INVAL; + } + tbtt_offset_ext_event = param_buf->fixed_param; + + *num_vdevs = tbtt_offset_ext_event->num_vdevs; + + return QDF_STATUS_SUCCESS; +} + +/** + * extract_tbttoffset_update_params_tlv() - extract tbtt offset param + * @wmi_handle: wmi handle + * @param evt_buf: pointer to event buffer + * @param idx: Index refering to a vdev + * @param tbtt_param: Pointer to tbttoffset event param * * Return: QDF_STATUS_SUCCESS for success or error code */ static QDF_STATUS extract_tbttoffset_update_params_tlv(void *wmi_hdl, - void *evt_buf, uint32_t *vdev_map, uint32_t **tbttoffset_list) + void *evt_buf, uint8_t idx, + struct tbttoffset_params *tbtt_param) { WMI_TBTTOFFSET_UPDATE_EVENTID_param_tlvs *param_buf; wmi_tbtt_offset_event_fixed_param *tbtt_offset_event; + uint32_t vdev_map; param_buf = (WMI_TBTTOFFSET_UPDATE_EVENTID_param_tlvs *) evt_buf; if (!param_buf) { qdf_print("Invalid tbtt update event buffer\n"); return QDF_STATUS_E_INVAL; } - tbtt_offset_event = param_buf->fixed_param; - *vdev_map = tbtt_offset_event->vdev_map; - *tbttoffset_list = param_buf->tbttoffset_list; + tbtt_offset_event = param_buf->fixed_param; + vdev_map = tbtt_offset_event->vdev_map; + tbtt_param->vdev_id = wmi_vdev_map_to_vdev_id(vdev_map, idx); + if (tbtt_param->vdev_id == WLAN_INVALID_VDEV_ID) + return QDF_STATUS_E_INVAL; + tbtt_param->tbttoffset = + param_buf->tbttoffset_list[tbtt_param->vdev_id]; + + return QDF_STATUS_SUCCESS; +} + +/** + * extract_ext_tbttoffset_update_params_tlv() - extract ext tbtt offset param + * @wmi_handle: wmi handle + * @param evt_buf: pointer to event buffer + * @param idx: Index refering to a vdev + * @param tbtt_param: Pointer to tbttoffset event param + * + * Return: QDF_STATUS_SUCCESS for success or error code + */ +static QDF_STATUS extract_ext_tbttoffset_update_params_tlv(void *wmi_hdl, + void *evt_buf, uint8_t idx, + struct tbttoffset_params *tbtt_param) +{ + WMI_TBTTOFFSET_EXT_UPDATE_EVENTID_param_tlvs *param_buf; + wmi_tbtt_offset_info *tbtt_offset_info; + + param_buf = (WMI_TBTTOFFSET_EXT_UPDATE_EVENTID_param_tlvs *)evt_buf; + if (!param_buf) { + qdf_print("Invalid tbtt update event buffer\n"); + return QDF_STATUS_E_INVAL; + } + tbtt_offset_info = ¶m_buf->tbtt_offset_info[idx]; + + tbtt_param->vdev_id = tbtt_offset_info->vdev_id; + tbtt_param->tbttoffset = tbtt_offset_info->tbttoffset; return QDF_STATUS_SUCCESS; } @@ -15833,26 +15921,32 @@ static QDF_STATUS extract_pdev_csa_switch_count_status_tlv( } /** - * extract_swba_vdev_map_tlv() - extract swba vdev map from event + * extract_swba_num_vdevs_tlv() - extract swba num vdevs from event * @wmi_handle: wmi handle * @param evt_buf: pointer to event buffer - * @param vdev_map: Pointer to hold vdev map + * @param num_vdevs: Pointer to hold num vdevs * * Return: QDF_STATUS_SUCCESS for success or error code */ -static QDF_STATUS extract_swba_vdev_map_tlv(wmi_unified_t wmi_handle, - void *evt_buf, uint32_t *vdev_map) +static QDF_STATUS extract_swba_num_vdevs_tlv(wmi_unified_t wmi_handle, + void *evt_buf, uint32_t *num_vdevs) { WMI_HOST_SWBA_EVENTID_param_tlvs *param_buf; wmi_host_swba_event_fixed_param *swba_event; + uint32_t vdev_map; param_buf = (WMI_HOST_SWBA_EVENTID_param_tlvs *) evt_buf; if (!param_buf) { WMI_LOGE("Invalid swba event buffer"); return QDF_STATUS_E_INVAL; } + swba_event = param_buf->fixed_param; - *vdev_map = swba_event->vdev_map; + *num_vdevs = swba_event->num_vdevs; + if (!(*num_vdevs)) { + vdev_map = swba_event->vdev_map; + *num_vdevs = wmi_vdev_map_to_num_vdevs(vdev_map); + } return QDF_STATUS_SUCCESS; } @@ -15886,6 +15980,7 @@ static QDF_STATUS extract_swba_tim_info_tlv(wmi_unified_t wmi_handle, (sizeof(uint32_t) * WMI_TIM_BITMAP_ARRAY_SIZE)); tim_info->tim_changed = tim_info_ev->tim_changed; tim_info->tim_num_ps_pending = tim_info_ev->tim_num_ps_pending; + tim_info->vdev_id = tim_info_ev->vdev_id; return QDF_STATUS_SUCCESS; } @@ -15938,6 +16033,7 @@ static QDF_STATUS extract_swba_noa_info_tlv(wmi_unified_t wmi_handle, p2p_desc->noa_descriptors[i].start_time = p2p_noa_info->noa_descriptors[i].start_time; } + p2p_desc->vdev_id = p2p_noa_info->vdev_id; } return QDF_STATUS_SUCCESS; @@ -17900,6 +17996,12 @@ struct wmi_ops tlv_ops = { .extract_vdev_start_resp = extract_vdev_start_resp_tlv, .extract_tbttoffset_update_params = extract_tbttoffset_update_params_tlv, + .extract_ext_tbttoffset_update_params = + extract_ext_tbttoffset_update_params_tlv, + .extract_tbttoffset_num_vdevs = + extract_tbttoffset_num_vdevs_tlv, + .extract_ext_tbttoffset_num_vdevs = + extract_ext_tbttoffset_num_vdevs_tlv, .extract_mgmt_rx_params = extract_mgmt_rx_params_tlv, .extract_vdev_stopped_param = extract_vdev_stopped_param_tlv, .extract_vdev_roam_param = extract_vdev_roam_param_tlv, @@ -17908,7 +18010,7 @@ struct wmi_ops tlv_ops = { .extract_vdev_tdls_ev_param = extract_vdev_tdls_ev_param_tlv, #endif .extract_mgmt_tx_compl_param = extract_mgmt_tx_compl_param_tlv, - .extract_swba_vdev_map = extract_swba_vdev_map_tlv, + .extract_swba_num_vdevs = extract_swba_num_vdevs_tlv, .extract_swba_tim_info = extract_swba_tim_info_tlv, .extract_swba_noa_info = extract_swba_noa_info_tlv, #ifdef CONVERGED_P2P_ENABLE @@ -18024,6 +18126,8 @@ static void populate_tlv_events_id(uint32_t *event_ids) event_ids[wmi_host_swba_event_id] = WMI_HOST_SWBA_EVENTID; event_ids[wmi_tbttoffset_update_event_id] = WMI_TBTTOFFSET_UPDATE_EVENTID; + event_ids[wmi_ext_tbttoffset_update_event_id] = + WMI_TBTTOFFSET_EXT_UPDATE_EVENTID; event_ids[wmi_offload_bcn_tx_status_event_id] = WMI_OFFLOAD_BCN_TX_STATUS_EVENTID; event_ids[wmi_offload_prob_resp_tx_status_event_id] =