1 /******************************************************************************
\r
3 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
\r
5 * This program is free software; you can redistribute it and/or modify it
\r
6 * under the terms of version 2 of the GNU General Public License as
\r
7 * published by the Free Software Foundation.
\r
9 * This program is distributed in the hope that it will be useful, but WITHOUT
\r
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
\r
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
\r
14 * You should have received a copy of the GNU General Public License along with
\r
15 * this program; if not, write to the Free Software Foundation, Inc.,
\r
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
\r
19 ******************************************************************************/
\r
22 #include "../odm_precomp.h"
\r
23 #ifdef CONFIG_IOL_IOREG_CFG
\r
24 #include <rtw_iol.h>
\r
26 #if (RTL8188E_SUPPORT == 1)
\r
29 const u4Byte Condition,
\r
33 u4Byte _board = (Hex & 0x000000FF);
\r
34 u4Byte _interface = (Hex & 0x0000FF00) >> 8;
\r
35 u4Byte _platform = (Hex & 0x00FF0000) >> 16;
\r
36 u4Byte cond = Condition;
\r
38 if ( Condition == 0xCDCDCDCD )
\r
41 cond = Condition & 0x000000FF;
\r
42 if ( (_board != cond) && (cond != 0xFF) )
\r
45 cond = Condition & 0x0000FF00;
\r
47 if ( ((_interface & cond) == 0) && (cond != 0x07) )
\r
50 cond = Condition & 0x00FF0000;
\r
52 if ( ((_platform & cond) == 0) && (cond != 0x0F) )
\r
58 /******************************************************************************
\r
60 ******************************************************************************/
\r
62 u4Byte Array_MP_8188E_MAC_REG[] = {
\r
162 ODM_ReadAndConfig_MP_8188E_MAC_REG(
\r
163 IN PDM_ODM_T pDM_Odm
\r
166 #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0)
\r
171 pu4Byte ptr_array = NULL;
\r
172 u1Byte platform = pDM_Odm->SupportPlatform;
\r
173 u1Byte _interface = pDM_Odm->SupportInterface;
\r
174 u1Byte board = pDM_Odm->BoardType;
\r
175 u4Byte ArrayLen = sizeof(Array_MP_8188E_MAC_REG)/sizeof(u4Byte);
\r
176 pu4Byte Array = Array_MP_8188E_MAC_REG;
\r
177 BOOLEAN biol = FALSE;
\r
179 #ifdef CONFIG_IOL_IOREG_CFG
\r
180 PADAPTER Adapter = pDM_Odm->Adapter;
\r
181 struct xmit_frame *pxmit_frame;
\r
183 #ifdef CONFIG_IOL_IOREG_CFG_DBG
\r
184 struct cmd_cmp cmpdata[ArrayLen];
\r
185 u4Byte cmpdata_idx=0;
\r
187 #endif //CONFIG_IOL_IOREG_CFG
\r
188 HAL_STATUS rst =HAL_STATUS_SUCCESS;
\r
191 hex += _interface << 8;
\r
192 hex += platform << 16;
\r
194 ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8188E_MAC_REG, hex = 0x%X\n", hex));
\r
196 #ifdef CONFIG_IOL_IOREG_CFG
\r
197 biol = rtw_IOL_applied(Adapter);
\r
200 if((pxmit_frame=rtw_IOL_accquire_xmit_frame(Adapter)) == NULL)
\r
202 printk("rtw_IOL_accquire_xmit_frame failed\n");
\r
203 return HAL_STATUS_FAILURE;
\r
207 #endif //CONFIG_IOL_IOREG_CFG
\r
208 for (i = 0; i < ArrayLen; i += 2 )
\r
210 u4Byte v1 = Array[i];
\r
211 u4Byte v2 = Array[i+1];
\r
213 // This (offset, data) pair meets the condition.
\r
214 if ( v1 < 0xCDCDCDCD )
\r
216 #ifdef CONFIG_IOL_IOREG_CFG
\r
220 if(rtw_IOL_cmd_boundary_handle(pxmit_frame))
\r
222 rtw_IOL_append_WB_cmd(pxmit_frame,(u2Byte)v1, (u1Byte)v2,0xFF);
\r
223 #ifdef CONFIG_IOL_IOREG_CFG_DBG
\r
224 cmpdata[cmpdata_idx].addr = v1;
\r
225 cmpdata[cmpdata_idx].value= v2;
\r
230 #endif //endif CONFIG_IOL_IOREG_CFG
\r
232 odm_ConfigMAC_8188E(pDM_Odm, v1, (u1Byte)v2);
\r
237 { // This line is the start line of branch.
\r
238 if ( !CheckCondition(Array[i], hex) )
\r
239 { // Discard the following (offset, data) pairs.
\r
240 READ_NEXT_PAIR(v1, v2, i);
\r
241 while (v2 != 0xDEAD &&
\r
243 v2 != 0xCDCD && i < ArrayLen -2)
\r
245 READ_NEXT_PAIR(v1, v2, i);
\r
247 i -= 2; // prevent from for-loop += 2
\r
249 else // Configure matched pairs and skip to end of if-else.
\r
251 READ_NEXT_PAIR(v1, v2, i);
\r
252 while (v2 != 0xDEAD &&
\r
254 v2 != 0xCDCD && i < ArrayLen -2)
\r
256 #ifdef CONFIG_IOL_IOREG_CFG
\r
258 if(rtw_IOL_cmd_boundary_handle(pxmit_frame))
\r
260 rtw_IOL_append_WB_cmd(pxmit_frame,(u2Byte)v1, (u1Byte)v2,0xFF);
\r
261 #ifdef CONFIG_IOL_IOREG_CFG_DBG
\r
262 cmpdata[cmpdata_idx].addr = v1;
\r
263 cmpdata[cmpdata_idx].value= v2;
\r
268 #endif //#ifdef CONFIG_IOL_IOREG_CFG
\r
270 odm_ConfigMAC_8188E(pDM_Odm, v1, (u1Byte)v2);
\r
272 READ_NEXT_PAIR(v1, v2, i);
\r
275 while (v2 != 0xDEAD && i < ArrayLen -2)
\r
277 READ_NEXT_PAIR(v1, v2, i);
\r
284 #ifdef CONFIG_IOL_IOREG_CFG
\r
286 //printk("==> %s, pktlen = %d,bndy_cnt = %d\n",__FUNCTION__,pxmit_frame->attrib.pktlen+4+32,bndy_cnt);
\r
288 if(rtw_IOL_exec_cmds_sync(pDM_Odm->Adapter, pxmit_frame, 1000, bndy_cnt))
\r
290 #ifdef CONFIG_IOL_IOREG_CFG_DBG
\r
291 printk("~~~ IOL Config MAC Success !!! \n");
\r
292 //compare writed data
\r
296 // HAL_STATUS_FAILURE;
\r
297 printk(" MAC data compare => array_len:%d \n",cmpdata_idx);
\r
298 for(idx=0;idx< cmpdata_idx;idx++)
\r
300 cdata = ODM_Read1Byte(pDM_Odm, cmpdata[idx].addr);
\r
301 if(cdata != cmpdata[idx].value){
\r
302 printk("### MAC data compared failed !! addr:0x%04x, data:(0x%02x : 0x%02x) ###\n",
\r
303 cmpdata[idx].addr,cmpdata[idx].value,cdata);
\r
304 //rst = HAL_STATUS_FAILURE;
\r
309 //dump data from TX packet buffer
\r
310 //if(rst == HAL_STATUS_FAILURE)
\r
312 rtw_IOL_cmd_tx_pkt_buf_dump(pDM_Odm->Adapter,pxmit_frame->attrib.pktlen+32);
\r
316 #endif //CONFIG_IOL_IOREG_CFG_DBG
\r
320 printk("~~~ MAC IOL_exec_cmds Failed !!! \n");
\r
321 #ifdef CONFIG_IOL_IOREG_CFG_DBG
\r
323 //dump data from TX packet buffer
\r
324 rtw_IOL_cmd_tx_pkt_buf_dump(pDM_Odm->Adapter,pxmit_frame->attrib.pktlen+32);
\r
326 #endif //CONFIG_IOL_IOREG_CFG_DBG
\r
327 rst = HAL_STATUS_FAILURE;
\r
331 #endif //#ifdef CONFIG_IOL_IOREG_CFG
\r
335 /******************************************************************************
\r
337 ******************************************************************************/
\r
339 u4Byte Array_MP_8188E_MAC_REG_ICUT[] = {
\r
434 ODM_ReadAndConfig_MP_8188E_MAC_REG_ICUT(
\r
435 IN PDM_ODM_T pDM_Odm
\r
438 #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0)
\r
443 pu4Byte ptr_array = NULL;
\r
444 u1Byte platform = pDM_Odm->SupportPlatform;
\r
445 u1Byte _interface = pDM_Odm->SupportInterface;
\r
446 u1Byte board = pDM_Odm->BoardType;
\r
447 u4Byte ArrayLen = sizeof(Array_MP_8188E_MAC_REG_ICUT)/sizeof(u4Byte);
\r
448 pu4Byte Array = Array_MP_8188E_MAC_REG_ICUT;
\r
449 BOOLEAN biol = FALSE;
\r
451 #ifdef CONFIG_IOL_IOREG_CFG
\r
452 PADAPTER Adapter = pDM_Odm->Adapter;
\r
453 struct xmit_frame *pxmit_frame;
\r
455 #ifdef CONFIG_IOL_IOREG_CFG_DBG
\r
456 struct cmd_cmp cmpdata[ArrayLen];
\r
457 u4Byte cmpdata_idx=0;
\r
459 #endif //CONFIG_IOL_IOREG_CFG
\r
460 HAL_STATUS rst =HAL_STATUS_SUCCESS;
\r
463 hex += _interface << 8;
\r
464 hex += platform << 16;
\r
466 ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8188E_MAC_REG_ICUT, hex = 0x%X\n", hex));
\r
468 #ifdef CONFIG_IOL_IOREG_CFG
\r
469 biol = rtw_IOL_applied(Adapter);
\r
472 if((pxmit_frame=rtw_IOL_accquire_xmit_frame(Adapter)) == NULL)
\r
474 printk("rtw_IOL_accquire_xmit_frame failed\n");
\r
475 return HAL_STATUS_FAILURE;
\r
479 #endif //CONFIG_IOL_IOREG_CFG
\r
480 for (i = 0; i < ArrayLen; i += 2 )
\r
482 u4Byte v1 = Array[i];
\r
483 u4Byte v2 = Array[i+1];
\r
485 // This (offset, data) pair meets the condition.
\r
486 if ( v1 < 0xCDCDCDCD )
\r
488 #ifdef CONFIG_IOL_IOREG_CFG
\r
492 if(rtw_IOL_cmd_boundary_handle(pxmit_frame))
\r
494 rtw_IOL_append_WB_cmd(pxmit_frame,(u2Byte)v1, (u1Byte)v2,0xFF);
\r
495 #ifdef CONFIG_IOL_IOREG_CFG_DBG
\r
496 cmpdata[cmpdata_idx].addr = v1;
\r
497 cmpdata[cmpdata_idx].value= v2;
\r
502 #endif //endif CONFIG_IOL_IOREG_CFG
\r
504 odm_ConfigMAC_8188E(pDM_Odm, v1, (u1Byte)v2);
\r
509 { // This line is the start line of branch.
\r
510 if ( !CheckCondition(Array[i], hex) )
\r
511 { // Discard the following (offset, data) pairs.
\r
512 READ_NEXT_PAIR(v1, v2, i);
\r
513 while (v2 != 0xDEAD &&
\r
515 v2 != 0xCDCD && i < ArrayLen -2)
\r
517 READ_NEXT_PAIR(v1, v2, i);
\r
519 i -= 2; // prevent from for-loop += 2
\r
521 else // Configure matched pairs and skip to end of if-else.
\r
523 READ_NEXT_PAIR(v1, v2, i);
\r
524 while (v2 != 0xDEAD &&
\r
526 v2 != 0xCDCD && i < ArrayLen -2)
\r
528 #ifdef CONFIG_IOL_IOREG_CFG
\r
530 if(rtw_IOL_cmd_boundary_handle(pxmit_frame))
\r
532 rtw_IOL_append_WB_cmd(pxmit_frame,(u2Byte)v1, (u1Byte)v2,0xFF);
\r
533 #ifdef CONFIG_IOL_IOREG_CFG_DBG
\r
534 cmpdata[cmpdata_idx].addr = v1;
\r
535 cmpdata[cmpdata_idx].value= v2;
\r
540 #endif //#ifdef CONFIG_IOL_IOREG_CFG
\r
542 odm_ConfigMAC_8188E(pDM_Odm, v1, (u1Byte)v2);
\r
544 READ_NEXT_PAIR(v1, v2, i);
\r
547 while (v2 != 0xDEAD && i < ArrayLen -2)
\r
549 READ_NEXT_PAIR(v1, v2, i);
\r
556 #ifdef CONFIG_IOL_IOREG_CFG
\r
558 //printk("==> %s, pktlen = %d,bndy_cnt = %d\n",__FUNCTION__,pxmit_frame->attrib.pktlen+4+32,bndy_cnt);
\r
560 if(rtw_IOL_exec_cmds_sync(pDM_Odm->Adapter, pxmit_frame, 1000, bndy_cnt))
\r
562 #ifdef CONFIG_IOL_IOREG_CFG_DBG
\r
563 printk("~~~ IOL Config MAC Success !!! \n");
\r
564 //compare writed data
\r
568 // HAL_STATUS_FAILURE;
\r
569 printk(" MAC data compare => array_len:%d \n",cmpdata_idx);
\r
570 for(idx=0;idx< cmpdata_idx;idx++)
\r
572 cdata = ODM_Read1Byte(pDM_Odm, cmpdata[idx].addr);
\r
573 if(cdata != cmpdata[idx].value){
\r
574 printk("### MAC data compared failed !! addr:0x%04x, data:(0x%02x : 0x%02x) ###\n",
\r
575 cmpdata[idx].addr,cmpdata[idx].value,cdata);
\r
576 //rst = HAL_STATUS_FAILURE;
\r
581 //dump data from TX packet buffer
\r
582 //if(rst == HAL_STATUS_FAILURE)
\r
584 rtw_IOL_cmd_tx_pkt_buf_dump(pDM_Odm->Adapter,pxmit_frame->attrib.pktlen+32);
\r
588 #endif //CONFIG_IOL_IOREG_CFG_DBG
\r
592 printk("~~~ MAC IOL_exec_cmds Failed !!! \n");
\r
593 #ifdef CONFIG_IOL_IOREG_CFG_DBG
\r
595 //dump data from TX packet buffer
\r
596 rtw_IOL_cmd_tx_pkt_buf_dump(pDM_Odm->Adapter,pxmit_frame->attrib.pktlen+32);
\r
598 #endif //CONFIG_IOL_IOREG_CFG_DBG
\r
599 rst = HAL_STATUS_FAILURE;
\r
603 #endif //#ifdef CONFIG_IOL_IOREG_CFG
\r
607 #endif // end of HWIMG_SUPPORT
\r