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 __PHYDMANTDIV_H__ 27*4882a593Smuzhiyun #define __PHYDMANTDIV_H__ 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun /*@#define ANTDIV_VERSION "2.0" //2014.11.04*/ 30*4882a593Smuzhiyun /*@#define ANTDIV_VERSION "2.1" //2015.01.13 Dino*/ 31*4882a593Smuzhiyun /*@#define ANTDIV_VERSION "2.2" 2015.01.16 Dino*/ 32*4882a593Smuzhiyun /*@#define ANTDIV_VERSION "3.1" 2015.07.29 YuChen,remove 92c 92d 8723a*/ 33*4882a593Smuzhiyun /*@#define ANTDIV_VERSION "3.2" 2015.08.11 Stanley, disable antenna*/ 34*4882a593Smuzhiyun /*@diversity when BT is enable for 8723B*/ 35*4882a593Smuzhiyun /*@#define ANTDIV_VERSION "3.3" 2015.08.12 Stanley. 8723B does not*/ 36*4882a593Smuzhiyun /*@need to check the antenna is control by BT,*/ 37*4882a593Smuzhiyun /*@because antenna diversity only works when */ 38*4882a593Smuzhiyun /*@BT is disable or radio off*/ 39*4882a593Smuzhiyun /*@#define ANTDIV_VERSION "3.4" 2015.08.28 Dino 1.Add 8821A Smart */ 40*4882a593Smuzhiyun /*@Antenna 2. Add 8188F SW S0S1 Antenna*/ 41*4882a593Smuzhiyun /*@Diversity*/ 42*4882a593Smuzhiyun /*@#define ANTDIV_VERSION "3.5" 2015.10.07 Stanley Always check antenna*/ 43*4882a593Smuzhiyun /*@detection result from BT-coex. for 8723B,*/ 44*4882a593Smuzhiyun /*@not from PHYDM*/ 45*4882a593Smuzhiyun /*@#define ANTDIV_VERSION "3.6"*/ /*@2015.11.16 Stanley */ 46*4882a593Smuzhiyun /*@#define ANTDIV_VERSION "3.7" 2015.11.20 Dino Add SmartAnt FAT Patch */ 47*4882a593Smuzhiyun /*@#define ANTDIV_VERSION "3.8" 2015.12.21 Dino, Add SmartAnt dynamic*/ 48*4882a593Smuzhiyun /*@training packet num */ 49*4882a593Smuzhiyun /*@#define ANTDIV_VERSION "3.9" 2016.01.05 Dino, Add SmartAnt cmd for*/ 50*4882a593Smuzhiyun /*@converting single & two smtant, and add cmd*/ 51*4882a593Smuzhiyun /*@for adjust truth table */ 52*4882a593Smuzhiyun #define ANTDIV_VERSION "4.0" /*@2017.05.25 Mark, Add SW antenna diversity*/ 53*4882a593Smuzhiyun /*@for 8821c because HW transient issue */ 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun /* @1 ============================================================ 56*4882a593Smuzhiyun * 1 Definition 57*4882a593Smuzhiyun * 1 ============================================================ 58*4882a593Smuzhiyun */ 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun #define ANTDIV_INIT 0xff 61*4882a593Smuzhiyun #define MAIN_ANT 1 /*@ant A or ant Main or S1*/ 62*4882a593Smuzhiyun #define AUX_ANT 2 /*@AntB or ant Aux or S0*/ 63*4882a593Smuzhiyun #define MAX_ANT 3 /* @3 for AP using*/ 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun #define ANT1_2G 0 66*4882a593Smuzhiyun /* @= ANT2_5G for 8723D BTG S1 RX S0S1 diversity for 8723D, TX fixed at S1 */ 67*4882a593Smuzhiyun #define ANT2_2G 1 68*4882a593Smuzhiyun /* @= ANT1_5G for 8723D BTG S0 RX S0S1 diversity for 8723D, TX fixed at S1 */ 69*4882a593Smuzhiyun /*smart antenna*/ 70*4882a593Smuzhiyun #define SUPPORT_RF_PATH_NUM 4 71*4882a593Smuzhiyun #define SUPPORT_BEAM_PATTERN_NUM 4 72*4882a593Smuzhiyun #define NUM_ANTENNA_8821A 2 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun #define SUPPORT_BEAM_SET_PATTERN_NUM 16 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun #define NO_FIX_TX_ANT 0 77*4882a593Smuzhiyun #define FIX_TX_AT_MAIN 1 78*4882a593Smuzhiyun #define FIX_AUX_AT_MAIN 2 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun /* @Antenna Diversty Control type */ 81*4882a593Smuzhiyun #define ODM_AUTO_ANT 0 82*4882a593Smuzhiyun #define ODM_FIX_MAIN_ANT 1 83*4882a593Smuzhiyun #define ODM_FIX_AUX_ANT 2 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun #define ODM_N_ANTDIV_SUPPORT (ODM_RTL8188E | ODM_RTL8192E | ODM_RTL8723B |\ 86*4882a593Smuzhiyun ODM_RTL8188F | ODM_RTL8723D | ODM_RTL8195A |\ 87*4882a593Smuzhiyun ODM_RTL8197F | ODM_RTL8721D | ODM_RTL8710C) 88*4882a593Smuzhiyun #define ODM_AC_ANTDIV_SUPPORT (ODM_RTL8821 | ODM_RTL8881A | ODM_RTL8812 |\ 89*4882a593Smuzhiyun ODM_RTL8821C | ODM_RTL8822B | ODM_RTL8814B |\ 90*4882a593Smuzhiyun ODM_RTL8195B) 91*4882a593Smuzhiyun #define ODM_JGR3_ANTDIV_SUPPORT (ODM_RTL8197G | ODM_RTL8723F) 92*4882a593Smuzhiyun #define ODM_ANTDIV_SUPPORT (ODM_N_ANTDIV_SUPPORT | ODM_AC_ANTDIV_SUPPORT |\ 93*4882a593Smuzhiyun ODM_JGR3_ANTDIV_SUPPORT) 94*4882a593Smuzhiyun #define ODM_SMART_ANT_SUPPORT (ODM_RTL8188E | ODM_RTL8192E) 95*4882a593Smuzhiyun #define ODM_HL_SMART_ANT_TYPE1_SUPPORT (ODM_RTL8821 | ODM_RTL8822B) 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun #define ODM_ANTDIV_2G_SUPPORT_IC (ODM_RTL8188E | ODM_RTL8192E | ODM_RTL8723B |\ 98*4882a593Smuzhiyun ODM_RTL8881A | ODM_RTL8188F | ODM_RTL8723D |\ 99*4882a593Smuzhiyun ODM_RTL8197F | ODM_RTL8197G|ODM_RTL8723F) 100*4882a593Smuzhiyun #define ODM_ANTDIV_5G_SUPPORT_IC (ODM_RTL8821 | ODM_RTL8881A | ODM_RTL8812 |\ 101*4882a593Smuzhiyun ODM_RTL8821C | ODM_RTL8822B | ODM_RTL8195B|ODM_RTL8723F) 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun #define ODM_ANTDIV_SUPPORT_IC (ODM_ANTDIV_2G_SUPPORT_IC | ODM_ANTDIV_5G_SUPPORT_IC) 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun #define ODM_EVM_ANTDIV_IC (ODM_RTL8192E | ODM_RTL8197F | ODM_RTL8822B |\ 106*4882a593Smuzhiyun ODM_RTL8197G) 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun #define ODM_ANTDIV_2G BIT(0) 109*4882a593Smuzhiyun #define ODM_ANTDIV_5G BIT(1) 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun #define ANTDIV_ON 1 112*4882a593Smuzhiyun #define ANTDIV_OFF 0 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun #define ANT_PATH_A 0 115*4882a593Smuzhiyun #define ANT_PATH_B 1 116*4882a593Smuzhiyun #define ANT_PATH_AB 2 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun #define FAT_ON 1 119*4882a593Smuzhiyun #define FAT_OFF 0 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun #define TX_BY_DESC 1 122*4882a593Smuzhiyun #define TX_BY_REG 0 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun #define RSSI_METHOD 0 125*4882a593Smuzhiyun #define EVM_METHOD 1 126*4882a593Smuzhiyun #define CRC32_METHOD 2 127*4882a593Smuzhiyun #define TP_METHOD 3 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun #define INIT_ANTDIV_TIMMER 0 130*4882a593Smuzhiyun #define CANCEL_ANTDIV_TIMMER 1 131*4882a593Smuzhiyun #define RELEASE_ANTDIV_TIMMER 2 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun #define CRC32_FAIL 1 134*4882a593Smuzhiyun #define CRC32_OK 0 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun #define evm_rssi_th_high 25 137*4882a593Smuzhiyun #define evm_rssi_th_low 20 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun #define NORMAL_STATE_MIAN 1 140*4882a593Smuzhiyun #define NORMAL_STATE_AUX 2 141*4882a593Smuzhiyun #define TRAINING_STATE 3 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun #define FORCE_RSSI_DIFF 10 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun #define HT_IDX 16 146*4882a593Smuzhiyun #define VHT_IDX 20 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun #define CSI_ON 1 149*4882a593Smuzhiyun #define CSI_OFF 0 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun #define DIVON_CSIOFF 1 152*4882a593Smuzhiyun #define DIVOFF_CSION 2 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun #define BDC_DIV_TRAIN_STATE 0 155*4882a593Smuzhiyun #define bdc_bfer_train_state 1 156*4882a593Smuzhiyun #define BDC_DECISION_STATE 2 157*4882a593Smuzhiyun #define BDC_BF_HOLD_STATE 3 158*4882a593Smuzhiyun #define BDC_DIV_HOLD_STATE 4 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun #define BDC_MODE_1 1 161*4882a593Smuzhiyun #define BDC_MODE_2 2 162*4882a593Smuzhiyun #define BDC_MODE_3 3 163*4882a593Smuzhiyun #define BDC_MODE_4 4 164*4882a593Smuzhiyun #define BDC_MODE_NULL 0xff 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun /*SW S0S1 antenna diversity*/ 167*4882a593Smuzhiyun #define SWAW_STEP_INIT 0xff 168*4882a593Smuzhiyun #define SWAW_STEP_PEEK 0 169*4882a593Smuzhiyun #define SWAW_STEP_DETERMINE 1 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun #define RSSI_CHECK_RESET_PERIOD 10 172*4882a593Smuzhiyun #define RSSI_CHECK_THRESHOLD 50 173*4882a593Smuzhiyun 174*4882a593Smuzhiyun /*@Hong Lin Smart antenna*/ 175*4882a593Smuzhiyun #define HL_SMTANT_2WIRE_DATA_LEN 24 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun #if (RTL8723D_SUPPORT == 1 || RTL8710C_SUPPORT == 1) 178*4882a593Smuzhiyun #ifndef CONFIG_ANTDIV_PERIOD 179*4882a593Smuzhiyun #define CONFIG_ANTDIV_PERIOD 1 180*4882a593Smuzhiyun #endif 181*4882a593Smuzhiyun #endif 182*4882a593Smuzhiyun /* @1 ============================================================ 183*4882a593Smuzhiyun * 1 structure 184*4882a593Smuzhiyun * 1 ============================================================ 185*4882a593Smuzhiyun */ 186*4882a593Smuzhiyun 187*4882a593Smuzhiyun 188*4882a593Smuzhiyun struct sw_antenna_switch { 189*4882a593Smuzhiyun u8 double_chk_flag; 190*4882a593Smuzhiyun /*@If current antenna RSSI > "RSSI_CHECK_THRESHOLD", than*/ 191*4882a593Smuzhiyun /*@check this antenna again*/ 192*4882a593Smuzhiyun u8 try_flag; 193*4882a593Smuzhiyun s32 pre_rssi; 194*4882a593Smuzhiyun u8 cur_antenna; 195*4882a593Smuzhiyun u8 pre_ant; 196*4882a593Smuzhiyun u8 rssi_trying; 197*4882a593Smuzhiyun u8 reset_idx; 198*4882a593Smuzhiyun u8 train_time; 199*4882a593Smuzhiyun u8 train_time_flag; 200*4882a593Smuzhiyun /*@base on RSSI difference between two antennas*/ 201*4882a593Smuzhiyun struct phydm_timer_list sw_antdiv_timer; 202*4882a593Smuzhiyun u32 pkt_cnt_sw_ant_div_by_ctrl_frame; 203*4882a593Smuzhiyun boolean is_sw_ant_div_by_ctrl_frame; 204*4882a593Smuzhiyun 205*4882a593Smuzhiyun #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) 206*4882a593Smuzhiyun #if USE_WORKITEM 207*4882a593Smuzhiyun RT_WORK_ITEM phydm_sw_antenna_switch_workitem; 208*4882a593Smuzhiyun #endif 209*4882a593Smuzhiyun #endif 210*4882a593Smuzhiyun 211*4882a593Smuzhiyun /* @AntDect (Before link Antenna Switch check) need to be moved*/ 212*4882a593Smuzhiyun u16 single_ant_counter; 213*4882a593Smuzhiyun u16 dual_ant_counter; 214*4882a593Smuzhiyun u16 aux_fail_detec_counter; 215*4882a593Smuzhiyun u16 retry_counter; 216*4882a593Smuzhiyun u8 swas_no_link_state; 217*4882a593Smuzhiyun u32 swas_no_link_bk_reg948; 218*4882a593Smuzhiyun boolean ANTA_ON; /*To indicate ant A is or not*/ 219*4882a593Smuzhiyun boolean ANTB_ON; /*@To indicate ant B is on or not*/ 220*4882a593Smuzhiyun boolean pre_aux_fail_detec; 221*4882a593Smuzhiyun boolean rssi_ant_dect_result; 222*4882a593Smuzhiyun u8 ant_5g; 223*4882a593Smuzhiyun u8 ant_2g; 224*4882a593Smuzhiyun }; 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun #if (DM_ODM_SUPPORT_TYPE & (ODM_AP)) 227*4882a593Smuzhiyun #if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY)) 228*4882a593Smuzhiyun struct _BF_DIV_COEX_ { 229*4882a593Smuzhiyun boolean w_bfer_client[ODM_ASSOCIATE_ENTRY_NUM]; 230*4882a593Smuzhiyun boolean w_bfee_client[ODM_ASSOCIATE_ENTRY_NUM]; 231*4882a593Smuzhiyun u32 MA_rx_TP[ODM_ASSOCIATE_ENTRY_NUM]; 232*4882a593Smuzhiyun u32 MA_rx_TP_DIV[ODM_ASSOCIATE_ENTRY_NUM]; 233*4882a593Smuzhiyun 234*4882a593Smuzhiyun u8 bd_ccoex_type_wbfer; 235*4882a593Smuzhiyun u8 num_txbfee_client; 236*4882a593Smuzhiyun u8 num_txbfer_client; 237*4882a593Smuzhiyun u8 bdc_try_counter; 238*4882a593Smuzhiyun u8 bdc_hold_counter; 239*4882a593Smuzhiyun u8 bdc_mode; 240*4882a593Smuzhiyun u8 bdc_active_mode; 241*4882a593Smuzhiyun u8 BDC_state; 242*4882a593Smuzhiyun u8 bdc_rx_idle_update_counter; 243*4882a593Smuzhiyun u8 num_client; 244*4882a593Smuzhiyun u8 pre_num_client; 245*4882a593Smuzhiyun u8 num_bf_tar; 246*4882a593Smuzhiyun u8 num_div_tar; 247*4882a593Smuzhiyun 248*4882a593Smuzhiyun boolean is_all_div_sta_idle; 249*4882a593Smuzhiyun boolean is_all_bf_sta_idle; 250*4882a593Smuzhiyun boolean bdc_try_flag; 251*4882a593Smuzhiyun boolean BF_pass; 252*4882a593Smuzhiyun boolean DIV_pass; 253*4882a593Smuzhiyun }; 254*4882a593Smuzhiyun #endif 255*4882a593Smuzhiyun #endif 256*4882a593Smuzhiyun 257*4882a593Smuzhiyun struct phydm_fat_struct { 258*4882a593Smuzhiyun u8 bssid[6]; 259*4882a593Smuzhiyun u8 antsel_rx_keep_0; 260*4882a593Smuzhiyun u8 antsel_rx_keep_1; 261*4882a593Smuzhiyun u8 antsel_rx_keep_2; 262*4882a593Smuzhiyun u8 antsel_rx_keep_3; 263*4882a593Smuzhiyun u32 ant_sum_rssi[7]; 264*4882a593Smuzhiyun u32 ant_rssi_cnt[7]; 265*4882a593Smuzhiyun u32 ant_ave_rssi[7]; 266*4882a593Smuzhiyun u8 fat_state; 267*4882a593Smuzhiyun u8 fat_state_cnt; 268*4882a593Smuzhiyun u32 train_idx; 269*4882a593Smuzhiyun u8 antsel_a[ODM_ASSOCIATE_ENTRY_NUM]; 270*4882a593Smuzhiyun u8 antsel_b[ODM_ASSOCIATE_ENTRY_NUM]; 271*4882a593Smuzhiyun u8 antsel_c[ODM_ASSOCIATE_ENTRY_NUM]; 272*4882a593Smuzhiyun u16 main_ht_cnt[HT_IDX]; 273*4882a593Smuzhiyun u16 aux_ht_cnt[HT_IDX]; 274*4882a593Smuzhiyun u16 main_vht_cnt[VHT_IDX]; 275*4882a593Smuzhiyun u16 aux_vht_cnt[VHT_IDX]; 276*4882a593Smuzhiyun u16 main_sum[ODM_ASSOCIATE_ENTRY_NUM]; 277*4882a593Smuzhiyun u16 aux_sum[ODM_ASSOCIATE_ENTRY_NUM]; 278*4882a593Smuzhiyun u16 main_cnt[ODM_ASSOCIATE_ENTRY_NUM]; 279*4882a593Smuzhiyun u16 aux_cnt[ODM_ASSOCIATE_ENTRY_NUM]; 280*4882a593Smuzhiyun u16 main_sum_cck[ODM_ASSOCIATE_ENTRY_NUM]; 281*4882a593Smuzhiyun u16 aux_sum_cck[ODM_ASSOCIATE_ENTRY_NUM]; 282*4882a593Smuzhiyun u16 main_cnt_cck[ODM_ASSOCIATE_ENTRY_NUM]; 283*4882a593Smuzhiyun u16 aux_cnt_cck[ODM_ASSOCIATE_ENTRY_NUM]; 284*4882a593Smuzhiyun u8 rx_idle_ant; 285*4882a593Smuzhiyun u8 rx_idle_ant2; 286*4882a593Smuzhiyun u32 rvrt_val; /*all rvrt_val for pause API must set to u32*/ 287*4882a593Smuzhiyun u8 ant_div_on_off; 288*4882a593Smuzhiyun u8 div_path_type; 289*4882a593Smuzhiyun boolean is_become_linked; 290*4882a593Smuzhiyun boolean get_stats; 291*4882a593Smuzhiyun u32 min_max_rssi; 292*4882a593Smuzhiyun u8 idx_ant_div_counter_2g; 293*4882a593Smuzhiyun u8 idx_ant_div_counter_5g; 294*4882a593Smuzhiyun u8 ant_div_2g_5g; 295*4882a593Smuzhiyun 296*4882a593Smuzhiyun #ifdef ODM_EVM_ENHANCE_ANTDIV 297*4882a593Smuzhiyun /*@For 1SS RX phy rate*/ 298*4882a593Smuzhiyun u32 main_evm_sum[ODM_ASSOCIATE_ENTRY_NUM]; 299*4882a593Smuzhiyun u32 aux_evm_sum[ODM_ASSOCIATE_ENTRY_NUM]; 300*4882a593Smuzhiyun u32 main_evm_cnt[ODM_ASSOCIATE_ENTRY_NUM]; 301*4882a593Smuzhiyun u32 aux_evm_cnt[ODM_ASSOCIATE_ENTRY_NUM]; 302*4882a593Smuzhiyun 303*4882a593Smuzhiyun /*@For 2SS RX phy rate*/ 304*4882a593Smuzhiyun u32 main_evm_2ss_sum[ODM_ASSOCIATE_ENTRY_NUM][2];/*@2SS with A1+B*/ 305*4882a593Smuzhiyun u32 aux_evm_2ss_sum[ODM_ASSOCIATE_ENTRY_NUM][2];/*@2SS with A2+B*/ 306*4882a593Smuzhiyun u32 main_evm_2ss_cnt[ODM_ASSOCIATE_ENTRY_NUM]; 307*4882a593Smuzhiyun u32 aux_evm_2ss_cnt[ODM_ASSOCIATE_ENTRY_NUM]; 308*4882a593Smuzhiyun 309*4882a593Smuzhiyun boolean evm_method_enable; 310*4882a593Smuzhiyun u8 target_ant_evm; 311*4882a593Smuzhiyun u8 target_ant_crc32; 312*4882a593Smuzhiyun u8 target_ant_tp; 313*4882a593Smuzhiyun u8 target_ant_enhance; 314*4882a593Smuzhiyun u8 pre_target_ant_enhance; 315*4882a593Smuzhiyun u16 main_mpdu_ok_cnt; 316*4882a593Smuzhiyun u16 aux_mpdu_ok_cnt; 317*4882a593Smuzhiyun 318*4882a593Smuzhiyun u32 crc32_ok_cnt; 319*4882a593Smuzhiyun u32 crc32_fail_cnt; 320*4882a593Smuzhiyun u32 main_crc32_ok_cnt; 321*4882a593Smuzhiyun u32 aux_crc32_ok_cnt; 322*4882a593Smuzhiyun u32 main_crc32_fail_cnt; 323*4882a593Smuzhiyun u32 aux_crc32_fail_cnt; 324*4882a593Smuzhiyun 325*4882a593Smuzhiyun u32 main_tp; 326*4882a593Smuzhiyun u32 aux_tp; 327*4882a593Smuzhiyun u32 main_tp_cnt; 328*4882a593Smuzhiyun u32 aux_tp_cnt; 329*4882a593Smuzhiyun 330*4882a593Smuzhiyun u8 pre_antdiv_rssi; 331*4882a593Smuzhiyun u8 pre_antdiv_tp; 332*4882a593Smuzhiyun #endif 333*4882a593Smuzhiyun #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE | ODM_IOT)) 334*4882a593Smuzhiyun u32 cck_ctrl_frame_cnt_main; 335*4882a593Smuzhiyun u32 cck_ctrl_frame_cnt_aux; 336*4882a593Smuzhiyun u32 ofdm_ctrl_frame_cnt_main; 337*4882a593Smuzhiyun u32 ofdm_ctrl_frame_cnt_aux; 338*4882a593Smuzhiyun u32 main_ctrl_sum; 339*4882a593Smuzhiyun u32 aux_ctrl_sum; 340*4882a593Smuzhiyun u32 main_ctrl_cnt; 341*4882a593Smuzhiyun u32 aux_ctrl_cnt; 342*4882a593Smuzhiyun #endif 343*4882a593Smuzhiyun 344*4882a593Smuzhiyun u8 b_fix_tx_ant; 345*4882a593Smuzhiyun boolean fix_ant_bfee; 346*4882a593Smuzhiyun boolean enable_ctrl_frame_antdiv; 347*4882a593Smuzhiyun boolean use_ctrl_frame_antdiv; 348*4882a593Smuzhiyun boolean *is_no_csi_feedback; 349*4882a593Smuzhiyun boolean force_antdiv_type; 350*4882a593Smuzhiyun u8 antdiv_type_dbg; 351*4882a593Smuzhiyun u8 hw_antsw_occur; 352*4882a593Smuzhiyun u8 *p_force_tx_by_desc; 353*4882a593Smuzhiyun u8 force_tx_by_desc; 354*4882a593Smuzhiyun /*@A temp value, will hook to driver team's outer parameter later*/ 355*4882a593Smuzhiyun u8 *p_default_s0_s1; 356*4882a593Smuzhiyun u8 default_s0_s1; 357*4882a593Smuzhiyun u8 ant_idx_vec[3]; /* for SP3T only, added by Jiao Qi on June.6,2020*/ 358*4882a593Smuzhiyun 359*4882a593Smuzhiyun 360*4882a593Smuzhiyun }; 361*4882a593Smuzhiyun 362*4882a593Smuzhiyun /* @1 ============================================================ 363*4882a593Smuzhiyun * 1 enumeration 364*4882a593Smuzhiyun * 1 ============================================================ 365*4882a593Smuzhiyun */ 366*4882a593Smuzhiyun 367*4882a593Smuzhiyun enum fat_state /*@Fast antenna training*/ 368*4882a593Smuzhiyun { 369*4882a593Smuzhiyun FAT_BEFORE_LINK_STATE = 0, 370*4882a593Smuzhiyun FAT_PREPARE_STATE = 1, 371*4882a593Smuzhiyun FAT_TRAINING_STATE = 2, 372*4882a593Smuzhiyun FAT_DECISION_STATE = 3 373*4882a593Smuzhiyun }; 374*4882a593Smuzhiyun 375*4882a593Smuzhiyun enum ant_div_type { 376*4882a593Smuzhiyun NO_ANTDIV = 0xFF, 377*4882a593Smuzhiyun CG_TRX_HW_ANTDIV = 0x01, 378*4882a593Smuzhiyun CGCS_RX_HW_ANTDIV = 0x02, 379*4882a593Smuzhiyun FIXED_HW_ANTDIV = 0x03, 380*4882a593Smuzhiyun CG_TRX_SMART_ANTDIV = 0x04, 381*4882a593Smuzhiyun CGCS_RX_SW_ANTDIV = 0x05, 382*4882a593Smuzhiyun S0S1_SW_ANTDIV = 0x06, /*@8723B intrnal switch S0 S1*/ 383*4882a593Smuzhiyun S0S1_TRX_HW_ANTDIV = 0x07, /*TRX S0S1 diversity for 8723D*/ 384*4882a593Smuzhiyun HL_SW_SMART_ANT_TYPE1 = 0x10, 385*4882a593Smuzhiyun /*@Hong-Lin Smart antenna use for 8821AE which is a 2 ant. entitys,*/ 386*4882a593Smuzhiyun /*@and each ant. is equipped with 4 antenna patterns*/ 387*4882a593Smuzhiyun HL_SW_SMART_ANT_TYPE2 = 0x11 388*4882a593Smuzhiyun /*@Hong-Bo Smart antenna use for 8822B which is a 2 ant. entitys*/ 389*4882a593Smuzhiyun }; 390*4882a593Smuzhiyun 391*4882a593Smuzhiyun /* @1 ============================================================ 392*4882a593Smuzhiyun * 1 function prototype 393*4882a593Smuzhiyun * 1 ============================================================ 394*4882a593Smuzhiyun */ 395*4882a593Smuzhiyun 396*4882a593Smuzhiyun void odm_stop_antenna_switch_dm(void *dm_void); 397*4882a593Smuzhiyun 398*4882a593Smuzhiyun void phydm_enable_antenna_diversity(void *dm_void); 399*4882a593Smuzhiyun 400*4882a593Smuzhiyun void odm_set_ant_config(void *dm_void, u8 ant_setting /* @0=A, 1=B, 2=C,....*/ 401*4882a593Smuzhiyun ); 402*4882a593Smuzhiyun 403*4882a593Smuzhiyun #define sw_ant_div_rest_after_link odm_sw_ant_div_rest_after_link 404*4882a593Smuzhiyun 405*4882a593Smuzhiyun void odm_sw_ant_div_rest_after_link(void *dm_void); 406*4882a593Smuzhiyun 407*4882a593Smuzhiyun void odm_ant_div_on_off(void *dm_void, u8 swch, u8 path); 408*4882a593Smuzhiyun 409*4882a593Smuzhiyun void odm_tx_by_tx_desc_or_reg(void *dm_void, u8 swch); 410*4882a593Smuzhiyun 411*4882a593Smuzhiyun #if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY)) 412*4882a593Smuzhiyun 413*4882a593Smuzhiyun void phydm_antdiv_reset_statistic(void *dm_void, u32 macid); 414*4882a593Smuzhiyun 415*4882a593Smuzhiyun void odm_update_rx_idle_ant(void *dm_void, u8 ant); 416*4882a593Smuzhiyun 417*4882a593Smuzhiyun void odm_update_rx_idle_ant_sp3t(void *dm_void, u8 ant); 418*4882a593Smuzhiyun 419*4882a593Smuzhiyun void phydm_update_rx_idle_ant_pathb(void *dm_void, u8 ant); 420*4882a593Smuzhiyun 421*4882a593Smuzhiyun void phydm_set_antdiv_val(void *dm_void, u32 *val_buf, u8 val_len); 422*4882a593Smuzhiyun 423*4882a593Smuzhiyun #if (RTL8723B_SUPPORT == 1) 424*4882a593Smuzhiyun void odm_update_rx_idle_ant_8723b(void *dm_void, u8 ant, u32 default_ant, 425*4882a593Smuzhiyun u32 optional_ant); 426*4882a593Smuzhiyun #endif 427*4882a593Smuzhiyun 428*4882a593Smuzhiyun #if (RTL8188F_SUPPORT == 1) 429*4882a593Smuzhiyun void phydm_update_rx_idle_antenna_8188F(void *dm_void, u32 default_ant); 430*4882a593Smuzhiyun #endif 431*4882a593Smuzhiyun 432*4882a593Smuzhiyun #if (RTL8723D_SUPPORT == 1) 433*4882a593Smuzhiyun 434*4882a593Smuzhiyun void phydm_set_tx_ant_pwr_8723d(void *dm_void, u8 ant); 435*4882a593Smuzhiyun 436*4882a593Smuzhiyun void odm_update_rx_idle_ant_8723d(void *dm_void, u8 ant, u32 default_ant, 437*4882a593Smuzhiyun u32 optional_ant); 438*4882a593Smuzhiyun 439*4882a593Smuzhiyun #endif 440*4882a593Smuzhiyun 441*4882a593Smuzhiyun #ifdef CONFIG_S0S1_SW_ANTENNA_DIVERSITY 442*4882a593Smuzhiyun 443*4882a593Smuzhiyun #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) 444*4882a593Smuzhiyun void odm_sw_antdiv_callback(struct phydm_timer_list *timer); 445*4882a593Smuzhiyun 446*4882a593Smuzhiyun void odm_sw_antdiv_workitem_callback(void *context); 447*4882a593Smuzhiyun 448*4882a593Smuzhiyun #elif (DM_ODM_SUPPORT_TYPE == ODM_CE) 449*4882a593Smuzhiyun 450*4882a593Smuzhiyun void odm_sw_antdiv_workitem_callback(void *context); 451*4882a593Smuzhiyun 452*4882a593Smuzhiyun void odm_sw_antdiv_callback(void *function_context); 453*4882a593Smuzhiyun 454*4882a593Smuzhiyun #elif (DM_ODM_SUPPORT_TYPE == ODM_IOT) 455*4882a593Smuzhiyun 456*4882a593Smuzhiyun void odm_sw_antdiv_callback(void *dm_void); 457*4882a593Smuzhiyun 458*4882a593Smuzhiyun #endif 459*4882a593Smuzhiyun 460*4882a593Smuzhiyun void odm_s0s1_sw_ant_div_by_ctrl_frame(void *dm_void, u8 step); 461*4882a593Smuzhiyun 462*4882a593Smuzhiyun void odm_antsel_statistics_ctrl(void *dm_void, u8 antsel_tr_mux, 463*4882a593Smuzhiyun u32 rx_pwdb_all); 464*4882a593Smuzhiyun 465*4882a593Smuzhiyun void odm_s0s1_sw_ant_div_by_ctrl_frame_process_rssi(void *dm_void, 466*4882a593Smuzhiyun void *phy_info_void, 467*4882a593Smuzhiyun void *pkt_info_void); 468*4882a593Smuzhiyun 469*4882a593Smuzhiyun #endif 470*4882a593Smuzhiyun 471*4882a593Smuzhiyun #ifdef ODM_EVM_ENHANCE_ANTDIV 472*4882a593Smuzhiyun void phydm_evm_sw_antdiv_init(void *dm_void); 473*4882a593Smuzhiyun 474*4882a593Smuzhiyun void phydm_rx_rate_for_antdiv(void *dm_void, void *pkt_info_void); 475*4882a593Smuzhiyun 476*4882a593Smuzhiyun void phydm_antdiv_reset_rx_rate(void *dm_void); 477*4882a593Smuzhiyun 478*4882a593Smuzhiyun #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) 479*4882a593Smuzhiyun void phydm_evm_antdiv_callback(struct phydm_timer_list *timer); 480*4882a593Smuzhiyun 481*4882a593Smuzhiyun void phydm_evm_antdiv_workitem_callback(void *context); 482*4882a593Smuzhiyun 483*4882a593Smuzhiyun #elif (DM_ODM_SUPPORT_TYPE == ODM_CE) 484*4882a593Smuzhiyun void phydm_evm_antdiv_callback(void *dm_void); 485*4882a593Smuzhiyun 486*4882a593Smuzhiyun void phydm_evm_antdiv_workitem_callback(void *context); 487*4882a593Smuzhiyun 488*4882a593Smuzhiyun #else 489*4882a593Smuzhiyun void phydm_evm_antdiv_callback(void *dm_void); 490*4882a593Smuzhiyun #endif 491*4882a593Smuzhiyun 492*4882a593Smuzhiyun #endif 493*4882a593Smuzhiyun 494*4882a593Smuzhiyun void odm_hw_ant_div(void *dm_void); 495*4882a593Smuzhiyun 496*4882a593Smuzhiyun #if (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY)) ||\ 497*4882a593Smuzhiyun (defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY)) 498*4882a593Smuzhiyun void odm_fast_ant_training( 499*4882a593Smuzhiyun void *dm_void); 500*4882a593Smuzhiyun 501*4882a593Smuzhiyun void odm_fast_ant_training_callback(void *dm_void); 502*4882a593Smuzhiyun 503*4882a593Smuzhiyun void odm_fast_ant_training_work_item_callback(void *dm_void); 504*4882a593Smuzhiyun #endif 505*4882a593Smuzhiyun 506*4882a593Smuzhiyun void odm_ant_div_init(void *dm_void); 507*4882a593Smuzhiyun 508*4882a593Smuzhiyun void odm_ant_div(void *dm_void); 509*4882a593Smuzhiyun 510*4882a593Smuzhiyun void odm_antsel_statistics(void *dm_void, void *phy_info_void, 511*4882a593Smuzhiyun u8 antsel_tr_mux, u32 mac_id, u32 utility, u8 method, 512*4882a593Smuzhiyun u8 is_cck_rate); 513*4882a593Smuzhiyun 514*4882a593Smuzhiyun void odm_process_rssi_for_ant_div(void *dm_void, void *phy_info_void, 515*4882a593Smuzhiyun void *pkt_info_void); 516*4882a593Smuzhiyun 517*4882a593Smuzhiyun #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE)) 518*4882a593Smuzhiyun void odm_set_tx_ant_by_tx_info(void *dm_void, u8 *desc, u8 mac_id); 519*4882a593Smuzhiyun 520*4882a593Smuzhiyun #elif (DM_ODM_SUPPORT_TYPE == ODM_AP) 521*4882a593Smuzhiyun 522*4882a593Smuzhiyun struct tx_desc; 523*4882a593Smuzhiyun /*@declared tx_desc here or compile error happened when enabled 8822B*/ 524*4882a593Smuzhiyun 525*4882a593Smuzhiyun void odm_set_tx_ant_by_tx_info(struct rtl8192cd_priv *priv, 526*4882a593Smuzhiyun struct tx_desc *pdesc, unsigned short aid); 527*4882a593Smuzhiyun 528*4882a593Smuzhiyun #if 1 /*@def def CONFIG_WLAN_HAL*/ 529*4882a593Smuzhiyun void odm_set_tx_ant_by_tx_info_hal(struct rtl8192cd_priv *priv, 530*4882a593Smuzhiyun void *pdesc_data, u16 aid); 531*4882a593Smuzhiyun #endif /*@#ifdef CONFIG_WLAN_HAL*/ 532*4882a593Smuzhiyun #endif 533*4882a593Smuzhiyun 534*4882a593Smuzhiyun void odm_ant_div_config(void *dm_void); 535*4882a593Smuzhiyun 536*4882a593Smuzhiyun void odm_ant_div_timers(void *dm_void, u8 state); 537*4882a593Smuzhiyun 538*4882a593Smuzhiyun void phydm_antdiv_debug(void *dm_void, char input[][16], u32 *_used, 539*4882a593Smuzhiyun char *output, u32 *_out_len); 540*4882a593Smuzhiyun 541*4882a593Smuzhiyun void odm_ant_div_reset(void *dm_void); 542*4882a593Smuzhiyun 543*4882a593Smuzhiyun void odm_antenna_diversity_init(void *dm_void); 544*4882a593Smuzhiyun 545*4882a593Smuzhiyun void odm_antenna_diversity(void *dm_void); 546*4882a593Smuzhiyun #endif /*@#ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY*/ 547*4882a593Smuzhiyun #endif /*@#ifndef __ODMANTDIV_H__*/ 548