1*4882a593Smuzhiyun /****************************************************************************** 2*4882a593Smuzhiyun * 3*4882a593Smuzhiyun * Copyright(c) 2007 - 2017 Realtek Corporation. 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * This program is free software; you can redistribute it and/or modify it 6*4882a593Smuzhiyun * under the terms of version 2 of the GNU General Public License as 7*4882a593Smuzhiyun * published by the Free Software Foundation. 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * This program is distributed in the hope that it will be useful, but WITHOUT 10*4882a593Smuzhiyun * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11*4882a593Smuzhiyun * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12*4882a593Smuzhiyun * more details. 13*4882a593Smuzhiyun * 14*4882a593Smuzhiyun * The full GNU General Public License is included in this distribution in the 15*4882a593Smuzhiyun * file called LICENSE. 16*4882a593Smuzhiyun * 17*4882a593Smuzhiyun * Contact Information: 18*4882a593Smuzhiyun * wlanfae <wlanfae@realtek.com> 19*4882a593Smuzhiyun * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park, 20*4882a593Smuzhiyun * Hsinchu 300, Taiwan. 21*4882a593Smuzhiyun * 22*4882a593Smuzhiyun * Larry Finger <Larry.Finger@lwfinger.net> 23*4882a593Smuzhiyun * 24*4882a593Smuzhiyun *****************************************************************************/ 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun #ifndef __ODM_INTERFACE_H__ 27*4882a593Smuzhiyun #define __ODM_INTERFACE_H__ 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun #define INTERFACE_VERSION "1.2" 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun #define pdm_set_reg odm_set_bb_reg 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun /*@=========== Constant/Structure/Enum/... Define*/ 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun enum phydm_h2c_cmd { 36*4882a593Smuzhiyun PHYDM_H2C_RA_MASK = 0x40, 37*4882a593Smuzhiyun PHYDM_H2C_TXBF = 0x41, 38*4882a593Smuzhiyun ODM_H2C_RSSI_REPORT = 0x42, 39*4882a593Smuzhiyun ODM_H2C_IQ_CALIBRATION = 0x45, 40*4882a593Smuzhiyun PHYDM_RA_MASK_ABOVE_3SS = 0x46, 41*4882a593Smuzhiyun ODM_H2C_RA_PARA_ADJUST = 0x47, 42*4882a593Smuzhiyun PHYDM_H2C_DYNAMIC_TX_PATH = 0x48, 43*4882a593Smuzhiyun PHYDM_H2C_FW_TRACE_EN = 0x49, 44*4882a593Smuzhiyun ODM_H2C_WIFI_CALIBRATION = 0x6d, 45*4882a593Smuzhiyun PHYDM_H2C_MU = 0x4a, 46*4882a593Smuzhiyun PHYDM_H2C_FW_GENERAL_INIT = 0x4c, 47*4882a593Smuzhiyun PHYDM_H2C_FW_CLM_MNTR = 0x4d, 48*4882a593Smuzhiyun PHYDM_H2C_MCC = 0x4f, 49*4882a593Smuzhiyun PHYDM_H2C_RESP_TX_PATH_CTRL = 0x50, 50*4882a593Smuzhiyun PHYDM_H2C_RESP_TX_ANT_CTRL = 0x51, 51*4882a593Smuzhiyun PHYDM_H2C_FW_DM_CTRL = 0x55, 52*4882a593Smuzhiyun ODM_MAX_H2CCMD 53*4882a593Smuzhiyun }; 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun enum phydm_c2h_evt { 56*4882a593Smuzhiyun PHYDM_C2H_DBG = 0, 57*4882a593Smuzhiyun PHYDM_C2H_LB = 1, 58*4882a593Smuzhiyun PHYDM_C2H_XBF = 2, 59*4882a593Smuzhiyun PHYDM_C2H_TX_REPORT = 3, 60*4882a593Smuzhiyun PHYDM_C2H_INFO = 9, 61*4882a593Smuzhiyun PHYDM_C2H_BT_MP = 11, 62*4882a593Smuzhiyun PHYDM_C2H_RA_RPT = 12, 63*4882a593Smuzhiyun PHYDM_C2H_RA_PARA_RPT = 14, 64*4882a593Smuzhiyun PHYDM_C2H_DYNAMIC_TX_PATH_RPT = 15, 65*4882a593Smuzhiyun PHYDM_C2H_IQK_FINISH = 17, /*@0x11*/ 66*4882a593Smuzhiyun PHYDM_C2H_CLM_MONITOR = 0x2a, 67*4882a593Smuzhiyun PHYDM_C2H_DBG_CODE = 0xFE, 68*4882a593Smuzhiyun PHYDM_C2H_EXTEND = 0xFF, 69*4882a593Smuzhiyun }; 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun enum phydm_extend_c2h_evt { 72*4882a593Smuzhiyun PHYDM_EXTEND_C2H_DBG_PRINT = 0 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun }; 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun enum phydm_halmac_param { 77*4882a593Smuzhiyun PHYDM_HALMAC_CMD_MAC_W8 = 0, 78*4882a593Smuzhiyun PHYDM_HALMAC_CMD_MAC_W16 = 1, 79*4882a593Smuzhiyun PHYDM_HALMAC_CMD_MAC_W32 = 2, 80*4882a593Smuzhiyun PHYDM_HALMAC_CMD_BB_W8, 81*4882a593Smuzhiyun PHYDM_HALMAC_CMD_BB_W16, 82*4882a593Smuzhiyun PHYDM_HALMAC_CMD_BB_W32, 83*4882a593Smuzhiyun PHYDM_HALMAC_CMD_RF_W, 84*4882a593Smuzhiyun PHYDM_HALMAC_CMD_DELAY_US, 85*4882a593Smuzhiyun PHYDM_HALMAC_CMD_DELAY_MS, 86*4882a593Smuzhiyun PHYDM_HALMAC_CMD_END = 0XFF, 87*4882a593Smuzhiyun }; 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun /*@=========== Macro Define*/ 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun #define _reg_all(_name) ODM_##_name 92*4882a593Smuzhiyun #define _reg_ic(_name, _ic) ODM_##_name##_ic 93*4882a593Smuzhiyun #define _bit_all(_name) BIT_##_name 94*4882a593Smuzhiyun #define _bit_ic(_name, _ic) BIT_##_name##_ic 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun #if defined(DM_ODM_CE_MAC80211) 97*4882a593Smuzhiyun #define ODM_BIT(name, dm) \ 98*4882a593Smuzhiyun ((dm->support_ic_type & ODM_IC_11N_SERIES) ? \ 99*4882a593Smuzhiyun ODM_BIT_##name##_11N : ODM_BIT_##name##_11AC) 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun #define ODM_REG(name, dm) \ 102*4882a593Smuzhiyun ((dm->support_ic_type & ODM_IC_11N_SERIES) ? \ 103*4882a593Smuzhiyun ODM_REG_##name##_11N : ODM_REG_##name##_11AC) 104*4882a593Smuzhiyun #else 105*4882a593Smuzhiyun #define _reg_11N(_name) ODM_REG_##_name##_11N 106*4882a593Smuzhiyun #define _reg_11AC(_name) ODM_REG_##_name##_11AC 107*4882a593Smuzhiyun #define _bit_11N(_name) ODM_BIT_##_name##_11N 108*4882a593Smuzhiyun #define _bit_11AC(_name) ODM_BIT_##_name##_11AC 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun #ifdef __ECOS 111*4882a593Smuzhiyun #define _rtk_cat(_name, _ic_type, _func) \ 112*4882a593Smuzhiyun ( \ 113*4882a593Smuzhiyun ((_ic_type) & ODM_IC_11N_SERIES) ? _func##_11N(_name) : \ 114*4882a593Smuzhiyun _func##_11AC(_name)) 115*4882a593Smuzhiyun #else 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun #define _cat(_name, _ic_type, _func) \ 118*4882a593Smuzhiyun ( \ 119*4882a593Smuzhiyun ((_ic_type) & ODM_IC_11N_SERIES) ? _func##_11N(_name) : \ 120*4882a593Smuzhiyun _func##_11AC(_name)) 121*4882a593Smuzhiyun #endif 122*4882a593Smuzhiyun /*@ 123*4882a593Smuzhiyun * only sample code 124*4882a593Smuzhiyun *#define _cat(_name, _ic_type, _func) \ 125*4882a593Smuzhiyun * ( \ 126*4882a593Smuzhiyun * ((_ic_type) & ODM_RTL8188E) ? _func##_ic(_name, _8188E) :\ 127*4882a593Smuzhiyun * _func##_ic(_name, _8195) \ 128*4882a593Smuzhiyun * ) 129*4882a593Smuzhiyun */ 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun /* @_name: name of register or bit. 132*4882a593Smuzhiyun * Example: "ODM_REG(R_A_AGC_CORE1, dm)" 133*4882a593Smuzhiyun * gets "ODM_R_A_AGC_CORE1" or "ODM_R_A_AGC_CORE1_8192C", 134*4882a593Smuzhiyun * depends on support_ic_type. 135*4882a593Smuzhiyun */ 136*4882a593Smuzhiyun #ifdef __ECOS 137*4882a593Smuzhiyun #define ODM_REG(_name, _pdm_odm) \ 138*4882a593Smuzhiyun _rtk_cat(_name, _pdm_odm->support_ic_type, _reg) 139*4882a593Smuzhiyun #define ODM_BIT(_name, _pdm_odm) \ 140*4882a593Smuzhiyun _rtk_cat(_name, _pdm_odm->support_ic_type, _bit) 141*4882a593Smuzhiyun #else 142*4882a593Smuzhiyun #define ODM_REG(_name, _pdm_odm) \ 143*4882a593Smuzhiyun _cat(_name, _pdm_odm->support_ic_type, _reg) 144*4882a593Smuzhiyun #define ODM_BIT(_name, _pdm_odm) \ 145*4882a593Smuzhiyun _cat(_name, _pdm_odm->support_ic_type, _bit) 146*4882a593Smuzhiyun #endif 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun #endif 149*4882a593Smuzhiyun /*@ 150*4882a593Smuzhiyun * =========== Extern Variable ??? It should be forbidden. 151*4882a593Smuzhiyun */ 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun /*@ 154*4882a593Smuzhiyun * =========== EXtern Function Prototype 155*4882a593Smuzhiyun */ 156*4882a593Smuzhiyun 157*4882a593Smuzhiyun u8 odm_read_1byte(struct dm_struct *dm, u32 reg_addr); 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun u16 odm_read_2byte(struct dm_struct *dm, u32 reg_addr); 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun u32 odm_read_4byte(struct dm_struct *dm, u32 reg_addr); 162*4882a593Smuzhiyun 163*4882a593Smuzhiyun void odm_write_1byte(struct dm_struct *dm, u32 reg_addr, u8 data); 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun void odm_write_2byte(struct dm_struct *dm, u32 reg_addr, u16 data); 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun void odm_write_4byte(struct dm_struct *dm, u32 reg_addr, u32 data); 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun void odm_set_mac_reg(struct dm_struct *dm, u32 reg_addr, u32 bit_mask, 170*4882a593Smuzhiyun u32 data); 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun u32 odm_get_mac_reg(struct dm_struct *dm, u32 reg_addr, u32 bit_mask); 173*4882a593Smuzhiyun 174*4882a593Smuzhiyun void odm_set_bb_reg(struct dm_struct *dm, u32 reg_addr, u32 bit_mask, u32 data); 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun u32 odm_get_bb_reg(struct dm_struct *dm, u32 reg_addr, u32 bit_mask); 177*4882a593Smuzhiyun 178*4882a593Smuzhiyun void odm_set_rf_reg(struct dm_struct *dm, u8 e_rf_path, u32 reg_addr, 179*4882a593Smuzhiyun u32 bit_mask, u32 data); 180*4882a593Smuzhiyun 181*4882a593Smuzhiyun u32 odm_get_rf_reg(struct dm_struct *dm, u8 e_rf_path, u32 reg_addr, 182*4882a593Smuzhiyun u32 bit_mask); 183*4882a593Smuzhiyun 184*4882a593Smuzhiyun /*@ 185*4882a593Smuzhiyun * Memory Relative Function. 186*4882a593Smuzhiyun */ 187*4882a593Smuzhiyun void odm_allocate_memory(struct dm_struct *dm, void **ptr, u32 length); 188*4882a593Smuzhiyun void odm_free_memory(struct dm_struct *dm, void *ptr, u32 length); 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun void odm_move_memory(struct dm_struct *dm, void *dest, void *src, u32 length); 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun s32 odm_compare_memory(struct dm_struct *dm, void *buf1, void *buf2, 193*4882a593Smuzhiyun u32 length); 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun void odm_memory_set(struct dm_struct *dm, void *pbuf, s8 value, u32 length); 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun /*@ 198*4882a593Smuzhiyun * ODM MISC-spin lock relative API. 199*4882a593Smuzhiyun */ 200*4882a593Smuzhiyun void odm_acquire_spin_lock(struct dm_struct *dm, enum rt_spinlock_type type); 201*4882a593Smuzhiyun 202*4882a593Smuzhiyun void odm_release_spin_lock(struct dm_struct *dm, enum rt_spinlock_type type); 203*4882a593Smuzhiyun 204*4882a593Smuzhiyun #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) 205*4882a593Smuzhiyun /*@ 206*4882a593Smuzhiyun * ODM MISC-workitem relative API. 207*4882a593Smuzhiyun */ 208*4882a593Smuzhiyun void odm_initialize_work_item( 209*4882a593Smuzhiyun struct dm_struct *dm, 210*4882a593Smuzhiyun PRT_WORK_ITEM p_rt_work_item, 211*4882a593Smuzhiyun RT_WORKITEM_CALL_BACK rt_work_item_callback, 212*4882a593Smuzhiyun void *context, 213*4882a593Smuzhiyun const char *sz_id); 214*4882a593Smuzhiyun 215*4882a593Smuzhiyun void odm_start_work_item( 216*4882a593Smuzhiyun PRT_WORK_ITEM p_rt_work_item); 217*4882a593Smuzhiyun 218*4882a593Smuzhiyun void odm_stop_work_item( 219*4882a593Smuzhiyun PRT_WORK_ITEM p_rt_work_item); 220*4882a593Smuzhiyun 221*4882a593Smuzhiyun void odm_free_work_item( 222*4882a593Smuzhiyun PRT_WORK_ITEM p_rt_work_item); 223*4882a593Smuzhiyun 224*4882a593Smuzhiyun void odm_schedule_work_item( 225*4882a593Smuzhiyun PRT_WORK_ITEM p_rt_work_item); 226*4882a593Smuzhiyun 227*4882a593Smuzhiyun boolean 228*4882a593Smuzhiyun odm_is_work_item_scheduled( 229*4882a593Smuzhiyun PRT_WORK_ITEM p_rt_work_item); 230*4882a593Smuzhiyun #endif 231*4882a593Smuzhiyun 232*4882a593Smuzhiyun /*@ 233*4882a593Smuzhiyun * ODM Timer relative API. 234*4882a593Smuzhiyun */ 235*4882a593Smuzhiyun void ODM_delay_ms(u32 ms); 236*4882a593Smuzhiyun 237*4882a593Smuzhiyun void ODM_delay_us(u32 us); 238*4882a593Smuzhiyun 239*4882a593Smuzhiyun void ODM_sleep_ms(u32 ms); 240*4882a593Smuzhiyun 241*4882a593Smuzhiyun void ODM_sleep_us(u32 us); 242*4882a593Smuzhiyun 243*4882a593Smuzhiyun void odm_set_timer(struct dm_struct *dm, struct phydm_timer_list *timer, 244*4882a593Smuzhiyun u32 ms_delay); 245*4882a593Smuzhiyun 246*4882a593Smuzhiyun void odm_initialize_timer(struct dm_struct *dm, struct phydm_timer_list *timer, 247*4882a593Smuzhiyun void *call_back_func, void *context, 248*4882a593Smuzhiyun const char *sz_id); 249*4882a593Smuzhiyun 250*4882a593Smuzhiyun void odm_cancel_timer(struct dm_struct *dm, struct phydm_timer_list *timer); 251*4882a593Smuzhiyun 252*4882a593Smuzhiyun void odm_release_timer(struct dm_struct *dm, struct phydm_timer_list *timer); 253*4882a593Smuzhiyun 254*4882a593Smuzhiyun /*ODM FW relative API.*/ 255*4882a593Smuzhiyun 256*4882a593Smuzhiyun enum hal_status 257*4882a593Smuzhiyun phydm_set_reg_by_fw(struct dm_struct *dm, enum phydm_halmac_param config_type, 258*4882a593Smuzhiyun u32 offset, u32 data, u32 mask, enum rf_path e_rf_path, 259*4882a593Smuzhiyun u32 delay_time); 260*4882a593Smuzhiyun 261*4882a593Smuzhiyun void odm_fill_h2c_cmd(struct dm_struct *dm, u8 element_id, u32 cmd_len, 262*4882a593Smuzhiyun u8 *cmd_buffer); 263*4882a593Smuzhiyun 264*4882a593Smuzhiyun u8 phydm_c2H_content_parsing(void *dm_void, u8 c2h_cmd_id, u8 c2h_cmd_len, 265*4882a593Smuzhiyun u8 *tmp_buf); 266*4882a593Smuzhiyun 267*4882a593Smuzhiyun u64 odm_get_current_time(struct dm_struct *dm); 268*4882a593Smuzhiyun u64 odm_get_progressing_time(struct dm_struct *dm, u64 start_time); 269*4882a593Smuzhiyun 270*4882a593Smuzhiyun #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE)) && \ 271*4882a593Smuzhiyun (!defined(DM_ODM_CE_MAC80211) && !defined(DM_ODM_CE_MAC80211_V2)) 272*4882a593Smuzhiyun 273*4882a593Smuzhiyun void phydm_set_hw_reg_handler_interface(struct dm_struct *dm, u8 reg_Name, 274*4882a593Smuzhiyun u8 *val); 275*4882a593Smuzhiyun 276*4882a593Smuzhiyun void phydm_get_hal_def_var_handler_interface(struct dm_struct *dm, 277*4882a593Smuzhiyun enum _HAL_DEF_VARIABLE e_variable, 278*4882a593Smuzhiyun void *value); 279*4882a593Smuzhiyun 280*4882a593Smuzhiyun #endif 281*4882a593Smuzhiyun 282*4882a593Smuzhiyun void odm_set_tx_power_index_by_rate_section(struct dm_struct *dm, 283*4882a593Smuzhiyun enum rf_path path, u8 channel, 284*4882a593Smuzhiyun u8 rate_section); 285*4882a593Smuzhiyun 286*4882a593Smuzhiyun u8 odm_get_tx_power_index(struct dm_struct *dm, enum rf_path path, u8 tx_rate, 287*4882a593Smuzhiyun u8 band_width, u8 channel); 288*4882a593Smuzhiyun 289*4882a593Smuzhiyun u8 odm_efuse_one_byte_read(struct dm_struct *dm, u16 addr, u8 *data, 290*4882a593Smuzhiyun boolean b_pseu_do_test); 291*4882a593Smuzhiyun 292*4882a593Smuzhiyun void odm_efuse_logical_map_read(struct dm_struct *dm, u8 type, u16 offset, 293*4882a593Smuzhiyun u32 *data); 294*4882a593Smuzhiyun 295*4882a593Smuzhiyun enum hal_status 296*4882a593Smuzhiyun odm_iq_calibrate_by_fw(struct dm_struct *dm, u8 clear, u8 segment); 297*4882a593Smuzhiyun 298*4882a593Smuzhiyun enum hal_status 299*4882a593Smuzhiyun odm_dpk_by_fw(struct dm_struct *dm); 300*4882a593Smuzhiyun 301*4882a593Smuzhiyun void phydm_cmn_sta_info_hook(struct dm_struct *dm, u8 index, 302*4882a593Smuzhiyun struct cmn_sta_info *pcmn_sta_info); 303*4882a593Smuzhiyun 304*4882a593Smuzhiyun void phydm_macid2sta_idx_table(struct dm_struct *dm, u8 entry_idx, 305*4882a593Smuzhiyun struct cmn_sta_info *pcmn_sta_info); 306*4882a593Smuzhiyun 307*4882a593Smuzhiyun void phydm_add_interrupt_mask_handler(struct dm_struct *dm, u8 interrupt_type); 308*4882a593Smuzhiyun 309*4882a593Smuzhiyun void phydm_enable_rx_related_interrupt_handler(struct dm_struct *dm); 310*4882a593Smuzhiyun 311*4882a593Smuzhiyun void phydm_iqk_wait(struct dm_struct *dm, u32 timeout); 312*4882a593Smuzhiyun u8 phydm_get_hwrate_to_mrate(struct dm_struct *dm, u8 rate); 313*4882a593Smuzhiyun 314*4882a593Smuzhiyun void phydm_set_crystalcap(struct dm_struct *dm, u8 crystal_cap); 315*4882a593Smuzhiyun void phydm_run_in_thread_cmd(struct dm_struct *dm, void (*func)(void *), 316*4882a593Smuzhiyun void *context); 317*4882a593Smuzhiyun u8 phydm_get_tx_rate(struct dm_struct *dm); 318*4882a593Smuzhiyun u8 phydm_get_tx_power_dbm(struct dm_struct *dm, u8 rf_path, 319*4882a593Smuzhiyun u8 rate, u8 bandwidth, u8 channel); 320*4882a593Smuzhiyun 321*4882a593Smuzhiyun s16 phydm_get_tx_power_mdbm(struct dm_struct *dm, u8 rf_path, 322*4882a593Smuzhiyun u8 rate, u8 bandwidth, u8 channel); 323*4882a593Smuzhiyun 324*4882a593Smuzhiyun u32 phydm_rfe_ctrl_gpio(struct dm_struct *dm, u8 gpio_num); 325*4882a593Smuzhiyun 326*4882a593Smuzhiyun u64 phydm_division64(u64 x, u64 y); 327*4882a593Smuzhiyun 328*4882a593Smuzhiyun #endif /* @__ODM_INTERFACE_H__ */ 329