wlan: Changes to reduce roaming delay with logging enabled

Optimized locking during sending the log messages to app.
Store the logs into the logging buffere even whe there is no
logger app running so that it can be used for triaging in case
of any stability issue.

Change-Id: I982a5da9e5f61c295d225aa7d14792ea118f955c
CRs-Fixed: 649515
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index 4cbf81f..fb1616a 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -7739,7 +7739,7 @@
 #endif /* WLAN_KD_READY_NOTIFIER */
 
 #ifdef WLAN_LOGGING_SOCK_SVC_ENABLE
-   if(pHddCtx->cfg_ini->wlanLoggingEnable)
+   if (pHddCtx->cfg_ini->wlanLoggingEnable)
    {
        wlan_logging_sock_deactivate_svc();
    }
@@ -9043,6 +9043,10 @@
    vos_wconn_trace_init();
 #endif
 
+#ifdef WLAN_LOGGING_SOCK_SVC_ENABLE
+   wlan_logging_sock_init_svc();
+#endif
+
    ENTER();
 
 #ifdef WLAN_OPEN_SOURCE
@@ -9062,6 +9066,11 @@
 #ifdef WLAN_OPEN_SOURCE
       wake_lock_destroy(&wlan_wake_lock);
 #endif
+
+#ifdef WLAN_LOGGING_SOCK_SVC_ENABLE
+      wlan_logging_sock_deinit_svc();
+#endif
+
       return -EIO;
    }
 
@@ -9083,6 +9092,11 @@
 #ifdef WLAN_OPEN_SOURCE
       wake_lock_destroy(&wlan_wake_lock);
 #endif
+
+#ifdef WLAN_LOGGING_SOCK_SVC_ENABLE
+      wlan_logging_sock_deinit_svc();
+#endif
+
       return -ENODEV;
    }
 #endif
@@ -9160,6 +9174,11 @@
 #ifdef WLAN_OPEN_SOURCE
       wake_lock_destroy(&wlan_wake_lock);
 #endif
+
+#ifdef WLAN_LOGGING_SOCK_SVC_ENABLE
+      wlan_logging_sock_deinit_svc();
+#endif
+
       pr_err("%s: driver load failure\n", WLAN_MODULE_NAME);
    }
    else
@@ -9274,10 +9293,15 @@
    vos_wconn_trace_exit();
 #endif
 
+#ifdef WLAN_LOGGING_SOCK_SVC_ENABLE
+   wlan_logging_sock_deinit_svc();
+#endif
+
 done:
 #ifdef WLAN_OPEN_SOURCE
    wake_lock_destroy(&wlan_wake_lock);
 #endif
+
    pr_info("%s: driver unloaded\n", WLAN_MODULE_NAME);
 }
 
diff --git a/CORE/SVC/inc/wlan_logging_sock_svc.h b/CORE/SVC/inc/wlan_logging_sock_svc.h
index de70f28..602df23 100644
--- a/CORE/SVC/inc/wlan_logging_sock_svc.h
+++ b/CORE/SVC/inc/wlan_logging_sock_svc.h
@@ -39,6 +39,8 @@
 #include <vos_trace.h>
 #include <wlan_nlink_common.h>
 
+int wlan_logging_sock_init_svc(void);
+int wlan_logging_sock_deinit_svc(void);
 int wlan_logging_sock_activate_svc(int log_fe_to_console, int num_buf);
 int wlan_logging_sock_deactivate_svc(void);
 int wlan_log_to_user(VOS_TRACE_LEVEL log_level, char *to_be_sent, int length);
diff --git a/CORE/SVC/src/logging/wlan_logging_sock_svc.c b/CORE/SVC/src/logging/wlan_logging_sock_svc.c
index 5f0721e..c9ba36c 100644
--- a/CORE/SVC/src/logging/wlan_logging_sock_svc.c
+++ b/CORE/SVC/src/logging/wlan_logging_sock_svc.c
@@ -206,10 +206,12 @@
 		 */
 		gwlan_logging.pcur_node =
 			(struct log_msg *)(gwlan_logging.filled_list.next);
-		pr_err("%s: drop_count = %u index = %d filled_length = %d\n",
-			__func__, ++gwlan_logging.drop_count,
-			gwlan_logging.pcur_node->index,
-			gwlan_logging.pcur_node->filled_length);
+		if (gapp_pid != INVALID_PID) {
+			pr_err("%s: drop_count = %u index = %d filled_length = %d\n",
+				__func__, ++gwlan_logging.drop_count,
+				gwlan_logging.pcur_node->index,
+				gwlan_logging.pcur_node->filled_length);
+		}
 		list_del_init(gwlan_logging.filled_list.next);
 		ret = 1;
 	}
@@ -243,7 +245,6 @@
 		 * messages.
 		 */
 		pr_info("%s\n", to_be_sent);
-		return -EIO;
 	}
 
 	/* Format the Log time [Secondselapsedinaday.microseconds] */
@@ -256,6 +257,12 @@
 	total_log_len = length + tlen + 1 + 1;
 
 	spin_lock_irqsave(&gwlan_logging.spin_lock, flags);
+	// wlan logging svc resources are not yet initialized
+	if (!gwlan_logging.pcur_node) {
+		spin_unlock_irqrestore(&gwlan_logging.spin_lock, flags);
+		return -EIO;
+	}
+
 	pfilled_length = &gwlan_logging.pcur_node->filled_length;
 
 	 /* Check if we can accomodate more log into current node/buffer */
@@ -291,10 +298,11 @@
 	spin_unlock_irqrestore(&gwlan_logging.spin_lock, flags);
 
 	/* Wakeup logger thread */
-	if (true == wake_up_thread)
+	if ((true == wake_up_thread) && (gapp_pid != INVALID_PID))
 		wake_up_interruptible(&gwlan_logging.wait_queue);
 
-	if (gwlan_logging.log_fe_to_console
+	if ((gapp_pid != INVALID_PID)
+		&& gwlan_logging.log_fe_to_console
 		&& ((VOS_TRACE_LEVEL_FATAL == log_level)
 		|| (VOS_TRACE_LEVEL_ERROR == log_level))) {
 		pr_info("%s\n", to_be_sent);
@@ -331,6 +339,7 @@
 		plog_msg = (struct log_msg *)
 			(gwlan_logging.filled_list.next);
 		list_del_init(gwlan_logging.filled_list.next);
+		spin_unlock_irqrestore(&gwlan_logging.spin_lock, flags);
 		/* 4 extra bytes for the radio idx */
 		payload_len = plog_msg->filled_length +
 			sizeof(wnl->radio) + sizeof(tAniHdr);
@@ -340,6 +349,7 @@
 				ANI_NL_MSG_LOG, payload_len,
 				NLM_F_REQUEST);
 		if (NULL == nlh) {
+			spin_lock_irqsave(&gwlan_logging.spin_lock, flags);
 			list_add_tail(&plog_msg->node,
 				&gwlan_logging.free_list);
 			spin_unlock_irqrestore(&gwlan_logging.spin_lock,
@@ -503,8 +513,6 @@
 	gwlan_logging.log_fe_to_console = !!log_fe_to_console;
 	gwlan_logging.num_buf = num_buf;
 
-	spin_lock_init(&gwlan_logging.spin_lock);
-
 	spin_lock_irqsave(&gwlan_logging.spin_lock, irq_flag);
 	INIT_LIST_HEAD(&gwlan_logging.free_list);
 	INIT_LIST_HEAD(&gwlan_logging.filled_list);
@@ -526,7 +534,11 @@
 	if (IS_ERR(gwlan_logging.thread)) {
 		pr_err("%s: Could not Create LogMsg Thread Controller",
 		       __func__);
+		spin_lock_irqsave(&gwlan_logging.spin_lock, irq_flag);
 		vfree(gplog_msg);
+		gplog_msg = NULL;
+		gwlan_logging.pcur_node = NULL;
+		spin_unlock_irqrestore(&gwlan_logging.spin_lock, irq_flag);
 		return -ENOMEM;
 	}
 	wake_up_process(gwlan_logging.thread);
@@ -539,6 +551,10 @@
 
 int wlan_logging_sock_deactivate_svc(void)
 {
+	unsigned long irq_flag;
+
+	if (!gplog_msg)
+		return 0;
 
 	nl_srv_unregister(ANI_NL_MSG_LOG, wlan_logging_proc_sock_rx_msg);
 	clear_default_logtoapp_log_level();
@@ -549,11 +565,30 @@
 	wake_up_interruptible(&gwlan_logging.wait_queue);
 	wait_for_completion_interruptible(&gwlan_logging.shutdown_comp);
 
+	spin_lock_irqsave(&gwlan_logging.spin_lock, irq_flag);
 	vfree(gplog_msg);
+	gwlan_logging.pcur_node = NULL;
+	spin_unlock_irqrestore(&gwlan_logging.spin_lock, irq_flag);
 
 	pr_info("%s: Deactivate wlan_logging svc\n", __func__);
 
 	return 0;
 }
 
+int wlan_logging_sock_init_svc(void)
+{
+	spin_lock_init(&gwlan_logging.spin_lock);
+	gapp_pid = INVALID_PID;
+	gwlan_logging.pcur_node = NULL;
+
+	return 0;
+}
+
+int wlan_logging_sock_deinit_svc(void)
+{
+	gwlan_logging.pcur_node = NULL;
+	gapp_pid = INVALID_PID;
+
+       return 0;
+}
 #endif /* WLAN_LOGGING_SOCK_SVC_ENABLE */