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