1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright(c) 2007 - 2011 Realtek Corporation. */
3 
4 #include "../include/rtw_iol.h"
5 
Checkcondition(const u32 condition,const u32 hex)6 static bool Checkcondition(const u32  condition, const u32  hex)
7 {
8 	u32 _board     = (hex & 0x000000FF);
9 	u32 _interface = (hex & 0x0000FF00) >> 8;
10 	u32 _platform  = (hex & 0x00FF0000) >> 16;
11 	u32 cond = condition;
12 
13 	if (condition == 0xCDCDCDCD)
14 		return true;
15 
16 	cond = condition & 0x000000FF;
17 	if ((_board == cond) && cond != 0x00)
18 		return false;
19 
20 	cond = condition & 0x0000FF00;
21 	cond = cond >> 8;
22 	if ((_interface & cond) == 0 && cond != 0x07)
23 		return false;
24 
25 	cond = condition & 0x00FF0000;
26 	cond = cond >> 16;
27 	if ((_platform & cond) == 0 && cond != 0x0F)
28 		return false;
29 	return true;
30 }
31 
32 /******************************************************************************
33 *                           MAC_REG.TXT
34 ******************************************************************************/
35 
36 static u32 array_MAC_REG_8188E[] = {
37 		0x026, 0x00000041,
38 		0x027, 0x00000035,
39 		0x428, 0x0000000A,
40 		0x429, 0x00000010,
41 		0x430, 0x00000000,
42 		0x431, 0x00000001,
43 		0x432, 0x00000002,
44 		0x433, 0x00000004,
45 		0x434, 0x00000005,
46 		0x435, 0x00000006,
47 		0x436, 0x00000007,
48 		0x437, 0x00000008,
49 		0x438, 0x00000000,
50 		0x439, 0x00000000,
51 		0x43A, 0x00000001,
52 		0x43B, 0x00000002,
53 		0x43C, 0x00000004,
54 		0x43D, 0x00000005,
55 		0x43E, 0x00000006,
56 		0x43F, 0x00000007,
57 		0x440, 0x0000005D,
58 		0x441, 0x00000001,
59 		0x442, 0x00000000,
60 		0x444, 0x00000015,
61 		0x445, 0x000000F0,
62 		0x446, 0x0000000F,
63 		0x447, 0x00000000,
64 		0x458, 0x00000041,
65 		0x459, 0x000000A8,
66 		0x45A, 0x00000072,
67 		0x45B, 0x000000B9,
68 		0x460, 0x00000066,
69 		0x461, 0x00000066,
70 		0x480, 0x00000008,
71 		0x4C8, 0x000000FF,
72 		0x4C9, 0x00000008,
73 		0x4CC, 0x000000FF,
74 		0x4CD, 0x000000FF,
75 		0x4CE, 0x00000001,
76 		0x4D3, 0x00000001,
77 		0x500, 0x00000026,
78 		0x501, 0x000000A2,
79 		0x502, 0x0000002F,
80 		0x503, 0x00000000,
81 		0x504, 0x00000028,
82 		0x505, 0x000000A3,
83 		0x506, 0x0000005E,
84 		0x507, 0x00000000,
85 		0x508, 0x0000002B,
86 		0x509, 0x000000A4,
87 		0x50A, 0x0000005E,
88 		0x50B, 0x00000000,
89 		0x50C, 0x0000004F,
90 		0x50D, 0x000000A4,
91 		0x50E, 0x00000000,
92 		0x50F, 0x00000000,
93 		0x512, 0x0000001C,
94 		0x514, 0x0000000A,
95 		0x516, 0x0000000A,
96 		0x525, 0x0000004F,
97 		0x550, 0x00000010,
98 		0x551, 0x00000010,
99 		0x559, 0x00000002,
100 		0x55D, 0x000000FF,
101 		0x605, 0x00000030,
102 		0x608, 0x0000000E,
103 		0x609, 0x0000002A,
104 		0x620, 0x000000FF,
105 		0x621, 0x000000FF,
106 		0x622, 0x000000FF,
107 		0x623, 0x000000FF,
108 		0x624, 0x000000FF,
109 		0x625, 0x000000FF,
110 		0x626, 0x000000FF,
111 		0x627, 0x000000FF,
112 		0x652, 0x00000020,
113 		0x63C, 0x0000000A,
114 		0x63D, 0x0000000A,
115 		0x63E, 0x0000000E,
116 		0x63F, 0x0000000E,
117 		0x640, 0x00000040,
118 		0x66E, 0x00000005,
119 		0x700, 0x00000021,
120 		0x701, 0x00000043,
121 		0x702, 0x00000065,
122 		0x703, 0x00000087,
123 		0x708, 0x00000021,
124 		0x709, 0x00000043,
125 		0x70A, 0x00000065,
126 		0x70B, 0x00000087,
127 };
128 
ODM_ReadAndConfig_MAC_REG_8188E(struct odm_dm_struct * dm_odm)129 enum HAL_STATUS ODM_ReadAndConfig_MAC_REG_8188E(struct odm_dm_struct *dm_odm)
130 {
131 	#define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = array[i]; v2 = array[i + 1]; } while (0)
132 
133 	u32     hex         = 0;
134 	u32     i;
135 	u32     array_len    = ARRAY_SIZE(array_MAC_REG_8188E);
136 	u32    *array       = array_MAC_REG_8188E;
137 	bool	biol = false;
138 
139 	struct adapter *adapt =  dm_odm->Adapter;
140 	struct xmit_frame	*pxmit_frame = NULL;
141 	u8 bndy_cnt = 1;
142 	enum HAL_STATUS rst = HAL_STATUS_SUCCESS;
143 	hex += ODM_ITRF_USB << 8;
144 	hex += ODM_CE << 16;
145 	hex += 0xFF000000;
146 
147 	biol = rtw_IOL_applied(adapt);
148 
149 	if (biol) {
150 		pxmit_frame = rtw_IOL_accquire_xmit_frame(adapt);
151 		if (!pxmit_frame) {
152 			pr_info("rtw_IOL_accquire_xmit_frame failed\n");
153 			return HAL_STATUS_FAILURE;
154 		}
155 	}
156 
157 	for (i = 0; i < array_len; i += 2) {
158 		u32 v1 = array[i];
159 		u32 v2 = array[i + 1];
160 
161 		/*  This (offset, data) pair meets the condition. */
162 		if (v1 < 0xCDCDCDCD) {
163 				if (biol) {
164 					if (rtw_IOL_cmd_boundary_handle(pxmit_frame))
165 						bndy_cnt++;
166 					rtw_IOL_append_WB_cmd(pxmit_frame, (u16)v1, (u8)v2, 0xFF);
167 				} else {
168 					odm_ConfigMAC_8188E(dm_odm, v1, (u8)v2);
169 				}
170 				continue;
171 		} else { /*  This line is the start line of branch. */
172 			if (!Checkcondition(array[i], hex)) {
173 				/*  Discard the following (offset, data) pairs. */
174 				READ_NEXT_PAIR(v1, v2, i);
175 				while (v2 != 0xDEAD &&
176 				       v2 != 0xCDEF &&
177 				       v2 != 0xCDCD && i < array_len - 2) {
178 					READ_NEXT_PAIR(v1, v2, i);
179 				}
180 				i -= 2; /*  prevent from for-loop += 2 */
181 			} else { /*  Configure matched pairs and skip to end of if-else. */
182 				READ_NEXT_PAIR(v1, v2, i);
183 				while (v2 != 0xDEAD &&
184 				       v2 != 0xCDEF &&
185 				       v2 != 0xCDCD && i < array_len - 2) {
186 					if (biol) {
187 						if (rtw_IOL_cmd_boundary_handle(pxmit_frame))
188 							bndy_cnt++;
189 						rtw_IOL_append_WB_cmd(pxmit_frame, (u16)v1, (u8)v2, 0xFF);
190 					} else {
191 						odm_ConfigMAC_8188E(dm_odm, v1, (u8)v2);
192 					}
193 
194 					READ_NEXT_PAIR(v1, v2, i);
195 				}
196 				while (v2 != 0xDEAD && i < array_len - 2)
197 					READ_NEXT_PAIR(v1, v2, i);
198 			}
199 		}
200 	}
201 	if (biol) {
202 		if (!rtl8188e_IOL_exec_cmds_sync(dm_odm->Adapter, pxmit_frame, 1000, bndy_cnt)) {
203 			pr_info("~~~ MAC IOL_exec_cmds Failed !!!\n");
204 			rst = HAL_STATUS_FAILURE;
205 		}
206 	}
207 	return rst;
208 }
209