• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /******************************************************************************
2  *
3  * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of version 2 of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12  * more details.
13  *
14  ******************************************************************************/
15 /*  Description: */
16 /*  This file is for 92CE/92CU dynamic mechanism only */
17 
18 #define _RTL8723B_DM_C_
19 
20 #include <drv_types.h>
21 #include <rtw_debug.h>
22 #include <rtl8723b_hal.h>
23 
24 /*  Global var */
25 
dm_CheckStatistics(struct adapter * Adapter)26 static void dm_CheckStatistics(struct adapter *Adapter)
27 {
28 }
29 /*  */
30 /*  functions */
31 /*  */
Init_ODM_ComInfo_8723b(struct adapter * Adapter)32 static void Init_ODM_ComInfo_8723b(struct adapter *Adapter)
33 {
34 
35 	struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
36 	PDM_ODM_T pDM_Odm = &(pHalData->odmpriv);
37 	struct dm_priv *pdmpriv = &pHalData->dmpriv;
38 	u8 cut_ver, fab_ver;
39 
40 	/*  */
41 	/*  Init Value */
42 	/*  */
43 	memset(pDM_Odm, 0, sizeof(*pDM_Odm));
44 
45 	pDM_Odm->Adapter = Adapter;
46 #define ODM_CE 0x04
47 	ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_PLATFORM, ODM_CE);
48 	ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_INTERFACE, RTW_SDIO);
49 	ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_PACKAGE_TYPE, pHalData->PackageType);
50 	ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_IC_TYPE, ODM_RTL8723B);
51 
52 	fab_ver = ODM_TSMC;
53 	cut_ver = ODM_CUT_A;
54 
55 	DBG_871X("%s(): fab_ver =%d cut_ver =%d\n", __func__, fab_ver, cut_ver);
56 	ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_FAB_VER, fab_ver);
57 	ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_CUT_VER, cut_ver);
58 	ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_MP_TEST_CHIP, IS_NORMAL_CHIP(pHalData->VersionID));
59 
60 	ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_PATCH_ID, pHalData->CustomerID);
61 	/* 	ODM_CMNINFO_BINHCT_TEST only for MP Team */
62 	ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_BWIFI_TEST, Adapter->registrypriv.wifi_spec);
63 
64 
65 	if (pHalData->rf_type == RF_1T1R) {
66 		ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_1T1R);
67 	} else if (pHalData->rf_type == RF_2T2R) {
68 		ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_2T2R);
69 	} else if (pHalData->rf_type == RF_1T2R) {
70 		ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_1T2R);
71 	}
72 
73 	pdmpriv->InitODMFlag = ODM_RF_CALIBRATION|ODM_RF_TX_PWR_TRACK;
74 
75 	ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pdmpriv->InitODMFlag);
76 }
77 
Update_ODM_ComInfo_8723b(struct adapter * Adapter)78 static void Update_ODM_ComInfo_8723b(struct adapter *Adapter)
79 {
80 	struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv;
81 	struct mlme_priv *pmlmepriv = &Adapter->mlmepriv;
82 	struct dvobj_priv *dvobj = adapter_to_dvobj(Adapter);
83 	struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(Adapter);
84 	struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
85 	PDM_ODM_T pDM_Odm = &(pHalData->odmpriv);
86 	struct dm_priv *pdmpriv = &pHalData->dmpriv;
87 	int i;
88 	u8 zero = 0;
89 
90 	pdmpriv->InitODMFlag = 0
91 		| ODM_BB_DIG
92 		| ODM_BB_RA_MASK
93 		| ODM_BB_DYNAMIC_TXPWR
94 		| ODM_BB_FA_CNT
95 		| ODM_BB_RSSI_MONITOR
96 		| ODM_BB_CCK_PD
97 		| ODM_BB_PWR_SAVE
98 		| ODM_BB_CFO_TRACKING
99 		| ODM_MAC_EDCA_TURBO
100 		| ODM_RF_TX_PWR_TRACK
101 		| ODM_RF_CALIBRATION
102 #ifdef CONFIG_ODM_ADAPTIVITY
103 		| ODM_BB_ADAPTIVITY
104 #endif
105 		;
106 
107 	/*  */
108 	/*  Pointer reference */
109 	/*  */
110 	/* ODM_CMNINFO_MAC_PHY_MODE pHalData->MacPhyMode92D */
111 	/* 	ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_MAC_PHY_MODE,&(pDM_Odm->u8_temp)); */
112 
113 	ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pdmpriv->InitODMFlag);
114 
115 	ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_TX_UNI, &(dvobj->traffic_stat.tx_bytes));
116 	ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_RX_UNI, &(dvobj->traffic_stat.rx_bytes));
117 	ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_WM_MODE, &(pmlmeext->cur_wireless_mode));
118 	ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_SEC_CHNL_OFFSET, &(pHalData->nCur40MhzPrimeSC));
119 	ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_SEC_MODE, &(Adapter->securitypriv.dot11PrivacyAlgrthm));
120 	ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_BW, &(pHalData->CurrentChannelBW));
121 	ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_CHNL, &(pHalData->CurrentChannel));
122 	ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_NET_CLOSED, &(Adapter->net_closed));
123 	ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_MP_MODE, &zero);
124 	ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_BAND, &(pHalData->CurrentBandType));
125 	ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_FORCED_IGI_LB, &(pHalData->u1ForcedIgiLb));
126 	ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_FORCED_RATE, &(pHalData->ForcedDataRate));
127 
128 	ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_SCAN, &(pmlmepriv->bScanInProcess));
129 	ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_POWER_SAVING, &(pwrctrlpriv->bpower_saving));
130 
131 
132 	for (i = 0; i < NUM_STA; i++)
133 		ODM_CmnInfoPtrArrayHook(pDM_Odm, ODM_CMNINFO_STA_STATUS, i, NULL);
134 }
135 
rtl8723b_InitHalDm(struct adapter * Adapter)136 void rtl8723b_InitHalDm(struct adapter *Adapter)
137 {
138 	struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
139 	struct dm_priv *pdmpriv = &pHalData->dmpriv;
140 	PDM_ODM_T pDM_Odm = &(pHalData->odmpriv);
141 
142 	pdmpriv->DM_Type = DM_Type_ByDriver;
143 	pdmpriv->DMFlag = DYNAMIC_FUNC_DISABLE;
144 
145 	pdmpriv->DMFlag |= DYNAMIC_FUNC_BT;
146 
147 	pdmpriv->InitDMFlag = pdmpriv->DMFlag;
148 
149 	Update_ODM_ComInfo_8723b(Adapter);
150 
151 	ODM_DMInit(pDM_Odm);
152 }
153 
rtl8723b_HalDmWatchDog(struct adapter * Adapter)154 void rtl8723b_HalDmWatchDog(struct adapter *Adapter)
155 {
156 	bool bFwCurrentInPSMode = false;
157 	bool bFwPSAwake = true;
158 	u8 hw_init_completed = false;
159 	struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
160 
161 	hw_init_completed = Adapter->hw_init_completed;
162 
163 	if (hw_init_completed == false)
164 		goto skip_dm;
165 
166 	bFwCurrentInPSMode = adapter_to_pwrctl(Adapter)->bFwCurrentInPSMode;
167 	rtw_hal_get_hwreg(Adapter, HW_VAR_FWLPS_RF_ON, (u8 *)(&bFwPSAwake));
168 
169 	if (
170 		(hw_init_completed == true) &&
171 		((!bFwCurrentInPSMode) && bFwPSAwake)
172 	) {
173 		/*  */
174 		/*  Calculate Tx/Rx statistics. */
175 		/*  */
176 		dm_CheckStatistics(Adapter);
177 		rtw_hal_check_rxfifo_full(Adapter);
178 	}
179 
180 	/* ODM */
181 	if (hw_init_completed == true) {
182 		u8 bLinked = false;
183 		u8 bsta_state = false;
184 		u8 bBtDisabled = true;
185 
186 		if (rtw_linked_check(Adapter)) {
187 			bLinked = true;
188 			if (check_fwstate(&Adapter->mlmepriv, WIFI_STATION_STATE))
189 				bsta_state = true;
190 		}
191 
192 		ODM_CmnInfoUpdate(&pHalData->odmpriv, ODM_CMNINFO_LINK, bLinked);
193 		ODM_CmnInfoUpdate(&pHalData->odmpriv, ODM_CMNINFO_STATION_STATE, bsta_state);
194 
195 		/* ODM_CmnInfoUpdate(&pHalData->odmpriv , ODM_CMNINFO_RSSI_MIN, pdmpriv->MinUndecoratedPWDBForDM); */
196 
197 		bBtDisabled = rtw_btcoex_IsBtDisabled(Adapter);
198 
199 		ODM_CmnInfoUpdate(&pHalData->odmpriv, ODM_CMNINFO_BT_ENABLED, ((bBtDisabled == true)?false:true));
200 
201 		ODM_DMWatchdog(&pHalData->odmpriv);
202 	}
203 
204 skip_dm:
205 	return;
206 }
207 
rtl8723b_hal_dm_in_lps(struct adapter * padapter)208 void rtl8723b_hal_dm_in_lps(struct adapter *padapter)
209 {
210 	u32 PWDB_rssi = 0;
211 	struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
212 	struct hal_com_data *pHalData = GET_HAL_DATA(padapter);
213 	PDM_ODM_T pDM_Odm = &pHalData->odmpriv;
214 	struct sta_priv *pstapriv = &padapter->stapriv;
215 	struct sta_info *psta = NULL;
216 
217 	DBG_871X("%s, RSSI_Min =%d\n", __func__, pDM_Odm->RSSI_Min);
218 
219 	/* update IGI */
220 	ODM_Write_DIG(pDM_Odm, pDM_Odm->RSSI_Min);
221 
222 
223 	/* set rssi to fw */
224 	psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));
225 	if (psta && (psta->rssi_stat.UndecoratedSmoothedPWDB > 0)) {
226 		PWDB_rssi = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16));
227 
228 		rtl8723b_set_rssi_cmd(padapter, (u8 *)&PWDB_rssi);
229 	}
230 
231 }
232 
rtl8723b_HalDmWatchDog_in_LPS(struct adapter * Adapter)233 void rtl8723b_HalDmWatchDog_in_LPS(struct adapter *Adapter)
234 {
235 	u8 bLinked = false;
236 	struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
237 	struct mlme_priv *pmlmepriv = &Adapter->mlmepriv;
238 	struct dm_priv *pdmpriv = &pHalData->dmpriv;
239 	PDM_ODM_T pDM_Odm = &pHalData->odmpriv;
240 	pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
241 	struct sta_priv *pstapriv = &Adapter->stapriv;
242 	struct sta_info *psta = NULL;
243 
244 	if (Adapter->hw_init_completed == false)
245 		goto skip_lps_dm;
246 
247 
248 	if (rtw_linked_check(Adapter))
249 		bLinked = true;
250 
251 	ODM_CmnInfoUpdate(&pHalData->odmpriv, ODM_CMNINFO_LINK, bLinked);
252 
253 	if (bLinked == false)
254 		goto skip_lps_dm;
255 
256 	if (!(pDM_Odm->SupportAbility & ODM_BB_RSSI_MONITOR))
257 		goto skip_lps_dm;
258 
259 
260 	/* ODM_DMWatchdog(&pHalData->odmpriv); */
261 	/* Do DIG by RSSI In LPS-32K */
262 
263       /* 1 Find MIN-RSSI */
264 	psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));
265 	if (psta == NULL)
266 		goto skip_lps_dm;
267 
268 	pdmpriv->EntryMinUndecoratedSmoothedPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;
269 
270 	DBG_871X("CurIGValue =%d, EntryMinUndecoratedSmoothedPWDB = %d\n", pDM_DigTable->CurIGValue, pdmpriv->EntryMinUndecoratedSmoothedPWDB);
271 
272 	if (pdmpriv->EntryMinUndecoratedSmoothedPWDB <= 0)
273 		goto skip_lps_dm;
274 
275 	pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
276 
277 	pDM_Odm->RSSI_Min = pdmpriv->MinUndecoratedPWDBForDM;
278 
279 	/* if (pDM_DigTable->CurIGValue != pDM_Odm->RSSI_Min) */
280 	if (
281 		(pDM_DigTable->CurIGValue > pDM_Odm->RSSI_Min + 5) ||
282 		(pDM_DigTable->CurIGValue < pDM_Odm->RSSI_Min - 5)
283 	)
284 		rtw_dm_in_lps_wk_cmd(Adapter);
285 
286 
287 skip_lps_dm:
288 
289 	return;
290 
291 }
292 
rtl8723b_init_dm_priv(struct adapter * Adapter)293 void rtl8723b_init_dm_priv(struct adapter *Adapter)
294 {
295 	struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
296 	struct dm_priv *pdmpriv = &pHalData->dmpriv;
297 
298 	memset(pdmpriv, 0, sizeof(struct dm_priv));
299 	Init_ODM_ComInfo_8723b(Adapter);
300 }
301