1
/******************************************************************************
2
* Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
4
* This program is distributed in the hope that it will be useful, but WITHOUT
5
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
6
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
9
* You should have received a copy of the GNU General Public License along with
10
* this program; if not, write to the Free Software Foundation, Inc.,
11
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
13
* The full GNU General Public License is included in this distribution in the
14
* file called LICENSE.
16
* Contact Information:
17
* wlanfae <wlanfae@realtek.com>
18
******************************************************************************/
19
#include "../rtl_core.h"
20
#include <linux/types.h>
23
/*---------------------------Define Local Constant---------------------------*/
24
#define _POWERON_DELAY_
25
#define _PRE_EXECUTE_READ_CMD_
27
#define EFUSE_REPEAT_THRESHOLD_ 3
28
#define EFUSE_ERROE_HANDLE 1
31
typedef struct _EFUSE_MAP_A{
37
}EFUSE_MAP, *PEFUSE_MAP;
39
typedef struct PG_PKT_STRUCT_A{
43
}PGPKT_STRUCT,*PPGPKT_STRUCT;
45
typedef enum _EFUSE_DATA_ITEM{
78
/*---------------------------Define Local Constant---------------------------*/
81
/*------------------------Define global variable-----------------------------*/
82
const u8 MAX_PGPKT_SIZE = 9;
83
const u8 PGPKT_DATA_SIZE = 8;
84
const u32 EFUSE_MAX_SIZE = 512;
86
const u8 EFUSE_OOB_PROTECT_BYTES = 15;
89
const EFUSE_MAP RTL8712_SDIO_EFUSE_TABLE[]={
91
/*LDO Setting*/ {0 ,1 ,0 ,2 },
92
/*CLK Setting*/ {0 ,2 ,0 ,2 },
93
/*SDIO Setting*/{1 ,0 ,0 ,1 },
94
/*CCCR*/ {1 ,0 ,1 ,1 },
95
/*SDIO MODE*/ {1 ,1 ,0 ,1 },
96
/*OCR*/ {1 ,1 ,1 ,3 },
97
/*CCIS*/ {1 ,3 ,0 ,17 },
98
/*F1CIS*/ {3 ,3 ,1 ,48 },
99
/*MAC Addr*/ {10 ,0 ,0 ,6 },
100
/*EEPROM ver*/ {10 ,3 ,0 ,1 },
101
/*Channel plan*/{10 ,3 ,1 ,1 },
102
/*TxPwIndex */ {11 ,0 ,0 ,28 }
105
/*------------------------Define global variable-----------------------------*/
108
/*------------------------Define local variable------------------------------*/
110
/*------------------------Define local variable------------------------------*/
113
/*--------------------Define function prototype-----------------------*/
115
EFUSE_Initialize(struct net_device* dev);
117
EFUSE_Read1Byte(struct net_device* dev, u16 Address);
119
EFUSE_Write1Byte(struct net_device* dev, u16 Address,u8 Value);
122
efuse_ShadowRead1Byte(struct net_device* dev,u16 Offset,u8 *Value);
124
efuse_ShadowRead2Byte(struct net_device* dev, u16 Offset,u16 *Value );
126
efuse_ShadowRead4Byte(struct net_device* dev, u16 Offset,u32 *Value );
128
efuse_ShadowWrite1Byte(struct net_device* dev, u16 Offset, u8 Value);
130
efuse_ShadowWrite2Byte(struct net_device* dev, u16 Offset,u16 Value);
132
efuse_ShadowWrite4Byte(struct net_device* dev, u16 Offset,u32 Value);
135
efuse_OneByteRead(struct net_device* dev,u16 addr,u8 *data);
137
efuse_OneByteWrite(struct net_device* dev,u16 addr, u8 data);
140
efuse_ReadAllMap(struct net_device* dev,u8 *Efuse);
143
efuse_WriteAllMap(struct net_device* dev,u8 *eeprom,u32 eeprom_size);
145
efuse_ParsingMap(char* szStr,u32* pu4bVal,u32* pu4bMove);
148
efuse_PgPacketRead( struct net_device* dev,u8 offset,u8 *data);
150
efuse_PgPacketWrite(struct net_device* dev,u8 offset,u8 word_en,u8 *data);
152
efuse_WordEnableDataRead( u8 word_en,u8 *sourdata,u8 *targetdata);
154
efuse_WordEnableDataWrite( struct net_device* dev, u16 efuse_addr, u8 word_en, u8 *data);
156
efuse_PowerSwitch(struct net_device* dev,u8 PwrState);
158
efuse_GetCurrentSize(struct net_device* dev);
160
efuse_CalculateWordCnts(u8 word_en);
163
efuse_ResetLoader(struct net_device* dev);
166
static void efuse_reg_ctrl(struct net_device* dev, u8 bPowerOn);
168
/*--------------------Define function prototype-----------------------*/
173
EFUSE_Initialize(struct net_device* dev)
175
u8 Bytetemp = {0x00};
178
Bytetemp = read_nic_byte(dev, SYS_FUNC_EN+1);
179
temp = Bytetemp | 0x20;
180
write_nic_byte(dev, SYS_FUNC_EN+1, temp);
182
Bytetemp = read_nic_byte(dev, SYS_ISO_CTRL+1);
183
temp = Bytetemp & 0xFE;
184
write_nic_byte(dev, SYS_ISO_CTRL+1, temp);
187
Bytetemp = read_nic_byte(dev, EFUSE_TEST+3);
188
temp = Bytetemp | 0x80;
189
write_nic_byte(dev, EFUSE_TEST+3, temp);
191
write_nic_byte(dev, 0x2F8, 0x3);
193
write_nic_byte(dev, EFUSE_CTRL+3, 0x72);
195
} /* EFUSE_Initialize */
199
EFUSE_Read1Byte(struct net_device* dev, u16 Address)
202
u8 Bytetemp = {0x00};
206
if (Address < EFUSE_REAL_CONTENT_LEN)
208
temp = Address & 0xFF;
209
write_nic_byte(dev, EFUSE_CTRL+1, temp);
210
Bytetemp = read_nic_byte(dev, EFUSE_CTRL+2);
211
temp = ((Address >> 8) & 0x03) | (Bytetemp & 0xFC);
212
write_nic_byte(dev, EFUSE_CTRL+2, temp);
214
Bytetemp = read_nic_byte(dev, EFUSE_CTRL+3);
215
temp = Bytetemp & 0x7F;
216
write_nic_byte(dev, EFUSE_CTRL+3, temp);
218
Bytetemp = read_nic_byte(dev, EFUSE_CTRL+3);
219
while(!(Bytetemp & 0x80))
221
Bytetemp = read_nic_byte(dev, EFUSE_CTRL+3);
229
data=read_nic_byte(dev, EFUSE_CTRL);
235
} /* EFUSE_Read1Byte */
239
EFUSE_Write1Byte(struct net_device* dev, u16 Address,u8 Value)
241
u8 Bytetemp = {0x00};
246
if( Address < EFUSE_REAL_CONTENT_LEN)
248
write_nic_byte(dev, EFUSE_CTRL, Value);
250
temp = Address & 0xFF;
251
write_nic_byte(dev, EFUSE_CTRL+1, temp);
252
Bytetemp = read_nic_byte(dev, EFUSE_CTRL+2);
254
temp = ((Address >> 8) & 0x03) | (Bytetemp & 0xFC);
255
write_nic_byte(dev, EFUSE_CTRL+2, temp);
257
Bytetemp = read_nic_byte(dev, EFUSE_CTRL+3);
258
temp = Bytetemp | 0x80;
259
write_nic_byte(dev, EFUSE_CTRL+3, temp);
261
Bytetemp = read_nic_byte(dev, EFUSE_CTRL+3);
262
while(Bytetemp & 0x80)
264
Bytetemp = read_nic_byte(dev, EFUSE_CTRL+3);
274
} /* EFUSE_Write1Byte */
277
#ifdef EFUSE_FOR_92SU
278
void do_93c46(struct net_device* dev, u8 addorvalue)
283
u8 csskdi[1] = {0x8e};
286
for(count=0 ; count<8 ; count++)
288
if((addorvalue&0x80)!=0)
290
write_nic_byte(dev, EPROM_CMD, csdi[0]);
291
write_nic_byte(dev, EPROM_CMD, csskdi[0]);
295
write_nic_byte(dev, EPROM_CMD, cs[0]);
296
write_nic_byte(dev, EPROM_CMD, cssk[0]);
298
addorvalue = addorvalue << 1;
303
u16 Read93C46(struct net_device* dev, u16 Reg )
310
u8 csskdi[1] = {0x8e};
311
u8 EepromSEL[1]={0x00};
314
u16 storedataF[1] = {0x0};
315
u8 t,data[1],storedata[1];
320
*EepromSEL= read_nic_byte(dev, EPROM_CMD);
322
if((*EepromSEL & 0x10) == 0x10)
324
address = address | 0x80;
326
write_nic_byte(dev, EPROM_CMD, csdi[0]);
327
write_nic_byte(dev, EPROM_CMD, csskdi[0]);
328
do_93c46(dev, address);
332
for(t=0 ; t<16 ; t++)
334
write_nic_byte(dev, EPROM_CMD, cs[0]);
335
write_nic_byte(dev, EPROM_CMD, cssk[0]);
336
*data= read_nic_byte(dev, EPROM_CMD);
340
*data = *data & 0x01;
345
*data = *data & 0x01 ;
348
*storedataF = (*storedataF << 1 ) + *storedata;
350
write_nic_byte(dev, EPROM_CMD, cs[0]);
351
write_nic_byte(dev, EPROM_CMD, clear[0]);
358
ReadEFuseByte(struct net_device* dev,u16 _offset, u8 *pbuf)
366
write_nic_byte(dev, EFUSE_CTRL+1, (_offset & 0xff));
367
readbyte = read_nic_byte(dev, EFUSE_CTRL+2);
368
write_nic_byte(dev, EFUSE_CTRL+2, ((_offset >> 8) & 0x03) | (readbyte & 0xfc));
370
readbyte = read_nic_byte(dev, EFUSE_CTRL+3);
371
write_nic_byte(dev, EFUSE_CTRL+3, (readbyte & 0x7f));
374
value32 = read_nic_dword(dev, EFUSE_CTRL);
375
while(!(((value32 >> 24) & 0xff) & 0x80) && (retry<10000))
377
value32 = read_nic_dword(dev, EFUSE_CTRL);
380
*pbuf = (u8)(value32 & 0xff);
384
#define EFUSE_READ_SWITCH 1
386
ReadEFuse(struct net_device* dev, u16 _offset, u16 _size_byte, u8 *pbuf)
388
struct r8192_priv *priv = rtllib_priv(dev);
389
u8 efuseTbl[EFUSE_MAP_LEN];
394
u16 eFuseWord[EFUSE_MAX_SECTION][EFUSE_MAX_WORD_UNIT];
395
u16 efuse_utilized = 0;
397
#ifdef EFUSE_REPG_WORKAROUND
398
u16 sec1_addr = 0, sec5_addr = 0;
401
if((_offset + _size_byte)>EFUSE_MAP_LEN)
403
printk("ReadEFuse(): Invalid offset with read bytes!!\n");
407
for (i = 0; i < EFUSE_MAX_SECTION; i++)
408
for (j = 0; j < EFUSE_MAX_WORD_UNIT; j++)
409
eFuseWord[i][j]=0xFFFF;
411
for (i = 0; i < EFUSE_MAP_LEN; i++)
414
ReadEFuseByte(dev, eFuse_Addr, rtemp8);
420
while((*rtemp8 != 0xFF) && (eFuse_Addr < EFUSE_REAL_CONTENT_LEN))
422
offset = ((*rtemp8 >> 4) & 0x0f);
423
#ifdef EFUSE_REPG_WORKAROUND
424
if (IS_HARDWARE_TYPE_8192SE(dev))
428
sec1_addr = eFuse_Addr;
430
else if (offset == 5)
432
sec5_addr = eFuse_Addr;
435
if (sec1_addr > sec5_addr)
437
priv->efuse_RePGSec1Flag = false;
441
priv->efuse_RePGSec1Flag = true;
445
if(offset < EFUSE_MAX_SECTION){
446
wren = (*rtemp8 & 0x0f);
449
ReadEFuseByte(dev, eFuse_Addr, rtemp8); eFuse_Addr++;
451
eFuseWord[offset][i] = (*rtemp8 & 0xff);
452
if(eFuse_Addr >= EFUSE_REAL_CONTENT_LEN) break;
453
ReadEFuseByte(dev, eFuse_Addr, rtemp8); eFuse_Addr++;
455
eFuseWord[offset][i] |= (((u16)*rtemp8 << 8) & 0xff00);
456
if(eFuse_Addr >= EFUSE_REAL_CONTENT_LEN) break;
461
ReadEFuseByte(dev, eFuse_Addr, rtemp8);
462
if(*rtemp8 != 0xFF && (eFuse_Addr < 512))
469
for(i=0; i<EFUSE_MAX_SECTION; i++){
470
for(j=0; j<EFUSE_MAX_WORD_UNIT; j++){
471
efuseTbl[(i*8)+(j*2)]=(eFuseWord[i][j] & 0xff);
472
efuseTbl[(i*8)+((j*2)+1)]=((eFuseWord[i][j] >> 8) & 0xff);
473
#ifdef FUSE_REPG_WORKAROUND
474
if ((i == 1) && (priv->efuse_RePGSec1Flag == true))
476
priv->efuse_RePGData[j*2]=(eFuseWord[i][j] & 0xff);
477
priv->efuse_RePGData[(j*2)+1]=((eFuseWord[i][j] >> 8) & 0xff);
482
for(i=0; i<_size_byte; i++)
483
pbuf[i] = efuseTbl[_offset+i];
484
priv->EfuseUsedBytes = efuse_utilized;
485
efuse_usage = (u8)((efuse_utilized*100)/EFUSE_REAL_CONTENT_LEN);
486
priv->EfuseUsedPercentage = efuse_usage;
490
extern bool EFUSE_ShadowUpdateChk(struct net_device *dev)
492
struct r8192_priv *priv = rtllib_priv(dev);
493
u8 SectionIdx, i, Base;
494
u16 WordsNeed = 0, HdrNum = 0, TotalBytes = 0, EfuseUsed = 0;
495
bool bWordChanged, bResult = true;
497
for (SectionIdx = 0; SectionIdx < 16; SectionIdx++) {
498
Base = SectionIdx * 8;
499
bWordChanged = false;
501
for (i = 0; i < 8; i=i+2) {
502
if((priv->EfuseMap[EFUSE_INIT_MAP][Base+i] !=
503
priv->EfuseMap[EFUSE_MODIFY_MAP][Base+i]) ||
504
(priv->EfuseMap[EFUSE_INIT_MAP][Base+i+1] !=
505
priv->EfuseMap[EFUSE_MODIFY_MAP][Base+i+1])) {
511
if( bWordChanged == true )
515
TotalBytes = HdrNum + WordsNeed * 2;
516
EfuseUsed = priv->EfuseUsedBytes;
518
if ((TotalBytes + EfuseUsed) >= (EFUSE_MAX_SIZE - EFUSE_OOB_PROTECT_BYTES))
525
EFUSE_ShadowRead( struct net_device* dev, u8 Type, u16 Offset, u32 *Value)
529
efuse_ShadowRead1Byte(dev, Offset, (u8 *)Value);
531
efuse_ShadowRead2Byte(dev, Offset, (u16 *)Value);
533
efuse_ShadowRead4Byte(dev, Offset, (u32 *)Value);
539
EFUSE_ShadowWrite( struct net_device* dev, u8 Type, u16 Offset,u32 Value)
542
if (Offset >= 0x18 && Offset <= 0x1F)
546
efuse_ShadowWrite1Byte(dev, Offset, (u8)Value);
548
efuse_ShadowWrite2Byte(dev, Offset, (u16)Value);
550
efuse_ShadowWrite4Byte(dev, Offset, (u32)Value);
555
extern bool EFUSE_ShadowUpdate(struct net_device* dev)
557
struct r8192_priv *priv = rtllib_priv(dev);
558
u16 i, offset, base = 0;
560
bool first_pg = false;
562
if (!EFUSE_ShadowUpdateChk(dev)) {
563
efuse_ReadAllMap(dev, &priv->EfuseMap[EFUSE_INIT_MAP][0]);
564
memcpy(&priv->EfuseMap[EFUSE_MODIFY_MAP][0],
565
(void *)&priv->EfuseMap[EFUSE_INIT_MAP][0], HWSET_MAX_SIZE_92S);
567
printk("<---EFUSE_ShadowUpdate(): Efuse out of capacity!!\n");
571
efuse_PowerSwitch(dev, true);
573
for (offset = 0; offset < 16; offset++)
575
if(IS_HARDWARE_TYPE_8192SE(dev)){
582
for (i = 0; i < 8; i++)
584
if (offset == 0 && priv->EfuseMap[EFUSE_INIT_MAP][base+i] == 0xFF)
589
if (first_pg == true && offset == 1 && IS_HARDWARE_TYPE_8192SE(dev))
594
if (first_pg == true)
596
word_en &= ~(BIT(i/2));
597
priv->EfuseMap[EFUSE_INIT_MAP][base+i] =
598
priv->EfuseMap[EFUSE_MODIFY_MAP][base+i];
601
if ( priv->EfuseMap[EFUSE_INIT_MAP][base+i] !=
602
priv->EfuseMap[EFUSE_MODIFY_MAP][base+i])
604
word_en &= ~(EFUSE_BIT(i/2));
606
priv->EfuseMap[EFUSE_INIT_MAP][base+i] =
607
priv->EfuseMap[EFUSE_MODIFY_MAP][base+i];
616
memcpy(tmpdata, &(priv->EfuseMap[EFUSE_MODIFY_MAP][base]), 8);
617
efuse_PgPacketWrite(dev,(u8)offset,word_en,tmpdata);
621
if (first_pg == true && IS_HARDWARE_TYPE_8192SE(dev))
625
memcpy(tmpdata, (&priv->EfuseMap[EFUSE_MODIFY_MAP][8]), 8);
626
efuse_PgPacketWrite(dev, 1, 0x0, tmpdata);
628
u1Byte tmpdata[8] = {0xFF, 0xFF, 0xEC, 0x10, 0xFF, 0xFF, 0xFF, 0xFF};
630
efuse_PgPacketWrite(pAdapter, 1, 0xD, tmpdata);
635
efuse_PowerSwitch(dev, false);
636
efuse_ReadAllMap(dev, &priv->EfuseMap[EFUSE_INIT_MAP][0]);
637
memcpy(&priv->EfuseMap[EFUSE_MODIFY_MAP][0],
638
(void *)&priv->EfuseMap[EFUSE_INIT_MAP][0], HWSET_MAX_SIZE_92S);
644
extern void EFUSE_ShadowMapUpdate(struct net_device* dev)
646
struct r8192_priv *priv = rtllib_priv(dev);
648
if (priv->AutoloadFailFlag == true){
649
memset(&(priv->EfuseMap[EFUSE_INIT_MAP][0]), 0xff, 128);
651
efuse_ReadAllMap(dev, &priv->EfuseMap[EFUSE_INIT_MAP][0]);
653
memcpy(&priv->EfuseMap[EFUSE_MODIFY_MAP][0],
654
&priv->EfuseMap[EFUSE_INIT_MAP][0], HWSET_MAX_SIZE_92S);
660
EFUSE_ForceWriteVendorId( struct net_device* dev)
662
u8 tmpdata[8] = {0xFF, 0xFF, 0xEC, 0x10, 0xFF, 0xFF, 0xFF, 0xFF};
664
efuse_PowerSwitch(dev, true);
666
efuse_PgPacketWrite(dev, 1, 0xD, tmpdata);
668
efuse_PowerSwitch(dev, false);
673
EFUSE_RePgSection1(struct net_device* dev)
675
#ifdef EFUSE_REPG_WORKAROUND
677
struct r8192_priv *priv = rtllib_priv(dev);
679
if (priv->efuse_RePGSec1Flag == true)
681
efuse_PowerSwitch(dev, true);
682
RT_TRACE(COMP_INIT, "EFUSE REPG: %p, %u\n", priv->efuse_RePGData, 8);
684
efuse_PgPacketWrite(dev, 1, 0x0d, priv->efuse_RePGData);
685
efuse_PowerSwitch(dev, false);
686
priv->efuse_RePGSec1Flag = false;
693
efuse_ShadowRead1Byte(struct net_device* dev, u16 Offset, u8 *Value)
695
struct r8192_priv *priv = rtllib_priv(dev);
697
*Value = priv->EfuseMap[EFUSE_MODIFY_MAP][Offset];
702
efuse_ShadowRead2Byte(struct net_device* dev, u16 Offset, u16 *Value)
704
struct r8192_priv *priv = rtllib_priv(dev);
706
*Value = priv->EfuseMap[EFUSE_MODIFY_MAP][Offset];
707
*Value |= priv->EfuseMap[EFUSE_MODIFY_MAP][Offset+1]<<8;
712
efuse_ShadowRead4Byte(struct net_device* dev, u16 Offset, u32 *Value)
714
struct r8192_priv *priv = rtllib_priv(dev);
716
*Value = priv->EfuseMap[EFUSE_MODIFY_MAP][Offset];
717
*Value |= priv->EfuseMap[EFUSE_MODIFY_MAP][Offset+1]<<8;
718
*Value |= priv->EfuseMap[EFUSE_MODIFY_MAP][Offset+2]<<16;
719
*Value |= priv->EfuseMap[EFUSE_MODIFY_MAP][Offset+3]<<24;
726
efuse_ShadowWrite1Byte(struct net_device* dev, u16 Offset, u8 Value)
728
struct r8192_priv *priv = rtllib_priv(dev);
730
priv->EfuseMap[EFUSE_MODIFY_MAP][Offset] = Value;
735
efuse_ShadowWrite2Byte(struct net_device* dev, u16 Offset, u16 Value)
737
struct r8192_priv *priv = rtllib_priv(dev);
739
priv->EfuseMap[EFUSE_MODIFY_MAP][Offset] = Value&0x00FF;
740
priv->EfuseMap[EFUSE_MODIFY_MAP][Offset+1] = Value>>8;
745
efuse_ShadowWrite4Byte(struct net_device* dev, u16 Offset, u32 Value)
747
struct r8192_priv *priv = rtllib_priv(dev);
749
priv->EfuseMap[EFUSE_MODIFY_MAP][Offset] = (u8)(Value&0x000000FF);
750
priv->EfuseMap[EFUSE_MODIFY_MAP][Offset+1] = (u8)((Value>>8)&0x0000FF);
751
priv->EfuseMap[EFUSE_MODIFY_MAP][Offset+2] = (u8)((Value>>16)&0x00FF);
752
priv->EfuseMap[EFUSE_MODIFY_MAP][Offset+3] = (u8)((Value>>24)&0xFF);
758
efuse_OneByteRead(struct net_device* dev, u16 addr,u8 *data)
763
write_nic_byte(dev, EFUSE_CTRL+1, (u8)(addr&0xff));
764
write_nic_byte(dev, EFUSE_CTRL+2, ((u8)((addr>>8) &0x03) ) |
765
(read_nic_byte(dev, EFUSE_CTRL+2)&0xFC ));
767
write_nic_byte(dev, EFUSE_CTRL+3, 0x72);
769
while(!(0x80 &read_nic_byte(dev, EFUSE_CTRL+3))&&(tmpidx<100))
775
*data=read_nic_byte(dev, EFUSE_CTRL);
787
efuse_OneByteWrite(struct net_device* dev, u16 addr, u8 data)
794
write_nic_byte(dev, EFUSE_CTRL+1, (u8)(addr&0xff));
795
write_nic_byte(dev, EFUSE_CTRL+2,
796
read_nic_byte(dev, EFUSE_CTRL+2)|(u8)((addr>>8)&0x03) );
798
write_nic_byte(dev, EFUSE_CTRL, data);
799
write_nic_byte(dev, EFUSE_CTRL+3, 0xF2);
801
while((0x80 & read_nic_byte(dev, EFUSE_CTRL+3)) && (tmpidx<100) ){
819
efuse_ReadAllMap(struct net_device* dev, u8 *Efuse)
822
efuse_PowerSwitch(dev, true);
823
ReadEFuse(dev, 0, 128, Efuse);
824
efuse_PowerSwitch(dev, false);
826
RT_TRACE(COMP_INIT, "efuse_ResetLoader\n");
827
efuse_ResetLoader(dev);
829
write_nic_byte(dev, EFUSE_CLK, 0x03);
831
ReadEFuse(dev, 0, 128, Efuse);
833
write_nic_byte(dev, EFUSE_CLK, 0x02);
835
for(offset = 0;offset<16;offset++)
837
PlatformFillMemory((PVOID)pg_data, 8, 0xff);
838
efuse_PgPacketRead(pAdapter,offset,pg_data);
840
PlatformMoveMemory((PVOID)&Efuse[offset*8], (PVOID)pg_data, 8);
844
if (Efuse[0] != 0x29 || Efuse[1] != 0x81)
848
RT_TRACE(COMP_INIT, "EFUSE R FAIL %d\n", index);
849
efuse_ReadAllMap(dev, Efuse);
863
efuse_WriteAllMap(struct net_device* dev,u8 *eeprom, u32 eeprom_size)
865
unsigned char word_en = 0x00;
867
unsigned char tmpdata[8];
868
unsigned char offset;
870
efuse_PowerSwitch(dev, true);
872
for(offset=0 ; offset< eeprom_size/PGPKT_DATA_SIZE ; offset++)
874
if (IS_HARDWARE_TYPE_8192SE(dev))
876
if (offset == 3/* || offset > 9*/)
882
memcpy(tmpdata, (eeprom+(offset*PGPKT_DATA_SIZE)), 8);
885
efuse_PgPacketWrite(dev,offset,word_en,tmpdata);
890
efuse_PowerSwitch(dev, false);
895
efuse_PgPacketRead( struct net_device* dev, u8 offset, u8 *data)
897
u8 ReadState = PG_STATE_HEADER;
899
bool bContinual = true;
900
bool bDataEmpty = true ;
902
u8 efuse_data,word_cnts=0;
904
u8 hoffset=0,hworden=0;
908
if(data==NULL) return false;
909
if(offset>15) return false;
911
memset(data, 0xff, sizeof(u8)*PGPKT_DATA_SIZE);
912
memset(tmpdata, 0xff, sizeof(u8)*PGPKT_DATA_SIZE);
915
while(bContinual && (efuse_addr < EFUSE_MAX_SIZE) )
917
if(ReadState & PG_STATE_HEADER)
919
if(efuse_OneByteRead(dev, efuse_addr ,&efuse_data)&&(efuse_data!=0xFF)){
920
hoffset = (efuse_data>>4) & 0x0F;
921
hworden = efuse_data & 0x0F;
922
word_cnts = efuse_CalculateWordCnts(hworden);
926
for(tmpidx = 0;tmpidx< word_cnts*2 ;tmpidx++){
927
if(efuse_OneByteRead(dev, efuse_addr+1+tmpidx ,&efuse_data) ){
928
tmpdata[tmpidx] = efuse_data;
929
if(efuse_data!=0xff){
934
if(bDataEmpty==false){
935
ReadState = PG_STATE_DATA;
937
efuse_addr = efuse_addr + (word_cnts*2)+1;
938
ReadState = PG_STATE_HEADER;
942
efuse_addr = efuse_addr + (word_cnts*2)+1;
943
ReadState = PG_STATE_HEADER;
951
else if(ReadState & PG_STATE_DATA)
953
efuse_WordEnableDataRead(hworden,tmpdata,data);
954
efuse_addr = efuse_addr + (word_cnts*2)+1;
955
ReadState = PG_STATE_HEADER;
961
if( (data[0]==0xff) &&(data[1]==0xff) && (data[2]==0xff) && (data[3]==0xff) &&
962
(data[4]==0xff) &&(data[5]==0xff) && (data[6]==0xff) && (data[7]==0xff))
970
static u8 efuse_PgPacketWrite(struct net_device* dev, u8 offset, u8 word_en,u8 *data)
972
u8 WriteState = PG_STATE_HEADER;
973
bool bContinual = true,bDataEmpty=true, bResult = true;
979
u8 tmp_word_cnts=0,target_word_cnts=0;
980
u8 tmp_header,match_word_en,tmp_word_en;
982
PGPKT_STRUCT target_pkt;
983
PGPKT_STRUCT tmp_pkt;
985
u8 originaldata[sizeof(u8)*8];
986
u8 tmpindex = 0,badworden = 0x0F;
988
static u32 repeat_times = 0;
990
if (efuse_GetCurrentSize(dev) >= EFUSE_MAX_SIZE - EFUSE_OOB_PROTECT_BYTES) {
991
printk("efuse_PgPacketWrite error \n");
995
target_pkt.offset = offset;
996
target_pkt.word_en= word_en;
998
memset(target_pkt.data,0xFF,sizeof(u8)*8);
1000
efuse_WordEnableDataRead(word_en,data,target_pkt.data);
1001
target_word_cnts = efuse_CalculateWordCnts(target_pkt.word_en);
1003
printk("EFUSE Power ON\n");
1005
while (bContinual && (efuse_addr < (EFUSE_MAX_SIZE - EFUSE_OOB_PROTECT_BYTES)))
1007
if(WriteState==PG_STATE_HEADER)
1011
printk("EFUSE PG_STATE_HEADER\n");
1012
if ( efuse_OneByteRead(dev, efuse_addr ,&efuse_data) &&
1015
tmp_header = efuse_data;
1017
tmp_pkt.offset = (tmp_header>>4) & 0x0F;
1018
tmp_pkt.word_en = tmp_header & 0x0F;
1019
tmp_word_cnts = efuse_CalculateWordCnts(tmp_pkt.word_en);
1021
if(tmp_pkt.offset != target_pkt.offset)
1023
efuse_addr = efuse_addr + (tmp_word_cnts*2) +1;
1024
#if (EFUSE_ERROE_HANDLE == 1)
1025
WriteState = PG_STATE_HEADER;
1030
for(tmpindex=0 ; tmpindex<(tmp_word_cnts*2) ; tmpindex++)
1032
if(efuse_OneByteRead(dev, (efuse_addr+1+tmpindex) ,&efuse_data)&&(efuse_data != 0xFF)){
1036
if(bDataEmpty == false)
1038
efuse_addr = efuse_addr + (tmp_word_cnts*2) +1;
1039
#if (EFUSE_ERROE_HANDLE == 1)
1040
WriteState=PG_STATE_HEADER;
1045
match_word_en = 0x0F;
1046
if( !( (target_pkt.word_en&BIT0)|(tmp_pkt.word_en&BIT0) ))
1048
match_word_en &= (~BIT0);
1050
if( !( (target_pkt.word_en&BIT1)|(tmp_pkt.word_en&BIT1) ))
1052
match_word_en &= (~BIT1);
1054
if( !( (target_pkt.word_en&BIT2)|(tmp_pkt.word_en&BIT2) ))
1056
match_word_en &= (~BIT2);
1058
if( !( (target_pkt.word_en&BIT3)|(tmp_pkt.word_en&BIT3) ))
1060
match_word_en &= (~BIT3);
1063
if((match_word_en&0x0F)!=0x0F)
1065
badworden = efuse_WordEnableDataWrite(dev,efuse_addr+1, tmp_pkt.word_en ,target_pkt.data);
1067
if(0x0F != (badworden&0x0F))
1069
u8 reorg_offset = offset;
1070
u8 reorg_worden=badworden;
1071
efuse_PgPacketWrite(dev,reorg_offset,reorg_worden,originaldata);
1075
if( (target_pkt.word_en&BIT0)^(match_word_en&BIT0) )
1077
tmp_word_en &= (~BIT0);
1079
if( (target_pkt.word_en&BIT1)^(match_word_en&BIT1) )
1081
tmp_word_en &= (~BIT1);
1083
if( (target_pkt.word_en&BIT2)^(match_word_en&BIT2) )
1085
tmp_word_en &= (~BIT2);
1087
if( (target_pkt.word_en&BIT3)^(match_word_en&BIT3) )
1089
tmp_word_en &=(~BIT3);
1092
if((tmp_word_en&0x0F)!=0x0F){
1093
efuse_addr = efuse_GetCurrentSize(dev);
1094
target_pkt.offset = offset;
1095
target_pkt.word_en= tmp_word_en;
1099
#if (EFUSE_ERROE_HANDLE == 1)
1100
WriteState=PG_STATE_HEADER;
1102
if(repeat_times>EFUSE_REPEAT_THRESHOLD_){
1109
efuse_addr = efuse_addr + (2*tmp_word_cnts) +1;
1110
target_pkt.offset = offset;
1111
target_pkt.word_en= target_pkt.word_en;
1112
#if (EFUSE_ERROE_HANDLE == 1)
1113
WriteState=PG_STATE_HEADER;
1118
printk("EFUSE PG_STATE_HEADER-1\n");
1122
pg_header = ((target_pkt.offset << 4)&0xf0) |target_pkt.word_en;
1124
efuse_OneByteWrite(dev,efuse_addr, pg_header);
1125
efuse_OneByteRead(dev,efuse_addr, &tmp_header);
1127
if(tmp_header == pg_header)
1129
WriteState = PG_STATE_DATA;
1131
#if (EFUSE_ERROE_HANDLE == 1)
1132
else if(tmp_header == 0xFF){
1133
WriteState = PG_STATE_HEADER;
1135
if(repeat_times>EFUSE_REPEAT_THRESHOLD_){
1143
tmp_pkt.offset = (tmp_header>>4) & 0x0F;
1144
tmp_pkt.word_en= tmp_header & 0x0F;
1145
tmp_word_cnts = efuse_CalculateWordCnts(tmp_pkt.word_en);
1147
memset(originaldata,0xff,sizeof(u8)*8);
1149
if(efuse_PgPacketRead( dev, tmp_pkt.offset,originaldata))
1151
badworden = efuse_WordEnableDataWrite(dev,efuse_addr+1,tmp_pkt.word_en,originaldata);
1152
if(0x0F != (badworden&0x0F))
1154
u8 reorg_offset = tmp_pkt.offset;
1155
u8 reorg_worden=badworden;
1156
efuse_PgPacketWrite(dev,reorg_offset,reorg_worden,originaldata);
1157
efuse_addr = efuse_GetCurrentSize(dev);
1160
efuse_addr = efuse_addr + (tmp_word_cnts*2) +1;
1165
efuse_addr = efuse_addr + (tmp_word_cnts*2) +1;
1168
#if (EFUSE_ERROE_HANDLE == 1)
1169
WriteState=PG_STATE_HEADER;
1171
if(repeat_times>EFUSE_REPEAT_THRESHOLD_){
1177
printk("EFUSE PG_STATE_HEADER-2\n");
1183
else if(WriteState==PG_STATE_DATA)
1185
printk("EFUSE PG_STATE_DATA\n");
1187
badworden = efuse_WordEnableDataWrite(dev,efuse_addr+1,target_pkt.word_en,target_pkt.data);
1188
if((badworden&0x0F)==0x0F)
1194
efuse_addr = efuse_addr + (2*target_word_cnts) +1;
1196
target_pkt.offset = offset;
1197
target_pkt.word_en= badworden;
1198
target_word_cnts = efuse_CalculateWordCnts(target_pkt.word_en);
1199
#if (EFUSE_ERROE_HANDLE == 1)
1200
WriteState=PG_STATE_HEADER;
1202
if(repeat_times>EFUSE_REPEAT_THRESHOLD_){
1207
printk("EFUSE PG_STATE_HEADER-3\n");
1218
efuse_WordEnableDataRead( u8 word_en,u8 *sourdata,u8 *targetdata)
1223
if (!(word_en&BIT0))
1225
targetdata[0] = sourdata[0];
1226
targetdata[1] = sourdata[1];
1228
if (!(word_en&BIT1))
1230
targetdata[2] = sourdata[2];
1231
targetdata[3] = sourdata[3];
1233
if (!(word_en&BIT2))
1235
targetdata[4] = sourdata[4];
1236
targetdata[5] = sourdata[5];
1238
if (!(word_en&BIT3))
1240
targetdata[6] = sourdata[6];
1241
targetdata[7] = sourdata[7];
1247
efuse_WordEnableDataWrite( struct net_device* dev, u16 efuse_addr, u8 word_en, u8 *data)
1250
u16 start_addr = efuse_addr;
1251
u8 badworden = 0x0F;
1254
memset(tmpdata,0xff,PGPKT_DATA_SIZE);
1260
tmpaddr = start_addr;
1261
efuse_OneByteWrite(dev,start_addr++, data[0]);
1262
efuse_OneByteWrite(dev,start_addr++, data[1]);
1264
efuse_OneByteRead(dev,tmpaddr, &tmpdata[0]);
1265
efuse_OneByteRead(dev,tmpaddr+1, &tmpdata[1]);
1266
if((data[0]!=tmpdata[0])||(data[1]!=tmpdata[1])){
1267
badworden &= (~BIT0);
1272
tmpaddr = start_addr;
1273
efuse_OneByteWrite(dev,start_addr++, data[2]);
1274
efuse_OneByteWrite(dev,start_addr++, data[3]);
1276
efuse_OneByteRead(dev,tmpaddr , &tmpdata[2]);
1277
efuse_OneByteRead(dev,tmpaddr+1, &tmpdata[3]);
1278
if((data[2]!=tmpdata[2])||(data[3]!=tmpdata[3])){
1279
badworden &=( ~BIT1);
1284
tmpaddr = start_addr;
1285
efuse_OneByteWrite(dev,start_addr++, data[4]);
1286
efuse_OneByteWrite(dev,start_addr++, data[5]);
1288
efuse_OneByteRead(dev,tmpaddr, &tmpdata[4]);
1289
efuse_OneByteRead(dev,tmpaddr+1, &tmpdata[5]);
1290
if((data[4]!=tmpdata[4])||(data[5]!=tmpdata[5])){
1291
badworden &=( ~BIT2);
1296
tmpaddr = start_addr;
1297
efuse_OneByteWrite(dev,start_addr++, data[6]);
1298
efuse_OneByteWrite(dev,start_addr++, data[7]);
1300
efuse_OneByteRead(dev,tmpaddr, &tmpdata[6]);
1301
efuse_OneByteRead(dev,tmpaddr+1, &tmpdata[7]);
1302
if((data[6]!=tmpdata[6])||(data[7]!=tmpdata[7])){
1303
badworden &=( ~BIT3);
1311
efuse_PowerSwitch(struct net_device* dev, u8 PwrState)
1314
if (PwrState == true)
1316
tempval = read_nic_byte(dev, EFUSE_TEST+3);
1317
write_nic_byte(dev, EFUSE_TEST+3, (tempval | 0x80));
1319
write_nic_byte(dev, EFUSE_CLK, 0x03);
1323
tempval = read_nic_byte(dev, EFUSE_TEST+3);
1324
write_nic_byte(dev, EFUSE_TEST+3, (tempval & 0x7F));
1326
write_nic_byte(dev, EFUSE_CLK, 0x02);
1329
} /* efuse_PowerSwitch */
1333
efuse_GetCurrentSize(struct net_device* dev)
1335
bool bContinual = true;
1338
u8 hoffset=0,hworden=0;
1339
u8 efuse_data,word_cnts=0;
1342
while ( bContinual &&
1343
efuse_OneByteRead(dev, efuse_addr ,&efuse_data) &&
1344
(efuse_addr < EFUSE_MAX_SIZE) )
1346
if(efuse_data!=0xFF)
1348
hoffset = (efuse_data>>4) & 0x0F;
1349
hworden = efuse_data & 0x0F;
1350
word_cnts = efuse_CalculateWordCnts(hworden);
1351
efuse_addr = efuse_addr + (word_cnts*2)+1;
1355
bContinual = false ;
1366
efuse_CalculateWordCnts(u8 word_en)
1369
if(!(word_en & BIT0)) word_cnts++;
1370
if(!(word_en & BIT1)) word_cnts++;
1371
if(!(word_en & BIT2)) word_cnts++;
1372
if(!(word_en & BIT3)) word_cnts++;
1378
static void efuse_ResetLoader(struct net_device* dev)
1382
tmpU2b = read_nic_word(dev, SYS_FUNC_EN);
1383
write_nic_word(dev, SYS_FUNC_EN, (tmpU2b&~(BIT12)));
1385
write_nic_word(dev, SYS_FUNC_EN, (tmpU2b|BIT12));
1393
EFUSE_ProgramMap(struct net_device* dev, char* pFileName,u8 TableType)
1395
struct r8192_priv *priv = rtllib_priv(dev);
1396
s4Byte nLinesRead, ithLine;
1397
RT_STATUS rtStatus = RT_STATUS_SUCCESS;
1399
u32 u4bRegValue, u4RegMask;
1403
u8 eeprom[HWSET_MAX_SIZE_92S];
1405
rtStatus = PlatformReadFile(
1408
(u8*)(priv->BufOfLines),
1409
MAX_LINES_HWCONFIG_TXT,
1410
MAX_BYTES_LINE_HWCONFIG_TXT,
1414
if(rtStatus == RT_STATUS_SUCCESS)
1416
memcp(pHalData->BufOfLines3, pHalData->BufOfLines,
1417
nLinesRead*MAX_BYTES_LINE_HWCONFIG_TXT);
1418
pHalData->nLinesRead3 = nLinesRead;
1421
if(rtStatus == RT_STATUS_SUCCESS)
1423
printk("szEepromFile(): read %s ok\n", pFileName);
1424
for(ithLine = 0; ithLine < nLinesRead; ithLine++)
1426
szLine = pHalData->BufOfLines[ithLine];
1427
printk("Line-%d String =%s\n", ithLine, szLine);
1429
if(!IsCommentString(szLine))
1431
for (i = 0; i < 8; i++)
1435
efuse_ParsingMap(szLine, &u4bRegValue, &u4bMove);
1438
eeprom[index++] = (u8)(u4bRegValue&0xff);
1439
eeprom[index++] = (u8)((u4bRegValue>>8)&0xff);
1441
printk("Addr-%d = %x\n", (ithLine*8+i), u4bRegValue);
1450
printk("szEepromFile(): Fail read%s\n", pFileName);
1451
return RT_STATUS_FAILURE;
1458
efuse_WriteAllMap(dev, eeprom, HWSET_MAX_SIZE_92S);
1462
for (i = 0; i < HWSET_MAX_SIZE_92S; i++)
1463
EFUSE_ShadowWrite(dev, 1, i, (u32)eeprom[i]);
1467
} /* EFUSE_ProgramMap */
1471
bool IsHexDigit( char chTmp)
1473
if( (chTmp >= '0' && chTmp <= '9') ||
1474
(chTmp >= 'a' && chTmp <= 'f') ||
1475
(chTmp >= 'A' && chTmp <= 'F') )
1485
u32 MapCharToHexDigit(char chTmp)
1487
if(chTmp >= '0' && chTmp <= '9')
1488
return (chTmp - '0');
1489
else if(chTmp >= 'a' && chTmp <= 'f')
1490
return (10 + (chTmp - 'a'));
1491
else if(chTmp >= 'A' && chTmp <= 'F')
1492
return (10 + (chTmp - 'A'));
1499
efuse_ParsingMap(char* szStr,u32* pu4bVal,u32* pu4bMove)
1501
char* szScan = szStr;
1503
if(szStr == NULL || pu4bVal == NULL || pu4bMove == NULL)
1511
while( *szScan != '\0' &&
1512
(*szScan == ' ' || *szScan == '\t') )
1518
if(!IsHexDigit(*szScan))
1526
*pu4bVal += MapCharToHexDigit(*szScan);
1530
} while(IsHexDigit(*szScan));
1534
} /* efuse_ParsingMap */
1537
int efuse_one_byte_rw(struct net_device* dev, u8 bRead, u16 addr, u8 *data)
1544
write_nic_byte(dev, EFUSE_CTRL+1, (u8)(addr&0xff));
1545
tmpv8 = ((u8)((addr>>8) &0x03) ) | (read_nic_byte(dev, EFUSE_CTRL+2)&0xFC );
1546
write_nic_byte(dev, EFUSE_CTRL+2, tmpv8);
1550
write_nic_byte(dev, EFUSE_CTRL+3, 0x72);
1552
while(!(0x80 & read_nic_byte(dev, EFUSE_CTRL+3)) && (tmpidx<100) ){
1556
*data=read_nic_byte(dev, EFUSE_CTRL);
1567
write_nic_byte(dev, EFUSE_CTRL, *data);
1569
write_nic_byte(dev, EFUSE_CTRL+3, 0xF2);
1571
while((0x80 & read_nic_byte(dev, EFUSE_CTRL+3)) && (tmpidx<100) ){
1576
*data=read_nic_byte(dev, EFUSE_CTRL);
1588
void efuse_access(struct net_device* dev, u8 bRead,u16 start_addr, u8 cnts, u8 *data)
1590
u8 efuse_clk_ori,efuse_clk_new;
1593
if(start_addr>0x200) return;
1594
efuse_clk_ori = read_nic_byte(dev,SYS_FUNC_EN+1);
1595
efuse_clk_new = efuse_clk_ori|0x20;
1597
if(efuse_clk_new!= efuse_clk_ori){
1598
write_nic_byte(dev, SYS_FUNC_EN+1, efuse_clk_new);
1600
#ifdef _POWERON_DELAY_
1603
write_nic_byte(dev, EFUSE_TEST+3, (read_nic_byte(dev, EFUSE_TEST+3)|0x80));
1604
write_nic_byte(dev, EFUSE_CLK_CTRL, (read_nic_byte(dev, EFUSE_CLK_CTRL)|0x03));
1606
#ifdef _PRE_EXECUTE_READ_CMD_
1608
unsigned char tmpdata;
1609
efuse_OneByteRead(dev, 0,&tmpdata);
1613
for(i=0;i<cnts;i++){
1614
efuse_one_byte_rw(dev,bRead, start_addr+i , data+i);
1616
write_nic_byte(dev, EFUSE_TEST+3, read_nic_byte(dev, EFUSE_TEST+3)&0x7f);
1617
write_nic_byte(dev, EFUSE_CLK_CTRL, read_nic_byte(dev, EFUSE_CLK_CTRL)&0xfd);
1619
if(efuse_clk_new != efuse_clk_ori) write_nic_byte(dev, 0x10250003, efuse_clk_ori);
1624
static void efuse_reg_ctrl(struct net_device* dev, u8 bPowerOn)
1627
write_nic_byte(dev, SYS_FUNC_EN+1, read_nic_byte(dev,SYS_FUNC_EN+1)|0x20);
1628
#ifdef _POWERON_DELAY_
1631
write_nic_byte(dev, EFUSE_TEST+4, (read_nic_byte(dev, EFUSE_TEST+4)|0x80));
1632
write_nic_byte(dev, EFUSE_CLK_CTRL, (read_nic_byte(dev, EFUSE_CLK_CTRL)|0x03));
1633
#ifdef _PRE_EXECUTE_READ_CMD_
1635
unsigned char tmpdata;
1636
efuse_OneByteRead(dev, 0,&tmpdata);
1642
write_nic_byte(dev, EFUSE_TEST+4, read_nic_byte(dev, EFUSE_TEST+4)&0x7f);
1643
write_nic_byte(dev, EFUSE_CLK_CTRL, read_nic_byte(dev, EFUSE_CLK_CTRL)&0xfd);
1651
void efuse_read_data(struct net_device* dev,u8 efuse_read_item,u8 *data,u32 data_size)
1653
u8 offset, word_start,byte_start,byte_cnts;
1654
u8 efusedata[EFUSE_REAL_CONTENT_LEN];
1662
if(efuse_read_item> (sizeof(RTL8712_SDIO_EFUSE_TABLE)/sizeof(EFUSE_MAP))){
1666
offset = RTL8712_SDIO_EFUSE_TABLE[efuse_read_item].offset ;
1667
word_start = RTL8712_SDIO_EFUSE_TABLE[efuse_read_item].word_start;
1668
byte_start = RTL8712_SDIO_EFUSE_TABLE[efuse_read_item].byte_start;
1669
byte_cnts = RTL8712_SDIO_EFUSE_TABLE[efuse_read_item].byte_cnts;
1671
if(data_size!=byte_cnts){
1675
pg_pkt_cnts = (byte_cnts /PGPKT_DATA_SIZE) +1;
1677
if(pg_pkt_cnts > 1){
1678
tmpdata = efusedata;
1682
memset(tmpdata,0xff,pg_pkt_cnts*PGPKT_DATA_SIZE);
1684
for(tmpidx=0;tmpidx<pg_pkt_cnts;tmpidx++)
1686
memset(pg_data,0xff,PGPKT_DATA_SIZE);
1687
if(true== efuse_PgPacketRead(dev,offset+tmpidx,pg_data))
1689
memcpy(tmpdata+(PGPKT_DATA_SIZE*tmpidx),pg_data,PGPKT_DATA_SIZE);
1692
memcpy(data,(tmpdata+ (2*word_start)+byte_start ),data_size);
1697
memset(pg_data,0xff,PGPKT_DATA_SIZE);
1698
if(true==efuse_PgPacketRead(dev,offset,pg_data)){
1699
memcpy(data,pg_data+ (2*word_start)+byte_start ,data_size);
1704
void efuse_write_data(struct net_device* dev,u8 efuse_write_item,u8 *data,u32 data_size,u32 bWordUnit)
1706
u8 offset, word_start,byte_start,byte_cnts;
1707
u8 word_en = 0x0f,word_cnts;
1710
u8 tmpidx,tmpbitmask;
1711
u8 pg_data[8],tmpbytes=0;
1713
if(efuse_write_item> (sizeof(RTL8712_SDIO_EFUSE_TABLE)/sizeof(EFUSE_MAP))){
1717
offset = RTL8712_SDIO_EFUSE_TABLE[efuse_write_item].offset ;
1718
word_start = RTL8712_SDIO_EFUSE_TABLE[efuse_write_item].word_start;
1719
byte_start = RTL8712_SDIO_EFUSE_TABLE[efuse_write_item].byte_start;
1720
byte_cnts = RTL8712_SDIO_EFUSE_TABLE[efuse_write_item].byte_cnts;
1722
if(data_size > byte_cnts){
1725
pg_pkt_cnts = (byte_cnts /PGPKT_DATA_SIZE) +1;
1726
word_cnts = byte_cnts /2 ;
1731
if((byte_start==1)||((byte_cnts%2)==1)){
1733
if((efuse_write_item==EFUSE_F0CIS)||(efuse_write_item==EFUSE_F1CIS)){
1734
memset(pg_data,0xff,PGPKT_DATA_SIZE);
1735
efuse_PgPacketRead(dev,offset,pg_data);
1737
if(efuse_write_item==EFUSE_F0CIS){
1739
memcpy(pg_data+word_start*2+byte_start,data,sizeof(u8)*2);
1740
efuse_PgPacketWrite(dev,offset,word_en,pg_data+(word_start*2));
1743
efuse_PgPacketWrite(dev,(offset+1),word_en,data+2);
1746
efuse_PgPacketRead(dev,offset+2,pg_data);
1747
memcpy(pg_data,data+2+8,sizeof(u8)*7);
1749
efuse_PgPacketWrite(dev,(offset+2),word_en,pg_data);
1751
else if(efuse_write_item==EFUSE_F1CIS){
1753
efuse_PgPacketRead(dev,offset,pg_data);
1754
pg_data[7] = data[0];
1755
efuse_PgPacketWrite(dev,offset,word_en,pg_data+(word_start*2));
1758
for(tmpidx = 0 ;tmpidx<(word_cnts/4);tmpidx++){
1759
efuse_PgPacketWrite(dev,(offset+1+tmpidx),word_en,data+1+(tmpidx*PGPKT_DATA_SIZE));
1765
memset(pg_data,0xff,PGPKT_DATA_SIZE);
1766
if((efuse_write_item==EFUSE_SDIO_SETTING)||(efuse_write_item==EFUSE_CCCR)){
1770
else if(efuse_write_item == EFUSE_SDIO_MODE){
1774
else if(efuse_write_item == EFUSE_OCR){
1778
else if((efuse_write_item == EFUSE_EEPROM_VER)||(efuse_write_item==EFUSE_CHAN_PLAN)){
1782
if(bWordUnit==true){
1783
memcpy(pg_data+word_start*2 ,data,sizeof(u8)*tmpbytes);
1786
efuse_PgPacketRead(dev,offset,pg_data);
1787
memcpy(pg_data+(2*word_start)+byte_start,data,sizeof(u8)*byte_cnts);
1790
efuse_PgPacketWrite(dev,offset,word_en,pg_data+(word_start*2));
1795
else if(pg_pkt_cnts>1){
1798
for(tmpidx = 0 ;tmpidx<(word_cnts/4);tmpidx++)
1800
efuse_PgPacketWrite(dev,(offset+tmpidx),word_en,data+(tmpidx*PGPKT_DATA_SIZE));
1803
for(tmpidx= 0; tmpidx<(word_cnts%4) ; tmpidx++)
1806
word_en &= (~(EFUSE_BIT(tmpbitmask)));
1808
efuse_PgPacketWrite(dev,offset+(word_cnts/4),word_en,data+((word_cnts/4)*PGPKT_DATA_SIZE));
1816
for(tmpidx= 0; tmpidx<word_cnts ; tmpidx++)
1818
tmpbitmask = word_start + tmpidx ;
1819
word_en &= (~(EFUSE_BIT(tmpbitmask)));
1821
efuse_PgPacketWrite(dev,offset,word_en,data);
1826
void efuset_test_func_read(struct net_device* dev)
1831
u8 txpowertable[28];
1833
memset(chipid,0,sizeof(u8)*2);
1834
efuse_read_data(dev,EFUSE_CHIP_ID,chipid,sizeof(chipid));
1836
memset(ocr,0,sizeof(u8)*3);
1837
efuse_read_data(dev,EFUSE_CCCR,ocr,sizeof(ocr));
1839
memset(macaddr,0,sizeof(u8)*6);
1840
efuse_read_data(dev,EFUSE_MAC_ADDR,macaddr,sizeof(macaddr));
1842
memset(txpowertable,0,sizeof(u8)*28);
1843
efuse_read_data(dev,EFUSE_TXPW_TAB,txpowertable,sizeof(txpowertable));
1846
void efuset_test_func_write(struct net_device* dev)
1848
u32 bWordUnit = true;
1849
u8 CCCR=0x02,SDIO_SETTING = 0xFF;
1852
u8 macaddr[6] = {0x00,0xe0,0x4c,0x87,0x12,0x66};
1853
efuse_write_data(dev,EFUSE_MAC_ADDR,macaddr,sizeof(macaddr),bWordUnit);
1856
efuse_write_data(dev,EFUSE_CCCR,&CCCR,sizeof(u8),bWordUnit);
1859
efuse_write_data(dev,EFUSE_SDIO_SETTING,&SDIO_SETTING,sizeof(u8),bWordUnit);
1862
tmpdata[0] =SDIO_SETTING ;
1864
efuse_write_data(dev,EFUSE_SDIO_SETTING,tmpdata,sizeof(tmpdata),bWordUnit);