1 /******************************************************************************
\r
3 * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
\r
5 * This program is free software; you can redistribute it and/or modify it
\r
6 * under the terms of version 2 of the GNU General Public License as
\r
7 * published by the Free Software Foundation.
\r
9 * This program is distributed in the hope that it will be useful, but WITHOUT
\r
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
\r
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
\r
14 * You should have received a copy of the GNU General Public License along with
\r
15 * this program; if not, write to the Free Software Foundation, Inc.,
\r
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
\r
19 ******************************************************************************/
\r
21 #include <drv_types.h>
\r
22 #include <hal_data.h>
\r
23 #include <rtw_sreset.h>
\r
25 void sreset_init_value(_adapter *padapter)
\r
27 #if defined(DBG_CONFIG_ERROR_DETECT)
\r
28 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
\r
29 struct sreset_priv *psrtpriv = &pHalData->srestpriv;
\r
31 _rtw_mutex_init(&psrtpriv->silentreset_mutex);
\r
32 psrtpriv->silent_reset_inprogress = _FALSE;
\r
33 psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS;
\r
34 psrtpriv->last_tx_time =0;
\r
35 psrtpriv->last_tx_complete_time =0;
\r
38 void sreset_reset_value(_adapter *padapter)
\r
40 #if defined(DBG_CONFIG_ERROR_DETECT)
\r
41 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
\r
42 struct sreset_priv *psrtpriv = &pHalData->srestpriv;
\r
44 psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS;
\r
45 psrtpriv->last_tx_time =0;
\r
46 psrtpriv->last_tx_complete_time =0;
\r
50 u8 sreset_get_wifi_status(_adapter *padapter)
\r
52 #if defined(DBG_CONFIG_ERROR_DETECT)
\r
53 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
\r
54 struct sreset_priv *psrtpriv = &pHalData->srestpriv;
\r
56 u8 status = WIFI_STATUS_SUCCESS;
\r
59 if(psrtpriv->silent_reset_inprogress == _TRUE)
\r
63 val32 =rtw_read32(padapter,REG_TXDMA_STATUS);
\r
64 if(val32==0xeaeaeaea){
\r
65 psrtpriv->Wifi_Error_Status = WIFI_IF_NOT_EXIST;
\r
68 DBG_8192C("txdmastatu(%x)\n",val32);
\r
69 psrtpriv->Wifi_Error_Status = WIFI_MAC_TXDMA_ERROR;
\r
72 if(WIFI_STATUS_SUCCESS !=psrtpriv->Wifi_Error_Status)
\r
74 DBG_8192C("==>%s error_status(0x%x) \n",__FUNCTION__,psrtpriv->Wifi_Error_Status);
\r
75 status = (psrtpriv->Wifi_Error_Status &( ~(USB_READ_PORT_FAIL|USB_WRITE_PORT_FAIL)));
\r
77 DBG_8192C("==> %s wifi_status(0x%x)\n",__FUNCTION__,status);
\r
80 psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS;
\r
84 return WIFI_STATUS_SUCCESS;
\r
88 void sreset_set_wifi_error_status(_adapter *padapter, u32 status)
\r
90 #if defined(DBG_CONFIG_ERROR_DETECT)
\r
91 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
\r
92 pHalData->srestpriv.Wifi_Error_Status = status;
\r
96 void sreset_set_trigger_point(_adapter *padapter, s32 tgp)
\r
98 #if defined(DBG_CONFIG_ERROR_DETECT)
\r
99 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
\r
100 pHalData->srestpriv.dbg_trigger_point = tgp;
\r
104 bool sreset_inprogress(_adapter *padapter)
\r
106 #if defined(DBG_CONFIG_ERROR_RESET)
\r
107 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
\r
108 return pHalData->srestpriv.silent_reset_inprogress;
\r
114 void sreset_restore_security_station(_adapter *padapter)
\r
117 struct mlme_priv *mlmepriv = &padapter->mlmepriv;
\r
118 struct sta_priv * pstapriv = &padapter->stapriv;
\r
119 struct sta_info *psta;
\r
120 struct security_priv* psecuritypriv=&(padapter->securitypriv);
\r
121 struct mlme_ext_info *pmlmeinfo = &padapter->mlmeextpriv.mlmext_info;
\r
126 if (pmlmeinfo->auth_algo == dot11AuthAlgrthm_8021X) {
\r
128 #ifdef CONFIG_WAPI_SUPPORT
\r
129 } else if (padapter->wapiInfo.bWapiEnable && pmlmeinfo->auth_algo == dot11AuthAlgrthm_WAPI) {
\r
130 //Disable TxUseDefaultKey, RxUseDefaultKey, RxBroadcastUseDefaultKey.
\r
136 rtw_hal_set_hwreg(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8));
\r
140 if ( ( padapter->securitypriv.dot11PrivacyAlgrthm == _WEP40_ ) ||
\r
141 ( padapter->securitypriv.dot11PrivacyAlgrthm == _WEP104_ ))
\r
144 for(EntryId=0; EntryId<4; EntryId++)
\r
146 if(EntryId == psecuritypriv->dot11PrivacyKeyIndex)
\r
147 rtw_set_key(padapter,&padapter->securitypriv, EntryId, 1,_FALSE);
\r
149 rtw_set_key(padapter,&padapter->securitypriv, EntryId, 0,_FALSE);
\r
155 if((padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_) ||
\r
156 (padapter->securitypriv.dot11PrivacyAlgrthm == _AES_))
\r
158 psta = rtw_get_stainfo(pstapriv, get_bssid(mlmepriv));
\r
159 if (psta == NULL) {
\r
160 //DEBUG_ERR( ("Set wpa_set_encryption: Obtain Sta_info fail \n"));
\r
165 rtw_setstakey_cmd(padapter, psta, UNICAST_KEY,_FALSE);
\r
167 rtw_set_key(padapter,&padapter->securitypriv,padapter->securitypriv.dot118021XGrpKeyid, 0,_FALSE);
\r
172 void sreset_restore_network_station(_adapter *padapter)
\r
174 struct mlme_priv *mlmepriv = &padapter->mlmepriv;
\r
175 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
\r
176 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
\r
181 //=======================================================
\r
182 // reset related register of Beacon control
\r
184 //set MSR to nolink
\r
185 Set_MSR(padapter, _HW_STATE_NOLINK_);
\r
186 // reject all data frame
\r
187 rtw_write16(padapter, REG_RXFLTMAP2,0x00);
\r
189 rtw_write8(padapter, REG_DUAL_TSF_RST, (BIT(0)|BIT(1)));
\r
191 // disable update TSF
\r
192 SetBcnCtrlReg(padapter, BIT(4), 0);
\r
194 //=======================================================
\r
198 rtw_setopmode_cmd(padapter, Ndis802_11Infrastructure,_FALSE);
\r
202 #ifdef CONFIG_USB_HCI
\r
203 // TH=1 => means that invalidate usb rx aggregation
\r
204 // TH=0 => means that validate usb rx aggregation, use init value.
\r
205 if(mlmepriv->htpriv.ht_option) {
\r
206 if(padapter->registrypriv.wifi_spec==1)
\r
210 rtw_hal_set_hwreg(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold));
\r
213 rtw_hal_set_hwreg(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold));
\r
219 rtw_hal_set_hwreg(padapter, HW_VAR_DO_IQK , &doiqk);
\r
221 set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode);
\r
224 rtw_hal_set_hwreg(padapter , HW_VAR_DO_IQK , &doiqk);
\r
225 //disable dynamic functions, such as high power, DIG
\r
226 /*rtw_phydm_func_disable_all(padapter);*/
\r
228 rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, pmlmeinfo->network.MacAddress);
\r
232 rtw_hal_set_hwreg(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type));
\r
235 Set_MSR(padapter, (pmlmeinfo->state & 0x3));
\r
237 mlmeext_joinbss_event_callback(padapter, 1);
\r
238 //restore Sequence No.
\r
239 rtw_hal_set_hwreg(padapter, HW_VAR_RESTORE_HW_SEQ, 0);
\r
241 sreset_restore_security_station(padapter);
\r
245 void sreset_restore_network_status(_adapter *padapter)
\r
247 struct mlme_priv *mlmepriv = &padapter->mlmepriv;
\r
248 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
\r
249 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
\r
251 if (check_fwstate(mlmepriv, WIFI_STATION_STATE)) {
\r
252 DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_STATION_STATE\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv));
\r
253 sreset_restore_network_station(padapter);
\r
254 } else if (check_fwstate(mlmepriv, WIFI_AP_STATE)) {
\r
255 DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_AP_STATE\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv));
\r
256 rtw_ap_restore_network(padapter);
\r
257 } else if (check_fwstate(mlmepriv, WIFI_ADHOC_STATE)) {
\r
258 DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_ADHOC_STATE\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv));
\r
260 DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - ???\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv));
\r
264 void sreset_stop_adapter(_adapter *padapter)
\r
266 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
\r
267 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
\r
269 if (padapter == NULL)
\r
272 DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter));
\r
274 rtw_netif_stop_queue(padapter->pnetdev);
\r
276 rtw_cancel_all_timer(padapter);
\r
278 /* TODO: OS and HCI independent */
\r
279 #if defined(PLATFORM_LINUX) && defined(CONFIG_USB_HCI)
\r
280 tasklet_kill(&pxmitpriv->xmit_tasklet);
\r
283 if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY))
\r
284 rtw_scan_abort(padapter);
\r
286 if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING))
\r
288 rtw_set_to_roam(padapter, 0);
\r
289 _rtw_join_timeout_handler(padapter);
\r
294 void sreset_start_adapter(_adapter *padapter)
\r
296 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
\r
297 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
\r
299 if (padapter == NULL)
\r
302 DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter));
\r
304 if (check_fwstate(pmlmepriv, _FW_LINKED)) {
\r
305 sreset_restore_network_status(padapter);
\r
308 /* TODO: OS and HCI independent */
\r
309 #if defined(PLATFORM_LINUX) && defined(CONFIG_USB_HCI)
\r
310 tasklet_hi_schedule(&pxmitpriv->xmit_tasklet);
\r
313 if (is_primary_adapter(padapter))
\r
314 _set_timer(&padapter->mlmepriv.dynamic_chk_timer, 2000);
\r
316 rtw_netif_wake_queue(padapter->pnetdev);
\r
319 void sreset_reset(_adapter *padapter)
\r
321 #ifdef DBG_CONFIG_ERROR_RESET
\r
322 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
\r
323 struct sreset_priv *psrtpriv = &pHalData->srestpriv;
\r
324 struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
\r
325 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
\r
326 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
\r
328 u32 start = rtw_get_current_time();
\r
329 struct dvobj_priv *psdpriv = padapter->dvobj;
\r
330 struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
\r
332 DBG_871X("%s\n", __FUNCTION__);
\r
334 psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS;
\r
338 rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0, "SRESET");
\r
339 #endif//#ifdef CONFIG_LPS
\r
341 _enter_pwrlock(&pwrpriv->lock);
\r
343 psrtpriv->silent_reset_inprogress = _TRUE;
\r
344 pwrpriv->change_rfpwrstate = rf_off;
\r
346 sreset_stop_adapter(padapter);
\r
347 #ifdef CONFIG_CONCURRENT_MODE
\r
348 sreset_stop_adapter(padapter->pbuddy_adapter);
\r
352 _ips_enter(padapter);
\r
353 _ips_leave(padapter);
\r
356 sreset_start_adapter(padapter);
\r
357 #ifdef CONFIG_CONCURRENT_MODE
\r
358 sreset_start_adapter(padapter->pbuddy_adapter);
\r
361 psrtpriv->silent_reset_inprogress = _FALSE;
\r
363 _exit_pwrlock(&pwrpriv->lock);
\r
365 DBG_871X("%s done in %d ms\n", __FUNCTION__, rtw_get_passing_time_ms(start));
\r
366 pdbgpriv->dbg_sreset_cnt++;
\r