diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index a9f277c..162aa4f 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -1,43 +1,23 @@
 /*
- * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
- *
- * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
- *
- *
- * Permission to use, copy, modify, and/or distribute this software for
- * any purpose with or without fee is hereby granted, provided that the
- * above copyright notice and this permission notice appear in all
- * copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
- * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
- * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
- * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-/*
- * Copyright (c) 2012, The Linux Foundation. All rights reserved.
- *
- * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
- *
- *
- * Permission to use, copy, modify, and/or distribute this software for
- * any purpose with or without fee is hereby granted, provided that the
- * above copyright notice and this permission notice appear in all
- * copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
- * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
- * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
- * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
+  * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
+  *
+  * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
+  *
+  *
+  * Permission to use, copy, modify, and/or distribute this software for
+  * any purpose with or without fee is hereby granted, provided that the
+  * above copyright notice and this permission notice appear in all
+  * copies.
+  *
+  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
+  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+  * PERFORMANCE OF THIS SOFTWARE.
+*/
 
 /**========================================================================
 
@@ -45,9 +25,9 @@
 
   \brief WLAN Host Device Driver implementation
 
-  Copyright 2008 (c) Qualcomm, Incorporated.  All Rights Reserved.
+  Copyright 2008 (c) Qualcomm Technologies, Inc.  All Rights Reserved.
 
-  Qualcomm Confidential and Proprietary.
+  Qualcomm Technologies Confidential and Proprietary.
 
   ========================================================================*/
 
@@ -150,7 +130,7 @@
 #define WLAN_AKM_SUITE_FT_PSK           0x000FAC04
 #endif
 
-static const u32 hdd_cipher_suites[] = 
+static const u32 hdd_cipher_suites[] =
 {
     WLAN_CIPHER_SUITE_WEP40,
     WLAN_CIPHER_SUITE_WEP104,
@@ -177,7 +157,7 @@
 }
 
 static struct ieee80211_channel hdd_channels_2_4_GHZ[] =
-{  
+{
     HDD2GHZCHAN(2412, 1, 0) ,
     HDD2GHZCHAN(2417, 2, 0) ,
     HDD2GHZCHAN(2422, 3, 0) ,
@@ -238,29 +218,29 @@
 
 static struct ieee80211_rate g_mode_rates[] =
 {
-    HDD_G_MODE_RATETAB(10, 0x1, 0),    
-    HDD_G_MODE_RATETAB(20, 0x2, 0),    
-    HDD_G_MODE_RATETAB(55, 0x4, 0),    
-    HDD_G_MODE_RATETAB(110, 0x8, 0),    
-    HDD_G_MODE_RATETAB(60, 0x10, 0),    
-    HDD_G_MODE_RATETAB(90, 0x20, 0),    
-    HDD_G_MODE_RATETAB(120, 0x40, 0),    
-    HDD_G_MODE_RATETAB(180, 0x80, 0),    
-    HDD_G_MODE_RATETAB(240, 0x100, 0),    
-    HDD_G_MODE_RATETAB(360, 0x200, 0),    
-    HDD_G_MODE_RATETAB(480, 0x400, 0),    
+    HDD_G_MODE_RATETAB(10, 0x1, 0),
+    HDD_G_MODE_RATETAB(20, 0x2, 0),
+    HDD_G_MODE_RATETAB(55, 0x4, 0),
+    HDD_G_MODE_RATETAB(110, 0x8, 0),
+    HDD_G_MODE_RATETAB(60, 0x10, 0),
+    HDD_G_MODE_RATETAB(90, 0x20, 0),
+    HDD_G_MODE_RATETAB(120, 0x40, 0),
+    HDD_G_MODE_RATETAB(180, 0x80, 0),
+    HDD_G_MODE_RATETAB(240, 0x100, 0),
+    HDD_G_MODE_RATETAB(360, 0x200, 0),
+    HDD_G_MODE_RATETAB(480, 0x400, 0),
     HDD_G_MODE_RATETAB(540, 0x800, 0),
-};   
+};
 
 static struct ieee80211_rate a_mode_rates[] =
 {
-    HDD_G_MODE_RATETAB(60, 0x10, 0),    
-    HDD_G_MODE_RATETAB(90, 0x20, 0),    
-    HDD_G_MODE_RATETAB(120, 0x40, 0),    
-    HDD_G_MODE_RATETAB(180, 0x80, 0),    
-    HDD_G_MODE_RATETAB(240, 0x100, 0),    
-    HDD_G_MODE_RATETAB(360, 0x200, 0),    
-    HDD_G_MODE_RATETAB(480, 0x400, 0),    
+    HDD_G_MODE_RATETAB(60, 0x10, 0),
+    HDD_G_MODE_RATETAB(90, 0x20, 0),
+    HDD_G_MODE_RATETAB(120, 0x40, 0),
+    HDD_G_MODE_RATETAB(180, 0x80, 0),
+    HDD_G_MODE_RATETAB(240, 0x100, 0),
+    HDD_G_MODE_RATETAB(360, 0x200, 0),
+    HDD_G_MODE_RATETAB(480, 0x400, 0),
     HDD_G_MODE_RATETAB(540, 0x800, 0),
 };
 
@@ -323,7 +303,7 @@
     .ht_cap.mcs.tx_params  = IEEE80211_HT_MCS_TX_DEFINED,
 };
 
-/* This structure contain information what kind of frame are expected in 
+/* This structure contain information what kind of frame are expected in
      TX/RX direction for each kind of interface */
 static const struct ieee80211_txrx_stypes
 wlan_hdd_txrx_stypes[NUM_NL80211_IFTYPES] = {
@@ -511,8 +491,8 @@
 
 /*
  * FUNCTION: wlan_hdd_cfg80211_init
- * This function is called by hdd_wlan_startup() 
- * during initialization. 
+ * This function is called by hdd_wlan_startup()
+ * during initialization.
  * This function is used to initialize and register wiphy structure.
  */
 struct wiphy *wlan_hdd_cfg80211_init(int priv_size)
@@ -520,8 +500,8 @@
     struct wiphy *wiphy;
     ENTER();
 
-    /* 
-     *   Create wiphy device 
+    /*
+     *   Create wiphy device
      */
     wiphy = wiphy_new(&wlan_hdd_cfg80211_ops, priv_size);
 
@@ -537,7 +517,7 @@
 
 /*
  * FUNCTION: wlan_hdd_cfg80211_update_band
- * This function is called from the supplicant through a 
+ * This function is called from the supplicant through a
  * private ioctl to change the band value
  */
 int wlan_hdd_cfg80211_update_band(struct wiphy *wiphy, eCsrBand eBand)
@@ -562,11 +542,11 @@
 }
 /*
  * FUNCTION: wlan_hdd_cfg80211_init
- * This function is called by hdd_wlan_startup() 
- * during initialization. 
+ * This function is called by hdd_wlan_startup()
+ * during initialization.
  * This function is used to initialize and register wiphy structure.
  */
-int wlan_hdd_cfg80211_register(struct device *dev, 
+int wlan_hdd_cfg80211_register(struct device *dev,
                                struct wiphy *wiphy,
                                hdd_config_t *pCfg
                                )
@@ -611,12 +591,12 @@
        regulatory settings */
     wiphy->reg_notifier = wlan_hdd_crda_reg_notifier;
 
-    wiphy->max_scan_ssids = MAX_SCAN_SSID; 
-    
+    wiphy->max_scan_ssids = MAX_SCAN_SSID;
+
     wiphy->max_scan_ie_len = 200 ; //TODO: define a macro
 
     /* Supports STATION & AD-HOC modes right now */
-    wiphy->interface_modes =   BIT(NL80211_IFTYPE_STATION) 
+    wiphy->interface_modes =   BIT(NL80211_IFTYPE_STATION)
                              | BIT(NL80211_IFTYPE_ADHOC)
                              | BIT(NL80211_IFTYPE_P2P_CLIENT)
                              | BIT(NL80211_IFTYPE_P2P_GO)
@@ -691,7 +671,7 @@
 
     EXIT();
     return 0;
-}     
+}
 
 /* In this function we will try to get default country code from crda.
    If the gCrdaDefaultCountryCode is configured in ini file,
@@ -719,7 +699,7 @@
 
 /* In this function we will do all post VOS start initialization.
    In this function we will register for all frame in which supplicant
-   is interested. 
+   is interested.
 */
 void wlan_hdd_cfg80211_post_voss_start(hdd_adapter_t* pAdapter)
 {
@@ -733,13 +713,13 @@
       initialized. Once we will move to 2.6.37 kernel, in which we have
       frame register ops, we will move this code as a part of that */
     /* GAS Initial Request */
-    sme_RegisterMgmtFrame(hHal, pAdapter->sessionId, type, 
+    sme_RegisterMgmtFrame(hHal, pAdapter->sessionId, type,
                          (v_U8_t*)GAS_INITIAL_REQ, GAS_INITIAL_REQ_SIZE );
 
     /* GAS Initial Response */
     sme_RegisterMgmtFrame(hHal, pAdapter->sessionId, type,
                          (v_U8_t*)GAS_INITIAL_RSP, GAS_INITIAL_RSP_SIZE );
-    
+
     /* GAS Comeback Request */
     sme_RegisterMgmtFrame(hHal, pAdapter->sessionId, type,
                          (v_U8_t*)GAS_COMEBACK_REQ, GAS_COMEBACK_REQ_SIZE );
@@ -750,7 +730,7 @@
 
     /* P2P Public Action */
     sme_RegisterMgmtFrame(hHal, pAdapter->sessionId, type,
-                         (v_U8_t*)P2P_PUBLIC_ACTION_FRAME, 
+                         (v_U8_t*)P2P_PUBLIC_ACTION_FRAME,
                                   P2P_PUBLIC_ACTION_FRAME_SIZE );
 
     /* P2P Action */
@@ -785,7 +765,7 @@
     /* GAS Initial Response */
     sme_DeregisterMgmtFrame(hHal, pAdapter->sessionId, type,
                          (v_U8_t*)GAS_INITIAL_RSP, GAS_INITIAL_RSP_SIZE );
-    
+
     /* GAS Comeback Request */
     sme_DeregisterMgmtFrame(hHal, pAdapter->sessionId, type,
                          (v_U8_t*)GAS_COMEBACK_REQ, GAS_COMEBACK_REQ_SIZE );
@@ -796,7 +776,7 @@
 
     /* P2P Public Action */
     sme_DeregisterMgmtFrame(hHal, pAdapter->sessionId, type,
-                         (v_U8_t*)P2P_PUBLIC_ACTION_FRAME, 
+                         (v_U8_t*)P2P_PUBLIC_ACTION_FRAME,
                                   P2P_PUBLIC_ACTION_FRAME_SIZE );
 
     /* P2P Action */
@@ -868,16 +848,16 @@
 #endif /* FEATURE_WLAN_WAPI*/
 
 #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0))
-int wlan_hdd_cfg80211_alloc_new_beacon(hdd_adapter_t *pAdapter, 
+int wlan_hdd_cfg80211_alloc_new_beacon(hdd_adapter_t *pAdapter,
                                        beacon_data_t **ppBeacon,
                                        struct beacon_parameters *params)
 #else
-int wlan_hdd_cfg80211_alloc_new_beacon(hdd_adapter_t *pAdapter, 
+int wlan_hdd_cfg80211_alloc_new_beacon(hdd_adapter_t *pAdapter,
                                        beacon_data_t **ppBeacon,
                                        struct cfg80211_beacon_data *params,
                                        int dtim_period)
 #endif
-{    
+{
     int size;
     beacon_data_t *beacon = NULL;
     beacon_data_t *old = NULL;
@@ -929,7 +909,7 @@
     else
         beacon->dtim_period = old->dtim_period;
 #endif
- 
+
     beacon->head = ((u8 *) beacon) + sizeof(beacon_data_t);
     beacon->tail = beacon->head + head_len;
     beacon->head_len = head_len;
@@ -938,16 +918,16 @@
     if(params->head) {
         memcpy (beacon->head,params->head,beacon->head_len);
     }
-    else { 
+    else {
         if(old)
             memcpy (beacon->head,old->head,beacon->head_len);
     }
-    
+
     if(params->tail) {
         memcpy (beacon->tail,params->tail,beacon->tail_len);
     }
     else {
-       if(old)   
+       if(old)
            memcpy (beacon->tail,old->tail,beacon->tail_len);
     }
 
@@ -964,9 +944,9 @@
     int left = length;
     v_U8_t *ptr = pIes;
     v_U8_t elem_id,elem_len;
-   
+
     while(left >= 2)
-    {   
+    {
         elem_id  =  ptr[0];
         elem_len =  ptr[1];
         left -= 2;
@@ -977,11 +957,11 @@
                                                     eid,elem_len,left);
             return NULL;
         }
-        if (elem_id == eid) 
+        if (elem_id == eid)
         {
             return ptr;
         }
-   
+
         left -= elem_len;
         ptr += (elem_len + 2);
     }
@@ -1069,7 +1049,7 @@
     pIe = wlan_hdd_cfg80211_get_ie_ptr(pBeacon->tail, pBeacon->tail_len,
                                        WLAN_EID_HT_CAPABILITY);
 
-    if(pIe) 
+    if(pIe)
     {
         pConfig->SapHw_mode= eSAP_DOT11_MODE_11n;
         if(require_ht)
@@ -1344,23 +1324,23 @@
     return ret;
 }
 
-/* 
+/*
  * FUNCTION: wlan_hdd_validate_operation_channel
  * called by wlan_hdd_cfg80211_start_bss() and
  * wlan_hdd_cfg80211_set_channel()
  * This function validates whether given channel is part of valid
- * channel list. 
- */ 
+ * channel list.
+ */
 static VOS_STATUS wlan_hdd_validate_operation_channel(hdd_adapter_t *pAdapter,int channel)
 {
-        
+
     v_U32_t num_ch = 0;
     u8 valid_ch[WNI_CFG_VALID_CHANNEL_LIST_LEN];
     u32 indx = 0;
     tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
     v_U8_t fValidChannel = FALSE, count = 0;
     hdd_config_t *hdd_pConfig_ini= (WLAN_HDD_GET_CTX(pAdapter))->cfg_ini;
-     
+
     num_ch = WNI_CFG_VALID_CHANNEL_LIST_LEN;
 
     if ( hdd_pConfig_ini->sapAllowAllChannel)
@@ -1406,7 +1386,7 @@
         }
     }
     return VOS_STATUS_SUCCESS;
-         
+
 }
 
 /**
@@ -1549,24 +1529,24 @@
     return 0;
 }
 
-/* 
+/*
  * FUNCTION: wlan_hdd_select_cbmode
  * called by wlan_hdd_cfg80211_start_bss() and
  * This function  selects the cbmode based on primary channel
- */ 
+ */
 VOS_STATUS wlan_sap_select_cbmode(void *pAdapter,eSapPhyMode SapHw_mode, v_U8_t channel)
 {
     tSmeConfigParams smeConfig;
     hdd_context_t  *pHddCtx  = ( hdd_context_t *) pAdapter;
     hdd_config_t  *pConfigIni = ((hdd_context_t *)(pAdapter))->cfg_ini;
-    
+
     if(
 #ifdef WLAN_FEATURE_11AC
       SapHw_mode != eSAP_DOT11_MODE_11ac &&
       SapHw_mode != eSAP_DOT11_MODE_11ac_ONLY &&
 #endif
       SapHw_mode != eSAP_DOT11_MODE_11n &&
-      SapHw_mode != eSAP_DOT11_MODE_11n_ONLY 
+      SapHw_mode != eSAP_DOT11_MODE_11n_ONLY
       )
     {
         return VOS_STATUS_SUCCESS;
@@ -1583,31 +1563,31 @@
 
 #ifdef WLAN_FEATURE_11AC
 
-    if ( SapHw_mode == eSAP_DOT11_MODE_11ac || 
+    if ( SapHw_mode == eSAP_DOT11_MODE_11ac ||
          SapHw_mode == eSAP_DOT11_MODE_11ac_ONLY )
     {
         if ( channel== 36 || channel == 52 || channel == 100 ||
              channel == 116 || channel == 149 )
         {
-           smeConfig.csrConfig.channelBondingMode5GHz = 
+           smeConfig.csrConfig.channelBondingMode5GHz =
                      PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW - 1;
         }
         else if ( channel == 40 || channel == 56 || channel == 104 ||
              channel == 120 || channel == 153 )
         {
-           smeConfig.csrConfig.channelBondingMode5GHz = 
+           smeConfig.csrConfig.channelBondingMode5GHz =
                            PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW - 1;
         }
         else if ( channel == 44 || channel == 60 || channel == 108 ||
                   channel == 124 || channel == 157 )
         {
-           smeConfig.csrConfig.channelBondingMode5GHz = 
+           smeConfig.csrConfig.channelBondingMode5GHz =
                            PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH -1;
         }
         else if ( channel == 48 || channel == 64 || channel == 112 ||
              channel == 128 || channel == 161 )
         {
-           smeConfig.csrConfig.channelBondingMode5GHz = 
+           smeConfig.csrConfig.channelBondingMode5GHz =
                           PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH - 1;
         }
         else if ( channel == 165 )
@@ -1688,7 +1668,7 @@
     //pConfig->channel = pCommitConfig->channel;
 
     /*Protection parameter to enable or disable*/
-    pConfig->protEnabled = 
+    pConfig->protEnabled =
            (WLAN_HDD_GET_CTX(pHostapdAdapter))->cfg_ini->apProtEnabled;
 
     pConfig->dtim_period = pBeacon->dtim_period;
@@ -1744,8 +1724,8 @@
     pConfig->authType = eSAP_AUTO_SWITCH;
 
     capab_info = pMgmt_frame->u.beacon.capab_info;
-    
-    pConfig->privacy = (pMgmt_frame->u.beacon.capab_info & 
+
+    pConfig->privacy = (pMgmt_frame->u.beacon.capab_info &
                         WLAN_CAPABILITY_PRIVACY) ? VOS_TRUE : VOS_FALSE;
 
     (WLAN_HDD_GET_AP_CTX_PTR(pHostapdAdapter))->uPrivacy = pConfig->privacy;
@@ -1779,22 +1759,22 @@
     {
         pConfig->wps_state = SAP_WPS_DISABLED;
     }
-    pConfig->fwdWPSPBCProbeReq  = 1; // Forward WPS PBC probe request frame up 
+    pConfig->fwdWPSPBCProbeReq  = 1; // Forward WPS PBC probe request frame up
 
     pConfig->RSNWPAReqIELength = 0;
     pConfig->pRSNWPAReqIE = NULL;
-    pIe = wlan_hdd_cfg80211_get_ie_ptr(pBeacon->tail, pBeacon->tail_len, 
+    pIe = wlan_hdd_cfg80211_get_ie_ptr(pBeacon->tail, pBeacon->tail_len,
                                        WLAN_EID_RSN);
     if(pIe && pIe[1])
-    { 
+    {
         pConfig->RSNWPAReqIELength = pIe[1] + 2;
         memcpy(&wpaRsnIEdata[0], pIe, pConfig->RSNWPAReqIELength);
         pConfig->pRSNWPAReqIE = &wpaRsnIEdata[0];
-        /* The actual processing may eventually be more extensive than 
-         * this. Right now, just consume any PMKIDs that are  sent in 
+        /* The actual processing may eventually be more extensive than
+         * this. Right now, just consume any PMKIDs that are  sent in
          * by the app.
          * */
-        status = hdd_softap_unpackIE( 
+        status = hdd_softap_unpackIE(
                         vos_get_context( VOS_MODULE_ID_SME, pVosContext),
                         &RSNEncryptType,
                         &mcRSNEncryptType,
@@ -1804,8 +1784,8 @@
 
         if( VOS_STATUS_SUCCESS == status )
         {
-            /* Now copy over all the security attributes you have 
-             * parsed out 
+            /* Now copy over all the security attributes you have
+             * parsed out
              * */
             pConfig->RSNEncryptType = RSNEncryptType; // Use the cipher type in the RSN IE
             pConfig->mcRSNEncryptType = mcRSNEncryptType;
@@ -1816,7 +1796,7 @@
                         RSNAuthType, RSNEncryptType, mcRSNEncryptType);
         }
     }
-    
+
     pIe = wlan_hdd_get_vendor_oui_ie_ptr(WPA_OUI_TYPE, WPA_OUI_TYPE_SIZE,
                                          pBeacon->tail, pBeacon->tail_len);
 
@@ -1833,7 +1813,7 @@
             pConfig->RSNWPAReqIELength = pIe[1] + 2;
             memcpy(&wpaRsnIEdata[0], pIe, pConfig->RSNWPAReqIELength);
             pConfig->pRSNWPAReqIE = &wpaRsnIEdata[0];
-            status = hdd_softap_unpackIE( 
+            status = hdd_softap_unpackIE(
                           vos_get_context( VOS_MODULE_ID_SME, pVosContext),
                           &RSNEncryptType,
                           &mcRSNEncryptType,
@@ -1843,8 +1823,8 @@
 
             if( VOS_STATUS_SUCCESS == status )
             {
-                /* Now copy over all the security attributes you have 
-                 * parsed out 
+                /* Now copy over all the security attributes you have
+                 * parsed out
                  * */
                 pConfig->RSNEncryptType = RSNEncryptType; // Use the cipher type in the RSN IE
                 pConfig->mcRSNEncryptType = mcRSNEncryptType;
@@ -1882,9 +1862,9 @@
     }
 #endif
 
-    vos_mem_copy(pConfig->self_macaddr.bytes, 
+    vos_mem_copy(pConfig->self_macaddr.bytes,
                pHostapdAdapter->macAddressCurrent.bytes, sizeof(v_MACADDR_t));
-    
+
     /* default value */
     pConfig->SapMacaddr_acl = eSAP_ACCEPT_UNLESS_DENIED;
     pConfig->num_accept_mac = 0;
@@ -1900,8 +1880,8 @@
             acl type : 1 byte
             no of mac addr in black list: 1 byte
             list of mac_acl_entries: variable, 6 bytes per mac address + sizeof(int) for vlan id
-    */    
-    if ((pIe != NULL) && (pIe[1] != 0))    
+    */
+    if ((pIe != NULL) && (pIe[1] != 0))
     {
         pConfig->SapMacaddr_acl = pIe[6];
         pConfig->num_deny_mac   = pIe[7];
@@ -1914,7 +1894,7 @@
         {
             vos_mem_copy(&pConfig->deny_mac[i], acl_entry->addr, sizeof(qcmacaddr));
             acl_entry++;
-        }        
+        }
     }
     pIe = wlan_hdd_get_vendor_oui_ie_ptr(WHITELIST_OUI_TYPE, WPA_OUI_TYPE_SIZE,
                                          pBeacon->tail, pBeacon->tail_len);
@@ -1926,8 +1906,8 @@
             acl type : 1 byte
             no of mac addr in white list: 1 byte
             list of mac_acl_entries: variable, 6 bytes per mac address + sizeof(int) for vlan id
-    */    
-    if ((pIe != NULL) && (pIe[1] != 0))    
+    */
+    if ((pIe != NULL) && (pIe[1] != 0))
     {
         pConfig->SapMacaddr_acl = pIe[6];
         pConfig->num_accept_mac   = pIe[7];
@@ -1950,14 +1930,14 @@
      * Otherwise, leave whatever is set in hostapd (a OR b OR g OR n mode) */
     if( ((pConfig->SapHw_mode == eSAP_DOT11_MODE_11n) ||
          (pConfig->SapHw_mode == eSAP_DOT11_MODE_11n_ONLY)) &&
-        (((WLAN_HDD_GET_CTX(pHostapdAdapter))->cfg_ini->dot11Mode == eHDD_DOT11_MODE_AUTO) || 
+        (((WLAN_HDD_GET_CTX(pHostapdAdapter))->cfg_ini->dot11Mode == eHDD_DOT11_MODE_AUTO) ||
          ((WLAN_HDD_GET_CTX(pHostapdAdapter))->cfg_ini->dot11Mode == eHDD_DOT11_MODE_11ac) ||
          ((WLAN_HDD_GET_CTX(pHostapdAdapter))->cfg_ini->dot11Mode == eHDD_DOT11_MODE_11ac_ONLY)) )
     {
         pConfig->SapHw_mode = eSAP_DOT11_MODE_11ac;
     }
 #endif
-     
+
     if( AUTO_CHANNEL_SELECT != pConfig->channel)
         wlan_sap_select_cbmode((WLAN_HDD_GET_CTX(pHostapdAdapter)),pConfig->SapHw_mode,pConfig->channel);
     // ht_capab is not what the name conveys,this is used for protection bitmap
@@ -1971,26 +1951,26 @@
     }
 
     //Uapsd Enabled Bit
-    pConfig->UapsdEnable =  
+    pConfig->UapsdEnable =
           (WLAN_HDD_GET_CTX(pHostapdAdapter))->cfg_ini->apUapsdEnabled;
     //Enable OBSS protection
-    pConfig->obssProtEnabled = 
-           (WLAN_HDD_GET_CTX(pHostapdAdapter))->cfg_ini->apOBSSProtEnabled; 
+    pConfig->obssProtEnabled =
+           (WLAN_HDD_GET_CTX(pHostapdAdapter))->cfg_ini->apOBSSProtEnabled;
 
-    hddLog(LOGW, FL("SOftAP macaddress : "MAC_ADDRESS_STR"\n"), 
+    hddLog(LOGW, FL("SOftAP macaddress : "MAC_ADDRESS_STR"\n"),
                  MAC_ADDR_ARRAY(pHostapdAdapter->macAddressCurrent.bytes));
-    hddLog(LOGW,FL("ssid =%s\n"), pConfig->SSIDinfo.ssid.ssId);  
+    hddLog(LOGW,FL("ssid =%s\n"), pConfig->SSIDinfo.ssid.ssId);
     hddLog(LOGW,FL("beaconint=%d, channel=%d\n"), (int)pConfig->beacon_int,
                                                      (int)pConfig->channel);
     hddLog(LOGW,FL("hw_mode=%x\n"),  pConfig->SapHw_mode);
-    hddLog(LOGW,FL("privacy=%d, authType=%d\n"), pConfig->privacy, 
-                                                 pConfig->authType); 
+    hddLog(LOGW,FL("privacy=%d, authType=%d\n"), pConfig->privacy,
+                                                 pConfig->authType);
     hddLog(LOGW,FL("RSN/WPALen=%d, \n"),(int)pConfig->RSNWPAReqIELength);
-    hddLog(LOGW,FL("Uapsd = %d\n"),pConfig->UapsdEnable); 
+    hddLog(LOGW,FL("Uapsd = %d\n"),pConfig->UapsdEnable);
     hddLog(LOGW,FL("ProtEnabled = %d, OBSSProtEnabled = %d\n"),
                           pConfig->protEnabled, pConfig->obssProtEnabled);
 
-    if(test_bit(SOFTAP_BSS_STARTED, &pHostapdAdapter->event_flags)) 
+    if(test_bit(SOFTAP_BSS_STARTED, &pHostapdAdapter->event_flags))
     {
         //Bss already started. just return.
         //TODO Probably it should update some beacon params.
@@ -1998,7 +1978,7 @@
         EXIT();
         return 0;
     }
-    
+
     pConfig->persona = pHostapdAdapter->device_mode;
 
     pSapEventCallback = hdd_hostapd_SAPEventCB;
@@ -2009,18 +1989,18 @@
         return -EINVAL;
     }
 
-    hddLog(LOG1, 
+    hddLog(LOG1,
            FL("Waiting for Scan to complete(auto mode) and BSS to start"));
 
     status = vos_wait_single_event(&pHostapdState->vosEvent, 10000);
-   
+
     if (!VOS_IS_STATUS_SUCCESS(status))
-    {  
-        VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, 
+    {
+        VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
                  ("ERROR: HDD vos wait for single_event failed!!\n"));
         VOS_ASSERT(0);
     }
- 
+
     //Succesfully started Bss update the state bit.
     set_bit(SOFTAP_BSS_STARTED, &pHostapdAdapter->event_flags);
 
@@ -2049,12 +2029,12 @@
 }
 
 #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0))
-static int wlan_hdd_cfg80211_add_beacon(struct wiphy *wiphy, 
-                                        struct net_device *dev, 
+static int wlan_hdd_cfg80211_add_beacon(struct wiphy *wiphy,
+                                        struct net_device *dev,
                                         struct beacon_parameters *params)
 {
     hdd_adapter_t *pAdapter =  WLAN_HDD_GET_PRIV_PTR(dev);
-    int status=VOS_STATUS_SUCCESS; 
+    int status=VOS_STATUS_SUCCESS;
 
     ENTER();
 
@@ -2067,20 +2047,20 @@
         return -EAGAIN;
     }
 
-    if ( (pAdapter->device_mode == WLAN_HDD_SOFTAP) 
+    if ( (pAdapter->device_mode == WLAN_HDD_SOFTAP)
       || (pAdapter->device_mode == WLAN_HDD_P2P_GO)
        )
     {
         beacon_data_t *old,*new;
 
         old = pAdapter->sessionCtx.ap.beacon;
-   
+
         if (old)
             return -EALREADY;
 
         status = wlan_hdd_cfg80211_alloc_new_beacon(pAdapter,&new,params);
 
-        if(status != VOS_STATUS_SUCCESS) 
+        if(status != VOS_STATUS_SUCCESS)
         {
              hddLog(VOS_TRACE_LEVEL_FATAL,
                    "%s:Error!!! Allocating the new beacon\n",__func__);
@@ -2095,12 +2075,12 @@
     EXIT();
     return status;
 }
- 
-static int wlan_hdd_cfg80211_set_beacon(struct wiphy *wiphy, 
+
+static int wlan_hdd_cfg80211_set_beacon(struct wiphy *wiphy,
                                         struct net_device *dev,
                                         struct beacon_parameters *params)
 {
-    hdd_adapter_t *pAdapter =  WLAN_HDD_GET_PRIV_PTR(dev); 
+    hdd_adapter_t *pAdapter =  WLAN_HDD_GET_PRIV_PTR(dev);
     int status=VOS_STATUS_SUCCESS;
 
     ENTER();
@@ -2115,21 +2095,21 @@
         return -EAGAIN;
     }
 
-    if ((pAdapter->device_mode == WLAN_HDD_SOFTAP) 
+    if ((pAdapter->device_mode == WLAN_HDD_SOFTAP)
      || (pAdapter->device_mode == WLAN_HDD_P2P_GO)
-       ) 
+       )
     {
         beacon_data_t *old,*new;
-                
+
         old = pAdapter->sessionCtx.ap.beacon;
-        
+
         if (!old)
             return -ENOENT;
 
         status = wlan_hdd_cfg80211_alloc_new_beacon(pAdapter,&new,params);
 
         if(status != VOS_STATUS_SUCCESS) {
-            hddLog(VOS_TRACE_LEVEL_FATAL, 
+            hddLog(VOS_TRACE_LEVEL_FATAL,
                    "%s: Error!!! Allocating the new beacon\n",__func__);
             return -EINVAL;
        }
@@ -2390,11 +2370,11 @@
 }
 
 
-static int wlan_hdd_cfg80211_change_beacon(struct wiphy *wiphy, 
+static int wlan_hdd_cfg80211_change_beacon(struct wiphy *wiphy,
                                         struct net_device *dev,
                                         struct cfg80211_beacon_data *params)
 {
-    hdd_adapter_t *pAdapter =  WLAN_HDD_GET_PRIV_PTR(dev); 
+    hdd_adapter_t *pAdapter =  WLAN_HDD_GET_PRIV_PTR(dev);
     int status=VOS_STATUS_SUCCESS;
 
     ENTER();
@@ -2407,21 +2387,21 @@
         return -EAGAIN;
     }
 
-    if ((pAdapter->device_mode == WLAN_HDD_SOFTAP) 
+    if ((pAdapter->device_mode == WLAN_HDD_SOFTAP)
      || (pAdapter->device_mode == WLAN_HDD_P2P_GO)
-       ) 
+       )
     {
         beacon_data_t *old,*new;
-                
+
         old = pAdapter->sessionCtx.ap.beacon;
-        
+
         if (!old)
             return -ENOENT;
 
         status = wlan_hdd_cfg80211_alloc_new_beacon(pAdapter, &new, params, 0);
 
         if(status != VOS_STATUS_SUCCESS) {
-            hddLog(VOS_TRACE_LEVEL_FATAL, 
+            hddLog(VOS_TRACE_LEVEL_FATAL,
                    "%s: Error!!! Allocating the new beacon\n",__func__);
             return -EINVAL;
        }
@@ -2445,20 +2425,20 @@
     hdd_adapter_t *pAdapter =  WLAN_HDD_GET_PRIV_PTR(dev);
 
     ENTER();
-    
+
     hddLog(VOS_TRACE_LEVEL_INFO, "%s: device_mode = %d\n",
                                __func__,pAdapter->device_mode);
 
     if((pAdapter->device_mode == WLAN_HDD_SOFTAP)
      ||  (pAdapter->device_mode == WLAN_HDD_P2P_GO)
-      ) 
+      )
     {
         /* ap_isolate == -1 means that in change bss, upper layer doesn't
          * want to update this parameter */
-        if (-1 != params->ap_isolate) 
+        if (-1 != params->ap_isolate)
         {
             pAdapter->sessionCtx.ap.apDisableIntraBssFwd = !!params->ap_isolate;
-        } 
+        }
     }
 
     EXIT();
@@ -2542,12 +2522,12 @@
                     pConfig->dot11Mode = eHDD_DOT11_MODE_11ac;
                 }
 #endif
-                pRoamProfile->phyMode = 
+                pRoamProfile->phyMode =
                 hdd_cfg_xlate_to_csr_phy_mode(pConfig->dot11Mode);
                 wdev->iftype = type;
                 //Check for sub-string p2p to confirm its a p2p interface
                 if (NULL != strstr(ndev->name,"p2p"))
-                {     
+                {
                     pAdapter->device_mode = (type == NL80211_IFTYPE_STATION) ?
                                 WLAN_HDD_P2P_DEVICE : WLAN_HDD_P2P_CLIENT;
                 }
@@ -2609,7 +2589,7 @@
                 //before starting Go
                 if(WLAN_HDD_P2P_GO == pAdapter->device_mode)
                 {
-                    if(VOS_STATUS_E_FAILURE == 
+                    if(VOS_STATUS_E_FAILURE ==
                        hdd_disable_bmps_imps(pHddCtx, WLAN_HDD_P2P_GO))
                     {
                        //Fail to Exit BMPS
@@ -2758,7 +2738,7 @@
     /*set bitmask based on updated value*/
     wlan_hdd_set_concurrency_mode(pHddCtx, pAdapter->device_mode);
 #ifdef WLAN_BTAMP_FEATURE
-    if((NL80211_IFTYPE_STATION == type) && (pHddCtx->concurrency_mode <= 1) && 
+    if((NL80211_IFTYPE_STATION == type) && (pHddCtx->concurrency_mode <= 1) &&
        (pHddCtx->no_of_sessions[WLAN_HDD_INFRA_STATION] <=1))
     {
         //we are ok to do AMP
@@ -2965,7 +2945,7 @@
     {
         if (params->sta_flags_set & BIT(NL80211_STA_FLAG_AUTHORIZED))
         {
-            status = hdd_softap_change_STA_state( pAdapter, &STAMacAddress, 
+            status = hdd_softap_change_STA_state( pAdapter, &STAMacAddress,
                                                   WLANTL_STA_AUTHENTICATED);
 
             VOS_TRACE( VOS_MODULE_ID_HDD_SOFTAP, VOS_TRACE_LEVEL_ERROR,
@@ -3044,7 +3024,7 @@
         }
     }
 #endif
-    
+
     EXIT();
     return status;
 }
@@ -3056,15 +3036,15 @@
 static u8 wlan_hdd_cfg80211_get_ibss_peer_staidx(hdd_adapter_t* pAdapter)
 {
     u8 idx = 0;
-    u8 temp[VOS_MAC_ADDR_SIZE] = {0}; 
+    u8 temp[VOS_MAC_ADDR_SIZE] = {0};
     ENTER();
     memset(temp, 0, VOS_MAC_ADDR_SIZE);
     for ( idx = 0; idx < HDD_MAX_NUM_IBSS_STA; idx++ )
     {
-        if ( (0 != 
-            (WLAN_HDD_GET_STATION_CTX_PTR(pAdapter))->conn_info.staId[idx]) 
+        if ( (0 !=
+            (WLAN_HDD_GET_STATION_CTX_PTR(pAdapter))->conn_info.staId[idx])
           && memcmp((u8*)&(WLAN_HDD_GET_STATION_CTX_PTR(pAdapter))->conn_info.peerMacAddress[idx],
-                                                     temp, VOS_MAC_ADDR_SIZE) 
+                                                     temp, VOS_MAC_ADDR_SIZE)
            )
         {
             return idx;
@@ -3298,8 +3278,8 @@
 
         pHddStaCtx->roam_info.roamingState = HDD_ROAM_STATE_SETTING_KEY;
 
-    if (!(  ( IW_AUTH_KEY_MGMT_802_1X 
-                    == (pWextState->authKeyMgmt & IW_AUTH_KEY_MGMT_802_1X)) 
+    if (!(  ( IW_AUTH_KEY_MGMT_802_1X
+                    == (pWextState->authKeyMgmt & IW_AUTH_KEY_MGMT_802_1X))
                     && (eCSR_AUTH_TYPE_OPEN_SYSTEM == pHddStaCtx->conn_info.authType)
              )
                 &&
@@ -3309,20 +3289,20 @@
            )
         {
             /* in case of static WEP, macaddr/bssid is not coming from nl80211
-             * interface, copy bssid for pairwise key and group macaddr for 
+             * interface, copy bssid for pairwise key and group macaddr for
              * group key initialization*/
 
             tCsrRoamProfile          *pRoamProfile = &pWextState->roamProfile;
 
-            pWextState->roamProfile.negotiatedUCEncryptionType = 
-                pHddStaCtx->conn_info.ucEncryptionType = 
+            pWextState->roamProfile.negotiatedUCEncryptionType =
+                pHddStaCtx->conn_info.ucEncryptionType =
                 ((WLAN_CIPHER_SUITE_WEP40 == params->cipher) ?
                  eCSR_ENCRYPT_TYPE_WEP40_STATICKEY :
                  eCSR_ENCRYPT_TYPE_WEP104_STATICKEY);
 
 
-            hddLog(VOS_TRACE_LEVEL_INFO_MED, 
-                    "%s: Negotiated encryption type %d", __func__, 
+            hddLog(VOS_TRACE_LEVEL_INFO_MED,
+                    "%s: Negotiated encryption type %d", __func__,
                     pWextState->roamProfile.negotiatedUCEncryptionType);
 
             sme_SetCfgPrivacy((tpAniSirGlobal)WLAN_HDD_GET_HAL_CTX(pAdapter),
@@ -3331,7 +3311,7 @@
             setKey.keyDirection =  eSIR_TX_RX;
 
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38))
-            if (pairwise) 
+            if (pairwise)
             {
 #endif
                 if (mac_addr)
@@ -3340,7 +3320,7 @@
                 }
                 else
                 {
-                    /* macaddr is NULL, set the peerMac to bssId in case of BSS, 
+                    /* macaddr is NULL, set the peerMac to bssId in case of BSS,
                      * and peerMacAddress in case of IBSS*/
                     if (eCSR_BSS_TYPE_START_IBSS == pRoamProfile->BSSType)
                     {
@@ -3351,13 +3331,13 @@
                                     &pHddStaCtx->conn_info.peerMacAddress[staidx],
                                     WNI_CFG_BSSID_LEN);
 
-                        } 
+                        }
                         else
                         {
-                            hddLog(VOS_TRACE_LEVEL_ERROR, "%s: No peerMac found", 
+                            hddLog(VOS_TRACE_LEVEL_ERROR, "%s: No peerMac found",
                                     __func__);
                             return -EOPNOTSUPP;
-                        } 
+                        }
                     }
                     else
                     {
@@ -3383,7 +3363,7 @@
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38))
                 (!pairwise)
 #else
-                (!mac_addr || is_broadcast_ether_addr(mac_addr)) 
+                (!mac_addr || is_broadcast_ether_addr(mac_addr))
 #endif
                 )
         {
@@ -3404,11 +3384,11 @@
             vos_mem_copy(setKey.peerMac, mac_addr,WNI_CFG_BSSID_LEN);
         }
 
-        hddLog(VOS_TRACE_LEVEL_INFO_MED, 
+        hddLog(VOS_TRACE_LEVEL_INFO_MED,
                 "%s: set key for peerMac %2x:%2x:%2x:%2x:%2x:%2x, direction %d",
-                __func__, setKey.peerMac[0], setKey.peerMac[1], 
-                setKey.peerMac[2], setKey.peerMac[3], 
-                setKey.peerMac[4], setKey.peerMac[5], 
+                __func__, setKey.peerMac[0], setKey.peerMac[1],
+                setKey.peerMac[2], setKey.peerMac[3],
+                setKey.peerMac[4], setKey.peerMac[5],
                 setKey.keyDirection);
 
         vos_status = wlan_hdd_check_ula_done(pAdapter);
@@ -3441,19 +3421,19 @@
 
         if ( 0 != status )
         {
-            hddLog(VOS_TRACE_LEVEL_ERROR, 
+            hddLog(VOS_TRACE_LEVEL_ERROR,
                     "%s: sme_RoamSetKey failed, returned %d", __func__, status);
             pHddStaCtx->roam_info.roamingState = HDD_ROAM_STATE_NONE;
             return -EINVAL;
         }
 
 
-        /* in case of IBSS as there was no information available about WEP keys during 
-         * IBSS join, group key intialized with NULL key, so re-initialize group key 
+        /* in case of IBSS as there was no information available about WEP keys during
+         * IBSS join, group key intialized with NULL key, so re-initialize group key
          * with correct value*/
-        if ( (eCSR_BSS_TYPE_START_IBSS == pWextState->roamProfile.BSSType) && 
-            !(  ( IW_AUTH_KEY_MGMT_802_1X 
-                    == (pWextState->authKeyMgmt & IW_AUTH_KEY_MGMT_802_1X)) 
+        if ( (eCSR_BSS_TYPE_START_IBSS == pWextState->roamProfile.BSSType) &&
+            !(  ( IW_AUTH_KEY_MGMT_802_1X
+                    == (pWextState->authKeyMgmt & IW_AUTH_KEY_MGMT_802_1X))
                     && (eCSR_AUTH_TYPE_OPEN_SYSTEM == pHddStaCtx->conn_info.authType)
                  )
                 &&
@@ -3465,20 +3445,20 @@
             setKey.keyDirection = eSIR_RX_ONLY;
             vos_mem_copy(setKey.peerMac,groupmacaddr,WNI_CFG_BSSID_LEN);
 
-            hddLog(VOS_TRACE_LEVEL_INFO_MED, 
+            hddLog(VOS_TRACE_LEVEL_INFO_MED,
                     "%s: set key peerMac %2x:%2x:%2x:%2x:%2x:%2x, direction %d",
-                    __func__, setKey.peerMac[0], setKey.peerMac[1], 
-                    setKey.peerMac[2], setKey.peerMac[3], 
-                    setKey.peerMac[4], setKey.peerMac[5], 
+                    __func__, setKey.peerMac[0], setKey.peerMac[1],
+                    setKey.peerMac[2], setKey.peerMac[3],
+                    setKey.peerMac[4], setKey.peerMac[5],
                     setKey.keyDirection);
 
-            status = sme_RoamSetKey( WLAN_HDD_GET_HAL_CTX(pAdapter), 
+            status = sme_RoamSetKey( WLAN_HDD_GET_HAL_CTX(pAdapter),
                     pAdapter->sessionId, &setKey, &roamId );
 
             if ( 0 != status )
             {
-                hddLog(VOS_TRACE_LEVEL_ERROR, 
-                        "%s: sme_RoamSetKey failed for group key (IBSS), returned %d", 
+                hddLog(VOS_TRACE_LEVEL_ERROR,
+                        "%s: sme_RoamSetKey failed for group key (IBSS), returned %d",
                         __func__, status);
                 pHddStaCtx->roam_info.roamingState = HDD_ROAM_STATE_NONE;
                 return -EINVAL;
@@ -3494,38 +3474,38 @@
  * This function is used to get the key information
  */
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38))
-static int wlan_hdd_cfg80211_get_key( 
-                        struct wiphy *wiphy, 
+static int wlan_hdd_cfg80211_get_key(
+                        struct wiphy *wiphy,
                         struct net_device *ndev,
-                        u8 key_index, bool pairwise, 
+                        u8 key_index, bool pairwise,
                         const u8 *mac_addr, void *cookie,
                         void (*callback)(void *cookie, struct key_params*)
                         )
 #else
-static int wlan_hdd_cfg80211_get_key( 
-                        struct wiphy *wiphy, 
+static int wlan_hdd_cfg80211_get_key(
+                        struct wiphy *wiphy,
                         struct net_device *ndev,
                         u8 key_index, const u8 *mac_addr, void *cookie,
                         void (*callback)(void *cookie, struct key_params*)
                         )
 #endif
 {
-    hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR( ndev ); 
+    hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR( ndev );
     hdd_wext_state_t *pWextState= WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
     tCsrRoamProfile *pRoamProfile = &(pWextState->roamProfile);
     struct key_params params;
 
     ENTER();
-    
+
     hddLog(VOS_TRACE_LEVEL_INFO, "%s: device_mode = %d\n",
                                  __func__,pAdapter->device_mode);
-    
+
     memset(&params, 0, sizeof(params));
 
     if (CSR_MAX_NUM_KEY <= key_index)
     {
         return -EINVAL;
-    }   
+    }
 
     switch(pRoamProfile->EncryptionType.encryptionType[0])
     {
@@ -3569,14 +3549,14 @@
  * This function is used to delete the key information
  */
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38))
-static int wlan_hdd_cfg80211_del_key( struct wiphy *wiphy, 
+static int wlan_hdd_cfg80211_del_key( struct wiphy *wiphy,
                                       struct net_device *ndev,
-                                      u8 key_index, 
-                                      bool pairwise, 
+                                      u8 key_index,
+                                      bool pairwise,
                                       const u8 *mac_addr
                                     )
 #else
-static int wlan_hdd_cfg80211_del_key( struct wiphy *wiphy, 
+static int wlan_hdd_cfg80211_del_key( struct wiphy *wiphy,
                                       struct net_device *ndev,
                                       u8 key_index,
                                       const u8 *mac_addr
@@ -3586,17 +3566,17 @@
     int status = 0;
 
     //This code needs to be revisited. There is sme_removeKey API, we should
-    //plan to use that. After the change to use correct index in setkey, 
+    //plan to use that. After the change to use correct index in setkey,
     //it is observed that this is invalidating peer
     //key index whenever re-key is done. This is affecting data link.
     //It should be ok to ignore del_key.
 #if 0
-    hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR( ndev ); 
-    v_CONTEXT_t pVosContext = (WLAN_HDD_GET_CTX(pAdapter))->pvosContext;  
+    hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR( ndev );
+    v_CONTEXT_t pVosContext = (WLAN_HDD_GET_CTX(pAdapter))->pvosContext;
     u8 groupmacaddr[WNI_CFG_BSSID_LEN] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
     tCsrRoamSetKey  setKey;
     v_U32_t roamId= 0xFF;
-    
+
     ENTER();
 
     hddLog(VOS_TRACE_LEVEL_INFO_HIGH, "%s: device_mode = %d\n",
@@ -3604,7 +3584,7 @@
 
     if (CSR_MAX_NUM_KEY <= key_index)
     {
-        hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Invalid key index %d", __func__, 
+        hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Invalid key index %d", __func__,
                 key_index);
 
         return -EINVAL;
@@ -3622,15 +3602,15 @@
 
     if ((pAdapter->device_mode == WLAN_HDD_SOFTAP)
       || (pAdapter->device_mode == WLAN_HDD_P2P_GO)
-       ) 
-    { 
-       
-        hdd_hostapd_state_t *pHostapdState =  
+       )
+    {
+
+        hdd_hostapd_state_t *pHostapdState =
                                   WLAN_HDD_GET_HOSTAP_STATE_PTR(pAdapter);
         if( pHostapdState->bssState == BSS_START)
         {
             status = WLANSAP_SetKeySta( pVosContext, &setKey);
-    
+
             if ( status != eHAL_STATUS_SUCCESS )
             {
                 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
@@ -3640,27 +3620,27 @@
         }
     }
     else if ( (pAdapter->device_mode == WLAN_HDD_INFRA_STATION)
-           || (pAdapter->device_mode == WLAN_HDD_P2P_CLIENT) 
+           || (pAdapter->device_mode == WLAN_HDD_P2P_CLIENT)
             )
     {
         hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
 
-        pHddStaCtx->roam_info.roamingState = HDD_ROAM_STATE_SETTING_KEY;   
-    
-        hddLog(VOS_TRACE_LEVEL_INFO_MED, 
+        pHddStaCtx->roam_info.roamingState = HDD_ROAM_STATE_SETTING_KEY;
+
+        hddLog(VOS_TRACE_LEVEL_INFO_MED,
                 "%s: delete key for peerMac %2x:%2x:%2x:%2x:%2x:%2x",
-                __func__, setKey.peerMac[0], setKey.peerMac[1], 
-                setKey.peerMac[2], setKey.peerMac[3], 
+                __func__, setKey.peerMac[0], setKey.peerMac[1],
+                setKey.peerMac[2], setKey.peerMac[3],
                 setKey.peerMac[4], setKey.peerMac[5]);
-        if(pAdapter->sessionCtx.station.conn_info.connState == 
-                                       eConnectionState_Associated) 
+        if(pAdapter->sessionCtx.station.conn_info.connState ==
+                                       eConnectionState_Associated)
         {
-            status = sme_RoamSetKey( WLAN_HDD_GET_HAL_CTX(pAdapter), 
+            status = sme_RoamSetKey( WLAN_HDD_GET_HAL_CTX(pAdapter),
                                    pAdapter->sessionId, &setKey, &roamId );
-        
+
             if ( 0 != status )
             {
-                hddLog(VOS_TRACE_LEVEL_ERROR, 
+                hddLog(VOS_TRACE_LEVEL_ERROR,
                         "%s: sme_RoamSetKey failure, returned %d",
                                                      __func__, status);
                 pHddStaCtx->roam_info.roamingState = HDD_ROAM_STATE_NONE;
@@ -3688,7 +3668,7 @@
                                               u8 key_index)
 #endif
 {
-    hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR( ndev ); 
+    hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR( ndev );
     hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
     int status = 0;
     hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
@@ -3697,10 +3677,10 @@
 
     hddLog(VOS_TRACE_LEVEL_INFO, "%s: device_mode = %d key_index = %d \n",
                                          __func__,pAdapter->device_mode, key_index);
-   
+
     if (CSR_MAX_NUM_KEY <= key_index)
     {
-        hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Invalid key index %d", __func__, 
+        hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Invalid key index %d", __func__,
                 key_index);
 
         return -EINVAL;
@@ -3712,54 +3692,54 @@
                 "%s:LOGP in Progress. Ignore!!!", __func__);
         return -EAGAIN;
     }
-    
+
     if ((pAdapter->device_mode == WLAN_HDD_INFRA_STATION)
      || (pAdapter->device_mode == WLAN_HDD_P2P_CLIENT)
-       ) 
+       )
     {
-        if ( (key_index != pWextState->roamProfile.Keys.defaultIndex) && 
-             (eCSR_ENCRYPT_TYPE_TKIP != 
+        if ( (key_index != pWextState->roamProfile.Keys.defaultIndex) &&
+             (eCSR_ENCRYPT_TYPE_TKIP !=
                 pWextState->roamProfile.EncryptionType.encryptionType[0]) &&
-             (eCSR_ENCRYPT_TYPE_AES != 
+             (eCSR_ENCRYPT_TYPE_AES !=
                 pWextState->roamProfile.EncryptionType.encryptionType[0])
            )
-        {  
-            /* if default key index is not same as previous one, 
+        {
+            /* if default key index is not same as previous one,
              * then update the default key index */
-    
+
             tCsrRoamSetKey  setKey;
             v_U32_t roamId= 0xFF;
             tCsrKeys *Keys = &pWextState->roamProfile.Keys;
-            
-            hddLog(VOS_TRACE_LEVEL_INFO_HIGH, "%s: default tx key index %d", 
+
+            hddLog(VOS_TRACE_LEVEL_INFO_HIGH, "%s: default tx key index %d",
                     __func__, key_index);
-            
+
             Keys->defaultIndex = (u8)key_index;
             vos_mem_zero(&setKey,sizeof(tCsrRoamSetKey));
             setKey.keyId = key_index;
             setKey.keyLength = Keys->KeyLength[key_index];
-            
-            vos_mem_copy(&setKey.Key[0], 
-                    &Keys->KeyMaterial[key_index][0], 
+
+            vos_mem_copy(&setKey.Key[0],
+                    &Keys->KeyMaterial[key_index][0],
                     Keys->KeyLength[key_index]);
-    
+
             setKey.keyDirection = eSIR_TX_ONLY;
-    
-            vos_mem_copy(setKey.peerMac, 
+
+            vos_mem_copy(setKey.peerMac,
                     &pHddStaCtx->conn_info.bssId[0],
                     WNI_CFG_BSSID_LEN);
-    
-            setKey.encType = 
+
+            setKey.encType =
                 pWextState->roamProfile.EncryptionType.encryptionType[0];
-             
+
             /* issue set key request */
-            status = sme_RoamSetKey( WLAN_HDD_GET_HAL_CTX(pAdapter), 
+            status = sme_RoamSetKey( WLAN_HDD_GET_HAL_CTX(pAdapter),
                                    pAdapter->sessionId, &setKey, &roamId );
-    
+
             if ( 0 != status )
             {
-                hddLog(VOS_TRACE_LEVEL_ERROR, 
-                        "%s: sme_RoamSetKey failed, returned %d", __func__, 
+                hddLog(VOS_TRACE_LEVEL_ERROR,
+                        "%s: sme_RoamSetKey failed, returned %d", __func__,
                         status);
                 return -EINVAL;
             }
@@ -3780,7 +3760,7 @@
             pAPCtx->wepKey[key_index].keyDirection = eSIR_TX_DEFAULT;
         }
     }
- 
+
     return status;
 }
 
@@ -3843,8 +3823,8 @@
     {
         rssi = (VOS_MIN ((pBssDesc->rssi + pBssDesc->sinr), 0))*100;
 
-        return (cfg80211_inform_bss(wiphy, chan, pBssDesc->bssId, 
-                le64_to_cpu(*(__le64 *)pBssDesc->timeStamp), 
+        return (cfg80211_inform_bss(wiphy, chan, pBssDesc->bssId,
+                le64_to_cpu(*(__le64 *)pBssDesc->timeStamp),
                 pBssDesc->capabilityInfo,
                 pBssDesc->beaconInterval, ie, ie_length,
                 rssi, GFP_KERNEL ));
@@ -3941,12 +3921,12 @@
         (u16)(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_PROBE_RESP);
 
 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,38))
-    if (chan_no <= ARRAY_SIZE(hdd_channels_2_4_GHZ) && 
+    if (chan_no <= ARRAY_SIZE(hdd_channels_2_4_GHZ) &&
         (wiphy->bands[IEEE80211_BAND_2GHZ] != NULL))
     {
         freq = ieee80211_channel_to_frequency(chan_no, IEEE80211_BAND_2GHZ);
     }
-    else if ((chan_no > ARRAY_SIZE(hdd_channels_2_4_GHZ)) && 
+    else if ((chan_no > ARRAY_SIZE(hdd_channels_2_4_GHZ)) &&
         (wiphy->bands[IEEE80211_BAND_5GHZ] != NULL))
 
     {
@@ -3980,7 +3960,7 @@
        return NULL;
     }
     /*To keep the rssi icon of the connected AP in the scan window
-    *and the rssi icon of the wireless networks in sync 
+    *and the rssi icon of the wireless networks in sync
     * */
     if (( eConnectionState_Associated ==
              pAdapter->sessionCtx.station.conn_info.connState ) &&
@@ -4006,7 +3986,7 @@
  * FUNCTION: wlan_hdd_cfg80211_update_bss_db
  * This function is used to update the BSS data base of CFG8011
  */
-struct cfg80211_bss* wlan_hdd_cfg80211_update_bss_db( hdd_adapter_t *pAdapter, 
+struct cfg80211_bss* wlan_hdd_cfg80211_update_bss_db( hdd_adapter_t *pAdapter,
                                       tCsrRoamInfo *pRoamInfo
                                       )
 {
@@ -4021,7 +4001,7 @@
 
     if (NULL != roamProfile.pBssDesc)
     {
-        bss = wlan_hdd_cfg80211_inform_bss(pAdapter, 
+        bss = wlan_hdd_cfg80211_inform_bss(pAdapter,
                 &roamProfile);
 
         if (NULL == bss)
@@ -4043,10 +4023,10 @@
 /*
  * FUNCTION: wlan_hdd_cfg80211_update_bss
  */
-static int wlan_hdd_cfg80211_update_bss( struct wiphy *wiphy, 
-                                         hdd_adapter_t *pAdapter 
+static int wlan_hdd_cfg80211_update_bss( struct wiphy *wiphy,
+                                         hdd_adapter_t *pAdapter
                                         )
-{   
+{
     tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
     tCsrScanResultInfo *pScanResult;
     eHalStatus status = 0;
@@ -4077,20 +4057,20 @@
 
     while (pScanResult)
     {
-        /* 
-         * cfg80211_inform_bss() is not updating ie field of bss entry, if 
-         * entry already exists in bss data base of cfg80211 for that 
-         * particular BSS ID.  Using cfg80211_inform_bss_frame to update the 
-         * bss entry instead of cfg80211_inform_bss, But this call expects 
-         * mgmt packet as input. As of now there is no possibility to get 
-         * the mgmt(probe response) frame from PE, converting bss_desc to 
+        /*
+         * cfg80211_inform_bss() is not updating ie field of bss entry, if
+         * entry already exists in bss data base of cfg80211 for that
+         * particular BSS ID.  Using cfg80211_inform_bss_frame to update the
+         * bss entry instead of cfg80211_inform_bss, But this call expects
+         * mgmt packet as input. As of now there is no possibility to get
+         * the mgmt(probe response) frame from PE, converting bss_desc to
          * ieee80211_mgmt(probe response) and passing to c
          * fg80211_inform_bss_frame.
          * */
 
         bss_status = wlan_hdd_cfg80211_inform_bss_frame(pAdapter,
                 &pScanResult->BssDescriptor);
-    
+
 
         if (NULL == bss_status)
         {
@@ -4105,15 +4085,15 @@
         pScanResult = sme_ScanResultGetNext(hHal, pResult);
     }
 
-    sme_ScanResultPurge(hHal, pResult); 
+    sme_ScanResultPurge(hHal, pResult);
 
-    return 0; 
+    return 0;
 }
 
 void
 hddPrintMacAddr(tCsrBssid macAddr, tANI_U8 logLevel)
 {
-    VOS_TRACE(VOS_MODULE_ID_HDD, logLevel, 
+    VOS_TRACE(VOS_MODULE_ID_HDD, logLevel,
               "%02X:%02X:%02X:%02X:%02X:%02X\n",
               macAddr[0], macAddr[1], macAddr[2], macAddr[3], macAddr[4],
               macAddr[5]);
@@ -4122,7 +4102,7 @@
 void
 hddPrintPmkId(tANI_U8 *pmkId, tANI_U8 logLevel)
 {
-    VOS_TRACE(VOS_MODULE_ID_HDD, logLevel, 
+    VOS_TRACE(VOS_MODULE_ID_HDD, logLevel,
               "%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X\n",
               pmkId[0], pmkId[1], pmkId[2], pmkId[3], pmkId[4],
               pmkId[5], pmkId[6], pmkId[7], pmkId[8], pmkId[9], pmkId[10],
@@ -4155,7 +4135,7 @@
  * This function is used to notify the supplicant of a new PMKSA candidate.
  */
 int wlan_hdd_cfg80211_pmksa_candidate_notify(
-                    hdd_adapter_t *pAdapter, tCsrRoamInfo *pRoamInfo, 
+                    hdd_adapter_t *pAdapter, tCsrRoamInfo *pRoamInfo,
                     int index, bool preauth )
 {
 #ifdef FEATURE_WLAN_OKC
@@ -4178,7 +4158,7 @@
                                     pRoamInfo->bssid, preauth, GFP_KERNEL);
     }
 #endif  /* FEATURE_WLAN_OKC */
-    return 0; 
+    return 0;
 }
 #endif //FEATURE_WLAN_LFR
 
@@ -4187,11 +4167,11 @@
  * scanning callback function, called after finishing scan
  *
  */
-static eHalStatus hdd_cfg80211_scan_done_callback(tHalHandle halHandle, 
+static eHalStatus hdd_cfg80211_scan_done_callback(tHalHandle halHandle,
         void *pContext, tANI_U32 scanId, eCsrScanStatus status)
 {
     struct net_device *dev = (struct net_device *) pContext;
-    //struct wireless_dev *wdev = dev->ieee80211_ptr;    
+    //struct wireless_dev *wdev = dev->ieee80211_ptr;
     hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR( dev );
     hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
     hdd_scaninfo_t *pScanInfo = &pHddCtx->scan_info;
@@ -4202,7 +4182,7 @@
 
     hddLog(VOS_TRACE_LEVEL_INFO,
             "%s called with halHandle = %p, pContext = %p,"
-            "scanID = %d, returned status = %d\n", 
+            "scanID = %d, returned status = %d\n",
             __func__, halHandle, pContext, (int) scanId, (int) status);
 
     //Block on scan req completion variable. Can't wait forever though.
@@ -4222,19 +4202,19 @@
     }
 
     /* Check the scanId */
-    if (pScanInfo->scanId != scanId) 
+    if (pScanInfo->scanId != scanId)
     {
         hddLog(VOS_TRACE_LEVEL_INFO,
                 "%s called with mismatched scanId pScanInfo->scanId = %d "
-                "scanId = %d \n", __func__, (int) pScanInfo->scanId, 
+                "scanId = %d \n", __func__, (int) pScanInfo->scanId,
                 (int) scanId);
     }
 
-    ret = wlan_hdd_cfg80211_update_bss((WLAN_HDD_GET_CTX(pAdapter))->wiphy, 
+    ret = wlan_hdd_cfg80211_update_bss((WLAN_HDD_GET_CTX(pAdapter))->wiphy,
                                         pAdapter);
 
     if (0 > ret)
-        hddLog(VOS_TRACE_LEVEL_INFO, "%s: NO SCAN result", __func__);    
+        hddLog(VOS_TRACE_LEVEL_INFO, "%s: NO SCAN result", __func__);
 
 
     /* If any client wait scan result through WEXT
@@ -4275,7 +4255,7 @@
 
     /*
      * setting up 0, just in case.
-     */  
+     */
     req->n_ssids = 0;
     req->n_channels = 0;
     req->ie = 0;
@@ -4332,7 +4312,7 @@
         if( pAdapter )
         {
             hddLog(VOS_TRACE_LEVEL_INFO,
-                    "%s: Adapter with device mode %d exists", 
+                    "%s: Adapter with device mode %d exists",
                     __func__, pAdapter->device_mode);
             if ((WLAN_HDD_INFRA_STATION == pAdapter->device_mode) ||
                     (WLAN_HDD_P2P_CLIENT == pAdapter->device_mode) ||
@@ -4345,7 +4325,7 @@
                     staMac = (v_U8_t *) &(pAdapter->macAddressCurrent.bytes[0]);
                     hddLog(VOS_TRACE_LEVEL_ERROR,
                             "%s: client %02x:%02x:%02x:%02x:%02x:%02x is in the "
-                            "middle of WPS/EAPOL exchange.", __func__, 
+                            "middle of WPS/EAPOL exchange.", __func__,
                             staMac[0], staMac[1], staMac[2],
                             staMac[3], staMac[4], staMac[5]);
                     return VOS_FALSE;
@@ -4356,14 +4336,14 @@
             {
                 for (staId = 0; staId < WLAN_MAX_STA_COUNT; staId++)
                 {
-                    if ((pAdapter->aStaInfo[staId].isUsed) && 
+                    if ((pAdapter->aStaInfo[staId].isUsed) &&
                             (WLANTL_STA_CONNECTED == pAdapter->aStaInfo[staId].tlSTAState))
                     {
                         staMac = (v_U8_t *) &(pAdapter->aStaInfo[staId].macAddrSTA.bytes[0]);
 
                         hddLog(VOS_TRACE_LEVEL_ERROR,
                                 "%s: client %02x:%02x:%02x:%02x:%02x:%02x of SoftAP/P2P-GO is in the "
-                                "middle of WPS/EAPOL exchange.", __func__, 
+                                "middle of WPS/EAPOL exchange.", __func__,
                                 staMac[0], staMac[1], staMac[2],
                                 staMac[3], staMac[4], staMac[5]);
                         return VOS_FALSE;
@@ -4377,7 +4357,7 @@
     hddLog(VOS_TRACE_LEVEL_INFO,
             "%s: Scan allowed", __func__);
     return VOS_TRUE;
-} 
+}
 
 /*
  * FUNCTION: wlan_hdd_cfg80211_scan
@@ -4393,7 +4373,7 @@
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0))
    struct net_device *dev = request->wdev->netdev;
 #endif
-    hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR( dev ); 
+    hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR( dev );
     hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX( pAdapter );
     hdd_wext_state_t *pwextBuf = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
     hdd_config_t *cfg_param = (WLAN_HDD_GET_CTX(pAdapter))->cfg_ini;
@@ -4456,7 +4436,7 @@
                   "%s:Unloading/Loading in Progress. Ignore!!!", __func__);
         return -EAGAIN;
     }
-    //Don't Allow Scan and return busy if Remain On 
+    //Don't Allow Scan and return busy if Remain On
     //Channel and action frame is pending
     //Otherwise Cancel Remain On Channel and allow Scan
     //If no action frame pending
@@ -4488,13 +4468,13 @@
         VOS_TRACE(VOS_MODULE_ID_HDD,VOS_TRACE_LEVEL_ERROR,
                   "%s: Acquire lock fail", __func__);
         return -EAGAIN;
-    }    
+    }
     if (TRUE == pHddCtx->tmInfo.tmAction.enterImps)
     {
         hddLog(VOS_TRACE_LEVEL_WARN,
                "%s: MAX TM Level Scan not allowed", __func__);
         mutex_unlock(&pHddCtx->tmInfo.tmOperationLock);
-        return -EBUSY;                  
+        return -EBUSY;
     }
     mutex_unlock(&pHddCtx->tmInfo.tmOperationLock);
 
@@ -4505,13 +4485,13 @@
         hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Scan not allowed", __func__);
         return -EBUSY;
     }
-    
+
     vos_mem_zero( &scanRequest, sizeof(scanRequest));
 
     if (NULL != request)
     {
         hddLog(VOS_TRACE_LEVEL_INFO, "scan request for ssid = %d",
-               (int)request->n_ssids);  
+               (int)request->n_ssids);
 
         /* Even though supplicant doesn't provide any SSIDs, n_ssids is set to 1.
          * Becasue of this, driver is assuming that this is not wildcard scan and so
@@ -4563,7 +4543,7 @@
             /*Set the scan type to default type, in this case it is ACTIVE*/
             scanRequest.scanType = pScanInfo->scan_mode;
         }
-        scanRequest.minChnTime = cfg_param->nActiveMinChnTime; 
+        scanRequest.minChnTime = cfg_param->nActiveMinChnTime;
         scanRequest.maxChnTime = cfg_param->nActiveMaxChnTime;
     }
     else
@@ -4603,16 +4583,16 @@
 
         /* set requestType to full scan */
         scanRequest.requestType = eCSR_SCAN_REQUEST_FULL_SCAN;
- 
-        /* Flush the scan results(only p2p beacons) for STA scan and P2P 
+
+        /* Flush the scan results(only p2p beacons) for STA scan and P2P
          * search (Flush on both full  scan and social scan but not on single
-         * channel scan).P2P  search happens on 3 social channels (1, 6, 11) 
+         * channel scan).P2P  search happens on 3 social channels (1, 6, 11)
          */
 
         /* Supplicant does single channel scan after 8-way handshake
-         * and in that case driver shoudnt flush scan results. If 
-         * driver flushes the scan results here and unfortunately if 
-         * the AP doesnt respond to our probe req then association 
+         * and in that case driver shoudnt flush scan results. If
+         * driver flushes the scan results here and unfortunately if
+         * the AP doesnt respond to our probe req then association
          * fails which is not desired
          */
 
@@ -4752,9 +4732,9 @@
 
 /*
  * FUNCTION: wlan_hdd_cfg80211_connect_start
- * This function is used to start the association process 
+ * This function is used to start the association process
  */
-int wlan_hdd_cfg80211_connect_start( hdd_adapter_t  *pAdapter, 
+int wlan_hdd_cfg80211_connect_start( hdd_adapter_t  *pAdapter,
         const u8 *ssid, size_t ssid_len, const u8 *bssid, u8 operatingChannel)
 {
     int status = 0;
@@ -4767,7 +4747,7 @@
     ENTER();
 
     pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
-    
+
     if (SIR_MAC_MAX_SSID_LENGTH < ssid_len)
     {
         hddLog(VOS_TRACE_LEVEL_ERROR, "%s: wrong SSID len", __func__);
@@ -4776,7 +4756,7 @@
 
     pRoamProfile = &pWextState->roamProfile;
 
-    if (pRoamProfile) 
+    if (pRoamProfile)
     {
         int ret = 0;
         hdd_station_ctx_t *pHddStaCtx;
@@ -4789,7 +4769,7 @@
         {
             /* Issue disconnect to CSR */
             INIT_COMPLETION(pAdapter->disconnect_comp_var);
-            if( eHAL_STATUS_SUCCESS == 
+            if( eHAL_STATUS_SUCCESS ==
                   sme_RoamDisconnect( WLAN_HDD_GET_HAL_CTX(pAdapter),
                             pAdapter->sessionId,
                             eCSR_DISCONNECT_REASON_UNSPECIFIED ) )
@@ -4814,7 +4794,7 @@
             }
         }
 
-        if (HDD_WMM_USER_MODE_NO_QOS == 
+        if (HDD_WMM_USER_MODE_NO_QOS ==
                         (WLAN_HDD_GET_CTX(pAdapter))->cfg_ini->WmmMode)
         {
             /*QoS not enabled in cfg file*/
@@ -4823,14 +4803,14 @@
         else
         {
             /*QoS enabled, update uapsd mask from cfg file*/
-            pRoamProfile->uapsd_mask = 
+            pRoamProfile->uapsd_mask =
                      (WLAN_HDD_GET_CTX(pAdapter))->cfg_ini->UapsdMask;
         }
 
         pRoamProfile->SSIDs.numOfSSIDs = 1;
         pRoamProfile->SSIDs.SSIDList->SSID.length = ssid_len;
         vos_mem_zero(pRoamProfile->SSIDs.SSIDList->SSID.ssId,
-                sizeof(pRoamProfile->SSIDs.SSIDList->SSID.ssId)); 
+                sizeof(pRoamProfile->SSIDs.SSIDList->SSID.ssId));
         vos_mem_copy((void *)(pRoamProfile->SSIDs.SSIDList->SSID.ssId),
                 ssid, ssid_len);
 
@@ -4839,8 +4819,8 @@
             pRoamProfile->BSSIDs.numOfBSSIDs = 1;
             vos_mem_copy((void *)(pRoamProfile->BSSIDs.bssid), bssid,
                     WNI_CFG_BSSID_LEN);
-            /* Save BSSID in seperate variable as well, as RoamProfile 
-               BSSID is getting zeroed out in the association process. And in 
+            /* Save BSSID in seperate variable as well, as RoamProfile
+               BSSID is getting zeroed out in the association process. And in
                case of join failure we should send valid BSSID to supplicant
              */
             vos_mem_copy((void *)(pWextState->req_bssId), bssid,
@@ -4849,26 +4829,26 @@
 
         if ((IW_AUTH_WPA_VERSION_WPA == pWextState->wpaVersion) ||
                 (IW_AUTH_WPA_VERSION_WPA2 == pWextState->wpaVersion))
-        { 
+        {
             /*set gen ie*/
             hdd_SetGENIEToCsr(pAdapter, &RSNAuthType);
             /*set auth*/
             hdd_set_csr_auth_type(pAdapter, RSNAuthType);
         }
-        else if ( (pWextState->roamProfile.AuthType.authType[0] == 
+        else if ( (pWextState->roamProfile.AuthType.authType[0] ==
                     eCSR_AUTH_TYPE_OPEN_SYSTEM)
-                && ((pWextState->roamProfile.EncryptionType.encryptionType[0] == 
-                        eCSR_ENCRYPT_TYPE_WEP40_STATICKEY) 
-                    || (pWextState->roamProfile.EncryptionType.encryptionType[0] == 
+                && ((pWextState->roamProfile.EncryptionType.encryptionType[0] ==
+                        eCSR_ENCRYPT_TYPE_WEP40_STATICKEY)
+                    || (pWextState->roamProfile.EncryptionType.encryptionType[0] ==
                         eCSR_ENCRYPT_TYPE_WEP104_STATICKEY))
                 )
         {
             /*Android UI not having any option to configure the Authentication type to OPEN/SHARED;
              * The authentication type will be always eCSR_AUTH_TYPE_OPEN_SYSTEM when WEP is used
              * Use eCSR_AUTH_TYPE_AUTOSWITCH when WEP encryption used*/
-            (WLAN_HDD_GET_STATION_CTX_PTR(pAdapter))->conn_info.authType = 
+            (WLAN_HDD_GET_STATION_CTX_PTR(pAdapter))->conn_info.authType =
                                                      eCSR_AUTH_TYPE_AUTOSWITCH;
-            pWextState->roamProfile.AuthType.authType[0] = 
+            pWextState->roamProfile.AuthType.authType[0] =
                   (WLAN_HDD_GET_STATION_CTX_PTR(pAdapter))->conn_info.authType;
         }
 #ifdef FEATURE_WLAN_WAPI
@@ -4929,15 +4909,15 @@
 
         /* change conn_state to connecting before sme_RoamConnect(), because sme_RoamConnect()
          * has a direct path to call hdd_smeRoamCallback(), which will change the conn_state
-         * If direct path, conn_state will be accordingly changed to NotConnected or Associated 
+         * If direct path, conn_state will be accordingly changed to NotConnected or Associated
          * by either hdd_AssociationCompletionHandler() or hdd_DisConnectHandler() in sme_RoamCallback()
          * if sme_RomConnect is to be queued, Connecting state will remain until it is completed.
          */
         if (WLAN_HDD_INFRA_STATION == pAdapter->device_mode)
             hdd_connSetConnectionState(WLAN_HDD_GET_STATION_CTX_PTR(pAdapter),
                                                  eConnectionState_Connecting);
-        
-        status = sme_RoamConnect( WLAN_HDD_GET_HAL_CTX(pAdapter), 
+
+        status = sme_RoamConnect( WLAN_HDD_GET_HAL_CTX(pAdapter),
                             pAdapter->sessionId, pRoamProfile, &roamId);
 
         if( (eHAL_STATUS_SUCCESS != status) &&
@@ -4972,32 +4952,32 @@
 static int wlan_hdd_cfg80211_set_auth_type(hdd_adapter_t *pAdapter,
         enum nl80211_auth_type auth_type)
 {
-    hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);   
+    hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
     hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
 
     ENTER();
 
     /*set authentication type*/
-    switch (auth_type) 
+    switch (auth_type)
     {
         case NL80211_AUTHTYPE_OPEN_SYSTEM:
         case NL80211_AUTHTYPE_AUTOMATIC:
 #ifdef WLAN_FEATURE_VOWIFI_11R
         case NL80211_AUTHTYPE_FT:
 #endif /* WLAN_FEATURE_VOWIFI_11R */
-            hddLog(VOS_TRACE_LEVEL_INFO, 
+            hddLog(VOS_TRACE_LEVEL_INFO,
                     "%s: set authentication type to OPEN", __func__);
             pHddStaCtx->conn_info.authType = eCSR_AUTH_TYPE_OPEN_SYSTEM;
             break;
 
         case NL80211_AUTHTYPE_SHARED_KEY:
-            hddLog(VOS_TRACE_LEVEL_INFO, 
+            hddLog(VOS_TRACE_LEVEL_INFO,
                     "%s: set authentication type to SHARED", __func__);
             pHddStaCtx->conn_info.authType = eCSR_AUTH_TYPE_SHARED_KEY;
             break;
 #ifdef FEATURE_WLAN_CCX
         case NL80211_AUTHTYPE_NETWORK_EAP:
-            hddLog(VOS_TRACE_LEVEL_INFO, 
+            hddLog(VOS_TRACE_LEVEL_INFO,
                             "%s: set authentication type to CCKM WPA", __func__);
             pHddStaCtx->conn_info.authType = eCSR_AUTH_TYPE_CCKM_WPA;//eCSR_AUTH_TYPE_CCKM_RSN needs to be handled as well if required.
             break;
@@ -5005,14 +4985,14 @@
 
 
         default:
-            hddLog(VOS_TRACE_LEVEL_ERROR, 
-                    "%s: Unsupported authentication type %d", __func__, 
+            hddLog(VOS_TRACE_LEVEL_ERROR,
+                    "%s: Unsupported authentication type %d", __func__,
                     auth_type);
             pHddStaCtx->conn_info.authType = eCSR_AUTH_TYPE_UNKNOWN;
             return -EINVAL;
     }
 
-    pWextState->roamProfile.AuthType.authType[0] = 
+    pWextState->roamProfile.AuthType.authType[0] =
                                         pHddStaCtx->conn_info.authType;
     return 0;
 }
@@ -5022,13 +5002,13 @@
  * This function is used to set the key mgmt type(PSK/8021x).
  *
  */
-static int wlan_hdd_set_akm_suite( hdd_adapter_t *pAdapter, 
+static int wlan_hdd_set_akm_suite( hdd_adapter_t *pAdapter,
                                    u32 key_mgmt
                                    )
 {
     hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
     ENTER();
-    
+
     /*set key mgmt type*/
     switch(key_mgmt)
     {
@@ -5060,7 +5040,7 @@
 #endif
 
         default:
-            hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Unsupported key mgmt type %d", 
+            hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Unsupported key mgmt type %d",
                     __func__, key_mgmt);
             return -EINVAL;
 
@@ -5070,56 +5050,56 @@
 
 /*
  * FUNCTION: wlan_hdd_cfg80211_set_cipher
- * This function is used to set the encryption type 
+ * This function is used to set the encryption type
  * (NONE/WEP40/WEP104/TKIP/CCMP).
  */
-static int wlan_hdd_cfg80211_set_cipher( hdd_adapter_t *pAdapter, 
-                                u32 cipher, 
+static int wlan_hdd_cfg80211_set_cipher( hdd_adapter_t *pAdapter,
+                                u32 cipher,
                                 bool ucast
                                 )
 {
     eCsrEncryptionType encryptionType = eCSR_ENCRYPT_TYPE_NONE;
-    hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);   
+    hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
     hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
 
     ENTER();
 
-    if (!cipher) 
+    if (!cipher)
     {
-        hddLog(VOS_TRACE_LEVEL_ERROR, "%s: received cipher %d - considering none", 
+        hddLog(VOS_TRACE_LEVEL_ERROR, "%s: received cipher %d - considering none",
                 __func__, cipher);
         encryptionType = eCSR_ENCRYPT_TYPE_NONE;
     }
     else
     {
-    
+
         /*set encryption method*/
-        switch (cipher) 
+        switch (cipher)
         {
             case IW_AUTH_CIPHER_NONE:
                 encryptionType = eCSR_ENCRYPT_TYPE_NONE;
                 break;
-    
+
             case WLAN_CIPHER_SUITE_WEP40:
-                if ((IW_AUTH_KEY_MGMT_802_1X == pWextState->authKeyMgmt) && 
+                if ((IW_AUTH_KEY_MGMT_802_1X == pWextState->authKeyMgmt) &&
                     (eCSR_AUTH_TYPE_OPEN_SYSTEM == pHddStaCtx->conn_info.authType))
                     encryptionType = eCSR_ENCRYPT_TYPE_WEP40;
                 else
                     encryptionType = eCSR_ENCRYPT_TYPE_WEP40_STATICKEY;
                 break;
-    
+
             case WLAN_CIPHER_SUITE_WEP104:
-                if ((IW_AUTH_KEY_MGMT_802_1X == pWextState->authKeyMgmt) && 
+                if ((IW_AUTH_KEY_MGMT_802_1X == pWextState->authKeyMgmt) &&
                     (eCSR_AUTH_TYPE_OPEN_SYSTEM == pHddStaCtx->conn_info.authType))
                     encryptionType = eCSR_ENCRYPT_TYPE_WEP104;
                 else
                     encryptionType = eCSR_ENCRYPT_TYPE_WEP104_STATICKEY;
                 break;
-    
+
             case WLAN_CIPHER_SUITE_TKIP:
                 encryptionType = eCSR_ENCRYPT_TYPE_TKIP;
                 break;
-    
+
             case WLAN_CIPHER_SUITE_CCMP:
                 encryptionType = eCSR_ENCRYPT_TYPE_AES;
                 break;
@@ -5135,7 +5115,7 @@
             break;
 #endif
             default:
-                hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Unsupported cipher type %d", 
+                hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Unsupported cipher type %d",
                         __func__, cipher);
                 return -EOPNOTSUPP;
         }
@@ -5143,16 +5123,16 @@
 
     if (ucast)
     {
-        hddLog(VOS_TRACE_LEVEL_INFO, "%s: setting unicast cipher type to %d", 
+        hddLog(VOS_TRACE_LEVEL_INFO, "%s: setting unicast cipher type to %d",
                 __func__, encryptionType);
         pHddStaCtx->conn_info.ucEncryptionType            = encryptionType;
         pWextState->roamProfile.EncryptionType.numEntries = 1;
-        pWextState->roamProfile.EncryptionType.encryptionType[0] = 
+        pWextState->roamProfile.EncryptionType.encryptionType[0] =
                                           encryptionType;
     }
     else
     {
-        hddLog(VOS_TRACE_LEVEL_INFO, "%s: setting mcast cipher type to %d", 
+        hddLog(VOS_TRACE_LEVEL_INFO, "%s: setting mcast cipher type to %d",
                 __func__, encryptionType);
         pHddStaCtx->conn_info.mcEncryptionType                       = encryptionType;
         pWextState->roamProfile.mcEncryptionType.numEntries        = 1;
@@ -5167,8 +5147,8 @@
  * FUNCTION: wlan_hdd_cfg80211_set_ie
  * This function is used to parse WPA/RSN IE's.
  */
-int wlan_hdd_cfg80211_set_ie( hdd_adapter_t *pAdapter, 
-                              u8 *ie, 
+int wlan_hdd_cfg80211_set_ie( hdd_adapter_t *pAdapter,
+                              u8 *ie,
                               size_t ie_len
                               )
 {
@@ -5194,25 +5174,25 @@
         elementId = *genie++;
         eLen  = *genie++;
         remLen -= 2;
-    
-        hddLog(VOS_TRACE_LEVEL_INFO, "%s: IE[0x%X], LEN[%d]\n", 
+
+        hddLog(VOS_TRACE_LEVEL_INFO, "%s: IE[0x%X], LEN[%d]\n",
             __func__, elementId, eLen);
-         
-        switch ( elementId ) 
+
+        switch ( elementId )
         {
-            case DOT11F_EID_WPA: 
+            case DOT11F_EID_WPA:
                 if (4 > eLen) /* should have at least OUI which is 4 bytes so extra 2 bytes not needed */
                 {
-                    hddLog(VOS_TRACE_LEVEL_ERROR, 
+                    hddLog(VOS_TRACE_LEVEL_ERROR,
                               "%s: Invalid WPA IE", __func__);
                     return -EINVAL;
                 }
-                else if (0 == memcmp(&genie[0], "\x00\x50\xf2\x04", 4)) 
+                else if (0 == memcmp(&genie[0], "\x00\x50\xf2\x04", 4))
                 {
                     v_U16_t curAddIELen = pWextState->assocAddIE.length;
-                    hddLog (VOS_TRACE_LEVEL_INFO, "%s Set WPS IE(len %d)", 
+                    hddLog (VOS_TRACE_LEVEL_INFO, "%s Set WPS IE(len %d)",
                             __func__, eLen + 2);
-                    
+
                     if( SIR_MAC_MAX_IE_LENGTH < (pWextState->assocAddIE.length + eLen) )
                     {
                        hddLog(VOS_TRACE_LEVEL_FATAL, "Cannot accommodate assocAddIE. "
@@ -5223,28 +5203,28 @@
                     // WSC IE is saved to Additional IE ; it should be accumulated to handle WPS IE + P2P IE
                     memcpy( pWextState->assocAddIE.addIEdata + curAddIELen, genie - 2, eLen + 2);
                     pWextState->assocAddIE.length += eLen + 2;
-                    
+
                     pWextState->roamProfile.bWPSAssociation = VOS_TRUE;
                     pWextState->roamProfile.pAddIEAssoc = pWextState->assocAddIE.addIEdata;
                     pWextState->roamProfile.nAddIEAssocLength = pWextState->assocAddIE.length;
                 }
-                else if (0 == memcmp(&genie[0], "\x00\x50\xf2", 3)) 
-                {  
+                else if (0 == memcmp(&genie[0], "\x00\x50\xf2", 3))
+                {
                     hddLog (VOS_TRACE_LEVEL_INFO, "%s Set WPA IE (len %d)",__func__, eLen + 2);
                     memset( pWextState->WPARSNIE, 0, MAX_WPA_RSN_IE_LEN );
                     memcpy( pWextState->WPARSNIE, genie - 2, (eLen + 2) /*ie_len*/);
                     pWextState->roamProfile.pWPAReqIE = pWextState->WPARSNIE;
                     pWextState->roamProfile.nWPAReqIELength = eLen + 2;//ie_len;
                 }
-                else if ( (0 == memcmp(&genie[0], P2P_OUI_TYPE, 
-                                                         P2P_OUI_TYPE_SIZE)) 
+                else if ( (0 == memcmp(&genie[0], P2P_OUI_TYPE,
+                                                         P2P_OUI_TYPE_SIZE))
                         /*Consider P2P IE, only for P2P Client */
                          && (WLAN_HDD_P2P_CLIENT == pAdapter->device_mode) )
                 {
                     v_U16_t curAddIELen = pWextState->assocAddIE.length;
-                    hddLog (VOS_TRACE_LEVEL_INFO, "%s Set P2P IE(len %d)", 
+                    hddLog (VOS_TRACE_LEVEL_INFO, "%s Set P2P IE(len %d)",
                             __func__, eLen + 2);
-                    
+
                     if( SIR_MAC_MAX_IE_LENGTH < (pWextState->assocAddIE.length + eLen) )
                     {
                        hddLog(VOS_TRACE_LEVEL_FATAL, "Cannot accommodate assocAddIE "
@@ -5255,20 +5235,20 @@
                     // P2P IE is saved to Additional IE ; it should be accumulated to handle WPS IE + P2P IE
                     memcpy( pWextState->assocAddIE.addIEdata + curAddIELen, genie - 2, eLen + 2);
                     pWextState->assocAddIE.length += eLen + 2;
-                    
+
                     pWextState->roamProfile.pAddIEAssoc = pWextState->assocAddIE.addIEdata;
                     pWextState->roamProfile.nAddIEAssocLength = pWextState->assocAddIE.length;
                 }
 #ifdef WLAN_FEATURE_WFD
-                else if ( (0 == memcmp(&genie[0], WFD_OUI_TYPE, 
-                                                         WFD_OUI_TYPE_SIZE)) 
+                else if ( (0 == memcmp(&genie[0], WFD_OUI_TYPE,
+                                                         WFD_OUI_TYPE_SIZE))
                         /*Consider WFD IE, only for P2P Client */
                          && (WLAN_HDD_P2P_CLIENT == pAdapter->device_mode) )
                 {
                     v_U16_t curAddIELen = pWextState->assocAddIE.length;
-                    hddLog (VOS_TRACE_LEVEL_INFO, "%s Set WFD IE(len %d)", 
+                    hddLog (VOS_TRACE_LEVEL_INFO, "%s Set WFD IE(len %d)",
                             __func__, eLen + 2);
-                    
+
                     if( SIR_MAC_MAX_IE_LENGTH < (pWextState->assocAddIE.length + eLen) )
                     {
                        hddLog(VOS_TRACE_LEVEL_FATAL, "Cannot accommodate assocAddIE "
@@ -5280,17 +5260,17 @@
                     // WPS IE + P2P IE + WFD IE
                     memcpy( pWextState->assocAddIE.addIEdata + curAddIELen, genie - 2, eLen + 2);
                     pWextState->assocAddIE.length += eLen + 2;
-                    
+
                     pWextState->roamProfile.pAddIEAssoc = pWextState->assocAddIE.addIEdata;
                     pWextState->roamProfile.nAddIEAssocLength = pWextState->assocAddIE.length;
                 }
 #endif
                 /* Appending HS 2.0 Indication Element in Assiciation Request */
-                else if ( (0 == memcmp(&genie[0], HS20_OUI_TYPE, 
+                else if ( (0 == memcmp(&genie[0], HS20_OUI_TYPE,
                                        HS20_OUI_TYPE_SIZE)) )
                 {
                     v_U16_t curAddIELen = pWextState->assocAddIE.length;
-                    hddLog (VOS_TRACE_LEVEL_INFO, "%s Set HS20 IE(len %d)", 
+                    hddLog (VOS_TRACE_LEVEL_INFO, "%s Set HS20 IE(len %d)",
                             __func__, eLen + 2);
 
                     if( SIR_MAC_MAX_IE_LENGTH < (pWextState->assocAddIE.length + eLen) )
@@ -5317,11 +5297,11 @@
                 break;
                 /* Appending Extended Capabilities with Interworking bit set in Assoc Req */
             case DOT11F_EID_EXTCAP:
-                {        
+                {
                     v_U16_t curAddIELen = pWextState->assocAddIE.length;
-                    hddLog (VOS_TRACE_LEVEL_INFO, "%s Set Extended CAPS IE(len %d)", 
+                    hddLog (VOS_TRACE_LEVEL_INFO, "%s Set Extended CAPS IE(len %d)",
                             __func__, eLen + 2);
-                    
+
                     if( SIR_MAC_MAX_IE_LENGTH < (pWextState->assocAddIE.length + eLen) )
                     {
                        hddLog(VOS_TRACE_LEVEL_FATAL, "Cannot accommodate assocAddIE "
@@ -5331,7 +5311,7 @@
                     }
                     memcpy( pWextState->assocAddIE.addIEdata + curAddIELen, genie - 2, eLen + 2);
                     pWextState->assocAddIE.length += eLen + 2;
-                    
+
                     pWextState->roamProfile.pAddIEAssoc = pWextState->assocAddIE.addIEdata;
                     pWextState->roamProfile.nAddIEAssocLength = pWextState->assocAddIE.length;
                     break;
@@ -5342,7 +5322,7 @@
                 hddLog(VOS_TRACE_LEVEL_INFO,"WAPI MODE IS  %lu \n",
                                           pAdapter->wapi_info.nWapiMode);
                 tmp = (u16 *)ie;
-                tmp = tmp + 2; // Skip element Id and Len, Version        
+                tmp = tmp + 2; // Skip element Id and Len, Version
                 akmsuiteCount = WPA_GET_LE16(tmp);
                 tmp = tmp + 1;
                 akmlist = (int *)(tmp);
@@ -5362,9 +5342,9 @@
                     hddLog(VOS_TRACE_LEVEL_INFO, "%s: WAPI AUTH MODE SET TO PSK",
                                                             __func__);
                     pAdapter->wapi_info.wapiAuthMode = WAPI_AUTH_MODE_PSK;
-                }    
+                }
                 if (WAPI_CERT_AKM_SUITE == akmsuite[0])
-                {     
+                {
                     hddLog(VOS_TRACE_LEVEL_INFO, "%s: WAPI AUTH MODE SET TO CERTIFICATE",
                                                              __func__);
                     pAdapter->wapi_info.wapiAuthMode = WAPI_AUTH_MODE_CERT;
@@ -5372,7 +5352,7 @@
                 break;
 #endif
             default:
-                hddLog (VOS_TRACE_LEVEL_ERROR, 
+                hddLog (VOS_TRACE_LEVEL_ERROR,
                         "%s Set UNKNOWN IE %X", __func__, elementId);
                 /* when Unknown IE is received we should break and continue
                  * to the next IE in the buffer instead we were returning
@@ -5388,27 +5368,27 @@
 
 /*
  * FUNCTION: wlan_hdd_cfg80211_set_privacy
- * This function is used to initialize the security 
+ * This function is used to initialize the security
  * parameters during connect operation.
  */
-int wlan_hdd_cfg80211_set_privacy( hdd_adapter_t *pAdapter, 
+int wlan_hdd_cfg80211_set_privacy( hdd_adapter_t *pAdapter,
                                    struct cfg80211_connect_params *req
                                    )
 {
     int status = 0;
-    hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);   
+    hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
     ENTER();
 
     /*set wpa version*/
     pWextState->wpaVersion = IW_AUTH_WPA_VERSION_DISABLED;
 
-    if (req->crypto.wpa_versions) 
+    if (req->crypto.wpa_versions)
     {
         if ( (NL80211_WPA_VERSION_1 == req->crypto.wpa_versions)
-            && ( (req->ie_len) 
-           && (0 == memcmp( &req->ie[2], "\x00\x50\xf2",3) ) ) ) 
+            && ( (req->ie_len)
+           && (0 == memcmp( &req->ie[2], "\x00\x50\xf2",3) ) ) )
            // Make sure that it is including a WPA IE.
-           /* Currently NL is putting WPA version 1 even for open, 
+           /* Currently NL is putting WPA version 1 even for open,
             * since p2p ie is also put in same buffer.
             * */
         {
@@ -5419,8 +5399,8 @@
             pWextState->wpaVersion = IW_AUTH_WPA_VERSION_WPA2;
         }
     }
-    
-    hddLog(VOS_TRACE_LEVEL_INFO, "%s: set wpa version to %d", __func__, 
+
+    hddLog(VOS_TRACE_LEVEL_INFO, "%s: set wpa version to %d", __func__,
             pWextState->wpaVersion);
 
     /*set authentication type*/
@@ -5428,7 +5408,7 @@
 
     if (0 > status)
     {
-        hddLog(VOS_TRACE_LEVEL_ERROR, 
+        hddLog(VOS_TRACE_LEVEL_ERROR,
                 "%s: failed to set authentication type ", __func__);
         return status;
     }
@@ -5439,7 +5419,7 @@
         status = wlan_hdd_set_akm_suite(pAdapter, req->crypto.akm_suites[0]);
         if (0 > status)
         {
-            hddLog(VOS_TRACE_LEVEL_ERROR, "%s: failed to set akm suite", 
+            hddLog(VOS_TRACE_LEVEL_ERROR, "%s: failed to set akm suite",
                     __func__);
             return status;
         }
@@ -5452,7 +5432,7 @@
                                       req->crypto.ciphers_pairwise[0], true);
         if (0 > status)
         {
-            hddLog(VOS_TRACE_LEVEL_ERROR, 
+            hddLog(VOS_TRACE_LEVEL_ERROR,
                     "%s: failed to set unicast cipher type", __func__);
             return status;
         }
@@ -5463,7 +5443,7 @@
         status = wlan_hdd_cfg80211_set_cipher(pAdapter, 0, true);
         if (0 > status)
         {
-            hddLog(VOS_TRACE_LEVEL_ERROR, 
+            hddLog(VOS_TRACE_LEVEL_ERROR,
                     "%s: failed to set unicast cipher type", __func__);
             return status;
         }
@@ -5475,7 +5455,7 @@
 
     if (0 > status)
     {
-        hddLog(VOS_TRACE_LEVEL_ERROR, "%s: failed to set mcast cipher type", 
+        hddLog(VOS_TRACE_LEVEL_ERROR, "%s: failed to set mcast cipher type",
                 __func__);
         return status;
     }
@@ -5490,23 +5470,23 @@
         status = wlan_hdd_cfg80211_set_ie(pAdapter, req->ie, req->ie_len);
         if ( 0 > status)
         {
-            hddLog(VOS_TRACE_LEVEL_ERROR, "%s: failed to parse the WPA/RSN IE", 
+            hddLog(VOS_TRACE_LEVEL_ERROR, "%s: failed to parse the WPA/RSN IE",
                     __func__);
             return status;
         }
     }
 
     /*incase of WEP set default key information*/
-    if (req->key && req->key_len) 
+    if (req->key && req->key_len)
     {
         if ( (WLAN_CIPHER_SUITE_WEP40 == req->crypto.ciphers_pairwise[0])
                 || (WLAN_CIPHER_SUITE_WEP104 == req->crypto.ciphers_pairwise[0])
           )
         {
-            if ( IW_AUTH_KEY_MGMT_802_1X 
+            if ( IW_AUTH_KEY_MGMT_802_1X
                     == (pWextState->authKeyMgmt & IW_AUTH_KEY_MGMT_802_1X  ))
             {
-                hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Dynamic WEP not supported", 
+                hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Dynamic WEP not supported",
                         __func__);
                 return -EOPNOTSUPP;
             }
@@ -5515,17 +5495,17 @@
                 u8 key_len = req->key_len;
                 u8 key_idx = req->key_idx;
 
-                if ((eCSR_SECURITY_WEP_KEYSIZE_MAX_BYTES >= key_len) 
+                if ((eCSR_SECURITY_WEP_KEYSIZE_MAX_BYTES >= key_len)
                         && (CSR_MAX_NUM_KEY > key_idx)
                   )
                 {
-                    hddLog(VOS_TRACE_LEVEL_INFO, 
-                     "%s: setting default wep key, key_idx = %hu key_len %hu", 
+                    hddLog(VOS_TRACE_LEVEL_INFO,
+                     "%s: setting default wep key, key_idx = %hu key_len %hu",
                             __func__, key_idx, key_len);
                     vos_mem_copy(
-                       &pWextState->roamProfile.Keys.KeyMaterial[key_idx][0], 
+                       &pWextState->roamProfile.Keys.KeyMaterial[key_idx][0],
                                   req->key, key_len);
-                    pWextState->roamProfile.Keys.KeyLength[key_idx] = 
+                    pWextState->roamProfile.Keys.KeyLength[key_idx] =
                                                                (u8)key_len;
                     pWextState->roamProfile.Keys.defaultIndex = (u8)key_idx;
                 }
@@ -5538,22 +5518,22 @@
 
 /*
  * FUNCTION: wlan_hdd_cfg80211_set_privacy
- * This function is used to initialize the security 
+ * This function is used to initialize the security
  * parameters during connect operation.
  */
-static int wlan_hdd_cfg80211_connect( struct wiphy *wiphy, 
+static int wlan_hdd_cfg80211_connect( struct wiphy *wiphy,
                                       struct net_device *ndev,
                                       struct cfg80211_connect_params *req
                                       )
 {
     int status = 0;
-    hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR( ndev ); 
+    hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR( ndev );
     VOS_STATUS exitbmpsStatus = VOS_STATUS_E_INVAL;
     hdd_context_t *pHddCtx = NULL;
 
     ENTER();
 
-    hddLog(VOS_TRACE_LEVEL_INFO, 
+    hddLog(VOS_TRACE_LEVEL_INFO,
              "%s: device_mode = %d\n",__func__,pAdapter->device_mode);
 
     if ( (WLAN_HDD_GET_CTX(pAdapter))->isLogpInProgress )
@@ -5565,19 +5545,19 @@
 
 #ifdef WLAN_BTAMP_FEATURE
     //Infra connect not supported when AMP traffic is on.
-    if( VOS_TRUE == WLANBAP_AmpSessionOn() ) 
+    if( VOS_TRUE == WLANBAP_AmpSessionOn() )
     {
-        hddLog(VOS_TRACE_LEVEL_ERROR, 
+        hddLog(VOS_TRACE_LEVEL_ERROR,
                 "%s: No connection when AMP is on", __func__);
         return -ECONNREFUSED;
     }
 #endif
     /*initialise security parameters*/
-    status = wlan_hdd_cfg80211_set_privacy(pAdapter, req); 
+    status = wlan_hdd_cfg80211_set_privacy(pAdapter, req);
 
     if ( 0 > status)
     {
-        hddLog(VOS_TRACE_LEVEL_ERROR, "%s: failed to set security params", 
+        hddLog(VOS_TRACE_LEVEL_ERROR, "%s: failed to set security params",
                 __func__);
         return status;
     }
@@ -5635,13 +5615,13 @@
  * FUNCTION: wlan_hdd_cfg80211_disconnect
  * This function is used to issue a disconnect request to SME
  */
-static int wlan_hdd_cfg80211_disconnect( struct wiphy *wiphy, 
+static int wlan_hdd_cfg80211_disconnect( struct wiphy *wiphy,
                                          struct net_device *dev,
                                          u16 reason
                                          )
 {
-    hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR( dev ); 
-    tCsrRoamProfile  *pRoamProfile = 
+    hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR( dev );
+    tCsrRoamProfile  *pRoamProfile =
                     &(WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter))->roamProfile;
     int status = 0;
     hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
@@ -5649,14 +5629,14 @@
     hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
     tANI_U8 staIdx;
 #endif
-    
+
     ENTER();
-    
-    hddLog(VOS_TRACE_LEVEL_INFO, "%s: device_mode = %d\n", 
+
+    hddLog(VOS_TRACE_LEVEL_INFO, "%s: device_mode = %d\n",
                                     __func__,pAdapter->device_mode);
 
-    hddLog(VOS_TRACE_LEVEL_INFO, "%s: Disconnect called with reason code %d", 
-            __func__, reason);    
+    hddLog(VOS_TRACE_LEVEL_INFO, "%s: Disconnect called with reason code %d",
+            __func__, reason);
 
     if ((WLAN_HDD_GET_CTX(pAdapter))->isLogpInProgress)
     {
@@ -5669,7 +5649,7 @@
         /*issue disconnect request to SME, if station is in connected state*/
         if (pHddStaCtx->conn_info.connState == eConnectionState_Associated)
         {
-            eCsrRoamDisconnectReason reasonCode = 
+            eCsrRoamDisconnectReason reasonCode =
                                        eCSR_DISCONNECT_REASON_UNSPECIFIED;
             switch(reason)
             {
@@ -5717,13 +5697,13 @@
             }
 #endif
             /*issue disconnect*/
-            status = sme_RoamDisconnect( WLAN_HDD_GET_HAL_CTX(pAdapter), 
+            status = sme_RoamDisconnect( WLAN_HDD_GET_HAL_CTX(pAdapter),
                                          pAdapter->sessionId, reasonCode);
 
             if ( 0 != status)
             {
                 hddLog(VOS_TRACE_LEVEL_ERROR,
-                        "%s csrRoamDisconnect failure, returned %d \n", 
+                        "%s csrRoamDisconnect failure, returned %d \n",
                         __func__, (int)status );
                 return -EINVAL;
             }
@@ -5748,26 +5728,26 @@
 
 /*
  * FUNCTION: wlan_hdd_cfg80211_set_privacy_ibss
- * This function is used to initialize the security 
+ * This function is used to initialize the security
  * settings in IBSS mode.
  */
 static int wlan_hdd_cfg80211_set_privacy_ibss(
-                                         hdd_adapter_t *pAdapter, 
+                                         hdd_adapter_t *pAdapter,
                                          struct cfg80211_ibss_params *params
                                          )
 {
     int status = 0;
-    hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);   
+    hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
     eCsrEncryptionType encryptionType = eCSR_ENCRYPT_TYPE_NONE;
     hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
-    
+
     ENTER();
 
     pWextState->wpaVersion = IW_AUTH_WPA_VERSION_DISABLED;
 
     if (params->ie_len && ( NULL != params->ie) )
     {
-        if (WLAN_EID_RSN == params->ie[0]) 
+        if (WLAN_EID_RSN == params->ie[0])
         {
             pWextState->wpaVersion = IW_AUTH_WPA_VERSION_WPA2;
             encryptionType = eCSR_ENCRYPT_TYPE_AES;
@@ -5781,24 +5761,24 @@
 
         if (0 > status)
         {
-            hddLog(VOS_TRACE_LEVEL_ERROR, "%s: failed to parse WPA/RSN IE", 
+            hddLog(VOS_TRACE_LEVEL_ERROR, "%s: failed to parse WPA/RSN IE",
                     __func__);
             return status;
         }
     }
 
-    pWextState->roamProfile.AuthType.authType[0] = 
-                                pHddStaCtx->conn_info.authType = 
+    pWextState->roamProfile.AuthType.authType[0] =
+                                pHddStaCtx->conn_info.authType =
                                 eCSR_AUTH_TYPE_OPEN_SYSTEM;
 
     if (params->privacy)
     {
-        /* Security enabled IBSS, At this time there is no information available 
-         * about the security paramters, so initialise the encryption type to 
+        /* Security enabled IBSS, At this time there is no information available
+         * about the security paramters, so initialise the encryption type to
          * eCSR_ENCRYPT_TYPE_WEP40_STATICKEY.
-         * The correct security parameters will be updated later in 
+         * The correct security parameters will be updated later in
          * wlan_hdd_cfg80211_add_key */
-        /* Hal expects encryption type to be set inorder 
+        /* Hal expects encryption type to be set inorder
          *enable privacy bit in beacons */
 
         encryptionType = eCSR_ENCRYPT_TYPE_WEP40_STATICKEY;
@@ -5813,22 +5793,22 @@
 
 /*
  * FUNCTION: wlan_hdd_cfg80211_join_ibss
- * This function is used to create/join an IBSS 
+ * This function is used to create/join an IBSS
  */
-static int wlan_hdd_cfg80211_join_ibss( struct wiphy *wiphy, 
+static int wlan_hdd_cfg80211_join_ibss( struct wiphy *wiphy,
                                         struct net_device *dev,
                                         struct cfg80211_ibss_params *params
                                        )
 {
-    hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR( dev ); 
+    hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR( dev );
     hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
     tCsrRoamProfile          *pRoamProfile;
     int status;
     hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
 
     ENTER();
-    
-    hddLog(VOS_TRACE_LEVEL_INFO, 
+
+    hddLog(VOS_TRACE_LEVEL_INFO,
                   "%s: device_mode = %d\n",__func__,pAdapter->device_mode);
 
     if ( (WLAN_HDD_GET_CTX(pAdapter))->isLogpInProgress )
@@ -5840,7 +5820,7 @@
 
     if (NULL == pWextState)
     {
-        hddLog (VOS_TRACE_LEVEL_ERROR, "%s ERROR: Data Storage Corruption\n", 
+        hddLog (VOS_TRACE_LEVEL_ERROR, "%s ERROR: Data Storage Corruption\n",
                 __func__);
         return -EIO;
     }
@@ -5849,7 +5829,7 @@
 
     if ( eCSR_BSS_TYPE_START_IBSS != pRoamProfile->BSSType )
     {
-        hddLog (VOS_TRACE_LEVEL_ERROR, 
+        hddLog (VOS_TRACE_LEVEL_ERROR,
                 "%s Interface type is not set to IBSS \n", __func__);
         return -EINVAL;
     }
@@ -5860,14 +5840,14 @@
         u8 channelNum;
         if (IEEE80211_BAND_5GHZ == params->channel->band)
         {
-            hddLog(VOS_TRACE_LEVEL_ERROR, 
-                    "%s: IBSS join is called with unsupported band %d", 
+            hddLog(VOS_TRACE_LEVEL_ERROR,
+                    "%s: IBSS join is called with unsupported band %d",
                     __func__, params->channel->band);
             return -EOPNOTSUPP;
         }
 
         /* Get channel number */
-        channelNum = 
+        channelNum =
                ieee80211_frequency_to_channel(params->channel->center_freq);
 
         /*TODO: use macro*/
@@ -5881,7 +5861,7 @@
             if (0 != ccmCfgGetStr(hHal, WNI_CFG_VALID_CHANNEL_LIST,
                         validChan, &numChans))
             {
-                hddLog(VOS_TRACE_LEVEL_ERROR, "%s: No valid channel list", 
+                hddLog(VOS_TRACE_LEVEL_ERROR, "%s: No valid channel list",
                         __func__);
                 return -EOPNOTSUPP;
             }
@@ -5895,37 +5875,37 @@
             }
             if (indx >= numChans)
             {
-                hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Not valid Channel %d", 
+                hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Not valid Channel %d",
                         __func__, channelNum);
                 return -EINVAL;
             }
             /* Set the Operational Channel */
-            hddLog(VOS_TRACE_LEVEL_INFO_HIGH, "%s: set channel %d", __func__, 
+            hddLog(VOS_TRACE_LEVEL_INFO_HIGH, "%s: set channel %d", __func__,
                     channelNum);
             pRoamProfile->ChannelInfo.numOfChannels = 1;
             pHddStaCtx->conn_info.operationChannel = channelNum;
-            pRoamProfile->ChannelInfo.ChannelList = 
+            pRoamProfile->ChannelInfo.ChannelList =
                 &pHddStaCtx->conn_info.operationChannel;
         }
         else
         {
-            hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Not valid Channel %hu", 
+            hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Not valid Channel %hu",
                     __func__, channelNum);
             return -EINVAL;
         }
     }
 
     /* Initialize security parameters */
-    status = wlan_hdd_cfg80211_set_privacy_ibss(pAdapter, params); 
+    status = wlan_hdd_cfg80211_set_privacy_ibss(pAdapter, params);
     if (status < 0)
     {
-        hddLog(VOS_TRACE_LEVEL_ERROR, "%s: failed to set security parameters", 
+        hddLog(VOS_TRACE_LEVEL_ERROR, "%s: failed to set security parameters",
                 __func__);
         return status;
     }
 
     /* Issue connect start */
-    status = wlan_hdd_cfg80211_connect_start(pAdapter, params->ssid, 
+    status = wlan_hdd_cfg80211_connect_start(pAdapter, params->ssid,
             params->ssid_len, params->bssid, 0);
 
     if (0 > status)
@@ -5939,13 +5919,13 @@
 
 /*
  * FUNCTION: wlan_hdd_cfg80211_leave_ibss
- * This function is used to leave an IBSS 
+ * This function is used to leave an IBSS
  */
-static int wlan_hdd_cfg80211_leave_ibss( struct wiphy *wiphy, 
+static int wlan_hdd_cfg80211_leave_ibss( struct wiphy *wiphy,
                                          struct net_device *dev
                                          )
 {
-    hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR( dev ); 
+    hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR( dev );
     hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
     tCsrRoamProfile *pRoamProfile;
 
@@ -5961,7 +5941,7 @@
     hddLog(VOS_TRACE_LEVEL_INFO, "%s: device_mode = %d\n",__func__,pAdapter->device_mode);
     if (NULL == pWextState)
     {
-        hddLog (VOS_TRACE_LEVEL_ERROR, "%s ERROR: Data Storage Corruption\n", 
+        hddLog (VOS_TRACE_LEVEL_ERROR, "%s ERROR: Data Storage Corruption\n",
                 __func__);
         return -EIO;
     }
@@ -5971,7 +5951,7 @@
     /* Issue disconnect only if interface type is set to IBSS */
     if (eCSR_BSS_TYPE_START_IBSS != pRoamProfile->BSSType)
     {
-        hddLog (VOS_TRACE_LEVEL_ERROR, "%s: BSS Type is not set to IBSS", 
+        hddLog (VOS_TRACE_LEVEL_ERROR, "%s: BSS Type is not set to IBSS",
                 __func__);
         return -EINVAL;
     }
@@ -5989,7 +5969,7 @@
  * This function is used to set the phy parameters
  * (RTS Threshold/FRAG Threshold/Retry Count etc ...)
  */
-static int wlan_hdd_cfg80211_set_wiphy_params(struct wiphy *wiphy, 
+static int wlan_hdd_cfg80211_set_wiphy_params(struct wiphy *wiphy,
         u32 changed)
 {
     hdd_context_t *pHddCtx = wiphy_priv(wiphy);
@@ -6011,25 +5991,25 @@
                                wiphy->rts_threshold;
 
         if ((WNI_CFG_RTS_THRESHOLD_STAMIN > rts_threshold) ||
-                (WNI_CFG_RTS_THRESHOLD_STAMAX < rts_threshold)) 
+                (WNI_CFG_RTS_THRESHOLD_STAMAX < rts_threshold))
         {
-            hddLog(VOS_TRACE_LEVEL_ERROR, 
-                    "%s: Invalid RTS Threshold value %hu", 
+            hddLog(VOS_TRACE_LEVEL_ERROR,
+                    "%s: Invalid RTS Threshold value %hu",
                     __func__, rts_threshold);
             return -EINVAL;
         }
 
         if (0 != ccmCfgSetInt(hHal, WNI_CFG_RTS_THRESHOLD,
                     rts_threshold, ccmCfgSetCallback,
-                    eANI_BOOLEAN_TRUE)) 
+                    eANI_BOOLEAN_TRUE))
         {
-            hddLog(VOS_TRACE_LEVEL_ERROR, 
-                    "%s: ccmCfgSetInt failed for rts_threshold value %hu", 
+            hddLog(VOS_TRACE_LEVEL_ERROR,
+                    "%s: ccmCfgSetInt failed for rts_threshold value %hu",
                     __func__, rts_threshold);
             return -EIO;
         }
 
-        hddLog(VOS_TRACE_LEVEL_INFO_MED, "%s: set rts threshold %hu", __func__, 
+        hddLog(VOS_TRACE_LEVEL_INFO_MED, "%s: set rts threshold %hu", __func__,
                 rts_threshold);
     }
 
@@ -6040,20 +6020,20 @@
                                 wiphy->frag_threshold;
 
         if ((WNI_CFG_FRAGMENTATION_THRESHOLD_STAMIN > frag_threshold)||
-                (WNI_CFG_FRAGMENTATION_THRESHOLD_STAMAX < frag_threshold) ) 
+                (WNI_CFG_FRAGMENTATION_THRESHOLD_STAMAX < frag_threshold) )
         {
-            hddLog(VOS_TRACE_LEVEL_ERROR, 
-                    "%s: Invalid frag_threshold value %hu", __func__, 
+            hddLog(VOS_TRACE_LEVEL_ERROR,
+                    "%s: Invalid frag_threshold value %hu", __func__,
                     frag_threshold);
             return -EINVAL;
         }
 
         if (0 != ccmCfgSetInt(hHal, WNI_CFG_FRAGMENTATION_THRESHOLD,
                     frag_threshold, ccmCfgSetCallback,
-                    eANI_BOOLEAN_TRUE)) 
+                    eANI_BOOLEAN_TRUE))
         {
-            hddLog(VOS_TRACE_LEVEL_ERROR, 
-                    "%s: ccmCfgSetInt failed for frag_threshold value %hu", 
+            hddLog(VOS_TRACE_LEVEL_ERROR,
+                    "%s: ccmCfgSetInt failed for frag_threshold value %hu",
                     __func__, frag_threshold);
             return -EIO;
         }
@@ -6072,7 +6052,7 @@
         if ((WNI_CFG_LONG_RETRY_LIMIT_STAMIN > retry_value) ||
                 (WNI_CFG_LONG_RETRY_LIMIT_STAMAX < retry_value))
         {
-            hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Invalid Retry count %hu", 
+            hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Invalid Retry count %hu",
                     __func__, retry_value);
             return -EINVAL;
         }
@@ -6081,28 +6061,28 @@
         {
             if (0 != ccmCfgSetInt(hHal, WNI_CFG_LONG_RETRY_LIMIT,
                         retry_value, ccmCfgSetCallback,
-                        eANI_BOOLEAN_TRUE)) 
+                        eANI_BOOLEAN_TRUE))
             {
-                hddLog(VOS_TRACE_LEVEL_ERROR, 
-                        "%s: ccmCfgSetInt failed for long retry count %hu", 
+                hddLog(VOS_TRACE_LEVEL_ERROR,
+                        "%s: ccmCfgSetInt failed for long retry count %hu",
                         __func__, retry_value);
                 return -EIO;
             }
-            hddLog(VOS_TRACE_LEVEL_INFO_MED, "%s: set long retry count %hu", 
+            hddLog(VOS_TRACE_LEVEL_INFO_MED, "%s: set long retry count %hu",
                     __func__, retry_value);
         }
         else if (changed & WIPHY_PARAM_RETRY_SHORT)
         {
             if (0 != ccmCfgSetInt(hHal, WNI_CFG_SHORT_RETRY_LIMIT,
                         retry_value, ccmCfgSetCallback,
-                        eANI_BOOLEAN_TRUE)) 
+                        eANI_BOOLEAN_TRUE))
             {
-                hddLog(VOS_TRACE_LEVEL_ERROR, 
-                        "%s: ccmCfgSetInt failed for short retry count %hu", 
+                hddLog(VOS_TRACE_LEVEL_ERROR,
+                        "%s: ccmCfgSetInt failed for short retry count %hu",
                         __func__, retry_value);
                 return -EIO;
             }
-            hddLog(VOS_TRACE_LEVEL_INFO_MED, "%s: set short retry count %hu", 
+            hddLog(VOS_TRACE_LEVEL_INFO_MED, "%s: set short retry count %hu",
                     __func__, retry_value);
         }
     }
@@ -6116,9 +6096,9 @@
  */
 static int wlan_hdd_cfg80211_set_txpower(struct wiphy *wiphy,
 #if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,35)
-        enum tx_power_setting type, 
+        enum tx_power_setting type,
 #else
-        enum nl80211_tx_power_setting type, 
+        enum nl80211_tx_power_setting type,
 #endif
         int dbm)
 {
@@ -6129,11 +6109,11 @@
 
     ENTER();
 
-    if (0 != ccmCfgSetInt(hHal, WNI_CFG_CURRENT_TX_POWER_LEVEL, 
-                dbm, ccmCfgSetCallback, 
-                eANI_BOOLEAN_TRUE)) 
+    if (0 != ccmCfgSetInt(hHal, WNI_CFG_CURRENT_TX_POWER_LEVEL,
+                dbm, ccmCfgSetCallback,
+                eANI_BOOLEAN_TRUE))
     {
-        hddLog(VOS_TRACE_LEVEL_ERROR, 
+        hddLog(VOS_TRACE_LEVEL_ERROR,
                 "%s: ccmCfgSetInt failed for tx power %hu", __func__, dbm);
         return -EIO;
     }
@@ -6155,19 +6135,19 @@
     case NL80211_TX_POWER_LIMITED: /*limit TX power by the mBm parameter*/
        if( sme_SetMaxTxPower(hHal, bssid, selfMac, dbm) != eHAL_STATUS_SUCCESS )
        {
-          hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Setting maximum tx power failed", 
-                 __func__); 
-          return -EIO;          
+          hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Setting maximum tx power failed",
+                 __func__);
+          return -EIO;
        }
        break;
     case NL80211_TX_POWER_FIXED: /*fix TX power to the mBm parameter*/
-       hddLog(VOS_TRACE_LEVEL_ERROR, "%s: NL80211_TX_POWER_FIXED not supported", 
+       hddLog(VOS_TRACE_LEVEL_ERROR, "%s: NL80211_TX_POWER_FIXED not supported",
               __func__);
        return -EOPNOTSUPP;
        break;
     default:
-       hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Invalid power setting type %d", 
-              __func__, type); 
+       hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Invalid power setting type %d",
+              __func__, type);
        return -EIO;
     }
 
@@ -6599,12 +6579,6 @@
         hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Adapter is NULL\n", __func__);
         return -ENODEV;
     }
-    if ( (WLAN_HDD_GET_CTX(pAdapter))->isLogpInProgress )
-    {
-        VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
-                "%s:LOGP in Progress. Ignore!!!", __func__);
-        return -EAGAIN;
-    }
 
     pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
     if (NULL == pHddCtx)
@@ -6613,6 +6587,13 @@
         return -ENODEV;
     }
 
+    if ( pHddCtx->isLogpInProgress )
+    {
+        VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+                "%s:LOGP in Progress. Ignore!!!", __func__);
+        return -EAGAIN;
+    }
+
     if ((DRIVER_POWER_MODE_AUTO == !mode) &&
         (TRUE == pHddCtx->hdd_wlan_suspended) &&
         (pHddCtx->cfg_ini->fhostArpOffload) &&
@@ -6651,7 +6632,7 @@
     ENTER();
     return 0;
 }
-#endif //LINUX_VERSION_CODE 
+#endif //LINUX_VERSION_CODE
 
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,4,0))
 static int wlan_hdd_set_txq_params(struct wiphy *wiphy,
@@ -6809,16 +6790,16 @@
 {
 #define MAX_PMKSAIDS_IN_CACHE 8
     static tPmkidCacheInfo PMKIDCache[MAX_PMKSAIDS_IN_CACHE]; // HDD Local cache
-    static tANI_U32 i; // HDD Local Cache index 
-    tANI_U32 j=0;  
+    static tANI_U32 i; // HDD Local Cache index
+    tANI_U32 j=0;
     hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
     tHalHandle halHandle;
-    eHalStatus result; 
+    eHalStatus result;
     tANI_U8  BSSIDMatched = 0;
-   
+
     ENTER();
 
-    // Validate pAdapter  
+    // Validate pAdapter
     if ( NULL == pAdapter || NULL == pAdapter->pHddCtx)
     {
         hddLog(VOS_TRACE_LEVEL_FATAL, "%s: Invalid Adapter or HDD Context " ,__func__);
@@ -6839,22 +6820,22 @@
         return -EAGAIN;
     }
 
-    // Retrieve halHandle  
+    // Retrieve halHandle
     halHandle = WLAN_HDD_GET_HAL_CTX(pAdapter);
 
     for (j = 0; j < i; j++)
     {
-        if(vos_mem_compare(PMKIDCache[j].BSSID, 
+        if(vos_mem_compare(PMKIDCache[j].BSSID,
                     pmksa->bssid, WNI_CFG_BSSID_LEN))
         {
             /* BSSID matched previous entry.  Overwrite it. */
             BSSIDMatched = 1;
-            vos_mem_copy(PMKIDCache[j].BSSID, 
+            vos_mem_copy(PMKIDCache[j].BSSID,
                     pmksa->bssid, WNI_CFG_BSSID_LEN);
-            vos_mem_copy(PMKIDCache[j].PMKID, 
-                    pmksa->pmkid,   
+            vos_mem_copy(PMKIDCache[j].PMKID,
+                    pmksa->pmkid,
                     CSR_RSN_PMKID_SIZE);
-            hddLog(VOS_TRACE_LEVEL_FATAL, "%s: Reusing cache entry %d.", 
+            hddLog(VOS_TRACE_LEVEL_FATAL, "%s: Reusing cache entry %d.",
                     __func__, j );
             dump_bssid(pmksa->bssid);
             dump_pmkid(halHandle, pmksa->pmkid);
@@ -6866,31 +6847,31 @@
     if(j == MAX_PMKSAIDS_IN_CACHE) i=0;
 
     if (!BSSIDMatched)
-    { 
-        // Now, we DON'T have a BSSID match, so take a new entry in the cache.  
-        vos_mem_copy(PMKIDCache[i].BSSID, 
-                pmksa->bssid, ETHER_ADDR_LEN); 
-        vos_mem_copy(PMKIDCache[i].PMKID, 
-                pmksa->pmkid,   
+    {
+        // Now, we DON'T have a BSSID match, so take a new entry in the cache.
+        vos_mem_copy(PMKIDCache[i].BSSID,
+                pmksa->bssid, ETHER_ADDR_LEN);
+        vos_mem_copy(PMKIDCache[i].PMKID,
+                pmksa->pmkid,
                 CSR_RSN_PMKID_SIZE);
-        hddLog(VOS_TRACE_LEVEL_FATAL, "%s: Adding a new cache entry %d.", 
+        hddLog(VOS_TRACE_LEVEL_FATAL, "%s: Adding a new cache entry %d.",
                 __func__, i );
         dump_bssid(pmksa->bssid);
         dump_pmkid(halHandle, pmksa->pmkid);
-        // Increment the HDD Local Cache index 
+        // Increment the HDD Local Cache index
         // The "i=0" doesn't work for the call to sme_RoamSetPMKIDCache() - LFR FIXME
-        if (i<=(MAX_PMKSAIDS_IN_CACHE-1)) i++; else i=0; 
+        if (i<=(MAX_PMKSAIDS_IN_CACHE-1)) i++; else i=0;
     }
 
 
     // Calling csrRoamSetPMKIDCache to configure the PMKIDs into the cache
-    //hddLog(LOG1, FL("%s: Calling csrRoamSetPMKIDCache with %d cache entries."), 
+    //hddLog(LOG1, FL("%s: Calling csrRoamSetPMKIDCache with %d cache entries."),
     //        __func__, i );
-    hddLog(VOS_TRACE_LEVEL_FATAL, "%s: Calling csrRoamSetPMKIDCache with %d cache entries.", 
+    hddLog(VOS_TRACE_LEVEL_FATAL, "%s: Calling csrRoamSetPMKIDCache with %d cache entries.",
             __func__, i );
     // Finally set the PMKSA ID Cache in CSR
-    result = sme_RoamSetPMKIDCache(halHandle,pAdapter->sessionId, 
-                                    PMKIDCache, 
+    result = sme_RoamSetPMKIDCache(halHandle,pAdapter->sessionId,
+                                    PMKIDCache,
                                     i );
     return 0;
 }
@@ -6913,7 +6894,7 @@
 #endif
 
 #if defined(WLAN_FEATURE_VOWIFI_11R) && defined(KERNEL_SUPPORT_11R_CFG80211)
-static int wlan_hdd_cfg80211_update_ft_ies(struct wiphy *wiphy, 
+static int wlan_hdd_cfg80211_update_ft_ies(struct wiphy *wiphy,
           struct net_device *dev, struct cfg80211_update_ft_ies_params *ftie)
 {
     hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
@@ -6930,13 +6911,13 @@
     // Added for debug on reception of Re-assoc Req.
     if (eConnectionState_Associated != pHddStaCtx->conn_info.connState)
     {
-        hddLog(LOGE, FL("Called with Ie of length = %d when not associated\n"),         
+        hddLog(LOGE, FL("Called with Ie of length = %d when not associated\n"),
                ftie->ie_len);
         hddLog(LOGE, FL("Should be Re-assoc Req IEs\n"));
     }
 
 #ifdef WLAN_FEATURE_VOWIFI_11R_DEBUG
-    hddLog(LOGE, FL("%s called with Ie of length = %d\n"), __func__, 
+    hddLog(LOGE, FL("%s called with Ie of length = %d\n"), __func__,
            ftie->ie_len);
 #endif
 
@@ -6964,7 +6945,7 @@
 
     if (NULL == pHddCtx || NULL == pHddCtx->cfg_ini)
     {
-        VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, 
+        VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
                 "Invalid arguments");
         return -EINVAL;
     }
@@ -7441,7 +7422,7 @@
 #endif /*WLAN_FEATURE_GTK_OFFLOAD*/
 
 /* cfg80211_ops */
-static struct cfg80211_ops wlan_hdd_cfg80211_ops = 
+static struct cfg80211_ops wlan_hdd_cfg80211_ops =
 {
     .add_virtual_intf = wlan_hdd_add_virtual_intf,
     .del_virtual_intf = wlan_hdd_del_virtual_intf,
