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