1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright(c) 2007 - 2011 Realtek Corporation. */
3 
4 #include "../include/odm_precomp.h"
5 #include "../include/rtw_iol.h"
6 
CheckCondition(const u32 Condition,const u32 Hex)7 static bool CheckCondition(const u32  Condition, const u32  Hex)
8 {
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 & 0x0000FF00;
17 	cond = cond >> 8;
18 	if ((_interface & cond) == 0 && cond != 0x07)
19 		return false;
20 
21 	cond = Condition & 0x00FF0000;
22 	cond = cond >> 16;
23 	if ((_platform & cond) == 0 && cond != 0x0F)
24 		return false;
25 	return true;
26 }
27 
28 /******************************************************************************
29 *                           RadioA_1T.TXT
30 ******************************************************************************/
31 
32 static u32 Array_RadioA_1T_8188E[] = {
33 		0x000, 0x00030000,
34 		0x008, 0x00084000,
35 		0x018, 0x00000407,
36 		0x019, 0x00000012,
37 		0x01E, 0x00080009,
38 		0x01F, 0x00000880,
39 		0x02F, 0x0001A060,
40 		0x03F, 0x00000000,
41 		0x042, 0x000060C0,
42 		0x057, 0x000D0000,
43 		0x058, 0x000BE180,
44 		0x067, 0x00001552,
45 		0x083, 0x00000000,
46 		0x0B0, 0x000FF8FC,
47 		0x0B1, 0x00054400,
48 		0x0B2, 0x000CCC19,
49 		0x0B4, 0x00043003,
50 		0x0B6, 0x0004953E,
51 		0x0B7, 0x0001C718,
52 		0x0B8, 0x000060FF,
53 		0x0B9, 0x00080001,
54 		0x0BA, 0x00040000,
55 		0x0BB, 0x00000400,
56 		0x0BF, 0x000C0000,
57 		0x0C2, 0x00002400,
58 		0x0C3, 0x00000009,
59 		0x0C4, 0x00040C91,
60 		0x0C5, 0x00099999,
61 		0x0C6, 0x000000A3,
62 		0x0C7, 0x00088820,
63 		0x0C8, 0x00076C06,
64 		0x0C9, 0x00000000,
65 		0x0CA, 0x00080000,
66 		0x0DF, 0x00000180,
67 		0x0EF, 0x000001A0,
68 		0x051, 0x0006B27D,
69 		0xFF0F041F, 0xABCD,
70 		0x052, 0x0007E4DD,
71 		0xCDCDCDCD, 0xCDCD,
72 		0x052, 0x0007E49D,
73 		0xFF0F041F, 0xDEAD,
74 		0x053, 0x00000073,
75 		0x056, 0x00051FF3,
76 		0x035, 0x00000086,
77 		0x035, 0x00000186,
78 		0x035, 0x00000286,
79 		0x036, 0x00001C25,
80 		0x036, 0x00009C25,
81 		0x036, 0x00011C25,
82 		0x036, 0x00019C25,
83 		0x0B6, 0x00048538,
84 		0x018, 0x00000C07,
85 		0x05A, 0x0004BD00,
86 		0x019, 0x000739D0,
87 		0x034, 0x0000ADF3,
88 		0x034, 0x00009DF0,
89 		0x034, 0x00008DED,
90 		0x034, 0x00007DEA,
91 		0x034, 0x00006DE7,
92 		0x034, 0x000054EE,
93 		0x034, 0x000044EB,
94 		0x034, 0x000034E8,
95 		0x034, 0x0000246B,
96 		0x034, 0x00001468,
97 		0x034, 0x0000006D,
98 		0x000, 0x00030159,
99 		0x084, 0x00068200,
100 		0x086, 0x000000CE,
101 		0x087, 0x00048A00,
102 		0x08E, 0x00065540,
103 		0x08F, 0x00088000,
104 		0x0EF, 0x000020A0,
105 		0x03B, 0x000F02B0,
106 		0x03B, 0x000EF7B0,
107 		0x03B, 0x000D4FB0,
108 		0x03B, 0x000CF060,
109 		0x03B, 0x000B0090,
110 		0x03B, 0x000A0080,
111 		0x03B, 0x00090080,
112 		0x03B, 0x0008F780,
113 		0x03B, 0x000722B0,
114 		0x03B, 0x0006F7B0,
115 		0x03B, 0x00054FB0,
116 		0x03B, 0x0004F060,
117 		0x03B, 0x00030090,
118 		0x03B, 0x00020080,
119 		0x03B, 0x00010080,
120 		0x03B, 0x0000F780,
121 		0x0EF, 0x000000A0,
122 		0x000, 0x00010159,
123 		0x018, 0x0000F407,
124 		0xFFE, 0x00000000,
125 		0xFFE, 0x00000000,
126 		0x01F, 0x00080003,
127 		0xFFE, 0x00000000,
128 		0xFFE, 0x00000000,
129 		0x01E, 0x00000001,
130 		0x01F, 0x00080000,
131 		0x000, 0x00033E60,
132 };
133 
ODM_ReadAndConfig_RadioA_1T_8188E(struct odm_dm_struct * pDM_Odm)134 enum HAL_STATUS ODM_ReadAndConfig_RadioA_1T_8188E(struct odm_dm_struct *pDM_Odm)
135 {
136 	#define READ_NEXT_PAIR(v1, v2, i) do	\
137 		 { i += 2; v1 = Array[i];	\
138 		 v2 = Array[i + 1]; } while (0)
139 
140 	u32     hex         = 0;
141 	u32     i           = 0;
142 	u32     ArrayLen    = sizeof(Array_RadioA_1T_8188E) / sizeof(u32);
143 	u32    *Array       = Array_RadioA_1T_8188E;
144 	bool		biol = false;
145 	struct adapter *Adapter =  pDM_Odm->Adapter;
146 	struct xmit_frame *pxmit_frame = NULL;
147 	u8 bndy_cnt = 1;
148 	enum HAL_STATUS rst = HAL_STATUS_SUCCESS;
149 
150 	hex += ODM_ITRF_USB << 8;
151 	hex += ODM_CE << 16;
152 	hex += 0xFF000000;
153 	biol = rtw_IOL_applied(Adapter);
154 
155 	if (biol) {
156 		pxmit_frame = rtw_IOL_accquire_xmit_frame(Adapter);
157 		if (!pxmit_frame) {
158 			pr_info("rtw_IOL_accquire_xmit_frame failed\n");
159 			return HAL_STATUS_FAILURE;
160 		}
161 	}
162 
163 	for (i = 0; i < ArrayLen; i += 2) {
164 		u32 v1 = Array[i];
165 		u32 v2 = Array[i + 1];
166 
167 		/*  This (offset, data) pair meets the condition. */
168 		if (v1 < 0xCDCDCDCD) {
169 			if (biol) {
170 				if (rtw_IOL_cmd_boundary_handle(pxmit_frame))
171 					bndy_cnt++;
172 
173 				if (v1 == 0xffe)
174 					rtw_IOL_append_DELAY_MS_cmd(pxmit_frame, 50);
175 				else if (v1 == 0xfd)
176 					rtw_IOL_append_DELAY_MS_cmd(pxmit_frame, 5);
177 				else if (v1 == 0xfc)
178 					rtw_IOL_append_DELAY_MS_cmd(pxmit_frame, 1);
179 				else if (v1 == 0xfb)
180 					rtw_IOL_append_DELAY_US_cmd(pxmit_frame, 50);
181 				else if (v1 == 0xfa)
182 					rtw_IOL_append_DELAY_US_cmd(pxmit_frame, 5);
183 				else if (v1 == 0xf9)
184 					rtw_IOL_append_DELAY_US_cmd(pxmit_frame, 1);
185 				else
186 					rtw_IOL_append_WRF_cmd(pxmit_frame, RF_PATH_A, (u16)v1, v2, bRFRegOffsetMask);
187 			} else {
188 				odm_ConfigRF_RadioA_8188E(pDM_Odm, v1, v2);
189 			}
190 			continue;
191 		} else { /*  This line is the start line of branch. */
192 			if (!CheckCondition(Array[i], hex)) {
193 				/*  Discard the following (offset, data) pairs. */
194 				READ_NEXT_PAIR(v1, v2, i);
195 				while (v2 != 0xDEAD &&
196 				       v2 != 0xCDEF &&
197 				       v2 != 0xCDCD && i < ArrayLen - 2)
198 					READ_NEXT_PAIR(v1, v2, i);
199 				i -= 2; /*  prevent from for-loop += 2 */
200 			} else { /*  Configure matched pairs and skip to end of if-else. */
201 			READ_NEXT_PAIR(v1, v2, i);
202 				while (v2 != 0xDEAD &&
203 				       v2 != 0xCDEF &&
204 				       v2 != 0xCDCD && i < ArrayLen - 2) {
205 					if (biol) {
206 						if (rtw_IOL_cmd_boundary_handle(pxmit_frame))
207 							bndy_cnt++;
208 
209 						if (v1 == 0xffe)
210 							rtw_IOL_append_DELAY_MS_cmd(pxmit_frame, 50);
211 						else if (v1 == 0xfd)
212 							rtw_IOL_append_DELAY_MS_cmd(pxmit_frame, 5);
213 						else if (v1 == 0xfc)
214 							rtw_IOL_append_DELAY_MS_cmd(pxmit_frame, 1);
215 						else if (v1 == 0xfb)
216 							rtw_IOL_append_DELAY_US_cmd(pxmit_frame, 50);
217 						else if (v1 == 0xfa)
218 							rtw_IOL_append_DELAY_US_cmd(pxmit_frame, 5);
219 						else if (v1 == 0xf9)
220 							rtw_IOL_append_DELAY_US_cmd(pxmit_frame, 1);
221 						else
222 							rtw_IOL_append_WRF_cmd(pxmit_frame, RF_PATH_A, (u16)v1, v2, bRFRegOffsetMask);
223 					} else {
224 						odm_ConfigRF_RadioA_8188E(pDM_Odm, v1, v2);
225 					}
226 					READ_NEXT_PAIR(v1, v2, i);
227 				}
228 
229 				while (v2 != 0xDEAD && i < ArrayLen - 2)
230 					READ_NEXT_PAIR(v1, v2, i);
231 			}
232 		}
233 	}
234 	if (biol) {
235 		if (!rtl8188e_IOL_exec_cmds_sync(pDM_Odm->Adapter, pxmit_frame, 1000, bndy_cnt)) {
236 			rst = HAL_STATUS_FAILURE;
237 			pr_info("~~~ IOL Config %s Failed !!!\n", __func__);
238 		}
239 	}
240 	return rst;
241 }
242