Fix for the crash in TDLS timers.

Introduce an API wlan_hdd_tdls_timer_restart to start any TDLS
timer. This API make sure that sta and AP connection is present
before restarting TDLS timer.

CRs-Fixed: 464577
Change-Id: Iac76258553f9d8022a54170855dd6b0623c9d1cf
diff --git a/CORE/HDD/src/wlan_hdd_tdls.c b/CORE/HDD/src/wlan_hdd_tdls.c
index 08fefdf..40d1a28 100644
--- a/CORE/HDD/src/wlan_hdd_tdls.c
+++ b/CORE/HDD/src/wlan_hdd_tdls.c
@@ -91,14 +91,14 @@
     }
 
     pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pHddTdlsCtx->pAdapter);
-    if (hdd_connIsConnected( pHddStaCtx ))
-    {
 #ifdef FEATURE_WLAN_TDLS_INTERNAL
-        vos_timer_start(&pHddTdlsCtx->peerDiscoverTimer, discoveryExpiry);
+    wlan_hdd_tdls_timer_restart(pHddTdlsCtx->pAdapter,
+                                &pHddTdlsCtx->peerDiscoverTimer,
+                                discoveryExpiry);
 #endif
-        VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, "beacon rssi: %d",
-                   pHddTdlsCtx->ap_rssi);
-    }
+    VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, "beacon rssi: %d",
+               pHddTdlsCtx->ap_rssi);
+
     if ( mutexLock )
         mutex_unlock(&tdls_lock);
 
@@ -346,8 +346,9 @@
                             VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN,
                                     "Tx/Rx Idle timer start: " MAC_ADDRESS_STR "!",
                                        MAC_ADDR_ARRAY(curr_peer->peerMac));
-                            vos_timer_start( &curr_peer->peerIdleTimer,
-                                        pHddTdlsCtx->threshold_config.idle_timeout_t );
+                            wlan_hdd_tdls_timer_restart(pHddTdlsCtx->pAdapter,
+                                                        &curr_peer->peerIdleTimer,
+                                                        pHddTdlsCtx->threshold_config.idle_timeout_t);
                         }
                     } else {
                         if (VOS_TIMER_STATE_RUNNING ==
@@ -396,8 +397,9 @@
         }
     }
 
-    vos_timer_start( &pHddTdlsCtx->peerUpdateTimer,
-                        pHddTdlsCtx->threshold_config.tx_period_t );
+    wlan_hdd_tdls_timer_restart(pHddTdlsCtx->pAdapter,
+                                &pHddTdlsCtx->peerUpdateTimer,
+                                pHddTdlsCtx->threshold_config.tx_period_t);
     mutex_unlock(&tdls_lock);
 }
 
@@ -617,7 +619,6 @@
     wlan_hdd_tdls_timers_destroy(pHddTdlsCtx);
     wlan_hdd_tdls_free_list(pHddTdlsCtx);
 
-    pHddCtx->tdls_scan_ctxt.magic = 0;
     wlan_hdd_tdls_free_scan_request(&pHddCtx->tdls_scan_ctxt);
 
     vos_mem_free(pHddTdlsCtx);
@@ -1270,11 +1271,13 @@
        wlan_hdd_tdls_check_power_save_prohibited(pHddTdlsCtx->pAdapter);
 
 #ifdef FEATURE_WLAN_TDLS_INTERNAL
-       vos_timer_start(&pHddTdlsCtx->peerDiscoverTimer,
-                       pHddTdlsCtx->threshold_config.discovery_period_t);
+       wlan_hdd_tdls_timer_restart(pHddTdlsCtx->pAdapter,
+                                   &pHddTdlsCtx->peerDiscoverTimer,
+                                   pHddTdlsCtx->threshold_config.discovery_period_t);
 #endif
-       vos_timer_start(&pHddTdlsCtx->peerUpdateTimer,
-                       pHddTdlsCtx->threshold_config.tx_period_t);
+       wlan_hdd_tdls_timer_restart(pHddTdlsCtx->pAdapter,
+                                   &pHddTdlsCtx->peerUpdateTimer,
+                                   pHddTdlsCtx->threshold_config.tx_period_t);
     }
     mutex_unlock(&tdls_lock);
 
@@ -1449,12 +1452,13 @@
 
 
 #ifdef FEATURE_WLAN_TDLS_INTERNAL
-    vos_timer_start(&pHddTdlsCtx->peerDiscoverTimer,
-                    pHddTdlsCtx->threshold_config.discovery_period_t);
+    wlan_hdd_tdls_timer_restart(pHddTdlsCtx->pAdapter,
+                                &pHddTdlsCtx->peerDiscoverTimer,
+                                pHddTdlsCtx->threshold_config.discovery_period_t);
 #endif
-
-    vos_timer_start(&pHddTdlsCtx->peerUpdateTimer,
-                    pHddTdlsCtx->threshold_config.tx_period_t);
+    wlan_hdd_tdls_timer_restart(pHddTdlsCtx->pAdapter,
+                                &pHddTdlsCtx->peerUpdateTimer,
+                                pHddTdlsCtx->threshold_config.tx_period_t);
 }
 
 void wlan_hdd_tdls_set_mode(hdd_context_t *pHddCtx, eTDLSSupportMode tdls_mode)
@@ -1536,9 +1540,10 @@
     VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL, "%s: discovery count %lu timeout %lu msec",
                __func__, pHddTdlsCtx->discovery_sent_cnt,
                pHddTdlsCtx->threshold_config.tx_period_t - TDLS_DISCOVERY_TIMEOUT_BEFORE_UPDATE);
-    vos_timer_stop(&pHddTdlsCtx->peerDiscoveryTimeoutTimer);
-    vos_timer_start(&pHddTdlsCtx->peerDiscoveryTimeoutTimer,
-        pHddTdlsCtx->threshold_config.tx_period_t - TDLS_DISCOVERY_TIMEOUT_BEFORE_UPDATE);
+
+    wlan_hdd_tdls_timer_restart(pHddTdlsCtx->pAdapter,
+                                &pHddTdlsCtx->peerDiscoveryTimeoutTimer,
+                                pHddTdlsCtx->threshold_config.tx_period_t - TDLS_DISCOVERY_TIMEOUT_BEFORE_UPDATE);
 
     return;
 }
@@ -1594,6 +1599,8 @@
     if (NULL == tdls_scan_ctx)
         return;
 
+    tdls_scan_ctx->attempt = 0;
+    tdls_scan_ctx->magic = 0;
     tdls_scan_ctx->scan_request = NULL;
         return;
 }
@@ -1779,16 +1786,12 @@
 void wlan_hdd_tdls_scan_done_callback(hdd_adapter_t *pAdapter)
 {
     hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
-    tdls_scan_context_t *scan_ctx;
 
     if (NULL == pHddCtx)
         return;
 
     /* free allocated memory at scan time */
-    scan_ctx = &pHddCtx->tdls_scan_ctxt;
-    wlan_hdd_tdls_free_scan_request (scan_ctx);
-    scan_ctx->attempt = 0;
-    scan_ctx->magic = 0;
+    wlan_hdd_tdls_free_scan_request (&pHddCtx->tdls_scan_ctxt);
 
     /* if tdls was enabled before scan, re-enable tdls mode */
     if(eTDLS_SUPPORT_ENABLED == pHddCtx->tdls_mode_last ||
@@ -1801,3 +1804,27 @@
     }
     wlan_hdd_tdls_check_bmps(pAdapter);
 }
+
+void wlan_hdd_tdls_timer_restart(hdd_adapter_t *pAdapter,
+                                 vos_timer_t *timer,
+                                 v_U32_t expirationTime)
+{
+    hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
+
+    if (NULL == pHddStaCtx)
+        return;
+
+    /* Check whether driver load unload is in progress */
+    if(vos_is_load_unload_in_progress( VOS_MODULE_ID_VOSS, NULL))
+    {
+       VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+                "%s: Driver load/unload is in progress.", __func__);
+       return;
+    }
+
+    if (hdd_connIsConnected(pHddStaCtx))
+    {
+        vos_timer_stop(timer);
+        vos_timer_start(timer, expirationTime);
+    }
+}