1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright(c) 2007 - 2011 Realtek Corporation. */
4 #include "../include/odm_precomp.h"
5 #include "../include/rtw_iol.h"
7 static bool CheckCondition(const u32 Condition, const u32 Hex)
9 u32 _board = (Hex & 0x000000FF);
10 u32 _interface = (Hex & 0x0000FF00) >> 8;
11 u32 _platform = (Hex & 0x00FF0000) >> 16;
14 if (Condition == 0xCDCDCDCD)
17 cond = Condition & 0x000000FF;
18 if ((_board == cond) && cond != 0x00)
21 cond = Condition & 0x0000FF00;
23 if ((_interface & cond) == 0 && cond != 0x07)
26 cond = Condition & 0x00FF0000;
28 if ((_platform & cond) == 0 && cond != 0x0F)
33 /******************************************************************************
35 ******************************************************************************/
37 static u32 Array_RadioA_1T_8188E[] = {
139 enum HAL_STATUS ODM_ReadAndConfig_RadioA_1T_8188E(struct odm_dm_struct *pDM_Odm)
141 #define READ_NEXT_PAIR(v1, v2, i) do \
142 { i += 2; v1 = Array[i]; \
143 v2 = Array[i + 1]; } while (0)
147 u8 platform = pDM_Odm->SupportPlatform;
148 u8 interfaceValue = pDM_Odm->SupportInterface;
149 u8 board = pDM_Odm->BoardType;
150 u32 ArrayLen = sizeof(Array_RadioA_1T_8188E) / sizeof(u32);
151 u32 *Array = Array_RadioA_1T_8188E;
153 struct adapter *Adapter = pDM_Odm->Adapter;
154 struct xmit_frame *pxmit_frame = NULL;
156 enum HAL_STATUS rst = HAL_STATUS_SUCCESS;
159 hex += interfaceValue << 8;
160 hex += platform << 16;
162 biol = rtw_IOL_applied(Adapter);
165 pxmit_frame = rtw_IOL_accquire_xmit_frame(Adapter);
167 pr_info("rtw_IOL_accquire_xmit_frame failed\n");
168 return HAL_STATUS_FAILURE;
172 for (i = 0; i < ArrayLen; i += 2) {
174 u32 v2 = Array[i + 1];
176 /* This (offset, data) pair meets the condition. */
177 if (v1 < 0xCDCDCDCD) {
179 if (rtw_IOL_cmd_boundary_handle(pxmit_frame))
183 rtw_IOL_append_DELAY_MS_cmd(pxmit_frame, 50);
185 rtw_IOL_append_DELAY_MS_cmd(pxmit_frame, 5);
187 rtw_IOL_append_DELAY_MS_cmd(pxmit_frame, 1);
189 rtw_IOL_append_DELAY_US_cmd(pxmit_frame, 50);
191 rtw_IOL_append_DELAY_US_cmd(pxmit_frame, 5);
193 rtw_IOL_append_DELAY_US_cmd(pxmit_frame, 1);
195 rtw_IOL_append_WRF_cmd(pxmit_frame, RF_PATH_A, (u16)v1, v2, bRFRegOffsetMask);
197 odm_ConfigRF_RadioA_8188E(pDM_Odm, v1, v2);
200 } else { /* This line is the start line of branch. */
201 if (!CheckCondition(Array[i], hex)) {
202 /* Discard the following (offset, data) pairs. */
203 READ_NEXT_PAIR(v1, v2, i);
204 while (v2 != 0xDEAD &&
206 v2 != 0xCDCD && i < ArrayLen - 2)
207 READ_NEXT_PAIR(v1, v2, i);
208 i -= 2; /* prevent from for-loop += 2 */
209 } else { /* Configure matched pairs and skip to end of if-else. */
210 READ_NEXT_PAIR(v1, v2, i);
211 while (v2 != 0xDEAD &&
213 v2 != 0xCDCD && i < ArrayLen - 2) {
215 if (rtw_IOL_cmd_boundary_handle(pxmit_frame))
219 rtw_IOL_append_DELAY_MS_cmd(pxmit_frame, 50);
221 rtw_IOL_append_DELAY_MS_cmd(pxmit_frame, 5);
223 rtw_IOL_append_DELAY_MS_cmd(pxmit_frame, 1);
225 rtw_IOL_append_DELAY_US_cmd(pxmit_frame, 50);
227 rtw_IOL_append_DELAY_US_cmd(pxmit_frame, 5);
229 rtw_IOL_append_DELAY_US_cmd(pxmit_frame, 1);
231 rtw_IOL_append_WRF_cmd(pxmit_frame, RF_PATH_A, (u16)v1, v2, bRFRegOffsetMask);
233 odm_ConfigRF_RadioA_8188E(pDM_Odm, v1, v2);
235 READ_NEXT_PAIR(v1, v2, i);
238 while (v2 != 0xDEAD && i < ArrayLen - 2)
239 READ_NEXT_PAIR(v1, v2, i);
244 if (!rtw_IOL_exec_cmds_sync(pDM_Odm->Adapter, pxmit_frame, 1000, bndy_cnt)) {
245 rst = HAL_STATUS_FAILURE;
246 pr_info("~~~ IOL Config %s Failed !!!\n", __func__);