OSDN Git Service

staging: rtl8723bs: update to the latest driver
[android-x86/kernel.git] / drivers / staging / rtl8723bs / hal / rtl8723b_dm.c
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
26 static void
27 dm_CheckStatistics(
28 struct adapter *Adapter
29         )
30 {
31 }
32 /*  */
33 /*  functions */
34 /*  */
35 static void Init_ODM_ComInfo_8723b(struct adapter *Adapter)
36 {
37
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;
41         u8 cut_ver, fab_ver;
42
43         /*  */
44         /*  Init Value */
45         /*  */
46         memset(pDM_Odm, 0, sizeof(*pDM_Odm));
47
48         pDM_Odm->Adapter = Adapter;
49 #define ODM_CE 0x04
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);
54
55         fab_ver = ODM_TSMC;
56         cut_ver = ODM_CUT_A;
57
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));
62
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);
66
67
68         if (pHalData->rf_type == RF_1T1R) {
69                 ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_1T1R);
70         }
71         else if (pHalData->rf_type == RF_2T2R) {
72                 ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_2T2R);
73         }
74         else if (pHalData->rf_type == RF_1T2R) {
75                 ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_1T2R);
76         }
77
78         pdmpriv->InitODMFlag =  ODM_RF_CALIBRATION              |
79                                                         ODM_RF_TX_PWR_TRACK     /*  */
80                                                         ;
81
82         ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pdmpriv->InitODMFlag);
83 }
84
85 static void Update_ODM_ComInfo_8723b(struct adapter *Adapter)
86 {
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;
94         int i;
95         u8 zero = 0;
96
97         pdmpriv->InitODMFlag = 0
98                 | ODM_BB_DIG
99                 | ODM_BB_RA_MASK
100                 | ODM_BB_DYNAMIC_TXPWR
101                 | ODM_BB_FA_CNT
102                 | ODM_BB_RSSI_MONITOR
103                 | ODM_BB_CCK_PD
104                 | ODM_BB_PWR_SAVE
105                 | ODM_BB_CFO_TRACKING
106                 | ODM_MAC_EDCA_TURBO
107                 | ODM_RF_TX_PWR_TRACK
108                 | ODM_RF_CALIBRATION
109 #ifdef CONFIG_ODM_ADAPTIVITY
110                 | ODM_BB_ADAPTIVITY
111 #endif
112                 ;
113
114         /*  */
115         /*  Pointer reference */
116         /*  */
117         /* ODM_CMNINFO_MAC_PHY_MODE pHalData->MacPhyMode92D */
118         /*      ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_MAC_PHY_MODE,&(pDM_Odm->u8_temp)); */
119
120         ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pdmpriv->InitODMFlag);
121
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));
134
135         ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_SCAN,&(pmlmepriv->bScanInProcess));
136         ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_POWER_SAVING,&(pwrctrlpriv->bpower_saving));
137
138
139         for (i = 0; i < NUM_STA; i++)
140                 ODM_CmnInfoPtrArrayHook(pDM_Odm, ODM_CMNINFO_STA_STATUS, i, NULL);
141 }
142
143 void
144 rtl8723b_InitHalDm(
145 struct adapter *Adapter
146         )
147 {
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);
151
152         pdmpriv->DM_Type = DM_Type_ByDriver;
153         pdmpriv->DMFlag = DYNAMIC_FUNC_DISABLE;
154
155         pdmpriv->DMFlag |= DYNAMIC_FUNC_BT;
156
157         pdmpriv->InitDMFlag = pdmpriv->DMFlag;
158
159         Update_ODM_ComInfo_8723b(Adapter);
160
161         ODM_DMInit(pDM_Odm);
162 }
163
164 void
165 rtl8723b_HalDmWatchDog(
166 struct adapter *Adapter
167         )
168 {
169         bool            bFwCurrentInPSMode = false;
170         bool            bFwPSAwake = true;
171         u8 hw_init_completed = false;
172         struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
173
174         hw_init_completed = Adapter->hw_init_completed;
175
176         if (hw_init_completed == false)
177                 goto skip_dm;
178
179         bFwCurrentInPSMode = adapter_to_pwrctl(Adapter)->bFwCurrentInPSMode;
180         rtw_hal_get_hwreg(Adapter, HW_VAR_FWLPS_RF_ON, (u8 *)(&bFwPSAwake));
181
182         if ((hw_init_completed == true)
183                 && ((!bFwCurrentInPSMode) && bFwPSAwake))
184         {
185                 /*  */
186                 /*  Calculate Tx/Rx statistics. */
187                 /*  */
188                 dm_CheckStatistics(Adapter);
189                 rtw_hal_check_rxfifo_full(Adapter);
190         }
191
192         /* ODM */
193         if (hw_init_completed == true)
194         {
195                 u8 bLinked =false;
196                 u8 bsta_state =false;
197                 u8 bBtDisabled = true;
198
199                 if (rtw_linked_check(Adapter)) {
200                         bLinked = true;
201                         if (check_fwstate(&Adapter->mlmepriv, WIFI_STATION_STATE))
202                                 bsta_state = true;
203                 }
204
205                 ODM_CmnInfoUpdate(&pHalData->odmpriv , ODM_CMNINFO_LINK, bLinked);
206                 ODM_CmnInfoUpdate(&pHalData->odmpriv , ODM_CMNINFO_STATION_STATE, bsta_state);
207
208                 /* ODM_CmnInfoUpdate(&pHalData->odmpriv , ODM_CMNINFO_RSSI_MIN, pdmpriv->MinUndecoratedPWDBForDM); */
209
210                 bBtDisabled = rtw_btcoex_IsBtDisabled(Adapter);
211
212                 ODM_CmnInfoUpdate(&pHalData->odmpriv, ODM_CMNINFO_BT_ENABLED, ((bBtDisabled == true)?false:true));
213
214                 ODM_DMWatchdog(&pHalData->odmpriv);
215         }
216
217 skip_dm:
218         return;
219 }
220
221 void rtl8723b_hal_dm_in_lps(struct adapter *padapter)
222 {
223         u32 PWDB_rssi = 0;
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;
229
230         DBG_871X("%s, RSSI_Min =%d\n", __func__, pDM_Odm->RSSI_Min);
231
232         /* update IGI */
233         ODM_Write_DIG(pDM_Odm, pDM_Odm->RSSI_Min);
234
235
236         /* set rssi to fw */
237         psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));
238         if (psta && (psta->rssi_stat.UndecoratedSmoothedPWDB > 0))
239         {
240                 PWDB_rssi = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16));
241
242                 rtl8723b_set_rssi_cmd(padapter, (u8 *)&PWDB_rssi);
243         }
244
245 }
246
247 void rtl8723b_HalDmWatchDog_in_LPS(struct adapter *Adapter)
248 {
249         u8 bLinked =false;
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;
257
258         if (Adapter->hw_init_completed == false)
259                 goto skip_lps_dm;
260
261
262         if (rtw_linked_check(Adapter))
263                 bLinked = true;
264
265         ODM_CmnInfoUpdate(&pHalData->odmpriv , ODM_CMNINFO_LINK, bLinked);
266
267         if (bLinked == false)
268                 goto skip_lps_dm;
269
270         if (!(pDM_Odm->SupportAbility & ODM_BB_RSSI_MONITOR))
271                 goto skip_lps_dm;
272
273
274         /* ODM_DMWatchdog(&pHalData->odmpriv); */
275         /* Do DIG by RSSI In LPS-32K */
276
277       /* 1 Find MIN-RSSI */
278         psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));
279         if (psta == NULL)
280                 goto skip_lps_dm;
281
282         pdmpriv->EntryMinUndecoratedSmoothedPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;
283
284         DBG_871X("CurIGValue =%d, EntryMinUndecoratedSmoothedPWDB = %d\n", pDM_DigTable->CurIGValue, pdmpriv->EntryMinUndecoratedSmoothedPWDB);
285
286         if (pdmpriv->EntryMinUndecoratedSmoothedPWDB <= 0)
287                 goto skip_lps_dm;
288
289         pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
290
291         pDM_Odm->RSSI_Min = pdmpriv->MinUndecoratedPWDBForDM;
292
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))
296
297         {
298                 rtw_dm_in_lps_wk_cmd(Adapter);
299         }
300
301
302 skip_lps_dm:
303
304         return;
305
306 }
307
308 void rtl8723b_init_dm_priv(struct adapter * Adapter)
309 {
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);
314 }