wifihal: Update driver control param to check driver is ready
Write driver control param and wait for successful update to make sure
driver is ready in LONU model.
Change-Id: I8e29365be4d358d374191ea47309b358ef330e88
CRs-Fixed: 2841217
diff --git a/qcwcn/wifi_hal/Android.mk b/qcwcn/wifi_hal/Android.mk
index 1f9a572..c543531 100644
--- a/qcwcn/wifi_hal/Android.mk
+++ b/qcwcn/wifi_hal/Android.mk
@@ -51,6 +51,13 @@
LOCAL_CFLAGS += -Wall -Werror
+ifdef WIFI_DRIVER_STATE_CTRL_PARAM
+LOCAL_CFLAGS += -DWIFI_DRIVER_STATE_CTRL_PARAM=\"$(WIFI_DRIVER_STATE_CTRL_PARAM)\"
+ifdef WIFI_DRIVER_STATE_ON
+LOCAL_CFLAGS += -DWIFI_DRIVER_STATE_ON=\"$(WIFI_DRIVER_STATE_ON)\"
+endif
+endif
+
LOCAL_C_INCLUDES += \
$(LOCAL_PATH) \
external/libnl/include \
@@ -123,6 +130,13 @@
# gscan.cpp: address of array 'cached_results[i].results' will always evaluate to 'true'
LOCAL_CLANG_CFLAGS := -Wno-pointer-bool-conversion
+ifdef WIFI_DRIVER_STATE_CTRL_PARAM
+LOCAL_CFLAGS += -DWIFI_DRIVER_STATE_CTRL_PARAM=\"$(WIFI_DRIVER_STATE_CTRL_PARAM)\"
+ifdef WIFI_DRIVER_STATE_ON
+LOCAL_CFLAGS += -DWIFI_DRIVER_STATE_ON=\"$(WIFI_DRIVER_STATE_ON)\"
+endif
+endif
+
LOCAL_C_INCLUDES += \
$(LOCAL_PATH) \
external/libnl/include \
diff --git a/qcwcn/wifi_hal/wifi_hal.cpp b/qcwcn/wifi_hal/wifi_hal.cpp
index 1e4f787..d7c03de 100644
--- a/qcwcn/wifi_hal/wifi_hal.cpp
+++ b/qcwcn/wifi_hal/wifi_hal.cpp
@@ -948,6 +948,39 @@
return ret;
}
+#ifdef WIFI_DRIVER_STATE_CTRL_PARAM
+static int wifi_update_driver_state(const char *state) {
+ struct timespec ts;
+ int len, fd, ret = 0, count = 5;
+ ts.tv_sec = 0;
+ ts.tv_nsec = 200 * 1000000L;
+ do {
+ if (access(WIFI_DRIVER_STATE_CTRL_PARAM, W_OK) == 0)
+ break;
+ nanosleep(&ts, (struct timespec *)NULL);
+ } while (--count > 0); /* wait at most 1 second for completion. */
+ if (count == 0) {
+ ALOGE("Failed to access driver state control param %s, %d at %s",
+ strerror(errno), errno, WIFI_DRIVER_STATE_CTRL_PARAM);
+ return -1;
+ }
+ fd = TEMP_FAILURE_RETRY(open(WIFI_DRIVER_STATE_CTRL_PARAM, O_WRONLY));
+ if (fd < 0) {
+ ALOGE("Failed to open driver state control param at %s",
+ WIFI_DRIVER_STATE_CTRL_PARAM);
+ return -1;
+ }
+ len = strlen(state) + 1;
+ if (TEMP_FAILURE_RETRY(write(fd, state, len)) != len) {
+ ALOGE("Failed to write driver state control param at %s",
+ WIFI_DRIVER_STATE_CTRL_PARAM);
+ ret = -1;
+ }
+ close(fd);
+ return ret;
+}
+#endif
+
wifi_error wifi_wait_for_driver_ready(void)
{
// This function will wait to make sure basic client netdev is created
@@ -955,6 +988,12 @@
int count = (POLL_DRIVER_MAX_TIME_MS * 1000) / POLL_DRIVER_DURATION_US;
FILE *fd;
+#if defined(WIFI_DRIVER_STATE_CTRL_PARAM) && defined(WIFI_DRIVER_STATE_ON)
+ if (wifi_update_driver_state(WIFI_DRIVER_STATE_ON) < 0) {
+ return WIFI_ERROR_UNKNOWN;
+ }
+#endif
+
do {
if ((fd = fopen("/sys/class/net/wlan0", "r")) != NULL) {
fclose(fd);