GNU Linux-libre 4.19.245-gnu1
[releases.git] / drivers / staging / rtlwifi / phydm / rtl8822b / halhwimg8822b_mac.c
1 // SPDX-License-Identifier: GPL-2.0
2 /******************************************************************************
3  *
4  * Copyright(c) 2007 - 2016  Realtek Corporation.
5  *
6  * Contact Information:
7  * wlanfae <wlanfae@realtek.com>
8  * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
9  * Hsinchu 300, Taiwan.
10  *
11  * Larry Finger <Larry.Finger@lwfinger.net>
12  *
13  *****************************************************************************/
14
15 /*Image2HeaderVersion: 3.2*/
16 #include "../mp_precomp.h"
17 #include "../phydm_precomp.h"
18 #include <linux/kernel.h>
19
20 static bool check_positive(struct phy_dm_struct *dm, const u32 condition1,
21                            const u32 condition2, const u32 condition3,
22                            const u32 condition4)
23 {
24         u8 _board_type = ((dm->board_type & BIT(4)) >> 4) << 0 | /* _GLNA*/
25                          ((dm->board_type & BIT(3)) >> 3) << 1 | /* _GPA*/
26                          ((dm->board_type & BIT(7)) >> 7) << 2 | /* _ALNA*/
27                          ((dm->board_type & BIT(6)) >> 6) << 3 | /* _APA */
28                          ((dm->board_type & BIT(2)) >> 2) << 4; /* _BT*/
29
30         u32 cond1 = condition1, cond2 = condition2, cond3 = condition3,
31             cond4 = condition4;
32
33         u8 cut_version_for_para =
34                 (dm->cut_version == ODM_CUT_A) ? 14 : dm->cut_version;
35         u8 pkg_type_for_para = (dm->package_type == 0) ? 14 : dm->package_type;
36
37         u32 driver1 = cut_version_for_para << 24 |
38                       (dm->support_interface & 0xF0) << 16 |
39                       dm->support_platform << 16 | pkg_type_for_para << 12 |
40                       (dm->support_interface & 0x0F) << 8 | _board_type;
41
42         u32 driver2 = (dm->type_glna & 0xFF) << 0 | (dm->type_gpa & 0xFF) << 8 |
43                       (dm->type_alna & 0xFF) << 16 |
44                       (dm->type_apa & 0xFF) << 24;
45
46         u32 driver3 = 0;
47
48         u32 driver4 = (dm->type_glna & 0xFF00) >> 8 | (dm->type_gpa & 0xFF00) |
49                       (dm->type_alna & 0xFF00) << 8 |
50                       (dm->type_apa & 0xFF00) << 16;
51
52         ODM_RT_TRACE(
53                 dm, ODM_COMP_INIT,
54                 "===> %s (cond1, cond2, cond3, cond4) = (0x%X 0x%X 0x%X 0x%X)\n",
55                 __func__, cond1, cond2, cond3, cond4);
56         ODM_RT_TRACE(
57                 dm, ODM_COMP_INIT,
58                 "===> %s (driver1, driver2, driver3, driver4) = (0x%X 0x%X 0x%X 0x%X)\n",
59                 __func__, driver1, driver2, driver3, driver4);
60
61         ODM_RT_TRACE(dm, ODM_COMP_INIT,
62                      "  (Platform, Interface) = (0x%X, 0x%X)\n",
63                      dm->support_platform, dm->support_interface);
64         ODM_RT_TRACE(dm, ODM_COMP_INIT,
65                      "  (Board, Package) = (0x%X, 0x%X)\n",
66                      dm->board_type, dm->package_type);
67
68         /*============== value Defined Check ===============*/
69         /*QFN type [15:12] and cut version [27:24] need to do value check*/
70
71         if (((cond1 & 0x0000F000) != 0) &&
72             ((cond1 & 0x0000F000) != (driver1 & 0x0000F000)))
73                 return false;
74         if (((cond1 & 0x0F000000) != 0) &&
75             ((cond1 & 0x0F000000) != (driver1 & 0x0F000000)))
76                 return false;
77
78         /*=============== Bit Defined Check ================*/
79         /* We don't care [31:28] */
80
81         cond1 &= 0x00FF0FFF;
82         driver1 &= 0x00FF0FFF;
83
84         if ((cond1 & driver1) == cond1) {
85                 u32 bit_mask = 0;
86
87                 if ((cond1 & 0x0F) == 0) /* board_type is DONTCARE*/
88                         return true;
89
90                 if ((cond1 & BIT(0)) != 0) /*GLNA*/
91                         bit_mask |= 0x000000FF;
92                 if ((cond1 & BIT(1)) != 0) /*GPA*/
93                         bit_mask |= 0x0000FF00;
94                 if ((cond1 & BIT(2)) != 0) /*ALNA*/
95                         bit_mask |= 0x00FF0000;
96                 if ((cond1 & BIT(3)) != 0) /*APA*/
97                         bit_mask |= 0xFF000000;
98
99                 if (((cond2 & bit_mask) == (driver2 & bit_mask)) &&
100                     ((cond4 & bit_mask) ==
101                      (driver4 &
102                       bit_mask))) /* board_type of each RF path is matched*/
103                         return true;
104                 else
105                         return false;
106         } else {
107                 return false;
108         }
109 }
110
111 /******************************************************************************
112  *                           mac_reg.TXT
113  ******************************************************************************/
114
115 static u32 array_mp_8822b_mac_reg[] = {
116         0x029,  0x000000F9, 0x420,  0x00000080, 0x421,  0x0000000F,
117         0x428,  0x0000000A, 0x429,  0x00000010, 0x430,  0x00000000,
118         0x431,  0x00000000, 0x432,  0x00000000, 0x433,  0x00000001,
119         0x434,  0x00000004, 0x435,  0x00000005, 0x436,  0x00000007,
120         0x437,  0x00000008, 0x43C,  0x00000004, 0x43D,  0x00000005,
121         0x43E,  0x00000007, 0x43F,  0x00000008, 0x440,  0x0000005D,
122         0x441,  0x00000001, 0x442,  0x00000000, 0x444,  0x00000010,
123         0x445,  0x000000F0, 0x446,  0x00000001, 0x447,  0x000000FE,
124         0x448,  0x00000000, 0x449,  0x00000000, 0x44A,  0x00000000,
125         0x44B,  0x00000040, 0x44C,  0x00000010, 0x44D,  0x000000F0,
126         0x44E,  0x0000003F, 0x44F,  0x00000000, 0x450,  0x00000000,
127         0x451,  0x00000000, 0x452,  0x00000000, 0x453,  0x00000040,
128         0x455,  0x00000070, 0x45E,  0x00000004, 0x49C,  0x00000010,
129         0x49D,  0x000000F0, 0x49E,  0x00000000, 0x49F,  0x00000006,
130         0x4A0,  0x000000E0, 0x4A1,  0x00000003, 0x4A2,  0x00000000,
131         0x4A3,  0x00000040, 0x4A4,  0x00000015, 0x4A5,  0x000000F0,
132         0x4A6,  0x00000000, 0x4A7,  0x00000006, 0x4A8,  0x000000E0,
133         0x4A9,  0x00000000, 0x4AA,  0x00000000, 0x4AB,  0x00000000,
134         0x7DA,  0x00000008, 0x1448, 0x00000006, 0x144A, 0x00000006,
135         0x144C, 0x00000006, 0x144E, 0x00000006, 0x4C8,  0x000000FF,
136         0x4C9,  0x00000008, 0x4CA,  0x00000020, 0x4CB,  0x00000020,
137         0x4CC,  0x000000FF, 0x4CD,  0x000000FF, 0x4CE,  0x00000001,
138         0x4CF,  0x00000008, 0x500,  0x00000026, 0x501,  0x000000A2,
139         0x502,  0x0000002F, 0x503,  0x00000000, 0x504,  0x00000028,
140         0x505,  0x000000A3, 0x506,  0x0000005E, 0x507,  0x00000000,
141         0x508,  0x0000002B, 0x509,  0x000000A4, 0x50A,  0x0000005E,
142         0x50B,  0x00000000, 0x50C,  0x0000004F, 0x50D,  0x000000A4,
143         0x50E,  0x00000000, 0x50F,  0x00000000, 0x512,  0x0000001C,
144         0x514,  0x0000000A, 0x516,  0x0000000A, 0x521,  0x0000002F,
145         0x525,  0x0000004F, 0x551,  0x00000010, 0x559,  0x00000002,
146         0x55C,  0x00000050, 0x55D,  0x000000FF, 0x577,  0x0000000B,
147         0x5BE,  0x00000064, 0x605,  0x00000030, 0x608,  0x0000000E,
148         0x609,  0x00000022, 0x60C,  0x00000018, 0x6A0,  0x000000FF,
149         0x6A1,  0x000000FF, 0x6A2,  0x000000FF, 0x6A3,  0x000000FF,
150         0x6A4,  0x000000FF, 0x6A5,  0x000000FF, 0x6DE,  0x00000084,
151         0x620,  0x000000FF, 0x621,  0x000000FF, 0x622,  0x000000FF,
152         0x623,  0x000000FF, 0x624,  0x000000FF, 0x625,  0x000000FF,
153         0x626,  0x000000FF, 0x627,  0x000000FF, 0x638,  0x00000050,
154         0x63C,  0x0000000A, 0x63D,  0x0000000A, 0x63E,  0x0000000E,
155         0x63F,  0x0000000E, 0x640,  0x00000040, 0x642,  0x00000040,
156         0x643,  0x00000000, 0x652,  0x000000C8, 0x66E,  0x00000005,
157         0x718,  0x00000040, 0x7D4,  0x00000098,
158
159 };
160
161 void odm_read_and_config_mp_8822b_mac_reg(struct phy_dm_struct *dm)
162 {
163         u32 i = 0;
164         u8 c_cond;
165         bool is_matched = true, is_skipped = false;
166         u32 *array = array_mp_8822b_mac_reg;
167
168         u32 v1 = 0, v2 = 0, pre_v1 = 0, pre_v2 = 0;
169
170         ODM_RT_TRACE(dm, ODM_COMP_INIT,
171                      "===> %s\n", __func__);
172
173         for (; (i + 1) < ARRAY_SIZE(array_mp_8822b_mac_reg); i = i + 2) {
174                 v1 = array[i];
175                 v2 = array[i + 1];
176
177                 if (v1 & BIT(31)) { /* positive condition*/
178                         c_cond = (u8)((v1 & (BIT(29) | BIT(28))) >> 28);
179                         if (c_cond == COND_ENDIF) { /*end*/
180                                 is_matched = true;
181                                 is_skipped = false;
182                                 ODM_RT_TRACE(dm, ODM_COMP_INIT, "ENDIF\n");
183                         } else if (c_cond == COND_ELSE) { /*else*/
184                                 is_matched = is_skipped ? false : true;
185                                 ODM_RT_TRACE(dm, ODM_COMP_INIT, "ELSE\n");
186                         } else { /*if , else if*/
187                                 pre_v1 = v1;
188                                 pre_v2 = v2;
189                                 ODM_RT_TRACE(dm, ODM_COMP_INIT,
190                                              "IF or ELSE IF\n");
191                         }
192                 } else if (v1 & BIT(30)) { /*negative condition*/
193                         if (is_skipped) {
194                                 is_matched = false;
195                                 continue;
196                         }
197
198                         if (check_positive(dm, pre_v1, pre_v2, v1, v2)) {
199                                 is_matched = true;
200                                 is_skipped = true;
201                         } else {
202                                 is_matched = false;
203                                 is_skipped = false;
204                         }
205                 } else if (is_matched) {
206                         odm_config_mac_8822b(dm, v1, (u8)v2);
207                 }
208         }
209 }
210
211 u32 odm_get_version_mp_8822b_mac_reg(void) { return 67; }