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