wlan: Changes to handle gracefully init scan failure in romaing case

Change-Id: I76c39340280e7f3df88e15fa040f29cfca34ff86
CR-Fixed: 405480
diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h
index 7b665dd..67b9ed8 100644
--- a/CORE/MAC/inc/sirApi.h
+++ b/CORE/MAC/inc/sirApi.h
@@ -938,14 +938,16 @@
 typedef enum eSirBackgroundScanMode
 {
     eSIR_AGGRESSIVE_BACKGROUND_SCAN = 0,
-    eSIR_NORMAL_BACKGROUND_SCAN = 1
+    eSIR_NORMAL_BACKGROUND_SCAN = 1,
+    eSIR_ROAMING_SCAN = 2,
 } tSirBackgroundScanMode;
 
 /// Two types of traffic check
 typedef enum eSirLinkTrafficCheck
 {
     eSIR_DONT_CHECK_LINK_TRAFFIC_BEFORE_SCAN = 0,
-    eSIR_CHECK_LINK_TRAFFIC_BEFORE_SCAN = 1
+    eSIR_CHECK_LINK_TRAFFIC_BEFORE_SCAN = 1,
+    eSIR_CHECK_ROAMING_SCAN = 2,
 } tSirLinkTrafficCheck;
 
 #define SIR_BG_SCAN_RETURN_CACHED_RESULTS              0x0
diff --git a/CORE/MAC/src/pe/lim/limFT.c b/CORE/MAC/src/pe/lim/limFT.c
index 8b8a1eb..50d1444 100644
--- a/CORE/MAC/src/pe/lim/limFT.c
+++ b/CORE/MAC/src/pe/lim/limFT.c
@@ -266,7 +266,7 @@
     if (psessionEntry->currentOperChannel != pMac->ft.ftPEContext.pFTPreAuthReq->preAuthchannelNum) 
     {
         // Need to suspend link only if the channels are different
-        limSuspendLink(pMac, eSIR_CHECK_LINK_TRAFFIC_BEFORE_SCAN, FTPreAuthSuspendLinkHandler, 
+        limSuspendLink(pMac, eSIR_CHECK_ROAMING_SCAN, FTPreAuthSuspendLinkHandler, 
                        (tANI_U32 *)psessionEntry); 
     }
     else 
diff --git a/CORE/MAC/src/pe/lim/limProcessMlmReqMessages.c b/CORE/MAC/src/pe/lim/limProcessMlmReqMessages.c
index 57b9057..0ea95c6 100644
--- a/CORE/MAC/src/pe/lim/limProcessMlmReqMessages.c
+++ b/CORE/MAC/src/pe/lim/limProcessMlmReqMessages.c
@@ -89,7 +89,7 @@
 void 
 limSetChannel(tpAniSirGlobal pMac, tANI_U8 channel, tANI_U8 secChannelOffset, tPowerdBm maxTxPower, tANI_U8 peSessionId);
 #define IS_MLM_SCAN_REQ_BACKGROUND_SCAN_AGGRESSIVE(pMac)    (pMac->lim.gpLimMlmScanReq->backgroundScanMode == eSIR_AGGRESSIVE_BACKGROUND_SCAN)
-
+#define IS_MLM_SCAN_REQ_BACKGROUND_SCAN_NORMAL(pMac)        (pMac->lim.gpLimMlmScanReq->backgroundScanMode == eSIR_NORMAL_BACKGROUND_SCAN)
 
 /**
  * limProcessMlmReqMessages()
@@ -188,16 +188,28 @@
 
 #ifdef ANI_PRODUCT_TYPE_CLIENT         
        if ( IS_MLM_SCAN_REQ_BACKGROUND_SCAN_AGGRESSIVE(pMac) )
+       {
            checkTraffic = eSIR_DONT_CHECK_LINK_TRAFFIC_BEFORE_SCAN;
-       else 
+       }
+       else if (IS_MLM_SCAN_REQ_BACKGROUND_SCAN_NORMAL(pMac))
+       {
            checkTraffic = eSIR_CHECK_LINK_TRAFFIC_BEFORE_SCAN;
+       }
+       else 
+           checkTraffic = eSIR_CHECK_ROAMING_SCAN;
 #else
             /* Currently checking the traffic before scan for Linux station. This is because MLM
              * scan request is not filled as scan is received via Measurement req in Linux. This
              * should be made as common code for Windows/Linux station once the scan requests are
              * enabled in Linux
              * TODO */
+       if ( IS_MLM_SCAN_REQ_BACKGROUND_SCAN_AGGRESSIVE(pMac) ||
+            IS_MLM_SCAN_REQ_BACKGROUND_SCAN_NORMAL(pMac))
+       {
             checkTraffic = eSIR_CHECK_LINK_TRAFFIC_BEFORE_SCAN;
+       }
+       else
+            checkTraffic = eSIR_CHECK_ROAMING_SCAN;
 #endif
 
     PELOG1(limLog(pMac, LOG1, FL("Calling limSendHalInitScanReq\n"));)
@@ -704,7 +716,14 @@
     {
         pInitScanParam->notifyBss = TRUE;
         pInitScanParam->notifyHost = FALSE;
-        pInitScanParam->scanMode = eHAL_SYS_MODE_LEARN;
+        if (eSIR_CHECK_ROAMING_SCAN == trafficCheck)
+        {
+           pInitScanParam->scanMode = eHAL_SYS_MODE_ROAM_SCAN;
+        }
+        else
+        {
+           pInitScanParam->scanMode = eHAL_SYS_MODE_LEARN;
+        }
 
         pInitScanParam->frameType = SIR_MAC_CTRL_CTS;
         __limCreateInitScanRawFrame(pMac, pInitScanParam);
@@ -714,7 +733,15 @@
     {
         if(nextState == eLIM_HAL_SUSPEND_LINK_WAIT_STATE)
         {
-            pInitScanParam->scanMode = eHAL_SYS_MODE_SUSPEND_LINK;
+           if (eSIR_CHECK_ROAMING_SCAN == trafficCheck)
+           {
+              pInitScanParam->scanMode = eHAL_SYS_MODE_ROAM_SUSPEND_LINK;
+           }
+           else
+           {
+              pInitScanParam->scanMode = eHAL_SYS_MODE_SUSPEND_LINK;
+           }
+           
         }
         else
         {
diff --git a/CORE/SME/src/csr/csrApiScan.c b/CORE/SME/src/csr/csrApiScan.c
index 1520b5d..6130b94 100644
--- a/CORE/SME/src/csr/csrApiScan.c
+++ b/CORE/SME/src/csr/csrApiScan.c
@@ -4713,6 +4713,11 @@
             pMsg->skipDfsChnlInP2pSearch = pScanReq->skipDfsChnlInP2pSearch;
 #endif
 
+            if (pScanReq->requestType == eCSR_SCAN_HO_BG_SCAN) 
+            {
+                pMsg->backgroundScanMode = eSIR_ROAMING_SCAN;
+            } 
+
         }while(0);
         if(HAL_STATUS_SUCCESS(status))
         {
diff --git a/CORE/WDA/inc/legacy/halTypes.h b/CORE/WDA/inc/legacy/halTypes.h
index aa4496e..1e13272 100644
--- a/CORE/WDA/inc/legacy/halTypes.h
+++ b/CORE/WDA/inc/legacy/halTypes.h
@@ -290,7 +290,9 @@
     eHAL_SYS_MODE_LEARN,
     eHAL_SYS_MODE_SCAN,
     eHAL_SYS_MODE_PROMISC,
-    eHAL_SYS_MODE_SUSPEND_LINK
+    eHAL_SYS_MODE_SUSPEND_LINK,
+    eHAL_SYS_MODE_ROAM_SCAN,
+    eHAL_SYS_MODE_ROAM_SUSPEND_LINK,
 } eHalSysMode;
 
 
diff --git a/CORE/WDI/CP/inc/wlan_qct_wdi.h b/CORE/WDI/CP/inc/wlan_qct_wdi.h
index 51be705..7b5600e 100644
--- a/CORE/WDI/CP/inc/wlan_qct_wdi.h
+++ b/CORE/WDI/CP/inc/wlan_qct_wdi.h
@@ -762,7 +762,10 @@
   WDI_SCAN_MODE_LEARN,
   WDI_SCAN_MODE_SCAN,
   WDI_SCAN_MODE_PROMISC,
-  WDI_SCAN_MODE_SUSPEND_LINK
+  WDI_SCAN_MODE_SUSPEND_LINK,
+  WDI_SCAN_MODE_ROAM_SCAN,
+  WDI_SCAN_MODE_ROAM_SUSPEND_LINK,
+
 } WDI_ScanMode;
 
 /*---------------------------------------------------------------------------
diff --git a/CORE/WDI/CP/src/wlan_qct_wdi.c b/CORE/WDI/CP/src/wlan_qct_wdi.c
index 41b6d6a..0c03bf9 100644
--- a/CORE/WDI/CP/src/wlan_qct_wdi.c
+++ b/CORE/WDI/CP/src/wlan_qct_wdi.c
@@ -21073,6 +21073,10 @@
     return eHAL_SYS_MODE_PROMISC; 
   case WDI_SCAN_MODE_SUSPEND_LINK:
     return eHAL_SYS_MODE_SUSPEND_LINK;
+  case WDI_SCAN_MODE_ROAM_SCAN:
+    return eHAL_SYS_MODE_ROAM_SCAN;
+  case WDI_SCAN_MODE_ROAM_SUSPEND_LINK:
+    return eHAL_SYS_MODE_ROAM_SUSPEND_LINK;
   }
 
   return eHAL_SYS_MODE_MAX;