Răsfoiți Sursa

qcacmn: Handle failure during service ready(ext/ext2) handling

Any error during ext/ext2 processing should stop normal init
path and return error. Without this, wrong values are passed
to firmware in WMI init which result in firmware assert.
Add proper handling to take care of failures during svc ready
message processing

Change-Id: Id22714a983d1dc2fe7300a178933cd05bf870a55
CRs-Fixed: 3290131
Shivam Kumar 2 ani în urmă
părinte
comite
52c19ba631

+ 9 - 0
target_if/core/inc/target_if.h

@@ -77,6 +77,13 @@ typedef int (*wmi_legacy_service_ready_callback)(uint32_t event_id,
 						uint8_t *event_data,
 						uint8_t *event_data,
 						uint32_t length);
 						uint32_t length);
 
 
+/* Enum for ext and ext2 processing status */
+enum wmi_init_status {
+	wmi_init_success,
+	wmi_init_ext_processing_failed,
+	wmi_init_ext2_processing_failed,
+};
+
 /**
 /**
  * struct target_if_ctx - target_interface context
  * struct target_if_ctx - target_interface context
  * @magic: magic for target if ctx
  * @magic: magic for target if ctx
@@ -169,6 +176,7 @@ struct target_version_info {
  * @wmi_ready: is ready event received
  * @wmi_ready: is ready event received
  * @total_mac_phy_cnt: num of mac phys
  * @total_mac_phy_cnt: num of mac phys
  * @num_radios: number of radios
  * @num_radios: number of radios
+ * @wmi_service_status: wmi service status success or failed
  * @wlan_init_status: Target init status
  * @wlan_init_status: Target init status
  * @target_type: Target type
  * @target_type: Target type
  * @max_descs: Max descriptors
  * @max_descs: Max descriptors
@@ -200,6 +208,7 @@ struct tgt_info {
 	bool wmi_ready;
 	bool wmi_ready;
 	uint8_t total_mac_phy_cnt;
 	uint8_t total_mac_phy_cnt;
 	uint8_t num_radios;
 	uint8_t num_radios;
+	enum wmi_init_status wmi_service_status;
 	uint32_t wlan_init_status;
 	uint32_t wlan_init_status;
 	uint32_t target_type;
 	uint32_t target_type;
 	uint32_t max_descs;
 	uint32_t max_descs;

+ 25 - 9
target_if/init_deinit/src/init_event_handler.c

@@ -453,6 +453,9 @@ static int init_deinit_service_ext2_ready_event_handler(ol_scn_t scn_handle,
 	}
 	}
 
 
 	info = (&tgt_hdl->info);
 	info = (&tgt_hdl->info);
+	if (info->wmi_service_status ==
+			wmi_init_ext_processing_failed)
+		return -EINVAL;
 
 
 	err_code = init_deinit_populate_service_ready_ext2_param(wmi_handle,
 	err_code = init_deinit_populate_service_ready_ext2_param(wmi_handle,
 								 event, info);
 								 event, info);
@@ -517,9 +520,11 @@ static int init_deinit_service_ext2_ready_event_handler(ol_scn_t scn_handle,
 
 
 	legacy_callback = target_if_get_psoc_legacy_service_ready_cb();
 	legacy_callback = target_if_get_psoc_legacy_service_ready_cb();
 	if (legacy_callback)
 	if (legacy_callback)
-		legacy_callback(wmi_service_ready_ext2_event_id,
-				scn_handle, event, data_len);
-
+		if (legacy_callback(wmi_service_ready_ext2_event_id,
+				    scn_handle, event, data_len)) {
+			target_if_err("Legacy callback return error!");
+			goto exit;
+		}
 	target_if_regulatory_set_ext_tpc(psoc);
 	target_if_regulatory_set_ext_tpc(psoc);
 
 
 	target_if_reg_set_lower_6g_edge_ch_info(psoc);
 	target_if_reg_set_lower_6g_edge_ch_info(psoc);
@@ -531,7 +536,10 @@ static int init_deinit_service_ext2_ready_event_handler(ol_scn_t scn_handle,
 	/* send init command */
 	/* send init command */
 	init_deinit_set_send_init_cmd(psoc, tgt_hdl);
 	init_deinit_set_send_init_cmd(psoc, tgt_hdl);
 
 
+	return 0;
 exit:
 exit:
+	info->wmi_ready = false;
+	info->wmi_service_status = wmi_init_ext2_processing_failed;
 	return err_code;
 	return err_code;
 }
 }
 
 
@@ -582,7 +590,7 @@ static int init_deinit_service_ext_ready_event_handler(ol_scn_t scn_handle,
 			== FALSE) {
 			== FALSE) {
 		target_if_err("Preferred mode %d not supported",
 		target_if_err("Preferred mode %d not supported",
 			      info->preferred_hw_mode);
 			      info->preferred_hw_mode);
-		return -EINVAL;
+		goto exit;
 	}
 	}
 
 
 	num_radios = target_psoc_get_num_radios_for_mode(tgt_hdl,
 	num_radios = target_psoc_get_num_radios_for_mode(tgt_hdl,
@@ -630,9 +638,13 @@ static int init_deinit_service_ext_ready_event_handler(ol_scn_t scn_handle,
 		goto exit;
 		goto exit;
 
 
 	legacy_callback = target_if_get_psoc_legacy_service_ready_cb();
 	legacy_callback = target_if_get_psoc_legacy_service_ready_cb();
-	if (legacy_callback)
-		legacy_callback(wmi_service_ready_ext_event_id,
-				scn_handle, event, data_len);
+	if (legacy_callback) {
+		if (legacy_callback(wmi_service_ready_ext_event_id,
+				    scn_handle, event, data_len)) {
+			target_if_err("Error Code %d", err_code);
+			goto exit;
+		}
+	}
 
 
 	target_if_set_twt_ap_pdev_count(info, tgt_hdl);
 	target_if_set_twt_ap_pdev_count(info, tgt_hdl);
 
 
@@ -646,7 +658,11 @@ static int init_deinit_service_ext_ready_event_handler(ol_scn_t scn_handle,
 		init_deinit_set_send_init_cmd(psoc, tgt_hdl);
 		init_deinit_set_send_init_cmd(psoc, tgt_hdl);
 	}
 	}
 
 
+	return 0;
 exit:
 exit:
+	info->wmi_ready = false;
+	info->wmi_service_status = wmi_init_ext_processing_failed;
+	init_deinit_wakeup_host_wait(psoc, tgt_hdl);
 	return err_code;
 	return err_code;
 }
 }
 
 
@@ -827,7 +843,7 @@ static int init_deinit_ready_event_handler(ol_scn_t scn_handle,
 		if (legacy_callback(wmi_ready_event_id,
 		if (legacy_callback(wmi_ready_event_id,
 				    scn_handle, event, data_len)) {
 				    scn_handle, event, data_len)) {
 			target_if_err("Legacy callback returned error!");
 			target_if_err("Legacy callback returned error!");
-			tgt_hdl->info.wmi_ready = FALSE;
+			tgt_hdl->info.wmi_ready = false;
 			goto exit;
 			goto exit;
 		}
 		}
 
 
@@ -952,7 +968,7 @@ static int init_deinit_ready_event_handler(ol_scn_t scn_handle,
 
 
 out:
 out:
 	target_if_btcoex_cfg_enable(psoc, tgt_hdl, event);
 	target_if_btcoex_cfg_enable(psoc, tgt_hdl, event);
-	tgt_hdl->info.wmi_ready = TRUE;
+	tgt_hdl->info.wmi_ready = true;
 	init_deinit_mlo_update_pdev_ready(psoc, num_radios);
 	init_deinit_mlo_update_pdev_ready(psoc, num_radios);
 exit:
 exit:
 	init_deinit_wakeup_host_wait(psoc, tgt_hdl);
 	init_deinit_wakeup_host_wait(psoc, tgt_hdl);