1 /******************************************************************************
3 * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
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.
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
14 ******************************************************************************/
16 /* This file is for 92CE/92CU dynamic mechanism only */
18 #define _RTL8723B_DM_C_
20 #include <drv_types.h>
21 #include <rtw_debug.h>
22 #include <rtl8723b_hal.h>
28 struct adapter *Adapter
35 static void Init_ODM_ComInfo_8723b(struct adapter *Adapter)
38 struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
39 PDM_ODM_T pDM_Odm = &(pHalData->odmpriv);
40 struct dm_priv *pdmpriv = &pHalData->dmpriv;
46 memset(pDM_Odm, 0, sizeof(*pDM_Odm));
48 pDM_Odm->Adapter = Adapter;
50 ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_PLATFORM, ODM_CE);
51 ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_INTERFACE, RTW_SDIO);
52 ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_PACKAGE_TYPE, pHalData->PackageType);
53 ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_IC_TYPE, ODM_RTL8723B);
58 DBG_871X("%s(): fab_ver =%d cut_ver =%d\n", __func__, fab_ver, cut_ver);
59 ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_FAB_VER, fab_ver);
60 ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_CUT_VER, cut_ver);
61 ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_MP_TEST_CHIP, IS_NORMAL_CHIP(pHalData->VersionID));
63 ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_PATCH_ID, pHalData->CustomerID);
64 /* ODM_CMNINFO_BINHCT_TEST only for MP Team */
65 ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_BWIFI_TEST, Adapter->registrypriv.wifi_spec);
68 if (pHalData->rf_type == RF_1T1R) {
69 ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_1T1R);
71 else if (pHalData->rf_type == RF_2T2R) {
72 ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_2T2R);
74 else if (pHalData->rf_type == RF_1T2R) {
75 ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_1T2R);
78 pdmpriv->InitODMFlag = ODM_RF_CALIBRATION |
79 ODM_RF_TX_PWR_TRACK /* */
82 ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pdmpriv->InitODMFlag);
85 static void Update_ODM_ComInfo_8723b(struct adapter *Adapter)
87 struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv;
88 struct mlme_priv *pmlmepriv = &Adapter->mlmepriv;
89 struct dvobj_priv *dvobj = adapter_to_dvobj(Adapter);
90 struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(Adapter);
91 struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
92 PDM_ODM_T pDM_Odm = &(pHalData->odmpriv);
93 struct dm_priv *pdmpriv = &pHalData->dmpriv;
97 pdmpriv->InitODMFlag = 0
100 | ODM_BB_DYNAMIC_TXPWR
102 | ODM_BB_RSSI_MONITOR
105 | ODM_BB_CFO_TRACKING
107 | ODM_RF_TX_PWR_TRACK
109 #ifdef CONFIG_ODM_ADAPTIVITY
115 /* Pointer reference */
117 /* ODM_CMNINFO_MAC_PHY_MODE pHalData->MacPhyMode92D */
118 /* ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_MAC_PHY_MODE,&(pDM_Odm->u8_temp)); */
120 ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pdmpriv->InitODMFlag);
122 ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_TX_UNI,&(dvobj->traffic_stat.tx_bytes));
123 ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_RX_UNI,&(dvobj->traffic_stat.rx_bytes));
124 ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_WM_MODE,&(pmlmeext->cur_wireless_mode));
125 ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_SEC_CHNL_OFFSET,&(pHalData->nCur40MhzPrimeSC));
126 ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_SEC_MODE,&(Adapter->securitypriv.dot11PrivacyAlgrthm));
127 ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_BW,&(pHalData->CurrentChannelBW));
128 ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_CHNL,&(pHalData->CurrentChannel));
129 ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_NET_CLOSED,&(Adapter->net_closed));
130 ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_MP_MODE, &zero);
131 ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_BAND,&(pHalData->CurrentBandType));
132 ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_FORCED_IGI_LB,&(pHalData->u1ForcedIgiLb));
133 ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_FORCED_RATE,&(pHalData->ForcedDataRate));
135 ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_SCAN,&(pmlmepriv->bScanInProcess));
136 ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_POWER_SAVING,&(pwrctrlpriv->bpower_saving));
139 for (i = 0; i < NUM_STA; i++)
140 ODM_CmnInfoPtrArrayHook(pDM_Odm, ODM_CMNINFO_STA_STATUS, i, NULL);
145 struct adapter *Adapter
148 struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
149 struct dm_priv *pdmpriv = &pHalData->dmpriv;
150 PDM_ODM_T pDM_Odm = &(pHalData->odmpriv);
152 pdmpriv->DM_Type = DM_Type_ByDriver;
153 pdmpriv->DMFlag = DYNAMIC_FUNC_DISABLE;
155 pdmpriv->DMFlag |= DYNAMIC_FUNC_BT;
157 pdmpriv->InitDMFlag = pdmpriv->DMFlag;
159 Update_ODM_ComInfo_8723b(Adapter);
165 rtl8723b_HalDmWatchDog(
166 struct adapter *Adapter
169 bool bFwCurrentInPSMode = false;
170 bool bFwPSAwake = true;
171 u8 hw_init_completed = false;
172 struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
174 hw_init_completed = Adapter->hw_init_completed;
176 if (hw_init_completed == false)
179 bFwCurrentInPSMode = adapter_to_pwrctl(Adapter)->bFwCurrentInPSMode;
180 rtw_hal_get_hwreg(Adapter, HW_VAR_FWLPS_RF_ON, (u8 *)(&bFwPSAwake));
182 if ((hw_init_completed == true)
183 && ((!bFwCurrentInPSMode) && bFwPSAwake))
186 /* Calculate Tx/Rx statistics. */
188 dm_CheckStatistics(Adapter);
189 rtw_hal_check_rxfifo_full(Adapter);
193 if (hw_init_completed == true)
196 u8 bsta_state =false;
197 u8 bBtDisabled = true;
199 if (rtw_linked_check(Adapter)) {
201 if (check_fwstate(&Adapter->mlmepriv, WIFI_STATION_STATE))
205 ODM_CmnInfoUpdate(&pHalData->odmpriv , ODM_CMNINFO_LINK, bLinked);
206 ODM_CmnInfoUpdate(&pHalData->odmpriv , ODM_CMNINFO_STATION_STATE, bsta_state);
208 /* ODM_CmnInfoUpdate(&pHalData->odmpriv , ODM_CMNINFO_RSSI_MIN, pdmpriv->MinUndecoratedPWDBForDM); */
210 bBtDisabled = rtw_btcoex_IsBtDisabled(Adapter);
212 ODM_CmnInfoUpdate(&pHalData->odmpriv, ODM_CMNINFO_BT_ENABLED, ((bBtDisabled == true)?false:true));
214 ODM_DMWatchdog(&pHalData->odmpriv);
221 void rtl8723b_hal_dm_in_lps(struct adapter *padapter)
224 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
225 struct hal_com_data *pHalData = GET_HAL_DATA(padapter);
226 PDM_ODM_T pDM_Odm = &pHalData->odmpriv;
227 struct sta_priv *pstapriv = &padapter->stapriv;
228 struct sta_info *psta = NULL;
230 DBG_871X("%s, RSSI_Min =%d\n", __func__, pDM_Odm->RSSI_Min);
233 ODM_Write_DIG(pDM_Odm, pDM_Odm->RSSI_Min);
237 psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));
238 if (psta && (psta->rssi_stat.UndecoratedSmoothedPWDB > 0))
240 PWDB_rssi = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16));
242 rtl8723b_set_rssi_cmd(padapter, (u8 *)&PWDB_rssi);
247 void rtl8723b_HalDmWatchDog_in_LPS(struct adapter *Adapter)
250 struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
251 struct mlme_priv *pmlmepriv = &Adapter->mlmepriv;
252 struct dm_priv *pdmpriv = &pHalData->dmpriv;
253 PDM_ODM_T pDM_Odm = &pHalData->odmpriv;
254 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
255 struct sta_priv *pstapriv = &Adapter->stapriv;
256 struct sta_info *psta = NULL;
258 if (Adapter->hw_init_completed == false)
262 if (rtw_linked_check(Adapter))
265 ODM_CmnInfoUpdate(&pHalData->odmpriv , ODM_CMNINFO_LINK, bLinked);
267 if (bLinked == false)
270 if (!(pDM_Odm->SupportAbility & ODM_BB_RSSI_MONITOR))
274 /* ODM_DMWatchdog(&pHalData->odmpriv); */
275 /* Do DIG by RSSI In LPS-32K */
277 /* 1 Find MIN-RSSI */
278 psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));
282 pdmpriv->EntryMinUndecoratedSmoothedPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;
284 DBG_871X("CurIGValue =%d, EntryMinUndecoratedSmoothedPWDB = %d\n", pDM_DigTable->CurIGValue, pdmpriv->EntryMinUndecoratedSmoothedPWDB);
286 if (pdmpriv->EntryMinUndecoratedSmoothedPWDB <= 0)
289 pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
291 pDM_Odm->RSSI_Min = pdmpriv->MinUndecoratedPWDBForDM;
293 /* if (pDM_DigTable->CurIGValue != pDM_Odm->RSSI_Min) */
294 if ((pDM_DigTable->CurIGValue > pDM_Odm->RSSI_Min + 5) ||
295 (pDM_DigTable->CurIGValue < pDM_Odm->RSSI_Min - 5))
298 rtw_dm_in_lps_wk_cmd(Adapter);
308 void rtl8723b_init_dm_priv(struct adapter * Adapter)
310 struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
311 struct dm_priv *pdmpriv = &pHalData->dmpriv;
312 memset(pdmpriv, 0, sizeof(struct dm_priv));
313 Init_ODM_ComInfo_8723b(Adapter);