wifiloader: Make sure WiFi firmware path is writable
Change-Id: Ib0ae2a004d4207a4ccb3d551c9a6a092920595ca
diff --git a/wifiloader/Android.mk b/wifiloader/Android.mk
index 32b80b1..9d27fb7 100644
--- a/wifiloader/Android.mk
+++ b/wifiloader/Android.mk
@@ -9,6 +9,9 @@
LOCAL_SHARED_LIBRARIES := \
libcutils liblog libutils
+LOCAL_C_INCLUDES := \
+ system/core/include
+
ifneq ($(WIFI_DRIVER_MODULE_NAME),)
LOCAL_CFLAGS += -DWIFI_DRIVER_MODULE_NAME=\"$(WIFI_DRIVER_MODULE_NAME)\"
endif
@@ -17,6 +20,10 @@
LOCAL_CFLAGS += -DWIFI_DRIVER_MODULE_PATH=\"$(WIFI_DRIVER_MODULE_PATH)\"
endif
+ifneq ($(WIFI_DRIVER_FW_PATH_PARAM),)
+LOCAL_CFLAGS += -DWIFI_DRIVER_FW_PATH_PARAM=\"$(WIFI_DRIVER_FW_PATH_PARAM)\"
+endif
+
LOCAL_MODULE := wifiloader
LOCAL_MODULE_TAGS := optional
diff --git a/wifiloader/wifiloader.c b/wifiloader/wifiloader.c
index c827aea..0aeec3e 100644
--- a/wifiloader/wifiloader.c
+++ b/wifiloader/wifiloader.c
@@ -28,6 +28,8 @@
#include <sys/stat.h>
#include <sys/syscall.h>
+#include <private/android_filesystem_config.h>
+
#define DEFERRED_INITCALLS "/proc/deferred_initcalls"
#ifndef WIFI_DRIVER_MODULE_NAME
@@ -38,6 +40,10 @@
#define WIFI_DRIVER_MODULE_PATH "/system/lib/modules/" WIFI_DRIVER_MODULE_NAME ".ko"
#endif
+#ifndef WIFI_DRIVER_FW_PATH_PARAM
+#define WIFI_DRIVER_FW_PATH_PARAM "/sys/module/wlan/parameters/fwpath"
+#endif
+
#define finit_module(fd, params, flags) syscall(__NR_finit_module, fd, params, flags)
@@ -84,6 +90,14 @@
return -errno;
}
+ // setup proper permissions for firmware change
+ if (chown(WIFI_DRIVER_FW_PATH_PARAM, AID_WIFI, AID_WIFI) != 0) {
+ ALOGE("Failed to chown firmware path %s - error: %s",
+ WIFI_DRIVER_FW_PATH_PARAM, strerror(errno));
+ close(fd);
+ return -errno;
+ }
+
// let wifi HAL know we succeeded
ALOGV("Successfully loaded WLAN module: %s", WIFI_DRIVER_MODULE_NAME);
property_set("wlan.driver.status", "ok");