xref: /OK3568_Linux_fs/kernel/drivers/net/wireless/rockchip_wlan/rtl8188fu/hal/phydm/phydm.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /******************************************************************************
3  *
4  * Copyright(c) 2007 - 2017  Realtek Corporation.
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms of version 2 of the GNU General Public License as
8  * published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13  * more details.
14  *
15  * The full GNU General Public License is included in this distribution in the
16  * file called LICENSE.
17  *
18  * Contact Information:
19  * wlanfae <wlanfae@realtek.com>
20  * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
21  * Hsinchu 300, Taiwan.
22  *
23  * Larry Finger <Larry.Finger@lwfinger.net>
24  *
25  *****************************************************************************/
26 
27 /*@************************************************************
28  * include files
29  ************************************************************/
30 
31 #include "mp_precomp.h"
32 #include "phydm_precomp.h"
33 
34 const u16 phy_rate_table[] = {
35 	/*@20M*/
36 	1, 2, 5, 11,
37 	6, 9, 12, 18, 24, 36, 48, 54,
38 	6, 13, 19, 26, 39, 52, 58, 65, /*@MCS0~7*/
39 	13, 26, 39, 52, 78, 104, 117, 130, /*@MCS8~15*/
40 	19, 39, 58, 78, 117, 156, 175, 195, /*@MCS16~23*/
41 	26, 52, 78, 104, 156, 208, 234, 260, /*@MCS24~31*/
42 	6, 13, 19, 26, 39, 52, 58, 65, 78, 90, /*@1ss MCS0~9*/
43 	13, 26, 39, 52, 78, 104, 117, 130, 156, 180, /*@2ss MCS0~9*/
44 	19, 39, 58, 78, 117, 156, 175, 195, 234, 260, /*@3ss MCS0~9*/
45 	26, 52, 78, 104, 156, 208, 234, 260, 312, 360 /*@4ss MCS0~9*/
46 };
47 
phydm_traffic_load_decision(void * dm_void)48 void phydm_traffic_load_decision(void *dm_void)
49 {
50 	struct dm_struct *dm = (struct dm_struct *)dm_void;
51 	u8 shift = 0;
52 
53 	/*@---TP & Trafic-load calculation---*/
54 
55 	if (dm->last_tx_ok_cnt > *dm->num_tx_bytes_unicast)
56 		dm->last_tx_ok_cnt = *dm->num_tx_bytes_unicast;
57 
58 	if (dm->last_rx_ok_cnt > *dm->num_rx_bytes_unicast)
59 		dm->last_rx_ok_cnt = *dm->num_rx_bytes_unicast;
60 
61 	dm->cur_tx_ok_cnt = *dm->num_tx_bytes_unicast - dm->last_tx_ok_cnt;
62 	dm->cur_rx_ok_cnt = *dm->num_rx_bytes_unicast - dm->last_rx_ok_cnt;
63 	dm->last_tx_ok_cnt = *dm->num_tx_bytes_unicast;
64 	dm->last_rx_ok_cnt = *dm->num_rx_bytes_unicast;
65 
66 	/*@AP:  <<3(8bit), >>20(10^6,M), >>0(1sec)*/
67 	shift = 17 + (PHYDM_WATCH_DOG_PERIOD - 1);
68 	/*@WIN&CE:  <<3(8bit), >>20(10^6,M), >>1(2sec)*/
69 
70 	dm->tx_tp = (dm->tx_tp >> 1) + (u32)((dm->cur_tx_ok_cnt >> shift) >> 1);
71 	dm->rx_tp = (dm->rx_tp >> 1) + (u32)((dm->cur_rx_ok_cnt >> shift) >> 1);
72 
73 	dm->total_tp = dm->tx_tp + dm->rx_tp;
74 
75 	/*@[Calculate TX/RX state]*/
76 	if (dm->tx_tp > (dm->rx_tp << 1))
77 		dm->txrx_state_all = TX_STATE;
78 	else if (dm->rx_tp > (dm->tx_tp << 1))
79 		dm->txrx_state_all = RX_STATE;
80 	else
81 		dm->txrx_state_all = BI_DIRECTION_STATE;
82 
83 	/*@[Traffic load decision]*/
84 	dm->pre_traffic_load = dm->traffic_load;
85 
86 	if (dm->cur_tx_ok_cnt > 1875000 || dm->cur_rx_ok_cnt > 1875000) {
87 		/* @( 1.875M * 8bit ) / 2sec= 7.5M bits /sec )*/
88 		dm->traffic_load = TRAFFIC_HIGH;
89 	} else if (dm->cur_tx_ok_cnt > 500000 || dm->cur_rx_ok_cnt > 500000) {
90 		/*@( 0.5M * 8bit ) / 2sec =  2M bits /sec )*/
91 		dm->traffic_load = TRAFFIC_MID;
92 	} else if (dm->cur_tx_ok_cnt > 100000 || dm->cur_rx_ok_cnt > 100000) {
93 		/*@( 0.1M * 8bit ) / 2sec =  0.4M bits /sec )*/
94 		dm->traffic_load = TRAFFIC_LOW;
95 	} else if (dm->cur_tx_ok_cnt > 25000 || dm->cur_rx_ok_cnt > 25000) {
96 		/*@( 0.025M * 8bit ) / 2sec =  0.1M bits /sec )*/
97 		dm->traffic_load = TRAFFIC_ULTRA_LOW;
98 	} else {
99 		dm->traffic_load = TRAFFIC_NO_TP;
100 	}
101 
102 	/*@[Calculate consecutive idlel time]*/
103 	if (dm->traffic_load == 0)
104 		dm->consecutive_idlel_time += PHYDM_WATCH_DOG_PERIOD;
105 	else
106 		dm->consecutive_idlel_time = 0;
107 
108 	#if 0
109 	PHYDM_DBG(dm, DBG_COMMON_FLOW,
110 		  "cur_tx_ok_cnt = %d, cur_rx_ok_cnt = %d, last_tx_ok_cnt = %d, last_rx_ok_cnt = %d\n",
111 		  dm->cur_tx_ok_cnt, dm->cur_rx_ok_cnt, dm->last_tx_ok_cnt,
112 		  dm->last_rx_ok_cnt);
113 
114 	PHYDM_DBG(dm, DBG_COMMON_FLOW, "tx_tp = %d, rx_tp = %d\n", dm->tx_tp,
115 		  dm->rx_tp);
116 	#endif
117 }
118 
phydm_cck_new_agc_chk(struct dm_struct * dm)119 void phydm_cck_new_agc_chk(struct dm_struct *dm)
120 {
121 	dm->cck_new_agc = 0;
122 
123 #if (RTL8723D_SUPPORT || RTL8822B_SUPPORT || RTL8821C_SUPPORT ||\
124 	RTL8197F_SUPPORT || RTL8710B_SUPPORT || RTL8192F_SUPPORT ||\
125 	RTL8195B_SUPPORT || RTL8198F_SUPPORT || RTL8822C_SUPPORT ||\
126 	RTL8721D_SUPPORT)
127 	if (dm->support_ic_type &
128 	    (ODM_RTL8723D | ODM_RTL8822B | ODM_RTL8821C | ODM_RTL8197F |
129 	    ODM_RTL8710B | ODM_RTL8192F | ODM_RTL8195B | ODM_RTL8721D)) {
130 		/*@1: new agc  0: old agc*/
131 		dm->cck_new_agc = (boolean)odm_get_bb_reg(dm, R_0xa9c, BIT(17));
132 	} else if (dm->support_ic_type & (ODM_RTL8198F | ODM_RTL8822C)) {
133 		/*@1: new agc  0: old agc*/
134 		dm->cck_new_agc = (boolean)odm_get_bb_reg(dm, R_0x1a9c,
135 							  BIT(17));
136 	}
137 #endif
138 }
139 
140 /*select 3 or 4 bit LNA */
phydm_cck_lna_bit_num_chk(struct dm_struct * dm)141 void phydm_cck_lna_bit_num_chk(struct dm_struct *dm)
142 {
143 	boolean report_type = 0;
144 	#if (RTL8192E_SUPPORT)
145 	u32 value_824, value_82c;
146 	#endif
147 
148 	#if (RTL8192E_SUPPORT)
149 	if (dm->support_ic_type & (ODM_RTL8192E)) {
150 	/* @0x824[9] = 0x82C[9] = 0xA80[7] those registers setting
151 	 * should be equal or CCK RSSI report may be incorrect
152 	 */
153 		value_824 = odm_get_bb_reg(dm, R_0x824, BIT(9));
154 		value_82c = odm_get_bb_reg(dm, R_0x82c, BIT(9));
155 
156 		if (value_824 != value_82c)
157 			odm_set_bb_reg(dm, R_0x82c, BIT(9), value_824);
158 		odm_set_bb_reg(dm, R_0xa80, BIT(7), value_824);
159 		report_type = (boolean)value_824;
160 	}
161 	#endif
162 
163 	#if (RTL8703B_SUPPORT || RTL8723D_SUPPORT || RTL8710B_SUPPORT)
164 	if (dm->support_ic_type &
165 	    (ODM_RTL8703B | ODM_RTL8723D | ODM_RTL8710B)) {
166 		report_type = (boolean)odm_get_bb_reg(dm, R_0x950, BIT(11));
167 
168 		if (report_type != 1)
169 			pr_debug("[Warning] CCK should be 4bit LNA\n");
170 	}
171 	#endif
172 
173 	#if (RTL8821C_SUPPORT)
174 	if (dm->support_ic_type & ODM_RTL8821C) {
175 		if (dm->default_rf_set_8821c == SWITCH_TO_BTG)
176 			report_type = 1;
177 	}
178 	#endif
179 
180 	dm->cck_agc_report_type = report_type;
181 
182 	PHYDM_DBG(dm, ODM_COMP_INIT, "cck_agc_report_type=((%d))\n",
183 		  dm->cck_agc_report_type);
184 }
185 
phydm_init_cck_setting(struct dm_struct * dm)186 void phydm_init_cck_setting(struct dm_struct *dm)
187 {
188 	u32 reg_tmp = 0;
189 	u32 mask_tmp = 0;
190 
191 	phydm_cck_new_agc_chk(dm);
192 
193 	if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
194 		return;
195 
196 	reg_tmp = ODM_REG(CCK_RPT_FORMAT, dm);
197 	mask_tmp = ODM_BIT(CCK_RPT_FORMAT, dm);
198 	dm->is_cck_high_power = (boolean)odm_get_bb_reg(dm, reg_tmp, mask_tmp);
199 
200 	PHYDM_DBG(dm, ODM_COMP_INIT, "ext_lna_gain=((%d))\n", dm->ext_lna_gain);
201 
202 	phydm_config_cck_rx_antenna_init(dm);
203 
204 	if (dm->support_ic_type & ODM_RTL8192F)
205 		phydm_config_cck_rx_path(dm, BB_PATH_AB);
206 	else if (dm->valid_path_set == BB_PATH_A)
207 		phydm_config_cck_rx_path(dm, BB_PATH_A);
208 	else if (dm->valid_path_set == BB_PATH_B)
209 		phydm_config_cck_rx_path(dm, BB_PATH_B);
210 
211 	phydm_cck_lna_bit_num_chk(dm);
212 	phydm_get_cck_rssi_table_from_reg(dm);
213 }
214 
phydm_init_hw_info_by_rfe(struct dm_struct * dm)215 void phydm_init_hw_info_by_rfe(struct dm_struct *dm)
216 {
217 #if (RTL8822B_SUPPORT)
218 	/*@if (dm->support_ic_type & ODM_RTL8822B)*/
219 		/*@phydm_init_hw_info_by_rfe_type_8822b(dm);*/
220 #endif
221 #if (RTL8821C_SUPPORT)
222 	if (dm->support_ic_type & ODM_RTL8821C)
223 		phydm_init_hw_info_by_rfe_type_8821c(dm);
224 #endif
225 #if (RTL8197F_SUPPORT)
226 	if (dm->support_ic_type & ODM_RTL8197F)
227 		phydm_init_hw_info_by_rfe_type_8197f(dm);
228 #endif
229 }
230 
phydm_common_info_self_init(struct dm_struct * dm)231 void phydm_common_info_self_init(struct dm_struct *dm)
232 {
233 	u32 reg_tmp = 0;
234 	u32 mask_tmp = 0;
235 
236 	dm->run_in_drv_fw = RUN_IN_DRIVER;
237 
238 	/*@BB IP Generation*/
239 	if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
240 		dm->ic_ip_series = PHYDM_IC_JGR3;
241 	else if (dm->support_ic_type & ODM_IC_11AC_SERIES)
242 		dm->ic_ip_series = PHYDM_IC_AC;
243 	else if (dm->support_ic_type & ODM_IC_11N_SERIES)
244 		dm->ic_ip_series = PHYDM_IC_N;
245 
246 	/*@BB phy-status Generation*/
247 	if (dm->support_ic_type & PHYSTS_3RD_TYPE_IC)
248 		dm->ic_phy_sts_type = PHYDM_PHYSTS_TYPE_3;
249 	else if (dm->support_ic_type & PHYSTS_2ND_TYPE_IC)
250 		dm->ic_phy_sts_type = PHYDM_PHYSTS_TYPE_2;
251 	else
252 		dm->ic_phy_sts_type = PHYDM_PHYSTS_TYPE_1;
253 
254 	phydm_init_cck_setting(dm);
255 
256 	reg_tmp = ODM_REG(BB_RX_PATH, dm);
257 	mask_tmp = ODM_BIT(BB_RX_PATH, dm);
258 	dm->rf_path_rx_enable = (u8)odm_get_bb_reg(dm, reg_tmp, mask_tmp);
259 #if (DM_ODM_SUPPORT_TYPE != ODM_CE)
260 	dm->is_net_closed = &dm->BOOLEAN_temp;
261 
262 	phydm_init_debug_setting(dm);
263 #endif
264 	phydm_init_soft_ml_setting(dm);
265 
266 	dm->phydm_sys_up_time = 0;
267 
268 	if (dm->support_ic_type & ODM_IC_1SS)
269 		dm->num_rf_path = 1;
270 	else if (dm->support_ic_type & ODM_IC_2SS)
271 		dm->num_rf_path = 2;
272 	#if 0
273 	/* @RTK do not has IC which is equipped with 3 RF paths,
274 	 * so ODM_IC_3SS is an enpty macro and result in coverity check errors
275 	 */
276 	else if (dm->support_ic_type & ODM_IC_3SS)
277 		dm->num_rf_path = 3;
278 	#endif
279 	else if (dm->support_ic_type & ODM_IC_4SS)
280 		dm->num_rf_path = 4;
281 	else
282 		dm->num_rf_path = 1;
283 
284 	phydm_trx_antenna_setting_init(dm, dm->num_rf_path);
285 
286 	dm->tx_rate = 0xFF;
287 	dm->rssi_min_by_path = 0xFF;
288 
289 	dm->number_linked_client = 0;
290 	dm->pre_number_linked_client = 0;
291 	dm->number_active_client = 0;
292 	dm->pre_number_active_client = 0;
293 
294 	dm->last_tx_ok_cnt = 0;
295 	dm->last_rx_ok_cnt = 0;
296 	dm->tx_tp = 0;
297 	dm->rx_tp = 0;
298 	dm->total_tp = 0;
299 	dm->traffic_load = TRAFFIC_LOW;
300 
301 	dm->nbi_set_result = 0;
302 	dm->is_init_hw_info_by_rfe = false;
303 	dm->pre_dbg_priority = DBGPORT_RELEASE;
304 	dm->tp_active_th = 5;
305 	dm->disable_phydm_watchdog = 0;
306 
307 	dm->u8_dummy = 0xf;
308 	dm->u16_dummy = 0xffff;
309 	dm->u32_dummy = 0xffffffff;
310 
311 	dm->pause_lv_table.lv_cckpd = PHYDM_PAUSE_RELEASE;
312 	dm->pause_lv_table.lv_dig = PHYDM_PAUSE_RELEASE;
313 	dm->pre_is_linked = false;
314 	dm->is_linked = false;
315 
316 	if (!(dm->is_fcs_mode_enable)) {
317 		dm->is_fcs_mode_enable = &dm->boolean_dummy;
318 		pr_debug("[Warning] is_fcs_mode_enable=NULL\n");
319 	}
320 }
321 
phydm_cmn_sta_info_update(void * dm_void,u8 macid)322 void phydm_cmn_sta_info_update(void *dm_void, u8 macid)
323 {
324 	struct dm_struct *dm = (struct dm_struct *)dm_void;
325 	struct cmn_sta_info *sta = dm->phydm_sta_info[macid];
326 	struct ra_sta_info *ra = NULL;
327 
328 	if (is_sta_active(sta)) {
329 		ra = &sta->ra_info;
330 	} else {
331 		PHYDM_DBG(dm, DBG_RA_MASK, "[Warning] %s invalid sta_info\n",
332 			  __func__);
333 		return;
334 	}
335 
336 	PHYDM_DBG(dm, DBG_RA_MASK, "%s ======>\n", __func__);
337 	PHYDM_DBG(dm, DBG_RA_MASK, "MACID=%d\n", sta->mac_id);
338 
339 	/*@[Calculate TX/RX state]*/
340 	if (sta->tx_moving_average_tp > (sta->rx_moving_average_tp << 1))
341 		ra->txrx_state = TX_STATE;
342 	else if (sta->rx_moving_average_tp > (sta->tx_moving_average_tp << 1))
343 		ra->txrx_state = RX_STATE;
344 	else
345 		ra->txrx_state = BI_DIRECTION_STATE;
346 
347 	ra->is_noisy = dm->noisy_decision;
348 }
349 
phydm_common_info_self_update(struct dm_struct * dm)350 void phydm_common_info_self_update(struct dm_struct *dm)
351 {
352 	u8 sta_cnt = 0, num_active_client = 0;
353 	u32 i, one_entry_macid = 0;
354 	u32 ma_rx_tp = 0;
355 	u32 tp_diff = 0;
356 	struct cmn_sta_info *sta;
357 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
358 	PADAPTER adapter = (PADAPTER)dm->adapter;
359 	PMGNT_INFO mgnt_info = &((PADAPTER)adapter)->MgntInfo;
360 
361 	sta = dm->phydm_sta_info[0];
362 	if (mgnt_info->mAssoc) {
363 		sta->dm_ctrl |= STA_DM_CTRL_ACTIVE;
364 		for (i = 0; i < 6; i++)
365 			sta->mac_addr[i] = mgnt_info->Bssid[i];
366 	} else if (GetFirstClientPort(adapter)) {
367 		struct _ADAPTER *client_adapter = GetFirstClientPort(adapter);
368 
369 		sta->dm_ctrl |= STA_DM_CTRL_ACTIVE;
370 		for (i = 0; i < 6; i++)
371 			sta->mac_addr[i] = client_adapter->MgntInfo.Bssid[i];
372 	} else {
373 		sta->dm_ctrl = sta->dm_ctrl & (~STA_DM_CTRL_ACTIVE);
374 		for (i = 0; i < 6; i++)
375 			sta->mac_addr[i] = 0;
376 	}
377 
378 	/* STA mode is linked to AP */
379 	if (is_sta_active(sta) && !ACTING_AS_AP(adapter))
380 		dm->bsta_state = true;
381 	else
382 		dm->bsta_state = false;
383 #endif
384 
385 	for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) {
386 		sta = dm->phydm_sta_info[i];
387 		if (is_sta_active(sta)) {
388 			sta_cnt++;
389 
390 			if (sta_cnt == 1)
391 				one_entry_macid = i;
392 
393 			phydm_cmn_sta_info_update(dm, (u8)i);
394 			#ifdef PHYDM_BEAMFORMING_SUPPORT
395 			/*@phydm_get_txbf_device_num(dm, (u8)i);*/
396 			#endif
397 
398 			ma_rx_tp = sta->rx_moving_average_tp +
399 				   sta->tx_moving_average_tp;
400 
401 			PHYDM_DBG(dm, DBG_COMMON_FLOW,
402 				  "TP[%d]: ((%d )) bit/sec\n", i, ma_rx_tp);
403 
404 			if (ma_rx_tp > ACTIVE_TP_THRESHOLD)
405 				num_active_client++;
406 		}
407 	}
408 
409 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
410 	dm->is_linked = (sta_cnt != 0) ? true : false;
411 #endif
412 
413 	if (sta_cnt == 1) {
414 		dm->is_one_entry_only = true;
415 		dm->one_entry_macid = one_entry_macid;
416 		dm->one_entry_tp = ma_rx_tp;
417 
418 		dm->tp_active_occur = 0;
419 
420 		PHYDM_DBG(dm, DBG_COMMON_FLOW,
421 			  "one_entry_tp=((%d)), pre_one_entry_tp=((%d))\n",
422 			  dm->one_entry_tp, dm->pre_one_entry_tp);
423 
424 		if (dm->one_entry_tp > dm->pre_one_entry_tp &&
425 		    dm->pre_one_entry_tp <= 2) {
426 			tp_diff = dm->one_entry_tp - dm->pre_one_entry_tp;
427 
428 			if (tp_diff > dm->tp_active_th)
429 				dm->tp_active_occur = 1;
430 		}
431 		dm->pre_one_entry_tp = dm->one_entry_tp;
432 	} else {
433 		dm->is_one_entry_only = false;
434 	}
435 
436 	dm->pre_number_linked_client = dm->number_linked_client;
437 	dm->pre_number_active_client = dm->number_active_client;
438 
439 	dm->number_linked_client = sta_cnt;
440 	dm->number_active_client = num_active_client;
441 
442 	/*Traffic load information update*/
443 	phydm_traffic_load_decision(dm);
444 
445 	dm->phydm_sys_up_time += PHYDM_WATCH_DOG_PERIOD;
446 
447 	dm->is_dfs_band = phydm_is_dfs_band(dm);
448 	dm->phy_dbg_info.show_phy_sts_cnt = 0;
449 
450 	/*[Link Status Check]*/
451 	dm->first_connect = dm->is_linked && !dm->pre_is_linked;
452 	dm->first_disconnect = !dm->is_linked && dm->pre_is_linked;
453 	dm->pre_is_linked = dm->is_linked;
454 }
455 
phydm_common_info_self_reset(struct dm_struct * dm)456 void phydm_common_info_self_reset(struct dm_struct *dm)
457 {
458 	struct odm_phy_dbg_info		*dbg_t = &dm->phy_dbg_info;
459 
460 	dbg_t->beacon_cnt_in_period = dbg_t->num_qry_beacon_pkt;
461 	dbg_t->num_qry_beacon_pkt = 0;
462 
463 	dm->rxsc_l = 0xff;
464 	dm->rxsc_20 = 0xff;
465 	dm->rxsc_40 = 0xff;
466 	dm->rxsc_80 = 0xff;
467 }
468 
469 void *
phydm_get_structure(struct dm_struct * dm,u8 structure_type)470 phydm_get_structure(struct dm_struct *dm, u8 structure_type)
471 
472 {
473 	void *structure = NULL;
474 
475 	switch (structure_type) {
476 	case PHYDM_FALSEALMCNT:
477 		structure = &dm->false_alm_cnt;
478 		break;
479 
480 	case PHYDM_CFOTRACK:
481 		structure = &dm->dm_cfo_track;
482 		break;
483 
484 	case PHYDM_ADAPTIVITY:
485 		structure = &dm->adaptivity;
486 		break;
487 
488 	case PHYDM_DFS:
489 		structure = &dm->dfs;
490 		break;
491 
492 	default:
493 		break;
494 	}
495 
496 	return structure;
497 }
498 
phydm_phy_info_update(struct dm_struct * dm)499 void phydm_phy_info_update(struct dm_struct *dm)
500 {
501 #if (RTL8822B_SUPPORT == 1)
502 	if (dm->support_ic_type == ODM_RTL8822B)
503 		dm->phy_dbg_info.condi_num = phydm_get_condi_num_8822b(dm);
504 #endif
505 }
506 
phydm_hw_setting(struct dm_struct * dm)507 void phydm_hw_setting(struct dm_struct *dm)
508 {
509 #if (RTL8821A_SUPPORT == 1)
510 	if (dm->support_ic_type & ODM_RTL8821)
511 		odm_hw_setting_8821a(dm);
512 #endif
513 
514 #if (RTL8814A_SUPPORT == 1)
515 	if (dm->support_ic_type & ODM_RTL8814A)
516 		phydm_hwsetting_8814a(dm);
517 #endif
518 
519 #if (RTL8822B_SUPPORT == 1)
520 	if (dm->support_ic_type & ODM_RTL8822B)
521 		phydm_hwsetting_8822b(dm);
522 #endif
523 
524 #if (RTL8812A_SUPPORT == 1)
525 	if (dm->support_ic_type & ODM_RTL8812)
526 		phydm_hwsetting_8812a(dm);
527 #endif
528 
529 #if (RTL8197F_SUPPORT == 1)
530 	if (dm->support_ic_type & ODM_RTL8197F)
531 		phydm_hwsetting_8197f(dm);
532 #endif
533 
534 #if (RTL8192F_SUPPORT == 1)
535 	if (dm->support_ic_type & ODM_RTL8192F)
536 		phydm_hwsetting_8192f(dm);
537 #endif
538 }
539 
540 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))
phydm_supportability_init_win(void * dm_void)541 u64 phydm_supportability_init_win(
542 	void *dm_void)
543 {
544 	struct dm_struct *dm = (struct dm_struct *)dm_void;
545 	u64 support_ability = 0;
546 
547 	switch (dm->support_ic_type) {
548 /*@---------------N Series--------------------*/
549 #if (RTL8188E_SUPPORT)
550 	case ODM_RTL8188E:
551 		support_ability |=
552 			ODM_BB_DIG |
553 			ODM_BB_RA_MASK |
554 			/*ODM_BB_DYNAMIC_TXPWR	|*/
555 			ODM_BB_FA_CNT |
556 			ODM_BB_RSSI_MONITOR |
557 			ODM_BB_CCK_PD |
558 			/*ODM_BB_PWR_TRAIN		|*/
559 			ODM_BB_RATE_ADAPTIVE |
560 			ODM_BB_CFO_TRACKING |
561 			ODM_BB_ENV_MONITOR |
562 			ODM_BB_PRIMARY_CCA;
563 		break;
564 #endif
565 
566 #if (RTL8192E_SUPPORT)
567 	case ODM_RTL8192E:
568 		support_ability |=
569 			ODM_BB_DIG |
570 			ODM_BB_RA_MASK |
571 			/*ODM_BB_DYNAMIC_TXPWR	|*/
572 			ODM_BB_FA_CNT |
573 			ODM_BB_RSSI_MONITOR |
574 			ODM_BB_CCK_PD |
575 			/*ODM_BB_PWR_TRAIN		|*/
576 			ODM_BB_RATE_ADAPTIVE |
577 			ODM_BB_CFO_TRACKING |
578 			ODM_BB_ENV_MONITOR |
579 			ODM_BB_PRIMARY_CCA;
580 		break;
581 #endif
582 
583 #if (RTL8723B_SUPPORT)
584 	case ODM_RTL8723B:
585 		support_ability |=
586 			ODM_BB_DIG |
587 			ODM_BB_RA_MASK |
588 			/*ODM_BB_DYNAMIC_TXPWR	|*/
589 			ODM_BB_FA_CNT |
590 			ODM_BB_RSSI_MONITOR |
591 			ODM_BB_CCK_PD |
592 			/*ODM_BB_PWR_TRAIN		|*/
593 			ODM_BB_RATE_ADAPTIVE |
594 			ODM_BB_CFO_TRACKING |
595 			ODM_BB_ENV_MONITOR |
596 			ODM_BB_PRIMARY_CCA;
597 		break;
598 #endif
599 
600 #if (RTL8703B_SUPPORT)
601 	case ODM_RTL8703B:
602 		support_ability |=
603 			ODM_BB_DIG |
604 			ODM_BB_RA_MASK |
605 			/*ODM_BB_DYNAMIC_TXPWR	|*/
606 			ODM_BB_FA_CNT |
607 			ODM_BB_RSSI_MONITOR |
608 			ODM_BB_CCK_PD |
609 			/*ODM_BB_PWR_TRAIN		|*/
610 			ODM_BB_RATE_ADAPTIVE |
611 			ODM_BB_CFO_TRACKING |
612 			ODM_BB_ENV_MONITOR;
613 		break;
614 #endif
615 
616 #if (RTL8723D_SUPPORT)
617 	case ODM_RTL8723D:
618 		support_ability |=
619 			ODM_BB_DIG |
620 			ODM_BB_RA_MASK |
621 			/*ODM_BB_DYNAMIC_TXPWR	|*/
622 			ODM_BB_FA_CNT |
623 			ODM_BB_RSSI_MONITOR |
624 			ODM_BB_CCK_PD |
625 			ODM_BB_PWR_TRAIN	|
626 			ODM_BB_RATE_ADAPTIVE |
627 			ODM_BB_CFO_TRACKING |
628 			ODM_BB_ENV_MONITOR;
629 		break;
630 #endif
631 
632 #if (RTL8710B_SUPPORT)
633 	case ODM_RTL8710B:
634 		support_ability |=
635 			ODM_BB_DIG |
636 			ODM_BB_RA_MASK |
637 			/*ODM_BB_DYNAMIC_TXPWR	|*/
638 			ODM_BB_FA_CNT |
639 			ODM_BB_RSSI_MONITOR |
640 			ODM_BB_CCK_PD |
641 			ODM_BB_PWR_TRAIN	|
642 			ODM_BB_RATE_ADAPTIVE |
643 			ODM_BB_CFO_TRACKING |
644 			ODM_BB_ENV_MONITOR;
645 		break;
646 #endif
647 
648 #if (RTL8188F_SUPPORT)
649 	case ODM_RTL8188F:
650 		support_ability |=
651 			ODM_BB_DIG |
652 			ODM_BB_RA_MASK |
653 			/*ODM_BB_DYNAMIC_TXPWR	|*/
654 			ODM_BB_FA_CNT |
655 			ODM_BB_RSSI_MONITOR |
656 			ODM_BB_CCK_PD |
657 			/*ODM_BB_PWR_TRAIN	|*/
658 			ODM_BB_RATE_ADAPTIVE |
659 			ODM_BB_CFO_TRACKING |
660 			ODM_BB_ENV_MONITOR;
661 		break;
662 #endif
663 
664 #if (RTL8192F_SUPPORT)
665 	case ODM_RTL8192F:
666 		support_ability |=
667 			ODM_BB_DIG |
668 			ODM_BB_RA_MASK |
669 			ODM_BB_FA_CNT |
670 			ODM_BB_RSSI_MONITOR |
671 			ODM_BB_CCK_PD |
672 			ODM_BB_PWR_TRAIN	|
673 			ODM_BB_RATE_ADAPTIVE |
674 			ODM_BB_CFO_TRACKING |
675 			ODM_BB_ADAPTIVE_SOML |
676 			ODM_BB_ENV_MONITOR;
677 		/*ODM_BB_LNA_SAT_CHK		|*/
678 		/*ODM_BB_PRIMARY_CCA*/
679 
680 		break;
681 #endif
682 
683 /*@---------------AC Series-------------------*/
684 
685 #if (RTL8812A_SUPPORT || RTL8821A_SUPPORT)
686 	case ODM_RTL8812:
687 	case ODM_RTL8821:
688 		support_ability |=
689 			ODM_BB_DIG |
690 			ODM_BB_RA_MASK |
691 			ODM_BB_DYNAMIC_TXPWR |
692 			ODM_BB_FA_CNT |
693 			ODM_BB_RSSI_MONITOR |
694 			ODM_BB_CCK_PD |
695 			/*ODM_BB_PWR_TRAIN		|*/
696 			ODM_BB_RATE_ADAPTIVE |
697 			ODM_BB_CFO_TRACKING |
698 			ODM_BB_ENV_MONITOR;
699 		break;
700 #endif
701 
702 #if (RTL8814A_SUPPORT)
703 	case ODM_RTL8814A:
704 		support_ability |=
705 			ODM_BB_DIG |
706 			ODM_BB_RA_MASK |
707 			ODM_BB_DYNAMIC_TXPWR |
708 			ODM_BB_FA_CNT |
709 			ODM_BB_RSSI_MONITOR |
710 			ODM_BB_CCK_PD |
711 			/*ODM_BB_PWR_TRAIN		|*/
712 			ODM_BB_RATE_ADAPTIVE |
713 			ODM_BB_CFO_TRACKING |
714 			ODM_BB_ENV_MONITOR;
715 		break;
716 #endif
717 
718 #if (RTL8822B_SUPPORT)
719 	case ODM_RTL8822B:
720 		support_ability |=
721 			ODM_BB_DIG |
722 			ODM_BB_RA_MASK |
723 			/*ODM_BB_DYNAMIC_TXPWR	|*/
724 			ODM_BB_FA_CNT |
725 			ODM_BB_RSSI_MONITOR |
726 			ODM_BB_CCK_PD |
727 			/*ODM_BB_PWR_TRAIN		|*/
728 			/*ODM_BB_ADAPTIVE_SOML |*/
729 			ODM_BB_RATE_ADAPTIVE |
730 			/*ODM_BB_PATH_DIV |*/
731 			ODM_BB_CFO_TRACKING |
732 			ODM_BB_ENV_MONITOR;
733 		break;
734 #endif
735 
736 #if (RTL8821C_SUPPORT)
737 	case ODM_RTL8821C:
738 		support_ability |=
739 			ODM_BB_DIG |
740 			ODM_BB_RA_MASK |
741 			/*ODM_BB_DYNAMIC_TXPWR	|*/
742 			ODM_BB_FA_CNT |
743 			ODM_BB_RSSI_MONITOR |
744 			ODM_BB_CCK_PD |
745 			/*ODM_BB_PWR_TRAIN		|*/
746 			ODM_BB_RATE_ADAPTIVE |
747 			ODM_BB_CFO_TRACKING |
748 			ODM_BB_ENV_MONITOR;
749 		break;
750 #endif
751 
752 /*@---------------JGR3 Series-------------------*/
753 
754 #if (RTL8822C_SUPPORT)
755 	case ODM_RTL8822C:
756 		support_ability |=
757 			ODM_BB_DIG |
758 			ODM_BB_RA_MASK |
759 			/* ODM_BB_DYNAMIC_TXPWR	|*/
760 			ODM_BB_FA_CNT |
761 			ODM_BB_RSSI_MONITOR |
762 			ODM_BB_CCK_PD |
763 			ODM_BB_RATE_ADAPTIVE |
764 			ODM_BB_PATH_DIV |
765 			ODM_BB_CFO_TRACKING |
766 			ODM_BB_ENV_MONITOR;
767 		break;
768 #endif
769 
770 #if (RTL8814B_SUPPORT)
771 	case ODM_RTL8814B:
772 		support_ability |=
773 			ODM_BB_DIG |
774 			ODM_BB_RA_MASK |
775 			/*ODM_BB_DYNAMIC_TXPWR	|*/
776 			ODM_BB_FA_CNT |
777 			ODM_BB_RSSI_MONITOR |
778 			/*ODM_BB_CCK_PD |*/
779 			/*ODM_BB_PWR_TRAIN		|*/
780 			ODM_BB_RATE_ADAPTIVE |
781 			ODM_BB_CFO_TRACKING;
782 			/*ODM_BB_ENV_MONITOR;*/
783 		break;
784 #endif
785 
786 	default:
787 		support_ability |=
788 			ODM_BB_DIG |
789 			ODM_BB_RA_MASK |
790 			/*ODM_BB_DYNAMIC_TXPWR	|*/
791 			ODM_BB_FA_CNT |
792 			ODM_BB_RSSI_MONITOR |
793 			ODM_BB_CCK_PD |
794 			/*ODM_BB_PWR_TRAIN		|*/
795 			ODM_BB_RATE_ADAPTIVE |
796 			ODM_BB_CFO_TRACKING |
797 			ODM_BB_ENV_MONITOR;
798 
799 		pr_debug("[Warning] Supportability Init Warning !!!\n");
800 		break;
801 	}
802 
803 	return support_ability;
804 }
805 #endif
806 
807 #if (DM_ODM_SUPPORT_TYPE & (ODM_CE))
phydm_supportability_init_ce(void * dm_void)808 u64 phydm_supportability_init_ce(void *dm_void)
809 {
810 	struct dm_struct *dm = (struct dm_struct *)dm_void;
811 	u64 support_ability = 0;
812 
813 	switch (dm->support_ic_type) {
814 /*@---------------N Series--------------------*/
815 #if (RTL8188E_SUPPORT)
816 	case ODM_RTL8188E:
817 		support_ability |=
818 			ODM_BB_DIG |
819 			ODM_BB_RA_MASK |
820 			/*@ODM_BB_DYNAMIC_TXPWR	|*/
821 			ODM_BB_FA_CNT |
822 			ODM_BB_RSSI_MONITOR |
823 			ODM_BB_CCK_PD |
824 			/*@ODM_BB_PWR_TRAIN		|*/
825 			ODM_BB_RATE_ADAPTIVE |
826 			ODM_BB_CFO_TRACKING |
827 			ODM_BB_ENV_MONITOR |
828 			ODM_BB_PRIMARY_CCA;
829 		break;
830 #endif
831 
832 #if (RTL8192E_SUPPORT)
833 	case ODM_RTL8192E:
834 		support_ability |=
835 			ODM_BB_DIG |
836 			ODM_BB_RA_MASK |
837 			/*@ODM_BB_DYNAMIC_TXPWR	|*/
838 			ODM_BB_FA_CNT |
839 			ODM_BB_RSSI_MONITOR |
840 			ODM_BB_CCK_PD |
841 			/*@ODM_BB_PWR_TRAIN		|*/
842 			ODM_BB_RATE_ADAPTIVE |
843 			ODM_BB_CFO_TRACKING |
844 			ODM_BB_ENV_MONITOR |
845 			ODM_BB_PRIMARY_CCA;
846 		break;
847 #endif
848 
849 #if (RTL8723B_SUPPORT)
850 	case ODM_RTL8723B:
851 		support_ability |=
852 			ODM_BB_DIG |
853 			ODM_BB_RA_MASK |
854 			/*@ODM_BB_DYNAMIC_TXPWR	|*/
855 			ODM_BB_FA_CNT |
856 			ODM_BB_RSSI_MONITOR |
857 			ODM_BB_CCK_PD |
858 			/*@ODM_BB_PWR_TRAIN		|*/
859 			ODM_BB_RATE_ADAPTIVE |
860 			ODM_BB_CFO_TRACKING |
861 			ODM_BB_ENV_MONITOR |
862 			ODM_BB_PRIMARY_CCA;
863 		break;
864 #endif
865 
866 #if (RTL8703B_SUPPORT)
867 	case ODM_RTL8703B:
868 		support_ability |=
869 			ODM_BB_DIG |
870 			ODM_BB_RA_MASK |
871 			/*@ODM_BB_DYNAMIC_TXPWR	|*/
872 			ODM_BB_FA_CNT |
873 			ODM_BB_RSSI_MONITOR |
874 			ODM_BB_CCK_PD |
875 			/*@ODM_BB_PWR_TRAIN		|*/
876 			ODM_BB_RATE_ADAPTIVE |
877 			ODM_BB_CFO_TRACKING |
878 			ODM_BB_ENV_MONITOR;
879 		break;
880 #endif
881 
882 #if (RTL8723D_SUPPORT)
883 	case ODM_RTL8723D:
884 		support_ability |=
885 			ODM_BB_DIG |
886 			ODM_BB_RA_MASK |
887 			/*@ODM_BB_DYNAMIC_TXPWR	|*/
888 			ODM_BB_FA_CNT |
889 			ODM_BB_RSSI_MONITOR |
890 			ODM_BB_CCK_PD |
891 			ODM_BB_PWR_TRAIN	|
892 			ODM_BB_RATE_ADAPTIVE |
893 			ODM_BB_CFO_TRACKING |
894 			ODM_BB_ENV_MONITOR;
895 		break;
896 #endif
897 
898 #if (RTL8710B_SUPPORT)
899 	case ODM_RTL8710B:
900 		support_ability |=
901 			ODM_BB_DIG |
902 			ODM_BB_RA_MASK |
903 			/*@ODM_BB_DYNAMIC_TXPWR	|*/
904 			ODM_BB_FA_CNT |
905 			ODM_BB_RSSI_MONITOR |
906 			ODM_BB_CCK_PD |
907 			/*@ODM_BB_PWR_TRAIN		|*/
908 			ODM_BB_RATE_ADAPTIVE |
909 			ODM_BB_CFO_TRACKING |
910 			ODM_BB_ENV_MONITOR;
911 		break;
912 #endif
913 
914 #if (RTL8188F_SUPPORT)
915 	case ODM_RTL8188F:
916 		support_ability |=
917 			ODM_BB_DIG |
918 			ODM_BB_RA_MASK |
919 			/*@ODM_BB_DYNAMIC_TXPWR	|*/
920 			ODM_BB_FA_CNT |
921 			ODM_BB_RSSI_MONITOR |
922 			ODM_BB_CCK_PD |
923 			/*@ODM_BB_PWR_TRAIN		|*/
924 			ODM_BB_RATE_ADAPTIVE |
925 			ODM_BB_CFO_TRACKING |
926 			ODM_BB_ENV_MONITOR;
927 		break;
928 #endif
929 
930 #if (RTL8192F_SUPPORT)
931 	case ODM_RTL8192F:
932 		support_ability |=
933 			ODM_BB_DIG |
934 			ODM_BB_RA_MASK |
935 			ODM_BB_FA_CNT |
936 			ODM_BB_RSSI_MONITOR |
937 			ODM_BB_CCK_PD |
938 			ODM_BB_PWR_TRAIN		|
939 			ODM_BB_RATE_ADAPTIVE |
940 			ODM_BB_CFO_TRACKING |
941 			/*@ODM_BB_ADAPTIVE_SOML |*/
942 			ODM_BB_ENV_MONITOR;
943 		/*@ODM_BB_LNA_SAT_CHK		|*/
944 		/*@ODM_BB_PRIMARY_CCA*/
945 		break;
946 #endif
947 /*@---------------AC Series-------------------*/
948 
949 #if (RTL8812A_SUPPORT || RTL8821A_SUPPORT)
950 	case ODM_RTL8812:
951 	case ODM_RTL8821:
952 		support_ability |=
953 			ODM_BB_DIG |
954 			ODM_BB_RA_MASK |
955 			/*@ODM_BB_DYNAMIC_TXPWR	|*/
956 			ODM_BB_FA_CNT |
957 			ODM_BB_RSSI_MONITOR |
958 			ODM_BB_CCK_PD |
959 			/*@ODM_BB_PWR_TRAIN		|*/
960 			ODM_BB_RATE_ADAPTIVE |
961 			ODM_BB_CFO_TRACKING |
962 			ODM_BB_ENV_MONITOR;
963 		break;
964 #endif
965 
966 #if (RTL8814A_SUPPORT)
967 	case ODM_RTL8814A:
968 		support_ability |=
969 			ODM_BB_DIG |
970 			ODM_BB_RA_MASK |
971 			/*@ODM_BB_DYNAMIC_TXPWR	|*/
972 			ODM_BB_FA_CNT |
973 			ODM_BB_RSSI_MONITOR |
974 			ODM_BB_CCK_PD |
975 			/*@ODM_BB_PWR_TRAIN		|*/
976 			ODM_BB_RATE_ADAPTIVE |
977 			ODM_BB_CFO_TRACKING |
978 			ODM_BB_ENV_MONITOR;
979 		break;
980 #endif
981 
982 #if (RTL8822B_SUPPORT)
983 	case ODM_RTL8822B:
984 		support_ability |=
985 			ODM_BB_DIG |
986 			ODM_BB_RA_MASK |
987 			/*@ODM_BB_DYNAMIC_TXPWR	|*/
988 			ODM_BB_FA_CNT |
989 			ODM_BB_RSSI_MONITOR |
990 			ODM_BB_CCK_PD |
991 			/*@ODM_BB_PWR_TRAIN		|*/
992 			ODM_BB_RATE_ADAPTIVE |
993 			/*ODM_BB_PATH_DIV |*/
994 			ODM_BB_CFO_TRACKING |
995 			ODM_BB_ENV_MONITOR;
996 		break;
997 #endif
998 
999 #if (RTL8821C_SUPPORT)
1000 	case ODM_RTL8821C:
1001 		support_ability |=
1002 			ODM_BB_DIG |
1003 			ODM_BB_RA_MASK |
1004 			/*@ODM_BB_DYNAMIC_TXPWR	|*/
1005 			ODM_BB_FA_CNT |
1006 			ODM_BB_RSSI_MONITOR |
1007 			ODM_BB_CCK_PD |
1008 			/*@ODM_BB_PWR_TRAIN		|*/
1009 			ODM_BB_RATE_ADAPTIVE |
1010 			ODM_BB_CFO_TRACKING |
1011 			ODM_BB_ENV_MONITOR;
1012 		break;
1013 #endif
1014 
1015 /*@---------------JGR3 Series-------------------*/
1016 
1017 #if (RTL8822C_SUPPORT)
1018 	case ODM_RTL8822C:
1019 		support_ability |=
1020 			ODM_BB_DIG |
1021 			ODM_BB_RA_MASK |
1022 			/* ODM_BB_DYNAMIC_TXPWR	|*/
1023 			ODM_BB_FA_CNT |
1024 			ODM_BB_RSSI_MONITOR |
1025 			ODM_BB_CCK_PD |
1026 			ODM_BB_RATE_ADAPTIVE |
1027 			ODM_BB_PATH_DIV |
1028 			ODM_BB_CFO_TRACKING |
1029 			ODM_BB_ENV_MONITOR;
1030 		break;
1031 #endif
1032 
1033 #if (RTL8814B_SUPPORT)
1034 	case ODM_RTL8814B:
1035 		support_ability |=
1036 			ODM_BB_DIG |
1037 			ODM_BB_RA_MASK |
1038 			/*@ODM_BB_DYNAMIC_TXPWR	|*/
1039 			ODM_BB_FA_CNT |
1040 			ODM_BB_RSSI_MONITOR;
1041 			/*ODM_BB_CCK_PD |*/
1042 			/*@ODM_BB_PWR_TRAIN		|*/
1043 			/*ODM_BB_RATE_ADAPTIVE |*/
1044 			/*ODM_BB_CFO_TRACKING |*/
1045 			/*ODM_BB_ENV_MONITOR;*/
1046 		break;
1047 #endif
1048 
1049 	default:
1050 		support_ability |=
1051 			ODM_BB_DIG |
1052 			ODM_BB_RA_MASK |
1053 			/*@ODM_BB_DYNAMIC_TXPWR	|*/
1054 			ODM_BB_FA_CNT |
1055 			ODM_BB_RSSI_MONITOR |
1056 			ODM_BB_CCK_PD |
1057 			/*@ODM_BB_PWR_TRAIN		|*/
1058 			ODM_BB_RATE_ADAPTIVE |
1059 			ODM_BB_CFO_TRACKING |
1060 			ODM_BB_ENV_MONITOR;
1061 
1062 		pr_debug("[Warning] Supportability Init Warning !!!\n");
1063 		break;
1064 	}
1065 
1066 	return support_ability;
1067 }
1068 #endif
1069 
1070 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
phydm_supportability_init_ap(void * dm_void)1071 u64 phydm_supportability_init_ap(
1072 	void *dm_void)
1073 {
1074 	struct dm_struct *dm = (struct dm_struct *)dm_void;
1075 	u64 support_ability = 0;
1076 
1077 	switch (dm->support_ic_type) {
1078 /*@---------------N Series--------------------*/
1079 #if (RTL8188E_SUPPORT)
1080 	case ODM_RTL8188E:
1081 		support_ability |=
1082 			ODM_BB_DIG |
1083 			ODM_BB_RA_MASK |
1084 			ODM_BB_FA_CNT |
1085 			ODM_BB_RSSI_MONITOR |
1086 			ODM_BB_CCK_PD |
1087 			/*ODM_BB_PWR_TRAIN		|*/
1088 			ODM_BB_RATE_ADAPTIVE |
1089 			ODM_BB_CFO_TRACKING |
1090 			ODM_BB_ENV_MONITOR |
1091 			ODM_BB_PRIMARY_CCA;
1092 		break;
1093 #endif
1094 
1095 #if (RTL8192E_SUPPORT)
1096 	case ODM_RTL8192E:
1097 		support_ability |=
1098 			ODM_BB_DIG |
1099 			ODM_BB_RA_MASK |
1100 			ODM_BB_FA_CNT |
1101 			ODM_BB_RSSI_MONITOR |
1102 			ODM_BB_CCK_PD |
1103 			/*ODM_BB_PWR_TRAIN		|*/
1104 			ODM_BB_RATE_ADAPTIVE |
1105 			ODM_BB_CFO_TRACKING |
1106 			ODM_BB_ENV_MONITOR |
1107 			ODM_BB_PRIMARY_CCA;
1108 		break;
1109 #endif
1110 
1111 #if (RTL8723B_SUPPORT)
1112 	case ODM_RTL8723B:
1113 		support_ability |=
1114 			ODM_BB_DIG |
1115 			ODM_BB_RA_MASK |
1116 			ODM_BB_FA_CNT |
1117 			ODM_BB_RSSI_MONITOR |
1118 			ODM_BB_CCK_PD |
1119 			/*ODM_BB_PWR_TRAIN		|*/
1120 			ODM_BB_RATE_ADAPTIVE |
1121 			ODM_BB_CFO_TRACKING |
1122 			ODM_BB_ENV_MONITOR;
1123 		break;
1124 #endif
1125 
1126 #if (RTL8198F_SUPPORT || RTL8197F_SUPPORT)
1127 	case ODM_RTL8198F:
1128 		support_ability |=
1129 			/*ODM_BB_DIG				|*/
1130 			ODM_BB_RA_MASK |
1131 			ODM_BB_FA_CNT |
1132 			ODM_BB_RSSI_MONITOR;
1133 		/*ODM_BB_CCK_PD			|*/
1134 		/*ODM_BB_PWR_TRAIN		|*/
1135 		/*ODM_BB_RATE_ADAPTIVE	|*/
1136 		/*ODM_BB_CFO_TRACKING		|*/
1137 		/*ODM_BB_ADAPTIVE_SOML	|*/
1138 		/*ODM_BB_ENV_MONITOR		|*/
1139 		/*ODM_BB_LNA_SAT_CHK		|*/
1140 		/*ODM_BB_PRIMARY_CCA;*/
1141 		break;
1142 	case ODM_RTL8197F:
1143 		support_ability |=
1144 			ODM_BB_DIG |
1145 			ODM_BB_RA_MASK |
1146 			ODM_BB_FA_CNT |
1147 			ODM_BB_RSSI_MONITOR |
1148 			ODM_BB_CCK_PD |
1149 			/*ODM_BB_PWR_TRAIN		|*/
1150 			ODM_BB_RATE_ADAPTIVE |
1151 			ODM_BB_CFO_TRACKING |
1152 			ODM_BB_ADAPTIVE_SOML |
1153 			ODM_BB_ENV_MONITOR |
1154 			ODM_BB_LNA_SAT_CHK |
1155 			ODM_BB_PRIMARY_CCA;
1156 		break;
1157 #endif
1158 
1159 #if (RTL8192F_SUPPORT)
1160 	case ODM_RTL8192F:
1161 		support_ability |=
1162 			ODM_BB_DIG |
1163 			ODM_BB_RA_MASK |
1164 			ODM_BB_FA_CNT |
1165 			ODM_BB_RSSI_MONITOR |
1166 			ODM_BB_CCK_PD |
1167 			/*ODM_BB_PWR_TRAIN		|*/
1168 			ODM_BB_RATE_ADAPTIVE |
1169 			/*ODM_BB_CFO_TRACKING		|*/
1170 			ODM_BB_ADAPTIVE_SOML |
1171 			ODM_BB_ENV_MONITOR		|
1172 			/*ODM_BB_LNA_SAT_CHK		|*/
1173 			/*ODM_BB_PRIMARY_CCA		|*/
1174 			0;
1175 		break;
1176 #endif
1177 
1178 /*@---------------AC Series-------------------*/
1179 
1180 #if (RTL8881A_SUPPORT)
1181 	case ODM_RTL8881A:
1182 		support_ability |=
1183 			ODM_BB_DIG |
1184 			ODM_BB_RA_MASK |
1185 			ODM_BB_FA_CNT |
1186 			ODM_BB_RSSI_MONITOR |
1187 			ODM_BB_CCK_PD |
1188 			/*ODM_BB_PWR_TRAIN		|*/
1189 			ODM_BB_RATE_ADAPTIVE |
1190 			ODM_BB_CFO_TRACKING |
1191 			ODM_BB_ENV_MONITOR;
1192 		break;
1193 #endif
1194 
1195 #if (RTL8814A_SUPPORT)
1196 	case ODM_RTL8814A:
1197 		support_ability |=
1198 			ODM_BB_DIG |
1199 			ODM_BB_RA_MASK |
1200 			ODM_BB_FA_CNT |
1201 			ODM_BB_RSSI_MONITOR |
1202 			ODM_BB_CCK_PD |
1203 			/*ODM_BB_PWR_TRAIN		|*/
1204 			ODM_BB_RATE_ADAPTIVE |
1205 			ODM_BB_CFO_TRACKING |
1206 			ODM_BB_ENV_MONITOR;
1207 		break;
1208 #endif
1209 
1210 #if (RTL8822B_SUPPORT)
1211 	case ODM_RTL8822B:
1212 		support_ability |=
1213 			ODM_BB_DIG |
1214 			ODM_BB_RA_MASK |
1215 			ODM_BB_FA_CNT |
1216 			ODM_BB_RSSI_MONITOR |
1217 			ODM_BB_CCK_PD |
1218 			/*ODM_BB_PWR_TRAIN		|*/
1219 			/*ODM_BB_ADAPTIVE_SOML	|*/
1220 			ODM_BB_RATE_ADAPTIVE |
1221 			ODM_BB_CFO_TRACKING |
1222 			ODM_BB_ENV_MONITOR;
1223 		break;
1224 #endif
1225 
1226 #if (RTL8821C_SUPPORT)
1227 	case ODM_RTL8821C:
1228 		support_ability |=
1229 			ODM_BB_DIG |
1230 			ODM_BB_RA_MASK |
1231 			ODM_BB_FA_CNT |
1232 			ODM_BB_RSSI_MONITOR |
1233 			ODM_BB_CCK_PD |
1234 			/*ODM_BB_PWR_TRAIN		|*/
1235 			ODM_BB_RATE_ADAPTIVE |
1236 			ODM_BB_CFO_TRACKING |
1237 			ODM_BB_ENV_MONITOR;
1238 
1239 		break;
1240 #endif
1241 
1242 /*@---------------JGR3 Series-------------------*/
1243 
1244 #if (RTL8814B_SUPPORT)
1245 	case ODM_RTL8814B:
1246 		support_ability |=
1247 			ODM_BB_DIG |
1248 			ODM_BB_RA_MASK |
1249 			ODM_BB_FA_CNT |
1250 			ODM_BB_RSSI_MONITOR;
1251 			/*ODM_BB_CCK_PD |*/
1252 			/*ODM_BB_PWR_TRAIN		|*/
1253 			/*ODM_BB_RATE_ADAPTIVE |*/
1254 			/*ODM_BB_CFO_TRACKING |*/
1255 			/*ODM_BB_ENV_MONITOR;*/
1256 		break;
1257 #endif
1258 
1259 	default:
1260 		support_ability |=
1261 			ODM_BB_DIG |
1262 			ODM_BB_RA_MASK |
1263 			ODM_BB_FA_CNT |
1264 			ODM_BB_RSSI_MONITOR |
1265 			ODM_BB_CCK_PD |
1266 			/*ODM_BB_PWR_TRAIN		|*/
1267 			ODM_BB_RATE_ADAPTIVE |
1268 			ODM_BB_CFO_TRACKING |
1269 			ODM_BB_ENV_MONITOR;
1270 
1271 		pr_debug("[Warning] Supportability Init Warning !!!\n");
1272 		break;
1273 	}
1274 
1275 #if 0
1276 	/*@[Config Antenna Diveristy]*/
1277 	if (*dm->enable_antdiv)
1278 		support_ability |= ODM_BB_ANT_DIV;
1279 
1280 	/*@[Config Adaptivity]*/
1281 	if (*dm->enable_adaptivity)
1282 		support_ability |= ODM_BB_ADAPTIVITY;
1283 #endif
1284 
1285 	return support_ability;
1286 }
1287 #endif
1288 
1289 #if (DM_ODM_SUPPORT_TYPE & (ODM_IOT))
phydm_supportability_init_iot(void * dm_void)1290 u64 phydm_supportability_init_iot(
1291 	void *dm_void)
1292 {
1293 	struct dm_struct *dm = (struct dm_struct *)dm_void;
1294 	u64 support_ability = 0;
1295 
1296 	switch (dm->support_ic_type) {
1297 #if (RTL8710B_SUPPORT)
1298 	case ODM_RTL8710B:
1299 		support_ability |=
1300 			ODM_BB_DIG |
1301 			ODM_BB_RA_MASK |
1302 			/*ODM_BB_DYNAMIC_TXPWR	|*/
1303 			ODM_BB_FA_CNT |
1304 			ODM_BB_RSSI_MONITOR |
1305 			ODM_BB_CCK_PD |
1306 			/*ODM_BB_PWR_TRAIN		|*/
1307 			ODM_BB_RATE_ADAPTIVE |
1308 			ODM_BB_CFO_TRACKING |
1309 			ODM_BB_ENV_MONITOR;
1310 		break;
1311 #endif
1312 
1313 #if (RTL8195A_SUPPORT)
1314 	case ODM_RTL8195A:
1315 		support_ability |=
1316 			ODM_BB_DIG |
1317 			ODM_BB_RA_MASK |
1318 			/*ODM_BB_DYNAMIC_TXPWR	|*/
1319 			ODM_BB_FA_CNT |
1320 			ODM_BB_RSSI_MONITOR |
1321 			ODM_BB_CCK_PD |
1322 			/*ODM_BB_PWR_TRAIN		|*/
1323 			ODM_BB_RATE_ADAPTIVE |
1324 			ODM_BB_CFO_TRACKING |
1325 			ODM_BB_ENV_MONITOR;
1326 		break;
1327 #endif
1328 
1329 #if (RTL8195B_SUPPORT)
1330 	case ODM_RTL8195B:
1331 		support_ability |=
1332 			ODM_BB_DIG |
1333 			ODM_BB_RA_MASK |
1334 			/*ODM_BB_DYNAMIC_TXPWR	|*/
1335 			ODM_BB_FA_CNT |
1336 			ODM_BB_RSSI_MONITOR |
1337 			ODM_BB_CCK_PD |
1338 			/*ODM_BB_PWR_TRAIN		|*/
1339 			ODM_BB_RATE_ADAPTIVE |
1340 			ODM_BB_CFO_TRACKING;
1341 			/*ODM_BB_ENV_MONITOR*/
1342 		break;
1343 #endif
1344 
1345 #if (RTL8721D_SUPPORT)
1346 	case ODM_RTL8721D:
1347 		support_ability |=
1348 			ODM_BB_DIG |
1349 			ODM_BB_RA_MASK |
1350 			/*ODM_BB_DYNAMIC_TXPWR	|*/
1351 			ODM_BB_FA_CNT |
1352 			ODM_BB_RSSI_MONITOR |
1353 			ODM_BB_CCK_PD |
1354 			/*ODM_BB_PWR_TRAIN		|*/
1355 			ODM_BB_RATE_ADAPTIVE |
1356 			ODM_BB_CFO_TRACKING |
1357 			ODM_BB_ENV_MONITOR;
1358 		break;
1359 #endif
1360 
1361 	default:
1362 		support_ability |=
1363 			ODM_BB_DIG |
1364 			ODM_BB_RA_MASK |
1365 			/*ODM_BB_DYNAMIC_TXPWR	|*/
1366 			ODM_BB_FA_CNT |
1367 			ODM_BB_RSSI_MONITOR |
1368 			ODM_BB_CCK_PD |
1369 			/*ODM_BB_PWR_TRAIN		|*/
1370 			ODM_BB_RATE_ADAPTIVE |
1371 			ODM_BB_CFO_TRACKING |
1372 			ODM_BB_ENV_MONITOR;
1373 
1374 		pr_debug("[Warning] Supportability Init Warning !!!\n");
1375 		break;
1376 	}
1377 
1378 	return support_ability;
1379 }
1380 #endif
1381 
phydm_fwoffload_ability_init(struct dm_struct * dm,enum phydm_offload_ability offload_ability)1382 void phydm_fwoffload_ability_init(struct dm_struct *dm,
1383 				  enum phydm_offload_ability offload_ability)
1384 {
1385 	switch (offload_ability) {
1386 	case PHYDM_PHY_PARAM_OFFLOAD:
1387 		if (dm->support_ic_type &
1388 		    (ODM_RTL8814A | ODM_RTL8822B | ODM_RTL8821C))
1389 			dm->fw_offload_ability |= PHYDM_PHY_PARAM_OFFLOAD;
1390 		break;
1391 
1392 	case PHYDM_RF_IQK_OFFLOAD:
1393 		dm->fw_offload_ability |= PHYDM_RF_IQK_OFFLOAD;
1394 		break;
1395 
1396 	default:
1397 		PHYDM_DBG(dm, ODM_COMP_INIT, "fwofflad, wrong init type!!\n");
1398 		break;
1399 	}
1400 
1401 	PHYDM_DBG(dm, ODM_COMP_INIT, "fw_offload_ability = %x\n",
1402 		  dm->fw_offload_ability);
1403 }
1404 
phydm_fwoffload_ability_clear(struct dm_struct * dm,enum phydm_offload_ability offload_ability)1405 void phydm_fwoffload_ability_clear(struct dm_struct *dm,
1406 				   enum phydm_offload_ability offload_ability)
1407 {
1408 	switch (offload_ability) {
1409 	case PHYDM_PHY_PARAM_OFFLOAD:
1410 		if (dm->support_ic_type &
1411 		    (ODM_RTL8814A | ODM_RTL8822B | ODM_RTL8821C))
1412 			dm->fw_offload_ability &= (~PHYDM_PHY_PARAM_OFFLOAD);
1413 		break;
1414 
1415 	case PHYDM_RF_IQK_OFFLOAD:
1416 		dm->fw_offload_ability &= (~PHYDM_RF_IQK_OFFLOAD);
1417 		break;
1418 
1419 	default:
1420 		PHYDM_DBG(dm, ODM_COMP_INIT, "fwofflad, wrong init type!!\n");
1421 		break;
1422 	}
1423 
1424 	PHYDM_DBG(dm, ODM_COMP_INIT, "fw_offload_ability = %x\n",
1425 		  dm->fw_offload_ability);
1426 }
1427 
phydm_supportability_init(void * dm_void)1428 void phydm_supportability_init(void *dm_void)
1429 {
1430 	struct dm_struct *dm = (struct dm_struct *)dm_void;
1431 	u64 support_ability;
1432 
1433 	if (dm->manual_supportability &&
1434 	    *dm->manual_supportability != 0xffffffff) {
1435 		support_ability = *dm->manual_supportability;
1436 	} else if (*dm->mp_mode) {
1437 		support_ability = 0;
1438 	} else {
1439 		#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))
1440 		support_ability = phydm_supportability_init_win(dm);
1441 		#elif (DM_ODM_SUPPORT_TYPE & (ODM_AP))
1442 		support_ability = phydm_supportability_init_ap(dm);
1443 		#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE))
1444 		support_ability = phydm_supportability_init_ce(dm);
1445 		#elif(DM_ODM_SUPPORT_TYPE & (ODM_IOT))
1446 		support_ability = phydm_supportability_init_iot(dm);
1447 		#endif
1448 
1449 		/*@[Config Antenna Diversity]*/
1450 		if (IS_FUNC_EN(dm->enable_antdiv))
1451 			support_ability |= ODM_BB_ANT_DIV;
1452 
1453 		/*@[Config TXpath Diversity]*/
1454 		if (IS_FUNC_EN(dm->enable_pathdiv))
1455 			support_ability |= ODM_BB_PATH_DIV;
1456 
1457 		/*@[Config Adaptive SOML]*/
1458 		if (IS_FUNC_EN(dm->en_adap_soml))
1459 			support_ability |= ODM_BB_ADAPTIVE_SOML;
1460 
1461 		/* @[Config Adaptivity]*/
1462 		if (IS_FUNC_EN(dm->enable_adaptivity))
1463 			support_ability |= ODM_BB_ADAPTIVITY;
1464 	}
1465 	dm->support_ability = support_ability;
1466 	PHYDM_DBG(dm, ODM_COMP_INIT, "IC=0x%x, mp=%d, Supportability=0x%llx\n",
1467 		  dm->support_ic_type, *dm->mp_mode, dm->support_ability);
1468 }
1469 
phydm_rfe_init(void * dm_void)1470 void phydm_rfe_init(void *dm_void)
1471 {
1472 	struct dm_struct *dm = (struct dm_struct *)dm_void;
1473 
1474 	PHYDM_DBG(dm, ODM_COMP_INIT, "RFE_Init\n");
1475 #if (RTL8822B_SUPPORT == 1)
1476 	if (dm->support_ic_type == ODM_RTL8822B)
1477 		phydm_rfe_8822b_init(dm);
1478 #endif
1479 }
1480 
phydm_dm_early_init(struct dm_struct * dm)1481 void phydm_dm_early_init(struct dm_struct *dm)
1482 {
1483 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
1484 	phydm_init_debug_setting(dm);
1485 #endif
1486 }
1487 
odm_dm_init(struct dm_struct * dm)1488 void odm_dm_init(struct dm_struct *dm)
1489 {
1490 	halrf_init(dm);
1491 	phydm_supportability_init(dm);
1492 	phydm_rfe_init(dm);
1493 	phydm_common_info_self_init(dm);
1494 	phydm_rx_phy_status_init(dm);
1495 #ifdef PHYDM_AUTO_DEGBUG
1496 	phydm_auto_dbg_engine_init(dm);
1497 #endif
1498 	phydm_dig_init(dm);
1499 #ifdef PHYDM_SUPPORT_CCKPD
1500 	phydm_cck_pd_init(dm);
1501 #endif
1502 	phydm_env_monitor_init(dm);
1503 	phydm_adaptivity_init(dm);
1504 	phydm_ra_info_init(dm);
1505 	phydm_rssi_monitor_init(dm);
1506 	phydm_cfo_tracking_init(dm);
1507 	phydm_rf_init(dm);
1508 	phydm_dc_cancellation(dm);
1509 #ifdef PHYDM_TXA_CALIBRATION
1510 	phydm_txcurrentcalibration(dm);
1511 	phydm_get_pa_bias_offset(dm);
1512 #endif
1513 #ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY
1514 	odm_antenna_diversity_init(dm);
1515 #endif
1516 #ifdef CONFIG_ADAPTIVE_SOML
1517 	phydm_adaptive_soml_init(dm);
1518 #endif
1519 #ifdef CONFIG_PATH_DIVERSITY
1520 	phydm_tx_path_diversity_init(dm);
1521 #endif
1522 #ifdef CONFIG_DYNAMIC_TX_TWR
1523 	phydm_dynamic_tx_power_init(dm);
1524 #endif
1525 #if (PHYDM_LA_MODE_SUPPORT == 1)
1526 	phydm_la_init(dm);
1527 #endif
1528 
1529 #ifdef PHYDM_BEAMFORMING_VERSION1
1530 	phydm_beamforming_init(dm);
1531 #endif
1532 
1533 #if (RTL8188E_SUPPORT == 1)
1534 	odm_ra_info_init_all(dm);
1535 #endif
1536 #ifdef PHYDM_PRIMARY_CCA
1537 	phydm_primary_cca_init(dm);
1538 #endif
1539 #ifdef CONFIG_PSD_TOOL
1540 	phydm_psd_init(dm);
1541 #endif
1542 
1543 #ifdef CONFIG_SMART_ANTENNA
1544 	phydm_smt_ant_init(dm);
1545 #endif
1546 #ifdef PHYDM_LNA_SAT_CHK_SUPPORT
1547 	phydm_lna_sat_check_init(dm);
1548 #endif
1549 #ifdef CONFIG_MCC_DM
1550 	phydm_mcc_init(dm);
1551 #endif
1552 
1553 #ifdef CONFIG_MU_RSOML
1554 	phydm_mu_rsoml_init(dm);
1555 #endif
1556 }
1557 
odm_dm_reset(struct dm_struct * dm)1558 void odm_dm_reset(struct dm_struct *dm)
1559 {
1560 	struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
1561 
1562 	#ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY
1563 	odm_ant_div_reset(dm);
1564 	#endif
1565 	phydm_set_edcca_threshold_api(dm, dig_t->cur_ig_value);
1566 }
1567 
phydm_supportability_en(void * dm_void,char input[][16],u32 * _used,char * output,u32 * _out_len)1568 void phydm_supportability_en(void *dm_void, char input[][16], u32 *_used,
1569 			     char *output, u32 *_out_len)
1570 {
1571 	struct dm_struct *dm = (struct dm_struct *)dm_void;
1572 	u32 dm_value[10] = {0};
1573 	u64 pre_support_ability, one = 1;
1574 	u64 comp = 0;
1575 	u32 used = *_used;
1576 	u32 out_len = *_out_len;
1577 	u8 i;
1578 
1579 	for (i = 0; i < 5; i++) {
1580 		if (input[i + 1])
1581 			PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &dm_value[i]);
1582 	}
1583 
1584 	pre_support_ability = dm->support_ability;
1585 	comp = dm->support_ability;
1586 
1587 	PDM_SNPF(out_len, used, output + used, out_len - used,
1588 		 "\n================================\n");
1589 
1590 	if (dm_value[0] == 100) {
1591 		PDM_SNPF(out_len, used, output + used, out_len - used,
1592 			 "[Supportability] PhyDM Selection\n");
1593 		PDM_SNPF(out_len, used, output + used, out_len - used,
1594 			 "================================\n");
1595 		PDM_SNPF(out_len, used, output + used, out_len - used,
1596 			 "00. (( %s ))DIG\n",
1597 			 ((comp & ODM_BB_DIG) ? ("V") : (".")));
1598 		PDM_SNPF(out_len, used, output + used, out_len - used,
1599 			 "01. (( %s ))RA_MASK\n",
1600 			 ((comp & ODM_BB_RA_MASK) ? ("V") : (".")));
1601 		PDM_SNPF(out_len, used, output + used, out_len - used,
1602 			 "02. (( %s ))DYN_TXPWR\n",
1603 			 ((comp & ODM_BB_DYNAMIC_TXPWR) ? ("V") : (".")));
1604 		PDM_SNPF(out_len, used, output + used, out_len - used,
1605 			 "03. (( %s ))FA_CNT\n",
1606 			 ((comp & ODM_BB_FA_CNT) ? ("V") : (".")));
1607 		PDM_SNPF(out_len, used, output + used, out_len - used,
1608 			 "04. (( %s ))RSSI_MNTR\n",
1609 			 ((comp & ODM_BB_RSSI_MONITOR) ? ("V") : (".")));
1610 		PDM_SNPF(out_len, used, output + used, out_len - used,
1611 			 "05. (( %s ))CCK_PD\n",
1612 			 ((comp & ODM_BB_CCK_PD) ? ("V") : (".")));
1613 		PDM_SNPF(out_len, used, output + used, out_len - used,
1614 			 "06. (( %s ))ANT_DIV\n",
1615 			 ((comp & ODM_BB_ANT_DIV) ? ("V") : (".")));
1616 		PDM_SNPF(out_len, used, output + used, out_len - used,
1617 			 "07. (( %s ))SMT_ANT\n",
1618 			 ((comp & ODM_BB_SMT_ANT) ? ("V") : (".")));
1619 		PDM_SNPF(out_len, used, output + used, out_len - used,
1620 			 "08. (( %s ))PWR_TRAIN\n",
1621 			 ((comp & ODM_BB_PWR_TRAIN) ? ("V") : (".")));
1622 		PDM_SNPF(out_len, used, output + used, out_len - used,
1623 			 "09. (( %s ))RA\n",
1624 			 ((comp & ODM_BB_RATE_ADAPTIVE) ? ("V") : (".")));
1625 		PDM_SNPF(out_len, used, output + used, out_len - used,
1626 			 "10. (( %s ))PATH_DIV\n",
1627 			 ((comp & ODM_BB_PATH_DIV) ? ("V") : (".")));
1628 		PDM_SNPF(out_len, used, output + used, out_len - used,
1629 			 "11. (( %s ))DFS\n",
1630 			 ((comp & ODM_BB_DFS) ? ("V") : (".")));
1631 		PDM_SNPF(out_len, used, output + used, out_len - used,
1632 			 "12. (( %s ))DYN_ARFR\n",
1633 			 ((comp & ODM_BB_DYNAMIC_ARFR) ? ("V") : (".")));
1634 		PDM_SNPF(out_len, used, output + used, out_len - used,
1635 			 "13. (( %s ))ADAPTIVITY\n",
1636 			 ((comp & ODM_BB_ADAPTIVITY) ? ("V") : (".")));
1637 		PDM_SNPF(out_len, used, output + used, out_len - used,
1638 			 "14. (( %s ))CFO_TRACK\n",
1639 			 ((comp & ODM_BB_CFO_TRACKING) ? ("V") : (".")));
1640 		PDM_SNPF(out_len, used, output + used, out_len - used,
1641 			 "15. (( %s ))ENV_MONITOR\n",
1642 			 ((comp & ODM_BB_ENV_MONITOR) ? ("V") : (".")));
1643 		PDM_SNPF(out_len, used, output + used, out_len - used,
1644 			 "16. (( %s ))PRI_CCA\n",
1645 			 ((comp & ODM_BB_PRIMARY_CCA) ? ("V") : (".")));
1646 		PDM_SNPF(out_len, used, output + used, out_len - used,
1647 			 "17. (( %s ))ADPTV_SOML\n",
1648 			 ((comp & ODM_BB_ADAPTIVE_SOML) ? ("V") : (".")));
1649 		PDM_SNPF(out_len, used, output + used, out_len - used,
1650 			 "18. (( %s ))LNA_SAT_CHK\n",
1651 			 ((comp & ODM_BB_LNA_SAT_CHK) ? ("V") : (".")));
1652 
1653 		PDM_SNPF(out_len, used, output + used, out_len - used,
1654 			 "================================\n");
1655 		PDM_SNPF(out_len, used, output + used, out_len - used,
1656 			 "[Supportability] PhyDM offload ability\n");
1657 		PDM_SNPF(out_len, used, output + used, out_len - used,
1658 			 "================================\n");
1659 
1660 		PDM_SNPF(out_len, used, output + used, out_len - used,
1661 			 "00. (( %s ))PHY PARAM OFFLOAD\n",
1662 			 ((dm->fw_offload_ability & PHYDM_PHY_PARAM_OFFLOAD) ?
1663 			 ("V") : (".")));
1664 		PDM_SNPF(out_len, used, output + used, out_len - used,
1665 			 "01. (( %s ))RF IQK OFFLOAD\n",
1666 			 ((dm->fw_offload_ability & PHYDM_RF_IQK_OFFLOAD) ?
1667 			 ("V") : (".")));
1668 		PDM_SNPF(out_len, used, output + used, out_len - used,
1669 			 "================================\n");
1670 
1671 	} else if (dm_value[0] == 101) {
1672 		dm->support_ability = 0;
1673 		PDM_SNPF(out_len, used, output + used, out_len - used,
1674 			 "Disable all support_ability components\n");
1675 	} else {
1676 		if (dm_value[1] == 1) { /* @enable */
1677 			dm->support_ability |= (one << dm_value[0]);
1678 		} else if (dm_value[1] == 2) {/* @disable */
1679 			dm->support_ability &= ~(one << dm_value[0]);
1680 		} else {
1681 			PDM_SNPF(out_len, used, output + used, out_len - used,
1682 				 "[Warning!!!]  1:enable,  2:disable\n");
1683 		}
1684 	}
1685 	PDM_SNPF(out_len, used, output + used, out_len - used,
1686 		 "pre-supportability = 0x%llx\n", pre_support_ability);
1687 	PDM_SNPF(out_len, used, output + used, out_len - used,
1688 		 "Cur-supportability = 0x%llx\n", dm->support_ability);
1689 	PDM_SNPF(out_len, used, output + used, out_len - used,
1690 		 "================================\n");
1691 
1692 	*_used = used;
1693 	*_out_len = out_len;
1694 }
1695 
phydm_watchdog_lps_32k(struct dm_struct * dm)1696 void phydm_watchdog_lps_32k(struct dm_struct *dm)
1697 {
1698 	PHYDM_DBG(dm, DBG_COMMON_FLOW, "%s ======>\n", __func__);
1699 
1700 	phydm_common_info_self_update(dm);
1701 	phydm_rssi_monitor_check(dm);
1702 	phydm_dig_lps_32k(dm);
1703 	phydm_common_info_self_reset(dm);
1704 }
1705 
phydm_watchdog_lps(struct dm_struct * dm)1706 void phydm_watchdog_lps(struct dm_struct *dm)
1707 {
1708 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE | ODM_IOT))
1709 	PHYDM_DBG(dm, DBG_COMMON_FLOW, "%s ======>\n", __func__);
1710 
1711 	phydm_common_info_self_update(dm);
1712 	phydm_rssi_monitor_check(dm);
1713 	phydm_basic_dbg_message(dm);
1714 	phydm_receiver_blocking(dm);
1715 	phydm_false_alarm_counter_statistics(dm);
1716 	phydm_dig_by_rssi_lps(dm);
1717 	#ifdef PHYDM_SUPPORT_CCKPD
1718 	phydm_cck_pd_th(dm);
1719 	#endif
1720 	phydm_adaptivity(dm);
1721 	#if (DM_ODM_SUPPORT_TYPE & (ODM_CE))
1722 	#ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY
1723 	/*@enable AntDiv in PS mode, request from SD4 Jeff*/
1724 	odm_antenna_diversity(dm);
1725 	#endif
1726 	#endif
1727 	phydm_common_info_self_reset(dm);
1728 #endif
1729 }
1730 
phydm_watchdog_mp(struct dm_struct * dm)1731 void phydm_watchdog_mp(struct dm_struct *dm)
1732 {
1733 }
1734 
phydm_pause_dm_watchdog(void * dm_void,enum phydm_pause_type pause_type)1735 void phydm_pause_dm_watchdog(void *dm_void, enum phydm_pause_type pause_type)
1736 {
1737 	struct dm_struct *dm = (struct dm_struct *)dm_void;
1738 
1739 	if (pause_type == PHYDM_PAUSE) {
1740 		dm->disable_phydm_watchdog = 1;
1741 		PHYDM_DBG(dm, ODM_COMP_API, "PHYDM Stop\n");
1742 	} else {
1743 		dm->disable_phydm_watchdog = 0;
1744 		PHYDM_DBG(dm, ODM_COMP_API, "PHYDM Start\n");
1745 	}
1746 }
1747 
phydm_pause_func(void * dm_void,enum phydm_func_idx pause_func,enum phydm_pause_type pause_type,enum phydm_pause_level pause_lv,u8 val_lehgth,u32 * val_buf)1748 u8 phydm_pause_func(void *dm_void, enum phydm_func_idx pause_func,
1749 		    enum phydm_pause_type pause_type,
1750 		    enum phydm_pause_level pause_lv, u8 val_lehgth,
1751 		    u32 *val_buf)
1752 {
1753 	struct dm_struct *dm = (struct dm_struct *)dm_void;
1754 	struct phydm_func_poiner *func_t = &dm->phydm_func_handler;
1755 	s8 *pause_lv_pre = &dm->s8_dummy;
1756 	u32 *bkp_val = &dm->u32_dummy;
1757 	u32 ori_val[5] = {0};
1758 	u64 pause_func_bitmap = (u64)BIT(pause_func);
1759 	u8 i = 0;
1760 	u8 en_2rcca = 0;
1761 	u8 en_bw40m = 0;
1762 	u8 pause_result = PAUSE_FAIL;
1763 
1764 	PHYDM_DBG(dm, ODM_COMP_API, "\n");
1765 	PHYDM_DBG(dm, ODM_COMP_API, "[%s][%s] LV=%d, Len=%d\n", __func__,
1766 		  ((pause_type == PHYDM_PAUSE) ? "Pause" :
1767 		  ((pause_type == PHYDM_RESUME) ? "Resume" : "Pause no_set")),
1768 		  pause_lv, val_lehgth);
1769 
1770 	if (pause_lv >= PHYDM_PAUSE_MAX_NUM) {
1771 		PHYDM_DBG(dm, ODM_COMP_API, "[WARNING]Wrong LV=%d\n", pause_lv);
1772 		return PAUSE_FAIL;
1773 	}
1774 
1775 	if (pause_func == F00_DIG) {
1776 		PHYDM_DBG(dm, ODM_COMP_API, "[DIG]\n");
1777 
1778 		if (val_lehgth != 1) {
1779 			PHYDM_DBG(dm, ODM_COMP_API, "[WARNING] length != 1\n");
1780 			return PAUSE_FAIL;
1781 		}
1782 
1783 		ori_val[0] = (u32)(dm->dm_dig_table.cur_ig_value);
1784 		pause_lv_pre = &dm->pause_lv_table.lv_dig;
1785 		bkp_val = (u32 *)(&dm->dm_dig_table.rvrt_val);
1786 		/*@function pointer hook*/
1787 		func_t->pause_phydm_handler = phydm_set_dig_val;
1788 
1789 #ifdef PHYDM_SUPPORT_CCKPD
1790 	} else if (pause_func == F05_CCK_PD) {
1791 		PHYDM_DBG(dm, ODM_COMP_API, "[CCK_PD]\n");
1792 
1793 		if (val_lehgth != 1) {
1794 			PHYDM_DBG(dm, ODM_COMP_API, "[WARNING] length != 1\n");
1795 			return PAUSE_FAIL;
1796 		}
1797 
1798 		ori_val[0] = (u32)dm->dm_cckpd_table.cck_pd_lv;
1799 		pause_lv_pre = &dm->pause_lv_table.lv_cckpd;
1800 		bkp_val = (u32 *)(&dm->dm_cckpd_table.rvrt_val);
1801 		/*@function pointer hook*/
1802 		func_t->pause_phydm_handler = phydm_set_cckpd_val;
1803 #endif
1804 
1805 #ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY
1806 	} else if (pause_func == F06_ANT_DIV) {
1807 		PHYDM_DBG(dm, ODM_COMP_API, "[AntDiv]\n");
1808 
1809 		if (val_lehgth != 1) {
1810 			PHYDM_DBG(dm, ODM_COMP_API, "[WARNING] length != 1\n");
1811 			return PAUSE_FAIL;
1812 		}
1813 		/*@default antenna*/
1814 		ori_val[0] = (u32)(dm->dm_fat_table.rx_idle_ant);
1815 		pause_lv_pre = &dm->pause_lv_table.lv_antdiv;
1816 		bkp_val = (u32 *)(&dm->dm_fat_table.rvrt_val);
1817 		/*@function pointer hook*/
1818 		func_t->pause_phydm_handler = phydm_set_antdiv_val;
1819 
1820 #endif
1821 #ifdef PHYDM_SUPPORT_ADAPTIVITY
1822 	} else if (pause_func == F13_ADPTVTY) {
1823 		PHYDM_DBG(dm, ODM_COMP_API, "[Adaptivity]\n");
1824 
1825 		if (val_lehgth != 2) {
1826 			PHYDM_DBG(dm, ODM_COMP_API, "[WARNING] length != 2\n");
1827 			return PAUSE_FAIL;
1828 		}
1829 
1830 		ori_val[0] = (u32)(dm->adaptivity.th_l2h); /*th_l2h*/
1831 		ori_val[1] = (u32)(dm->adaptivity.th_h2l); /*th_h2l*/
1832 		pause_lv_pre = &dm->pause_lv_table.lv_adapt;
1833 		bkp_val = (u32 *)(&dm->adaptivity.rvrt_val);
1834 		/*@function pointer hook*/
1835 		func_t->pause_phydm_handler = phydm_set_edcca_val;
1836 
1837 #endif
1838 #ifdef CONFIG_ADAPTIVE_SOML
1839 	} else if (pause_func == F17_ADPTV_SOML) {
1840 		PHYDM_DBG(dm, ODM_COMP_API, "[AD-SOML]\n");
1841 
1842 		if (val_lehgth != 1) {
1843 			PHYDM_DBG(dm, ODM_COMP_API, "[WARNING] length != 1\n");
1844 			return PAUSE_FAIL;
1845 		}
1846 		/*SOML_ON/OFF*/
1847 		ori_val[0] = (u32)(dm->dm_soml_table.soml_on_off);
1848 
1849 		pause_lv_pre = &dm->pause_lv_table.lv_adsl;
1850 		bkp_val = (u32 *)(&dm->dm_soml_table.rvrt_val);
1851 		 /*@function pointer hook*/
1852 		func_t->pause_phydm_handler = phydm_set_adsl_val;
1853 
1854 #endif
1855 	} else {
1856 		PHYDM_DBG(dm, ODM_COMP_API, "[WARNING] error func idx\n");
1857 		return PAUSE_FAIL;
1858 	}
1859 
1860 	PHYDM_DBG(dm, ODM_COMP_API, "Pause_LV{new , pre} = {%d ,%d}\n",
1861 		  pause_lv, *pause_lv_pre);
1862 
1863 	if (pause_type == PHYDM_PAUSE || pause_type == PHYDM_PAUSE_NO_SET) {
1864 		if (pause_lv <= *pause_lv_pre) {
1865 			PHYDM_DBG(dm, ODM_COMP_API,
1866 				  "[PAUSE FAIL] Pre_LV >= Curr_LV\n");
1867 			return PAUSE_FAIL;
1868 		}
1869 
1870 		if (!(dm->pause_ability & pause_func_bitmap)) {
1871 			for (i = 0; i < val_lehgth; i++)
1872 				bkp_val[i] = ori_val[i];
1873 		}
1874 
1875 		dm->pause_ability |= pause_func_bitmap;
1876 		PHYDM_DBG(dm, ODM_COMP_API, "pause_ability=0x%llx\n",
1877 			  dm->pause_ability);
1878 
1879 		if (pause_type == PHYDM_PAUSE) {
1880 			for (i = 0; i < val_lehgth; i++)
1881 				PHYDM_DBG(dm, ODM_COMP_API,
1882 					  "[PAUSE SUCCESS] val_idx[%d]{New, Ori}={0x%x, 0x%x}\n",
1883 					  i, val_buf[i], bkp_val[i]);
1884 			func_t->pause_phydm_handler(dm, val_buf, val_lehgth);
1885 		} else {
1886 			for (i = 0; i < val_lehgth; i++)
1887 				PHYDM_DBG(dm, ODM_COMP_API,
1888 					  "[PAUSE NO Set: SUCCESS] val_idx[%d]{Ori}={0x%x}\n",
1889 					  i, bkp_val[i]);
1890 		}
1891 
1892 		*pause_lv_pre = pause_lv;
1893 		pause_result = PAUSE_SUCCESS;
1894 
1895 	} else if (pause_type == PHYDM_RESUME) {
1896 		if ((dm->pause_ability & pause_func_bitmap) == 0) {
1897 			PHYDM_DBG(dm, ODM_COMP_API,
1898 				  "[RESUME] No Need to Revert\n");
1899 			return PAUSE_SUCCESS;
1900 		}
1901 
1902 		dm->pause_ability &= ~pause_func_bitmap;
1903 		PHYDM_DBG(dm, ODM_COMP_API, "pause_ability=0x%llx\n",
1904 			  dm->pause_ability);
1905 
1906 		*pause_lv_pre = PHYDM_PAUSE_RELEASE;
1907 
1908 		for (i = 0; i < val_lehgth; i++) {
1909 			PHYDM_DBG(dm, ODM_COMP_API,
1910 				  "[RESUME] val_idx[%d]={0x%x}\n", i,
1911 				  bkp_val[i]);
1912 		}
1913 
1914 		func_t->pause_phydm_handler(dm, bkp_val, val_lehgth);
1915 
1916 		pause_result = PAUSE_SUCCESS;
1917 	} else {
1918 		PHYDM_DBG(dm, ODM_COMP_API, "[WARNING] error pause_type\n");
1919 		pause_result = PAUSE_FAIL;
1920 	}
1921 	return pause_result;
1922 }
1923 
phydm_pause_func_console(void * dm_void,char input[][16],u32 * _used,char * output,u32 * _out_len)1924 void phydm_pause_func_console(void *dm_void, char input[][16], u32 *_used,
1925 			      char *output, u32 *_out_len)
1926 {
1927 	struct dm_struct *dm = (struct dm_struct *)dm_void;
1928 	char help[] = "-h";
1929 	u32 var1[10] = {0};
1930 	u32 used = *_used;
1931 	u32 out_len = *_out_len;
1932 	u32 i;
1933 	u8 length = 0;
1934 	u32 buf[5] = {0};
1935 	u8 set_result = 0;
1936 	enum phydm_func_idx func = 0;
1937 	enum phydm_pause_type type = 0;
1938 	enum phydm_pause_level lv = 0;
1939 
1940 	if ((strcmp(input[1], help) == 0)) {
1941 		PDM_SNPF(out_len, used, output + used, out_len - used,
1942 			 "{Func} {1:pause,2:pause no set 3:Resume} {lv:0~3} Val[5:0]\n");
1943 
1944 		goto out;
1945 	}
1946 
1947 	for (i = 0; i < 10; i++) {
1948 		if (input[i + 1])
1949 			PHYDM_SSCANF(input[i + 1], DCMD_HEX, &var1[i]);
1950 	}
1951 
1952 	func = (enum phydm_func_idx)var1[0];
1953 	type = (enum phydm_pause_type)var1[1];
1954 	lv = (enum phydm_pause_level)var1[2];
1955 
1956 	for (i = 0; i < 5; i++)
1957 		buf[i] = var1[3 + i];
1958 
1959 	if (func == F00_DIG) {
1960 		PDM_SNPF(out_len, used, output + used, out_len - used,
1961 			 "[DIG]\n");
1962 		length = 1;
1963 
1964 	} else if (func == F05_CCK_PD) {
1965 		PDM_SNPF(out_len, used, output + used, out_len - used,
1966 			 "[CCK_PD]\n");
1967 		length = 1;
1968 	} else if (func == F06_ANT_DIV) {
1969 		PDM_SNPF(out_len, used, output + used, out_len - used,
1970 			 "[Ant_Div]\n");
1971 		length = 1;
1972 	} else if (func == F13_ADPTVTY) {
1973 		PDM_SNPF(out_len, used, output + used, out_len - used,
1974 			 "[Adaptivity]\n");
1975 		length = 2;
1976 	} else if (func == F17_ADPTV_SOML) {
1977 		PDM_SNPF(out_len, used, output + used, out_len - used,
1978 			 "[ADSL]\n");
1979 		length = 1;
1980 	} else {
1981 		PDM_SNPF(out_len, used, output + used, out_len - used,
1982 			 "[Set Function Error]\n");
1983 		length = 0;
1984 	}
1985 
1986 	if (length != 0) {
1987 		PDM_SNPF(out_len, used, output + used, out_len - used,
1988 			 "{%s, lv=%d} val = %d, %d}\n",
1989 			 ((type == PHYDM_PAUSE) ? "Pause" :
1990 			 ((type == PHYDM_RESUME) ? "Resume" : "Pause no_set")),
1991 			 lv, var1[3], var1[4]);
1992 
1993 		set_result = phydm_pause_func(dm, func, type, lv, length, buf);
1994 	}
1995 
1996 	PDM_SNPF(out_len, used, output + used, out_len - used,
1997 		 "set_result = %d\n", set_result);
1998 
1999 out:
2000 	*_used = used;
2001 	*_out_len = out_len;
2002 }
2003 
phydm_stop_dm_watchdog_check(void * dm_void)2004 u8 phydm_stop_dm_watchdog_check(void *dm_void)
2005 {
2006 	struct dm_struct *dm = (struct dm_struct *)dm_void;
2007 
2008 	if (dm->disable_phydm_watchdog == 1) {
2009 		PHYDM_DBG(dm, DBG_COMMON_FLOW, "Disable phydm\n");
2010 		return true;
2011 	} else {
2012 		return false;
2013 	}
2014 }
2015 
phydm_watchdog(struct dm_struct * dm)2016 void phydm_watchdog(struct dm_struct *dm)
2017 {
2018 	PHYDM_DBG(dm, DBG_COMMON_FLOW, "%s ======>\n", __func__);
2019 
2020 	phydm_common_info_self_update(dm);
2021 	phydm_phy_info_update(dm);
2022 	phydm_rssi_monitor_check(dm);
2023 	phydm_basic_dbg_message(dm);
2024 	phydm_dm_summary(dm, FIRST_MACID);
2025 #ifdef PHYDM_AUTO_DEGBUG
2026 	phydm_auto_dbg_engine(dm);
2027 #endif
2028 	phydm_receiver_blocking(dm);
2029 
2030 	if (phydm_stop_dm_watchdog_check(dm) == true)
2031 		return;
2032 
2033 	phydm_hw_setting(dm);
2034 
2035 	#ifdef PHYDM_TDMA_DIG_SUPPORT
2036 	if (dm->original_dig_restore == 0)
2037 		phydm_tdma_dig_timer_check(dm);
2038 	else
2039 	#endif
2040 	{
2041 		phydm_false_alarm_counter_statistics(dm);
2042 		phydm_noisy_detection(dm);
2043 		phydm_dig(dm);
2044 		#ifdef PHYDM_SUPPORT_CCKPD
2045 		phydm_cck_pd_th(dm);
2046 		#endif
2047 	}
2048 
2049 #ifdef PHYDM_POWER_TRAINING_SUPPORT
2050 	phydm_update_power_training_state(dm);
2051 #endif
2052 	phydm_adaptivity(dm);
2053 	phydm_ra_info_watchdog(dm);
2054 #ifdef CONFIG_PATH_DIVERSITY
2055 	phydm_tx_path_diversity(dm);
2056 #endif
2057 	phydm_cfo_tracking(dm);
2058 #ifdef CONFIG_DYNAMIC_TX_TWR
2059 	phydm_dynamic_tx_power(dm);
2060 #endif
2061 #ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY
2062 	odm_antenna_diversity(dm);
2063 #endif
2064 #ifdef CONFIG_ADAPTIVE_SOML
2065 	phydm_adaptive_soml(dm);
2066 #endif
2067 
2068 #ifdef PHYDM_BEAMFORMING_VERSION1
2069 	phydm_beamforming_watchdog(dm);
2070 #endif
2071 
2072 	halrf_watchdog(dm);
2073 #ifdef PHYDM_PRIMARY_CCA
2074 	phydm_primary_cca(dm);
2075 #endif
2076 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
2077 	odm_dtc(dm);
2078 #endif
2079 
2080 	phydm_env_mntr_watchdog(dm);
2081 
2082 #ifdef PHYDM_LNA_SAT_CHK_SUPPORT
2083 	phydm_lna_sat_chk_watchdog(dm);
2084 #endif
2085 #ifdef CONFIG_MCC_DM
2086 	phydm_mcc_switch(dm);
2087 #endif
2088 
2089 #ifdef CONFIG_MU_RSOML
2090 	phydm_mu_rsoml_decision(dm);
2091 #endif
2092 
2093 	phydm_common_info_self_reset(dm);
2094 }
2095 
2096 /*@
2097  * Init /.. Fixed HW value. Only init time.
2098  */
odm_cmn_info_init(struct dm_struct * dm,enum odm_cmninfo cmn_info,u64 value)2099 void odm_cmn_info_init(struct dm_struct *dm, enum odm_cmninfo cmn_info,
2100 		       u64 value)
2101 {
2102 	/* This section is used for init value */
2103 	switch (cmn_info) {
2104 	/* @Fixed ODM value. */
2105 	case ODM_CMNINFO_ABILITY:
2106 		dm->support_ability = (u64)value;
2107 		break;
2108 
2109 	case ODM_CMNINFO_RF_TYPE:
2110 		dm->rf_type = (u8)value;
2111 		break;
2112 
2113 	case ODM_CMNINFO_PLATFORM:
2114 		dm->support_platform = (u8)value;
2115 		break;
2116 
2117 	case ODM_CMNINFO_INTERFACE:
2118 		dm->support_interface = (u8)value;
2119 		break;
2120 
2121 	case ODM_CMNINFO_MP_TEST_CHIP:
2122 		dm->is_mp_chip = (u8)value;
2123 		break;
2124 
2125 	case ODM_CMNINFO_IC_TYPE:
2126 		dm->support_ic_type = (u32)value;
2127 		break;
2128 
2129 	case ODM_CMNINFO_CUT_VER:
2130 		dm->cut_version = (u8)value;
2131 		break;
2132 
2133 	case ODM_CMNINFO_FAB_VER:
2134 		dm->fab_version = (u8)value;
2135 		break;
2136 	case ODM_CMNINFO_FW_VER:
2137 		dm->fw_version = (u8)value;
2138 		break;
2139 	case ODM_CMNINFO_FW_SUB_VER:
2140 		dm->fw_sub_version = (u8)value;
2141 		break;
2142 	case ODM_CMNINFO_RFE_TYPE:
2143 #if (RTL8821C_SUPPORT)
2144 		if (dm->support_ic_type & ODM_RTL8821C)
2145 			dm->rfe_type_expand = (u8)value;
2146 		else
2147 #endif
2148 			dm->rfe_type = (u8)value;
2149 		phydm_init_hw_info_by_rfe(dm);
2150 		break;
2151 
2152 	case ODM_CMNINFO_RF_ANTENNA_TYPE:
2153 		dm->ant_div_type = (u8)value;
2154 		break;
2155 
2156 	case ODM_CMNINFO_WITH_EXT_ANTENNA_SWITCH:
2157 		dm->with_extenal_ant_switch = (u8)value;
2158 		break;
2159 
2160 #ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY
2161 	case ODM_CMNINFO_BE_FIX_TX_ANT:
2162 		dm->dm_fat_table.b_fix_tx_ant = (u8)value;
2163 		break;
2164 #endif
2165 
2166 	case ODM_CMNINFO_BOARD_TYPE:
2167 		if (!dm->is_init_hw_info_by_rfe)
2168 			dm->board_type = (u8)value;
2169 		break;
2170 
2171 	case ODM_CMNINFO_PACKAGE_TYPE:
2172 		if (!dm->is_init_hw_info_by_rfe)
2173 			dm->package_type = (u8)value;
2174 		break;
2175 
2176 	case ODM_CMNINFO_EXT_LNA:
2177 		if (!dm->is_init_hw_info_by_rfe)
2178 			dm->ext_lna = (u8)value;
2179 		break;
2180 
2181 	case ODM_CMNINFO_5G_EXT_LNA:
2182 		if (!dm->is_init_hw_info_by_rfe)
2183 			dm->ext_lna_5g = (u8)value;
2184 		break;
2185 
2186 	case ODM_CMNINFO_EXT_PA:
2187 		if (!dm->is_init_hw_info_by_rfe)
2188 			dm->ext_pa = (u8)value;
2189 		break;
2190 
2191 	case ODM_CMNINFO_5G_EXT_PA:
2192 		if (!dm->is_init_hw_info_by_rfe)
2193 			dm->ext_pa_5g = (u8)value;
2194 		break;
2195 
2196 	case ODM_CMNINFO_GPA:
2197 		if (!dm->is_init_hw_info_by_rfe)
2198 			dm->type_gpa = (u16)value;
2199 		break;
2200 
2201 	case ODM_CMNINFO_APA:
2202 		if (!dm->is_init_hw_info_by_rfe)
2203 			dm->type_apa = (u16)value;
2204 		break;
2205 
2206 	case ODM_CMNINFO_GLNA:
2207 		if (!dm->is_init_hw_info_by_rfe)
2208 			dm->type_glna = (u16)value;
2209 		break;
2210 
2211 	case ODM_CMNINFO_ALNA:
2212 		if (!dm->is_init_hw_info_by_rfe)
2213 			dm->type_alna = (u16)value;
2214 		break;
2215 
2216 	case ODM_CMNINFO_EXT_TRSW:
2217 		if (!dm->is_init_hw_info_by_rfe)
2218 			dm->ext_trsw = (u8)value;
2219 		break;
2220 	case ODM_CMNINFO_EXT_LNA_GAIN:
2221 		dm->ext_lna_gain = (u8)value;
2222 		break;
2223 	case ODM_CMNINFO_PATCH_ID:
2224 		dm->iot_table.win_patch_id = (u8)value;
2225 		break;
2226 	case ODM_CMNINFO_BINHCT_TEST:
2227 		dm->is_in_hct_test = (boolean)value;
2228 		break;
2229 	case ODM_CMNINFO_BWIFI_TEST:
2230 		dm->wifi_test = (u8)value;
2231 		break;
2232 	case ODM_CMNINFO_SMART_CONCURRENT:
2233 		dm->is_dual_mac_smart_concurrent = (boolean)value;
2234 		break;
2235 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
2236 	case ODM_CMNINFO_CONFIG_BB_RF:
2237 		dm->config_bbrf = (boolean)value;
2238 		break;
2239 #endif
2240 	case ODM_CMNINFO_IQKPAOFF:
2241 		dm->rf_calibrate_info.is_iqk_pa_off = (boolean)value;
2242 		break;
2243 	case ODM_CMNINFO_REGRFKFREEENABLE:
2244 		dm->rf_calibrate_info.reg_rf_kfree_enable = (u8)value;
2245 		break;
2246 	case ODM_CMNINFO_RFKFREEENABLE:
2247 		dm->rf_calibrate_info.rf_kfree_enable = (u8)value;
2248 		break;
2249 	case ODM_CMNINFO_NORMAL_RX_PATH_CHANGE:
2250 		dm->normal_rx_path = (u8)value;
2251 		break;
2252 	case ODM_CMNINFO_VALID_PATH_SET:
2253 		dm->valid_path_set = (u8)value;
2254 		break;
2255 	case ODM_CMNINFO_EFUSE0X3D8:
2256 		dm->efuse0x3d8 = (u8)value;
2257 		break;
2258 	case ODM_CMNINFO_EFUSE0X3D7:
2259 		dm->efuse0x3d7 = (u8)value;
2260 		break;
2261 	case ODM_CMNINFO_ADVANCE_OTA:
2262 		dm->p_advance_ota = (u8)value;
2263 		break;
2264 
2265 #ifdef CONFIG_PHYDM_DFS_MASTER
2266 	case ODM_CMNINFO_DFS_REGION_DOMAIN:
2267 		dm->dfs_region_domain = (u8)value;
2268 		break;
2269 #endif
2270 	case ODM_CMNINFO_SOFT_AP_SPECIAL_SETTING:
2271 		dm->soft_ap_special_setting = (u32)value;
2272 		break;
2273 
2274 	case ODM_CMNINFO_X_CAP_SETTING:
2275 		dm->dm_cfo_track.crystal_cap_default = (u8)value;
2276 		break;
2277 
2278 	case ODM_CMNINFO_DPK_EN:
2279 		/*@dm->dpk_en = (u1Byte)value;*/
2280 		halrf_cmn_info_set(dm, HALRF_CMNINFO_DPK_EN, (u64)value);
2281 		break;
2282 
2283 	case ODM_CMNINFO_HP_HWID:
2284 		dm->hp_hw_id = (boolean)value;
2285 		break;
2286 	case ODM_CMNINFO_DIS_DPD:
2287 		dm->en_dis_dpd = (boolean)value;
2288 		break;
2289 	default:
2290 		break;
2291 	}
2292 }
2293 
odm_cmn_info_hook(struct dm_struct * dm,enum odm_cmninfo cmn_info,void * value)2294 void odm_cmn_info_hook(struct dm_struct *dm, enum odm_cmninfo cmn_info,
2295 		       void *value)
2296 {
2297 	/* @Hook call by reference pointer. */
2298 	switch (cmn_info) {
2299 	/* @Dynamic call by reference pointer. */
2300 	case ODM_CMNINFO_TX_UNI:
2301 		dm->num_tx_bytes_unicast = (u64 *)value;
2302 		break;
2303 
2304 	case ODM_CMNINFO_RX_UNI:
2305 		dm->num_rx_bytes_unicast = (u64 *)value;
2306 		break;
2307 
2308 	case ODM_CMNINFO_BAND:
2309 		dm->band_type = (u8 *)value;
2310 		break;
2311 
2312 	case ODM_CMNINFO_SEC_CHNL_OFFSET:
2313 		dm->sec_ch_offset = (u8 *)value;
2314 		break;
2315 
2316 	case ODM_CMNINFO_SEC_MODE:
2317 		dm->security = (u8 *)value;
2318 		break;
2319 
2320 	case ODM_CMNINFO_BW:
2321 		dm->band_width = (u8 *)value;
2322 		break;
2323 
2324 	case ODM_CMNINFO_CHNL:
2325 		dm->channel = (u8 *)value;
2326 		break;
2327 
2328 	case ODM_CMNINFO_SCAN:
2329 		dm->is_scan_in_process = (boolean *)value;
2330 		break;
2331 
2332 	case ODM_CMNINFO_POWER_SAVING:
2333 		dm->is_power_saving = (boolean *)value;
2334 		break;
2335 
2336 	case ODM_CMNINFO_TDMA:
2337 		dm->is_tdma = (boolean *)value;
2338 		break;
2339 
2340 	case ODM_CMNINFO_ONE_PATH_CCA:
2341 		dm->one_path_cca = (u8 *)value;
2342 		break;
2343 
2344 	case ODM_CMNINFO_DRV_STOP:
2345 		dm->is_driver_stopped = (boolean *)value;
2346 		break;
2347 	case ODM_CMNINFO_INIT_ON:
2348 		dm->pinit_adpt_in_progress = (boolean *)value;
2349 		break;
2350 
2351 	case ODM_CMNINFO_ANT_TEST:
2352 		dm->antenna_test = (u8 *)value;
2353 		break;
2354 
2355 	case ODM_CMNINFO_NET_CLOSED:
2356 		dm->is_net_closed = (boolean *)value;
2357 		break;
2358 
2359 	case ODM_CMNINFO_FORCED_RATE:
2360 		dm->forced_data_rate = (u16 *)value;
2361 		break;
2362 	case ODM_CMNINFO_ANT_DIV:
2363 		dm->enable_antdiv = (u8 *)value;
2364 		break;
2365 	case ODM_CMNINFO_PATH_DIV:
2366 		dm->enable_pathdiv = (u8 *)value;
2367 		break;
2368 	case ODM_CMNINFO_ADAPTIVE_SOML:
2369 		dm->en_adap_soml = (u8 *)value;
2370 		break;
2371 	case ODM_CMNINFO_ADAPTIVITY:
2372 		dm->enable_adaptivity = (u8 *)value;
2373 		break;
2374 
2375 	case ODM_CMNINFO_P2P_LINK:
2376 		dm->dm_dig_table.is_p2p_in_process = (u8 *)value;
2377 		break;
2378 
2379 	case ODM_CMNINFO_IS1ANTENNA:
2380 		dm->is_1_antenna = (boolean *)value;
2381 		break;
2382 
2383 	case ODM_CMNINFO_RFDEFAULTPATH:
2384 		dm->rf_default_path = (u8 *)value;
2385 		break;
2386 
2387 	case ODM_CMNINFO_FCS_MODE: /* @fast channel switch (= MCC mode)*/
2388 		dm->is_fcs_mode_enable = (boolean *)value;
2389 		break;
2390 
2391 	case ODM_CMNINFO_HUBUSBMODE:
2392 		dm->hub_usb_mode = (u8 *)value;
2393 		break;
2394 	case ODM_CMNINFO_FWDWRSVDPAGEINPROGRESS:
2395 		dm->is_fw_dw_rsvd_page_in_progress = (boolean *)value;
2396 		break;
2397 	case ODM_CMNINFO_TX_TP:
2398 		dm->current_tx_tp = (u32 *)value;
2399 		break;
2400 	case ODM_CMNINFO_RX_TP:
2401 		dm->current_rx_tp = (u32 *)value;
2402 		break;
2403 	case ODM_CMNINFO_SOUNDING_SEQ:
2404 		dm->sounding_seq = (u8 *)value;
2405 		break;
2406 #ifdef CONFIG_PHYDM_DFS_MASTER
2407 	case ODM_CMNINFO_DFS_MASTER_ENABLE:
2408 		dm->dfs_master_enabled = (u8 *)value;
2409 		break;
2410 #endif
2411 
2412 #ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY
2413 	case ODM_CMNINFO_FORCE_TX_ANT_BY_TXDESC:
2414 		dm->dm_fat_table.p_force_tx_by_desc = (u8 *)value;
2415 		break;
2416 	case ODM_CMNINFO_SET_S0S1_DEFAULT_ANTENNA:
2417 		dm->dm_fat_table.p_default_s0_s1 = (u8 *)value;
2418 		break;
2419 	case ODM_CMNINFO_BF_ANTDIV_DECISION:
2420 		dm->dm_fat_table.is_no_csi_feedback = (boolean *)value;
2421 		break;
2422 #endif
2423 
2424 	case ODM_CMNINFO_SOFT_AP_MODE:
2425 		dm->soft_ap_mode = (u32 *)value;
2426 		break;
2427 	case ODM_CMNINFO_MP_MODE:
2428 		dm->mp_mode = (u8 *)value;
2429 		break;
2430 	case ODM_CMNINFO_INTERRUPT_MASK:
2431 		dm->interrupt_mask = (u32 *)value;
2432 		break;
2433 	case ODM_CMNINFO_BB_OPERATION_MODE:
2434 		dm->bb_op_mode = (u8 *)value;
2435 		break;
2436 	case ODM_CMNINFO_MANUAL_SUPPORTABILITY:
2437 		dm->manual_supportability = (u32 *)value;
2438 		break;
2439 	default:
2440 		/*do nothing*/
2441 		break;
2442 	}
2443 }
2444 
2445 /*@
2446  * Update band/CHannel/.. The values are dynamic but non-per-packet.
2447  */
odm_cmn_info_update(struct dm_struct * dm,u32 cmn_info,u64 value)2448 void odm_cmn_info_update(struct dm_struct *dm, u32 cmn_info, u64 value)
2449 {
2450 	/* This init variable may be changed in run time. */
2451 	switch (cmn_info) {
2452 	case ODM_CMNINFO_LINK_IN_PROGRESS:
2453 		dm->is_link_in_process = (boolean)value;
2454 		break;
2455 
2456 	case ODM_CMNINFO_ABILITY:
2457 		dm->support_ability = (u64)value;
2458 		break;
2459 
2460 	case ODM_CMNINFO_RF_TYPE:
2461 		dm->rf_type = (u8)value;
2462 		break;
2463 
2464 	case ODM_CMNINFO_WIFI_DIRECT:
2465 		dm->is_wifi_direct = (boolean)value;
2466 		break;
2467 
2468 	case ODM_CMNINFO_WIFI_DISPLAY:
2469 		dm->is_wifi_display = (boolean)value;
2470 		break;
2471 
2472 	case ODM_CMNINFO_LINK:
2473 		dm->is_linked = (boolean)value;
2474 		break;
2475 
2476 	case ODM_CMNINFO_CMW500LINK:
2477 		dm->iot_table.is_linked_cmw500 = (boolean)value;
2478 		break;
2479 
2480 	case ODM_CMNINFO_STATION_STATE:
2481 		dm->bsta_state = (boolean)value;
2482 		break;
2483 
2484 	case ODM_CMNINFO_RSSI_MIN:
2485 		dm->rssi_min = (u8)value;
2486 		break;
2487 
2488 	case ODM_CMNINFO_RSSI_MIN_BY_PATH:
2489 		dm->rssi_min_by_path = (u8)value;
2490 		break;
2491 
2492 	case ODM_CMNINFO_DBG_COMP:
2493 		dm->debug_components = (u64)value;
2494 		break;
2495 
2496 #ifdef ODM_CONFIG_BT_COEXIST
2497 	/* The following is for BT HS mode and BT coexist mechanism. */
2498 	case ODM_CMNINFO_BT_ENABLED:
2499 		dm->bt_info_table.is_bt_enabled = (boolean)value;
2500 		break;
2501 
2502 	case ODM_CMNINFO_BT_HS_CONNECT_PROCESS:
2503 		dm->bt_info_table.is_bt_connect_process = (boolean)value;
2504 		break;
2505 
2506 	case ODM_CMNINFO_BT_HS_RSSI:
2507 		dm->bt_info_table.bt_hs_rssi = (u8)value;
2508 		break;
2509 
2510 	case ODM_CMNINFO_BT_OPERATION:
2511 		dm->bt_info_table.is_bt_hs_operation = (boolean)value;
2512 		break;
2513 
2514 	case ODM_CMNINFO_BT_LIMITED_DIG:
2515 		dm->bt_info_table.is_bt_limited_dig = (boolean)value;
2516 		break;
2517 #endif
2518 
2519 	case ODM_CMNINFO_AP_TOTAL_NUM:
2520 		dm->ap_total_num = (u8)value;
2521 		break;
2522 
2523 #ifdef CONFIG_PHYDM_DFS_MASTER
2524 	case ODM_CMNINFO_DFS_REGION_DOMAIN:
2525 		dm->dfs_region_domain = (u8)value;
2526 		break;
2527 #endif
2528 
2529 	case ODM_CMNINFO_BT_CONTINUOUS_TURN:
2530 		dm->is_bt_continuous_turn = (boolean)value;
2531 		break;
2532 	case ODM_CMNINFO_IS_DOWNLOAD_FW:
2533 		dm->is_download_fw = (boolean)value;
2534 		break;
2535 	case ODM_CMNINFO_PHYDM_PATCH_ID:
2536 		dm->iot_table.phydm_patch_id = (u32)value;
2537 		break;
2538 	case ODM_CMNINFO_RRSR_VAL:
2539 		dm->dm_ra_table.rrsr_val_init = (u32)value;
2540 		break;
2541 	default:
2542 		break;
2543 	}
2544 }
2545 
phydm_cmn_info_query(struct dm_struct * dm,enum phydm_info_query info_type)2546 u32 phydm_cmn_info_query(struct dm_struct *dm, enum phydm_info_query info_type)
2547 {
2548 	struct phydm_fa_struct *fa_t = &dm->false_alm_cnt;
2549 	struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
2550 	struct ccx_info *ccx_info = &dm->dm_ccx_info;
2551 
2552 	switch (info_type) {
2553 	/*@=== [FA Relative] ===========================================*/
2554 	case PHYDM_INFO_FA_OFDM:
2555 		return fa_t->cnt_ofdm_fail;
2556 
2557 	case PHYDM_INFO_FA_CCK:
2558 		return fa_t->cnt_cck_fail;
2559 
2560 	case PHYDM_INFO_FA_TOTAL:
2561 		return fa_t->cnt_all;
2562 
2563 	case PHYDM_INFO_CCA_OFDM:
2564 		return fa_t->cnt_ofdm_cca;
2565 
2566 	case PHYDM_INFO_CCA_CCK:
2567 		return fa_t->cnt_cck_cca;
2568 
2569 	case PHYDM_INFO_CCA_ALL:
2570 		return fa_t->cnt_cca_all;
2571 
2572 	case PHYDM_INFO_CRC32_OK_VHT:
2573 		return fa_t->cnt_vht_crc32_ok;
2574 
2575 	case PHYDM_INFO_CRC32_OK_HT:
2576 		return fa_t->cnt_ht_crc32_ok;
2577 
2578 	case PHYDM_INFO_CRC32_OK_LEGACY:
2579 		return fa_t->cnt_ofdm_crc32_ok;
2580 
2581 	case PHYDM_INFO_CRC32_OK_CCK:
2582 		return fa_t->cnt_cck_crc32_ok;
2583 
2584 	case PHYDM_INFO_CRC32_ERROR_VHT:
2585 		return fa_t->cnt_vht_crc32_error;
2586 
2587 	case PHYDM_INFO_CRC32_ERROR_HT:
2588 		return fa_t->cnt_ht_crc32_error;
2589 
2590 	case PHYDM_INFO_CRC32_ERROR_LEGACY:
2591 		return fa_t->cnt_ofdm_crc32_error;
2592 
2593 	case PHYDM_INFO_CRC32_ERROR_CCK:
2594 		return fa_t->cnt_cck_crc32_error;
2595 
2596 	case PHYDM_INFO_EDCCA_FLAG:
2597 		return fa_t->edcca_flag;
2598 
2599 	case PHYDM_INFO_OFDM_ENABLE:
2600 		return fa_t->ofdm_block_enable;
2601 
2602 	case PHYDM_INFO_CCK_ENABLE:
2603 		return fa_t->cck_block_enable;
2604 
2605 	case PHYDM_INFO_DBG_PORT_0:
2606 		return fa_t->dbg_port0;
2607 
2608 	case PHYDM_INFO_CRC32_OK_HT_AGG:
2609 		return fa_t->cnt_ht_crc32_ok_agg;
2610 
2611 	case PHYDM_INFO_CRC32_ERROR_HT_AGG:
2612 		return fa_t->cnt_ht_crc32_error_agg;
2613 
2614 	/*@=== [DIG] ================================================*/
2615 
2616 	case PHYDM_INFO_CURR_IGI:
2617 		return dig_t->cur_ig_value;
2618 
2619 	/*@=== [RSSI] ===============================================*/
2620 	case PHYDM_INFO_RSSI_MIN:
2621 		return (u32)dm->rssi_min;
2622 
2623 	case PHYDM_INFO_RSSI_MAX:
2624 		return (u32)dm->rssi_max;
2625 
2626 	case PHYDM_INFO_CLM_RATIO:
2627 		return (u32)ccx_info->clm_ratio;
2628 	case PHYDM_INFO_NHM_RATIO:
2629 		return (u32)ccx_info->nhm_ratio;
2630 	default:
2631 		return 0xffffffff;
2632 	}
2633 }
2634 
2635 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
odm_init_all_work_items(struct dm_struct * dm)2636 void odm_init_all_work_items(struct dm_struct *dm)
2637 {
2638 	void *adapter = dm->adapter;
2639 #if USE_WORKITEM
2640 
2641 #ifdef CONFIG_ADAPTIVE_SOML
2642 	odm_initialize_work_item(dm,
2643 				 &dm->dm_soml_table.phydm_adaptive_soml_workitem,
2644 				 (RT_WORKITEM_CALL_BACK)phydm_adaptive_soml_workitem_callback,
2645 				 (void *)adapter,
2646 				 "AdaptiveSOMLWorkitem");
2647 #endif
2648 
2649 #ifdef ODM_EVM_ENHANCE_ANTDIV
2650 	odm_initialize_work_item(dm,
2651 				 &dm->phydm_evm_antdiv_workitem,
2652 				 (RT_WORKITEM_CALL_BACK)phydm_evm_antdiv_workitem_callback,
2653 				 (void *)adapter,
2654 				 "EvmAntdivWorkitem");
2655 #endif
2656 
2657 #ifdef CONFIG_S0S1_SW_ANTENNA_DIVERSITY
2658 	odm_initialize_work_item(dm,
2659 				 &dm->dm_swat_table.phydm_sw_antenna_switch_workitem,
2660 				 (RT_WORKITEM_CALL_BACK)odm_sw_antdiv_workitem_callback,
2661 				 (void *)adapter,
2662 				 "AntennaSwitchWorkitem");
2663 #endif
2664 #if (defined(CONFIG_HL_SMART_ANTENNA))
2665 	odm_initialize_work_item(dm,
2666 				 &dm->dm_sat_table.hl_smart_antenna_workitem,
2667 				 (RT_WORKITEM_CALL_BACK)phydm_beam_switch_workitem_callback,
2668 				 (void *)adapter,
2669 				 "hl_smart_ant_workitem");
2670 
2671 	odm_initialize_work_item(dm,
2672 				 &dm->dm_sat_table.hl_smart_antenna_decision_workitem,
2673 				 (RT_WORKITEM_CALL_BACK)phydm_beam_decision_workitem_callback,
2674 				 (void *)adapter,
2675 				 "hl_smart_ant_decision_workitem");
2676 #endif
2677 
2678 	odm_initialize_work_item(
2679 		dm,
2680 		&dm->ra_rpt_workitem,
2681 		(RT_WORKITEM_CALL_BACK)halrf_update_init_rate_work_item_callback,
2682 		(void *)adapter,
2683 		"ra_rpt_workitem");
2684 
2685 #if (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY)) || (defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))
2686 	odm_initialize_work_item(
2687 		dm,
2688 		&dm->fast_ant_training_workitem,
2689 		(RT_WORKITEM_CALL_BACK)odm_fast_ant_training_work_item_callback,
2690 		(void *)adapter,
2691 		"fast_ant_training_workitem");
2692 #endif
2693 
2694 #endif /*#if USE_WORKITEM*/
2695 
2696 #ifdef PHYDM_BEAMFORMING_SUPPORT
2697 	odm_initialize_work_item(
2698 		dm,
2699 		&dm->beamforming_info.txbf_info.txbf_enter_work_item,
2700 		(RT_WORKITEM_CALL_BACK)hal_com_txbf_enter_work_item_callback,
2701 		(void *)adapter,
2702 		"txbf_enter_work_item");
2703 
2704 	odm_initialize_work_item(
2705 		dm,
2706 		&dm->beamforming_info.txbf_info.txbf_leave_work_item,
2707 		(RT_WORKITEM_CALL_BACK)hal_com_txbf_leave_work_item_callback,
2708 		(void *)adapter,
2709 		"txbf_leave_work_item");
2710 
2711 	odm_initialize_work_item(
2712 		dm,
2713 		&dm->beamforming_info.txbf_info.txbf_fw_ndpa_work_item,
2714 		(RT_WORKITEM_CALL_BACK)hal_com_txbf_fw_ndpa_work_item_callback,
2715 		(void *)adapter,
2716 		"txbf_fw_ndpa_work_item");
2717 
2718 	odm_initialize_work_item(
2719 		dm,
2720 		&dm->beamforming_info.txbf_info.txbf_clk_work_item,
2721 		(RT_WORKITEM_CALL_BACK)hal_com_txbf_clk_work_item_callback,
2722 		(void *)adapter,
2723 		"txbf_clk_work_item");
2724 
2725 	odm_initialize_work_item(
2726 		dm,
2727 		&dm->beamforming_info.txbf_info.txbf_rate_work_item,
2728 		(RT_WORKITEM_CALL_BACK)hal_com_txbf_rate_work_item_callback,
2729 		(void *)adapter,
2730 		"txbf_rate_work_item");
2731 
2732 	odm_initialize_work_item(
2733 		dm,
2734 		&dm->beamforming_info.txbf_info.txbf_status_work_item,
2735 		(RT_WORKITEM_CALL_BACK)hal_com_txbf_status_work_item_callback,
2736 		(void *)adapter,
2737 		"txbf_status_work_item");
2738 
2739 	odm_initialize_work_item(
2740 		dm,
2741 		&dm->beamforming_info.txbf_info.txbf_reset_tx_path_work_item,
2742 		(RT_WORKITEM_CALL_BACK)hal_com_txbf_reset_tx_path_work_item_callback,
2743 		(void *)adapter,
2744 		"txbf_reset_tx_path_work_item");
2745 
2746 	odm_initialize_work_item(
2747 		dm,
2748 		&dm->beamforming_info.txbf_info.txbf_get_tx_rate_work_item,
2749 		(RT_WORKITEM_CALL_BACK)hal_com_txbf_get_tx_rate_work_item_callback,
2750 		(void *)adapter,
2751 		"txbf_get_tx_rate_work_item");
2752 #endif
2753 
2754 #if (PHYDM_LA_MODE_SUPPORT == 1)
2755 	odm_initialize_work_item(
2756 		dm,
2757 		&dm->adcsmp.adc_smp_work_item,
2758 		(RT_WORKITEM_CALL_BACK)adc_smp_work_item_callback,
2759 		(void *)adapter,
2760 		"adc_smp_work_item");
2761 
2762 	odm_initialize_work_item(
2763 		dm,
2764 		&dm->adcsmp.adc_smp_work_item_1,
2765 		(RT_WORKITEM_CALL_BACK)adc_smp_work_item_callback,
2766 		(void *)adapter,
2767 		"adc_smp_work_item_1");
2768 #endif
2769 }
2770 
odm_free_all_work_items(struct dm_struct * dm)2771 void odm_free_all_work_items(struct dm_struct *dm)
2772 {
2773 #if USE_WORKITEM
2774 
2775 #ifdef CONFIG_S0S1_SW_ANTENNA_DIVERSITY
2776 	odm_free_work_item(&dm->dm_swat_table.phydm_sw_antenna_switch_workitem);
2777 #endif
2778 
2779 #ifdef CONFIG_ADAPTIVE_SOML
2780 	odm_free_work_item(&dm->dm_soml_table.phydm_adaptive_soml_workitem);
2781 #endif
2782 
2783 #ifdef ODM_EVM_ENHANCE_ANTDIV
2784 	odm_free_work_item(&dm->phydm_evm_antdiv_workitem);
2785 #endif
2786 
2787 #if (defined(CONFIG_HL_SMART_ANTENNA))
2788 	odm_free_work_item(&dm->dm_sat_table.hl_smart_antenna_workitem);
2789 	odm_free_work_item(&dm->dm_sat_table.hl_smart_antenna_decision_workitem);
2790 #endif
2791 
2792 #if (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY)) || (defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))
2793 	odm_free_work_item(&dm->fast_ant_training_workitem);
2794 #endif
2795 	odm_free_work_item(&dm->ra_rpt_workitem);
2796 /*odm_free_work_item((&dm->sbdcnt_workitem));*/
2797 #endif
2798 
2799 #ifdef PHYDM_BEAMFORMING_SUPPORT
2800 	odm_free_work_item((&dm->beamforming_info.txbf_info.txbf_enter_work_item));
2801 	odm_free_work_item((&dm->beamforming_info.txbf_info.txbf_leave_work_item));
2802 	odm_free_work_item((&dm->beamforming_info.txbf_info.txbf_fw_ndpa_work_item));
2803 	odm_free_work_item((&dm->beamforming_info.txbf_info.txbf_clk_work_item));
2804 	odm_free_work_item((&dm->beamforming_info.txbf_info.txbf_rate_work_item));
2805 	odm_free_work_item((&dm->beamforming_info.txbf_info.txbf_status_work_item));
2806 	odm_free_work_item((&dm->beamforming_info.txbf_info.txbf_reset_tx_path_work_item));
2807 	odm_free_work_item((&dm->beamforming_info.txbf_info.txbf_get_tx_rate_work_item));
2808 #endif
2809 
2810 #if (PHYDM_LA_MODE_SUPPORT == 1)
2811 	odm_free_work_item((&dm->adcsmp.adc_smp_work_item));
2812 	odm_free_work_item((&dm->adcsmp.adc_smp_work_item_1));
2813 #endif
2814 }
2815 #endif /*#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)*/
2816 
odm_init_all_timers(struct dm_struct * dm)2817 void odm_init_all_timers(struct dm_struct *dm)
2818 {
2819 #if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY))
2820 	odm_ant_div_timers(dm, INIT_ANTDIV_TIMMER);
2821 #endif
2822 #if (defined(PHYDM_TDMA_DIG_SUPPORT))
2823 #ifdef IS_USE_NEW_TDMA
2824 	phydm_tdma_dig_timers(dm, INIT_TDMA_DIG_TIMMER);
2825 #endif
2826 #endif
2827 #ifdef CONFIG_ADAPTIVE_SOML
2828 	phydm_adaptive_soml_timers(dm, INIT_SOML_TIMMER);
2829 #endif
2830 #ifdef PHYDM_LNA_SAT_CHK_SUPPORT
2831 #ifdef PHYDM_LNA_SAT_CHK_TYPE1
2832 	phydm_lna_sat_chk_timers(dm, INIT_LNA_SAT_CHK_TIMMER);
2833 #endif
2834 #endif
2835 
2836 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
2837 	odm_initialize_timer(dm, &dm->sbdcnt_timer,
2838 			     (void *)phydm_sbd_callback, NULL, "SbdTimer");
2839 #ifdef PHYDM_BEAMFORMING_SUPPORT
2840 	odm_initialize_timer(dm, &dm->beamforming_info.txbf_info.txbf_fw_ndpa_timer,
2841 			     (void *)hal_com_txbf_fw_ndpa_timer_callback, NULL,
2842 			     "txbf_fw_ndpa_timer");
2843 #endif
2844 #endif
2845 
2846 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))
2847 #ifdef PHYDM_BEAMFORMING_SUPPORT
2848 	odm_initialize_timer(dm, &dm->beamforming_info.beamforming_timer,
2849 			     (void *)beamforming_sw_timer_callback, NULL,
2850 			     "beamforming_timer");
2851 #endif
2852 #endif
2853 }
2854 
odm_cancel_all_timers(struct dm_struct * dm)2855 void odm_cancel_all_timers(struct dm_struct *dm)
2856 {
2857 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
2858 	/* @2012/01/12 MH Temp BSOD fix. We need to find NIC allocate mem fail reason in win7*/
2859 	if (dm->adapter == NULL)
2860 		return;
2861 #endif
2862 
2863 #if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY))
2864 	odm_ant_div_timers(dm, CANCEL_ANTDIV_TIMMER);
2865 #endif
2866 #ifdef PHYDM_TDMA_DIG_SUPPORT
2867 #ifdef IS_USE_NEW_TDMA
2868 	phydm_tdma_dig_timers(dm, CANCEL_TDMA_DIG_TIMMER);
2869 #endif
2870 #endif
2871 #ifdef CONFIG_ADAPTIVE_SOML
2872 	phydm_adaptive_soml_timers(dm, CANCEL_SOML_TIMMER);
2873 #endif
2874 #ifdef PHYDM_LNA_SAT_CHK_SUPPORT
2875 #ifdef PHYDM_LNA_SAT_CHK_TYPE1
2876 	phydm_lna_sat_chk_timers(dm, CANCEL_LNA_SAT_CHK_TIMMER);
2877 #endif
2878 #endif
2879 
2880 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
2881 	odm_cancel_timer(dm, &dm->sbdcnt_timer);
2882 #ifdef PHYDM_BEAMFORMING_SUPPORT
2883 	odm_cancel_timer(dm, &dm->beamforming_info.txbf_info.txbf_fw_ndpa_timer);
2884 #endif
2885 #endif
2886 
2887 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))
2888 #ifdef PHYDM_BEAMFORMING_SUPPORT
2889 	odm_cancel_timer(dm, &dm->beamforming_info.beamforming_timer);
2890 #endif
2891 #endif
2892 }
2893 
odm_release_all_timers(struct dm_struct * dm)2894 void odm_release_all_timers(struct dm_struct *dm)
2895 {
2896 #if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY))
2897 	odm_ant_div_timers(dm, RELEASE_ANTDIV_TIMMER);
2898 #endif
2899 #ifdef PHYDM_TDMA_DIG_SUPPORT
2900 #ifdef IS_USE_NEW_TDMA
2901 	phydm_tdma_dig_timers(dm, RELEASE_TDMA_DIG_TIMMER);
2902 #endif
2903 #endif
2904 #ifdef CONFIG_ADAPTIVE_SOML
2905 	phydm_adaptive_soml_timers(dm, RELEASE_SOML_TIMMER);
2906 #endif
2907 #ifdef PHYDM_LNA_SAT_CHK_SUPPORT
2908 #ifdef PHYDM_LNA_SAT_CHK_TYPE1
2909 	phydm_lna_sat_chk_timers(dm, RELEASE_LNA_SAT_CHK_TIMMER);
2910 #endif
2911 #endif
2912 
2913 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
2914 	odm_release_timer(dm, &dm->sbdcnt_timer);
2915 #ifdef PHYDM_BEAMFORMING_SUPPORT
2916 	odm_release_timer(dm, &dm->beamforming_info.txbf_info.txbf_fw_ndpa_timer);
2917 #endif
2918 #endif
2919 
2920 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))
2921 #ifdef PHYDM_BEAMFORMING_SUPPORT
2922 	odm_release_timer(dm, &dm->beamforming_info.beamforming_timer);
2923 #endif
2924 #endif
2925 }
2926 
2927 #if (DM_ODM_SUPPORT_TYPE == ODM_AP)
odm_init_all_threads(struct dm_struct * dm)2928 void odm_init_all_threads(
2929 	struct dm_struct *dm)
2930 {
2931 #ifdef TPT_THREAD
2932 	k_tpt_task_init(dm->priv);
2933 #endif
2934 }
2935 
odm_stop_all_threads(struct dm_struct * dm)2936 void odm_stop_all_threads(
2937 	struct dm_struct *dm)
2938 {
2939 #ifdef TPT_THREAD
2940 	k_tpt_task_stop(dm->priv);
2941 #endif
2942 }
2943 #endif
2944 
2945 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
2946 /* @Justin: According to the current RRSI to adjust Response Frame TX power,
2947  * 2012/11/05
2948  */
odm_dtc(struct dm_struct * dm)2949 void odm_dtc(struct dm_struct *dm)
2950 {
2951 #ifdef CONFIG_DM_RESP_TXAGC
2952 /* RSSI higher than this value, start to decade TX power */
2953 #define DTC_BASE 35
2954 
2955 /* RSSI lower than this value, start to increase TX power */
2956 #define DTC_DWN_BASE (DTC_BASE - 5)
2957 
2958 	/* RSSI vs TX power step mapping: decade TX power */
2959 	static const u8 dtc_table_down[] = {
2960 		DTC_BASE,
2961 		(DTC_BASE + 5),
2962 		(DTC_BASE + 10),
2963 		(DTC_BASE + 15),
2964 		(DTC_BASE + 20),
2965 		(DTC_BASE + 25)};
2966 
2967 	/* RSSI vs TX power step mapping: increase TX power */
2968 	static const u8 dtc_table_up[] = {
2969 		DTC_DWN_BASE,
2970 		(DTC_DWN_BASE - 5),
2971 		(DTC_DWN_BASE - 10),
2972 		(DTC_DWN_BASE - 15),
2973 		(DTC_DWN_BASE - 15),
2974 		(DTC_DWN_BASE - 20),
2975 		(DTC_DWN_BASE - 20),
2976 		(DTC_DWN_BASE - 25),
2977 		(DTC_DWN_BASE - 25),
2978 		(DTC_DWN_BASE - 30),
2979 		(DTC_DWN_BASE - 35)};
2980 
2981 	u8 i;
2982 	u8 dtc_steps = 0;
2983 	u8 sign;
2984 	u8 resp_txagc = 0;
2985 
2986 #if 0
2987 	/* @As DIG is disabled, DTC is also disable */
2988 	if (!(dm->support_ability & ODM_XXXXXX))
2989 		return;
2990 #endif
2991 
2992 	if (dm->rssi_min > DTC_BASE) {
2993 		/* need to decade the CTS TX power */
2994 		sign = 1;
2995 		for (i = 0; i < ARRAY_SIZE(dtc_table_down); i++) {
2996 			if (dtc_table_down[i] >= dm->rssi_min || dtc_steps >= 6)
2997 				break;
2998 			else
2999 				dtc_steps++;
3000 		}
3001 	}
3002 #if 0
3003 	else if (dm->rssi_min > DTC_DWN_BASE) {
3004 		/* needs to increase the CTS TX power */
3005 		sign = 0;
3006 		dtc_steps = 1;
3007 		for (i = 0; i < ARRAY_SIZE(dtc_table_up); i++) {
3008 			if (dtc_table_up[i] <= dm->rssi_min || dtc_steps >= 10)
3009 				break;
3010 			else
3011 				dtc_steps++;
3012 		}
3013 	}
3014 #endif
3015 	else {
3016 		sign = 0;
3017 		dtc_steps = 0;
3018 	}
3019 
3020 	resp_txagc = dtc_steps | (sign << 4);
3021 	resp_txagc = resp_txagc | (resp_txagc << 5);
3022 	odm_write_1byte(dm, 0x06d9, resp_txagc);
3023 
3024 	PHYDM_DBG(dm, ODM_COMP_PWR_TRAIN,
3025 		  "%s rssi_min:%u, set RESP_TXAGC to %s %u\n", __func__,
3026 		  dm->rssi_min, sign ? "minus" : "plus", dtc_steps);
3027 #endif /* @CONFIG_RESP_TXAGC_ADJUST */
3028 }
3029 
3030 #endif /* @#if (DM_ODM_SUPPORT_TYPE == ODM_CE) */
3031 
3032 /*@<20170126, BB-Kevin>8188F D-CUT DC cancellation and 8821C*/
phydm_dc_cancellation(struct dm_struct * dm)3033 void phydm_dc_cancellation(struct dm_struct *dm)
3034 {
3035 #ifdef PHYDM_DC_CANCELLATION
3036 	u32 offset_i_hex[PHYDM_MAX_RF_PATH] = {0};
3037 	u32 offset_q_hex[PHYDM_MAX_RF_PATH] = {0};
3038 	u32 reg_value32[PHYDM_MAX_RF_PATH] = {0};
3039 	u8 path = RF_PATH_A;
3040 	u8 set_result;
3041 
3042 	if (!(dm->support_ic_type & ODM_DC_CANCELLATION_SUPPORT))
3043 		return;
3044 	if ((dm->support_ic_type & ODM_RTL8188F) &&
3045 	    dm->cut_version < ODM_CUT_D)
3046 		return;
3047 	if ((dm->support_ic_type & ODM_RTL8192F) &&
3048 	    dm->cut_version == ODM_CUT_A)
3049 		return;
3050 
3051 	PHYDM_DBG(dm, ODM_COMP_API, "%s ======>\n", __func__);
3052 
3053 	/*@DC_Estimation (only for 2x2 ic now) */
3054 
3055 	for (path = RF_PATH_A; path < PHYDM_MAX_RF_PATH; path++) {
3056 		if (path > RF_PATH_A &&
3057 		    dm->support_ic_type & (ODM_RTL8821C | ODM_RTL8188F |
3058 					  ODM_RTL8710B | ODM_RTL8721D))
3059 			break;
3060 		else if (path > RF_PATH_B &&
3061 			 dm->support_ic_type & (ODM_RTL8822B | ODM_RTL8192F))
3062 			break;
3063 		if (phydm_stop_ic_trx(dm, PHYDM_SET) == PHYDM_SET_FAIL) {
3064 			PHYDM_DBG(dm, ODM_COMP_API, "STOP_TRX_FAIL\n");
3065 			return;
3066 		}
3067 		odm_write_dig(dm, 0x7e);
3068 		/*@Disable LNA*/
3069 		if (dm->support_ic_type & ODM_RTL8821C)
3070 			halrf_rf_lna_setting(dm, HALRF_LNA_DISABLE);
3071 		/*Turn off 3-wire*/
3072 		phydm_stop_3_wire(dm, PHYDM_SET);
3073 		if (dm->support_ic_type & (ODM_RTL8188F | ODM_RTL8710B)) {
3074 			/*set debug port to 0x235*/
3075 			if (!phydm_set_bb_dbg_port(dm, DBGPORT_PRI_1, 0x235)) {
3076 				PHYDM_DBG(dm, ODM_COMP_API,
3077 					  "Set Debug port Fail\n");
3078 				return;
3079 			}
3080 		} else if (dm->support_ic_type & ODM_RTL8721D) {
3081 			/*set debug port to 0x200*/
3082 			if (!phydm_set_bb_dbg_port(dm, DBGPORT_PRI_2, 0x200)) {
3083 				PHYDM_DBG(dm, ODM_COMP_API,
3084 					  "Set Debug port Fail\n");
3085 				return;
3086 			}
3087 		} else if (dm->support_ic_type & ODM_RTL8821C) {
3088 			if (!phydm_set_bb_dbg_port(dm, DBGPORT_PRI_1, 0x200)) {
3089 				/*set debug port to 0x200*/
3090 				PHYDM_DBG(dm, ODM_COMP_API,
3091 					  "Set Debug port Fail\n");
3092 				return;
3093 			}
3094 			phydm_bb_dbg_port_header_sel(dm, 0x0);
3095 		} else if (dm->support_ic_type & ODM_RTL8822B) {
3096 			if (path == RF_PATH_A &&
3097 			    !phydm_set_bb_dbg_port(dm, DBGPORT_PRI_1, 0x200)) {
3098 				/*set debug port to 0x200*/
3099 				PHYDM_DBG(dm, ODM_COMP_API,
3100 					  "Set Debug port Fail\n");
3101 				return;
3102 			}
3103 			if (path == RF_PATH_B &&
3104 			    !phydm_set_bb_dbg_port(dm, DBGPORT_PRI_1, 0x202)) {
3105 				/*set debug port to 0x200*/
3106 				PHYDM_DBG(dm, ODM_COMP_API,
3107 					  "Set Debug port Fail\n");
3108 				return;
3109 			}
3110 			phydm_bb_dbg_port_header_sel(dm, 0x0);
3111 		} else if (dm->support_ic_type & ODM_RTL8192F) {
3112 			if (path == RF_PATH_A &&
3113 			    !phydm_set_bb_dbg_port(dm, DBGPORT_PRI_1, 0x235)) {
3114 				/*set debug port to 0x235*/
3115 				PHYDM_DBG(dm, ODM_COMP_API,
3116 					  "Set Debug port Fail\n");
3117 				return;
3118 			}
3119 			if (path == RF_PATH_B &&
3120 			    !phydm_set_bb_dbg_port(dm, DBGPORT_PRI_1, 0x23d)) {
3121 				/*set debug port to 0x23d*/
3122 				PHYDM_DBG(dm, ODM_COMP_API,
3123 					  "Set Debug port Fail\n");
3124 				return;
3125 			}
3126 		}
3127 
3128 		/*@disable CCK DCNF*/
3129 		odm_set_bb_reg(dm, R_0xa78, MASKBYTE1, 0x0);
3130 
3131 		PHYDM_DBG(dm, ODM_COMP_API, "DC cancellation Begin!!!\n");
3132 
3133 		phydm_stop_ck320(dm, true); /*stop ck320*/
3134 
3135 		/* the same debug port both for path-a and path-b*/
3136 		reg_value32[path] = phydm_get_bb_dbg_port_val(dm);
3137 
3138 		phydm_stop_ck320(dm, false); /*start ck320*/
3139 
3140 		phydm_release_bb_dbg_port(dm);
3141 		/* @Turn on 3-wire*/
3142 		phydm_stop_3_wire(dm, PHYDM_REVERT);
3143 		/* @Enable LNA*/
3144 		if (dm->support_ic_type & ODM_RTL8821C)
3145 			halrf_rf_lna_setting(dm, HALRF_LNA_ENABLE);
3146 
3147 		odm_write_dig(dm, 0x20);
3148 
3149 		set_result = phydm_stop_ic_trx(dm, PHYDM_REVERT);
3150 
3151 		PHYDM_DBG(dm, ODM_COMP_API, "DC cancellation OK!!!\n");
3152 	}
3153 
3154 	/*@DC_Cancellation*/
3155 	/*@DC compensation to CCK data path*/
3156 	odm_set_bb_reg(dm, R_0xa9c, BIT(20), 0x1);
3157 	if (dm->support_ic_type & (ODM_RTL8188F | ODM_RTL8710B)) {
3158 		offset_i_hex[0] = (reg_value32[0] & 0xffc0000) >> 18;
3159 		offset_q_hex[0] = (reg_value32[0] & 0x3ff00) >> 8;
3160 
3161 		/*@Before filling into registers,
3162 		 *offset should be multiplexed (-1)
3163 		 */
3164 		offset_i_hex[0] = (offset_i_hex[0] >= 0x200) ?
3165 				  (0x400 - offset_i_hex[0]) :
3166 				  (0x1ff - offset_i_hex[0]);
3167 		offset_q_hex[0] = (offset_q_hex[0] >= 0x200) ?
3168 				  (0x400 - offset_q_hex[0]) :
3169 				  (0x1ff - offset_q_hex[0]);
3170 
3171 		odm_set_bb_reg(dm, R_0x950, 0x1ff, offset_i_hex[0]);
3172 		odm_set_bb_reg(dm, R_0x950, 0x1ff0000, offset_q_hex[0]);
3173 	} else if (dm->support_ic_type & (ODM_RTL8821C | ODM_RTL8822B)) {
3174 		/* Path-a */
3175 		offset_i_hex[0] = (reg_value32[0] & 0xffc00) >> 10;
3176 		offset_q_hex[0] = reg_value32[0] & 0x3ff;
3177 
3178 		/*@Before filling into registers,
3179 		 *offset should be multiplexed (-1)
3180 		 */
3181 		offset_i_hex[0] = 0x400 - offset_i_hex[0];
3182 		offset_q_hex[0] = 0x400 - offset_q_hex[0];
3183 
3184 		odm_set_bb_reg(dm, R_0xc10, 0x3c000000,
3185 			       (0x3c0 & offset_i_hex[0]) >> 6);
3186 		odm_set_bb_reg(dm, R_0xc10, 0xfc00, 0x3f & offset_i_hex[0]);
3187 		odm_set_bb_reg(dm, R_0xc14, 0x3c000000,
3188 			       (0x3c0 & offset_q_hex[0]) >> 6);
3189 		odm_set_bb_reg(dm, R_0xc14, 0xfc00, 0x3f & offset_q_hex[0]);
3190 
3191 		/* Path-b */
3192 		if (dm->rf_type > RF_1T1R) {
3193 			offset_i_hex[1] = (reg_value32[1] & 0xffc00) >> 10;
3194 			offset_q_hex[1] = reg_value32[1] & 0x3ff;
3195 
3196 			/*@Before filling into registers,
3197 			 *offset should be multiplexed (-1)
3198 			 */
3199 			offset_i_hex[1] = 0x400 - offset_i_hex[1];
3200 			offset_q_hex[1] = 0x400 - offset_q_hex[1];
3201 
3202 			odm_set_bb_reg(dm, R_0xe10, 0x3c000000,
3203 				       (0x3c0 & offset_i_hex[1]) >> 6);
3204 			odm_set_bb_reg(dm, R_0xe10, 0xfc00,
3205 				       0x3f & offset_i_hex[1]);
3206 			odm_set_bb_reg(dm, R_0xe14, 0x3c000000,
3207 				       (0x3c0 & offset_q_hex[1]) >> 6);
3208 			odm_set_bb_reg(dm, R_0xe14, 0xfc00,
3209 				       0x3f & offset_q_hex[1]);
3210 		}
3211 	} else if (dm->support_ic_type & (ODM_RTL8192F)) {
3212 		/* Path-a I:df4[27:18],Q:df4[17:8]*/
3213 		offset_i_hex[0] = (reg_value32[0] & 0xffc0000) >> 18;
3214 		offset_q_hex[0] = (reg_value32[0] & 0x3ff00) >> 8;
3215 
3216 		/*@Before filling into registers,
3217 		 *offset should be multiplexed (-1)
3218 		 */
3219 		offset_i_hex[0] = (offset_i_hex[0] >= 0x200) ?
3220 				  (0x400 - offset_i_hex[0]) :
3221 				  (0xff - offset_i_hex[0]);
3222 		offset_q_hex[0] = (offset_q_hex[0] >= 0x200) ?
3223 				  (0x400 - offset_q_hex[0]) :
3224 				  (0xff - offset_q_hex[0]);
3225 		/*Path-a I:c10[7:0],Q:c10[15:8]*/
3226 		odm_set_bb_reg(dm, R_0xc10, 0xff, offset_i_hex[0]);
3227 		odm_set_bb_reg(dm, R_0xc10, 0xff00, offset_q_hex[0]);
3228 
3229 		/* Path-b */
3230 		if (dm->rf_type > RF_1T1R) {
3231 			/* @I:df4[27:18],Q:df4[17:8]*/
3232 			offset_i_hex[1] = (reg_value32[1] & 0xffc0000) >> 18;
3233 			offset_q_hex[1] = (reg_value32[1] & 0x3ff00) >> 8;
3234 
3235 			/*@Before filling into registers,
3236 			 *offset should be multiplexed (-1)
3237 			 */
3238 			offset_i_hex[1] = (offset_i_hex[1] >= 0x200) ?
3239 					  (0x400 - offset_i_hex[1]) :
3240 					  (0xff - offset_i_hex[1]);
3241 			offset_q_hex[1] = (offset_q_hex[1] >= 0x200) ?
3242 					  (0x400 - offset_q_hex[1]) :
3243 					  (0xff - offset_q_hex[1]);
3244 			/*Path-b I:c18[7:0],Q:c18[15:8]*/
3245 			odm_set_bb_reg(dm, R_0xc18, 0xff, offset_i_hex[1]);
3246 			odm_set_bb_reg(dm, R_0xc18, 0xff00, offset_q_hex[1]);
3247 		}
3248 	} else if (dm->support_ic_type & (ODM_RTL8721D)) {
3249 	 /*judy modified 20180517*/
3250 		offset_i_hex[0] = (reg_value32[0] & 0xff80000) >> 19;
3251 		offset_q_hex[0] = (reg_value32[0] & 0x3fe00) >> 9;
3252 
3253 		/*@Before filling into registers,
3254 		 *offset should be multiplexed (-1)
3255 		 */
3256 		offset_i_hex[0] = 0x200 - offset_i_hex[0];
3257 		offset_q_hex[0] = 0x200 - offset_q_hex[0];
3258 
3259 		odm_set_bb_reg(dm, R_0x950, 0x1ff, offset_i_hex[0]);
3260 		odm_set_bb_reg(dm, R_0x950, 0x1ff0000, offset_q_hex[0]);
3261 	}
3262 #endif
3263 }
3264 
phydm_receiver_blocking(void * dm_void)3265 void phydm_receiver_blocking(void *dm_void)
3266 {
3267 #ifdef CONFIG_RECEIVER_BLOCKING
3268 	struct dm_struct *dm = (struct dm_struct *)dm_void;
3269 	u32 chnl = *dm->channel;
3270 	u8 bw = *dm->band_width;
3271 	u32 bb_regf0 = odm_get_bb_reg(dm, R_0xf0, 0xf000);
3272 
3273 	if (!(dm->support_ic_type & ODM_RECEIVER_BLOCKING_SUPPORT) ||
3274 	    !(dm->support_ability & ODM_BB_ADAPTIVITY))
3275 		return;
3276 
3277 	if ((dm->support_ic_type & ODM_RTL8188E && bb_regf0 < 8) ||
3278 	    dm->support_ic_type & ODM_RTL8192E) {
3279 	    /*@8188E_T version*/
3280 		if (dm->consecutive_idlel_time <= 10 || *dm->mp_mode)
3281 			goto end;
3282 
3283 		if (bw == CHANNEL_WIDTH_20 && chnl == 1) {
3284 			phydm_nbi_setting(dm, FUNC_ENABLE, chnl, 20, 2410,
3285 					  PHYDM_DONT_CARE);
3286 			dm->is_rx_blocking_en = true;
3287 		} else if ((bw == CHANNEL_WIDTH_20) && (chnl == 13)) {
3288 			phydm_nbi_setting(dm, FUNC_ENABLE, chnl, 20, 2473,
3289 					  PHYDM_DONT_CARE);
3290 			dm->is_rx_blocking_en = true;
3291 		} else if (dm->is_rx_blocking_en && chnl != 1 && chnl != 13) {
3292 			phydm_nbi_enable(dm, FUNC_DISABLE);
3293 			odm_set_bb_reg(dm, R_0xc40, 0x1f000000, 0x1f);
3294 			dm->is_rx_blocking_en = false;
3295 		}
3296 		return;
3297 	} else if ((dm->support_ic_type & ODM_RTL8188E && bb_regf0 >= 8)) {
3298 	/*@8188E_S version*/
3299 		if (dm->consecutive_idlel_time <= 10 || *dm->mp_mode)
3300 			goto end;
3301 
3302 		if (bw == CHANNEL_WIDTH_20 && chnl == 13) {
3303 			phydm_nbi_setting(dm, FUNC_ENABLE, chnl, 20, 2473,
3304 					  PHYDM_DONT_CARE);
3305 			dm->is_rx_blocking_en = true;
3306 		} else if (dm->is_rx_blocking_en && chnl != 13) {
3307 			phydm_nbi_enable(dm, FUNC_DISABLE);
3308 			odm_set_bb_reg(dm, R_0xc40, 0x1f000000, 0x1f);
3309 			dm->is_rx_blocking_en = false;
3310 		}
3311 		return;
3312 	}
3313 
3314 end:
3315 	if (dm->is_rx_blocking_en) {
3316 		phydm_nbi_enable(dm, FUNC_DISABLE);
3317 		odm_set_bb_reg(dm, R_0xc40, 0x1f000000, 0x1f);
3318 		dm->is_rx_blocking_en = false;
3319 	}
3320 #endif
3321 }
3322