• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // SPDX-License-Identifier: GPL-2.0
2 /******************************************************************************
3  *
4  * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
5  *
6  ******************************************************************************/
7 
8 #include "odm_precomp.h"
9 
10 #include <phy.h>
11 
12 /* AGC_TAB_1T.TXT */
13 
14 static u32 array_agc_tab_1t_8188e[] = {
15 		0xC78, 0xFB000001,
16 		0xC78, 0xFB010001,
17 		0xC78, 0xFB020001,
18 		0xC78, 0xFB030001,
19 		0xC78, 0xFB040001,
20 		0xC78, 0xFB050001,
21 		0xC78, 0xFA060001,
22 		0xC78, 0xF9070001,
23 		0xC78, 0xF8080001,
24 		0xC78, 0xF7090001,
25 		0xC78, 0xF60A0001,
26 		0xC78, 0xF50B0001,
27 		0xC78, 0xF40C0001,
28 		0xC78, 0xF30D0001,
29 		0xC78, 0xF20E0001,
30 		0xC78, 0xF10F0001,
31 		0xC78, 0xF0100001,
32 		0xC78, 0xEF110001,
33 		0xC78, 0xEE120001,
34 		0xC78, 0xED130001,
35 		0xC78, 0xEC140001,
36 		0xC78, 0xEB150001,
37 		0xC78, 0xEA160001,
38 		0xC78, 0xE9170001,
39 		0xC78, 0xE8180001,
40 		0xC78, 0xE7190001,
41 		0xC78, 0xE61A0001,
42 		0xC78, 0xE51B0001,
43 		0xC78, 0xE41C0001,
44 		0xC78, 0xE31D0001,
45 		0xC78, 0xE21E0001,
46 		0xC78, 0xE11F0001,
47 		0xC78, 0x8A200001,
48 		0xC78, 0x89210001,
49 		0xC78, 0x88220001,
50 		0xC78, 0x87230001,
51 		0xC78, 0x86240001,
52 		0xC78, 0x85250001,
53 		0xC78, 0x84260001,
54 		0xC78, 0x83270001,
55 		0xC78, 0x82280001,
56 		0xC78, 0x6B290001,
57 		0xC78, 0x6A2A0001,
58 		0xC78, 0x692B0001,
59 		0xC78, 0x682C0001,
60 		0xC78, 0x672D0001,
61 		0xC78, 0x662E0001,
62 		0xC78, 0x652F0001,
63 		0xC78, 0x64300001,
64 		0xC78, 0x63310001,
65 		0xC78, 0x62320001,
66 		0xC78, 0x61330001,
67 		0xC78, 0x46340001,
68 		0xC78, 0x45350001,
69 		0xC78, 0x44360001,
70 		0xC78, 0x43370001,
71 		0xC78, 0x42380001,
72 		0xC78, 0x41390001,
73 		0xC78, 0x403A0001,
74 		0xC78, 0x403B0001,
75 		0xC78, 0x403C0001,
76 		0xC78, 0x403D0001,
77 		0xC78, 0x403E0001,
78 		0xC78, 0x403F0001,
79 		0xC78, 0xFB400001,
80 		0xC78, 0xFB410001,
81 		0xC78, 0xFB420001,
82 		0xC78, 0xFB430001,
83 		0xC78, 0xFB440001,
84 		0xC78, 0xFB450001,
85 		0xC78, 0xFB460001,
86 		0xC78, 0xFB470001,
87 		0xC78, 0xFB480001,
88 		0xC78, 0xFA490001,
89 		0xC78, 0xF94A0001,
90 		0xC78, 0xF84B0001,
91 		0xC78, 0xF74C0001,
92 		0xC78, 0xF64D0001,
93 		0xC78, 0xF54E0001,
94 		0xC78, 0xF44F0001,
95 		0xC78, 0xF3500001,
96 		0xC78, 0xF2510001,
97 		0xC78, 0xF1520001,
98 		0xC78, 0xF0530001,
99 		0xC78, 0xEF540001,
100 		0xC78, 0xEE550001,
101 		0xC78, 0xED560001,
102 		0xC78, 0xEC570001,
103 		0xC78, 0xEB580001,
104 		0xC78, 0xEA590001,
105 		0xC78, 0xE95A0001,
106 		0xC78, 0xE85B0001,
107 		0xC78, 0xE75C0001,
108 		0xC78, 0xE65D0001,
109 		0xC78, 0xE55E0001,
110 		0xC78, 0xE45F0001,
111 		0xC78, 0xE3600001,
112 		0xC78, 0xE2610001,
113 		0xC78, 0xC3620001,
114 		0xC78, 0xC2630001,
115 		0xC78, 0xC1640001,
116 		0xC78, 0x8B650001,
117 		0xC78, 0x8A660001,
118 		0xC78, 0x89670001,
119 		0xC78, 0x88680001,
120 		0xC78, 0x87690001,
121 		0xC78, 0x866A0001,
122 		0xC78, 0x856B0001,
123 		0xC78, 0x846C0001,
124 		0xC78, 0x676D0001,
125 		0xC78, 0x666E0001,
126 		0xC78, 0x656F0001,
127 		0xC78, 0x64700001,
128 		0xC78, 0x63710001,
129 		0xC78, 0x62720001,
130 		0xC78, 0x61730001,
131 		0xC78, 0x60740001,
132 		0xC78, 0x46750001,
133 		0xC78, 0x45760001,
134 		0xC78, 0x44770001,
135 		0xC78, 0x43780001,
136 		0xC78, 0x42790001,
137 		0xC78, 0x417A0001,
138 		0xC78, 0x407B0001,
139 		0xC78, 0x407C0001,
140 		0xC78, 0x407D0001,
141 		0xC78, 0x407E0001,
142 		0xC78, 0x407F0001,
143 };
144 
set_baseband_agc_config(struct adapter * adapt)145 static bool set_baseband_agc_config(struct adapter *adapt)
146 {
147 	u32 i;
148 	const u32 arraylen = ARRAY_SIZE(array_agc_tab_1t_8188e);
149 	u32 *array = array_agc_tab_1t_8188e;
150 
151 	for (i = 0; i < arraylen; i += 2) {
152 		u32 v1 = array[i];
153 		u32 v2 = array[i + 1];
154 
155 		if (v1 < 0xCDCDCDCD) {
156 			phy_set_bb_reg(adapt, v1, bMaskDWord, v2);
157 			udelay(1);
158 		}
159 	}
160 	return true;
161 }
162 
163 /*  PHY_REG_1T.TXT  */
164 
165 static u32 array_phy_reg_1t_8188e[] = {
166 		0x800, 0x80040000,
167 		0x804, 0x00000003,
168 		0x808, 0x0000FC00,
169 		0x80C, 0x0000000A,
170 		0x810, 0x10001331,
171 		0x814, 0x020C3D10,
172 		0x818, 0x02200385,
173 		0x81C, 0x00000000,
174 		0x820, 0x01000100,
175 		0x824, 0x00390204,
176 		0x828, 0x00000000,
177 		0x82C, 0x00000000,
178 		0x830, 0x00000000,
179 		0x834, 0x00000000,
180 		0x838, 0x00000000,
181 		0x83C, 0x00000000,
182 		0x840, 0x00010000,
183 		0x844, 0x00000000,
184 		0x848, 0x00000000,
185 		0x84C, 0x00000000,
186 		0x850, 0x00000000,
187 		0x854, 0x00000000,
188 		0x858, 0x569A11A9,
189 		0x85C, 0x01000014,
190 		0x860, 0x66F60110,
191 		0x864, 0x061F0649,
192 		0x868, 0x00000000,
193 		0x86C, 0x27272700,
194 		0x870, 0x07000760,
195 		0x874, 0x25004000,
196 		0x878, 0x00000808,
197 		0x87C, 0x00000000,
198 		0x880, 0xB0000C1C,
199 		0x884, 0x00000001,
200 		0x888, 0x00000000,
201 		0x88C, 0xCCC000C0,
202 		0x890, 0x00000800,
203 		0x894, 0xFFFFFFFE,
204 		0x898, 0x40302010,
205 		0x89C, 0x00706050,
206 		0x900, 0x00000000,
207 		0x904, 0x00000023,
208 		0x908, 0x00000000,
209 		0x90C, 0x81121111,
210 		0x910, 0x00000002,
211 		0x914, 0x00000201,
212 		0xA00, 0x00D047C8,
213 		0xA04, 0x80FF000C,
214 		0xA08, 0x8C838300,
215 		0xA0C, 0x2E7F120F,
216 		0xA10, 0x9500BB78,
217 		0xA14, 0x1114D028,
218 		0xA18, 0x00881117,
219 		0xA1C, 0x89140F00,
220 		0xA20, 0x1A1B0000,
221 		0xA24, 0x090E1317,
222 		0xA28, 0x00000204,
223 		0xA2C, 0x00D30000,
224 		0xA70, 0x101FBF00,
225 		0xA74, 0x00000007,
226 		0xA78, 0x00000900,
227 		0xA7C, 0x225B0606,
228 		0xA80, 0x218075B1,
229 		0xB2C, 0x80000000,
230 		0xC00, 0x48071D40,
231 		0xC04, 0x03A05611,
232 		0xC08, 0x000000E4,
233 		0xC0C, 0x6C6C6C6C,
234 		0xC10, 0x08800000,
235 		0xC14, 0x40000100,
236 		0xC18, 0x08800000,
237 		0xC1C, 0x40000100,
238 		0xC20, 0x00000000,
239 		0xC24, 0x00000000,
240 		0xC28, 0x00000000,
241 		0xC2C, 0x00000000,
242 		0xC30, 0x69E9AC47,
243 		0xC34, 0x469652AF,
244 		0xC38, 0x49795994,
245 		0xC3C, 0x0A97971C,
246 		0xC40, 0x1F7C403F,
247 		0xC44, 0x000100B7,
248 		0xC48, 0xEC020107,
249 		0xC4C, 0x007F037F,
250 		0xC50, 0x69553420,
251 		0xC54, 0x43BC0094,
252 		0xC58, 0x00013169,
253 		0xC5C, 0x00250492,
254 		0xC60, 0x00000000,
255 		0xC64, 0x7112848B,
256 		0xC68, 0x47C00BFF,
257 		0xC6C, 0x00000036,
258 		0xC70, 0x2C7F000D,
259 		0xC74, 0x020610DB,
260 		0xC78, 0x0000001F,
261 		0xC7C, 0x00B91612,
262 		0xC80, 0x390000E4,
263 		0xC84, 0x20F60000,
264 		0xC88, 0x40000100,
265 		0xC8C, 0x20200000,
266 		0xC90, 0x00091521,
267 		0xC94, 0x00000000,
268 		0xC98, 0x00121820,
269 		0xC9C, 0x00007F7F,
270 		0xCA0, 0x00000000,
271 		0xCA4, 0x000300A0,
272 		0xCA8, 0x00000000,
273 		0xCAC, 0x00000000,
274 		0xCB0, 0x00000000,
275 		0xCB4, 0x00000000,
276 		0xCB8, 0x00000000,
277 		0xCBC, 0x28000000,
278 		0xCC0, 0x00000000,
279 		0xCC4, 0x00000000,
280 		0xCC8, 0x00000000,
281 		0xCCC, 0x00000000,
282 		0xCD0, 0x00000000,
283 		0xCD4, 0x00000000,
284 		0xCD8, 0x64B22427,
285 		0xCDC, 0x00766932,
286 		0xCE0, 0x00222222,
287 		0xCE4, 0x00000000,
288 		0xCE8, 0x37644302,
289 		0xCEC, 0x2F97D40C,
290 		0xD00, 0x00000740,
291 		0xD04, 0x00020401,
292 		0xD08, 0x0000907F,
293 		0xD0C, 0x20010201,
294 		0xD10, 0xA0633333,
295 		0xD14, 0x3333BC43,
296 		0xD18, 0x7A8F5B6F,
297 		0xD2C, 0xCC979975,
298 		0xD30, 0x00000000,
299 		0xD34, 0x80608000,
300 		0xD38, 0x00000000,
301 		0xD3C, 0x00127353,
302 		0xD40, 0x00000000,
303 		0xD44, 0x00000000,
304 		0xD48, 0x00000000,
305 		0xD4C, 0x00000000,
306 		0xD50, 0x6437140A,
307 		0xD54, 0x00000000,
308 		0xD58, 0x00000282,
309 		0xD5C, 0x30032064,
310 		0xD60, 0x4653DE68,
311 		0xD64, 0x04518A3C,
312 		0xD68, 0x00002101,
313 		0xD6C, 0x2A201C16,
314 		0xD70, 0x1812362E,
315 		0xD74, 0x322C2220,
316 		0xD78, 0x000E3C24,
317 		0xE00, 0x2D2D2D2D,
318 		0xE04, 0x2D2D2D2D,
319 		0xE08, 0x0390272D,
320 		0xE10, 0x2D2D2D2D,
321 		0xE14, 0x2D2D2D2D,
322 		0xE18, 0x2D2D2D2D,
323 		0xE1C, 0x2D2D2D2D,
324 		0xE28, 0x00000000,
325 		0xE30, 0x1000DC1F,
326 		0xE34, 0x10008C1F,
327 		0xE38, 0x02140102,
328 		0xE3C, 0x681604C2,
329 		0xE40, 0x01007C00,
330 		0xE44, 0x01004800,
331 		0xE48, 0xFB000000,
332 		0xE4C, 0x000028D1,
333 		0xE50, 0x1000DC1F,
334 		0xE54, 0x10008C1F,
335 		0xE58, 0x02140102,
336 		0xE5C, 0x28160D05,
337 		0xE60, 0x00000008,
338 		0xE68, 0x001B25A4,
339 		0xE6C, 0x00C00014,
340 		0xE70, 0x00C00014,
341 		0xE74, 0x01000014,
342 		0xE78, 0x01000014,
343 		0xE7C, 0x01000014,
344 		0xE80, 0x01000014,
345 		0xE84, 0x00C00014,
346 		0xE88, 0x01000014,
347 		0xE8C, 0x00C00014,
348 		0xED0, 0x00C00014,
349 		0xED4, 0x00C00014,
350 		0xED8, 0x00C00014,
351 		0xEDC, 0x00000014,
352 		0xEE0, 0x00000014,
353 		0xEEC, 0x01C00014,
354 		0xF14, 0x00000003,
355 		0xF4C, 0x00000000,
356 		0xF00, 0x00000300,
357 };
358 
rtl_bb_delay(struct adapter * adapt,u32 addr,u32 data)359 static void rtl_bb_delay(struct adapter *adapt, u32 addr, u32 data)
360 {
361 	if (addr == 0xfe) {
362 		msleep(50);
363 	} else if (addr == 0xfd) {
364 		mdelay(5);
365 	} else if (addr == 0xfc) {
366 		mdelay(1);
367 	} else if (addr == 0xfb) {
368 		udelay(50);
369 	} else if (addr == 0xfa) {
370 		udelay(5);
371 	} else if (addr == 0xf9) {
372 		udelay(1);
373 	} else {
374 		phy_set_bb_reg(adapt, addr, bMaskDWord, data);
375 		/*  Add 1us delay between BB/RF register setting. */
376 		udelay(1);
377 	}
378 }
379 
set_baseband_phy_config(struct adapter * adapt)380 static bool set_baseband_phy_config(struct adapter *adapt)
381 {
382 	u32 i;
383 	const u32 arraylen = ARRAY_SIZE(array_phy_reg_1t_8188e);
384 	u32 *array = array_phy_reg_1t_8188e;
385 
386 	for (i = 0; i < arraylen; i += 2) {
387 		u32 v1 = array[i];
388 		u32 v2 = array[i + 1];
389 
390 		if (v1 < 0xCDCDCDCD)
391 			rtl_bb_delay(adapt, v1, v2);
392 	}
393 	return true;
394 }
395 
396 /*  PHY_REG_PG.TXT  */
397 
398 static u32 array_phy_reg_pg_8188e[] = {
399 		0xE00, 0xFFFFFFFF, 0x06070809,
400 		0xE04, 0xFFFFFFFF, 0x02020405,
401 		0xE08, 0x0000FF00, 0x00000006,
402 		0x86C, 0xFFFFFF00, 0x00020400,
403 		0xE10, 0xFFFFFFFF, 0x08090A0B,
404 		0xE14, 0xFFFFFFFF, 0x01030607,
405 		0xE18, 0xFFFFFFFF, 0x08090A0B,
406 		0xE1C, 0xFFFFFFFF, 0x01030607,
407 		0xE00, 0xFFFFFFFF, 0x00000000,
408 		0xE04, 0xFFFFFFFF, 0x00000000,
409 		0xE08, 0x0000FF00, 0x00000000,
410 		0x86C, 0xFFFFFF00, 0x00000000,
411 		0xE10, 0xFFFFFFFF, 0x00000000,
412 		0xE14, 0xFFFFFFFF, 0x00000000,
413 		0xE18, 0xFFFFFFFF, 0x00000000,
414 		0xE1C, 0xFFFFFFFF, 0x00000000,
415 		0xE00, 0xFFFFFFFF, 0x02020202,
416 		0xE04, 0xFFFFFFFF, 0x00020202,
417 		0xE08, 0x0000FF00, 0x00000000,
418 		0x86C, 0xFFFFFF00, 0x00000000,
419 		0xE10, 0xFFFFFFFF, 0x04040404,
420 		0xE14, 0xFFFFFFFF, 0x00020404,
421 		0xE18, 0xFFFFFFFF, 0x00000000,
422 		0xE1C, 0xFFFFFFFF, 0x00000000,
423 		0xE00, 0xFFFFFFFF, 0x02020202,
424 		0xE04, 0xFFFFFFFF, 0x00020202,
425 		0xE08, 0x0000FF00, 0x00000000,
426 		0x86C, 0xFFFFFF00, 0x00000000,
427 		0xE10, 0xFFFFFFFF, 0x04040404,
428 		0xE14, 0xFFFFFFFF, 0x00020404,
429 		0xE18, 0xFFFFFFFF, 0x00000000,
430 		0xE1C, 0xFFFFFFFF, 0x00000000,
431 		0xE00, 0xFFFFFFFF, 0x00000000,
432 		0xE04, 0xFFFFFFFF, 0x00000000,
433 		0xE08, 0x0000FF00, 0x00000000,
434 		0x86C, 0xFFFFFF00, 0x00000000,
435 		0xE10, 0xFFFFFFFF, 0x00000000,
436 		0xE14, 0xFFFFFFFF, 0x00000000,
437 		0xE18, 0xFFFFFFFF, 0x00000000,
438 		0xE1C, 0xFFFFFFFF, 0x00000000,
439 		0xE00, 0xFFFFFFFF, 0x02020202,
440 		0xE04, 0xFFFFFFFF, 0x00020202,
441 		0xE08, 0x0000FF00, 0x00000000,
442 		0x86C, 0xFFFFFF00, 0x00000000,
443 		0xE10, 0xFFFFFFFF, 0x04040404,
444 		0xE14, 0xFFFFFFFF, 0x00020404,
445 		0xE18, 0xFFFFFFFF, 0x00000000,
446 		0xE1C, 0xFFFFFFFF, 0x00000000,
447 		0xE00, 0xFFFFFFFF, 0x00000000,
448 		0xE04, 0xFFFFFFFF, 0x00000000,
449 		0xE08, 0x0000FF00, 0x00000000,
450 		0x86C, 0xFFFFFF00, 0x00000000,
451 		0xE10, 0xFFFFFFFF, 0x00000000,
452 		0xE14, 0xFFFFFFFF, 0x00000000,
453 		0xE18, 0xFFFFFFFF, 0x00000000,
454 		0xE1C, 0xFFFFFFFF, 0x00000000,
455 		0xE00, 0xFFFFFFFF, 0x00000000,
456 		0xE04, 0xFFFFFFFF, 0x00000000,
457 		0xE08, 0x0000FF00, 0x00000000,
458 		0x86C, 0xFFFFFF00, 0x00000000,
459 		0xE10, 0xFFFFFFFF, 0x00000000,
460 		0xE14, 0xFFFFFFFF, 0x00000000,
461 		0xE18, 0xFFFFFFFF, 0x00000000,
462 		0xE1C, 0xFFFFFFFF, 0x00000000,
463 		0xE00, 0xFFFFFFFF, 0x00000000,
464 		0xE04, 0xFFFFFFFF, 0x00000000,
465 		0xE08, 0x0000FF00, 0x00000000,
466 		0x86C, 0xFFFFFF00, 0x00000000,
467 		0xE10, 0xFFFFFFFF, 0x00000000,
468 		0xE14, 0xFFFFFFFF, 0x00000000,
469 		0xE18, 0xFFFFFFFF, 0x00000000,
470 		0xE1C, 0xFFFFFFFF, 0x00000000,
471 		0xE00, 0xFFFFFFFF, 0x00000000,
472 		0xE04, 0xFFFFFFFF, 0x00000000,
473 		0xE08, 0x0000FF00, 0x00000000,
474 		0x86C, 0xFFFFFF00, 0x00000000,
475 		0xE10, 0xFFFFFFFF, 0x00000000,
476 		0xE14, 0xFFFFFFFF, 0x00000000,
477 		0xE18, 0xFFFFFFFF, 0x00000000,
478 		0xE1C, 0xFFFFFFFF, 0x00000000,
479 		0xE00, 0xFFFFFFFF, 0x00000000,
480 		0xE04, 0xFFFFFFFF, 0x00000000,
481 		0xE08, 0x0000FF00, 0x00000000,
482 		0x86C, 0xFFFFFF00, 0x00000000,
483 		0xE10, 0xFFFFFFFF, 0x00000000,
484 		0xE14, 0xFFFFFFFF, 0x00000000,
485 		0xE18, 0xFFFFFFFF, 0x00000000,
486 		0xE1C, 0xFFFFFFFF, 0x00000000,
487 
488 };
489 
store_pwrindex_offset(struct adapter * adapter,u32 regaddr,u32 bitmask,u32 data)490 static void store_pwrindex_offset(struct adapter *adapter,
491 				  u32 regaddr, u32 bitmask, u32 data)
492 {
493 	struct hal_data_8188e *hal_data = adapter->HalData;
494 	u32 * const power_level_offset =
495 		hal_data->MCSTxPowerLevelOriginalOffset[hal_data->pwrGroupCnt];
496 
497 	if (regaddr == rTxAGC_A_Rate18_06)
498 		power_level_offset[0] = data;
499 	if (regaddr == rTxAGC_A_Rate54_24)
500 		power_level_offset[1] = data;
501 	if (regaddr == rTxAGC_A_CCK1_Mcs32)
502 		power_level_offset[6] = data;
503 	if (regaddr == rTxAGC_B_CCK11_A_CCK2_11 && bitmask == 0xffffff00)
504 		power_level_offset[7] = data;
505 	if (regaddr == rTxAGC_A_Mcs03_Mcs00)
506 		power_level_offset[2] = data;
507 	if (regaddr == rTxAGC_A_Mcs07_Mcs04)
508 		power_level_offset[3] = data;
509 	if (regaddr == rTxAGC_A_Mcs11_Mcs08)
510 		power_level_offset[4] = data;
511 	if (regaddr == rTxAGC_A_Mcs15_Mcs12) {
512 		power_level_offset[5] = data;
513 		hal_data->pwrGroupCnt++;
514 	}
515 	if (regaddr == rTxAGC_B_Rate18_06)
516 		power_level_offset[8] = data;
517 	if (regaddr == rTxAGC_B_Rate54_24)
518 		power_level_offset[9] = data;
519 	if (regaddr == rTxAGC_B_CCK1_55_Mcs32)
520 		power_level_offset[14] = data;
521 	if (regaddr == rTxAGC_B_CCK11_A_CCK2_11 && bitmask == 0x000000ff)
522 		power_level_offset[15] = data;
523 	if (regaddr == rTxAGC_B_Mcs03_Mcs00)
524 		power_level_offset[10] = data;
525 	if (regaddr == rTxAGC_B_Mcs07_Mcs04)
526 		power_level_offset[11] = data;
527 	if (regaddr == rTxAGC_B_Mcs11_Mcs08)
528 		power_level_offset[12] = data;
529 	if (regaddr == rTxAGC_B_Mcs15_Mcs12)
530 		power_level_offset[13] = data;
531 }
532 
rtl_addr_delay(struct adapter * adapt,u32 addr,u32 bit_mask,u32 data)533 static void rtl_addr_delay(struct adapter *adapt,
534 			   u32 addr, u32 bit_mask, u32 data)
535 {
536 	switch (addr) {
537 	case 0xfe:
538 		msleep(50);
539 		break;
540 	case 0xfd:
541 		mdelay(5);
542 		break;
543 	case 0xfc:
544 		mdelay(1);
545 		break;
546 	case 0xfb:
547 		udelay(50);
548 		break;
549 	case 0xfa:
550 		udelay(5);
551 		break;
552 	case 0xf9:
553 		udelay(1);
554 		break;
555 	default:
556 		store_pwrindex_offset(adapt, addr, bit_mask, data);
557 	}
558 }
559 
config_bb_with_pgheader(struct adapter * adapt)560 static bool config_bb_with_pgheader(struct adapter *adapt)
561 {
562 	u32 i;
563 	const u32 arraylen = ARRAY_SIZE(array_phy_reg_pg_8188e);
564 	u32 *array = array_phy_reg_pg_8188e;
565 
566 	for (i = 0; i < arraylen; i += 3) {
567 		u32 v1 = array[i];
568 		u32 v2 = array[i + 1];
569 		u32 v3 = array[i + 2];
570 
571 		if (v1 < 0xCDCDCDCD)
572 			rtl_addr_delay(adapt, v1, v2, v3);
573 	}
574 	return true;
575 }
576 
rtl88e_phy_init_bb_rf_register_definition(struct adapter * adapter)577 static void rtl88e_phy_init_bb_rf_register_definition(struct adapter *adapter)
578 {
579 	struct bb_reg_def               *reg[4];
580 
581 	reg[RF_PATH_A] = &adapter->HalData->PHYRegDef[RF_PATH_A];
582 	reg[RF_PATH_B] = &adapter->HalData->PHYRegDef[RF_PATH_B];
583 
584 	reg[RF_PATH_A]->rfintfs = rFPGA0_XAB_RFInterfaceSW;
585 	reg[RF_PATH_B]->rfintfs = rFPGA0_XAB_RFInterfaceSW;
586 
587 	reg[RF_PATH_A]->rfintfi = rFPGA0_XAB_RFInterfaceRB;
588 	reg[RF_PATH_B]->rfintfi = rFPGA0_XAB_RFInterfaceRB;
589 
590 	reg[RF_PATH_A]->rfintfo = rFPGA0_XA_RFInterfaceOE;
591 	reg[RF_PATH_B]->rfintfo = rFPGA0_XB_RFInterfaceOE;
592 
593 	reg[RF_PATH_A]->rfintfe = rFPGA0_XA_RFInterfaceOE;
594 	reg[RF_PATH_B]->rfintfe = rFPGA0_XB_RFInterfaceOE;
595 
596 	reg[RF_PATH_A]->rf3wireOffset = rFPGA0_XA_LSSIParameter;
597 	reg[RF_PATH_B]->rf3wireOffset = rFPGA0_XB_LSSIParameter;
598 
599 	reg[RF_PATH_A]->rfLSSI_Select = rFPGA0_XAB_RFParameter;
600 	reg[RF_PATH_B]->rfLSSI_Select = rFPGA0_XAB_RFParameter;
601 
602 	reg[RF_PATH_A]->rfTxGainStage = rFPGA0_TxGainStage;
603 	reg[RF_PATH_B]->rfTxGainStage = rFPGA0_TxGainStage;
604 
605 	reg[RF_PATH_A]->rfHSSIPara1 = rFPGA0_XA_HSSIParameter1;
606 	reg[RF_PATH_B]->rfHSSIPara1 = rFPGA0_XB_HSSIParameter1;
607 
608 	reg[RF_PATH_A]->rfHSSIPara2 = rFPGA0_XA_HSSIParameter2;
609 	reg[RF_PATH_B]->rfHSSIPara2 = rFPGA0_XB_HSSIParameter2;
610 
611 	reg[RF_PATH_A]->rfSwitchControl = rFPGA0_XAB_SwitchControl;
612 	reg[RF_PATH_B]->rfSwitchControl = rFPGA0_XAB_SwitchControl;
613 
614 	reg[RF_PATH_A]->rfAGCControl1 = rOFDM0_XAAGCCore1;
615 	reg[RF_PATH_B]->rfAGCControl1 = rOFDM0_XBAGCCore1;
616 
617 	reg[RF_PATH_A]->rfAGCControl2 = rOFDM0_XAAGCCore2;
618 	reg[RF_PATH_B]->rfAGCControl2 = rOFDM0_XBAGCCore2;
619 
620 	reg[RF_PATH_A]->rfRxIQImbalance = rOFDM0_XARxIQImbalance;
621 	reg[RF_PATH_B]->rfRxIQImbalance = rOFDM0_XBRxIQImbalance;
622 
623 	reg[RF_PATH_A]->rfRxAFE = rOFDM0_XARxAFE;
624 	reg[RF_PATH_B]->rfRxAFE = rOFDM0_XBRxAFE;
625 
626 	reg[RF_PATH_A]->rfTxIQImbalance = rOFDM0_XATxIQImbalance;
627 	reg[RF_PATH_B]->rfTxIQImbalance = rOFDM0_XBTxIQImbalance;
628 
629 	reg[RF_PATH_A]->rfTxAFE = rOFDM0_XATxAFE;
630 	reg[RF_PATH_B]->rfTxAFE = rOFDM0_XBTxAFE;
631 
632 	reg[RF_PATH_A]->rfLSSIReadBack = rFPGA0_XA_LSSIReadBack;
633 	reg[RF_PATH_B]->rfLSSIReadBack = rFPGA0_XB_LSSIReadBack;
634 
635 	reg[RF_PATH_A]->rfLSSIReadBackPi = TransceiverA_HSPI_Readback;
636 	reg[RF_PATH_B]->rfLSSIReadBackPi = TransceiverB_HSPI_Readback;
637 }
638 
config_parafile(struct adapter * adapt)639 static bool config_parafile(struct adapter *adapt)
640 {
641 	struct eeprom_priv *eeprom = GET_EEPROM_EFUSE_PRIV(adapt);
642 
643 	set_baseband_phy_config(adapt);
644 
645 	/* If EEPROM or EFUSE autoload OK, We must config by PHY_REG_PG.txt */
646 	if (!eeprom->bautoload_fail_flag) {
647 		adapt->HalData->pwrGroupCnt = 0;
648 		config_bb_with_pgheader(adapt);
649 	}
650 	set_baseband_agc_config(adapt);
651 	return true;
652 }
653 
rtl88eu_phy_bb_config(struct adapter * adapt)654 bool rtl88eu_phy_bb_config(struct adapter *adapt)
655 {
656 	bool rtstatus;
657 	u32 regval;
658 	u8 crystal_cap;
659 
660 	rtl88e_phy_init_bb_rf_register_definition(adapt);
661 
662 	/*  Enable BB and RF */
663 	regval = usb_read16(adapt, REG_SYS_FUNC_EN);
664 	usb_write16(adapt, REG_SYS_FUNC_EN,
665 		    (u16)(regval | BIT(13) | BIT(0) | BIT(1)));
666 
667 	usb_write8(adapt, REG_RF_CTRL, RF_EN | RF_RSTB | RF_SDMRSTB);
668 
669 	usb_write8(adapt, REG_SYS_FUNC_EN, FEN_USBA |
670 		   FEN_USBD | FEN_BB_GLB_RSTn | FEN_BBRSTB);
671 
672 	/*  Config BB and AGC */
673 	rtstatus = config_parafile(adapt);
674 
675 	/*  write 0x24[16:11] = 0x24[22:17] = crystal_cap */
676 	crystal_cap = adapt->HalData->CrystalCap & 0x3F;
677 	phy_set_bb_reg(adapt, REG_AFE_XTAL_CTRL, 0x7ff800,
678 		       (crystal_cap | (crystal_cap << 6)));
679 
680 	return rtstatus;
681 }
682