Explorar o código

qcacmn: Add WMI params for MLO link state query

New TLVs for MLO link state information is introduced for
get link info command. Add WMI changes to add these TLV in
get link info command

Change-Id: Ib8d12a727ac6f59257dcce69174271330a065c77
CRs-Fixed: 3431076
Aasir Rasheed %!s(int64=2) %!d(string=hai) anos
pai
achega
7962020d77

+ 20 - 0
wmi/inc/wmi_unified_11be_api.h

@@ -142,6 +142,14 @@ QDF_STATUS wmi_send_mlo_peer_tid_to_link_map_cmd(
 QDF_STATUS wmi_send_mlo_vdev_tid_to_link_map_cmd(
 QDF_STATUS wmi_send_mlo_vdev_tid_to_link_map_cmd(
 		wmi_unified_t wmi,
 		wmi_unified_t wmi,
 		struct wmi_host_tid_to_link_map_ap_params *params);
 		struct wmi_host_tid_to_link_map_ap_params *params);
+/**
+ * wmi_send_mlo_link_state_request_cmd - send mlo link status command
+ * @wmi: wmi handle
+ * @params: Pointer to link state params
+ */
+QDF_STATUS wmi_send_mlo_link_state_request_cmd(
+		wmi_unified_t wmi,
+		struct wmi_host_link_state_params *params);
 
 
 /**
 /**
  * wmi_extract_mlo_vdev_tid_to_link_map_event() - extract mlo t2lm info for vdev
  * wmi_extract_mlo_vdev_tid_to_link_map_event() - extract mlo t2lm info for vdev
@@ -174,6 +182,18 @@ wmi_extract_mlo_vdev_bcast_tid_to_link_map_event(
 				     wmi_unified_t wmi,
 				     wmi_unified_t wmi,
 				     void *evt_buf,
 				     void *evt_buf,
 				     struct mlo_bcast_t2lm_info *bcast);
 				     struct mlo_bcast_t2lm_info *bcast);
+
+/**
+ * wmi_extract_mlo_link_state_info_event - extract mlo link status info
+ * @wmi: wmi handle
+ * @evt_buf: pointer to event buffer
+ * @params: pointer to host struct to get mlo link state
+ */
+QDF_STATUS wmi_extract_mlo_link_state_info_event(
+			wmi_unified_t wmi,
+			void *evt_buf,
+			struct ml_link_state_info_event *params);
+
 #endif /* WLAN_FEATURE_11BE */
 #endif /* WLAN_FEATURE_11BE */
 
 
 #endif /*_WMI_UNIFIED_11BE_API_H_*/
 #endif /*_WMI_UNIFIED_11BE_API_H_*/

+ 14 - 0
wmi/inc/wmi_unified_param.h

@@ -1191,6 +1191,17 @@ struct wmi_host_tid_to_link_map_resp {
 	enum wlan_t2lm_status status;
 	enum wlan_t2lm_status status;
 	uint8_t mapping_switch_tsf;
 	uint8_t mapping_switch_tsf;
 };
 };
+
+/**
+ * struct wmi_host_link_state_params - MLO link state params
+ * @vdev_id: Vdev id
+ * @mld_mac: mld mac address
+ */
+struct wmi_host_link_state_params {
+	uint8_t vdev_id;
+	uint8_t mld_mac[QDF_MAC_ADDR_SIZE];
+};
+
 #endif /* WLAN_FEATURE_11BE */
 #endif /* WLAN_FEATURE_11BE */
 
 
 #ifdef WLAN_FEATURE_11BE_MLO
 #ifdef WLAN_FEATURE_11BE_MLO
@@ -5279,6 +5290,9 @@ typedef enum {
 	wmi_vdev_standalone_sound_complete_eventid,
 	wmi_vdev_standalone_sound_complete_eventid,
 #endif
 #endif
 	wmi_csa_ie_received_event_id,
 	wmi_csa_ie_received_event_id,
+#ifdef WLAN_FEATURE_11BE_MLO
+	wmi_mlo_link_state_info_eventid,
+#endif
 	wmi_events_max,
 	wmi_events_max,
 } wmi_conv_event_id;
 } wmi_conv_event_id;
 
 

+ 10 - 0
wmi/inc/wmi_unified_priv.h

@@ -3165,6 +3165,11 @@ QDF_STATUS
 QDF_STATUS (*extract_quiet_offload_event)(
 QDF_STATUS (*extract_quiet_offload_event)(
 				wmi_unified_t wmi_handle, void *evt_buf,
 				wmi_unified_t wmi_handle, void *evt_buf,
 				struct vdev_sta_quiet_event *quiet_event);
 				struct vdev_sta_quiet_event *quiet_event);
+
+QDF_STATUS (*extract_mlo_link_state_event)(
+				struct wmi_unified *wmi_handle,
+				void *buf,
+				struct ml_link_state_info_event *params);
 #endif
 #endif
 
 
 #ifdef WLAN_SUPPORT_PPEDS
 #ifdef WLAN_SUPPORT_PPEDS
@@ -3187,6 +3192,10 @@ QDF_STATUS (*send_mlo_vdev_tid_to_link_map)(
 			wmi_unified_t wmi_handle,
 			wmi_unified_t wmi_handle,
 			struct wmi_host_tid_to_link_map_ap_params *params);
 			struct wmi_host_tid_to_link_map_ap_params *params);
 
 
+QDF_STATUS (*send_mlo_link_state_request)(
+			wmi_unified_t wmi_handle,
+			struct wmi_host_link_state_params *params);
+
 QDF_STATUS (*extract_mlo_vdev_tid_to_link_map_event)(
 QDF_STATUS (*extract_mlo_vdev_tid_to_link_map_event)(
 		struct wmi_unified *wmi_handle,
 		struct wmi_unified *wmi_handle,
 		uint8_t *buf,
 		uint8_t *buf,
@@ -3196,6 +3205,7 @@ QDF_STATUS (*extract_mlo_vdev_bcast_tid_to_link_map_event)(
 			struct wmi_unified *wmi_handle,
 			struct wmi_unified *wmi_handle,
 			void *buf,
 			void *buf,
 			struct mlo_bcast_t2lm_info *bcast_info);
 			struct mlo_bcast_t2lm_info *bcast_info);
+
 #endif /* WLAN_FEATURE_11BE */
 #endif /* WLAN_FEATURE_11BE */
 
 
 QDF_STATUS
 QDF_STATUS

+ 21 - 0
wmi/src/wmi_unified_11be_api.c

@@ -81,6 +81,15 @@ QDF_STATUS wmi_send_mlo_vdev_tid_to_link_map_cmd(
 	return QDF_STATUS_E_FAILURE;
 	return QDF_STATUS_E_FAILURE;
 }
 }
 
 
+QDF_STATUS wmi_send_mlo_link_state_request_cmd(
+		wmi_unified_t wmi,
+		struct wmi_host_link_state_params *params)
+{
+	if (wmi->ops->send_mlo_link_state_request)
+		return wmi->ops->send_mlo_link_state_request(wmi, params);
+	return QDF_STATUS_E_FAILURE;
+}
+
 QDF_STATUS
 QDF_STATUS
 wmi_extract_mlo_vdev_tid_to_link_map_event(
 wmi_extract_mlo_vdev_tid_to_link_map_event(
 		wmi_unified_t wmi, void *evt_buf,
 		wmi_unified_t wmi, void *evt_buf,
@@ -108,6 +117,18 @@ wmi_extract_mlo_vdev_bcast_tid_to_link_map_event(
 	}
 	}
 	return QDF_STATUS_E_FAILURE;
 	return QDF_STATUS_E_FAILURE;
 }
 }
+
+QDF_STATUS wmi_extract_mlo_link_state_info_event(
+		wmi_unified_t wmi,
+		void *evt_buf,
+		struct ml_link_state_info_event *params)
+{
+	if (wmi->ops->extract_mlo_link_state_event)
+		return wmi->ops->extract_mlo_link_state_event(
+				wmi, evt_buf, params);
+	return QDF_STATUS_E_FAILURE;
+}
+
 #endif /* WLAN_FEATURE_11BE */
 #endif /* WLAN_FEATURE_11BE */
 
 
 QDF_STATUS
 QDF_STATUS

+ 101 - 0
wmi/src/wmi_unified_11be_tlv.c

@@ -1026,6 +1026,103 @@ static uint8_t *populate_link_control_tlv(
 }
 }
 #endif
 #endif
 
 
+static QDF_STATUS
+send_link_state_request_cmd_tlv(wmi_unified_t wmi_handle,
+				struct wmi_host_link_state_params *params)
+{
+	wmi_mlo_vdev_get_link_info_cmd_fixed_param *cmd;
+	wmi_buf_t buf;
+	uint8_t *buf_ptr;
+	QDF_STATUS ret = QDF_STATUS_SUCCESS;
+	uint32_t buf_len = 0;
+
+	buf_len = sizeof(wmi_mlo_vdev_get_link_info_cmd_fixed_param);
+
+	buf = wmi_buf_alloc(wmi_handle, buf_len);
+	if (!buf) {
+		wmi_err("wmi buf alloc failed for vdev id %d while link state cmd send: ",
+			params->vdev_id);
+		return QDF_STATUS_E_NOMEM;
+	}
+
+	buf_ptr = (uint8_t *)wmi_buf_data(buf);
+	cmd = (wmi_mlo_vdev_get_link_info_cmd_fixed_param *)buf_ptr;
+
+	WMITLV_SET_HDR(
+		&cmd->tlv_header,
+		WMITLV_TAG_STRUC_wmi_mlo_vdev_get_link_info_cmd_fixed_param,
+		WMITLV_GET_STRUCT_TLVLEN(
+		wmi_mlo_vdev_get_link_info_cmd_fixed_param));
+
+	cmd->vdev_id = params->vdev_id;
+	WMI_CHAR_ARRAY_TO_MAC_ADDR(params->mld_mac, &cmd->mld_macaddr);
+	buf_ptr += sizeof(wmi_mlo_vdev_get_link_info_cmd_fixed_param);
+	wmi_mtrace(WMI_MLO_VDEV_GET_LINK_INFO_CMDID, cmd->vdev_id, 0);
+	ret = wmi_unified_cmd_send(wmi_handle, buf, buf_len,
+				   WMI_MLO_VDEV_GET_LINK_INFO_CMDID);
+	if (ret) {
+		wmi_err("Failed to send ml link state command to FW: %d vdev id %d",
+			ret, cmd->vdev_id);
+		wmi_buf_free(buf);
+	}
+	return ret;
+}
+
+static QDF_STATUS
+extract_mlo_link_state_event_tlv(struct wmi_unified *wmi_handle,
+				 void *buf,
+				 struct  ml_link_state_info_event *params)
+{
+	WMI_MLO_VDEV_LINK_INFO_EVENTID_param_tlvs *param_buf;
+	wmi_mlo_vdev_link_info_event_fixed_param *ev;
+	wmi_mlo_vdev_link_info  *link_info = NULL;
+	int num_info = 0;
+	uint8_t *mld_addr;
+	uint32_t num_link_info = 0;
+
+	param_buf = (WMI_MLO_VDEV_LINK_INFO_EVENTID_param_tlvs *)buf;
+
+	if (!param_buf) {
+		wmi_err_rl("Param_buf is NULL");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	ev = (wmi_mlo_vdev_link_info_event_fixed_param *)
+	param_buf->fixed_param;
+	link_info = (wmi_mlo_vdev_link_info *)param_buf->mlo_vdev_link_info;
+
+	num_link_info = param_buf->num_mlo_vdev_link_info;
+	params->status = ev->status;
+	params->vdev_id = ev->vdev_id;
+	params->hw_mode_index = ev->hw_mode_index;
+	params->num_mlo_vdev_link_info = num_link_info;
+	mld_addr = params->mldaddr.bytes;
+	WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->mld_macaddr, mld_addr);
+
+	if (params->num_mlo_vdev_link_info > WLAN_MLO_MAX_VDEVS) {
+		wmi_err_rl("Invalid number of vdev link info");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	for (num_info = 0; num_info < num_link_info; num_info++) {
+		params->link_info[num_info].vdev_id =
+		WMI_MLO_VDEV_LINK_INFO_GET_VDEVID(link_info->link_info);
+
+		params->link_info[num_info].link_id =
+		WMI_MLO_VDEV_LINK_INFO_GET_LINKID(link_info->link_info);
+
+		params->link_info[num_info].link_status =
+		WMI_MLO_VDEV_LINK_INFO_GET_LINK_STATUS(link_info->link_info);
+
+		params->link_info[num_info].chan_freq =
+		link_info->chan_freq;
+
+		link_info++;
+	}
+
+	return QDF_STATUS_SUCCESS;
+}
+
 static QDF_STATUS send_mlo_peer_tid_to_link_map_cmd_tlv(
 static QDF_STATUS send_mlo_peer_tid_to_link_map_cmd_tlv(
 		wmi_unified_t wmi_handle,
 		wmi_unified_t wmi_handle,
 		struct wmi_host_tid_to_link_map_params *params,
 		struct wmi_host_tid_to_link_map_params *params,
@@ -1684,10 +1781,14 @@ void wmi_11be_attach_tlv(wmi_unified_t wmi_handle)
 		send_mlo_peer_tid_to_link_map_cmd_tlv;
 		send_mlo_peer_tid_to_link_map_cmd_tlv;
 	ops->send_mlo_vdev_tid_to_link_map =
 	ops->send_mlo_vdev_tid_to_link_map =
 		send_mlo_vdev_tid_to_link_map_cmd_tlv;
 		send_mlo_vdev_tid_to_link_map_cmd_tlv;
+	ops->send_mlo_link_state_request =
+		send_link_state_request_cmd_tlv;
 	ops->extract_mlo_vdev_tid_to_link_map_event =
 	ops->extract_mlo_vdev_tid_to_link_map_event =
 		extract_mlo_vdev_tid_to_link_map_event_tlv;
 		extract_mlo_vdev_tid_to_link_map_event_tlv;
 	ops->extract_mlo_vdev_bcast_tid_to_link_map_event =
 	ops->extract_mlo_vdev_bcast_tid_to_link_map_event =
 		extract_mlo_vdev_bcast_tid_to_link_map_event_tlv;
 		extract_mlo_vdev_bcast_tid_to_link_map_event_tlv;
+	ops->extract_mlo_link_state_event =
+		extract_mlo_link_state_event_tlv;
 #endif /* WLAN_FEATURE_11BE */
 #endif /* WLAN_FEATURE_11BE */
 	ops->extract_mgmt_rx_ml_cu_params =
 	ops->extract_mgmt_rx_ml_cu_params =
 		extract_mgmt_rx_ml_cu_params_tlv;
 		extract_mgmt_rx_ml_cu_params_tlv;

+ 2 - 0
wmi/src/wmi_unified_tlv.c

@@ -21079,6 +21079,8 @@ static void populate_tlv_events_id_mlo(WMI_EVT_ID *event_ids)
 			WMI_MLO_AP_VDEV_TID_TO_LINK_MAP_EVENTID;
 			WMI_MLO_AP_VDEV_TID_TO_LINK_MAP_EVENTID;
 	event_ids[wmi_mlo_link_removal_eventid] =
 	event_ids[wmi_mlo_link_removal_eventid] =
 			WMI_MLO_LINK_REMOVAL_EVENTID;
 			WMI_MLO_LINK_REMOVAL_EVENTID;
+	event_ids[wmi_mlo_link_state_info_eventid] =
+			WMI_MLO_VDEV_LINK_INFO_EVENTID;
 }
 }
 #else /* WLAN_FEATURE_11BE_MLO */
 #else /* WLAN_FEATURE_11BE_MLO */
 static inline void populate_tlv_events_id_mlo(WMI_EVT_ID *event_ids)
 static inline void populate_tlv_events_id_mlo(WMI_EVT_ID *event_ids)