1 /******************************************************************************
2  *
3  * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of version 2 of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12  * more details.
13  *
14  ******************************************************************************/
15 #define _RTW_EFUSE_C_
16 
17 #include <osdep_service.h>
18 #include <drv_types.h>
19 
20 #include <rtw_efuse.h>
21 #include <rtl8723a_hal.h>
22 #include <usb_ops_linux.h>
23 
24 /*------------------------Define local variable------------------------------*/
25 
26 /*  */
27 #define REG_EFUSE_CTRL		0x0030
28 #define EFUSE_CTRL			REG_EFUSE_CTRL		/*  E-Fuse Control. */
29 /*  */
30 
31 #define VOLTAGE_V25		0x03
32 #define LDOE25_SHIFT		28
33 
34 /*-----------------------------------------------------------------------------
35  * Function:	Efuse_PowerSwitch
36  *
37  * Overview:	When we want to enable write operation, we should change to
38  *				pwr on state. When we stop write, we should switch to 500k mode
39  *				and disable LDO 2.5V.
40  *
41  * Input:       NONE
42  *
43  * Output:      NONE
44  *
45  * Return:      NONE
46  *
47  * Revised History:
48  * When			Who		Remark
49  * 11/17/2008	MHC		Create Version 0.
50  *
51  *---------------------------------------------------------------------------*/
Efuse_PowerSwitch(struct rtw_adapter * padapter,u8 bWrite,u8 PwrState)52 static void Efuse_PowerSwitch(struct rtw_adapter *padapter,
53 			      u8 bWrite, u8 PwrState)
54 {
55 	u8 tempval;
56 	u16 tmpV16;
57 
58 	if (PwrState == true) {
59 		rtl8723au_write8(padapter, REG_EFUSE_ACCESS, EFUSE_ACCESS_ON);
60 
61 		/*  1.2V Power: From VDDON with Power
62 		    Cut(0x0000h[15]), default valid */
63 		tmpV16 = rtl8723au_read16(padapter, REG_SYS_ISO_CTRL);
64 		if (!(tmpV16 & PWC_EV12V)) {
65 			tmpV16 |= PWC_EV12V;
66 			rtl8723au_write16(padapter, REG_SYS_ISO_CTRL, tmpV16);
67 		}
68 		/*  Reset: 0x0000h[28], default valid */
69 		tmpV16 = rtl8723au_read16(padapter, REG_SYS_FUNC_EN);
70 		if (!(tmpV16 & FEN_ELDR)) {
71 			tmpV16 |= FEN_ELDR;
72 			rtl8723au_write16(padapter, REG_SYS_FUNC_EN, tmpV16);
73 		}
74 
75 		/*  Clock: Gated(0x0008h[5]) 8M(0x0008h[1]) clock
76 		    from ANA, default valid */
77 		tmpV16 = rtl8723au_read16(padapter, REG_SYS_CLKR);
78 		if ((!(tmpV16 & LOADER_CLK_EN)) || (!(tmpV16 & ANA8M))) {
79 			tmpV16 |= (LOADER_CLK_EN | ANA8M);
80 			rtl8723au_write16(padapter, REG_SYS_CLKR, tmpV16);
81 		}
82 
83 		if (bWrite == true) {
84 			/*  Enable LDO 2.5V before read/write action */
85 			tempval = rtl8723au_read8(padapter, EFUSE_TEST + 3);
86 			tempval &= 0x0F;
87 			tempval |= (VOLTAGE_V25 << 4);
88 			rtl8723au_write8(padapter, EFUSE_TEST + 3,
89 					 tempval | 0x80);
90 		}
91 	} else {
92 		rtl8723au_write8(padapter, REG_EFUSE_ACCESS, EFUSE_ACCESS_OFF);
93 
94 		if (bWrite == true) {
95 			/*  Disable LDO 2.5V after read/write action */
96 			tempval = rtl8723au_read8(padapter, EFUSE_TEST + 3);
97 			rtl8723au_write8(padapter, EFUSE_TEST + 3,
98 					 tempval & 0x7F);
99 		}
100 	}
101 }
102 
103 u16
Efuse_GetCurrentSize23a(struct rtw_adapter * pAdapter,u8 efuseType)104 Efuse_GetCurrentSize23a(struct rtw_adapter *pAdapter, u8 efuseType)
105 {
106 	u16 ret = 0;
107 
108 	if (efuseType == EFUSE_WIFI)
109 		ret = rtl8723a_EfuseGetCurrentSize_WiFi(pAdapter);
110 	else
111 		ret = rtl8723a_EfuseGetCurrentSize_BT(pAdapter);
112 
113 	return ret;
114 }
115 
116 /*  11/16/2008 MH Add description. Get current efuse area enabled word!!. */
117 u8
Efuse_CalculateWordCnts23a(u8 word_en)118 Efuse_CalculateWordCnts23a(u8 word_en)
119 {
120 	return hweight8((~word_en) & 0xf);
121 }
122 
123 /*  */
124 /*	Description: */
125 /*		Execute E-Fuse read byte operation. */
126 /*		Referred from SD1 Richard. */
127 /*  */
128 /*	Assumption: */
129 /*		1. Boot from E-Fuse and successfully auto-load. */
130 /*		2. PASSIVE_LEVEL (USB interface) */
131 /*  */
132 /*	Created by Roger, 2008.10.21. */
133 /*  */
134 void
ReadEFuseByte23a(struct rtw_adapter * Adapter,u16 _offset,u8 * pbuf)135 ReadEFuseByte23a(struct rtw_adapter *Adapter, u16 _offset, u8 *pbuf)
136 {
137 	u32	value32;
138 	u8	readbyte;
139 	u16	retry;
140 
141 	/* Write Address */
142 	rtl8723au_write8(Adapter, EFUSE_CTRL+1, (_offset & 0xff));
143 	readbyte = rtl8723au_read8(Adapter, EFUSE_CTRL+2);
144 	rtl8723au_write8(Adapter, EFUSE_CTRL+2,
145 			 ((_offset >> 8) & 0x03) | (readbyte & 0xfc));
146 
147 	/* Write bit 32 0 */
148 	readbyte = rtl8723au_read8(Adapter, EFUSE_CTRL+3);
149 	rtl8723au_write8(Adapter, EFUSE_CTRL+3, readbyte & 0x7f);
150 
151 	/* Check bit 32 read-ready */
152 	retry = 0;
153 	value32 = rtl8723au_read32(Adapter, EFUSE_CTRL);
154 	while (!((value32 >> 24) & 0x80) && retry < 10000) {
155 		value32 = rtl8723au_read32(Adapter, EFUSE_CTRL);
156 		retry++;
157 	}
158 
159 	/*  20100205 Joseph: Add delay suggested by SD1 Victor. */
160 	/*  This fix the problem that Efuse read error in high temperature condition. */
161 	/*  Designer says that there shall be some delay after ready bit is set, or the */
162 	/*  result will always stay on last data we read. */
163 	udelay(50);
164 	value32 = rtl8723au_read32(Adapter, EFUSE_CTRL);
165 
166 	*pbuf = (u8)(value32 & 0xff);
167 }
168 
169 void
EFUSE_GetEfuseDefinition23a(struct rtw_adapter * pAdapter,u8 efuseType,u8 type,void * pOut)170 EFUSE_GetEfuseDefinition23a(struct rtw_adapter *pAdapter, u8 efuseType,
171 			    u8 type, void *pOut)
172 {
173 	u8 *pu1Tmp;
174 	u16 *pu2Tmp;
175 	u8 *pMax_section;
176 
177 	switch (type) {
178 	case TYPE_EFUSE_MAX_SECTION:
179 		pMax_section = pOut;
180 
181 		if (efuseType == EFUSE_WIFI)
182 			*pMax_section = EFUSE_MAX_SECTION_8723A;
183 		else
184 			*pMax_section = EFUSE_BT_MAX_SECTION;
185 		break;
186 
187 	case TYPE_EFUSE_REAL_CONTENT_LEN:
188 		pu2Tmp = pOut;
189 
190 		if (efuseType == EFUSE_WIFI)
191 			*pu2Tmp = EFUSE_REAL_CONTENT_LEN_8723A;
192 		else
193 			*pu2Tmp = EFUSE_BT_REAL_CONTENT_LEN;
194 		break;
195 
196 	case TYPE_AVAILABLE_EFUSE_BYTES_BANK:
197 		pu2Tmp = pOut;
198 
199 		if (efuseType == EFUSE_WIFI)
200 			*pu2Tmp = (EFUSE_REAL_CONTENT_LEN_8723A -
201 				   EFUSE_OOB_PROTECT_BYTES);
202 		else
203 			*pu2Tmp = (EFUSE_BT_REAL_BANK_CONTENT_LEN -
204 				   EFUSE_PROTECT_BYTES_BANK);
205 		break;
206 
207 	case TYPE_AVAILABLE_EFUSE_BYTES_TOTAL:
208 		pu2Tmp = pOut;
209 
210 		if (efuseType == EFUSE_WIFI)
211 			*pu2Tmp = (EFUSE_REAL_CONTENT_LEN_8723A -
212 				   EFUSE_OOB_PROTECT_BYTES);
213 		else
214 			*pu2Tmp = (EFUSE_BT_REAL_CONTENT_LEN -
215 				   (EFUSE_PROTECT_BYTES_BANK * 3));
216 		break;
217 
218 	case TYPE_EFUSE_MAP_LEN:
219 		pu2Tmp = pOut;
220 
221 		if (efuseType == EFUSE_WIFI)
222 			*pu2Tmp = EFUSE_MAP_LEN_8723A;
223 		else
224 			*pu2Tmp = EFUSE_BT_MAP_LEN;
225 		break;
226 
227 	case TYPE_EFUSE_PROTECT_BYTES_BANK:
228 		pu1Tmp = pOut;
229 
230 		if (efuseType == EFUSE_WIFI)
231 			*pu1Tmp = EFUSE_OOB_PROTECT_BYTES;
232 		else
233 			*pu1Tmp = EFUSE_PROTECT_BYTES_BANK;
234 		break;
235 
236 	case TYPE_EFUSE_CONTENT_LEN_BANK:
237 		pu2Tmp = pOut;
238 
239 		if (efuseType == EFUSE_WIFI)
240 			*pu2Tmp = EFUSE_REAL_CONTENT_LEN_8723A;
241 		else
242 			*pu2Tmp = EFUSE_BT_REAL_BANK_CONTENT_LEN;
243 		break;
244 
245 	default:
246 		pu1Tmp = pOut;
247 		*pu1Tmp = 0;
248 		break;
249 	}
250 }
251 
252 /*-----------------------------------------------------------------------------
253  * Function:	EFUSE_Read1Byte23a
254  *
255  * Overview:	Copy from WMAC fot EFUSE read 1 byte.
256  *
257  * Input:       NONE
258  *
259  * Output:      NONE
260  *
261  * Return:      NONE
262  *
263  * Revised History:
264  * When			Who		Remark
265  * 09/23/2008	MHC		Copy from WMAC.
266  *
267  *---------------------------------------------------------------------------*/
268 u8
EFUSE_Read1Byte23a(struct rtw_adapter * Adapter,u16 Address)269 EFUSE_Read1Byte23a(struct rtw_adapter *Adapter, u16 Address)
270 {
271 	u8	data;
272 	u8	Bytetemp = {0x00};
273 	u8	temp = {0x00};
274 	u32	k = 0;
275 	u16	contentLen = 0;
276 
277 	EFUSE_GetEfuseDefinition23a(Adapter, EFUSE_WIFI,
278 				 TYPE_EFUSE_REAL_CONTENT_LEN,
279 				 (void *)&contentLen);
280 
281 	if (Address < contentLen) { /* E-fuse 512Byte */
282 		/* Write E-fuse Register address bit0~7 */
283 		temp = Address & 0xFF;
284 		rtl8723au_write8(Adapter, EFUSE_CTRL+1, temp);
285 		Bytetemp = rtl8723au_read8(Adapter, EFUSE_CTRL+2);
286 		/* Write E-fuse Register address bit8~9 */
287 		temp = ((Address >> 8) & 0x03) | (Bytetemp & 0xFC);
288 		rtl8723au_write8(Adapter, EFUSE_CTRL+2, temp);
289 
290 		/* Write 0x30[31]= 0 */
291 		Bytetemp = rtl8723au_read8(Adapter, EFUSE_CTRL+3);
292 		temp = Bytetemp & 0x7F;
293 		rtl8723au_write8(Adapter, EFUSE_CTRL+3, temp);
294 
295 		/* Wait Write-ready (0x30[31]= 1) */
296 		Bytetemp = rtl8723au_read8(Adapter, EFUSE_CTRL+3);
297 		while (!(Bytetemp & 0x80)) {
298 			Bytetemp = rtl8723au_read8(Adapter, EFUSE_CTRL+3);
299 			k++;
300 			if (k == 1000) {
301 				k = 0;
302 				break;
303 			}
304 		}
305 		data = rtl8723au_read8(Adapter, EFUSE_CTRL);
306 		return data;
307 	} else
308 		return 0xFF;
309 }/* EFUSE_Read1Byte23a */
310 
311 /*-----------------------------------------------------------------------------
312  * Function:	EFUSE_Write1Byte
313  *
314  * Overview:	Copy from WMAC fot EFUSE write 1 byte.
315  *
316  * Input:       NONE
317  *
318  * Output:      NONE
319  *
320  * Return:      NONE
321  *
322  * Revised History:
323  * When			Who		Remark
324  * 09/23/2008	MHC		Copy from WMAC.
325  *
326  *---------------------------------------------------------------------------*/
327 
328 void
329 EFUSE_Write1Byte(struct rtw_adapter *Adapter, u16 Address, u8 Value);
330 void
EFUSE_Write1Byte(struct rtw_adapter * Adapter,u16 Address,u8 Value)331 EFUSE_Write1Byte(struct rtw_adapter *Adapter, u16 Address, u8 Value)
332 {
333 	u8	Bytetemp = {0x00};
334 	u8	temp = {0x00};
335 	u32	k = 0;
336 	u16	contentLen = 0;
337 
338 	EFUSE_GetEfuseDefinition23a(Adapter, EFUSE_WIFI,
339 				 TYPE_EFUSE_REAL_CONTENT_LEN,
340 				 (void *)&contentLen);
341 
342 	if (Address < contentLen) { /* E-fuse 512Byte */
343 		rtl8723au_write8(Adapter, EFUSE_CTRL, Value);
344 
345 		/* Write E-fuse Register address bit0~7 */
346 		temp = Address & 0xFF;
347 		rtl8723au_write8(Adapter, EFUSE_CTRL+1, temp);
348 		Bytetemp = rtl8723au_read8(Adapter, EFUSE_CTRL+2);
349 
350 		/* Write E-fuse Register address bit8~9 */
351 		temp = ((Address >> 8) & 0x03) | (Bytetemp & 0xFC);
352 		rtl8723au_write8(Adapter, EFUSE_CTRL+2, temp);
353 
354 		/* Write 0x30[31]= 1 */
355 		Bytetemp = rtl8723au_read8(Adapter, EFUSE_CTRL+3);
356 		temp = Bytetemp | 0x80;
357 		rtl8723au_write8(Adapter, EFUSE_CTRL+3, temp);
358 
359 		/* Wait Write-ready (0x30[31]= 0) */
360 		Bytetemp = rtl8723au_read8(Adapter, EFUSE_CTRL+3);
361 		while (Bytetemp & 0x80) {
362 			Bytetemp = rtl8723au_read8(Adapter, EFUSE_CTRL+3);
363 			k++;
364 			if (k == 100) {
365 				k = 0;
366 				break;
367 			}
368 		}
369 	}
370 }/* EFUSE_Write1Byte */
371 
372 /*  11/16/2008 MH Read one byte from real Efuse. */
373 int
efuse_OneByteRead23a(struct rtw_adapter * pAdapter,u16 addr,u8 * data)374 efuse_OneByteRead23a(struct rtw_adapter *pAdapter, u16 addr, u8 *data)
375 {
376 	u8	tmpidx = 0;
377 	int	bResult;
378 
379 	/*  -----------------e-fuse reg ctrl --------------------------------- */
380 	/* address */
381 	rtl8723au_write8(pAdapter, EFUSE_CTRL+1, (u8)(addr&0xff));
382 	rtl8723au_write8(pAdapter, EFUSE_CTRL+2, ((u8)((addr>>8) &0x03)) |
383 	(rtl8723au_read8(pAdapter, EFUSE_CTRL+2)&0xFC));
384 
385 	rtl8723au_write8(pAdapter, EFUSE_CTRL+3,  0x72);/* read cmd */
386 
387 	while(!(0x80 &rtl8723au_read8(pAdapter, EFUSE_CTRL+3)) && (tmpidx<100))
388 		tmpidx++;
389 	if (tmpidx < 100) {
390 		*data = rtl8723au_read8(pAdapter, EFUSE_CTRL);
391 		bResult = _SUCCESS;
392 	} else {
393 		*data = 0xff;
394 		bResult = _FAIL;
395 	}
396 	return bResult;
397 }
398 
399 /*  11/16/2008 MH Write one byte to reald Efuse. */
400 int
efuse_OneByteWrite23a(struct rtw_adapter * pAdapter,u16 addr,u8 data)401 efuse_OneByteWrite23a(struct rtw_adapter *pAdapter, u16 addr, u8 data)
402 {
403 	u8	tmpidx = 0;
404 	int	bResult;
405 
406 	/* return	0; */
407 
408 	/*  -----------------e-fuse reg ctrl --------------------------------- */
409 	/* address */
410 	rtl8723au_write8(pAdapter, EFUSE_CTRL+1, (u8)(addr&0xff));
411 	rtl8723au_write8(pAdapter, EFUSE_CTRL+2,
412 	(rtl8723au_read8(pAdapter, EFUSE_CTRL+2)&0xFC)|(u8)((addr>>8)&0x03));
413 	rtl8723au_write8(pAdapter, EFUSE_CTRL, data);/* data */
414 
415 	rtl8723au_write8(pAdapter, EFUSE_CTRL+3, 0xF2);/* write cmd */
416 
417 	while((0x80 & rtl8723au_read8(pAdapter, EFUSE_CTRL+3)) &&
418 	      (tmpidx<100)) {
419 		tmpidx++;
420 	}
421 
422 	if (tmpidx < 100)
423 		bResult = _SUCCESS;
424 	else
425 		bResult = _FAIL;
426 
427 	return bResult;
428 }
429 
430 /*-----------------------------------------------------------------------------
431  * Function:	efuse_WordEnableDataRead23a
432  *
433  * Overview:	Read allowed word in current efuse section data.
434  *
435  * Input:       NONE
436  *
437  * Output:      NONE
438  *
439  * Return:      NONE
440  *
441  * Revised History:
442  * When			Who		Remark
443  * 11/16/2008	MHC		Create Version 0.
444  * 11/21/2008	MHC		Fix Write bug when we only enable late word.
445  *
446  *---------------------------------------------------------------------------*/
447 void
efuse_WordEnableDataRead23a(u8 word_en,u8 * sourdata,u8 * targetdata)448 efuse_WordEnableDataRead23a(u8	word_en,
449 			 u8	*sourdata,
450 			 u8	*targetdata)
451 {
452 	if (!(word_en&BIT(0))) {
453 		targetdata[0] = sourdata[0];
454 		targetdata[1] = sourdata[1];
455 	}
456 	if (!(word_en&BIT(1))) {
457 		targetdata[2] = sourdata[2];
458 		targetdata[3] = sourdata[3];
459 	}
460 	if (!(word_en&BIT(2))) {
461 		targetdata[4] = sourdata[4];
462 		targetdata[5] = sourdata[5];
463 	}
464 	if (!(word_en&BIT(3))) {
465 		targetdata[6] = sourdata[6];
466 		targetdata[7] = sourdata[7];
467 	}
468 }
469 
efuse_read8(struct rtw_adapter * padapter,u16 address,u8 * value)470 static int efuse_read8(struct rtw_adapter *padapter, u16 address, u8 *value)
471 {
472 	return efuse_OneByteRead23a(padapter, address, value);
473 }
474 
efuse_write8(struct rtw_adapter * padapter,u16 address,u8 * value)475 static int efuse_write8(struct rtw_adapter *padapter, u16 address, u8 *value)
476 {
477 	return efuse_OneByteWrite23a(padapter, address, *value);
478 }
479 
480 /*
481  * read/write raw efuse data
482  */
rtw_efuse_access23a(struct rtw_adapter * padapter,u8 bWrite,u16 start_addr,u16 cnts,u8 * data)483 int rtw_efuse_access23a(struct rtw_adapter *padapter, u8 bWrite, u16 start_addr,
484 			u16 cnts, u8 *data)
485 {
486 	int i = 0;
487 	u16 real_content_len = 0, max_available_size = 0;
488 	int res = _FAIL ;
489 	int (*rw8)(struct rtw_adapter *, u16, u8*);
490 
491 	EFUSE_GetEfuseDefinition23a(padapter, EFUSE_WIFI,
492 				 TYPE_EFUSE_REAL_CONTENT_LEN,
493 				 (void *)&real_content_len);
494 	EFUSE_GetEfuseDefinition23a(padapter, EFUSE_WIFI,
495 				 TYPE_AVAILABLE_EFUSE_BYTES_TOTAL,
496 				 (void *)&max_available_size);
497 
498 	if (start_addr > real_content_len)
499 		return _FAIL;
500 
501 	if (true == bWrite) {
502 		if ((start_addr + cnts) > max_available_size)
503 			return _FAIL;
504 		rw8 = &efuse_write8;
505 	} else
506 		rw8 = &efuse_read8;
507 
508 	Efuse_PowerSwitch(padapter, bWrite, true);
509 
510 	/*  e-fuse one byte read / write */
511 	for (i = 0; i < cnts; i++) {
512 		if (start_addr >= real_content_len) {
513 			res = _FAIL;
514 			break;
515 		}
516 
517 		res = rw8(padapter, start_addr++, data++);
518 		if (res == _FAIL)
519 			break;
520 	}
521 
522 	Efuse_PowerSwitch(padapter, bWrite, false);
523 
524 	return res;
525 }
526 /*  */
efuse_GetMaxSize23a(struct rtw_adapter * padapter)527 u16 efuse_GetMaxSize23a(struct rtw_adapter *padapter)
528 {
529 	u16 max_size;
530 	EFUSE_GetEfuseDefinition23a(padapter, EFUSE_WIFI,
531 				 TYPE_AVAILABLE_EFUSE_BYTES_TOTAL,
532 				 (void *)&max_size);
533 	return max_size;
534 }
535 /*  */
rtw_efuse_map_read23a(struct rtw_adapter * padapter,u16 addr,u16 cnts,u8 * data)536 int rtw_efuse_map_read23a(struct rtw_adapter *padapter,
537 			  u16 addr, u16 cnts, u8 *data)
538 {
539 	u16 mapLen = 0;
540 
541 	EFUSE_GetEfuseDefinition23a(padapter, EFUSE_WIFI,
542 				 TYPE_EFUSE_MAP_LEN, (void *)&mapLen);
543 
544 	if ((addr + cnts) > mapLen)
545 		return _FAIL;
546 
547 	Efuse_PowerSwitch(padapter, false, true);
548 
549 	rtl8723a_readefuse(padapter, EFUSE_WIFI, addr, cnts, data);
550 
551 	Efuse_PowerSwitch(padapter, false, false);
552 
553 	return _SUCCESS;
554 }
555 
rtw_BT_efuse_map_read23a(struct rtw_adapter * padapter,u16 addr,u16 cnts,u8 * data)556 int rtw_BT_efuse_map_read23a(struct rtw_adapter *padapter,
557 			     u16 addr, u16 cnts, u8 *data)
558 {
559 	u16 mapLen = 0;
560 
561 	EFUSE_GetEfuseDefinition23a(padapter, EFUSE_BT,
562 				 TYPE_EFUSE_MAP_LEN, (void *)&mapLen);
563 
564 	if ((addr + cnts) > mapLen)
565 		return _FAIL;
566 
567 	Efuse_PowerSwitch(padapter, false, true);
568 
569 	rtl8723a_readefuse(padapter, EFUSE_BT, addr, cnts, data);
570 
571 	Efuse_PowerSwitch(padapter, false, false);
572 
573 	return _SUCCESS;
574 }
575 
576 /*-----------------------------------------------------------------------------
577  * Function:	Efuse_ReadAllMap
578  *
579  * Overview:	Read All Efuse content
580  *
581  * Input:       NONE
582  *
583  * Output:      NONE
584  *
585  * Return:      NONE
586  *
587  * Revised History:
588  * When			Who		Remark
589  * 11/11/2008	MHC		Create Version 0.
590  *
591  *---------------------------------------------------------------------------*/
592 void
593 Efuse_ReadAllMap(struct rtw_adapter *pAdapter, u8 efuseType, u8 *Efuse);
594 void
Efuse_ReadAllMap(struct rtw_adapter * pAdapter,u8 efuseType,u8 * Efuse)595 Efuse_ReadAllMap(struct rtw_adapter *pAdapter, u8 efuseType, u8 *Efuse)
596 {
597 	u16	mapLen = 0;
598 
599 	Efuse_PowerSwitch(pAdapter, false, true);
600 
601 	EFUSE_GetEfuseDefinition23a(pAdapter, efuseType, TYPE_EFUSE_MAP_LEN,
602 				 (void *)&mapLen);
603 
604 	rtl8723a_readefuse(pAdapter, efuseType, 0, mapLen, Efuse);
605 
606 	Efuse_PowerSwitch(pAdapter, false, false);
607 }
608 
609 /*-----------------------------------------------------------------------------
610  * Function:	efuse_ShadowRead1Byte
611  *			efuse_ShadowRead2Byte
612  *			efuse_ShadowRead4Byte
613  *
614  * Overview:	Read from efuse init map by one/two/four bytes !!!!!
615  *
616  * Input:       NONE
617  *
618  * Output:      NONE
619  *
620  * Return:      NONE
621  *
622  * Revised History:
623  * When			Who		Remark
624  * 11/12/2008	MHC		Create Version 0.
625  *
626  *---------------------------------------------------------------------------*/
627 static void
efuse_ShadowRead1Byte(struct rtw_adapter * pAdapter,u16 Offset,u8 * Value)628 efuse_ShadowRead1Byte(struct rtw_adapter *pAdapter, u16 Offset, u8 *Value)
629 {
630 	struct eeprom_priv *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter);
631 
632 	*Value = pEEPROM->efuse_eeprom_data[Offset];
633 }	/*  EFUSE_ShadowRead23a1Byte */
634 
635 /* Read Two Bytes */
636 static void
efuse_ShadowRead2Byte(struct rtw_adapter * pAdapter,u16 Offset,u16 * Value)637 efuse_ShadowRead2Byte(struct rtw_adapter *pAdapter, u16 Offset, u16 *Value)
638 {
639 	struct eeprom_priv *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter);
640 
641 	*Value = pEEPROM->efuse_eeprom_data[Offset];
642 	*Value |= pEEPROM->efuse_eeprom_data[Offset+1]<<8;
643 }	/*  EFUSE_ShadowRead23a2Byte */
644 
645 /* Read Four Bytes */
646 static void
efuse_ShadowRead4Byte(struct rtw_adapter * pAdapter,u16 Offset,u32 * Value)647 efuse_ShadowRead4Byte(struct rtw_adapter *pAdapter, u16 Offset, u32 *Value)
648 {
649 	struct eeprom_priv *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter);
650 
651 	*Value = pEEPROM->efuse_eeprom_data[Offset];
652 	*Value |= pEEPROM->efuse_eeprom_data[Offset+1]<<8;
653 	*Value |= pEEPROM->efuse_eeprom_data[Offset+2]<<16;
654 	*Value |= pEEPROM->efuse_eeprom_data[Offset+3]<<24;
655 }	/*  efuse_ShadowRead4Byte */
656 
657 /*-----------------------------------------------------------------------------
658  * Function:	EFUSE_ShadowMapUpdate23a
659  *
660  * Overview:	Transfer current EFUSE content to shadow init and modify map.
661  *
662  * Input:       NONE
663  *
664  * Output:      NONE
665  *
666  * Return:      NONE
667  *
668  * Revised History:
669  * When			Who		Remark
670  * 11/13/2008	MHC		Create Version 0.
671  *
672  *---------------------------------------------------------------------------*/
EFUSE_ShadowMapUpdate23a(struct rtw_adapter * pAdapter,u8 efuseType)673 void EFUSE_ShadowMapUpdate23a(struct rtw_adapter *pAdapter, u8 efuseType)
674 {
675 	struct eeprom_priv *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter);
676 	u16	mapLen = 0;
677 
678 	EFUSE_GetEfuseDefinition23a(pAdapter, efuseType,
679 				 TYPE_EFUSE_MAP_LEN, (void *)&mapLen);
680 
681 	if (pEEPROM->bautoload_fail_flag == true)
682 		memset(pEEPROM->efuse_eeprom_data, 0xFF, mapLen);
683 	else
684 		Efuse_ReadAllMap(pAdapter, efuseType,
685 				 pEEPROM->efuse_eeprom_data);
686 
687 }/*  EFUSE_ShadowMapUpdate23a */
688 
689 /*-----------------------------------------------------------------------------
690  * Function:	EFUSE_ShadowRead23a
691  *
692  * Overview:	Read from efuse init map !!!!!
693  *
694  * Input:       NONE
695  *
696  * Output:      NONE
697  *
698  * Return:      NONE
699  *
700  * Revised History:
701  * When			Who		Remark
702  * 11/12/2008	MHC		Create Version 0.
703  *
704  *---------------------------------------------------------------------------*/
705 void
EFUSE_ShadowRead23a(struct rtw_adapter * pAdapter,u8 Type,u16 Offset,u32 * Value)706 EFUSE_ShadowRead23a(struct rtw_adapter *pAdapter,
707 		    u8 Type, u16 Offset, u32 *Value)
708 {
709 	if (Type == 1)
710 		efuse_ShadowRead1Byte(pAdapter, Offset, (u8 *)Value);
711 	else if (Type == 2)
712 		efuse_ShadowRead2Byte(pAdapter, Offset, (u16 *)Value);
713 	else if (Type == 4)
714 		efuse_ShadowRead4Byte(pAdapter, Offset, (u32 *)Value);
715 }	/*  EFUSE_ShadowRead23a */
716