mirror of
https://github.com/RinCat/RTL88x2BU-Linux-Driver.git
synced 2024-12-27 18:41:34 +00:00
430 lines
12 KiB
C
430 lines
12 KiB
C
/******************************************************************************
|
|
*
|
|
* Copyright(c) 2007 - 2017 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 __PHYDMCCX_H__
|
|
#define __PHYDMCCX_H__
|
|
|
|
/* 2020.08.12 split env_mntr api into set_env_mntr and result_env_mntr api for dig_fa_source*/
|
|
#define CCX_VERSION "4.7"
|
|
|
|
/* @1 ============================================================
|
|
* 1 Definition
|
|
* 1 ============================================================
|
|
*/
|
|
#define CCX_EN 1
|
|
|
|
#define MAX_ENV_MNTR_TIME 8 /*second*/
|
|
#define MS_TO_US 1000
|
|
#define MS_TO_4US_RATIO 250
|
|
#define CCA_CAP 14
|
|
/*CLM*/
|
|
#define CLM_MAX_REPORT_TIME 10
|
|
#define CLM_PERIOD_MAX 65535
|
|
/*NHM*/
|
|
#define NHM_PERIOD_MAX 65534
|
|
#define NHM_TH_NUM 11 /*threshold number of NHM*/
|
|
#define NHM_RPT_NUM 12
|
|
#define NHM_IC_NOISE_TH 60 /*60/2 - 10 = 20 = -80 dBm*/
|
|
#define NHM_RPT_MAX 255
|
|
#ifdef NHM_DYM_PW_TH_SUPPORT
|
|
#define DYM_PWTH_CCA_CAP 24
|
|
#endif
|
|
#define IGI_2_NHM_TH(igi) ((igi) << 1)/*NHM/FAHM threshold = IGI * 2*/
|
|
#define NTH_TH_2_RSSI(th) ((th >> 1) - 10)
|
|
/*FAHM*/
|
|
#define FAHM_INCLU_FA BIT(0)
|
|
#define FAHM_INCLU_CRC_OK BIT(1)
|
|
#define FAHM_INCLU_CRC_ERR BIT(2)
|
|
#define FAHM_PERIOD_MAX 65534
|
|
#define FAHM_TH_NUM 11 /*threshold number of FAHM*/
|
|
#define FAHM_RPT_NUM 12
|
|
/*IFS-CLM*/
|
|
#define IFS_CLM_PERIOD_MAX 65535
|
|
#define IFS_CLM_NUM 4
|
|
|
|
#define NHM_SUCCESS BIT(0)
|
|
#define CLM_SUCCESS BIT(1)
|
|
#define FAHM_SUCCESS BIT(2)
|
|
#define IFS_CLM_SUCCESS BIT(3)
|
|
#define ENV_MNTR_FAIL 0xff
|
|
|
|
/* @1 ============================================================
|
|
* 1 enumrate
|
|
* 1 ============================================================
|
|
*/
|
|
enum phydm_clm_level {
|
|
CLM_RELEASE = 0,
|
|
CLM_LV_1 = 1, /* @Low Priority function */
|
|
CLM_LV_2 = 2, /* @Middle Priority function */
|
|
CLM_LV_3 = 3, /* @High priority function (ex: Check hang function) */
|
|
CLM_LV_4 = 4, /* @Debug function (the highest priority) */
|
|
CLM_MAX_NUM = 5
|
|
};
|
|
|
|
enum phydm_nhm_level {
|
|
NHM_RELEASE = 0,
|
|
NHM_LV_1 = 1, /* @Low Priority function */
|
|
NHM_LV_2 = 2, /* @Middle Priority function */
|
|
NHM_LV_3 = 3, /* @High priority function (ex: Check hang function) */
|
|
NHM_LV_4 = 4, /* @Debug function (the highest priority) */
|
|
NHM_MAX_NUM = 5
|
|
};
|
|
|
|
enum phydm_fahm_level {
|
|
FAHM_RELEASE = 0,
|
|
FAHM_LV_1 = 1, /* Low Priority function */
|
|
FAHM_LV_2 = 2, /* Middle Priority function */
|
|
FAHM_LV_3 = 3, /* High priority function (ex: Check hang function) */
|
|
FAHM_LV_4 = 4, /* Debug function (the highest priority) */
|
|
FAHM_MAX_NUM = 5
|
|
};
|
|
|
|
enum phydm_ifs_clm_level {
|
|
IFS_CLM_RELEASE = 0,
|
|
IFS_CLM_LV_1 = 1, /* @Low Priority function */
|
|
IFS_CLM_LV_2 = 2, /* @Middle Priority function */
|
|
IFS_CLM_LV_3 = 3, /* @High priority function (ex: Check hang function) */
|
|
IFS_CLM_LV_4 = 4, /* @Debug function (the highest priority) */
|
|
IFS_CLM_MAX_NUM = 5
|
|
};
|
|
|
|
enum nhm_divider_opt_all {
|
|
NHM_CNT_ALL = 0, /*nhm SUM report <= 255*/
|
|
NHM_VALID = 1, /*nhm SUM report = 255*/
|
|
NHM_CNT_INIT
|
|
};
|
|
|
|
enum nhm_setting {
|
|
SET_NHM_SETTING,
|
|
STORE_NHM_SETTING,
|
|
RESTORE_NHM_SETTING
|
|
};
|
|
|
|
enum nhm_option_cca_all {
|
|
NHM_EXCLUDE_CCA = 0,
|
|
NHM_INCLUDE_CCA = 1,
|
|
NHM_CCA_INIT
|
|
};
|
|
|
|
enum nhm_option_txon_all {
|
|
NHM_EXCLUDE_TXON = 0,
|
|
NHM_INCLUDE_TXON = 1,
|
|
NHM_TXON_INIT
|
|
};
|
|
|
|
enum nhm_application {
|
|
NHM_BACKGROUND = 0,/*@default*/
|
|
NHM_ACS = 1,
|
|
IEEE_11K_HIGH = 2,
|
|
IEEE_11K_LOW = 3,
|
|
INTEL_XBOX = 4,
|
|
NHM_DBG = 5, /*@manual trigger*/
|
|
};
|
|
|
|
enum clm_application {
|
|
CLM_BACKGROUND = 0,/*@default*/
|
|
CLM_ACS = 1,
|
|
};
|
|
|
|
enum fahm_application {
|
|
FAHM_BACKGROUND = 0,/*default*/
|
|
FAHM_ACS = 1,
|
|
FAHM_DBG = 2, /*manual trigger*/
|
|
};
|
|
|
|
enum ifs_clm_application {
|
|
IFS_CLM_BACKGROUND = 0,/*default*/
|
|
IFS_CLM_ACS = 1,
|
|
IFS_CLM_HP_TAS = 2,
|
|
IFS_CLM_DBG = 3,
|
|
};
|
|
|
|
enum clm_monitor_mode {
|
|
CLM_DRIVER_MNTR = 1,
|
|
CLM_FW_MNTR = 2
|
|
};
|
|
|
|
enum phydm_ifs_clm_unit {
|
|
IFS_CLM_4 = 0, /*4us*/
|
|
IFS_CLM_8 = 1, /*8us*/
|
|
IFS_CLM_12 = 2, /*12us*/
|
|
IFS_CLM_16 = 3, /*16us*/
|
|
IFS_CLM_INIT
|
|
};
|
|
|
|
/* @1 ============================================================
|
|
* 1 structure
|
|
* 1 ============================================================
|
|
*/
|
|
struct env_trig_rpt {
|
|
u8 nhm_rpt_stamp;
|
|
u8 clm_rpt_stamp;
|
|
};
|
|
|
|
struct env_mntr_rpt {
|
|
u8 nhm_ratio;
|
|
u8 nhm_env_ratio; /*exclude nhm_r[0] above -80dBm or first cluster under -80dBm*/
|
|
u8 nhm_result[NHM_RPT_NUM];
|
|
u8 clm_ratio;
|
|
u8 nhm_rpt_stamp;
|
|
u8 clm_rpt_stamp;
|
|
u8 nhm_noise_pwr; /*including r[0]~r[10]*/
|
|
u8 nhm_pwr; /*including r[0]~r[11]*/
|
|
};
|
|
|
|
struct enhance_mntr_trig_rpt {
|
|
u8 nhm_rpt_stamp;
|
|
u8 clm_rpt_stamp;
|
|
u8 fahm_rpt_stamp;
|
|
u8 ifs_clm_rpt_stamp;
|
|
};
|
|
|
|
struct enhance_mntr_rpt {
|
|
u8 nhm_ratio;
|
|
u8 nhm_env_ratio; /*exclude nhm_r[0] above -80dBm or first cluster under -80dBm*/
|
|
u8 nhm_result[NHM_RPT_NUM];
|
|
u8 clm_ratio;
|
|
u8 nhm_rpt_stamp;
|
|
u8 clm_rpt_stamp;
|
|
u8 nhm_noise_pwr; /*including r[0]~r[10]*/
|
|
u8 nhm_pwr; /*including r[0]~r[11]*/
|
|
u16 fahm_result[NHM_RPT_NUM];
|
|
u8 fahm_rpt_stamp;
|
|
u8 fahm_pwr;
|
|
u8 fahm_ratio;
|
|
u8 fahm_denom_ratio;
|
|
u8 fahm_inclu_cck;
|
|
u8 ifs_clm_rpt_stamp;
|
|
u8 ifs_clm_tx_ratio;
|
|
u8 ifs_clm_edcca_excl_cca_ratio;
|
|
u8 ifs_clm_cck_fa_ratio;
|
|
u8 ifs_clm_cck_cca_excl_fa_ratio;
|
|
u8 ifs_clm_ofdm_fa_ratio;
|
|
u8 ifs_clm_ofdm_cca_excl_fa_ratio;
|
|
};
|
|
|
|
struct nhm_para_info {
|
|
enum nhm_option_txon_all incld_txon; /*@Include TX on*/
|
|
enum nhm_option_cca_all incld_cca; /*@Include CCA*/
|
|
enum nhm_divider_opt_all div_opt; /*@divider option*/
|
|
enum nhm_application nhm_app;
|
|
enum phydm_nhm_level nhm_lv;
|
|
u16 mntr_time; /*@0~262 unit ms*/
|
|
boolean en_1db_mode;
|
|
u8 nhm_th0_manual; /* for 1-db mode*/
|
|
};
|
|
|
|
struct clm_para_info {
|
|
enum clm_application clm_app;
|
|
enum phydm_clm_level clm_lv;
|
|
u16 mntr_time; /*@0~262 unit ms*/
|
|
};
|
|
|
|
struct fahm_para_info {
|
|
enum fahm_application app;
|
|
enum phydm_fahm_level lv;
|
|
u16 mntr_time; /*0~262 unit ms*/
|
|
u8 numer_opt;
|
|
u8 denom_opt;
|
|
boolean en_1db_mode;
|
|
u8 th0_manual;/* for 1-db mode*/
|
|
};
|
|
|
|
struct ifs_clm_para_info {
|
|
enum ifs_clm_application ifs_clm_app;
|
|
enum phydm_ifs_clm_level ifs_clm_lv;
|
|
enum phydm_ifs_clm_unit ifs_clm_ctrl_unit; /*unit*/
|
|
u16 mntr_time; /*ms*/
|
|
boolean ifs_clm_th_en[IFS_CLM_NUM];
|
|
u16 ifs_clm_th_low[IFS_CLM_NUM];
|
|
u16 ifs_clm_th_high[IFS_CLM_NUM];
|
|
s16 th_shift;
|
|
};
|
|
|
|
struct ccx_info {
|
|
u32 nhm_trigger_time;
|
|
u32 clm_trigger_time;
|
|
u32 fahm_trigger_time;
|
|
u32 ifs_clm_trigger_time;
|
|
u64 start_time; /*@monitor for the test duration*/
|
|
u8 ccx_watchdog_result;
|
|
#ifdef NHM_SUPPORT
|
|
enum nhm_application nhm_app;
|
|
enum nhm_option_txon_all nhm_include_txon;
|
|
enum nhm_option_cca_all nhm_include_cca;
|
|
enum nhm_divider_opt_all nhm_divider_opt;
|
|
/*Report*/
|
|
u8 nhm_th[NHM_TH_NUM];
|
|
u8 nhm_result[NHM_RPT_NUM];
|
|
u8 nhm_wgt[NHM_RPT_NUM];
|
|
u16 nhm_period; /* @4us per unit */
|
|
u8 nhm_igi;
|
|
u8 nhm_manual_ctrl;
|
|
u8 nhm_ratio; /*@1% per nuit, it means the interference igi can't overcome.*/
|
|
u8 nhm_env_ratio; /*exclude nhm_r[0] above -80dBm or first cluster under -80dBm*/
|
|
u8 nhm_rpt_sum;
|
|
u8 nhm_set_lv;
|
|
boolean nhm_ongoing;
|
|
u8 nhm_rpt_stamp;
|
|
u8 nhm_level; /*including r[0]~r[10]*/
|
|
u8 nhm_level_valid;
|
|
u8 nhm_pwr; /*including r[0]~r[11]*/
|
|
#ifdef NHM_DYM_PW_TH_SUPPORT
|
|
boolean nhm_dym_pw_th_en;
|
|
boolean dym_pwth_manual_ctrl;
|
|
u8 pw_th_rf20_ori;
|
|
u8 pw_th_rf20_cur;
|
|
u8 nhm_pw_th_max;
|
|
u8 nhm_period_decre;
|
|
u8 nhm_sl_pw_th;
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef CLM_SUPPORT
|
|
enum clm_application clm_app;
|
|
u8 clm_manual_ctrl;
|
|
u8 clm_set_lv;
|
|
boolean clm_ongoing;
|
|
u16 clm_period; /* @4us per unit */
|
|
u16 clm_result;
|
|
u8 clm_ratio;
|
|
u32 clm_fw_result_acc;
|
|
u8 clm_fw_result_cnt;
|
|
enum clm_monitor_mode clm_mntr_mode;
|
|
u8 clm_rpt_stamp;
|
|
#endif
|
|
#ifdef FAHM_SUPPORT
|
|
enum fahm_application fahm_app;
|
|
boolean fahm_ongoing;
|
|
u8 fahm_numer_opt;
|
|
u8 fahm_denom_opt;
|
|
boolean fahm_inclu_cck;
|
|
u8 fahm_th[NHM_TH_NUM];
|
|
u16 fahm_result[NHM_RPT_NUM];
|
|
u16 fahm_result_sum;
|
|
u16 fahm_denom_result;
|
|
u16 fahm_period; /*unit: 4us*/
|
|
u8 fahm_igi;
|
|
u8 fahm_manual_ctrl;
|
|
u8 fahm_set_lv;
|
|
u8 fahm_rpt_stamp;
|
|
u8 fahm_pwr; /*including r[0]~r[11]*/
|
|
u8 fahm_ratio;
|
|
u8 fahm_denom_ratio;
|
|
#endif
|
|
#ifdef IFS_CLM_SUPPORT
|
|
enum ifs_clm_application ifs_clm_app;
|
|
/*Control*/
|
|
enum phydm_ifs_clm_unit ifs_clm_ctrl_unit; /*4,8,12,16us per unit*/
|
|
u16 ifs_clm_period;
|
|
boolean ifs_clm_th_en[IFS_CLM_NUM];
|
|
u16 ifs_clm_th_low[IFS_CLM_NUM];
|
|
u16 ifs_clm_th_high[IFS_CLM_NUM];
|
|
/*Flow control*/
|
|
u8 ifs_clm_set_lv;
|
|
u8 ifs_clm_manual_ctrl;
|
|
boolean ifs_clm_ongoing;
|
|
/*Report*/
|
|
u8 ifs_clm_rpt_stamp;
|
|
u16 ifs_clm_tx;
|
|
u16 ifs_clm_edcca_excl_cca;
|
|
u16 ifs_clm_ofdmfa;
|
|
u16 ifs_clm_ofdmcca_excl_fa;
|
|
u16 ifs_clm_cckfa;
|
|
u16 ifs_clm_cckcca_excl_fa;
|
|
u8 ifs_clm_his[IFS_CLM_NUM]; /*trx_neg_edge to CCA/FA posedge per times*/
|
|
u16 ifs_clm_total_cca;
|
|
u16 ifs_clm_avg[IFS_CLM_NUM]; /*4,8,12,16us per unit*/
|
|
u16 ifs_clm_avg_cca[IFS_CLM_NUM]; /*4,8,12,16us per unit*/
|
|
u8 ifs_clm_tx_ratio;
|
|
u8 ifs_clm_edcca_excl_cca_ratio;
|
|
u8 ifs_clm_cck_fa_ratio;
|
|
u8 ifs_clm_cck_cca_excl_fa_ratio;
|
|
u8 ifs_clm_ofdm_fa_ratio;
|
|
u8 ifs_clm_ofdm_cca_excl_fa_ratio;
|
|
#endif
|
|
};
|
|
|
|
/* @1 ============================================================
|
|
* 1 Function Prototype
|
|
* 1 ============================================================
|
|
*/
|
|
|
|
u8 phydm_env_mntr_get_802_11_k_rsni(void *dm_void, s8 rcpi, s8 anpi);
|
|
|
|
#ifdef FAHM_SUPPORT
|
|
void phydm_fahm_init(void *dm_void);
|
|
|
|
void phydm_fahm_dbg(void *dm_void, char input[][16], u32 *_used, char *output,
|
|
u32 *_out_len);
|
|
#endif
|
|
|
|
#ifdef NHM_SUPPORT
|
|
void phydm_nhm_dbg(void *dm_void, char input[][16], u32 *_used, char *output,
|
|
u32 *_out_len);
|
|
u8 phydm_get_igi(void *dm_void, enum bb_path path);
|
|
#endif
|
|
|
|
#ifdef CLM_SUPPORT
|
|
void phydm_clm_c2h_report_handler(void *dm_void, u8 *cmd_buf, u8 cmd_len);
|
|
|
|
void phydm_clm_dbg(void *dm_void, char input[][16], u32 *_used, char *output,
|
|
u32 *_out_len);
|
|
#endif
|
|
|
|
u8 phydm_env_mntr_trigger(void *dm_void, struct nhm_para_info *nhm_para,
|
|
struct clm_para_info *clm_para,
|
|
struct env_trig_rpt *rpt);
|
|
|
|
u8 phydm_env_mntr_result(void *dm_void, struct env_mntr_rpt *rpt);
|
|
|
|
void phydm_env_mntr_dbg(void *dm_void, char input[][16], u32 *_used,
|
|
char *output, u32 *_out_len);
|
|
|
|
#ifdef IFS_CLM_SUPPORT
|
|
void phydm_ifs_clm_dbg(void *dm_void, char input[][16], u32 *_used,
|
|
char *output, u32 *_out_len);
|
|
#endif
|
|
|
|
u8 phydm_enhance_mntr_trigger(void *dm_void,
|
|
struct nhm_para_info *nhm_para,
|
|
struct clm_para_info *clm_para,
|
|
struct fahm_para_info *fahm_para,
|
|
struct ifs_clm_para_info *ifs_clm_para,
|
|
struct enhance_mntr_trig_rpt *trig_rpt);
|
|
|
|
u8 phydm_enhance_mntr_result(void *dm_void, struct enhance_mntr_rpt *rpt);
|
|
|
|
void phydm_enhance_mntr_dbg(void *dm_void, char input[][16], u32 *_used,
|
|
char *output, u32 *_out_len);
|
|
|
|
void phydm_env_mntr_result_watchdog(void *dm_void);
|
|
|
|
void phydm_env_mntr_set_watchdog(void *dm_void);
|
|
|
|
void phydm_env_monitor_init(void *dm_void);
|
|
|
|
#endif
|