File Index
Files and directories
Sign in
FILE

rtl8723b_dm.c

File preview with syntax highlighting.

linux-6.19.14/drivers/staging/rtl8723bs/hal/rtl8723b_dm.c C
  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/*  */
 18static 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
 53static 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
103	for (i = 0; i < NUM_STA; i++)
104		ODM_CmnInfoPtrArrayHook(pDM_Odm, ODM_CMNINFO_STA_STATUS, i, NULL);
105}
106
107void rtl8723b_InitHalDm(struct adapter *Adapter)
108{
109	struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
110	struct dm_priv *pdmpriv = &pHalData->dmpriv;
111	struct dm_odm_t *pDM_Odm = &pHalData->odmpriv;
112
113	pdmpriv->DM_Type = DM_Type_ByDriver;
114	pdmpriv->DMFlag = DYNAMIC_FUNC_DISABLE;
115
116	pdmpriv->DMFlag |= DYNAMIC_FUNC_BT;
117
118	pdmpriv->InitDMFlag = pdmpriv->DMFlag;
119
120	Update_ODM_ComInfo_8723b(Adapter);
121
122	ODM_DMInit(pDM_Odm);
123}
124
125void rtl8723b_HalDmWatchDog(struct adapter *Adapter)
126{
127	bool fw_current_in_ps_mode = false;
128	bool bFwPSAwake = true;
129	u8 hw_init_completed = false;
130	struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
131
132	hw_init_completed = Adapter->hw_init_completed;
133
134	if (hw_init_completed == false)
135		goto skip_dm;
136
137	fw_current_in_ps_mode = adapter_to_pwrctl(Adapter)->fw_current_in_ps_mode;
138	rtw_hal_get_hwreg(Adapter, HW_VAR_FWLPS_RF_ON, (u8 *)(&bFwPSAwake));
139
140	if (
141		(hw_init_completed == true) &&
142		((!fw_current_in_ps_mode) && bFwPSAwake)
143	) {
144		rtw_hal_check_rxfifo_full(Adapter);
145	}
146
147	/* ODM */
148	if (hw_init_completed == true) {
149		u8 bLinked = false;
150		u8 bsta_state = false;
151		bool bBtDisabled = true;
152
153		if (rtw_linked_check(Adapter)) {
154			bLinked = true;
155			if (check_fwstate(&Adapter->mlmepriv, WIFI_STATION_STATE))
156				bsta_state = true;
157		}
158
159		ODM_CmnInfoUpdate(&pHalData->odmpriv, ODM_CMNINFO_LINK, bLinked);
160		ODM_CmnInfoUpdate(&pHalData->odmpriv, ODM_CMNINFO_STATION_STATE, bsta_state);
161
162		/* ODM_CmnInfoUpdate(&pHalData->odmpriv , ODM_CMNINFO_RSSI_MIN, pdmpriv->MinUndecoratedPWDBForDM); */
163
164		bBtDisabled = hal_btcoex_IsBtDisabled(Adapter);
165
166		ODM_CmnInfoUpdate(&pHalData->odmpriv, ODM_CMNINFO_BT_ENABLED,
167				  !bBtDisabled);
168
169		ODM_DMWatchdog(&pHalData->odmpriv);
170	}
171
172skip_dm:
173	return;
174}
175
176void rtl8723b_hal_dm_in_lps(struct adapter *padapter)
177{
178	u32 PWDB_rssi = 0;
179	struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
180	struct hal_com_data *pHalData = GET_HAL_DATA(padapter);
181	struct dm_odm_t *pDM_Odm = &pHalData->odmpriv;
182	struct sta_priv *pstapriv = &padapter->stapriv;
183	struct sta_info *psta = NULL;
184
185	/* update IGI */
186	ODM_Write_DIG(pDM_Odm, pDM_Odm->RSSI_Min);
187
188
189	/* set rssi to fw */
190	psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));
191	if (psta && (psta->rssi_stat.UndecoratedSmoothedPWDB > 0)) {
192		PWDB_rssi = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16));
193
194		rtl8723b_set_rssi_cmd(padapter, (u8 *)&PWDB_rssi);
195	}
196
197}
198
199void rtl8723b_HalDmWatchDog_in_LPS(struct adapter *Adapter)
200{
201	u8 bLinked = false;
202	struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
203	struct mlme_priv *pmlmepriv = &Adapter->mlmepriv;
204	struct dm_priv *pdmpriv = &pHalData->dmpriv;
205	struct dm_odm_t *pDM_Odm = &pHalData->odmpriv;
206	struct dig_t *pDM_DigTable = &pDM_Odm->DM_DigTable;
207	struct sta_priv *pstapriv = &Adapter->stapriv;
208	struct sta_info *psta = NULL;
209
210	if (Adapter->hw_init_completed == false)
211		goto skip_lps_dm;
212
213
214	if (rtw_linked_check(Adapter))
215		bLinked = true;
216
217	ODM_CmnInfoUpdate(&pHalData->odmpriv, ODM_CMNINFO_LINK, bLinked);
218
219	if (bLinked == false)
220		goto skip_lps_dm;
221
222	if (!(pDM_Odm->SupportAbility & ODM_BB_RSSI_MONITOR))
223		goto skip_lps_dm;
224
225
226	/* ODM_DMWatchdog(&pHalData->odmpriv); */
227	/* Do DIG by RSSI In LPS-32K */
228
229      /* 1 Find MIN-RSSI */
230	psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));
231	if (!psta)
232		goto skip_lps_dm;
233
234	pdmpriv->EntryMinUndecoratedSmoothedPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;
235
236	if (pdmpriv->EntryMinUndecoratedSmoothedPWDB <= 0)
237		goto skip_lps_dm;
238
239	pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
240
241	pDM_Odm->RSSI_Min = pdmpriv->MinUndecoratedPWDBForDM;
242
243	/* if (pDM_DigTable->CurIGValue != pDM_Odm->RSSI_Min) */
244	if (
245		(pDM_DigTable->CurIGValue > pDM_Odm->RSSI_Min + 5) ||
246		(pDM_DigTable->CurIGValue < pDM_Odm->RSSI_Min - 5)
247	)
248		rtw_dm_in_lps_wk_cmd(Adapter);
249
250
251skip_lps_dm:
252
253	return;
254
255}
256
257void rtl8723b_init_dm_priv(struct adapter *Adapter)
258{
259	struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
260	struct dm_priv *pdmpriv = &pHalData->dmpriv;
261
262	memset(pdmpriv, 0, sizeof(struct dm_priv));
263	Init_ODM_ComInfo_8723b(Adapter);
264}
~/ Read-only file preview.