158391efdSNathan Chancellor // SPDX-License-Identifier: GPL-2.0
2554c0a3aSHans de Goede /******************************************************************************
3554c0a3aSHans de Goede  *
4554c0a3aSHans de Goede  * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
5554c0a3aSHans de Goede  *
6554c0a3aSHans de Goede  ******************************************************************************/
7554c0a3aSHans de Goede #include <drv_types.h>
8554c0a3aSHans de Goede #include <rtw_debug.h>
9554c0a3aSHans de Goede #include <hal_data.h>
10554c0a3aSHans de Goede #include <linux/jiffies.h>
11554c0a3aSHans de Goede 
12554c0a3aSHans de Goede 
13e8466ea7SHenriette Hofmeier /* Define global variables */
14cbb2cb50SHenriette Hofmeier u8 fakeEfuseBank;
15cbb2cb50SHenriette Hofmeier u32 fakeEfuseUsedBytes;
16554c0a3aSHans de Goede u8 fakeEfuseContent[EFUSE_MAX_HW_SIZE] = {0};
17554c0a3aSHans de Goede u8 fakeEfuseInitMap[EFUSE_MAX_MAP_LEN] = {0};
18554c0a3aSHans de Goede u8 fakeEfuseModifiedMap[EFUSE_MAX_MAP_LEN] = {0};
19554c0a3aSHans de Goede 
20cbb2cb50SHenriette Hofmeier u32 BTEfuseUsedBytes;
21554c0a3aSHans de Goede u8 BTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE];
22554c0a3aSHans de Goede u8 BTEfuseInitMap[EFUSE_BT_MAX_MAP_LEN] = {0};
23554c0a3aSHans de Goede u8 BTEfuseModifiedMap[EFUSE_BT_MAX_MAP_LEN] = {0};
24554c0a3aSHans de Goede 
25cbb2cb50SHenriette Hofmeier u32 fakeBTEfuseUsedBytes;
26554c0a3aSHans de Goede u8 fakeBTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE];
27554c0a3aSHans de Goede u8 fakeBTEfuseInitMap[EFUSE_BT_MAX_MAP_LEN] = {0};
28554c0a3aSHans de Goede u8 fakeBTEfuseModifiedMap[EFUSE_BT_MAX_MAP_LEN] = {0};
29554c0a3aSHans de Goede 
30554c0a3aSHans de Goede #define REG_EFUSE_CTRL		0x0030
31554c0a3aSHans de Goede #define EFUSE_CTRL			REG_EFUSE_CTRL		/*  E-Fuse Control. */
32554c0a3aSHans de Goede 
33644651d2SFabio Aiuto static bool
Efuse_Read1ByteFromFakeContent(u16 Offset,u8 * Value)34ed8f72e5SSaurav Girepunje Efuse_Read1ByteFromFakeContent(u16 Offset, u8 *Value)
35554c0a3aSHans de Goede {
3645d9d3c9SSimran Singhal 	if (Offset >= EFUSE_MAX_HW_SIZE)
37554c0a3aSHans de Goede 		return false;
38554c0a3aSHans de Goede 	if (fakeEfuseBank == 0)
39554c0a3aSHans de Goede 		*Value = fakeEfuseContent[Offset];
40554c0a3aSHans de Goede 	else
41554c0a3aSHans de Goede 		*Value = fakeBTEfuseContent[fakeEfuseBank-1][Offset];
42554c0a3aSHans de Goede 	return true;
43554c0a3aSHans de Goede }
44554c0a3aSHans de Goede 
45644651d2SFabio Aiuto static bool
Efuse_Write1ByteToFakeContent(u16 Offset,u8 Value)46f3f23022SSaurav Girepunje Efuse_Write1ByteToFakeContent(u16 Offset, u8 Value)
47554c0a3aSHans de Goede {
4845d9d3c9SSimran Singhal 	if (Offset >= EFUSE_MAX_HW_SIZE)
49554c0a3aSHans de Goede 		return false;
50554c0a3aSHans de Goede 	if (fakeEfuseBank == 0)
51554c0a3aSHans de Goede 		fakeEfuseContent[Offset] = Value;
5245d9d3c9SSimran Singhal 	else
53554c0a3aSHans de Goede 		fakeBTEfuseContent[fakeEfuseBank-1][Offset] = Value;
54554c0a3aSHans de Goede 	return true;
55554c0a3aSHans de Goede }
56554c0a3aSHans de Goede 
57554c0a3aSHans de Goede /*-----------------------------------------------------------------------------
58554c0a3aSHans de Goede  * Function:	Efuse_PowerSwitch
59554c0a3aSHans de Goede  *
60554c0a3aSHans de Goede  * Overview:	When we want to enable write operation, we should change to
61554c0a3aSHans de Goede  *			pwr on state. When we stop write, we should switch to 500k mode
62554c0a3aSHans de Goede  *			and disable LDO 2.5V.
63554c0a3aSHans de Goede  *
64554c0a3aSHans de Goede  * Input:       NONE
65554c0a3aSHans de Goede  *
66554c0a3aSHans de Goede  * Output:      NONE
67554c0a3aSHans de Goede  *
68554c0a3aSHans de Goede  * Return:      NONE
69554c0a3aSHans de Goede  *
70554c0a3aSHans de Goede  * Revised History:
71554c0a3aSHans de Goede  * When			Who		Remark
72554c0a3aSHans de Goede  * 11/17/2008	MHC		Create Version 0.
73554c0a3aSHans de Goede  *
74554c0a3aSHans de Goede  *---------------------------------------------------------------------------*/
75554c0a3aSHans de Goede void
Efuse_PowerSwitch(struct adapter * padapter,u8 bWrite,u8 PwrState)76554c0a3aSHans de Goede Efuse_PowerSwitch(
77554c0a3aSHans de Goede struct adapter *padapter,
78554c0a3aSHans de Goede u8 bWrite,
79554c0a3aSHans de Goede u8 PwrState)
80554c0a3aSHans de Goede {
81554c0a3aSHans de Goede 	padapter->HalFunc.EfusePowerSwitch(padapter, bWrite, PwrState);
82554c0a3aSHans de Goede }
83554c0a3aSHans de Goede 
84554c0a3aSHans de Goede /*-----------------------------------------------------------------------------
85554c0a3aSHans de Goede  * Function:	Efuse_GetCurrentSize
86554c0a3aSHans de Goede  *
87554c0a3aSHans de Goede  * Overview:	Get current efuse size!!!
88554c0a3aSHans de Goede  *
89554c0a3aSHans de Goede  * Input:       NONE
90554c0a3aSHans de Goede  *
91554c0a3aSHans de Goede  * Output:      NONE
92554c0a3aSHans de Goede  *
93554c0a3aSHans de Goede  * Return:      NONE
94554c0a3aSHans de Goede  *
95554c0a3aSHans de Goede  * Revised History:
96554c0a3aSHans de Goede  * When			Who		Remark
97554c0a3aSHans de Goede  * 11/16/2008	MHC		Create Version 0.
98554c0a3aSHans de Goede  *
99554c0a3aSHans de Goede  *---------------------------------------------------------------------------*/
100554c0a3aSHans de Goede u16
Efuse_GetCurrentSize(struct adapter * padapter,u8 efuseType,bool bPseudoTest)101554c0a3aSHans de Goede Efuse_GetCurrentSize(
102554c0a3aSHans de Goede 	struct adapter *padapter,
103554c0a3aSHans de Goede 	u8	efuseType,
104554c0a3aSHans de Goede 	bool		bPseudoTest)
105554c0a3aSHans de Goede {
1067997c367SPayal Kshirsagar 	return padapter->HalFunc.EfuseGetCurrentSize(padapter, efuseType,
1077997c367SPayal Kshirsagar 						     bPseudoTest);
108554c0a3aSHans de Goede }
109554c0a3aSHans de Goede 
110554c0a3aSHans de Goede /*  11/16/2008 MH Add description. Get current efuse area enabled word!!. */
111554c0a3aSHans de Goede u8
Efuse_CalculateWordCnts(u8 word_en)112554c0a3aSHans de Goede Efuse_CalculateWordCnts(u8 word_en)
113554c0a3aSHans de Goede {
114554c0a3aSHans de Goede 	u8 word_cnts = 0;
115554c0a3aSHans de Goede 	if (!(word_en & BIT(0)))
116554c0a3aSHans de Goede 		word_cnts++; /*  0 : write enable */
117554c0a3aSHans de Goede 	if (!(word_en & BIT(1)))
118554c0a3aSHans de Goede 		word_cnts++;
119554c0a3aSHans de Goede 	if (!(word_en & BIT(2)))
120554c0a3aSHans de Goede 		word_cnts++;
121554c0a3aSHans de Goede 	if (!(word_en & BIT(3)))
122554c0a3aSHans de Goede 		word_cnts++;
123554c0a3aSHans de Goede 	return word_cnts;
124554c0a3aSHans de Goede }
125554c0a3aSHans de Goede 
126554c0a3aSHans de Goede /*  */
127554c0a3aSHans de Goede /* Description: */
128554c0a3aSHans de Goede /*		1. Execute E-Fuse read byte operation according as map offset and */
129554c0a3aSHans de Goede /*			save to E-Fuse table. */
130a4b99f3dSXaralampos Mainas /*		2. Referred from SD1 Richard. */
131554c0a3aSHans de Goede /*  */
132554c0a3aSHans de Goede /* Assumption: */
133554c0a3aSHans de Goede /*		1. Boot from E-Fuse and successfully auto-load. */
134554c0a3aSHans de Goede /*		2. PASSIVE_LEVEL (USB interface) */
135554c0a3aSHans de Goede /*  */
136554c0a3aSHans de Goede /* Created by Roger, 2008.10.21. */
137554c0a3aSHans de Goede /*  */
138554c0a3aSHans de Goede /* 2008/12/12 MH	1. Reorganize code flow and reserve bytes. and add description. */
139554c0a3aSHans de Goede /*					2. Add efuse utilization collect. */
140554c0a3aSHans de Goede /* 2008/12/22 MH	Read Efuse must check if we write section 1 data again!!! Sec1 */
141554c0a3aSHans de Goede /*					write addr must be after sec5. */
142554c0a3aSHans de Goede /*  */
143554c0a3aSHans de Goede 
144554c0a3aSHans de Goede void
145554c0a3aSHans de Goede efuse_ReadEFuse(
146554c0a3aSHans de Goede 	struct adapter *Adapter,
147554c0a3aSHans de Goede 	u8 efuseType,
148554c0a3aSHans de Goede 	u16		_offset,
149554c0a3aSHans de Goede 	u16		_size_byte,
150554c0a3aSHans de Goede 	u8 *pbuf,
151554c0a3aSHans de Goede bool	bPseudoTest
152554c0a3aSHans de Goede 	);
153554c0a3aSHans de Goede void
efuse_ReadEFuse(struct adapter * Adapter,u8 efuseType,u16 _offset,u16 _size_byte,u8 * pbuf,bool bPseudoTest)154554c0a3aSHans de Goede efuse_ReadEFuse(
155554c0a3aSHans de Goede 	struct adapter *Adapter,
156554c0a3aSHans de Goede 	u8 efuseType,
157554c0a3aSHans de Goede 	u16		_offset,
158554c0a3aSHans de Goede 	u16		_size_byte,
159554c0a3aSHans de Goede 	u8 *pbuf,
160554c0a3aSHans de Goede bool	bPseudoTest
161554c0a3aSHans de Goede 	)
162554c0a3aSHans de Goede {
163554c0a3aSHans de Goede 	Adapter->HalFunc.ReadEFuse(Adapter, efuseType, _offset, _size_byte, pbuf, bPseudoTest);
164554c0a3aSHans de Goede }
165554c0a3aSHans de Goede 
166554c0a3aSHans de Goede void
EFUSE_GetEfuseDefinition(struct adapter * padapter,u8 efuseType,u8 type,void * pOut,bool bPseudoTest)167554c0a3aSHans de Goede EFUSE_GetEfuseDefinition(
168554c0a3aSHans de Goede 	struct adapter *padapter,
169554c0a3aSHans de Goede 	u8 efuseType,
170554c0a3aSHans de Goede 	u8 type,
171554c0a3aSHans de Goede 	void	*pOut,
172554c0a3aSHans de Goede 	bool		bPseudoTest
173554c0a3aSHans de Goede 	)
174554c0a3aSHans de Goede {
175554c0a3aSHans de Goede 	padapter->HalFunc.EFUSEGetEfuseDefinition(padapter, efuseType, type, pOut, bPseudoTest);
176554c0a3aSHans de Goede }
177554c0a3aSHans de Goede 
178554c0a3aSHans de Goede /*-----------------------------------------------------------------------------
179554c0a3aSHans de Goede  * Function:	EFUSE_Read1Byte
180554c0a3aSHans de Goede  *
181554c0a3aSHans de Goede  * Overview:	Copy from WMAC fot EFUSE read 1 byte.
182554c0a3aSHans de Goede  *
183554c0a3aSHans de Goede  * Input:       NONE
184554c0a3aSHans de Goede  *
185554c0a3aSHans de Goede  * Output:      NONE
186554c0a3aSHans de Goede  *
187554c0a3aSHans de Goede  * Return:      NONE
188554c0a3aSHans de Goede  *
189554c0a3aSHans de Goede  * Revised History:
190554c0a3aSHans de Goede  * When			Who		Remark
191554c0a3aSHans de Goede  * 09/23/2008	MHC		Copy from WMAC.
192554c0a3aSHans de Goede  *
193554c0a3aSHans de Goede  *---------------------------------------------------------------------------*/
194554c0a3aSHans de Goede u8
EFUSE_Read1Byte(struct adapter * Adapter,u16 Address)195554c0a3aSHans de Goede EFUSE_Read1Byte(
196554c0a3aSHans de Goede struct adapter *Adapter,
197554c0a3aSHans de Goede u16		Address)
198554c0a3aSHans de Goede {
199554c0a3aSHans de Goede 	u8 Bytetemp = {0x00};
200554c0a3aSHans de Goede 	u8 temp = {0x00};
201554c0a3aSHans de Goede 	u32 k = 0;
202554c0a3aSHans de Goede 	u16 contentLen = 0;
203554c0a3aSHans de Goede 
204554c0a3aSHans de Goede 	EFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI, TYPE_EFUSE_REAL_CONTENT_LEN, (void *)&contentLen, false);
205554c0a3aSHans de Goede 
206554c0a3aSHans de Goede 	if (Address < contentLen) {/* E-fuse 512Byte */
207554c0a3aSHans de Goede 		/* Write E-fuse Register address bit0~7 */
208554c0a3aSHans de Goede 		temp = Address & 0xFF;
209554c0a3aSHans de Goede 		rtw_write8(Adapter, EFUSE_CTRL+1, temp);
210554c0a3aSHans de Goede 		Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+2);
211554c0a3aSHans de Goede 		/* Write E-fuse Register address bit8~9 */
212554c0a3aSHans de Goede 		temp = ((Address >> 8) & 0x03) | (Bytetemp & 0xFC);
213554c0a3aSHans de Goede 		rtw_write8(Adapter, EFUSE_CTRL+2, temp);
214554c0a3aSHans de Goede 
215554c0a3aSHans de Goede 		/* Write 0x30[31]= 0 */
216554c0a3aSHans de Goede 		Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3);
217554c0a3aSHans de Goede 		temp = Bytetemp & 0x7F;
218554c0a3aSHans de Goede 		rtw_write8(Adapter, EFUSE_CTRL+3, temp);
219554c0a3aSHans de Goede 
220554c0a3aSHans de Goede 		/* Wait Write-ready (0x30[31]= 1) */
221554c0a3aSHans de Goede 		Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3);
222554c0a3aSHans de Goede 		while (!(Bytetemp & 0x80)) {
223554c0a3aSHans de Goede 			Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3);
224554c0a3aSHans de Goede 			k++;
225999d544cSColin Ian King 			if (k == 1000)
226554c0a3aSHans de Goede 				break;
227554c0a3aSHans de Goede 		}
2287997c367SPayal Kshirsagar 		return rtw_read8(Adapter, EFUSE_CTRL);
229554c0a3aSHans de Goede 	} else
230554c0a3aSHans de Goede 		return 0xFF;
231554c0a3aSHans de Goede 
232554c0a3aSHans de Goede } /* EFUSE_Read1Byte */
233554c0a3aSHans de Goede 
234554c0a3aSHans de Goede /*  11/16/2008 MH Read one byte from real Efuse. */
235554c0a3aSHans de Goede u8
efuse_OneByteRead(struct adapter * padapter,u16 addr,u8 * data,bool bPseudoTest)236554c0a3aSHans de Goede efuse_OneByteRead(
237554c0a3aSHans de Goede struct adapter *padapter,
238554c0a3aSHans de Goede u16	addr,
239554c0a3aSHans de Goede u8	*data,
240554c0a3aSHans de Goede bool		bPseudoTest)
241554c0a3aSHans de Goede {
242554c0a3aSHans de Goede 	u32 tmpidx = 0;
243554c0a3aSHans de Goede 	u8 bResult;
244554c0a3aSHans de Goede 	u8 readbyte;
245554c0a3aSHans de Goede 
2466cbb3aa0SShreyas Krishnakumar 	if (bPseudoTest)
247ed8f72e5SSaurav Girepunje 		return Efuse_Read1ByteFromFakeContent(addr, data);
248554c0a3aSHans de Goede 
249554c0a3aSHans de Goede 	/*  <20130121, Kordan> For SMIC EFUSE specificatoin. */
250554c0a3aSHans de Goede 	/* 0x34[11]: SW force PGMEN input of efuse to high. (for the bank selected by 0x34[9:8]) */
251554c0a3aSHans de Goede 	/* PHY_SetMacReg(padapter, 0x34, BIT11, 0); */
252554c0a3aSHans de Goede 	rtw_write16(padapter, 0x34, rtw_read16(padapter, 0x34) & (~BIT11));
253554c0a3aSHans de Goede 
254554c0a3aSHans de Goede 	/*  -----------------e-fuse reg ctrl --------------------------------- */
255554c0a3aSHans de Goede 	/* address */
256554c0a3aSHans de Goede 	rtw_write8(padapter, EFUSE_CTRL+1, (u8)(addr&0xff));
257554c0a3aSHans de Goede 	rtw_write8(padapter, EFUSE_CTRL+2, ((u8)((addr>>8) & 0x03)) |
258554c0a3aSHans de Goede 	(rtw_read8(padapter, EFUSE_CTRL+2)&0xFC));
259554c0a3aSHans de Goede 
260554c0a3aSHans de Goede 	/* rtw_write8(padapter, EFUSE_CTRL+3,  0x72); read cmd */
261554c0a3aSHans de Goede 	/* Write bit 32 0 */
262554c0a3aSHans de Goede 	readbyte = rtw_read8(padapter, EFUSE_CTRL+3);
263554c0a3aSHans de Goede 	rtw_write8(padapter, EFUSE_CTRL+3, (readbyte & 0x7f));
264554c0a3aSHans de Goede 
265554c0a3aSHans de Goede 	while (!(0x80 & rtw_read8(padapter, EFUSE_CTRL+3)) && (tmpidx < 1000)) {
266554c0a3aSHans de Goede 		mdelay(1);
267554c0a3aSHans de Goede 		tmpidx++;
268554c0a3aSHans de Goede 	}
269554c0a3aSHans de Goede 	if (tmpidx < 100) {
270554c0a3aSHans de Goede 		*data = rtw_read8(padapter, EFUSE_CTRL);
271554c0a3aSHans de Goede 		bResult = true;
272554c0a3aSHans de Goede 	} else {
273554c0a3aSHans de Goede 		*data = 0xff;
274554c0a3aSHans de Goede 		bResult = false;
275554c0a3aSHans de Goede 	}
276554c0a3aSHans de Goede 
277554c0a3aSHans de Goede 	return bResult;
278554c0a3aSHans de Goede }
279554c0a3aSHans de Goede 
280554c0a3aSHans de Goede /*  11/16/2008 MH Write one byte to reald Efuse. */
efuse_OneByteWrite(struct adapter * padapter,u16 addr,u8 data,bool bPseudoTest)2815641eeecSRoss Schmidt u8 efuse_OneByteWrite(struct adapter *padapter, u16 addr, u8 data, bool bPseudoTest)
282554c0a3aSHans de Goede {
283554c0a3aSHans de Goede 	u8 tmpidx = 0;
284554c0a3aSHans de Goede 	u8 bResult = false;
285*0fd4d8b7SColin Ian King 	u32 efuseValue;
286554c0a3aSHans de Goede 
2876cbb3aa0SShreyas Krishnakumar 	if (bPseudoTest)
288f3f23022SSaurav Girepunje 		return Efuse_Write1ByteToFakeContent(addr, data);
289554c0a3aSHans de Goede 
290554c0a3aSHans de Goede 
291554c0a3aSHans de Goede 	/*  -----------------e-fuse reg ctrl --------------------------------- */
292554c0a3aSHans de Goede 	/* address */
293554c0a3aSHans de Goede 
294554c0a3aSHans de Goede 
295554c0a3aSHans de Goede 	efuseValue = rtw_read32(padapter, EFUSE_CTRL);
296554c0a3aSHans de Goede 	efuseValue |= (BIT21|BIT31);
297554c0a3aSHans de Goede 	efuseValue &= ~(0x3FFFF);
298554c0a3aSHans de Goede 	efuseValue |= ((addr<<8 | data) & 0x3FFFF);
299554c0a3aSHans de Goede 
300554c0a3aSHans de Goede 
301554c0a3aSHans de Goede 	/*  <20130227, Kordan> 8192E MP chip A-cut had better not set 0x34[11] until B-Cut. */
302554c0a3aSHans de Goede 
303554c0a3aSHans de Goede 	/*  <20130121, Kordan> For SMIC EFUSE specificatoin. */
304554c0a3aSHans de Goede 	/* 0x34[11]: SW force PGMEN input of efuse to high. (for the bank selected by 0x34[9:8]) */
305554c0a3aSHans de Goede 	/* PHY_SetMacReg(padapter, 0x34, BIT11, 1); */
306554c0a3aSHans de Goede 	rtw_write16(padapter, 0x34, rtw_read16(padapter, 0x34) | (BIT11));
307554c0a3aSHans de Goede 	rtw_write32(padapter, EFUSE_CTRL, 0x90600000|((addr<<8 | data)));
308554c0a3aSHans de Goede 
309554c0a3aSHans de Goede 	while ((0x80 &  rtw_read8(padapter, EFUSE_CTRL+3)) && (tmpidx < 100)) {
310554c0a3aSHans de Goede 		mdelay(1);
311554c0a3aSHans de Goede 		tmpidx++;
312554c0a3aSHans de Goede 	}
313554c0a3aSHans de Goede 
3146cbb3aa0SShreyas Krishnakumar 	if (tmpidx < 100)
315554c0a3aSHans de Goede 		bResult = true;
3166cbb3aa0SShreyas Krishnakumar 	else
317554c0a3aSHans de Goede 		bResult = false;
318554c0a3aSHans de Goede 
319554c0a3aSHans de Goede 	/*  disable Efuse program enable */
320554c0a3aSHans de Goede 	PHY_SetMacReg(padapter, EFUSE_TEST, BIT(11), 0);
321554c0a3aSHans de Goede 
322554c0a3aSHans de Goede 	return bResult;
323554c0a3aSHans de Goede }
324554c0a3aSHans de Goede 
325554c0a3aSHans de Goede int
Efuse_PgPacketRead(struct adapter * padapter,u8 offset,u8 * data,bool bPseudoTest)326554c0a3aSHans de Goede Efuse_PgPacketRead(struct adapter *padapter,
327554c0a3aSHans de Goede 				u8	offset,
328554c0a3aSHans de Goede 				u8	*data,
329554c0a3aSHans de Goede 				bool		bPseudoTest)
330554c0a3aSHans de Goede {
3317997c367SPayal Kshirsagar 	return padapter->HalFunc.Efuse_PgPacketRead(padapter, offset, data,
3327997c367SPayal Kshirsagar 						    bPseudoTest);
333554c0a3aSHans de Goede }
334554c0a3aSHans de Goede 
335554c0a3aSHans de Goede int
Efuse_PgPacketWrite(struct adapter * padapter,u8 offset,u8 word_en,u8 * data,bool bPseudoTest)336554c0a3aSHans de Goede Efuse_PgPacketWrite(struct adapter *padapter,
337554c0a3aSHans de Goede 				u8	offset,
338554c0a3aSHans de Goede 				u8	word_en,
339554c0a3aSHans de Goede 				u8	*data,
340554c0a3aSHans de Goede 				bool		bPseudoTest)
341554c0a3aSHans de Goede {
3427997c367SPayal Kshirsagar 	return padapter->HalFunc.Efuse_PgPacketWrite(padapter, offset, word_en,
3437997c367SPayal Kshirsagar 						     data, bPseudoTest);
344554c0a3aSHans de Goede }
345554c0a3aSHans de Goede 
346554c0a3aSHans de Goede /*-----------------------------------------------------------------------------
347554c0a3aSHans de Goede  * Function:	efuse_WordEnableDataRead
348554c0a3aSHans de Goede  *
349554c0a3aSHans de Goede  * Overview:	Read allowed word in current efuse section data.
350554c0a3aSHans de Goede  *
351554c0a3aSHans de Goede  * Input:       NONE
352554c0a3aSHans de Goede  *
353554c0a3aSHans de Goede  * Output:      NONE
354554c0a3aSHans de Goede  *
355554c0a3aSHans de Goede  * Return:      NONE
356554c0a3aSHans de Goede  *
357554c0a3aSHans de Goede  * Revised History:
358554c0a3aSHans de Goede  * When			Who		Remark
359554c0a3aSHans de Goede  * 11/16/2008	MHC		Create Version 0.
360554c0a3aSHans de Goede  * 11/21/2008	MHC		Fix Write bug when we only enable late word.
361554c0a3aSHans de Goede  *
362554c0a3aSHans de Goede  *---------------------------------------------------------------------------*/
363554c0a3aSHans de Goede void
efuse_WordEnableDataRead(u8 word_en,u8 * sourdata,u8 * targetdata)364554c0a3aSHans de Goede efuse_WordEnableDataRead(u8 word_en,
365554c0a3aSHans de Goede 						u8 *sourdata,
366554c0a3aSHans de Goede 						u8 *targetdata)
367554c0a3aSHans de Goede {
368554c0a3aSHans de Goede 	if (!(word_en&BIT(0))) {
369554c0a3aSHans de Goede 		targetdata[0] = sourdata[0];
370554c0a3aSHans de Goede 		targetdata[1] = sourdata[1];
371554c0a3aSHans de Goede 	}
372554c0a3aSHans de Goede 	if (!(word_en&BIT(1))) {
373554c0a3aSHans de Goede 		targetdata[2] = sourdata[2];
374554c0a3aSHans de Goede 		targetdata[3] = sourdata[3];
375554c0a3aSHans de Goede 	}
376554c0a3aSHans de Goede 	if (!(word_en&BIT(2))) {
377554c0a3aSHans de Goede 		targetdata[4] = sourdata[4];
378554c0a3aSHans de Goede 		targetdata[5] = sourdata[5];
379554c0a3aSHans de Goede 	}
380554c0a3aSHans de Goede 	if (!(word_en&BIT(3))) {
381554c0a3aSHans de Goede 		targetdata[6] = sourdata[6];
382554c0a3aSHans de Goede 		targetdata[7] = sourdata[7];
383554c0a3aSHans de Goede 	}
384554c0a3aSHans de Goede }
385554c0a3aSHans de Goede 
386554c0a3aSHans de Goede 
387554c0a3aSHans de Goede u8
Efuse_WordEnableDataWrite(struct adapter * padapter,u16 efuse_addr,u8 word_en,u8 * data,bool bPseudoTest)388554c0a3aSHans de Goede Efuse_WordEnableDataWrite(struct adapter *padapter,
389554c0a3aSHans de Goede 						u16		efuse_addr,
390554c0a3aSHans de Goede 						u8 word_en,
391554c0a3aSHans de Goede 						u8 *data,
392554c0a3aSHans de Goede 						bool		bPseudoTest)
393554c0a3aSHans de Goede {
3947997c367SPayal Kshirsagar 	return padapter->HalFunc.Efuse_WordEnableDataWrite(padapter, efuse_addr,
3957997c367SPayal Kshirsagar 							   word_en, data,
3967997c367SPayal Kshirsagar 							   bPseudoTest);
397554c0a3aSHans de Goede }
398554c0a3aSHans de Goede 
399554c0a3aSHans de Goede /*-----------------------------------------------------------------------------
400554c0a3aSHans de Goede  * Function:	Efuse_ReadAllMap
401554c0a3aSHans de Goede  *
402554c0a3aSHans de Goede  * Overview:	Read All Efuse content
403554c0a3aSHans de Goede  *
404554c0a3aSHans de Goede  * Input:       NONE
405554c0a3aSHans de Goede  *
406554c0a3aSHans de Goede  * Output:      NONE
407554c0a3aSHans de Goede  *
408554c0a3aSHans de Goede  * Return:      NONE
409554c0a3aSHans de Goede  *
410554c0a3aSHans de Goede  * Revised History:
411554c0a3aSHans de Goede  * When			Who		Remark
412554c0a3aSHans de Goede  * 11/11/2008	MHC		Create Version 0.
413554c0a3aSHans de Goede  *
414554c0a3aSHans de Goede  *---------------------------------------------------------------------------*/
415554c0a3aSHans de Goede void
416554c0a3aSHans de Goede Efuse_ReadAllMap(
417554c0a3aSHans de Goede 	struct adapter *padapter,
418554c0a3aSHans de Goede 	u8 efuseType,
419554c0a3aSHans de Goede 	u8 *Efuse,
420554c0a3aSHans de Goede 	bool		bPseudoTest);
Efuse_ReadAllMap(struct adapter * padapter,u8 efuseType,u8 * Efuse,bool bPseudoTest)4215641eeecSRoss Schmidt void Efuse_ReadAllMap(struct adapter *padapter, u8 efuseType, u8 *Efuse, bool bPseudoTest)
422554c0a3aSHans de Goede {
423554c0a3aSHans de Goede 	u16 mapLen = 0;
424554c0a3aSHans de Goede 
425554c0a3aSHans de Goede 	Efuse_PowerSwitch(padapter, false, true);
426554c0a3aSHans de Goede 
427554c0a3aSHans de Goede 	EFUSE_GetEfuseDefinition(padapter, efuseType, TYPE_EFUSE_MAP_LEN, (void *)&mapLen, bPseudoTest);
428554c0a3aSHans de Goede 
429554c0a3aSHans de Goede 	efuse_ReadEFuse(padapter, efuseType, 0, mapLen, Efuse, bPseudoTest);
430554c0a3aSHans de Goede 
431554c0a3aSHans de Goede 	Efuse_PowerSwitch(padapter, false, false);
432554c0a3aSHans de Goede }
433554c0a3aSHans de Goede 
434554c0a3aSHans de Goede /*-----------------------------------------------------------------------------
435554c0a3aSHans de Goede  * Function:	efuse_ShadowRead1Byte
436554c0a3aSHans de Goede  *		efuse_ShadowRead2Byte
437554c0a3aSHans de Goede  *		efuse_ShadowRead4Byte
438554c0a3aSHans de Goede  *
439554c0a3aSHans de Goede  * Overview:	Read from efuse init map by one/two/four bytes !!!!!
440554c0a3aSHans de Goede  *
441554c0a3aSHans de Goede  * Input:       NONE
442554c0a3aSHans de Goede  *
443554c0a3aSHans de Goede  * Output:      NONE
444554c0a3aSHans de Goede  *
445554c0a3aSHans de Goede  * Return:      NONE
446554c0a3aSHans de Goede  *
447554c0a3aSHans de Goede  * Revised History:
448554c0a3aSHans de Goede  * When			Who		Remark
449554c0a3aSHans de Goede  * 11/12/2008	MHC		Create Version 0.
450554c0a3aSHans de Goede  *
451554c0a3aSHans de Goede  *---------------------------------------------------------------------------*/
efuse_ShadowRead1Byte(struct adapter * padapter,u16 Offset,u8 * Value)4525641eeecSRoss Schmidt static void efuse_ShadowRead1Byte(struct adapter *padapter, u16 Offset, u8 *Value)
453554c0a3aSHans de Goede {
454554c0a3aSHans de Goede 	struct eeprom_priv *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);
455554c0a3aSHans de Goede 
456554c0a3aSHans de Goede 	*Value = pEEPROM->efuse_eeprom_data[Offset];
457554c0a3aSHans de Goede 
458554c0a3aSHans de Goede }	/*  EFUSE_ShadowRead1Byte */
459554c0a3aSHans de Goede 
460554c0a3aSHans de Goede /* Read Two Bytes */
efuse_ShadowRead2Byte(struct adapter * padapter,u16 Offset,u16 * Value)4615641eeecSRoss Schmidt static void efuse_ShadowRead2Byte(struct adapter *padapter, u16 Offset, u16 *Value)
462554c0a3aSHans de Goede {
463554c0a3aSHans de Goede 	struct eeprom_priv *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);
464554c0a3aSHans de Goede 
465554c0a3aSHans de Goede 	*Value = pEEPROM->efuse_eeprom_data[Offset];
466554c0a3aSHans de Goede 	*Value |= pEEPROM->efuse_eeprom_data[Offset+1]<<8;
467554c0a3aSHans de Goede 
468554c0a3aSHans de Goede }	/*  EFUSE_ShadowRead2Byte */
469554c0a3aSHans de Goede 
470554c0a3aSHans de Goede /* Read Four Bytes */
efuse_ShadowRead4Byte(struct adapter * padapter,u16 Offset,u32 * Value)4715641eeecSRoss Schmidt static void efuse_ShadowRead4Byte(struct adapter *padapter, u16 Offset, u32 *Value)
472554c0a3aSHans de Goede {
473554c0a3aSHans de Goede 	struct eeprom_priv *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);
474554c0a3aSHans de Goede 
475554c0a3aSHans de Goede 	*Value = pEEPROM->efuse_eeprom_data[Offset];
476554c0a3aSHans de Goede 	*Value |= pEEPROM->efuse_eeprom_data[Offset+1]<<8;
477554c0a3aSHans de Goede 	*Value |= pEEPROM->efuse_eeprom_data[Offset+2]<<16;
478554c0a3aSHans de Goede 	*Value |= pEEPROM->efuse_eeprom_data[Offset+3]<<24;
479554c0a3aSHans de Goede 
480554c0a3aSHans de Goede }	/*  efuse_ShadowRead4Byte */
481554c0a3aSHans de Goede 
482554c0a3aSHans de Goede /*-----------------------------------------------------------------------------
483554c0a3aSHans de Goede  * Function:	EFUSE_ShadowMapUpdate
484554c0a3aSHans de Goede  *
485554c0a3aSHans de Goede  * Overview:	Transfer current EFUSE content to shadow init and modify map.
486554c0a3aSHans de Goede  *
487554c0a3aSHans de Goede  * Input:       NONE
488554c0a3aSHans de Goede  *
489554c0a3aSHans de Goede  * Output:      NONE
490554c0a3aSHans de Goede  *
491554c0a3aSHans de Goede  * Return:      NONE
492554c0a3aSHans de Goede  *
493554c0a3aSHans de Goede  * Revised History:
494554c0a3aSHans de Goede  * When			Who		Remark
495554c0a3aSHans de Goede  * 11/13/2008	MHC		Create Version 0.
496554c0a3aSHans de Goede  *
497554c0a3aSHans de Goede  *---------------------------------------------------------------------------*/
EFUSE_ShadowMapUpdate(struct adapter * padapter,u8 efuseType,bool bPseudoTest)4985641eeecSRoss Schmidt void EFUSE_ShadowMapUpdate(struct adapter *padapter, u8 efuseType, bool bPseudoTest)
499554c0a3aSHans de Goede {
500554c0a3aSHans de Goede 	struct eeprom_priv *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);
501554c0a3aSHans de Goede 	u16 mapLen = 0;
502554c0a3aSHans de Goede 
503554c0a3aSHans de Goede 	EFUSE_GetEfuseDefinition(padapter, efuseType, TYPE_EFUSE_MAP_LEN, (void *)&mapLen, bPseudoTest);
504554c0a3aSHans de Goede 
505d2ab9916SMichael Straube 	if (pEEPROM->bautoload_fail_flag)
506554c0a3aSHans de Goede 		memset(pEEPROM->efuse_eeprom_data, 0xFF, mapLen);
507d2ab9916SMichael Straube 	else
508554c0a3aSHans de Goede 		Efuse_ReadAllMap(padapter, efuseType, pEEPROM->efuse_eeprom_data, bPseudoTest);
509554c0a3aSHans de Goede 
510554c0a3aSHans de Goede 	/* PlatformMoveMemory((void *)&pHalData->EfuseMap[EFUSE_MODIFY_MAP][0], */
511554c0a3aSHans de Goede 	/* void *)&pHalData->EfuseMap[EFUSE_INIT_MAP][0], mapLen); */
512554c0a3aSHans de Goede } /*  EFUSE_ShadowMapUpdate */
513554c0a3aSHans de Goede 
514554c0a3aSHans de Goede 
515554c0a3aSHans de Goede /*-----------------------------------------------------------------------------
516554c0a3aSHans de Goede  * Function:	EFUSE_ShadowRead
517554c0a3aSHans de Goede  *
518554c0a3aSHans de Goede  * Overview:	Read from efuse init map !!!!!
519554c0a3aSHans de Goede  *
520554c0a3aSHans de Goede  * Input:       NONE
521554c0a3aSHans de Goede  *
522554c0a3aSHans de Goede  * Output:      NONE
523554c0a3aSHans de Goede  *
524554c0a3aSHans de Goede  * Return:      NONE
525554c0a3aSHans de Goede  *
526554c0a3aSHans de Goede  * Revised History:
527554c0a3aSHans de Goede  * When			Who		Remark
528554c0a3aSHans de Goede  * 11/12/2008	MHC		Create Version 0.
529554c0a3aSHans de Goede  *
530554c0a3aSHans de Goede  *---------------------------------------------------------------------------*/
EFUSE_ShadowRead(struct adapter * padapter,u8 Type,u16 Offset,u32 * Value)5315641eeecSRoss Schmidt void EFUSE_ShadowRead(struct adapter *padapter, u8 Type, u16 Offset, u32 *Value)
532554c0a3aSHans de Goede {
533554c0a3aSHans de Goede 	if (Type == 1)
534554c0a3aSHans de Goede 		efuse_ShadowRead1Byte(padapter, Offset, (u8 *)Value);
535554c0a3aSHans de Goede 	else if (Type == 2)
536554c0a3aSHans de Goede 		efuse_ShadowRead2Byte(padapter, Offset, (u16 *)Value);
537554c0a3aSHans de Goede 	else if (Type == 4)
538554c0a3aSHans de Goede 		efuse_ShadowRead4Byte(padapter, Offset, (u32 *)Value);
539554c0a3aSHans de Goede 
540554c0a3aSHans de Goede }	/* EFUSE_ShadowRead*/
541