X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=drivers%2Fnet%2Fwireless%2Frockchip_wlan%2Frtl8723bs%2Fcore%2Fefuse%2Frtw_efuse.c;h=4607ca408c780d9abcf6e8d89c60fff21b44605f;hb=f62b360d66bcd60dbd63443e01d30b64b4d7cdc7;hp=5d3f80afea294225dd79824e0f3eaa057d514fd2;hpb=1d25707ec252866943bb1b4e248dacfb7a3027d0;p=firefly-linux-kernel-4.4.55.git diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bs/core/efuse/rtw_efuse.c b/drivers/net/wireless/rockchip_wlan/rtl8723bs/core/efuse/rtw_efuse.c old mode 100755 new mode 100644 index 5d3f80afea29..4607ca408c78 --- a/drivers/net/wireless/rockchip_wlan/rtl8723bs/core/efuse/rtw_efuse.c +++ b/drivers/net/wireless/rockchip_wlan/rtl8723bs/core/efuse/rtw_efuse.c @@ -22,6 +22,7 @@ #include #include +#include "../hal/efuse/efuse_mask.h" /*------------------------Define local variable------------------------------*/ u8 fakeEfuseBank=0; @@ -39,6 +40,8 @@ u32 fakeBTEfuseUsedBytes=0; u8 fakeBTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE]; u8 fakeBTEfuseInitMap[EFUSE_BT_MAX_MAP_LEN]={0}; u8 fakeBTEfuseModifiedMap[EFUSE_BT_MAX_MAP_LEN]={0}; + +u8 maskfileBuffer[32]; /*------------------------Define local variable------------------------------*/ //------------------------------------------------------------------------------ @@ -433,7 +436,8 @@ efuse_OneByteRead( u32 tmpidx = 0; u8 bResult; u8 readbyte; - + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + //DBG_871X("===> EFUSE_OneByteRead(), addr = %x\n", addr); //DBG_871X("===> EFUSE_OneByteRead() start, 0x34 = 0x%X\n", rtw_read32(pAdapter, EFUSE_TEST)); @@ -442,9 +446,11 @@ efuse_OneByteRead( bResult = Efuse_Read1ByteFromFakeContent(pAdapter, addr, data); return bResult; } - + if( IS_HARDWARE_TYPE_8723B(pAdapter) || - (IS_HARDWARE_TYPE_8192E(pAdapter) && IS_VENDOR_8192E_B_CUT(pAdapter))) + (IS_HARDWARE_TYPE_8192E(pAdapter) && (!IS_A_CUT(pHalData->VersionID))) || + (IS_VENDOR_8188E_I_CUT_SERIES(pAdapter)) || (IS_CHIP_VENDOR_SMIC(pHalData->VersionID)) + ) { // <20130121, Kordan> For SMIC EFUSE specificatoin. //0x34[11]: SW force PGMEN input of efuse to high. (for the bank selected by 0x34[9:8]) @@ -495,7 +501,8 @@ efuse_OneByteWrite( u8 tmpidx = 0; u8 bResult=_FALSE; u32 efuseValue = 0; - + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + //DBG_871X("===> EFUSE_OneByteWrite(), addr = %x data=%x\n", addr, data); //DBG_871X("===> EFUSE_OneByteWrite() start, 0x34 = 0x%X\n", rtw_read32(pAdapter, EFUSE_TEST)); @@ -505,6 +512,7 @@ efuse_OneByteWrite( return bResult; } + Efuse_PowerSwitch(pAdapter, _TRUE, _TRUE); // -----------------e-fuse reg ctrl --------------------------------- //address @@ -515,10 +523,11 @@ efuse_OneByteWrite( efuseValue &= ~(0x3FFFF); efuseValue |= ((addr<<8 | data) & 0x3FFFF); - // <20130227, Kordan> 8192E MP chip A-cut had better not set 0x34[11] until B-Cut. - if (IS_HARDWARE_TYPE_8723B(pAdapter)||(IS_HARDWARE_TYPE_8192E(pAdapter) && IS_VENDOR_8192E_B_CUT(pAdapter))) - { + if ( IS_HARDWARE_TYPE_8723B(pAdapter) || + (IS_HARDWARE_TYPE_8192E(pAdapter) && (!IS_A_CUT(pHalData->VersionID))) || + (IS_VENDOR_8188E_I_CUT_SERIES(pAdapter)) || (IS_CHIP_VENDOR_SMIC(pHalData->VersionID)) + ) { // <20130121, Kordan> For SMIC EFUSE specificatoin. //0x34[11]: SW force PGMEN input of efuse to high. (for the bank selected by 0x34[9:8]) //PHY_SetMacReg(pAdapter, 0x34, BIT11, 1); @@ -548,11 +557,15 @@ efuse_OneByteWrite( } // disable Efuse program enable - if (IS_HARDWARE_TYPE_8723B(pAdapter)) - { + if ( IS_HARDWARE_TYPE_8723B(pAdapter) || + (IS_HARDWARE_TYPE_8192E(pAdapter) && (!IS_A_CUT(pHalData->VersionID))) || + (IS_VENDOR_8188E_I_CUT_SERIES(pAdapter)) || (IS_CHIP_VENDOR_SMIC(pHalData->VersionID)) + ) { PHY_SetMacReg(pAdapter, EFUSE_TEST, BIT(11), 0); } + Efuse_PowerSwitch(pAdapter, _TRUE, _FALSE); + return bResult; } @@ -711,6 +724,8 @@ u8 rtw_efuse_access(PADAPTER padapter, u8 bWrite, u16 start_addr, u16 cnts, u8 * u16 efuse_GetMaxSize(PADAPTER padapter) { u16 max_size; + + max_size = 0; EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI , TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_size, _FALSE); return max_size; } @@ -724,6 +739,24 @@ u8 efuse_GetCurrentSize(PADAPTER padapter, u16 *size) return _SUCCESS; } //------------------------------------------------------------------------------ +u16 efuse_bt_GetMaxSize(PADAPTER padapter) +{ + u16 max_size; + + max_size = 0; + EFUSE_GetEfuseDefinition(padapter, EFUSE_BT , TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_size, _FALSE); + return max_size; +} + +u8 efuse_bt_GetCurrentSize(PADAPTER padapter, u16 *size) +{ + Efuse_PowerSwitch(padapter, _FALSE, _TRUE); + *size = Efuse_GetCurrentSize(padapter, EFUSE_BT, _FALSE); + Efuse_PowerSwitch(padapter, _FALSE, _FALSE); + + return _SUCCESS; +} + u8 rtw_efuse_map_read(PADAPTER padapter, u16 addr, u16 cnts, u8 *data) { u16 mapLen=0; @@ -759,6 +792,165 @@ u8 rtw_BT_efuse_map_read(PADAPTER padapter, u16 addr, u16 cnts, u8 *data) return _SUCCESS; } + +BOOLEAN rtw_file_efuse_IsMasked( + PADAPTER pAdapter, + u16 Offset + ) +{ + int r = Offset/16; + int c = (Offset%16) / 2; + int result = 0; + + if(pAdapter->registrypriv.boffefusemask) + return FALSE; + + //DBG_871X(" %s ,Offset=%x r= %d , c=%d , maskfileBuffer[r]= %x \n",__func__,Offset,r,c,maskfileBuffer[r]); + if (c < 4) // Upper double word + result = (maskfileBuffer[r] & (0x10 << c)); + else + result = (maskfileBuffer[r] & (0x01 << (c-4))); + + return (result > 0) ? 0 : 1; + +} + + +u8 rtw_efuse_file_read(PADAPTER padapter,u8 *filepatch,u8 *buf,u32 len) +{ + char *ptmp; + char *ptmpbuf=NULL; + u32 rtStatus; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + + ptmpbuf = rtw_zmalloc(2048); + + if (ptmpbuf == NULL) + return _FALSE; + + _rtw_memset(ptmpbuf,'\0',2048); + + rtStatus = rtw_retrieve_from_file(filepatch, ptmpbuf, 2048); + + if( rtStatus > 100 ) + { + u32 i,j; + for(i=0,j=0;jregistrypriv.boffefusemask) + return FALSE; + +#if DEV_BUS_TYPE == RT_USB_INTERFACE +#if defined(CONFIG_RTL8188E) + if (IS_HARDWARE_TYPE_8188E(pAdapter)) + return (IS_MASKED(8188E,_MUSB,Offset)) ? TRUE : FALSE; +#endif +#if defined(CONFIG_RTL8812A) + if (IS_HARDWARE_TYPE_8812(pAdapter)) + return (IS_MASKED(8812A,_MUSB,Offset)) ? TRUE : FALSE; +#endif +#if defined(CONFIG_RTL8821A) + //if (IS_HARDWARE_TYPE_8811AU(pAdapter)) + // return (IS_MASKED(8811A,_MUSB,Offset)) ? TRUE : FALSE; + if (IS_HARDWARE_TYPE_8821(pAdapter)) + return (IS_MASKED(8821A,_MUSB,Offset)) ? TRUE : FALSE; +#endif +#if defined(CONFIG_RTL8192E) + if (IS_HARDWARE_TYPE_8192E(pAdapter)) + return (IS_MASKED(8192E,_MUSB,Offset)) ? TRUE : FALSE; +#endif +#if defined(CONFIG_RTL8723B) + if (IS_HARDWARE_TYPE_8723B(pAdapter)) + return (IS_MASKED(8723B,_MUSB,Offset)) ? TRUE : FALSE; +#endif +#if defined(CONFIG_RTL8703B) + if (IS_HARDWARE_TYPE_8703B(pAdapter)) + return (IS_MASKED(8703B, _MUSB, Offset)) ? TRUE : FALSE; +#endif +#if defined(CONFIG_RTL8814A) + if (IS_HARDWARE_TYPE_8814A(pAdapter)) + return (IS_MASKED(8814A, _MUSB, Offset)) ? TRUE : FALSE; +#endif +#if defined(CONFIG_RTL8188F) + if (IS_HARDWARE_TYPE_8188F(pAdapter)) + return (IS_MASKED(8188F, _MUSB, Offset)) ? TRUE : FALSE; +#endif +#elif DEV_BUS_TYPE == RT_PCI_INTERFACE +#if defined(CONFIG_RTL8188E) + if (IS_HARDWARE_TYPE_8188E(pAdapter)) + return (IS_MASKED(8188E,_MPCIE,Offset)) ? TRUE : FALSE; +#endif +#if defined(CONFIG_RTL8192E) + if (IS_HARDWARE_TYPE_8192E(pAdapter)) + return (IS_MASKED(8192E,_MPCIE,Offset)) ? TRUE : FALSE; +#endif +#if defined(CONFIG_RTL8812A) + if (IS_HARDWARE_TYPE_8812(pAdapter)) + return (IS_MASKED(8812A,_MPCIE,Offset)) ? TRUE : FALSE; +#endif +#if defined(CONFIG_RTL8821A) + if (IS_HARDWARE_TYPE_8821(pAdapter)) + return (IS_MASKED(8821A,_MPCIE,Offset)) ? TRUE : FALSE; +#endif +#if defined(CONFIG_RTL8723B) + if (IS_HARDWARE_TYPE_8723B(pAdapter)) + return (IS_MASKED(8723B,_MPCIE,Offset)) ? TRUE : FALSE; +#endif +#if defined(CONFIG_RTL8814A) + if (IS_HARDWARE_TYPE_8814A(pAdapter)) + return (IS_MASKED(8814A, _MPCIE, Offset)) ? TRUE : FALSE; +#endif + //else if (IS_HARDWARE_TYPE_8821B(pAdapter)) + // return (IS_MASKED(8821B,_MPCIE,Offset)) ? TRUE : FALSE; + +#elif DEV_BUS_TYPE == RT_SDIO_INTERFACE +#ifdef CONFIG_RTL8188E_SDIO + if (IS_HARDWARE_TYPE_8188E(pAdapter)) + return (IS_MASKED(8188E,_MSDIO,Offset)) ? TRUE : FALSE; +#endif +#ifdef CONFIG_RTL8188F_SDIO + if (IS_HARDWARE_TYPE_8188F(pAdapter)) + return (IS_MASKED(8188F, _MSDIO, Offset)) ? TRUE : FALSE; +#endif +#endif + + return FALSE; +} + //------------------------------------------------------------------------------ u8 rtw_efuse_map_write(PADAPTER padapter, u16 addr, u16 cnts, u8 *data) { @@ -775,7 +967,6 @@ u8 rtw_efuse_map_write(PADAPTER padapter, u16 addr, u16 cnts, u8 *data) s32 i, j, idx; u8 ret = _SUCCESS; u16 mapLen=0; - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter); HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, _FALSE); @@ -796,7 +987,24 @@ u8 rtw_efuse_map_write(PADAPTER padapter, u16 addr, u16 cnts, u8 *data) ret = rtw_efuse_map_read(padapter, 0, mapLen, map); if (ret == _FAIL) goto exit; - Efuse_PowerSwitch(padapter, _TRUE, _TRUE); + if(padapter->registrypriv.boffefusemask==0) + { + for (i =0; i < cnts; i++) + { + if(padapter->registrypriv.bFileMaskEfuse==_TRUE) + { + if (rtw_file_efuse_IsMasked(padapter, addr+i)) /*use file efuse mask. */ + data[i] = map[addr+i]; + } + else + { + if ( efuse_IsMasked(padapter, addr+i )) + data[i] = map[addr+i]; + } + DBG_8192C("%s , data[%d] = %x, map[addr+i]= %x\n", __func__, i, data[i], map[addr+i]); + } + } + /*Efuse_PowerSwitch(padapter, _TRUE, _TRUE);*/ idx = 0; offset = (addr >> 3); @@ -816,10 +1024,10 @@ u8 rtw_efuse_map_write(PADAPTER padapter, u16 addr, u16 cnts, u8 *data) { if (IS_C_CUT(pHalData->VersionID) || IS_B_CUT(pHalData->VersionID)) { - if(pEEPROM->adjuseVoltageVal == 6) + if(pHalData->adjuseVoltageVal == 6) { newdata[i] = map[addr + idx]; - DBG_8192C(" %s ,\n adjuseVoltageVal = %d ,newdata[%d] = %x \n",__func__,pEEPROM->adjuseVoltageVal,i,newdata[i]); + DBG_8192C(" %s ,\n adjuseVoltageVal = %d ,newdata[%d] = %x \n",__func__,pHalData->adjuseVoltageVal,i,newdata[i]); } } } @@ -842,7 +1050,7 @@ u8 rtw_efuse_map_write(PADAPTER padapter, u16 addr, u16 cnts, u8 *data) offset++; } - Efuse_PowerSwitch(padapter, _TRUE, _FALSE); + /*Efuse_PowerSwitch(padapter, _TRUE, _FALSE);*/ exit: @@ -851,8 +1059,35 @@ exit: return ret; } +u8 rtw_efuse_mask_map_read(PADAPTER padapter, u16 addr, u16 cnts, u8 *data) +{ + u8 ret = _SUCCESS; + u16 mapLen = 0, i = 0; + + EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, _FALSE); + + ret = rtw_efuse_map_read(padapter, addr, cnts , data); + + if (padapter->registrypriv.boffefusemask == 0) { + + for (i = 0; i < cnts; i++) { + if (padapter->registrypriv.bFileMaskEfuse == _TRUE) { + if (rtw_file_efuse_IsMasked(padapter, addr+i)) /*use file efuse mask.*/ + data[i] = 0xff; + } else { + /*DBG_8192C(" %s , data[%d] = %x\n", __func__, i, data[i]);*/ + if (efuse_IsMasked(padapter, addr+i)) { + data[i] = 0xff; + /*DBG_8192C(" %s ,mask data[%d] = %x\n", __func__, i, data[i]);*/ + } + } + } + + } + return ret; + +} -//------------------------------------------------------------------------------ u8 rtw_BT_efuse_map_write(PADAPTER padapter, u16 addr, u16 cnts, u8 *data) { #define RT_ASSERT_RET(expr) \ @@ -1005,9 +1240,9 @@ efuse_ShadowRead1Byte( IN u16 Offset, IN OUT u8 *Value) { - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter); + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter); - *Value = pEEPROM->efuse_eeprom_data[Offset]; + *Value = pHalData->efuse_eeprom_data[Offset]; } // EFUSE_ShadowRead1Byte @@ -1018,10 +1253,10 @@ efuse_ShadowRead2Byte( IN u16 Offset, IN OUT u16 *Value) { - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter); + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter); - *Value = pEEPROM->efuse_eeprom_data[Offset]; - *Value |= pEEPROM->efuse_eeprom_data[Offset+1]<<8; + *Value = pHalData->efuse_eeprom_data[Offset]; + *Value |= pHalData->efuse_eeprom_data[Offset+1]<<8; } // EFUSE_ShadowRead2Byte @@ -1032,12 +1267,12 @@ efuse_ShadowRead4Byte( IN u16 Offset, IN OUT u32 *Value) { - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter); + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter); - *Value = pEEPROM->efuse_eeprom_data[Offset]; - *Value |= pEEPROM->efuse_eeprom_data[Offset+1]<<8; - *Value |= pEEPROM->efuse_eeprom_data[Offset+2]<<16; - *Value |= pEEPROM->efuse_eeprom_data[Offset+3]<<24; + *Value = pHalData->efuse_eeprom_data[Offset]; + *Value |= pHalData->efuse_eeprom_data[Offset+1]<<8; + *Value |= pHalData->efuse_eeprom_data[Offset+2]<<16; + *Value |= pHalData->efuse_eeprom_data[Offset+3]<<24; } // efuse_ShadowRead4Byte @@ -1073,9 +1308,9 @@ efuse_ShadowWrite1Byte( IN u16 Offset, IN u8 Value) { - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter); + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter); - pEEPROM->efuse_eeprom_data[Offset] = Value; + pHalData->efuse_eeprom_data[Offset] = Value; } // efuse_ShadowWrite1Byte @@ -1086,10 +1321,12 @@ efuse_ShadowWrite2Byte( IN u16 Offset, IN u16 Value) { - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter); + + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter); + - pEEPROM->efuse_eeprom_data[Offset] = Value&0x00FF; - pEEPROM->efuse_eeprom_data[Offset+1] = Value>>8; + pHalData->efuse_eeprom_data[Offset] = Value&0x00FF; + pHalData->efuse_eeprom_data[Offset+1] = Value>>8; } // efuse_ShadowWrite1Byte @@ -1100,12 +1337,12 @@ efuse_ShadowWrite4Byte( IN u16 Offset, IN u32 Value) { - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter); + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter); - pEEPROM->efuse_eeprom_data[Offset] = (u8)(Value&0x000000FF); - pEEPROM->efuse_eeprom_data[Offset+1] = (u8)((Value>>8)&0x0000FF); - pEEPROM->efuse_eeprom_data[Offset+2] = (u8)((Value>>16)&0x00FF); - pEEPROM->efuse_eeprom_data[Offset+3] = (u8)((Value>>24)&0xFF); + pHalData->efuse_eeprom_data[Offset] = (u8)(Value&0x000000FF); + pHalData->efuse_eeprom_data[Offset+1] = (u8)((Value>>8)&0x0000FF); + pHalData->efuse_eeprom_data[Offset+2] = (u8)((Value>>16)&0x00FF); + pHalData->efuse_eeprom_data[Offset+3] = (u8)((Value>>24)&0xFF); } // efuse_ShadowWrite1Byte @@ -1130,25 +1367,25 @@ void EFUSE_ShadowMapUpdate( IN u8 efuseType, IN BOOLEAN bPseudoTest) { - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter); + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter); u16 mapLen=0; EFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, bPseudoTest); - if (pEEPROM->bautoload_fail_flag == _TRUE) + if (pHalData->bautoload_fail_flag == _TRUE) { - _rtw_memset(pEEPROM->efuse_eeprom_data, 0xFF, mapLen); + _rtw_memset(pHalData->efuse_eeprom_data, 0xFF, mapLen); } else { #ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE - if(_SUCCESS != retriveAdaptorInfoFile(pAdapter->registrypriv.adaptor_info_caching_file_path, pEEPROM)) { + if(_SUCCESS != retriveAdaptorInfoFile(pAdapter->registrypriv.adaptor_info_caching_file_path, pHalData->efuse_eeprom_data)) { #endif - Efuse_ReadAllMap(pAdapter, efuseType, pEEPROM->efuse_eeprom_data, bPseudoTest); + Efuse_ReadAllMap(pAdapter, efuseType, pHalData->efuse_eeprom_data, bPseudoTest); #ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE - storeAdaptorInfoFile(pAdapter->registrypriv.adaptor_info_caching_file_path, pEEPROM); + storeAdaptorInfoFile(pAdapter->registrypriv.adaptor_info_caching_file_path, pHalData->efuse_eeprom_data); } #endif } @@ -1265,6 +1502,40 @@ Efuse_InitSomeVar( _rtw_memset((PVOID)&fakeBTEfuseModifiedMap[0], 0xff, EFUSE_BT_MAX_MAP_LEN); } +const u8 _mac_hidden_max_bw_to_hal_bw_cap[MAC_HIDDEN_MAX_BW_NUM] = { + 0, + 0, + (BW_CAP_160M|BW_CAP_80M|BW_CAP_40M|BW_CAP_20M|BW_CAP_10M|BW_CAP_5M), + (BW_CAP_5M), + (BW_CAP_10M|BW_CAP_5M), + (BW_CAP_20M|BW_CAP_10M|BW_CAP_5M), + (BW_CAP_40M|BW_CAP_20M|BW_CAP_10M|BW_CAP_5M), + (BW_CAP_80M|BW_CAP_40M|BW_CAP_20M|BW_CAP_10M|BW_CAP_5M), +}; + +const u8 _mac_hidden_proto_to_hal_proto_cap[MAC_HIDDEN_PROTOCOL_NUM] = { + 0, + 0, + (PROTO_CAP_11N|PROTO_CAP_11G|PROTO_CAP_11B), + (PROTO_CAP_11AC|PROTO_CAP_11N|PROTO_CAP_11G|PROTO_CAP_11B), +}; + +u8 mac_hidden_wl_func_to_hal_wl_func(u8 func) +{ + u8 wl_func = 0; + + if (func & BIT0) + wl_func |= WL_FUNC_MIRACAST; + if (func & BIT1) + wl_func |= WL_FUNC_P2P; + if (func & BIT2) + wl_func |= WL_FUNC_TDLS; + if (func & BIT3) + wl_func |= WL_FUNC_FTM; + + return wl_func; +} + #ifdef PLATFORM_LINUX #ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE //#include @@ -1274,12 +1545,12 @@ Efuse_InitSomeVar( return _TRUE; } -int storeAdaptorInfoFile(char *path, struct eeprom_priv * eeprom_priv) +int storeAdaptorInfoFile(char *path, u8* efuse_data) { int ret =_SUCCESS; - if(path && eeprom_priv) { - ret = rtw_store_to_file(path, eeprom_priv->efuse_eeprom_data, EEPROM_MAX_SIZE_512); + if(path && efuse_data) { + ret = rtw_store_to_file(path, efuse_data, EEPROM_MAX_SIZE_512); if(ret == EEPROM_MAX_SIZE) ret = _SUCCESS; else @@ -1291,15 +1562,15 @@ int storeAdaptorInfoFile(char *path, struct eeprom_priv * eeprom_priv) return ret; } -int retriveAdaptorInfoFile(char *path, struct eeprom_priv * eeprom_priv) +int retriveAdaptorInfoFile(char *path, u8* efuse_data) { int ret = _SUCCESS; mm_segment_t oldfs; struct file *fp; - if(path && eeprom_priv) { + if(path && efuse_data) { - ret = rtw_retrive_from_file(path, eeprom_priv->efuse_eeprom_data, EEPROM_MAX_SIZE); + ret = rtw_retrieve_from_file(path, efuse_data, EEPROM_MAX_SIZE); if(ret == EEPROM_MAX_SIZE) ret = _SUCCESS; @@ -1320,117 +1591,141 @@ int retriveAdaptorInfoFile(char *path, struct eeprom_priv * eeprom_priv) } return ret; } -#endif //CONFIG_ADAPTOR_INFO_CACHING_FILE -#endif //PLATFORM_LINUX +#endif /* CONFIG_ADAPTOR_INFO_CACHING_FILE */ #ifdef CONFIG_EFUSE_CONFIG_FILE - -void Rtw_Hal_ReadMACAddrFromFile(PADAPTER padapter) +u32 rtw_read_efuse_from_file(const char *path, u8 *buf) { u32 i; + u8 temp[3]; + u32 ret = _FAIL; + struct file *fp; mm_segment_t fs; - u8 source_addr[18]; loff_t pos = 0; - u32 curtime = rtw_get_current_time(); - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter); - u8 *head, *end; - - u8 null_mac_addr[ETH_ALEN] = {0, 0, 0,0, 0, 0}; - u8 multi_mac_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - - _rtw_memset(source_addr, 0, 18); - _rtw_memset(pEEPROM->mac_addr, 0, ETH_ALEN); - fp = filp_open("/data/wifimac.txt", O_RDWR, 0644); - if (IS_ERR(fp)) { - pEEPROM->bloadmac_fail_flag = _TRUE; - DBG_871X("Error, wifi mac address file doesn't exist.\n"); - } else { - fs = get_fs(); - set_fs(KERNEL_DS); - - DBG_871X("wifi mac address:\n"); - vfs_read(fp, source_addr, 18, &pos); - source_addr[17] = ':'; + fp = filp_open(path, O_RDONLY, 0); + if (fp == NULL || IS_ERR(fp)) { + if (fp != NULL) + DBG_871X_LEVEL(_drv_always_, "%s open %s fail, err:%ld\n" + , __func__, path, PTR_ERR(fp)); + else + DBG_871X_LEVEL(_drv_always_, "%s open %s fail, fp is NULL\n" + , __func__, path); - head = end = source_addr; - for (i=0; imac_addr[i] = simple_strtoul(head, NULL, 16 ); + fs = get_fs(); + set_fs(KERNEL_DS); - if (end) { - end++; - head = end; + for (i = 0 ; i < HWSET_MAX_SIZE ; i++) { + vfs_read(fp, temp, 2, &pos); + if (sscanf(temp, "%hhx", &buf[i]) != 1) { + if (0) + DBG_871X_LEVEL(_drv_err_, "%s sscanf fail\n", __func__); + buf[i] = 0xFF; + } + if ((i % EFUSE_FILE_COLUMN_NUM) == (EFUSE_FILE_COLUMN_NUM - 1)) { + /* Filter the lates space char. */ + vfs_read(fp, temp, 1, &pos); + if (strchr(temp, ' ') == NULL) { + pos--; + vfs_read(fp, temp, 2, &pos); } - DBG_871X("%02x \n", pEEPROM->mac_addr[i]); + } else { + pos += 1; /* Filter the space character */ } - DBG_871X("\n"); - set_fs(fs); - pEEPROM->bloadmac_fail_flag = _FALSE; - filp_close(fp, NULL); } - if ( (_rtw_memcmp(pEEPROM->mac_addr, null_mac_addr, ETH_ALEN)) || - (_rtw_memcmp(pEEPROM->mac_addr, multi_mac_addr, ETH_ALEN)) ) { - pEEPROM->mac_addr[0] = 0x00; - pEEPROM->mac_addr[1] = 0xe0; - pEEPROM->mac_addr[2] = 0x4c; - pEEPROM->mac_addr[3] = (u8)(curtime & 0xff) ; - pEEPROM->mac_addr[4] = (u8)((curtime>>8) & 0xff) ; - pEEPROM->mac_addr[5] = (u8)((curtime>>16) & 0xff) ; + set_fs(fs); + + DBG_871X_LEVEL(_drv_always_, "efuse file: %s\n", path); +#ifdef CONFIG_DEBUG + for (i = 0; i < HWSET_MAX_SIZE; i++) { + if (i % 16 == 0) + DBG_871X_SEL_NL(RTW_DBGDUMP, "0x%03x: ", i); + + DBG_871X_SEL(RTW_DBGDUMP, "%02X%s" + , buf[i] + , ((i + 1) % 16 == 0) ? "\n" : (((i + 1) % 8 == 0) ? " " : " ") + ); } + DBG_871X_SEL(RTW_DBGDUMP, "\n"); +#endif - DBG_871X("Hal_ReadMACAddrFromFile: Permanent Address = %02x-%02x-%02x-%02x-%02x-%02x !!!\n", - pEEPROM->mac_addr[0], pEEPROM->mac_addr[1], - pEEPROM->mac_addr[2], pEEPROM->mac_addr[3], - pEEPROM->mac_addr[4], pEEPROM->mac_addr[5]); -} + ret = _SUCCESS; +exit: + return ret; +} -u32 Rtw_Hal_readPGDataFromConfigFile(PADAPTER padapter) +u32 rtw_read_macaddr_from_file(const char *path, u8 *buf) { - u32 i; struct file *fp; mm_segment_t fs; - u8 temp[3]; loff_t pos = 0; - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter); - u8 *PROMContent = pEEPROM->efuse_eeprom_data; + u8 source_addr[18]; + u8 *head, *end; + int i; + u32 ret = _FAIL; - temp[2] = 0; // add end of string '\0' + _rtw_memset(source_addr, 0, 18); - fp = filp_open("/system/etc/wifi/wifi_efuse.map", O_RDWR, 0644); - if (IS_ERR(fp)) { - pEEPROM->bloadfile_fail_flag = _TRUE; - DBG_871X("Error, Efuse configure file doesn't exist.\n"); - return _FAIL; + fp = filp_open(path, O_RDONLY, 0); + if (fp == NULL || IS_ERR(fp)) { + if (fp != NULL) + DBG_871X_LEVEL(_drv_always_, "%s open %s fail, err:%ld\n" + , __func__, path, PTR_ERR(fp)); + else + DBG_871X_LEVEL(_drv_always_, "%s open %s fail, fp is NULL\n" + , __func__, path); + + goto exit; } fs = get_fs(); set_fs(KERNEL_DS); - DBG_871X("Efuse configure file:\n"); - for (i=0; i< EFUSE_MAP_SIZE ; i++) { - vfs_read(fp, temp, 2, &pos); - PROMContent[i] = simple_strtoul(temp, NULL, 16 ); - pos += 1; // Filter the space character - DBG_871X("%02X \n", PROMContent[i]); + vfs_read(fp, source_addr, 18, &pos); + source_addr[17] = ':'; + + head = end = source_addr; + for (i = 0; i < ETH_ALEN; i++) { + while (end && (*end != ':')) + end++; + + if (end && (*end == ':')) + *end = '\0'; + + if (sscanf(head, "%hhx", &buf[i]) != 1) { + if (0) + DBG_871X_LEVEL(_drv_err_, "%s sscanf fail\n", __func__); + buf[i] = 0xFF; + } + + if (end) { + end++; + head = end; + } } - DBG_871X("\n"); + set_fs(fs); - filp_close(fp, NULL); - - pEEPROM->bloadfile_fail_flag = _FALSE; - - return _SUCCESS; + DBG_871X_LEVEL(_drv_always_, "wifi_mac file: %s\n", path); +#ifdef CONFIG_DEBUG + DBG_871X(MAC_FMT"\n", MAC_ARG(buf)); +#endif + + ret = _SUCCESS; + +exit: + return ret; } +#endif /* CONFIG_EFUSE_CONFIG_FILE */ + +#endif /* PLATFORM_LINUX */ -#endif //#CONFIG_EFUSE_CONFIG_FILE