Path: blob/master/ALFA-W1F1/RTL8814AU/hal/phydm/phydm_interface.c
1307 views
/******************************************************************************1*2* Copyright(c) 2007 - 2017 Realtek Corporation.3*4* This program is free software; you can redistribute it and/or modify it5* under the terms of version 2 of the GNU General Public License as6* published by the Free Software Foundation.7*8* This program is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for11* more details.12*13* The full GNU General Public License is included in this distribution in the14* file called LICENSE.15*16* Contact Information:17* wlanfae <[email protected]>18* Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,19* Hsinchu 300, Taiwan.20*21* Larry Finger <[email protected]>22*23*****************************************************************************/2425/*@************************************************************26* include files27************************************************************/2829#include "mp_precomp.h"30#include "phydm_precomp.h"3132/*@33* ODM IO Relative API.34*/3536u8 odm_read_1byte(struct dm_struct *dm, u32 reg_addr)37{38#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))39struct rtl8192cd_priv *priv = dm->priv;40return RTL_R8(reg_addr);41#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)42struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;4344return rtl_read_byte(rtlpriv, reg_addr);45#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)46struct rtw_dev *rtwdev = dm->adapter;4748return rtw_read8(rtwdev, reg_addr);49#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)50void *adapter = dm->adapter;51return rtw_read8(adapter, reg_addr);52#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)53void *adapter = dm->adapter;54return PlatformEFIORead1Byte(adapter, reg_addr);55#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)56void *adapter = dm->adapter;5758return rtw_read8(adapter, reg_addr);59#endif60}6162u16 odm_read_2byte(struct dm_struct *dm, u32 reg_addr)63{64#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))65struct rtl8192cd_priv *priv = dm->priv;66return RTL_R16(reg_addr);67#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)68struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;6970return rtl_read_word(rtlpriv, reg_addr);71#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)72struct rtw_dev *rtwdev = dm->adapter;7374return rtw_read16(rtwdev, reg_addr);75#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)76void *adapter = dm->adapter;77return rtw_read16(adapter, reg_addr);78#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)79void *adapter = dm->adapter;80return PlatformEFIORead2Byte(adapter, reg_addr);81#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)82void *adapter = dm->adapter;8384return rtw_read16(adapter, reg_addr);85#endif86}8788u32 odm_read_4byte(struct dm_struct *dm, u32 reg_addr)89{90#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))91struct rtl8192cd_priv *priv = dm->priv;92return RTL_R32(reg_addr);93#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)94struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;9596return rtl_read_dword(rtlpriv, reg_addr);97#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)98struct rtw_dev *rtwdev = dm->adapter;99100return rtw_read32(rtwdev, reg_addr);101#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)102void *adapter = dm->adapter;103return rtw_read32(adapter, reg_addr);104#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)105void *adapter = dm->adapter;106return PlatformEFIORead4Byte(adapter, reg_addr);107#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)108void *adapter = dm->adapter;109110return rtw_read32(adapter, reg_addr);111#endif112}113114void odm_write_1byte(struct dm_struct *dm, u32 reg_addr, u8 data)115{116#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))117struct rtl8192cd_priv *priv = dm->priv;118RTL_W8(reg_addr, data);119#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)120struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;121122rtl_write_byte(rtlpriv, reg_addr, data);123#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)124struct rtw_dev *rtwdev = dm->adapter;125126rtw_write8(rtwdev, reg_addr, data);127#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)128void *adapter = dm->adapter;129rtw_write8(adapter, reg_addr, data);130#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)131void *adapter = dm->adapter;132PlatformEFIOWrite1Byte(adapter, reg_addr, data);133#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)134void *adapter = dm->adapter;135136rtw_write8(adapter, reg_addr, data);137#endif138139if (dm->en_reg_mntr_byte)140pr_debug("1byte:addr=0x%x, data=0x%x\n", reg_addr, data);141}142143void odm_write_2byte(struct dm_struct *dm, u32 reg_addr, u16 data)144{145#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))146struct rtl8192cd_priv *priv = dm->priv;147RTL_W16(reg_addr, data);148#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)149struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;150151rtl_write_word(rtlpriv, reg_addr, data);152#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)153struct rtw_dev *rtwdev = dm->adapter;154155rtw_write16(rtwdev, reg_addr, data);156#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)157void *adapter = dm->adapter;158rtw_write16(adapter, reg_addr, data);159#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)160void *adapter = dm->adapter;161PlatformEFIOWrite2Byte(adapter, reg_addr, data);162#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)163void *adapter = dm->adapter;164165rtw_write16(adapter, reg_addr, data);166#endif167168if (dm->en_reg_mntr_byte)169pr_debug("2byte:addr=0x%x, data=0x%x\n", reg_addr, data);170}171172void odm_write_4byte(struct dm_struct *dm, u32 reg_addr, u32 data)173{174#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))175struct rtl8192cd_priv *priv = dm->priv;176RTL_W32(reg_addr, data);177#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)178struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;179180rtl_write_dword(rtlpriv, reg_addr, data);181#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)182struct rtw_dev *rtwdev = dm->adapter;183184rtw_write32(rtwdev, reg_addr, data);185#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)186void *adapter = dm->adapter;187rtw_write32(adapter, reg_addr, data);188#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)189void *adapter = dm->adapter;190PlatformEFIOWrite4Byte(adapter, reg_addr, data);191#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)192void *adapter = dm->adapter;193194rtw_write32(adapter, reg_addr, data);195#endif196197if (dm->en_reg_mntr_byte)198pr_debug("4byte:addr=0x%x, data=0x%x\n", reg_addr, data);199}200201void odm_set_mac_reg(struct dm_struct *dm, u32 reg_addr, u32 bit_mask, u32 data)202{203#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))204phy_set_bb_reg(dm->priv, reg_addr, bit_mask, data);205#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)206void *adapter = dm->adapter;207PHY_SetBBReg(adapter, reg_addr, bit_mask, data);208#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)209struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;210211rtl_set_bbreg(rtlpriv->hw, reg_addr, bit_mask, data);212#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)213struct rtw_dev *rtwdev = dm->adapter;214215rtw_set_reg_with_mask(rtwdev, reg_addr, bit_mask, data);216#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)217phy_set_bb_reg(dm->adapter, reg_addr, bit_mask, data);218#else219phy_set_bb_reg(dm->adapter, reg_addr, bit_mask, data);220#endif221222if (dm->en_reg_mntr_mac)223pr_debug("MAC:addr=0x%x, mask=0x%x, data=0x%x\n",224reg_addr, bit_mask, data);225}226227u32 odm_get_mac_reg(struct dm_struct *dm, u32 reg_addr, u32 bit_mask)228{229#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))230return phy_query_bb_reg(dm->priv, reg_addr, bit_mask);231#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)232return PHY_QueryMacReg(dm->adapter, reg_addr, bit_mask);233#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)234struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;235236return rtl_get_bbreg(rtlpriv->hw, reg_addr, bit_mask);237#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)238struct rtw_dev *rtwdev = dm->adapter;239240return rtw_get_reg_with_mask(rtwdev, reg_addr, bit_mask);241#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)242return phy_query_bb_reg(dm->adapter, reg_addr, bit_mask);243#else244return phy_query_mac_reg(dm->adapter, reg_addr, bit_mask);245#endif246}247248void odm_set_bb_reg(struct dm_struct *dm, u32 reg_addr, u32 bit_mask, u32 data)249{250#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))251phy_set_bb_reg(dm->priv, reg_addr, bit_mask, data);252#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)253void *adapter = dm->adapter;254PHY_SetBBReg(adapter, reg_addr, bit_mask, data);255#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)256struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;257258rtl_set_bbreg(rtlpriv->hw, reg_addr, bit_mask, data);259#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)260struct rtw_dev *rtwdev = dm->adapter;261262rtw_set_reg_with_mask(rtwdev, reg_addr, bit_mask, data);263#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)264phy_set_bb_reg(dm->adapter, reg_addr, bit_mask, data);265#else266phy_set_bb_reg(dm->adapter, reg_addr, bit_mask, data);267#endif268269if (dm->en_reg_mntr_bb)270pr_debug("BB:addr=0x%x, mask=0x%x, data=0x%x\n",271reg_addr, bit_mask, data);272}273274u32 odm_get_bb_reg(struct dm_struct *dm, u32 reg_addr, u32 bit_mask)275{276#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))277return phy_query_bb_reg(dm->priv, reg_addr, bit_mask);278#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)279void *adapter = dm->adapter;280return PHY_QueryBBReg(adapter, reg_addr, bit_mask);281#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)282struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;283284return rtl_get_bbreg(rtlpriv->hw, reg_addr, bit_mask);285#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)286struct rtw_dev *rtwdev = dm->adapter;287288return rtw_get_reg_with_mask(rtwdev, reg_addr, bit_mask);289#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)290return phy_query_bb_reg(dm->adapter, reg_addr, bit_mask);291#else292return phy_query_bb_reg(dm->adapter, reg_addr, bit_mask);293#endif294}295296void odm_set_rf_reg(struct dm_struct *dm, u8 e_rf_path, u32 reg_addr,297u32 bit_mask, u32 data)298{299#if (DM_ODM_SUPPORT_TYPE & ODM_AP)300phy_set_rf_reg(dm->priv, e_rf_path, reg_addr, bit_mask, data);301#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)302void *adapter = dm->adapter;303PHY_SetRFReg(adapter, e_rf_path, reg_addr, bit_mask, data);304ODM_delay_us(2);305306#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)307struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;308309rtl_set_rfreg(rtlpriv->hw, e_rf_path, reg_addr, bit_mask, data);310#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)311struct rtw_dev *rtwdev = dm->adapter;312313rtw_write_rf(rtwdev, e_rf_path, reg_addr, bit_mask, data);314#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)315phy_set_rf_reg(dm->adapter, e_rf_path, reg_addr, bit_mask, data);316#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)317phy_set_rf_reg(dm->adapter, e_rf_path, reg_addr, bit_mask, data);318ODM_delay_us(2);319#endif320321if (dm->en_reg_mntr_rf)322pr_debug("RF:path=0x%x, addr=0x%x, mask=0x%x, data=0x%x\n",323e_rf_path, reg_addr, bit_mask, data);324}325326u32 odm_get_rf_reg(struct dm_struct *dm, u8 e_rf_path, u32 reg_addr,327u32 bit_mask)328{329#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))330return phy_query_rf_reg(dm->priv, e_rf_path, reg_addr, bit_mask, 1);331#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)332void *adapter = dm->adapter;333return PHY_QueryRFReg(adapter, e_rf_path, reg_addr, bit_mask);334#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)335struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;336337return rtl_get_rfreg(rtlpriv->hw, e_rf_path, reg_addr, bit_mask);338#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)339struct rtw_dev *rtwdev = dm->adapter;340341return rtw_read_rf(rtwdev, e_rf_path, reg_addr, bit_mask);342#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)343return phy_query_rf_reg(dm->adapter, e_rf_path, reg_addr, bit_mask);344#else345return phy_query_rf_reg(dm->adapter, e_rf_path, reg_addr, bit_mask);346#endif347}348349enum hal_status350phydm_set_reg_by_fw(struct dm_struct *dm, enum phydm_halmac_param config_type,351u32 offset, u32 data, u32 mask, enum rf_path e_rf_path,352u32 delay_time)353{354#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))355return HAL_MAC_Config_PHY_WriteNByte(dm,356config_type,357offset,358data,359mask,360e_rf_path,361delay_time);362#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)363#if (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)364PHYDM_DBG(dm, DBG_CMN, "Not support for CE MAC80211 driver!\n");365#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)366return -ENOTSUPP;367#else368return rtw_phydm_cfg_phy_para(dm,369config_type,370offset,371data,372mask,373e_rf_path,374delay_time);375#endif376#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)377PHYDM_DBG(dm, DBG_CMN, "Not support for CE MAC80211 driver!\n");378#endif379}380381/*@382* ODM Memory relative API.383*/384void odm_allocate_memory(struct dm_struct *dm, void **ptr, u32 length)385{386#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))387*ptr = kmalloc(length, GFP_ATOMIC);388#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)389*ptr = kmalloc(length, GFP_ATOMIC);390#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)391*ptr = kmalloc(length, GFP_ATOMIC);392#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)393*ptr = rtw_zvmalloc(length);394#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)395void *adapter = dm->adapter;396PlatformAllocateMemory(adapter, ptr, length);397#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)398*ptr = rtw_zvmalloc(length);399#endif400}401402/* @length could be ignored, used to detect memory leakage. */403void odm_free_memory(struct dm_struct *dm, void *ptr, u32 length)404{405#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))406kfree(ptr);407#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)408kfree(ptr);409#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)410kfree(ptr);411#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)412rtw_vmfree(ptr, length);413#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)414/* struct void* adapter = dm->adapter; */415PlatformFreeMemory(ptr, length);416#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)417rtw_vmfree(ptr, length);418#endif419}420421void odm_move_memory(struct dm_struct *dm, void *dest, void *src, u32 length)422{423#if (DM_ODM_SUPPORT_TYPE & ODM_AP)424memcpy(dest, src, length);425#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)426memcpy(dest, src, length);427#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)428memcpy(dest, src, length);429#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)430_rtw_memcpy(dest, src, length);431#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)432PlatformMoveMemory(dest, src, length);433#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)434rtw_memcpy(dest, src, length);435#endif436}437438void odm_memory_set(struct dm_struct *dm, void *pbuf, s8 value, u32 length)439{440#if (DM_ODM_SUPPORT_TYPE & ODM_AP)441memset(pbuf, value, length);442#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)443memset(pbuf, value, length);444#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)445memset(pbuf, value, length);446#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)447_rtw_memset(pbuf, value, length);448#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)449PlatformFillMemory(pbuf, length, value);450#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)451rtw_memset(pbuf, value, length);452#endif453}454455s32 odm_compare_memory(struct dm_struct *dm, void *buf1, void *buf2, u32 length)456{457#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))458return memcmp(buf1, buf2, length);459#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)460return memcmp(buf1, buf2, length);461#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)462return memcmp(buf1, buf2, length);463#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)464return _rtw_memcmp(buf1, buf2, length);465#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)466return PlatformCompareMemory(buf1, buf2, length);467#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)468return rtw_memcmp(buf1, buf2, length);469#endif470}471472/*@473* ODM MISC relative API.474*/475void odm_acquire_spin_lock(struct dm_struct *dm, enum rt_spinlock_type type)476{477#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))478479#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)480struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;481482rtl_odm_acquirespinlock(rtlpriv, type);483#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)484struct rtw_dev *rtwdev = dm->adapter;485486spin_lock(&rtwdev->hal.dm_lock);487#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)488void *adapter = dm->adapter;489rtw_odm_acquirespinlock(adapter, type);490#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)491void *adapter = dm->adapter;492PlatformAcquireSpinLock(adapter, type);493#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)494void *adapter = dm->adapter;495496rtw_odm_acquirespinlock(adapter, type);497#endif498}499500void odm_release_spin_lock(struct dm_struct *dm, enum rt_spinlock_type type)501{502#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))503504#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)505struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;506507rtl_odm_releasespinlock(rtlpriv, type);508#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)509struct rtw_dev *rtwdev = dm->adapter;510511spin_unlock(&rtwdev->hal.dm_lock);512#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)513void *adapter = dm->adapter;514rtw_odm_releasespinlock(adapter, type);515#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)516void *adapter = dm->adapter;517PlatformReleaseSpinLock(adapter, type);518#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)519void *adapter = dm->adapter;520521rtw_odm_releasespinlock(adapter, type);522#endif523}524525#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)526/*@527* Work item relative API. FOr MP driver only~!528* */529void odm_initialize_work_item(530struct dm_struct *dm,531PRT_WORK_ITEM work_item,532RT_WORKITEM_CALL_BACK callback,533void *context,534const char *id)535{536#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))537538#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)539540#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)541void *adapter = dm->adapter;542PlatformInitializeWorkItem(adapter, work_item, callback, context, id);543#endif544}545546void odm_start_work_item(547PRT_WORK_ITEM p_rt_work_item)548{549#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))550551#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)552553#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)554PlatformStartWorkItem(p_rt_work_item);555#endif556}557558void odm_stop_work_item(559PRT_WORK_ITEM p_rt_work_item)560{561#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))562563#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)564565#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)566PlatformStopWorkItem(p_rt_work_item);567#endif568}569570void odm_free_work_item(571PRT_WORK_ITEM p_rt_work_item)572{573#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))574575#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)576577#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)578PlatformFreeWorkItem(p_rt_work_item);579#endif580}581582void odm_schedule_work_item(583PRT_WORK_ITEM p_rt_work_item)584{585#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))586587#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)588589#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)590PlatformScheduleWorkItem(p_rt_work_item);591#endif592}593594boolean595odm_is_work_item_scheduled(596PRT_WORK_ITEM p_rt_work_item)597{598#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))599600#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)601602#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)603return PlatformIsWorkItemScheduled(p_rt_work_item);604#endif605}606#endif607608/*@609* ODM Timer relative API.610*/611612void ODM_delay_ms(u32 ms)613{614#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))615delay_ms(ms);616#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)617mdelay(ms);618#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)619mdelay(ms);620#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)621rtw_mdelay_os(ms);622#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)623delay_ms(ms);624#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)625rtw_mdelay_os(ms);626#endif627}628629void ODM_delay_us(u32 us)630{631#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))632delay_us(us);633#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)634udelay(us);635#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)636udelay(us);637#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)638rtw_udelay_os(us);639#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)640PlatformStallExecution(us);641#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)642rtw_udelay_os(us);643#endif644}645646void ODM_sleep_ms(u32 ms)647{648#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))649delay_ms(ms);650#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)651msleep(ms);652#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)653msleep(ms);654#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)655rtw_msleep_os(ms);656#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)657delay_ms(ms);658#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)659rtw_msleep_os(ms);660#endif661}662663void ODM_sleep_us(u32 us)664{665#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))666delay_us(us);667#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)668usleep_range(us, us + 1);669#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)670usleep_range(us, us + 1);671#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)672rtw_usleep_os(us);673#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)674PlatformStallExecution(us);675#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)676rtw_usleep_os(us);677#endif678}679680void odm_set_timer(struct dm_struct *dm, struct phydm_timer_list *timer,681u32 ms_delay)682{683#if (DM_ODM_SUPPORT_TYPE & ODM_AP)684mod_timer(timer, jiffies + RTL_MILISECONDS_TO_JIFFIES(ms_delay));685#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)686mod_timer(timer, jiffies + msecs_to_jiffies(ms_delay));687#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)688mod_timer(&timer->timer, jiffies + msecs_to_jiffies(ms_delay));689#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)690_set_timer(timer, ms_delay); /* @ms */691#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)692void *adapter = dm->adapter;693PlatformSetTimer(adapter, timer, ms_delay);694#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)695rtw_set_timer(timer, ms_delay); /* @ms */696#endif697}698699void odm_initialize_timer(struct dm_struct *dm, struct phydm_timer_list *timer,700void *call_back_func, void *context,701const char *sz_id)702{703#if (DM_ODM_SUPPORT_TYPE & ODM_AP)704init_timer(timer);705timer->function = call_back_func;706timer->data = (unsigned long)dm;707#if 0708/*@mod_timer(timer, jiffies+RTL_MILISECONDS_TO_JIFFIES(10)); */709#endif710#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)711timer_setup(timer, call_back_func, 0);712#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)713struct _ADAPTER *adapter = dm->adapter;714715_init_timer(timer, adapter->pnetdev, call_back_func, dm);716#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)717void *adapter = dm->adapter;718719PlatformInitializeTimer(adapter, timer, (RT_TIMER_CALL_BACK)call_back_func, context, sz_id);720#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)721struct _ADAPTER *adapter = dm->adapter;722723rtw_init_timer(timer, adapter->pnetdev, (TIMER_FUN)call_back_func, dm, NULL);724#endif725}726727void odm_cancel_timer(struct dm_struct *dm, struct phydm_timer_list *timer)728{729#if (DM_ODM_SUPPORT_TYPE & ODM_AP)730del_timer(timer);731#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)732del_timer(timer);733#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)734del_timer(&timer->timer);735#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)736_cancel_timer_ex(timer);737#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)738void *adapter = dm->adapter;739PlatformCancelTimer(adapter, timer);740#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)741rtw_cancel_timer(timer);742#endif743}744745void odm_release_timer(struct dm_struct *dm, struct phydm_timer_list *timer)746{747#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))748749#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)750751#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)752753void *adapter = dm->adapter;754755/* @<20120301, Kordan> If the initilization fails,756* InitializeAdapterXxx will return regardless of InitHalDm.757* Hence, uninitialized timers cause BSOD when the driver758* releases resources since the init fail.759*/760if (timer == 0) {761PHYDM_DBG(dm, ODM_COMP_INIT,762"[%s] Timer is NULL! Please check!\n", __func__);763return;764}765766PlatformReleaseTimer(adapter, timer);767#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)768rtw_del_timer(timer);769#endif770}771772u8 phydm_trans_h2c_id(struct dm_struct *dm, u8 phydm_h2c_id)773{774u8 platform_h2c_id = phydm_h2c_id;775776switch (phydm_h2c_id) {777/* @1 [0] */778case ODM_H2C_RSSI_REPORT:779780#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)781#if (RTL8188E_SUPPORT == 1)782if (dm->support_ic_type == ODM_RTL8188E)783platform_h2c_id = H2C_88E_RSSI_REPORT;784else785#endif786platform_h2c_id = H2C_RSSI_REPORT;787788#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)789#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)790#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)791platform_h2c_id = H2C_RSSI_SETTING;792793#elif (DM_ODM_SUPPORT_TYPE & ODM_AP)794#if ((RTL8881A_SUPPORT == 1) || (RTL8192E_SUPPORT == 1) || (RTL8814A_SUPPORT == 1) || (RTL8822B_SUPPORT == 1) || (RTL8197F_SUPPORT == 1) || (RTL8192F_SUPPORT == 1)) /*@jj add 20170822*/795if (dm->support_ic_type == ODM_RTL8881A || dm->support_ic_type == ODM_RTL8192E || dm->support_ic_type & PHYDM_IC_3081_SERIES)796platform_h2c_id = H2C_88XX_RSSI_REPORT;797else798#endif799#if (RTL8812A_SUPPORT == 1)800if (dm->support_ic_type == ODM_RTL8812)801platform_h2c_id = H2C_8812_RSSI_REPORT;802else803#endif804{805}806#endif807808break;809810/* @1 [3] */811case ODM_H2C_WIFI_CALIBRATION:812#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)813platform_h2c_id = H2C_WIFI_CALIBRATION;814815#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)816#if (RTL8723B_SUPPORT == 1)817platform_h2c_id = H2C_8723B_BT_WLAN_CALIBRATION;818#endif819820#elif (DM_ODM_SUPPORT_TYPE & ODM_AP)821#endif822break;823824/* @1 [4] */825case ODM_H2C_IQ_CALIBRATION:826#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)827platform_h2c_id = H2C_IQ_CALIBRATION;828829#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)830#if ((RTL8812A_SUPPORT == 1) || (RTL8821A_SUPPORT == 1))831platform_h2c_id = H2C_8812_IQ_CALIBRATION;832#endif833#elif (DM_ODM_SUPPORT_TYPE & ODM_AP)834#endif835836break;837/* @1 [5] */838case ODM_H2C_RA_PARA_ADJUST:839840#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)841platform_h2c_id = H2C_RA_PARA_ADJUST;842#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)843#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)844#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)845#if ((RTL8812A_SUPPORT == 1) || (RTL8821A_SUPPORT == 1))846platform_h2c_id = H2C_8812_RA_PARA_ADJUST;847#elif ((RTL8814A_SUPPORT == 1) || (RTL8822B_SUPPORT == 1))848platform_h2c_id = H2C_RA_PARA_ADJUST;849#elif (RTL8192E_SUPPORT == 1)850platform_h2c_id = H2C_8192E_RA_PARA_ADJUST;851#elif (RTL8723B_SUPPORT == 1)852platform_h2c_id = H2C_8723B_RA_PARA_ADJUST;853#endif854855#elif (DM_ODM_SUPPORT_TYPE & ODM_AP)856#if ((RTL8881A_SUPPORT == 1) || (RTL8192E_SUPPORT == 1) || (RTL8814A_SUPPORT == 1) || (RTL8822B_SUPPORT == 1) || (RTL8197F_SUPPORT == 1) || (RTL8192F_SUPPORT == 1)) /*@jj add 20170822*/857if (dm->support_ic_type == ODM_RTL8881A || dm->support_ic_type == ODM_RTL8192E || dm->support_ic_type & PHYDM_IC_3081_SERIES)858platform_h2c_id = H2C_88XX_RA_PARA_ADJUST;859else860#endif861#if (RTL8812A_SUPPORT == 1)862if (dm->support_ic_type == ODM_RTL8812)863platform_h2c_id = H2C_8812_RA_PARA_ADJUST;864else865#endif866{867}868#endif869870break;871872/* @1 [6] */873case PHYDM_H2C_DYNAMIC_TX_PATH:874875#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)876#if (RTL8814A_SUPPORT == 1)877if (dm->support_ic_type == ODM_RTL8814A)878platform_h2c_id = H2C_8814A_DYNAMIC_TX_PATH;879#endif880#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)881#if (RTL8814A_SUPPORT == 1)882if (dm->support_ic_type == ODM_RTL8814A)883platform_h2c_id = H2C_DYNAMIC_TX_PATH;884#endif885#elif (DM_ODM_SUPPORT_TYPE & ODM_AP)886#if (RTL8814A_SUPPORT == 1)887if (dm->support_ic_type == ODM_RTL8814A)888platform_h2c_id = H2C_88XX_DYNAMIC_TX_PATH;889#endif890891#endif892893break;894895/* @[7]*/896case PHYDM_H2C_FW_TRACE_EN:897898#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)899900platform_h2c_id = H2C_FW_TRACE_EN;901902#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)903904platform_h2c_id = 0x49;905906#elif (DM_ODM_SUPPORT_TYPE & ODM_AP)907#if ((RTL8881A_SUPPORT == 1) || (RTL8192E_SUPPORT == 1) || (RTL8814A_SUPPORT == 1) || (RTL8822B_SUPPORT == 1) || (RTL8197F_SUPPORT == 1) || (RTL8192F_SUPPORT == 1)) /*@jj add 20170822*/908if (dm->support_ic_type == ODM_RTL8881A || dm->support_ic_type == ODM_RTL8192E || dm->support_ic_type & PHYDM_IC_3081_SERIES)909platform_h2c_id = H2C_88XX_FW_TRACE_EN;910else911#endif912#if (RTL8812A_SUPPORT == 1)913if (dm->support_ic_type == ODM_RTL8812)914platform_h2c_id = H2C_8812_FW_TRACE_EN;915else916#endif917{918}919920#endif921922break;923924case PHYDM_H2C_TXBF:925#if ((RTL8192E_SUPPORT == 1) || (RTL8812A_SUPPORT == 1))926platform_h2c_id = 0x41; /*@H2C_TxBF*/927#endif928break;929930case PHYDM_H2C_MU:931#if (RTL8822B_SUPPORT == 1)932platform_h2c_id = 0x4a; /*@H2C_MU*/933#endif934break;935936default:937platform_h2c_id = phydm_h2c_id;938break;939}940941return platform_h2c_id;942}943944/*@ODM FW relative API.*/945946void odm_fill_h2c_cmd(struct dm_struct *dm, u8 phydm_h2c_id, u32 cmd_len,947u8 *cmd_buf)948{949#if (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)950struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;951#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)952struct rtw_dev *rtwdev = dm->adapter;953u8 cmd_id, cmd_class;954u8 h2c_pkt[8];955#else956void *adapter = dm->adapter;957#endif958u8 h2c_id = phydm_trans_h2c_id(dm, phydm_h2c_id);959960PHYDM_DBG(dm, DBG_RA, "[H2C] h2c_id=((0x%x))\n", h2c_id);961962#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)963if (dm->support_ic_type == ODM_RTL8188E) {964if (!dm->ra_support88e)965FillH2CCmd88E(adapter, h2c_id, cmd_len, cmd_buf);966} else if (dm->support_ic_type == ODM_RTL8814A)967FillH2CCmd8814A(adapter, h2c_id, cmd_len, cmd_buf);968else if (dm->support_ic_type == ODM_RTL8822B)969FillH2CCmd8822B(adapter, h2c_id, cmd_len, cmd_buf);970else971FillH2CCmd(adapter, h2c_id, cmd_len, cmd_buf);972973#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)974975#ifdef DM_ODM_CE_MAC80211976rtlpriv->cfg->ops->fill_h2c_cmd(rtlpriv->hw, h2c_id, cmd_len, cmd_buf);977#elif defined(DM_ODM_CE_MAC80211_V2)978cmd_id = phydm_h2c_id & 0x1f;979cmd_class = (phydm_h2c_id >> RTW_H2C_CLASS_OFFSET) & 0x7;980memcpy(h2c_pkt + 1, cmd_buf, 7);981h2c_pkt[0] = phydm_h2c_id;982rtw_fw_send_h2c_packet(rtwdev, h2c_pkt, cmd_id, cmd_class);983/* TODO: implement fill h2c command for rtwlan */984#else985rtw_hal_fill_h2c_cmd(adapter, h2c_id, cmd_len, cmd_buf);986#endif987988#elif (DM_ODM_SUPPORT_TYPE & ODM_AP)989990#if (RTL8812A_SUPPORT == 1)991if (dm->support_ic_type == ODM_RTL8812) {992fill_h2c_cmd8812(dm->priv, h2c_id, cmd_len, cmd_buf);993} else994#endif995{996GET_HAL_INTERFACE(dm->priv)->fill_h2c_cmd_handler(dm->priv, h2c_id, cmd_len, cmd_buf);997}998999#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)1000rtw_hal_fill_h2c_cmd(adapter, h2c_id, cmd_len, cmd_buf);10011002#endif1003}10041005u8 phydm_c2H_content_parsing(void *dm_void, u8 c2h_cmd_id, u8 c2h_cmd_len,1006u8 *tmp_buf)1007{1008struct dm_struct *dm = (struct dm_struct *)dm_void;1009#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)1010void *adapter = dm->adapter;1011#endif1012u8 extend_c2h_sub_id = 0;1013u8 find_c2h_cmd = true;10141015if (c2h_cmd_len > 12 || c2h_cmd_len == 0) {1016pr_debug("[Warning] Error C2H ID=%d, len=%d\n",1017c2h_cmd_id, c2h_cmd_len);10181019find_c2h_cmd = false;1020return find_c2h_cmd;1021}10221023switch (c2h_cmd_id) {1024case PHYDM_C2H_DBG:1025phydm_fw_trace_handler(dm, tmp_buf, c2h_cmd_len);1026break;10271028case PHYDM_C2H_RA_RPT:1029phydm_c2h_ra_report_handler(dm, tmp_buf, c2h_cmd_len);1030break;10311032case PHYDM_C2H_RA_PARA_RPT:1033odm_c2h_ra_para_report_handler(dm, tmp_buf, c2h_cmd_len);1034break;1035#ifdef CONFIG_PATH_DIVERSITY1036case PHYDM_C2H_DYNAMIC_TX_PATH_RPT:1037if (dm->support_ic_type & (ODM_RTL8814A))1038phydm_c2h_dtp_handler(dm, tmp_buf, c2h_cmd_len);1039break;1040#endif10411042case PHYDM_C2H_IQK_FINISH:1043#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)10441045if (dm->support_ic_type & (ODM_RTL8812 | ODM_RTL8821)) {1046RT_TRACE(COMP_MP, DBG_LOUD, ("== FW IQK Finish ==\n"));1047odm_acquire_spin_lock(dm, RT_IQK_SPINLOCK);1048dm->rf_calibrate_info.is_iqk_in_progress = false;1049odm_release_spin_lock(dm, RT_IQK_SPINLOCK);1050dm->rf_calibrate_info.iqk_progressing_time = 0;1051dm->rf_calibrate_info.iqk_progressing_time = odm_get_progressing_time(dm, dm->rf_calibrate_info.iqk_start_time);1052}10531054#endif1055break;10561057case PHYDM_C2H_CLM_MONITOR:1058phydm_clm_c2h_report_handler(dm, tmp_buf, c2h_cmd_len);1059break;10601061case PHYDM_C2H_DBG_CODE:1062phydm_fw_trace_handler_code(dm, tmp_buf, c2h_cmd_len);1063break;10641065case PHYDM_C2H_EXTEND:1066extend_c2h_sub_id = tmp_buf[0];1067if (extend_c2h_sub_id == PHYDM_EXTEND_C2H_DBG_PRINT)1068phydm_fw_trace_handler_8051(dm, tmp_buf, c2h_cmd_len);10691070break;10711072default:1073find_c2h_cmd = false;1074break;1075}10761077return find_c2h_cmd;1078}10791080u64 odm_get_current_time(struct dm_struct *dm)1081{1082#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))1083return (u64)rtw_get_current_time();1084#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)1085return jiffies;1086#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)1087return jiffies;1088#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)1089return rtw_get_current_time();1090#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)1091return PlatformGetCurrentTime();1092#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)1093return rtw_get_current_time();1094#endif1095}10961097u64 odm_get_progressing_time(struct dm_struct *dm, u64 start_time)1098{1099#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))1100return rtw_get_passing_time_ms((u32)start_time);1101#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)1102return jiffies_to_msecs(jiffies - start_time);1103#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)1104return jiffies_to_msecs(jiffies - start_time);1105#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)1106return rtw_get_passing_time_ms((systime)start_time);1107#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)1108return ((PlatformGetCurrentTime() - start_time) >> 10);1109#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)1110return rtw_get_passing_time_ms(start_time);1111#endif1112}11131114#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE)) && \1115(!defined(DM_ODM_CE_MAC80211) && !defined(DM_ODM_CE_MAC80211_V2))11161117void phydm_set_hw_reg_handler_interface(struct dm_struct *dm, u8 RegName,1118u8 *val)1119{1120#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))1121struct _ADAPTER *adapter = dm->adapter;11221123#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)1124((PADAPTER)adapter)->HalFunc.SetHwRegHandler(adapter, RegName, val);1125#else1126adapter->hal_func.set_hw_reg_handler(adapter, RegName, val);1127#endif11281129#endif1130}11311132void phydm_get_hal_def_var_handler_interface(struct dm_struct *dm,1133enum _HAL_DEF_VARIABLE e_variable,1134void *value)1135{1136#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))1137struct _ADAPTER *adapter = dm->adapter;11381139#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)1140((PADAPTER)adapter)->HalFunc.GetHalDefVarHandler(adapter, e_variable, value);1141#else1142adapter->hal_func.get_hal_def_var_handler(adapter, e_variable, value);1143#endif11441145#endif1146}11471148#endif11491150void odm_set_tx_power_index_by_rate_section(struct dm_struct *dm,1151enum rf_path path, u8 ch,1152u8 section)1153{1154#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)1155void *adapter = dm->adapter;1156PHY_SetTxPowerIndexByRateSection(adapter, path, ch, section);1157#elif (DM_ODM_SUPPORT_TYPE == ODM_CE) && defined(DM_ODM_CE_MAC80211)1158void *adapter = dm->adapter;11591160phy_set_tx_power_index_by_rs(adapter, ch, path, section);1161#elif (DM_ODM_SUPPORT_TYPE == ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)1162#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)1163phy_set_tx_power_index_by_rate_section(dm->adapter, path, ch, section);1164#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)1165void *adapter = dm->adapter;11661167PHY_SetTxPowerIndexByRateSection(adapter, path, ch, section);1168#endif1169}11701171u8 odm_get_tx_power_index(struct dm_struct *dm, enum rf_path path, u8 rate,1172u8 bw, u8 ch)1173{1174#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)1175void *adapter = dm->adapter;11761177return PHY_GetTxPowerIndex(dm->adapter, path, rate, (CHANNEL_WIDTH)bw, ch);1178#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)1179void *adapter = dm->adapter;11801181return phy_get_tx_power_index(adapter, path, rate, bw, ch);1182#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)1183void *adapter = dm->adapter;11841185return phy_get_tx_power_index(adapter, path, rate, bw, ch);1186#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)1187return phy_get_tx_power_index(dm->adapter, path, rate, bw, ch);1188#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)1189void *adapter = dm->adapter;11901191return PHY_GetTxPowerIndex(dm->adapter, path, rate, bw, ch);1192#endif1193}11941195u8 odm_efuse_one_byte_read(struct dm_struct *dm, u16 addr, u8 *data,1196boolean b_pseu_do_test)1197{1198#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)1199void *adapter = dm->adapter;12001201return (u8)EFUSE_OneByteRead(adapter, addr, data, b_pseu_do_test);1202#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)1203void *adapter = dm->adapter;12041205return rtl_efuse_onebyte_read(adapter, addr, data, b_pseu_do_test);1206#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)1207return -1;1208#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)1209return efuse_onebyte_read(dm->adapter, addr, data, b_pseu_do_test);1210#elif (DM_ODM_SUPPORT_TYPE & ODM_AP)1211return Efuse_OneByteRead(dm, addr, data);1212#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)1213void *adapter = dm->adapter;12141215return (u8)efuse_OneByteRead(adapter, addr, data, b_pseu_do_test);1216#endif1217}12181219void odm_efuse_logical_map_read(struct dm_struct *dm, u8 type, u16 offset,1220u32 *data)1221{1222#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)1223void *adapter = dm->adapter;12241225EFUSE_ShadowRead(adapter, type, offset, data);1226#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)1227void *adapter = dm->adapter;12281229rtl_efuse_logical_map_read(adapter, type, offset, data);1230#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)1231#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)1232efuse_logical_map_read(dm->adapter, type, offset, data);1233#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)1234void *adapter = dm->adapter;12351236EFUSE_ShadowRead(adapter, type, offset, data);1237#endif1238}12391240enum hal_status1241odm_iq_calibrate_by_fw(struct dm_struct *dm, u8 clear, u8 segment)1242{1243enum hal_status iqk_result = HAL_STATUS_FAILURE;12441245#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)1246struct _ADAPTER *adapter = dm->adapter;12471248if (HAL_MAC_FWIQK_Trigger(&GET_HAL_MAC_INFO(adapter), clear, segment) == 0)1249iqk_result = HAL_STATUS_SUCCESS;1250#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)1251#if (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)1252void *adapter = dm->adapter;12531254iqk_result = rtl_phydm_fw_iqk(adapter, clear, segment);1255#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)1256#else1257iqk_result = rtw_phydm_fw_iqk(dm, clear, segment);1258#endif1259#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)1260iqk_result = rtw_phydm_fw_iqk(dm, clear, segment);1261#endif1262return iqk_result;1263}12641265enum hal_status1266odm_dpk_by_fw(struct dm_struct *dm)1267{1268enum hal_status dpk_result = HAL_STATUS_FAILURE;1269#if 012701271#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)1272struct _ADAPTER *adapter = dm->adapter;12731274if (HAL_MAC_FWDPK_Trigger(&GET_HAL_MAC_INFO(adapter)) == 0)1275dpk_result = HAL_STATUS_SUCCESS;1276#else1277dpk_result = rtw_phydm_fw_dpk(dm);1278#endif12791280#endif1281return dpk_result;1282}12831284void phydm_cmn_sta_info_hook(struct dm_struct *dm, u8 mac_id,1285struct cmn_sta_info *pcmn_sta_info)1286{1287dm->phydm_sta_info[mac_id] = pcmn_sta_info;12881289if (is_sta_active(pcmn_sta_info))1290dm->phydm_macid_table[pcmn_sta_info->mac_id] = mac_id;1291}12921293void phydm_macid2sta_idx_table(struct dm_struct *dm, u8 entry_idx,1294struct cmn_sta_info *pcmn_sta_info)1295{1296if (is_sta_active(pcmn_sta_info))1297dm->phydm_macid_table[pcmn_sta_info->mac_id] = entry_idx;1298}12991300void phydm_add_interrupt_mask_handler(struct dm_struct *dm, u8 interrupt_type)1301{1302#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)1303#elif (DM_ODM_SUPPORT_TYPE == ODM_AP)13041305struct rtl8192cd_priv *priv = dm->priv;13061307#if IS_EXIST_PCI || IS_EXIST_EMBEDDED1308if (dm->support_interface == ODM_ITRF_PCIE)1309GET_HAL_INTERFACE(priv)->AddInterruptMaskHandler(priv,1310interrupt_type)1311;1312#endif13131314#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)1315#endif1316}13171318void phydm_enable_rx_related_interrupt_handler(struct dm_struct *dm)1319{1320#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)1321#elif (DM_ODM_SUPPORT_TYPE == ODM_AP)13221323struct rtl8192cd_priv *priv = dm->priv;13241325#if IS_EXIST_PCI || IS_EXIST_EMBEDDED1326if (dm->support_interface == ODM_ITRF_PCIE)1327GET_HAL_INTERFACE(priv)->EnableRxRelatedInterruptHandler(priv);1328#endif13291330#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)1331#endif1332}13331334#if 01335boolean1336phydm_get_txbf_en(1337struct dm_struct *dm,1338u16 mac_id,1339u8 i1340)1341{1342boolean txbf_en = false;13431344#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)1345#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && !defined(DM_ODM_CE_MAC80211)13461347#ifdef CONFIG_BEAMFORMING1348enum beamforming_cap beamform_cap;1349void *adapter = dm->adapter;1350#ifdef PHYDM_BEAMFORMING_SUPPORT1351beamform_cap =1352phydm_beamforming_get_entry_beam_cap_by_mac_id(dm, mac_id);1353#else/*@for drv beamforming*/1354beamform_cap =1355beamforming_get_entry_beam_cap_by_mac_id(&adapter->mlmepriv, mac_id);1356#endif1357if (beamform_cap & (BEAMFORMER_CAP_HT_EXPLICIT | BEAMFORMER_CAP_VHT_SU))1358txbf_en = true;1359else1360txbf_en = false;1361#endif /*@#ifdef CONFIG_BEAMFORMING*/13621363#elif (DM_ODM_SUPPORT_TYPE & ODM_AP)13641365#ifdef PHYDM_BEAMFORMING_SUPPORT1366u8 idx = 0xff;1367boolean act_bfer = false;1368BEAMFORMING_CAP beamform_cap = BEAMFORMING_CAP_NONE;1369PRT_BEAMFORMING_ENTRY entry = NULL;1370struct rtl8192cd_priv *priv = dm->priv;1371#if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY))1372struct _BF_DIV_COEX_ *dm_bdc_table = &dm->dm_bdc_table;13731374dm_bdc_table->num_txbfee_client = 0;1375dm_bdc_table->num_txbfer_client = 0;1376#endif1377#endif13781379#ifdef PHYDM_BEAMFORMING_SUPPORT1380beamform_cap = Beamforming_GetEntryBeamCapByMacId(priv, mac_id);1381entry = Beamforming_GetEntryByMacId(priv, mac_id, &idx);1382if (beamform_cap & (BEAMFORMER_CAP_HT_EXPLICIT | BEAMFORMER_CAP_VHT_SU)) {1383if (entry->Sounding_En)1384txbf_en = true;1385else1386txbf_en = false;1387act_bfer = true;1388}1389#if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY)) /*@BDC*/1390if (act_bfer == true) {1391dm_bdc_table->w_bfee_client[i] = true; /* @AP act as BFer */1392dm_bdc_table->num_txbfee_client++;1393} else1394dm_bdc_table->w_bfee_client[i] = false; /* @AP act as BFer */13951396if (beamform_cap & (BEAMFORMEE_CAP_HT_EXPLICIT | BEAMFORMEE_CAP_VHT_SU)) {1397dm_bdc_table->w_bfer_client[i] = true; /* @AP act as BFee */1398dm_bdc_table->num_txbfer_client++;1399} else1400dm_bdc_table->w_bfer_client[i] = false; /* @AP act as BFer */14011402#endif1403#endif14041405#endif1406return txbf_en;1407}1408#endif14091410void phydm_iqk_wait(struct dm_struct *dm, u32 timeout)1411{1412#if (DM_ODM_SUPPORT_TYPE == ODM_CE)1413#if (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)1414PHYDM_DBG(dm, DBG_CMN, "Not support for CE MAC80211 driver!\n");1415#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)1416#else1417void *adapter = dm->adapter;14181419rtl8812_iqk_wait(adapter, timeout);1420#endif1421#endif1422}14231424u8 phydm_get_hwrate_to_mrate(struct dm_struct *dm, u8 rate)1425{1426#if (DM_ODM_SUPPORT_TYPE == ODM_IOT)1427return HwRateToMRate(rate);1428#endif1429return 0;1430}14311432void phydm_set_crystalcap(struct dm_struct *dm, u8 crystal_cap)1433{1434#if (DM_ODM_SUPPORT_TYPE == ODM_IOT)1435ROM_odm_SetCrystalCap(dm, crystal_cap);1436#endif1437}14381439void phydm_run_in_thread_cmd(struct dm_struct *dm, void (*func)(void *),1440void *context)1441{1442#if (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)1443PHYDM_DBG(dm, DBG_CMN, "Not support for CE MAC80211 driver!\n");1444#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)1445void *adapter = dm->adapter;14461447rtw_run_in_thread_cmd(adapter, func, context);1448#endif1449}14501451u8 phydm_get_tx_rate(struct dm_struct *dm)1452{1453struct _hal_rf_ *rf = &dm->rf_table;1454#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)1455struct _ADAPTER *adapter = dm->adapter;1456#endif1457u8 tx_rate = 0xff;1458u8 mpt_rate_index = 0;14591460if (*dm->mp_mode == 1) {1461#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))1462#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)1463#if (MP_DRIVER == 1)1464PMPT_CONTEXT p_mpt_ctx = &adapter->MptCtx;14651466tx_rate = MptToMgntRate(p_mpt_ctx->MptRateIndex);1467#endif1468#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)1469#ifdef CONFIG_MP_INCLUDED1470if (rf->mp_rate_index)1471mpt_rate_index = *rf->mp_rate_index;14721473tx_rate = mpt_to_mgnt_rate(mpt_rate_index);1474#endif1475#endif1476#endif1477} else {1478u16 rate = *dm->forced_data_rate;14791480if (!rate) { /*auto rate*/1481#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)1482struct _ADAPTER *adapter = dm->adapter;14831484tx_rate = ((PADAPTER)adapter)->HalFunc.GetHwRateFromMRateHandler(dm->tx_rate);1485#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)1486tx_rate = dm->tx_rate;1487#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)1488if (dm->number_linked_client != 0)1489tx_rate = hw_rate_to_m_rate(dm->tx_rate);1490else1491tx_rate = rf->p_rate_index;1492#endif1493} else { /*force rate*/1494tx_rate = (u8)rate;1495}1496}14971498return tx_rate;1499}15001501u8 phydm_get_tx_power_dbm(struct dm_struct *dm, u8 rf_path,1502u8 rate, u8 bandwidth, u8 channel)1503{1504u8 tx_power_dbm = 0;1505#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)1506struct _ADAPTER *adapter = dm->adapter;1507tx_power_dbm = PHY_GetTxPowerFinalAbsoluteValue(adapter, rf_path, rate, bandwidth, channel);1508#endif15091510#if (DM_ODM_SUPPORT_TYPE == ODM_CE)1511tx_power_dbm = phy_get_tx_power_final_absolute_value(dm->adapter, rf_path, rate, bandwidth, channel);1512#endif15131514#if (DM_ODM_SUPPORT_TYPE == ODM_AP)1515tx_power_dbm = PHY_GetTxPowerFinalAbsoluteValue(dm, rf_path, rate, bandwidth, channel);1516#endif1517return tx_power_dbm;1518}15191520u64 phydm_division64(u64 x, u64 y)1521{1522#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))1523do_div(x, y);1524return x;1525#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)1526return x / y;1527#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)1528return rtw_division64(x, y);1529#endif1530}153115321533