GNU Linux-libre 6.8.7-gnu
[releases.git] / drivers / net / wireless / microchip / wilc1000 / netdev.c
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 <linux/irq.h>
8 #include <linux/kthread.h>
9 #include <linux/firmware.h>
10 #include <linux/netdevice.h>
11 #include <linux/inetdevice.h>
12
13 #include "cfg80211.h"
14 #include "wlan_cfg.h"
15
16 #define WILC_MULTICAST_TABLE_SIZE       8
17 #define WILC_MAX_FW_VERSION_STR_SIZE    50
18
19 /* latest API version supported */
20 #define WILC1000_API_VER                1
21
22 /*(DEBLOBBED)*/
23 #define __WILC1000_FW(api)              "/*(DEBLOBBED)*/"
24 #define WILC1000_FW(api)                __WILC1000_FW(api)
25
26 static irqreturn_t isr_uh_routine(int irq, void *user_data)
27 {
28         struct wilc *wilc = user_data;
29
30         if (wilc->close) {
31                 pr_err("Can't handle UH interrupt\n");
32                 return IRQ_HANDLED;
33         }
34         return IRQ_WAKE_THREAD;
35 }
36
37 static irqreturn_t isr_bh_routine(int irq, void *userdata)
38 {
39         struct wilc *wilc = userdata;
40
41         if (wilc->close) {
42                 pr_err("Can't handle BH interrupt\n");
43                 return IRQ_HANDLED;
44         }
45
46         wilc_handle_isr(wilc);
47
48         return IRQ_HANDLED;
49 }
50
51 static int init_irq(struct net_device *dev)
52 {
53         struct wilc_vif *vif = netdev_priv(dev);
54         struct wilc *wl = vif->wilc;
55         int ret;
56
57         ret = request_threaded_irq(wl->dev_irq_num, isr_uh_routine,
58                                    isr_bh_routine,
59                                    IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
60                                    dev->name, wl);
61         if (ret) {
62                 netdev_err(dev, "Failed to request IRQ [%d]\n", ret);
63                 return ret;
64         }
65         netdev_dbg(dev, "IRQ request succeeded IRQ-NUM= %d\n", wl->dev_irq_num);
66
67         return 0;
68 }
69
70 static void deinit_irq(struct net_device *dev)
71 {
72         struct wilc_vif *vif = netdev_priv(dev);
73         struct wilc *wilc = vif->wilc;
74
75         /* Deinitialize IRQ */
76         if (wilc->dev_irq_num)
77                 free_irq(wilc->dev_irq_num, wilc);
78 }
79
80 void wilc_mac_indicate(struct wilc *wilc)
81 {
82         s8 status;
83
84         wilc_wlan_cfg_get_val(wilc, WID_STATUS, &status, 1);
85         if (wilc->mac_status == WILC_MAC_STATUS_INIT) {
86                 wilc->mac_status = status;
87                 complete(&wilc->sync_event);
88         } else {
89                 wilc->mac_status = status;
90         }
91 }
92
93 static struct net_device *get_if_handler(struct wilc *wilc, u8 *mac_header)
94 {
95         struct net_device *ndev = NULL;
96         struct wilc_vif *vif;
97         struct ieee80211_hdr *h = (struct ieee80211_hdr *)mac_header;
98
99         list_for_each_entry_rcu(vif, &wilc->vif_list, list) {
100                 if (vif->iftype == WILC_STATION_MODE)
101                         if (ether_addr_equal_unaligned(h->addr2, vif->bssid)) {
102                                 ndev = vif->ndev;
103                                 goto out;
104                         }
105                 if (vif->iftype == WILC_AP_MODE)
106                         if (ether_addr_equal_unaligned(h->addr1, vif->bssid)) {
107                                 ndev = vif->ndev;
108                                 goto out;
109                         }
110         }
111 out:
112         return ndev;
113 }
114
115 void wilc_wlan_set_bssid(struct net_device *wilc_netdev, const u8 *bssid,
116                          u8 mode)
117 {
118         struct wilc_vif *vif = netdev_priv(wilc_netdev);
119
120         if (bssid)
121                 ether_addr_copy(vif->bssid, bssid);
122         else
123                 eth_zero_addr(vif->bssid);
124
125         vif->iftype = mode;
126 }
127
128 int wilc_wlan_get_num_conn_ifcs(struct wilc *wilc)
129 {
130         int srcu_idx;
131         u8 ret_val = 0;
132         struct wilc_vif *vif;
133
134         srcu_idx = srcu_read_lock(&wilc->srcu);
135         list_for_each_entry_rcu(vif, &wilc->vif_list, list) {
136                 if (!is_zero_ether_addr(vif->bssid))
137                         ret_val++;
138         }
139         srcu_read_unlock(&wilc->srcu, srcu_idx);
140         return ret_val;
141 }
142
143 static int wilc_txq_task(void *vp)
144 {
145         int ret;
146         u32 txq_count;
147         struct wilc *wl = vp;
148
149         complete(&wl->txq_thread_started);
150         while (1) {
151                 if (wait_for_completion_interruptible(&wl->txq_event))
152                         continue;
153                 if (wl->close) {
154                         complete(&wl->txq_thread_started);
155
156                         while (!kthread_should_stop())
157                                 schedule();
158                         break;
159                 }
160                 do {
161                         ret = wilc_wlan_handle_txq(wl, &txq_count);
162                         if (txq_count < FLOW_CONTROL_LOWER_THRESHOLD) {
163                                 int srcu_idx;
164                                 struct wilc_vif *ifc;
165
166                                 srcu_idx = srcu_read_lock(&wl->srcu);
167                                 list_for_each_entry_rcu(ifc, &wl->vif_list,
168                                                         list) {
169                                         if (ifc->mac_opened &&
170                                             netif_queue_stopped(ifc->ndev))
171                                                 netif_wake_queue(ifc->ndev);
172                                 }
173                                 srcu_read_unlock(&wl->srcu, srcu_idx);
174                         }
175                         if (ret != WILC_VMM_ENTRY_FULL_RETRY)
176                                 break;
177                         /* Back off TX task from sending packets for some time.
178                          * msleep_interruptible will allow RX task to run and
179                          * free buffers. TX task will be in TASK_INTERRUPTIBLE
180                          * state which will put the thread back to CPU running
181                          * queue when it's signaled even if the timeout isn't
182                          * elapsed. This gives faster chance for reserved SK
183                          * buffers to be free.
184                          */
185                         msleep_interruptible(TX_BACKOFF_WEIGHT_MS);
186                 } while (!wl->close);
187         }
188         return 0;
189 }
190
191 static int wilc_wlan_get_firmware(struct net_device *dev)
192 {
193         struct wilc_vif *vif = netdev_priv(dev);
194         struct wilc *wilc = vif->wilc;
195         int chip_id;
196         const struct firmware *wilc_fw;
197         int ret;
198
199         chip_id = wilc_get_chipid(wilc, false);
200
201         netdev_info(dev, "ChipID [%x] loading firmware [%s]\n", chip_id,
202                     WILC1000_FW(WILC1000_API_VER));
203
204         ret = reject_firmware(&wilc_fw, WILC1000_FW(WILC1000_API_VER),
205                                wilc->dev);
206         if (ret != 0) {
207                 netdev_err(dev, "%s - firmware not available\n",
208                            WILC1000_FW(WILC1000_API_VER));
209                 return -EINVAL;
210         }
211         wilc->firmware = wilc_fw;
212
213         return 0;
214 }
215
216 static int wilc_start_firmware(struct net_device *dev)
217 {
218         struct wilc_vif *vif = netdev_priv(dev);
219         struct wilc *wilc = vif->wilc;
220         int ret = 0;
221
222         ret = wilc_wlan_start(wilc);
223         if (ret)
224                 return ret;
225
226         if (!wait_for_completion_timeout(&wilc->sync_event,
227                                          msecs_to_jiffies(5000)))
228                 return -ETIME;
229
230         return 0;
231 }
232
233 static int wilc1000_firmware_download(struct net_device *dev)
234 {
235         struct wilc_vif *vif = netdev_priv(dev);
236         struct wilc *wilc = vif->wilc;
237         int ret = 0;
238
239         if (!wilc->firmware) {
240                 netdev_err(dev, "Firmware buffer is NULL\n");
241                 return -ENOBUFS;
242         }
243
244         ret = wilc_wlan_firmware_download(wilc, wilc->firmware->data,
245                                           wilc->firmware->size);
246         if (ret)
247                 return ret;
248
249         release_firmware(wilc->firmware);
250         wilc->firmware = NULL;
251
252         netdev_dbg(dev, "Download Succeeded\n");
253
254         return 0;
255 }
256
257 static int wilc_init_fw_config(struct net_device *dev, struct wilc_vif *vif)
258 {
259         struct wilc_priv *priv = &vif->priv;
260         struct host_if_drv *hif_drv;
261         u8 b;
262         u16 hw;
263         u32 w;
264
265         netdev_dbg(dev, "Start configuring Firmware\n");
266         hif_drv = (struct host_if_drv *)priv->hif_drv;
267         netdev_dbg(dev, "Host = %p\n", hif_drv);
268
269         w = vif->iftype;
270         cpu_to_le32s(&w);
271         if (!wilc_wlan_cfg_set(vif, 1, WID_SET_OPERATION_MODE, (u8 *)&w, 4,
272                                0, 0))
273                 goto fail;
274
275         b = WILC_FW_BSS_TYPE_INFRA;
276         if (!wilc_wlan_cfg_set(vif, 0, WID_BSS_TYPE, &b, 1, 0, 0))
277                 goto fail;
278
279         b = WILC_FW_TX_RATE_AUTO;
280         if (!wilc_wlan_cfg_set(vif, 0, WID_CURRENT_TX_RATE, &b, 1, 0, 0))
281                 goto fail;
282
283         b = WILC_FW_OPER_MODE_G_MIXED_11B_2;
284         if (!wilc_wlan_cfg_set(vif, 0, WID_11G_OPERATING_MODE, &b, 1, 0, 0))
285                 goto fail;
286
287         b = WILC_FW_PREAMBLE_SHORT;
288         if (!wilc_wlan_cfg_set(vif, 0, WID_PREAMBLE, &b, 1, 0, 0))
289                 goto fail;
290
291         b = WILC_FW_11N_PROT_AUTO;
292         if (!wilc_wlan_cfg_set(vif, 0, WID_11N_PROT_MECH, &b, 1, 0, 0))
293                 goto fail;
294
295         b = WILC_FW_ACTIVE_SCAN;
296         if (!wilc_wlan_cfg_set(vif, 0, WID_SCAN_TYPE, &b, 1, 0, 0))
297                 goto fail;
298
299         b = WILC_FW_SITE_SURVEY_OFF;
300         if (!wilc_wlan_cfg_set(vif, 0, WID_SITE_SURVEY, &b, 1, 0, 0))
301                 goto fail;
302
303         hw = 0xffff;
304         cpu_to_le16s(&hw);
305         if (!wilc_wlan_cfg_set(vif, 0, WID_RTS_THRESHOLD, (u8 *)&hw, 2, 0, 0))
306                 goto fail;
307
308         hw = 2346;
309         cpu_to_le16s(&hw);
310         if (!wilc_wlan_cfg_set(vif, 0, WID_FRAG_THRESHOLD, (u8 *)&hw, 2, 0, 0))
311                 goto fail;
312
313         b = 0;
314         if (!wilc_wlan_cfg_set(vif, 0, WID_BCAST_SSID, &b, 1, 0, 0))
315                 goto fail;
316
317         b = 1;
318         if (!wilc_wlan_cfg_set(vif, 0, WID_QOS_ENABLE, &b, 1, 0, 0))
319                 goto fail;
320
321         b = WILC_FW_NO_POWERSAVE;
322         if (!wilc_wlan_cfg_set(vif, 0, WID_POWER_MANAGEMENT, &b, 1, 0, 0))
323                 goto fail;
324
325         b = WILC_FW_SEC_NO;
326         if (!wilc_wlan_cfg_set(vif, 0, WID_11I_MODE, &b, 1, 0, 0))
327                 goto fail;
328
329         b = WILC_FW_AUTH_OPEN_SYSTEM;
330         if (!wilc_wlan_cfg_set(vif, 0, WID_AUTH_TYPE, &b, 1, 0, 0))
331                 goto fail;
332
333         b = 3;
334         if (!wilc_wlan_cfg_set(vif, 0, WID_LISTEN_INTERVAL, &b, 1, 0, 0))
335                 goto fail;
336
337         b = 3;
338         if (!wilc_wlan_cfg_set(vif, 0, WID_DTIM_PERIOD, &b, 1, 0, 0))
339                 goto fail;
340
341         b = WILC_FW_ACK_POLICY_NORMAL;
342         if (!wilc_wlan_cfg_set(vif, 0, WID_ACK_POLICY, &b, 1, 0, 0))
343                 goto fail;
344
345         b = 0;
346         if (!wilc_wlan_cfg_set(vif, 0, WID_USER_CONTROL_ON_TX_POWER, &b, 1,
347                                0, 0))
348                 goto fail;
349
350         b = 48;
351         if (!wilc_wlan_cfg_set(vif, 0, WID_TX_POWER_LEVEL_11A, &b, 1, 0, 0))
352                 goto fail;
353
354         b = 28;
355         if (!wilc_wlan_cfg_set(vif, 0, WID_TX_POWER_LEVEL_11B, &b, 1, 0, 0))
356                 goto fail;
357
358         hw = 100;
359         cpu_to_le16s(&hw);
360         if (!wilc_wlan_cfg_set(vif, 0, WID_BEACON_INTERVAL, (u8 *)&hw, 2, 0, 0))
361                 goto fail;
362
363         b = WILC_FW_REKEY_POLICY_DISABLE;
364         if (!wilc_wlan_cfg_set(vif, 0, WID_REKEY_POLICY, &b, 1, 0, 0))
365                 goto fail;
366
367         w = 84600;
368         cpu_to_le32s(&w);
369         if (!wilc_wlan_cfg_set(vif, 0, WID_REKEY_PERIOD, (u8 *)&w, 4, 0, 0))
370                 goto fail;
371
372         w = 500;
373         cpu_to_le32s(&w);
374         if (!wilc_wlan_cfg_set(vif, 0, WID_REKEY_PACKET_COUNT, (u8 *)&w, 4, 0,
375                                0))
376                 goto fail;
377
378         b = 1;
379         if (!wilc_wlan_cfg_set(vif, 0, WID_SHORT_SLOT_ALLOWED, &b, 1, 0,
380                                0))
381                 goto fail;
382
383         b = WILC_FW_ERP_PROT_SELF_CTS;
384         if (!wilc_wlan_cfg_set(vif, 0, WID_11N_ERP_PROT_TYPE, &b, 1, 0, 0))
385                 goto fail;
386
387         b = 1;
388         if (!wilc_wlan_cfg_set(vif, 0, WID_11N_ENABLE, &b, 1, 0, 0))
389                 goto fail;
390
391         b = WILC_FW_11N_OP_MODE_HT_MIXED;
392         if (!wilc_wlan_cfg_set(vif, 0, WID_11N_OPERATING_MODE, &b, 1, 0, 0))
393                 goto fail;
394
395         b = 1;
396         if (!wilc_wlan_cfg_set(vif, 0, WID_11N_TXOP_PROT_DISABLE, &b, 1, 0, 0))
397                 goto fail;
398
399         b = WILC_FW_OBBS_NONHT_DETECT_PROTECT_REPORT;
400         if (!wilc_wlan_cfg_set(vif, 0, WID_11N_OBSS_NONHT_DETECTION, &b, 1,
401                                0, 0))
402                 goto fail;
403
404         b = WILC_FW_HT_PROT_RTS_CTS_NONHT;
405         if (!wilc_wlan_cfg_set(vif, 0, WID_11N_HT_PROT_TYPE, &b, 1, 0, 0))
406                 goto fail;
407
408         b = 0;
409         if (!wilc_wlan_cfg_set(vif, 0, WID_11N_RIFS_PROT_ENABLE, &b, 1, 0,
410                                0))
411                 goto fail;
412
413         b = 7;
414         if (!wilc_wlan_cfg_set(vif, 0, WID_11N_CURRENT_TX_MCS, &b, 1, 0, 0))
415                 goto fail;
416
417         b = 1;
418         if (!wilc_wlan_cfg_set(vif, 0, WID_11N_IMMEDIATE_BA_ENABLED, &b, 1,
419                                1, 1))
420                 goto fail;
421
422         return 0;
423
424 fail:
425         return -EINVAL;
426 }
427
428 static void wlan_deinitialize_threads(struct net_device *dev)
429 {
430         struct wilc_vif *vif = netdev_priv(dev);
431         struct wilc *wl = vif->wilc;
432
433         wl->close = 1;
434
435         complete(&wl->txq_event);
436
437         if (wl->txq_thread) {
438                 kthread_stop(wl->txq_thread);
439                 wl->txq_thread = NULL;
440         }
441 }
442
443 static void wilc_wlan_deinitialize(struct net_device *dev)
444 {
445         struct wilc_vif *vif = netdev_priv(dev);
446         struct wilc *wl = vif->wilc;
447
448         if (!wl) {
449                 netdev_err(dev, "wl is NULL\n");
450                 return;
451         }
452
453         if (wl->initialized) {
454                 netdev_info(dev, "Deinitializing wilc1000...\n");
455
456                 if (!wl->dev_irq_num &&
457                     wl->hif_func->disable_interrupt) {
458                         mutex_lock(&wl->hif_cs);
459                         wl->hif_func->disable_interrupt(wl);
460                         mutex_unlock(&wl->hif_cs);
461                 }
462                 complete(&wl->txq_event);
463
464                 wlan_deinitialize_threads(dev);
465                 deinit_irq(dev);
466
467                 wilc_wlan_stop(wl, vif);
468                 wilc_wlan_cleanup(dev);
469
470                 wl->initialized = false;
471
472                 netdev_dbg(dev, "wilc1000 deinitialization Done\n");
473         } else {
474                 netdev_dbg(dev, "wilc1000 is not initialized\n");
475         }
476 }
477
478 static int wlan_initialize_threads(struct net_device *dev)
479 {
480         struct wilc_vif *vif = netdev_priv(dev);
481         struct wilc *wilc = vif->wilc;
482
483         wilc->txq_thread = kthread_run(wilc_txq_task, (void *)wilc,
484                                        "%s-tx", dev->name);
485         if (IS_ERR(wilc->txq_thread)) {
486                 netdev_err(dev, "couldn't create TXQ thread\n");
487                 wilc->close = 1;
488                 return PTR_ERR(wilc->txq_thread);
489         }
490         wait_for_completion(&wilc->txq_thread_started);
491
492         return 0;
493 }
494
495 static int wilc_wlan_initialize(struct net_device *dev, struct wilc_vif *vif)
496 {
497         int ret = 0;
498         struct wilc *wl = vif->wilc;
499
500         if (!wl->initialized) {
501                 wl->mac_status = WILC_MAC_STATUS_INIT;
502                 wl->close = 0;
503
504                 ret = wilc_wlan_init(dev);
505                 if (ret)
506                         return ret;
507
508                 ret = wlan_initialize_threads(dev);
509                 if (ret)
510                         goto fail_wilc_wlan;
511
512                 if (wl->dev_irq_num && init_irq(dev)) {
513                         ret = -EIO;
514                         goto fail_threads;
515                 }
516
517                 if (!wl->dev_irq_num &&
518                     wl->hif_func->enable_interrupt &&
519                     wl->hif_func->enable_interrupt(wl)) {
520                         ret = -EIO;
521                         goto fail_irq_init;
522                 }
523
524                 ret = wilc_wlan_get_firmware(dev);
525                 if (ret)
526                         goto fail_irq_enable;
527
528                 ret = wilc1000_firmware_download(dev);
529                 if (ret)
530                         goto fail_irq_enable;
531
532                 ret = wilc_start_firmware(dev);
533                 if (ret)
534                         goto fail_irq_enable;
535
536                 if (wilc_wlan_cfg_get(vif, 1, WID_FIRMWARE_VERSION, 1, 0)) {
537                         int size;
538                         char firmware_ver[WILC_MAX_FW_VERSION_STR_SIZE];
539
540                         size = wilc_wlan_cfg_get_val(wl, WID_FIRMWARE_VERSION,
541                                                      firmware_ver,
542                                                      sizeof(firmware_ver));
543                         firmware_ver[size] = '\0';
544                         netdev_dbg(dev, "Firmware Ver = %s\n", firmware_ver);
545                 }
546
547                 ret = wilc_init_fw_config(dev, vif);
548                 if (ret) {
549                         netdev_err(dev, "Failed to configure firmware\n");
550                         goto fail_fw_start;
551                 }
552                 wl->initialized = true;
553                 return 0;
554
555 fail_fw_start:
556                 wilc_wlan_stop(wl, vif);
557
558 fail_irq_enable:
559                 if (!wl->dev_irq_num &&
560                     wl->hif_func->disable_interrupt)
561                         wl->hif_func->disable_interrupt(wl);
562 fail_irq_init:
563                 if (wl->dev_irq_num)
564                         deinit_irq(dev);
565 fail_threads:
566                 wlan_deinitialize_threads(dev);
567 fail_wilc_wlan:
568                 wilc_wlan_cleanup(dev);
569                 netdev_err(dev, "WLAN initialization FAILED\n");
570         } else {
571                 netdev_dbg(dev, "wilc1000 already initialized\n");
572         }
573         return ret;
574 }
575
576 static int mac_init_fn(struct net_device *ndev)
577 {
578         netif_start_queue(ndev);
579         netif_stop_queue(ndev);
580
581         return 0;
582 }
583
584 static int wilc_mac_open(struct net_device *ndev)
585 {
586         struct wilc_vif *vif = netdev_priv(ndev);
587         struct wilc *wl = vif->wilc;
588         int ret = 0;
589         struct mgmt_frame_regs mgmt_regs = {};
590         u8 addr[ETH_ALEN] __aligned(2);
591
592         if (!wl || !wl->dev) {
593                 netdev_err(ndev, "device not ready\n");
594                 return -ENODEV;
595         }
596
597         netdev_dbg(ndev, "MAC OPEN[%p]\n", ndev);
598
599         ret = wilc_init_host_int(ndev);
600         if (ret)
601                 return ret;
602
603         ret = wilc_wlan_initialize(ndev, vif);
604         if (ret) {
605                 wilc_deinit_host_int(ndev);
606                 return ret;
607         }
608
609         wilc_set_operation_mode(vif, wilc_get_vif_idx(vif), vif->iftype,
610                                 vif->idx);
611
612         if (is_valid_ether_addr(ndev->dev_addr)) {
613                 ether_addr_copy(addr, ndev->dev_addr);
614                 wilc_set_mac_address(vif, addr);
615         } else {
616                 wilc_get_mac_address(vif, addr);
617                 eth_hw_addr_set(ndev, addr);
618         }
619         netdev_dbg(ndev, "Mac address: %pM\n", ndev->dev_addr);
620
621         if (!is_valid_ether_addr(ndev->dev_addr)) {
622                 netdev_err(ndev, "Wrong MAC address\n");
623                 wilc_deinit_host_int(ndev);
624                 wilc_wlan_deinitialize(ndev);
625                 return -EINVAL;
626         }
627
628         mgmt_regs.interface_stypes = vif->mgmt_reg_stypes;
629         /* so we detect a change */
630         vif->mgmt_reg_stypes = 0;
631         wilc_update_mgmt_frame_registrations(vif->ndev->ieee80211_ptr->wiphy,
632                                              vif->ndev->ieee80211_ptr,
633                                              &mgmt_regs);
634         netif_wake_queue(ndev);
635         wl->open_ifcs++;
636         vif->mac_opened = 1;
637         return 0;
638 }
639
640 static struct net_device_stats *mac_stats(struct net_device *dev)
641 {
642         struct wilc_vif *vif = netdev_priv(dev);
643
644         return &vif->netstats;
645 }
646
647 static int wilc_set_mac_addr(struct net_device *dev, void *p)
648 {
649         int result;
650         struct wilc_vif *vif = netdev_priv(dev);
651         struct wilc *wilc = vif->wilc;
652         struct sockaddr *addr = (struct sockaddr *)p;
653         unsigned char mac_addr[ETH_ALEN];
654         struct wilc_vif *tmp_vif;
655         int srcu_idx;
656
657         if (!is_valid_ether_addr(addr->sa_data))
658                 return -EADDRNOTAVAIL;
659
660         if (!vif->mac_opened) {
661                 eth_commit_mac_addr_change(dev, p);
662                 return 0;
663         }
664
665         /* Verify MAC Address is not already in use: */
666
667         srcu_idx = srcu_read_lock(&wilc->srcu);
668         list_for_each_entry_rcu(tmp_vif, &wilc->vif_list, list) {
669                 wilc_get_mac_address(tmp_vif, mac_addr);
670                 if (ether_addr_equal(addr->sa_data, mac_addr)) {
671                         if (vif != tmp_vif) {
672                                 srcu_read_unlock(&wilc->srcu, srcu_idx);
673                                 return -EADDRNOTAVAIL;
674                         }
675                         srcu_read_unlock(&wilc->srcu, srcu_idx);
676                         return 0;
677                 }
678         }
679         srcu_read_unlock(&wilc->srcu, srcu_idx);
680
681         result = wilc_set_mac_address(vif, (u8 *)addr->sa_data);
682         if (result)
683                 return result;
684
685         eth_commit_mac_addr_change(dev, p);
686         return result;
687 }
688
689 static void wilc_set_multicast_list(struct net_device *dev)
690 {
691         struct netdev_hw_addr *ha;
692         struct wilc_vif *vif = netdev_priv(dev);
693         int i;
694         u8 *mc_list;
695         u8 *cur_mc;
696
697         if (dev->flags & IFF_PROMISC)
698                 return;
699
700         if (dev->flags & IFF_ALLMULTI ||
701             dev->mc.count > WILC_MULTICAST_TABLE_SIZE) {
702                 wilc_setup_multicast_filter(vif, 0, 0, NULL);
703                 return;
704         }
705
706         if (dev->mc.count == 0) {
707                 wilc_setup_multicast_filter(vif, 1, 0, NULL);
708                 return;
709         }
710
711         mc_list = kmalloc_array(dev->mc.count, ETH_ALEN, GFP_ATOMIC);
712         if (!mc_list)
713                 return;
714
715         cur_mc = mc_list;
716         i = 0;
717         netdev_for_each_mc_addr(ha, dev) {
718                 memcpy(cur_mc, ha->addr, ETH_ALEN);
719                 netdev_dbg(dev, "Entry[%d]: %pM\n", i, cur_mc);
720                 i++;
721                 cur_mc += ETH_ALEN;
722         }
723
724         if (wilc_setup_multicast_filter(vif, 1, dev->mc.count, mc_list))
725                 kfree(mc_list);
726 }
727
728 static void wilc_tx_complete(void *priv, int status)
729 {
730         struct tx_complete_data *pv_data = priv;
731
732         dev_kfree_skb(pv_data->skb);
733         kfree(pv_data);
734 }
735
736 netdev_tx_t wilc_mac_xmit(struct sk_buff *skb, struct net_device *ndev)
737 {
738         struct wilc_vif *vif = netdev_priv(ndev);
739         struct wilc *wilc = vif->wilc;
740         struct tx_complete_data *tx_data = NULL;
741         int queue_count;
742
743         if (skb->dev != ndev) {
744                 netdev_err(ndev, "Packet not destined to this device\n");
745                 dev_kfree_skb(skb);
746                 return NETDEV_TX_OK;
747         }
748
749         tx_data = kmalloc(sizeof(*tx_data), GFP_ATOMIC);
750         if (!tx_data) {
751                 dev_kfree_skb(skb);
752                 netif_wake_queue(ndev);
753                 return NETDEV_TX_OK;
754         }
755
756         tx_data->buff = skb->data;
757         tx_data->size = skb->len;
758         tx_data->skb  = skb;
759
760         vif->netstats.tx_packets++;
761         vif->netstats.tx_bytes += tx_data->size;
762         queue_count = wilc_wlan_txq_add_net_pkt(ndev, tx_data,
763                                                 tx_data->buff, tx_data->size,
764                                                 wilc_tx_complete);
765
766         if (queue_count > FLOW_CONTROL_UPPER_THRESHOLD) {
767                 int srcu_idx;
768                 struct wilc_vif *vif;
769
770                 srcu_idx = srcu_read_lock(&wilc->srcu);
771                 list_for_each_entry_rcu(vif, &wilc->vif_list, list) {
772                         if (vif->mac_opened)
773                                 netif_stop_queue(vif->ndev);
774                 }
775                 srcu_read_unlock(&wilc->srcu, srcu_idx);
776         }
777
778         return NETDEV_TX_OK;
779 }
780
781 static int wilc_mac_close(struct net_device *ndev)
782 {
783         struct wilc_vif *vif = netdev_priv(ndev);
784         struct wilc *wl = vif->wilc;
785
786         netdev_dbg(ndev, "Mac close\n");
787
788         if (wl->open_ifcs > 0)
789                 wl->open_ifcs--;
790         else
791                 return 0;
792
793         if (vif->ndev) {
794                 netif_stop_queue(vif->ndev);
795
796                 wilc_handle_disconnect(vif);
797                 wilc_deinit_host_int(vif->ndev);
798         }
799
800         if (wl->open_ifcs == 0) {
801                 netdev_dbg(ndev, "Deinitializing wilc1000\n");
802                 wl->close = 1;
803                 wilc_wlan_deinitialize(ndev);
804         }
805
806         vif->mac_opened = 0;
807
808         return 0;
809 }
810
811 void wilc_frmw_to_host(struct wilc *wilc, u8 *buff, u32 size,
812                        u32 pkt_offset)
813 {
814         unsigned int frame_len = 0;
815         int stats;
816         unsigned char *buff_to_send = NULL;
817         struct sk_buff *skb;
818         struct net_device *wilc_netdev;
819         struct wilc_vif *vif;
820
821         if (!wilc)
822                 return;
823
824         wilc_netdev = get_if_handler(wilc, buff);
825         if (!wilc_netdev)
826                 return;
827
828         buff += pkt_offset;
829         vif = netdev_priv(wilc_netdev);
830
831         if (size > 0) {
832                 frame_len = size;
833                 buff_to_send = buff;
834
835                 skb = dev_alloc_skb(frame_len);
836                 if (!skb)
837                         return;
838
839                 skb->dev = wilc_netdev;
840
841                 skb_put_data(skb, buff_to_send, frame_len);
842
843                 skb->protocol = eth_type_trans(skb, wilc_netdev);
844                 vif->netstats.rx_packets++;
845                 vif->netstats.rx_bytes += frame_len;
846                 skb->ip_summed = CHECKSUM_UNNECESSARY;
847                 stats = netif_rx(skb);
848                 netdev_dbg(wilc_netdev, "netif_rx ret value is: %d\n", stats);
849         }
850 }
851
852 void wilc_wfi_mgmt_rx(struct wilc *wilc, u8 *buff, u32 size, bool is_auth)
853 {
854         int srcu_idx;
855         struct wilc_vif *vif;
856
857         srcu_idx = srcu_read_lock(&wilc->srcu);
858         list_for_each_entry_rcu(vif, &wilc->vif_list, list) {
859                 struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)buff;
860                 u16 type = le16_to_cpup((__le16 *)buff);
861                 u32 type_bit = BIT(type >> 4);
862                 u32 auth_bit = BIT(IEEE80211_STYPE_AUTH >> 4);
863
864                 if ((vif->mgmt_reg_stypes & auth_bit &&
865                      ieee80211_is_auth(mgmt->frame_control)) &&
866                     vif->iftype == WILC_STATION_MODE && is_auth) {
867                         wilc_wfi_mgmt_frame_rx(vif, buff, size);
868                         break;
869                 }
870
871                 if (vif->priv.p2p_listen_state &&
872                     vif->mgmt_reg_stypes & type_bit)
873                         wilc_wfi_p2p_rx(vif, buff, size);
874
875                 if (vif->monitor_flag)
876                         wilc_wfi_monitor_rx(wilc->monitor_dev, buff, size);
877         }
878         srcu_read_unlock(&wilc->srcu, srcu_idx);
879 }
880
881 static const struct net_device_ops wilc_netdev_ops = {
882         .ndo_init = mac_init_fn,
883         .ndo_open = wilc_mac_open,
884         .ndo_stop = wilc_mac_close,
885         .ndo_set_mac_address = wilc_set_mac_addr,
886         .ndo_start_xmit = wilc_mac_xmit,
887         .ndo_get_stats = mac_stats,
888         .ndo_set_rx_mode  = wilc_set_multicast_list,
889 };
890
891 void wilc_netdev_cleanup(struct wilc *wilc)
892 {
893         struct wilc_vif *vif, *vif_tmp;
894
895         if (!wilc)
896                 return;
897
898         if (wilc->firmware) {
899                 release_firmware(wilc->firmware);
900                 wilc->firmware = NULL;
901         }
902
903         list_for_each_entry_safe(vif, vif_tmp, &wilc->vif_list, list) {
904                 mutex_lock(&wilc->vif_mutex);
905                 list_del_rcu(&vif->list);
906                 wilc->vif_num--;
907                 mutex_unlock(&wilc->vif_mutex);
908                 synchronize_srcu(&wilc->srcu);
909                 if (vif->ndev)
910                         unregister_netdev(vif->ndev);
911         }
912
913         wilc_wfi_deinit_mon_interface(wilc, false);
914         destroy_workqueue(wilc->hif_workqueue);
915
916         wilc_wlan_cfg_deinit(wilc);
917         wlan_deinit_locks(wilc);
918         wiphy_unregister(wilc->wiphy);
919         wiphy_free(wilc->wiphy);
920 }
921 EXPORT_SYMBOL_GPL(wilc_netdev_cleanup);
922
923 static u8 wilc_get_available_idx(struct wilc *wl)
924 {
925         int idx = 0;
926         struct wilc_vif *vif;
927         int srcu_idx;
928
929         srcu_idx = srcu_read_lock(&wl->srcu);
930         list_for_each_entry_rcu(vif, &wl->vif_list, list) {
931                 if (vif->idx == 0)
932                         idx = 1;
933                 else
934                         idx = 0;
935         }
936         srcu_read_unlock(&wl->srcu, srcu_idx);
937         return idx;
938 }
939
940 struct wilc_vif *wilc_netdev_ifc_init(struct wilc *wl, const char *name,
941                                       int vif_type, enum nl80211_iftype type,
942                                       bool rtnl_locked)
943 {
944         struct net_device *ndev;
945         struct wilc_vif *vif;
946         int ret;
947
948         ndev = alloc_etherdev(sizeof(*vif));
949         if (!ndev)
950                 return ERR_PTR(-ENOMEM);
951
952         vif = netdev_priv(ndev);
953         ndev->ieee80211_ptr = &vif->priv.wdev;
954         strcpy(ndev->name, name);
955         vif->wilc = wl;
956         vif->ndev = ndev;
957         ndev->ml_priv = vif;
958
959         ndev->netdev_ops = &wilc_netdev_ops;
960
961         SET_NETDEV_DEV(ndev, wiphy_dev(wl->wiphy));
962
963         vif->priv.wdev.wiphy = wl->wiphy;
964         vif->priv.wdev.netdev = ndev;
965         vif->priv.wdev.iftype = type;
966         vif->priv.dev = ndev;
967
968         if (rtnl_locked)
969                 ret = cfg80211_register_netdevice(ndev);
970         else
971                 ret = register_netdev(ndev);
972
973         if (ret) {
974                 ret = -EFAULT;
975                 goto error;
976         }
977
978         ndev->needs_free_netdev = true;
979         vif->iftype = vif_type;
980         vif->idx = wilc_get_available_idx(wl);
981         vif->mac_opened = 0;
982         mutex_lock(&wl->vif_mutex);
983         list_add_tail_rcu(&vif->list, &wl->vif_list);
984         wl->vif_num += 1;
985         mutex_unlock(&wl->vif_mutex);
986         synchronize_srcu(&wl->srcu);
987
988         return vif;
989
990 error:
991         if (rtnl_locked)
992                 cfg80211_unregister_netdevice(ndev);
993         else
994                 unregister_netdev(ndev);
995         free_netdev(ndev);
996         return ERR_PTR(ret);
997 }
998
999 MODULE_DESCRIPTION("Atmel WILC1000 core wireless driver");
1000 MODULE_LICENSE("GPL");
1001 /*(DEBLOBBED)*/