Home | History | Annotate | Download | only in conn_init
      1 /*
      2  * Copyright 2012 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifdef CONFIG_LGE_WLAN_QCOM_PATCH
     18 
     19 #include <stdio.h>
     20 #include <stdlib.h>
     21 #include <string.h>
     22 
     23 #include "wfc_util_log.h"
     24 #include "wfc_util_fctrl.h"
     25 #include "wfc_util_common.h"
     26 
     27 #include "cutils/properties.h"
     28 
     29 #include "private/android_filesystem_config.h"
     30 
     31 #define WFC_UTIL_FEAUTRE_COPY_NV_BIN
     32 
     33 #ifdef WLAN_CHIP_VERSION_WCNSS
     34 #ifndef WFC_UTIL_CFG_FILE_NAME
     35 #define WFC_UTIL_CFG_FILE_NAME          "/data/misc/wifi/WCNSS_qcom_cfg.ini"
     36 #endif
     37 #ifndef WFC_UTIL_CFG_TEMPFILE_NAME
     38 #define WFC_UTIL_CFG_TEMPFILE_NAME      "/system/etc/wifi/WCNSS_qcom_cfg.ini"
     39 #endif
     40 #else  /* WLAN_CHIP_VERSION_WCN1314 */
     41 #ifndef WFC_UTIL_CFG_FILE_NAME
     42 #define WFC_UTIL_CFG_FILE_NAME          "/data/misc/wifi/WCN1314_qcom_cfg.ini"
     43 #endif
     44 #ifndef WFC_UTIL_CFG_TEMPFILE_NAME
     45 #define WFC_UTIL_CFG_TEMPFILE_NAME      "/system/etc/wifi/WCN1314_qcom_cfg.ini"
     46 #endif
     47 #endif /* WLAN_CHIP_VERSION_XXXX */
     48 
     49 #ifdef WFC_UTIL_FEAUTRE_COPY_NV_BIN
     50 #ifdef WLAN_CHIP_VERSION_WCNSS
     51 #ifndef WFC_UTIL_NV_BIN_TEMPFILE_NAME
     52 #define WFC_UTIL_NV_BIN_TEMPFILE_NAME   "/system/etc/wifi/WCNSS_qcom_wlan_nv.bin"
     53 #endif
     54 #ifndef WFC_UTIL_NV_BIN_FILE_NAME
     55 #define WFC_UTIL_NV_BIN_FILE_NAME       "/data/misc/wifi/WCNSS_qcom_wlan_nv.bin"
     56 #endif
     57 #else  /* WLAN_CHIP_VERSION_WCN1314 */
     58 #ifndef WFC_UTIL_NV_BIN_TEMPFILE_NAME
     59 #define WFC_UTIL_NV_BIN_TEMPFILE_NAME   "/persist/WCN1314_qcom_wlan_nv.bin"
     60 #endif
     61 #ifndef WFC_UTIL_NV_BIN_FILE_NAME
     62 #define WFC_UTIL_NV_BIN_FILE_NAME       "/data/misc/wifi/WCN1314_qcom_wlan_nv.bin"
     63 #endif
     64 #endif /* WLAN_CHIP_VERSION_XXXX */
     65 #else  /* WFC_UTIL_FEAUTRE_COPY_NV_BIN */
     66 #ifndef WFC_UTIL_NV_BIN_FILE_NAME
     67 #ifdef WLAN_CHIP_VERSION_WCNSS
     68 #define WFC_UTIL_NV_BIN_FILE_NAME       "/persist/WCNSS_qcom_wlan_nv.bin"
     69 #else  /* WLAN_CHIP_VERSION_WCN1314 */
     70 #define WFC_UTIL_NV_BIN_FILE_NAME       "/persist/WCN1314_qcom_wlan_nv.bin"
     71 #endif /* WLAN_CHIP_VERSION_XXXX */
     72 #endif
     73 #endif /* WFC_UTIL_FEAUTRE_COPY_NV_BIN */
     74 
     75 #define WFC_UTIL_CFG_TAG_END_OF_CFG     "END"
     76 /*
     77  * Station Mode MAC Address
     78  */
     79 #ifdef WLAN_CHIP_VERSION_WCNSS
     80 #define WFC_UTIL_CFG_TAG_MAC_ADDRESS    "Intf0MacAddress="
     81 #else  /* WLAN_CHIP_VERSION_WCN1314 */
     82 #define WFC_UTIL_CFG_TAG_MAC_ADDRESS    "NetworkAddress="
     83 #endif /* WLAN_CHIP_VERSION_XXXX */
     84 /*
     85  * AP Mode MAC Address
     86  */
     87 #define WFC_UTIL_CFG_TAG_AP_MAC_ADDRESS "gAPMacAddr="
     88 
     89 /*
     90  * Idle Mode Power Save enable/disable for OTA test
     91  */
     92 #define WFC_UTIL_CFG_TAG_IDLE_MODE_POWER_SAVE "gEnableImps="
     93 
     94 /*
     95  * Beacon Mode Power Save enable/disable for OTA test
     96  */
     97 #define WFC_UTIL_CFG_TAG_POWER_SAVE "gEnableBmps="
     98 
     99 /*
    100  * L2 roaming on/off for OTA test
    101  */
    102 #define WFC_UTIL_CFG_TAG_L2Roaming "gEnableHandoff="
    103 
    104 /*
    105  * Heartbeat24 changing for OtA test
    106  */
    107 #define WFC_UTIL_CFG_TAG_HEARTBEAT24 "gHeartbeat24="
    108 
    109 /*
    110  * TAG for end of line
    111  */
    112 #define WFC_UTIL_CFG_TAG_END_OF_LINE    "\n"
    113 
    114 #define WFC_UTIL_CFG_LENGHT_MAC         (6)
    115 #define WFC_UTIL_CFG_LENGHT_MAC_STRING  (WFC_UTIL_CFG_LENGHT_MAC*2)
    116 
    117 /*
    118  * persist/WCNSS_qcom_wlan_nv.bin
    119  *
    120  * NV validity bitmap (4 bytes)
    121  * {
    122  *     Bit 0 - Regulatory domain tables
    123  *     Bit 1 - Fields(including product ID, product bands, number of Tx/Rx chains, MAC address, manufacturing board number)
    124  *     Bit 2 - Optimal power per rate table
    125  *     Bit 3 - Default regulatory domain and country code
    126  *     Bit 4:31 - Reserved; always 0
    127  * }
    128  *
    129  * typedef PACKED_PRE struct PACKED_POST
    130  * {
    131  *     //always ensure fields are aligned to 32-bit boundaries
    132  *     tANI_U16  productId;
    133  *     tANI_U8   productBands;        //0: 0.4 GHz, 1: 2.4+5.0 GHz, 2: 5.0 GHz
    134  *     tANI_U8   wlanNvRevId;         //0: WCN1312, 1: WCN1314, 2: PRIMA
    135  *
    136  *     tANI_U8   numOfTxChains;
    137  *     tANI_U8   numOfRxChains;
    138  *     tANI_U8   macAddr[NV_FIELD_MAC_ADDR_SIZE];
    139  *     tANI_U8   mfgSN[NV_FIELD_MFG_SN_SIZE];
    140  * } sNvFields;
    141  */
    142 #define WFC_UTIL_NV_BIN_HEADER_LENGTH   (4)
    143 #define WFC_UTIL_NV_BIN_POS_PRODUCT_ID  (WFC_UTIL_NV_BIN_HEADER_LENGTH + 0)
    144 #define WFC_UTIL_NV_BIN_POS_MAC_ADDR    (WFC_UTIL_NV_BIN_HEADER_LENGTH + 6)
    145 
    146 #ifdef WLAN_CHIP_VERSION_WCNSS
    147 /* refer to prima/CORE/WDA/src/wlan_nv.c */
    148 static unsigned char nvFilelds_default[6] = {0, 0, /* productId */
    149                                              1,    /* productBands */
    150                                              2,    /* wlanNvRevId */
    151                                              1,    /* numOfTxChains */
    152                                              2};   /* numOfRxChains */
    153 #else  /* WLAN_CHIP_VERSION_WCN1314 */
    154 static unsigned char nvFilelds_default[6] = {1, 0, /* productId */
    155                                              1,    /* productBands */
    156                                              1,    /* wlanNvRevId */
    157                                              1,    /* numOfTxChains */
    158                                              1};   /* numOfRxChains */
    159 #endif /* WLAN_CHIP_VERSION_XXXX */
    160 
    161 /*
    162  * wfc_util_qcom_is_default_mac
    163  *
    164  *
    165  *
    166  * return : it will return 1 if mac_add is default mac address,
    167  *          2 if mac_add is RFT mac address
    168  *          or 0 if not.
    169  */
    170 static int wfc_util_qcom_is_default_mac(char *mac_add)
    171 {
    172 #define WFC_UTIL_CFG_DEFAULT_MAC_RFT     "00900CBACD88"
    173 #define WFC_UTIL_CFG_DEFAULT_MAC_00      "000000000000"
    174 #define WFC_UTIL_CFG_DEFAULT_MAC_FF      "FFFFFFFFFFFF"
    175 #define WFC_UTIL_CFG_DEFAULT_MAC_QCOM_I0 "000AF58989FF"
    176 #define WFC_UTIL_CFG_DEFAULT_MAC_QCOM_I1 "000AF58989FE"
    177 #define WFC_UTIL_CFG_DEFAULT_MAC_QCOM_I2 "000AF58989FD"
    178 #define WFC_UTIL_CFG_DEFAULT_MAC_QCOM_I3 "000AF58989FC"
    179 #define WFC_UTIL_CFG_DEFAULT_MAC_QCOM_AP "000AF58989EF"
    180 
    181 	int i, sZarray=0;
    182 	/*
    183 	 * default mac address array
    184 	 */
    185 	char mac_add_buff[][WFC_UTIL_CFG_LENGHT_MAC_STRING+1] = {
    186 			{WFC_UTIL_CFG_DEFAULT_MAC_00},
    187 			{WFC_UTIL_CFG_DEFAULT_MAC_FF},
    188 			{WFC_UTIL_CFG_DEFAULT_MAC_QCOM_I0}
    189 	};
    190 
    191 	sZarray = sizeof(mac_add_buff) / sizeof(mac_add_buff[0]);
    192 
    193 	for(i=0; i<sZarray ;i++) {
    194 		if(0 == strncmp(mac_add, mac_add_buff[i], WFC_UTIL_CFG_LENGHT_MAC_STRING)) {
    195 			wfc_util_log_error("This is default MAC address [%s]", mac_add_buff[i]);
    196 			return 1;
    197 		}
    198 	}
    199 
    200 	/*
    201 	if(1 == wfc_util_is_random_mac(mac_add)) {
    202 		wfc_util_log_error("This is Random MAC address");
    203 		return 1;
    204 	}
    205 	*/
    206 
    207 	if(0 == strncmp(mac_add, WFC_UTIL_CFG_DEFAULT_MAC_RFT, WFC_UTIL_CFG_LENGHT_MAC_STRING)) {
    208 		wfc_util_log_error("This is RFT MAC address [%s]", WFC_UTIL_CFG_DEFAULT_MAC_RFT);
    209 		return 2;
    210 	}
    211 
    212 	return 0;
    213 }
    214 
    215 static void wfc_util_qcom_write_mac(char *mac_add)
    216 {
    217 	/*
    218 	 * Station Mode MAC Address
    219 	 */
    220 	wfc_util_fset_string(WFC_UTIL_CFG_FILE_NAME,
    221 	                     WFC_UTIL_CFG_TAG_END_OF_CFG,
    222 	                     WFC_UTIL_CFG_TAG_MAC_ADDRESS,
    223 	                     WFC_UTIL_CFG_TAG_END_OF_LINE,
    224 	                     mac_add);
    225 
    226 	/*
    227 	 * AP Mode MAC Address
    228 	 */
    229 	wfc_util_fset_string(WFC_UTIL_CFG_FILE_NAME,
    230 	                     WFC_UTIL_CFG_TAG_END_OF_CFG,
    231 	                     WFC_UTIL_CFG_TAG_AP_MAC_ADDRESS,
    232 	                     WFC_UTIL_CFG_TAG_END_OF_LINE,
    233 	                     mac_add);
    234 
    235 	return;
    236 }
    237 
    238 /*
    239  *  When OTA is enabled, power save mode and L2 roaming trigger should be off
    240  */
    241 static void wfc_util_qcom_write_ota_enable(void)
    242 {
    243 /*
    244  * write Beacon Mode Power Save off and L2 Roaming off
    245  */
    246 	char *PowerSaveOff = "0";
    247 	//char *L2RoamingOff = "0";
    248 	char *Heartbeat24 = "120";
    249 
    250 	char string_buff[5];
    251 
    252 	wfc_util_fset_string(WFC_UTIL_CFG_FILE_NAME,
    253 	                     WFC_UTIL_CFG_TAG_END_OF_CFG,
    254 	                     WFC_UTIL_CFG_TAG_IDLE_MODE_POWER_SAVE,
    255 	                     WFC_UTIL_CFG_TAG_END_OF_LINE,
    256 	                     PowerSaveOff);
    257 
    258 	wfc_util_fset_string(WFC_UTIL_CFG_FILE_NAME,
    259 	                     WFC_UTIL_CFG_TAG_END_OF_CFG,
    260 	                     WFC_UTIL_CFG_TAG_POWER_SAVE,
    261 	                     WFC_UTIL_CFG_TAG_END_OF_LINE,
    262 	                     PowerSaveOff);
    263 
    264 /* We don't need to change this becasue the default value of WFC_UTIL_CFG_TAG_L2Roaming is 0.
    265 	wfc_util_fset_string(WFC_UTIL_CFG_FILE_NAME,
    266 	                     WFC_UTIL_CFG_TAG_END_OF_CFG,
    267 	                     WFC_UTIL_CFG_TAG_L2Roaming,
    268 	                     WFC_UTIL_CFG_TAG_END_OF_LINE,
    269 	                     L2RoamingOff);
    270 */
    271 
    272 	if(0 < wfc_util_fget_string(WFC_UTIL_CFG_FILE_NAME,
    273 	                            WFC_UTIL_CFG_TAG_END_OF_CFG,
    274 	                            WFC_UTIL_CFG_TAG_HEARTBEAT24,
    275 	                            WFC_UTIL_CFG_TAG_END_OF_LINE,
    276 	                            string_buff,
    277 	                            5)) {
    278 		wfc_util_fset_string(WFC_UTIL_CFG_FILE_NAME,
    279 		                     WFC_UTIL_CFG_TAG_END_OF_CFG,
    280 		                     WFC_UTIL_CFG_TAG_HEARTBEAT24,
    281 		                     WFC_UTIL_CFG_TAG_END_OF_LINE,
    282 		                     Heartbeat24);
    283 	} else {
    284 		wfc_util_log_error("%s is not exist", WFC_UTIL_CFG_TAG_HEARTBEAT24);
    285 	}
    286 
    287 	return;
    288 }
    289 
    290 /*
    291  *  When OTA is enabled, power save mode and L2 roaming trigger should be off
    292  */
    293 static void wfc_util_qcom_write_ota_disable(void)
    294 {
    295 /*
    296  * write Beacon Mode Power Save on and L2 Roaming on
    297  */
    298 	char *PowerSaveOff = "1";
    299 	//char *L2RoamingOff = "1";
    300 	char *Heartbeat24 = "40";
    301 
    302 	char string_buff[5];
    303 
    304 	wfc_util_fset_string(WFC_UTIL_CFG_FILE_NAME,
    305 	                     WFC_UTIL_CFG_TAG_END_OF_CFG,
    306 	                     WFC_UTIL_CFG_TAG_IDLE_MODE_POWER_SAVE,
    307 	                     WFC_UTIL_CFG_TAG_END_OF_LINE,
    308 	                     PowerSaveOff);
    309 
    310 	wfc_util_fset_string(WFC_UTIL_CFG_FILE_NAME,
    311 	                     WFC_UTIL_CFG_TAG_END_OF_CFG,
    312 	                     WFC_UTIL_CFG_TAG_POWER_SAVE,
    313 	                     WFC_UTIL_CFG_TAG_END_OF_LINE,
    314 	                     PowerSaveOff);
    315 
    316 /* We don't need to change this becasue the default value of WFC_UTIL_CFG_TAG_L2Roaming is 0.
    317 	wfc_util_fset_string(WFC_UTIL_CFG_FILE_NAME,
    318 	                     WFC_UTIL_CFG_TAG_END_OF_CFG,
    319 	                     WFC_UTIL_CFG_TAG_L2Roaming,
    320 	                     WFC_UTIL_CFG_TAG_END_OF_LINE,
    321 	                     L2RoamingOff);
    322 */
    323 
    324 	if(0 < wfc_util_fget_string(WFC_UTIL_CFG_FILE_NAME,
    325 	                            WFC_UTIL_CFG_TAG_END_OF_CFG,
    326 	                            WFC_UTIL_CFG_TAG_HEARTBEAT24,
    327 	                            WFC_UTIL_CFG_TAG_END_OF_LINE,
    328 	                            string_buff,
    329 	                            5)) {
    330 		wfc_util_fset_string(WFC_UTIL_CFG_FILE_NAME,
    331 		                     WFC_UTIL_CFG_TAG_END_OF_CFG,
    332 		                     WFC_UTIL_CFG_TAG_HEARTBEAT24,
    333 		                     WFC_UTIL_CFG_TAG_END_OF_LINE,
    334 		                     Heartbeat24);
    335 	} else {
    336 		wfc_util_log_error("%s is not exist", WFC_UTIL_CFG_TAG_HEARTBEAT24);
    337 	}
    338 
    339 	return;
    340 }
    341 
    342 static void wfc_util_qcom_write_mac_to_bin(unsigned char *mac_add)
    343 {
    344 	unsigned char nvValidityBitmap[WFC_UTIL_NV_BIN_HEADER_LENGTH];
    345 
    346 	if(0 != wfc_util_ffile_check(WFC_UTIL_NV_BIN_FILE_NAME,
    347 	                             F_OK|R_OK|W_OK)) {
    348 		wfc_util_log_error("We don't access file [%s]", WFC_UTIL_NV_BIN_FILE_NAME);
    349 		return;
    350 	}
    351 
    352 	memset(nvValidityBitmap, 0, WFC_UTIL_NV_BIN_HEADER_LENGTH);
    353 
    354 	/*
    355 	 * Write RFT MAC Address
    356 	 */
    357 	wfc_util_fset_buffer(WFC_UTIL_NV_BIN_FILE_NAME,
    358 	                     WFC_UTIL_NV_BIN_POS_MAC_ADDR,
    359 	                     mac_add,
    360 	                     WFC_UTIL_CFG_LENGHT_MAC);
    361 
    362 	/*
    363 	 * Read NV validity bitmap
    364 	 */
    365 	if (0 < wfc_util_fget_buffer(WFC_UTIL_NV_BIN_FILE_NAME,
    366 	                             0,
    367 	                             WFC_UTIL_NV_BIN_HEADER_LENGTH,
    368 	                             nvValidityBitmap,
    369 	                             WFC_UTIL_NV_BIN_HEADER_LENGTH)){
    370 	        /*
    371 	         * Check whether Fields bit(Bit 1) is set
    372 	         */
    373 		if (0x02 & nvValidityBitmap[0]) {
    374 			wfc_util_log_info("We don't need to write the default value for NvFilelds");
    375 		} else {
    376 		        /*
    377 		         * Update the Fields bit(Bit 1)
    378 		         */
    379 			nvValidityBitmap[0] |= 0x02;
    380 			wfc_util_fset_buffer(WFC_UTIL_NV_BIN_FILE_NAME,
    381 			                     0,
    382 			                     nvValidityBitmap,
    383 			                     WFC_UTIL_NV_BIN_HEADER_LENGTH);
    384 
    385 		        /*
    386 		         * Write the default value for NvFilelds
    387 		         */
    388 			wfc_util_fset_buffer(WFC_UTIL_NV_BIN_FILE_NAME,
    389 			                     WFC_UTIL_NV_BIN_POS_PRODUCT_ID,
    390 			                     nvFilelds_default,
    391 			                     6);
    392 		}
    393 	} else {
    394 		wfc_util_log_error("Read Fail nvValidityBitmap");
    395 	}
    396 
    397 	return;
    398 }
    399 
    400 /*
    401  * wfc_util_qcom_reset_mac_to_bin
    402  *
    403  * reset the mac address of nv bin file
    404  *
    405  * return : void
    406  */
    407 static void wfc_util_qcom_reset_mac_to_bin(void)
    408 {
    409 	unsigned char mac_addr[WFC_UTIL_CFG_LENGHT_MAC];
    410 
    411 	if(0 != wfc_util_ffile_check(WFC_UTIL_NV_BIN_FILE_NAME,
    412 	                             F_OK|R_OK|W_OK)) {
    413 		wfc_util_log_error("We don't access file [%s]", WFC_UTIL_NV_BIN_FILE_NAME);
    414 		return;
    415 	}
    416 
    417 	if(0 < wfc_util_fget_buffer(WFC_UTIL_NV_BIN_FILE_NAME,
    418 	                            WFC_UTIL_NV_BIN_POS_MAC_ADDR,
    419 	                            WFC_UTIL_CFG_LENGHT_MAC,
    420 	                            mac_addr,
    421 	                            WFC_UTIL_CFG_LENGHT_MAC)) {
    422 		if(0x00 == mac_addr[0] && 0x00 == mac_addr[1] && 0x00 == mac_addr[2] &&
    423 		   0x00 == mac_addr[3] && 0x00 == mac_addr[4] && 0x00 == mac_addr[5])
    424 		{
    425 			return;
    426 		}
    427 	}
    428 
    429 	memset(mac_addr, 0, WFC_UTIL_CFG_LENGHT_MAC);
    430 
    431 	wfc_util_fset_buffer(WFC_UTIL_NV_BIN_FILE_NAME,
    432 	                     WFC_UTIL_NV_BIN_POS_MAC_ADDR,
    433 	                     mac_addr,
    434 	                     WFC_UTIL_CFG_LENGHT_MAC);
    435 
    436 	return;
    437 }
    438 
    439 static int wfc_util_qcom_write_mac_process(unsigned char *nv_mac_addr, char *mac_add_buff)
    440 {
    441 	char nv_mac_add_buff[WFC_UTIL_CFG_LENGHT_MAC_STRING+1];
    442 	int  is_default_nv_mac = 0;
    443 	int  is_same_mac = -1;
    444 
    445 	if (NULL == nv_mac_addr) {
    446 		return 0;
    447 	}
    448 
    449 	wfc_util_htoa(nv_mac_addr, WFC_UTIL_CFG_LENGHT_MAC,
    450 	              nv_mac_add_buff, WFC_UTIL_CFG_LENGHT_MAC_STRING+1);
    451 
    452 	is_default_nv_mac = wfc_util_qcom_is_default_mac(nv_mac_add_buff);
    453 
    454 	is_same_mac = strncmp(mac_add_buff, nv_mac_add_buff, WFC_UTIL_CFG_LENGHT_MAC_STRING);
    455 
    456 	/*
    457 	 * 1. nv mac address is not a default mac address
    458 	 * 2. same with mac address of config file
    459 	 */
    460 	if (((!is_default_nv_mac) && (0==is_same_mac)) ||
    461 	/*
    462 	 * 1. nv mac address is RFT mac address
    463 	 * 2. same with mac address of config file
    464 	 */
    465 	    ((2==is_default_nv_mac) && (0==is_same_mac))
    466 	   ) {
    467 		return 1;
    468 	}
    469 	/*
    470 	 * 1. nv mac address not a default mac address excepting RFT mac address
    471 	 * 2. does not same with mac address of config file
    472 	 */
    473 	else if ((1!=is_default_nv_mac) && (0!=is_same_mac)) {
    474 		wfc_util_log_error("Change %s%s", WFC_UTIL_CFG_TAG_MAC_ADDRESS, nv_mac_add_buff);
    475 		/*
    476 		 * Update MAC address
    477 		 */
    478 		wfc_util_qcom_write_mac(nv_mac_add_buff);
    479 
    480 #ifdef WFC_UTIL_FEATURE_DO_NOT_WRITE_MAC_TO_BIN
    481 		/*
    482 		 * Write RFT MAC address to nv.bin
    483 		 */
    484 		if (2==is_default_nv_mac) {
    485 			wfc_util_qcom_write_mac_to_bin(nv_mac_addr);
    486 		/*
    487 		 * reset mac address of nv.bin if nv_mac_addr is not RFT mac address
    488 		 */
    489 		} else {
    490 			wfc_util_qcom_reset_mac_to_bin();
    491 		}
    492 #else  /* WFC_UTIL_FEATURE_DO_NOT_WRITE_MAC_TO_BIN */
    493 		/*
    494 		 * Write MAC address to nv.bin
    495 		 */
    496 		wfc_util_qcom_write_mac_to_bin(nv_mac_addr);
    497 #endif /* WFC_UTIL_FEATURE_DO_NOT_WRITE_MAC_TO_BIN */
    498 
    499 		return 1;
    500 	}
    501 
    502 	return 0;
    503 }
    504 
    505 static void wfc_util_qcom_create_random_mac(void)
    506 {
    507 	unsigned char random_mac_addr[WFC_UTIL_CFG_LENGHT_MAC];
    508 	char mac_add_buff[WFC_UTIL_CFG_LENGHT_MAC_STRING+1];
    509 
    510 	wfc_util_log_info("wfc_util_qcom_create_random_mac");
    511 
    512 	wfc_util_random_mac(random_mac_addr);
    513 
    514 	wfc_util_htoa(random_mac_addr, WFC_UTIL_CFG_LENGHT_MAC, mac_add_buff, WFC_UTIL_CFG_LENGHT_MAC_STRING+1);
    515 
    516 	wfc_util_qcom_write_mac(mac_add_buff);
    517 
    518 #ifdef WFC_UTIL_FEATURE_DO_NOT_WRITE_MAC_TO_BIN
    519 	wfc_util_qcom_reset_mac_to_bin();
    520 #else  /* WFC_UTIL_FEATURE_DO_NOT_WRITE_MAC_TO_BIN */
    521 	wfc_util_qcom_write_mac_to_bin(random_mac_addr);
    522 #endif /* WFC_UTIL_FEATURE_DO_NOT_WRITE_MAC_TO_BIN */
    523 
    524 	return;
    525 }
    526 
    527 /*
    528  * wfc_util_qcom_check_config
    529  *
    530  * check the qcom wlan driver config file
    531  *
    532  * return : it will return 0 if procedure is success
    533  *          or will return -1 if not.
    534  */
    535 int wfc_util_qcom_check_config(unsigned char *nv_mac_addr)
    536 {
    537 	char mac_add_buff[WFC_UTIL_CFG_LENGHT_MAC_STRING+1];
    538 
    539 	/* make sure driver config file exists */
    540 	if(0 > wfc_util_ffile_check_copy(WFC_UTIL_CFG_FILE_NAME,
    541 	                             WFC_UTIL_CFG_TEMPFILE_NAME,
    542 	                             0660,
    543 	                             AID_SYSTEM,
    544 	                             /* we use "radio" for gid to access from "rild" for AT cmd. */
    545 	                             AID_WIFI/*AID_WIFI*/)) {
    546 		wfc_util_log_error("Fail to Access [%s]", WFC_UTIL_CFG_FILE_NAME);
    547 		return -1;
    548 	}
    549 
    550 #ifdef WFC_UTIL_FEAUTRE_COPY_NV_BIN
    551 	char nv_bin_tempfile_name[50];
    552 	char baseband[5];
    553 
    554 	// Default use WCNSS_qcom_wlan_nv_flo.bin
    555 	property_get("ro.boot.baseband", baseband, "apq");
    556 	if(!strncmp(baseband, "apq", 3)) {
    557 		sprintf(nv_bin_tempfile_name, "/system/etc/wifi/WCNSS_qcom_wlan_nv_flo.bin");
    558 	} else if( !strncmp(baseband, "mdm", 3)){
    559 		sprintf(nv_bin_tempfile_name, "/system/etc/wifi/WCNSS_qcom_wlan_nv_deb.bin");
    560 	}
    561 	wfc_util_log_error("nv bin : %s", nv_bin_tempfile_name);
    562 
    563 	if(0 > wfc_util_ffile_check_copy(WFC_UTIL_NV_BIN_FILE_NAME,
    564 	                             nv_bin_tempfile_name,
    565 	                             0660,
    566 	                             AID_SYSTEM,
    567 	                             /* we use "radio" for gid to access from "rild" for AT cmd. */
    568 	                             AID_WIFI/*AID_WIFI*/)) {
    569 		wfc_util_log_error("Fail to Access [%s]", WFC_UTIL_NV_BIN_FILE_NAME);
    570 		return -1;
    571 	}
    572 #endif /* WFC_UTIL_FEAUTRE_COPY_NV_BIN */
    573 
    574 	/*
    575 	 * Read MAC address from config file
    576 	 */
    577 	if(0 < wfc_util_fget_string(WFC_UTIL_CFG_FILE_NAME,
    578 	                        WFC_UTIL_CFG_TAG_END_OF_CFG,
    579 	                        WFC_UTIL_CFG_TAG_MAC_ADDRESS,
    580 	                        WFC_UTIL_CFG_TAG_END_OF_LINE,
    581 	                        mac_add_buff,
    582 	                        WFC_UTIL_CFG_LENGHT_MAC_STRING+1)) {
    583 		wfc_util_log_info("%s%s", WFC_UTIL_CFG_TAG_MAC_ADDRESS, mac_add_buff);
    584 
    585 		/*
    586 		 * Write nv mac address
    587 		 */
    588 		if (1 != wfc_util_qcom_write_mac_process(nv_mac_addr, mac_add_buff)) {
    589 			/*
    590 			 * Check whether this is default mac address or not
    591 			 */
    592 			if (wfc_util_qcom_is_default_mac(mac_add_buff)) {
    593 				/*
    594 				 * Create random MAC address
    595 				 */
    596 				wfc_util_qcom_create_random_mac();
    597 			}
    598 		}
    599 	} else {
    600 		wfc_util_log_error("%s does not have mac address", WFC_UTIL_CFG_FILE_NAME);
    601 
    602 		memset( mac_add_buff, 0, WFC_UTIL_CFG_LENGHT_MAC_STRING+1 );
    603 
    604 		/*
    605 		 * Write nv mac address
    606 		 */
    607 		if (1 != wfc_util_qcom_write_mac_process(nv_mac_addr, mac_add_buff)) {
    608 			/*
    609 			 * Create random MAC address
    610 			 */
    611 			wfc_util_qcom_create_random_mac();
    612 		}
    613 	}
    614 
    615 	return 0;
    616 }
    617 
    618 /*
    619  * wfc_util_qcom_reset_mac
    620  *
    621  * reset the mac address of config file
    622  *
    623  * return : void
    624  */
    625 void wfc_util_qcom_reset_mac(void)
    626 {
    627 	wfc_util_qcom_write_mac("000000000000");
    628 
    629 	wfc_util_qcom_reset_mac_to_bin();
    630 
    631 	return;
    632 }
    633 
    634 /*
    635  * wfc_util_qcom_ota_enable
    636  *
    637  * enable ota mode by reconfiguring BMPS and L2Roaming
    638  *
    639  * return : int (boolean)
    640  */
    641 int wfc_util_qcom_ota_enable(void)
    642 {
    643 	wfc_util_qcom_write_ota_enable();
    644 	return 1;
    645 }
    646 
    647 /*
    648  * wfc_util_qcom_ota_disable
    649  *
    650  * disable ota mode by reconfiguring BMPS and L2Roaming
    651  *
    652  * return : int (boolean)
    653  */
    654 int wfc_util_qcom_ota_disable(void)
    655 {
    656 	wfc_util_qcom_write_ota_disable();
    657 	return 1;
    658 }
    659 
    660 /*
    661  * wfc_util_qcom_checkt_roaming_off
    662  *
    663  * Check L2Roaming configuration
    664  *
    665  * return : int (boolean)
    666  */
    667 int wfc_util_qcom_checkt_roaming_off(void)
    668 {
    669 	char string_buff[5];
    670 	/*
    671 	 * check whether OTA test is enabled or not.
    672 	 */
    673 	if(0 < wfc_util_fget_string(WFC_UTIL_CFG_FILE_NAME,
    674 	                            WFC_UTIL_CFG_TAG_END_OF_CFG,
    675 	                            //WFC_UTIL_CFG_TAG_L2Roaming,
    676 	                            WFC_UTIL_CFG_TAG_POWER_SAVE,
    677 	                            WFC_UTIL_CFG_TAG_END_OF_LINE,
    678 	                            string_buff,
    679 	                            5)) {
    680 		//wfc_util_log_info("%s%s", WFC_UTIL_CFG_TAG_L2Roaming, string_buff);
    681 		wfc_util_log_info("%s%s", WFC_UTIL_CFG_TAG_POWER_SAVE, string_buff);
    682 		if(0 == strncmp(string_buff, "0", 1)) {
    683 			return 1;
    684 		}
    685 	}
    686 	return 0;
    687 }
    688 
    689 #endif /* CONFIG_LGE_WLAN_QCOM_PATCH */
    690 
    691