/****************************************************************************** 
 | 
 * 
 | 
 * Copyright(c) 2007 - 2020  Realtek Corporation. 
 | 
 * 
 | 
 * This program is free software; you can redistribute it and/or modify it 
 | 
 * under the terms of version 2 of the GNU General Public License as 
 | 
 * published by the Free Software Foundation. 
 | 
 * 
 | 
 * This program is distributed in the hope that it will be useful, but WITHOUT 
 | 
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 
 | 
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for 
 | 
 * more details. 
 | 
 * 
 | 
 * The full GNU General Public License is included in this distribution in the 
 | 
 * file called LICENSE. 
 | 
 * 
 | 
 * Contact Information: 
 | 
 * wlanfae <wlanfae@realtek.com> 
 | 
 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park, 
 | 
 * Hsinchu 300, Taiwan. 
 | 
 * 
 | 
 * Larry Finger <Larry.Finger@lwfinger.net> 
 | 
 * 
 | 
 *****************************************************************************/ 
 | 
#ifndef __HALBB_CFO_TRK_H__ 
 | 
#define __HALBB_CFO_TRK_H__ 
 | 
  
 | 
/*@--------------------------[Define] ---------------------------------------*/ 
 | 
  
 | 
#define        CFO_TRK_TH_SIZE        4 
 | 
#define        CFO_TRK_TH_4        30 /* @kHz disable CFO_Track threshold*/ 
 | 
#define        CFO_TRK_TH_3        20 /* @kHz disable CFO_Track threshold*/ 
 | 
#define        CFO_TRK_TH_2        10 /* @kHz disable CFO_Track threshold*/ 
 | 
#define        CFO_TRK_TH_1        3 /* @kHz disable CFO_Track threshold*/ 
 | 
#define        CFO_STEP_1        1 /* @kHz disable CFO_Track threshold*/ 
 | 
#define        CFO_STEP_2        1 /* @kHz disable CFO_Track threshold*/ 
 | 
#define        CFO_STEP_3        3 /* @kHz disable CFO_Track threshold*/ 
 | 
#define        CFO_STEP_4        3 /* @kHz disable CFO_Track threshold*/ 
 | 
#define        CFO_TRK_ENABLE_TH    3 /* @kHz enable CFO_Track threshold*/ 
 | 
#define        CFO_TRK_STOP_TH        3 /* @kHz disable CFO_Track threshold*/ 
 | 
#define        NO_PKT_RETURN_TH    10 
 | 
#define        CFO_VALID_BOUNDARY    64 
 | 
  
 | 
#define        CFO_SW_COMP_FINE_TUNE    5 /* @kHz expected CFO Comp. per Xcap ofst*/ /*0.8ppm~1ppm per Xcap ofst*/ 
 | 
#define        DIGI_CFO_COMP_LIMIT 5 /* @kHz enable digital CFO comp threshold*/ 
 | 
  
 | 
#define        DIGI_CFO_COMP_LIMIT    5 /* @kHz enable digital CFO comp threshold*/ 
 | 
  
 | 
#define        CFO_RECORD_NUM        6 
 | 
#define        CFO_LIMIT_PERIOD    60 /*60 sec*/ 
 | 
  
 | 
#define        SC_XO            1 /* xcap setting output value */ 
 | 
#define        SC_XI            0 /* xcap setting input value */ 
 | 
  
 | 
#define        STA_CFO_TOLERANCE_2G    30 /* kHz */ 
 | 
#define        STA_CFO_TOLERANCE_5G    80 /* kHz */ 
 | 
  
 | 
#define        CFO_HW_RPT_2_KHZ(val) (((val) << 1) + ((val) >> 1)) 
 | 
#define        CFO_PERIOD_CNT    15 
 | 
#define        CFO_TP_UPPER    100 /*MHz*/ 
 | 
#define        CFO_TP_LOWER    50 /*MHz*/ 
 | 
#define        CFO_COMP_PERIOD    250 /*ms*/ 
 | 
#define        CFO_TF_CNT_TH 300 
 | 
/*@--------------------------[Enum]------------------------------------------*/ 
 | 
  
 | 
enum bb_cfo_trk_src_t { 
 | 
    CFO_SRC_FD = 0, 
 | 
    CFO_SRC_PREAMBLE = 1 
 | 
}; 
 | 
  
 | 
enum bb_cfo_trk_st_t { 
 | 
    CFO_STATE_0 = 0, 
 | 
    CFO_STATE_1 = 1, 
 | 
    CFO_STATE_2 =2 
 | 
}; 
 | 
  
 | 
enum bb_cfo_trk_acc_mode_t { 
 | 
    CFO_ACC_MODE_0 = 0,   /*disable ul_ofdma cfo acc after 30s acc*/ 
 | 
    CFO_ACC_MODE_1 = 1,   /*enable ul_ofdma cfo acc after 30s acc*/ 
 | 
}; 
 | 
enum multi_sta_cfo_mode_t { 
 | 
    PKT_BASED_AVG_MODE    = 0, 
 | 
    ENTRY_BASED_AVG_MODE    = 1, 
 | 
    TP_BASED_AVG_MODE    = 2, 
 | 
}; 
 | 
  
 | 
#ifdef BB_DYN_CFO_TRK_LOP 
 | 
enum bb_dctl_state_t { 
 | 
    DCTL_SNR = 0, 
 | 
    DCTL_LINK = 1, 
 | 
    DCTL_NUM 
 | 
}; 
 | 
#endif 
 | 
  
 | 
/*@--------------------------[Structure]-------------------------------------*/ 
 | 
  
 | 
#ifdef BB_DYN_CFO_TRK_LOP 
 | 
struct bb_cfo_trk_lop_cr_info { 
 | 
    u8 dctl_data; /*data tracking loop filter bandwidth selection for 3rd step*/ 
 | 
    u8 dctl_pilot; /*pilot tracking loop filter bandwidth selection for 3rd step*/ 
 | 
}; 
 | 
  
 | 
struct bb_dyn_cfo_trk_lop_info { 
 | 
    bool            dyn_cfo_trk_loop_en; 
 | 
    enum bb_dctl_state_t    dyn_cfo_trk_loop_state; 
 | 
    u16            dctl_snr_th_l; 
 | 
    u16            dctl_snr_th_h; 
 | 
    u8            dctl_hold_cnt; 
 | 
    struct bb_cfo_trk_lop_cr_info  bb_cfo_trk_lop_cr_i[DCTL_NUM]; 
 | 
}; 
 | 
#endif 
 | 
  
 | 
struct bb_cfo_trk_cr_info { 
 | 
    u32 r_cfo_comp_seg0_312p5khz; 
 | 
    u32 r_cfo_comp_seg0_312p5khz_m; 
 | 
    u32 r_cfo_comp_seg0_312p5khz_1; 
 | 
    u32 r_cfo_comp_seg0_312p5khz_1_m; 
 | 
    u32 r_cfo_comp_seg0_312p5khz_2; 
 | 
    u32 r_cfo_comp_seg0_312p5khz_2_m; 
 | 
    u32 r_cfo_comp_seg0_312p5khz_3; 
 | 
    u32 r_cfo_comp_seg0_312p5khz_3_m; 
 | 
    u32 r_cfo_comp_seg0_vld; 
 | 
    u32 r_cfo_comp_seg0_vld_m; 
 | 
    u32 r_cfo_wgting; 
 | 
    u32 r_cfo_wgting_m; 
 | 
}; 
 | 
  
 | 
struct bb_cfo_rc_info { 
 | 
    u8        step_history[CFO_RECORD_NUM]; 
 | 
    u8        step_bitmap; 
 | 
    bool        damping_lock_en; 
 | 
    bool        force_damping_step; 
 | 
    u32        limit_time; 
 | 
}; 
 | 
  
 | 
struct bb_cfo_diver_info { 
 | 
    bool        divergence_lock_en; 
 | 
    u32        limit_time; 
 | 
}; 
 | 
  
 | 
struct bb_cfo_trk_info { 
 | 
    struct    bb_cfo_trk_cr_info    bb_cfo_trk_cr_i; 
 | 
#ifdef HALBB_CFO_DAMPING_CHK 
 | 
    struct    bb_cfo_rc_info        bb_cfo_rc_i; 
 | 
#endif 
 | 
    struct    bb_cfo_diver_info    bb_cfo_div_i; 
 | 
    bool        cfo_trig_by_timer_en; 
 | 
    bool        is_adjust;    /*@already modify crystal cap*/ 
 | 
    u8        cfo_th[CFO_TRK_TH_SIZE]; /*u(8,2)*/ 
 | 
    u8        step[CFO_TRK_TH_SIZE]; 
 | 
    u8        cfo_th_en; 
 | 
    u8        cfo_th_stop; /*u(8,2)*/ 
 | 
    s8        x_cap_ofst; 
 | 
    u8        crystal_cap; 
 | 
    u8        def_x_cap; 
 | 
    u8        x_cap_ub; 
 | 
    u8        x_cap_lb; 
 | 
    s32        cfo_avg_pre; /*S(12,2), -512~+511.75 kHz*/ 
 | 
    u32        cfo_pkt_cnt; 
 | 
    u8        no_pkt_cnt; 
 | 
    u32        rvrt_val; /*all rvrt_val for pause API must set to u32*/ 
 | 
    u8        tb_tx_comp_cfo_th; /*u(8,2)*/ 
 | 
    u8        sw_comp_fine_tune; /*u(8,2)*/ 
 | 
    u8        bb_cfo_trk_cnt; 
 | 
    u8        sta_cfo_tolerance; 
 | 
    u8        shift4dcfo; 
 | 
    s32        cfo_avg_4dcfo; 
 | 
    s32        cfo_avg_4dcfo_pre; 
 | 
    bool        man_cfo_tol; 
 | 
    bool        cfo_dyn_acc_en; 
 | 
    bool        cfo_trk_by_data_en; 
 | 
    u8        cfo_period_cnt; 
 | 
    u32        cfo_tf_cnt_th; 
 | 
    u32        cfo_tf_cnt_pre; 
 | 
    s32        dcfo_comp_offset; /* For manually fine tune digital cfo*/ 
 | 
    enum bb_cfo_trk_src_t        cfo_src; 
 | 
    enum bb_cfo_trk_st_t        bb_cfo_trk_state; 
 | 
    enum bb_cfo_trk_acc_mode_t bb_cfo_trk_acc_mode; 
 | 
    enum multi_sta_cfo_mode_t    multi_sta_cfo_mode; 
 | 
    #ifdef BB_DYN_CFO_TRK_LOP 
 | 
    struct bb_dyn_cfo_trk_lop_info bb_dyn_cfo_trk_lop_i; 
 | 
    #endif 
 | 
    struct halbb_timer_info cfo_timer_i; 
 | 
}; 
 | 
  
 | 
  
 | 
struct bb_info; 
 | 
/*@--------------------------[Prptotype]-------------------------------------*/ 
 | 
#ifdef BB_DYN_CFO_TRK_LOP 
 | 
void halbb_dyn_cfo_trk_loop_en(struct bb_info *bb, bool en); 
 | 
void halbb_cfo_trk_loop_cr_cfg(struct bb_info *bb, enum bb_dctl_state_t state); 
 | 
void halbb_dyn_cfo_trk_loop(struct bb_info *bb); 
 | 
void halbb_dyn_cfo_trk_loop_init(struct bb_info *bb); 
 | 
#endif 
 | 
void halbb_cfo_trk_init(struct bb_info *bb); 
 | 
void halbb_set_crystal_cap(struct bb_info *bb, u8 crystal_cap); 
 | 
void halbb_set_cfo_pause_val(struct bb_info *bb, u32 *val_buf, u8 val_len); 
 | 
void halbb_cfo_acc_io_en(struct bb_info *bb); 
 | 
void halbb_cfo_acc_timer_init(struct bb_info *bb); 
 | 
void halbb_cfo_dm(struct bb_info *bb); 
 | 
void halbb_cfo_watchdog(struct bb_info *bb); 
 | 
void halbb_parsing_cfo(struct bb_info *bb, u32 physts_bitmap, 
 | 
               struct physts_rxd *desc); 
 | 
void halbb_cfo_trk_dbg(struct bb_info *bb, char input[][16], u32 *_used, 
 | 
               char *output, u32 *_out_len); 
 | 
void halbb_cr_cfg_cfo_trk_init(struct bb_info *bb); 
 | 
void halbb_cfo_ul_ofdma_acc_enable(struct bb_info *bb); 
 | 
void halbb_cfo_ul_ofdma_acc_disable(struct bb_info *bb); 
 | 
void halbb_cfo_diver_init(struct bb_info *bb); 
 | 
#endif 
 |