Jelajahi Sumber

qcacld-3.0: Trigger BUG ON only if recovery is disabled

When firmware event times out, panic only if recovery is disabled else
return failure so that driver load can fail gracefully.

Change-Id: I90d110af370842fcd2bc8cc11008d1524c99332e
CRs-Fixed: 1077315
Naveen Rawat 8 tahun lalu
induk
melakukan
91df30a191

+ 1 - 0
core/cds/inc/cds_api.h

@@ -291,4 +291,5 @@ struct cds_config_info *cds_get_ini_config(void);
 bool cds_is_5_mhz_enabled(void);
 bool cds_is_10_mhz_enabled(void);
 bool cds_is_sub_20_mhz_enabled(void);
+bool cds_is_self_recovery_enabled(void);
 #endif /* if !defined __CDS_API_H */

+ 1 - 0
core/cds/inc/cds_config.h

@@ -147,5 +147,6 @@ struct cds_config_info {
 	uint16_t self_gen_frm_pwr;
 	enum cfg_sub_20_channel_width sub_20_channel_width;
 	bool flow_steering_enabled;
+	bool self_recovery_enabled;
 };
 #endif /* !defined( __CDS_CONFIG_H ) */

+ 29 - 1
core/cds/src/cds_api.c

@@ -520,7 +520,14 @@ QDF_STATUS cds_pre_enable(v_CONTEXT_t cds_context)
 	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 		QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_FATAL,
 			  "Failed to get ready event from target firmware");
-		QDF_BUG(0);
+		/*
+		 * Panic only if recovery is disabled, else return failure so
+		 * that driver load can fail gracefully. We cannot trigger self
+		 * recovery here because driver is not fully loaded yet.
+		 */
+		if (!cds_is_self_recovery_enabled())
+			QDF_BUG(0);
+
 		htc_stop(gp_cds_context->htc_ctx);
 		return QDF_STATUS_E_FAILURE;
 	}
@@ -2254,6 +2261,27 @@ bool cds_is_sub_20_mhz_enabled(void)
 	return false;
 }
 
+/**
+ * cds_is_self_recovery_enabled() - API to get self recovery enabled
+ *
+ * Return: true if self recovery enabled, false otherwise
+ */
+bool cds_is_self_recovery_enabled(void)
+{
+	p_cds_contextType p_cds_context;
+
+	p_cds_context = cds_get_context(QDF_MODULE_ID_QDF);
+	if (!p_cds_context) {
+		cds_err("%s: cds context is invalid", __func__);
+		return false;
+	}
+
+	if (p_cds_context->cds_cfg)
+		return p_cds_context->cds_cfg->self_recovery_enabled;
+
+	return false;
+}
+
 /**
  * cds_svc_fw_shutdown_ind() - API to send userspace about FW crash
  *

+ 1 - 0
core/hdd/src/wlan_hdd_main.c

@@ -6964,6 +6964,7 @@ static int hdd_update_cds_config(hdd_context_t *hdd_ctx)
 	cds_cfg->max_station = hdd_ctx->config->maxNumberOfPeers;
 	cds_cfg->sub_20_channel_width = WLAN_SUB_20_CH_WIDTH_NONE;
 	cds_cfg->flow_steering_enabled = hdd_ctx->config->flow_steering_enable;
+	cds_cfg->self_recovery_enabled = hdd_ctx->config->enableSelfRecovery;
 
 	hdd_ra_populate_cds_config(cds_cfg, hdd_ctx);
 	hdd_txrx_populate_cds_config(cds_cfg, hdd_ctx);