wifiloader: Make sure WiFi firmware path is writable
authorChristopher N. Hesse <raymanfx@gmail.com>
Wed, 24 Jan 2018 01:14:45 +0000 (02:14 +0100)
committerChristopher N. Hesse <raymanfx@gmail.com>
Mon, 5 Feb 2018 14:05:28 +0000 (14:05 +0000)
Change-Id: Ib0ae2a004d4207a4ccb3d551c9a6a092920595ca

wifiloader/Android.mk
wifiloader/wifiloader.c

index 32b80b18831ef9a56252a049add077344b0daaa0..9d27fb717e6e31850a4ac7fa94aa7cf4d299f4d4 100644 (file)
@@ -9,6 +9,9 @@ LOCAL_SRC_FILES := \
 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 @@ ifneq ($(WIFI_DRIVER_MODULE_PATH),)
 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
 
index c827aea8726eb3fe34dc1b069503e8b61d9339cc..0aeec3e782329b0b6e86fe7fa0926a8222825cf9 100644 (file)
@@ -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
 #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 @@ static int load_module(char const *path)
         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");