1 /******************************************************************************
3 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 ******************************************************************************/
21 //============================================================
23 //============================================================
25 #include "odm_precomp.h"
27 // ODM IO Relative API.
36 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
37 prtl8192cd_priv priv = pDM_Odm->priv;
38 return RTL_R8(RegAddr);
39 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
40 PADAPTER Adapter = pDM_Odm->Adapter;
41 return rtw_read8(Adapter,RegAddr);
42 #elif (DM_ODM_SUPPORT_TYPE & ODM_MP)
43 PADAPTER Adapter = pDM_Odm->Adapter;
44 return PlatformEFIORead1Byte(Adapter, RegAddr);
56 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
57 prtl8192cd_priv priv = pDM_Odm->priv;
58 return RTL_R16(RegAddr);
59 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
60 PADAPTER Adapter = pDM_Odm->Adapter;
61 return rtw_read16(Adapter,RegAddr);
62 #elif (DM_ODM_SUPPORT_TYPE & ODM_MP)
63 PADAPTER Adapter = pDM_Odm->Adapter;
64 return PlatformEFIORead2Byte(Adapter, RegAddr);
76 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
77 prtl8192cd_priv priv = pDM_Odm->priv;
78 return RTL_R32(RegAddr);
79 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
80 PADAPTER Adapter = pDM_Odm->Adapter;
81 return rtw_read32(Adapter,RegAddr);
82 #elif (DM_ODM_SUPPORT_TYPE & ODM_MP)
83 PADAPTER Adapter = pDM_Odm->Adapter;
84 return PlatformEFIORead4Byte(Adapter, RegAddr);
97 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
98 prtl8192cd_priv priv = pDM_Odm->priv;
99 RTL_W8(RegAddr, Data);
100 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
101 PADAPTER Adapter = pDM_Odm->Adapter;
102 rtw_write8(Adapter,RegAddr, Data);
103 #elif (DM_ODM_SUPPORT_TYPE & ODM_MP)
104 PADAPTER Adapter = pDM_Odm->Adapter;
105 PlatformEFIOWrite1Byte(Adapter, RegAddr, Data);
113 IN PDM_ODM_T pDM_Odm,
118 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
119 prtl8192cd_priv priv = pDM_Odm->priv;
120 RTL_W16(RegAddr, Data);
121 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
122 PADAPTER Adapter = pDM_Odm->Adapter;
123 rtw_write16(Adapter,RegAddr, Data);
124 #elif (DM_ODM_SUPPORT_TYPE & ODM_MP)
125 PADAPTER Adapter = pDM_Odm->Adapter;
126 PlatformEFIOWrite2Byte(Adapter, RegAddr, Data);
134 IN PDM_ODM_T pDM_Odm,
139 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
140 prtl8192cd_priv priv = pDM_Odm->priv;
141 RTL_W32(RegAddr, Data);
142 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
143 PADAPTER Adapter = pDM_Odm->Adapter;
144 rtw_write32(Adapter,RegAddr, Data);
145 #elif (DM_ODM_SUPPORT_TYPE & ODM_MP)
146 PADAPTER Adapter = pDM_Odm->Adapter;
147 PlatformEFIOWrite4Byte(Adapter, RegAddr, Data);
155 IN PDM_ODM_T pDM_Odm,
161 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
162 PHY_SetBBReg(pDM_Odm->priv, RegAddr, BitMask, Data);
163 #elif (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_MP))
164 PADAPTER Adapter = pDM_Odm->Adapter;
165 PHY_SetBBReg(Adapter, RegAddr, BitMask, Data);
172 IN PDM_ODM_T pDM_Odm,
177 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
178 return PHY_QueryBBReg(pDM_Odm->priv, RegAddr, BitMask);
179 #elif (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_MP))
180 PADAPTER Adapter = pDM_Odm->Adapter;
181 return PHY_QueryBBReg(Adapter, RegAddr, BitMask);
188 IN PDM_ODM_T pDM_Odm,
194 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
195 PHY_SetBBReg(pDM_Odm->priv, RegAddr, BitMask, Data);
196 #elif (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_MP))
197 PADAPTER Adapter = pDM_Odm->Adapter;
198 PHY_SetBBReg(Adapter, RegAddr, BitMask, Data);
205 IN PDM_ODM_T pDM_Odm,
210 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
211 return PHY_QueryBBReg(pDM_Odm->priv, RegAddr, BitMask);
212 #elif (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_MP))
213 PADAPTER Adapter = pDM_Odm->Adapter;
214 return PHY_QueryBBReg(Adapter, RegAddr, BitMask);
221 IN PDM_ODM_T pDM_Odm,
222 IN ODM_RF_RADIO_PATH_E eRFPath,
228 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
229 PHY_SetRFReg(pDM_Odm->priv, eRFPath, RegAddr, BitMask, Data);
230 #elif (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_MP))
231 PADAPTER Adapter = pDM_Odm->Adapter;
232 PHY_SetRFReg(Adapter, eRFPath, RegAddr, BitMask, Data);
239 IN PDM_ODM_T pDM_Odm,
240 IN ODM_RF_RADIO_PATH_E eRFPath,
245 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
246 return PHY_QueryRFReg(pDM_Odm->priv, eRFPath, RegAddr, BitMask, 1);
247 #elif (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_MP))
248 PADAPTER Adapter = pDM_Odm->Adapter;
249 return PHY_QueryRFReg(Adapter, eRFPath, RegAddr, BitMask);
257 // ODM Memory relative API.
261 IN PDM_ODM_T pDM_Odm,
266 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
267 *pPtr = kmalloc(length, GFP_ATOMIC);
268 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE )
269 *pPtr = rtw_zvmalloc(length);
270 #elif (DM_ODM_SUPPORT_TYPE & ODM_MP)
271 PADAPTER Adapter = pDM_Odm->Adapter;
272 PlatformAllocateMemory(Adapter, pPtr, length);
276 // length could be ignored, used to detect memory leakage.
279 IN PDM_ODM_T pDM_Odm,
284 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
286 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE )
287 rtw_vmfree(pPtr, length);
288 #elif (DM_ODM_SUPPORT_TYPE & ODM_MP)
289 //PADAPTER Adapter = pDM_Odm->Adapter;
290 PlatformFreeMemory(pPtr, length);
293 s4Byte ODM_CompareMemory(
294 IN PDM_ODM_T pDM_Odm,
300 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
301 return memcmp(pBuf1,pBuf2,length);
302 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE )
303 return _rtw_memcmp(pBuf1,pBuf2,length);
304 #elif (DM_ODM_SUPPORT_TYPE & ODM_MP)
305 return PlatformCompareMemory(pBuf1,pBuf2,length);
312 // ODM MISC relative API.
316 IN PDM_ODM_T pDM_Odm,
317 IN RT_SPINLOCK_TYPE type
320 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
322 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE )
324 #elif (DM_ODM_SUPPORT_TYPE & ODM_MP)
325 PADAPTER Adapter = pDM_Odm->Adapter;
326 PlatformAcquireSpinLock(Adapter, type);
331 IN PDM_ODM_T pDM_Odm,
332 IN RT_SPINLOCK_TYPE type
335 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
337 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE )
339 #elif (DM_ODM_SUPPORT_TYPE & ODM_MP)
340 PADAPTER Adapter = pDM_Odm->Adapter;
341 PlatformReleaseSpinLock(Adapter, type);
346 // Work item relative API. FOr MP driver only~!
349 ODM_InitializeWorkItem(
350 IN PDM_ODM_T pDM_Odm,
351 IN PRT_WORK_ITEM pRtWorkItem,
352 IN RT_WORKITEM_CALL_BACK RtWorkItemCallback,
357 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
359 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
361 #elif (DM_ODM_SUPPORT_TYPE & ODM_MP)
362 PADAPTER Adapter = pDM_Odm->Adapter;
363 PlatformInitializeWorkItem(Adapter, pRtWorkItem, RtWorkItemCallback, pContext, szID);
370 IN PRT_WORK_ITEM pRtWorkItem
373 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
375 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
377 #elif (DM_ODM_SUPPORT_TYPE & ODM_MP)
378 PlatformStartWorkItem(pRtWorkItem);
385 IN PRT_WORK_ITEM pRtWorkItem
388 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
390 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
392 #elif (DM_ODM_SUPPORT_TYPE & ODM_MP)
393 PlatformStopWorkItem(pRtWorkItem);
400 IN PRT_WORK_ITEM pRtWorkItem
403 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
405 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
407 #elif (DM_ODM_SUPPORT_TYPE & ODM_MP)
408 PlatformFreeWorkItem(pRtWorkItem);
414 ODM_ScheduleWorkItem(
415 IN PRT_WORK_ITEM pRtWorkItem
418 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
420 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
422 #elif (DM_ODM_SUPPORT_TYPE & ODM_MP)
423 PlatformScheduleWorkItem(pRtWorkItem);
429 ODM_IsWorkItemScheduled(
430 IN PRT_WORK_ITEM pRtWorkItem
433 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
435 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
437 #elif (DM_ODM_SUPPORT_TYPE & ODM_MP)
438 PlatformIsWorkItemScheduled(pRtWorkItem);
445 // ODM Timer relative API.
452 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
454 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
455 rtw_udelay_os(usDelay);
456 #elif (DM_ODM_SUPPORT_TYPE & ODM_MP)
457 PlatformStallExecution(usDelay);
462 ODM_delay_ms(IN u4Byte ms)
464 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
466 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
468 #elif (DM_ODM_SUPPORT_TYPE & ODM_MP)
474 ODM_delay_us(IN u4Byte us)
476 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
478 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
480 #elif (DM_ODM_SUPPORT_TYPE & ODM_MP)
481 PlatformStallExecution(us);
486 ODM_sleep_ms(IN u4Byte ms)
488 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
490 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
492 #elif (DM_ODM_SUPPORT_TYPE & ODM_MP)
497 ODM_sleep_us(IN u4Byte us)
499 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
501 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
503 #elif (DM_ODM_SUPPORT_TYPE & ODM_MP)
509 IN PDM_ODM_T pDM_Odm,
514 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
515 mod_timer(pTimer, jiffies + (msDelay+9)/10);
516 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
517 _set_timer(pTimer,msDelay ); //ms
518 #elif (DM_ODM_SUPPORT_TYPE & ODM_MP)
519 PADAPTER Adapter = pDM_Odm->Adapter;
520 PlatformSetTimer(Adapter, pTimer, msDelay);
527 IN PDM_ODM_T pDM_Odm,
529 IN RT_TIMER_CALL_BACK CallBackFunc,
534 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
535 pTimer->function = CallBackFunc;
536 pTimer->data = (unsigned long)pDM_Odm;
538 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
539 PADAPTER Adapter = pDM_Odm->Adapter;
540 _init_timer(pTimer,Adapter->pnetdev,CallBackFunc,pDM_Odm);
541 #elif (DM_ODM_SUPPORT_TYPE & ODM_MP)
542 PADAPTER Adapter = pDM_Odm->Adapter;
543 PlatformInitializeTimer(Adapter, pTimer, CallBackFunc,pContext,szID);
550 IN PDM_ODM_T pDM_Odm,
554 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
555 del_timer_sync(pTimer);
556 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
557 _cancel_timer_ex(pTimer);
558 #elif (DM_ODM_SUPPORT_TYPE & ODM_MP)
559 PADAPTER Adapter = pDM_Odm->Adapter;
560 PlatformCancelTimer(Adapter, pTimer);
567 IN PDM_ODM_T pDM_Odm,
571 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
573 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
575 #elif (DM_ODM_SUPPORT_TYPE & ODM_MP)
577 PADAPTER Adapter = pDM_Odm->Adapter;
579 // <20120301, Kordan> If the initilization fails, InitializeAdapterXxx will return regardless of InitHalDm.
580 // Hence, uninitialized timers cause BSOD when the driver releases resources since the init fail.
583 ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_SERIOUS, ("=====>ODM_ReleaseTimer(), The timer is NULL! Please check it!\n"));
587 PlatformReleaseTimer(Adapter, pTimer);
593 // ODM FW relative API.
595 #if (DM_ODM_SUPPORT_TYPE & ODM_MP)
601 IN pu1Byte pCmdBuffer
604 if (IS_HARDWARE_TYPE_JAGUAR(Adapter))
608 case ODM_H2C_RSSI_REPORT:
609 FillH2CCmd8812(Adapter, H2C_8812_RSSI_REPORT, CmdLen, pCmdBuffer);
615 else if (IS_HARDWARE_TYPE_8188E(Adapter))
619 case ODM_H2C_PSD_RESULT:
620 FillH2CCmd88E(Adapter, H2C_88E_PSD_RESULT, CmdLen, pCmdBuffer);
629 case ODM_H2C_RSSI_REPORT:
630 FillH2CCmd92C(Adapter, H2C_RSSI_REPORT, CmdLen, pCmdBuffer);
631 case ODM_H2C_PSD_RESULT:
632 FillH2CCmd92C(Adapter, H2C_92C_PSD_RESULT, CmdLen, pCmdBuffer);
641 IN pu1Byte pH2CBuffer,
642 IN u4Byte H2CBufferLen,
644 IN pu4Byte pElementID,
646 IN pu1Byte* pCmbBuffer,
647 IN pu1Byte CmdStartSeq
650 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
652 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
654 #elif (DM_ODM_SUPPORT_TYPE & ODM_MP)
655 //FillH2CCmd(pH2CBuffer, H2CBufferLen, CmdNum, pElementID, pCmdLen, pCmbBuffer, CmdStartSeq);