Code drop from //branches/cupcake/...@124589
diff --git a/wifi/wifi.c b/wifi/wifi.c
index 68b1a1e..76cbdc9 100644
--- a/wifi/wifi.c
+++ b/wifi/wifi.c
@@ -131,6 +131,7 @@
      */
     if ((proc = fopen(MODULE_FILE, "r")) == NULL) {
         LOGW("Could not open %s: %s", MODULE_FILE, strerror(errno));
+	property_set(DRIVER_PROP_NAME, "unloaded");	
         return 0;
     }
     while ((fgets(line, sizeof(line), proc)) != NULL) {
@@ -147,21 +148,25 @@
 int wifi_load_driver()
 {
     char driver_status[PROPERTY_VALUE_MAX];
-    int count = 40; /* wait at most 20 seconds for completion */
+    int count = 100; /* wait at most 20 seconds for completion */
 
     if (check_driver_loaded()) {
         return 0;
     }
-    insmod(DRIVER_MODULE_PATH);
+
+    if (insmod(DRIVER_MODULE_PATH) < 0)
+        return -1;
+      
     property_set("ctl.start", FIRMWARE_LOADER);
+    sched_yield();
     while (count-- > 0) {
-        usleep(500000);
         if (property_get(DRIVER_PROP_NAME, driver_status, NULL)) {
             if (strcmp(driver_status, "ok") == 0)
                 return 0;
             else if (strcmp(DRIVER_PROP_NAME, "failed") == 0)
                 return -1;
         }
+        usleep(200000);
     }
     property_set(DRIVER_PROP_NAME, "timeout");
     return -1;
@@ -169,10 +174,18 @@
 
 int wifi_unload_driver()
 {
+    int count = 20; /* wait at most 10 seconds for completion */
+    
     if (rmmod(DRIVER_MODULE_NAME) == 0) {
-        usleep(1000000);
-        property_set(DRIVER_PROP_NAME, "unloaded");
-        return 0;
+	while (count-- > 0) {
+	    if (!check_driver_loaded())
+		break;
+    	    usleep(500000);
+	}
+	if (count) {
+    	    return 0;
+	}
+	return -1;
     } else
         return -1;
 }
@@ -182,20 +195,21 @@
     char supp_status[PROPERTY_VALUE_MAX] = {'\0'};
     const char *ctrl_prop = (startIt ? "ctl.start" : "ctl.stop");
     const char *desired_status = (startIt ? "running" : "stopped");
-    int count = 20; /* wait at most 20 seconds for completion */
+    int count = 200; /* wait at most 20 seconds for completion */
 
     if (property_get(SUPP_PROP_NAME, supp_status, NULL)
         && strcmp(supp_status, desired_status) == 0) {
         return 0;  /* supplicant already running */
     }
     property_set(ctrl_prop, SUPPLICANT_NAME);
+    sched_yield();
 
     while (count-- > 0) {
-        usleep(1000000);
         if (property_get(SUPP_PROP_NAME, supp_status, NULL)) {
             if (strcmp(supp_status, desired_status) == 0)
                 return 0;
         }
+        usleep(100000);
     }
     return -1;
 }