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");