xref: /linux/drivers/staging/rtl8723bs/hal/rtl8723b_dm.c (revision 07ff92ba0aa1573da1a961cb379b12ff5ae890eb)
1 // SPDX-License-Identifier: GPL-2.0
2 /******************************************************************************
3  *
4  * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
5  *
6  ******************************************************************************/
7 /*  Description: */
8 /*  This file is for 92CE/92CU dynamic mechanism only */
9 
10 #include <drv_types.h>
11 #include <rtl8723b_hal.h>
12 
13 /*  Global var */
14 
15 /*  */
16 /*  functions */
17 /*  */
18 static void Init_ODM_ComInfo_8723b(struct adapter *Adapter)
19 {
20 
21 	struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
22 	struct dm_odm_t *pDM_Odm = &pHalData->odmpriv;
23 	struct dm_priv *pdmpriv = &pHalData->dmpriv;
24 	u8 cut_ver, fab_ver;
25 
26 	/*  */
27 	/*  Init Value */
28 	/*  */
29 	memset(pDM_Odm, 0, sizeof(*pDM_Odm));
30 
31 	pDM_Odm->Adapter = Adapter;
32 #define ODM_CE 0x04
33 	ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_PLATFORM, ODM_CE);
34 	ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_INTERFACE, RTW_SDIO);
35 	ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_PACKAGE_TYPE, pHalData->PackageType);
36 	ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_IC_TYPE, ODM_RTL8723B);
37 
38 	fab_ver = ODM_TSMC;
39 	cut_ver = ODM_CUT_A;
40 
41 	ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_FAB_VER, fab_ver);
42 	ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_CUT_VER, cut_ver);
43 
44 	ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_PATCH_ID, pHalData->CustomerID);
45 	/* 	ODM_CMNINFO_BINHCT_TEST only for MP Team */
46 	ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_BWIFI_TEST, Adapter->registrypriv.wifi_spec);
47 
48 	pdmpriv->InitODMFlag = ODM_RF_CALIBRATION|ODM_RF_TX_PWR_TRACK;
49 
50 	ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pdmpriv->InitODMFlag);
51 }
52 
53 static void Update_ODM_ComInfo_8723b(struct adapter *Adapter)
54 {
55 	struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv;
56 	struct mlme_priv *pmlmepriv = &Adapter->mlmepriv;
57 	struct dvobj_priv *dvobj = adapter_to_dvobj(Adapter);
58 	struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(Adapter);
59 	struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
60 	struct dm_odm_t *pDM_Odm = &pHalData->odmpriv;
61 	struct dm_priv *pdmpriv = &pHalData->dmpriv;
62 	int i;
63 	u8 zero = 0;
64 
65 	pdmpriv->InitODMFlag = 0
66 		| ODM_BB_DIG
67 		| ODM_BB_RA_MASK
68 		| ODM_BB_DYNAMIC_TXPWR
69 		| ODM_BB_FA_CNT
70 		| ODM_BB_RSSI_MONITOR
71 		| ODM_BB_CCK_PD
72 		| ODM_BB_PWR_SAVE
73 		| ODM_BB_CFO_TRACKING
74 		| ODM_MAC_EDCA_TURBO
75 		| ODM_RF_TX_PWR_TRACK
76 		| ODM_RF_CALIBRATION
77 		;
78 
79 	/*  */
80 	/*  Pointer reference */
81 	/*  */
82 	/* ODM_CMNINFO_MAC_PHY_MODE pHalData->MacPhyMode92D */
83 	/* 	ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_MAC_PHY_MODE,&(pDM_Odm->u8_temp)); */
84 
85 	ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pdmpriv->InitODMFlag);
86 
87 	ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_TX_UNI, &(dvobj->traffic_stat.tx_bytes));
88 	ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_RX_UNI, &(dvobj->traffic_stat.rx_bytes));
89 	ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_WM_MODE, &(pmlmeext->cur_wireless_mode));
90 	ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_SEC_CHNL_OFFSET, &(pHalData->nCur40MhzPrimeSC));
91 	ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_SEC_MODE, &(Adapter->securitypriv.dot11PrivacyAlgrthm));
92 	ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_BW, &(pHalData->CurrentChannelBW));
93 	ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_CHNL, &(pHalData->CurrentChannel));
94 	ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_NET_CLOSED, &(Adapter->net_closed));
95 	ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_MP_MODE, &zero);
96 	ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_FORCED_IGI_LB, &(pHalData->u1ForcedIgiLb));
97 	ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_FORCED_RATE, &(pHalData->ForcedDataRate));
98 
99 	ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_SCAN, &(pmlmepriv->bScanInProcess));
100 	ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_POWER_SAVING, &(pwrctrlpriv->bpower_saving));
101 
102 	for (i = 0; i < NUM_STA; i++)
103 		ODM_CmnInfoPtrArrayHook(pDM_Odm, ODM_CMNINFO_STA_STATUS, i, NULL);
104 }
105 
106 void rtl8723b_InitHalDm(struct adapter *Adapter)
107 {
108 	struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
109 	struct dm_priv *pdmpriv = &pHalData->dmpriv;
110 	struct dm_odm_t *pDM_Odm = &pHalData->odmpriv;
111 
112 	pdmpriv->DM_Type = DM_Type_ByDriver;
113 	pdmpriv->DMFlag = DYNAMIC_FUNC_DISABLE;
114 
115 	pdmpriv->DMFlag |= DYNAMIC_FUNC_BT;
116 
117 	pdmpriv->InitDMFlag = pdmpriv->DMFlag;
118 
119 	Update_ODM_ComInfo_8723b(Adapter);
120 
121 	ODM_DMInit(pDM_Odm);
122 }
123 
124 void rtl8723b_HalDmWatchDog(struct adapter *Adapter)
125 {
126 	bool fw_current_in_ps_mode = false;
127 	bool bFwPSAwake = true;
128 	u8 hw_init_completed = false;
129 	struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
130 
131 	hw_init_completed = Adapter->hw_init_completed;
132 
133 	if (!hw_init_completed)
134 		goto skip_dm;
135 
136 	fw_current_in_ps_mode = adapter_to_pwrctl(Adapter)->fw_current_in_ps_mode;
137 	rtw_hal_get_hwreg(Adapter, HW_VAR_FWLPS_RF_ON, (u8 *)(&bFwPSAwake));
138 
139 	if (hw_init_completed &&
140 	    (!fw_current_in_ps_mode && bFwPSAwake)) {
141 		rtw_hal_check_rxfifo_full(Adapter);
142 	}
143 
144 	/* ODM */
145 	if (hw_init_completed) {
146 		u8 bLinked = false;
147 		u8 bsta_state = false;
148 		bool bBtDisabled = true;
149 
150 		if (rtw_linked_check(Adapter)) {
151 			bLinked = true;
152 			if (check_fwstate(&Adapter->mlmepriv, WIFI_STATION_STATE))
153 				bsta_state = true;
154 		}
155 
156 		ODM_CmnInfoUpdate(&pHalData->odmpriv, ODM_CMNINFO_LINK, bLinked);
157 		ODM_CmnInfoUpdate(&pHalData->odmpriv, ODM_CMNINFO_STATION_STATE, bsta_state);
158 
159 		/* ODM_CmnInfoUpdate(&pHalData->odmpriv , ODM_CMNINFO_RSSI_MIN, pdmpriv->MinUndecoratedPWDBForDM); */
160 
161 		bBtDisabled = hal_btcoex_IsBtDisabled(Adapter);
162 
163 		ODM_CmnInfoUpdate(&pHalData->odmpriv, ODM_CMNINFO_BT_ENABLED,
164 				  !bBtDisabled);
165 
166 		ODM_DMWatchdog(&pHalData->odmpriv);
167 	}
168 
169 skip_dm:
170 	return;
171 }
172 
173 void rtl8723b_hal_dm_in_lps(struct adapter *padapter)
174 {
175 	u32 PWDB_rssi = 0;
176 	struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
177 	struct hal_com_data *pHalData = GET_HAL_DATA(padapter);
178 	struct dm_odm_t *pDM_Odm = &pHalData->odmpriv;
179 	struct sta_priv *pstapriv = &padapter->stapriv;
180 	struct sta_info *psta = NULL;
181 
182 	/* update IGI */
183 	ODM_Write_DIG(pDM_Odm, pDM_Odm->RSSI_Min);
184 
185 	/* set rssi to fw */
186 	psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));
187 	if (psta && (psta->rssi_stat.UndecoratedSmoothedPWDB > 0)) {
188 		PWDB_rssi = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16));
189 
190 		rtl8723b_set_rssi_cmd(padapter, (u8 *)&PWDB_rssi);
191 	}
192 
193 }
194 
195 void rtl8723b_HalDmWatchDog_in_LPS(struct adapter *Adapter)
196 {
197 	u8 bLinked = false;
198 	struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
199 	struct mlme_priv *pmlmepriv = &Adapter->mlmepriv;
200 	struct dm_priv *pdmpriv = &pHalData->dmpriv;
201 	struct dm_odm_t *pDM_Odm = &pHalData->odmpriv;
202 	struct dig_t *pDM_DigTable = &pDM_Odm->DM_DigTable;
203 	struct sta_priv *pstapriv = &Adapter->stapriv;
204 	struct sta_info *psta = NULL;
205 
206 	if (!Adapter->hw_init_completed)
207 		goto skip_lps_dm;
208 
209 	if (rtw_linked_check(Adapter))
210 		bLinked = true;
211 
212 	ODM_CmnInfoUpdate(&pHalData->odmpriv, ODM_CMNINFO_LINK, bLinked);
213 
214 	if (!bLinked)
215 		goto skip_lps_dm;
216 
217 	if (!(pDM_Odm->SupportAbility & ODM_BB_RSSI_MONITOR))
218 		goto skip_lps_dm;
219 
220 	/* ODM_DMWatchdog(&pHalData->odmpriv); */
221 	/* Do DIG by RSSI In LPS-32K */
222 
223       /* 1 Find MIN-RSSI */
224 	psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));
225 	if (!psta)
226 		goto skip_lps_dm;
227 
228 	pdmpriv->EntryMinUndecoratedSmoothedPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;
229 
230 	if (pdmpriv->EntryMinUndecoratedSmoothedPWDB <= 0)
231 		goto skip_lps_dm;
232 
233 	pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
234 
235 	pDM_Odm->RSSI_Min = pdmpriv->MinUndecoratedPWDBForDM;
236 
237 	/* if (pDM_DigTable->CurIGValue != pDM_Odm->RSSI_Min) */
238 	if (
239 		(pDM_DigTable->CurIGValue > pDM_Odm->RSSI_Min + 5) ||
240 		(pDM_DigTable->CurIGValue < pDM_Odm->RSSI_Min - 5)
241 	)
242 		rtw_dm_in_lps_wk_cmd(Adapter);
243 
244 skip_lps_dm:
245 
246 	return;
247 
248 }
249 
250 void rtl8723b_init_dm_priv(struct adapter *Adapter)
251 {
252 	struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
253 	struct dm_priv *pdmpriv = &pHalData->dmpriv;
254 
255 	memset(pdmpriv, 0, sizeof(struct dm_priv));
256 	Init_ODM_ComInfo_8723b(Adapter);
257 }
258