1 /******************************************************************************
3 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 ******************************************************************************/
22 #include <drv_types.h>
25 #include "../hal/efuse/efuse_mask.h"
27 /*------------------------Define local variable------------------------------*/
29 u32 fakeEfuseUsedBytes=0;
30 u8 fakeEfuseContent[EFUSE_MAX_HW_SIZE]={0};
31 u8 fakeEfuseInitMap[EFUSE_MAX_MAP_LEN]={0};
32 u8 fakeEfuseModifiedMap[EFUSE_MAX_MAP_LEN]={0};
34 u32 BTEfuseUsedBytes=0;
35 u8 BTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE];
36 u8 BTEfuseInitMap[EFUSE_BT_MAX_MAP_LEN]={0};
37 u8 BTEfuseModifiedMap[EFUSE_BT_MAX_MAP_LEN]={0};
39 u32 fakeBTEfuseUsedBytes=0;
40 u8 fakeBTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE];
41 u8 fakeBTEfuseInitMap[EFUSE_BT_MAX_MAP_LEN]={0};
42 u8 fakeBTEfuseModifiedMap[EFUSE_BT_MAX_MAP_LEN]={0};
44 u8 maskfileBuffer[32];
45 /*------------------------Define local variable------------------------------*/
47 //------------------------------------------------------------------------------
48 #define REG_EFUSE_CTRL 0x0030
49 #define EFUSE_CTRL REG_EFUSE_CTRL // E-Fuse Control.
50 //------------------------------------------------------------------------------
53 Efuse_Read1ByteFromFakeContent(
58 Efuse_Read1ByteFromFakeContent(
63 if(Offset >= EFUSE_MAX_HW_SIZE)
67 //DbgPrint("Read fake content, offset = %d\n", Offset);
68 if(fakeEfuseBank == 0)
69 *Value = fakeEfuseContent[Offset];
71 *Value = fakeBTEfuseContent[fakeEfuseBank-1][Offset];
76 Efuse_Write1ByteToFakeContent(
81 Efuse_Write1ByteToFakeContent(
86 if(Offset >= EFUSE_MAX_HW_SIZE)
90 if(fakeEfuseBank == 0)
91 fakeEfuseContent[Offset] = Value;
94 fakeBTEfuseContent[fakeEfuseBank-1][Offset] = Value;
99 /*-----------------------------------------------------------------------------
100 * Function: Efuse_PowerSwitch
102 * Overview: When we want to enable write operation, we should change to
103 * pwr on state. When we stop write, we should switch to 500k mode
104 * and disable LDO 2.5V.
114 * 11/17/2008 MHC Create Version 0.
116 *---------------------------------------------------------------------------*/
119 IN PADAPTER pAdapter,
123 pAdapter->HalFunc.EfusePowerSwitch(pAdapter, bWrite, PwrState);
128 IN PADAPTER pAdapter,
132 if(pAdapter->HalFunc.BTEfusePowerSwitch)
133 pAdapter->HalFunc.BTEfusePowerSwitch(pAdapter, bWrite, PwrState);
136 /*-----------------------------------------------------------------------------
137 * Function: efuse_GetCurrentSize
139 * Overview: Get current efuse size!!!
149 * 11/16/2008 MHC Create Version 0.
151 *---------------------------------------------------------------------------*/
153 Efuse_GetCurrentSize(
154 IN PADAPTER pAdapter,
156 IN BOOLEAN bPseudoTest)
160 ret = pAdapter->HalFunc.EfuseGetCurrentSize(pAdapter, efuseType, bPseudoTest);
165 /* 11/16/2008 MH Add description. Get current efuse area enabled word!!. */
167 Efuse_CalculateWordCnts(IN u8 word_en)
170 if(!(word_en & BIT(0))) word_cnts++; // 0 : write enable
171 if(!(word_en & BIT(1))) word_cnts++;
172 if(!(word_en & BIT(2))) word_cnts++;
173 if(!(word_en & BIT(3))) word_cnts++;
179 // Execute E-Fuse read byte operation.
180 // Refered from SD1 Richard.
183 // 1. Boot from E-Fuse and successfully auto-load.
184 // 2. PASSIVE_LEVEL (USB interface)
186 // Created by Roger, 2008.10.21.
193 IN BOOLEAN bPseudoTest)
198 //u32 start=rtw_get_current_time();
202 Efuse_Read1ByteFromFakeContent(Adapter, _offset, pbuf);
205 if (IS_HARDWARE_TYPE_8723B(Adapter))
207 // <20130121, Kordan> For SMIC S55 EFUSE specificatoin.
208 //0x34[11]: SW force PGMEN input of efuse to high. (for the bank selected by 0x34[9:8])
209 PHY_SetMacReg(Adapter, EFUSE_TEST, BIT11, 0);
212 rtw_write8(Adapter, EFUSE_CTRL+1, (_offset & 0xff));
213 readbyte = rtw_read8(Adapter, EFUSE_CTRL+2);
214 rtw_write8(Adapter, EFUSE_CTRL+2, ((_offset >> 8) & 0x03) | (readbyte & 0xfc));
217 readbyte = rtw_read8(Adapter, EFUSE_CTRL+3);
218 rtw_write8(Adapter, EFUSE_CTRL+3, (readbyte & 0x7f));
220 //Check bit 32 read-ready
222 value32 = rtw_read32(Adapter, EFUSE_CTRL);
223 //while(!(((value32 >> 24) & 0xff) & 0x80) && (retry<10))
224 while(!(((value32 >> 24) & 0xff) & 0x80) && (retry<10000))
226 value32 = rtw_read32(Adapter, EFUSE_CTRL);
230 // 20100205 Joseph: Add delay suggested by SD1 Victor.
231 // This fix the problem that Efuse read error in high temperature condition.
232 // Designer says that there shall be some delay after ready bit is set, or the
233 // result will always stay on last data we read.
235 value32 = rtw_read32(Adapter, EFUSE_CTRL);
237 *pbuf = (u8)(value32 & 0xff);
238 //DBG_871X("ReadEFuseByte _offset:%08u, in %d ms\n",_offset ,rtw_get_passing_time_ms(start));
244 // 1. Execute E-Fuse read byte operation according as map offset and
245 // save to E-Fuse table.
246 // 2. Refered from SD1 Richard.
249 // 1. Boot from E-Fuse and successfully auto-load.
250 // 2. PASSIVE_LEVEL (USB interface)
252 // Created by Roger, 2008.10.21.
254 // 2008/12/12 MH 1. Reorganize code flow and reserve bytes. and add description.
255 // 2. Add efuse utilization collect.
256 // 2008/12/22 MH Read Efuse must check if we write section 1 data again!!! Sec1
257 // write addr must be after sec5.
267 IN BOOLEAN bPseudoTest
276 IN BOOLEAN bPseudoTest
279 Adapter->HalFunc.ReadEFuse(Adapter, efuseType, _offset, _size_byte, pbuf, bPseudoTest);
283 EFUSE_GetEfuseDefinition(
284 IN PADAPTER pAdapter,
288 IN BOOLEAN bPseudoTest
291 pAdapter->HalFunc.EFUSEGetEfuseDefinition(pAdapter, efuseType, type, pOut, bPseudoTest);
294 /*-----------------------------------------------------------------------------
295 * Function: EFUSE_Read1Byte
297 * Overview: Copy from WMAC fot EFUSE read 1 byte.
307 * 09/23/2008 MHC Copy from WMAC.
309 *---------------------------------------------------------------------------*/
316 u8 Bytetemp = {0x00};
321 EFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI , TYPE_EFUSE_REAL_CONTENT_LEN, (PVOID)&contentLen, _FALSE);
323 if (Address < contentLen) //E-fuse 512Byte
325 //Write E-fuse Register address bit0~7
326 temp = Address & 0xFF;
327 rtw_write8(Adapter, EFUSE_CTRL+1, temp);
328 Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+2);
329 //Write E-fuse Register address bit8~9
330 temp = ((Address >> 8) & 0x03) | (Bytetemp & 0xFC);
331 rtw_write8(Adapter, EFUSE_CTRL+2, temp);
334 Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3);
335 temp = Bytetemp & 0x7F;
336 rtw_write8(Adapter, EFUSE_CTRL+3, temp);
338 //Wait Write-ready (0x30[31]=1)
339 Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3);
340 while(!(Bytetemp & 0x80))
342 Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3);
350 data=rtw_read8(Adapter, EFUSE_CTRL);
356 }/* EFUSE_Read1Byte */
358 /*-----------------------------------------------------------------------------
359 * Function: EFUSE_Write1Byte
361 * Overview: Copy from WMAC fot EFUSE write 1 byte.
371 * 09/23/2008 MHC Copy from WMAC.
373 *---------------------------------------------------------------------------*/
386 u8 Bytetemp = {0x00};
391 //RT_TRACE(COMP_EFUSE, DBG_LOUD, ("Addr=%x Data =%x\n", Address, Value));
392 EFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI , TYPE_EFUSE_REAL_CONTENT_LEN, (PVOID)&contentLen, _FALSE);
394 if( Address < contentLen) //E-fuse 512Byte
396 rtw_write8(Adapter, EFUSE_CTRL, Value);
398 //Write E-fuse Register address bit0~7
399 temp = Address & 0xFF;
400 rtw_write8(Adapter, EFUSE_CTRL+1, temp);
401 Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+2);
403 //Write E-fuse Register address bit8~9
404 temp = ((Address >> 8) & 0x03) | (Bytetemp & 0xFC);
405 rtw_write8(Adapter, EFUSE_CTRL+2, temp);
408 Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3);
409 temp = Bytetemp | 0x80;
410 rtw_write8(Adapter, EFUSE_CTRL+3, temp);
412 //Wait Write-ready (0x30[31]=0)
413 Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3);
414 while(Bytetemp & 0x80)
416 Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3);
425 }/* EFUSE_Write1Byte */
428 /* 11/16/2008 MH Read one byte from real Efuse. */
431 IN PADAPTER pAdapter,
434 IN BOOLEAN bPseudoTest)
439 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
441 //DBG_871X("===> EFUSE_OneByteRead(), addr = %x\n", addr);
442 //DBG_871X("===> EFUSE_OneByteRead() start, 0x34 = 0x%X\n", rtw_read32(pAdapter, EFUSE_TEST));
446 bResult = Efuse_Read1ByteFromFakeContent(pAdapter, addr, data);
450 if( IS_HARDWARE_TYPE_8723B(pAdapter) ||
451 (IS_HARDWARE_TYPE_8192E(pAdapter) && (!IS_A_CUT(pHalData->VersionID))) ||
452 //(IS_HARDWARE_TYPE_8188E(pAdapter) && ((IS_I_CUT(pHalData->VersionID)) || (IS_J_CUT(pHalData->VersionID))))
453 (IS_VENDOR_8188E_I_CUT_SERIES(pAdapter))
456 // <20130121, Kordan> For SMIC EFUSE specificatoin.
457 //0x34[11]: SW force PGMEN input of efuse to high. (for the bank selected by 0x34[9:8])
458 //PHY_SetMacReg(pAdapter, 0x34, BIT11, 0);
459 rtw_write16(pAdapter, 0x34, rtw_read16(pAdapter,0x34)& (~BIT11) );
462 // -----------------e-fuse reg ctrl ---------------------------------
464 rtw_write8(pAdapter, EFUSE_CTRL+1, (u8)(addr&0xff));
465 rtw_write8(pAdapter, EFUSE_CTRL+2, ((u8)((addr>>8) &0x03) ) |
466 (rtw_read8(pAdapter, EFUSE_CTRL+2)&0xFC ));
468 //rtw_write8(pAdapter, EFUSE_CTRL+3, 0x72);//read cmd
470 readbyte = rtw_read8(pAdapter, EFUSE_CTRL+3);
471 rtw_write8(pAdapter, EFUSE_CTRL+3, (readbyte & 0x7f));
473 while(!(0x80 &rtw_read8(pAdapter, EFUSE_CTRL+3))&&(tmpidx<1000))
480 *data=rtw_read8(pAdapter, EFUSE_CTRL);
487 DBG_871X("%s: [ERROR] addr=0x%x bResult=%d time out 1s !!!\n", __FUNCTION__, addr, bResult);
488 DBG_871X("%s: [ERROR] EFUSE_CTRL =0x%08x !!!\n", __FUNCTION__, rtw_read32(pAdapter, EFUSE_CTRL));
494 /* 11/16/2008 MH Write one byte to reald Efuse. */
497 IN PADAPTER pAdapter,
500 IN BOOLEAN bPseudoTest)
505 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
507 //DBG_871X("===> EFUSE_OneByteWrite(), addr = %x data=%x\n", addr, data);
508 //DBG_871X("===> EFUSE_OneByteWrite() start, 0x34 = 0x%X\n", rtw_read32(pAdapter, EFUSE_TEST));
512 bResult = Efuse_Write1ByteToFakeContent(pAdapter, addr, data);
517 // -----------------e-fuse reg ctrl ---------------------------------
521 efuseValue = rtw_read32(pAdapter, EFUSE_CTRL);
522 efuseValue |= (BIT21|BIT31);
523 efuseValue &= ~(0x3FFFF);
524 efuseValue |= ((addr<<8 | data) & 0x3FFFF);
527 // <20130227, Kordan> 8192E MP chip A-cut had better not set 0x34[11] until B-Cut.
528 if ( IS_HARDWARE_TYPE_8723B(pAdapter) ||
529 (IS_HARDWARE_TYPE_8192E(pAdapter) && (!IS_A_CUT(pHalData->VersionID))) ||
530 //(IS_HARDWARE_TYPE_8188E(pAdapter) && ((IS_I_CUT(pHalData->VersionID)) || (IS_J_CUT(pHalData->VersionID))))
531 (IS_VENDOR_8188E_I_CUT_SERIES(pAdapter))
534 // <20130121, Kordan> For SMIC EFUSE specificatoin.
535 //0x34[11]: SW force PGMEN input of efuse to high. (for the bank selected by 0x34[9:8])
536 //PHY_SetMacReg(pAdapter, 0x34, BIT11, 1);
537 rtw_write16(pAdapter, 0x34, rtw_read16(pAdapter,0x34)| (BIT11) );
538 rtw_write32(pAdapter, EFUSE_CTRL, 0x90600000|((addr<<8 | data)) );
542 rtw_write32(pAdapter, EFUSE_CTRL, efuseValue);
545 while((0x80 & rtw_read8(pAdapter, EFUSE_CTRL+3)) && (tmpidx<100) ){
557 DBG_871X("%s: [ERROR] addr=0x%x ,efuseValue=0x%x ,bResult=%d time out 1s !!! \n",
558 __FUNCTION__, addr, efuseValue, bResult);
559 DBG_871X("%s: [ERROR] EFUSE_CTRL =0x%08x !!!\n", __FUNCTION__, rtw_read32(pAdapter, EFUSE_CTRL));
562 // disable Efuse program enable
563 if ( IS_HARDWARE_TYPE_8723B(pAdapter) ||
564 (IS_HARDWARE_TYPE_8192E(pAdapter) && (!IS_A_CUT(pHalData->VersionID))) ||
565 //(IS_HARDWARE_TYPE_8188E(pAdapter) && ((IS_I_CUT(pHalData->VersionID)) || (IS_J_CUT(pHalData->VersionID))))
566 (IS_VENDOR_8188E_I_CUT_SERIES(pAdapter))
569 PHY_SetMacReg(pAdapter, EFUSE_TEST, BIT(11), 0);
576 Efuse_PgPacketRead( IN PADAPTER pAdapter,
579 IN BOOLEAN bPseudoTest)
583 ret = pAdapter->HalFunc.Efuse_PgPacketRead(pAdapter, offset, data, bPseudoTest);
589 Efuse_PgPacketWrite(IN PADAPTER pAdapter,
593 IN BOOLEAN bPseudoTest)
597 ret = pAdapter->HalFunc.Efuse_PgPacketWrite(pAdapter, offset, word_en, data, bPseudoTest);
604 Efuse_PgPacketWrite_BT(IN PADAPTER pAdapter,
608 IN BOOLEAN bPseudoTest)
612 ret = pAdapter->HalFunc.Efuse_PgPacketWrite_BT(pAdapter, offset, word_en, data, bPseudoTest);
617 /*-----------------------------------------------------------------------------
618 * Function: efuse_WordEnableDataRead
620 * Overview: Read allowed word in current efuse section data.
630 * 11/16/2008 MHC Create Version 0.
631 * 11/21/2008 MHC Fix Write bug when we only enable late word.
633 *---------------------------------------------------------------------------*/
635 efuse_WordEnableDataRead(IN u8 word_en,
639 if (!(word_en&BIT(0)))
641 targetdata[0] = sourdata[0];
642 targetdata[1] = sourdata[1];
644 if (!(word_en&BIT(1)))
646 targetdata[2] = sourdata[2];
647 targetdata[3] = sourdata[3];
649 if (!(word_en&BIT(2)))
651 targetdata[4] = sourdata[4];
652 targetdata[5] = sourdata[5];
654 if (!(word_en&BIT(3)))
656 targetdata[6] = sourdata[6];
657 targetdata[7] = sourdata[7];
663 Efuse_WordEnableDataWrite( IN PADAPTER pAdapter,
667 IN BOOLEAN bPseudoTest)
671 ret = pAdapter->HalFunc.Efuse_WordEnableDataWrite(pAdapter, efuse_addr, word_en, data, bPseudoTest);
676 static u8 efuse_read8(PADAPTER padapter, u16 address, u8 *value)
678 return efuse_OneByteRead(padapter,address, value, _FALSE);
681 static u8 efuse_write8(PADAPTER padapter, u16 address, u8 *value)
683 return efuse_OneByteWrite(padapter,address, *value, _FALSE);
687 * read/wirte raw efuse data
689 u8 rtw_efuse_access(PADAPTER padapter, u8 bWrite, u16 start_addr, u16 cnts, u8 *data)
692 u16 real_content_len = 0, max_available_size = 0;
694 u8 (*rw8)(PADAPTER, u16, u8*);
696 EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_REAL_CONTENT_LEN, (PVOID)&real_content_len, _FALSE);
697 EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE);
699 if (start_addr > real_content_len)
702 if (_TRUE == bWrite) {
703 if ((start_addr + cnts) > max_available_size)
709 Efuse_PowerSwitch(padapter, bWrite, _TRUE);
711 // e-fuse one byte read / write
712 for (i = 0; i < cnts; i++) {
713 if (start_addr >= real_content_len) {
718 res = rw8(padapter, start_addr++, data++);
719 if (_FAIL == res) break;
722 Efuse_PowerSwitch(padapter, bWrite, _FALSE);
726 //------------------------------------------------------------------------------
727 u16 efuse_GetMaxSize(PADAPTER padapter)
732 EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI , TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_size, _FALSE);
735 //------------------------------------------------------------------------------
736 u8 efuse_GetCurrentSize(PADAPTER padapter, u16 *size)
738 Efuse_PowerSwitch(padapter, _FALSE, _TRUE);
739 *size = Efuse_GetCurrentSize(padapter, EFUSE_WIFI, _FALSE);
740 Efuse_PowerSwitch(padapter, _FALSE, _FALSE);
744 //------------------------------------------------------------------------------
745 u8 rtw_efuse_map_read(PADAPTER padapter, u16 addr, u16 cnts, u8 *data)
749 EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, _FALSE);
751 if ((addr + cnts) > mapLen)
754 Efuse_PowerSwitch(padapter, _FALSE, _TRUE);
756 efuse_ReadEFuse(padapter, EFUSE_WIFI, addr, cnts, data, _FALSE);
758 Efuse_PowerSwitch(padapter, _FALSE, _FALSE);
763 u8 rtw_BT_efuse_map_read(PADAPTER padapter, u16 addr, u16 cnts, u8 *data)
767 EFUSE_GetEfuseDefinition(padapter, EFUSE_BT, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, _FALSE);
769 if ((addr + cnts) > mapLen)
772 Efuse_PowerSwitch(padapter, _FALSE, _TRUE);
774 efuse_ReadEFuse(padapter, EFUSE_BT, addr, cnts, data, _FALSE);
776 Efuse_PowerSwitch(padapter, _FALSE, _FALSE);
781 BOOLEAN rtw_file_efuse_IsMasked(
787 int c = (Offset%16) / 2;
790 if(pAdapter->registrypriv.boffefusemask)
793 //DBG_871X(" %s ,Offset=%x r= %d , c=%d , maskfileBuffer[r]= %x \n",__func__,Offset,r,c,maskfileBuffer[r]);
794 if (c < 4) // Upper double word
795 result = (maskfileBuffer[r] & (0x10 << c));
797 result = (maskfileBuffer[r] & (0x01 << (c-4)));
799 return (result > 0) ? 0 : 1;
804 u8 rtw_efuse_file_read(PADAPTER padapter,u8 *filepatch,u8 *buf,u32 len)
809 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
811 ptmpbuf = rtw_zmalloc(2048);
816 _rtw_memset(ptmpbuf,'\0',2048);
818 rtStatus = rtw_retrive_from_file(filepatch, ptmpbuf, 2048);
823 for(i=0,j=0;j<len;i+=2,j++)
825 if (( ptmpbuf[i] == ' ' ) && (ptmpbuf[i+1] != '\n' && ptmpbuf[i+1] != '\0')) {
828 if( (ptmpbuf[i+1] != '\n' && ptmpbuf[i+1] != '\0'))
830 buf[j] = simple_strtoul(&ptmpbuf[i],&ptmp, 16);
831 DBG_871X(" i=%d,j=%d, %x \n",i,j,buf[j]);
840 DBG_871X(" %s ,filepatch %s , FAIL %d\n", __func__, filepatch, rtStatus);
843 rtw_mfree(ptmpbuf, 2048);
844 DBG_871X(" %s ,filepatch %s , done %d\n", __func__, filepatch, rtStatus);
855 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
858 //if (bEfuseMaskOFF(pAdapter))
859 if(pAdapter->registrypriv.boffefusemask)
862 #if DEV_BUS_TYPE == RT_USB_INTERFACE
863 #if defined(CONFIG_RTL8188E)
864 if (IS_HARDWARE_TYPE_8188E(pAdapter))
865 return (IS_MASKED(8188E,_MUSB,Offset)) ? TRUE : FALSE;
867 #if defined(CONFIG_RTL8812A)
868 if (IS_HARDWARE_TYPE_8812(pAdapter))
869 return (IS_MASKED(8812A,_MUSB,Offset)) ? TRUE : FALSE;
871 #if defined(CONFIG_RTL8821A)
872 //if (IS_HARDWARE_TYPE_8811AU(pAdapter))
873 // return (IS_MASKED(8811A,_MUSB,Offset)) ? TRUE : FALSE;
874 if (IS_HARDWARE_TYPE_8821(pAdapter))
875 return (IS_MASKED(8821A,_MUSB,Offset)) ? TRUE : FALSE;
877 #if defined(CONFIG_RTL8192E)
878 if (IS_HARDWARE_TYPE_8192E(pAdapter))
879 return (IS_MASKED(8192E,_MUSB,Offset)) ? TRUE : FALSE;
881 #if defined(CONFIG_RTL8723B)
882 if (IS_HARDWARE_TYPE_8723B(pAdapter))
883 return (IS_MASKED(8723B,_MUSB,Offset)) ? TRUE : FALSE;
885 #if defined(CONFIG_RTL8814A)
886 if (IS_HARDWARE_TYPE_8814A(pAdapter))
887 return (IS_MASKED(8814A, _MUSB, Offset)) ? TRUE : FALSE;
889 #elif DEV_BUS_TYPE == RT_PCI_INTERFACE
890 #if defined(CONFIG_RTL8188E)
891 if (IS_HARDWARE_TYPE_8188E(pAdapter))
892 return (IS_MASKED(8188E,_MPCIE,Offset)) ? TRUE : FALSE;
894 #if defined(CONFIG_RTL8192E)
895 if (IS_HARDWARE_TYPE_8192E(pAdapter))
896 return (IS_MASKED(8192E,_MPCIE,Offset)) ? TRUE : FALSE;
898 #if defined(CONFIG_RTL8812A)
899 if (IS_HARDWARE_TYPE_8812(pAdapter))
900 return (IS_MASKED(8812A,_MPCIE,Offset)) ? TRUE : FALSE;
902 #if defined(CONFIG_RTL8821A)
903 if (IS_HARDWARE_TYPE_8821(pAdapter))
904 return (IS_MASKED(8821A,_MPCIE,Offset)) ? TRUE : FALSE;
906 #if defined(CONFIG_RTL8723B)
907 if (IS_HARDWARE_TYPE_8723B(pAdapter))
908 return (IS_MASKED(8723B,_MPCIE,Offset)) ? TRUE : FALSE;
910 #if defined(CONFIG_RTL8814A)
911 if (IS_HARDWARE_TYPE_8814A(pAdapter))
912 return (IS_MASKED(8814A, _MPCIE, Offset)) ? TRUE : FALSE;
914 //else if (IS_HARDWARE_TYPE_8821B(pAdapter))
915 // return (IS_MASKED(8821B,_MPCIE,Offset)) ? TRUE : FALSE;
917 #elif DEV_BUS_TYPE == RT_SDIO_INTERFACE
918 #ifdef CONFIG_RTL8188E_SDIO
919 if (IS_HARDWARE_TYPE_8188E(pAdapter))
920 return (IS_MASKED(8188E,_MSDIO,Offset)) ? TRUE : FALSE;
927 //------------------------------------------------------------------------------
928 u8 rtw_efuse_map_write(PADAPTER padapter, u16 addr, u16 cnts, u8 *data)
930 #define RT_ASSERT_RET(expr) \
932 printk( "Assertion failed! %s at ......\n", #expr); \
933 printk( " ......%s,%s,line=%d\n",__FILE__,__FUNCTION__,__LINE__); \
939 u8 newdata[PGPKT_DATA_SIZE];
943 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
945 EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, _FALSE);
947 if ((addr + cnts) > mapLen)
950 RT_ASSERT_RET(PGPKT_DATA_SIZE == 8); // have to be 8 byte alignment
951 RT_ASSERT_RET((mapLen & 0x7) == 0); // have to be PGPKT_DATA_SIZE alignment for memcpy
953 map = rtw_zmalloc(mapLen);
958 _rtw_memset(map, 0xFF, mapLen);
960 ret = rtw_efuse_map_read(padapter, 0, mapLen, map);
961 if (ret == _FAIL) goto exit;
963 if(padapter->registrypriv.boffefusemask==0)
965 for (i =0; i < cnts; i++)
967 if(padapter->registrypriv.bFileMaskEfuse==_TRUE)
969 if (rtw_file_efuse_IsMasked(padapter, addr+i)) /*use file efuse mask. */
970 data[i] = map[addr+i];
974 if ( efuse_IsMasked(padapter, addr+i ))
975 data[i] = map[addr+i];
977 DBG_8192C("%s , data[%d] = %x, map[addr+i]= %x\n", __func__, i, data[i], map[addr+i]);
980 Efuse_PowerSwitch(padapter, _TRUE, _TRUE);
983 offset = (addr >> 3);
987 j = (addr + idx) & 0x7;
988 _rtw_memcpy(newdata, &map[offset << 3], PGPKT_DATA_SIZE);
989 for (i = j; i<PGPKT_DATA_SIZE && idx < cnts; i++, idx++)
991 if (data[idx] != map[addr + idx])
993 word_en &= ~BIT(i >> 1);
994 newdata[i] = data[idx];
995 #ifdef CONFIG_RTL8723B
996 if( addr + idx == 0x8)
998 if (IS_C_CUT(pHalData->VersionID) || IS_B_CUT(pHalData->VersionID))
1000 if(pHalData->adjuseVoltageVal == 6)
1002 newdata[i] = map[addr + idx];
1003 DBG_8192C(" %s ,\n adjuseVoltageVal = %d ,newdata[%d] = %x \n",__func__,pHalData->adjuseVoltageVal,i,newdata[i]);
1011 if (word_en != 0xF) {
1012 ret = Efuse_PgPacketWrite(padapter, offset, word_en, newdata, _FALSE);
1013 DBG_871X("offset=%x \n",offset);
1014 DBG_871X("word_en=%x \n",word_en);
1016 for(i=0;i<PGPKT_DATA_SIZE;i++)
1018 DBG_871X("data=%x \t",newdata[i]);
1020 if (ret == _FAIL) break;
1026 Efuse_PowerSwitch(padapter, _TRUE, _FALSE);
1030 rtw_mfree(map, mapLen);
1035 u8 rtw_efuse_mask_map_read(PADAPTER padapter, u16 addr, u16 cnts, u8 *data)
1038 u16 mapLen = 0, i = 0;
1040 EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, _FALSE);
1042 ret = rtw_efuse_map_read(padapter, 0, mapLen, data);
1044 if (padapter->registrypriv.boffefusemask == 0) {
1046 for (i = 0; i < cnts; i++) {
1047 if (padapter->registrypriv.bFileMaskEfuse == _TRUE) {
1048 if (rtw_file_efuse_IsMasked(padapter, addr+i)) /*use file efuse mask.*/
1051 /*DBG_8192C(" %s , data[%d] = %x\n", __func__, i, data[i]);*/
1052 if (efuse_IsMasked(padapter, addr+i)) {
1054 /*DBG_8192C(" %s ,mask data[%d] = %x\n", __func__, i, data[i]);*/
1064 u8 rtw_BT_efuse_map_write(PADAPTER padapter, u16 addr, u16 cnts, u8 *data)
1066 #define RT_ASSERT_RET(expr) \
1068 printk( "Assertion failed! %s at ......\n", #expr); \
1069 printk( " ......%s,%s,line=%d\n",__FILE__,__FUNCTION__,__LINE__); \
1075 u8 newdata[PGPKT_DATA_SIZE];
1080 EFUSE_GetEfuseDefinition(padapter, EFUSE_BT, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, _FALSE);
1082 if ((addr + cnts) > mapLen)
1085 RT_ASSERT_RET(PGPKT_DATA_SIZE == 8); // have to be 8 byte alignment
1086 RT_ASSERT_RET((mapLen & 0x7) == 0); // have to be PGPKT_DATA_SIZE alignment for memcpy
1088 map = rtw_zmalloc(mapLen);
1093 ret = rtw_BT_efuse_map_read(padapter, 0, mapLen, map);
1094 if (ret == _FAIL) goto exit;
1095 DBG_871X("OFFSET\tVALUE(hex)\n");
1096 for (i=0; i<1024; i+=16) // set 512 because the iwpriv's extra size have limit 0x7FF
1098 DBG_871X("0x%03x\t", i);
1099 for (j=0; j<8; j++) {
1100 DBG_871X("%02X ", map[i+j]);
1104 DBG_871X("%02X ", map[i+j]);
1109 Efuse_PowerSwitch(padapter, _TRUE, _TRUE);
1112 offset = (addr >> 3);
1116 j = (addr + idx) & 0x7;
1117 _rtw_memcpy(newdata, &map[offset << 3], PGPKT_DATA_SIZE);
1118 for (i = j; i<PGPKT_DATA_SIZE && idx < cnts; i++, idx++)
1120 if (data[idx] != map[addr + idx])
1122 word_en &= ~BIT(i >> 1);
1123 newdata[i] = data[idx];
1127 if (word_en != 0xF) {
1128 DBG_871X("offset=%x \n",offset);
1129 DBG_871X("word_en=%x \n",word_en);
1130 DBG_871X("%s: data=", __FUNCTION__);
1131 for(i=0;i<PGPKT_DATA_SIZE;i++)
1133 DBG_871X("0x%02X ", newdata[i]);
1136 ret = Efuse_PgPacketWrite_BT(padapter, offset, word_en, newdata, _FALSE);
1137 if (ret == _FAIL) break;
1143 Efuse_PowerSwitch(padapter, _TRUE, _FALSE);
1147 rtw_mfree(map, mapLen);
1152 /*-----------------------------------------------------------------------------
1153 * Function: Efuse_ReadAllMap
1155 * Overview: Read All Efuse content
1165 * 11/11/2008 MHC Create Version 0.
1167 *---------------------------------------------------------------------------*/
1170 IN PADAPTER pAdapter,
1173 IN BOOLEAN bPseudoTest);
1176 IN PADAPTER pAdapter,
1179 IN BOOLEAN bPseudoTest)
1183 Efuse_PowerSwitch(pAdapter,_FALSE, _TRUE);
1185 EFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, bPseudoTest);
1187 efuse_ReadEFuse(pAdapter, efuseType, 0, mapLen, Efuse, bPseudoTest);
1189 Efuse_PowerSwitch(pAdapter,_FALSE, _FALSE);
1192 /*-----------------------------------------------------------------------------
1193 * Function: efuse_ShadowRead1Byte
1194 * efuse_ShadowRead2Byte
1195 * efuse_ShadowRead4Byte
1197 * Overview: Read from efuse init map by one/two/four bytes !!!!!
1207 * 11/12/2008 MHC Create Version 0.
1209 *---------------------------------------------------------------------------*/
1211 efuse_ShadowRead1Byte(
1212 IN PADAPTER pAdapter,
1216 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter);
1218 *Value = pHalData->efuse_eeprom_data[Offset];
1220 } // EFUSE_ShadowRead1Byte
1222 //---------------Read Two Bytes
1224 efuse_ShadowRead2Byte(
1225 IN PADAPTER pAdapter,
1229 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter);
1231 *Value = pHalData->efuse_eeprom_data[Offset];
1232 *Value |= pHalData->efuse_eeprom_data[Offset+1]<<8;
1234 } // EFUSE_ShadowRead2Byte
1236 //---------------Read Four Bytes
1238 efuse_ShadowRead4Byte(
1239 IN PADAPTER pAdapter,
1243 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter);
1245 *Value = pHalData->efuse_eeprom_data[Offset];
1246 *Value |= pHalData->efuse_eeprom_data[Offset+1]<<8;
1247 *Value |= pHalData->efuse_eeprom_data[Offset+2]<<16;
1248 *Value |= pHalData->efuse_eeprom_data[Offset+3]<<24;
1250 } // efuse_ShadowRead4Byte
1253 /*-----------------------------------------------------------------------------
1254 * Function: efuse_ShadowWrite1Byte
1255 * efuse_ShadowWrite2Byte
1256 * efuse_ShadowWrite4Byte
1258 * Overview: Write efuse modify map by one/two/four byte.
1268 * 11/12/2008 MHC Create Version 0.
1270 *---------------------------------------------------------------------------*/
1273 efuse_ShadowWrite1Byte(
1274 IN PADAPTER pAdapter,
1279 efuse_ShadowWrite1Byte(
1280 IN PADAPTER pAdapter,
1284 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter);
1286 pHalData->efuse_eeprom_data[Offset] = Value;
1288 } // efuse_ShadowWrite1Byte
1290 //---------------Write Two Bytes
1292 efuse_ShadowWrite2Byte(
1293 IN PADAPTER pAdapter,
1298 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter);
1301 pHalData->efuse_eeprom_data[Offset] = Value&0x00FF;
1302 pHalData->efuse_eeprom_data[Offset+1] = Value>>8;
1304 } // efuse_ShadowWrite1Byte
1306 //---------------Write Four Bytes
1308 efuse_ShadowWrite4Byte(
1309 IN PADAPTER pAdapter,
1313 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter);
1315 pHalData->efuse_eeprom_data[Offset] = (u8)(Value&0x000000FF);
1316 pHalData->efuse_eeprom_data[Offset+1] = (u8)((Value>>8)&0x0000FF);
1317 pHalData->efuse_eeprom_data[Offset+2] = (u8)((Value>>16)&0x00FF);
1318 pHalData->efuse_eeprom_data[Offset+3] = (u8)((Value>>24)&0xFF);
1320 } // efuse_ShadowWrite1Byte
1322 /*-----------------------------------------------------------------------------
1323 * Function: EFUSE_ShadowMapUpdate
1325 * Overview: Transfer current EFUSE content to shadow init and modify map.
1335 * 11/13/2008 MHC Create Version 0.
1337 *---------------------------------------------------------------------------*/
1338 void EFUSE_ShadowMapUpdate(
1339 IN PADAPTER pAdapter,
1341 IN BOOLEAN bPseudoTest)
1343 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter);
1346 EFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, bPseudoTest);
1348 if (pHalData->bautoload_fail_flag == _TRUE)
1350 _rtw_memset(pHalData->efuse_eeprom_data, 0xFF, mapLen);
1354 #ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE
1355 if(_SUCCESS != retriveAdaptorInfoFile(pAdapter->registrypriv.adaptor_info_caching_file_path, pHalData->efuse_eeprom_data)) {
1358 Efuse_ReadAllMap(pAdapter, efuseType, pHalData->efuse_eeprom_data, bPseudoTest);
1360 #ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE
1361 storeAdaptorInfoFile(pAdapter->registrypriv.adaptor_info_caching_file_path, pHalData->efuse_eeprom_data);
1366 //PlatformMoveMemory((PVOID)&pHalData->EfuseMap[EFUSE_MODIFY_MAP][0],
1367 //(PVOID)&pHalData->EfuseMap[EFUSE_INIT_MAP][0], mapLen);
1368 }// EFUSE_ShadowMapUpdate
1371 /*-----------------------------------------------------------------------------
1372 * Function: EFUSE_ShadowRead
1374 * Overview: Read from efuse init map !!!!!
1384 * 11/12/2008 MHC Create Version 0.
1386 *---------------------------------------------------------------------------*/
1389 IN PADAPTER pAdapter,
1395 efuse_ShadowRead1Byte(pAdapter, Offset, (u8 *)Value);
1397 efuse_ShadowRead2Byte(pAdapter, Offset, (u16 *)Value);
1399 efuse_ShadowRead4Byte(pAdapter, Offset, (u32 *)Value);
1401 } // EFUSE_ShadowRead
1403 /*-----------------------------------------------------------------------------
1404 * Function: EFUSE_ShadowWrite
1406 * Overview: Write efuse modify map for later update operation to use!!!!!
1416 * 11/12/2008 MHC Create Version 0.
1418 *---------------------------------------------------------------------------*/
1421 IN PADAPTER pAdapter,
1427 IN PADAPTER pAdapter,
1432 #if (MP_DRIVER == 0)
1435 if ( pAdapter->registrypriv.mp_mode == 0)
1440 efuse_ShadowWrite1Byte(pAdapter, Offset, (u8)Value);
1442 efuse_ShadowWrite2Byte(pAdapter, Offset, (u16)Value);
1444 efuse_ShadowWrite4Byte(pAdapter, Offset, (u32)Value);
1446 } // EFUSE_ShadowWrite
1450 IN PADAPTER pAdapter
1454 IN PADAPTER pAdapter
1459 _rtw_memset((PVOID)&fakeEfuseContent[0], 0xff, EFUSE_MAX_HW_SIZE);
1460 _rtw_memset((PVOID)&fakeEfuseInitMap[0], 0xff, EFUSE_MAX_MAP_LEN);
1461 _rtw_memset((PVOID)&fakeEfuseModifiedMap[0], 0xff, EFUSE_MAX_MAP_LEN);
1463 for(i=0; i<EFUSE_MAX_BT_BANK; i++)
1465 _rtw_memset((PVOID)&BTEfuseContent[i][0], EFUSE_MAX_HW_SIZE, 0xff);
1467 _rtw_memset((PVOID)&BTEfuseInitMap[0], 0xff, EFUSE_BT_MAX_MAP_LEN);
1468 _rtw_memset((PVOID)&BTEfuseModifiedMap[0], 0xff, EFUSE_BT_MAX_MAP_LEN);
1470 for(i=0; i<EFUSE_MAX_BT_BANK; i++)
1472 _rtw_memset((PVOID)&fakeBTEfuseContent[i][0], 0xff, EFUSE_MAX_HW_SIZE);
1474 _rtw_memset((PVOID)&fakeBTEfuseInitMap[0], 0xff, EFUSE_BT_MAX_MAP_LEN);
1475 _rtw_memset((PVOID)&fakeBTEfuseModifiedMap[0], 0xff, EFUSE_BT_MAX_MAP_LEN);
1478 #ifdef PLATFORM_LINUX
1479 #ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE
1480 //#include <rtw_eeprom.h>
1482 int isAdaptorInfoFileValid(void)
1487 int storeAdaptorInfoFile(char *path, u8* efuse_data)
1491 if(path && efuse_data) {
1492 ret = rtw_store_to_file(path, efuse_data, EEPROM_MAX_SIZE_512);
1493 if(ret == EEPROM_MAX_SIZE)
1498 DBG_871X("%s NULL pointer\n",__FUNCTION__);
1504 int retriveAdaptorInfoFile(char *path, u8* efuse_data)
1510 if(path && efuse_data) {
1512 ret = rtw_retrive_from_file(path, efuse_data, EEPROM_MAX_SIZE);
1514 if(ret == EEPROM_MAX_SIZE)
1520 if(isAdaptorInfoFileValid()) {
1528 DBG_871X("%s NULL pointer\n",__FUNCTION__);
1533 #endif //CONFIG_ADAPTOR_INFO_CACHING_FILE
1534 #endif //PLATFORM_LINUX
1536 #ifdef CONFIG_EFUSE_CONFIG_FILE
1538 void Rtw_Hal_ReadMACAddrFromFile(PADAPTER padapter)
1545 u32 curtime = rtw_get_current_time();
1546 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
1549 u8 null_mac_addr[ETH_ALEN] = {0, 0, 0,0, 0, 0};
1550 u8 multi_mac_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
1552 _rtw_memset(source_addr, 0, 18);
1553 _rtw_memset(pHalData->EEPROMMACAddr, 0, ETH_ALEN);
1555 fp = filp_open("/data/wifimac.txt", O_RDWR, 0644);
1557 pHalData->bloadmac_fail_flag = _TRUE;
1558 DBG_871X("Error, wifi mac address file doesn't exist.\n");
1563 DBG_871X("wifi mac address:\n");
1564 vfs_read(fp, source_addr, 18, &pos);
1565 source_addr[17] = ':';
1567 head = end = source_addr;
1568 for (i=0; i<ETH_ALEN; i++) {
1569 while (end && (*end != ':') )
1572 if (end && (*end == ':') )
1575 pHalData->EEPROMMACAddr[i] = simple_strtoul(head, NULL, 16 );
1581 DBG_871X("%02x \n", pHalData->EEPROMMACAddr[i]);
1585 pHalData->bloadmac_fail_flag = _FALSE;
1586 filp_close(fp, NULL);
1589 if ( (_rtw_memcmp(pHalData->EEPROMMACAddr, null_mac_addr, ETH_ALEN)) ||
1590 (_rtw_memcmp(pHalData->EEPROMMACAddr, multi_mac_addr, ETH_ALEN)) ) {
1591 pHalData->EEPROMMACAddr[0] = 0x00;
1592 pHalData->EEPROMMACAddr[1] = 0xe0;
1593 pHalData->EEPROMMACAddr[2] = 0x4c;
1594 pHalData->EEPROMMACAddr[3] = (u8)(curtime & 0xff) ;
1595 pHalData->EEPROMMACAddr[4] = (u8)((curtime>>8) & 0xff) ;
1596 pHalData->EEPROMMACAddr[5] = (u8)((curtime>>16) & 0xff) ;
1599 DBG_871X("Hal_ReadMACAddrFromFile: Permanent Address = %02x-%02x-%02x-%02x-%02x-%02x !!!\n",
1600 pHalData->EEPROMMACAddr[0], pHalData->EEPROMMACAddr[1],
1601 pHalData->EEPROMMACAddr[2], pHalData->EEPROMMACAddr[3],
1602 pHalData->EEPROMMACAddr[4], pHalData->EEPROMMACAddr[5]);
1606 u32 Rtw_Hal_readPGDataFromConfigFile(PADAPTER padapter)
1613 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
1614 u8 *PROMContent = pHalData->efuse_eeprom_data;
1617 temp[2] = 0; // add end of string '\0'
1619 fp = filp_open("/system/etc/wifi/wifi_efuse.map", O_RDWR, 0644);
1621 pHalData->bloadfile_fail_flag = _TRUE;
1622 DBG_871X("Error, Efuse configure file doesn't exist.\n");
1629 DBG_871X("Efuse configure file:\n");
1630 for (i=0; i< EFUSE_MAP_SIZE ; i++) {
1631 vfs_read(fp, temp, 2, &pos);
1632 PROMContent[i] = simple_strtoul(temp, NULL, 16 );
1633 pos += 1; // Filter the space character
1634 DBG_871X("%02X \n", PROMContent[i]);
1639 filp_close(fp, NULL);
1641 pHalData->bloadfile_fail_flag = _FALSE;
1646 #endif //#CONFIG_EFUSE_CONFIG_FILE