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