Browse Source

qcacmn: Add and modify extract APIs for TBTT offset and SWBA events

Recently, FW changes were implemented to support WMI resource config for
multi-radio. As part of this, the TBTT offset and SWBA events were modified
to support increase in the number of vdevs per SOC.

Brief description of the changes with respect to TBTT offset
------------------------------------------------------------

Converged FW will send extended TBTT offset event when the number of vdevs
configured is greater than 32 and will continue to send normal TBTT offset
event when the number of vdevs configured is less than 32. Legacy FW will
continue to send vdev map and tbttoffset list array as part of the TBTT
event.

Extraction API is added to extract the number of vdevs configured for both
legacy and converged FW. Number of vdevs is sent directly by the FW for
extended TBTT offset event but sent as vdev map for the normal TBTT offset
event. In order to handle normal TBTT offset event, extraction API for
normal TBTT event adds logic to convert vdev map into the number of vdevs
configured.

Extraction APIs are added to extract vdev id and tbttoffset information per
vdev that are configured. The vdev id information is sent as vdev map and
tbttoffset list as an array for normal TBTT event and as an array of
structures containing vdev id and tbttoffset in the case of extended TBTT
event. In order to support normal TBTT event based on num vdevs, extraction
API for normal TBTT eventadds logic to determine the vdev id from vdev map
based on the index(running through 1 to total number of vdevs) passed from
the driver.

Brief description of the changes with respect to SWBA
-----------------------------------------------------

Converged FW will send additional information num vdevs and vdev id
embedded in tim info and p2p noa TLVs for SWBA event. Legacy FW will
continue to send vdev map and array of tim info and p2p noa desciptors.

Extraction APIs is added to extract the number of vdevs configured for both
legacy and converged FW. Number of vdevs is sent directly by the FW for
SWBA event in the case of converged FW and as a vdev map in the legacy FW.
In order to handle legacy FW, extraction API for non-TLV adds logic
to convert vdev map into number of vdevs configured.

Extraction APIs are modified to extract newly embedded vdev id information
in tim info and p2p noa descriptors. The vdev id information is sent as
vdev map for legacy. In order to handle legacy FW, extraction API for
non-TLV adds logic to determing the vdev id from vdev map based on the
index (running through 1 to total number of vdevs) passed from the driver.

Change-Id: Ibf84adbb1c526321ec031d5539aff66dcbd1315b
CRs-Fixed: 2053628
Sathish Kumar 8 years ago
parent
commit
b5621e7d20

+ 14 - 3
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);

+ 16 - 0
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_ */

+ 60 - 3
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

+ 72 - 11
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;
 }

+ 54 - 13
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 =

+ 116 - 12
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;
+	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];
 
-	*vdev_map = tbtt_offset_event->vdev_map;
-	*tbttoffset_list = param_buf->tbttoffset_list;
+	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 = &param_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] =