OSDN Git Service

Removed WAPI nastiness
[android-x86/external-modules-rtl8723au.git] / core / rtw_sreset.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  * You should have received a copy of the GNU General Public License along with
15  * this program; if not, write to the Free Software Foundation, Inc.,
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17  *
18  *
19  ******************************************************************************/
20
21 #include<rtw_sreset.h>
22
23 void sreset_init_value(_adapter *padapter)
24 {
25 #if defined(DBG_CONFIG_ERROR_DETECT)
26         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(padapter);
27         struct sreset_priv *psrtpriv = &pHalData->srestpriv;
28
29         _rtw_mutex_init(&psrtpriv->silentreset_mutex);
30         psrtpriv->silent_reset_inprogress = _FALSE;
31         psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS;
32         psrtpriv->last_tx_time =0;
33         psrtpriv->last_tx_complete_time =0;
34 #endif
35 }
36 void sreset_reset_value(_adapter *padapter)
37 {
38 #if defined(DBG_CONFIG_ERROR_DETECT)
39         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(padapter);
40         struct sreset_priv *psrtpriv = &pHalData->srestpriv;
41
42         psrtpriv->silent_reset_inprogress = _FALSE;
43         psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS;
44         psrtpriv->last_tx_time =0;
45         psrtpriv->last_tx_complete_time =0;
46 #endif
47 }
48
49 u8 sreset_get_wifi_status(_adapter *padapter)
50 {
51 #if defined(DBG_CONFIG_ERROR_DETECT)
52         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(padapter);
53         struct sreset_priv *psrtpriv = &pHalData->srestpriv;
54
55         u8 status = WIFI_STATUS_SUCCESS;
56         u32 val32 = 0;
57         if(psrtpriv->silent_reset_inprogress == _TRUE)
58         {
59                 return status;
60         }
61         val32 =rtw_read32(padapter,REG_TXDMA_STATUS);
62         if(val32==0xeaeaeaea){
63                 psrtpriv->Wifi_Error_Status = WIFI_IF_NOT_EXIST;
64         }
65         else if(val32!=0){
66                 DBG_8723A("txdmastatu(%x)\n",val32);
67                 psrtpriv->Wifi_Error_Status = WIFI_MAC_TXDMA_ERROR;
68         }
69
70         if(WIFI_STATUS_SUCCESS !=psrtpriv->Wifi_Error_Status)
71         {
72                 DBG_8723A("==>%s error_status(0x%x) \n",__FUNCTION__,psrtpriv->Wifi_Error_Status);
73                 status = (psrtpriv->Wifi_Error_Status &( ~(USB_READ_PORT_FAIL|USB_WRITE_PORT_FAIL)));
74         }
75         DBG_8723A("==> %s wifi_status(0x%x)\n",__FUNCTION__,status);
76
77         /* status restore */
78         psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS;
79
80         return status;
81 #else
82         return WIFI_STATUS_SUCCESS;
83 #endif
84 }
85
86 void sreset_set_wifi_error_status(_adapter *padapter, u32 status)
87 {
88 #if defined(DBG_CONFIG_ERROR_DETECT)
89         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(padapter);
90         pHalData->srestpriv.Wifi_Error_Status = status;
91 #endif
92 }
93
94 void sreset_set_trigger_point(_adapter *padapter, s32 tgp)
95 {
96 #if defined(DBG_CONFIG_ERROR_DETECT)
97         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(padapter);
98         pHalData->srestpriv.dbg_trigger_point = tgp;
99 #endif
100 }
101
102 bool sreset_inprogress(_adapter *padapter)
103 {
104 #if defined(DBG_CONFIG_ERROR_RESET)
105         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(padapter);
106         return pHalData->srestpriv.silent_reset_inprogress;
107 #else
108         return _FALSE;
109 #endif
110 }
111
112 void sreset_restore_security_station(_adapter *padapter)
113 {
114         u8 EntryId = 0;
115         struct mlme_priv *mlmepriv = &padapter->mlmepriv;
116         struct sta_priv * pstapriv = &padapter->stapriv;
117         struct sta_info *psta;
118         struct security_priv* psecuritypriv=&(padapter->securitypriv);
119         struct mlme_ext_info    *pmlmeinfo = &padapter->mlmeextpriv.mlmext_info;
120
121         {
122                 u8 val8;
123
124                 if (pmlmeinfo->auth_algo == dot11AuthAlgrthm_8021X) {
125                         val8 = 0xcc;
126                 } else {
127                         val8 = 0xcf;
128                 }
129                 rtw_hal_set_hwreg(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8));
130         }
131
132         if((padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_) ||
133                 (padapter->securitypriv.dot11PrivacyAlgrthm == _AES_))
134         {
135                 psta = rtw_get_stainfo(pstapriv, get_bssid(mlmepriv));
136                 if (psta == NULL) {
137                         /* DEBUG_ERR( ("Set wpa_set_encryption: Obtain Sta_info fail \n")); */
138                 }
139                 else
140                 {
141                         /* pairwise key */
142                         rtw_setstakey_cmd(padapter, (unsigned char *)psta, _TRUE);
143                         /* group key */
144                         rtw_set_key(padapter,&padapter->securitypriv,padapter->securitypriv.dot118021XGrpKeyid, 0);
145                 }
146         }
147 }
148
149 void sreset_restore_network_station(_adapter *padapter)
150 {
151         struct mlme_priv *mlmepriv = &padapter->mlmepriv;
152         struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
153         struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
154
155         rtw_setopmode_cmd(padapter, Ndis802_11Infrastructure);
156
157         {
158                 u8 threshold;
159                 /*  TH=1 => means that invalidate usb rx aggregation */
160                 /*  TH=0 => means that validate usb rx aggregation, use init value. */
161                 if(mlmepriv->htpriv.ht_option) {
162                         if(padapter->registrypriv.wifi_spec==1)
163                                 threshold = 1;
164                         else
165                                 threshold = 0;
166                         rtw_hal_set_hwreg(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold));
167                 } else {
168                         threshold = 1;
169                         rtw_hal_set_hwreg(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold));
170                 }
171         }
172
173         set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode);
174
175         /* disable dynamic functions, such as high power, DIG */
176         /* Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE); */
177
178         rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, pmlmeinfo->network.MacAddress);
179
180         {
181                 u8      join_type = 0;
182                 rtw_hal_set_hwreg(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type));
183         }
184
185         Set_MSR(padapter, (pmlmeinfo->state & 0x3));
186
187         mlmeext_joinbss_event_callback(padapter, 1);
188         /* restore Sequence No. */
189         rtw_write8(padapter,0x4dc,padapter->xmitpriv.nqos_ssn);
190
191         sreset_restore_security_station(padapter);
192 }
193
194 void sreset_restore_network_status(_adapter *padapter)
195 {
196         struct mlme_priv *mlmepriv = &padapter->mlmepriv;
197         struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
198         struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
199
200         if (check_fwstate(mlmepriv, WIFI_STATION_STATE)) {
201                 DBG_8723A(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_STATION_STATE\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv));
202                 sreset_restore_network_station(padapter);
203         } else if (check_fwstate(mlmepriv, WIFI_AP_STATE)) {
204                 DBG_8723A(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_AP_STATE\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv));
205                 rtw_ap_restore_network(padapter);
206         } else if (check_fwstate(mlmepriv, WIFI_ADHOC_STATE)) {
207                 DBG_8723A(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_ADHOC_STATE\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv));
208         } else {
209                 DBG_8723A(FUNC_ADPT_FMT" fwstate:0x%08x - ???\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv));
210         }
211 }
212
213 void sreset_stop_adapter(_adapter *padapter)
214 {
215         struct mlme_priv        *pmlmepriv = &(padapter->mlmepriv);
216         struct xmit_priv        *pxmitpriv = &padapter->xmitpriv;
217
218         if (padapter == NULL)
219                 return;
220
221         DBG_8723A(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter));
222
223         if (!rtw_netif_queue_stopped(padapter->pnetdev))
224                 rtw_netif_stop_queue(padapter->pnetdev);
225
226         rtw_cancel_all_timer(padapter);
227
228         /* TODO: OS and HCI independent */
229         tasklet_kill(&pxmitpriv->xmit_tasklet);
230
231         if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY))
232                 rtw_scan_abort(padapter);
233
234         if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING))
235                 _rtw_join_timeout_handler(padapter);
236 }
237
238 void sreset_start_adapter(_adapter *padapter)
239 {
240         struct mlme_priv        *pmlmepriv = &(padapter->mlmepriv);
241         struct xmit_priv        *pxmitpriv = &padapter->xmitpriv;
242
243         if (padapter == NULL)
244                 return;
245
246         DBG_8723A(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter));
247
248         if (check_fwstate(pmlmepriv, _FW_LINKED)) {
249                 sreset_restore_network_status(padapter);
250         }
251
252         /* TODO: OS and HCI independent */
253         tasklet_hi_schedule(&pxmitpriv->xmit_tasklet);
254
255         _set_timer(&padapter->mlmepriv.dynamic_chk_timer, 2000);
256
257         if (rtw_netif_queue_stopped(padapter->pnetdev))
258                 rtw_netif_wake_queue(padapter->pnetdev);
259 }
260
261 void sreset_reset(_adapter *padapter)
262 {
263 #ifdef DBG_CONFIG_ERROR_RESET
264         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(padapter);
265         struct sreset_priv *psrtpriv = &pHalData->srestpriv;
266         struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
267         struct mlme_priv        *pmlmepriv = &(padapter->mlmepriv);
268         struct xmit_priv        *pxmitpriv = &padapter->xmitpriv;
269         unsigned long irqL;
270         u32 start = rtw_get_current_time();
271
272         DBG_8723A("%s\n", __FUNCTION__);
273
274         psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS;
275
276         _enter_critical_mutex(&psrtpriv->silentreset_mutex, &irqL);
277         psrtpriv->silent_reset_inprogress = _TRUE;
278         pwrpriv->change_rfpwrstate = rf_off;
279
280         sreset_stop_adapter(padapter);
281         #ifdef CONFIG_CONCURRENT_MODE
282         sreset_stop_adapter(padapter->pbuddy_adapter);
283         #endif
284
285         #ifdef CONFIG_IPS
286         ips_enter(padapter);
287         ips_leave(padapter);
288         #endif
289
290         sreset_start_adapter(padapter);
291         #ifdef CONFIG_CONCURRENT_MODE
292         sreset_start_adapter(padapter->pbuddy_adapter);
293         #endif
294
295         psrtpriv->silent_reset_inprogress = _FALSE;
296         _exit_critical_mutex(&psrtpriv->silentreset_mutex, &irqL);
297
298         DBG_8723A("%s done in %d ms\n", __FUNCTION__, rtw_get_passing_time_ms(start));
299 #endif
300 }