Browse Source

qcacld-3.0: Add NL event to indicate SSR shutdown is triggered

propagation from qcacld-2.0 to qcacld-3.0.

On Dual-WiFi Platforms, Radio Device 1 (R1 - SDIO interface) should
be functional only if Radio Device 0 (R0 - PCIe interface) is active.
If SSR is indentified on R0, indicate userspace application to unload
R1 on this event and Reload R1 once R0 SSR and reload is complete.

CRs-Fixed: 1046397
Change-Id: I8a06b569fe536bb93dbb37bdb289295bfce62f6e
Komal Seelam 8 years ago
parent
commit
78ff65a8c6

+ 2 - 0
core/bmi/src/ol_fw.c

@@ -593,6 +593,7 @@ void ol_target_failure(void *instance, QDF_STATUS status)
 	struct hif_opaque_softc *scn = ol_ctx->scn;
 	tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA);
 	struct ol_config_info *ini_cfg = ol_get_ini_handle(ol_ctx);
+	qdf_device_t qdf_dev = ol_ctx->qdf_dev;
 	int ret;
 	enum hif_target_status target_status = hif_get_target_status(scn);
 
@@ -640,6 +641,7 @@ void ol_target_failure(void *instance, QDF_STATUS status)
 
 	BMI_ERR("XXX TARGET ASSERTED XXX");
 
+	cds_svc_fw_shutdown_ind(qdf_dev->dev);
 	/* Collect the RAM dump through a workqueue */
 	if (ini_cfg->enable_ramdump_collection)
 		qdf_sched_work(0, &ol_ctx->ramdump_work);

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

@@ -264,7 +264,7 @@ QDF_STATUS cds_flush_logs(uint32_t is_fatal,
 		bool dump_mac_trace,
 		bool recovery_needed);
 void cds_logging_set_fw_flush_complete(void);
-
+void cds_svc_fw_shutdown_ind(struct device *dev);
 #ifdef FEATURE_WLAN_DIAG_SUPPORT
 void cds_tdls_tx_rx_mgmt_event(uint8_t event_id, uint8_t tx_rx,
 			uint8_t type, uint8_t sub_type, uint8_t *peer_mac);

+ 11 - 0
core/cds/src/cds_api.c

@@ -2323,3 +2323,14 @@ bool cds_is_sub_20_mhz_enabled(void)
 	return false;
 }
 
+/**
+ * cds_svc_fw_shutdown_ind() - API to send userspace about FW crash
+ *
+ * @dev: Device Pointer
+ *
+ * Return: None
+ */
+void cds_svc_fw_shutdown_ind(struct device *dev)
+{
+	hdd_svc_fw_shutdown_ind(dev);
+}

+ 1 - 1
core/hdd/inc/wlan_hdd_main.h

@@ -1819,7 +1819,7 @@ QDF_STATUS hdd_sme_close_session_callback(void *pContext);
 
 int hdd_reassoc(hdd_adapter_t *adapter, const uint8_t *bssid,
 		const uint8_t channel, const handoff_src src);
-
+void hdd_svc_fw_shutdown_ind(struct device *dev);
 int hdd_register_cb(hdd_context_t *hdd_ctx);
 void hdd_deregister_cb(hdd_context_t *hdd_ctx);
 int hdd_start_station_adapter(hdd_adapter_t *adapter);

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

@@ -8168,6 +8168,7 @@ void wlan_hdd_send_svc_nlink_msg(int radio, int type, void *data, int len)
 
 	switch (type) {
 	case WLAN_SVC_FW_CRASHED_IND:
+	case WLAN_SVC_FW_SHUTDOWN_IND:
 	case WLAN_SVC_LTE_COEX_IND:
 	case WLAN_SVC_WLAN_AUTO_SHUTDOWN_IND:
 	case WLAN_SVC_WLAN_AUTO_SHUTDOWN_CANCEL_IND:

+ 24 - 0
core/hdd/src/wlan_hdd_power.c

@@ -1384,6 +1384,30 @@ static void hdd_ssr_timer_start(int msec)
 	ssr_timer_started = true;
 }
 
+/**
+ * hdd_svc_fw_shutdown_ind() - API to send FW SHUTDOWN IND to Userspace
+ *
+ * @dev: Device Pointer
+ *
+ * Return: None
+ */
+void hdd_svc_fw_shutdown_ind(struct device *dev)
+{
+	hdd_context_t *hdd_ctx;
+	v_CONTEXT_t g_context;
+
+	g_context = cds_get_global_context();
+
+	if (!g_context)
+		return;
+
+	hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD);
+
+	hdd_ctx ? wlan_hdd_send_svc_nlink_msg(hdd_ctx->radio_index,
+					      WLAN_SVC_FW_SHUTDOWN_IND,
+					      NULL, 0) : 0;
+}
+
 /**
  * hdd_wlan_shutdown() - HDD SSR shutdown function
  *

+ 1 - 0
core/utils/nlink/inc/wlan_nlink_common.h

@@ -85,6 +85,7 @@
 #define WLAN_SVC_WLAN_TP_TX_IND     0x10B
 #define WLAN_SVC_WLAN_AUTO_SHUTDOWN_CANCEL_IND 0x10C
 #define WLAN_SVC_WLAN_RADIO_INDEX 0x10D
+#define WLAN_SVC_FW_SHUTDOWN_IND  0x10E
 #define WLAN_SVC_MAX_SSID_LEN    32
 #define WLAN_SVC_MAX_BSSID_LEN   6
 #define WLAN_SVC_MAX_STR_LEN     16