1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20#include "decl.h"
21#include "ioctl.h"
22#include "util.h"
23#include "fw.h"
24#include "main.h"
25#include "wmm.h"
26#include "11n.h"
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43void
44mwifiex_reset_connect_state(struct mwifiex_private *priv, u16 reason_code)
45{
46 struct mwifiex_adapter *adapter = priv->adapter;
47
48 if (!priv->media_connected)
49 return;
50
51 dev_dbg(adapter->dev, "info: handles disconnect event\n");
52
53 priv->media_connected = false;
54
55 priv->scan_block = false;
56
57
58 mwifiex_clean_txrx(priv);
59
60
61 priv->data_rssi_last = 0;
62 priv->data_nf_last = 0;
63 priv->data_rssi_avg = 0;
64 priv->data_nf_avg = 0;
65 priv->bcn_rssi_last = 0;
66 priv->bcn_nf_last = 0;
67 priv->bcn_rssi_avg = 0;
68 priv->bcn_nf_avg = 0;
69 priv->rxpd_rate = 0;
70 priv->rxpd_htinfo = 0;
71 priv->sec_info.wpa_enabled = false;
72 priv->sec_info.wpa2_enabled = false;
73 priv->wpa_ie_len = 0;
74
75 priv->sec_info.wapi_enabled = false;
76 priv->wapi_ie_len = 0;
77 priv->sec_info.wapi_key_on = false;
78
79 priv->sec_info.encryption_mode = 0;
80
81
82 priv->is_data_rate_auto = true;
83 priv->data_rate = 0;
84
85 if (priv->bss_mode == NL80211_IFTYPE_ADHOC) {
86 priv->adhoc_state = ADHOC_IDLE;
87 priv->adhoc_is_link_sensed = false;
88 }
89
90
91
92
93
94
95 dev_dbg(adapter->dev, "info: previous SSID=%s, SSID len=%u\n",
96 priv->prev_ssid.ssid, priv->prev_ssid.ssid_len);
97
98 dev_dbg(adapter->dev, "info: current SSID=%s, SSID len=%u\n",
99 priv->curr_bss_params.bss_descriptor.ssid.ssid,
100 priv->curr_bss_params.bss_descriptor.ssid.ssid_len);
101
102 memcpy(&priv->prev_ssid,
103 &priv->curr_bss_params.bss_descriptor.ssid,
104 sizeof(struct cfg80211_ssid));
105
106 memcpy(priv->prev_bssid,
107 priv->curr_bss_params.bss_descriptor.mac_address, ETH_ALEN);
108
109
110 memset(&priv->curr_bss_params, 0x00, sizeof(priv->curr_bss_params));
111
112 adapter->tx_lock_flag = false;
113 adapter->pps_uapsd_mode = false;
114
115 if (adapter->num_cmd_timeout && adapter->curr_cmd)
116 return;
117 priv->media_connected = false;
118 dev_dbg(adapter->dev,
119 "info: successfully disconnected from %pM: reason code %d\n",
120 priv->cfg_bssid, reason_code);
121 if (priv->bss_mode == NL80211_IFTYPE_STATION ||
122 priv->bss_mode == NL80211_IFTYPE_P2P_CLIENT) {
123 cfg80211_disconnected(priv->netdev, reason_code, NULL, 0,
124 GFP_KERNEL);
125 }
126 memset(priv->cfg_bssid, 0, ETH_ALEN);
127
128 mwifiex_stop_net_dev_queue(priv->netdev, adapter);
129 if (netif_carrier_ok(priv->netdev))
130 netif_carrier_off(priv->netdev);
131}
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184int mwifiex_process_sta_event(struct mwifiex_private *priv)
185{
186 struct mwifiex_adapter *adapter = priv->adapter;
187 int ret = 0;
188 u32 eventcause = adapter->event_cause;
189 u16 ctrl, reason_code;
190
191 switch (eventcause) {
192 case EVENT_DUMMY_HOST_WAKEUP_SIGNAL:
193 dev_err(adapter->dev,
194 "invalid EVENT: DUMMY_HOST_WAKEUP_SIGNAL, ignore it\n");
195 break;
196 case EVENT_LINK_SENSED:
197 dev_dbg(adapter->dev, "event: LINK_SENSED\n");
198 if (!netif_carrier_ok(priv->netdev))
199 netif_carrier_on(priv->netdev);
200 mwifiex_wake_up_net_dev_queue(priv->netdev, adapter);
201 break;
202
203 case EVENT_DEAUTHENTICATED:
204 dev_dbg(adapter->dev, "event: Deauthenticated\n");
205 if (priv->wps.session_enable) {
206 dev_dbg(adapter->dev,
207 "info: receive deauth event in wps session\n");
208 break;
209 }
210 adapter->dbg.num_event_deauth++;
211 if (priv->media_connected) {
212 reason_code =
213 le16_to_cpu(*(__le16 *)adapter->event_body);
214 mwifiex_reset_connect_state(priv, reason_code);
215 }
216 break;
217
218 case EVENT_DISASSOCIATED:
219 dev_dbg(adapter->dev, "event: Disassociated\n");
220 if (priv->wps.session_enable) {
221 dev_dbg(adapter->dev,
222 "info: receive disassoc event in wps session\n");
223 break;
224 }
225 adapter->dbg.num_event_disassoc++;
226 if (priv->media_connected) {
227 reason_code =
228 le16_to_cpu(*(__le16 *)adapter->event_body);
229 mwifiex_reset_connect_state(priv, reason_code);
230 }
231 break;
232
233 case EVENT_LINK_LOST:
234 dev_dbg(adapter->dev, "event: Link lost\n");
235 adapter->dbg.num_event_link_lost++;
236 if (priv->media_connected) {
237 reason_code =
238 le16_to_cpu(*(__le16 *)adapter->event_body);
239 mwifiex_reset_connect_state(priv, reason_code);
240 }
241 break;
242
243 case EVENT_PS_SLEEP:
244 dev_dbg(adapter->dev, "info: EVENT: SLEEP\n");
245
246 adapter->ps_state = PS_STATE_PRE_SLEEP;
247
248 mwifiex_check_ps_cond(adapter);
249 break;
250
251 case EVENT_PS_AWAKE:
252 dev_dbg(adapter->dev, "info: EVENT: AWAKE\n");
253 if (!adapter->pps_uapsd_mode &&
254 priv->media_connected && adapter->sleep_period.period) {
255 adapter->pps_uapsd_mode = true;
256 dev_dbg(adapter->dev,
257 "event: PPS/UAPSD mode activated\n");
258 }
259 adapter->tx_lock_flag = false;
260 if (adapter->pps_uapsd_mode && adapter->gen_null_pkt) {
261 if (mwifiex_check_last_packet_indication(priv)) {
262 if (adapter->data_sent) {
263 adapter->ps_state = PS_STATE_AWAKE;
264 adapter->pm_wakeup_card_req = false;
265 adapter->pm_wakeup_fw_try = false;
266 break;
267 }
268 if (!mwifiex_send_null_packet
269 (priv,
270 MWIFIEX_TxPD_POWER_MGMT_NULL_PACKET |
271 MWIFIEX_TxPD_POWER_MGMT_LAST_PACKET))
272 adapter->ps_state =
273 PS_STATE_SLEEP;
274 return 0;
275 }
276 }
277 adapter->ps_state = PS_STATE_AWAKE;
278 adapter->pm_wakeup_card_req = false;
279 adapter->pm_wakeup_fw_try = false;
280
281 break;
282
283 case EVENT_DEEP_SLEEP_AWAKE:
284 adapter->if_ops.wakeup_complete(adapter);
285 dev_dbg(adapter->dev, "event: DS_AWAKE\n");
286 if (adapter->is_deep_sleep)
287 adapter->is_deep_sleep = false;
288 break;
289
290 case EVENT_HS_ACT_REQ:
291 dev_dbg(adapter->dev, "event: HS_ACT_REQ\n");
292 ret = mwifiex_send_cmd_async(priv,
293 HostCmd_CMD_802_11_HS_CFG_ENH,
294 0, 0, NULL);
295 break;
296
297 case EVENT_MIC_ERR_UNICAST:
298 dev_dbg(adapter->dev, "event: UNICAST MIC ERROR\n");
299 cfg80211_michael_mic_failure(priv->netdev, priv->cfg_bssid,
300 NL80211_KEYTYPE_PAIRWISE,
301 -1, NULL, GFP_KERNEL);
302 break;
303
304 case EVENT_MIC_ERR_MULTICAST:
305 dev_dbg(adapter->dev, "event: MULTICAST MIC ERROR\n");
306 cfg80211_michael_mic_failure(priv->netdev, priv->cfg_bssid,
307 NL80211_KEYTYPE_GROUP,
308 -1, NULL, GFP_KERNEL);
309 break;
310 case EVENT_MIB_CHANGED:
311 case EVENT_INIT_DONE:
312 break;
313
314 case EVENT_ADHOC_BCN_LOST:
315 dev_dbg(adapter->dev, "event: ADHOC_BCN_LOST\n");
316 priv->adhoc_is_link_sensed = false;
317 mwifiex_clean_txrx(priv);
318 mwifiex_stop_net_dev_queue(priv->netdev, adapter);
319 if (netif_carrier_ok(priv->netdev))
320 netif_carrier_off(priv->netdev);
321 break;
322
323 case EVENT_BG_SCAN_REPORT:
324 dev_dbg(adapter->dev, "event: BGS_REPORT\n");
325 ret = mwifiex_send_cmd_async(priv,
326 HostCmd_CMD_802_11_BG_SCAN_QUERY,
327 HostCmd_ACT_GEN_GET, 0, NULL);
328 break;
329
330 case EVENT_PORT_RELEASE:
331 dev_dbg(adapter->dev, "event: PORT RELEASE\n");
332 break;
333
334 case EVENT_WMM_STATUS_CHANGE:
335 dev_dbg(adapter->dev, "event: WMM status changed\n");
336 ret = mwifiex_send_cmd_async(priv, HostCmd_CMD_WMM_GET_STATUS,
337 0, 0, NULL);
338 break;
339
340 case EVENT_RSSI_LOW:
341 cfg80211_cqm_rssi_notify(priv->netdev,
342 NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW,
343 GFP_KERNEL);
344 mwifiex_send_cmd_async(priv, HostCmd_CMD_RSSI_INFO,
345 HostCmd_ACT_GEN_GET, 0, NULL);
346 priv->subsc_evt_rssi_state = RSSI_LOW_RECVD;
347 dev_dbg(adapter->dev, "event: Beacon RSSI_LOW\n");
348 break;
349 case EVENT_SNR_LOW:
350 dev_dbg(adapter->dev, "event: Beacon SNR_LOW\n");
351 break;
352 case EVENT_MAX_FAIL:
353 dev_dbg(adapter->dev, "event: MAX_FAIL\n");
354 break;
355 case EVENT_RSSI_HIGH:
356 cfg80211_cqm_rssi_notify(priv->netdev,
357 NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH,
358 GFP_KERNEL);
359 mwifiex_send_cmd_async(priv, HostCmd_CMD_RSSI_INFO,
360 HostCmd_ACT_GEN_GET, 0, NULL);
361 priv->subsc_evt_rssi_state = RSSI_HIGH_RECVD;
362 dev_dbg(adapter->dev, "event: Beacon RSSI_HIGH\n");
363 break;
364 case EVENT_SNR_HIGH:
365 dev_dbg(adapter->dev, "event: Beacon SNR_HIGH\n");
366 break;
367 case EVENT_DATA_RSSI_LOW:
368 dev_dbg(adapter->dev, "event: Data RSSI_LOW\n");
369 break;
370 case EVENT_DATA_SNR_LOW:
371 dev_dbg(adapter->dev, "event: Data SNR_LOW\n");
372 break;
373 case EVENT_DATA_RSSI_HIGH:
374 dev_dbg(adapter->dev, "event: Data RSSI_HIGH\n");
375 break;
376 case EVENT_DATA_SNR_HIGH:
377 dev_dbg(adapter->dev, "event: Data SNR_HIGH\n");
378 break;
379 case EVENT_LINK_QUALITY:
380 dev_dbg(adapter->dev, "event: Link Quality\n");
381 break;
382 case EVENT_PRE_BEACON_LOST:
383 dev_dbg(adapter->dev, "event: Pre-Beacon Lost\n");
384 break;
385 case EVENT_IBSS_COALESCED:
386 dev_dbg(adapter->dev, "event: IBSS_COALESCED\n");
387 ret = mwifiex_send_cmd_async(priv,
388 HostCmd_CMD_802_11_IBSS_COALESCING_STATUS,
389 HostCmd_ACT_GEN_GET, 0, NULL);
390 break;
391 case EVENT_ADDBA:
392 dev_dbg(adapter->dev, "event: ADDBA Request\n");
393 mwifiex_send_cmd_async(priv, HostCmd_CMD_11N_ADDBA_RSP,
394 HostCmd_ACT_GEN_SET, 0,
395 adapter->event_body);
396 break;
397 case EVENT_DELBA:
398 dev_dbg(adapter->dev, "event: DELBA Request\n");
399 mwifiex_11n_delete_ba_stream(priv, adapter->event_body);
400 break;
401 case EVENT_BA_STREAM_TIEMOUT:
402 dev_dbg(adapter->dev, "event: BA Stream timeout\n");
403 mwifiex_11n_ba_stream_timeout(priv,
404 (struct host_cmd_ds_11n_batimeout
405 *)
406 adapter->event_body);
407 break;
408 case EVENT_AMSDU_AGGR_CTRL:
409 ctrl = le16_to_cpu(*(__le16 *)adapter->event_body);
410 dev_dbg(adapter->dev, "event: AMSDU_AGGR_CTRL %d\n", ctrl);
411
412 adapter->tx_buf_size =
413 min_t(u16, adapter->curr_tx_buf_size, ctrl);
414 dev_dbg(adapter->dev, "event: tx_buf_size %d\n",
415 adapter->tx_buf_size);
416 break;
417
418 case EVENT_WEP_ICV_ERR:
419 dev_dbg(adapter->dev, "event: WEP ICV error\n");
420 break;
421
422 case EVENT_BW_CHANGE:
423 dev_dbg(adapter->dev, "event: BW Change\n");
424 break;
425
426 case EVENT_HOSTWAKE_STAIE:
427 dev_dbg(adapter->dev, "event: HOSTWAKE_STAIE %d\n", eventcause);
428 break;
429
430 case EVENT_REMAIN_ON_CHAN_EXPIRED:
431 dev_dbg(adapter->dev, "event: Remain on channel expired\n");
432 cfg80211_remain_on_channel_expired(priv->wdev,
433 priv->roc_cfg.cookie,
434 &priv->roc_cfg.chan,
435 GFP_ATOMIC);
436
437 memset(&priv->roc_cfg, 0x00, sizeof(struct mwifiex_roc_cfg));
438
439 break;
440
441 case EVENT_CHANNEL_SWITCH_ANN:
442 dev_dbg(adapter->dev, "event: Channel Switch Announcement\n");
443 priv->csa_expire_time =
444 jiffies + msecs_to_jiffies(DFS_CHAN_MOVE_TIME);
445 priv->csa_chan = priv->curr_bss_params.bss_descriptor.channel;
446 ret = mwifiex_send_cmd_async(priv,
447 HostCmd_CMD_802_11_DEAUTHENTICATE,
448 HostCmd_ACT_GEN_SET, 0,
449 priv->curr_bss_params.bss_descriptor.mac_address);
450 break;
451
452 default:
453 dev_dbg(adapter->dev, "event: unknown event id: %#x\n",
454 eventcause);
455 break;
456 }
457
458 return ret;
459}
460