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 cfg80211_disconnected(priv->netdev, reason_code, NULL, 0,
123 GFP_KERNEL);
124 }
125 memset(priv->cfg_bssid, 0, ETH_ALEN);
126
127 if (!netif_queue_stopped(priv->netdev))
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 if (netif_queue_stopped(priv->netdev))
201 mwifiex_wake_up_net_dev_queue(priv->netdev, adapter);
202 break;
203
204 case EVENT_DEAUTHENTICATED:
205 dev_dbg(adapter->dev, "event: Deauthenticated\n");
206 adapter->dbg.num_event_deauth++;
207 if (priv->media_connected) {
208 reason_code =
209 le16_to_cpu(*(__le16 *)adapter->event_body);
210 mwifiex_reset_connect_state(priv, reason_code);
211 }
212 break;
213
214 case EVENT_DISASSOCIATED:
215 dev_dbg(adapter->dev, "event: Disassociated\n");
216 adapter->dbg.num_event_disassoc++;
217 if (priv->media_connected) {
218 reason_code =
219 le16_to_cpu(*(__le16 *)adapter->event_body);
220 mwifiex_reset_connect_state(priv, reason_code);
221 }
222 break;
223
224 case EVENT_LINK_LOST:
225 dev_dbg(adapter->dev, "event: Link lost\n");
226 adapter->dbg.num_event_link_lost++;
227 if (priv->media_connected) {
228 reason_code =
229 le16_to_cpu(*(__le16 *)adapter->event_body);
230 mwifiex_reset_connect_state(priv, reason_code);
231 }
232 break;
233
234 case EVENT_PS_SLEEP:
235 dev_dbg(adapter->dev, "info: EVENT: SLEEP\n");
236
237 adapter->ps_state = PS_STATE_PRE_SLEEP;
238
239 mwifiex_check_ps_cond(adapter);
240 break;
241
242 case EVENT_PS_AWAKE:
243 dev_dbg(adapter->dev, "info: EVENT: AWAKE\n");
244 if (!adapter->pps_uapsd_mode &&
245 priv->media_connected && adapter->sleep_period.period) {
246 adapter->pps_uapsd_mode = true;
247 dev_dbg(adapter->dev,
248 "event: PPS/UAPSD mode activated\n");
249 }
250 adapter->tx_lock_flag = false;
251 if (adapter->pps_uapsd_mode && adapter->gen_null_pkt) {
252 if (mwifiex_check_last_packet_indication(priv)) {
253 if (adapter->data_sent) {
254 adapter->ps_state = PS_STATE_AWAKE;
255 adapter->pm_wakeup_card_req = false;
256 adapter->pm_wakeup_fw_try = false;
257 break;
258 }
259 if (!mwifiex_send_null_packet
260 (priv,
261 MWIFIEX_TxPD_POWER_MGMT_NULL_PACKET |
262 MWIFIEX_TxPD_POWER_MGMT_LAST_PACKET))
263 adapter->ps_state =
264 PS_STATE_SLEEP;
265 return 0;
266 }
267 }
268 adapter->ps_state = PS_STATE_AWAKE;
269 adapter->pm_wakeup_card_req = false;
270 adapter->pm_wakeup_fw_try = false;
271
272 break;
273
274 case EVENT_DEEP_SLEEP_AWAKE:
275 adapter->if_ops.wakeup_complete(adapter);
276 dev_dbg(adapter->dev, "event: DS_AWAKE\n");
277 if (adapter->is_deep_sleep)
278 adapter->is_deep_sleep = false;
279 break;
280
281 case EVENT_HS_ACT_REQ:
282 dev_dbg(adapter->dev, "event: HS_ACT_REQ\n");
283 ret = mwifiex_send_cmd_async(priv,
284 HostCmd_CMD_802_11_HS_CFG_ENH,
285 0, 0, NULL);
286 break;
287
288 case EVENT_MIC_ERR_UNICAST:
289 dev_dbg(adapter->dev, "event: UNICAST MIC ERROR\n");
290 cfg80211_michael_mic_failure(priv->netdev, priv->cfg_bssid,
291 NL80211_KEYTYPE_PAIRWISE,
292 -1, NULL, GFP_KERNEL);
293 break;
294
295 case EVENT_MIC_ERR_MULTICAST:
296 dev_dbg(adapter->dev, "event: MULTICAST MIC ERROR\n");
297 cfg80211_michael_mic_failure(priv->netdev, priv->cfg_bssid,
298 NL80211_KEYTYPE_GROUP,
299 -1, NULL, GFP_KERNEL);
300 break;
301 case EVENT_MIB_CHANGED:
302 case EVENT_INIT_DONE:
303 break;
304
305 case EVENT_ADHOC_BCN_LOST:
306 dev_dbg(adapter->dev, "event: ADHOC_BCN_LOST\n");
307 priv->adhoc_is_link_sensed = false;
308 mwifiex_clean_txrx(priv);
309 if (!netif_queue_stopped(priv->netdev))
310 mwifiex_stop_net_dev_queue(priv->netdev, adapter);
311 if (netif_carrier_ok(priv->netdev))
312 netif_carrier_off(priv->netdev);
313 break;
314
315 case EVENT_BG_SCAN_REPORT:
316 dev_dbg(adapter->dev, "event: BGS_REPORT\n");
317 ret = mwifiex_send_cmd_async(priv,
318 HostCmd_CMD_802_11_BG_SCAN_QUERY,
319 HostCmd_ACT_GEN_GET, 0, NULL);
320 break;
321
322 case EVENT_PORT_RELEASE:
323 dev_dbg(adapter->dev, "event: PORT RELEASE\n");
324 break;
325
326 case EVENT_WMM_STATUS_CHANGE:
327 dev_dbg(adapter->dev, "event: WMM status changed\n");
328 ret = mwifiex_send_cmd_async(priv, HostCmd_CMD_WMM_GET_STATUS,
329 0, 0, NULL);
330 break;
331
332 case EVENT_RSSI_LOW:
333 cfg80211_cqm_rssi_notify(priv->netdev,
334 NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW,
335 GFP_KERNEL);
336 mwifiex_send_cmd_async(priv, HostCmd_CMD_RSSI_INFO,
337 HostCmd_ACT_GEN_GET, 0, NULL);
338 priv->subsc_evt_rssi_state = RSSI_LOW_RECVD;
339 dev_dbg(adapter->dev, "event: Beacon RSSI_LOW\n");
340 break;
341 case EVENT_SNR_LOW:
342 dev_dbg(adapter->dev, "event: Beacon SNR_LOW\n");
343 break;
344 case EVENT_MAX_FAIL:
345 dev_dbg(adapter->dev, "event: MAX_FAIL\n");
346 break;
347 case EVENT_RSSI_HIGH:
348 cfg80211_cqm_rssi_notify(priv->netdev,
349 NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH,
350 GFP_KERNEL);
351 mwifiex_send_cmd_async(priv, HostCmd_CMD_RSSI_INFO,
352 HostCmd_ACT_GEN_GET, 0, NULL);
353 priv->subsc_evt_rssi_state = RSSI_HIGH_RECVD;
354 dev_dbg(adapter->dev, "event: Beacon RSSI_HIGH\n");
355 break;
356 case EVENT_SNR_HIGH:
357 dev_dbg(adapter->dev, "event: Beacon SNR_HIGH\n");
358 break;
359 case EVENT_DATA_RSSI_LOW:
360 dev_dbg(adapter->dev, "event: Data RSSI_LOW\n");
361 break;
362 case EVENT_DATA_SNR_LOW:
363 dev_dbg(adapter->dev, "event: Data SNR_LOW\n");
364 break;
365 case EVENT_DATA_RSSI_HIGH:
366 dev_dbg(adapter->dev, "event: Data RSSI_HIGH\n");
367 break;
368 case EVENT_DATA_SNR_HIGH:
369 dev_dbg(adapter->dev, "event: Data SNR_HIGH\n");
370 break;
371 case EVENT_LINK_QUALITY:
372 dev_dbg(adapter->dev, "event: Link Quality\n");
373 break;
374 case EVENT_PRE_BEACON_LOST:
375 dev_dbg(adapter->dev, "event: Pre-Beacon Lost\n");
376 break;
377 case EVENT_IBSS_COALESCED:
378 dev_dbg(adapter->dev, "event: IBSS_COALESCED\n");
379 ret = mwifiex_send_cmd_async(priv,
380 HostCmd_CMD_802_11_IBSS_COALESCING_STATUS,
381 HostCmd_ACT_GEN_GET, 0, NULL);
382 break;
383 case EVENT_ADDBA:
384 dev_dbg(adapter->dev, "event: ADDBA Request\n");
385 mwifiex_send_cmd_async(priv, HostCmd_CMD_11N_ADDBA_RSP,
386 HostCmd_ACT_GEN_SET, 0,
387 adapter->event_body);
388 break;
389 case EVENT_DELBA:
390 dev_dbg(adapter->dev, "event: DELBA Request\n");
391 mwifiex_11n_delete_ba_stream(priv, adapter->event_body);
392 break;
393 case EVENT_BA_STREAM_TIEMOUT:
394 dev_dbg(adapter->dev, "event: BA Stream timeout\n");
395 mwifiex_11n_ba_stream_timeout(priv,
396 (struct host_cmd_ds_11n_batimeout
397 *)
398 adapter->event_body);
399 break;
400 case EVENT_AMSDU_AGGR_CTRL:
401 ctrl = le16_to_cpu(*(__le16 *)adapter->event_body);
402 dev_dbg(adapter->dev, "event: AMSDU_AGGR_CTRL %d\n", ctrl);
403
404 adapter->tx_buf_size =
405 min_t(u16, adapter->curr_tx_buf_size, ctrl);
406 dev_dbg(adapter->dev, "event: tx_buf_size %d\n",
407 adapter->tx_buf_size);
408 break;
409
410 case EVENT_WEP_ICV_ERR:
411 dev_dbg(adapter->dev, "event: WEP ICV error\n");
412 break;
413
414 case EVENT_BW_CHANGE:
415 dev_dbg(adapter->dev, "event: BW Change\n");
416 break;
417
418 case EVENT_HOSTWAKE_STAIE:
419 dev_dbg(adapter->dev, "event: HOSTWAKE_STAIE %d\n", eventcause);
420 break;
421
422 case EVENT_REMAIN_ON_CHAN_EXPIRED:
423 dev_dbg(adapter->dev, "event: Remain on channel expired\n");
424 cfg80211_remain_on_channel_expired(priv->wdev,
425 priv->roc_cfg.cookie,
426 &priv->roc_cfg.chan,
427 priv->roc_cfg.chan_type,
428 GFP_ATOMIC);
429
430 memset(&priv->roc_cfg, 0x00, sizeof(struct mwifiex_roc_cfg));
431
432 break;
433
434 default:
435 dev_dbg(adapter->dev, "event: unknown event id: %#x\n",
436 eventcause);
437 break;
438 }
439
440 return ret;
441}
442