hc
2023-12-06 08f87f769b595151be1afeff53e144f543faa614
kernel/drivers/net/wireless/realtek/rtlwifi/efuse.c
....@@ -1,54 +1,16 @@
1
-/******************************************************************************
2
- *
3
- * Copyright(c) 2009-2012 Realtek Corporation.
4
- *
5
- * Tmis program is free software; you can redistribute it and/or modify it
6
- * under the terms of version 2 of the GNU General Public License as
7
- * published by the Free Software Foundation.
8
- *
9
- * Tmis program is distributed in the hope that it will be useful, but WITHOUT
10
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12
- * more details.
13
- *
14
- * Tme full GNU General Public License is included in this distribution in the
15
- * file called LICENSE.
16
- *
17
- * Contact Information:
18
- * wlanfae <wlanfae@realtek.com>
19
- * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20
- * Hsinchu 300, Taiwan.
21
- *
22
- * Larry Finger <Larry.Finger@lwfinger.net>
23
- *
24
- *****************************************************************************/
1
+// SPDX-License-Identifier: GPL-2.0
2
+/* Copyright(c) 2009-2012 Realtek Corporation.*/
3
+
254 #include "wifi.h"
265 #include "efuse.h"
276 #include "pci.h"
287 #include <linux/export.h>
298
30
-static const u8 MAX_PGPKT_SIZE = 9;
319 static const u8 PGPKT_DATA_SIZE = 8;
3210 static const int EFUSE_MAX_SIZE = 512;
3311
3412 #define START_ADDRESS 0x1000
3513 #define REG_MCUFWDL 0x0080
36
-
37
-static const struct efuse_map RTL8712_SDIO_EFUSE_TABLE[] = {
38
- {0, 0, 0, 2},
39
- {0, 1, 0, 2},
40
- {0, 2, 0, 2},
41
- {1, 0, 0, 1},
42
- {1, 0, 1, 1},
43
- {1, 1, 0, 1},
44
- {1, 1, 1, 3},
45
- {1, 3, 0, 17},
46
- {3, 3, 1, 48},
47
- {10, 0, 0, 6},
48
- {10, 3, 0, 1},
49
- {10, 3, 1, 1},
50
- {11, 0, 0, 28}
51
-};
5214
5315 static const struct rtl_efuse_ops efuse_ops = {
5416 .efuse_onebyte_read = efuse_one_byte_read,
....@@ -138,10 +100,8 @@
138100 rtlpriv->cfg->
139101 maps[EFUSE_CTRL] + 3);
140102 k++;
141
- if (k == 1000) {
142
- k = 0;
103
+ if (k == 1000)
143104 break;
144
- }
145105 }
146106 data = rtl_read_byte(rtlpriv, rtlpriv->cfg->maps[EFUSE_CTRL]);
147107 return data;
....@@ -160,8 +120,8 @@
160120 const u32 efuse_len =
161121 rtlpriv->cfg->maps[EFUSE_REAL_CONTENT_SIZE];
162122
163
- RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD, "Addr=%x Data =%x\n",
164
- address, value);
123
+ rtl_dbg(rtlpriv, COMP_EFUSE, DBG_LOUD, "Addr=%x Data =%x\n",
124
+ address, value);
165125
166126 if (address < efuse_len) {
167127 rtl_write_byte(rtlpriv, rtlpriv->cfg->maps[EFUSE_CTRL], value);
....@@ -251,9 +211,9 @@
251211 u8 efuse_usage;
252212
253213 if ((_offset + _size_byte) > rtlpriv->cfg->maps[EFUSE_HWSET_MAX_SIZE]) {
254
- RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD,
255
- "read_efuse(): Invalid offset(%#x) with read bytes(%#x)!!\n",
256
- _offset, _size_byte);
214
+ rtl_dbg(rtlpriv, COMP_EFUSE, DBG_LOUD,
215
+ "%s: Invalid offset(%#x) with read bytes(%#x)!!\n",
216
+ __func__, _offset, _size_byte);
257217 return;
258218 }
259219
....@@ -386,20 +346,20 @@
386346 {
387347 struct rtl_priv *rtlpriv = rtl_priv(hw);
388348 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
389
- u8 section_idx, i, Base;
349
+ u8 section_idx, i, base;
390350 u16 words_need = 0, hdr_num = 0, totalbytes, efuse_used;
391351 bool wordchanged, result = true;
392352
393353 for (section_idx = 0; section_idx < 16; section_idx++) {
394
- Base = section_idx * 8;
354
+ base = section_idx * 8;
395355 wordchanged = false;
396356
397357 for (i = 0; i < 8; i = i + 2) {
398
- if ((rtlefuse->efuse_map[EFUSE_INIT_MAP][Base + i] !=
399
- rtlefuse->efuse_map[EFUSE_MODIFY_MAP][Base + i]) ||
400
- (rtlefuse->efuse_map[EFUSE_INIT_MAP][Base + i + 1] !=
401
- rtlefuse->efuse_map[EFUSE_MODIFY_MAP][Base + i +
402
- 1])) {
358
+ if (rtlefuse->efuse_map[EFUSE_INIT_MAP][base + i] !=
359
+ rtlefuse->efuse_map[EFUSE_MODIFY_MAP][base + i] ||
360
+ rtlefuse->efuse_map[EFUSE_INIT_MAP][base + i + 1] !=
361
+ rtlefuse->efuse_map[EFUSE_MODIFY_MAP][base + i +
362
+ 1]) {
403363 words_need++;
404364 wordchanged = true;
405365 }
....@@ -416,9 +376,9 @@
416376 (EFUSE_MAX_SIZE - rtlpriv->cfg->maps[EFUSE_OOB_PROTECT_BYTES_LEN]))
417377 result = false;
418378
419
- RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD,
420
- "efuse_shadow_update_chk(): totalbytes(%#x), hdr_num(%#x), words_need(%#x), efuse_used(%d)\n",
421
- totalbytes, hdr_num, words_need, efuse_used);
379
+ rtl_dbg(rtlpriv, COMP_EFUSE, DBG_LOUD,
380
+ "%s: totalbytes(%#x), hdr_num(%#x), words_need(%#x), efuse_used(%d)\n",
381
+ __func__, totalbytes, hdr_num, words_need, efuse_used);
422382
423383 return result;
424384 }
....@@ -456,7 +416,7 @@
456416 u8 word_en = 0x0F;
457417 u8 first_pg = false;
458418
459
- RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD, "\n");
419
+ rtl_dbg(rtlpriv, COMP_EFUSE, DBG_LOUD, "\n");
460420
461421 if (!efuse_shadow_update_chk(hw)) {
462422 efuse_read_all_map(hw, &rtlefuse->efuse_map[EFUSE_INIT_MAP][0]);
....@@ -464,8 +424,8 @@
464424 &rtlefuse->efuse_map[EFUSE_INIT_MAP][0],
465425 rtlpriv->cfg->maps[EFUSE_HWSET_MAX_SIZE]);
466426
467
- RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD,
468
- "efuse out of capacity!!\n");
427
+ rtl_dbg(rtlpriv, COMP_EFUSE, DBG_LOUD,
428
+ "efuse out of capacity!!\n");
469429 return false;
470430 }
471431 efuse_power_switch(hw, true, true);
....@@ -495,6 +455,7 @@
495455
496456 if (word_en != 0x0F) {
497457 u8 tmpdata[8];
458
+
498459 memcpy(tmpdata,
499460 &rtlefuse->efuse_map[EFUSE_MODIFY_MAP][base],
500461 8);
....@@ -503,12 +464,11 @@
503464
504465 if (!efuse_pg_packet_write(hw, (u8) offset, word_en,
505466 tmpdata)) {
506
- RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
507
- "PG section(%#x) fail!!\n", offset);
467
+ rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
468
+ "PG section(%#x) fail!!\n", offset);
508469 break;
509470 }
510471 }
511
-
512472 }
513473
514474 efuse_power_switch(hw, true, false);
....@@ -518,7 +478,7 @@
518478 &rtlefuse->efuse_map[EFUSE_INIT_MAP][0],
519479 rtlpriv->cfg->maps[EFUSE_HWSET_MAX_SIZE]);
520480
521
- RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD, "\n");
481
+ rtl_dbg(rtlpriv, COMP_EFUSE, DBG_LOUD, "\n");
522482 return true;
523483 }
524484
....@@ -540,7 +500,7 @@
540500 }
541501 EXPORT_SYMBOL(rtl_efuse_shadow_map_update);
542502
543
-void efuse_force_write_vendor_Id(struct ieee80211_hw *hw)
503
+void efuse_force_write_vendor_id(struct ieee80211_hw *hw)
544504 {
545505 u8 tmpdata[8] = { 0xFF, 0xFF, 0xEC, 0x10, 0xFF, 0xFF, 0xFF, 0xFF };
546506
....@@ -656,8 +616,8 @@
656616 struct rtl_priv *rtlpriv = rtl_priv(hw);
657617 u8 tmpidx = 0;
658618
659
- RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD,
660
- "Addr = %x Data=%x\n", addr, data);
619
+ rtl_dbg(rtlpriv, COMP_EFUSE, DBG_LOUD,
620
+ "Addr = %x Data=%x\n", addr, data);
661621
662622 rtl_write_byte(rtlpriv,
663623 rtlpriv->cfg->maps[EFUSE_CTRL] + 1, (u8) (addr & 0xff));
....@@ -683,6 +643,7 @@
683643 static void efuse_read_all_map(struct ieee80211_hw *hw, u8 *efuse)
684644 {
685645 struct rtl_priv *rtlpriv = rtl_priv(hw);
646
+
686647 efuse_power_switch(hw, false, true);
687648 read_efuse(hw, 0, rtlpriv->cfg->maps[EFUSE_HWSET_MAX_SIZE], efuse);
688649 efuse_power_switch(hw, false, false);
....@@ -833,6 +794,7 @@
833794 if (0x0F != (badworden & 0x0F)) {
834795 u8 reorg_offset = offset;
835796 u8 reorg_worden = badworden;
797
+
836798 efuse_pg_packet_write(hw, reorg_offset,
837799 reorg_worden,
838800 originaldata);
....@@ -922,6 +884,7 @@
922884 if (0x0F != (badworden & 0x0F)) {
923885 u8 reorg_offset = tmp_pkt.offset;
924886 u8 reorg_worden = badworden;
887
+
925888 efuse_pg_packet_write(hw, reorg_offset,
926889 reorg_worden,
927890 originaldata);
....@@ -952,7 +915,7 @@
952915 struct rtl_priv *rtlpriv = rtl_priv(hw);
953916 struct pgpkt_struct target_pkt;
954917 u8 write_state = PG_STATE_HEADER;
955
- int continual = true, dataempty = true, result = true;
918
+ int continual = true, result = true;
956919 u16 efuse_addr = 0;
957920 u8 efuse_data;
958921 u8 target_word_cnts = 0;
....@@ -978,9 +941,7 @@
978941
979942 while (continual && (efuse_addr < (EFUSE_MAX_SIZE -
980943 rtlpriv->cfg->maps[EFUSE_OOB_PROTECT_BYTES_LEN]))) {
981
-
982944 if (write_state == PG_STATE_HEADER) {
983
- dataempty = true;
984945 badworden = 0x0F;
985946 RTPRINT(rtlpriv, FEEPROM, EFUSE_PG,
986947 "efuse PG_STATE_HEADER\n");
....@@ -1005,7 +966,6 @@
1005966 } else if (write_state == PG_STATE_DATA) {
1006967 RTPRINT(rtlpriv, FEEPROM, EFUSE_PG,
1007968 "efuse PG_STATE_DATA\n");
1008
- badworden = 0x0f;
1009969 badworden =
1010970 enable_efuse_data_write(hw, efuse_addr + 1,
1011971 target_pkt.word_en,
....@@ -1036,8 +996,8 @@
1036996
1037997 if (efuse_addr >= (EFUSE_MAX_SIZE -
1038998 rtlpriv->cfg->maps[EFUSE_OOB_PROTECT_BYTES_LEN])) {
1039
- RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD,
1040
- "efuse_addr(%#x) Out of size!!\n", efuse_addr);
999
+ rtl_dbg(rtlpriv, COMP_EFUSE, DBG_LOUD,
1000
+ "efuse_addr(%#x) Out of size!!\n", efuse_addr);
10411001 }
10421002
10431003 return true;
....@@ -1077,8 +1037,8 @@
10771037 u8 tmpdata[8];
10781038
10791039 memset(tmpdata, 0xff, PGPKT_DATA_SIZE);
1080
- RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD,
1081
- "word_en = %x efuse_addr=%x\n", word_en, efuse_addr);
1040
+ rtl_dbg(rtlpriv, COMP_EFUSE, DBG_LOUD,
1041
+ "word_en = %x efuse_addr=%x\n", word_en, efuse_addr);
10821042
10831043 if (!(word_en & BIT(0))) {
10841044 tmpaddr = start_addr;
....@@ -1132,40 +1092,39 @@
11321092 struct rtl_priv *rtlpriv = rtl_priv(hw);
11331093 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
11341094 u8 tempval;
1135
- u16 tmpV16;
1095
+ u16 tmpv16;
11361096
11371097 if (pwrstate && (rtlhal->hw_type != HARDWARE_TYPE_RTL8192SE)) {
1138
-
11391098 if (rtlhal->hw_type != HARDWARE_TYPE_RTL8192CE &&
11401099 rtlhal->hw_type != HARDWARE_TYPE_RTL8192DE) {
11411100 rtl_write_byte(rtlpriv,
11421101 rtlpriv->cfg->maps[EFUSE_ACCESS], 0x69);
11431102 } else {
1144
- tmpV16 =
1103
+ tmpv16 =
11451104 rtl_read_word(rtlpriv,
11461105 rtlpriv->cfg->maps[SYS_ISO_CTRL]);
1147
- if (!(tmpV16 & rtlpriv->cfg->maps[EFUSE_PWC_EV12V])) {
1148
- tmpV16 |= rtlpriv->cfg->maps[EFUSE_PWC_EV12V];
1106
+ if (!(tmpv16 & rtlpriv->cfg->maps[EFUSE_PWC_EV12V])) {
1107
+ tmpv16 |= rtlpriv->cfg->maps[EFUSE_PWC_EV12V];
11491108 rtl_write_word(rtlpriv,
11501109 rtlpriv->cfg->maps[SYS_ISO_CTRL],
1151
- tmpV16);
1110
+ tmpv16);
11521111 }
11531112 }
1154
- tmpV16 = rtl_read_word(rtlpriv,
1113
+ tmpv16 = rtl_read_word(rtlpriv,
11551114 rtlpriv->cfg->maps[SYS_FUNC_EN]);
1156
- if (!(tmpV16 & rtlpriv->cfg->maps[EFUSE_FEN_ELDR])) {
1157
- tmpV16 |= rtlpriv->cfg->maps[EFUSE_FEN_ELDR];
1115
+ if (!(tmpv16 & rtlpriv->cfg->maps[EFUSE_FEN_ELDR])) {
1116
+ tmpv16 |= rtlpriv->cfg->maps[EFUSE_FEN_ELDR];
11581117 rtl_write_word(rtlpriv,
1159
- rtlpriv->cfg->maps[SYS_FUNC_EN], tmpV16);
1118
+ rtlpriv->cfg->maps[SYS_FUNC_EN], tmpv16);
11601119 }
11611120
1162
- tmpV16 = rtl_read_word(rtlpriv, rtlpriv->cfg->maps[SYS_CLK]);
1163
- if ((!(tmpV16 & rtlpriv->cfg->maps[EFUSE_LOADER_CLK_EN])) ||
1164
- (!(tmpV16 & rtlpriv->cfg->maps[EFUSE_ANA8M]))) {
1165
- tmpV16 |= (rtlpriv->cfg->maps[EFUSE_LOADER_CLK_EN] |
1121
+ tmpv16 = rtl_read_word(rtlpriv, rtlpriv->cfg->maps[SYS_CLK]);
1122
+ if ((!(tmpv16 & rtlpriv->cfg->maps[EFUSE_LOADER_CLK_EN])) ||
1123
+ (!(tmpv16 & rtlpriv->cfg->maps[EFUSE_ANA8M]))) {
1124
+ tmpv16 |= (rtlpriv->cfg->maps[EFUSE_LOADER_CLK_EN] |
11661125 rtlpriv->cfg->maps[EFUSE_ANA8M]);
11671126 rtl_write_word(rtlpriv,
1168
- rtlpriv->cfg->maps[SYS_CLK], tmpV16);
1127
+ rtlpriv->cfg->maps[SYS_CLK], tmpv16);
11691128 }
11701129 }
11711130
....@@ -1219,13 +1178,12 @@
12191178 {
12201179 int continual = true;
12211180 u16 efuse_addr = 0;
1222
- u8 hoffset, hworden;
1181
+ u8 hworden;
12231182 u8 efuse_data, word_cnts;
12241183
12251184 while (continual && efuse_one_byte_read(hw, efuse_addr, &efuse_data) &&
12261185 (efuse_addr < EFUSE_MAX_SIZE)) {
12271186 if (efuse_data != 0xFF) {
1228
- hoffset = (efuse_data >> 4) & 0x0F;
12291187 hworden = efuse_data & 0x0F;
12301188 word_cnts = efuse_calculate_word_cnts(hworden);
12311189 efuse_addr = efuse_addr + (word_cnts * 2) + 1;
....@@ -1240,6 +1198,7 @@
12401198 static u8 efuse_calculate_word_cnts(u8 word_en)
12411199 {
12421200 u8 word_cnts = 0;
1201
+
12431202 if (!(word_en & BIT(0)))
12441203 word_cnts++;
12451204 if (!(word_en & BIT(1)))
....@@ -1281,11 +1240,11 @@
12811240
12821241 eeprom_id = *((u16 *)&hwinfo[0]);
12831242 if (eeprom_id != params[0]) {
1284
- RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1285
- "EEPROM ID(%#x) is invalid!!\n", eeprom_id);
1243
+ rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
1244
+ "EEPROM ID(%#x) is invalid!!\n", eeprom_id);
12861245 rtlefuse->autoload_failflag = true;
12871246 } else {
1288
- RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Autoload OK\n");
1247
+ rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "Autoload OK\n");
12891248 rtlefuse->autoload_failflag = false;
12901249 }
12911250
....@@ -1296,30 +1255,30 @@
12961255 rtlefuse->eeprom_did = *(u16 *)&hwinfo[params[2]];
12971256 rtlefuse->eeprom_svid = *(u16 *)&hwinfo[params[3]];
12981257 rtlefuse->eeprom_smid = *(u16 *)&hwinfo[params[4]];
1299
- RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1300
- "EEPROMId = 0x%4x\n", eeprom_id);
1301
- RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1302
- "EEPROM VID = 0x%4x\n", rtlefuse->eeprom_vid);
1303
- RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1304
- "EEPROM DID = 0x%4x\n", rtlefuse->eeprom_did);
1305
- RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1306
- "EEPROM SVID = 0x%4x\n", rtlefuse->eeprom_svid);
1307
- RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1308
- "EEPROM SMID = 0x%4x\n", rtlefuse->eeprom_smid);
1258
+ rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
1259
+ "EEPROMId = 0x%4x\n", eeprom_id);
1260
+ rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
1261
+ "EEPROM VID = 0x%4x\n", rtlefuse->eeprom_vid);
1262
+ rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
1263
+ "EEPROM DID = 0x%4x\n", rtlefuse->eeprom_did);
1264
+ rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
1265
+ "EEPROM SVID = 0x%4x\n", rtlefuse->eeprom_svid);
1266
+ rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
1267
+ "EEPROM SMID = 0x%4x\n", rtlefuse->eeprom_smid);
13091268
13101269 for (i = 0; i < 6; i += 2) {
13111270 usvalue = *(u16 *)&hwinfo[params[5] + i];
13121271 *((u16 *)(&rtlefuse->dev_addr[i])) = usvalue;
13131272 }
1314
- RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "%pM\n", rtlefuse->dev_addr);
1273
+ rtl_dbg(rtlpriv, COMP_INIT, DBG_DMESG, "%pM\n", rtlefuse->dev_addr);
13151274
13161275 rtlefuse->eeprom_channelplan = *&hwinfo[params[6]];
13171276 rtlefuse->eeprom_version = *(u16 *)&hwinfo[params[7]];
13181277 rtlefuse->txpwr_fromeprom = true;
13191278 rtlefuse->eeprom_oemid = *&hwinfo[params[8]];
13201279
1321
- RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1322
- "EEPROM Customer ID: 0x%2x\n", rtlefuse->eeprom_oemid);
1280
+ rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
1281
+ "EEPROM Customer ID: 0x%2x\n", rtlefuse->eeprom_oemid);
13231282
13241283 /* set channel plan to world wide 13 */
13251284 rtlefuse->channel_plan = params[9];