1 /******************************************************************************
3 * (c) Copyright 2008, RealTEK Technologies Inc. All Rights Reserved.
5 * Module: Efuse.c ( Source C File)
7 * Note: Copy from WMAC for the first version!!!!
19 * 09/23/2008 MHC Porting Efuse R/W API from WMAC.
20 * 11/10/2008 MHC 1. Porting from 8712 EFUSE.
21 * 2. Add description and reorganize code arch.
22 * 11/16/2008 MHC 1. Reorganize code architecture.
23 * 2. Rename for some API and change extern or static type.
25 ******************************************************************************/
27 #include "r8192S_hw.h"
28 #include "r8192S_phy.h"
29 #include "r8192S_phyreg.h"
30 #include "r8192S_Efuse.h"
32 #include <linux/types.h>
36 // In the future, we will always support EFUSE!!
39 /*---------------------------Define Local Constant---------------------------*/
40 #define _POWERON_DELAY_
41 #define _PRE_EXECUTE_READ_CMD_
43 #define EFUSE_REPEAT_THRESHOLD_ 3
44 #define EFUSE_ERROE_HANDLE 1
48 typedef struct _EFUSE_MAP_A{
51 u8 byte_start; //0 or 1
54 }EFUSE_MAP, *PEFUSE_MAP;
56 typedef struct PG_PKT_STRUCT_A{
60 }PGPKT_STRUCT,*PPGPKT_STRUCT;
62 typedef enum _EFUSE_DATA_ITEM{
95 /*---------------------------Define Local Constant---------------------------*/
98 /*------------------------Define global variable-----------------------------*/
99 const u8 MAX_PGPKT_SIZE = 9; //header+ 2* 4 words (BYTES)
100 const u8 PGPKT_DATA_SIZE = 8; //BYTES sizeof(u8)*8
101 const u32 EFUSE_MAX_SIZE = 512;
104 const EFUSE_MAP RTL8712_SDIO_EFUSE_TABLE[]={
105 //offset word_s byte_start byte_cnts
106 /*ID*/ {0 ,0 ,0 ,2 }, // 00~01h
107 /*LDO Setting*/ {0 ,1 ,0 ,2 }, // 02~03h
108 /*CLK Setting*/ {0 ,2 ,0 ,2 }, // 04~05h
109 /*SDIO Setting*/ {1 ,0 ,0 ,1 }, // 08h
110 /*CCCR*/ {1 ,0 ,1 ,1 }, // 09h
111 /*SDIO MODE*/ {1 ,1 ,0 ,1 }, // 0Ah
112 /*OCR*/ {1 ,1 ,1 ,3 }, // 0B~0Dh
113 /*CCIS*/ {1 ,3 ,0 ,17 }, // 0E~1Eh 2...1
114 /*F1CIS*/ {3 ,3 ,1 ,48 }, // 1F~4Eh 6...0
115 /*MAC Addr*/ {10 ,0 ,0 ,6 }, // 50~55h
116 /*EEPROM ver*/ {10 ,3 ,0 ,1 }, // 56h
117 /*Channel plan*/ {10 ,3 ,1 ,1 }, // 57h
118 /*TxPwIndex */ {11 ,0 ,0 ,28 } // 58~73h 3...4
121 /*------------------------Define global variable-----------------------------*/
124 /*------------------------Define local variable------------------------------*/
126 /*------------------------Define local variable------------------------------*/
129 /*--------------------Define function prototype-----------------------*/
131 // From WMAC Efuse one byte R/W
134 EFUSE_Initialize(struct net_device* dev);
136 EFUSE_Read1Byte(struct net_device* dev, u16 Address);
138 EFUSE_Write1Byte(struct net_device* dev, u16 Address,u8 Value);
141 // Efuse Shadow Area operation
144 efuse_ShadowRead1Byte(struct net_device* dev,u16 Offset,u8 *Value);
146 efuse_ShadowRead2Byte(struct net_device* dev, u16 Offset,u16 *Value );
148 efuse_ShadowRead4Byte(struct net_device* dev, u16 Offset,u32 *Value );
150 efuse_ShadowWrite1Byte(struct net_device* dev, u16 Offset, u8 Value);
152 efuse_ShadowWrite2Byte(struct net_device* dev, u16 Offset,u16 Value);
154 efuse_ShadowWrite4Byte(struct net_device* dev, u16 Offset,u32 Value);
157 // Real Efuse operation
160 efuse_OneByteRead(struct net_device* dev,u16 addr,u8 *data);
162 efuse_OneByteWrite(struct net_device* dev,u16 addr, u8 data);
165 // HW setting map file operation
168 efuse_ReadAllMap(struct net_device* dev,u8 *Efuse);
171 efuse_WriteAllMap(struct net_device* dev,u8 *eeprom,u32 eeprom_size);
173 efuse_ParsingMap(char* szStr,u32* pu4bVal,u32* pu4bMove);
176 // Reald Efuse R/W or other operation API.
179 efuse_PgPacketRead( struct net_device* dev,u8 offset,u8 *data);
181 efuse_PgPacketWrite(struct net_device* dev,u8 offset,u8 word_en,u8 *data);
183 efuse_WordEnableDataRead( u8 word_en,u8 *sourdata,u8 *targetdata);
185 efuse_WordEnableDataWrite( struct net_device* dev, u16 efuse_addr, u8 word_en, u8 *data);
187 efuse_PowerSwitch(struct net_device* dev,u8 PwrState);
189 efuse_GetCurrentSize(struct net_device* dev);
191 efuse_CalculateWordCnts(u8 word_en);
194 efuse_ResetLoader(struct net_device* dev);
197 // API for power on power off!!!
200 static void efuse_reg_ctrl(struct net_device* dev, u8 bPowerOn);
202 /*--------------------Define function prototype-----------------------*/
206 /*-----------------------------------------------------------------------------
207 * Function: EFUSE_Initialize
209 * Overview: Copy from WMAC fot EFUSE testing setting init.
219 * 09/23/2008 MHC Copy from WMAC.
221 *---------------------------------------------------------------------------*/
223 EFUSE_Initialize(struct net_device* dev)
225 u8 Bytetemp = {0x00};
228 //Enable Digital Core Vdd : 0x2[13]=1
229 Bytetemp = read_nic_byte(dev, SYS_FUNC_EN+1);
230 temp = Bytetemp | 0x20;
231 write_nic_byte(dev, SYS_FUNC_EN+1, temp);
233 //EE loader to retention path1: attach 0x0[8]=0
234 Bytetemp = read_nic_byte(dev, SYS_ISO_CTRL+1);
235 temp = Bytetemp & 0xFE;
236 write_nic_byte(dev, SYS_ISO_CTRL+1, temp);
239 //Enable E-fuse use 2.5V LDO : 0x37[7]=1
240 Bytetemp = read_nic_byte(dev, EFUSE_TEST+3);
241 temp = Bytetemp | 0x80;
242 write_nic_byte(dev, EFUSE_TEST+3, temp);
244 //E-fuse clk switch from 500k to 40M : 0x2F8[1:0]=11b
245 write_nic_byte(dev, 0x2F8, 0x3);
247 //Set E-fuse program time & read time : 0x30[30:24]=1110010b
248 write_nic_byte(dev, EFUSE_CTRL+3, 0x72);
250 } /* EFUSE_Initialize */
253 /*-----------------------------------------------------------------------------
254 * Function: EFUSE_Read1Byte
256 * Overview: Copy from WMAC fot EFUSE read 1 byte.
266 * 09/23/2008 MHC Copy from WMAC.
268 *---------------------------------------------------------------------------*/
270 EFUSE_Read1Byte(struct net_device* dev, u16 Address)
273 u8 Bytetemp = {0x00};
277 if (Address < EFUSE_MAC_LEN) //E-fuse 512Byte
279 //Write E-fuse Register address bit0~7
280 temp = Address & 0xFF;
281 write_nic_byte(dev, EFUSE_CTRL+1, temp);
282 Bytetemp = read_nic_byte(dev, EFUSE_CTRL+2);
283 //Write E-fuse Register address bit8~9
284 temp = ((Address >> 8) & 0x03) | (Bytetemp & 0xFC);
285 write_nic_byte(dev, EFUSE_CTRL+2, temp);
288 Bytetemp = read_nic_byte(dev, EFUSE_CTRL+3);
289 temp = Bytetemp & 0x7F;
290 write_nic_byte(dev, EFUSE_CTRL+3, temp);
292 //Wait Write-ready (0x30[31]=1)
293 Bytetemp = read_nic_byte(dev, EFUSE_CTRL+3);
294 while(!(Bytetemp & 0x80))
296 Bytetemp = read_nic_byte(dev, EFUSE_CTRL+3);
304 data=read_nic_byte(dev, EFUSE_CTRL);
310 } /* EFUSE_Read1Byte */
313 /*-----------------------------------------------------------------------------
314 * Function: EFUSE_Write1Byte
316 * Overview: Copy from WMAC fot EFUSE write 1 byte.
326 * 09/23/2008 MHC Copy from WMAC.
328 *---------------------------------------------------------------------------*/
330 EFUSE_Write1Byte(struct net_device* dev, u16 Address,u8 Value)
333 u8 Bytetemp = {0x00};
337 //RT_TRACE(COMP_EFUSE, "Addr=%x Data =%x\n", Address, Value);
339 if( Address < EFUSE_MAC_LEN) //E-fuse 512Byte
341 write_nic_byte(dev, EFUSE_CTRL, Value);
343 //Write E-fuse Register address bit0~7
344 temp = Address & 0xFF;
345 write_nic_byte(dev, EFUSE_CTRL+1, temp);
346 Bytetemp = read_nic_byte(dev, EFUSE_CTRL+2);
348 //Write E-fuse Register address bit8~9
349 temp = ((Address >> 8) & 0x03) | (Bytetemp & 0xFC);
350 write_nic_byte(dev, EFUSE_CTRL+2, temp);
353 Bytetemp = read_nic_byte(dev, EFUSE_CTRL+3);
354 temp = Bytetemp | 0x80;
355 write_nic_byte(dev, EFUSE_CTRL+3, temp);
357 //Wait Write-ready (0x30[31]=0)
358 Bytetemp = read_nic_byte(dev, EFUSE_CTRL+3);
359 while(Bytetemp & 0x80)
361 Bytetemp = read_nic_byte(dev, EFUSE_CTRL+3);
371 } /* EFUSE_Write1Byte */
374 #ifdef EFUSE_FOR_92SU
377 // 1. Process CR93C46 Data polling cycle.
378 // 2. Refered from SD1 Richard.
381 // 1. Boot from E-Fuse and successfully auto-load.
382 // 2. PASSIVE_LEVEL (USB interface)
384 // Created by Roger, 2008.10.21.
386 void do_93c46(struct net_device* dev, u8 addorvalue)
388 //u8 clear[1] = {0x0}; // cs=0 , sk=0 , di=0 , do=0
389 u8 cs[1] = {0x88}; // cs=1 , sk=0 , di=0 , do=0
390 u8 cssk[1] = {0x8c}; // cs=1 , sk=1 , di=0 , do=0
391 u8 csdi[1] = {0x8a}; // cs=1 , sk=0 , di=1 , do=0
392 u8 csskdi[1] = {0x8e}; // cs=1 , sk=1 , di=1 , do=0
393 //u8 di[1] = {0x82}; // cs=0 , sk=0 , di=1 , do=0
396 for(count=0 ; count<8 ; count++)
398 if((addorvalue&0x80)!=0)
400 write_nic_byte(dev, EPROM_CMD, csdi[0]);
401 write_nic_byte(dev, EPROM_CMD, csskdi[0]);
405 write_nic_byte(dev, EPROM_CMD, cs[0]);
406 write_nic_byte(dev, EPROM_CMD, cssk[0]);
408 addorvalue = addorvalue << 1;
415 // Process CR93C46 Data read polling cycle.
416 // Refered from SD1 Richard.
419 // 1. Boot from E-Fuse and successfully auto-load.
420 // 2. PASSIVE_LEVEL (USB interface)
422 // Created by Roger, 2008.10.21.
424 u16 Read93C46(struct net_device* dev, u16 Reg )
427 u8 clear[1] = {0x0}; // cs=0 , sk=0 , di=0 , do=0
428 u8 cs[1] = {0x88}; // cs=1 , sk=0 , di=0 , do=0
429 u8 cssk[1] = {0x8c}; // cs=1 , sk=1 , di=0 , do=0
430 u8 csdi[1] = {0x8a}; // cs=1 , sk=0 , di=1 , do=0
431 u8 csskdi[1] = {0x8e}; // cs=1 , sk=1 , di=1 , do=0
432 //u8 di[1] = {0x82}; // cs=0 , sk=0 , di=1 , do=0
433 u8 EepromSEL[1]={0x00};
436 u16 storedataF[1] = {0x0}; //93c46 data packet for 16bits
437 u8 t,data[1],storedata[1];
442 // Suggested by SD1 Alex, 2008.10.20. Revised by Roger.
443 *EepromSEL= read_nic_byte(dev, EPROM_CMD);
445 if((*EepromSEL & 0x10) == 0x10) // select 93c46
447 address = address | 0x80;
449 write_nic_byte(dev, EPROM_CMD, csdi[0]);
450 write_nic_byte(dev, EPROM_CMD, csskdi[0]);
451 do_93c46(dev, address);
455 for(t=0 ; t<16 ; t++) //if read 93c46 , t=16
457 write_nic_byte(dev, EPROM_CMD, cs[0]);
458 write_nic_byte(dev, EPROM_CMD, cssk[0]);
459 *data= read_nic_byte(dev, EPROM_CMD);
461 if(*data & 0x8d) //original code
463 *data = *data & 0x01;
468 *data = *data & 0x01 ;
471 *storedataF = (*storedataF << 1 ) + *storedata;
473 write_nic_byte(dev, EPROM_CMD, cs[0]);
474 write_nic_byte(dev, EPROM_CMD, clear[0]);
482 // Execute E-Fuse read byte operation.
483 // Refered from SD1 Richard.
486 // 1. Boot from E-Fuse and successfully auto-load.
487 // 2. PASSIVE_LEVEL (USB interface)
489 // Created by Roger, 2008.10.21.
492 ReadEFuseByte(struct net_device* dev,u16 _offset, u8 *pbuf)
502 write_nic_byte(dev, EFUSE_CTRL+1, (_offset & 0xff));
503 readbyte = read_nic_byte(dev, EFUSE_CTRL+2);
504 write_nic_byte(dev, EFUSE_CTRL+2, ((_offset >> 8) & 0x03) | (readbyte & 0xfc));
507 readbyte = read_nic_byte(dev, EFUSE_CTRL+3);
508 write_nic_byte(dev, EFUSE_CTRL+3, (readbyte & 0x7f));
510 //Check bit 32 read-ready
512 value32 = read_nic_dword(dev, EFUSE_CTRL);
513 //while(!(((value32 >> 24) & 0xff) & 0x80) && (retry<10))
514 while(!(((value32 >> 24) & 0xff) & 0x80) && (retry<10000))
516 value32 = read_nic_dword(dev, EFUSE_CTRL);
519 *pbuf = (u8)(value32 & 0xff);
523 #define EFUSE_READ_SWITCH 1
526 // 1. Execute E-Fuse read byte operation according as map offset and
527 // save to E-Fuse table.
528 // 2. Refered from SD1 Richard.
531 // 1. Boot from E-Fuse and successfully auto-load.
532 // 2. PASSIVE_LEVEL (USB interface)
534 // Created by Roger, 2008.10.21.
537 ReadEFuse(struct net_device* dev, u16 _offset, u16 _size_byte, u8 *pbuf)
545 u16 eFuseWord[16][4];// = {0xFF};//FIXLZM
549 eFuseWord[i][j]=0xFF;
551 // Do NOT excess total size of EFuse table. Added by Roger, 2008.11.10.
552 if((_offset + _size_byte)>128)
553 {// total E-Fuse table is 128bytes
554 //RT_TRACE(COMP_EFUSE, "ReadEFuse(): Invalid offset(%#x) with read bytes(%#x)!!\n",_offset, _size_byte);
555 printk("ReadEFuse(): Invalid offset with read bytes!!\n");
559 // Refresh efuse init map as all oxFF.
560 for (i = 0; i < 128; i++)
563 #if (EFUSE_READ_SWITCH == 1)
564 ReadEFuseByte(dev, eFuse_Addr, rtemp8);
566 rtemp8[0] = EFUSE_Read1Byte(dev, eFuse_Addr);
568 if(*rtemp8 != 0xFF) eFuse_Addr++;
569 while((*rtemp8 != 0xFF) && (eFuse_Addr < 512)){
570 offset = ((*rtemp8 >> 4) & 0x0f);
572 wren = (*rtemp8 & 0x0f);
575 #if (EFUSE_READ_SWITCH == 1)
576 ReadEFuseByte(dev, eFuse_Addr, rtemp8); eFuse_Addr++;
578 rtemp8[0] = EFUSE_Read1Byte(dev, eFuse_Addr); eFuse_Addr++;
580 eFuseWord[offset][i] = (*rtemp8 & 0xff);
581 if(eFuse_Addr >= 512) break;
582 #if (EFUSE_READ_SWITCH == 1)
583 ReadEFuseByte(dev, eFuse_Addr, rtemp8); eFuse_Addr++;
585 rtemp8[0] = EFUSE_Read1Byte(dev, eFuse_Addr); eFuse_Addr++;
587 eFuseWord[offset][i] |= (((u16)*rtemp8 << 8) & 0xff00);
588 if(eFuse_Addr >= 512) break;
593 #if (EFUSE_READ_SWITCH == 1)
594 ReadEFuseByte(dev, eFuse_Addr, rtemp8);
596 rtemp8[0] = EFUSE_Read1Byte(dev, eFuse_Addr); eFuse_Addr++;
598 if(*rtemp8 != 0xFF && (eFuse_Addr < 512)) eFuse_Addr++;
603 efuseTbl[(i*8)+(j*2)]=(eFuseWord[i][j] & 0xff);
604 efuseTbl[(i*8)+((j*2)+1)]=((eFuseWord[i][j] >> 8) & 0xff);
607 for(i=0; i<_size_byte; i++)
608 pbuf[i] = efuseTbl[_offset+i];
610 #endif // #if (EFUSE_FOR_92SU == 1)
613 /*-----------------------------------------------------------------------------
614 * Function: EFUSE_ShadowRead
616 * Overview: Read from efuse init map !!!!!
626 * 11/12/2008 MHC Create Version 0.
628 *---------------------------------------------------------------------------*/
630 EFUSE_ShadowRead( struct net_device* dev, u8 Type, u16 Offset, u32 *Value)
632 //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
635 efuse_ShadowRead1Byte(dev, Offset, (u8 *)Value);
637 efuse_ShadowRead2Byte(dev, Offset, (u16 *)Value);
639 efuse_ShadowRead4Byte(dev, Offset, (u32 *)Value);
641 } // EFUSE_ShadowRead
644 /*-----------------------------------------------------------------------------
645 * Function: EFUSE_ShadowWrite
647 * Overview: Write efuse modify map for later update operation to use!!!!!
657 * 11/12/2008 MHC Create Version 0.
659 *---------------------------------------------------------------------------*/
661 EFUSE_ShadowWrite( struct net_device* dev, u8 Type, u16 Offset,u32 Value)
663 //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
665 if (Offset >= 0x18 && Offset <= 0x1F)
669 efuse_ShadowWrite1Byte(dev, Offset, (u8)Value);
671 efuse_ShadowWrite2Byte(dev, Offset, (u16)Value);
673 efuse_ShadowWrite4Byte(dev, Offset, (u32)Value);
675 } // EFUSE_ShadowWrite
678 /*-----------------------------------------------------------------------------
679 * Function: EFUSE_ShadowUpdate
681 * Overview: Compare init and modify map to update Efuse!!!!!
691 * 11/12/2008 MHC Create Version 0.
693 *---------------------------------------------------------------------------*/
695 EFUSE_ShadowUpdate(struct net_device* dev)
697 //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
698 struct r8192_priv *priv = ieee80211_priv(dev);
699 u16 i, offset, base = 0;
701 bool first_pg = false;
702 // For Efuse write action, we must enable LDO2.5V and 40MHZ clk.
703 efuse_PowerSwitch(dev, TRUE);
706 // Efuse support 16 write are with PG header packet!!!!
708 for (offset = 0; offset < 16; offset++)
710 // Offset 0x18-1F are reserved now!!!
712 if(priv->card_8192 == NIC_8192SE){
721 // Decide Word Enable Bit for the Efuse section
722 // One section contain 4 words = 8 bytes!!!!!
724 for (i = 0; i < 8; i++)
726 if (offset == 0 && priv->EfuseMap[EFUSE_INIT_MAP][base+i] == 0xFF)
731 // 2008/12/11 MH HW autoload fail workaround for A/BCUT.
733 if (first_pg == TRUE && offset == 1 && (priv->card_8192 == NIC_8192SE))
739 if (first_pg == TRUE)
741 word_en &= ~(1<<(i/2));
742 priv->EfuseMap[EFUSE_INIT_MAP][base+i] =
743 priv->EfuseMap[EFUSE_MODIFY_MAP][base+i];
746 if ( priv->EfuseMap[EFUSE_INIT_MAP][base+i] !=
747 priv->EfuseMap[EFUSE_MODIFY_MAP][base+i])
749 word_en &= ~(EFUSE_BIT(i/2));
750 //RT_TRACE(COMP_EFUSE, "Offset=%d Addr%x %x ==> %x Word_En=%02x\n",
751 //offset, base+i, priv->EfuseMap[0][base+i], priv->EfuseMap[1][base+i],word_en);
753 // Update init table!!!
754 priv->EfuseMap[EFUSE_INIT_MAP][base+i] =
755 priv->EfuseMap[EFUSE_MODIFY_MAP][base+i];
761 // Call Efuse real write section !!!!
768 memcpy(tmpdata, &(priv->EfuseMap[EFUSE_MODIFY_MAP][base]), 8);
769 //RT_PRINT_DATA(COMP_INIT, DBG_LOUD, ("U-EFUSE\n"), tmpdata, 8);
770 efuse_PgPacketWrite(dev,(u8)offset,word_en,tmpdata);
774 // 2008/12/01 MH For Efuse HW load bug workarounf method!!!!
775 // We will force write 0x10EC into address 10&11 after all Efuse content.
778 if (first_pg == TRUE && (priv->card_8192 == NIC_8192SE))
780 // 2008/12/11 MH Use new method to prevent HW autoload fail.
783 memcpy(tmpdata, (&priv->EfuseMap[EFUSE_MODIFY_MAP][8]), 8);
784 efuse_PgPacketWrite(dev, 1, 0x0, tmpdata);
786 u1Byte tmpdata[8] = {0xFF, 0xFF, 0xEC, 0x10, 0xFF, 0xFF, 0xFF, 0xFF};
788 efuse_PgPacketWrite(pAdapter, 1, 0xD, tmpdata);
794 // For warm reboot, we must resume Efuse clock to 500K.
795 efuse_PowerSwitch(dev, FALSE);
796 // 2008/12/01 MH We update shadow content again!!!!
797 EFUSE_ShadowMapUpdate(dev);
799 } // EFUSE_ShadowUpdate
802 /*-----------------------------------------------------------------------------
803 * Function: EFUSE_ShadowMapUpdate
805 * Overview: Transfer current EFUSE content to shadow init and modify map.
815 * 11/13/2008 MHC Create Version 0.
817 *---------------------------------------------------------------------------*/
818 extern void EFUSE_ShadowMapUpdate(struct net_device* dev)
820 struct r8192_priv *priv = ieee80211_priv(dev);
822 if (priv->AutoloadFailFlag == true){
823 memset(&(priv->EfuseMap[EFUSE_INIT_MAP][0]), 0xff, 128);
825 efuse_ReadAllMap(dev, &priv->EfuseMap[EFUSE_INIT_MAP][0]);
827 //PlatformMoveMemory(&priv->EfuseMap[EFUSE_MODIFY_MAP][0],
828 //&priv->EfuseMap[EFUSE_INIT_MAP][0], HWSET_MAX_SIZE_92S);//FIXLZM
829 memcpy(&priv->EfuseMap[EFUSE_MODIFY_MAP][0],
830 &priv->EfuseMap[EFUSE_INIT_MAP][0], HWSET_MAX_SIZE_92S);
832 } // EFUSE_ShadowMapUpdate
835 EFUSE_ForceWriteVendorId( struct net_device* dev)
837 u8 tmpdata[8] = {0xFF, 0xFF, 0xEC, 0x10, 0xFF, 0xFF, 0xFF, 0xFF};
839 efuse_PowerSwitch(dev, TRUE);
841 efuse_PgPacketWrite(dev, 1, 0xD, tmpdata);
843 efuse_PowerSwitch(dev, FALSE);
845 } // EFUSE_ForceWriteVendorId
847 /*-----------------------------------------------------------------------------
848 * Function: efuse_ShadowRead1Byte
849 * efuse_ShadowRead2Byte
850 * efuse_ShadowRead4Byte
852 * Overview: Read from efuse init map by one/two/four bytes !!!!!
862 * 11/12/2008 MHC Create Version 0.
864 *---------------------------------------------------------------------------*/
866 efuse_ShadowRead1Byte(struct net_device* dev, u16 Offset, u8 *Value)
868 struct r8192_priv *priv = ieee80211_priv(dev);
870 *Value = priv->EfuseMap[EFUSE_MODIFY_MAP][Offset];
872 } // EFUSE_ShadowRead1Byte
874 //---------------Read Two Bytes
876 efuse_ShadowRead2Byte(struct net_device* dev, u16 Offset, u16 *Value)
878 struct r8192_priv *priv = ieee80211_priv(dev);
880 *Value = priv->EfuseMap[EFUSE_MODIFY_MAP][Offset];
881 *Value |= priv->EfuseMap[EFUSE_MODIFY_MAP][Offset+1]<<8;
883 } // EFUSE_ShadowRead2Byte
885 //---------------Read Four Bytes
887 efuse_ShadowRead4Byte(struct net_device* dev, u16 Offset, u32 *Value)
889 struct r8192_priv *priv = ieee80211_priv(dev);
891 *Value = priv->EfuseMap[EFUSE_MODIFY_MAP][Offset];
892 *Value |= priv->EfuseMap[EFUSE_MODIFY_MAP][Offset+1]<<8;
893 *Value |= priv->EfuseMap[EFUSE_MODIFY_MAP][Offset+2]<<16;
894 *Value |= priv->EfuseMap[EFUSE_MODIFY_MAP][Offset+3]<<24;
896 } // efuse_ShadowRead4Byte
900 /*-----------------------------------------------------------------------------
901 * Function: efuse_ShadowWrite1Byte
902 * efuse_ShadowWrite2Byte
903 * efuse_ShadowWrite4Byte
905 * Overview: Write efuse modify map by one/two/four byte.
915 * 11/12/2008 MHC Create Version 0.
917 *---------------------------------------------------------------------------*/
919 efuse_ShadowWrite1Byte(struct net_device* dev, u16 Offset, u8 Value)
921 struct r8192_priv *priv = ieee80211_priv(dev);
923 priv->EfuseMap[EFUSE_MODIFY_MAP][Offset] = Value;
925 } // efuse_ShadowWrite1Byte
927 //---------------Write Two Bytes
929 efuse_ShadowWrite2Byte(struct net_device* dev, u16 Offset, u16 Value)
931 struct r8192_priv *priv = ieee80211_priv(dev);
933 priv->EfuseMap[EFUSE_MODIFY_MAP][Offset] = Value&0x00FF;
934 priv->EfuseMap[EFUSE_MODIFY_MAP][Offset+1] = Value>>8;
936 } // efuse_ShadowWrite1Byte
938 //---------------Write Four Bytes
940 efuse_ShadowWrite4Byte(struct net_device* dev, u16 Offset, u32 Value)
942 struct r8192_priv *priv = ieee80211_priv(dev);
944 priv->EfuseMap[EFUSE_MODIFY_MAP][Offset] = (u8)(Value&0x000000FF);
945 priv->EfuseMap[EFUSE_MODIFY_MAP][Offset+1] = (u8)((Value>>8)&0x0000FF);
946 priv->EfuseMap[EFUSE_MODIFY_MAP][Offset+2] = (u8)((Value>>16)&0x00FF);
947 priv->EfuseMap[EFUSE_MODIFY_MAP][Offset+3] = (u8)((Value>>24)&0xFF);
949 } // efuse_ShadowWrite1Byte
952 /* 11/16/2008 MH Read one byte from real Efuse. */
954 efuse_OneByteRead(struct net_device* dev, u16 addr,u8 *data)
959 // -----------------e-fuse reg ctrl ---------------------------------
961 write_nic_byte(dev, EFUSE_CTRL+1, (u8)(addr&0xff));
962 write_nic_byte(dev, EFUSE_CTRL+2, ((u8)((addr>>8) &0x03) ) |
963 (read_nic_byte(dev, EFUSE_CTRL+2)&0xFC ));
965 write_nic_byte(dev, EFUSE_CTRL+3, 0x72);//read cmd
967 while(!(0x80 &read_nic_byte(dev, EFUSE_CTRL+3))&&(tmpidx<100))
973 *data=read_nic_byte(dev, EFUSE_CTRL);
982 } // efuse_OneByteRead
984 /* 11/16/2008 MH Write one byte to reald Efuse. */
986 efuse_OneByteWrite(struct net_device* dev, u16 addr, u8 data)
991 //RT_TRACE(COMP_EFUSE, "Addr = %x Data=%x\n", addr, data);
995 // -----------------e-fuse reg ctrl ---------------------------------
997 write_nic_byte(dev, EFUSE_CTRL+1, (u8)(addr&0xff));
998 write_nic_byte(dev, EFUSE_CTRL+2,
999 read_nic_byte(dev, EFUSE_CTRL+2)|(u8)((addr>>8)&0x03) );
1001 write_nic_byte(dev, EFUSE_CTRL, data);//data
1002 write_nic_byte(dev, EFUSE_CTRL+3, 0xF2);//write cmd
1004 while((0x80 & read_nic_byte(dev, EFUSE_CTRL+3)) && (tmpidx<100) ){
1018 } // efuse_OneByteWrite
1021 /*-----------------------------------------------------------------------------
1022 * Function: efuse_ReadAllMap
1024 * Overview: Read All Efuse content
1034 * 11/11/2008 MHC Create Version 0.
1036 *---------------------------------------------------------------------------*/
1038 efuse_ReadAllMap(struct net_device* dev, u8 *Efuse)
1043 //static u8 index = 0;
1046 // We must enable clock and LDO 2.5V otherwise, read all map will be fail!!!!
1048 efuse_PowerSwitch(dev, TRUE);
1049 ReadEFuse(dev, 0, 128, Efuse);
1050 efuse_PowerSwitch(dev, FALSE);
1052 // ==> Prevent efuse read error!!!
1053 RT_TRACE(COMP_INIT, "efuse_ResetLoader\n");
1054 efuse_ResetLoader(dev);
1056 // Change Efuse Clock for write action to 40MHZ
1057 write_nic_byte(dev, EFUSE_CLK, 0x03);
1059 ReadEFuse(dev, 0, 128, Efuse);
1061 // Change Efuse Clock for write action to 500K
1062 write_nic_byte(dev, EFUSE_CLK, 0x02);
1063 #if 0 // Error !!!!!!
1064 for(offset = 0;offset<16;offset++) // For 8192SE
1066 PlatformFillMemory((PVOID)pg_data, 8, 0xff);
1067 efuse_PgPacketRead(pAdapter,offset,pg_data);
1069 PlatformMoveMemory((PVOID)&Efuse[offset*8], (PVOID)pg_data, 8);
1074 // Error Check and Reset Again!!!!
1076 if (Efuse[0] != 0x29 || Efuse[1] != 0x81)
1078 // SW autoload fail, we have to read again!!!
1081 RT_TRACE(COMP_INIT, "EFUSE R FAIL %d\n", index);
1082 efuse_ReadAllMap(dev, Efuse);
1083 // Wait a few time ???? Or need to do some setting ???
1084 // When we reload driver, efuse will be OK!!
1092 //efuse_PowerSwitch(pAdapter, FALSE);
1094 } // efuse_ReadAllMap
1097 /*-----------------------------------------------------------------------------
1098 * Function: efuse_WriteAllMap
1100 * Overview: Write All Efuse content
1110 * 11/11/2008 MHC Create Version 0.
1112 *---------------------------------------------------------------------------*/
1115 efuse_WriteAllMap(struct net_device* dev,u8 *eeprom, u32 eeprom_size)
1117 unsigned char word_en = 0x00;
1119 unsigned char tmpdata[8];
1120 unsigned char offset;
1122 // For Efuse write action, we must enable LDO2.5V and 40MHZ clk.
1123 efuse_PowerSwitch(dev, TRUE);
1126 for(offset=0 ; offset< eeprom_size/PGPKT_DATA_SIZE ; offset++)
1128 // 92S will only reserv 0x18-1F 8 bytes now. The 3rd efuse write area!
1129 if (IS_HARDWARE_TYPE_8192SE(dev))
1132 // 0x18-1f Reserve >0x50 Reserve for tx power
1133 if (offset == 3/* || offset > 9*/)
1134 continue;//word_en = 0x0F;
1135 //else if (offset == 9) // 0x4c-4f Reserve
1140 //RT_TRACE(COMP_EFUSE, ("Addr=%d size=%d Word_En=%02x\n", offset, eeprom_size, word_en));
1142 //memcpy(tmpdata,eeprom+(offset*PGPKT_DATA_SIZE),8);
1143 memcpy(tmpdata, (eeprom+(offset*PGPKT_DATA_SIZE)), 8);
1145 //RT_PRINT_DATA(COMP_INIT, DBG_LOUD, ("EFUSE\t"), tmpdata, 8);
1147 efuse_PgPacketWrite(dev,offset,word_en,tmpdata);
1152 // For warm reboot, we must resume Efuse clock to 500K.
1153 efuse_PowerSwitch(dev, FALSE);
1155 } // efuse_WriteAllMap
1158 /*-----------------------------------------------------------------------------
1159 * Function: efuse_PgPacketRead
1161 * Overview: Receive dedicated Efuse are content. For92s, we support 16
1162 * area now. It will return 8 bytes content for every area.
1172 * 11/16/2008 MHC Reorganize code Arch and assign as local API.
1174 *---------------------------------------------------------------------------*/
1176 efuse_PgPacketRead( struct net_device* dev, u8 offset, u8 *data)
1178 u8 ReadState = PG_STATE_HEADER;
1180 bool bContinual = TRUE;
1181 bool bDataEmpty = TRUE ;
1183 u8 efuse_data,word_cnts=0;
1185 u8 hoffset=0,hworden=0;
1189 if(data==NULL) return FALSE;
1190 if(offset>15) return FALSE;
1193 //PlatformFillMemory((PVOID)data, sizeof(u8)*PGPKT_DATA_SIZE, 0xff);
1194 //PlatformFillMemory((PVOID)tmpdata, sizeof(u8)*PGPKT_DATA_SIZE, 0xff);
1195 memset(data, 0xff, sizeof(u8)*PGPKT_DATA_SIZE);
1196 memset(tmpdata, 0xff, sizeof(u8)*PGPKT_DATA_SIZE);
1198 //RT_PRINT_DATA(COMP_EFUSE, DBG_LOUD, ("efuse_PgPacketRead-1\n"), data, 8);
1200 //efuse_reg_ctrl(pAdapter,TRUE);//power on
1201 while(bContinual && (efuse_addr < EFUSE_MAX_SIZE) )
1203 //------- Header Read -------------
1204 if(ReadState & PG_STATE_HEADER)
1206 if(efuse_OneByteRead(dev, efuse_addr ,&efuse_data)&&(efuse_data!=0xFF)){
1207 hoffset = (efuse_data>>4) & 0x0F;
1208 hworden = efuse_data & 0x0F;
1209 word_cnts = efuse_CalculateWordCnts(hworden);
1212 if(hoffset==offset){
1213 for(tmpidx = 0;tmpidx< word_cnts*2 ;tmpidx++){
1214 if(efuse_OneByteRead(dev, efuse_addr+1+tmpidx ,&efuse_data) ){
1215 tmpdata[tmpidx] = efuse_data;
1216 if(efuse_data!=0xff){
1221 if(bDataEmpty==FALSE){
1222 ReadState = PG_STATE_DATA;
1223 }else{//read next header
1224 efuse_addr = efuse_addr + (word_cnts*2)+1;
1225 ReadState = PG_STATE_HEADER;
1228 else{//read next header
1229 efuse_addr = efuse_addr + (word_cnts*2)+1;
1230 ReadState = PG_STATE_HEADER;
1235 bContinual = FALSE ;
1238 //------- Data section Read -------------
1239 else if(ReadState & PG_STATE_DATA)
1241 efuse_WordEnableDataRead(hworden,tmpdata,data);
1242 efuse_addr = efuse_addr + (word_cnts*2)+1;
1243 ReadState = PG_STATE_HEADER;
1247 //efuse_reg_ctrl(pAdapter,FALSE);//power off
1249 //RT_PRINT_DATA(COMP_EFUSE, DBG_LOUD, ("efuse_PgPacketRead-2\n"), data, 8);
1251 if( (data[0]==0xff) &&(data[1]==0xff) && (data[2]==0xff) && (data[3]==0xff) &&
1252 (data[4]==0xff) &&(data[5]==0xff) && (data[6]==0xff) && (data[7]==0xff))
1257 } // efuse_PgPacketRead
1260 /*-----------------------------------------------------------------------------
1261 * Function: efuse_PgPacketWrite
1263 * Overview: Send A G package for different section in real efuse area.
1264 * For 92S, One PG package contain 8 bytes content and 4 word
1265 * unit. PG header = 0x[bit7-4=offset][bit3-0word enable]
1275 * 11/16/2008 MHC Reorganize code Arch and assign as local API.
1277 *---------------------------------------------------------------------------*/
1278 static u8 efuse_PgPacketWrite(struct net_device* dev, u8 offset, u8 word_en,u8 *data)
1280 u8 WriteState = PG_STATE_HEADER;
1282 bool bContinual = TRUE,bDataEmpty=TRUE, bResult = TRUE;
1289 u8 tmp_word_cnts=0,target_word_cnts=0;
1290 u8 tmp_header,match_word_en,tmp_word_en;
1292 //u8 efuse_clk_ori,efuse_clk_new;
1294 PGPKT_STRUCT target_pkt;
1295 PGPKT_STRUCT tmp_pkt;
1297 u8 originaldata[sizeof(u8)*8];
1298 u8 tmpindex = 0,badworden = 0x0F;
1300 static u32 repeat_times = 0;
1302 if( efuse_GetCurrentSize(dev) >= EFUSE_MAX_SIZE)
1304 printk("efuse_PgPacketWrite error \n");
1308 // Init the 8 bytes content as 0xff
1309 target_pkt.offset = offset;
1310 target_pkt.word_en= word_en;
1312 //PlatformFillMemory((PVOID)target_pkt.data, sizeof(u8)*8, 0xFF);
1313 memset(target_pkt.data,0xFF,sizeof(u8)*8);
1315 efuse_WordEnableDataRead(word_en,data,target_pkt.data);
1316 target_word_cnts = efuse_CalculateWordCnts(target_pkt.word_en);
1318 //efuse_reg_ctrl(pAdapter,TRUE);//power on
1319 printk("EFUSE Power ON\n");
1321 while( bContinual && (efuse_addr < EFUSE_MAX_SIZE) )
1324 if(WriteState==PG_STATE_HEADER)
1328 //************ so *******************
1329 printk("EFUSE PG_STATE_HEADER\n");
1330 if ( efuse_OneByteRead(dev, efuse_addr ,&efuse_data) &&
1333 tmp_header = efuse_data;
1335 tmp_pkt.offset = (tmp_header>>4) & 0x0F;
1336 tmp_pkt.word_en = tmp_header & 0x0F;
1337 tmp_word_cnts = efuse_CalculateWordCnts(tmp_pkt.word_en);
1339 //************ so-1 *******************
1340 if(tmp_pkt.offset != target_pkt.offset)
1342 efuse_addr = efuse_addr + (tmp_word_cnts*2) +1; //Next pg_packet
1343 #if (EFUSE_ERROE_HANDLE == 1)
1344 WriteState = PG_STATE_HEADER;
1349 //************ so-2 *******************
1350 for(tmpindex=0 ; tmpindex<(tmp_word_cnts*2) ; tmpindex++)
1352 if(efuse_OneByteRead(dev, (efuse_addr+1+tmpindex) ,&efuse_data)&&(efuse_data != 0xFF)){
1356 //************ so-2-1 *******************
1357 if(bDataEmpty == FALSE)
1359 efuse_addr = efuse_addr + (tmp_word_cnts*2) +1; //Next pg_packet
1360 #if (EFUSE_ERROE_HANDLE == 1)
1361 WriteState=PG_STATE_HEADER;
1365 {//************ so-2-2 *******************
1366 match_word_en = 0x0F;
1367 if( !( (target_pkt.word_en&BIT0)|(tmp_pkt.word_en&BIT0) ))
1369 match_word_en &= (~BIT0);
1371 if( !( (target_pkt.word_en&BIT1)|(tmp_pkt.word_en&BIT1) ))
1373 match_word_en &= (~BIT1);
1375 if( !( (target_pkt.word_en&BIT2)|(tmp_pkt.word_en&BIT2) ))
1377 match_word_en &= (~BIT2);
1379 if( !( (target_pkt.word_en&BIT3)|(tmp_pkt.word_en&BIT3) ))
1381 match_word_en &= (~BIT3);
1384 //************ so-2-2-A *******************
1385 if((match_word_en&0x0F)!=0x0F)
1387 badworden = efuse_WordEnableDataWrite(dev,efuse_addr+1, tmp_pkt.word_en ,target_pkt.data);
1389 //************ so-2-2-A-1 *******************
1390 //############################
1391 if(0x0F != (badworden&0x0F))
1393 u8 reorg_offset = offset;
1394 u8 reorg_worden=badworden;
1395 efuse_PgPacketWrite(dev,reorg_offset,reorg_worden,originaldata);
1397 //############################
1400 if( (target_pkt.word_en&BIT0)^(match_word_en&BIT0) )
1402 tmp_word_en &= (~BIT0);
1404 if( (target_pkt.word_en&BIT1)^(match_word_en&BIT1) )
1406 tmp_word_en &= (~BIT1);
1408 if( (target_pkt.word_en&BIT2)^(match_word_en&BIT2) )
1410 tmp_word_en &= (~BIT2);
1412 if( (target_pkt.word_en&BIT3)^(match_word_en&BIT3) )
1414 tmp_word_en &=(~BIT3);
1417 //************ so-2-2-A-2 *******************
1418 if((tmp_word_en&0x0F)!=0x0F){
1419 //reorganize other pg packet
1420 //efuse_addr = efuse_addr + (2*tmp_word_cnts) +1;//next pg packet addr
1421 efuse_addr = efuse_GetCurrentSize(dev);
1422 //===========================
1423 target_pkt.offset = offset;
1424 target_pkt.word_en= tmp_word_en;
1425 //===========================
1429 #if (EFUSE_ERROE_HANDLE == 1)
1430 WriteState=PG_STATE_HEADER;
1432 if(repeat_times>EFUSE_REPEAT_THRESHOLD_){
1438 else{//************ so-2-2-B *******************
1439 //reorganize other pg packet
1440 efuse_addr = efuse_addr + (2*tmp_word_cnts) +1;//next pg packet addr
1441 //===========================
1442 target_pkt.offset = offset;
1443 target_pkt.word_en= target_pkt.word_en;
1444 //===========================
1445 #if (EFUSE_ERROE_HANDLE == 1)
1446 WriteState=PG_STATE_HEADER;
1451 printk("EFUSE PG_STATE_HEADER-1\n");
1453 else //************ s1: header == oxff *******************
1455 pg_header = ((target_pkt.offset << 4)&0xf0) |target_pkt.word_en;
1457 efuse_OneByteWrite(dev,efuse_addr, pg_header);
1458 efuse_OneByteRead(dev,efuse_addr, &tmp_header);
1460 if(tmp_header == pg_header)
1461 { //************ s1-1*******************
1462 WriteState = PG_STATE_DATA;
1464 #if (EFUSE_ERROE_HANDLE == 1)
1465 else if(tmp_header == 0xFF){//************ s1-3: if Write or read func doesn't work *******************
1466 //efuse_addr doesn't change
1467 WriteState = PG_STATE_HEADER;
1469 if(repeat_times>EFUSE_REPEAT_THRESHOLD_){
1476 {//************ s1-2 : fixed the header procedure *******************
1477 tmp_pkt.offset = (tmp_header>>4) & 0x0F;
1478 tmp_pkt.word_en= tmp_header & 0x0F;
1479 tmp_word_cnts = efuse_CalculateWordCnts(tmp_pkt.word_en);
1481 //************ s1-2-A :cover the exist data *******************
1482 memset(originaldata,0xff,sizeof(u8)*8);
1483 //PlatformFillMemory((PVOID)originaldata, sizeof(u8)*8, 0xff);
1485 if(efuse_PgPacketRead( dev, tmp_pkt.offset,originaldata))
1486 { //check if data exist
1487 //efuse_reg_ctrl(pAdapter,TRUE);//power on
1488 badworden = efuse_WordEnableDataWrite(dev,efuse_addr+1,tmp_pkt.word_en,originaldata);
1489 //############################
1490 if(0x0F != (badworden&0x0F))
1492 u8 reorg_offset = tmp_pkt.offset;
1493 u8 reorg_worden=badworden;
1494 efuse_PgPacketWrite(dev,reorg_offset,reorg_worden,originaldata);
1495 efuse_addr = efuse_GetCurrentSize(dev);
1497 //############################
1499 efuse_addr = efuse_addr + (tmp_word_cnts*2) +1; //Next pg_packet
1502 //************ s1-2-B: wrong address*******************
1505 efuse_addr = efuse_addr + (tmp_word_cnts*2) +1; //Next pg_packet
1508 #if (EFUSE_ERROE_HANDLE == 1)
1509 WriteState=PG_STATE_HEADER;
1511 if(repeat_times>EFUSE_REPEAT_THRESHOLD_){
1517 printk("EFUSE PG_STATE_HEADER-2\n");
1524 else if(WriteState==PG_STATE_DATA)
1525 { //************ s1-1 *******************
1526 printk("EFUSE PG_STATE_DATA\n");
1528 badworden = efuse_WordEnableDataWrite(dev,efuse_addr+1,target_pkt.word_en,target_pkt.data);
1529 if((badworden&0x0F)==0x0F)
1530 { //************ s1-1-A *******************
1534 {//reorganize other pg packet //************ s1-1-B *******************
1535 efuse_addr = efuse_addr + (2*target_word_cnts) +1;//next pg packet addr
1537 //===========================
1538 target_pkt.offset = offset;
1539 target_pkt.word_en= badworden;
1540 target_word_cnts = efuse_CalculateWordCnts(target_pkt.word_en);
1541 //===========================
1542 #if (EFUSE_ERROE_HANDLE == 1)
1543 WriteState=PG_STATE_HEADER;
1545 if(repeat_times>EFUSE_REPEAT_THRESHOLD_){
1550 printk("EFUSE PG_STATE_HEADER-3\n");
1555 //efuse_reg_ctrl(pAdapter,FALSE);//power off
1558 } // efuse_PgPacketWrite
1561 /*-----------------------------------------------------------------------------
1562 * Function: efuse_WordEnableDataRead
1564 * Overview: Read allowed word in current efuse section data.
1574 * 11/16/2008 MHC Create Version 0.
1575 * 11/21/2008 MHC Fix Write bug when we only enable late word.
1577 *---------------------------------------------------------------------------*/
1579 efuse_WordEnableDataRead( u8 word_en,u8 *sourdata,u8 *targetdata)
1583 //DbgPrint("efuse_WordEnableDataRead word_en = %x\n", word_en);
1585 //RT_PRINT_DATA(COMP_EFUSE, DBG_LOUD, ("sourdata\n"), sourdata, 8);
1586 //RT_PRINT_DATA(COMP_EFUSE, DBG_LOUD, ("targetdata\n"), targetdata, 8);
1588 if (!(word_en&BIT0))
1590 targetdata[0] = sourdata[0];//sourdata[tmpindex++];
1591 targetdata[1] = sourdata[1];//sourdata[tmpindex++];
1593 if (!(word_en&BIT1))
1595 targetdata[2] = sourdata[2];//sourdata[tmpindex++];
1596 targetdata[3] = sourdata[3];//sourdata[tmpindex++];
1598 if (!(word_en&BIT2))
1600 targetdata[4] = sourdata[4];//sourdata[tmpindex++];
1601 targetdata[5] = sourdata[5];//sourdata[tmpindex++];
1603 if (!(word_en&BIT3))
1605 targetdata[6] = sourdata[6];//sourdata[tmpindex++];
1606 targetdata[7] = sourdata[7];//sourdata[tmpindex++];
1608 } // efuse_WordEnableDataRead
1611 /*-----------------------------------------------------------------------------
1612 * Function: efuse_WordEnableDataWrite
1614 * Overview: Write necessary word unit into current efuse section!
1624 * 11/16/2008 MHC Reorganize Efuse operate flow!!.
1626 *---------------------------------------------------------------------------*/
1628 efuse_WordEnableDataWrite( struct net_device* dev, u16 efuse_addr, u8 word_en, u8 *data)
1631 u16 start_addr = efuse_addr;
1632 u8 badworden = 0x0F;
1636 memset(tmpdata,0xff,PGPKT_DATA_SIZE);
1637 //PlatformFillMemory((PVOID)tmpdata, PGPKT_DATA_SIZE, 0xff);
1639 //RT_TRACE(COMP_EFUSE, "word_en = %x efuse_addr=%x\n", word_en, efuse_addr);
1641 //RT_PRINT_DATA(COMP_EFUSE, DBG_LOUD, ("U-EFUSE\n"), data, 8);
1645 tmpaddr = start_addr;
1646 efuse_OneByteWrite(dev,start_addr++, data[0]);
1647 efuse_OneByteWrite(dev,start_addr++, data[1]);
1649 efuse_OneByteRead(dev,tmpaddr, &tmpdata[0]);
1650 efuse_OneByteRead(dev,tmpaddr+1, &tmpdata[1]);
1651 if((data[0]!=tmpdata[0])||(data[1]!=tmpdata[1])){
1652 badworden &= (~BIT0);
1657 tmpaddr = start_addr;
1658 efuse_OneByteWrite(dev,start_addr++, data[2]);
1659 efuse_OneByteWrite(dev,start_addr++, data[3]);
1661 efuse_OneByteRead(dev,tmpaddr , &tmpdata[2]);
1662 efuse_OneByteRead(dev,tmpaddr+1, &tmpdata[3]);
1663 if((data[2]!=tmpdata[2])||(data[3]!=tmpdata[3])){
1664 badworden &=( ~BIT1);
1669 tmpaddr = start_addr;
1670 efuse_OneByteWrite(dev,start_addr++, data[4]);
1671 efuse_OneByteWrite(dev,start_addr++, data[5]);
1673 efuse_OneByteRead(dev,tmpaddr, &tmpdata[4]);
1674 efuse_OneByteRead(dev,tmpaddr+1, &tmpdata[5]);
1675 if((data[4]!=tmpdata[4])||(data[5]!=tmpdata[5])){
1676 badworden &=( ~BIT2);
1681 tmpaddr = start_addr;
1682 efuse_OneByteWrite(dev,start_addr++, data[6]);
1683 efuse_OneByteWrite(dev,start_addr++, data[7]);
1685 efuse_OneByteRead(dev,tmpaddr, &tmpdata[6]);
1686 efuse_OneByteRead(dev,tmpaddr+1, &tmpdata[7]);
1687 if((data[6]!=tmpdata[6])||(data[7]!=tmpdata[7])){
1688 badworden &=( ~BIT3);
1692 } // efuse_WordEnableDataWrite
1695 /*-----------------------------------------------------------------------------
1696 * Function: efuse_PowerSwitch
1698 * Overview: When we want to enable write operation, we should change to
1699 * pwr on state. When we stop write, we should switch to 500k mode
1700 * and disable LDO 2.5V.
1710 * 11/17/2008 MHC Create Version 0.
1712 *---------------------------------------------------------------------------*/
1714 efuse_PowerSwitch(struct net_device* dev, u8 PwrState)
1717 if (PwrState == TRUE)
1719 // Enable LDO 2.5V for write action
1720 tempval = read_nic_byte(dev, EFUSE_TEST+3);
1721 write_nic_byte(dev, EFUSE_TEST+3, (tempval | 0x80));
1723 // Change Efuse Clock for write action to 40MHZ
1724 write_nic_byte(dev, EFUSE_CLK, 0x03);
1728 // Enable LDO 2.5V for write action
1729 tempval = read_nic_byte(dev, EFUSE_TEST+3);
1730 write_nic_byte(dev, EFUSE_TEST+3, (tempval & 0x7F));
1732 // Change Efuse Clock for write action to 500K
1733 write_nic_byte(dev, EFUSE_CLK, 0x02);
1736 } /* efuse_PowerSwitch */
1739 /*-----------------------------------------------------------------------------
1740 * Function: efuse_GetCurrentSize
1742 * Overview: Get current efuse size!!!
1752 * 11/16/2008 MHC Create Version 0.
1754 *---------------------------------------------------------------------------*/
1756 efuse_GetCurrentSize(struct net_device* dev)
1758 bool bContinual = TRUE;
1761 u8 hoffset=0,hworden=0;
1762 u8 efuse_data,word_cnts=0;
1764 //efuse_reg_ctrl(pAdapter,TRUE);//power on
1766 while ( bContinual &&
1767 efuse_OneByteRead(dev, efuse_addr ,&efuse_data) &&
1768 (efuse_addr < EFUSE_MAX_SIZE) )
1770 if(efuse_data!=0xFF)
1772 hoffset = (efuse_data>>4) & 0x0F;
1773 hworden = efuse_data & 0x0F;
1774 word_cnts = efuse_CalculateWordCnts(hworden);
1776 efuse_addr = efuse_addr + (word_cnts*2)+1;
1780 bContinual = FALSE ;
1784 //efuse_reg_ctrl(pAdapter,FALSE);//power off
1788 } // efuse_GetCurrentSize}
1791 /* 11/16/2008 MH Add description. Get current efuse area enabled word!!. */
1793 efuse_CalculateWordCnts(u8 word_en)
1796 if(!(word_en & BIT0)) word_cnts++; // 0 : write enable
1797 if(!(word_en & BIT1)) word_cnts++;
1798 if(!(word_en & BIT2)) word_cnts++;
1799 if(!(word_en & BIT3)) word_cnts++;
1801 } // efuse_CalculateWordCnts
1804 /*-----------------------------------------------------------------------------
1805 * Function: efuse_ResetLoader
1807 * Overview: When read Efuse Fail we must reset loader!!!!
1817 * 11/22/2008 MHC Create Version 0.
1819 *---------------------------------------------------------------------------*/
1821 static void efuse_ResetLoader(struct net_device* dev)
1826 // 2008/11/22 MH Sometimes, we may read efuse fail, for preventing the condition
1827 // We have to reset loader.
1829 tmpU2b = read_nic_word(dev, SYS_FUNC_EN);
1830 write_nic_word(dev, SYS_FUNC_EN, (tmpU2b&~(BIT12)));
1831 //PlatformStallExecution(10000); // How long should we delay!!!
1833 write_nic_word(dev, SYS_FUNC_EN, (tmpU2b|BIT12));
1834 //PlatformStallExecution(10000); // How long should we delay!!!
1837 } // efuse_ResetLoader
1840 /*-----------------------------------------------------------------------------
1841 * Function: EFUSE_ProgramMap
1843 * Overview: Read EFUSE map file and execute PG.
1853 * 11/10/2008 MHC Create Version 0.
1855 *---------------------------------------------------------------------------*/
1857 extern bool // 0=Shadow 1=Real Efuse
1858 EFUSE_ProgramMap(struct net_device* dev, char* pFileName,u8 TableType)
1860 struct r8192_priv *priv = ieee80211_priv(dev);
1861 s4Byte nLinesRead, ithLine;
1862 RT_STATUS rtStatus = RT_STATUS_SUCCESS;
1864 u32 u4bRegValue, u4RegMask;
1868 u8 eeprom[HWSET_MAX_SIZE_92S];
1870 rtStatus = PlatformReadFile(
1873 (u8*)(priv->BufOfLines),
1874 MAX_LINES_HWCONFIG_TXT,
1875 MAX_BYTES_LINE_HWCONFIG_TXT,
1879 if(rtStatus == RT_STATUS_SUCCESS)
1881 memcp(pHalData->BufOfLines3, pHalData->BufOfLines,
1882 nLinesRead*MAX_BYTES_LINE_HWCONFIG_TXT);
1883 pHalData->nLinesRead3 = nLinesRead;
1886 if(rtStatus == RT_STATUS_SUCCESS)
1888 printk("szEepromFile(): read %s ok\n", pFileName);
1889 for(ithLine = 0; ithLine < nLinesRead; ithLine++)
1891 szLine = pHalData->BufOfLines[ithLine];
1892 printk("Line-%d String =%s\n", ithLine, szLine);
1894 if(!IsCommentString(szLine))
1896 // EEPROM map one line has 8 words content.
1897 for (i = 0; i < 8; i++)
1901 //GetHexValueFromString(szLine, &u4bRegValue, &u4bMove);
1902 efuse_ParsingMap(szLine, &u4bRegValue, &u4bMove);
1904 // Get next hex value as EEPROM value.
1906 //WriteEEprom(dev, (u16)(ithLine*8+i), (u16)u4bRegValue);
1907 eeprom[index++] = (u8)(u4bRegValue&0xff);
1908 eeprom[index++] = (u8)((u4bRegValue>>8)&0xff);
1910 printk("Addr-%d = %x\n", (ithLine*8+i), u4bRegValue);
1919 printk("szEepromFile(): Fail read%s\n", pFileName);
1920 return RT_STATUS_FAILURE;
1924 //RT_PRINT_DATA(COMP_EFUSE, DBG_LOUD, ("EFUSE "), eeprom, HWSET_MAX_SIZE_92S);
1926 // Use map file to update real Efuse or shadow modify table.
1929 efuse_WriteAllMap(dev, eeprom, HWSET_MAX_SIZE_92S);
1933 // Modify shadow table.
1934 for (i = 0; i < HWSET_MAX_SIZE_92S; i++)
1935 EFUSE_ShadowWrite(dev, 1, i, (u32)eeprom[i]);
1939 } /* EFUSE_ProgramMap */
1945 // Return TRUE if chTmp is represent for hex digit and
1949 bool IsHexDigit( char chTmp)
1951 if( (chTmp >= '0' && chTmp <= '9') ||
1952 (chTmp >= 'a' && chTmp <= 'f') ||
1953 (chTmp >= 'A' && chTmp <= 'F') )
1965 // Translate a character to hex digit.
1967 u32 MapCharToHexDigit(char chTmp)
1969 if(chTmp >= '0' && chTmp <= '9')
1970 return (chTmp - '0');
1971 else if(chTmp >= 'a' && chTmp <= 'f')
1972 return (10 + (chTmp - 'a'));
1973 else if(chTmp >= 'A' && chTmp <= 'F')
1974 return (10 + (chTmp - 'A'));
1979 /*-----------------------------------------------------------------------------
1980 * Function: efuse_ParsingMap
1992 * 11/08/2008 MHC Create Version 0.
1994 *---------------------------------------------------------------------------*/
1997 efuse_ParsingMap(char* szStr,u32* pu4bVal,u32* pu4bMove)
1999 char* szScan = szStr;
2001 // Check input parameter.
2002 if(szStr == NULL || pu4bVal == NULL || pu4bMove == NULL)
2004 //RT_TRACE(COMP_EFUSE,
2005 //"eeprom_ParsingMap(): Invalid IN args! szStr: %p, pu4bVal: %p, pu4bMove: %p\n",
2006 //szStr, pu4bVal, pu4bMove);
2010 // Initialize output.
2014 // Skip leading space.
2015 while( *szScan != '\0' &&
2016 (*szScan == ' ' || *szScan == '\t') )
2022 // Check if szScan is now pointer to a character for hex digit,
2023 // if not, it means this is not a valid hex number.
2024 if(!IsHexDigit(*szScan))
2029 // Parse each digit.
2033 *pu4bVal += MapCharToHexDigit(*szScan);
2037 } while(IsHexDigit(*szScan));
2041 } /* efuse_ParsingMap */
2045 // Useless Section Code Now!!!!!!
2047 // Porting from 8712 SDIO
2048 int efuse_one_byte_rw(struct net_device* dev, u8 bRead, u16 addr, u8 *data)
2051 //u8 efuse_ctlreg,tmpidx = 0;
2055 // -----------------e-fuse reg ctrl ---------------------------------
2057 write_nic_byte(dev, EFUSE_CTRL+1, (u8)(addr&0xff)); //address
2058 tmpv8 = ((u8)((addr>>8) &0x03) ) | (read_nic_byte(dev, EFUSE_CTRL+2)&0xFC );
2059 write_nic_byte(dev, EFUSE_CTRL+2, tmpv8);
2063 write_nic_byte(dev, EFUSE_CTRL+3, 0x72);//read cmd
2065 while(!(0x80 & read_nic_byte(dev, EFUSE_CTRL+3)) && (tmpidx<100) ){
2069 *data=read_nic_byte(dev, EFUSE_CTRL);
2081 write_nic_byte(dev, EFUSE_CTRL, *data);//data
2083 write_nic_byte(dev, EFUSE_CTRL+3, 0xF2);//write cmd
2085 while((0x80 & read_nic_byte(dev, EFUSE_CTRL+3)) && (tmpidx<100) ){
2090 *data=read_nic_byte(dev, EFUSE_CTRL);
2102 //------------------------------------------------------------------------------
2103 void efuse_access(struct net_device* dev, u8 bRead,u16 start_addr, u8 cnts, u8 *data)
2105 u8 efuse_clk_ori,efuse_clk_new;//,tmp8;
2108 if(start_addr>0x200) return;
2109 //RT_TRACE(_module_rtl871x_mp_ioctl_c_,_drv_err_,
2110 // ("\n ===> efuse_access [start_addr=0x%x cnts:%d dataarray:0x%08x Query Efuse].\n",start_addr,cnts,data));
2111 // -----------------SYS_FUNC_EN Digital Core Vdd enable ---------------------------------
2112 efuse_clk_ori = read_nic_byte(dev,SYS_FUNC_EN+1);
2113 efuse_clk_new = efuse_clk_ori|0x20;
2115 if(efuse_clk_new!= efuse_clk_ori){
2116 //RT_TRACE(_module_rtl871x_mp_ioctl_c_,_drv_err_,("====write 0x10250003=====\n"));
2117 write_nic_byte(dev, SYS_FUNC_EN+1, efuse_clk_new);
2119 #ifdef _POWERON_DELAY_
2122 // -----------------e-fuse pwr & clk reg ctrl ---------------------------------
2123 write_nic_byte(dev, EFUSE_TEST+3, (read_nic_byte(dev, EFUSE_TEST+3)|0x80));
2124 write_nic_byte(dev, EFUSE_CLK_CTRL, (read_nic_byte(dev, EFUSE_CLK_CTRL)|0x03));
2126 #ifdef _PRE_EXECUTE_READ_CMD_
2128 unsigned char tmpdata;
2129 efuse_OneByteRead(dev, 0,&tmpdata);
2133 //-----------------e-fuse one byte read / write ------------------------------
2134 for(i=0;i<cnts;i++){
2135 efuse_one_byte_rw(dev,bRead, start_addr+i , data+i);
2136 ////RT_TRACE(_module_rtl871x_mp_ioctl_c_,_drv_err_,("==>efuse_access addr:0x%02x value:0x%02x\n",data+i,*(data+i)));
2138 // -----------------e-fuse pwr & clk reg ctrl ---------------------------------
2139 write_nic_byte(dev, EFUSE_TEST+3, read_nic_byte(dev, EFUSE_TEST+3)&0x7f);
2140 write_nic_byte(dev, EFUSE_CLK_CTRL, read_nic_byte(dev, EFUSE_CLK_CTRL)&0xfd);
2142 // -----------------SYS_FUNC_EN Digital Core Vdd disable ---------------------------------
2143 if(efuse_clk_new != efuse_clk_ori) write_nic_byte(dev, 0x10250003, efuse_clk_ori);
2146 //------------------------------------------------------------------------------
2147 //------------------------------------------------------------------------------
2150 static void efuse_reg_ctrl(struct net_device* dev, u8 bPowerOn)
2153 // -----------------SYS_FUNC_EN Digital Core Vdd enable ---------------------------------
2154 write_nic_byte(dev, SYS_FUNC_EN+1, read_nic_byte(dev,SYS_FUNC_EN+1)|0x20);
2155 #ifdef _POWERON_DELAY_
2158 // -----------------e-fuse pwr & clk reg ctrl ---------------------------------
2159 write_nic_byte(dev, EFUSE_TEST+4, (read_nic_byte(dev, EFUSE_TEST+4)|0x80));
2160 write_nic_byte(dev, EFUSE_CLK_CTRL, (read_nic_byte(dev, EFUSE_CLK_CTRL)|0x03));
2161 #ifdef _PRE_EXECUTE_READ_CMD_
2163 unsigned char tmpdata;
2164 efuse_OneByteRead(dev, 0,&tmpdata);
2170 // -----------------e-fuse pwr & clk reg ctrl ---------------------------------
2171 write_nic_byte(dev, EFUSE_TEST+4, read_nic_byte(dev, EFUSE_TEST+4)&0x7f);
2172 write_nic_byte(dev, EFUSE_CLK_CTRL, read_nic_byte(dev, EFUSE_CLK_CTRL)&0xfd);
2173 // -----------------SYS_FUNC_EN Digital Core Vdd disable ---------------------------------
2175 //write_nic_byte(pAdapter, SYS_FUNC_EN+1, read_nic_byte(pAdapter,SYS_FUNC_EN+1)&0xDF);
2181 //------------------------------------------------------------------------------
2183 //------------------------------------------------------------------------------
2184 void efuse_read_data(struct net_device* dev,u8 efuse_read_item,u8 *data,u32 data_size)
2186 u8 offset, word_start,byte_start,byte_cnts;
2187 u8 efusedata[EFUSE_MAC_LEN];
2194 //u8 temp_value[8] = {0xff};
2196 if(efuse_read_item> (sizeof(RTL8712_SDIO_EFUSE_TABLE)/sizeof(EFUSE_MAP))){
2201 offset = RTL8712_SDIO_EFUSE_TABLE[efuse_read_item].offset ;
2202 word_start = RTL8712_SDIO_EFUSE_TABLE[efuse_read_item].word_start;
2203 byte_start = RTL8712_SDIO_EFUSE_TABLE[efuse_read_item].byte_start;
2204 byte_cnts = RTL8712_SDIO_EFUSE_TABLE[efuse_read_item].byte_cnts;
2206 if(data_size!=byte_cnts){
2211 pg_pkt_cnts = (byte_cnts /PGPKT_DATA_SIZE) +1;
2213 if(pg_pkt_cnts > 1){
2214 //tmpdata = _malloc(pg_pkt_cnts*PGPKT_DATA_SIZE);
2215 tmpdata = efusedata;
2219 memset(tmpdata,0xff,pg_pkt_cnts*PGPKT_DATA_SIZE);
2220 //PlatformFillMemory((PVOID)pg_data, pg_pkt_cnts*PGPKT_DATA_SIZE, 0xff);
2222 for(tmpidx=0;tmpidx<pg_pkt_cnts;tmpidx++)
2224 memset(pg_data,0xff,PGPKT_DATA_SIZE);
2225 //PlatformFillMemory((PVOID)pg_data, PGPKT_DATA_SIZE, 0xff);
2226 if(TRUE== efuse_PgPacketRead(dev,offset+tmpidx,pg_data))
2228 memcpy(tmpdata+(PGPKT_DATA_SIZE*tmpidx),pg_data,PGPKT_DATA_SIZE);
2229 //PlatformMoveMemory((PVOID)(tmpdata+(PGPKT_DATA_SIZE*tmpidx)), (PVOID)pg_data, PGPKT_DATA_SIZE);
2232 memcpy(data,(tmpdata+ (2*word_start)+byte_start ),data_size);
2233 //PlatformMoveMemory((PVOID)data, (PVOID)(tmpdata+ (2*word_start)+byte_start ), data_size);
2234 //_mfree(tmpdata, pg_pkt_cnts*PGPKT_DATA_SIZE);
2239 memset(pg_data,0xff,PGPKT_DATA_SIZE);
2240 //PlatformFillMemory((PVOID)pg_data, PGPKT_DATA_SIZE, 0xff);
2241 if(TRUE==efuse_PgPacketRead(dev,offset,pg_data)){
2242 memcpy(data,pg_data+ (2*word_start)+byte_start ,data_size);
2243 //PlatformMoveMemory((PVOID)data, (PVOID)(pg_data+ (2*word_start)+byte_start), data_size);
2248 //------------------------------------------------------------------------------
2249 //per interface doesn't alike
2250 void efuse_write_data(struct net_device* dev,u8 efuse_write_item,u8 *data,u32 data_size,u32 bWordUnit)
2252 u8 offset, word_start,byte_start,byte_cnts;
2253 u8 word_en = 0x0f,word_cnts;
2256 u8 tmpidx,tmpbitmask;
2257 u8 pg_data[8],tmpbytes=0;
2259 if(efuse_write_item> (sizeof(RTL8712_SDIO_EFUSE_TABLE)/sizeof(EFUSE_MAP))){
2264 offset = RTL8712_SDIO_EFUSE_TABLE[efuse_write_item].offset ;
2265 word_start = RTL8712_SDIO_EFUSE_TABLE[efuse_write_item].word_start;
2266 byte_start = RTL8712_SDIO_EFUSE_TABLE[efuse_write_item].byte_start;
2267 byte_cnts = RTL8712_SDIO_EFUSE_TABLE[efuse_write_item].byte_cnts;
2269 if(data_size > byte_cnts){
2273 pg_pkt_cnts = (byte_cnts /PGPKT_DATA_SIZE) +1;
2274 word_cnts = byte_cnts /2 ;
2279 if((byte_start==1)||((byte_cnts%2)==1)){//situation A
2281 if((efuse_write_item==EFUSE_F0CIS)||(efuse_write_item==EFUSE_F1CIS)){
2282 memset(pg_data,0xff,PGPKT_DATA_SIZE);
2283 //PlatformFillMemory((PVOID)pg_data, PGPKT_DATA_SIZE, 0xff);
2284 efuse_PgPacketRead(dev,offset,pg_data);
2286 if(efuse_write_item==EFUSE_F0CIS){
2288 memcpy(pg_data+word_start*2+byte_start,data,sizeof(u8)*2);
2289 //PlatformMoveMemory((PVOID)(pg_data+word_start*2+byte_start), (PVOID)data, sizeof(u8)*2);
2290 efuse_PgPacketWrite(dev,offset,word_en,pg_data+(word_start*2));
2293 efuse_PgPacketWrite(dev,(offset+1),word_en,data+2);
2296 efuse_PgPacketRead(dev,offset+2,pg_data);
2297 memcpy(pg_data,data+2+8,sizeof(u8)*7);
2298 //PlatformMoveMemory((PVOID)(pg_data), (PVOID)(data+2+8), sizeof(u8)*7);
2300 efuse_PgPacketWrite(dev,(offset+2),word_en,pg_data);
2302 else if(efuse_write_item==EFUSE_F1CIS){
2304 efuse_PgPacketRead(dev,offset,pg_data);
2305 pg_data[7] = data[0];
2306 efuse_PgPacketWrite(dev,offset,word_en,pg_data+(word_start*2));
2309 for(tmpidx = 0 ;tmpidx<(word_cnts/4);tmpidx++){
2310 efuse_PgPacketWrite(dev,(offset+1+tmpidx),word_en,data+1+(tmpidx*PGPKT_DATA_SIZE));
2316 memset(pg_data,0xff,PGPKT_DATA_SIZE);
2317 //PlatformFillMemory((PVOID)pg_data, PGPKT_DATA_SIZE, 0xff);
2318 if((efuse_write_item==EFUSE_SDIO_SETTING)||(efuse_write_item==EFUSE_CCCR)){
2322 else if(efuse_write_item == EFUSE_SDIO_MODE){
2326 else if(efuse_write_item == EFUSE_OCR){
2330 else if((efuse_write_item == EFUSE_EEPROM_VER)||(efuse_write_item==EFUSE_CHAN_PLAN)){
2334 if(bWordUnit==TRUE){
2335 memcpy(pg_data+word_start*2 ,data,sizeof(u8)*tmpbytes);
2336 //PlatformMoveMemory((PVOID)(pg_data+word_start*2), (PVOID)(data), sizeof(u8)*tmpbytes);
2339 efuse_PgPacketRead(dev,offset,pg_data);
2340 memcpy(pg_data+(2*word_start)+byte_start,data,sizeof(u8)*byte_cnts);
2341 //PlatformMoveMemory((PVOID)(pg_data+(2*word_start)+byte_start), (PVOID)(data), sizeof(u8)*byte_cnts);
2344 efuse_PgPacketWrite(dev,offset,word_en,pg_data+(word_start*2));
2349 //========================================================================
2350 else if(pg_pkt_cnts>1){//situation B
2353 for(tmpidx = 0 ;tmpidx<(word_cnts/4);tmpidx++)
2355 efuse_PgPacketWrite(dev,(offset+tmpidx),word_en,data+(tmpidx*PGPKT_DATA_SIZE));
2358 for(tmpidx= 0; tmpidx<(word_cnts%4) ; tmpidx++)
2361 word_en &= (~(EFUSE_BIT(tmpbitmask)));
2364 efuse_PgPacketWrite(dev,offset+(word_cnts/4),word_en,data+((word_cnts/4)*PGPKT_DATA_SIZE));
2370 //========================================================================
2373 for(tmpidx= 0; tmpidx<word_cnts ; tmpidx++)
2375 tmpbitmask = word_start + tmpidx ;
2376 word_en &= (~(EFUSE_BIT(tmpbitmask)));
2378 efuse_PgPacketWrite(dev,offset,word_en,data);
2382 //------------------------------------------------------------------------------
2384 void efuset_test_func_read(struct net_device* dev)
2389 u8 txpowertable[28];
2391 memset(chipid,0,sizeof(u8)*2);
2392 efuse_read_data(dev,EFUSE_CHIP_ID,chipid,sizeof(chipid));
2394 memset(ocr,0,sizeof(u8)*3);
2395 efuse_read_data(dev,EFUSE_CCCR,ocr,sizeof(ocr));
2397 memset(macaddr,0,sizeof(u8)*6);
2398 efuse_read_data(dev,EFUSE_MAC_ADDR,macaddr,sizeof(macaddr));
2400 memset(txpowertable,0,sizeof(u8)*28);
2401 efuse_read_data(dev,EFUSE_TXPW_TAB,txpowertable,sizeof(txpowertable));
2403 //------------------------------------------------------------------------------
2405 void efuset_test_func_write(struct net_device* dev)
2407 u32 bWordUnit = TRUE;
2408 u8 CCCR=0x02,SDIO_SETTING = 0xFF;
2411 u8 macaddr[6] = {0x00,0xe0,0x4c,0x87,0x12,0x66};
2412 efuse_write_data(dev,EFUSE_MAC_ADDR,macaddr,sizeof(macaddr),bWordUnit);
2415 efuse_write_data(dev,EFUSE_CCCR,&CCCR,sizeof(u8),bWordUnit);
2418 efuse_write_data(dev,EFUSE_SDIO_SETTING,&SDIO_SETTING,sizeof(u8),bWordUnit);
2421 tmpdata[0] =SDIO_SETTING ;
2423 efuse_write_data(dev,EFUSE_SDIO_SETTING,tmpdata,sizeof(tmpdata),bWordUnit);
2426 //------------------------------------------------------------------------------
2431 #endif // #if (HAL_CODE_BASE == RTL8192_S)
2438 /* End of Efuse.c */