• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /******************************************************************************
2  *
3  * Copyright(c) 2014 - 2017 Realtek Corporation.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of version 2 of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12  * more details.
13  *
14  *****************************************************************************/
15 
16 #include <drv_types.h>
17 #include <hal_data.h>
18 
19 /* A mapping from HalData to ODM. */
boardType(u8 InterfaceSel)20 enum odm_board_type boardType(u8 InterfaceSel)
21 {
22 	enum odm_board_type        board	= ODM_BOARD_DEFAULT;
23 
24 #ifdef CONFIG_PCI_HCI
25 	INTERFACE_SELECT_PCIE   pcie	= (INTERFACE_SELECT_PCIE)InterfaceSel;
26 	switch (pcie) {
27 	case INTF_SEL0_SOLO_MINICARD:
28 		board |= ODM_BOARD_MINICARD;
29 		break;
30 	case INTF_SEL1_BT_COMBO_MINICARD:
31 		board |= ODM_BOARD_BT;
32 		board |= ODM_BOARD_MINICARD;
33 		break;
34 	default:
35 		board = ODM_BOARD_DEFAULT;
36 		break;
37 	}
38 
39 #elif defined(CONFIG_USB_HCI)
40 	INTERFACE_SELECT_USB    usb	= (INTERFACE_SELECT_USB)InterfaceSel;
41 	switch (usb) {
42 	case INTF_SEL1_USB_High_Power:
43 		board |= ODM_BOARD_EXT_LNA;
44 		board |= ODM_BOARD_EXT_PA;
45 		break;
46 	case INTF_SEL2_MINICARD:
47 		board |= ODM_BOARD_MINICARD;
48 		break;
49 	case INTF_SEL4_USB_Combo:
50 		board |= ODM_BOARD_BT;
51 		break;
52 	case INTF_SEL5_USB_Combo_MF:
53 		board |= ODM_BOARD_BT;
54 		break;
55 	case INTF_SEL0_USB:
56 	case INTF_SEL3_USB_Solo:
57 	default:
58 		board = ODM_BOARD_DEFAULT;
59 		break;
60 	}
61 
62 #endif
63 	/* RTW_INFO("===> boardType(): (pHalData->InterfaceSel, pDM_Odm->BoardType) = (%d, %d)\n", InterfaceSel, board); */
64 
65 	return board;
66 }
67 
rtw_hal_update_iqk_fw_offload_cap(_adapter * adapter)68 void rtw_hal_update_iqk_fw_offload_cap(_adapter *adapter)
69 {
70 	PHAL_DATA_TYPE hal = GET_HAL_DATA(adapter);
71 	struct dm_struct *p_dm_odm = adapter_to_phydm(adapter);
72 
73 	if (hal->RegIQKFWOffload) {
74 		rtw_sctx_init(&hal->iqk_sctx, 0);
75 		phydm_fwoffload_ability_init(p_dm_odm, PHYDM_RF_IQK_OFFLOAD);
76 	} else
77 		phydm_fwoffload_ability_clear(p_dm_odm, PHYDM_RF_IQK_OFFLOAD);
78 
79 	RTW_INFO("IQK FW offload:%s\n", hal->RegIQKFWOffload ? "enable" : "disable");
80 
81 	if (rtw_mi_check_status(adapter, MI_LINKED)) {
82 		#ifdef CONFIG_LPS
83 		LPS_Leave(adapter, "SWITCH_IQK_OFFLOAD");
84 		#endif
85 		halrf_iqk_trigger(p_dm_odm, _FALSE);
86 	}
87 }
88 
89 #if ((RTL8822B_SUPPORT == 1) || (RTL8821C_SUPPORT == 1) || (RTL8814B_SUPPORT == 1) || (RTL8822C_SUPPORT == 1) \
90 	|| (RTL8723F_SUPPORT == 1))
rtw_phydm_iqk_trigger(_adapter * adapter)91 void rtw_phydm_iqk_trigger(_adapter *adapter)
92 {
93 	struct dm_struct *p_dm_odm = adapter_to_phydm(adapter);
94 	u8 clear = _TRUE;
95 	u8 segment = _FALSE;
96 	u8 rfk_forbidden = _FALSE;
97 
98 	halrf_cmn_info_set(p_dm_odm, HALRF_CMNINFO_RFK_FORBIDDEN, rfk_forbidden);
99 #if (RTL8822C_SUPPORT == 1) || (RTL8814B_SUPPORT == 1) || (RTL8723F_SUPPORT == 1)
100 	/* halrf_cmn_info_set(p_dm_odm, HALRF_CMNINFO_IQK_SEGMENT, segment); to do */
101 	halrf_rf_k_connect_trigger(p_dm_odm, _TRUE, SEGMENT_FREE);
102 #else
103 	/*segment = _rtw_phydm_iqk_segment_chk(adapter);*/
104 	halrf_cmn_info_set(p_dm_odm, HALRF_CMNINFO_IQK_SEGMENT, segment);
105 	halrf_segment_iqk_trigger(p_dm_odm, clear, segment);
106 #endif
107 }
108 #endif
109 
rtw_phydm_iqk_trigger_all(_adapter * adapter)110 void rtw_phydm_iqk_trigger_all(_adapter *adapter)
111 {
112 	struct dm_struct *p_dm_odm = adapter_to_phydm(adapter);
113 	u8 clear = _TRUE;
114 	u8 segment = _FALSE;
115 	u8 rfk_forbidden = _FALSE;
116 
117 #if ((RTL8822B_SUPPORT == 1) || (RTL8821C_SUPPORT == 1) || (RTL8814B_SUPPORT == 1) || (RTL8822C_SUPPORT == 1) \
118 	|| (RTL8723F_SUPPORT == 1))
119 	halrf_cmn_info_set(p_dm_odm, HALRF_CMNINFO_RFK_FORBIDDEN, rfk_forbidden);
120 #if (RTL8822C_SUPPORT == 1) || (RTL8814B_SUPPORT == 1) || (RTL8723F_SUPPORT == 1)
121 	/* halrf_cmn_info_set(p_dm_odm, HALRF_CMNINFO_IQK_SEGMENT, segment); to do */
122 	halrf_rf_k_connect_trigger(p_dm_odm, _TRUE, SEGMENT_FREE);
123 #else
124 	/*segment = _rtw_phydm_iqk_segment_chk(adapter);*/
125 	halrf_cmn_info_set(p_dm_odm, HALRF_CMNINFO_IQK_SEGMENT, segment);
126 	halrf_segment_iqk_trigger(p_dm_odm, clear, segment);
127 #endif /* (RTL8822C_SUPPORT == 1) || (RTL8814B_SUPPORT == 1) (RTL8723F_SUPPORT == 1) */
128 #else
129 	halrf_iqk_trigger(p_dm_odm, _FALSE);
130 #endif /* ((RTL8822B_SUPPORT == 1) || (RTL8821C_SUPPORT == 1) || (RTL8814B_SUPPORT == 1) || (RTL8822C_SUPPORT == 1))
131 			(RTL8723F_SUPPORT == 1) */
132 }
133 
rtw_phydm_iqk_trigger_dbg(_adapter * adapter,bool recovery,bool clear,bool segment)134 void rtw_phydm_iqk_trigger_dbg(_adapter *adapter, bool recovery, bool clear, bool segment)
135 {
136 	struct dm_struct *p_dm_odm = adapter_to_phydm(adapter);
137 
138 #if ((RTL8822B_SUPPORT == 1) || (RTL8821C_SUPPORT == 1) || (RTL8814B_SUPPORT == 1) || (RTL8822C_SUPPORT == 1))
139 		halrf_segment_iqk_trigger(p_dm_odm, clear, segment);
140 #else
141 		halrf_iqk_trigger(p_dm_odm, recovery);
142 #endif
143 }
rtw_phydm_lck_trigger(_adapter * adapter)144 void rtw_phydm_lck_trigger(_adapter *adapter)
145 {
146 	struct dm_struct *p_dm_odm = adapter_to_phydm(adapter);
147 
148 	halrf_lck_trigger(p_dm_odm);
149 }
150 
rtw_hal_phydm_cal_trigger(_adapter * adapter)151 void rtw_hal_phydm_cal_trigger(_adapter *adapter)
152 {
153 	struct dm_struct *p_dm_odm = adapter_to_phydm(adapter);
154 
155 	rtw_ps_deny(adapter, PS_DENY_IOCTL);
156 	LeaveAllPowerSaveModeDirect(adapter);
157 
158 	rtw_phydm_iqk_trigger_all(adapter);
159 
160 	rtw_ps_deny_cancel(adapter, PS_DENY_IOCTL);
161 }
162 
163 #ifdef CONFIG_DBG_RF_CAL
rtw_hal_iqk_test(_adapter * adapter,bool recovery,bool clear,bool segment)164 void rtw_hal_iqk_test(_adapter *adapter, bool recovery, bool clear, bool segment)
165 {
166 	struct dm_struct *p_dm_odm = adapter_to_phydm(adapter);
167 
168 	rtw_ps_deny(adapter, PS_DENY_IOCTL);
169 	LeaveAllPowerSaveModeDirect(adapter);
170 
171 	rtw_phydm_ability_backup(adapter);
172 	rtw_phydm_func_disable_all(adapter);
173 
174 	halrf_cmn_info_set(p_dm_odm, HALRF_CMNINFO_ABILITY, HAL_RF_IQK);
175 
176 	rtw_phydm_iqk_trigger_dbg(adapter, recovery, clear, segment);
177 	rtw_phydm_ability_restore(adapter);
178 
179 	rtw_ps_deny_cancel(adapter, PS_DENY_IOCTL);
180 }
181 
rtw_hal_lck_test(_adapter * adapter)182 void rtw_hal_lck_test(_adapter *adapter)
183 {
184 	struct dm_struct *p_dm_odm = adapter_to_phydm(adapter);
185 
186 	rtw_ps_deny(adapter, PS_DENY_IOCTL);
187 	LeaveAllPowerSaveModeDirect(adapter);
188 
189 	rtw_phydm_ability_backup(adapter);
190 	rtw_phydm_func_disable_all(adapter);
191 
192 	halrf_cmn_info_set(p_dm_odm, HALRF_CMNINFO_ABILITY, HAL_RF_LCK);
193 
194 	rtw_phydm_lck_trigger(adapter);
195 
196 	rtw_phydm_ability_restore(adapter);
197 	rtw_ps_deny_cancel(adapter, PS_DENY_IOCTL);
198 }
199 #endif
200 
201 #ifdef CONFIG_FW_OFFLOAD_PARAM_INIT
rtw_hal_update_param_init_fw_offload_cap(_adapter * adapter)202 void rtw_hal_update_param_init_fw_offload_cap(_adapter *adapter)
203 {
204 	struct dm_struct *p_dm_odm = adapter_to_phydm(adapter);
205 
206 	if (adapter->registrypriv.fw_param_init)
207 		phydm_fwoffload_ability_init(p_dm_odm, PHYDM_PHY_PARAM_OFFLOAD);
208 	else
209 		phydm_fwoffload_ability_clear(p_dm_odm, PHYDM_PHY_PARAM_OFFLOAD);
210 
211 	RTW_INFO("Init-Parameter FW offload:%s\n", adapter->registrypriv.fw_param_init ? "enable" : "disable");
212 }
213 #endif
214 
record_ra_info(void * p_dm_void,u8 macid,struct cmn_sta_info * p_sta,u64 ra_mask)215 void record_ra_info(void *p_dm_void, u8 macid, struct cmn_sta_info *p_sta, u64 ra_mask)
216 {
217 	struct dm_struct *p_dm = (struct dm_struct *)p_dm_void;
218 	_adapter *adapter = p_dm->adapter;
219 	struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
220 	struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);
221 
222 	if (p_sta) {
223 		rtw_macid_ctl_set_bw(macid_ctl, macid, p_sta->ra_info.ra_bw_mode);
224 		rtw_macid_ctl_set_vht_en(macid_ctl, macid, p_sta->ra_info.is_vht_enable);
225 		rtw_macid_ctl_set_rate_bmp0(macid_ctl, macid, ra_mask);
226 		rtw_macid_ctl_set_rate_bmp1(macid_ctl, macid, ra_mask >> 32);
227 
228 		rtw_update_tx_rate_bmp(adapter_to_dvobj(adapter));
229 	}
230 }
231 
232 #ifdef CONFIG_SUPPORT_DYNAMIC_TXPWR
rtw_phydm_fill_desc_dpt(void * dm,u8 * desc,u8 dpt_lv)233 void rtw_phydm_fill_desc_dpt(void *dm, u8 *desc, u8 dpt_lv)
234 {
235 	struct dm_struct *p_dm = (struct dm_struct *)dm;
236 	_adapter *adapter = p_dm->adapter;
237 
238 	switch (rtw_get_chip_type(adapter)) {
239 /*
240 	#ifdef CONFIG_RTL8188F
241 	case RTL8188F:
242 		break;
243 	#endif
244 
245 	#ifdef CONFIG_RTL8723B
246 	case RTL8723B :
247 		break;
248 	#endif
249 
250 	#ifdef CONFIG_RTL8703B
251 	case RTL8703B :
252 		break;
253 	#endif
254 
255 	#ifdef CONFIG_RTL8812A
256 	case RTL8812 :
257 		break;
258 	#endif
259 
260 	#ifdef CONFIG_RTL8821A
261 	case RTL8821:
262 		break;
263 	#endif
264 
265 	#ifdef CONFIG_RTL8814A
266 	case RTL8814A :
267 		break;
268 	#endif
269 
270 	#ifdef CONFIG_RTL8192F
271 	case RTL8192F :
272 		break;
273 	#endif
274 */
275 /*
276 	#ifdef CONFIG_RTL8192E
277 	case RTL8192E :
278 		SET_TX_DESC_TX_POWER_0_PSET_92E(desc, dpt_lv);
279 		break;
280 	#endif
281 */
282 	#ifdef CONFIG_RTL8822B
283 	case RTL8822B :
284 		SET_TX_DESC_TXPWR_OFSET_8822B(desc, dpt_lv);
285 	break;
286 	#endif
287 
288 	#ifdef CONFIG_RTL8821C
289 	case RTL8821C :
290 		SET_TX_DESC_TXPWR_OFSET_8821C(desc, dpt_lv);
291 	break;
292 	#endif
293 
294 	default :
295 		RTW_ERR("%s IC not support dynamic tx power\n", __func__);
296 		break;
297 	}
298 }
rtw_phydm_set_dyntxpwr(_adapter * adapter,u8 * desc,u8 mac_id)299 void rtw_phydm_set_dyntxpwr(_adapter *adapter, u8 *desc, u8 mac_id)
300 {
301 	struct dm_struct *dm = adapter_to_phydm(adapter);
302 
303 	odm_set_dyntxpwr(dm, desc, mac_id);
304 }
305 #endif
306 
307 #ifdef CONFIG_TDMADIG
rtw_phydm_tdmadig(_adapter * adapter,u8 state)308 void rtw_phydm_tdmadig(_adapter *adapter, u8 state)
309 {
310 	struct registry_priv	*pregistrypriv = &adapter->registrypriv;
311 	struct mlme_priv		*pmlmepriv = &(adapter->mlmepriv);
312 	struct dm_struct *dm = adapter_to_phydm(adapter);
313 	u8 tdma_dig_en;
314 
315 	switch (state) {
316 	case TDMADIG_INIT:
317 		phydm_tdma_dig_para_upd(dm, ENABLE_TDMA, pregistrypriv->tdmadig_en);
318 		phydm_tdma_dig_para_upd(dm, MODE_DECISION, pregistrypriv->tdmadig_mode);
319 		break;
320 	case TDMADIG_NON_INIT:
321 		if(pregistrypriv->tdmadig_dynamic) {
322 			if(pmlmepriv->LinkDetectInfo.bBusyTraffic == _TRUE)
323 				tdma_dig_en = 0;
324 			else
325 				tdma_dig_en = pregistrypriv->tdmadig_en;
326 			phydm_tdma_dig_para_upd(dm, ENABLE_TDMA, tdma_dig_en);
327 		}
328 		break;
329 	default:
330 		break;
331 
332 	}
333 }
334 #endif/*CONFIG_TDMADIG*/
rtw_phydm_ops_func_init(struct dm_struct * p_phydm)335 void rtw_phydm_ops_func_init(struct dm_struct *p_phydm)
336 {
337 	struct ra_table *p_ra_t = &p_phydm->dm_ra_table;
338 
339 	p_ra_t->record_ra_info = record_ra_info;
340 	#ifdef CONFIG_SUPPORT_DYNAMIC_TXPWR
341 	p_phydm->fill_desc_dyntxpwr = rtw_phydm_fill_desc_dpt;
342 	#endif
343 }
rtw_phydm_priv_init(_adapter * adapter)344 void rtw_phydm_priv_init(_adapter *adapter)
345 {
346 	PHAL_DATA_TYPE hal = GET_HAL_DATA(adapter);
347 	struct dm_struct *phydm = &(hal->odmpriv);
348 
349 	phydm->adapter = adapter;
350 	odm_cmn_info_init(phydm, ODM_CMNINFO_PLATFORM, ODM_CE);
351 }
352 
Init_ODM_ComInfo(_adapter * adapter)353 void Init_ODM_ComInfo(_adapter *adapter)
354 {
355 	struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
356 	PHAL_DATA_TYPE	pHalData = GET_HAL_DATA(adapter);
357 	struct dm_struct	*pDM_Odm = &(pHalData->odmpriv);
358 	struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(adapter);
359 	struct rf_ctl_t *rfctl = dvobj_to_rfctl(dvobj);
360 	int i;
361 
362 	/*phydm_op_mode could be change for different scenarios: ex: SoftAP - PHYDM_BALANCE_MODE*/
363 	pHalData->phydm_op_mode = PHYDM_PERFORMANCE_MODE;/*Service one device*/
364 	rtw_odm_init_ic_type(adapter);
365 
366 	if (rtw_get_intf_type(adapter) == RTW_GSPI)
367 		odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_INTERFACE, ODM_ITRF_SDIO);
368 	else
369 		odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_INTERFACE, rtw_get_intf_type(adapter));
370 
371 	odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_MP_TEST_CHIP, IS_NORMAL_CHIP(pHalData->version_id));
372 
373 	odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_PATCH_ID, pHalData->CustomerID);
374 
375 	odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_BWIFI_TEST, adapter->registrypriv.wifi_spec);
376 
377 #ifdef CONFIG_ADVANCE_OTA
378 	odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_ADVANCE_OTA, adapter->registrypriv.adv_ota);
379 #endif
380 	odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_RF_TYPE, pHalData->rf_type);
381 
382 	{
383 		/* 1 ======= BoardType: ODM_CMNINFO_BOARD_TYPE ======= */
384 		u8 odm_board_type = ODM_BOARD_DEFAULT;
385 
386 		if (pHalData->ExternalLNA_2G != 0) {
387 			odm_board_type |= ODM_BOARD_EXT_LNA;
388 			odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_EXT_LNA, 1);
389 		}
390 		if (pHalData->external_lna_5g != 0) {
391 			odm_board_type |= ODM_BOARD_EXT_LNA_5G;
392 			odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_5G_EXT_LNA, 1);
393 		}
394 		if (pHalData->ExternalPA_2G != 0) {
395 			odm_board_type |= ODM_BOARD_EXT_PA;
396 			odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_EXT_PA, 1);
397 		}
398 		if (pHalData->external_pa_5g != 0) {
399 			odm_board_type |= ODM_BOARD_EXT_PA_5G;
400 			odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_5G_EXT_PA, 1);
401 		}
402 		if (pHalData->EEPROMBluetoothCoexist)
403 			odm_board_type |= ODM_BOARD_BT;
404 
405 		odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_BOARD_TYPE, odm_board_type);
406 		/* 1 ============== End of BoardType ============== */
407 	}
408 
409 #ifdef CONFIG_DFS_MASTER
410 	rtw_odm_update_dfs_region(dvobj);
411 	odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_DFS_MASTER_ENABLE, &(adapter_to_rfctl(adapter)->radar_detect_enabled));
412 #endif
413 
414 	odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_GPA, pHalData->TypeGPA);
415 	odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_APA, pHalData->TypeAPA);
416 	odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_GLNA, pHalData->TypeGLNA);
417 	odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_ALNA, pHalData->TypeALNA);
418 
419 	odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_RFE_TYPE, pHalData->rfe_type);
420 	odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_X_CAP_SETTING, pHalData->crystal_cap);
421 
422 	odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_EXT_TRSW, 0);
423 
424 	/*Add by YuChen for kfree init*/
425 	odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_REGRFKFREEENABLE, adapter->registrypriv.RegPwrTrimEnable);
426 	odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_RFKFREEENABLE, pHalData->RfKFreeEnable);
427 
428 	odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_RF_ANTENNA_TYPE, pHalData->TRxAntDivType);
429 	odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_BE_FIX_TX_ANT, pHalData->b_fix_tx_ant);
430 	odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_WITH_EXT_ANTENNA_SWITCH, pHalData->with_extenal_ant_switch);
431 
432 	/* (8822B) efuse 0x3D7 & 0x3D8 for TX PA bias */
433 	odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_EFUSE0X3D7, pHalData->efuse0x3d7);
434 	odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_EFUSE0X3D8, pHalData->efuse0x3d8);
435 
436 	odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_EN_NBI_DETECT, adapter->registrypriv.nbi_en);
437 
438 	/* waiting for PhyDMV034 support*/
439 	odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_MANUAL_SUPPORTABILITY, &(adapter->registrypriv.phydm_ability));
440 
441 	/*Add by YuChen for adaptivity init*/
442 	odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_ADAPTIVITY, &rfctl->adaptivity_en);
443 	phydm_adaptivity_info_init(pDM_Odm, PHYDM_ADAPINFO_TH_L2H_INI, adapter->registrypriv.adaptivity_th_l2h_ini);
444 	phydm_adaptivity_info_init(pDM_Odm, PHYDM_ADAPINFO_TH_EDCCA_HL_DIFF, adapter->registrypriv.adaptivity_th_edcca_hl_diff);
445 	rtw_odm_adaptivity_update(dvobj);
446 
447 	/*halrf info init*/
448 	halrf_cmn_info_init(pDM_Odm, HALRF_CMNINFO_EEPROM_THERMAL_VALUE, pHalData->eeprom_thermal_meter);
449 	halrf_cmn_info_init(pDM_Odm, HALRF_CMNINFO_PWT_TYPE, 0);
450 	halrf_cmn_info_init(pDM_Odm, HALRF_CMNINFO_MP_POWER_TRACKING_TYPE, pHalData->txpwr_pg_mode);
451 
452 	if (rtw_odm_adaptivity_needed(adapter) == _TRUE)
453 		rtw_odm_adaptivity_config_msg(RTW_DBGDUMP, adapter);
454 
455 #ifdef CONFIG_IQK_PA_OFF
456 	odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_IQKPAOFF, 1);
457 #endif
458 	rtw_hal_update_iqk_fw_offload_cap(adapter);
459 	#ifdef CONFIG_FW_OFFLOAD_PARAM_INIT
460 	rtw_hal_update_param_init_fw_offload_cap(adapter);
461 	#endif
462 
463 	/* Pointer reference */
464 	/*Antenna diversity relative parameters*/
465 	odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_ANT_DIV, &(pHalData->AntDivCfg));
466 	odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_MP_MODE, &(adapter->registrypriv.mp_mode));
467 
468 	odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_BB_OPERATION_MODE, &(pHalData->phydm_op_mode));
469 	odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_TX_UNI, &(dvobj->traffic_stat.tx_bytes));
470 	odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_RX_UNI, &(dvobj->traffic_stat.rx_bytes));
471 
472 	odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_BAND, &(pHalData->current_band_type));
473 	odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_FORCED_RATE, &(pHalData->ForcedDataRate));
474 
475 	odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_SEC_CHNL_OFFSET, &(pHalData->nCur40MhzPrimeSC));
476 	odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_SEC_MODE, &(adapter->securitypriv.dot11PrivacyAlgrthm));
477 #ifdef CONFIG_NARROWBAND_SUPPORTING
478 	if ((adapter->registrypriv.rtw_nb_config == RTW_NB_CONFIG_WIDTH_10)
479 		|| (adapter->registrypriv.rtw_nb_config == RTW_NB_CONFIG_WIDTH_5)) {
480 		odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_BW, &(adapter->registrypriv.rtw_nb_config));
481 	}
482 	else
483 #endif
484 	odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_BW, &(pHalData->current_channel_bw));
485 	odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_CHNL, &(pHalData->current_channel));
486 	odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_NET_CLOSED, &(adapter->net_closed));
487 
488 	odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_SCAN, &(pHalData->bScanInProcess));
489 	odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_POWER_SAVING, &(pwrctl->bpower_saving));
490 	/*Add by Yuchen for phydm beamforming*/
491 	odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_TX_TP, &(dvobj->traffic_stat.cur_tx_tp));
492 	odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_RX_TP, &(dvobj->traffic_stat.cur_rx_tp));
493 	odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_ANT_TEST, &(pHalData->antenna_test));
494 #ifdef CONFIG_RTL8723B
495 	odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_IS1ANTENNA, &pHalData->EEPROMBluetoothAntNum);
496 	odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_RFDEFAULTPATH, &pHalData->ant_path);
497 #endif /*CONFIG_RTL8723B*/
498 #ifdef CONFIG_USB_HCI
499 	odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_HUBUSBMODE, &(dvobj->usb_speed));
500 #endif
501 
502 #ifdef CONFIG_DYNAMIC_SOML
503 	odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_ADAPTIVE_SOML, &(adapter->registrypriv.dyn_soml_en));
504 #endif
505 #ifdef CONFIG_RTW_PATH_DIV
506 	odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_PATH_DIV, &(adapter->registrypriv.path_div));
507 #endif
508 	odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_FCS_MODE, &(pHalData->multi_ch_switch_mode));
509 
510 	/*halrf info hook*/
511 	/* waiting for PhyDMV034 support*/
512 	halrf_cmn_info_hook(pDM_Odm, HALRF_CMNINFO_MANUAL_RF_SUPPORTABILITY, &(adapter->registrypriv.halrf_ability));
513 #ifdef CONFIG_MP_INCLUDED
514 	halrf_cmn_info_hook(pDM_Odm, HALRF_CMNINFO_CON_TX, &(adapter->mppriv.mpt_ctx.is_start_cont_tx));
515 	halrf_cmn_info_hook(pDM_Odm, HALRF_CMNINFO_SINGLE_TONE, &(adapter->mppriv.mpt_ctx.is_single_tone));
516 	halrf_cmn_info_hook(pDM_Odm, HALRF_CMNINFO_CARRIER_SUPPRESSION, &(adapter->mppriv.mpt_ctx.is_carrier_suppression));
517 	halrf_cmn_info_hook(pDM_Odm, HALRF_CMNINFO_MP_RATE_INDEX, &(adapter->mppriv.mpt_ctx.mpt_rate_index));
518 #endif/*CONFIG_MP_INCLUDED*/
519 	for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)
520 		phydm_cmn_sta_info_hook(pDM_Odm, i, NULL);
521 
522 	rtw_phydm_ops_func_init(pDM_Odm);
523 	phydm_dm_early_init(pDM_Odm);
524 	/* TODO */
525 	/* odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_BT_OPERATION, _FALSE); */
526 	/* odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_BT_DISABLE_EDCA, _FALSE); */
527 }
528 
529 
530 static u32 edca_setting_UL[HT_IOT_PEER_MAX] =
531 /*UNKNOWN, REALTEK_90, REALTEK_92SE, BROADCOM,*/
532 /*RALINK, ATHEROS, CISCO, MERU, MARVELL, 92U_AP, SELF_AP(DownLink/Tx) */
533 { 0x5e4322, 0xa44f, 0x5e4322, 0x5ea32b, 0x5ea422, 0x5ea322, 0x3ea430, 0x5ea42b, 0x5ea44f, 0x5e4322, 0x5e4322};
534 
535 static u32 edca_setting_DL[HT_IOT_PEER_MAX] =
536 /*UNKNOWN, REALTEK_90, REALTEK_92SE, BROADCOM,*/
537 /*RALINK, ATHEROS, CISCO, MERU, MARVELL, 92U_AP, SELF_AP(UpLink/Rx)*/
538 { 0xa44f, 0x5ea44f,	 0x5e4322, 0x5ea42b, 0xa44f, 0xa630, 0x5ea630, 0x5ea42b, 0xa44f, 0xa42b, 0xa42b};
539 
540 static u32 edca_setting_dl_g_mode[HT_IOT_PEER_MAX] =
541 /*UNKNOWN, REALTEK_90, REALTEK_92SE, BROADCOM,*/
542 /*RALINK, ATHEROS, CISCO, MERU, MARVELL, 92U_AP, SELF_AP */
543 { 0x4322, 0xa44f, 0x5e4322, 0xa42b, 0x5e4322, 0x4322,	 0xa42b, 0x5ea42b, 0xa44f, 0x5e4322, 0x5ea42b};
544 
545 
546 struct turbo_edca_setting{
547 	u32 edca_ul; /* uplink, tx */
548 	u32 edca_dl; /* downlink, rx */
549 };
550 
551 #define TURBO_EDCA_ENT(UL, DL) {UL, DL}
552 
553 #if 0
554 #define TURBO_EDCA_MODE_NUM 18
555 static struct turbo_edca_setting rtw_turbo_edca[TURBO_EDCA_MODE_NUM] = {
556 	TURBO_EDCA_ENT(0xa42b, 0xa42b), /* mode 0 */
557 	TURBO_EDCA_ENT(0x431c, 0x431c), /* mode 1 */
558 	TURBO_EDCA_ENT(0x4319, 0x4319), /* mode 2 */
559 
560 	TURBO_EDCA_ENT(0x5ea42b, 0x5ea42b), /* mode 3 */
561 	TURBO_EDCA_ENT(0x5e431c, 0x5e431c), /* mode 4 */
562 	TURBO_EDCA_ENT(0x5e4319, 0x5e4319), /* mode 5 */
563 
564 	TURBO_EDCA_ENT(0x6ea42b, 0x6ea42b), /* mode 6 */
565 	TURBO_EDCA_ENT(0x6e431c, 0x6e431c), /* mode 7 */
566 	TURBO_EDCA_ENT(0x6e4319, 0x6e4319), /* mode 8 */
567 
568 	TURBO_EDCA_ENT(0x5ea42b, 0xa42b), /* mode 9 */
569 	TURBO_EDCA_ENT(0x5e431c, 0x431c), /* mode 10 */
570 	TURBO_EDCA_ENT(0x5e4319, 0x4319), /* mode 11 */
571 
572 	TURBO_EDCA_ENT(0x6ea42b, 0xa42b), /* mode 12 */
573 	TURBO_EDCA_ENT(0x6e431c, 0x431c), /* mode 13 */
574 	TURBO_EDCA_ENT(0x6e4319, 0x4319), /* mode 14 */
575 
576 	TURBO_EDCA_ENT(0x431c, 0x5e431c), /* mode 15 */
577 
578 	TURBO_EDCA_ENT(0xa42b, 0x5ea42b), /* mode 16 */
579 
580 	TURBO_EDCA_ENT(0x138642b, 0x431c), /* mode 17 */
581 };
582 #else
583 #define TURBO_EDCA_MODE_NUM 8
584 static struct turbo_edca_setting rtw_turbo_edca[TURBO_EDCA_MODE_NUM] = {
585 	/* { UL, DL } */
586 	TURBO_EDCA_ENT(0x5e431c, 0x431c), /* mode 0 */
587 
588 	TURBO_EDCA_ENT(0x431c, 0x431c), /* mode 1 */
589 
590 	TURBO_EDCA_ENT(0x5e431c, 0x5e431c), /* mode 2 */
591 
592 	TURBO_EDCA_ENT(0x5ea42b, 0x5ea42b), /* mode 3 */
593 
594 	TURBO_EDCA_ENT(0x5ea42b, 0x431c), /* mode 4 */
595 
596 	TURBO_EDCA_ENT(0x6ea42b, 0x6ea42b), /* mode 5 */
597 
598 	TURBO_EDCA_ENT(0xa42b, 0xa42b), /* mode 6 */
599 
600 	TURBO_EDCA_ENT(0x5e431c, 0xa42b), /* mode 7 */
601 };
602 #endif
603 
rtw_hal_turbo_edca(_adapter * adapter)604 void rtw_hal_turbo_edca(_adapter *adapter)
605 {
606 	HAL_DATA_TYPE		*hal_data = GET_HAL_DATA(adapter);
607 	struct dvobj_priv		*dvobj = adapter_to_dvobj(adapter);
608 	struct recv_priv		*precvpriv = &(adapter->recvpriv);
609 	struct registry_priv		*pregpriv = &adapter->registrypriv;
610 	struct mlme_ext_priv	*pmlmeext = &(adapter->mlmeextpriv);
611 	struct mlme_ext_info	*pmlmeinfo = &(pmlmeext->mlmext_info);
612 
613 	/* Parameter suggested by Scott  */
614 #if 0
615 	u32	EDCA_BE_UL = edca_setting_UL[p_mgnt_info->iot_peer];
616 	u32	EDCA_BE_DL = edca_setting_DL[p_mgnt_info->iot_peer];
617 #endif
618 	u32	EDCA_BE_UL = 0x5ea42b;
619 	u32	EDCA_BE_DL = 0x00a42b;
620 	u8	ic_type = rtw_get_chip_type(adapter);
621 
622 	u8	iot_peer = 0;
623 	u8	wireless_mode = 0xFF;                 /* invalid value */
624 	u8	traffic_index;
625 	u32	edca_param;
626 	u64	cur_tx_bytes = 0;
627 	u64	cur_rx_bytes = 0;
628 	u8	bbtchange = _TRUE;
629 	u8	is_bias_on_rx = _FALSE;
630 	u8	is_linked = _FALSE;
631 	u8	interface_type;
632 
633 	if (hal_data->dis_turboedca == 1)
634 		return;
635 
636 	if (rtw_mi_check_status(adapter, MI_ASSOC))
637 		is_linked = _TRUE;
638 
639 	if (is_linked != _TRUE) {
640 		precvpriv->is_any_non_be_pkts = _FALSE;
641 		return;
642 	}
643 
644 	if (pregpriv->wifi_spec == 1) { /* || (pmlmeinfo->HT_enable == 0)) */
645 		precvpriv->is_any_non_be_pkts = _FALSE;
646 		return;
647 	}
648 
649 	interface_type = rtw_get_intf_type(adapter);
650 	wireless_mode = pmlmeext->cur_wireless_mode;
651 
652 	iot_peer = pmlmeinfo->assoc_AP_vendor;
653 
654 	if (iot_peer >=  HT_IOT_PEER_MAX) {
655 		precvpriv->is_any_non_be_pkts = _FALSE;
656 		return;
657 	}
658 
659 	if (ic_type == RTL8188E) {
660 		if ((iot_peer == HT_IOT_PEER_RALINK) || (iot_peer == HT_IOT_PEER_ATHEROS))
661 			is_bias_on_rx = _TRUE;
662 	}
663 
664 	/* Check if the status needs to be changed. */
665 	if ((bbtchange) || (!precvpriv->is_any_non_be_pkts)) {
666 		cur_tx_bytes = dvobj->traffic_stat.cur_tx_bytes;
667 		cur_rx_bytes = dvobj->traffic_stat.cur_rx_bytes;
668 
669 		/* traffic, TX or RX */
670 		if (is_bias_on_rx) {
671 			if (cur_tx_bytes > (cur_rx_bytes << 2)) {
672 				/* Uplink TP is present. */
673 				traffic_index = UP_LINK;
674 			} else {
675 				/* Balance TP is present. */
676 				traffic_index = DOWN_LINK;
677 			}
678 		} else {
679 			if (cur_rx_bytes > (cur_tx_bytes << 2)) {
680 				/* Downlink TP is present. */
681 				traffic_index = DOWN_LINK;
682 			} else {
683 				/* Balance TP is present. */
684 				traffic_index = UP_LINK;
685 			}
686 		}
687 #if 0
688 		if ((p_dm_odm->dm_edca_table.prv_traffic_idx != traffic_index)
689 			|| (!p_dm_odm->dm_edca_table.is_current_turbo_edca))
690 #endif
691 		{
692 			if (interface_type == RTW_PCIE) {
693 				EDCA_BE_UL = 0x6ea42b;
694 				EDCA_BE_DL = 0x6ea42b;
695 			}
696 
697 			/* 92D txop can't be set to 0x3e for cisco1250 */
698 			if ((iot_peer == HT_IOT_PEER_CISCO) && (wireless_mode == ODM_WM_N24G)) {
699 				EDCA_BE_DL = edca_setting_DL[iot_peer];
700 				EDCA_BE_UL = edca_setting_UL[iot_peer];
701 			}
702 			/* merge from 92s_92c_merge temp*/
703 			else if ((iot_peer == HT_IOT_PEER_CISCO) && ((wireless_mode == ODM_WM_G) || (wireless_mode == (ODM_WM_B | ODM_WM_G)) || (wireless_mode == ODM_WM_A) || (wireless_mode == ODM_WM_B)))
704 				EDCA_BE_DL = edca_setting_dl_g_mode[iot_peer];
705 			else if ((iot_peer == HT_IOT_PEER_AIRGO) && ((wireless_mode == ODM_WM_G) || (wireless_mode == ODM_WM_A)))
706 				EDCA_BE_DL = 0xa630;
707 			else if (iot_peer == HT_IOT_PEER_MARVELL) {
708 				EDCA_BE_DL = edca_setting_DL[iot_peer];
709 				EDCA_BE_UL = edca_setting_UL[iot_peer];
710 			} else if (iot_peer == HT_IOT_PEER_ATHEROS) {
711 				/* Set DL EDCA for Atheros peer to 0x3ea42b.*/
712 				/* Suggested by SD3 Wilson for ASUS TP issue.*/
713 				EDCA_BE_DL = edca_setting_DL[iot_peer];
714 			}
715 
716 			if ((ic_type == RTL8812) || (ic_type == RTL8821) || (ic_type == RTL8192E) || (ic_type == RTL8192F)) { /* add 8812AU/8812AE */
717 				EDCA_BE_UL = 0x5ea42b;
718 				EDCA_BE_DL = 0x5ea42b;
719 
720 				RTW_DBG("8812A: EDCA_BE_UL=0x%x EDCA_BE_DL =0x%x\n", EDCA_BE_UL, EDCA_BE_DL);
721 			}
722 
723 			if (interface_type == RTW_PCIE &&
724 				((ic_type == RTL8822B)
725 				|| (ic_type == RTL8822C)
726 				|| (ic_type == RTL8814A) || (ic_type == RTL8814B))) {
727 				EDCA_BE_UL = 0x6ea42b;
728 				EDCA_BE_DL = 0x6ea42b;
729 			}
730 
731 			if ((ic_type == RTL8822B)
732 			    && (interface_type == RTW_SDIO))
733 				EDCA_BE_DL = 0x00431c;
734 
735 #ifdef CONFIG_RTW_TPT_MODE
736 			if ( dvobj->tpt_mode > 0 ) {
737 				EDCA_BE_UL = dvobj->edca_be_ul;
738 				EDCA_BE_DL = dvobj->edca_be_dl;
739 			}
740 #endif /* CONFIG_RTW_TPT_MODE */
741 
742 			/* keep this condition at last check */
743 			if (hal_data->dis_turboedca == 2) {
744 
745 					if (hal_data->edca_param_mode < TURBO_EDCA_MODE_NUM) {
746 
747 						struct turbo_edca_setting param;
748 
749 						param = rtw_turbo_edca[hal_data->edca_param_mode];
750 
751 						EDCA_BE_UL = param.edca_ul;
752 						EDCA_BE_DL = param.edca_dl;
753 
754 					} else {
755 
756 						EDCA_BE_UL = hal_data->edca_param_mode;
757 						EDCA_BE_DL = hal_data->edca_param_mode;
758 					}
759 			}
760 
761 			if (traffic_index == DOWN_LINK)
762 				edca_param = EDCA_BE_DL;
763 			else
764 				edca_param = EDCA_BE_UL;
765 
766 #ifdef CONFIG_EXTEND_LOWRATE_TXOP
767 #define TXOP_CCK1M			0x01A6
768 #define TXOP_CCK2M			0x00E6
769 #define TXOP_CCK5M			0x006B
770 #define TXOP_OFD6M			0x0066
771 #define TXOP_MCS6M			0x0061
772 {
773 			struct sta_info *psta;
774 			struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);
775 			u8 mac_id, role, current_rate_id;
776 
777 			/*	search all used & connect2AP macid	*/
778 			for (mac_id = 0; mac_id < macid_ctl->num; mac_id++) {
779 				if (rtw_macid_is_used(macid_ctl, mac_id))  {
780 					role = GET_H2CCMD_MSRRPT_PARM_ROLE(&(macid_ctl->h2c_msr[mac_id]));
781 					if (role != H2C_MSR_ROLE_AP)
782 						continue;
783 
784 					psta = macid_ctl->sta[mac_id];
785 					current_rate_id = rtw_get_current_tx_rate(adapter, psta);
786 					/*  Check init tx_rate==1M and set 0x508[31:16]==0x019B(unit 32us) if it is 	*/
787 					switch (current_rate_id) {
788 						case DESC_RATE1M:
789 							edca_param &= 0x0000FFFF;
790 							edca_param |= (TXOP_CCK1M<<16);
791 							break;
792 						case DESC_RATE2M:
793 							edca_param &= 0x0000FFFF;
794 							edca_param |= (TXOP_CCK2M<<16);
795 							break;
796 						case DESC_RATE5_5M:
797 							edca_param &= 0x0000FFFF;
798 							edca_param |= (TXOP_CCK5M<<16);
799 							break;
800 						case DESC_RATE6M:
801 							edca_param &= 0x0000FFFF;
802 							edca_param |= (TXOP_OFD6M<<16);
803 							break;
804 						case DESC_RATEMCS0:
805 							edca_param &= 0x0000FFFF;
806 							edca_param |= (TXOP_MCS6M<<16);
807 							break;
808 						default:
809 							break;
810 					}
811 				}
812 			}
813 }
814 #endif /* CONFIG_EXTEND_LOWRATE_TXOP */
815 
816 #ifdef 	CONFIG_RTW_CUSTOMIZE_BEEDCA
817 			edca_param = CONFIG_RTW_CUSTOMIZE_BEEDCA;
818 #endif
819 
820 			if ( edca_param != hal_data->ac_param_be) {
821 
822 				rtw_hal_set_hwreg(adapter, HW_VAR_AC_PARAM_BE, (u8 *)(&edca_param));
823 
824 				RTW_INFO("Turbo EDCA =0x%x\n", edca_param);
825 			}
826 
827 			hal_data->prv_traffic_idx = traffic_index;
828 		}
829 
830 		hal_data->is_turbo_edca = _TRUE;
831 	} else {
832 		/*  */
833 		/* Turn Off EDCA turbo here. */
834 		/* Restore original EDCA according to the declaration of AP. */
835 		/*  */
836 		if (hal_data->is_turbo_edca) {
837 			edca_param = hal_data->ac_param_be;
838 			rtw_hal_set_hwreg(adapter, HW_VAR_AC_PARAM_BE, (u8 *)(&edca_param));
839 			hal_data->is_turbo_edca = _FALSE;
840 		}
841 	}
842 
843 }
844 
rtw_dm_get_min_rssi(_adapter * adapter)845 s8 rtw_dm_get_min_rssi(_adapter *adapter)
846 {
847 	struct macid_ctl_t *macid_ctl = adapter_to_macidctl(adapter);
848 	struct sta_info *sta;
849 	s8 min_rssi = 127, rssi;
850 	int i;
851 
852 	for (i = 0; i < MACID_NUM_SW_LIMIT; i++) {
853 		sta = macid_ctl->sta[i];
854 		if (!sta || !GET_H2CCMD_MSRRPT_PARM_OPMODE(macid_ctl->h2c_msr + i)
855 			|| is_broadcast_mac_addr(sta->cmn.mac_addr))
856 			continue;
857 		rssi = sta->cmn.rssi_stat.rssi;
858 		if (rssi >= 0 && min_rssi > rssi)
859 			min_rssi = rssi;
860 	}
861 
862 	return min_rssi == 127 ? 0 : min_rssi;
863 }
864 
rtw_phydm_get_min_rssi(_adapter * adapter)865 s8 rtw_phydm_get_min_rssi(_adapter *adapter)
866 {
867 	struct dm_struct *phydm = adapter_to_phydm(adapter);
868 	s8 rssi_min = 0;
869 
870 	rssi_min = phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_RSSI_MIN);
871 	return rssi_min;
872 }
873 
rtw_phydm_get_cur_igi(_adapter * adapter)874 u8 rtw_phydm_get_cur_igi(_adapter *adapter)
875 {
876 	struct dm_struct *phydm = adapter_to_phydm(adapter);
877 	u8 cur_igi = 0;
878 
879 	cur_igi = phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CURR_IGI);
880 	return cur_igi;
881 }
882 
rtw_phydm_get_edcca_flag(_adapter * adapter)883 bool rtw_phydm_get_edcca_flag(_adapter *adapter)
884 {
885 	struct dm_struct *phydm = adapter_to_phydm(adapter);
886 	bool cur_edcca_flag = 0;
887 
888 	cur_edcca_flag = phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_EDCCA_FLAG);
889 	return cur_edcca_flag;
890 }
891 
rtw_phydm_get_phy_cnt(_adapter * adapter,enum phy_cnt cnt)892 u32 rtw_phydm_get_phy_cnt(_adapter *adapter, enum phy_cnt cnt)
893 {
894 	struct dm_struct *phydm = adapter_to_phydm(adapter);
895 
896 	if (cnt == FA_OFDM)
897 		return  phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_FA_OFDM);
898 	else if (cnt == FA_CCK)
899 		return  phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_FA_CCK);
900 	else if (cnt == FA_TOTAL)
901 		return  phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_FA_TOTAL);
902 	else if (cnt == CCA_OFDM)
903 		return	phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CCA_OFDM);
904 	else if (cnt == CCA_CCK)
905 		return	phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CCA_CCK);
906 	else if (cnt == CCA_ALL)
907 		return	phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CCA_ALL);
908 	else if (cnt == CRC32_OK_VHT)
909 		return	phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CRC32_OK_VHT);
910 	else if (cnt == CRC32_OK_HT)
911 		return	phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CRC32_OK_HT);
912 	else if (cnt == CRC32_OK_LEGACY)
913 		return	phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CRC32_OK_LEGACY);
914 	else if (cnt == CRC32_OK_CCK)
915 		return	phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CRC32_OK_CCK);
916 	else if (cnt == CRC32_ERROR_VHT)
917 		return	phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CRC32_ERROR_VHT);
918 	else if (cnt == CRC32_ERROR_HT)
919 		return	phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CRC32_ERROR_HT);
920 	else if (cnt == CRC32_ERROR_LEGACY)
921 		return	phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CRC32_ERROR_LEGACY);
922 	else if (cnt == CRC32_ERROR_CCK)
923 		return	phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CRC32_ERROR_CCK);
924 	else
925 		return 0;
926 }
927 
rtw_phydm_is_iqk_in_progress(_adapter * adapter)928 u8 rtw_phydm_is_iqk_in_progress(_adapter *adapter)
929 {
930 	u8 rts = _FALSE;
931 	struct dm_struct *podmpriv = adapter_to_phydm(adapter);
932 
933 	odm_acquire_spin_lock(podmpriv, RT_IQK_SPINLOCK);
934 	if (podmpriv->rf_calibrate_info.is_iqk_in_progress == _TRUE) {
935 		RTW_ERR("IQK InProgress\n");
936 		rts = _TRUE;
937 	}
938 	odm_release_spin_lock(podmpriv, RT_IQK_SPINLOCK);
939 
940 	return rts;
941 }
942 
SetHalODMVar(PADAPTER Adapter,HAL_ODM_VARIABLE eVariable,void * pValue1,BOOLEAN bSet)943 void SetHalODMVar(
944 	PADAPTER				Adapter,
945 	HAL_ODM_VARIABLE		eVariable,
946 	void						*pValue1,
947 	BOOLEAN					bSet)
948 {
949 	struct dm_struct *podmpriv = adapter_to_phydm(Adapter);
950 	/* _irqL irqL; */
951 	switch (eVariable) {
952 	case HAL_ODM_STA_INFO: {
953 		struct sta_info *psta = (struct sta_info *)pValue1;
954 
955 		if (bSet) {
956 			RTW_INFO("### Set STA_(%d) info ###\n", psta->cmn.mac_id);
957 			psta->cmn.dm_ctrl = STA_DM_CTRL_ACTIVE;
958 			phydm_cmn_sta_info_hook(podmpriv, psta->cmn.mac_id, &(psta->cmn));
959 		} else {
960 			RTW_INFO("### Clean STA_(%d) info ###\n", psta->cmn.mac_id);
961 			/* _enter_critical_bh(&pHalData->odm_stainfo_lock, &irqL); */
962 			psta->cmn.dm_ctrl = 0;
963 			phydm_cmn_sta_info_hook(podmpriv, psta->cmn.mac_id, NULL);
964 
965 			/* _exit_critical_bh(&pHalData->odm_stainfo_lock, &irqL); */
966 		}
967 	}
968 		break;
969 	case HAL_ODM_P2P_STATE:
970 		odm_cmn_info_update(podmpriv, ODM_CMNINFO_WIFI_DIRECT, bSet);
971 		break;
972 	case HAL_ODM_WIFI_DISPLAY_STATE:
973 		odm_cmn_info_update(podmpriv, ODM_CMNINFO_WIFI_DISPLAY, bSet);
974 		break;
975 	case HAL_ODM_INITIAL_GAIN: {
976 		u8 rx_gain = *((u8 *)(pValue1));
977 		/*printk("rx_gain:%x\n",rx_gain);*/
978 		if (rx_gain == 0xff) {/*restore rx gain*/
979 			/*odm_write_dig(podmpriv,pDigTable->backup_ig_value);*/
980 			odm_pause_dig(podmpriv, PHYDM_RESUME, PHYDM_PAUSE_LEVEL_0, rx_gain);
981 		} else {
982 			/*pDigTable->backup_ig_value = pDigTable->cur_ig_value;*/
983 			/*odm_write_dig(podmpriv,rx_gain);*/
984 			odm_pause_dig(podmpriv, PHYDM_PAUSE, PHYDM_PAUSE_LEVEL_0, rx_gain);
985 		}
986 	}
987 	break;
988 	case HAL_ODM_RX_INFO_DUMP: {
989 		u8 cur_igi = 0;
990 		s8 rssi_min;
991 		void *sel;
992 
993 		sel = pValue1;
994 		cur_igi = rtw_phydm_get_cur_igi(Adapter);
995 		rssi_min = rtw_phydm_get_min_rssi(Adapter);
996 
997 		_RTW_PRINT_SEL(sel, "============ Rx Info dump ===================\n");
998 		_RTW_PRINT_SEL(sel, "is_linked = %d, rssi_min = %d(%%)(%d(%%)), current_igi = 0x%x\n"
999 			, podmpriv->is_linked, rssi_min, rtw_dm_get_min_rssi(Adapter), cur_igi);
1000 		_RTW_PRINT_SEL(sel, "cnt_cck_fail = %d, cnt_ofdm_fail = %d, Total False Alarm = %d\n",
1001 			rtw_phydm_get_phy_cnt(Adapter, FA_CCK),
1002 			rtw_phydm_get_phy_cnt(Adapter, FA_OFDM),
1003 			rtw_phydm_get_phy_cnt(Adapter, FA_TOTAL));
1004 
1005 		if (podmpriv->is_linked) {
1006 			_RTW_PRINT_SEL(sel, "rx_rate = %s", HDATA_RATE(podmpriv->rx_rate));
1007 			if (IS_HARDWARE_TYPE_8814A(Adapter))
1008 				_RTW_PRINT_SEL(sel, " rssi_a = %d(%%), rssi_b = %d(%%), rssi_c = %d(%%), rssi_d = %d(%%)\n",
1009 					podmpriv->rssi_a, podmpriv->rssi_b, podmpriv->rssi_c, podmpriv->rssi_d);
1010 			else
1011 				_RTW_PRINT_SEL(sel, " rssi_a = %d(%%), rssi_b = %d(%%)\n", podmpriv->rssi_a, podmpriv->rssi_b);
1012 #ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA
1013 			rtw_dump_raw_rssi_info(Adapter, sel);
1014 #endif
1015 		}
1016 	}
1017 		break;
1018 	case HAL_ODM_RX_Dframe_INFO: {
1019 		void *sel;
1020 
1021 		sel = pValue1;
1022 
1023 		/*_RTW_PRINT_SEL(sel , "HAL_ODM_RX_Dframe_INFO\n");*/
1024 #ifdef DBG_RX_DFRAME_RAW_DATA
1025 		rtw_dump_rx_dframe_info(Adapter, sel);
1026 #endif
1027 	}
1028 		break;
1029 
1030 #ifdef CONFIG_ANTENNA_DIVERSITY
1031 	case HAL_ODM_ANTDIV_SELECT: {
1032 		u8	antenna = (*(u8 *)pValue1);
1033 		HAL_DATA_TYPE	*pHalData = GET_HAL_DATA(Adapter);
1034 		/*switch antenna*/
1035 		odm_update_rx_idle_ant(&pHalData->odmpriv, antenna);
1036 		/*RTW_INFO("==> HAL_ODM_ANTDIV_SELECT, Ant_(%s)\n", (antenna == MAIN_ANT) ? "MAIN_ANT" : "AUX_ANT");*/
1037 
1038 	}
1039 		break;
1040 #endif
1041 
1042 	default:
1043 		break;
1044 	}
1045 }
1046 
GetHalODMVar(PADAPTER Adapter,HAL_ODM_VARIABLE eVariable,void * pValue1,void * pValue2)1047 void GetHalODMVar(
1048 	PADAPTER				Adapter,
1049 	HAL_ODM_VARIABLE		eVariable,
1050 	void						*pValue1,
1051 	void						*pValue2)
1052 {
1053 	struct dm_struct *podmpriv = adapter_to_phydm(Adapter);
1054 
1055 	switch (eVariable) {
1056 #ifdef CONFIG_ANTENNA_DIVERSITY
1057 	case HAL_ODM_ANTDIV_SELECT: {
1058 		struct phydm_fat_struct	*pDM_FatTable = &podmpriv->dm_fat_table;
1059 		*((u8 *)pValue1) = pDM_FatTable->rx_idle_ant;
1060 	}
1061 		break;
1062 #endif
1063 	case HAL_ODM_INITIAL_GAIN:
1064 		*((u8 *)pValue1) = rtw_phydm_get_cur_igi(Adapter);
1065 		break;
1066 	default:
1067 		break;
1068 	}
1069 }
1070 
1071 #ifdef RTW_HALMAC
1072 #include "../hal_halmac.h"
1073 #endif
rtw_phydm_rfe_ctrl_gpio(_adapter * adapter,u8 gpio_num)1074 bool rtw_phydm_rfe_ctrl_gpio(
1075 	_adapter *adapter,
1076 	u8 gpio_num
1077 )
1078 {
1079 	#ifdef RTW_HALMAC
1080 	if(rtw_halmac_rfe_ctrl_cfg(adapter_to_dvobj(adapter), gpio_num))
1081 		return _TRUE;
1082 	else
1083 	#endif/*RTW_HALMAC*/
1084 		return _FALSE;
1085 }
1086 
1087 enum hal_status
rtw_phydm_fw_iqk(struct dm_struct * p_dm_odm,u8 clear,u8 segment)1088 rtw_phydm_fw_iqk(
1089 	struct dm_struct	*p_dm_odm,
1090 	u8 clear,
1091 	u8 segment
1092 )
1093 {
1094 	#ifdef RTW_HALMAC
1095 	struct _ADAPTER *adapter = p_dm_odm->adapter;
1096 
1097 	if (rtw_halmac_iqk(adapter_to_dvobj(adapter), clear, segment) == 0)
1098 		return HAL_STATUS_SUCCESS;
1099 	#endif
1100 	return HAL_STATUS_FAILURE;
1101 }
1102 
1103 enum hal_status
rtw_phydm_cfg_phy_para(struct dm_struct * p_dm_odm,enum phydm_halmac_param config_type,u32 offset,u32 data,u32 mask,enum rf_path e_rf_path,u32 delay_time)1104 rtw_phydm_cfg_phy_para(
1105 	struct dm_struct	*p_dm_odm,
1106 	enum phydm_halmac_param config_type,
1107 	u32 offset,
1108 	u32 data,
1109 	u32 mask,
1110 	enum rf_path e_rf_path,
1111 	u32 delay_time)
1112 {
1113 	#ifdef RTW_HALMAC
1114 	struct _ADAPTER *adapter = p_dm_odm->adapter;
1115 	struct rtw_phy_parameter para;
1116 
1117 	switch (config_type) {
1118 	case PHYDM_HALMAC_CMD_MAC_W8:
1119 		para.cmd = 0; /* MAC register */
1120 		para.data.mac.offset = offset;
1121 		para.data.mac.value = data;
1122 		para.data.mac.msk = mask;
1123 		para.data.mac.msk_en = (mask) ? 1 : 0;
1124 		para.data.mac.size = 1;
1125 	break;
1126 	case PHYDM_HALMAC_CMD_MAC_W16:
1127 		para.cmd = 0; /* MAC register */
1128 		para.data.mac.offset = offset;
1129 		para.data.mac.value = data;
1130 		para.data.mac.msk = mask;
1131 		para.data.mac.msk_en = (mask) ? 1 : 0;
1132 		para.data.mac.size = 2;
1133 	break;
1134 	case PHYDM_HALMAC_CMD_MAC_W32:
1135 		para.cmd = 0; /* MAC register */
1136 		para.data.mac.offset = offset;
1137 		para.data.mac.value = data;
1138 		para.data.mac.msk = mask;
1139 		para.data.mac.msk_en = (mask) ? 1 : 0;
1140 		para.data.mac.size = 4;
1141 	break;
1142 	case PHYDM_HALMAC_CMD_BB_W8:
1143 		para.cmd = 1; /* BB register */
1144 		para.data.bb.offset = offset;
1145 		para.data.bb.value = data;
1146 		para.data.bb.msk = mask;
1147 		para.data.bb.msk_en = (mask) ? 1 : 0;
1148 		para.data.bb.size = 1;
1149 	break;
1150 	case PHYDM_HALMAC_CMD_BB_W16:
1151 		para.cmd = 1; /* BB register */
1152 		para.data.bb.offset = offset;
1153 		para.data.bb.value = data;
1154 		para.data.bb.msk = mask;
1155 		para.data.bb.msk_en = (mask) ? 1 : 0;
1156 		para.data.bb.size = 2;
1157 	break;
1158 	case PHYDM_HALMAC_CMD_BB_W32:
1159 		para.cmd = 1; /* BB register */
1160 		para.data.bb.offset = offset;
1161 		para.data.bb.value = data;
1162 		para.data.bb.msk = mask;
1163 		para.data.bb.msk_en = (mask) ? 1 : 0;
1164 		para.data.bb.size = 4;
1165 	break;
1166 	case PHYDM_HALMAC_CMD_RF_W:
1167 		para.cmd = 2; /* RF register */
1168 		para.data.rf.offset = offset;
1169 		para.data.rf.value = data;
1170 		para.data.rf.msk = mask;
1171 		para.data.rf.msk_en = (mask) ? 1 : 0;
1172 		if (e_rf_path == RF_PATH_A)
1173 			para.data.rf.path = 0;
1174 		else if (e_rf_path == RF_PATH_B)
1175 			para.data.rf.path = 1;
1176 		else if (e_rf_path == RF_PATH_C)
1177 			para.data.rf.path = 2;
1178 		else if (e_rf_path == RF_PATH_D)
1179 			para.data.rf.path = 3;
1180 		else
1181 			para.data.rf.path = 0;
1182 	break;
1183 	case PHYDM_HALMAC_CMD_DELAY_US:
1184 		para.cmd = 3; /* Delay */
1185 		para.data.delay.unit = 0; /* microsecond */
1186 		para.data.delay.value = delay_time;
1187 	break;
1188 	case PHYDM_HALMAC_CMD_DELAY_MS:
1189 		para.cmd = 3; /* Delay */
1190 		para.data.delay.unit = 1; /* millisecond */
1191 		para.data.delay.value = delay_time;
1192 	break;
1193 	case PHYDM_HALMAC_CMD_END:
1194 		para.cmd = 0xFF; /* End command */
1195 	break;
1196 	default:
1197 		return HAL_STATUS_FAILURE;
1198 	}
1199 
1200 	if (rtw_halmac_cfg_phy_para(adapter_to_dvobj(adapter), &para))
1201 		return HAL_STATUS_FAILURE;
1202 	#endif /*RTW_HALMAC*/
1203 	return HAL_STATUS_SUCCESS;
1204 }
1205 
1206 
1207 #ifdef CONFIG_LPS_LCLK_WD_TIMER
rtw_phydm_wd_lps_lclk_hdl(_adapter * adapter)1208 void rtw_phydm_wd_lps_lclk_hdl(_adapter *adapter)
1209 {
1210 	struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
1211 	struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(adapter);
1212 	PHAL_DATA_TYPE pHalData = GET_HAL_DATA(adapter);
1213 	struct sta_priv *pstapriv = &adapter->stapriv;
1214 	struct sta_info *psta = NULL;
1215 	bool is_linked = _FALSE;
1216 
1217 	if (!rtw_is_hw_init_completed(adapter))
1218 		return;
1219 
1220 	if (rtw_mi_check_status(adapter, MI_ASSOC))
1221 		is_linked = _TRUE;
1222 
1223 	if (is_linked == _FALSE)
1224 		return;
1225 
1226 	psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));
1227 	if (psta == NULL)
1228 		return;
1229 
1230 	odm_cmn_info_update(&pHalData->odmpriv, ODM_CMNINFO_LINK, is_linked);
1231 
1232 	phydm_watchdog_lps_32k(&pHalData->odmpriv);
1233 
1234 #ifdef CONFIG_LPS_PG
1235 	if (pwrpriv->lps_level == LPS_PG) {
1236 		 if (rtw_hal_set_lps_pg_info_cmd(adapter) == _FAIL)
1237 		 	RTW_INFO(FUNC_ADPT_FMT": Send PG H2C command Fail! \n",
1238 		 			 FUNC_ADPT_ARG(adapter));
1239 	}
1240 #endif /* CONFIG_LPS_PG */
1241 }
1242 
rtw_phydm_watchdog_in_lps_lclk(_adapter * adapter)1243 void rtw_phydm_watchdog_in_lps_lclk(_adapter *adapter)
1244 {
1245 	struct mlme_priv	*pmlmepriv = &adapter->mlmepriv;
1246 	struct sta_priv *pstapriv = &adapter->stapriv;
1247 	u8 cur_igi = 0;
1248 	s8 min_rssi = 0;
1249 
1250 	if (!rtw_is_hw_init_completed(adapter))
1251 		return;
1252 
1253 	cur_igi = rtw_phydm_get_cur_igi(adapter);
1254 	min_rssi = rtw_dm_get_min_rssi(adapter);
1255 	/*RTW_INFO("%s "ADPT_FMT" cur_ig_value=%d, min_rssi = %d\n", __func__,  ADPT_ARG(adapter), cur_igi, min_rssi);*/
1256 
1257 	if (min_rssi <= 0)
1258 		return;
1259 
1260 	if ((cur_igi > min_rssi + 5) ||
1261 		(cur_igi < min_rssi - 5)) {
1262 #ifdef CONFIG_LPS
1263 		rtw_dm_in_lps_wk_cmd(adapter);
1264 #endif
1265 	}
1266 }
1267 #endif /*CONFIG_LPS_LCLK_WD_TIMER*/
1268 
dump_sta_traffic(void * sel,_adapter * adapter,struct sta_info * psta)1269 void dump_sta_traffic(void *sel, _adapter *adapter, struct sta_info *psta)
1270 {
1271 	struct ra_sta_info *ra_info;
1272 	u8 curr_sgi = _FALSE;
1273 	u32 tx_tp_mbips, rx_tp_mbips, bi_tp_mbips;
1274 
1275 	if (!psta)
1276 		return;
1277 	RTW_PRINT_SEL(sel, "\n");
1278 	RTW_PRINT_SEL(sel, "====== mac_id : %d [" MAC_FMT "] ======\n",
1279 		psta->cmn.mac_id, MAC_ARG(psta->cmn.mac_addr));
1280 
1281 	if (is_client_associated_to_ap(psta->padapter))
1282 		RTW_PRINT_SEL(sel, "BCN counts : %d (per-%d second), DTIM Period:%d\n",
1283 		rtw_get_bcn_cnt(psta->padapter) / 2, 1, rtw_get_bcn_dtim_period(psta->padapter));
1284 
1285 	ra_info = &psta->cmn.ra_info;
1286 	curr_sgi = rtw_get_current_tx_sgi(adapter, psta);
1287 	RTW_PRINT_SEL(sel, "tx_rate : %s(%s)  rx_rate : %s, rx_rate_bmc : %s, rssi : %d %%\n"
1288 		, HDATA_RATE(rtw_get_current_tx_rate(adapter, psta)), (curr_sgi) ? "S" : "L"
1289 		, HDATA_RATE((psta->curr_rx_rate & 0x7F)), HDATA_RATE((psta->curr_rx_rate_bmc & 0x7F)), psta->cmn.rssi_stat.rssi
1290 	);
1291 
1292 	if (0) {
1293 		RTW_PRINT_SEL(sel, "tx_bytes:%llu(%llu - %llu)\n"
1294 			, psta->sta_stats.tx_bytes - psta->sta_stats.last_tx_bytes
1295 			, psta->sta_stats.tx_bytes, psta->sta_stats.last_tx_bytes
1296 		);
1297 		RTW_PRINT_SEL(sel, "rx_uc_bytes:%llu(%llu - %llu)\n"
1298 			, sta_rx_uc_bytes(psta) - sta_last_rx_uc_bytes(psta)
1299 			, sta_rx_uc_bytes(psta), sta_last_rx_uc_bytes(psta)
1300 		);
1301 		RTW_PRINT_SEL(sel, "rx_mc_bytes:%llu(%llu - %llu)\n"
1302 			, psta->sta_stats.rx_mc_bytes - psta->sta_stats.last_rx_mc_bytes
1303 			, psta->sta_stats.rx_mc_bytes, psta->sta_stats.last_rx_mc_bytes
1304 		);
1305 		RTW_PRINT_SEL(sel, "rx_bc_bytes:%llu(%llu - %llu)\n"
1306 			, psta->sta_stats.rx_bc_bytes - psta->sta_stats.last_rx_bc_bytes
1307 			, psta->sta_stats.rx_bc_bytes, psta->sta_stats.last_rx_bc_bytes
1308 		);
1309 	}
1310 
1311 	_RTW_PRINT_SEL(sel, "RTW: [TP] ");
1312 	tx_tp_mbips = psta->sta_stats.tx_tp_kbits >> 10;
1313 	rx_tp_mbips = psta->sta_stats.rx_tp_kbits >> 10;
1314 	bi_tp_mbips = tx_tp_mbips + rx_tp_mbips;
1315 
1316 	if (tx_tp_mbips)
1317 		_RTW_PRINT_SEL(sel, "Tx : %d(Mbps) ", tx_tp_mbips);
1318 	else
1319 		_RTW_PRINT_SEL(sel, "Tx : %d(Kbps) ", psta->sta_stats.tx_tp_kbits);
1320 
1321 	if (rx_tp_mbips)
1322 		_RTW_PRINT_SEL(sel, "Rx : %d(Mbps) ", rx_tp_mbips);
1323 	else
1324 		_RTW_PRINT_SEL(sel, "Rx : %d(Kbps) ", psta->sta_stats.rx_tp_kbits);
1325 
1326 	if (bi_tp_mbips)
1327 		_RTW_PRINT_SEL(sel, "Total : %d(Mbps)\n", bi_tp_mbips);
1328 	else
1329 		_RTW_PRINT_SEL(sel, "Total : %d(Kbps)\n", psta->sta_stats.tx_tp_kbits + psta->sta_stats.rx_tp_kbits);
1330 
1331 
1332 	_RTW_PRINT_SEL(sel, "RTW: [Smooth TP] ");
1333 	tx_tp_mbips = psta->sta_stats.smooth_tx_tp_kbits >> 10;
1334 	rx_tp_mbips = psta->sta_stats.smooth_rx_tp_kbits >> 10;
1335 	bi_tp_mbips = tx_tp_mbips + rx_tp_mbips;
1336 	if (tx_tp_mbips)
1337 		_RTW_PRINT_SEL(sel, "Tx : %d(Mbps) ", tx_tp_mbips);
1338 	else
1339 		_RTW_PRINT_SEL(sel, "Tx : %d(Kbps) ", psta->sta_stats.smooth_tx_tp_kbits);
1340 
1341 	if (rx_tp_mbips)
1342 		_RTW_PRINT_SEL(sel, "Rx : %d(Mbps) ", rx_tp_mbips);
1343 	else
1344 		_RTW_PRINT_SEL(sel, "Rx : %d(Kbps) ", psta->sta_stats.smooth_rx_tp_kbits);
1345 
1346 	if (bi_tp_mbips)
1347 		_RTW_PRINT_SEL(sel, "Total : %d(Mbps)\n", bi_tp_mbips);
1348 	else
1349 		_RTW_PRINT_SEL(sel, "Total : %d(Kbps)\n", psta->sta_stats.smooth_tx_tp_kbits + psta->sta_stats.rx_tp_kbits);
1350 
1351 	#if 0
1352 	RTW_PRINT_SEL(sel, "Moving-AVG TP {Tx,Rx,Total} = { %d , %d , %d } Mbps\n\n",
1353 		(psta->cmn.tx_moving_average_tp << 3), (psta->cmn.rx_moving_average_tp << 3),
1354 		(psta->cmn.tx_moving_average_tp + psta->cmn.rx_moving_average_tp) << 3);
1355 	#endif
1356 }
1357 
dump_sta_info(void * sel,struct sta_info * psta)1358 void dump_sta_info(void *sel, struct sta_info *psta)
1359 {
1360 	struct ra_sta_info *ra_info;
1361 	u8 curr_tx_sgi = _FALSE;
1362 	u8 curr_tx_rate = 0;
1363 
1364 	if (!psta)
1365 		return;
1366 
1367 	ra_info = &psta->cmn.ra_info;
1368 
1369 	RTW_PRINT_SEL(sel, "============ STA [" MAC_FMT "]  ===================\n",
1370 		MAC_ARG(psta->cmn.mac_addr));
1371 	RTW_PRINT_SEL(sel, "mac_id : %d\n", psta->cmn.mac_id);
1372 	RTW_PRINT_SEL(sel, "wireless_mode : 0x%02x\n", psta->wireless_mode);
1373 	RTW_PRINT_SEL(sel, "mimo_type : %d\n", psta->cmn.mimo_type);
1374 	RTW_PRINT_SEL(sel, "static smps : %s\n", (psta->cmn.sm_ps == SM_PS_STATIC) ? "Y" : "N");
1375 	RTW_PRINT_SEL(sel, "bw_mode : %s, ra_bw_mode : %s\n",
1376 			ch_width_str(psta->cmn.bw_mode), ch_width_str(ra_info->ra_bw_mode));
1377 	RTW_PRINT_SEL(sel, "rate_id : %d\n", ra_info->rate_id);
1378 	RTW_PRINT_SEL(sel, "rssi : %d (%%), rssi_level : %d\n", psta->cmn.rssi_stat.rssi, ra_info->rssi_level);
1379 	RTW_PRINT_SEL(sel, "is_support_sgi : %s, is_vht_enable : %s\n",
1380 			(ra_info->is_support_sgi) ? "Y" : "N", (ra_info->is_vht_enable) ? "Y" : "N");
1381 	RTW_PRINT_SEL(sel, "disable_ra : %s, disable_pt : %s\n",
1382 				(ra_info->disable_ra) ? "Y" : "N", (ra_info->disable_pt) ? "Y" : "N");
1383 	RTW_PRINT_SEL(sel, "is_noisy : %s\n", (ra_info->is_noisy) ? "Y" : "N");
1384 	RTW_PRINT_SEL(sel, "txrx_state : %d\n", ra_info->txrx_state);/*0: uplink, 1:downlink, 2:bi-direction*/
1385 
1386 	curr_tx_sgi = rtw_get_current_tx_sgi(psta->padapter, psta);
1387 	curr_tx_rate = rtw_get_current_tx_rate(psta->padapter, psta);
1388 	RTW_PRINT_SEL(sel, "curr_tx_rate : %s (%s)\n",
1389 			HDATA_RATE(curr_tx_rate), (curr_tx_sgi) ? "S" : "L");
1390 	RTW_PRINT_SEL(sel, "curr_tx_bw : %s\n", ch_width_str(ra_info->curr_tx_bw));
1391 	RTW_PRINT_SEL(sel, "curr_retry_ratio : %d\n", ra_info->curr_retry_ratio);
1392 	RTW_PRINT_SEL(sel, "ra_mask : 0x%016llx\n\n", ra_info->ramask);
1393 }
1394 
rtw_phydm_ra_registed(_adapter * adapter,struct sta_info * psta)1395 void rtw_phydm_ra_registed(_adapter *adapter, struct sta_info *psta)
1396 {
1397 	HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
1398 	struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
1399 	struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);
1400 
1401 	if (psta == NULL) {
1402 		RTW_ERR(FUNC_ADPT_FMT" sta is NULL\n", FUNC_ADPT_ARG(adapter));
1403 		rtw_warn_on(1);
1404 		return;
1405 	}
1406 
1407 	if (psta->cmn.mac_id >= macid_ctl->num)
1408 		return;
1409 
1410 	phydm_ra_registed(&hal_data->odmpriv, psta->cmn.mac_id, psta->cmn.rssi_stat.rssi);
1411 	dump_sta_info(RTW_DBGDUMP, psta);
1412 }
1413 
init_phydm_info(_adapter * adapter)1414 static void init_phydm_info(_adapter *adapter)
1415 {
1416 	PHAL_DATA_TYPE	hal_data = GET_HAL_DATA(adapter);
1417 	struct dm_struct *phydm = &(hal_data->odmpriv);
1418 
1419 	odm_cmn_info_init(phydm, ODM_CMNINFO_FW_VER, hal_data->firmware_version);
1420 	odm_cmn_info_init(phydm, ODM_CMNINFO_FW_SUB_VER, hal_data->firmware_sub_version);
1421 }
1422 
1423 #ifdef CONFIG_CTRL_TXSS_BY_TP
rtw_phydm_trx_cfg(_adapter * adapter,bool tx_1ss)1424 void rtw_phydm_trx_cfg(_adapter *adapter, bool tx_1ss)
1425 {
1426 	HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
1427 	enum bb_path txpath = BB_PATH_AB;
1428 	enum bb_path rxpath = BB_PATH_AB;
1429 	/*is_2tx = _FALSE for 8822B, or BB_PATH_AUTO for PATH_DIVERSITY for 8822B*/
1430 	enum bb_path txpath_1ss = BB_PATH_A;
1431 
1432 	rtw_hal_get_trx_path(adapter_to_dvobj(adapter), NULL, &txpath, &rxpath);
1433 	txpath = (tx_1ss) ? BB_PATH_A : txpath;
1434 
1435 	if (phydm_api_trx_mode(adapter_to_phydm(adapter), txpath, rxpath, txpath_1ss) == FALSE)
1436 		RTW_ERR("%s failed\n", __func__);
1437 }
1438 #endif
1439 
rtw_hal_runtime_trx_path_decision(_adapter * adapter)1440 u8 rtw_hal_runtime_trx_path_decision(_adapter *adapter)
1441 {
1442 	HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
1443 	enum bb_path txpath;
1444 	enum bb_path rxpath;
1445 	int i;
1446 	u8 rst = _FAIL;
1447 
1448 	rtw_hal_get_trx_path(adapter_to_dvobj(adapter), NULL, &txpath, &rxpath);
1449 	if (!txpath) {
1450 		RTW_ERR("%s tx_path_bmp is empty\n", __func__);
1451 		rtw_warn_on(1);
1452 		goto exit;
1453 	}
1454 	if (!rxpath) {
1455 		RTW_ERR("%s rx_path_bmp is empty\n", __func__);
1456 		rtw_warn_on(1);
1457 		goto exit;
1458 	}
1459 
1460 	tx_path_nss_set_default(hal_data->txpath_nss, hal_data->txpath_num_nss
1461 		, GET_HAL_TX_PATH_BMP(adapter));
1462 
1463 #if defined(CONFIG_RTL8192F) || defined(CONFIG_RTL8822B) ||defined(CONFIG_RTL8822C)
1464 {
1465 	enum bb_path txpath_1ss;
1466 
1467 	if (txpath == BB_PATH_AB) {
1468 		switch (hal_data->max_tx_cnt) {
1469 		case 2:
1470 			#ifdef CONFIG_RTW_TX_NPATH_EN
1471 			if (adapter->registrypriv.tx_npath == 1)
1472 				txpath_1ss = BB_PATH_AB;
1473 			else
1474 			#endif
1475 			#ifdef CONFIG_RTW_PATH_DIV
1476 			if (adapter->registrypriv.path_div == 1) /* path diversity, support 2sts TX */
1477 				txpath_1ss = BB_PATH_AUTO;
1478 			else
1479 			#endif
1480 				txpath_1ss = BB_PATH_A;
1481 			break;
1482 		case 1:
1483 			#ifdef CONFIG_RTW_PATH_DIV
1484 			if (adapter->registrypriv.path_div == 1) /* path diversity, no support 2sts TX */
1485 				txpath = txpath_1ss = BB_PATH_AUTO;
1486 			else
1487 			#endif
1488 				txpath = txpath_1ss = BB_PATH_A;
1489 			break;
1490 		default:
1491 			RTW_ERR("%s invalid max_tx_cnt:%u\n", __func__
1492 				, hal_data->max_tx_cnt);
1493 			rtw_warn_on(1);
1494 			goto exit;
1495 		}
1496 	} else
1497 		txpath_1ss = txpath;
1498 
1499 	if (hal_data->txpath_nss[0] != txpath_1ss) {
1500 		hal_data->txpath_nss[0] = txpath_1ss;
1501 		if (txpath_1ss == BB_PATH_AUTO)
1502 			hal_data->txpath_num_nss[0] = 1;
1503 		else {
1504 			hal_data->txpath_num_nss[0] = 0;
1505 			for (i = 0; i < RF_PATH_MAX; i++) {
1506 				if (txpath_1ss & BIT(i))
1507 					hal_data->txpath_num_nss[0]++;
1508 			}
1509 		}
1510 	}
1511 }
1512 #elif defined(CONFIG_RTL8814B)
1513 {
1514 	/* 8814B is always full-TX */
1515 	tx_path_nss_set_full_tx(hal_data->txpath_nss, hal_data->txpath_num_nss, txpath);
1516 }
1517 #elif defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8192E)
1518 {
1519 	#ifdef CONFIG_RTW_TX_NPATH_EN
1520 	if (adapter->registrypriv.tx_npath == 1)
1521 		tx_path_nss_set_full_tx(hal_data->txpath_nss, hal_data->txpath_num_nss, txpath);
1522 	#endif
1523 }
1524 #endif
1525 
1526 	hal_data->txpath = txpath;
1527 	hal_data->rxpath = rxpath;
1528 	dump_hal_runtime_trx_mode(RTW_DBGDUMP, adapter);
1529 	rst = _SUCCESS;
1530 
1531 exit:
1532 	return rst;
1533 }
1534 
1535 /*
1536 * trx_mode init - 8822B / 8822C / 8192F
1537 * 1ssNTx - 8192E / 8812A / 8822B / 8822C / 8192F
1538 * Path-diversity - 8822B / 8822C / 8192F
1539 * PHYDM API - phydm_api_trx_mode
1540 */
rtw_phydm_config_trx_path(_adapter * adapter)1541 static u8 rtw_phydm_config_trx_path(_adapter *adapter)
1542 {
1543 	u8 rst = _SUCCESS;
1544 
1545 #if defined(CONFIG_RTL8192F) || defined(CONFIG_RTL8822B) ||defined(CONFIG_RTL8822C)
1546 {
1547 	HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
1548 	enum bb_path txpath = hal_data->txpath;
1549 	enum bb_path rxpath = hal_data->rxpath;
1550 	enum bb_path txpath_1ss = hal_data->txpath_nss[0];
1551 
1552 	if (phydm_api_trx_mode(adapter_to_phydm(adapter), txpath, rxpath, txpath_1ss) == FALSE) {
1553 		RTW_ERR("%s txpath=0x%x, rxpath=0x%x, txpath_1ss=0x%x fail\n", __func__
1554 			, txpath, rxpath, txpath_1ss);
1555 		rtw_warn_on(1);
1556 		rst = _FAIL;
1557 	}
1558 }
1559 #elif defined(CONFIG_RTL8814B)
1560 {
1561 	HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
1562 	enum bb_path txpath = hal_data->txpath;
1563 	enum bb_path rxpath = hal_data->rxpath;
1564 
1565 	if (txpath == BB_PATH_ABCD && rxpath == BB_PATH_ABCD)
1566 		rst = config_phydm_trx_mode_8814b(adapter_to_phydm(adapter), txpath, rxpath);
1567 	else
1568 		rst = config_phydm_trx_mode_ext_8814b(adapter_to_phydm(adapter), txpath,
1569 						      rxpath,
1570 						      txpath, txpath, txpath);
1571 	if (rst == FALSE) {
1572 		RTW_ERR("%s txpath=0x%x, rxpath=0x%x fail\n", __func__
1573 			, txpath, rxpath);
1574 		rtw_warn_on(1);
1575 		rst = _FAIL;
1576 	}
1577 }
1578 #elif defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8192E)
1579 {
1580 	HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
1581 
1582 	if (hal_data->txpath_num_nss[0] == 2)
1583 		phydm_tx_2path(adapter_to_phydm(adapter));
1584 }
1585 #endif
1586 
1587 	return rst;
1588 }
1589 
rtw_phydm_init(_adapter * adapter)1590 void rtw_phydm_init(_adapter *adapter)
1591 {
1592 	PHAL_DATA_TYPE	hal_data = GET_HAL_DATA(adapter);
1593 	struct dm_struct	*phydm = &(hal_data->odmpriv);
1594 
1595 	rtw_phydm_config_trx_path(adapter);
1596 	init_phydm_info(adapter);
1597 	hal_data->phydm_init_result = odm_dm_init(phydm);
1598 
1599 #ifdef CONFIG_CUSTOMER01_SMART_ANTENNA
1600 	phydm_pathb_q_matrix_rotate_en(phydm);
1601 #endif
1602 }
1603 
rtw_phydm_set_crystal_cap(_adapter * adapter,u8 crystal_cap)1604 bool rtw_phydm_set_crystal_cap(_adapter *adapter, u8 crystal_cap)
1605 {
1606 	PHAL_DATA_TYPE	hal_data = GET_HAL_DATA(adapter);
1607 	struct dm_struct	*phydm = &(hal_data->odmpriv);
1608 
1609 	return phydm_set_crystal_cap_reg(phydm, crystal_cap);
1610 }
1611 
1612 #ifdef CONFIG_LPS_PG
1613 /*
1614 static void _lps_pg_state_update(_adapter *adapter)
1615 {
1616 	u8	is_in_lpspg = _FALSE;
1617 	struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(adapter);
1618 	PHAL_DATA_TYPE	pHalData = GET_HAL_DATA(adapter);
1619 	struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
1620 	struct sta_priv *pstapriv = &adapter->stapriv;
1621 	struct sta_info *psta = NULL;
1622 
1623 	if ((pwrpriv->lps_level == LPS_PG) && (pwrpriv->pwr_mode != PS_MODE_ACTIVE) && (pwrpriv->rpwm <= PS_STATE_S2))
1624 		is_in_lpspg = _TRUE;
1625 	psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));
1626 
1627 	if (psta)
1628 		psta->cmn.ra_info.disable_ra = (is_in_lpspg) ? _TRUE : _FALSE;
1629 }
1630 */
rtw_phydm_lps_pg_hdl(_adapter * adapter,struct sta_info * sta,bool in_lpspg)1631 void rtw_phydm_lps_pg_hdl(_adapter *adapter, struct sta_info *sta, bool in_lpspg)
1632 {
1633 	struct dm_struct *phydm = adapter_to_phydm(adapter);
1634 	/*u8 rate_id;*/
1635 
1636 	if(sta == NULL) {
1637 		RTW_ERR("%s sta is null\n", __func__);
1638 		rtw_warn_on(1);
1639 		return;
1640 	}
1641 
1642 	if (in_lpspg) {
1643 		sta->cmn.ra_info.disable_ra = _TRUE;
1644 		sta->cmn.ra_info.disable_pt = _TRUE;
1645 		/*TODO : DRV fix tx rate*/
1646 		/*rate_id = phydm_get_rate_from_rssi_lv(phydm, sta->cmn.mac_id);*/
1647 	} else {
1648 		sta->cmn.ra_info.disable_ra = _FALSE;
1649 		sta->cmn.ra_info.disable_pt = _FALSE;
1650 	}
1651 
1652 	rtw_phydm_ra_registed(adapter, sta);
1653 }
1654 #endif
1655 
1656 /*#define DBG_PHYDM_STATE_CHK*/
1657 
1658 
_rtw_phydm_rfk_condition_check(_adapter * adapter,u8 is_scaning,u8 ifs_linked)1659 static u8 _rtw_phydm_rfk_condition_check(_adapter *adapter, u8 is_scaning, u8 ifs_linked)
1660 {
1661 	u8 rfk_allowed = _TRUE;
1662 
1663 	#ifdef CONFIG_SKIP_RFK_IN_DM
1664 	rfk_allowed = _FALSE;
1665 	if (0)
1666 		RTW_ERR("[RFK-CHK] RF-K not allowed due to CONFIG_SKIP_RFK_IN_DM\n");
1667 	return rfk_allowed;
1668 	#endif
1669 
1670 	#ifdef CONFIG_MCC_MODE
1671 	/*not in MCC State*/
1672 	if (MCC_EN(adapter) &&
1673 		rtw_hal_check_mcc_status(adapter, MCC_STATUS_DOING_MCC)) {
1674 		rfk_allowed = _FALSE;
1675 		if (0)
1676 			RTW_INFO("[RFK-CHK] RF-K not allowed due to doing MCC\n");
1677 		return rfk_allowed;
1678 	}
1679 	#endif
1680 
1681 	#if defined(CONFIG_TDLS) && defined(CONFIG_TDLS_CH_SW)
1682 
1683 	#endif
1684 
1685 	if (ifs_linked) {
1686 		if (is_scaning) {
1687 			rfk_allowed = _FALSE;
1688 			RTW_DBG("[RFK-CHK] RF-K not allowed due to ifaces under site-survey\n");
1689 		}
1690 		else {
1691 			rfk_allowed = rtw_mi_stayin_union_ch_chk(adapter) ? _TRUE : _FALSE;
1692 			if (rfk_allowed == _FALSE)
1693 				RTW_ERR("[RFK-CHK] RF-K not allowed due to ld_iface not stayin union ch\n");
1694 		}
1695 	}
1696 
1697 	return rfk_allowed;
1698 }
1699 
1700 #if ((RTL8822B_SUPPORT == 1) || (RTL8821C_SUPPORT == 1) || (RTL8814B_SUPPORT == 1) || (RTL8822C_SUPPORT == 1))
_rtw_phydm_iqk_segment_chk(_adapter * adapter,u8 ifs_linked)1701 static u8 _rtw_phydm_iqk_segment_chk(_adapter *adapter, u8 ifs_linked)
1702 {
1703 	u8 iqk_sgt = _FALSE;
1704 
1705 #if 0
1706 	struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
1707 	if (ifs_linked && (dvobj->traffic_stat.cur_tx_tp > 2 || dvobj->traffic_stat.cur_rx_tp > 2))
1708 		rst = _TRUE;
1709 #else
1710 	if (ifs_linked)
1711 		iqk_sgt = _TRUE;
1712 #endif
1713 	return iqk_sgt;
1714 }
1715 #endif
1716 
1717 /*check the tx low rate while unlinked to any AP;for pwr tracking */
_rtw_phydm_pwr_tracking_rate_check(_adapter * adapter)1718 static u8 _rtw_phydm_pwr_tracking_rate_check(_adapter *adapter)
1719 {
1720 	int i;
1721 	_adapter *iface;
1722 	u8		if_tx_rate = 0xFF;
1723 	u8		tx_rate = 0xFF;
1724 	struct mlme_ext_priv	*pmlmeext = NULL;
1725 	struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
1726 	struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
1727 	HAL_DATA_TYPE *pHalData = GET_HAL_DATA(adapter);
1728 
1729 	for (i = 0; i < dvobj->iface_nums; i++) {
1730 		iface = dvobj->padapters[i];
1731 		pmlmeext = &(iface->mlmeextpriv);
1732 		if ((iface) && rtw_is_adapter_up(iface)) {
1733 #ifdef CONFIG_P2P
1734 			if (!rtw_p2p_chk_role(&(iface)->wdinfo, P2P_ROLE_DISABLE))
1735 				if_tx_rate = IEEE80211_OFDM_RATE_6MB;
1736 			else
1737 #endif
1738 				if_tx_rate = pmlmeext->tx_rate;
1739 
1740 			if (if_tx_rate < tx_rate) {
1741 				/*5G limit ofdm rate*/
1742 				if (pHalData->current_channel > 14) {
1743 					if (!IS_CCK_RATE(if_tx_rate))
1744 						tx_rate = if_tx_rate;
1745 				} else {
1746 					tx_rate = if_tx_rate;
1747 				}
1748 			}
1749 			RTW_DBG("%s i=%d if_tx_rate =0x%x\n", __func__, i, if_tx_rate);
1750 		}
1751 	}
1752 
1753 	/*suggest by RF James,unlinked setting ofdm rate*/
1754 	if (tx_rate == 0xFF)
1755 		tx_rate = IEEE80211_OFDM_RATE_6MB;
1756 
1757 	RTW_DBG("%s tx_low_rate (unlinked to any AP)=0x%x\n", __func__, tx_rate);
1758 	return tx_rate;
1759 }
1760 
1761 #ifdef CONFIG_DYNAMIC_SOML
rtw_dyn_soml_byte_update(_adapter * adapter,u8 data_rate,u32 size)1762 void rtw_dyn_soml_byte_update(_adapter *adapter, u8 data_rate, u32 size)
1763 {
1764 	struct dm_struct *phydm = adapter_to_phydm(adapter);
1765 
1766 	phydm_soml_bytes_acq(phydm, data_rate, size);
1767 }
1768 
rtw_dyn_soml_para_set(_adapter * adapter,u8 train_num,u8 intvl,u8 period,u8 delay)1769 void rtw_dyn_soml_para_set(_adapter *adapter, u8 train_num, u8 intvl,
1770 			u8 period, u8 delay)
1771 {
1772 	struct dm_struct *phydm = adapter_to_phydm(adapter);
1773 
1774 	phydm_adaptive_soml_para_set(phydm, train_num, intvl, period, delay);
1775 	RTW_INFO("%s.\n", __func__);
1776 }
1777 
rtw_dyn_soml_config(_adapter * adapter)1778 void rtw_dyn_soml_config(_adapter *adapter)
1779 {
1780 	RTW_INFO("%s.\n", __func__);
1781 
1782 	if (adapter->registrypriv.dyn_soml_en == 1) {
1783 		/* Must after phydm_adaptive_soml_init() */
1784 		rtw_hal_set_hwreg(adapter , HW_VAR_SET_SOML_PARAM , NULL);
1785 		RTW_INFO("dyn_soml_en = 1\n");
1786 	} else {
1787 		if (adapter->registrypriv.dyn_soml_en == 2) {
1788 			rtw_dyn_soml_para_set(adapter,
1789 				adapter->registrypriv.dyn_soml_train_num,
1790 				adapter->registrypriv.dyn_soml_interval,
1791 				adapter->registrypriv.dyn_soml_period,
1792 				adapter->registrypriv.dyn_soml_delay);
1793 			RTW_INFO("dyn_soml_en = 2\n");
1794 			RTW_INFO("dyn_soml_en, param = %d, %d, %d, %d\n",
1795 				adapter->registrypriv.dyn_soml_train_num,
1796 				adapter->registrypriv.dyn_soml_interval,
1797 				adapter->registrypriv.dyn_soml_period,
1798 				adapter->registrypriv.dyn_soml_delay);
1799 		} else if (adapter->registrypriv.dyn_soml_en == 0) {
1800 			RTW_INFO("dyn_soml_en = 0\n");
1801 		} else
1802 			RTW_ERR("%s, wrong setting: dyn_soml_en = %d\n", __func__,
1803 				adapter->registrypriv.dyn_soml_en);
1804 	}
1805 }
1806 #endif
1807 
rtw_phydm_set_rrsr(_adapter * adapter,u32 rrsr_value,bool write_rrsr)1808 void rtw_phydm_set_rrsr(_adapter *adapter, u32 rrsr_value, bool write_rrsr)
1809 {
1810 	struct dm_struct *phydm = adapter_to_phydm(adapter);
1811 	u32 temp_rrsr =0xFFFFFFFF;
1812 
1813 	if (adapter->registrypriv.set_rrsr_value != 0xFFFFFFFF)
1814 		temp_rrsr = adapter->registrypriv.set_rrsr_value;
1815 	else
1816 		temp_rrsr = rrsr_value;
1817 
1818 	odm_cmn_info_update(phydm, ODM_CMNINFO_RRSR_VAL, temp_rrsr);
1819 	if(write_rrsr)
1820 		phydm_rrsr_set_register(phydm, temp_rrsr);
1821 }
rtw_phydm_dyn_rrsr_en(_adapter * adapter,bool en_rrsr)1822 void rtw_phydm_dyn_rrsr_en(_adapter *adapter, bool en_rrsr)
1823 {
1824 	struct dm_struct *phydm = adapter_to_phydm(adapter);
1825 
1826 	phydm_rrsr_en(phydm, en_rrsr);
1827 }
rtw_phydm_read_efuse(_adapter * adapter)1828 void rtw_phydm_read_efuse(_adapter *adapter)
1829 {
1830 	PHAL_DATA_TYPE hal_data = GET_HAL_DATA(adapter);
1831 	struct dm_struct *phydm = &(hal_data->odmpriv);
1832 
1833 	/*PHYDM API - thermal trim*/
1834 	phydm_get_thermal_trim_offset(phydm);
1835 	/*PHYDM API - power trim*/
1836 	phydm_get_power_trim_offset(phydm);
1837 }
1838 
1839 #ifdef CONFIG_LPS_PWR_TRACKING
rtw_phydm_pwr_tracking_directly(_adapter * adapter)1840 void rtw_phydm_pwr_tracking_directly(_adapter *adapter)
1841 {
1842 	PHAL_DATA_TYPE hal_data = GET_HAL_DATA(adapter);
1843 	u8 rfk_forbidden = _TRUE;
1844 	u8 is_linked = _FALSE;
1845 
1846 	if (rtw_mi_check_status(adapter, MI_ASSOC))
1847 		is_linked = _TRUE;
1848 
1849 	rfk_forbidden = (_rtw_phydm_rfk_condition_check(adapter, hal_data->bScanInProcess, is_linked) == _TRUE) ? _FALSE : _TRUE;
1850 	halrf_cmn_info_set(&hal_data->odmpriv, HALRF_CMNINFO_RFK_FORBIDDEN, rfk_forbidden);
1851 
1852 	odm_txpowertracking_direct_ce(&hal_data->odmpriv);
1853 }
1854 #endif
1855 
rtw_phydm_update_ap_vendor_ie(_adapter * adapter)1856 void rtw_phydm_update_ap_vendor_ie(_adapter *adapter)
1857 {
1858 	u8 i;
1859 	_adapter *iface;
1860 	struct mlme_ext_priv	*pmlmeext ;
1861 	struct mlme_ext_info	*pmlmeinfo ;
1862 	struct dm_struct *phydm = adapter_to_phydm(adapter);
1863 	struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
1864 	bool HUAWEI_HWID = FALSE;
1865 	bool ATHEROS_HWID = FALSE;
1866 
1867 	for (i = 0; i < dvobj->iface_nums; i++){
1868 		iface = dvobj->padapters[i];
1869 		if (iface!= NULL) {
1870 			pmlmeext = &(iface->mlmeextpriv);
1871 			pmlmeinfo = &(pmlmeext->mlmext_info);
1872 			if( pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_ATHEROS){
1873 				HUAWEI_HWID = TRUE;
1874 				ATHEROS_HWID = TRUE;
1875 				goto exit;
1876 			}
1877 		}
1878 	}
1879 
1880 exit:
1881 	RTW_INFO("%s ODM_CMNINFO_HUAWEI_HWID:%d ATHEROS_HWID:%d\n", __func__, HUAWEI_HWID, ATHEROS_HWID);
1882 	odm_cmn_info_update(phydm, ODM_CMNINFO_HUAWEI_HWID, HUAWEI_HWID);
1883 	odm_cmn_info_update(phydm, ODM_CMNINFO_ATHEROS_HWID, ATHEROS_HWID);
1884 }
1885 
rtw_phydm_watchdog(_adapter * adapter,bool in_lps)1886 void rtw_phydm_watchdog(_adapter *adapter, bool in_lps)
1887 {
1888 	u8	bLinked = _FALSE;
1889 	u8	bsta_state = _FALSE;
1890 	u8	bBtDisabled = _TRUE;
1891 	u8	rfk_forbidden = _FALSE;
1892 	#if ((RTL8822B_SUPPORT == 1) || (RTL8821C_SUPPORT == 1) || (RTL8814B_SUPPORT == 1) || (RTL8822C_SUPPORT == 1))
1893 	u8	segment_iqk = _FALSE;
1894 	#endif
1895 	u8	tx_unlinked_low_rate = 0xFF;
1896 	PHAL_DATA_TYPE	pHalData = GET_HAL_DATA(adapter);
1897 
1898 	if (!rtw_is_hw_init_completed(adapter)) {
1899 		RTW_DBG("%s skip due to hw_init_completed == FALSE\n", __func__);
1900 		return;
1901 	}
1902 	if (rtw_mi_check_fwstate(adapter, WIFI_UNDER_SURVEY))
1903 		pHalData->bScanInProcess = _TRUE;
1904 	else
1905 		pHalData->bScanInProcess = _FALSE;
1906 
1907 	if (rtw_mi_check_status(adapter, MI_ASSOC)) {
1908 		bLinked = _TRUE;
1909 		if (rtw_mi_check_status(adapter, MI_STA_LINKED))
1910 		bsta_state = _TRUE;
1911 	}
1912 
1913 	odm_cmn_info_update(&pHalData->odmpriv, ODM_CMNINFO_LINK, bLinked);
1914 	odm_cmn_info_update(&pHalData->odmpriv, ODM_CMNINFO_STATION_STATE, bsta_state);
1915 
1916 	#ifdef CONFIG_BT_COEXIST
1917 	bBtDisabled = rtw_btcoex_IsBtDisabled(adapter);
1918 	odm_cmn_info_update(&pHalData->odmpriv, ODM_CMNINFO_BT_ENABLED,
1919 				(bBtDisabled == _TRUE) ? _FALSE : _TRUE);
1920 	#else
1921 	odm_cmn_info_update(&pHalData->odmpriv, ODM_CMNINFO_BT_ENABLED, _FALSE);
1922 	#endif /* CONFIG_BT_COEXIST */
1923 
1924 	rfk_forbidden = (_rtw_phydm_rfk_condition_check(adapter, pHalData->bScanInProcess, bLinked) == _TRUE) ? _FALSE : _TRUE;
1925 	halrf_cmn_info_set(&pHalData->odmpriv, HALRF_CMNINFO_RFK_FORBIDDEN, rfk_forbidden);
1926 
1927 	#if ((RTL8822B_SUPPORT == 1) || (RTL8821C_SUPPORT == 1) || (RTL8814B_SUPPORT == 1) || (RTL8822C_SUPPORT == 1))
1928 	segment_iqk = _rtw_phydm_iqk_segment_chk(adapter, bLinked);
1929 	halrf_cmn_info_set(&pHalData->odmpriv, HALRF_CMNINFO_IQK_SEGMENT, segment_iqk);
1930 	#endif
1931 	#ifdef DBG_PHYDM_STATE_CHK
1932 	RTW_INFO("%s rfk_forbidden = %s, segment_iqk = %s\n",
1933 			__func__, (rfk_forbidden) ? "Y" : "N", (segment_iqk) ? "Y" : "N");
1934 	#endif
1935 
1936 	if (bLinked == _FALSE) {
1937 		tx_unlinked_low_rate = _rtw_phydm_pwr_tracking_rate_check(adapter);
1938 		halrf_cmn_info_set(&pHalData->odmpriv, HALRF_CMNINFO_RATE_INDEX, tx_unlinked_low_rate);
1939 	}
1940 
1941 	/*if (!rtw_mi_stayin_union_band_chk(adapter)) {
1942 		#ifdef DBG_PHYDM_STATE_CHK
1943 		RTW_ERR("Not stay in union band, skip phydm\n");
1944 		#endif
1945 		goto _exit;
1946 	}*/
1947 
1948 	#ifdef CONFIG_TDMADIG
1949 	rtw_phydm_tdmadig(adapter, TDMADIG_NON_INIT);
1950 	#endif/*CONFIG_TDMADIG*/
1951 
1952 	if (in_lps)
1953 		phydm_watchdog_lps(&pHalData->odmpriv);
1954 	else
1955 		phydm_watchdog(&pHalData->odmpriv);
1956 
1957 	#ifdef CONFIG_RTW_ACS
1958 	rtw_acs_update_current_info(adapter);
1959 	#endif
1960 
1961 	return;
1962 }
1963 
1964 
1965