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 "mp_precomp.h"
26 #include "phydm_precomp.h"
29 * ODM IO Relative API.
34 struct PHY_DM_STRUCT *p_dm_odm,
38 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
39 struct rtl8192cd_priv *priv = p_dm_odm->priv;
40 return RTL_R8(reg_addr);
41 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
42 struct _ADAPTER *adapter = p_dm_odm->adapter;
43 return rtw_read8(adapter, reg_addr);
44 #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
45 struct _ADAPTER *adapter = p_dm_odm->adapter;
46 return PlatformEFIORead1Byte(adapter, reg_addr);
54 struct PHY_DM_STRUCT *p_dm_odm,
58 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
59 struct rtl8192cd_priv *priv = p_dm_odm->priv;
60 return RTL_R16(reg_addr);
61 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
62 struct _ADAPTER *adapter = p_dm_odm->adapter;
63 return rtw_read16(adapter, reg_addr);
64 #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
65 struct _ADAPTER *adapter = p_dm_odm->adapter;
66 return PlatformEFIORead2Byte(adapter, reg_addr);
74 struct PHY_DM_STRUCT *p_dm_odm,
78 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
79 struct rtl8192cd_priv *priv = p_dm_odm->priv;
80 return RTL_R32(reg_addr);
81 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
82 struct _ADAPTER *adapter = p_dm_odm->adapter;
83 return rtw_read32(adapter, reg_addr);
84 #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
85 struct _ADAPTER *adapter = p_dm_odm->adapter;
86 return PlatformEFIORead4Byte(adapter, reg_addr);
94 struct PHY_DM_STRUCT *p_dm_odm,
99 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
100 struct rtl8192cd_priv *priv = p_dm_odm->priv;
101 RTL_W8(reg_addr, data);
102 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
103 struct _ADAPTER *adapter = p_dm_odm->adapter;
104 rtw_write8(adapter, reg_addr, data);
105 #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
106 struct _ADAPTER *adapter = p_dm_odm->adapter;
107 PlatformEFIOWrite1Byte(adapter, reg_addr, data);
115 struct PHY_DM_STRUCT *p_dm_odm,
120 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
121 struct rtl8192cd_priv *priv = p_dm_odm->priv;
122 RTL_W16(reg_addr, data);
123 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
124 struct _ADAPTER *adapter = p_dm_odm->adapter;
125 rtw_write16(adapter, reg_addr, data);
126 #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
127 struct _ADAPTER *adapter = p_dm_odm->adapter;
128 PlatformEFIOWrite2Byte(adapter, reg_addr, data);
136 struct PHY_DM_STRUCT *p_dm_odm,
141 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
142 struct rtl8192cd_priv *priv = p_dm_odm->priv;
143 RTL_W32(reg_addr, data);
144 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
145 struct _ADAPTER *adapter = p_dm_odm->adapter;
146 rtw_write32(adapter, reg_addr, data);
147 #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
148 struct _ADAPTER *adapter = p_dm_odm->adapter;
149 PlatformEFIOWrite4Byte(adapter, reg_addr, data);
157 struct PHY_DM_STRUCT *p_dm_odm,
163 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
164 phy_set_bb_reg(p_dm_odm->priv, reg_addr, bit_mask, data);
165 #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
166 struct _ADAPTER *adapter = p_dm_odm->adapter;
167 PHY_SetBBReg(adapter, reg_addr, bit_mask, data);
169 phy_set_bb_reg(p_dm_odm->adapter, reg_addr, bit_mask, data);
176 struct PHY_DM_STRUCT *p_dm_odm,
181 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
182 return phy_query_bb_reg(p_dm_odm->priv, reg_addr, bit_mask);
183 #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
184 return PHY_QueryMacReg(p_dm_odm->adapter, reg_addr, bit_mask);
186 return phy_query_mac_reg(p_dm_odm->adapter, reg_addr, bit_mask);
193 struct PHY_DM_STRUCT *p_dm_odm,
199 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
200 phy_set_bb_reg(p_dm_odm->priv, reg_addr, bit_mask, data);
201 #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
202 struct _ADAPTER *adapter = p_dm_odm->adapter;
203 PHY_SetBBReg(adapter, reg_addr, bit_mask, data);
205 phy_set_bb_reg(p_dm_odm->adapter, reg_addr, bit_mask, data);
212 struct PHY_DM_STRUCT *p_dm_odm,
217 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
218 return phy_query_bb_reg(p_dm_odm->priv, reg_addr, bit_mask);
219 #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
220 struct _ADAPTER *adapter = p_dm_odm->adapter;
221 return PHY_QueryBBReg(adapter, reg_addr, bit_mask);
223 return phy_query_bb_reg(p_dm_odm->adapter, reg_addr, bit_mask);
230 struct PHY_DM_STRUCT *p_dm_odm,
231 enum odm_rf_radio_path_e e_rf_path,
237 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
238 phy_set_rf_reg(p_dm_odm->priv, e_rf_path, reg_addr, bit_mask, data);
239 #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
240 struct _ADAPTER *adapter = p_dm_odm->adapter;
241 PHY_SetRFReg(adapter, e_rf_path, reg_addr, bit_mask, data);
244 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
245 phy_set_rf_reg(p_dm_odm->adapter, e_rf_path, reg_addr, bit_mask, data);
251 struct PHY_DM_STRUCT *p_dm_odm,
252 enum odm_rf_radio_path_e e_rf_path,
257 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
258 return phy_query_rf_reg(p_dm_odm->priv, e_rf_path, reg_addr, bit_mask, 1);
259 #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
260 struct _ADAPTER *adapter = p_dm_odm->adapter;
261 return PHY_QueryRFReg(adapter, e_rf_path, reg_addr, bit_mask);
263 return phy_query_rf_reg(p_dm_odm->adapter, e_rf_path, reg_addr, bit_mask);
271 * ODM Memory relative API.
275 struct PHY_DM_STRUCT *p_dm_odm,
280 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
281 *p_ptr = kmalloc(length, GFP_ATOMIC);
282 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
283 *p_ptr = rtw_zvmalloc(length);
284 #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
285 struct _ADAPTER *adapter = p_dm_odm->adapter;
286 PlatformAllocateMemory(adapter, p_ptr, length);
290 /* length could be ignored, used to detect memory leakage. */
293 struct PHY_DM_STRUCT *p_dm_odm,
298 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
300 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
301 rtw_vmfree(p_ptr, length);
302 #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
303 /* struct _ADAPTER* adapter = p_dm_odm->adapter; */
304 PlatformFreeMemory(p_ptr, length);
310 struct PHY_DM_STRUCT *p_dm_odm,
316 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
317 memcpy(p_dest, p_src, length);
318 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
319 _rtw_memcpy(p_dest, p_src, length);
320 #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
321 PlatformMoveMemory(p_dest, p_src, length);
326 struct PHY_DM_STRUCT *p_dm_odm,
332 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
333 memset(pbuf, value, length);
334 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
335 _rtw_memset(pbuf, value, length);
336 #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
337 PlatformFillMemory(pbuf, length, value);
340 s32 odm_compare_memory(
341 struct PHY_DM_STRUCT *p_dm_odm,
347 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
348 return memcmp(p_buf1, p_buf2, length);
349 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
350 return _rtw_memcmp(p_buf1, p_buf2, length);
351 #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
352 return PlatformCompareMemory(p_buf1, p_buf2, length);
359 * ODM MISC relative API.
362 odm_acquire_spin_lock(
363 struct PHY_DM_STRUCT *p_dm_odm,
364 enum rt_spinlock_type type
367 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
369 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
370 struct _ADAPTER *adapter = p_dm_odm->adapter;
371 rtw_odm_acquirespinlock(adapter, type);
372 #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
373 struct _ADAPTER *adapter = p_dm_odm->adapter;
374 PlatformAcquireSpinLock(adapter, type);
378 odm_release_spin_lock(
379 struct PHY_DM_STRUCT *p_dm_odm,
380 enum rt_spinlock_type type
383 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
385 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
386 struct _ADAPTER *adapter = p_dm_odm->adapter;
387 rtw_odm_releasespinlock(adapter, type);
388 #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
389 struct _ADAPTER *adapter = p_dm_odm->adapter;
390 PlatformReleaseSpinLock(adapter, type);
394 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
396 * Work item relative API. FOr MP driver only~!
399 odm_initialize_work_item(
400 struct PHY_DM_STRUCT *p_dm_odm,
401 PRT_WORK_ITEM p_rt_work_item,
402 RT_WORKITEM_CALL_BACK rt_work_item_callback,
407 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
409 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
411 #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
412 struct _ADAPTER *adapter = p_dm_odm->adapter;
413 PlatformInitializeWorkItem(adapter, p_rt_work_item, rt_work_item_callback, p_context, sz_id);
420 PRT_WORK_ITEM p_rt_work_item
423 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
425 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
427 #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
428 PlatformStartWorkItem(p_rt_work_item);
435 PRT_WORK_ITEM p_rt_work_item
438 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
440 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
442 #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
443 PlatformStopWorkItem(p_rt_work_item);
450 PRT_WORK_ITEM p_rt_work_item
453 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
455 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
457 #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
458 PlatformFreeWorkItem(p_rt_work_item);
464 odm_schedule_work_item(
465 PRT_WORK_ITEM p_rt_work_item
468 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
470 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
472 #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
473 PlatformScheduleWorkItem(p_rt_work_item);
479 odm_is_work_item_scheduled(
480 PRT_WORK_ITEM p_rt_work_item
483 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
485 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
487 #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
488 return PlatformIsWorkItemScheduled(p_rt_work_item);
495 * ODM Timer relative API.
502 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
504 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
505 rtw_udelay_os(us_delay);
506 #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
507 PlatformStallExecution(us_delay);
514 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
516 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
518 #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
526 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
528 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
530 #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
531 PlatformStallExecution(us);
538 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
540 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
542 #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
549 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
551 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
553 #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
559 struct PHY_DM_STRUCT *p_dm_odm,
560 struct timer_list *p_timer,
564 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
565 mod_timer(p_timer, jiffies + RTL_MILISECONDS_TO_JIFFIES(ms_delay));
566 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
567 _set_timer(p_timer, ms_delay); /* ms */
568 #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
569 struct _ADAPTER *adapter = p_dm_odm->adapter;
570 PlatformSetTimer(adapter, p_timer, ms_delay);
576 odm_initialize_timer(
577 struct PHY_DM_STRUCT *p_dm_odm,
578 struct timer_list *p_timer,
579 void *call_back_func,
584 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
586 p_timer->function = call_back_func;
587 p_timer->data = (unsigned long)p_dm_odm;
588 /*mod_timer(p_timer, jiffies+RTL_MILISECONDS_TO_JIFFIES(10)); */
589 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
590 struct _ADAPTER *adapter = p_dm_odm->adapter;
591 _init_timer(p_timer, adapter->pnetdev, call_back_func, p_dm_odm);
592 #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
593 struct _ADAPTER *adapter = p_dm_odm->adapter;
594 PlatformInitializeTimer(adapter, p_timer, call_back_func, p_context, sz_id);
601 struct PHY_DM_STRUCT *p_dm_odm,
602 struct timer_list *p_timer
605 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
607 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
608 _cancel_timer_ex(p_timer);
609 #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
610 struct _ADAPTER *adapter = p_dm_odm->adapter;
611 PlatformCancelTimer(adapter, p_timer);
618 struct PHY_DM_STRUCT *p_dm_odm,
619 struct timer_list *p_timer
622 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
624 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
626 #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
628 struct _ADAPTER *adapter = p_dm_odm->adapter;
630 /* <20120301, Kordan> If the initilization fails, InitializeAdapterXxx will return regardless of InitHalDm.
631 * Hence, uninitialized timers cause BSOD when the driver releases resources since the init fail. */
633 ODM_RT_TRACE(p_dm_odm, ODM_COMP_INIT, ODM_DBG_SERIOUS, ("=====>odm_release_timer(), The timer is NULL! Please check it!\n"));
637 PlatformReleaseTimer(adapter, p_timer);
644 struct PHY_DM_STRUCT *p_dm_odm,
648 u8 platform_h2c_id = phydm_h2c_id;
650 switch (phydm_h2c_id) {
652 case ODM_H2C_RSSI_REPORT:
654 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
655 if (p_dm_odm->support_ic_type == ODM_RTL8188E)
656 platform_h2c_id = H2C_88E_RSSI_REPORT;
657 else if (p_dm_odm->support_ic_type == ODM_RTL8814A)
658 platform_h2c_id = H2C_8814A_RSSI_REPORT;
660 platform_h2c_id = H2C_RSSI_REPORT;
662 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
663 platform_h2c_id = H2C_RSSI_SETTING;
665 #elif (DM_ODM_SUPPORT_TYPE & ODM_AP)
666 #if ((RTL8881A_SUPPORT == 1) || (RTL8192E_SUPPORT == 1) || (RTL8814A_SUPPORT == 1) || (RTL8822B_SUPPORT == 1) || (RTL8197F_SUPPORT == 1))
667 if (p_dm_odm->support_ic_type == ODM_RTL8881A || p_dm_odm->support_ic_type == ODM_RTL8192E || p_dm_odm->support_ic_type & PHYDM_IC_3081_SERIES)
668 platform_h2c_id = H2C_88XX_RSSI_REPORT;
671 #if (RTL8812A_SUPPORT == 1)
672 if (p_dm_odm->support_ic_type == ODM_RTL8812)
673 platform_h2c_id = H2C_8812_RSSI_REPORT;
682 case ODM_H2C_WIFI_CALIBRATION:
683 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
684 platform_h2c_id = H2C_WIFI_CALIBRATION;
686 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
687 #if (RTL8723B_SUPPORT == 1)
688 platform_h2c_id = H2C_8723B_BT_WLAN_CALIBRATION;
691 #elif (DM_ODM_SUPPORT_TYPE & ODM_AP)
697 case ODM_H2C_IQ_CALIBRATION:
698 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
699 platform_h2c_id = H2C_IQ_CALIBRATION;
701 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
702 #if ((RTL8812A_SUPPORT == 1) || (RTL8821A_SUPPORT == 1))
703 platform_h2c_id = H2C_8812_IQ_CALIBRATION;
705 #elif (DM_ODM_SUPPORT_TYPE & ODM_AP)
710 case ODM_H2C_RA_PARA_ADJUST:
712 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
713 if (p_dm_odm->support_ic_type & (ODM_RTL8814A | ODM_RTL8822B))
714 platform_h2c_id = H2C_8814A_RA_PARA_ADJUST;
716 platform_h2c_id = H2C_RA_PARA_ADJUST;
717 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
718 #if ((RTL8812A_SUPPORT == 1) || (RTL8821A_SUPPORT == 1))
719 platform_h2c_id = H2C_8812_RA_PARA_ADJUST;
720 #elif ((RTL8814A_SUPPORT == 1) || (RTL8822B_SUPPORT == 1))
721 platform_h2c_id = H2C_RA_PARA_ADJUST;
722 #elif (RTL8192E_SUPPORT == 1)
723 platform_h2c_id = H2C_8192E_RA_PARA_ADJUST;
724 #elif (RTL8723B_SUPPORT == 1)
725 platform_h2c_id = H2C_8723B_RA_PARA_ADJUST;
728 #elif (DM_ODM_SUPPORT_TYPE & ODM_AP)
729 #if ((RTL8881A_SUPPORT == 1) || (RTL8192E_SUPPORT == 1) || (RTL8814A_SUPPORT == 1) || (RTL8822B_SUPPORT == 1) || (RTL8197F_SUPPORT == 1))
730 if (p_dm_odm->support_ic_type == ODM_RTL8881A || p_dm_odm->support_ic_type == ODM_RTL8192E || p_dm_odm->support_ic_type & PHYDM_IC_3081_SERIES)
731 platform_h2c_id = H2C_88XX_RA_PARA_ADJUST;
734 #if (RTL8812A_SUPPORT == 1)
735 if (p_dm_odm->support_ic_type == ODM_RTL8812)
736 platform_h2c_id = H2C_8812_RA_PARA_ADJUST;
746 case PHYDM_H2C_DYNAMIC_TX_PATH:
748 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
749 if (p_dm_odm->support_ic_type == ODM_RTL8814A)
750 platform_h2c_id = H2C_8814A_DYNAMIC_TX_PATH;
751 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
752 #if (RTL8814A_SUPPORT == 1)
753 if (p_dm_odm->support_ic_type == ODM_RTL8814A)
754 platform_h2c_id = H2C_DYNAMIC_TX_PATH;
756 #elif (DM_ODM_SUPPORT_TYPE & ODM_AP)
757 #if (RTL8814A_SUPPORT == 1)
758 if (p_dm_odm->support_ic_type == ODM_RTL8814A)
759 platform_h2c_id = H2C_88XX_DYNAMIC_TX_PATH;
767 case PHYDM_H2C_FW_TRACE_EN:
769 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
770 if (p_dm_odm->support_ic_type & (ODM_RTL8814A | ODM_RTL8822B))
771 platform_h2c_id = H2C_8814A_FW_TRACE_EN;
773 platform_h2c_id = H2C_FW_TRACE_EN;
775 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
777 platform_h2c_id = 0x49;
779 #elif (DM_ODM_SUPPORT_TYPE & ODM_AP)
780 #if ((RTL8881A_SUPPORT == 1) || (RTL8192E_SUPPORT == 1) || (RTL8814A_SUPPORT == 1) || (RTL8822B_SUPPORT == 1) || (RTL8197F_SUPPORT == 1))
781 if (p_dm_odm->support_ic_type == ODM_RTL8881A || p_dm_odm->support_ic_type == ODM_RTL8192E || p_dm_odm->support_ic_type & PHYDM_IC_3081_SERIES)
782 platform_h2c_id = H2C_88XX_FW_TRACE_EN;
785 #if (RTL8812A_SUPPORT == 1)
786 if (p_dm_odm->support_ic_type == ODM_RTL8812)
787 platform_h2c_id = H2C_8812_FW_TRACE_EN;
797 #if ((RTL8192E_SUPPORT == 1) || (RTL8812A_SUPPORT == 1))
798 platform_h2c_id = 0x41; /*H2C_TxBF*/
803 #if (RTL8822B_SUPPORT == 1)
804 platform_h2c_id = 0x4a; /*H2C_MU*/
809 platform_h2c_id = phydm_h2c_id;
813 return platform_h2c_id;
817 /*ODM FW relative API.*/
821 struct PHY_DM_STRUCT *p_dm_odm,
827 struct _ADAPTER *adapter = p_dm_odm->adapter;
830 platform_h2c_id = phydm_trans_h2c_id(p_dm_odm, phydm_h2c_id);
832 ODM_RT_TRACE(p_dm_odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("[H2C] platform_h2c_id = ((0x%x))\n", platform_h2c_id));
834 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
835 if (p_dm_odm->support_ic_type == ODM_RTL8188E) {
836 if (!p_dm_odm->ra_support88e)
837 FillH2CCmd88E(adapter, platform_h2c_id, cmd_len, p_cmd_buffer);
838 } else if (p_dm_odm->support_ic_type == ODM_RTL8814A)
839 FillH2CCmd8814A(adapter, platform_h2c_id, cmd_len, p_cmd_buffer);
840 else if (p_dm_odm->support_ic_type == ODM_RTL8822B)
841 #if (RTL8822B_SUPPORT == 1)
842 FillH2CCmd8822B(adapter, platform_h2c_id, cmd_len, p_cmd_buffer);
845 FillH2CCmd(adapter, platform_h2c_id, cmd_len, p_cmd_buffer);
847 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
848 rtw_hal_fill_h2c_cmd(adapter, platform_h2c_id, cmd_len, p_cmd_buffer);
850 #elif (DM_ODM_SUPPORT_TYPE & ODM_AP)
851 #if ((RTL8881A_SUPPORT == 1) || (RTL8192E_SUPPORT == 1) || (RTL8814A_SUPPORT == 1) || (RTL8822B_SUPPORT == 1) || (RTL8197F_SUPPORT == 1))
852 if (p_dm_odm->support_ic_type == ODM_RTL8881A || p_dm_odm->support_ic_type == ODM_RTL8192E || p_dm_odm->support_ic_type & PHYDM_IC_3081_SERIES)
853 GET_HAL_INTERFACE(p_dm_odm->priv)->fill_h2c_cmd_handler(p_dm_odm->priv, platform_h2c_id, cmd_len, p_cmd_buffer);
856 #if (RTL8812A_SUPPORT == 1)
857 if (p_dm_odm->support_ic_type == ODM_RTL8812)
858 fill_h2c_cmd8812(p_dm_odm->priv, platform_h2c_id, cmd_len, p_cmd_buffer);
866 phydm_c2H_content_parsing(
873 struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
874 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
875 struct _ADAPTER *adapter = p_dm_odm->adapter;
877 u8 extend_c2h_sub_id = 0;
878 u8 find_c2h_cmd = true;
880 switch (c2h_cmd_id) {
882 phydm_fw_trace_handler(p_dm_odm, tmp_buf, c2h_cmd_len);
885 case PHYDM_C2H_RA_RPT:
886 phydm_c2h_ra_report_handler(p_dm_odm, tmp_buf, c2h_cmd_len);
889 case PHYDM_C2H_RA_PARA_RPT:
890 odm_c2h_ra_para_report_handler(p_dm_odm, tmp_buf, c2h_cmd_len);
893 case PHYDM_C2H_DYNAMIC_TX_PATH_RPT:
894 if (p_dm_odm->support_ic_type & (ODM_RTL8814A))
895 phydm_c2h_dtp_handler(p_dm_odm, tmp_buf, c2h_cmd_len);
898 case PHYDM_C2H_IQK_FINISH:
899 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
901 if (p_dm_odm->support_ic_type & (ODM_RTL8812 | ODM_RTL8821)) {
903 RT_TRACE(COMP_MP, DBG_LOUD, ("== FW IQK Finish ==\n"));
904 odm_acquire_spin_lock(p_dm_odm, RT_IQK_SPINLOCK);
905 p_dm_odm->rf_calibrate_info.is_iqk_in_progress = false;
906 odm_release_spin_lock(p_dm_odm, RT_IQK_SPINLOCK);
907 p_dm_odm->rf_calibrate_info.iqk_progressing_time = 0;
908 p_dm_odm->rf_calibrate_info.iqk_progressing_time = odm_get_progressing_time(p_dm_odm, p_dm_odm->rf_calibrate_info.iqk_start_time);
914 case PHYDM_C2H_DBG_CODE:
915 phydm_fw_trace_handler_code(p_dm_odm, tmp_buf, c2h_cmd_len);
918 case PHYDM_C2H_EXTEND:
919 extend_c2h_sub_id = tmp_buf[0];
920 if (extend_c2h_sub_id == PHYDM_EXTEND_C2H_DBG_PRINT)
921 phydm_fw_trace_handler_8051(p_dm_odm, tmp_buf, c2h_cmd_len);
926 find_c2h_cmd = false;
935 odm_get_current_time(
936 struct PHY_DM_STRUCT *p_dm_odm
939 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
941 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
942 return (u64)rtw_get_current_time();
943 #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
944 return PlatformGetCurrentTime();
949 odm_get_progressing_time(
950 struct PHY_DM_STRUCT *p_dm_odm,
954 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
956 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
957 return rtw_get_passing_time_ms((u32)start_time);
958 #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
959 return ((PlatformGetCurrentTime() - start_time) >> 10);
963 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
966 phydm_set_hw_reg_handler_interface (
967 struct PHY_DM_STRUCT *p_dm_odm,
972 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
973 struct _ADAPTER *adapter = p_dm_odm->adapter;
975 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
976 adapter->HalFunc.SetHwRegHandler(adapter, RegName, val);
978 adapter->hal_func.set_hw_reg_handler(adapter, RegName, val);
986 phydm_get_hal_def_var_handler_interface (
987 struct PHY_DM_STRUCT *p_dm_odm,
988 enum _HAL_DEF_VARIABLE e_variable,
992 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
993 struct _ADAPTER *adapter = p_dm_odm->adapter;
995 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
996 adapter->HalFunc.GetHalDefVarHandler(adapter, e_variable, p_value);
998 adapter->hal_func.get_hal_def_var_handler(adapter, e_variable, p_value);
1007 odm_set_tx_power_index_by_rate_section (
1008 struct PHY_DM_STRUCT *p_dm_odm,
1014 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
1015 struct _ADAPTER *adapter = p_dm_odm->adapter;
1016 PHY_SetTxPowerIndexByRateSection(adapter, RFPath, Channel, RateSection);
1018 phy_set_tx_power_index_by_rate_section(p_dm_odm->adapter, RFPath, Channel, RateSection);
1023 odm_get_tx_power_index (
1024 struct PHY_DM_STRUCT *p_dm_odm,
1031 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
1032 struct _ADAPTER *adapter = p_dm_odm->adapter;
1033 return PHY_GetTxPowerIndex(p_dm_odm->adapter, RFPath, tx_rate, band_width, Channel);
1035 return phy_get_tx_power_index(p_dm_odm->adapter, RFPath, tx_rate, band_width, Channel);