summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKomal Seelam <kseelam@qti.qualcomm.com>2016-08-03 15:28:26 +0530
committerAnjaneedevi Kapparapu <akappa@codeaurora.org>2016-08-12 18:21:28 +0530
commitbc18245c3fa13ccb871ad0a16bb81a88beba3a8d (patch)
tree472d8a6aa07368527657da41e4934afbf066d9b9
parenteedde0af685815ace2f5878a216a66cf3cad4a69 (diff)
qcacld-2.0: Add NL event to indicate SSR shutdown is triggered
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
-rw-r--r--CORE/HDD/inc/wlan_hdd_main.h2
-rw-r--r--CORE/HDD/src/wlan_hdd_early_suspend.c25
-rw-r--r--CORE/HDD/src/wlan_hdd_main.c1
-rw-r--r--CORE/SERVICES/BMI/ol_fw.c1
-rw-r--r--CORE/SVC/external/wlan_nlink_common.h1
-rw-r--r--CORE/VOSS/inc/vos_api.h2
-rw-r--r--CORE/VOSS/src/vos_api.c12
7 files changed, 42 insertions, 2 deletions
diff --git a/CORE/HDD/inc/wlan_hdd_main.h b/CORE/HDD/inc/wlan_hdd_main.h
index 8d998a205dfd..e3a0e00cdfd0 100644
--- a/CORE/HDD/inc/wlan_hdd_main.h
+++ b/CORE/HDD/inc/wlan_hdd_main.h
@@ -2247,6 +2247,6 @@ int hdd_reassoc(hdd_adapter_t *pAdapter, const tANI_U8 *bssid,
void hdd_sap_restart_handle(struct work_struct *work);
void hdd_set_rps_cpu_mask(hdd_context_t *hdd_ctx);
-
void hdd_initialize_adapter_common(hdd_adapter_t *adapter);
+void hdd_svc_fw_shutdown_ind(struct device *dev);
#endif // end #if !defined( WLAN_HDD_MAIN_H )
diff --git a/CORE/HDD/src/wlan_hdd_early_suspend.c b/CORE/HDD/src/wlan_hdd_early_suspend.c
index e62ddd1a772b..1e720d4a2b05 100644
--- a/CORE/HDD/src/wlan_hdd_early_suspend.c
+++ b/CORE/HDD/src/wlan_hdd_early_suspend.c
@@ -1946,6 +1946,31 @@ 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)
+{
+ v_CONTEXT_t g_context;
+ hdd_context_t *hdd_ctx;
+
+ g_context = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
+
+ if(!g_context)
+ return;
+
+ hdd_ctx = (hdd_context_t *)vos_get_context(VOS_MODULE_ID_HDD,
+ g_context);
+
+ hdd_ctx ? wlan_hdd_send_svc_nlink_msg(hdd_ctx->radio_index,
+ WLAN_SVC_FW_SHUTDOWN_IND,
+ NULL, 0) : 0;
+}
+
/* the HDD interface to WLAN driver shutdown,
* the primary shutdown function in SSR
*/
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index b4f5b71f1428..a34d971d8390 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -17130,6 +17130,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:
diff --git a/CORE/SERVICES/BMI/ol_fw.c b/CORE/SERVICES/BMI/ol_fw.c
index a2e81e351cec..af7add647bb0 100644
--- a/CORE/SERVICES/BMI/ol_fw.c
+++ b/CORE/SERVICES/BMI/ol_fw.c
@@ -1502,6 +1502,7 @@ void ol_target_failure(void *instance, A_STATUS status)
return;
#if defined(CONFIG_CNSS) || defined(HIF_SDIO)
+ vos_svc_fw_shutdown_ind(scn->adf_dev->dev);
/* Collect the RAM dump through a workqueue */
if (scn->enableRamdumpCollection)
ol_schedule_ramdump_work(scn);
diff --git a/CORE/SVC/external/wlan_nlink_common.h b/CORE/SVC/external/wlan_nlink_common.h
index 0dd626479352..0b3604cbc43e 100644
--- a/CORE/SVC/external/wlan_nlink_common.h
+++ b/CORE/SVC/external/wlan_nlink_common.h
@@ -100,6 +100,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
diff --git a/CORE/VOSS/inc/vos_api.h b/CORE/VOSS/inc/vos_api.h
index 8783790bf14d..191b3cee5f48 100644
--- a/CORE/VOSS/inc/vos_api.h
+++ b/CORE/VOSS/inc/vos_api.h
@@ -376,5 +376,5 @@ void vos_set_fatal_event(bool value);
void vos_pkt_stats_to_logger_thread(void *pl_hdr, void *pkt_dump, void *data);
int vos_get_radio_index(void);
int vos_set_radio_index(int radio_index);
-
+void vos_svc_fw_shutdown_ind(struct device *dev);
#endif // if !defined __VOS_API_H
diff --git a/CORE/VOSS/src/vos_api.c b/CORE/VOSS/src/vos_api.c
index 127cde642488..01e241b72bb0 100644
--- a/CORE/VOSS/src/vos_api.c
+++ b/CORE/VOSS/src/vos_api.c
@@ -3064,3 +3064,15 @@ int vos_set_radio_index(int radio_index)
gpVosContext->radio_index = radio_index;
return 0;
}
+
+/**
+ * vos_svc_fw_shutdown_ind() - API to send userspace about FW crash
+ *
+ * @data: Device Pointer
+ *
+ * Return: None
+*/
+void vos_svc_fw_shutdown_ind(struct device *dev)
+{
+ hdd_svc_fw_shutdown_ind(dev);
+}