12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325 |
- /******************************************************************************
- *
- * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of version 2 of the GNU General Public License as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
- *
- *
- ******************************************************************************/
- #define _RTW_EFUSE_C_
- #include <drv_types.h>
- /*------------------------Define local variable------------------------------*/
- u8 fakeEfuseBank=0;
- u32 fakeEfuseUsedBytes=0;
- u8 fakeEfuseContent[EFUSE_MAX_HW_SIZE]={0};
- u8 fakeEfuseInitMap[EFUSE_MAX_MAP_LEN]={0};
- u8 fakeEfuseModifiedMap[EFUSE_MAX_MAP_LEN]={0};
- u32 BTEfuseUsedBytes=0;
- u8 BTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE];
- u8 BTEfuseInitMap[EFUSE_BT_MAX_MAP_LEN]={0};
- u8 BTEfuseModifiedMap[EFUSE_BT_MAX_MAP_LEN]={0};
- 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};
- /*------------------------Define local variable------------------------------*/
- //------------------------------------------------------------------------------
- #define REG_EFUSE_CTRL 0x0030
- #define EFUSE_CTRL REG_EFUSE_CTRL // E-Fuse Control.
- //------------------------------------------------------------------------------
- BOOLEAN
- Efuse_Read1ByteFromFakeContent(
- IN PADAPTER pAdapter,
- IN u16 Offset,
- IN OUT u8 *Value );
- BOOLEAN
- Efuse_Read1ByteFromFakeContent(
- IN PADAPTER pAdapter,
- IN u16 Offset,
- IN OUT u8 *Value )
- {
- if(Offset >= EFUSE_MAX_HW_SIZE)
- {
- return _FALSE;
- }
- //DbgPrint("Read fake content, offset = %d\n", Offset);
- if(fakeEfuseBank == 0)
- *Value = fakeEfuseContent[Offset];
- else
- *Value = fakeBTEfuseContent[fakeEfuseBank-1][Offset];
- return _TRUE;
- }
- BOOLEAN
- Efuse_Write1ByteToFakeContent(
- IN PADAPTER pAdapter,
- IN u16 Offset,
- IN u8 Value );
- BOOLEAN
- Efuse_Write1ByteToFakeContent(
- IN PADAPTER pAdapter,
- IN u16 Offset,
- IN u8 Value )
- {
- if(Offset >= EFUSE_MAX_HW_SIZE)
- {
- return _FALSE;
- }
- if(fakeEfuseBank == 0)
- fakeEfuseContent[Offset] = Value;
- else
- {
- fakeBTEfuseContent[fakeEfuseBank-1][Offset] = Value;
- }
- return _TRUE;
- }
- /*-----------------------------------------------------------------------------
- * Function: Efuse_PowerSwitch
- *
- * Overview: When we want to enable write operation, we should change to
- * pwr on state. When we stop write, we should switch to 500k mode
- * and disable LDO 2.5V.
- *
- * Input: NONE
- *
- * Output: NONE
- *
- * Return: NONE
- *
- * Revised History:
- * When Who Remark
- * 11/17/2008 MHC Create Version 0.
- *
- *---------------------------------------------------------------------------*/
- VOID
- Efuse_PowerSwitch(
- IN PADAPTER pAdapter,
- IN u8 bWrite,
- IN u8 PwrState)
- {
- pAdapter->HalFunc.EfusePowerSwitch(pAdapter, bWrite, PwrState);
- }
- /*-----------------------------------------------------------------------------
- * Function: efuse_GetCurrentSize
- *
- * Overview: Get current efuse size!!!
- *
- * Input: NONE
- *
- * Output: NONE
- *
- * Return: NONE
- *
- * Revised History:
- * When Who Remark
- * 11/16/2008 MHC Create Version 0.
- *
- *---------------------------------------------------------------------------*/
- u16
- Efuse_GetCurrentSize(
- IN PADAPTER pAdapter,
- IN u8 efuseType,
- IN BOOLEAN bPseudoTest)
- {
- u16 ret=0;
- ret = pAdapter->HalFunc.EfuseGetCurrentSize(pAdapter, efuseType, bPseudoTest);
- return ret;
- }
- /* 11/16/2008 MH Add description. Get current efuse area enabled word!!. */
- u8
- Efuse_CalculateWordCnts(IN u8 word_en)
- {
- u8 word_cnts = 0;
- if(!(word_en & BIT(0))) word_cnts++; // 0 : write enable
- if(!(word_en & BIT(1))) word_cnts++;
- if(!(word_en & BIT(2))) word_cnts++;
- if(!(word_en & BIT(3))) word_cnts++;
- return word_cnts;
- }
- //
- // Description:
- // Execute E-Fuse read byte operation.
- // Refered from SD1 Richard.
- //
- // Assumption:
- // 1. Boot from E-Fuse and successfully auto-load.
- // 2. PASSIVE_LEVEL (USB interface)
- //
- // Created by Roger, 2008.10.21.
- //
- VOID
- ReadEFuseByte(
- PADAPTER Adapter,
- u16 _offset,
- u8 *pbuf,
- IN BOOLEAN bPseudoTest)
- {
- u32 value32;
- u8 readbyte;
- u16 retry;
- //u32 start=rtw_get_current_time();
- if(bPseudoTest)
- {
- Efuse_Read1ByteFromFakeContent(Adapter, _offset, pbuf);
- return;
- }
- //Write Address
- rtw_write8(Adapter, EFUSE_CTRL+1, (_offset & 0xff));
- readbyte = rtw_read8(Adapter, EFUSE_CTRL+2);
- rtw_write8(Adapter, EFUSE_CTRL+2, ((_offset >> 8) & 0x03) | (readbyte & 0xfc));
- //Write bit 32 0
- readbyte = rtw_read8(Adapter, EFUSE_CTRL+3);
- rtw_write8(Adapter, EFUSE_CTRL+3, (readbyte & 0x7f));
-
- //Check bit 32 read-ready
- retry = 0;
- value32 = rtw_read32(Adapter, EFUSE_CTRL);
- //while(!(((value32 >> 24) & 0xff) & 0x80) && (retry<10))
- while(!(((value32 >> 24) & 0xff) & 0x80) && (retry<10000))
- {
- value32 = rtw_read32(Adapter, EFUSE_CTRL);
- retry++;
- }
- // 20100205 Joseph: Add delay suggested by SD1 Victor.
- // This fix the problem that Efuse read error in high temperature condition.
- // Designer says that there shall be some delay after ready bit is set, or the
- // result will always stay on last data we read.
- rtw_udelay_os(50);
- value32 = rtw_read32(Adapter, EFUSE_CTRL);
-
- *pbuf = (u8)(value32 & 0xff);
- //DBG_871X("ReadEFuseByte _offset:%08u, in %d ms\n",_offset ,rtw_get_passing_time_ms(start));
-
- }
- //
- // Description:
- // 1. Execute E-Fuse read byte operation according as map offset and
- // save to E-Fuse table.
- // 2. Refered from SD1 Richard.
- //
- // Assumption:
- // 1. Boot from E-Fuse and successfully auto-load.
- // 2. PASSIVE_LEVEL (USB interface)
- //
- // Created by Roger, 2008.10.21.
- //
- // 2008/12/12 MH 1. Reorganize code flow and reserve bytes. and add description.
- // 2. Add efuse utilization collect.
- // 2008/12/22 MH Read Efuse must check if we write section 1 data again!!! Sec1
- // write addr must be after sec5.
- //
- VOID
- efuse_ReadEFuse(
- PADAPTER Adapter,
- u8 efuseType,
- u16 _offset,
- u16 _size_byte,
- u8 *pbuf,
- IN BOOLEAN bPseudoTest
- );
- VOID
- efuse_ReadEFuse(
- PADAPTER Adapter,
- u8 efuseType,
- u16 _offset,
- u16 _size_byte,
- u8 *pbuf,
- IN BOOLEAN bPseudoTest
- )
- {
- Adapter->HalFunc.ReadEFuse(Adapter, efuseType, _offset, _size_byte, pbuf, bPseudoTest);
- }
- VOID
- EFUSE_GetEfuseDefinition(
- IN PADAPTER pAdapter,
- IN u8 efuseType,
- IN u8 type,
- OUT void *pOut,
- IN BOOLEAN bPseudoTest
- )
- {
- pAdapter->HalFunc.EFUSEGetEfuseDefinition(pAdapter, efuseType, type, pOut, bPseudoTest);
- }
- /*-----------------------------------------------------------------------------
- * Function: EFUSE_Read1Byte
- *
- * Overview: Copy from WMAC fot EFUSE read 1 byte.
- *
- * Input: NONE
- *
- * Output: NONE
- *
- * Return: NONE
- *
- * Revised History:
- * When Who Remark
- * 09/23/2008 MHC Copy from WMAC.
- *
- *---------------------------------------------------------------------------*/
- u8
- EFUSE_Read1Byte(
- IN PADAPTER Adapter,
- IN u16 Address)
- {
- u8 data;
- u8 Bytetemp = {0x00};
- u8 temp = {0x00};
- u32 k=0;
- u16 contentLen=0;
- EFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI , TYPE_EFUSE_REAL_CONTENT_LEN, (PVOID)&contentLen, _FALSE);
- if (Address < contentLen) //E-fuse 512Byte
- {
- //Write E-fuse Register address bit0~7
- temp = Address & 0xFF;
- rtw_write8(Adapter, EFUSE_CTRL+1, temp);
- Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+2);
- //Write E-fuse Register address bit8~9
- temp = ((Address >> 8) & 0x03) | (Bytetemp & 0xFC);
- rtw_write8(Adapter, EFUSE_CTRL+2, temp);
- //Write 0x30[31]=0
- Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3);
- temp = Bytetemp & 0x7F;
- rtw_write8(Adapter, EFUSE_CTRL+3, temp);
- //Wait Write-ready (0x30[31]=1)
- Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3);
- while(!(Bytetemp & 0x80))
- {
- Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3);
- k++;
- if(k==1000)
- {
- k=0;
- break;
- }
- }
- data=rtw_read8(Adapter, EFUSE_CTRL);
- return data;
- }
- else
- return 0xFF;
-
- }/* EFUSE_Read1Byte */
- /*-----------------------------------------------------------------------------
- * Function: EFUSE_Write1Byte
- *
- * Overview: Copy from WMAC fot EFUSE write 1 byte.
- *
- * Input: NONE
- *
- * Output: NONE
- *
- * Return: NONE
- *
- * Revised History:
- * When Who Remark
- * 09/23/2008 MHC Copy from WMAC.
- *
- *---------------------------------------------------------------------------*/
- void
- EFUSE_Write1Byte(
- IN PADAPTER Adapter,
- IN u16 Address,
- IN u8 Value);
- void
- EFUSE_Write1Byte(
- IN PADAPTER Adapter,
- IN u16 Address,
- IN u8 Value)
- {
- u8 Bytetemp = {0x00};
- u8 temp = {0x00};
- u32 k=0;
- u16 contentLen=0;
- //RT_TRACE(COMP_EFUSE, DBG_LOUD, ("Addr=%x Data =%x\n", Address, Value));
- EFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI , TYPE_EFUSE_REAL_CONTENT_LEN, (PVOID)&contentLen, _FALSE);
- if( Address < contentLen) //E-fuse 512Byte
- {
- rtw_write8(Adapter, EFUSE_CTRL, Value);
- //Write E-fuse Register address bit0~7
- temp = Address & 0xFF;
- rtw_write8(Adapter, EFUSE_CTRL+1, temp);
- Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+2);
-
- //Write E-fuse Register address bit8~9
- temp = ((Address >> 8) & 0x03) | (Bytetemp & 0xFC);
- rtw_write8(Adapter, EFUSE_CTRL+2, temp);
- //Write 0x30[31]=1
- Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3);
- temp = Bytetemp | 0x80;
- rtw_write8(Adapter, EFUSE_CTRL+3, temp);
- //Wait Write-ready (0x30[31]=0)
- Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3);
- while(Bytetemp & 0x80)
- {
- Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3);
- k++;
- if(k==100)
- {
- k=0;
- break;
- }
- }
- }
- }/* EFUSE_Write1Byte */
- /* 11/16/2008 MH Read one byte from real Efuse. */
- u8
- efuse_OneByteRead(
- IN PADAPTER pAdapter,
- IN u16 addr,
- IN u8 *data,
- IN BOOLEAN bPseudoTest)
- {
- u8 tmpidx = 0;
- u8 bResult;
- //DBG_871X("===> EFUSE_OneByteRead(), addr = %x\n", addr);
- //DBG_871X("===> EFUSE_OneByteRead() start, 0x34 = 0x%X\n", rtw_read32(pAdapter, EFUSE_TEST));
- if(bPseudoTest)
- {
- bResult = Efuse_Read1ByteFromFakeContent(pAdapter, addr, data);
- return bResult;
- }
- // <20130227, Kordan> 8192E MP chip A-cut had better not set 0x34[11] until B-Cut.
- /*
- if ( IS_HARDWARE_TYPE_8723B(pAdapter))
- {
- // <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, 0);
- rtw_write16(pAdapter, 0x34, rtw_read16(pAdapter,0x34)& (~BIT11) );
- }
- */
- // -----------------e-fuse reg ctrl ---------------------------------
- //address
- rtw_write8(pAdapter, EFUSE_CTRL+1, (u8)(addr&0xff));
- rtw_write8(pAdapter, EFUSE_CTRL+2, ((u8)((addr>>8) &0x03) ) |
- (rtw_read8(pAdapter, EFUSE_CTRL+2)&0xFC ));
- rtw_write8(pAdapter, EFUSE_CTRL+3, 0x72);//read cmd
- while(!(0x80 &rtw_read8(pAdapter, EFUSE_CTRL+3))&&(tmpidx<1000))
- {
- rtw_mdelay_os(1);
- tmpidx++;
- }
- if(tmpidx<1000)
- {
- *data=rtw_read8(pAdapter, EFUSE_CTRL);
- bResult = _TRUE;
- }
- else
- {
- *data = 0xff;
- bResult = _FALSE;
- }
- return bResult;
- }
-
- /* 11/16/2008 MH Write one byte to reald Efuse. */
- u8
- efuse_OneByteWrite(
- IN PADAPTER pAdapter,
- IN u16 addr,
- IN u8 data,
- IN BOOLEAN bPseudoTest)
- {
- u8 tmpidx = 0;
- u8 bResult=_FALSE;
- u32 efuseValue = 0;
- //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));
- if(bPseudoTest)
- {
- bResult = Efuse_Write1ByteToFakeContent(pAdapter, addr, data);
- return bResult;
- }
- // -----------------e-fuse reg ctrl ---------------------------------
- //address
- // <20121213, Kordan> 8723BE SMIC TestChip workaround.
- /*
- if (IS_HARDWARE_TYPE_8723B(pAdapter) && ! pHalData->bIsMPChip)
- {
- //PlatformEFIOWrite1Byte(pAdapter, REG_MULTI_FUNC_CTRL+1, 0x69); // Turn off EFUSE protection.
- rtw_write16(pAdapter, REG_SYS_ISO_CTRL, rtw_read16(pAdapter, REG_SYS_ISO_CTRL)| BIT14); // Turn on power cut
-
- EFUSE_PowerSwitch(pAdapter,TRUE, TRUE); // LDO 2.6V, this must follows after power cut.
- }
- */
-
- efuseValue = rtw_read32(pAdapter, EFUSE_CTRL);
- efuseValue |= (BIT21|BIT31);
- 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) && pHalData->bIsMPChip)
- {
- // <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);
- PlatformEFIOWrite4Byte(pAdapter, EFUSE_CTRL, 0x90600000|((addr<<8 | data)) );
- }
- else
- */
- {
- rtw_write32(pAdapter, EFUSE_CTRL, efuseValue);
- }
- while((0x80 & rtw_read8(pAdapter, EFUSE_CTRL+3)) && (tmpidx<100) ){
- rtw_mdelay_os(1);
- tmpidx++;
- }
- if(tmpidx<100)
- {
- bResult = _TRUE;
- }
- else
- {
- bResult = _FALSE;
- }
- return bResult;
- }
- int
- Efuse_PgPacketRead( IN PADAPTER pAdapter,
- IN u8 offset,
- IN u8 *data,
- IN BOOLEAN bPseudoTest)
- {
- int ret=0;
- ret = pAdapter->HalFunc.Efuse_PgPacketRead(pAdapter, offset, data, bPseudoTest);
- return ret;
- }
- int
- Efuse_PgPacketWrite(IN PADAPTER pAdapter,
- IN u8 offset,
- IN u8 word_en,
- IN u8 *data,
- IN BOOLEAN bPseudoTest)
- {
- int ret;
- ret = pAdapter->HalFunc.Efuse_PgPacketWrite(pAdapter, offset, word_en, data, bPseudoTest);
- return ret;
- }
- int
- Efuse_PgPacketWrite_BT(IN PADAPTER pAdapter,
- IN u8 offset,
- IN u8 word_en,
- IN u8 *data,
- IN BOOLEAN bPseudoTest)
- {
- int ret;
- ret = pAdapter->HalFunc.Efuse_PgPacketWrite_BT(pAdapter, offset, word_en, data, bPseudoTest);
- return ret;
- }
- /*-----------------------------------------------------------------------------
- * Function: efuse_WordEnableDataRead
- *
- * Overview: Read allowed word in current efuse section data.
- *
- * Input: NONE
- *
- * Output: NONE
- *
- * Return: NONE
- *
- * Revised History:
- * When Who Remark
- * 11/16/2008 MHC Create Version 0.
- * 11/21/2008 MHC Fix Write bug when we only enable late word.
- *
- *---------------------------------------------------------------------------*/
- void
- efuse_WordEnableDataRead(IN u8 word_en,
- IN u8 *sourdata,
- IN u8 *targetdata)
- {
- if (!(word_en&BIT(0)))
- {
- targetdata[0] = sourdata[0];
- targetdata[1] = sourdata[1];
- }
- if (!(word_en&BIT(1)))
- {
- targetdata[2] = sourdata[2];
- targetdata[3] = sourdata[3];
- }
- if (!(word_en&BIT(2)))
- {
- targetdata[4] = sourdata[4];
- targetdata[5] = sourdata[5];
- }
- if (!(word_en&BIT(3)))
- {
- targetdata[6] = sourdata[6];
- targetdata[7] = sourdata[7];
- }
- }
- u8
- Efuse_WordEnableDataWrite( IN PADAPTER pAdapter,
- IN u16 efuse_addr,
- IN u8 word_en,
- IN u8 *data,
- IN BOOLEAN bPseudoTest)
- {
- u8 ret=0;
- ret = pAdapter->HalFunc.Efuse_WordEnableDataWrite(pAdapter, efuse_addr, word_en, data, bPseudoTest);
-
- return ret;
- }
- static u8 efuse_read8(PADAPTER padapter, u16 address, u8 *value)
- {
- return efuse_OneByteRead(padapter,address, value, _FALSE);
- }
- static u8 efuse_write8(PADAPTER padapter, u16 address, u8 *value)
- {
- return efuse_OneByteWrite(padapter,address, *value, _FALSE);
- }
- /*
- * read/wirte raw efuse data
- */
- u8 rtw_efuse_access(PADAPTER padapter, u8 bWrite, u16 start_addr, u16 cnts, u8 *data)
- {
- int i = 0;
- u16 real_content_len = 0, max_available_size = 0;
- u8 res = _FAIL ;
- u8 (*rw8)(PADAPTER, u16, u8*);
- EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_REAL_CONTENT_LEN, (PVOID)&real_content_len, _FALSE);
- EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE);
- if (start_addr > real_content_len)
- return _FAIL;
- if (_TRUE == bWrite) {
- if ((start_addr + cnts) > max_available_size)
- return _FAIL;
- rw8 = &efuse_write8;
- } else
- rw8 = &efuse_read8;
- Efuse_PowerSwitch(padapter, bWrite, _TRUE);
- // e-fuse one byte read / write
- for (i = 0; i < cnts; i++) {
- if (start_addr >= real_content_len) {
- res = _FAIL;
- break;
- }
- res = rw8(padapter, start_addr++, data++);
- if (_FAIL == res) break;
- }
- Efuse_PowerSwitch(padapter, bWrite, _FALSE);
- return res;
- }
- //------------------------------------------------------------------------------
- u16 efuse_GetMaxSize(PADAPTER padapter)
- {
- u16 max_size;
- EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI , TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_size, _FALSE);
- return max_size;
- }
- //------------------------------------------------------------------------------
- u8 efuse_GetCurrentSize(PADAPTER padapter, u16 *size)
- {
- Efuse_PowerSwitch(padapter, _FALSE, _TRUE);
- *size = Efuse_GetCurrentSize(padapter, EFUSE_WIFI, _FALSE);
- Efuse_PowerSwitch(padapter, _FALSE, _FALSE);
- return _SUCCESS;
- }
- //------------------------------------------------------------------------------
- u8 rtw_efuse_map_read(PADAPTER padapter, u16 addr, u16 cnts, u8 *data)
- {
- u16 mapLen=0;
- EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, _FALSE);
- if ((addr + cnts) > mapLen)
- return _FAIL;
- Efuse_PowerSwitch(padapter, _FALSE, _TRUE);
- efuse_ReadEFuse(padapter, EFUSE_WIFI, addr, cnts, data, _FALSE);
- Efuse_PowerSwitch(padapter, _FALSE, _FALSE);
- return _SUCCESS;
- }
- u8 rtw_BT_efuse_map_read(PADAPTER padapter, u16 addr, u16 cnts, u8 *data)
- {
- u16 mapLen=0;
- EFUSE_GetEfuseDefinition(padapter, EFUSE_BT, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, _FALSE);
- if ((addr + cnts) > mapLen)
- return _FAIL;
- Efuse_PowerSwitch(padapter, _FALSE, _TRUE);
- efuse_ReadEFuse(padapter, EFUSE_BT, addr, cnts, data, _FALSE);
- Efuse_PowerSwitch(padapter, _FALSE, _FALSE);
- return _SUCCESS;
- }
- //------------------------------------------------------------------------------
- u8 rtw_efuse_map_write(PADAPTER padapter, u16 addr, u16 cnts, u8 *data)
- {
- u8 offset, word_en;
- u8 *map;
- u8 newdata[PGPKT_DATA_SIZE];
- s32 i, j, idx;
- u8 ret = _SUCCESS;
- u16 mapLen=0;
- EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, _FALSE);
- if ((addr + cnts) > mapLen)
- return _FAIL;
- map = rtw_zmalloc(mapLen);
- if(map == NULL){
- return _FAIL;
- }
- ret = rtw_efuse_map_read(padapter, 0, mapLen, map);
- if (ret == _FAIL) goto exit;
- Efuse_PowerSwitch(padapter, _TRUE, _TRUE);
- offset = (addr >> 3);
- word_en = 0xF;
- _rtw_memset(newdata, 0xFF, PGPKT_DATA_SIZE);
- i = addr & 0x7; // index of one package
- j = 0; // index of new package
- idx = 0; // data index
- if (i & 0x1) {
- // odd start
- if (data[idx] != map[addr+idx]) {
- word_en &= ~BIT(i >> 1);
- newdata[i-1] = map[addr+idx-1];
- newdata[i] = data[idx];
- }
- i++;
- idx++;
- }
- do {
- for (; i < PGPKT_DATA_SIZE; i += 2)
- {
- if (cnts == idx) break;
- if ((cnts - idx) == 1) {
- if (data[idx] != map[addr+idx]) {
- word_en &= ~BIT(i >> 1);
- newdata[i] = data[idx];
- newdata[i+1] = map[addr+idx+1];
- }
- idx++;
- break;
- } else {
- if ((data[idx] != map[addr+idx]) ||
- (data[idx+1] != map[addr+idx+1]))
- {
- word_en &= ~BIT(i >> 1);
- newdata[i] = data[idx];
- newdata[i+1] = data[idx + 1];
- }
- idx += 2;
- }
- if (idx == cnts) break;
- }
- if (word_en != 0xF) {
- ret = Efuse_PgPacketWrite(padapter, offset, word_en, newdata, _FALSE);
- DBG_871X("offset=%x \n",offset);
- DBG_871X("word_en=%x \n",word_en);
- for(i=0;i<PGPKT_DATA_SIZE;i++)
- {
- DBG_871X("data=%x \t",newdata[i]);
- }
- if (ret == _FAIL) break;
- }
- if (idx == cnts) break;
- offset++;
- i = 0;
- j = 0;
- word_en = 0xF;
- _rtw_memset(newdata, 0xFF, PGPKT_DATA_SIZE);
- } while (1);
- Efuse_PowerSwitch(padapter, _TRUE, _FALSE);
- exit:
- rtw_mfree(map, mapLen);
- return ret;
- }
- //------------------------------------------------------------------------------
- u8 rtw_BT_efuse_map_write(PADAPTER padapter, u16 addr, u16 cnts, u8 *data)
- {
- u8 offset, word_en;
- u8 *map;
- u8 newdata[PGPKT_DATA_SIZE];
- s32 i, j, idx;
- u8 ret = _SUCCESS;
- u16 mapLen=0;
- EFUSE_GetEfuseDefinition(padapter, EFUSE_BT, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, _FALSE);
- if ((addr + cnts) > mapLen)
- return _FAIL;
- map = rtw_zmalloc(mapLen);
- if(map == NULL){
- return _FAIL;
- }
- ret = rtw_BT_efuse_map_read(padapter, 0, mapLen, map);
- if (ret == _FAIL) goto exit;
- Efuse_PowerSwitch(padapter, _TRUE, _TRUE);
- offset = (addr >> 3);
- word_en = 0xF;
- _rtw_memset(newdata, 0xFF, PGPKT_DATA_SIZE);
- i = addr & 0x7; // index of one package
- j = 0; // index of new package
- idx = 0; // data index
- if (i & 0x1) {
- // odd start
- if (data[idx] != map[addr+idx]) {
- word_en &= ~BIT(i >> 1);
- newdata[i-1] = map[addr+idx-1];
- newdata[i] = data[idx];
- }
- i++;
- idx++;
- }
- do {
- for (; i < PGPKT_DATA_SIZE; i += 2)
- {
- if (cnts == idx) break;
- if ((cnts - idx) == 1) {
- if (data[idx] != map[addr+idx]) {
- word_en &= ~BIT(i >> 1);
- newdata[i] = data[idx];
- newdata[i+1] = map[addr+idx+1];
- }
- idx++;
- break;
- } else {
- if ((data[idx] != map[addr+idx]) ||
- (data[idx+1] != map[addr+idx+1]))
- {
- word_en &= ~BIT(i >> 1);
- newdata[i] = data[idx];
- newdata[i+1] = data[idx + 1];
- }
- idx += 2;
- }
- if (idx == cnts) break;
- }
- if (word_en != 0xF)
- {
- DBG_871X("%s: offset=%#X\n", __FUNCTION__, offset);
- DBG_871X("%s: word_en=%#X\n", __FUNCTION__, word_en);
- DBG_871X("%s: data=", __FUNCTION__);
- for (i=0; i<PGPKT_DATA_SIZE; i++)
- {
- DBG_871X("0x%02X ", newdata[i]);
- }
- DBG_871X("\n");
- ret = Efuse_PgPacketWrite_BT(padapter, offset, word_en, newdata, _FALSE);
- if (ret == _FAIL) break;
- }
- if (idx == cnts) break;
- offset++;
- i = 0;
- j = 0;
- word_en = 0xF;
- _rtw_memset(newdata, 0xFF, PGPKT_DATA_SIZE);
- } while (1);
- Efuse_PowerSwitch(padapter, _TRUE, _FALSE);
- exit:
- rtw_mfree(map, mapLen);
- return ret;
- }
- /*-----------------------------------------------------------------------------
- * Function: Efuse_ReadAllMap
- *
- * Overview: Read All Efuse content
- *
- * Input: NONE
- *
- * Output: NONE
- *
- * Return: NONE
- *
- * Revised History:
- * When Who Remark
- * 11/11/2008 MHC Create Version 0.
- *
- *---------------------------------------------------------------------------*/
- VOID
- Efuse_ReadAllMap(
- IN PADAPTER pAdapter,
- IN u8 efuseType,
- IN OUT u8 *Efuse,
- IN BOOLEAN bPseudoTest);
- VOID
- Efuse_ReadAllMap(
- IN PADAPTER pAdapter,
- IN u8 efuseType,
- IN OUT u8 *Efuse,
- IN BOOLEAN bPseudoTest)
- {
- u16 mapLen=0;
- Efuse_PowerSwitch(pAdapter,_FALSE, _TRUE);
- EFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, bPseudoTest);
- efuse_ReadEFuse(pAdapter, efuseType, 0, mapLen, Efuse, bPseudoTest);
- Efuse_PowerSwitch(pAdapter,_FALSE, _FALSE);
- }
- /*-----------------------------------------------------------------------------
- * Function: efuse_ShadowRead1Byte
- * efuse_ShadowRead2Byte
- * efuse_ShadowRead4Byte
- *
- * Overview: Read from efuse init map by one/two/four bytes !!!!!
- *
- * Input: NONE
- *
- * Output: NONE
- *
- * Return: NONE
- *
- * Revised History:
- * When Who Remark
- * 11/12/2008 MHC Create Version 0.
- *
- *---------------------------------------------------------------------------*/
- static VOID
- efuse_ShadowRead1Byte(
- IN PADAPTER pAdapter,
- IN u16 Offset,
- IN OUT u8 *Value)
- {
- EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter);
- *Value = pEEPROM->efuse_eeprom_data[Offset];
- } // EFUSE_ShadowRead1Byte
- //---------------Read Two Bytes
- static VOID
- efuse_ShadowRead2Byte(
- IN PADAPTER pAdapter,
- IN u16 Offset,
- IN OUT u16 *Value)
- {
- EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter);
- *Value = pEEPROM->efuse_eeprom_data[Offset];
- *Value |= pEEPROM->efuse_eeprom_data[Offset+1]<<8;
- } // EFUSE_ShadowRead2Byte
- //---------------Read Four Bytes
- static VOID
- efuse_ShadowRead4Byte(
- IN PADAPTER pAdapter,
- IN u16 Offset,
- IN OUT u32 *Value)
- {
- EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(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;
- } // efuse_ShadowRead4Byte
- /*-----------------------------------------------------------------------------
- * Function: efuse_ShadowWrite1Byte
- * efuse_ShadowWrite2Byte
- * efuse_ShadowWrite4Byte
- *
- * Overview: Write efuse modify map by one/two/four byte.
- *
- * Input: NONE
- *
- * Output: NONE
- *
- * Return: NONE
- *
- * Revised History:
- * When Who Remark
- * 11/12/2008 MHC Create Version 0.
- *
- *---------------------------------------------------------------------------*/
- #ifdef PLATFORM
- static VOID
- efuse_ShadowWrite1Byte(
- IN PADAPTER pAdapter,
- IN u16 Offset,
- IN u8 Value);
- #endif //PLATFORM
- static VOID
- efuse_ShadowWrite1Byte(
- IN PADAPTER pAdapter,
- IN u16 Offset,
- IN u8 Value)
- {
- EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter);
- pEEPROM->efuse_eeprom_data[Offset] = Value;
- } // efuse_ShadowWrite1Byte
- //---------------Write Two Bytes
- static VOID
- efuse_ShadowWrite2Byte(
- IN PADAPTER pAdapter,
- IN u16 Offset,
- IN u16 Value)
- {
- EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter);
- pEEPROM->efuse_eeprom_data[Offset] = Value&0x00FF;
- pEEPROM->efuse_eeprom_data[Offset+1] = Value>>8;
- } // efuse_ShadowWrite1Byte
- //---------------Write Four Bytes
- static VOID
- efuse_ShadowWrite4Byte(
- IN PADAPTER pAdapter,
- IN u16 Offset,
- IN u32 Value)
- {
- EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(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);
- } // efuse_ShadowWrite1Byte
- /*-----------------------------------------------------------------------------
- * Function: EFUSE_ShadowMapUpdate
- *
- * Overview: Transfer current EFUSE content to shadow init and modify map.
- *
- * Input: NONE
- *
- * Output: NONE
- *
- * Return: NONE
- *
- * Revised History:
- * When Who Remark
- * 11/13/2008 MHC Create Version 0.
- *
- *---------------------------------------------------------------------------*/
- void EFUSE_ShadowMapUpdate(
- IN PADAPTER pAdapter,
- IN u8 efuseType,
- IN BOOLEAN bPseudoTest)
- {
- EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter);
- u16 mapLen=0;
- EFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, bPseudoTest);
- if (pEEPROM->bautoload_fail_flag == _TRUE)
- {
- _rtw_memset(pEEPROM->efuse_eeprom_data, 0xFF, mapLen);
- }
- else
- {
- #ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE
- if(_SUCCESS != retriveAdaptorInfoFile(pAdapter->registrypriv.adaptor_info_caching_file_path, pEEPROM)) {
- #endif
-
- Efuse_ReadAllMap(pAdapter, efuseType, pEEPROM->efuse_eeprom_data, bPseudoTest);
-
- #ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE
- storeAdaptorInfoFile(pAdapter->registrypriv.adaptor_info_caching_file_path, pEEPROM);
- }
- #endif
- }
- //PlatformMoveMemory((PVOID)&pHalData->EfuseMap[EFUSE_MODIFY_MAP][0],
- //(PVOID)&pHalData->EfuseMap[EFUSE_INIT_MAP][0], mapLen);
- }// EFUSE_ShadowMapUpdate
- /*-----------------------------------------------------------------------------
- * Function: EFUSE_ShadowRead
- *
- * Overview: Read from efuse init map !!!!!
- *
- * Input: NONE
- *
- * Output: NONE
- *
- * Return: NONE
- *
- * Revised History:
- * When Who Remark
- * 11/12/2008 MHC Create Version 0.
- *
- *---------------------------------------------------------------------------*/
- void
- EFUSE_ShadowRead(
- IN PADAPTER pAdapter,
- IN u8 Type,
- IN u16 Offset,
- IN OUT u32 *Value )
- {
- if (Type == 1)
- efuse_ShadowRead1Byte(pAdapter, Offset, (u8 *)Value);
- else if (Type == 2)
- efuse_ShadowRead2Byte(pAdapter, Offset, (u16 *)Value);
- else if (Type == 4)
- efuse_ShadowRead4Byte(pAdapter, Offset, (u32 *)Value);
-
- } // EFUSE_ShadowRead
- /*-----------------------------------------------------------------------------
- * Function: EFUSE_ShadowWrite
- *
- * Overview: Write efuse modify map for later update operation to use!!!!!
- *
- * Input: NONE
- *
- * Output: NONE
- *
- * Return: NONE
- *
- * Revised History:
- * When Who Remark
- * 11/12/2008 MHC Create Version 0.
- *
- *---------------------------------------------------------------------------*/
- VOID
- EFUSE_ShadowWrite(
- IN PADAPTER pAdapter,
- IN u8 Type,
- IN u16 Offset,
- IN OUT u32 Value);
- VOID
- EFUSE_ShadowWrite(
- IN PADAPTER pAdapter,
- IN u8 Type,
- IN u16 Offset,
- IN OUT u32 Value)
- {
- #if (MP_DRIVER == 0)
- return;
- #endif
- if ( pAdapter->registrypriv.mp_mode == 0)
- return;
- if (Type == 1)
- efuse_ShadowWrite1Byte(pAdapter, Offset, (u8)Value);
- else if (Type == 2)
- efuse_ShadowWrite2Byte(pAdapter, Offset, (u16)Value);
- else if (Type == 4)
- efuse_ShadowWrite4Byte(pAdapter, Offset, (u32)Value);
- } // EFUSE_ShadowWrite
- VOID
- Efuse_InitSomeVar(
- IN PADAPTER pAdapter
- );
- VOID
- Efuse_InitSomeVar(
- IN PADAPTER pAdapter
- )
- {
- u8 i;
-
- _rtw_memset((PVOID)&fakeEfuseContent[0], 0xff, EFUSE_MAX_HW_SIZE);
- _rtw_memset((PVOID)&fakeEfuseInitMap[0], 0xff, EFUSE_MAX_MAP_LEN);
- _rtw_memset((PVOID)&fakeEfuseModifiedMap[0], 0xff, EFUSE_MAX_MAP_LEN);
- for(i=0; i<EFUSE_MAX_BT_BANK; i++)
- {
- _rtw_memset((PVOID)&BTEfuseContent[i][0], EFUSE_MAX_HW_SIZE, 0xff);
- }
- _rtw_memset((PVOID)&BTEfuseInitMap[0], 0xff, EFUSE_BT_MAX_MAP_LEN);
- _rtw_memset((PVOID)&BTEfuseModifiedMap[0], 0xff, EFUSE_BT_MAX_MAP_LEN);
- for(i=0; i<EFUSE_MAX_BT_BANK; i++)
- {
- _rtw_memset((PVOID)&fakeBTEfuseContent[i][0], 0xff, EFUSE_MAX_HW_SIZE);
- }
- _rtw_memset((PVOID)&fakeBTEfuseInitMap[0], 0xff, EFUSE_BT_MAX_MAP_LEN);
- _rtw_memset((PVOID)&fakeBTEfuseModifiedMap[0], 0xff, EFUSE_BT_MAX_MAP_LEN);
- }
- #ifdef PLATFORM_LINUX
- #ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE
- //#include <rtw_eeprom.h>
- int isAdaptorInfoFileValid(void)
- {
- return _TRUE;
- }
- int storeAdaptorInfoFile(char *path, struct eeprom_priv * eeprom_priv)
- {
- int ret =_SUCCESS;
- if(path && eeprom_priv) {
- ret = rtw_store_to_file(path, eeprom_priv->efuse_eeprom_data, EEPROM_MAX_SIZE_512);
- if(ret == EEPROM_MAX_SIZE)
- ret = _SUCCESS;
- else
- ret = _FAIL;
- } else {
- DBG_871X("%s NULL pointer\n",__FUNCTION__);
- ret = _FAIL;
- }
- return ret;
- }
- int retriveAdaptorInfoFile(char *path, struct eeprom_priv * eeprom_priv)
- {
- int ret = _SUCCESS;
- mm_segment_t oldfs;
- struct file *fp;
-
- if(path && eeprom_priv) {
- ret = rtw_retrive_from_file(path, eeprom_priv->efuse_eeprom_data, EEPROM_MAX_SIZE);
-
- if(ret == EEPROM_MAX_SIZE)
- ret = _SUCCESS;
- else
- ret = _FAIL;
- #if 0
- if(isAdaptorInfoFileValid()) {
- return 0;
- } else {
- return _FAIL;
- }
- #endif
-
- } else {
- DBG_871X("%s NULL pointer\n",__FUNCTION__);
- ret = _FAIL;
- }
- return ret;
- }
- #endif //CONFIG_ADAPTOR_INFO_CACHING_FILE
- #endif //PLATFORM_LINUX
|