am 41a0b799: tnetw1271: Add 500 ms expired wakelock to deliver the message (b/2245483)

Merge commit '41a0b79959b6dd47cd62b042b1e40e815191bd88' into eclair-mr2

* commit '41a0b79959b6dd47cd62b042b1e40e815191bd88':
  tnetw1271: Add 500 ms expired wakelock to deliver the message (b/2245483)
diff --git a/sta_dk_4_0_4_32/common/src/core/sme/siteMgr/select.c b/sta_dk_4_0_4_32/common/src/core/sme/siteMgr/select.c
index 16e444c..57fe2da 100644
--- a/sta_dk_4_0_4_32/common/src/core/sme/siteMgr/select.c
+++ b/sta_dk_4_0_4_32/common/src/core/sme/siteMgr/select.c
@@ -253,19 +253,18 @@
 	UINT32		prevMatchingLevel = 0;		
 	UINT8		siteIndex, tableIndex, numberOfSites = 0;
 	siteMgr_t	*pSiteMgr = (siteMgr_t *)hSiteMgr;
-	siteEntry_t *pSiteEntry, *pLastMatchSite = NULL;	
+	siteEntry_t	*pSiteEntry, *pLastMatchSite = NULL;
 	rsnData_t	rsnData;
-    dot11_RSN_t *pRsnIe;
-    UINT8       rsnIECount=0;
-    UINT8       curRsnData[255];
-    UINT8       length=0;
+	dot11_RSN_t	*pRsnIe;
+	UINT8		rsnIECount=0;
+	UINT8       	length=0;
 	paramInfo_t	param;
-    radioBand_e radioBand;
+	radioBand_e	radioBand;
 	BOOL		bRegulatoryDomainEnabled;
 
 	siteTablesParams_t* currTable = pSiteMgr->pSitesMgmtParams->pCurrentSiteTable;
 
-	WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,  
+	WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
 							("SITE MATCH , Desired ssid (%s) len= (%d)\n\n", 
 							 pSiteMgr->pDesiredParams->siteMgrDesiredSSID.ssidString, 
 							 pSiteMgr->pDesiredParams->siteMgrDesiredSSID.len));
@@ -1438,4 +1437,3 @@
     
 	return OK;
 }
-
diff --git a/sta_dk_4_0_4_32/pform/common/src/osRgstry.c b/sta_dk_4_0_4_32/pform/common/src/osRgstry.c
index d625868..5a37e59 100644
--- a/sta_dk_4_0_4_32/pform/common/src/osRgstry.c
+++ b/sta_dk_4_0_4_32/pform/common/src/osRgstry.c
@@ -1041,7 +1041,7 @@
 
     /*defaults values for beacon IE table*/
     /*UINT8 defBeaconIETableSize = 0 ;*/
-    UINT8 defBeaconIETable[] = "00 01 01 01 32 01 2a 01 03 01 06 01 07 01 20 01 25 01 23 01 30 01 28 01 2e 01 85 01 dd 01 00 52 f2 02 00 01";
+    static UINT8 defBeaconIETable[] = "00 01 01 01 32 01 2a 01 03 01 06 01 07 01 20 01 25 01 23 01 30 01 28 01 2e 01 85 01 dd 01 00 52 f2 02 00 01";
     /*UINT8 tmpIeTable[BEACON_FILTER_TABLE_MAX_SIZE] ;*/
     UINT8 staBeaconFilterIETable[BEACON_FILTER_STRING_MAX_LEN] ;
     UINT8 tmpIeTableSize = 35;
@@ -1056,11 +1056,11 @@
     initTable_t* p = (initTable_t*) pInitTable;
     USHORT  tableLen = 0;
     USHORT  loopIndex = 0;
-    UINT8   ScanControlTable24Tmp[2 * NUM_OF_CHANNELS_24];
-    UINT8   ScanControlTable5Tmp[2 * A_5G_BAND_NUM_CHANNELS];
-    UINT8   ScanControlTable24Def[2* NUM_OF_CHANNELS_24] = "FFFFFFFFFFFFFFFFFFFFFFFFFFFF";
-    UINT8   ScanControlTable5Def[2 * A_5G_BAND_NUM_CHANNELS] = "FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000000000000000000000000000000000000000000000000000000000000000000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000000000000000FF000000FF000000FF000000FF00000000000000000000000000000000000000";
-    UINT8   reportSeverityTableDefaults[WLAN_MAX_SEVERITIES] = "000000000000";
+    static UINT8   ScanControlTable24Tmp[2 * NUM_OF_CHANNELS_24];
+    static UINT8   ScanControlTable5Tmp[2 * A_5G_BAND_NUM_CHANNELS];
+    static UINT8   ScanControlTable24Def[2* NUM_OF_CHANNELS_24] = "FFFFFFFFFFFFFFFFFFFFFFFFFFFF";
+    static UINT8   ScanControlTable5Def[2 * A_5G_BAND_NUM_CHANNELS] = "FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000000000000000000000000000000000000000000000000000000000000000000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000000000000000FF000000FF000000FF000000FF00000000000000000000000000000000000000";
+    UINT8   reportSeverityTableDefaults[WLAN_MAX_SEVERITIES] = "00000000000";
     UINT8   reportModuleTableDefaults[WLAN_MAX_LOG_MODULES];
     UINT16  reportSeverityTableLen;
     UINT16  reportModuleTableLen;
diff --git a/sta_dk_4_0_4_32/pform/linux/src/esta_drv.c b/sta_dk_4_0_4_32/pform/linux/src/esta_drv.c
index 669e9cc..9770803 100644
--- a/sta_dk_4_0_4_32/pform/linux/src/esta_drv.c
+++ b/sta_dk_4_0_4_32/pform/linux/src/esta_drv.c
@@ -1814,10 +1814,12 @@
 
 #define TROUT_IRQ MSM_GPIO_TO_INT(29)
 
+#ifdef SDIO_INTERRUPT_HANDLING_ON
 static void tiwlan_sdio_irq(struct sdio_func *func)
 {
     printk("%s:\n", __FUNCTION__);
 }
+#endif
 
 static const struct sdio_device_id tiwlan_sdio_ids[] = {
     { SDIO_DEVICE_CLASS(SDIO_CLASS_WLAN)    },
@@ -1865,11 +1867,11 @@
     rc = tiwlan_sdio_init(func);
     if (rc)
         goto err2;
-
+#ifdef SDIO_INTERRUPT_HANDLING_ON
     rc = sdio_claim_irq(func, tiwlan_sdio_irq);
     if (rc)
         goto err1;
-
+#endif
     SDIO_SetFunc( func );
 
     rc = tiwlan_create_drv(0, 0, 0, 0, 0, TROUT_IRQ, NULL, NULL);
@@ -1877,8 +1879,10 @@
     printk(KERN_INFO "TIWLAN: Driver initialized (rc %d)\n", rc);
     complete(&sdio_wait);
     return rc;
+#ifdef SDIO_INTERRUPT_HANDLING_ON
 err1:
     sdio_disable_func(func);
+#endif
 err2:
     sdio_release_host(func);
     complete(&sdio_wait);
@@ -1889,7 +1893,9 @@
 static void tiwlan_sdio_remove(struct sdio_func *func)
 {
     printk(KERN_DEBUG "TIWLAN: Releasing SDIO resources\n");
+#ifdef SDIO_INTERRUPT_HANDLING_ON
     sdio_release_irq(func);
+#endif
     sdio_disable_func(func);
     sdio_release_host(func);
     printk(KERN_DEBUG "TIWLAN: SDIO resources released\n");
diff --git a/sta_dk_4_0_4_32/wpa_supplicant_lib/driver_ti.c b/sta_dk_4_0_4_32/wpa_supplicant_lib/driver_ti.c
index f5c1aa9..9639859 100644
--- a/sta_dk_4_0_4_32/wpa_supplicant_lib/driver_ti.c
+++ b/sta_dk_4_0_4_32/wpa_supplicant_lib/driver_ti.c
@@ -1677,6 +1677,8 @@
     else if( os_strcasecmp(cmd, "rssi") == 0 ) {
 #if 1
         u8 ssid[MAX_SSID_LEN];
+        struct wpa_scan_result *cur_res;
+        struct wpa_supplicant *wpa_s = (struct wpa_supplicant *)(myDrv->hWpaSupplicant);
         int rssi, len;
 
         wpa_printf(MSG_DEBUG,"rssi command");
@@ -1688,9 +1690,12 @@
                 os_memcpy( (void *)buf, (void *)ssid, len );
                 ret = len;
                 ret += snprintf(&buf[ret], buf_len-len, " rssi %d\n", rssi);
-                if (ret < (int)buf_len) {
+                if( !wpa_s )
                     return( ret );
-                }
+                cur_res = scan_get_by_bssid( myDrv, wpa_s->bssid );
+                if( cur_res )
+                    cur_res->level = rssi;
+                return( ret );
             }
         }
 #else
diff --git a/wilink_6_1/platforms/os/linux/src/WlanDrvWext.c b/wilink_6_1/platforms/os/linux/src/WlanDrvWext.c
index afdd147..4eec78a 100644
--- a/wilink_6_1/platforms/os/linux/src/WlanDrvWext.c
+++ b/wilink_6_1/platforms/os/linux/src/WlanDrvWext.c
@@ -166,82 +166,86 @@
                      void *iw_req, 
                      void *extra)
 {
-   int              rc;
-   TWlanDrvIfObj   *drv = (TWlanDrvIfObj *)NETDEV_GET_PRIVATE(dev);
-   ti_private_cmd_t my_command; 
-   struct iw_mlme   mlme;
-   void             *copy_to_buf=NULL, *param3=NULL; 
+    int              rc;
+    TWlanDrvIfObj   *drv = (TWlanDrvIfObj *)NETDEV_GET_PRIVATE(dev);
+    ti_private_cmd_t my_command; 
+    struct iw_mlme   mlme;
+    void             *copy_to_buf=NULL, *param3=NULL; 
 
-   os_memoryZero(drv, &my_command, sizeof(ti_private_cmd_t));
-   os_memoryZero(drv, &mlme,       sizeof(struct iw_mlme));
-   
-   switch (info->cmd)
-   {
-     case SIOCIWFIRSTPRIV:
-     {
-	   void *copy_from_buf;
+    os_memoryZero(drv, &my_command, sizeof(ti_private_cmd_t));
+    os_memoryZero(drv, &mlme,       sizeof(struct iw_mlme));
 
- 	   if (os_memoryCopyFromUser(drv, &my_command, ((union iwreq_data *)iw_req)->data.pointer, sizeof(ti_private_cmd_t)))
-	   {
-		 os_printf ("wlanDrvWext_Handler() os_memoryCopyFromUser FAILED !!!\n");
-		 return TI_NOK;
-	   }
-	   if (IS_PARAM_FOR_MODULE(my_command.cmd, DRIVER_MODULE_PARAM))
-       {
-		   /* If it's a driver level command, handle it here and exit */
-           switch (my_command.cmd)
-           {
-           case DRIVER_INIT_PARAM:
-               return wlanDrvIf_LoadFiles (drv, my_command.in_buffer);
-                
-           case DRIVER_START_PARAM:
-               return wlanDrvIf_Start (dev);
+    switch (info->cmd)
+    {
+        case SIOCIWFIRSTPRIV:
+        {
+            void *copy_from_buf;
 
-           case DRIVER_STOP_PARAM:
-               return wlanDrvIf_Stop (dev);
+            if (os_memoryCopyFromUser(drv, &my_command, ((union iwreq_data *)iw_req)->data.pointer, sizeof(ti_private_cmd_t)))
+            {
+                os_printf ("wlanDrvWext_Handler() os_memoryCopyFromUser FAILED !!!\n");
+                return TI_NOK;
+            }
+            if (IS_PARAM_FOR_MODULE(my_command.cmd, DRIVER_MODULE_PARAM))
+            {
+                /* If it's a driver level command, handle it here and exit */
+                switch (my_command.cmd)
+                {
+                    case DRIVER_INIT_PARAM:
+                        return wlanDrvIf_LoadFiles(drv, my_command.in_buffer);
 
-           case DRIVER_STATUS_PARAM:
-               *(TI_UINT32 *)my_command.out_buffer = 
-                   (drv->tCommon.eDriverState == DRV_STATE_RUNNING) ? TI_TRUE : TI_FALSE;
-               return TI_OK;
-           }
-       }
-	   /* if we are still here handle a normal private command*/
+                    case DRIVER_START_PARAM:
+                        return wlanDrvIf_Start(dev);
 
-	   if ((my_command.in_buffer) && (my_command.in_buffer_len))
-       {
-		 copy_from_buf        = my_command.in_buffer;
-		 my_command.in_buffer = os_memoryAlloc(drv, my_command.in_buffer_len);
-		 if (os_memoryCopyFromUser(drv, my_command.in_buffer, copy_from_buf, my_command.in_buffer_len))
-		 {
-		   os_printf ("wlanDrvWext_Handler() os_memoryCopyFromUser 1 FAILED !!!\n");
-		   return TI_NOK;
-		 }
-	   }
-	   if ((my_command.out_buffer) && (my_command.out_buffer_len))
-	   {
-		 copy_to_buf          = my_command.out_buffer;
-		 my_command.out_buffer = os_memoryAlloc(drv, my_command.out_buffer_len);
-	   }
-	   param3 = &my_command;
-     }
-	 break;
+                    case DRIVER_STOP_PARAM:
+                        return wlanDrvIf_Stop(dev);
 
-     case SIOCSIWMLME:
-     {
-		os_memoryCopyFromUser(drv, &mlme, ((union iwreq_data *)iw_req)->data.pointer, sizeof(struct iw_mlme));
-		param3 = &mlme;
-     }
-	 break;
-   }
-   /* If the friver is not running, return NOK */
-   if (drv->tCommon.eDriverState != DRV_STATE_RUNNING)
-   {
-       return TI_NOK;
-   }
+                    case DRIVER_STATUS_PARAM:
+                        *(TI_UINT32 *)my_command.out_buffer =
+                           (drv->tCommon.eDriverState == DRV_STATE_RUNNING) ? TI_TRUE : TI_FALSE;
+                        return TI_OK;
+                }
+            }
+            /* if we are still here handle a normal private command*/
 
-   /* Call the Cmd module with the given user paramters */
-   rc = (cmdHndlr_InsertCommand (drv->tCommon.hCmdHndlr, 
+            if ((my_command.in_buffer) && (my_command.in_buffer_len))
+            {
+                copy_from_buf        = my_command.in_buffer;
+                my_command.in_buffer = os_memoryAlloc(drv, my_command.in_buffer_len);
+                if (os_memoryCopyFromUser(drv, my_command.in_buffer, copy_from_buf, my_command.in_buffer_len))
+                {
+                    os_printf("wlanDrvWext_Handler() os_memoryCopyFromUser 1 FAILED !!!\n");
+                    return TI_NOK;
+                }
+            }
+            if ((my_command.out_buffer) && (my_command.out_buffer_len))
+            {
+                copy_to_buf          = my_command.out_buffer;
+                my_command.out_buffer = os_memoryAlloc(drv, my_command.out_buffer_len);
+            }
+            param3 = &my_command;
+        }
+        break;
+
+        case SIOCSIWMLME:
+        {
+            os_memoryCopyFromUser(drv, &mlme, ((union iwreq_data *)iw_req)->data.pointer, sizeof(struct iw_mlme));
+            param3 = &mlme;
+        }
+        break;
+    }
+    /* If the friver is not running, return NOK */
+    if (drv->tCommon.eDriverState != DRV_STATE_RUNNING)
+    {
+        if (my_command.in_buffer)
+            os_memoryFree(drv, my_command.in_buffer, my_command.in_buffer_len);
+        if (my_command.out_buffer)
+            os_memoryFree(drv,my_command.out_buffer,my_command.out_buffer_len);
+        return TI_NOK;
+    }
+
+    /* Call the Cmd module with the given user paramters */
+    rc = cmdHndlr_InsertCommand(drv->tCommon.hCmdHndlr,
                                    info->cmd, 
                                    info->flags, 
                                    iw_req, 
@@ -249,21 +253,20 @@
                                    extra, 
                                    0, 
                                    param3, 
-                                   NULL));
-   /* Here we are after the command was completed */
-   if (my_command.in_buffer)
-   {
-	 os_memoryFree (drv, my_command.in_buffer, my_command.in_buffer_len);
-   }
-   if (my_command.out_buffer)
-   {
-	 if (os_memoryCopyToUser(drv, copy_to_buf, my_command.out_buffer, my_command.out_buffer_len))
-	 {
-	   os_printf ("wlanDrvWext_Handler() os_memoryCopyToUser FAILED !!!\n");
-	   rc = TI_NOK;
-	 }
-	 os_memoryFree (drv, my_command.out_buffer, my_command.out_buffer_len);
-   }
-
-   return rc;
+                                   NULL);
+    /* Here we are after the command was completed */
+    if (my_command.in_buffer)
+    {
+        os_memoryFree(drv, my_command.in_buffer, my_command.in_buffer_len);
+    }
+    if (my_command.out_buffer)
+    {
+        if (os_memoryCopyToUser(drv, copy_to_buf, my_command.out_buffer, my_command.out_buffer_len))
+        {
+            os_printf("wlanDrvWext_Handler() os_memoryCopyToUser FAILED !!!\n");
+            rc = TI_NOK;
+        }
+        os_memoryFree(drv, my_command.out_buffer, my_command.out_buffer_len);
+    }
+    return rc;
 }
diff --git a/wilink_6_1/platforms/os/linux/src/osapi.c b/wilink_6_1/platforms/os/linux/src/osapi.c
index fd99089..4ad5646 100644
--- a/wilink_6_1/platforms/os/linux/src/osapi.c
+++ b/wilink_6_1/platforms/os/linux/src/osapi.c
@@ -602,8 +602,8 @@
 	int ret = 0;
 	unsigned long flags;
 
-	spin_lock_irqsave(&drv->lock, flags);
 	if (drv) {
+		spin_lock_irqsave(&drv->lock, flags);
 		ret = drv->wl_packet;
 		if (drv->wl_packet) {
 			drv->wl_packet = 0;
@@ -611,8 +611,8 @@
 			wake_lock_timeout(&drv->wl_rxwake, (HZ >> 1));
 #endif
 		}
+		spin_unlock_irqrestore(&drv->lock, flags);
 	}
-	spin_unlock_irqrestore(&drv->lock, flags);
 	/* printk("%s: %d\n", __func__, ret); */
 	return ret;
 }
@@ -630,11 +630,13 @@
 {
 	TWlanDrvIfObj *drv = (TWlanDrvIfObj *)OsContext;
 	unsigned long flags;
-	int ret;
+	int ret = 0;
 
-	spin_lock_irqsave(&drv->lock, flags);
-	ret = drv->wl_packet = 1;
-	spin_unlock_irqrestore(&drv->lock, flags);
+	if (drv) {
+		spin_lock_irqsave(&drv->lock, flags);
+		ret = drv->wl_packet = 1;
+		spin_unlock_irqrestore(&drv->lock, flags);
+	}
 	return ret;
 }
 
@@ -653,16 +655,16 @@
 	int ret = 0;
 	unsigned long flags;
 
-	spin_lock_irqsave(&drv->lock, flags);
 	if (drv) {
+		spin_lock_irqsave(&drv->lock, flags);
 #ifdef CONFIG_HAS_WAKELOCK
 		if (!drv->wl_count)
 			wake_lock(&drv->wl_wifi);
 #endif
 		drv->wl_count++;
 		ret = drv->wl_count;
+		spin_unlock_irqrestore(&drv->lock, flags);
 	}
-	spin_unlock_irqrestore(&drv->lock, flags);
 	/* printk("%s: %d\n", __func__, ret); */
 	return ret;
 }
@@ -682,16 +684,18 @@
 	int ret = 0;
 	unsigned long flags;
 
-	spin_lock_irqsave(&drv->lock, flags);
-	if (drv && drv->wl_count) {
-		drv->wl_count--;
+	if (drv) {
+		spin_lock_irqsave(&drv->lock, flags);
+		if (drv->wl_count) {
+			drv->wl_count--;
 #ifdef CONFIG_HAS_WAKELOCK
-		if (!drv->wl_count)
-			wake_unlock(&drv->wl_wifi);
+			if (!drv->wl_count)
+				wake_unlock(&drv->wl_wifi);
 #endif
-		ret = drv->wl_count;
+			ret = drv->wl_count;
+		}
+		spin_unlock_irqrestore(&drv->lock, flags);
 	}
-	spin_unlock_irqrestore(&drv->lock, flags);
 	/* printk("%s: %d\n", __func__, ret); */
 	return ret;
 }
diff --git a/wilink_6_1/platforms/os/linux/zoom2_env.bash b/wilink_6_1/platforms/os/linux/zoom2_env.bash
index bf1addc..5d5d4a5 100644
--- a/wilink_6_1/platforms/os/linux/zoom2_env.bash
+++ b/wilink_6_1/platforms/os/linux/zoom2_env.bash
@@ -1,4 +1,4 @@
 export CROSS_COMPILE=arm-eabi-
 export ARCH=arm
 export HOST_PLATFORM=zoom2
-export KERNEL_DIR=/usr/local/google/android/eclair/kernel
+export KERNEL_DIR=/usr/local/google/android/eclair-mr2/kernel
diff --git a/wilink_6_1/stad/src/Connection_Managment/admCtrlWpa.c b/wilink_6_1/stad/src/Connection_Managment/admCtrlWpa.c
index 3a92561..77041ba 100644
--- a/wilink_6_1/stad/src/Connection_Managment/admCtrlWpa.c
+++ b/wilink_6_1/stad/src/Connection_Managment/admCtrlWpa.c
@@ -1251,7 +1251,8 @@
             curWpaIe +=4; 
 
             /* Include all AP key management supported suites in the wpaData structure */
-            pWpaData->KeyMngSuite[index+1] = curKeyMngSuite;
+	    if ((index+1) < MAX_WPA_KEY_MNG_SUITES)
+                pWpaData->KeyMngSuite[index+1] = curKeyMngSuite;
 
         }
         pWpaData->KeyMngSuite[0] = maxKeyMngSuite;
diff --git a/wilink_6_1/stad/src/Connection_Managment/connInfra.c b/wilink_6_1/stad/src/Connection_Managment/connInfra.c
index 866b0fe..b48acdf 100644
--- a/wilink_6_1/stad/src/Connection_Managment/connInfra.c
+++ b/wilink_6_1/stad/src/Connection_Managment/connInfra.c
@@ -856,7 +856,7 @@
 
     /* Start the disconnect complete time out timer. 
        Disconect Complete event, which stops the timer. */
-    tmr_StartTimer (pConn->hConnTimer, conn_timeout, (TI_HANDLE)pConn, DISCONNECT_TIMEOUT_MSEC * 4, TI_FALSE);
+    tmr_StartTimer (pConn->hConnTimer, conn_timeout, (TI_HANDLE)pConn, DISCONNECT_TIMEOUT_MSEC, TI_FALSE);
 
     /* FW will send the disconn frame according to disConnType */ 
     TWD_CmdFwDisconnect (pConn->hTWD, pConn->disConnType, pConn->disConnReasonToAP); 
diff --git a/wilink_6_1/stad/src/Data_link/rx.c b/wilink_6_1/stad/src/Data_link/rx.c
index 52436fe..beb234f 100644
--- a/wilink_6_1/stad/src/Data_link/rx.c
+++ b/wilink_6_1/stad/src/Data_link/rx.c
@@ -39,28 +39,28 @@
 /***************************************************************************/
 #define __FILE_ID__  FILE_ID_54
 #include "tidef.h"
-#include "paramOut.h" 
+#include "paramOut.h"
 #include "rx.h"
 #include "osApi.h"
 #include "timer.h"
 #include "DataCtrl_Api.h"
 #include "Ctrl.h"
 #include "802_11Defs.h"
-#include "Ethernet.h" 
+#include "Ethernet.h"
 #include "report.h"
 #include "rate.h"
 #include "mlmeApi.h"
 #include "rsnApi.h"
 #include "smeApi.h"
 #include "siteMgrApi.h"
-#include "GeneralUtil.h"   
+#include "GeneralUtil.h"
 #include "EvHandler.h"
 #ifdef XCC_MODULE_INCLUDED
 #include "XCCMngr.h"
 #endif
 #include "TWDriver.h"
 #include "RxBuf.h"
-#include "DrvMainModules.h" 
+#include "DrvMainModules.h"
 #include "bmtrace_api.h"
 #include "PowerMgr_API.h"
 
@@ -184,7 +184,7 @@
     pRxData->hEvHandler = pStadHandles->hEvHandler;
     pRxData->hTimer     = pStadHandles->hTimer;
     pRxData->hPowerMgr  = pStadHandles->hPowerMgr;
-    
+
     pRxData->rxDataExcludeUnencrypted = DEF_EXCLUDE_UNENCYPTED; 
     pRxData->rxDataExludeBroadcastUnencrypted = DEF_EXCLUDE_UNENCYPTED;
     pRxData->rxDataEapolDestination = DEF_EAPOL_DESTINATION;
@@ -239,7 +239,7 @@
 {
     rxData_t *pRxData = (rxData_t *)hRxData;
     int i;
-    
+
     /* init rx data filters */
     pRxData->filteringEnabled = rxDataInitParams->rxDataFiltersEnabled;
     pRxData->filteringDefaultAction = rxDataInitParams->rxDataFiltersDefaultAction;
@@ -814,7 +814,6 @@
                                 lenFieldPatterns, 
                                 fieldPatterns);
 
-    return TI_OK;
 }
 
 /***************************************************************************
diff --git a/wilink_6_1/wpa_supplicant_lib/driver_ti.c b/wilink_6_1/wpa_supplicant_lib/driver_ti.c
index a579be1..55198c5 100644
--- a/wilink_6_1/wpa_supplicant_lib/driver_ti.c
+++ b/wilink_6_1/wpa_supplicant_lib/driver_ti.c
@@ -134,12 +134,17 @@
 	iwr.u.data.flags = 0;
 
 	res = ioctl(drv->ioctl_sock, SIOCIWFIRSTPRIV, &iwr);
-	if(res != 0)
+	if (0 != res)
 	{
 		wpa_printf(MSG_ERROR, "ERROR - wpa_driver_tista_private_send - error sending Wext private IOCTL to STA driver (ioctl_cmd = %x,  res = %d, errno = %d)", ioctl_cmd, res, errno);
+		drv->errors++;
+		if (drv->errors > MAX_NUMBER_SEQUENTIAL_ERRORS) {
+			drv->errors = 0;
+			wpa_msg(drv->ctx, MSG_INFO, WPA_EVENT_DRIVER_STATE "HANGED");
+		}
 		return -1;
 	}
-
+	drv->errors = 0;
 	wpa_printf(MSG_DEBUG, "wpa_driver_tista_private_send ioctl_cmd = %x  res = %d", ioctl_cmd, res);
 
 	return 0;
@@ -153,8 +158,10 @@
 
 	res = wpa_driver_tista_private_send(priv, DRIVER_START_PARAM, &uDummyBuf, sizeof(uDummyBuf), NULL, 0);
 
-	if(0 != res)
+	if (0 != res) {
 		wpa_printf(MSG_ERROR, "ERROR - Failed to start driver!");
+		wpa_msg(drv->ctx, MSG_INFO, WPA_EVENT_DRIVER_STATE "HANGED");
+	}
 	else {
 		os_sleep(0, WPA_DRIVER_WEXT_WAIT_US); /* delay 400 ms */
 		wpa_printf(MSG_DEBUG, "wpa_driver_tista_driver_start success");
@@ -170,8 +177,10 @@
 
 	res = wpa_driver_tista_private_send(priv, DRIVER_STOP_PARAM, &uDummyBuf, sizeof(uDummyBuf), NULL, 0);
 
-	if(0 != res)
+	if (0 != res) {
 		wpa_printf(MSG_ERROR, "ERROR - Failed to stop driver!");
+		wpa_msg(drv->ctx, MSG_INFO, WPA_EVENT_DRIVER_STATE "HANGED");
+	}
 	else
 		wpa_printf(MSG_DEBUG, "wpa_driver_tista_driver_stop success");
 
@@ -593,6 +602,11 @@
 			wpa_msg(drv->ctx, MSG_INFO, WPA_EVENT_DRIVER_STATE "STOPPED");
 		}
 	}
+	if( os_strcasecmp(cmd, "reload") == 0 ) {
+		wpa_printf(MSG_DEBUG,"Reload command");
+		ret = 0;
+		wpa_msg(drv->ctx, MSG_INFO, WPA_EVENT_DRIVER_STATE "HANGED");
+	}
 	else if( os_strcasecmp(cmd, "macaddr") == 0 ) {
 		wpa_driver_tista_get_mac_addr(priv);
 		wpa_printf(MSG_DEBUG, "Macaddr command");
@@ -651,14 +665,13 @@
 				os_memcpy( (void *)buf, (void *)(cur_res->ssid), len );
 				ret = len;
 				ret += snprintf(&buf[ret], buf_len-len, " rssi %d\n", rssi);
-				if (ret < (int)buf_len) {
-					return( ret );
-				}
 			}
 		}
 	}
 	else if( os_strcasecmp(cmd, "rssi") == 0 ) {
 		u8 ssid[MAX_SSID_LEN];
+		struct wpa_scan_result *cur_res;
+		struct wpa_supplicant *wpa_s = (struct wpa_supplicant *)(drv->ctx);
 		int rssi_data, rssi_beacon, len;
 
 		wpa_printf(MSG_DEBUG,"rssi command");
@@ -672,6 +685,12 @@
 				ret = len;
 				ret += sprintf(&buf[ret], " rssi %d\n", rssi_beacon);
 				wpa_printf(MSG_DEBUG, "buf %s", buf);
+				/* Update cached value */
+				if( !wpa_s )
+					return( ret );
+				cur_res = scan_get_by_bssid( drv, wpa_s->bssid );
+				if( cur_res )
+					cur_res->level = rssi_beacon;
 			}
 			else
 			{
@@ -834,6 +853,9 @@
 
 	/* BtCoex mode is read from tiwlan.ini file */
 	drv->btcoex_mode = 0; /* SG_DISABLE */
+
+	/* Number of sequential errors */
+	drv->errors = 0;
 	return drv;
 }
 
diff --git a/wilink_6_1/wpa_supplicant_lib/driver_ti.h b/wilink_6_1/wpa_supplicant_lib/driver_ti.h
index ab36ab3..6f36119 100644
--- a/wilink_6_1/wpa_supplicant_lib/driver_ti.h
+++ b/wilink_6_1/wpa_supplicant_lib/driver_ti.h
@@ -53,6 +53,8 @@
 #define RX_IPV4_MULTICAST_FILTER	2
 #define RX_IPV6_MULTICAST_FILTER	3
 
+#define MAX_NUMBER_SEQUENTIAL_ERRORS	4
+
 typedef enum {
 	BLUETOOTH_COEXISTENCE_MODE_ENABLED = 0,
 	BLUETOOTH_COEXISTENCE_MODE_DISABLED,
@@ -73,5 +75,6 @@
 	u32 btcoex_mode;		/* BtCoex Mode */
 	int last_scan;			/* Last scan type */
 	SHLIST scan_merge_list;		/* Previous scan list */
+	int errors;			/* Number of sequential errors */
 };
 #endif