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
34*ed8f72e5SSaurav 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
46554c0a3aSHans de Goede Efuse_Write1ByteToFakeContent(
47554c0a3aSHans de Goede 	struct adapter *padapter,
48554c0a3aSHans de Goede 	u16 	Offset,
49554c0a3aSHans de Goede 	u8 Value)
50554c0a3aSHans de Goede {
5145d9d3c9SSimran Singhal 	if (Offset >= EFUSE_MAX_HW_SIZE)
52554c0a3aSHans de Goede 		return false;
53554c0a3aSHans de Goede 	if (fakeEfuseBank == 0)
54554c0a3aSHans de Goede 		fakeEfuseContent[Offset] = Value;
5545d9d3c9SSimran Singhal 	else
56554c0a3aSHans de Goede 		fakeBTEfuseContent[fakeEfuseBank-1][Offset] = Value;
57554c0a3aSHans de Goede 	return true;
58554c0a3aSHans de Goede }
59554c0a3aSHans de Goede 
60554c0a3aSHans de Goede /*-----------------------------------------------------------------------------
61554c0a3aSHans de Goede  * Function:	Efuse_PowerSwitch
62554c0a3aSHans de Goede  *
63554c0a3aSHans de Goede  * Overview:	When we want to enable write operation, we should change to
64554c0a3aSHans de Goede  *			pwr on state. When we stop write, we should switch to 500k mode
65554c0a3aSHans de Goede  *			and disable LDO 2.5V.
66554c0a3aSHans de Goede  *
67554c0a3aSHans de Goede  * Input:       NONE
68554c0a3aSHans de Goede  *
69554c0a3aSHans de Goede  * Output:      NONE
70554c0a3aSHans de Goede  *
71554c0a3aSHans de Goede  * Return:      NONE
72554c0a3aSHans de Goede  *
73554c0a3aSHans de Goede  * Revised History:
74554c0a3aSHans de Goede  * When			Who		Remark
75554c0a3aSHans de Goede  * 11/17/2008	MHC		Create Version 0.
76554c0a3aSHans de Goede  *
77554c0a3aSHans de Goede  *---------------------------------------------------------------------------*/
78554c0a3aSHans de Goede void
79554c0a3aSHans de Goede Efuse_PowerSwitch(
80554c0a3aSHans de Goede struct adapter *padapter,
81554c0a3aSHans de Goede u8 bWrite,
82554c0a3aSHans de Goede u8 PwrState)
83554c0a3aSHans de Goede {
84554c0a3aSHans de Goede 	padapter->HalFunc.EfusePowerSwitch(padapter, bWrite, PwrState);
85554c0a3aSHans de Goede }
86554c0a3aSHans de Goede 
87554c0a3aSHans de Goede /*-----------------------------------------------------------------------------
88554c0a3aSHans de Goede  * Function:	Efuse_GetCurrentSize
89554c0a3aSHans de Goede  *
90554c0a3aSHans de Goede  * Overview:	Get current efuse size!!!
91554c0a3aSHans de Goede  *
92554c0a3aSHans de Goede  * Input:       NONE
93554c0a3aSHans de Goede  *
94554c0a3aSHans de Goede  * Output:      NONE
95554c0a3aSHans de Goede  *
96554c0a3aSHans de Goede  * Return:      NONE
97554c0a3aSHans de Goede  *
98554c0a3aSHans de Goede  * Revised History:
99554c0a3aSHans de Goede  * When			Who		Remark
100554c0a3aSHans de Goede  * 11/16/2008	MHC		Create Version 0.
101554c0a3aSHans de Goede  *
102554c0a3aSHans de Goede  *---------------------------------------------------------------------------*/
103554c0a3aSHans de Goede u16
104554c0a3aSHans de Goede Efuse_GetCurrentSize(
105554c0a3aSHans de Goede 	struct adapter *padapter,
106554c0a3aSHans de Goede 	u8 	efuseType,
107554c0a3aSHans de Goede 	bool		bPseudoTest)
108554c0a3aSHans de Goede {
1097997c367SPayal Kshirsagar 	return padapter->HalFunc.EfuseGetCurrentSize(padapter, efuseType,
1107997c367SPayal Kshirsagar 						     bPseudoTest);
111554c0a3aSHans de Goede }
112554c0a3aSHans de Goede 
113554c0a3aSHans de Goede /*  11/16/2008 MH Add description. Get current efuse area enabled word!!. */
114554c0a3aSHans de Goede u8
115554c0a3aSHans de Goede Efuse_CalculateWordCnts(u8 word_en)
116554c0a3aSHans de Goede {
117554c0a3aSHans de Goede 	u8 word_cnts = 0;
118554c0a3aSHans de Goede 	if (!(word_en & BIT(0)))
119554c0a3aSHans de Goede 		word_cnts++; /*  0 : write enable */
120554c0a3aSHans de Goede 	if (!(word_en & BIT(1)))
121554c0a3aSHans de Goede 		word_cnts++;
122554c0a3aSHans de Goede 	if (!(word_en & BIT(2)))
123554c0a3aSHans de Goede 		word_cnts++;
124554c0a3aSHans de Goede 	if (!(word_en & BIT(3)))
125554c0a3aSHans de Goede 		word_cnts++;
126554c0a3aSHans de Goede 	return word_cnts;
127554c0a3aSHans de Goede }
128554c0a3aSHans de Goede 
129554c0a3aSHans de Goede /*  */
130554c0a3aSHans de Goede /* 	Description: */
131554c0a3aSHans de Goede /* 		1. Execute E-Fuse read byte operation according as map offset and */
132554c0a3aSHans de Goede /* 		    save to E-Fuse table. */
133a4b99f3dSXaralampos Mainas /* 		2. Referred from SD1 Richard. */
134554c0a3aSHans de Goede /*  */
135554c0a3aSHans de Goede /* 	Assumption: */
136554c0a3aSHans de Goede /* 		1. Boot from E-Fuse and successfully auto-load. */
137554c0a3aSHans de Goede /* 		2. PASSIVE_LEVEL (USB interface) */
138554c0a3aSHans de Goede /*  */
139554c0a3aSHans de Goede /* 	Created by Roger, 2008.10.21. */
140554c0a3aSHans de Goede /*  */
141554c0a3aSHans de Goede /* 	2008/12/12 MH	1. Reorganize code flow and reserve bytes. and add description. */
142554c0a3aSHans de Goede /* 					2. Add efuse utilization collect. */
143554c0a3aSHans de Goede /* 	2008/12/22 MH	Read Efuse must check if we write section 1 data again!!! Sec1 */
144554c0a3aSHans de Goede /* 					write addr must be after sec5. */
145554c0a3aSHans de Goede /*  */
146554c0a3aSHans de Goede 
147554c0a3aSHans de Goede void
148554c0a3aSHans de Goede efuse_ReadEFuse(
149554c0a3aSHans de Goede 	struct adapter *Adapter,
150554c0a3aSHans de Goede 	u8 efuseType,
151554c0a3aSHans de Goede 	u16 	_offset,
152554c0a3aSHans de Goede 	u16 	_size_byte,
153554c0a3aSHans de Goede 	u8 *pbuf,
154554c0a3aSHans de Goede bool	bPseudoTest
155554c0a3aSHans de Goede 	);
156554c0a3aSHans de Goede void
157554c0a3aSHans de Goede efuse_ReadEFuse(
158554c0a3aSHans de Goede 	struct adapter *Adapter,
159554c0a3aSHans de Goede 	u8 efuseType,
160554c0a3aSHans de Goede 	u16 	_offset,
161554c0a3aSHans de Goede 	u16 	_size_byte,
162554c0a3aSHans de Goede 	u8 *pbuf,
163554c0a3aSHans de Goede bool	bPseudoTest
164554c0a3aSHans de Goede 	)
165554c0a3aSHans de Goede {
166554c0a3aSHans de Goede 	Adapter->HalFunc.ReadEFuse(Adapter, efuseType, _offset, _size_byte, pbuf, bPseudoTest);
167554c0a3aSHans de Goede }
168554c0a3aSHans de Goede 
169554c0a3aSHans de Goede void
170554c0a3aSHans de Goede EFUSE_GetEfuseDefinition(
171554c0a3aSHans de Goede 	struct adapter *padapter,
172554c0a3aSHans de Goede 	u8 efuseType,
173554c0a3aSHans de Goede 	u8 type,
174554c0a3aSHans de Goede 	void 	*pOut,
175554c0a3aSHans de Goede 	bool		bPseudoTest
176554c0a3aSHans de Goede 	)
177554c0a3aSHans de Goede {
178554c0a3aSHans de Goede 	padapter->HalFunc.EFUSEGetEfuseDefinition(padapter, efuseType, type, pOut, bPseudoTest);
179554c0a3aSHans de Goede }
180554c0a3aSHans de Goede 
181554c0a3aSHans de Goede /*-----------------------------------------------------------------------------
182554c0a3aSHans de Goede  * Function:	EFUSE_Read1Byte
183554c0a3aSHans de Goede  *
184554c0a3aSHans de Goede  * Overview:	Copy from WMAC fot EFUSE read 1 byte.
185554c0a3aSHans de Goede  *
186554c0a3aSHans de Goede  * Input:       NONE
187554c0a3aSHans de Goede  *
188554c0a3aSHans de Goede  * Output:      NONE
189554c0a3aSHans de Goede  *
190554c0a3aSHans de Goede  * Return:      NONE
191554c0a3aSHans de Goede  *
192554c0a3aSHans de Goede  * Revised History:
193554c0a3aSHans de Goede  * When			Who		Remark
194554c0a3aSHans de Goede  * 09/23/2008	MHC		Copy from WMAC.
195554c0a3aSHans de Goede  *
196554c0a3aSHans de Goede  *---------------------------------------------------------------------------*/
197554c0a3aSHans de Goede u8
198554c0a3aSHans de Goede EFUSE_Read1Byte(
199554c0a3aSHans de Goede struct adapter *Adapter,
200554c0a3aSHans de Goede u16 	Address)
201554c0a3aSHans de Goede {
202554c0a3aSHans de Goede 	u8 Bytetemp = {0x00};
203554c0a3aSHans de Goede 	u8 temp = {0x00};
204554c0a3aSHans de Goede 	u32 k = 0;
205554c0a3aSHans de Goede 	u16 contentLen = 0;
206554c0a3aSHans de Goede 
207554c0a3aSHans de Goede 	EFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI, TYPE_EFUSE_REAL_CONTENT_LEN, (void *)&contentLen, false);
208554c0a3aSHans de Goede 
209554c0a3aSHans de Goede 	if (Address < contentLen) {/* E-fuse 512Byte */
210554c0a3aSHans de Goede 		/* Write E-fuse Register address bit0~7 */
211554c0a3aSHans de Goede 		temp = Address & 0xFF;
212554c0a3aSHans de Goede 		rtw_write8(Adapter, EFUSE_CTRL+1, temp);
213554c0a3aSHans de Goede 		Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+2);
214554c0a3aSHans de Goede 		/* Write E-fuse Register address bit8~9 */
215554c0a3aSHans de Goede 		temp = ((Address >> 8) & 0x03) | (Bytetemp & 0xFC);
216554c0a3aSHans de Goede 		rtw_write8(Adapter, EFUSE_CTRL+2, temp);
217554c0a3aSHans de Goede 
218554c0a3aSHans de Goede 		/* Write 0x30[31]= 0 */
219554c0a3aSHans de Goede 		Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3);
220554c0a3aSHans de Goede 		temp = Bytetemp & 0x7F;
221554c0a3aSHans de Goede 		rtw_write8(Adapter, EFUSE_CTRL+3, temp);
222554c0a3aSHans de Goede 
223554c0a3aSHans de Goede 		/* Wait Write-ready (0x30[31]= 1) */
224554c0a3aSHans de Goede 		Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3);
225554c0a3aSHans de Goede 		while (!(Bytetemp & 0x80)) {
226554c0a3aSHans de Goede 			Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3);
227554c0a3aSHans de Goede 			k++;
228999d544cSColin Ian King 			if (k == 1000)
229554c0a3aSHans de Goede 				break;
230554c0a3aSHans de Goede 		}
2317997c367SPayal Kshirsagar 		return rtw_read8(Adapter, EFUSE_CTRL);
232554c0a3aSHans de Goede 	} else
233554c0a3aSHans de Goede 		return 0xFF;
234554c0a3aSHans de Goede 
235554c0a3aSHans de Goede } /* EFUSE_Read1Byte */
236554c0a3aSHans de Goede 
237554c0a3aSHans de Goede /*  11/16/2008 MH Read one byte from real Efuse. */
238554c0a3aSHans de Goede u8
239554c0a3aSHans de Goede efuse_OneByteRead(
240554c0a3aSHans de Goede struct adapter *padapter,
241554c0a3aSHans de Goede u16 		addr,
242554c0a3aSHans de Goede u8 	*data,
243554c0a3aSHans de Goede bool		bPseudoTest)
244554c0a3aSHans de Goede {
245554c0a3aSHans de Goede 	u32 tmpidx = 0;
246554c0a3aSHans de Goede 	u8 bResult;
247554c0a3aSHans de Goede 	u8 readbyte;
248554c0a3aSHans de Goede 
2496cbb3aa0SShreyas Krishnakumar 	if (bPseudoTest)
250*ed8f72e5SSaurav Girepunje 		return Efuse_Read1ByteFromFakeContent(addr, data);
251554c0a3aSHans de Goede 
252554c0a3aSHans de Goede 	/*  <20130121, Kordan> For SMIC EFUSE specificatoin. */
253554c0a3aSHans de Goede 	/* 0x34[11]: SW force PGMEN input of efuse to high. (for the bank selected by 0x34[9:8]) */
254554c0a3aSHans de Goede 	/* PHY_SetMacReg(padapter, 0x34, BIT11, 0); */
255554c0a3aSHans de Goede 	rtw_write16(padapter, 0x34, rtw_read16(padapter, 0x34) & (~BIT11));
256554c0a3aSHans de Goede 
257554c0a3aSHans de Goede 	/*  -----------------e-fuse reg ctrl --------------------------------- */
258554c0a3aSHans de Goede 	/* address */
259554c0a3aSHans de Goede 	rtw_write8(padapter, EFUSE_CTRL+1, (u8)(addr&0xff));
260554c0a3aSHans de Goede 	rtw_write8(padapter, EFUSE_CTRL+2, ((u8)((addr>>8) & 0x03)) |
261554c0a3aSHans de Goede 	(rtw_read8(padapter, EFUSE_CTRL+2)&0xFC));
262554c0a3aSHans de Goede 
263554c0a3aSHans de Goede 	/* rtw_write8(padapter, EFUSE_CTRL+3,  0x72); read cmd */
264554c0a3aSHans de Goede 	/* Write bit 32 0 */
265554c0a3aSHans de Goede 	readbyte = rtw_read8(padapter, EFUSE_CTRL+3);
266554c0a3aSHans de Goede 	rtw_write8(padapter, EFUSE_CTRL+3, (readbyte & 0x7f));
267554c0a3aSHans de Goede 
268554c0a3aSHans de Goede 	while (!(0x80 & rtw_read8(padapter, EFUSE_CTRL+3)) && (tmpidx < 1000)) {
269554c0a3aSHans de Goede 		mdelay(1);
270554c0a3aSHans de Goede 		tmpidx++;
271554c0a3aSHans de Goede 	}
272554c0a3aSHans de Goede 	if (tmpidx < 100) {
273554c0a3aSHans de Goede 		*data = rtw_read8(padapter, EFUSE_CTRL);
274554c0a3aSHans de Goede 		bResult = true;
275554c0a3aSHans de Goede 	} else {
276554c0a3aSHans de Goede 		*data = 0xff;
277554c0a3aSHans de Goede 		bResult = false;
278554c0a3aSHans de Goede 	}
279554c0a3aSHans de Goede 
280554c0a3aSHans de Goede 	return bResult;
281554c0a3aSHans de Goede }
282554c0a3aSHans de Goede 
283554c0a3aSHans de Goede /*  11/16/2008 MH Write one byte to reald Efuse. */
2845641eeecSRoss Schmidt u8 efuse_OneByteWrite(struct adapter *padapter, u16 addr, u8 data, bool bPseudoTest)
285554c0a3aSHans de Goede {
286554c0a3aSHans de Goede 	u8 tmpidx = 0;
287554c0a3aSHans de Goede 	u8 bResult = false;
288554c0a3aSHans de Goede 	u32 efuseValue = 0;
289554c0a3aSHans de Goede 
2906cbb3aa0SShreyas Krishnakumar 	if (bPseudoTest)
291f465b0a4SSimran Singhal 		return Efuse_Write1ByteToFakeContent(padapter, addr, data);
292554c0a3aSHans de Goede 
293554c0a3aSHans de Goede 
294554c0a3aSHans de Goede 	/*  -----------------e-fuse reg ctrl --------------------------------- */
295554c0a3aSHans de Goede 	/* address */
296554c0a3aSHans de Goede 
297554c0a3aSHans de Goede 
298554c0a3aSHans de Goede 	efuseValue = rtw_read32(padapter, EFUSE_CTRL);
299554c0a3aSHans de Goede 	efuseValue |= (BIT21|BIT31);
300554c0a3aSHans de Goede 	efuseValue &= ~(0x3FFFF);
301554c0a3aSHans de Goede 	efuseValue |= ((addr<<8 | data) & 0x3FFFF);
302554c0a3aSHans de Goede 
303554c0a3aSHans de Goede 
304554c0a3aSHans de Goede 	/*  <20130227, Kordan> 8192E MP chip A-cut had better not set 0x34[11] until B-Cut. */
305554c0a3aSHans de Goede 
306554c0a3aSHans de Goede 	/*  <20130121, Kordan> For SMIC EFUSE specificatoin. */
307554c0a3aSHans de Goede 	/* 0x34[11]: SW force PGMEN input of efuse to high. (for the bank selected by 0x34[9:8]) */
308554c0a3aSHans de Goede 	/* PHY_SetMacReg(padapter, 0x34, BIT11, 1); */
309554c0a3aSHans de Goede 	rtw_write16(padapter, 0x34, rtw_read16(padapter, 0x34) | (BIT11));
310554c0a3aSHans de Goede 	rtw_write32(padapter, EFUSE_CTRL, 0x90600000|((addr<<8 | data)));
311554c0a3aSHans de Goede 
312554c0a3aSHans de Goede 	while ((0x80 &  rtw_read8(padapter, EFUSE_CTRL+3)) && (tmpidx < 100)) {
313554c0a3aSHans de Goede 		mdelay(1);
314554c0a3aSHans de Goede 		tmpidx++;
315554c0a3aSHans de Goede 	}
316554c0a3aSHans de Goede 
3176cbb3aa0SShreyas Krishnakumar 	if (tmpidx < 100)
318554c0a3aSHans de Goede 		bResult = true;
3196cbb3aa0SShreyas Krishnakumar 	else
320554c0a3aSHans de Goede 		bResult = false;
321554c0a3aSHans de Goede 
322554c0a3aSHans de Goede 	/*  disable Efuse program enable */
323554c0a3aSHans de Goede 	PHY_SetMacReg(padapter, EFUSE_TEST, BIT(11), 0);
324554c0a3aSHans de Goede 
325554c0a3aSHans de Goede 	return bResult;
326554c0a3aSHans de Goede }
327554c0a3aSHans de Goede 
328554c0a3aSHans de Goede int
329554c0a3aSHans de Goede Efuse_PgPacketRead(struct adapter *padapter,
330554c0a3aSHans de Goede 				u8 	offset,
331554c0a3aSHans de Goede 				u8 	*data,
332554c0a3aSHans de Goede 				bool		bPseudoTest)
333554c0a3aSHans de Goede {
3347997c367SPayal Kshirsagar 	return padapter->HalFunc.Efuse_PgPacketRead(padapter, offset, data,
3357997c367SPayal Kshirsagar 						    bPseudoTest);
336554c0a3aSHans de Goede }
337554c0a3aSHans de Goede 
338554c0a3aSHans de Goede int
339554c0a3aSHans de Goede Efuse_PgPacketWrite(struct adapter *padapter,
340554c0a3aSHans de Goede 				u8 	offset,
341554c0a3aSHans de Goede 				u8 	word_en,
342554c0a3aSHans de Goede 				u8 	*data,
343554c0a3aSHans de Goede 				bool		bPseudoTest)
344554c0a3aSHans de Goede {
3457997c367SPayal Kshirsagar 	return padapter->HalFunc.Efuse_PgPacketWrite(padapter, offset, word_en,
3467997c367SPayal Kshirsagar 						     data, bPseudoTest);
347554c0a3aSHans de Goede }
348554c0a3aSHans de Goede 
349554c0a3aSHans de Goede /*-----------------------------------------------------------------------------
350554c0a3aSHans de Goede  * Function:	efuse_WordEnableDataRead
351554c0a3aSHans de Goede  *
352554c0a3aSHans de Goede  * Overview:	Read allowed word in current efuse section data.
353554c0a3aSHans de Goede  *
354554c0a3aSHans de Goede  * Input:       NONE
355554c0a3aSHans de Goede  *
356554c0a3aSHans de Goede  * Output:      NONE
357554c0a3aSHans de Goede  *
358554c0a3aSHans de Goede  * Return:      NONE
359554c0a3aSHans de Goede  *
360554c0a3aSHans de Goede  * Revised History:
361554c0a3aSHans de Goede  * When			Who		Remark
362554c0a3aSHans de Goede  * 11/16/2008	MHC		Create Version 0.
363554c0a3aSHans de Goede  * 11/21/2008	MHC		Fix Write bug when we only enable late word.
364554c0a3aSHans de Goede  *
365554c0a3aSHans de Goede  *---------------------------------------------------------------------------*/
366554c0a3aSHans de Goede void
367554c0a3aSHans de Goede efuse_WordEnableDataRead(u8 word_en,
368554c0a3aSHans de Goede 						u8 *sourdata,
369554c0a3aSHans de Goede 						u8 *targetdata)
370554c0a3aSHans de Goede {
371554c0a3aSHans de Goede 	if (!(word_en&BIT(0))) {
372554c0a3aSHans de Goede 		targetdata[0] = sourdata[0];
373554c0a3aSHans de Goede 		targetdata[1] = sourdata[1];
374554c0a3aSHans de Goede 	}
375554c0a3aSHans de Goede 	if (!(word_en&BIT(1))) {
376554c0a3aSHans de Goede 		targetdata[2] = sourdata[2];
377554c0a3aSHans de Goede 		targetdata[3] = sourdata[3];
378554c0a3aSHans de Goede 	}
379554c0a3aSHans de Goede 	if (!(word_en&BIT(2))) {
380554c0a3aSHans de Goede 		targetdata[4] = sourdata[4];
381554c0a3aSHans de Goede 		targetdata[5] = sourdata[5];
382554c0a3aSHans de Goede 	}
383554c0a3aSHans de Goede 	if (!(word_en&BIT(3))) {
384554c0a3aSHans de Goede 		targetdata[6] = sourdata[6];
385554c0a3aSHans de Goede 		targetdata[7] = sourdata[7];
386554c0a3aSHans de Goede 	}
387554c0a3aSHans de Goede }
388554c0a3aSHans de Goede 
389554c0a3aSHans de Goede 
390554c0a3aSHans de Goede u8
391554c0a3aSHans de Goede Efuse_WordEnableDataWrite(struct adapter *padapter,
392554c0a3aSHans de Goede 						u16 	efuse_addr,
393554c0a3aSHans de Goede 						u8 word_en,
394554c0a3aSHans de Goede 						u8 *data,
395554c0a3aSHans de Goede 						bool		bPseudoTest)
396554c0a3aSHans de Goede {
3977997c367SPayal Kshirsagar 	return padapter->HalFunc.Efuse_WordEnableDataWrite(padapter, efuse_addr,
3987997c367SPayal Kshirsagar 							   word_en, data,
3997997c367SPayal Kshirsagar 							   bPseudoTest);
400554c0a3aSHans de Goede }
401554c0a3aSHans de Goede 
402554c0a3aSHans de Goede /*-----------------------------------------------------------------------------
403554c0a3aSHans de Goede  * Function:	Efuse_ReadAllMap
404554c0a3aSHans de Goede  *
405554c0a3aSHans de Goede  * Overview:	Read All Efuse content
406554c0a3aSHans de Goede  *
407554c0a3aSHans de Goede  * Input:       NONE
408554c0a3aSHans de Goede  *
409554c0a3aSHans de Goede  * Output:      NONE
410554c0a3aSHans de Goede  *
411554c0a3aSHans de Goede  * Return:      NONE
412554c0a3aSHans de Goede  *
413554c0a3aSHans de Goede  * Revised History:
414554c0a3aSHans de Goede  * When			Who		Remark
415554c0a3aSHans de Goede  * 11/11/2008	MHC		Create Version 0.
416554c0a3aSHans de Goede  *
417554c0a3aSHans de Goede  *---------------------------------------------------------------------------*/
418554c0a3aSHans de Goede void
419554c0a3aSHans de Goede Efuse_ReadAllMap(
420554c0a3aSHans de Goede 	struct adapter *padapter,
421554c0a3aSHans de Goede 	u8 efuseType,
422554c0a3aSHans de Goede 	u8 *Efuse,
423554c0a3aSHans de Goede 	bool		bPseudoTest);
4245641eeecSRoss Schmidt void Efuse_ReadAllMap(struct adapter *padapter, u8 efuseType, u8 *Efuse, bool bPseudoTest)
425554c0a3aSHans de Goede {
426554c0a3aSHans de Goede 	u16 mapLen = 0;
427554c0a3aSHans de Goede 
428554c0a3aSHans de Goede 	Efuse_PowerSwitch(padapter, false, true);
429554c0a3aSHans de Goede 
430554c0a3aSHans de Goede 	EFUSE_GetEfuseDefinition(padapter, efuseType, TYPE_EFUSE_MAP_LEN, (void *)&mapLen, bPseudoTest);
431554c0a3aSHans de Goede 
432554c0a3aSHans de Goede 	efuse_ReadEFuse(padapter, efuseType, 0, mapLen, Efuse, bPseudoTest);
433554c0a3aSHans de Goede 
434554c0a3aSHans de Goede 	Efuse_PowerSwitch(padapter, false, false);
435554c0a3aSHans de Goede }
436554c0a3aSHans de Goede 
437554c0a3aSHans de Goede /*-----------------------------------------------------------------------------
438554c0a3aSHans de Goede  * Function:	efuse_ShadowRead1Byte
439554c0a3aSHans de Goede  *		efuse_ShadowRead2Byte
440554c0a3aSHans de Goede  *		efuse_ShadowRead4Byte
441554c0a3aSHans de Goede  *
442554c0a3aSHans de Goede  * Overview:	Read from efuse init map by one/two/four bytes !!!!!
443554c0a3aSHans de Goede  *
444554c0a3aSHans de Goede  * Input:       NONE
445554c0a3aSHans de Goede  *
446554c0a3aSHans de Goede  * Output:      NONE
447554c0a3aSHans de Goede  *
448554c0a3aSHans de Goede  * Return:      NONE
449554c0a3aSHans de Goede  *
450554c0a3aSHans de Goede  * Revised History:
451554c0a3aSHans de Goede  * When			Who		Remark
452554c0a3aSHans de Goede  * 11/12/2008	MHC		Create Version 0.
453554c0a3aSHans de Goede  *
454554c0a3aSHans de Goede  *---------------------------------------------------------------------------*/
4555641eeecSRoss Schmidt static void efuse_ShadowRead1Byte(struct adapter *padapter, u16 Offset, u8 *Value)
456554c0a3aSHans de Goede {
457554c0a3aSHans de Goede 	struct eeprom_priv *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);
458554c0a3aSHans de Goede 
459554c0a3aSHans de Goede 	*Value = pEEPROM->efuse_eeprom_data[Offset];
460554c0a3aSHans de Goede 
461554c0a3aSHans de Goede }	/*  EFUSE_ShadowRead1Byte */
462554c0a3aSHans de Goede 
463554c0a3aSHans de Goede /* Read Two Bytes */
4645641eeecSRoss Schmidt static void efuse_ShadowRead2Byte(struct adapter *padapter, u16 Offset, u16 *Value)
465554c0a3aSHans de Goede {
466554c0a3aSHans de Goede 	struct eeprom_priv *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);
467554c0a3aSHans de Goede 
468554c0a3aSHans de Goede 	*Value = pEEPROM->efuse_eeprom_data[Offset];
469554c0a3aSHans de Goede 	*Value |= pEEPROM->efuse_eeprom_data[Offset+1]<<8;
470554c0a3aSHans de Goede 
471554c0a3aSHans de Goede }	/*  EFUSE_ShadowRead2Byte */
472554c0a3aSHans de Goede 
473554c0a3aSHans de Goede /* Read Four Bytes */
4745641eeecSRoss Schmidt static void efuse_ShadowRead4Byte(struct adapter *padapter, u16 Offset, u32 *Value)
475554c0a3aSHans de Goede {
476554c0a3aSHans de Goede 	struct eeprom_priv *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);
477554c0a3aSHans de Goede 
478554c0a3aSHans de Goede 	*Value = pEEPROM->efuse_eeprom_data[Offset];
479554c0a3aSHans de Goede 	*Value |= pEEPROM->efuse_eeprom_data[Offset+1]<<8;
480554c0a3aSHans de Goede 	*Value |= pEEPROM->efuse_eeprom_data[Offset+2]<<16;
481554c0a3aSHans de Goede 	*Value |= pEEPROM->efuse_eeprom_data[Offset+3]<<24;
482554c0a3aSHans de Goede 
483554c0a3aSHans de Goede }	/*  efuse_ShadowRead4Byte */
484554c0a3aSHans de Goede 
485554c0a3aSHans de Goede /*-----------------------------------------------------------------------------
486554c0a3aSHans de Goede  * Function:	EFUSE_ShadowMapUpdate
487554c0a3aSHans de Goede  *
488554c0a3aSHans de Goede  * Overview:	Transfer current EFUSE content to shadow init and modify map.
489554c0a3aSHans de Goede  *
490554c0a3aSHans de Goede  * Input:       NONE
491554c0a3aSHans de Goede  *
492554c0a3aSHans de Goede  * Output:      NONE
493554c0a3aSHans de Goede  *
494554c0a3aSHans de Goede  * Return:      NONE
495554c0a3aSHans de Goede  *
496554c0a3aSHans de Goede  * Revised History:
497554c0a3aSHans de Goede  * When			Who		Remark
498554c0a3aSHans de Goede  * 11/13/2008	MHC		Create Version 0.
499554c0a3aSHans de Goede  *
500554c0a3aSHans de Goede  *---------------------------------------------------------------------------*/
5015641eeecSRoss Schmidt void EFUSE_ShadowMapUpdate(struct adapter *padapter, u8 efuseType, bool bPseudoTest)
502554c0a3aSHans de Goede {
503554c0a3aSHans de Goede 	struct eeprom_priv *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);
504554c0a3aSHans de Goede 	u16 mapLen = 0;
505554c0a3aSHans de Goede 
506554c0a3aSHans de Goede 	EFUSE_GetEfuseDefinition(padapter, efuseType, TYPE_EFUSE_MAP_LEN, (void *)&mapLen, bPseudoTest);
507554c0a3aSHans de Goede 
508d2ab9916SMichael Straube 	if (pEEPROM->bautoload_fail_flag)
509554c0a3aSHans de Goede 		memset(pEEPROM->efuse_eeprom_data, 0xFF, mapLen);
510d2ab9916SMichael Straube 	else
511554c0a3aSHans de Goede 		Efuse_ReadAllMap(padapter, efuseType, pEEPROM->efuse_eeprom_data, bPseudoTest);
512554c0a3aSHans de Goede 
513554c0a3aSHans de Goede 	/* PlatformMoveMemory((void *)&pHalData->EfuseMap[EFUSE_MODIFY_MAP][0], */
514554c0a3aSHans de Goede 	/* void *)&pHalData->EfuseMap[EFUSE_INIT_MAP][0], mapLen); */
515554c0a3aSHans de Goede } /*  EFUSE_ShadowMapUpdate */
516554c0a3aSHans de Goede 
517554c0a3aSHans de Goede 
518554c0a3aSHans de Goede /*-----------------------------------------------------------------------------
519554c0a3aSHans de Goede  * Function:	EFUSE_ShadowRead
520554c0a3aSHans de Goede  *
521554c0a3aSHans de Goede  * Overview:	Read from efuse init map !!!!!
522554c0a3aSHans de Goede  *
523554c0a3aSHans de Goede  * Input:       NONE
524554c0a3aSHans de Goede  *
525554c0a3aSHans de Goede  * Output:      NONE
526554c0a3aSHans de Goede  *
527554c0a3aSHans de Goede  * Return:      NONE
528554c0a3aSHans de Goede  *
529554c0a3aSHans de Goede  * Revised History:
530554c0a3aSHans de Goede  * When			Who		Remark
531554c0a3aSHans de Goede  * 11/12/2008	MHC		Create Version 0.
532554c0a3aSHans de Goede  *
533554c0a3aSHans de Goede  *---------------------------------------------------------------------------*/
5345641eeecSRoss Schmidt void EFUSE_ShadowRead(struct adapter *padapter, u8 Type, u16 Offset, u32 *Value)
535554c0a3aSHans de Goede {
536554c0a3aSHans de Goede 	if (Type == 1)
537554c0a3aSHans de Goede 		efuse_ShadowRead1Byte(padapter, Offset, (u8 *)Value);
538554c0a3aSHans de Goede 	else if (Type == 2)
539554c0a3aSHans de Goede 		efuse_ShadowRead2Byte(padapter, Offset, (u16 *)Value);
540554c0a3aSHans de Goede 	else if (Type == 4)
541554c0a3aSHans de Goede 		efuse_ShadowRead4Byte(padapter, Offset, (u32 *)Value);
542554c0a3aSHans de Goede 
543554c0a3aSHans de Goede }	/* EFUSE_ShadowRead*/
544