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 #include <rtw_sreset.h>
17 #include <usb_ops_linux.h>
19 void rtw_sreset_init(struct rtw_adapter
*padapter
)
21 struct hal_data_8723a
*pHalData
= GET_HAL_DATA(padapter
);
22 struct sreset_priv
*psrtpriv
= &pHalData
->srestpriv
;
24 mutex_init(&psrtpriv
->silentreset_mutex
);
25 psrtpriv
->silent_reset_inprogress
= false;
26 psrtpriv
->last_tx_time
= 0;
27 psrtpriv
->last_tx_complete_time
= 0;
30 void rtw_sreset_reset_value(struct rtw_adapter
*padapter
)
32 struct hal_data_8723a
*pHalData
= GET_HAL_DATA(padapter
);
33 struct sreset_priv
*psrtpriv
= &pHalData
->srestpriv
;
35 psrtpriv
->silent_reset_inprogress
= false;
36 psrtpriv
->last_tx_time
= 0;
37 psrtpriv
->last_tx_complete_time
= 0;
40 bool rtw_sreset_inprogress(struct rtw_adapter
*padapter
)
42 struct rtw_adapter
*primary_adapter
= GET_PRIMARY_ADAPTER(padapter
);
43 struct hal_data_8723a
*pHalData
= GET_HAL_DATA(primary_adapter
);
45 return pHalData
->srestpriv
.silent_reset_inprogress
;
48 static void sreset_restore_security_station(struct rtw_adapter
*padapter
)
50 struct mlme_priv
*mlmepriv
= &padapter
->mlmepriv
;
51 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
52 struct sta_info
*psta
;
53 struct mlme_ext_info
*pmlmeinfo
= &padapter
->mlmeextpriv
.mlmext_info
;
56 if (pmlmeinfo
->auth_algo
== dot11AuthAlgrthm_8021X
)
61 rtl8723a_set_sec_cfg(padapter
, val8
);
63 if (padapter
->securitypriv
.dot11PrivacyAlgrthm
==
64 WLAN_CIPHER_SUITE_TKIP
||
65 padapter
->securitypriv
.dot11PrivacyAlgrthm
==
66 WLAN_CIPHER_SUITE_CCMP
) {
67 psta
= rtw_get_stainfo23a(pstapriv
, get_bssid(mlmepriv
));
69 /* DEBUG_ERR(("Set wpa_set_encryption: Obtain Sta_info fail\n")); */
72 rtw_setstakey_cmd23a(padapter
, (unsigned char *)psta
, true);
74 rtw_set_key23a(padapter
,&padapter
->securitypriv
, padapter
->securitypriv
.dot118021XGrpKeyid
, 0);
79 static void sreset_restore_network_station(struct rtw_adapter
*padapter
)
81 struct mlme_priv
*mlmepriv
= &padapter
->mlmepriv
;
82 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
83 struct mlme_ext_info
*pmlmeinfo
= &pmlmeext
->mlmext_info
;
86 rtw_setopmode_cmd23a(padapter
, NL80211_IFTYPE_STATION
);
88 /* TH = 1 => means that invalidate usb rx aggregation */
89 /* TH = 0 => means that validate usb rx aggregation, use init value. */
90 if (mlmepriv
->htpriv
.ht_option
) {
91 if (padapter
->registrypriv
.wifi_spec
== 1)
98 rtl8723a_set_rxdma_agg_pg_th(padapter
, threshold
);
100 set_channel_bwmode23a(padapter
, pmlmeext
->cur_channel
,
101 pmlmeext
->cur_ch_offset
, pmlmeext
->cur_bwmode
);
103 hw_var_set_bssid(padapter
, pmlmeinfo
->network
.MacAddress
);
104 hw_var_set_mlme_join(padapter
, 0);
106 rtl8723a_set_media_status(padapter
, pmlmeinfo
->state
& 0x3);
108 mlmeext_joinbss_event_callback23a(padapter
, 1);
109 /* restore Sequence No. */
110 rtl8723au_write8(padapter
, REG_NQOS_SEQ
, padapter
->xmitpriv
.nqos_ssn
);
112 sreset_restore_security_station(padapter
);
115 static void sreset_restore_network_status(struct rtw_adapter
*padapter
)
117 struct mlme_priv
*mlmepriv
= &padapter
->mlmepriv
;
119 if (check_fwstate(mlmepriv
, WIFI_STATION_STATE
)) {
120 DBG_8723A("%s(%s): fwstate:0x%08x - WIFI_STATION_STATE\n",
121 __func__
, padapter
->pnetdev
->name
,
122 get_fwstate(mlmepriv
));
123 sreset_restore_network_station(padapter
);
124 #ifdef CONFIG_8723AU_AP_MODE
125 } else if (check_fwstate(mlmepriv
, WIFI_AP_STATE
)) {
126 DBG_8723A("%s(%s): fwstate:0x%08x - WIFI_AP_STATE\n",
127 __func__
, padapter
->pnetdev
->name
,
128 get_fwstate(mlmepriv
));
129 rtw_ap_restore_network(padapter
);
131 } else if (check_fwstate(mlmepriv
, WIFI_ADHOC_STATE
)) {
132 DBG_8723A("%s(%s): fwstate:0x%08x - WIFI_ADHOC_STATE\n",
133 __func__
, padapter
->pnetdev
->name
,
134 get_fwstate(mlmepriv
));
136 DBG_8723A("%s(%s): fwstate:0x%08x - ???\n", __func__
,
137 padapter
->pnetdev
->name
, get_fwstate(mlmepriv
));
141 static void sreset_stop_adapter(struct rtw_adapter
*padapter
)
143 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
144 struct xmit_priv
*pxmitpriv
= &padapter
->xmitpriv
;
146 if (padapter
== NULL
)
149 DBG_8723A("%s(%s)\n", __func__
, padapter
->pnetdev
->name
);
151 if (!rtw_netif_queue_stopped(padapter
->pnetdev
))
152 netif_tx_stop_all_queues(padapter
->pnetdev
);
154 rtw_cancel_all_timer23a(padapter
);
156 /* TODO: OS and HCI independent */
157 tasklet_kill(&pxmitpriv
->xmit_tasklet
);
159 if (check_fwstate(pmlmepriv
, _FW_UNDER_SURVEY
))
160 rtw_scan_abort23a(padapter
);
162 if (check_fwstate(pmlmepriv
, _FW_UNDER_LINKING
))
163 rtw23a_join_to_handler((unsigned long)padapter
);
166 static void sreset_start_adapter(struct rtw_adapter
*padapter
)
168 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
169 struct xmit_priv
*pxmitpriv
= &padapter
->xmitpriv
;
171 if (padapter
== NULL
)
174 DBG_8723A("%s(%s)\n", __func__
, padapter
->pnetdev
->name
);
176 if (check_fwstate(pmlmepriv
, _FW_LINKED
))
177 sreset_restore_network_status(padapter
);
179 /* TODO: OS and HCI independent */
180 tasklet_hi_schedule(&pxmitpriv
->xmit_tasklet
);
182 mod_timer(&padapter
->mlmepriv
.dynamic_chk_timer
,
183 jiffies
+ msecs_to_jiffies(2000));
185 if (rtw_netif_queue_stopped(padapter
->pnetdev
))
186 netif_tx_wake_all_queues(padapter
->pnetdev
);
189 void rtw_sreset_reset(struct rtw_adapter
*active_adapter
)
191 struct rtw_adapter
*padapter
= GET_PRIMARY_ADAPTER(active_adapter
);
192 struct hal_data_8723a
*pHalData
= GET_HAL_DATA(padapter
);
193 struct sreset_priv
*psrtpriv
= &pHalData
->srestpriv
;
194 struct pwrctrl_priv
*pwrpriv
= &padapter
->pwrctrlpriv
;
195 unsigned long start
= jiffies
;
197 DBG_8723A("%s\n", __func__
);
199 mutex_lock(&psrtpriv
->silentreset_mutex
);
200 psrtpriv
->silent_reset_inprogress
= true;
201 pwrpriv
->change_rfpwrstate
= rf_off
;
203 sreset_stop_adapter(padapter
);
205 ips_enter23a(padapter
);
206 ips_leave23a(padapter
);
208 sreset_start_adapter(padapter
);
209 psrtpriv
->silent_reset_inprogress
= false;
210 mutex_unlock(&psrtpriv
->silentreset_mutex
);
212 DBG_8723A("%s done in %d ms\n", __func__
,
213 jiffies_to_msecs(jiffies
- start
));
This page took 0.040308 seconds and 5 git commands to generate.