summaryrefslogtreecommitdiffstats
path: root/wifi
diff options
context:
space:
mode:
Diffstat (limited to 'wifi')
-rw-r--r--wifi/Android.mk4
-rw-r--r--wifi/wifi.c45
2 files changed, 49 insertions, 0 deletions
diff --git a/wifi/Android.mk b/wifi/Android.mk
index 7610a9e..dbac36e 100644
--- a/wifi/Android.mk
+++ b/wifi/Android.mk
@@ -47,6 +47,10 @@ ifdef WIFI_DRIVER_STATE_OFF
LOCAL_CFLAGS += -DWIFI_DRIVER_STATE_OFF=\"$(WIFI_DRIVER_STATE_OFF)\"
endif
+ifdef WIFI_DRIVER_OPERSTATE_PATH
+LOCAL_CFLAGS += -DWIFI_DRIVER_OPERSTATE_PATH=\"$(WIFI_DRIVER_OPERSTATE_PATH)\"
+endif
+
ifdef WIFI_FST_DRIVER_MODULE_PATH
LOCAL_CFLAGS += -DWIFI_FST_DRIVER_MODULE_PATH=\"$(WIFI_FST_DRIVER_MODULE_PATH)\"
endif
diff --git a/wifi/wifi.c b/wifi/wifi.c
index e9a2958..de2f8ee 100644
--- a/wifi/wifi.c
+++ b/wifi/wifi.c
@@ -139,6 +139,11 @@ static const char EXT_MODULE_PATH[] = WIFI_EXT_MODULE_PATH;
#define WIFI_DRIVER_FW_PATH_PARAM "/sys/module/wlan/parameters/fwpath"
#endif
+#ifdef WIFI_DRIVER_OPERSTATE_PATH
+#define OPERSTATE_UP "up"
+#define OPERSTATE_DOWN "down"
+#endif
+
#define WIFI_DRIVER_LOADER_DELAY 1000000
static const char IFACE_DIR[] = "/data/system/wpa_supplicant";
@@ -347,6 +352,40 @@ int is_wifi_driver_loaded() {
#endif
}
+#ifdef WIFI_DRIVER_OPERSTATE_PATH
+int is_wifi_driver_ready() {
+ struct stat sbuf;
+ FILE *fstate;
+ char operstate[8];
+ int open_count = 25, read_count = 25;
+ while (open_count-- >= 0) {
+ if (stat(WIFI_DRIVER_OPERSTATE_PATH, &sbuf) == 0) {
+ if ((fstate = fopen(WIFI_DRIVER_OPERSTATE_PATH, "r")) == NULL) {
+ usleep(500000);
+ } else {
+ break;
+ }
+ } else {
+ usleep(500000);
+ }
+ }
+ if (fstate != NULL) {
+ while (read_count-- >= 0) {
+ fgets(operstate, sizeof(operstate), fstate);
+ if (strncmp(operstate, OPERSTATE_UP, strlen(OPERSTATE_UP)) == 0 ||
+ strncmp(operstate, OPERSTATE_DOWN, strlen(OPERSTATE_DOWN)) == 0) {
+ ALOGI("Wifi driver is ready");
+ return 1;
+ }
+ ALOGW("Waiting for Wifi driver to get ready. (%d)", read_count);
+ usleep(500000);
+ }
+ fclose(fstate);
+ }
+ return 0;
+}
+#endif
+
int wifi_load_driver()
{
char driver_status[PROPERTY_VALUE_MAX];
@@ -396,6 +435,12 @@ int wifi_load_driver()
return -1;
#endif
#endif
+#ifdef WIFI_DRIVER_OPERSTATE_PATH
+ if (!is_wifi_driver_ready()) {
+ ALOGE("Wifi driver didn't get ready in time, giving up!");
+ return -1;
+ }
+#endif
if (strcmp(FIRMWARE_LOADER,"") == 0) {
/* usleep(WIFI_DRIVER_LOADER_DELAY); */