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