1 // SPDX-License-Identifier: GPL-2.0
2 /*
3 * Copyright (c) 2012 - 2018 Microchip Technology Inc., and its subsidiaries.
4 * All rights reserved.
5 */
6
7 #include "wilc_wfi_cfgoperations.h"
8
9 #define FRAME_TYPE_ID 0
10 #define ACTION_CAT_ID 24
11 #define ACTION_SUBTYPE_ID 25
12 #define P2P_PUB_ACTION_SUBTYPE 30
13
14 #define ACTION_FRAME 0xd0
15 #define GO_INTENT_ATTR_ID 0x04
16 #define CHANLIST_ATTR_ID 0x0b
17 #define OPERCHAN_ATTR_ID 0x11
18 #define PUB_ACTION_ATTR_ID 0x04
19 #define P2PELEM_ATTR_ID 0xdd
20
21 #define GO_NEG_REQ 0x00
22 #define GO_NEG_RSP 0x01
23 #define GO_NEG_CONF 0x02
24 #define P2P_INV_REQ 0x03
25 #define P2P_INV_RSP 0x04
26 #define PUBLIC_ACT_VENDORSPEC 0x09
27 #define GAS_INITIAL_REQ 0x0a
28 #define GAS_INITIAL_RSP 0x0b
29
30 #define WILC_INVALID_CHANNEL 0
31
32 static const struct ieee80211_txrx_stypes
33 wilc_wfi_cfg80211_mgmt_types[NUM_NL80211_IFTYPES] = {
34 [NL80211_IFTYPE_STATION] = {
35 .tx = 0xffff,
36 .rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
37 BIT(IEEE80211_STYPE_PROBE_REQ >> 4)
38 },
39 [NL80211_IFTYPE_AP] = {
40 .tx = 0xffff,
41 .rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) |
42 BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) |
43 BIT(IEEE80211_STYPE_PROBE_REQ >> 4) |
44 BIT(IEEE80211_STYPE_DISASSOC >> 4) |
45 BIT(IEEE80211_STYPE_AUTH >> 4) |
46 BIT(IEEE80211_STYPE_DEAUTH >> 4) |
47 BIT(IEEE80211_STYPE_ACTION >> 4)
48 },
49 [NL80211_IFTYPE_P2P_CLIENT] = {
50 .tx = 0xffff,
51 .rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
52 BIT(IEEE80211_STYPE_PROBE_REQ >> 4) |
53 BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) |
54 BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) |
55 BIT(IEEE80211_STYPE_DISASSOC >> 4) |
56 BIT(IEEE80211_STYPE_AUTH >> 4) |
57 BIT(IEEE80211_STYPE_DEAUTH >> 4)
58 }
59 };
60
61 static const struct wiphy_wowlan_support wowlan_support = {
62 .flags = WIPHY_WOWLAN_ANY
63 };
64
65 struct wilc_p2p_mgmt_data {
66 int size;
67 u8 *buff;
68 };
69
70 static const u8 p2p_oui[] = {0x50, 0x6f, 0x9A, 0x09};
71 static const u8 p2p_vendor_spec[] = {0xdd, 0x05, 0x00, 0x08, 0x40, 0x03};
72
cfg_scan_result(enum scan_event scan_event,struct wilc_rcvd_net_info * info,void * user_void)73 static void cfg_scan_result(enum scan_event scan_event,
74 struct wilc_rcvd_net_info *info, void *user_void)
75 {
76 struct wilc_priv *priv = user_void;
77
78 if (!priv->cfg_scanning)
79 return;
80
81 if (scan_event == SCAN_EVENT_NETWORK_FOUND) {
82 s32 freq;
83 struct ieee80211_channel *channel;
84 struct cfg80211_bss *bss;
85 struct wiphy *wiphy = priv->dev->ieee80211_ptr->wiphy;
86
87 if (!wiphy || !info)
88 return;
89
90 freq = ieee80211_channel_to_frequency((s32)info->ch,
91 NL80211_BAND_2GHZ);
92 channel = ieee80211_get_channel(wiphy, freq);
93 if (!channel)
94 return;
95
96 bss = cfg80211_inform_bss_frame(wiphy, channel, info->mgmt,
97 info->frame_len,
98 (s32)info->rssi * 100,
99 GFP_KERNEL);
100 if (!bss)
101 cfg80211_put_bss(wiphy, bss);
102 } else if (scan_event == SCAN_EVENT_DONE) {
103 mutex_lock(&priv->scan_req_lock);
104
105 if (priv->scan_req) {
106 struct cfg80211_scan_info info = {
107 .aborted = false,
108 };
109
110 cfg80211_scan_done(priv->scan_req, &info);
111 priv->cfg_scanning = false;
112 priv->scan_req = NULL;
113 }
114 mutex_unlock(&priv->scan_req_lock);
115 } else if (scan_event == SCAN_EVENT_ABORTED) {
116 mutex_lock(&priv->scan_req_lock);
117
118 if (priv->scan_req) {
119 struct cfg80211_scan_info info = {
120 .aborted = false,
121 };
122
123 cfg80211_scan_done(priv->scan_req, &info);
124 priv->cfg_scanning = false;
125 priv->scan_req = NULL;
126 }
127 mutex_unlock(&priv->scan_req_lock);
128 }
129 }
130
cfg_connect_result(enum conn_event conn_disconn_evt,u8 mac_status,void * priv_data)131 static void cfg_connect_result(enum conn_event conn_disconn_evt, u8 mac_status,
132 void *priv_data)
133 {
134 struct wilc_priv *priv = priv_data;
135 struct net_device *dev = priv->dev;
136 struct wilc_vif *vif = netdev_priv(dev);
137 struct wilc *wl = vif->wilc;
138 struct host_if_drv *wfi_drv = priv->hif_drv;
139 struct wilc_conn_info *conn_info = &wfi_drv->conn_info;
140
141 vif->connecting = false;
142
143 if (conn_disconn_evt == CONN_DISCONN_EVENT_CONN_RESP) {
144 u16 connect_status = conn_info->status;
145
146 if (mac_status == WILC_MAC_STATUS_DISCONNECTED &&
147 connect_status == WLAN_STATUS_SUCCESS) {
148 connect_status = WLAN_STATUS_UNSPECIFIED_FAILURE;
149 wilc_wlan_set_bssid(priv->dev, NULL, WILC_STATION_MODE);
150
151 if (vif->iftype != WILC_CLIENT_MODE)
152 wl->sta_ch = WILC_INVALID_CHANNEL;
153
154 netdev_err(dev, "Unspecified failure\n");
155 }
156
157 if (connect_status == WLAN_STATUS_SUCCESS)
158 memcpy(priv->associated_bss, conn_info->bssid,
159 ETH_ALEN);
160
161 cfg80211_connect_result(dev, conn_info->bssid,
162 conn_info->req_ies,
163 conn_info->req_ies_len,
164 conn_info->resp_ies,
165 conn_info->resp_ies_len, connect_status,
166 GFP_KERNEL);
167 } else if (conn_disconn_evt == CONN_DISCONN_EVENT_DISCONN_NOTIF) {
168 u16 reason = 0;
169
170 priv->p2p.local_random = 0x01;
171 priv->p2p.recv_random = 0x00;
172 priv->p2p.is_wilc_ie = false;
173 eth_zero_addr(priv->associated_bss);
174 wilc_wlan_set_bssid(priv->dev, NULL, WILC_STATION_MODE);
175
176 if (vif->iftype != WILC_CLIENT_MODE) {
177 wl->sta_ch = WILC_INVALID_CHANNEL;
178 } else {
179 if (wfi_drv->ifc_up)
180 reason = 3;
181 else
182 reason = 1;
183 }
184
185 cfg80211_disconnected(dev, reason, NULL, 0, false, GFP_KERNEL);
186 }
187 }
188
wilc_get_wl_to_vif(struct wilc * wl)189 static struct wilc_vif *wilc_get_wl_to_vif(struct wilc *wl)
190 {
191 int i;
192
193 for (i = 0; i < wl->vif_num; i++)
194 if (wl->vif[i])
195 return wl->vif[i];
196
197 return ERR_PTR(-EINVAL);
198 }
199
set_channel(struct wiphy * wiphy,struct cfg80211_chan_def * chandef)200 static int set_channel(struct wiphy *wiphy,
201 struct cfg80211_chan_def *chandef)
202 {
203 struct wilc *wl = wiphy_priv(wiphy);
204 struct wilc_vif *vif;
205 u32 channelnum;
206 int result;
207
208 mutex_lock(&wl->vif_mutex);
209 vif = wilc_get_wl_to_vif(wl);
210 if (IS_ERR(vif)) {
211 mutex_unlock(&wl->vif_mutex);
212 return PTR_ERR(vif);
213 }
214
215 channelnum = ieee80211_frequency_to_channel(chandef->chan->center_freq);
216
217 wl->op_ch = channelnum;
218 result = wilc_set_mac_chnl_num(vif, channelnum);
219 if (result)
220 netdev_err(vif->ndev, "Error in setting channel\n");
221
222 mutex_unlock(&wl->vif_mutex);
223 return result;
224 }
225
scan(struct wiphy * wiphy,struct cfg80211_scan_request * request)226 static int scan(struct wiphy *wiphy, struct cfg80211_scan_request *request)
227 {
228 struct wilc_vif *vif = netdev_priv(request->wdev->netdev);
229 struct wilc_priv *priv = &vif->priv;
230 u32 i;
231 int ret = 0;
232 u8 scan_ch_list[WILC_MAX_NUM_SCANNED_CH];
233 u8 scan_type;
234
235 if (request->n_channels > WILC_MAX_NUM_SCANNED_CH) {
236 netdev_err(vif->ndev, "Requested scanned channels over\n");
237 return -EINVAL;
238 }
239
240 priv->scan_req = request;
241 priv->cfg_scanning = true;
242 for (i = 0; i < request->n_channels; i++) {
243 u16 freq = request->channels[i]->center_freq;
244
245 scan_ch_list[i] = ieee80211_frequency_to_channel(freq);
246 }
247
248 if (request->n_ssids)
249 scan_type = WILC_FW_ACTIVE_SCAN;
250 else
251 scan_type = WILC_FW_PASSIVE_SCAN;
252
253 ret = wilc_scan(vif, WILC_FW_USER_SCAN, scan_type, scan_ch_list,
254 request->n_channels, cfg_scan_result, (void *)priv,
255 request);
256
257 if (ret) {
258 priv->scan_req = NULL;
259 priv->cfg_scanning = false;
260 }
261
262 return ret;
263 }
264
connect(struct wiphy * wiphy,struct net_device * dev,struct cfg80211_connect_params * sme)265 static int connect(struct wiphy *wiphy, struct net_device *dev,
266 struct cfg80211_connect_params *sme)
267 {
268 struct wilc_vif *vif = netdev_priv(dev);
269 struct wilc_priv *priv = &vif->priv;
270 struct host_if_drv *wfi_drv = priv->hif_drv;
271 int ret;
272 u32 i;
273 u8 security = WILC_FW_SEC_NO;
274 enum authtype auth_type = WILC_FW_AUTH_ANY;
275 u32 cipher_group;
276 struct cfg80211_bss *bss;
277 void *join_params;
278 u8 ch;
279
280 vif->connecting = true;
281
282 memset(priv->wep_key, 0, sizeof(priv->wep_key));
283 memset(priv->wep_key_len, 0, sizeof(priv->wep_key_len));
284
285 cipher_group = sme->crypto.cipher_group;
286 if (cipher_group != 0) {
287 if (cipher_group == WLAN_CIPHER_SUITE_WEP40) {
288 security = WILC_FW_SEC_WEP;
289
290 priv->wep_key_len[sme->key_idx] = sme->key_len;
291 memcpy(priv->wep_key[sme->key_idx], sme->key,
292 sme->key_len);
293
294 wilc_set_wep_default_keyid(vif, sme->key_idx);
295 wilc_add_wep_key_bss_sta(vif, sme->key, sme->key_len,
296 sme->key_idx);
297 } else if (cipher_group == WLAN_CIPHER_SUITE_WEP104) {
298 security = WILC_FW_SEC_WEP_EXTENDED;
299
300 priv->wep_key_len[sme->key_idx] = sme->key_len;
301 memcpy(priv->wep_key[sme->key_idx], sme->key,
302 sme->key_len);
303
304 wilc_set_wep_default_keyid(vif, sme->key_idx);
305 wilc_add_wep_key_bss_sta(vif, sme->key, sme->key_len,
306 sme->key_idx);
307 } else if (sme->crypto.wpa_versions & NL80211_WPA_VERSION_2) {
308 if (cipher_group == WLAN_CIPHER_SUITE_TKIP)
309 security = WILC_FW_SEC_WPA2_TKIP;
310 else
311 security = WILC_FW_SEC_WPA2_AES;
312 } else if (sme->crypto.wpa_versions & NL80211_WPA_VERSION_1) {
313 if (cipher_group == WLAN_CIPHER_SUITE_TKIP)
314 security = WILC_FW_SEC_WPA_TKIP;
315 else
316 security = WILC_FW_SEC_WPA_AES;
317 } else {
318 ret = -ENOTSUPP;
319 netdev_err(dev, "%s: Unsupported cipher\n",
320 __func__);
321 goto out_error;
322 }
323 }
324
325 if ((sme->crypto.wpa_versions & NL80211_WPA_VERSION_1) ||
326 (sme->crypto.wpa_versions & NL80211_WPA_VERSION_2)) {
327 for (i = 0; i < sme->crypto.n_ciphers_pairwise; i++) {
328 u32 ciphers_pairwise = sme->crypto.ciphers_pairwise[i];
329
330 if (ciphers_pairwise == WLAN_CIPHER_SUITE_TKIP)
331 security |= WILC_FW_TKIP;
332 else
333 security |= WILC_FW_AES;
334 }
335 }
336
337 switch (sme->auth_type) {
338 case NL80211_AUTHTYPE_OPEN_SYSTEM:
339 auth_type = WILC_FW_AUTH_OPEN_SYSTEM;
340 break;
341
342 case NL80211_AUTHTYPE_SHARED_KEY:
343 auth_type = WILC_FW_AUTH_SHARED_KEY;
344 break;
345
346 default:
347 break;
348 }
349
350 if (sme->crypto.n_akm_suites) {
351 if (sme->crypto.akm_suites[0] == WLAN_AKM_SUITE_8021X)
352 auth_type = WILC_FW_AUTH_IEEE8021;
353 }
354
355 if (wfi_drv->usr_scan_req.scan_result) {
356 netdev_err(vif->ndev, "%s: Scan in progress\n", __func__);
357 ret = -EBUSY;
358 goto out_error;
359 }
360
361 bss = cfg80211_get_bss(wiphy, sme->channel, sme->bssid, sme->ssid,
362 sme->ssid_len, IEEE80211_BSS_TYPE_ANY,
363 IEEE80211_PRIVACY(sme->privacy));
364 if (!bss) {
365 ret = -EINVAL;
366 goto out_error;
367 }
368
369 if (ether_addr_equal_unaligned(vif->bssid, bss->bssid)) {
370 ret = -EALREADY;
371 goto out_put_bss;
372 }
373
374 join_params = wilc_parse_join_bss_param(bss, &sme->crypto);
375 if (!join_params) {
376 netdev_err(dev, "%s: failed to construct join param\n",
377 __func__);
378 ret = -EINVAL;
379 goto out_put_bss;
380 }
381
382 ch = ieee80211_frequency_to_channel(bss->channel->center_freq);
383 vif->wilc->op_ch = ch;
384 if (vif->iftype != WILC_CLIENT_MODE)
385 vif->wilc->sta_ch = ch;
386
387 wilc_wlan_set_bssid(dev, bss->bssid, WILC_STATION_MODE);
388
389 wfi_drv->conn_info.security = security;
390 wfi_drv->conn_info.auth_type = auth_type;
391 wfi_drv->conn_info.ch = ch;
392 wfi_drv->conn_info.conn_result = cfg_connect_result;
393 wfi_drv->conn_info.arg = priv;
394 wfi_drv->conn_info.param = join_params;
395
396 ret = wilc_set_join_req(vif, bss->bssid, sme->ie, sme->ie_len);
397 if (ret) {
398 netdev_err(dev, "wilc_set_join_req(): Error\n");
399 ret = -ENOENT;
400 if (vif->iftype != WILC_CLIENT_MODE)
401 vif->wilc->sta_ch = WILC_INVALID_CHANNEL;
402 wilc_wlan_set_bssid(dev, NULL, WILC_STATION_MODE);
403 wfi_drv->conn_info.conn_result = NULL;
404 kfree(join_params);
405 goto out_put_bss;
406 }
407 kfree(join_params);
408 cfg80211_put_bss(wiphy, bss);
409 return 0;
410
411 out_put_bss:
412 cfg80211_put_bss(wiphy, bss);
413
414 out_error:
415 vif->connecting = false;
416 return ret;
417 }
418
disconnect(struct wiphy * wiphy,struct net_device * dev,u16 reason_code)419 static int disconnect(struct wiphy *wiphy, struct net_device *dev,
420 u16 reason_code)
421 {
422 struct wilc_vif *vif = netdev_priv(dev);
423 struct wilc_priv *priv = &vif->priv;
424 struct wilc *wilc = vif->wilc;
425 int ret;
426
427 vif->connecting = false;
428
429 if (!wilc)
430 return -EIO;
431
432 if (wilc->close) {
433 /* already disconnected done */
434 cfg80211_disconnected(dev, 0, NULL, 0, true, GFP_KERNEL);
435 return 0;
436 }
437
438 if (vif->iftype != WILC_CLIENT_MODE)
439 wilc->sta_ch = WILC_INVALID_CHANNEL;
440 wilc_wlan_set_bssid(priv->dev, NULL, WILC_STATION_MODE);
441
442 priv->p2p.local_random = 0x01;
443 priv->p2p.recv_random = 0x00;
444 priv->p2p.is_wilc_ie = false;
445 priv->hif_drv->p2p_timeout = 0;
446
447 ret = wilc_disconnect(vif);
448 if (ret != 0) {
449 netdev_err(priv->dev, "Error in disconnecting\n");
450 ret = -EINVAL;
451 }
452
453 return ret;
454 }
455
wilc_wfi_cfg_copy_wep_info(struct wilc_priv * priv,u8 key_index,struct key_params * params)456 static inline void wilc_wfi_cfg_copy_wep_info(struct wilc_priv *priv,
457 u8 key_index,
458 struct key_params *params)
459 {
460 priv->wep_key_len[key_index] = params->key_len;
461 memcpy(priv->wep_key[key_index], params->key, params->key_len);
462 }
463
wilc_wfi_cfg_allocate_wpa_entry(struct wilc_priv * priv,u8 idx)464 static int wilc_wfi_cfg_allocate_wpa_entry(struct wilc_priv *priv, u8 idx)
465 {
466 if (!priv->wilc_gtk[idx]) {
467 priv->wilc_gtk[idx] = kzalloc(sizeof(*priv->wilc_gtk[idx]),
468 GFP_KERNEL);
469 if (!priv->wilc_gtk[idx])
470 return -ENOMEM;
471 }
472
473 if (!priv->wilc_ptk[idx]) {
474 priv->wilc_ptk[idx] = kzalloc(sizeof(*priv->wilc_ptk[idx]),
475 GFP_KERNEL);
476 if (!priv->wilc_ptk[idx])
477 return -ENOMEM;
478 }
479
480 return 0;
481 }
482
wilc_wfi_cfg_copy_wpa_info(struct wilc_wfi_key * key_info,struct key_params * params)483 static int wilc_wfi_cfg_copy_wpa_info(struct wilc_wfi_key *key_info,
484 struct key_params *params)
485 {
486 kfree(key_info->key);
487
488 key_info->key = kmemdup(params->key, params->key_len, GFP_KERNEL);
489 if (!key_info->key)
490 return -ENOMEM;
491
492 kfree(key_info->seq);
493
494 if (params->seq_len > 0) {
495 key_info->seq = kmemdup(params->seq, params->seq_len,
496 GFP_KERNEL);
497 if (!key_info->seq)
498 return -ENOMEM;
499 }
500
501 key_info->cipher = params->cipher;
502 key_info->key_len = params->key_len;
503 key_info->seq_len = params->seq_len;
504
505 return 0;
506 }
507
add_key(struct wiphy * wiphy,struct net_device * netdev,u8 key_index,bool pairwise,const u8 * mac_addr,struct key_params * params)508 static int add_key(struct wiphy *wiphy, struct net_device *netdev, u8 key_index,
509 bool pairwise, const u8 *mac_addr, struct key_params *params)
510
511 {
512 int ret = 0, keylen = params->key_len;
513 const u8 *rx_mic = NULL;
514 const u8 *tx_mic = NULL;
515 u8 mode = WILC_FW_SEC_NO;
516 u8 op_mode;
517 struct wilc_vif *vif = netdev_priv(netdev);
518 struct wilc_priv *priv = &vif->priv;
519
520 switch (params->cipher) {
521 case WLAN_CIPHER_SUITE_WEP40:
522 case WLAN_CIPHER_SUITE_WEP104:
523 if (priv->wdev.iftype == NL80211_IFTYPE_AP) {
524 wilc_wfi_cfg_copy_wep_info(priv, key_index, params);
525
526 if (params->cipher == WLAN_CIPHER_SUITE_WEP40)
527 mode = WILC_FW_SEC_WEP;
528 else
529 mode = WILC_FW_SEC_WEP_EXTENDED;
530
531 ret = wilc_add_wep_key_bss_ap(vif, params->key,
532 params->key_len,
533 key_index, mode,
534 WILC_FW_AUTH_OPEN_SYSTEM);
535 break;
536 }
537 if (memcmp(params->key, priv->wep_key[key_index],
538 params->key_len)) {
539 wilc_wfi_cfg_copy_wep_info(priv, key_index, params);
540
541 ret = wilc_add_wep_key_bss_sta(vif, params->key,
542 params->key_len,
543 key_index);
544 }
545
546 break;
547
548 case WLAN_CIPHER_SUITE_TKIP:
549 case WLAN_CIPHER_SUITE_CCMP:
550 if (priv->wdev.iftype == NL80211_IFTYPE_AP ||
551 priv->wdev.iftype == NL80211_IFTYPE_P2P_GO) {
552 struct wilc_wfi_key *key;
553
554 ret = wilc_wfi_cfg_allocate_wpa_entry(priv, key_index);
555 if (ret)
556 return -ENOMEM;
557
558 if (params->key_len > 16 &&
559 params->cipher == WLAN_CIPHER_SUITE_TKIP) {
560 tx_mic = params->key + 24;
561 rx_mic = params->key + 16;
562 keylen = params->key_len - 16;
563 }
564
565 if (!pairwise) {
566 if (params->cipher == WLAN_CIPHER_SUITE_TKIP)
567 mode = WILC_FW_SEC_WPA_TKIP;
568 else
569 mode = WILC_FW_SEC_WPA2_AES;
570
571 priv->wilc_groupkey = mode;
572
573 key = priv->wilc_gtk[key_index];
574 } else {
575 if (params->cipher == WLAN_CIPHER_SUITE_TKIP)
576 mode = WILC_FW_SEC_WPA_TKIP;
577 else
578 mode = priv->wilc_groupkey | WILC_FW_AES;
579
580 key = priv->wilc_ptk[key_index];
581 }
582 ret = wilc_wfi_cfg_copy_wpa_info(key, params);
583 if (ret)
584 return -ENOMEM;
585
586 op_mode = WILC_AP_MODE;
587 } else {
588 if (params->key_len > 16 &&
589 params->cipher == WLAN_CIPHER_SUITE_TKIP) {
590 rx_mic = params->key + 24;
591 tx_mic = params->key + 16;
592 keylen = params->key_len - 16;
593 }
594
595 op_mode = WILC_STATION_MODE;
596 }
597
598 if (!pairwise)
599 ret = wilc_add_rx_gtk(vif, params->key, keylen,
600 key_index, params->seq_len,
601 params->seq, rx_mic, tx_mic,
602 op_mode, mode);
603 else
604 ret = wilc_add_ptk(vif, params->key, keylen, mac_addr,
605 rx_mic, tx_mic, op_mode, mode,
606 key_index);
607
608 break;
609
610 default:
611 netdev_err(netdev, "%s: Unsupported cipher\n", __func__);
612 ret = -ENOTSUPP;
613 }
614
615 return ret;
616 }
617
del_key(struct wiphy * wiphy,struct net_device * netdev,u8 key_index,bool pairwise,const u8 * mac_addr)618 static int del_key(struct wiphy *wiphy, struct net_device *netdev,
619 u8 key_index,
620 bool pairwise,
621 const u8 *mac_addr)
622 {
623 struct wilc *wl = wiphy_priv(wiphy);
624 struct wilc_vif *vif = netdev_priv(netdev);
625 struct wilc_priv *priv = &vif->priv;
626
627 if (netdev == wl->vif[0]->ndev) {
628 if (priv->wilc_gtk[key_index]) {
629 kfree(priv->wilc_gtk[key_index]->key);
630 priv->wilc_gtk[key_index]->key = NULL;
631 kfree(priv->wilc_gtk[key_index]->seq);
632 priv->wilc_gtk[key_index]->seq = NULL;
633
634 kfree(priv->wilc_gtk[key_index]);
635 priv->wilc_gtk[key_index] = NULL;
636 }
637
638 if (priv->wilc_ptk[key_index]) {
639 kfree(priv->wilc_ptk[key_index]->key);
640 priv->wilc_ptk[key_index]->key = NULL;
641 kfree(priv->wilc_ptk[key_index]->seq);
642 priv->wilc_ptk[key_index]->seq = NULL;
643 kfree(priv->wilc_ptk[key_index]);
644 priv->wilc_ptk[key_index] = NULL;
645 }
646 }
647
648 if (key_index <= 3 && priv->wep_key_len[key_index]) {
649 memset(priv->wep_key[key_index], 0,
650 priv->wep_key_len[key_index]);
651 priv->wep_key_len[key_index] = 0;
652 wilc_remove_wep_key(vif, key_index);
653 }
654
655 return 0;
656 }
657
get_key(struct wiphy * wiphy,struct net_device * netdev,u8 key_index,bool pairwise,const u8 * mac_addr,void * cookie,void (* callback)(void * cookie,struct key_params *))658 static int get_key(struct wiphy *wiphy, struct net_device *netdev, u8 key_index,
659 bool pairwise, const u8 *mac_addr, void *cookie,
660 void (*callback)(void *cookie, struct key_params *))
661 {
662 struct wilc_vif *vif = netdev_priv(netdev);
663 struct wilc_priv *priv = &vif->priv;
664 struct key_params key_params;
665
666 if (!pairwise) {
667 key_params.key = priv->wilc_gtk[key_index]->key;
668 key_params.cipher = priv->wilc_gtk[key_index]->cipher;
669 key_params.key_len = priv->wilc_gtk[key_index]->key_len;
670 key_params.seq = priv->wilc_gtk[key_index]->seq;
671 key_params.seq_len = priv->wilc_gtk[key_index]->seq_len;
672 } else {
673 key_params.key = priv->wilc_ptk[key_index]->key;
674 key_params.cipher = priv->wilc_ptk[key_index]->cipher;
675 key_params.key_len = priv->wilc_ptk[key_index]->key_len;
676 key_params.seq = priv->wilc_ptk[key_index]->seq;
677 key_params.seq_len = priv->wilc_ptk[key_index]->seq_len;
678 }
679
680 callback(cookie, &key_params);
681
682 return 0;
683 }
684
set_default_key(struct wiphy * wiphy,struct net_device * netdev,u8 key_index,bool unicast,bool multicast)685 static int set_default_key(struct wiphy *wiphy, struct net_device *netdev,
686 u8 key_index, bool unicast, bool multicast)
687 {
688 struct wilc_vif *vif = netdev_priv(netdev);
689
690 wilc_set_wep_default_keyid(vif, key_index);
691
692 return 0;
693 }
694
get_station(struct wiphy * wiphy,struct net_device * dev,const u8 * mac,struct station_info * sinfo)695 static int get_station(struct wiphy *wiphy, struct net_device *dev,
696 const u8 *mac, struct station_info *sinfo)
697 {
698 struct wilc_vif *vif = netdev_priv(dev);
699 struct wilc_priv *priv = &vif->priv;
700 u32 i = 0;
701 u32 associatedsta = ~0;
702 u32 inactive_time = 0;
703
704 if (vif->iftype == WILC_AP_MODE || vif->iftype == WILC_GO_MODE) {
705 for (i = 0; i < NUM_STA_ASSOCIATED; i++) {
706 if (!(memcmp(mac,
707 priv->assoc_stainfo.sta_associated_bss[i],
708 ETH_ALEN))) {
709 associatedsta = i;
710 break;
711 }
712 }
713
714 if (associatedsta == ~0) {
715 netdev_err(dev, "sta required is not associated\n");
716 return -ENOENT;
717 }
718
719 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_INACTIVE_TIME);
720
721 wilc_get_inactive_time(vif, mac, &inactive_time);
722 sinfo->inactive_time = 1000 * inactive_time;
723 } else if (vif->iftype == WILC_STATION_MODE) {
724 struct rf_info stats;
725
726 wilc_get_statistics(vif, &stats);
727
728 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL) |
729 BIT_ULL(NL80211_STA_INFO_RX_PACKETS) |
730 BIT_ULL(NL80211_STA_INFO_TX_PACKETS) |
731 BIT_ULL(NL80211_STA_INFO_TX_FAILED) |
732 BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
733
734 sinfo->signal = stats.rssi;
735 sinfo->rx_packets = stats.rx_cnt;
736 sinfo->tx_packets = stats.tx_cnt + stats.tx_fail_cnt;
737 sinfo->tx_failed = stats.tx_fail_cnt;
738 sinfo->txrate.legacy = stats.link_speed * 10;
739
740 if (stats.link_speed > TCP_ACK_FILTER_LINK_SPEED_THRESH &&
741 stats.link_speed != DEFAULT_LINK_SPEED)
742 wilc_enable_tcp_ack_filter(vif, true);
743 else if (stats.link_speed != DEFAULT_LINK_SPEED)
744 wilc_enable_tcp_ack_filter(vif, false);
745 }
746 return 0;
747 }
748
change_bss(struct wiphy * wiphy,struct net_device * dev,struct bss_parameters * params)749 static int change_bss(struct wiphy *wiphy, struct net_device *dev,
750 struct bss_parameters *params)
751 {
752 return 0;
753 }
754
wilc_get_interface(struct wilc * wl)755 struct wilc_vif *wilc_get_interface(struct wilc *wl)
756 {
757 int i;
758 struct wilc_vif *vif = NULL;
759
760 mutex_lock(&wl->vif_mutex);
761 for (i = 0; i < wl->vif_num; i++) {
762 if (wl->vif[i]) {
763 vif = wl->vif[i];
764 break;
765 }
766 }
767 mutex_unlock(&wl->vif_mutex);
768 return vif;
769 }
770
set_wiphy_params(struct wiphy * wiphy,u32 changed)771 static int set_wiphy_params(struct wiphy *wiphy, u32 changed)
772 {
773 int ret;
774 struct cfg_param_attr cfg_param_val;
775 struct wilc *wl = wiphy_priv(wiphy);
776 struct wilc_vif *vif;
777 struct wilc_priv *priv;
778
779 vif = wilc_get_interface(wl);
780 if (!vif)
781 return -EINVAL;
782
783 priv = &vif->priv;
784 cfg_param_val.flag = 0;
785
786 if (changed & WIPHY_PARAM_RETRY_SHORT) {
787 netdev_dbg(vif->ndev,
788 "Setting WIPHY_PARAM_RETRY_SHORT %d\n",
789 wiphy->retry_short);
790 cfg_param_val.flag |= WILC_CFG_PARAM_RETRY_SHORT;
791 cfg_param_val.short_retry_limit = wiphy->retry_short;
792 }
793 if (changed & WIPHY_PARAM_RETRY_LONG) {
794 netdev_dbg(vif->ndev,
795 "Setting WIPHY_PARAM_RETRY_LONG %d\n",
796 wiphy->retry_long);
797 cfg_param_val.flag |= WILC_CFG_PARAM_RETRY_LONG;
798 cfg_param_val.long_retry_limit = wiphy->retry_long;
799 }
800 if (changed & WIPHY_PARAM_FRAG_THRESHOLD) {
801 if (wiphy->frag_threshold > 255 &&
802 wiphy->frag_threshold < 7937) {
803 netdev_dbg(vif->ndev,
804 "Setting WIPHY_PARAM_FRAG_THRESHOLD %d\n",
805 wiphy->frag_threshold);
806 cfg_param_val.flag |= WILC_CFG_PARAM_FRAG_THRESHOLD;
807 cfg_param_val.frag_threshold = wiphy->frag_threshold;
808 } else {
809 netdev_err(vif->ndev,
810 "Fragmentation threshold out of range\n");
811 return -EINVAL;
812 }
813 }
814
815 if (changed & WIPHY_PARAM_RTS_THRESHOLD) {
816 if (wiphy->rts_threshold > 255) {
817 netdev_dbg(vif->ndev,
818 "Setting WIPHY_PARAM_RTS_THRESHOLD %d\n",
819 wiphy->rts_threshold);
820 cfg_param_val.flag |= WILC_CFG_PARAM_RTS_THRESHOLD;
821 cfg_param_val.rts_threshold = wiphy->rts_threshold;
822 } else {
823 netdev_err(vif->ndev, "RTS threshold out of range\n");
824 return -EINVAL;
825 }
826 }
827
828 ret = wilc_hif_set_cfg(vif, &cfg_param_val);
829 if (ret)
830 netdev_err(priv->dev, "Error in setting WIPHY PARAMS\n");
831
832 return ret;
833 }
834
set_pmksa(struct wiphy * wiphy,struct net_device * netdev,struct cfg80211_pmksa * pmksa)835 static int set_pmksa(struct wiphy *wiphy, struct net_device *netdev,
836 struct cfg80211_pmksa *pmksa)
837 {
838 struct wilc_vif *vif = netdev_priv(netdev);
839 struct wilc_priv *priv = &vif->priv;
840 u32 i;
841 int ret = 0;
842 u8 flag = 0;
843
844 for (i = 0; i < priv->pmkid_list.numpmkid; i++) {
845 if (!memcmp(pmksa->bssid, priv->pmkid_list.pmkidlist[i].bssid,
846 ETH_ALEN)) {
847 flag = PMKID_FOUND;
848 break;
849 }
850 }
851 if (i < WILC_MAX_NUM_PMKIDS) {
852 memcpy(priv->pmkid_list.pmkidlist[i].bssid, pmksa->bssid,
853 ETH_ALEN);
854 memcpy(priv->pmkid_list.pmkidlist[i].pmkid, pmksa->pmkid,
855 WLAN_PMKID_LEN);
856 if (!(flag == PMKID_FOUND))
857 priv->pmkid_list.numpmkid++;
858 } else {
859 netdev_err(netdev, "Invalid PMKID index\n");
860 ret = -EINVAL;
861 }
862
863 if (!ret)
864 ret = wilc_set_pmkid_info(vif, &priv->pmkid_list);
865
866 return ret;
867 }
868
del_pmksa(struct wiphy * wiphy,struct net_device * netdev,struct cfg80211_pmksa * pmksa)869 static int del_pmksa(struct wiphy *wiphy, struct net_device *netdev,
870 struct cfg80211_pmksa *pmksa)
871 {
872 u32 i;
873 int ret = 0;
874 struct wilc_vif *vif = netdev_priv(netdev);
875 struct wilc_priv *priv = &vif->priv;
876
877 for (i = 0; i < priv->pmkid_list.numpmkid; i++) {
878 if (!memcmp(pmksa->bssid, priv->pmkid_list.pmkidlist[i].bssid,
879 ETH_ALEN)) {
880 memset(&priv->pmkid_list.pmkidlist[i], 0,
881 sizeof(struct wilc_pmkid));
882 break;
883 }
884 }
885
886 if (i < priv->pmkid_list.numpmkid && priv->pmkid_list.numpmkid > 0) {
887 for (; i < (priv->pmkid_list.numpmkid - 1); i++) {
888 memcpy(priv->pmkid_list.pmkidlist[i].bssid,
889 priv->pmkid_list.pmkidlist[i + 1].bssid,
890 ETH_ALEN);
891 memcpy(priv->pmkid_list.pmkidlist[i].pmkid,
892 priv->pmkid_list.pmkidlist[i + 1].pmkid,
893 WLAN_PMKID_LEN);
894 }
895 priv->pmkid_list.numpmkid--;
896 } else {
897 ret = -EINVAL;
898 }
899
900 return ret;
901 }
902
flush_pmksa(struct wiphy * wiphy,struct net_device * netdev)903 static int flush_pmksa(struct wiphy *wiphy, struct net_device *netdev)
904 {
905 struct wilc_vif *vif = netdev_priv(netdev);
906
907 memset(&vif->priv.pmkid_list, 0, sizeof(struct wilc_pmkid_attr));
908
909 return 0;
910 }
911
wilc_wfi_cfg_parse_ch_attr(u8 * buf,u8 ch_list_attr_idx,u8 op_ch_attr_idx,u8 sta_ch)912 static inline void wilc_wfi_cfg_parse_ch_attr(u8 *buf, u8 ch_list_attr_idx,
913 u8 op_ch_attr_idx, u8 sta_ch)
914 {
915 int i = 0;
916 int j = 0;
917
918 if (ch_list_attr_idx) {
919 u8 limit = ch_list_attr_idx + 3 + buf[ch_list_attr_idx + 1];
920
921 for (i = ch_list_attr_idx + 3; i < limit; i++) {
922 if (buf[i] == 0x51) {
923 for (j = i + 2; j < ((i + 2) + buf[i + 1]); j++)
924 buf[j] = sta_ch;
925 break;
926 }
927 }
928 }
929
930 if (op_ch_attr_idx) {
931 buf[op_ch_attr_idx + 6] = 0x51;
932 buf[op_ch_attr_idx + 7] = sta_ch;
933 }
934 }
935
wilc_wfi_cfg_parse_rx_action(u8 * buf,u32 len,u8 sta_ch)936 static void wilc_wfi_cfg_parse_rx_action(u8 *buf, u32 len, u8 sta_ch)
937 {
938 u32 index = 0;
939 u8 op_channel_attr_index = 0;
940 u8 channel_list_attr_index = 0;
941
942 while (index < len) {
943 if (buf[index] == GO_INTENT_ATTR_ID)
944 buf[index + 3] = (buf[index + 3] & 0x01) | (0x00 << 1);
945
946 if (buf[index] == CHANLIST_ATTR_ID)
947 channel_list_attr_index = index;
948 else if (buf[index] == OPERCHAN_ATTR_ID)
949 op_channel_attr_index = index;
950 index += buf[index + 1] + 3;
951 }
952 if (sta_ch != WILC_INVALID_CHANNEL)
953 wilc_wfi_cfg_parse_ch_attr(buf, channel_list_attr_index,
954 op_channel_attr_index, sta_ch);
955 }
956
wilc_wfi_cfg_parse_tx_action(u8 * buf,u32 len,bool oper_ch,u8 iftype,u8 sta_ch)957 static void wilc_wfi_cfg_parse_tx_action(u8 *buf, u32 len, bool oper_ch,
958 u8 iftype, u8 sta_ch)
959 {
960 u32 index = 0;
961 u8 op_channel_attr_index = 0;
962 u8 channel_list_attr_index = 0;
963
964 while (index < len) {
965 if (buf[index] == GO_INTENT_ATTR_ID) {
966 buf[index + 3] = (buf[index + 3] & 0x01) | (0x0f << 1);
967
968 break;
969 }
970
971 if (buf[index] == CHANLIST_ATTR_ID)
972 channel_list_attr_index = index;
973 else if (buf[index] == OPERCHAN_ATTR_ID)
974 op_channel_attr_index = index;
975 index += buf[index + 1] + 3;
976 }
977 if (sta_ch != WILC_INVALID_CHANNEL && oper_ch)
978 wilc_wfi_cfg_parse_ch_attr(buf, channel_list_attr_index,
979 op_channel_attr_index, sta_ch);
980 }
981
wilc_wfi_cfg_parse_rx_vendor_spec(struct wilc_priv * priv,u8 * buff,u32 size)982 static void wilc_wfi_cfg_parse_rx_vendor_spec(struct wilc_priv *priv, u8 *buff,
983 u32 size)
984 {
985 int i;
986 u8 subtype;
987 struct wilc_vif *vif = netdev_priv(priv->dev);
988
989 subtype = buff[P2P_PUB_ACTION_SUBTYPE];
990 if ((subtype == GO_NEG_REQ || subtype == GO_NEG_RSP) &&
991 !priv->p2p.is_wilc_ie) {
992 for (i = P2P_PUB_ACTION_SUBTYPE; i < size; i++) {
993 if (!memcmp(p2p_vendor_spec, &buff[i], 6)) {
994 priv->p2p.recv_random = buff[i + 6];
995 priv->p2p.is_wilc_ie = true;
996 break;
997 }
998 }
999 }
1000
1001 if (priv->p2p.local_random <= priv->p2p.recv_random) {
1002 netdev_dbg(vif->ndev,
1003 "PEER WILL BE GO LocaRand=%02x RecvRand %02x\n",
1004 priv->p2p.local_random, priv->p2p.recv_random);
1005 return;
1006 }
1007
1008 if (subtype == GO_NEG_REQ || subtype == GO_NEG_RSP ||
1009 subtype == P2P_INV_REQ || subtype == P2P_INV_RSP) {
1010 for (i = P2P_PUB_ACTION_SUBTYPE + 2; i < size; i++) {
1011 if (buff[i] == P2PELEM_ATTR_ID &&
1012 !(memcmp(p2p_oui, &buff[i + 2], 4))) {
1013 wilc_wfi_cfg_parse_rx_action(&buff[i + 6],
1014 size - (i + 6),
1015 vif->wilc->sta_ch);
1016 break;
1017 }
1018 }
1019 }
1020 }
1021
wilc_wfi_p2p_rx(struct wilc_vif * vif,u8 * buff,u32 size)1022 void wilc_wfi_p2p_rx(struct wilc_vif *vif, u8 *buff, u32 size)
1023 {
1024 struct wilc *wl = vif->wilc;
1025 struct wilc_priv *priv = &vif->priv;
1026 struct host_if_drv *wfi_drv = priv->hif_drv;
1027 u32 header, pkt_offset;
1028 s32 freq;
1029 __le16 fc;
1030
1031 header = get_unaligned_le32(buff - HOST_HDR_OFFSET);
1032 pkt_offset = GET_PKT_OFFSET(header);
1033
1034 if (pkt_offset & IS_MANAGMEMENT_CALLBACK) {
1035 bool ack = false;
1036
1037 if (buff[FRAME_TYPE_ID] == IEEE80211_STYPE_PROBE_RESP ||
1038 pkt_offset & IS_MGMT_STATUS_SUCCES)
1039 ack = true;
1040
1041 cfg80211_mgmt_tx_status(&priv->wdev, priv->tx_cookie, buff,
1042 size, ack, GFP_KERNEL);
1043 return;
1044 }
1045
1046 freq = ieee80211_channel_to_frequency(wl->op_ch, NL80211_BAND_2GHZ);
1047
1048 fc = ((struct ieee80211_hdr *)buff)->frame_control;
1049 if (!ieee80211_is_action(fc)) {
1050 cfg80211_rx_mgmt(&priv->wdev, freq, 0, buff, size, 0);
1051 return;
1052 }
1053
1054 if (priv->cfg_scanning &&
1055 time_after_eq(jiffies, (unsigned long)wfi_drv->p2p_timeout)) {
1056 netdev_dbg(vif->ndev, "Receiving action wrong ch\n");
1057 return;
1058 }
1059 if (buff[ACTION_CAT_ID] == PUB_ACTION_ATTR_ID) {
1060 u8 subtype = buff[P2P_PUB_ACTION_SUBTYPE];
1061
1062 switch (buff[ACTION_SUBTYPE_ID]) {
1063 case GAS_INITIAL_REQ:
1064 case GAS_INITIAL_RSP:
1065 break;
1066
1067 case PUBLIC_ACT_VENDORSPEC:
1068 if (!memcmp(p2p_oui, &buff[ACTION_SUBTYPE_ID + 1], 4))
1069 wilc_wfi_cfg_parse_rx_vendor_spec(priv, buff,
1070 size);
1071
1072 if ((subtype == GO_NEG_REQ || subtype == GO_NEG_RSP) &&
1073 priv->p2p.is_wilc_ie)
1074 size -= 7;
1075
1076 break;
1077
1078 default:
1079 netdev_dbg(vif->ndev,
1080 "%s: Not handled action frame type:%x\n",
1081 __func__, buff[ACTION_SUBTYPE_ID]);
1082 break;
1083 }
1084 }
1085
1086 cfg80211_rx_mgmt(&priv->wdev, freq, 0, buff, size, 0);
1087 }
1088
wilc_wfi_mgmt_tx_complete(void * priv,int status)1089 static void wilc_wfi_mgmt_tx_complete(void *priv, int status)
1090 {
1091 struct wilc_p2p_mgmt_data *pv_data = priv;
1092
1093 kfree(pv_data->buff);
1094 kfree(pv_data);
1095 }
1096
wilc_wfi_remain_on_channel_expired(void * data,u64 cookie)1097 static void wilc_wfi_remain_on_channel_expired(void *data, u64 cookie)
1098 {
1099 struct wilc_vif *vif = data;
1100 struct wilc_priv *priv = &vif->priv;
1101 struct wilc_wfi_p2p_listen_params *params = &priv->remain_on_ch_params;
1102
1103 if (cookie != params->listen_cookie)
1104 return;
1105
1106 priv->p2p_listen_state = false;
1107
1108 cfg80211_remain_on_channel_expired(&priv->wdev, params->listen_cookie,
1109 params->listen_ch, GFP_KERNEL);
1110 }
1111
remain_on_channel(struct wiphy * wiphy,struct wireless_dev * wdev,struct ieee80211_channel * chan,unsigned int duration,u64 * cookie)1112 static int remain_on_channel(struct wiphy *wiphy,
1113 struct wireless_dev *wdev,
1114 struct ieee80211_channel *chan,
1115 unsigned int duration, u64 *cookie)
1116 {
1117 int ret = 0;
1118 struct wilc_vif *vif = netdev_priv(wdev->netdev);
1119 struct wilc_priv *priv = &vif->priv;
1120 u64 id;
1121
1122 if (wdev->iftype == NL80211_IFTYPE_AP) {
1123 netdev_dbg(vif->ndev, "Required while in AP mode\n");
1124 return ret;
1125 }
1126
1127 id = ++priv->inc_roc_cookie;
1128 if (id == 0)
1129 id = ++priv->inc_roc_cookie;
1130
1131 ret = wilc_remain_on_channel(vif, id, duration, chan->hw_value,
1132 wilc_wfi_remain_on_channel_expired,
1133 (void *)vif);
1134 if (ret)
1135 return ret;
1136
1137 vif->wilc->op_ch = chan->hw_value;
1138
1139 priv->remain_on_ch_params.listen_ch = chan;
1140 priv->remain_on_ch_params.listen_cookie = id;
1141 *cookie = id;
1142 priv->p2p_listen_state = true;
1143 priv->remain_on_ch_params.listen_duration = duration;
1144
1145 cfg80211_ready_on_channel(wdev, *cookie, chan, duration, GFP_KERNEL);
1146 mod_timer(&vif->hif_drv->remain_on_ch_timer,
1147 jiffies + msecs_to_jiffies(duration));
1148
1149 return ret;
1150 }
1151
cancel_remain_on_channel(struct wiphy * wiphy,struct wireless_dev * wdev,u64 cookie)1152 static int cancel_remain_on_channel(struct wiphy *wiphy,
1153 struct wireless_dev *wdev,
1154 u64 cookie)
1155 {
1156 struct wilc_vif *vif = netdev_priv(wdev->netdev);
1157 struct wilc_priv *priv = &vif->priv;
1158
1159 if (cookie != priv->remain_on_ch_params.listen_cookie)
1160 return -ENOENT;
1161
1162 return wilc_listen_state_expired(vif, cookie);
1163 }
1164
wilc_wfi_cfg_tx_vendor_spec(struct wilc_priv * priv,struct wilc_p2p_mgmt_data * mgmt_tx,struct cfg80211_mgmt_tx_params * params,u8 iftype,u32 buf_len)1165 static void wilc_wfi_cfg_tx_vendor_spec(struct wilc_priv *priv,
1166 struct wilc_p2p_mgmt_data *mgmt_tx,
1167 struct cfg80211_mgmt_tx_params *params,
1168 u8 iftype, u32 buf_len)
1169 {
1170 const u8 *buf = params->buf;
1171 size_t len = params->len;
1172 u32 i;
1173 u8 subtype = buf[P2P_PUB_ACTION_SUBTYPE];
1174 struct wilc_vif *vif = netdev_priv(priv->dev);
1175
1176 if (subtype == GO_NEG_REQ || subtype == GO_NEG_RSP) {
1177 if (priv->p2p.local_random == 1 &&
1178 priv->p2p.recv_random < priv->p2p.local_random) {
1179 get_random_bytes(&priv->p2p.local_random, 1);
1180 priv->p2p.local_random++;
1181 }
1182 }
1183
1184 if (priv->p2p.local_random <= priv->p2p.recv_random ||
1185 !(subtype == GO_NEG_REQ || subtype == GO_NEG_RSP ||
1186 subtype == P2P_INV_REQ || subtype == P2P_INV_RSP))
1187 return;
1188
1189 for (i = P2P_PUB_ACTION_SUBTYPE + 2; i < len; i++) {
1190 if (buf[i] == P2PELEM_ATTR_ID &&
1191 !memcmp(p2p_oui, &buf[i + 2], 4)) {
1192 bool oper_ch = false;
1193 u8 *tx_buff = &mgmt_tx->buff[i + 6];
1194
1195 if (subtype == P2P_INV_REQ || subtype == P2P_INV_RSP)
1196 oper_ch = true;
1197
1198 wilc_wfi_cfg_parse_tx_action(tx_buff, len - (i + 6),
1199 oper_ch, iftype,
1200 vif->wilc->sta_ch);
1201
1202 break;
1203 }
1204 }
1205
1206 if (subtype != P2P_INV_REQ && subtype != P2P_INV_RSP) {
1207 int vendor_spec_len = sizeof(p2p_vendor_spec);
1208
1209 memcpy(&mgmt_tx->buff[len], p2p_vendor_spec,
1210 vendor_spec_len);
1211 mgmt_tx->buff[len + vendor_spec_len] = priv->p2p.local_random;
1212 mgmt_tx->size = buf_len;
1213 }
1214 }
1215
mgmt_tx(struct wiphy * wiphy,struct wireless_dev * wdev,struct cfg80211_mgmt_tx_params * params,u64 * cookie)1216 static int mgmt_tx(struct wiphy *wiphy,
1217 struct wireless_dev *wdev,
1218 struct cfg80211_mgmt_tx_params *params,
1219 u64 *cookie)
1220 {
1221 struct ieee80211_channel *chan = params->chan;
1222 unsigned int wait = params->wait;
1223 const u8 *buf = params->buf;
1224 size_t len = params->len;
1225 const struct ieee80211_mgmt *mgmt;
1226 struct wilc_p2p_mgmt_data *mgmt_tx;
1227 struct wilc_vif *vif = netdev_priv(wdev->netdev);
1228 struct wilc_priv *priv = &vif->priv;
1229 struct host_if_drv *wfi_drv = priv->hif_drv;
1230 u32 buf_len = len + sizeof(p2p_vendor_spec) +
1231 sizeof(priv->p2p.local_random);
1232 int ret = 0;
1233
1234 *cookie = prandom_u32();
1235 priv->tx_cookie = *cookie;
1236 mgmt = (const struct ieee80211_mgmt *)buf;
1237
1238 if (!ieee80211_is_mgmt(mgmt->frame_control))
1239 goto out;
1240
1241 mgmt_tx = kmalloc(sizeof(*mgmt_tx), GFP_KERNEL);
1242 if (!mgmt_tx) {
1243 ret = -ENOMEM;
1244 goto out;
1245 }
1246
1247 mgmt_tx->buff = kmalloc(buf_len, GFP_KERNEL);
1248 if (!mgmt_tx->buff) {
1249 ret = -ENOMEM;
1250 kfree(mgmt_tx);
1251 goto out;
1252 }
1253
1254 memcpy(mgmt_tx->buff, buf, len);
1255 mgmt_tx->size = len;
1256
1257 if (ieee80211_is_probe_resp(mgmt->frame_control)) {
1258 wilc_set_mac_chnl_num(vif, chan->hw_value);
1259 vif->wilc->op_ch = chan->hw_value;
1260 goto out_txq_add_pkt;
1261 }
1262
1263 if (!ieee80211_is_action(mgmt->frame_control))
1264 goto out_txq_add_pkt;
1265
1266 if (buf[ACTION_CAT_ID] == PUB_ACTION_ATTR_ID) {
1267 if (buf[ACTION_SUBTYPE_ID] != PUBLIC_ACT_VENDORSPEC ||
1268 buf[P2P_PUB_ACTION_SUBTYPE] != GO_NEG_CONF) {
1269 wilc_set_mac_chnl_num(vif, chan->hw_value);
1270 vif->wilc->op_ch = chan->hw_value;
1271 }
1272 switch (buf[ACTION_SUBTYPE_ID]) {
1273 case GAS_INITIAL_REQ:
1274 case GAS_INITIAL_RSP:
1275 break;
1276
1277 case PUBLIC_ACT_VENDORSPEC:
1278 if (!memcmp(p2p_oui, &buf[ACTION_SUBTYPE_ID + 1], 4))
1279 wilc_wfi_cfg_tx_vendor_spec(priv, mgmt_tx,
1280 params, vif->iftype,
1281 buf_len);
1282 else
1283 netdev_dbg(vif->ndev,
1284 "Not a P2P public action frame\n");
1285
1286 break;
1287
1288 default:
1289 netdev_dbg(vif->ndev,
1290 "%s: Not handled action frame type:%x\n",
1291 __func__, buf[ACTION_SUBTYPE_ID]);
1292 break;
1293 }
1294 }
1295
1296 wfi_drv->p2p_timeout = (jiffies + msecs_to_jiffies(wait));
1297
1298 out_txq_add_pkt:
1299
1300 wilc_wlan_txq_add_mgmt_pkt(wdev->netdev, mgmt_tx,
1301 mgmt_tx->buff, mgmt_tx->size,
1302 wilc_wfi_mgmt_tx_complete);
1303
1304 out:
1305
1306 return ret;
1307 }
1308
mgmt_tx_cancel_wait(struct wiphy * wiphy,struct wireless_dev * wdev,u64 cookie)1309 static int mgmt_tx_cancel_wait(struct wiphy *wiphy,
1310 struct wireless_dev *wdev,
1311 u64 cookie)
1312 {
1313 struct wilc_vif *vif = netdev_priv(wdev->netdev);
1314 struct wilc_priv *priv = &vif->priv;
1315 struct host_if_drv *wfi_drv = priv->hif_drv;
1316
1317 wfi_drv->p2p_timeout = jiffies;
1318
1319 if (!priv->p2p_listen_state) {
1320 struct wilc_wfi_p2p_listen_params *params;
1321
1322 params = &priv->remain_on_ch_params;
1323
1324 cfg80211_remain_on_channel_expired(wdev,
1325 params->listen_cookie,
1326 params->listen_ch,
1327 GFP_KERNEL);
1328 }
1329
1330 return 0;
1331 }
1332
wilc_mgmt_frame_register(struct wiphy * wiphy,struct wireless_dev * wdev,u16 frame_type,bool reg)1333 void wilc_mgmt_frame_register(struct wiphy *wiphy, struct wireless_dev *wdev,
1334 u16 frame_type, bool reg)
1335 {
1336 struct wilc *wl = wiphy_priv(wiphy);
1337 struct wilc_vif *vif = netdev_priv(wdev->netdev);
1338
1339 if (!frame_type)
1340 return;
1341
1342 switch (frame_type) {
1343 case IEEE80211_STYPE_PROBE_REQ:
1344 vif->frame_reg[0].type = frame_type;
1345 vif->frame_reg[0].reg = reg;
1346 break;
1347
1348 case IEEE80211_STYPE_ACTION:
1349 vif->frame_reg[1].type = frame_type;
1350 vif->frame_reg[1].reg = reg;
1351 break;
1352
1353 default:
1354 break;
1355 }
1356
1357 if (!wl->initialized)
1358 return;
1359 wilc_frame_register(vif, frame_type, reg);
1360 }
1361
set_cqm_rssi_config(struct wiphy * wiphy,struct net_device * dev,s32 rssi_thold,u32 rssi_hyst)1362 static int set_cqm_rssi_config(struct wiphy *wiphy, struct net_device *dev,
1363 s32 rssi_thold, u32 rssi_hyst)
1364 {
1365 return 0;
1366 }
1367
dump_station(struct wiphy * wiphy,struct net_device * dev,int idx,u8 * mac,struct station_info * sinfo)1368 static int dump_station(struct wiphy *wiphy, struct net_device *dev,
1369 int idx, u8 *mac, struct station_info *sinfo)
1370 {
1371 struct wilc_vif *vif = netdev_priv(dev);
1372 int ret;
1373
1374 if (idx != 0)
1375 return -ENOENT;
1376
1377 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
1378
1379 ret = wilc_get_rssi(vif, &sinfo->signal);
1380 if (ret)
1381 return ret;
1382
1383 memcpy(mac, vif->priv.associated_bss, ETH_ALEN);
1384 return 0;
1385 }
1386
set_power_mgmt(struct wiphy * wiphy,struct net_device * dev,bool enabled,int timeout)1387 static int set_power_mgmt(struct wiphy *wiphy, struct net_device *dev,
1388 bool enabled, int timeout)
1389 {
1390 struct wilc_vif *vif = netdev_priv(dev);
1391 struct wilc_priv *priv = &vif->priv;
1392
1393 if (!priv->hif_drv)
1394 return -EIO;
1395
1396 wilc_set_power_mgmt(vif, enabled, timeout);
1397
1398 return 0;
1399 }
1400
change_virtual_intf(struct wiphy * wiphy,struct net_device * dev,enum nl80211_iftype type,struct vif_params * params)1401 static int change_virtual_intf(struct wiphy *wiphy, struct net_device *dev,
1402 enum nl80211_iftype type,
1403 struct vif_params *params)
1404 {
1405 struct wilc *wl = wiphy_priv(wiphy);
1406 struct wilc_vif *vif = netdev_priv(dev);
1407 struct wilc_priv *priv = &vif->priv;
1408
1409 priv->p2p.local_random = 0x01;
1410 priv->p2p.recv_random = 0x00;
1411 priv->p2p.is_wilc_ie = false;
1412
1413 switch (type) {
1414 case NL80211_IFTYPE_STATION:
1415 vif->connecting = false;
1416 dev->ieee80211_ptr->iftype = type;
1417 priv->wdev.iftype = type;
1418 vif->monitor_flag = 0;
1419 if (vif->iftype == WILC_AP_MODE || vif->iftype == WILC_GO_MODE)
1420 wilc_wfi_deinit_mon_interface(wl, true);
1421 vif->iftype = WILC_STATION_MODE;
1422
1423 if (wl->initialized)
1424 wilc_set_operation_mode(vif, wilc_get_vif_idx(vif),
1425 WILC_STATION_MODE, vif->idx);
1426
1427 memset(priv->assoc_stainfo.sta_associated_bss, 0,
1428 WILC_MAX_NUM_STA * ETH_ALEN);
1429 break;
1430
1431 case NL80211_IFTYPE_P2P_CLIENT:
1432 vif->connecting = false;
1433 dev->ieee80211_ptr->iftype = type;
1434 priv->wdev.iftype = type;
1435 vif->monitor_flag = 0;
1436 vif->iftype = WILC_CLIENT_MODE;
1437
1438 if (wl->initialized)
1439 wilc_set_operation_mode(vif, wilc_get_vif_idx(vif),
1440 WILC_STATION_MODE, vif->idx);
1441 break;
1442
1443 case NL80211_IFTYPE_AP:
1444 dev->ieee80211_ptr->iftype = type;
1445 priv->wdev.iftype = type;
1446 vif->iftype = WILC_AP_MODE;
1447
1448 if (wl->initialized)
1449 wilc_set_operation_mode(vif, wilc_get_vif_idx(vif),
1450 WILC_AP_MODE, vif->idx);
1451 break;
1452
1453 case NL80211_IFTYPE_P2P_GO:
1454 dev->ieee80211_ptr->iftype = type;
1455 priv->wdev.iftype = type;
1456 vif->iftype = WILC_GO_MODE;
1457
1458 if (wl->initialized)
1459 wilc_set_operation_mode(vif, wilc_get_vif_idx(vif),
1460 WILC_AP_MODE, vif->idx);
1461 break;
1462
1463 default:
1464 netdev_err(dev, "Unknown interface type= %d\n", type);
1465 return -EINVAL;
1466 }
1467
1468 return 0;
1469 }
1470
start_ap(struct wiphy * wiphy,struct net_device * dev,struct cfg80211_ap_settings * settings)1471 static int start_ap(struct wiphy *wiphy, struct net_device *dev,
1472 struct cfg80211_ap_settings *settings)
1473 {
1474 struct wilc_vif *vif = netdev_priv(dev);
1475 int ret;
1476
1477 ret = set_channel(wiphy, &settings->chandef);
1478 if (ret != 0)
1479 netdev_err(dev, "Error in setting channel\n");
1480
1481 wilc_wlan_set_bssid(dev, dev->dev_addr, WILC_AP_MODE);
1482
1483 return wilc_add_beacon(vif, settings->beacon_interval,
1484 settings->dtim_period, &settings->beacon);
1485 }
1486
change_beacon(struct wiphy * wiphy,struct net_device * dev,struct cfg80211_beacon_data * beacon)1487 static int change_beacon(struct wiphy *wiphy, struct net_device *dev,
1488 struct cfg80211_beacon_data *beacon)
1489 {
1490 struct wilc_vif *vif = netdev_priv(dev);
1491
1492 return wilc_add_beacon(vif, 0, 0, beacon);
1493 }
1494
stop_ap(struct wiphy * wiphy,struct net_device * dev)1495 static int stop_ap(struct wiphy *wiphy, struct net_device *dev)
1496 {
1497 int ret;
1498 struct wilc_vif *vif = netdev_priv(dev);
1499
1500 wilc_wlan_set_bssid(dev, NULL, WILC_AP_MODE);
1501
1502 ret = wilc_del_beacon(vif);
1503
1504 if (ret)
1505 netdev_err(dev, "Host delete beacon fail\n");
1506
1507 return ret;
1508 }
1509
add_station(struct wiphy * wiphy,struct net_device * dev,const u8 * mac,struct station_parameters * params)1510 static int add_station(struct wiphy *wiphy, struct net_device *dev,
1511 const u8 *mac, struct station_parameters *params)
1512 {
1513 int ret = 0;
1514 struct wilc_vif *vif = netdev_priv(dev);
1515 struct wilc_priv *priv = &vif->priv;
1516
1517 if (vif->iftype == WILC_AP_MODE || vif->iftype == WILC_GO_MODE) {
1518 memcpy(priv->assoc_stainfo.sta_associated_bss[params->aid], mac,
1519 ETH_ALEN);
1520
1521 ret = wilc_add_station(vif, mac, params);
1522 if (ret)
1523 netdev_err(dev, "Host add station fail\n");
1524 }
1525
1526 return ret;
1527 }
1528
del_station(struct wiphy * wiphy,struct net_device * dev,struct station_del_parameters * params)1529 static int del_station(struct wiphy *wiphy, struct net_device *dev,
1530 struct station_del_parameters *params)
1531 {
1532 const u8 *mac = params->mac;
1533 int ret = 0;
1534 struct wilc_vif *vif = netdev_priv(dev);
1535 struct wilc_priv *priv = &vif->priv;
1536 struct sta_info *info;
1537
1538 if (!(vif->iftype == WILC_AP_MODE || vif->iftype == WILC_GO_MODE))
1539 return ret;
1540
1541 info = &priv->assoc_stainfo;
1542
1543 if (!mac)
1544 ret = wilc_del_allstation(vif, info->sta_associated_bss);
1545
1546 ret = wilc_del_station(vif, mac);
1547 if (ret)
1548 netdev_err(dev, "Host delete station fail\n");
1549 return ret;
1550 }
1551
change_station(struct wiphy * wiphy,struct net_device * dev,const u8 * mac,struct station_parameters * params)1552 static int change_station(struct wiphy *wiphy, struct net_device *dev,
1553 const u8 *mac, struct station_parameters *params)
1554 {
1555 int ret = 0;
1556 struct wilc_vif *vif = netdev_priv(dev);
1557
1558 if (vif->iftype == WILC_AP_MODE || vif->iftype == WILC_GO_MODE) {
1559 ret = wilc_edit_station(vif, mac, params);
1560 if (ret)
1561 netdev_err(dev, "Host edit station fail\n");
1562 }
1563 return ret;
1564 }
1565
wilc_get_vif_from_type(struct wilc * wl,int type)1566 static int wilc_get_vif_from_type(struct wilc *wl, int type)
1567 {
1568 int i;
1569
1570 mutex_lock(&wl->vif_mutex);
1571 for (i = 0; i < wl->vif_num; i++) {
1572 if (wl->vif[i]->iftype == type) {
1573 mutex_unlock(&wl->vif_mutex);
1574 return i;
1575 }
1576 }
1577 mutex_unlock(&wl->vif_mutex);
1578
1579 return -EINVAL;
1580 }
1581
add_virtual_intf(struct wiphy * wiphy,const char * name,unsigned char name_assign_type,enum nl80211_iftype type,struct vif_params * params)1582 static struct wireless_dev *add_virtual_intf(struct wiphy *wiphy,
1583 const char *name,
1584 unsigned char name_assign_type,
1585 enum nl80211_iftype type,
1586 struct vif_params *params)
1587 {
1588 struct wilc *wl = wiphy_priv(wiphy);
1589 struct wilc_vif *vif;
1590 struct wireless_dev *wdev;
1591 int iftype;
1592 int ret;
1593
1594 if (type == NL80211_IFTYPE_MONITOR) {
1595 struct net_device *ndev;
1596 int ap_index = wilc_get_vif_from_type(wl, WILC_AP_MODE);
1597
1598 if (ap_index < 0) {
1599 ap_index = wilc_get_vif_from_type(wl, WILC_GO_MODE);
1600 if (ap_index < 0)
1601 goto validate_interface;
1602 }
1603
1604 vif = wl->vif[ap_index];
1605 if (vif->monitor_flag)
1606 goto validate_interface;
1607
1608 ndev = wilc_wfi_init_mon_interface(wl, name, vif->ndev);
1609 if (ndev)
1610 vif->monitor_flag = 1;
1611 else
1612 return ERR_PTR(-EINVAL);
1613
1614 wdev = &vif->priv.wdev;
1615 return wdev;
1616 }
1617
1618 validate_interface:
1619 mutex_lock(&wl->vif_mutex);
1620 if (wl->vif_num == WILC_NUM_CONCURRENT_IFC) {
1621 pr_err("Reached maximum number of interface\n");
1622 ret = -EINVAL;
1623 goto out_err;
1624 }
1625
1626 switch (type) {
1627 case NL80211_IFTYPE_STATION:
1628 iftype = WILC_STATION_MODE;
1629 break;
1630 case NL80211_IFTYPE_AP:
1631 iftype = WILC_AP_MODE;
1632 break;
1633 default:
1634 ret = -EOPNOTSUPP;
1635 goto out_err;
1636 }
1637
1638 vif = wilc_netdev_ifc_init(wl, name, iftype, type, true);
1639 if (IS_ERR(vif)) {
1640 ret = PTR_ERR(vif);
1641 goto out_err;
1642 }
1643
1644 mutex_unlock(&wl->vif_mutex);
1645
1646 return &vif->priv.wdev;
1647
1648 out_err:
1649 mutex_unlock(&wl->vif_mutex);
1650 return ERR_PTR(ret);
1651 }
1652
del_virtual_intf(struct wiphy * wiphy,struct wireless_dev * wdev)1653 static int del_virtual_intf(struct wiphy *wiphy, struct wireless_dev *wdev)
1654 {
1655 struct wilc *wl = wiphy_priv(wiphy);
1656 struct wilc_vif *vif;
1657 int i;
1658
1659 if (wdev->iftype == NL80211_IFTYPE_AP ||
1660 wdev->iftype == NL80211_IFTYPE_P2P_GO)
1661 wilc_wfi_deinit_mon_interface(wl, true);
1662 vif = netdev_priv(wdev->netdev);
1663 cfg80211_stop_iface(wiphy, wdev, GFP_KERNEL);
1664 unregister_netdevice(vif->ndev);
1665 vif->monitor_flag = 0;
1666
1667 mutex_lock(&wl->vif_mutex);
1668 wilc_set_operation_mode(vif, 0, 0, 0);
1669 for (i = vif->idx; i < wl->vif_num; i++) {
1670 if ((i + 1) >= wl->vif_num) {
1671 wl->vif[i] = NULL;
1672 } else {
1673 vif = wl->vif[i + 1];
1674 vif->idx = i;
1675 wl->vif[i] = vif;
1676 wilc_set_operation_mode(vif, wilc_get_vif_idx(vif),
1677 vif->iftype, vif->idx);
1678 }
1679 }
1680 wl->vif_num--;
1681 mutex_unlock(&wl->vif_mutex);
1682
1683 return 0;
1684 }
1685
wilc_suspend(struct wiphy * wiphy,struct cfg80211_wowlan * wow)1686 static int wilc_suspend(struct wiphy *wiphy, struct cfg80211_wowlan *wow)
1687 {
1688 struct wilc *wl = wiphy_priv(wiphy);
1689
1690 if (!wow && wilc_wlan_get_num_conn_ifcs(wl))
1691 wl->suspend_event = true;
1692 else
1693 wl->suspend_event = false;
1694
1695 return 0;
1696 }
1697
wilc_resume(struct wiphy * wiphy)1698 static int wilc_resume(struct wiphy *wiphy)
1699 {
1700 return 0;
1701 }
1702
wilc_set_wakeup(struct wiphy * wiphy,bool enabled)1703 static void wilc_set_wakeup(struct wiphy *wiphy, bool enabled)
1704 {
1705 struct wilc *wl = wiphy_priv(wiphy);
1706 struct wilc_vif *vif;
1707
1708 mutex_lock(&wl->vif_mutex);
1709 vif = wilc_get_wl_to_vif(wl);
1710 if (IS_ERR(vif)) {
1711 mutex_unlock(&wl->vif_mutex);
1712 return;
1713 }
1714
1715 netdev_info(vif->ndev, "cfg set wake up = %d\n", enabled);
1716 mutex_unlock(&wl->vif_mutex);
1717 }
1718
set_tx_power(struct wiphy * wiphy,struct wireless_dev * wdev,enum nl80211_tx_power_setting type,int mbm)1719 static int set_tx_power(struct wiphy *wiphy, struct wireless_dev *wdev,
1720 enum nl80211_tx_power_setting type, int mbm)
1721 {
1722 int ret;
1723 s32 tx_power = MBM_TO_DBM(mbm);
1724 struct wilc_vif *vif = netdev_priv(wdev->netdev);
1725
1726 if (tx_power < 0)
1727 tx_power = 0;
1728 else if (tx_power > 18)
1729 tx_power = 18;
1730 ret = wilc_set_tx_power(vif, tx_power);
1731 if (ret)
1732 netdev_err(vif->ndev, "Failed to set tx power\n");
1733
1734 return ret;
1735 }
1736
get_tx_power(struct wiphy * wiphy,struct wireless_dev * wdev,int * dbm)1737 static int get_tx_power(struct wiphy *wiphy, struct wireless_dev *wdev,
1738 int *dbm)
1739 {
1740 int ret;
1741 struct wilc_vif *vif = netdev_priv(wdev->netdev);
1742 struct wilc *wl = vif->wilc;
1743
1744 /* If firmware is not started, return. */
1745 if (!wl->initialized)
1746 return -EIO;
1747
1748 ret = wilc_get_tx_power(vif, (u8 *)dbm);
1749 if (ret)
1750 netdev_err(vif->ndev, "Failed to get tx power\n");
1751
1752 return ret;
1753 }
1754
1755 static const struct cfg80211_ops wilc_cfg80211_ops = {
1756 .set_monitor_channel = set_channel,
1757 .scan = scan,
1758 .connect = connect,
1759 .disconnect = disconnect,
1760 .add_key = add_key,
1761 .del_key = del_key,
1762 .get_key = get_key,
1763 .set_default_key = set_default_key,
1764 .add_virtual_intf = add_virtual_intf,
1765 .del_virtual_intf = del_virtual_intf,
1766 .change_virtual_intf = change_virtual_intf,
1767
1768 .start_ap = start_ap,
1769 .change_beacon = change_beacon,
1770 .stop_ap = stop_ap,
1771 .add_station = add_station,
1772 .del_station = del_station,
1773 .change_station = change_station,
1774 .get_station = get_station,
1775 .dump_station = dump_station,
1776 .change_bss = change_bss,
1777 .set_wiphy_params = set_wiphy_params,
1778
1779 .set_pmksa = set_pmksa,
1780 .del_pmksa = del_pmksa,
1781 .flush_pmksa = flush_pmksa,
1782 .remain_on_channel = remain_on_channel,
1783 .cancel_remain_on_channel = cancel_remain_on_channel,
1784 .mgmt_tx_cancel_wait = mgmt_tx_cancel_wait,
1785 .mgmt_tx = mgmt_tx,
1786 .mgmt_frame_register = wilc_mgmt_frame_register,
1787 .set_power_mgmt = set_power_mgmt,
1788 .set_cqm_rssi_config = set_cqm_rssi_config,
1789
1790 .suspend = wilc_suspend,
1791 .resume = wilc_resume,
1792 .set_wakeup = wilc_set_wakeup,
1793 .set_tx_power = set_tx_power,
1794 .get_tx_power = get_tx_power,
1795
1796 };
1797
wlan_init_locks(struct wilc * wl)1798 static void wlan_init_locks(struct wilc *wl)
1799 {
1800 mutex_init(&wl->hif_cs);
1801 mutex_init(&wl->rxq_cs);
1802 mutex_init(&wl->cfg_cmd_lock);
1803 mutex_init(&wl->vif_mutex);
1804
1805 spin_lock_init(&wl->txq_spinlock);
1806 mutex_init(&wl->txq_add_to_head_cs);
1807
1808 init_completion(&wl->txq_event);
1809 init_completion(&wl->cfg_event);
1810 init_completion(&wl->sync_event);
1811 init_completion(&wl->txq_thread_started);
1812 }
1813
wilc_cfg80211_init(struct wilc ** wilc,struct device * dev,int io_type,const struct wilc_hif_func * ops)1814 int wilc_cfg80211_init(struct wilc **wilc, struct device *dev, int io_type,
1815 const struct wilc_hif_func *ops)
1816 {
1817 struct wilc *wl;
1818 struct wilc_vif *vif;
1819 int ret;
1820
1821 wl = wilc_create_wiphy(dev);
1822 if (!wl)
1823 return -EINVAL;
1824
1825 ret = wilc_wlan_cfg_init(wl);
1826 if (ret)
1827 goto free_wl;
1828
1829 *wilc = wl;
1830 wl->io_type = io_type;
1831 wl->hif_func = ops;
1832 wl->chip_ps_state = WILC_CHIP_WAKEDUP;
1833 INIT_LIST_HEAD(&wl->txq_head.list);
1834 INIT_LIST_HEAD(&wl->rxq_head.list);
1835
1836 wl->hif_workqueue = create_singlethread_workqueue("WILC_wq");
1837 if (!wl->hif_workqueue) {
1838 ret = -ENOMEM;
1839 goto free_cfg;
1840 }
1841 vif = wilc_netdev_ifc_init(wl, "wlan%d", WILC_STATION_MODE,
1842 NL80211_IFTYPE_STATION, false);
1843 if (IS_ERR(vif)) {
1844 ret = PTR_ERR(vif);
1845 goto free_hq;
1846 }
1847
1848 wlan_init_locks(wl);
1849
1850 return 0;
1851
1852 free_hq:
1853 destroy_workqueue(wl->hif_workqueue);
1854
1855 free_cfg:
1856 wilc_wlan_cfg_deinit(wl);
1857
1858 free_wl:
1859 wiphy_unregister(wl->wiphy);
1860 wiphy_free(wl->wiphy);
1861 return ret;
1862 }
1863 EXPORT_SYMBOL_GPL(wilc_cfg80211_init);
1864
wilc_create_wiphy(struct device * dev)1865 struct wilc *wilc_create_wiphy(struct device *dev)
1866 {
1867 struct wiphy *wiphy;
1868 struct wilc *wl;
1869 int ret;
1870
1871 wiphy = wiphy_new(&wilc_cfg80211_ops, sizeof(*wl));
1872 if (!wiphy)
1873 return NULL;
1874
1875 wl = wiphy_priv(wiphy);
1876
1877 memcpy(wl->bitrates, wilc_bitrates, sizeof(wilc_bitrates));
1878 memcpy(wl->channels, wilc_2ghz_channels, sizeof(wilc_2ghz_channels));
1879 wl->band.bitrates = wl->bitrates;
1880 wl->band.n_bitrates = ARRAY_SIZE(wl->bitrates);
1881 wl->band.channels = wl->channels;
1882 wl->band.n_channels = ARRAY_SIZE(wilc_2ghz_channels);
1883
1884 wl->band.ht_cap.ht_supported = 1;
1885 wl->band.ht_cap.cap |= (1 << IEEE80211_HT_CAP_RX_STBC_SHIFT);
1886 wl->band.ht_cap.mcs.rx_mask[0] = 0xff;
1887 wl->band.ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_8K;
1888 wl->band.ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_NONE;
1889
1890 wiphy->bands[NL80211_BAND_2GHZ] = &wl->band;
1891
1892 wiphy->max_scan_ssids = WILC_MAX_NUM_PROBED_SSID;
1893 #ifdef CONFIG_PM
1894 wiphy->wowlan = &wowlan_support;
1895 #endif
1896 wiphy->max_num_pmkids = WILC_MAX_NUM_PMKIDS;
1897 wiphy->max_scan_ie_len = 1000;
1898 wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM;
1899 memcpy(wl->cipher_suites, wilc_cipher_suites,
1900 sizeof(wilc_cipher_suites));
1901 wiphy->cipher_suites = wl->cipher_suites;
1902 wiphy->n_cipher_suites = ARRAY_SIZE(wilc_cipher_suites);
1903 wiphy->mgmt_stypes = wilc_wfi_cfg80211_mgmt_types;
1904
1905 wiphy->max_remain_on_channel_duration = 500;
1906 wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
1907 BIT(NL80211_IFTYPE_AP) |
1908 BIT(NL80211_IFTYPE_MONITOR) |
1909 BIT(NL80211_IFTYPE_P2P_GO) |
1910 BIT(NL80211_IFTYPE_P2P_CLIENT);
1911 wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
1912
1913 set_wiphy_dev(wiphy, dev);
1914 wl->wiphy = wiphy;
1915 ret = wiphy_register(wiphy);
1916 if (ret) {
1917 wiphy_free(wiphy);
1918 return NULL;
1919 }
1920 return wl;
1921 }
1922
wilc_init_host_int(struct net_device * net)1923 int wilc_init_host_int(struct net_device *net)
1924 {
1925 int ret;
1926 struct wilc_vif *vif = netdev_priv(net);
1927 struct wilc_priv *priv = &vif->priv;
1928
1929 priv->p2p_listen_state = false;
1930
1931 mutex_init(&priv->scan_req_lock);
1932 ret = wilc_init(net, &priv->hif_drv);
1933 if (ret)
1934 netdev_err(net, "Error while initializing hostinterface\n");
1935
1936 return ret;
1937 }
1938
wilc_deinit_host_int(struct net_device * net)1939 void wilc_deinit_host_int(struct net_device *net)
1940 {
1941 int ret;
1942 struct wilc_vif *vif = netdev_priv(net);
1943 struct wilc_priv *priv = &vif->priv;
1944
1945 priv->p2p_listen_state = false;
1946
1947 flush_workqueue(vif->wilc->hif_workqueue);
1948 mutex_destroy(&priv->scan_req_lock);
1949 ret = wilc_deinit(vif);
1950
1951 if (ret)
1952 netdev_err(net, "Error while deinitializing host interface\n");
1953 }
1954
1955