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