diff options
| author | Santhosh Gillella <gvx468@motorola.com> | 2016-03-08 11:51:30 -0600 |
|---|---|---|
| committer | kubersharma001 <kubersharma001@gmail.com> | 2019-10-31 19:53:45 +0100 |
| commit | 9cc767f38f3005627192d865a883e877680d011e (patch) | |
| tree | d0b256d4c1587fbd3ad345602e0980b9d917b5f7 | |
| parent | 3abe02a12213c8271275d073760ef66678b6d843 (diff) | |
Read WLAN MAC addresses from UTAG
Merged Original CR's to have single commit:
(CR) Read WiFi MACs from bootargs
(CR) Handle inter MAC separator in utags
Factory sets 2 WiFi MACs as boot params. This code change
reads WiFi MACs from bootparams device tree node and
generates two other MACs by setting locally administrated
bit. Order of MAC addresses is MAC1, MAC2, GENERATED1, and
GENERATED2. From here on we don't read MAC addresses from
NV bin file.
Also handle cases none, comma and hypen as separator
Change-Id: Ied2bddaaef14b0849e3f8adc57ef9e14754166f5
Reviewed-on: http://gerrit.mot.com/833472
SLTApproved: Slta Waiver <sltawvr@motorola.com>
SME-Granted: SME Approvals Granted
Tested-by: Jira Key <jirakey@motorola.com>
Reviewed-by: Ishwara J A <ishwara@motorola.com>
Reviewed-by: Binesh Balasingh <binesh@motorola.com>
Submit-Approved: Jira Key <jirakey@motorola.com>
Signed-off-by: UtsavisGreat <utsavbalar1231@gmail.com>
| -rwxr-xr-x[-rw-r--r--] | drivers/staging/prima/CORE/VOSS/src/vos_nvitem.c | 172 | ||||
| -rw-r--r-- | drivers/staging/prima/Kbuild | 3 | ||||
| -rw-r--r-- | drivers/staging/prima/Makefile | 1 |
3 files changed, 175 insertions, 1 deletions
diff --git a/drivers/staging/prima/CORE/VOSS/src/vos_nvitem.c b/drivers/staging/prima/CORE/VOSS/src/vos_nvitem.c index d083f6acdb07..3713d9eced69 100644..100755 --- a/drivers/staging/prima/CORE/VOSS/src/vos_nvitem.c +++ b/drivers/staging/prima/CORE/VOSS/src/vos_nvitem.c @@ -55,6 +55,9 @@ #include <net/cfg80211.h> #include <linux/firmware.h> #include <linux/vmalloc.h> +//Moto, read MACs from boot params +#include <linux/of.h> +#include <linux/of_address.h> #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,9,0)) #define IEEE80211_CHAN_NO_80MHZ 1<<7 @@ -95,6 +98,10 @@ static v_BOOL_t crda_regulatory_run_time_entry_valid = VOS_FALSE; #define MIN(a, b) (a > b ? b : a) #define MAX(a, b) (a > b ? a : b) +#ifdef MOTO_UTAGS_MAC +#define WIFI_MAC_BOOTARG "androidboot.wifimacaddr=" +#define MACSTRLEN 17 +#endif /*---------------------------------------------------------------------------- * Type Declarations * -------------------------------------------------------------------------*/ @@ -595,6 +602,9 @@ static CountryInfoTable_t countryInfoTable = #endif +#ifdef MOTO_UTAGS_MAC +static v_BOOL_t macsRead = VOS_FALSE; +#endif typedef struct nvEFSTable_s { v_U32_t nvValidityBitmap; @@ -1427,6 +1437,10 @@ VOS_STATUS vos_nv_open(void) goto error; } } +#ifdef MOTO_UTAGS_MAC + // Read Multi MACs and fill it in global NV strucutre. + vos_nv_readMultiMacAddress(NULL,VOS_MAX_CONCURRENCY_PERSONA); +#endif if (vos_nv_getValidity(VNV_RATE_TO_POWER_TABLE, &itemIsValid) == VOS_STATUS_SUCCESS) @@ -1632,6 +1646,9 @@ VOS_STATUS vos_nv_close(void) linux_reg_cc[1] = '0'; gnvEFSTable=NULL; +#ifdef MOTO_UTAGS_MAC + macsRead = VOS_FALSE; +#endif return VOS_STATUS_SUCCESS; } @@ -1738,6 +1755,19 @@ VOS_STATUS vos_nv_readMacAddress( v_MAC_ADDRESS_t pMacAddress ) return status; } +#ifdef MOTO_UTAGS_MAC +static inline void strtomac(char * buf, unsigned char macaddr[6]) { + if (strchr(buf, ':')) + sscanf(buf, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", + &macaddr[0],&macaddr[1], &macaddr[2], &macaddr[3], &macaddr[4], &macaddr[5]); + else if (strchr(buf, '-')) + sscanf(buf, "%hhx-%hhx-%hhx-%hhx-%hhx-%hhx", + &macaddr[0],&macaddr[1], &macaddr[2], &macaddr[3], &macaddr[4], &macaddr[5]); + else + VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, + "%s,Can not parse mac address: %s", __func__,buf); +} +#endif /**------------------------------------------------------------------------ \brief vos_nv_readMultiMacAddress() - return the Multiple MAC addresses @@ -1753,10 +1783,21 @@ VOS_STATUS vos_nv_readMacAddress( v_MAC_ADDRESS_t pMacAddress ) VOS_STATUS vos_nv_readMultiMacAddress( v_U8_t *pMacAddress, v_U8_t macCount ) { +#ifndef MOTO_UTAGS_MAC sNvFields fieldImage; VOS_STATUS status; v_U8_t countLoop; v_U8_t *pNVMacAddress; +#else + //Moto, read MACs from bootparams + VOS_STATUS status = VOS_STATUS_E_FAILURE; + struct device_node *chosen_node = NULL; + unsigned char mac1 [VOS_MAC_ADDRESS_LEN] = {0}; + unsigned char mac2 [VOS_MAC_ADDRESS_LEN] = {0}; + unsigned char mac3 [VOS_MAC_ADDRESS_LEN] = {0}; + unsigned char mac4 [VOS_MAC_ADDRESS_LEN] = {0}; + v_CONTEXT_t pVosContext= NULL; +#endif if((0 == macCount) || (VOS_MAX_CONCURRENCY_PERSONA < macCount) || (NULL == pMacAddress)) @@ -1768,10 +1809,111 @@ VOS_STATUS vos_nv_readMultiMacAddress( v_U8_t *pMacAddress, return VOS_STATUS_E_INVAL; } +#ifdef MOTO_UTAGS_MAC + /*Get the global context */ + pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL); + if (NULL == pVosContext){ + VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, + "%s: Not able to get VosContex",__func__); + return VOS_STATUS_E_FAILURE; + } + + if ((macsRead == VOS_TRUE) && (pMacAddress != NULL)) { + int macLoop =0; + /* We have already read MAC addresses when this function was called from vos_nv_open. + Avoid reparsing and fill from the global NV structure*/ + if (((VosContextType*)(pVosContext))->nvVersion == E_NV_V2) { + vos_mem_copy(pMacAddress,gnvEFSTableV2->halnvV2.fields.macAddr, VOS_MAC_ADDRESS_LEN); + vos_mem_copy(pMacAddress+1*VOS_MAC_ADDRESS_LEN, gnvEFSTableV2->halnvV2.fields.macAddr2, VOS_MAC_ADDRESS_LEN); + vos_mem_copy(pMacAddress+2*VOS_MAC_ADDRESS_LEN, gnvEFSTableV2->halnvV2.fields.macAddr3, VOS_MAC_ADDRESS_LEN); + vos_mem_copy(pMacAddress+3*VOS_MAC_ADDRESS_LEN, gnvEFSTableV2->halnvV2.fields.macAddr4, VOS_MAC_ADDRESS_LEN); + } else if(((VosContextType*)(pVosContext))->nvVersion == E_NV_V3) { + vos_mem_copy(pMacAddress, gnvEFSTable->halnv.fields.macAddr, VOS_MAC_ADDRESS_LEN); + vos_mem_copy(pMacAddress+1*VOS_MAC_ADDRESS_LEN, gnvEFSTable->halnv.fields.macAddr2, VOS_MAC_ADDRESS_LEN); + vos_mem_copy(pMacAddress+2*VOS_MAC_ADDRESS_LEN, gnvEFSTable->halnv.fields.macAddr3, VOS_MAC_ADDRESS_LEN); + vos_mem_copy(pMacAddress+3*VOS_MAC_ADDRESS_LEN, gnvEFSTable->halnv.fields.macAddr4, VOS_MAC_ADDRESS_LEN); + } else { + VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, + "%s: NV version is invalid",__func__); + return VOS_STATUS_E_FAILURE; + } + for (macLoop = 0; macLoop < VOS_MAX_CONCURRENCY_PERSONA; macLoop++) { + VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, + "%s: pMacAddress[%d]="MAC_ADDRESS_STR ,__func__, macLoop, MAC_ADDR_ARRAY(pMacAddress + macLoop*VOS_MAC_ADDRESS_LEN)); + } + return VOS_STATUS_SUCCESS; + } +#else + status = vos_nv_read( VNV_FIELD_IMAGE, &fieldImage, NULL, sizeof(fieldImage) ); +#endif + +#ifdef MOTO_UTAGS_MAC + //Moto, read MACs from bootparams + chosen_node = of_find_node_by_name(NULL, "chosen"); + if (!chosen_node) { + VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, + "%s: get chosen node read failed\n", __func__); + } else { + int len=0; + const char *cmd_line = NULL; + cmd_line = of_get_property(chosen_node, "bootargs", &len); + if (!cmd_line || len <= 0) { + VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, + "%s: get wlan MACs bootargs failed\n", __func__); + } else { + char * mac_idx = NULL; + mac_idx = strstr(cmd_line, WIFI_MAC_BOOTARG); + if (mac_idx == NULL) { + VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, + "%s: " WIFI_MAC_BOOTARG " not present in bootargs", __func__); + } else { + char macStr1[MACSTRLEN+1] ={0}; + char macStr2[MACSTRLEN+1] ={0}; + status = VOS_STATUS_SUCCESS; + + // extract 2 MACs from boot params + mac_idx += strlen(WIFI_MAC_BOOTARG); + memcpy(macStr1,mac_idx,MACSTRLEN); + mac_idx += MACSTRLEN; + //IKVPREL1L-627:Handle inter MAC separator if any + if ( *mac_idx == ',' || *mac_idx == '-') + mac_idx ++; + else + VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR," No inter MAC separator used"); + + memcpy(macStr2,mac_idx,MACSTRLEN); + VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, + "%s: MAC1 from bootparams=%s\n", __func__,macStr1); + VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, + "%s: MAC2 from boot params=%s\n", __func__,macStr2); + strtomac(macStr1,mac1); + strtomac(macStr2,mac2); + + // generate other 2 MACs + memcpy(mac3,mac1,VOS_MAC_ADDRESS_LEN); + memcpy(mac4,mac2,VOS_MAC_ADDRESS_LEN); + // Set local administered bit to derive other two MACs + mac3[0] |= 1 << 1; + mac4[0] |= 1 << 1; + + VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_DEBUG, + "%s: Mac1 Addr: " MAC_ADDRESS_STR, __func__, MAC_ADDR_ARRAY(mac1)); + VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_DEBUG, + "%s: Mac2 Addr: " MAC_ADDRESS_STR, __func__, MAC_ADDR_ARRAY(mac2)); + VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_DEBUG, + "%s: Mac3 Addr: " MAC_ADDRESS_STR, __func__, MAC_ADDR_ARRAY(mac3)); + VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_DEBUG, + "%s: Mac4 Addr: " MAC_ADDRESS_STR, __func__, MAC_ADDR_ARRAY(mac4)); + } + } + } +#endif + if (VOS_STATUS_SUCCESS == status) { +#ifndef MOTO_UTAGS_MAC pNVMacAddress = fieldImage.macAddr; for(countLoop = 0; countLoop < macCount; countLoop++) { @@ -1785,7 +1927,37 @@ VOS_STATUS vos_nv_readMultiMacAddress( v_U8_t *pMacAddress, VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "vos_nv_readMultiMacAddress Get NV Field Fail"); } +#else + //Set Macs to global NV structure + if (((VosContextType*)(pVosContext))->nvVersion == E_NV_V2) { + vos_mem_copy(gnvEFSTableV2->halnvV2.fields.macAddr, mac1, VOS_MAC_ADDRESS_LEN); + vos_mem_copy(gnvEFSTableV2->halnvV2.fields.macAddr2, mac2, VOS_MAC_ADDRESS_LEN); + vos_mem_copy(gnvEFSTableV2->halnvV2.fields.macAddr3, mac3, VOS_MAC_ADDRESS_LEN); + vos_mem_copy(gnvEFSTableV2->halnvV2.fields.macAddr4, mac4, VOS_MAC_ADDRESS_LEN); + VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "%s MAC address in global V2" + MAC_ADDRESS_STR MAC_ADDRESS_STR MAC_ADDRESS_STR MAC_ADDRESS_STR ,__func__, + MAC_ADDR_ARRAY(gnvEFSTableV2->halnvV2.fields.macAddr), MAC_ADDR_ARRAY(gnvEFSTableV2->halnvV2.fields.macAddr2), + MAC_ADDR_ARRAY(gnvEFSTableV2->halnvV2.fields.macAddr3), MAC_ADDR_ARRAY(gnvEFSTableV2->halnvV2.fields.macAddr4)); + } else if(((VosContextType*)(pVosContext))->nvVersion == E_NV_V3) { + vos_mem_copy(gnvEFSTable->halnv.fields.macAddr, mac1, VOS_MAC_ADDRESS_LEN); + vos_mem_copy(gnvEFSTable->halnv.fields.macAddr2, mac2, VOS_MAC_ADDRESS_LEN); + vos_mem_copy(gnvEFSTable->halnv.fields.macAddr3, mac3, VOS_MAC_ADDRESS_LEN); + vos_mem_copy(gnvEFSTable->halnv.fields.macAddr4, mac4, VOS_MAC_ADDRESS_LEN); + VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "%s MAC address in global V3" + MAC_ADDRESS_STR MAC_ADDRESS_STR MAC_ADDRESS_STR MAC_ADDRESS_STR ,__func__, + MAC_ADDR_ARRAY(gnvEFSTable->halnv.fields.macAddr), MAC_ADDR_ARRAY(gnvEFSTable->halnv.fields.macAddr2), + MAC_ADDR_ARRAY(gnvEFSTable->halnv.fields.macAddr3), MAC_ADDR_ARRAY(gnvEFSTable->halnv.fields.macAddr4)); + } else { + VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, + "%s: invalid NV version",__func__); + goto skip; + } + macsRead = VOS_TRUE; + } +skip: + of_node_put(chosen_node); +#endif return status; } diff --git a/drivers/staging/prima/Kbuild b/drivers/staging/prima/Kbuild index d822f0fd49f5..5732da8eac6f 100644 --- a/drivers/staging/prima/Kbuild +++ b/drivers/staging/prima/Kbuild @@ -698,6 +698,9 @@ endif # enable the MAC Address auto-generation feature CDEFINES += -DWLAN_AUTOGEN_MACADDR_FEATURE +# Moto read MACs from boot params instead of NV file +CDEFINES += -DMOTO_UTAGS_MAC + ifeq ($(CONFIG_WLAN_FEATURE_11W),y) CDEFINES += -DWLAN_FEATURE_11W endif diff --git a/drivers/staging/prima/Makefile b/drivers/staging/prima/Makefile index d5c94f00a43c..05d2cf0bc64a 100644 --- a/drivers/staging/prima/Makefile +++ b/drivers/staging/prima/Makefile @@ -14,4 +14,3 @@ clean:: rm -f *.o *.ko *.mod.c *.mod.o *~ .*.cmd Module.symvers rm -rf .tmp_versions - |
