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