From e283a09f99d0cbad2cf8b903ffe2da1c3e44663e Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Mon, 26 Jan 2015 22:56:30 +0100 Subject: macloader: Add support to set nvram calibration file. Change-Id: I0eb99ad6084eb8cd4452a91b13dd75384785f5a8 Signed-off-by: Andreas Schneider --- macloader/Android.mk | 8 +++++ macloader/macloader.c | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+) diff --git a/macloader/Android.mk b/macloader/Android.mk index 722325f..ee843be 100644 --- a/macloader/Android.mk +++ b/macloader/Android.mk @@ -3,6 +3,14 @@ ifeq ($(BOARD_HAVE_SAMSUNG_WIFI),true) LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) +ifdef WIFI_DRIVER_NVRAM_PATH +LOCAL_CFLAGS += -DWIFI_DRIVER_NVRAM_PATH=\"$(WIFI_DRIVER_NVRAM_PATH)\" +endif + +ifdef WIFI_DRIVER_NVRAM_PATH_PARAM +LOCAL_CFLAGS += -DWIFI_DRIVER_NVRAM_PATH_PARAM=\"$(WIFI_DRIVER_NVRAM_PATH_PARAM)\" +endif + LOCAL_SRC_FILES := \ macloader.c diff --git a/macloader/macloader.c b/macloader/macloader.c index 7e1a10c..bdf94b4 100644 --- a/macloader/macloader.c +++ b/macloader/macloader.c @@ -22,12 +22,22 @@ #include #include #include +#include #include +#include #include #include #include +#ifndef WIFI_DRIVER_NVRAM_PATH +#define WIFI_DRIVER_NVRAM_PATH NULL +#endif + +#ifndef WIFI_DRIVER_NVRAM_PATH_PARAM +#define WIFI_DRIVER_NVRAM_PATH_PARAM "/sys/module/wlan/parameters/nvram_path" +#endif + #define MACADDR_PATH "/efs/wifi/.mac.info" #define CID_PATH "/data/.cid.info" @@ -40,6 +50,82 @@ enum Type { WISOL }; +static int wifi_change_nvram_calibration(const char *nvram_file, + const char *type) +{ + int len; + int fd = -1; + int ret = 0; + struct stat sb; + char nvram_str[1024] = { 0 }; + + if (nvram_file == NULL || type == NULL) { + return -1; + } + + ret = stat(nvram_file, &sb); + if (ret != 0) { + ALOGE("Failed to check for NVRAM calibration file '%s' - error: %s", + nvram_file, + strerror(errno)); + return -1; + } + + ALOGD("Using NVRAM calibration file: %s\n", nvram_file); + + fd = TEMP_FAILURE_RETRY(open(WIFI_DRIVER_NVRAM_PATH_PARAM, O_WRONLY)); + if (fd < 0) { + ALOGE("Failed to open wifi nvram config path %s - error: %s", + WIFI_DRIVER_NVRAM_PATH_PARAM, strerror(errno)); + return -1; + } + + len = strlen(nvram_file) + 1; + if (TEMP_FAILURE_RETRY(write(fd, nvram_file, len)) != len) { + ALOGE("Failed to write to wifi config path %s - error: %s", + WIFI_DRIVER_NVRAM_PATH_PARAM, strerror(errno)); + ret = -1; + goto out; + } + + snprintf(nvram_str, sizeof(nvram_str), "%s_%s", + nvram_file, type); + + ALOGD("Changing NVRAM calibration file for %s chipset\n", type); + + ret = stat(nvram_str, &sb); + if (ret != 0) { + ALOGW("NVRAM calibration file '%s' doesn't exist", nvram_str); + /* + * We were able to write the default calibration file. So + * continue here without returning an error. + */ + ret = 0; + goto out; + } + + len = strlen(nvram_str) + 1; + if (TEMP_FAILURE_RETRY(write(fd, nvram_str, len)) != len) { + ALOGW("Failed to write to wifi config path %s - error: %s", + WIFI_DRIVER_NVRAM_PATH_PARAM, strerror(errno)); + /* + * We were able to write the default calibration file. So + * continue here without returning an error. + */ + ret = 0; + goto out; + } + + ALOGD("NVRAM calibration file set to '%s'\n", nvram_str); + + ret = 0; +out: + if (fd != -1) { + close(fd); + } + return ret; +} + int main() { FILE* file; FILE* cidfile; @@ -108,6 +194,7 @@ int main() { } if (type != NONE) { + const char *nvram_file; const char *type_str; struct passwd *pwd; int fd; @@ -176,6 +263,14 @@ int main() { CID_PATH, strerror(errno)); return 1; } + + nvram_file = WIFI_DRIVER_NVRAM_PATH; + if (nvram_file != NULL) { + ret = wifi_change_nvram_calibration(nvram_file, type_str); + if (ret != 0) { + return 1; + } + } } else { /* delete cid file if no specific type */ ALOGD("Deleting file %s\n", CID_PATH); -- cgit v1.2.3