1 // SPDX-License-Identifier: GPL-2.0
2 /******************************************************************************
4 * Copyright(c) 2007 - 2016 Realtek Corporation.
7 * wlanfae <wlanfae@realtek.com>
8 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
11 * Larry Finger <Larry.Finger@lwfinger.net>
13 *****************************************************************************/
15 /*Image2HeaderVersion: 3.2*/
16 #include "../mp_precomp.h"
17 #include "../phydm_precomp.h"
18 #include <linux/kernel.h>
20 static bool check_positive(struct phy_dm_struct *dm, const u32 condition1,
21 const u32 condition2, const u32 condition3,
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*/
30 u32 cond1 = condition1, cond2 = condition2, cond3 = condition3,
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;
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;
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;
48 u32 driver4 = (dm->type_glna & 0xFF00) >> 8 | (dm->type_gpa & 0xFF00) |
49 (dm->type_alna & 0xFF00) << 8 |
50 (dm->type_apa & 0xFF00) << 16;
54 "===> %s (cond1, cond2, cond3, cond4) = (0x%X 0x%X 0x%X 0x%X)\n",
55 __func__, cond1, cond2, cond3, cond4);
58 "===> %s (driver1, driver2, driver3, driver4) = (0x%X 0x%X 0x%X 0x%X)\n",
59 __func__, driver1, driver2, driver3, driver4);
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);
68 /*============== value Defined Check ===============*/
69 /*QFN type [15:12] and cut version [27:24] need to do value check*/
71 if (((cond1 & 0x0000F000) != 0) &&
72 ((cond1 & 0x0000F000) != (driver1 & 0x0000F000)))
74 if (((cond1 & 0x0F000000) != 0) &&
75 ((cond1 & 0x0F000000) != (driver1 & 0x0F000000)))
78 /*=============== Bit Defined Check ================*/
79 /* We don't care [31:28] */
82 driver1 &= 0x00FF0FFF;
84 if ((cond1 & driver1) == cond1) {
87 if ((cond1 & 0x0F) == 0) /* board_type is DONTCARE*/
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;
99 if (((cond2 & bit_mask) == (driver2 & bit_mask)) &&
100 ((cond4 & bit_mask) ==
102 bit_mask))) /* board_type of each RF path is matched*/
111 /******************************************************************************
113 ******************************************************************************/
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,
161 void odm_read_and_config_mp_8822b_mac_reg(struct phy_dm_struct *dm)
165 bool is_matched = true, is_skipped = false;
166 u32 *array = array_mp_8822b_mac_reg;
168 u32 v1 = 0, v2 = 0, pre_v1 = 0, pre_v2 = 0;
170 ODM_RT_TRACE(dm, ODM_COMP_INIT,
171 "===> %s\n", __func__);
173 for (; (i + 1) < ARRAY_SIZE(array_mp_8822b_mac_reg); i = i + 2) {
177 if (v1 & BIT(31)) { /* positive condition*/
178 c_cond = (u8)((v1 & (BIT(29) | BIT(28))) >> 28);
179 if (c_cond == COND_ENDIF) { /*end*/
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*/
189 ODM_RT_TRACE(dm, ODM_COMP_INIT,
192 } else if (v1 & BIT(30)) { /*negative condition*/
198 if (check_positive(dm, pre_v1, pre_v2, v1, v2)) {
205 } else if (is_matched) {
206 odm_config_mac_8822b(dm, v1, (u8)v2);
211 u32 odm_get_version_mp_8822b_mac_reg(void) { return 67; }