summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuanyuan Liu <yuanliu@qca.qualcomm.com>2014-01-28 13:55:55 -0800
committerAkash Patel <c_akashp@qca.qualcomm.com>2014-02-07 17:38:23 -0800
commiteeefa49ffef6ce19df389631a753469e09b514c5 (patch)
tree953f2e89d043f7fdf6c4adece18d04acf40802c3
parentded58968277eea8bcdcf2eafb11198c6b7deb538 (diff)
qcacld: Add function of updating macaddress from wlan_mac.bin
In FTM mode, user defined macaddresses might be provided. The new macaddress will be written into /persist/wlan_mac.bin. Add function of updating macaddress from wlan_mac.bin. Overwrite default ini macaddress if wlan_mac.bin exist. Change-Id: I78ab0104fc5cae456c8fd8dc3df2029cdecf7214 CRs-Fixed: 605901
-rw-r--r--Android.mk1
-rw-r--r--CORE/HDD/inc/wlan_hdd_cfg.h1
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg.c110
-rw-r--r--CORE/HDD/src/wlan_hdd_main.c11
-rw-r--r--CORE/VOSS/inc/wlan_hdd_misc.h3
5 files changed, 123 insertions, 3 deletions
diff --git a/Android.mk b/Android.mk
index d3dfafce1fe0..f86c223bcb1e 100644
--- a/Android.mk
+++ b/Android.mk
@@ -72,6 +72,7 @@ include $(DLKM_DIR)/AndroidKernelModule.mk
$(shell mkdir -p $(TARGET_OUT)/lib/modules; \
ln -sf /system/lib/modules/$(WLAN_CHIPSET)/$(WLAN_CHIPSET)_wlan.ko \
$(TARGET_OUT)/lib/modules/wlan.ko)
+$(shell ln -sf /persist/wlan_mac.bin $(TARGET_OUT_ETC)/firmware/wlan/qca_cld/wlan_mac.bin)
endif # DLKM check
diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h
index a3ffb79c0d78..b030c4bc3eb8 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg.h
@@ -2675,6 +2675,7 @@ typedef struct
Function declarations and documenation
-------------------------------------------------------------------------*/
VOS_STATUS hdd_parse_config_ini(hdd_context_t *pHddCtx);
+VOS_STATUS hdd_update_mac_config(hdd_context_t *pHddCtx);
VOS_STATUS hdd_set_sme_config( hdd_context_t *pHddCtx );
VOS_STATUS hdd_set_sme_chan_list(hdd_context_t *hdd_ctx);
v_BOOL_t hdd_update_config_dat ( hdd_context_t *pHddCtx );
diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c
index 229efded8ef8..4d71b707cb41 100644
--- a/CORE/HDD/src/wlan_hdd_cfg.c
+++ b/CORE/HDD/src/wlan_hdd_cfg.c
@@ -3633,6 +3633,116 @@ static int parseHexDigit(char c)
return 0;
}
+/* convert string to 6 bytes mac address
+ * 00AA00BB00CC -> 0x00 0xAA 0x00 0xBB 0x00 0xCC
+ */
+static void update_mac_from_string(hdd_context_t *pHddCtx, tCfgIniEntry *macTable, int num)
+{
+ int i = 0, j = 0, res = 0;
+ char *candidate = NULL;
+ v_MACADDR_t macaddr[VOS_MAX_CONCURRENCY_PERSONA];
+
+ memset(macaddr, 0, sizeof(macaddr));
+
+ for (i = 0; i < num; i++)
+ {
+ candidate = macTable[i].value;
+ for (j = 0; j < VOS_MAC_ADDR_SIZE; j++) {
+ res = hex2bin(&macaddr[i].bytes[j], &candidate[(j<<1)], 1);
+ if (res < 0)
+ break;
+ }
+ if (res == 0 && !vos_is_macaddr_zero(&macaddr[i])) {
+ vos_mem_copy((v_U8_t *)&pHddCtx->cfg_ini->intfMacAddr[i].bytes[0],
+ (v_U8_t *)&macaddr[i].bytes[0], VOS_MAC_ADDR_SIZE);
+ }
+ }
+}
+
+/*
+ * This function tries to update macaddress from cfg file.
+ * It overwrites the MAC address if config file exist.
+ */
+VOS_STATUS hdd_update_mac_config(hdd_context_t *pHddCtx)
+{
+ int status, i = 0;
+ const struct firmware *fw = NULL;
+ char *line, *buffer = NULL;
+ char *name, *value;
+ tCfgIniEntry macTable[VOS_MAX_CONCURRENCY_PERSONA];
+
+ VOS_STATUS vos_status = VOS_STATUS_SUCCESS;
+
+ memset(macTable, 0, sizeof(macTable));
+ status = request_firmware(&fw, WLAN_MAC_FILE, pHddCtx->parent_dev);
+
+ if (status)
+ {
+ hddLog(VOS_TRACE_LEVEL_FATAL, "%s: request_firmware failed %d\n",
+ __func__, status);
+ vos_status = VOS_STATUS_E_FAILURE;
+ goto config_exit;
+ }
+ if (!fw || !fw->data || !fw->size)
+ {
+ hddLog(VOS_TRACE_LEVEL_FATAL, "%s: invalid firmware\n", __func__);
+ vos_status = VOS_STATUS_E_INVAL;
+ goto config_exit;
+ }
+
+ buffer = (char *)fw->data;
+
+ /* data format:
+ * Intf0MacAddress=00AA00BB00CC
+ * Intf1MacAddress=00AA00BB00CD
+ * END
+ */
+ while (buffer != NULL)
+ {
+ line = get_next_line(buffer);
+ buffer = i_trim(buffer);
+
+ if (strlen((char *)buffer) == 0 || *buffer == '#') {
+ buffer = line;
+ continue;
+ }
+ if (strncmp(buffer, "END", 3) == 0)
+ break;
+
+ name = buffer;
+ buffer = strchr(buffer, '=');
+ if (buffer) {
+ *buffer++ = '\0';
+ i_trim(name);
+ if (strlen(name) != 0) {
+ buffer = i_trim(buffer);
+ if (strlen(buffer) == 12) {
+ value = buffer;
+ macTable[i].name = name;
+ macTable[i++].value = value;
+ if (i >= VOS_MAX_CONCURRENCY_PERSONA)
+ break;
+ }
+ }
+ }
+ buffer = line;
+ }
+ if (i <= VOS_MAX_CONCURRENCY_PERSONA) {
+ hddLog(VOS_TRACE_LEVEL_INFO, "%s: %d Mac addresses provided\n", __func__, i);
+ }
+ else {
+ hddLog(VOS_TRACE_LEVEL_ERROR, "%s: invalid number of Mac address provided, nMac = %d\n",
+ __func__, i);
+ vos_status = VOS_STATUS_E_INVAL;
+ goto config_exit;
+ }
+
+ update_mac_from_string(pHddCtx, &macTable[0], i);
+
+config_exit:
+ release_firmware(fw);
+ return vos_status;
+}
static VOS_STATUS hdd_apply_cfg_ini( hdd_context_t *pHddCtx, tCfgIniEntry* iniTable, unsigned long entries)
{
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index b050ec8bc3b2..7beee7f9d478 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -9108,8 +9108,15 @@ int hdd_wlan_startup(struct device *dev, v_VOID_t *hif_sc)
goto err_config;
}
- pHddCtx->current_intf_count=0;
- pHddCtx->max_intf_count = WLAN_MAX_INTERFACES;
+ if ( VOS_STATUS_SUCCESS != hdd_update_mac_config( pHddCtx ) )
+ {
+ hddLog(VOS_TRACE_LEVEL_WARN,
+ "%s: can't update mac config, using MAC from ini file",
+ __func__);
+ }
+
+ pHddCtx->current_intf_count=0;
+ pHddCtx->max_intf_count = WLAN_MAX_INTERFACES;
#ifndef QCA_WIFI_2_0
pHddCtx->cfg_ini->maxWoWFilters = WOWL_MAX_PTRNS_ALLOWED;
diff --git a/CORE/VOSS/inc/wlan_hdd_misc.h b/CORE/VOSS/inc/wlan_hdd_misc.h
index ec623a153be9..232161f64c5b 100644
--- a/CORE/VOSS/inc/wlan_hdd_misc.h
+++ b/CORE/VOSS/inc/wlan_hdd_misc.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2013 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2014 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -38,6 +38,7 @@
#define WLAN_DICT_FILE "wlan/qca_cld/WCNSS_qcom_wlan_dictionary.dat"
#define WLAN_COUNTRY_INFO_FILE "wlan/qca_cld/WCNSS_wlan_country_info.dat"
#define WLAN_HO_CFG_FILE "wlan/qca_cld/WCNSS_wlan_ho_config"
+#define WLAN_MAC_FILE "wlan/qca_cld/wlan_mac.bin"
#else
#define WLAN_INI_FILE "wlan/prima/WCNSS_qcom_cfg.ini"
#define WLAN_CFG_FILE "wlan/prima/WCNSS_cfg.dat"