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
check_positive(struct phy_dm_struct * dm,const u32 condition1,const u32 condition2,const u32 condition3,const u32 condition4)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
odm_read_and_config_mp_8822b_mac_reg(struct phy_dm_struct * dm)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
odm_get_version_mp_8822b_mac_reg(void)211 u32 odm_get_version_mp_8822b_mac_reg(void) { return 67; }
212