aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging/rtlwifi/phydm/phydm_dig.h
blob: f618b4dd1fd32a5bca84d6a5b93103ef6d443c72 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
/* SPDX-License-Identifier: GPL-2.0 */
/******************************************************************************
 *
 * Copyright(c) 2007 - 2016  Realtek Corporation.
 *
 * 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 __PHYDMDIG_H__
#define __PHYDMDIG_H__

#define DIG_VERSION "1.32" /* 2016.09.02  YuChen. add CCK PD for 8197F*/

/* Pause DIG & CCKPD */
#define DM_DIG_MAX_PAUSE_TYPE 0x7

enum dig_goupcheck_level {
	DIG_GOUPCHECK_LEVEL_0,
	DIG_GOUPCHECK_LEVEL_1,
	DIG_GOUPCHECK_LEVEL_2

};

struct dig_thres {
	bool is_stop_dig; /* for debug */
	bool is_ignore_dig;
	bool is_psd_in_progress;

	u8 dig_enable_flag;
	u8 dig_ext_port_stage;

	int rssi_low_thresh;
	int rssi_high_thresh;

	u32 fa_low_thresh;
	u32 fa_high_thresh;

	u8 cur_sta_connect_state;
	u8 pre_sta_connect_state;
	u8 cur_multi_sta_connect_state;

	u8 pre_ig_value;
	u8 cur_ig_value;
	u8 backup_ig_value; /* MP DIG */
	u8 bt30_cur_igi;
	u8 igi_backup;

	s8 backoff_val;
	s8 backoff_val_range_max;
	s8 backoff_val_range_min;
	u8 rx_gain_range_max;
	u8 rx_gain_range_min;
	u8 rssi_val_min;

	u8 pre_cck_cca_thres;
	u8 cur_cck_cca_thres;
	u8 pre_cck_pd_state;
	u8 cur_cck_pd_state;
	u8 cck_pd_backup;
	u8 pause_cckpd_level;
	u8 pause_cckpd_value[DM_DIG_MAX_PAUSE_TYPE + 1];

	u8 large_fa_hit;
	u8 large_fa_timeout; /*if (large_fa_hit), monitor "large_fa_timeout"
			      *sec, if timeout, large_fa_hit=0
			      */
	u8 forbidden_igi;
	u32 recover_cnt;

	u8 dig_dynamic_min_0;
	u8 dig_dynamic_min_1;
	bool is_media_connect_0;
	bool is_media_connect_1;

	u32 ant_div_rssi_max;
	u32 rssi_max;

	u8 *is_p2p_in_process;

	u8 pause_dig_level;
	u8 pause_dig_value[DM_DIG_MAX_PAUSE_TYPE + 1];

	u32 cck_fa_ma;
	enum dig_goupcheck_level dig_go_up_check_level;
	u8 aaa_default;

	u8 rf_gain_idx;
	u8 agc_table_idx;
	u8 big_jump_lmt[16];
	u8 enable_adjust_big_jump : 1;
	u8 big_jump_step1 : 3;
	u8 big_jump_step2 : 2;
	u8 big_jump_step3 : 2;
};

struct false_alarm_stat {
	u32 cnt_parity_fail;
	u32 cnt_rate_illegal;
	u32 cnt_crc8_fail;
	u32 cnt_mcs_fail;
	u32 cnt_ofdm_fail;
	u32 cnt_ofdm_fail_pre; /* For RTL8881A */
	u32 cnt_cck_fail;
	u32 cnt_all;
	u32 cnt_all_pre;
	u32 cnt_fast_fsync;
	u32 cnt_sb_search_fail;
	u32 cnt_ofdm_cca;
	u32 cnt_cck_cca;
	u32 cnt_cca_all;
	u32 cnt_bw_usc; /* Gary */
	u32 cnt_bw_lsc; /* Gary */
	u32 cnt_cck_crc32_error;
	u32 cnt_cck_crc32_ok;
	u32 cnt_ofdm_crc32_error;
	u32 cnt_ofdm_crc32_ok;
	u32 cnt_ht_crc32_error;
	u32 cnt_ht_crc32_ok;
	u32 cnt_vht_crc32_error;
	u32 cnt_vht_crc32_ok;
	u32 cnt_crc32_error_all;
	u32 cnt_crc32_ok_all;
	bool cck_block_enable;
	bool ofdm_block_enable;
	u32 dbg_port0;
	bool edcca_flag;
};

enum dm_dig_op {
	DIG_TYPE_THRESH_HIGH = 0,
	DIG_TYPE_THRESH_LOW = 1,
	DIG_TYPE_BACKOFF = 2,
	DIG_TYPE_RX_GAIN_MIN = 3,
	DIG_TYPE_RX_GAIN_MAX = 4,
	DIG_TYPE_ENABLE = 5,
	DIG_TYPE_DISABLE = 6,
	DIG_OP_TYPE_MAX
};

enum phydm_pause_type { PHYDM_PAUSE = BIT(0), PHYDM_RESUME = BIT(1) };

enum phydm_pause_level {
	/* number of pause level can't exceed DM_DIG_MAX_PAUSE_TYPE */
	PHYDM_PAUSE_LEVEL_0 = 0,
	PHYDM_PAUSE_LEVEL_1 = 1,
	PHYDM_PAUSE_LEVEL_2 = 2,
	PHYDM_PAUSE_LEVEL_3 = 3,
	PHYDM_PAUSE_LEVEL_4 = 4,
	PHYDM_PAUSE_LEVEL_5 = 5,
	PHYDM_PAUSE_LEVEL_6 = 6,
	PHYDM_PAUSE_LEVEL_7 = DM_DIG_MAX_PAUSE_TYPE /* maximum level */
};

#define DM_DIG_THRESH_HIGH 40
#define DM_DIG_THRESH_LOW 35

#define DM_FALSEALARM_THRESH_LOW 400
#define DM_FALSEALARM_THRESH_HIGH 1000

#define DM_DIG_MAX_NIC 0x3e
#define DM_DIG_MIN_NIC 0x20
#define DM_DIG_MAX_OF_MIN_NIC 0x3e

#define DM_DIG_MAX_AP 0x3e
#define DM_DIG_MIN_AP 0x20
#define DM_DIG_MAX_OF_MIN 0x2A /* 0x32 */
#define DM_DIG_MIN_AP_DFS 0x20

#define DM_DIG_MAX_NIC_HP 0x46
#define DM_DIG_MIN_NIC_HP 0x2e

#define DM_DIG_MAX_AP_HP 0x42
#define DM_DIG_MIN_AP_HP 0x30

/* vivi 92c&92d has different definition, 20110504
 * this is for 92c
 */
#define DM_DIG_FA_TH0 0x200 /* 0x20 */

#define DM_DIG_FA_TH1 0x300
#define DM_DIG_FA_TH2 0x400
/* this is for 92d */
#define DM_DIG_FA_TH0_92D 0x100
#define DM_DIG_FA_TH1_92D 0x400
#define DM_DIG_FA_TH2_92D 0x600

#define DM_DIG_BACKOFF_MAX 12
#define DM_DIG_BACKOFF_MIN -4
#define DM_DIG_BACKOFF_DEFAULT 10

#define DM_DIG_FA_TH0_LPS 4 /* -> 4 in lps */
#define DM_DIG_FA_TH1_LPS 15 /* -> 15 lps */
#define DM_DIG_FA_TH2_LPS 30 /* -> 30 lps */
#define RSSI_OFFSET_DIG 0x05
#define LARGE_FA_TIMEOUT 60

void odm_change_dynamic_init_gain_thresh(void *dm_void, u32 dm_type,
					 u32 dm_value);

void odm_write_dig(void *dm_void, u8 current_igi);

void odm_pause_dig(void *dm_void, enum phydm_pause_type pause_type,
		   enum phydm_pause_level pause_level, u8 igi_value);

void odm_dig_init(void *dm_void);

void odm_DIG(void *dm_void);

void odm_dig_by_rssi_lps(void *dm_void);

void odm_false_alarm_counter_statistics(void *dm_void);

void odm_pause_cck_packet_detection(void *dm_void,
				    enum phydm_pause_type pause_type,
				    enum phydm_pause_level pause_level,
				    u8 cck_pd_threshold);

void odm_cck_packet_detection_thresh(void *dm_void);

void odm_write_cck_cca_thres(void *dm_void, u8 cur_cck_cca_thres);

bool phydm_dig_go_up_check(void *dm_void);

#endif