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