1 /* SPDX-License-Identifier: GPL-2.0 */
2 /******************************************************************************
3  *
4  * Copyright(c) 2007 - 2016  Realtek Corporation.
5  *
6  * Contact Information:
7  * wlanfae <wlanfae@realtek.com>
8  * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
9  * Hsinchu 300, Taiwan.
10  *
11  * Larry Finger <Larry.Finger@lwfinger.net>
12  *
13  *****************************************************************************/
14 
15 #ifndef __PHYDMANTDIV_H__
16 #define __PHYDMANTDIV_H__
17 
18 /* 2.0 2014.11.04
19  * 2.1 2015.01.13 Dino
20  * 2.2 2015.01.16 Dino
21  * 3.1 2015.07.29 YuChen, remove 92c 92d 8723a
22  * 3.2 2015.08.11 Stanley, disable antenna diversity when BT is enable for 8723B
23  * 3.3 2015.08.12 Stanley. 8723B does not need to check the antenna is control
24  *		  by BT, because antenna diversity only works when BT is disable
25  *		  or radio off
26  * 3.4 2015.08.28 Dino  1.Add 8821A Smart Antenna 2. Add 8188F SW S0S1 Antenna
27  *		  Diversity
28  * 3.5 2015.10.07 Stanley  Always check antenna detection result from BT-coex.
29  *		  for 8723B, not from PHYDM
30  * 3.6 2015.11.16 Stanley
31  * 3.7 2015.11.20 Dino Add SmartAnt FAT Patch
32  * 3.8 2015.12.21 Dino, Add SmartAnt dynamic training packet num
33  * 3.9 2016.01.05 Dino, Add SmartAnt cmd for converting single & two smtant, and
34  *		  add cmd for adjust truth table
35  */
36 #define ANTDIV_VERSION "3.9"
37 
38 /* 1 ============================================================
39  * 1  Definition
40  * 1 ============================================================
41  */
42 
43 #define ANTDIV_INIT 0xff
44 #define MAIN_ANT 1 /*ant A or ant Main   or S1*/
45 #define AUX_ANT 2 /*AntB or ant Aux   or S0*/
46 #define MAX_ANT 3 /* 3 for AP using*/
47 
48 #define ANT1_2G 0 /* = ANT2_5G	for 8723D  BTG S1 RX S0S1 diversity for 8723D,
49 		   * TX fixed at S1
50 		   */
51 #define ANT2_2G 1 /* = ANT1_5G	for 8723D  BTG S0  RX S0S1 diversity for 8723D,
52 		   * TX fixed at S1
53 		   */
54 /*smart antenna*/
55 #define SUPPORT_RF_PATH_NUM 4
56 #define SUPPORT_BEAM_PATTERN_NUM 4
57 #define NUM_ANTENNA_8821A 2
58 
59 #define SUPPORT_BEAM_SET_PATTERN_NUM 8
60 
61 #define NO_FIX_TX_ANT 0
62 #define FIX_TX_AT_MAIN 1
63 #define FIX_AUX_AT_MAIN 2
64 
65 /* Antenna Diversty Control type */
66 #define ODM_AUTO_ANT 0
67 #define ODM_FIX_MAIN_ANT 1
68 #define ODM_FIX_AUX_ANT 2
69 
70 #define ODM_N_ANTDIV_SUPPORT                                                   \
71 	(ODM_RTL8188E | ODM_RTL8192E | ODM_RTL8723B | ODM_RTL8188F |           \
72 	 ODM_RTL8723D | ODM_RTL8195A)
73 #define ODM_AC_ANTDIV_SUPPORT                                                  \
74 	(ODM_RTL8821 | ODM_RTL8881A | ODM_RTL8812 | ODM_RTL8821C |             \
75 	 ODM_RTL8822B | ODM_RTL8814B)
76 #define ODM_ANTDIV_SUPPORT (ODM_N_ANTDIV_SUPPORT | ODM_AC_ANTDIV_SUPPORT)
77 #define ODM_SMART_ANT_SUPPORT (ODM_RTL8188E | ODM_RTL8192E)
78 #define ODM_HL_SMART_ANT_TYPE1_SUPPORT (ODM_RTL8821 | ODM_RTL8822B)
79 
80 #define ODM_ANTDIV_2G_SUPPORT_IC                                               \
81 	(ODM_RTL8188E | ODM_RTL8192E | ODM_RTL8723B | ODM_RTL8881A |           \
82 	 ODM_RTL8188F | ODM_RTL8723D)
83 #define ODM_ANTDIV_5G_SUPPORT_IC                                               \
84 	(ODM_RTL8821 | ODM_RTL8881A | ODM_RTL8812 | ODM_RTL8821C)
85 
86 #define ODM_EVM_ENHANCE_ANTDIV_SUPPORT_IC (ODM_RTL8192E)
87 
88 #define ODM_ANTDIV_2G BIT(0)
89 #define ODM_ANTDIV_5G BIT(1)
90 
91 #define ANTDIV_ON 1
92 #define ANTDIV_OFF 0
93 
94 #define FAT_ON 1
95 #define FAT_OFF 0
96 
97 #define TX_BY_DESC 1
98 #define TX_BY_REG 0
99 
100 #define RSSI_METHOD 0
101 #define EVM_METHOD 1
102 #define CRC32_METHOD 2
103 
104 #define INIT_ANTDIV_TIMMER 0
105 #define CANCEL_ANTDIV_TIMMER 1
106 #define RELEASE_ANTDIV_TIMMER 2
107 
108 #define CRC32_FAIL 1
109 #define CRC32_OK 0
110 
111 #define evm_rssi_th_high 25
112 #define evm_rssi_th_low 20
113 
114 #define NORMAL_STATE_MIAN 1
115 #define NORMAL_STATE_AUX 2
116 #define TRAINING_STATE 3
117 
118 #define FORCE_RSSI_DIFF 10
119 
120 #define CSI_ON 1
121 #define CSI_OFF 0
122 
123 #define DIVON_CSIOFF 1
124 #define DIVOFF_CSION 2
125 
126 #define BDC_DIV_TRAIN_STATE 0
127 #define bdc_bfer_train_state 1
128 #define BDC_DECISION_STATE 2
129 #define BDC_BF_HOLD_STATE 3
130 #define BDC_DIV_HOLD_STATE 4
131 
132 #define BDC_MODE_1 1
133 #define BDC_MODE_2 2
134 #define BDC_MODE_3 3
135 #define BDC_MODE_4 4
136 #define BDC_MODE_NULL 0xff
137 
138 /*SW S0S1 antenna diversity*/
139 #define SWAW_STEP_INIT 0xff
140 #define SWAW_STEP_PEEK 0
141 #define SWAW_STEP_DETERMINE 1
142 
143 #define RSSI_CHECK_RESET_PERIOD 10
144 #define RSSI_CHECK_THRESHOLD 50
145 
146 /*Hong Lin Smart antenna*/
147 #define HL_SMTANT_2WIRE_DATA_LEN 24
148 
149 /* 1 ============================================================
150  * 1  structure
151  * 1 ============================================================
152  */
153 
154 struct sw_antenna_switch {
155 	u8 double_chk_flag; /*If current antenna RSSI > "RSSI_CHECK_THRESHOLD",
156 			     *than check this antenna again
157 			     */
158 	u8 try_flag;
159 	s32 pre_rssi;
160 	u8 cur_antenna;
161 	u8 pre_antenna;
162 	u8 rssi_trying;
163 	u8 reset_idx;
164 	u8 train_time;
165 	u8 train_time_flag; /*base on RSSI difference between two antennas*/
166 	struct timer_list phydm_sw_antenna_switch_timer;
167 	u32 pkt_cnt_sw_ant_div_by_ctrl_frame;
168 	bool is_sw_ant_div_by_ctrl_frame;
169 
170 	/* AntDect (Before link Antenna Switch check) need to be moved*/
171 	u16 single_ant_counter;
172 	u16 dual_ant_counter;
173 	u16 aux_fail_detec_counter;
174 	u16 retry_counter;
175 	u8 swas_no_link_state;
176 	u32 swas_no_link_bk_reg948;
177 	bool ANTA_ON; /*To indicate ant A is or not*/
178 	bool ANTB_ON; /*To indicate ant B is on or not*/
179 	bool pre_aux_fail_detec;
180 	bool rssi_ant_dect_result;
181 	u8 ant_5g;
182 	u8 ant_2g;
183 };
184 
185 struct fast_antenna_training {
186 	u8 bssid[6];
187 	u8 antsel_rx_keep_0;
188 	u8 antsel_rx_keep_1;
189 	u8 antsel_rx_keep_2;
190 	u8 antsel_rx_keep_3;
191 	u32 ant_sum_rssi[7];
192 	u32 ant_rssi_cnt[7];
193 	u32 ant_ave_rssi[7];
194 	u8 fat_state;
195 	u32 train_idx;
196 	u8 antsel_a[ODM_ASSOCIATE_ENTRY_NUM];
197 	u8 antsel_b[ODM_ASSOCIATE_ENTRY_NUM];
198 	u8 antsel_c[ODM_ASSOCIATE_ENTRY_NUM];
199 	u16 main_ant_sum[ODM_ASSOCIATE_ENTRY_NUM];
200 	u16 aux_ant_sum[ODM_ASSOCIATE_ENTRY_NUM];
201 	u16 main_ant_cnt[ODM_ASSOCIATE_ENTRY_NUM];
202 	u16 aux_ant_cnt[ODM_ASSOCIATE_ENTRY_NUM];
203 	u16 main_ant_sum_cck[ODM_ASSOCIATE_ENTRY_NUM];
204 	u16 aux_ant_sum_cck[ODM_ASSOCIATE_ENTRY_NUM];
205 	u16 main_ant_cnt_cck[ODM_ASSOCIATE_ENTRY_NUM];
206 	u16 aux_ant_cnt_cck[ODM_ASSOCIATE_ENTRY_NUM];
207 	u8 rx_idle_ant;
208 	u8 ant_div_on_off;
209 	bool is_become_linked;
210 	u32 min_max_rssi;
211 	u8 idx_ant_div_counter_2g;
212 	u8 idx_ant_div_counter_5g;
213 	u8 ant_div_2g_5g;
214 
215 	u32 cck_ctrl_frame_cnt_main;
216 	u32 cck_ctrl_frame_cnt_aux;
217 	u32 ofdm_ctrl_frame_cnt_main;
218 	u32 ofdm_ctrl_frame_cnt_aux;
219 	u32 main_ant_ctrl_frame_sum;
220 	u32 aux_ant_ctrl_frame_sum;
221 	u32 main_ant_ctrl_frame_cnt;
222 	u32 aux_ant_ctrl_frame_cnt;
223 	u8 b_fix_tx_ant;
224 	bool fix_ant_bfee;
225 	bool enable_ctrl_frame_antdiv;
226 	bool use_ctrl_frame_antdiv;
227 	u8 hw_antsw_occur;
228 	u8 *p_force_tx_ant_by_desc;
229 	u8 force_tx_ant_by_desc; /*A temp value, will hook to driver team's
230 				  *outer parameter later
231 				  */
232 	u8 *p_default_s0_s1;
233 	u8 default_s0_s1;
234 };
235 
236 /* 1 ============================================================
237  * 1  enumeration
238  * 1 ============================================================
239  */
240 
241 /*Fast antenna training*/
242 enum fat_state {
243 	FAT_BEFORE_LINK_STATE = 0,
244 	FAT_PREPARE_STATE = 1,
245 	FAT_TRAINING_STATE = 2,
246 	FAT_DECISION_STATE = 3
247 };
248 
249 enum ant_div_type {
250 	NO_ANTDIV = 0xFF,
251 	CG_TRX_HW_ANTDIV = 0x01,
252 	CGCS_RX_HW_ANTDIV = 0x02,
253 	FIXED_HW_ANTDIV = 0x03,
254 	CG_TRX_SMART_ANTDIV = 0x04,
255 	CGCS_RX_SW_ANTDIV = 0x05,
256 	/*8723B intrnal switch S0 S1*/
257 	S0S1_SW_ANTDIV = 0x06,
258 	/*TRX S0S1 diversity for 8723D*/
259 	S0S1_TRX_HW_ANTDIV = 0x07,
260 	/*Hong-Lin Smart antenna use for 8821AE which is a 2 ant. entitys, and
261 	 *each ant. is equipped with 4 antenna patterns
262 	 */
263 	HL_SW_SMART_ANT_TYPE1 = 0x10,
264 	/*Hong-Bo Smart antenna use for 8822B which is a 2 ant. entitys*/
265 	HL_SW_SMART_ANT_TYPE2 = 0x11,
266 };
267 
268 /* 1 ============================================================
269  * 1  function prototype
270  * 1 ============================================================
271  */
272 
273 void odm_stop_antenna_switch_dm(void *dm_void);
274 
275 void phydm_enable_antenna_diversity(void *dm_void);
276 
277 void odm_set_ant_config(void *dm_void, u8 ant_setting /* 0=A, 1=B, 2=C, .... */
278 			);
279 
280 #define sw_ant_div_rest_after_link odm_sw_ant_div_rest_after_link
281 
282 void odm_sw_ant_div_rest_after_link(void *dm_void);
283 
284 void odm_ant_div_reset(void *dm_void);
285 
286 void odm_antenna_diversity_init(void *dm_void);
287 
288 void odm_antenna_diversity(void *dm_void);
289 
290 #endif /*#ifndef	__ODMANTDIV_H__*/
291