Merge branch 'kvm-fix-svm-races' into kvm-master
[linux-2.6-microblaze.git] / drivers / net / wireless / ti / wlcore / main.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * This file is part of wlcore
4  *
5  * Copyright (C) 2008-2010 Nokia Corporation
6  * Copyright (C) 2011-2013 Texas Instruments Inc.
7  */
8
9 #include <linux/module.h>
10 #include <linux/firmware.h>
11 #include <linux/etherdevice.h>
12 #include <linux/vmalloc.h>
13 #include <linux/interrupt.h>
14 #include <linux/irq.h>
15 #include <linux/pm_runtime.h>
16 #include <linux/pm_wakeirq.h>
17
18 #include "wlcore.h"
19 #include "debug.h"
20 #include "wl12xx_80211.h"
21 #include "io.h"
22 #include "tx.h"
23 #include "ps.h"
24 #include "init.h"
25 #include "debugfs.h"
26 #include "testmode.h"
27 #include "vendor_cmd.h"
28 #include "scan.h"
29 #include "hw_ops.h"
30 #include "sysfs.h"
31
32 #define WL1271_BOOT_RETRIES 3
33 #define WL1271_WAKEUP_TIMEOUT 500
34
35 static char *fwlog_param;
36 static int fwlog_mem_blocks = -1;
37 static int bug_on_recovery = -1;
38 static int no_recovery     = -1;
39
40 static void __wl1271_op_remove_interface(struct wl1271 *wl,
41                                          struct ieee80211_vif *vif,
42                                          bool reset_tx_queues);
43 static void wlcore_op_stop_locked(struct wl1271 *wl);
44 static void wl1271_free_ap_keys(struct wl1271 *wl, struct wl12xx_vif *wlvif);
45
46 static int wl12xx_set_authorized(struct wl1271 *wl, struct wl12xx_vif *wlvif)
47 {
48         int ret;
49
50         if (WARN_ON(wlvif->bss_type != BSS_TYPE_STA_BSS))
51                 return -EINVAL;
52
53         if (!test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags))
54                 return 0;
55
56         if (test_and_set_bit(WLVIF_FLAG_STA_STATE_SENT, &wlvif->flags))
57                 return 0;
58
59         ret = wl12xx_cmd_set_peer_state(wl, wlvif, wlvif->sta.hlid);
60         if (ret < 0)
61                 return ret;
62
63         wl1271_info("Association completed.");
64         return 0;
65 }
66
67 static void wl1271_reg_notify(struct wiphy *wiphy,
68                               struct regulatory_request *request)
69 {
70         struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
71         struct wl1271 *wl = hw->priv;
72
73         /* copy the current dfs region */
74         if (request)
75                 wl->dfs_region = request->dfs_region;
76
77         wlcore_regdomain_config(wl);
78 }
79
80 static int wl1271_set_rx_streaming(struct wl1271 *wl, struct wl12xx_vif *wlvif,
81                                    bool enable)
82 {
83         int ret = 0;
84
85         /* we should hold wl->mutex */
86         ret = wl1271_acx_ps_rx_streaming(wl, wlvif, enable);
87         if (ret < 0)
88                 goto out;
89
90         if (enable)
91                 set_bit(WLVIF_FLAG_RX_STREAMING_STARTED, &wlvif->flags);
92         else
93                 clear_bit(WLVIF_FLAG_RX_STREAMING_STARTED, &wlvif->flags);
94 out:
95         return ret;
96 }
97
98 /*
99  * this function is being called when the rx_streaming interval
100  * has beed changed or rx_streaming should be disabled
101  */
102 int wl1271_recalc_rx_streaming(struct wl1271 *wl, struct wl12xx_vif *wlvif)
103 {
104         int ret = 0;
105         int period = wl->conf.rx_streaming.interval;
106
107         /* don't reconfigure if rx_streaming is disabled */
108         if (!test_bit(WLVIF_FLAG_RX_STREAMING_STARTED, &wlvif->flags))
109                 goto out;
110
111         /* reconfigure/disable according to new streaming_period */
112         if (period &&
113             test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags) &&
114             (wl->conf.rx_streaming.always ||
115              test_bit(WL1271_FLAG_SOFT_GEMINI, &wl->flags)))
116                 ret = wl1271_set_rx_streaming(wl, wlvif, true);
117         else {
118                 ret = wl1271_set_rx_streaming(wl, wlvif, false);
119                 /* don't cancel_work_sync since we might deadlock */
120                 del_timer_sync(&wlvif->rx_streaming_timer);
121         }
122 out:
123         return ret;
124 }
125
126 static void wl1271_rx_streaming_enable_work(struct work_struct *work)
127 {
128         int ret;
129         struct wl12xx_vif *wlvif = container_of(work, struct wl12xx_vif,
130                                                 rx_streaming_enable_work);
131         struct wl1271 *wl = wlvif->wl;
132
133         mutex_lock(&wl->mutex);
134
135         if (test_bit(WLVIF_FLAG_RX_STREAMING_STARTED, &wlvif->flags) ||
136             !test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags) ||
137             (!wl->conf.rx_streaming.always &&
138              !test_bit(WL1271_FLAG_SOFT_GEMINI, &wl->flags)))
139                 goto out;
140
141         if (!wl->conf.rx_streaming.interval)
142                 goto out;
143
144         ret = pm_runtime_get_sync(wl->dev);
145         if (ret < 0) {
146                 pm_runtime_put_noidle(wl->dev);
147                 goto out;
148         }
149
150         ret = wl1271_set_rx_streaming(wl, wlvif, true);
151         if (ret < 0)
152                 goto out_sleep;
153
154         /* stop it after some time of inactivity */
155         mod_timer(&wlvif->rx_streaming_timer,
156                   jiffies + msecs_to_jiffies(wl->conf.rx_streaming.duration));
157
158 out_sleep:
159         pm_runtime_mark_last_busy(wl->dev);
160         pm_runtime_put_autosuspend(wl->dev);
161 out:
162         mutex_unlock(&wl->mutex);
163 }
164
165 static void wl1271_rx_streaming_disable_work(struct work_struct *work)
166 {
167         int ret;
168         struct wl12xx_vif *wlvif = container_of(work, struct wl12xx_vif,
169                                                 rx_streaming_disable_work);
170         struct wl1271 *wl = wlvif->wl;
171
172         mutex_lock(&wl->mutex);
173
174         if (!test_bit(WLVIF_FLAG_RX_STREAMING_STARTED, &wlvif->flags))
175                 goto out;
176
177         ret = pm_runtime_get_sync(wl->dev);
178         if (ret < 0) {
179                 pm_runtime_put_noidle(wl->dev);
180                 goto out;
181         }
182
183         ret = wl1271_set_rx_streaming(wl, wlvif, false);
184         if (ret)
185                 goto out_sleep;
186
187 out_sleep:
188         pm_runtime_mark_last_busy(wl->dev);
189         pm_runtime_put_autosuspend(wl->dev);
190 out:
191         mutex_unlock(&wl->mutex);
192 }
193
194 static void wl1271_rx_streaming_timer(struct timer_list *t)
195 {
196         struct wl12xx_vif *wlvif = from_timer(wlvif, t, rx_streaming_timer);
197         struct wl1271 *wl = wlvif->wl;
198         ieee80211_queue_work(wl->hw, &wlvif->rx_streaming_disable_work);
199 }
200
201 /* wl->mutex must be taken */
202 void wl12xx_rearm_tx_watchdog_locked(struct wl1271 *wl)
203 {
204         /* if the watchdog is not armed, don't do anything */
205         if (wl->tx_allocated_blocks == 0)
206                 return;
207
208         cancel_delayed_work(&wl->tx_watchdog_work);
209         ieee80211_queue_delayed_work(wl->hw, &wl->tx_watchdog_work,
210                 msecs_to_jiffies(wl->conf.tx.tx_watchdog_timeout));
211 }
212
213 static void wlcore_rc_update_work(struct work_struct *work)
214 {
215         int ret;
216         struct wl12xx_vif *wlvif = container_of(work, struct wl12xx_vif,
217                                                 rc_update_work);
218         struct wl1271 *wl = wlvif->wl;
219         struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
220
221         mutex_lock(&wl->mutex);
222
223         if (unlikely(wl->state != WLCORE_STATE_ON))
224                 goto out;
225
226         ret = pm_runtime_get_sync(wl->dev);
227         if (ret < 0) {
228                 pm_runtime_put_noidle(wl->dev);
229                 goto out;
230         }
231
232         if (ieee80211_vif_is_mesh(vif)) {
233                 ret = wl1271_acx_set_ht_capabilities(wl, &wlvif->rc_ht_cap,
234                                                      true, wlvif->sta.hlid);
235                 if (ret < 0)
236                         goto out_sleep;
237         } else {
238                 wlcore_hw_sta_rc_update(wl, wlvif);
239         }
240
241 out_sleep:
242         pm_runtime_mark_last_busy(wl->dev);
243         pm_runtime_put_autosuspend(wl->dev);
244 out:
245         mutex_unlock(&wl->mutex);
246 }
247
248 static void wl12xx_tx_watchdog_work(struct work_struct *work)
249 {
250         struct delayed_work *dwork;
251         struct wl1271 *wl;
252
253         dwork = to_delayed_work(work);
254         wl = container_of(dwork, struct wl1271, tx_watchdog_work);
255
256         mutex_lock(&wl->mutex);
257
258         if (unlikely(wl->state != WLCORE_STATE_ON))
259                 goto out;
260
261         /* Tx went out in the meantime - everything is ok */
262         if (unlikely(wl->tx_allocated_blocks == 0))
263                 goto out;
264
265         /*
266          * if a ROC is in progress, we might not have any Tx for a long
267          * time (e.g. pending Tx on the non-ROC channels)
268          */
269         if (find_first_bit(wl->roc_map, WL12XX_MAX_ROLES) < WL12XX_MAX_ROLES) {
270                 wl1271_debug(DEBUG_TX, "No Tx (in FW) for %d ms due to ROC",
271                              wl->conf.tx.tx_watchdog_timeout);
272                 wl12xx_rearm_tx_watchdog_locked(wl);
273                 goto out;
274         }
275
276         /*
277          * if a scan is in progress, we might not have any Tx for a long
278          * time
279          */
280         if (wl->scan.state != WL1271_SCAN_STATE_IDLE) {
281                 wl1271_debug(DEBUG_TX, "No Tx (in FW) for %d ms due to scan",
282                              wl->conf.tx.tx_watchdog_timeout);
283                 wl12xx_rearm_tx_watchdog_locked(wl);
284                 goto out;
285         }
286
287         /*
288         * AP might cache a frame for a long time for a sleeping station,
289         * so rearm the timer if there's an AP interface with stations. If
290         * Tx is genuinely stuck we will most hopefully discover it when all
291         * stations are removed due to inactivity.
292         */
293         if (wl->active_sta_count) {
294                 wl1271_debug(DEBUG_TX, "No Tx (in FW) for %d ms. AP has "
295                              " %d stations",
296                               wl->conf.tx.tx_watchdog_timeout,
297                               wl->active_sta_count);
298                 wl12xx_rearm_tx_watchdog_locked(wl);
299                 goto out;
300         }
301
302         wl1271_error("Tx stuck (in FW) for %d ms. Starting recovery",
303                      wl->conf.tx.tx_watchdog_timeout);
304         wl12xx_queue_recovery_work(wl);
305
306 out:
307         mutex_unlock(&wl->mutex);
308 }
309
310 static void wlcore_adjust_conf(struct wl1271 *wl)
311 {
312
313         if (fwlog_param) {
314                 if (!strcmp(fwlog_param, "continuous")) {
315                         wl->conf.fwlog.mode = WL12XX_FWLOG_CONTINUOUS;
316                         wl->conf.fwlog.output = WL12XX_FWLOG_OUTPUT_HOST;
317                 } else if (!strcmp(fwlog_param, "dbgpins")) {
318                         wl->conf.fwlog.mode = WL12XX_FWLOG_CONTINUOUS;
319                         wl->conf.fwlog.output = WL12XX_FWLOG_OUTPUT_DBG_PINS;
320                 } else if (!strcmp(fwlog_param, "disable")) {
321                         wl->conf.fwlog.mem_blocks = 0;
322                         wl->conf.fwlog.output = WL12XX_FWLOG_OUTPUT_NONE;
323                 } else {
324                         wl1271_error("Unknown fwlog parameter %s", fwlog_param);
325                 }
326         }
327
328         if (bug_on_recovery != -1)
329                 wl->conf.recovery.bug_on_recovery = (u8) bug_on_recovery;
330
331         if (no_recovery != -1)
332                 wl->conf.recovery.no_recovery = (u8) no_recovery;
333 }
334
335 static void wl12xx_irq_ps_regulate_link(struct wl1271 *wl,
336                                         struct wl12xx_vif *wlvif,
337                                         u8 hlid, u8 tx_pkts)
338 {
339         bool fw_ps;
340
341         fw_ps = test_bit(hlid, &wl->ap_fw_ps_map);
342
343         /*
344          * Wake up from high level PS if the STA is asleep with too little
345          * packets in FW or if the STA is awake.
346          */
347         if (!fw_ps || tx_pkts < WL1271_PS_STA_MAX_PACKETS)
348                 wl12xx_ps_link_end(wl, wlvif, hlid);
349
350         /*
351          * Start high-level PS if the STA is asleep with enough blocks in FW.
352          * Make an exception if this is the only connected link. In this
353          * case FW-memory congestion is less of a problem.
354          * Note that a single connected STA means 2*ap_count + 1 active links,
355          * since we must account for the global and broadcast AP links
356          * for each AP. The "fw_ps" check assures us the other link is a STA
357          * connected to the AP. Otherwise the FW would not set the PSM bit.
358          */
359         else if (wl->active_link_count > (wl->ap_count*2 + 1) && fw_ps &&
360                  tx_pkts >= WL1271_PS_STA_MAX_PACKETS)
361                 wl12xx_ps_link_start(wl, wlvif, hlid, true);
362 }
363
364 static void wl12xx_irq_update_links_status(struct wl1271 *wl,
365                                            struct wl12xx_vif *wlvif,
366                                            struct wl_fw_status *status)
367 {
368         unsigned long cur_fw_ps_map;
369         u8 hlid;
370
371         cur_fw_ps_map = status->link_ps_bitmap;
372         if (wl->ap_fw_ps_map != cur_fw_ps_map) {
373                 wl1271_debug(DEBUG_PSM,
374                              "link ps prev 0x%lx cur 0x%lx changed 0x%lx",
375                              wl->ap_fw_ps_map, cur_fw_ps_map,
376                              wl->ap_fw_ps_map ^ cur_fw_ps_map);
377
378                 wl->ap_fw_ps_map = cur_fw_ps_map;
379         }
380
381         for_each_set_bit(hlid, wlvif->ap.sta_hlid_map, wl->num_links)
382                 wl12xx_irq_ps_regulate_link(wl, wlvif, hlid,
383                                             wl->links[hlid].allocated_pkts);
384 }
385
386 static int wlcore_fw_status(struct wl1271 *wl, struct wl_fw_status *status)
387 {
388         struct wl12xx_vif *wlvif;
389         u32 old_tx_blk_count = wl->tx_blocks_available;
390         int avail, freed_blocks;
391         int i;
392         int ret;
393         struct wl1271_link *lnk;
394
395         ret = wlcore_raw_read_data(wl, REG_RAW_FW_STATUS_ADDR,
396                                    wl->raw_fw_status,
397                                    wl->fw_status_len, false);
398         if (ret < 0)
399                 return ret;
400
401         wlcore_hw_convert_fw_status(wl, wl->raw_fw_status, wl->fw_status);
402
403         wl1271_debug(DEBUG_IRQ, "intr: 0x%x (fw_rx_counter = %d, "
404                      "drv_rx_counter = %d, tx_results_counter = %d)",
405                      status->intr,
406                      status->fw_rx_counter,
407                      status->drv_rx_counter,
408                      status->tx_results_counter);
409
410         for (i = 0; i < NUM_TX_QUEUES; i++) {
411                 /* prevent wrap-around in freed-packets counter */
412                 wl->tx_allocated_pkts[i] -=
413                                 (status->counters.tx_released_pkts[i] -
414                                 wl->tx_pkts_freed[i]) & 0xff;
415
416                 wl->tx_pkts_freed[i] = status->counters.tx_released_pkts[i];
417         }
418
419
420         for_each_set_bit(i, wl->links_map, wl->num_links) {
421                 u8 diff;
422                 lnk = &wl->links[i];
423
424                 /* prevent wrap-around in freed-packets counter */
425                 diff = (status->counters.tx_lnk_free_pkts[i] -
426                        lnk->prev_freed_pkts) & 0xff;
427
428                 if (diff == 0)
429                         continue;
430
431                 lnk->allocated_pkts -= diff;
432                 lnk->prev_freed_pkts = status->counters.tx_lnk_free_pkts[i];
433
434                 /* accumulate the prev_freed_pkts counter */
435                 lnk->total_freed_pkts += diff;
436         }
437
438         /* prevent wrap-around in total blocks counter */
439         if (likely(wl->tx_blocks_freed <= status->total_released_blks))
440                 freed_blocks = status->total_released_blks -
441                                wl->tx_blocks_freed;
442         else
443                 freed_blocks = 0x100000000LL - wl->tx_blocks_freed +
444                                status->total_released_blks;
445
446         wl->tx_blocks_freed = status->total_released_blks;
447
448         wl->tx_allocated_blocks -= freed_blocks;
449
450         /*
451          * If the FW freed some blocks:
452          * If we still have allocated blocks - re-arm the timer, Tx is
453          * not stuck. Otherwise, cancel the timer (no Tx currently).
454          */
455         if (freed_blocks) {
456                 if (wl->tx_allocated_blocks)
457                         wl12xx_rearm_tx_watchdog_locked(wl);
458                 else
459                         cancel_delayed_work(&wl->tx_watchdog_work);
460         }
461
462         avail = status->tx_total - wl->tx_allocated_blocks;
463
464         /*
465          * The FW might change the total number of TX memblocks before
466          * we get a notification about blocks being released. Thus, the
467          * available blocks calculation might yield a temporary result
468          * which is lower than the actual available blocks. Keeping in
469          * mind that only blocks that were allocated can be moved from
470          * TX to RX, tx_blocks_available should never decrease here.
471          */
472         wl->tx_blocks_available = max((int)wl->tx_blocks_available,
473                                       avail);
474
475         /* if more blocks are available now, tx work can be scheduled */
476         if (wl->tx_blocks_available > old_tx_blk_count)
477                 clear_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags);
478
479         /* for AP update num of allocated TX blocks per link and ps status */
480         wl12xx_for_each_wlvif_ap(wl, wlvif) {
481                 wl12xx_irq_update_links_status(wl, wlvif, status);
482         }
483
484         /* update the host-chipset time offset */
485         wl->time_offset = (ktime_get_boottime_ns() >> 10) -
486                 (s64)(status->fw_localtime);
487
488         wl->fw_fast_lnk_map = status->link_fast_bitmap;
489
490         return 0;
491 }
492
493 static void wl1271_flush_deferred_work(struct wl1271 *wl)
494 {
495         struct sk_buff *skb;
496
497         /* Pass all received frames to the network stack */
498         while ((skb = skb_dequeue(&wl->deferred_rx_queue)))
499                 ieee80211_rx_ni(wl->hw, skb);
500
501         /* Return sent skbs to the network stack */
502         while ((skb = skb_dequeue(&wl->deferred_tx_queue)))
503                 ieee80211_tx_status_ni(wl->hw, skb);
504 }
505
506 static void wl1271_netstack_work(struct work_struct *work)
507 {
508         struct wl1271 *wl =
509                 container_of(work, struct wl1271, netstack_work);
510
511         do {
512                 wl1271_flush_deferred_work(wl);
513         } while (skb_queue_len(&wl->deferred_rx_queue));
514 }
515
516 #define WL1271_IRQ_MAX_LOOPS 256
517
518 static int wlcore_irq_locked(struct wl1271 *wl)
519 {
520         int ret = 0;
521         u32 intr;
522         int loopcount = WL1271_IRQ_MAX_LOOPS;
523         bool run_tx_queue = true;
524         bool done = false;
525         unsigned int defer_count;
526         unsigned long flags;
527
528         /*
529          * In case edge triggered interrupt must be used, we cannot iterate
530          * more than once without introducing race conditions with the hardirq.
531          */
532         if (wl->irq_flags & (IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING))
533                 loopcount = 1;
534
535         wl1271_debug(DEBUG_IRQ, "IRQ work");
536
537         if (unlikely(wl->state != WLCORE_STATE_ON))
538                 goto out;
539
540         ret = pm_runtime_get_sync(wl->dev);
541         if (ret < 0) {
542                 pm_runtime_put_noidle(wl->dev);
543                 goto out;
544         }
545
546         while (!done && loopcount--) {
547                 smp_mb__after_atomic();
548
549                 ret = wlcore_fw_status(wl, wl->fw_status);
550                 if (ret < 0)
551                         goto err_ret;
552
553                 wlcore_hw_tx_immediate_compl(wl);
554
555                 intr = wl->fw_status->intr;
556                 intr &= WLCORE_ALL_INTR_MASK;
557                 if (!intr) {
558                         done = true;
559                         continue;
560                 }
561
562                 if (unlikely(intr & WL1271_ACX_INTR_WATCHDOG)) {
563                         wl1271_error("HW watchdog interrupt received! starting recovery.");
564                         wl->watchdog_recovery = true;
565                         ret = -EIO;
566
567                         /* restarting the chip. ignore any other interrupt. */
568                         goto err_ret;
569                 }
570
571                 if (unlikely(intr & WL1271_ACX_SW_INTR_WATCHDOG)) {
572                         wl1271_error("SW watchdog interrupt received! "
573                                      "starting recovery.");
574                         wl->watchdog_recovery = true;
575                         ret = -EIO;
576
577                         /* restarting the chip. ignore any other interrupt. */
578                         goto err_ret;
579                 }
580
581                 if (likely(intr & WL1271_ACX_INTR_DATA)) {
582                         wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_DATA");
583
584                         ret = wlcore_rx(wl, wl->fw_status);
585                         if (ret < 0)
586                                 goto err_ret;
587
588                         /* Check if any tx blocks were freed */
589                         if (!test_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags)) {
590                                 if (spin_trylock_irqsave(&wl->wl_lock, flags)) {
591                                         if (!wl1271_tx_total_queue_count(wl))
592                                                 run_tx_queue = false;
593                                         spin_unlock_irqrestore(&wl->wl_lock, flags);
594                                 }
595
596                                 /*
597                                  * In order to avoid starvation of the TX path,
598                                  * call the work function directly.
599                                  */
600                                 if (run_tx_queue) {
601                                         ret = wlcore_tx_work_locked(wl);
602                                         if (ret < 0)
603                                                 goto err_ret;
604                                 }
605                         }
606
607                         /* check for tx results */
608                         ret = wlcore_hw_tx_delayed_compl(wl);
609                         if (ret < 0)
610                                 goto err_ret;
611
612                         /* Make sure the deferred queues don't get too long */
613                         defer_count = skb_queue_len(&wl->deferred_tx_queue) +
614                                       skb_queue_len(&wl->deferred_rx_queue);
615                         if (defer_count > WL1271_DEFERRED_QUEUE_LIMIT)
616                                 wl1271_flush_deferred_work(wl);
617                 }
618
619                 if (intr & WL1271_ACX_INTR_EVENT_A) {
620                         wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_EVENT_A");
621                         ret = wl1271_event_handle(wl, 0);
622                         if (ret < 0)
623                                 goto err_ret;
624                 }
625
626                 if (intr & WL1271_ACX_INTR_EVENT_B) {
627                         wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_EVENT_B");
628                         ret = wl1271_event_handle(wl, 1);
629                         if (ret < 0)
630                                 goto err_ret;
631                 }
632
633                 if (intr & WL1271_ACX_INTR_INIT_COMPLETE)
634                         wl1271_debug(DEBUG_IRQ,
635                                      "WL1271_ACX_INTR_INIT_COMPLETE");
636
637                 if (intr & WL1271_ACX_INTR_HW_AVAILABLE)
638                         wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_HW_AVAILABLE");
639         }
640
641 err_ret:
642         pm_runtime_mark_last_busy(wl->dev);
643         pm_runtime_put_autosuspend(wl->dev);
644
645 out:
646         return ret;
647 }
648
649 static irqreturn_t wlcore_irq(int irq, void *cookie)
650 {
651         int ret;
652         unsigned long flags;
653         struct wl1271 *wl = cookie;
654         bool queue_tx_work = true;
655
656         set_bit(WL1271_FLAG_IRQ_RUNNING, &wl->flags);
657
658         /* complete the ELP completion */
659         if (test_bit(WL1271_FLAG_IN_ELP, &wl->flags)) {
660                 spin_lock_irqsave(&wl->wl_lock, flags);
661                 if (wl->elp_compl)
662                         complete(wl->elp_compl);
663                 spin_unlock_irqrestore(&wl->wl_lock, flags);
664         }
665
666         if (test_bit(WL1271_FLAG_SUSPENDED, &wl->flags)) {
667                 /* don't enqueue a work right now. mark it as pending */
668                 set_bit(WL1271_FLAG_PENDING_WORK, &wl->flags);
669                 wl1271_debug(DEBUG_IRQ, "should not enqueue work");
670                 spin_lock_irqsave(&wl->wl_lock, flags);
671                 disable_irq_nosync(wl->irq);
672                 pm_wakeup_event(wl->dev, 0);
673                 spin_unlock_irqrestore(&wl->wl_lock, flags);
674                 goto out_handled;
675         }
676
677         /* TX might be handled here, avoid redundant work */
678         set_bit(WL1271_FLAG_TX_PENDING, &wl->flags);
679         cancel_work_sync(&wl->tx_work);
680
681         mutex_lock(&wl->mutex);
682
683         ret = wlcore_irq_locked(wl);
684         if (ret)
685                 wl12xx_queue_recovery_work(wl);
686
687         /* In case TX was not handled in wlcore_irq_locked(), queue TX work */
688         clear_bit(WL1271_FLAG_TX_PENDING, &wl->flags);
689         if (!test_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags)) {
690                 if (spin_trylock_irqsave(&wl->wl_lock, flags)) {
691                         if (!wl1271_tx_total_queue_count(wl))
692                                 queue_tx_work = false;
693                         spin_unlock_irqrestore(&wl->wl_lock, flags);
694                 }
695                 if (queue_tx_work)
696                         ieee80211_queue_work(wl->hw, &wl->tx_work);
697         }
698
699         mutex_unlock(&wl->mutex);
700
701 out_handled:
702         clear_bit(WL1271_FLAG_IRQ_RUNNING, &wl->flags);
703
704         return IRQ_HANDLED;
705 }
706
707 struct vif_counter_data {
708         u8 counter;
709
710         struct ieee80211_vif *cur_vif;
711         bool cur_vif_running;
712 };
713
714 static void wl12xx_vif_count_iter(void *data, u8 *mac,
715                                   struct ieee80211_vif *vif)
716 {
717         struct vif_counter_data *counter = data;
718
719         counter->counter++;
720         if (counter->cur_vif == vif)
721                 counter->cur_vif_running = true;
722 }
723
724 /* caller must not hold wl->mutex, as it might deadlock */
725 static void wl12xx_get_vif_count(struct ieee80211_hw *hw,
726                                struct ieee80211_vif *cur_vif,
727                                struct vif_counter_data *data)
728 {
729         memset(data, 0, sizeof(*data));
730         data->cur_vif = cur_vif;
731
732         ieee80211_iterate_active_interfaces(hw, IEEE80211_IFACE_ITER_RESUME_ALL,
733                                             wl12xx_vif_count_iter, data);
734 }
735
736 static int wl12xx_fetch_firmware(struct wl1271 *wl, bool plt)
737 {
738         const struct firmware *fw;
739         const char *fw_name;
740         enum wl12xx_fw_type fw_type;
741         int ret;
742
743         if (plt) {
744                 fw_type = WL12XX_FW_TYPE_PLT;
745                 fw_name = wl->plt_fw_name;
746         } else {
747                 /*
748                  * we can't call wl12xx_get_vif_count() here because
749                  * wl->mutex is taken, so use the cached last_vif_count value
750                  */
751                 if (wl->last_vif_count > 1 && wl->mr_fw_name) {
752                         fw_type = WL12XX_FW_TYPE_MULTI;
753                         fw_name = wl->mr_fw_name;
754                 } else {
755                         fw_type = WL12XX_FW_TYPE_NORMAL;
756                         fw_name = wl->sr_fw_name;
757                 }
758         }
759
760         if (wl->fw_type == fw_type)
761                 return 0;
762
763         wl1271_debug(DEBUG_BOOT, "booting firmware %s", fw_name);
764
765         ret = request_firmware(&fw, fw_name, wl->dev);
766
767         if (ret < 0) {
768                 wl1271_error("could not get firmware %s: %d", fw_name, ret);
769                 return ret;
770         }
771
772         if (fw->size % 4) {
773                 wl1271_error("firmware size is not multiple of 32 bits: %zu",
774                              fw->size);
775                 ret = -EILSEQ;
776                 goto out;
777         }
778
779         vfree(wl->fw);
780         wl->fw_type = WL12XX_FW_TYPE_NONE;
781         wl->fw_len = fw->size;
782         wl->fw = vmalloc(wl->fw_len);
783
784         if (!wl->fw) {
785                 wl1271_error("could not allocate memory for the firmware");
786                 ret = -ENOMEM;
787                 goto out;
788         }
789
790         memcpy(wl->fw, fw->data, wl->fw_len);
791         ret = 0;
792         wl->fw_type = fw_type;
793 out:
794         release_firmware(fw);
795
796         return ret;
797 }
798
799 void wl12xx_queue_recovery_work(struct wl1271 *wl)
800 {
801         /* Avoid a recursive recovery */
802         if (wl->state == WLCORE_STATE_ON) {
803                 WARN_ON(!test_bit(WL1271_FLAG_INTENDED_FW_RECOVERY,
804                                   &wl->flags));
805
806                 wl->state = WLCORE_STATE_RESTARTING;
807                 set_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags);
808                 ieee80211_queue_work(wl->hw, &wl->recovery_work);
809         }
810 }
811
812 size_t wl12xx_copy_fwlog(struct wl1271 *wl, u8 *memblock, size_t maxlen)
813 {
814         size_t len;
815
816         /* Make sure we have enough room */
817         len = min_t(size_t, maxlen, PAGE_SIZE - wl->fwlog_size);
818
819         /* Fill the FW log file, consumed by the sysfs fwlog entry */
820         memcpy(wl->fwlog + wl->fwlog_size, memblock, len);
821         wl->fwlog_size += len;
822
823         return len;
824 }
825
826 static void wl12xx_read_fwlog_panic(struct wl1271 *wl)
827 {
828         u32 end_of_log = 0;
829         int error;
830
831         if (wl->quirks & WLCORE_QUIRK_FWLOG_NOT_IMPLEMENTED)
832                 return;
833
834         wl1271_info("Reading FW panic log");
835
836         /*
837          * Make sure the chip is awake and the logger isn't active.
838          * Do not send a stop fwlog command if the fw is hanged or if
839          * dbgpins are used (due to some fw bug).
840          */
841         error = pm_runtime_get_sync(wl->dev);
842         if (error < 0) {
843                 pm_runtime_put_noidle(wl->dev);
844                 return;
845         }
846         if (!wl->watchdog_recovery &&
847             wl->conf.fwlog.output != WL12XX_FWLOG_OUTPUT_DBG_PINS)
848                 wl12xx_cmd_stop_fwlog(wl);
849
850         /* Traverse the memory blocks linked list */
851         do {
852                 end_of_log = wlcore_event_fw_logger(wl);
853                 if (end_of_log == 0) {
854                         msleep(100);
855                         end_of_log = wlcore_event_fw_logger(wl);
856                 }
857         } while (end_of_log != 0);
858 }
859
860 static void wlcore_save_freed_pkts(struct wl1271 *wl, struct wl12xx_vif *wlvif,
861                                    u8 hlid, struct ieee80211_sta *sta)
862 {
863         struct wl1271_station *wl_sta;
864         u32 sqn_recovery_padding = WL1271_TX_SQN_POST_RECOVERY_PADDING;
865
866         wl_sta = (void *)sta->drv_priv;
867         wl_sta->total_freed_pkts = wl->links[hlid].total_freed_pkts;
868
869         /*
870          * increment the initial seq number on recovery to account for
871          * transmitted packets that we haven't yet got in the FW status
872          */
873         if (wlvif->encryption_type == KEY_GEM)
874                 sqn_recovery_padding = WL1271_TX_SQN_POST_RECOVERY_PADDING_GEM;
875
876         if (test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags))
877                 wl_sta->total_freed_pkts += sqn_recovery_padding;
878 }
879
880 static void wlcore_save_freed_pkts_addr(struct wl1271 *wl,
881                                         struct wl12xx_vif *wlvif,
882                                         u8 hlid, const u8 *addr)
883 {
884         struct ieee80211_sta *sta;
885         struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
886
887         if (WARN_ON(hlid == WL12XX_INVALID_LINK_ID ||
888                     is_zero_ether_addr(addr)))
889                 return;
890
891         rcu_read_lock();
892         sta = ieee80211_find_sta(vif, addr);
893         if (sta)
894                 wlcore_save_freed_pkts(wl, wlvif, hlid, sta);
895         rcu_read_unlock();
896 }
897
898 static void wlcore_print_recovery(struct wl1271 *wl)
899 {
900         u32 pc = 0;
901         u32 hint_sts = 0;
902         int ret;
903
904         wl1271_info("Hardware recovery in progress. FW ver: %s",
905                     wl->chip.fw_ver_str);
906
907         /* change partitions momentarily so we can read the FW pc */
908         ret = wlcore_set_partition(wl, &wl->ptable[PART_BOOT]);
909         if (ret < 0)
910                 return;
911
912         ret = wlcore_read_reg(wl, REG_PC_ON_RECOVERY, &pc);
913         if (ret < 0)
914                 return;
915
916         ret = wlcore_read_reg(wl, REG_INTERRUPT_NO_CLEAR, &hint_sts);
917         if (ret < 0)
918                 return;
919
920         wl1271_info("pc: 0x%x, hint_sts: 0x%08x count: %d",
921                                 pc, hint_sts, ++wl->recovery_count);
922
923         wlcore_set_partition(wl, &wl->ptable[PART_WORK]);
924 }
925
926
927 static void wl1271_recovery_work(struct work_struct *work)
928 {
929         struct wl1271 *wl =
930                 container_of(work, struct wl1271, recovery_work);
931         struct wl12xx_vif *wlvif;
932         struct ieee80211_vif *vif;
933         int error;
934
935         mutex_lock(&wl->mutex);
936
937         if (wl->state == WLCORE_STATE_OFF || wl->plt)
938                 goto out_unlock;
939
940         error = pm_runtime_get_sync(wl->dev);
941         if (error < 0) {
942                 wl1271_warning("Enable for recovery failed");
943                 pm_runtime_put_noidle(wl->dev);
944         }
945         wlcore_disable_interrupts_nosync(wl);
946
947         if (!test_bit(WL1271_FLAG_INTENDED_FW_RECOVERY, &wl->flags)) {
948                 if (wl->conf.fwlog.output == WL12XX_FWLOG_OUTPUT_HOST)
949                         wl12xx_read_fwlog_panic(wl);
950                 wlcore_print_recovery(wl);
951         }
952
953         BUG_ON(wl->conf.recovery.bug_on_recovery &&
954                !test_bit(WL1271_FLAG_INTENDED_FW_RECOVERY, &wl->flags));
955
956         clear_bit(WL1271_FLAG_INTENDED_FW_RECOVERY, &wl->flags);
957
958         if (wl->conf.recovery.no_recovery) {
959                 wl1271_info("No recovery (chosen on module load). Fw will remain stuck.");
960                 goto out_unlock;
961         }
962
963         /* Prevent spurious TX during FW restart */
964         wlcore_stop_queues(wl, WLCORE_QUEUE_STOP_REASON_FW_RESTART);
965
966         /* reboot the chipset */
967         while (!list_empty(&wl->wlvif_list)) {
968                 wlvif = list_first_entry(&wl->wlvif_list,
969                                        struct wl12xx_vif, list);
970                 vif = wl12xx_wlvif_to_vif(wlvif);
971
972                 if (wlvif->bss_type == BSS_TYPE_STA_BSS &&
973                     test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags)) {
974                         wlcore_save_freed_pkts_addr(wl, wlvif, wlvif->sta.hlid,
975                                                     vif->bss_conf.bssid);
976                 }
977
978                 __wl1271_op_remove_interface(wl, vif, false);
979         }
980
981         wlcore_op_stop_locked(wl);
982         pm_runtime_mark_last_busy(wl->dev);
983         pm_runtime_put_autosuspend(wl->dev);
984
985         ieee80211_restart_hw(wl->hw);
986
987         /*
988          * Its safe to enable TX now - the queues are stopped after a request
989          * to restart the HW.
990          */
991         wlcore_wake_queues(wl, WLCORE_QUEUE_STOP_REASON_FW_RESTART);
992
993 out_unlock:
994         wl->watchdog_recovery = false;
995         clear_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags);
996         mutex_unlock(&wl->mutex);
997 }
998
999 static int wlcore_fw_wakeup(struct wl1271 *wl)
1000 {
1001         return wlcore_raw_write32(wl, HW_ACCESS_ELP_CTRL_REG, ELPCTRL_WAKE_UP);
1002 }
1003
1004 static int wl1271_setup(struct wl1271 *wl)
1005 {
1006         wl->raw_fw_status = kzalloc(wl->fw_status_len, GFP_KERNEL);
1007         if (!wl->raw_fw_status)
1008                 goto err;
1009
1010         wl->fw_status = kzalloc(sizeof(*wl->fw_status), GFP_KERNEL);
1011         if (!wl->fw_status)
1012                 goto err;
1013
1014         wl->tx_res_if = kzalloc(sizeof(*wl->tx_res_if), GFP_KERNEL);
1015         if (!wl->tx_res_if)
1016                 goto err;
1017
1018         return 0;
1019 err:
1020         kfree(wl->fw_status);
1021         kfree(wl->raw_fw_status);
1022         return -ENOMEM;
1023 }
1024
1025 static int wl12xx_set_power_on(struct wl1271 *wl)
1026 {
1027         int ret;
1028
1029         msleep(WL1271_PRE_POWER_ON_SLEEP);
1030         ret = wl1271_power_on(wl);
1031         if (ret < 0)
1032                 goto out;
1033         msleep(WL1271_POWER_ON_SLEEP);
1034         wl1271_io_reset(wl);
1035         wl1271_io_init(wl);
1036
1037         ret = wlcore_set_partition(wl, &wl->ptable[PART_BOOT]);
1038         if (ret < 0)
1039                 goto fail;
1040
1041         /* ELP module wake up */
1042         ret = wlcore_fw_wakeup(wl);
1043         if (ret < 0)
1044                 goto fail;
1045
1046 out:
1047         return ret;
1048
1049 fail:
1050         wl1271_power_off(wl);
1051         return ret;
1052 }
1053
1054 static int wl12xx_chip_wakeup(struct wl1271 *wl, bool plt)
1055 {
1056         int ret = 0;
1057
1058         ret = wl12xx_set_power_on(wl);
1059         if (ret < 0)
1060                 goto out;
1061
1062         /*
1063          * For wl127x based devices we could use the default block
1064          * size (512 bytes), but due to a bug in the sdio driver, we
1065          * need to set it explicitly after the chip is powered on.  To
1066          * simplify the code and since the performance impact is
1067          * negligible, we use the same block size for all different
1068          * chip types.
1069          *
1070          * Check if the bus supports blocksize alignment and, if it
1071          * doesn't, make sure we don't have the quirk.
1072          */
1073         if (!wl1271_set_block_size(wl))
1074                 wl->quirks &= ~WLCORE_QUIRK_TX_BLOCKSIZE_ALIGN;
1075
1076         /* TODO: make sure the lower driver has set things up correctly */
1077
1078         ret = wl1271_setup(wl);
1079         if (ret < 0)
1080                 goto out;
1081
1082         ret = wl12xx_fetch_firmware(wl, plt);
1083         if (ret < 0) {
1084                 kfree(wl->fw_status);
1085                 kfree(wl->raw_fw_status);
1086                 kfree(wl->tx_res_if);
1087         }
1088
1089 out:
1090         return ret;
1091 }
1092
1093 int wl1271_plt_start(struct wl1271 *wl, const enum plt_mode plt_mode)
1094 {
1095         int retries = WL1271_BOOT_RETRIES;
1096         struct wiphy *wiphy = wl->hw->wiphy;
1097
1098         static const char* const PLT_MODE[] = {
1099                 "PLT_OFF",
1100                 "PLT_ON",
1101                 "PLT_FEM_DETECT",
1102                 "PLT_CHIP_AWAKE"
1103         };
1104
1105         int ret;
1106
1107         mutex_lock(&wl->mutex);
1108
1109         wl1271_notice("power up");
1110
1111         if (wl->state != WLCORE_STATE_OFF) {
1112                 wl1271_error("cannot go into PLT state because not "
1113                              "in off state: %d", wl->state);
1114                 ret = -EBUSY;
1115                 goto out;
1116         }
1117
1118         /* Indicate to lower levels that we are now in PLT mode */
1119         wl->plt = true;
1120         wl->plt_mode = plt_mode;
1121
1122         while (retries) {
1123                 retries--;
1124                 ret = wl12xx_chip_wakeup(wl, true);
1125                 if (ret < 0)
1126                         goto power_off;
1127
1128                 if (plt_mode != PLT_CHIP_AWAKE) {
1129                         ret = wl->ops->plt_init(wl);
1130                         if (ret < 0)
1131                                 goto power_off;
1132                 }
1133
1134                 wl->state = WLCORE_STATE_ON;
1135                 wl1271_notice("firmware booted in PLT mode %s (%s)",
1136                               PLT_MODE[plt_mode],
1137                               wl->chip.fw_ver_str);
1138
1139                 /* update hw/fw version info in wiphy struct */
1140                 wiphy->hw_version = wl->chip.id;
1141                 strncpy(wiphy->fw_version, wl->chip.fw_ver_str,
1142                         sizeof(wiphy->fw_version));
1143
1144                 goto out;
1145
1146 power_off:
1147                 wl1271_power_off(wl);
1148         }
1149
1150         wl->plt = false;
1151         wl->plt_mode = PLT_OFF;
1152
1153         wl1271_error("firmware boot in PLT mode failed despite %d retries",
1154                      WL1271_BOOT_RETRIES);
1155 out:
1156         mutex_unlock(&wl->mutex);
1157
1158         return ret;
1159 }
1160
1161 int wl1271_plt_stop(struct wl1271 *wl)
1162 {
1163         int ret = 0;
1164
1165         wl1271_notice("power down");
1166
1167         /*
1168          * Interrupts must be disabled before setting the state to OFF.
1169          * Otherwise, the interrupt handler might be called and exit without
1170          * reading the interrupt status.
1171          */
1172         wlcore_disable_interrupts(wl);
1173         mutex_lock(&wl->mutex);
1174         if (!wl->plt) {
1175                 mutex_unlock(&wl->mutex);
1176
1177                 /*
1178                  * This will not necessarily enable interrupts as interrupts
1179                  * may have been disabled when op_stop was called. It will,
1180                  * however, balance the above call to disable_interrupts().
1181                  */
1182                 wlcore_enable_interrupts(wl);
1183
1184                 wl1271_error("cannot power down because not in PLT "
1185                              "state: %d", wl->state);
1186                 ret = -EBUSY;
1187                 goto out;
1188         }
1189
1190         mutex_unlock(&wl->mutex);
1191
1192         wl1271_flush_deferred_work(wl);
1193         cancel_work_sync(&wl->netstack_work);
1194         cancel_work_sync(&wl->recovery_work);
1195         cancel_delayed_work_sync(&wl->tx_watchdog_work);
1196
1197         mutex_lock(&wl->mutex);
1198         wl1271_power_off(wl);
1199         wl->flags = 0;
1200         wl->sleep_auth = WL1271_PSM_ILLEGAL;
1201         wl->state = WLCORE_STATE_OFF;
1202         wl->plt = false;
1203         wl->plt_mode = PLT_OFF;
1204         wl->rx_counter = 0;
1205         mutex_unlock(&wl->mutex);
1206
1207 out:
1208         return ret;
1209 }
1210
1211 static void wl1271_op_tx(struct ieee80211_hw *hw,
1212                          struct ieee80211_tx_control *control,
1213                          struct sk_buff *skb)
1214 {
1215         struct wl1271 *wl = hw->priv;
1216         struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
1217         struct ieee80211_vif *vif = info->control.vif;
1218         struct wl12xx_vif *wlvif = NULL;
1219         unsigned long flags;
1220         int q, mapping;
1221         u8 hlid;
1222
1223         if (!vif) {
1224                 wl1271_debug(DEBUG_TX, "DROP skb with no vif");
1225                 ieee80211_free_txskb(hw, skb);
1226                 return;
1227         }
1228
1229         wlvif = wl12xx_vif_to_data(vif);
1230         mapping = skb_get_queue_mapping(skb);
1231         q = wl1271_tx_get_queue(mapping);
1232
1233         hlid = wl12xx_tx_get_hlid(wl, wlvif, skb, control->sta);
1234
1235         spin_lock_irqsave(&wl->wl_lock, flags);
1236
1237         /*
1238          * drop the packet if the link is invalid or the queue is stopped
1239          * for any reason but watermark. Watermark is a "soft"-stop so we
1240          * allow these packets through.
1241          */
1242         if (hlid == WL12XX_INVALID_LINK_ID ||
1243             (!test_bit(hlid, wlvif->links_map)) ||
1244              (wlcore_is_queue_stopped_locked(wl, wlvif, q) &&
1245               !wlcore_is_queue_stopped_by_reason_locked(wl, wlvif, q,
1246                         WLCORE_QUEUE_STOP_REASON_WATERMARK))) {
1247                 wl1271_debug(DEBUG_TX, "DROP skb hlid %d q %d", hlid, q);
1248                 ieee80211_free_txskb(hw, skb);
1249                 goto out;
1250         }
1251
1252         wl1271_debug(DEBUG_TX, "queue skb hlid %d q %d len %d",
1253                      hlid, q, skb->len);
1254         skb_queue_tail(&wl->links[hlid].tx_queue[q], skb);
1255
1256         wl->tx_queue_count[q]++;
1257         wlvif->tx_queue_count[q]++;
1258
1259         /*
1260          * The workqueue is slow to process the tx_queue and we need stop
1261          * the queue here, otherwise the queue will get too long.
1262          */
1263         if (wlvif->tx_queue_count[q] >= WL1271_TX_QUEUE_HIGH_WATERMARK &&
1264             !wlcore_is_queue_stopped_by_reason_locked(wl, wlvif, q,
1265                                         WLCORE_QUEUE_STOP_REASON_WATERMARK)) {
1266                 wl1271_debug(DEBUG_TX, "op_tx: stopping queues for q %d", q);
1267                 wlcore_stop_queue_locked(wl, wlvif, q,
1268                                          WLCORE_QUEUE_STOP_REASON_WATERMARK);
1269         }
1270
1271         /*
1272          * The chip specific setup must run before the first TX packet -
1273          * before that, the tx_work will not be initialized!
1274          */
1275
1276         if (!test_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags) &&
1277             !test_bit(WL1271_FLAG_TX_PENDING, &wl->flags))
1278                 ieee80211_queue_work(wl->hw, &wl->tx_work);
1279
1280 out:
1281         spin_unlock_irqrestore(&wl->wl_lock, flags);
1282 }
1283
1284 int wl1271_tx_dummy_packet(struct wl1271 *wl)
1285 {
1286         unsigned long flags;
1287         int q;
1288
1289         /* no need to queue a new dummy packet if one is already pending */
1290         if (test_bit(WL1271_FLAG_DUMMY_PACKET_PENDING, &wl->flags))
1291                 return 0;
1292
1293         q = wl1271_tx_get_queue(skb_get_queue_mapping(wl->dummy_packet));
1294
1295         spin_lock_irqsave(&wl->wl_lock, flags);
1296         set_bit(WL1271_FLAG_DUMMY_PACKET_PENDING, &wl->flags);
1297         wl->tx_queue_count[q]++;
1298         spin_unlock_irqrestore(&wl->wl_lock, flags);
1299
1300         /* The FW is low on RX memory blocks, so send the dummy packet asap */
1301         if (!test_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags))
1302                 return wlcore_tx_work_locked(wl);
1303
1304         /*
1305          * If the FW TX is busy, TX work will be scheduled by the threaded
1306          * interrupt handler function
1307          */
1308         return 0;
1309 }
1310
1311 /*
1312  * The size of the dummy packet should be at least 1400 bytes. However, in
1313  * order to minimize the number of bus transactions, aligning it to 512 bytes
1314  * boundaries could be beneficial, performance wise
1315  */
1316 #define TOTAL_TX_DUMMY_PACKET_SIZE (ALIGN(1400, 512))
1317
1318 static struct sk_buff *wl12xx_alloc_dummy_packet(struct wl1271 *wl)
1319 {
1320         struct sk_buff *skb;
1321         struct ieee80211_hdr_3addr *hdr;
1322         unsigned int dummy_packet_size;
1323
1324         dummy_packet_size = TOTAL_TX_DUMMY_PACKET_SIZE -
1325                             sizeof(struct wl1271_tx_hw_descr) - sizeof(*hdr);
1326
1327         skb = dev_alloc_skb(TOTAL_TX_DUMMY_PACKET_SIZE);
1328         if (!skb) {
1329                 wl1271_warning("Failed to allocate a dummy packet skb");
1330                 return NULL;
1331         }
1332
1333         skb_reserve(skb, sizeof(struct wl1271_tx_hw_descr));
1334
1335         hdr = skb_put_zero(skb, sizeof(*hdr));
1336         hdr->frame_control = cpu_to_le16(IEEE80211_FTYPE_DATA |
1337                                          IEEE80211_STYPE_NULLFUNC |
1338                                          IEEE80211_FCTL_TODS);
1339
1340         skb_put_zero(skb, dummy_packet_size);
1341
1342         /* Dummy packets require the TID to be management */
1343         skb->priority = WL1271_TID_MGMT;
1344
1345         /* Initialize all fields that might be used */
1346         skb_set_queue_mapping(skb, 0);
1347         memset(IEEE80211_SKB_CB(skb), 0, sizeof(struct ieee80211_tx_info));
1348
1349         return skb;
1350 }
1351
1352
1353 static int
1354 wl1271_validate_wowlan_pattern(struct cfg80211_pkt_pattern *p)
1355 {
1356         int num_fields = 0, in_field = 0, fields_size = 0;
1357         int i, pattern_len = 0;
1358
1359         if (!p->mask) {
1360                 wl1271_warning("No mask in WoWLAN pattern");
1361                 return -EINVAL;
1362         }
1363
1364         /*
1365          * The pattern is broken up into segments of bytes at different offsets
1366          * that need to be checked by the FW filter. Each segment is called
1367          * a field in the FW API. We verify that the total number of fields
1368          * required for this pattern won't exceed FW limits (8)
1369          * as well as the total fields buffer won't exceed the FW limit.
1370          * Note that if there's a pattern which crosses Ethernet/IP header
1371          * boundary a new field is required.
1372          */
1373         for (i = 0; i < p->pattern_len; i++) {
1374                 if (test_bit(i, (unsigned long *)p->mask)) {
1375                         if (!in_field) {
1376                                 in_field = 1;
1377                                 pattern_len = 1;
1378                         } else {
1379                                 if (i == WL1271_RX_FILTER_ETH_HEADER_SIZE) {
1380                                         num_fields++;
1381                                         fields_size += pattern_len +
1382                                                 RX_FILTER_FIELD_OVERHEAD;
1383                                         pattern_len = 1;
1384                                 } else
1385                                         pattern_len++;
1386                         }
1387                 } else {
1388                         if (in_field) {
1389                                 in_field = 0;
1390                                 fields_size += pattern_len +
1391                                         RX_FILTER_FIELD_OVERHEAD;
1392                                 num_fields++;
1393                         }
1394                 }
1395         }
1396
1397         if (in_field) {
1398                 fields_size += pattern_len + RX_FILTER_FIELD_OVERHEAD;
1399                 num_fields++;
1400         }
1401
1402         if (num_fields > WL1271_RX_FILTER_MAX_FIELDS) {
1403                 wl1271_warning("RX Filter too complex. Too many segments");
1404                 return -EINVAL;
1405         }
1406
1407         if (fields_size > WL1271_RX_FILTER_MAX_FIELDS_SIZE) {
1408                 wl1271_warning("RX filter pattern is too big");
1409                 return -E2BIG;
1410         }
1411
1412         return 0;
1413 }
1414
1415 struct wl12xx_rx_filter *wl1271_rx_filter_alloc(void)
1416 {
1417         return kzalloc(sizeof(struct wl12xx_rx_filter), GFP_KERNEL);
1418 }
1419
1420 void wl1271_rx_filter_free(struct wl12xx_rx_filter *filter)
1421 {
1422         int i;
1423
1424         if (filter == NULL)
1425                 return;
1426
1427         for (i = 0; i < filter->num_fields; i++)
1428                 kfree(filter->fields[i].pattern);
1429
1430         kfree(filter);
1431 }
1432
1433 int wl1271_rx_filter_alloc_field(struct wl12xx_rx_filter *filter,
1434                                  u16 offset, u8 flags,
1435                                  const u8 *pattern, u8 len)
1436 {
1437         struct wl12xx_rx_filter_field *field;
1438
1439         if (filter->num_fields == WL1271_RX_FILTER_MAX_FIELDS) {
1440                 wl1271_warning("Max fields per RX filter. can't alloc another");
1441                 return -EINVAL;
1442         }
1443
1444         field = &filter->fields[filter->num_fields];
1445
1446         field->pattern = kmemdup(pattern, len, GFP_KERNEL);
1447         if (!field->pattern) {
1448                 wl1271_warning("Failed to allocate RX filter pattern");
1449                 return -ENOMEM;
1450         }
1451
1452         filter->num_fields++;
1453
1454         field->offset = cpu_to_le16(offset);
1455         field->flags = flags;
1456         field->len = len;
1457
1458         return 0;
1459 }
1460
1461 int wl1271_rx_filter_get_fields_size(struct wl12xx_rx_filter *filter)
1462 {
1463         int i, fields_size = 0;
1464
1465         for (i = 0; i < filter->num_fields; i++)
1466                 fields_size += filter->fields[i].len +
1467                         sizeof(struct wl12xx_rx_filter_field) -
1468                         sizeof(u8 *);
1469
1470         return fields_size;
1471 }
1472
1473 void wl1271_rx_filter_flatten_fields(struct wl12xx_rx_filter *filter,
1474                                     u8 *buf)
1475 {
1476         int i;
1477         struct wl12xx_rx_filter_field *field;
1478
1479         for (i = 0; i < filter->num_fields; i++) {
1480                 field = (struct wl12xx_rx_filter_field *)buf;
1481
1482                 field->offset = filter->fields[i].offset;
1483                 field->flags = filter->fields[i].flags;
1484                 field->len = filter->fields[i].len;
1485
1486                 memcpy(&field->pattern, filter->fields[i].pattern, field->len);
1487                 buf += sizeof(struct wl12xx_rx_filter_field) -
1488                         sizeof(u8 *) + field->len;
1489         }
1490 }
1491
1492 /*
1493  * Allocates an RX filter returned through f
1494  * which needs to be freed using rx_filter_free()
1495  */
1496 static int
1497 wl1271_convert_wowlan_pattern_to_rx_filter(struct cfg80211_pkt_pattern *p,
1498                                            struct wl12xx_rx_filter **f)
1499 {
1500         int i, j, ret = 0;
1501         struct wl12xx_rx_filter *filter;
1502         u16 offset;
1503         u8 flags, len;
1504
1505         filter = wl1271_rx_filter_alloc();
1506         if (!filter) {
1507                 wl1271_warning("Failed to alloc rx filter");
1508                 ret = -ENOMEM;
1509                 goto err;
1510         }
1511
1512         i = 0;
1513         while (i < p->pattern_len) {
1514                 if (!test_bit(i, (unsigned long *)p->mask)) {
1515                         i++;
1516                         continue;
1517                 }
1518
1519                 for (j = i; j < p->pattern_len; j++) {
1520                         if (!test_bit(j, (unsigned long *)p->mask))
1521                                 break;
1522
1523                         if (i < WL1271_RX_FILTER_ETH_HEADER_SIZE &&
1524                             j >= WL1271_RX_FILTER_ETH_HEADER_SIZE)
1525                                 break;
1526                 }
1527
1528                 if (i < WL1271_RX_FILTER_ETH_HEADER_SIZE) {
1529                         offset = i;
1530                         flags = WL1271_RX_FILTER_FLAG_ETHERNET_HEADER;
1531                 } else {
1532                         offset = i - WL1271_RX_FILTER_ETH_HEADER_SIZE;
1533                         flags = WL1271_RX_FILTER_FLAG_IP_HEADER;
1534                 }
1535
1536                 len = j - i;
1537
1538                 ret = wl1271_rx_filter_alloc_field(filter,
1539                                                    offset,
1540                                                    flags,
1541                                                    &p->pattern[i], len);
1542                 if (ret)
1543                         goto err;
1544
1545                 i = j;
1546         }
1547
1548         filter->action = FILTER_SIGNAL;
1549
1550         *f = filter;
1551         return 0;
1552
1553 err:
1554         wl1271_rx_filter_free(filter);
1555         *f = NULL;
1556
1557         return ret;
1558 }
1559
1560 static int wl1271_configure_wowlan(struct wl1271 *wl,
1561                                    struct cfg80211_wowlan *wow)
1562 {
1563         int i, ret;
1564
1565         if (!wow || wow->any || !wow->n_patterns) {
1566                 ret = wl1271_acx_default_rx_filter_enable(wl, 0,
1567                                                           FILTER_SIGNAL);
1568                 if (ret)
1569                         goto out;
1570
1571                 ret = wl1271_rx_filter_clear_all(wl);
1572                 if (ret)
1573                         goto out;
1574
1575                 return 0;
1576         }
1577
1578         if (WARN_ON(wow->n_patterns > WL1271_MAX_RX_FILTERS))
1579                 return -EINVAL;
1580
1581         /* Validate all incoming patterns before clearing current FW state */
1582         for (i = 0; i < wow->n_patterns; i++) {
1583                 ret = wl1271_validate_wowlan_pattern(&wow->patterns[i]);
1584                 if (ret) {
1585                         wl1271_warning("Bad wowlan pattern %d", i);
1586                         return ret;
1587                 }
1588         }
1589
1590         ret = wl1271_acx_default_rx_filter_enable(wl, 0, FILTER_SIGNAL);
1591         if (ret)
1592                 goto out;
1593
1594         ret = wl1271_rx_filter_clear_all(wl);
1595         if (ret)
1596                 goto out;
1597
1598         /* Translate WoWLAN patterns into filters */
1599         for (i = 0; i < wow->n_patterns; i++) {
1600                 struct cfg80211_pkt_pattern *p;
1601                 struct wl12xx_rx_filter *filter = NULL;
1602
1603                 p = &wow->patterns[i];
1604
1605                 ret = wl1271_convert_wowlan_pattern_to_rx_filter(p, &filter);
1606                 if (ret) {
1607                         wl1271_warning("Failed to create an RX filter from "
1608                                        "wowlan pattern %d", i);
1609                         goto out;
1610                 }
1611
1612                 ret = wl1271_rx_filter_enable(wl, i, 1, filter);
1613
1614                 wl1271_rx_filter_free(filter);
1615                 if (ret)
1616                         goto out;
1617         }
1618
1619         ret = wl1271_acx_default_rx_filter_enable(wl, 1, FILTER_DROP);
1620
1621 out:
1622         return ret;
1623 }
1624
1625 static int wl1271_configure_suspend_sta(struct wl1271 *wl,
1626                                         struct wl12xx_vif *wlvif,
1627                                         struct cfg80211_wowlan *wow)
1628 {
1629         int ret = 0;
1630
1631         if (!test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags))
1632                 goto out;
1633
1634         ret = wl1271_configure_wowlan(wl, wow);
1635         if (ret < 0)
1636                 goto out;
1637
1638         if ((wl->conf.conn.suspend_wake_up_event ==
1639              wl->conf.conn.wake_up_event) &&
1640             (wl->conf.conn.suspend_listen_interval ==
1641              wl->conf.conn.listen_interval))
1642                 goto out;
1643
1644         ret = wl1271_acx_wake_up_conditions(wl, wlvif,
1645                                     wl->conf.conn.suspend_wake_up_event,
1646                                     wl->conf.conn.suspend_listen_interval);
1647
1648         if (ret < 0)
1649                 wl1271_error("suspend: set wake up conditions failed: %d", ret);
1650 out:
1651         return ret;
1652
1653 }
1654
1655 static int wl1271_configure_suspend_ap(struct wl1271 *wl,
1656                                         struct wl12xx_vif *wlvif,
1657                                         struct cfg80211_wowlan *wow)
1658 {
1659         int ret = 0;
1660
1661         if (!test_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags))
1662                 goto out;
1663
1664         ret = wl1271_acx_beacon_filter_opt(wl, wlvif, true);
1665         if (ret < 0)
1666                 goto out;
1667
1668         ret = wl1271_configure_wowlan(wl, wow);
1669         if (ret < 0)
1670                 goto out;
1671
1672 out:
1673         return ret;
1674
1675 }
1676
1677 static int wl1271_configure_suspend(struct wl1271 *wl,
1678                                     struct wl12xx_vif *wlvif,
1679                                     struct cfg80211_wowlan *wow)
1680 {
1681         if (wlvif->bss_type == BSS_TYPE_STA_BSS)
1682                 return wl1271_configure_suspend_sta(wl, wlvif, wow);
1683         if (wlvif->bss_type == BSS_TYPE_AP_BSS)
1684                 return wl1271_configure_suspend_ap(wl, wlvif, wow);
1685         return 0;
1686 }
1687
1688 static void wl1271_configure_resume(struct wl1271 *wl, struct wl12xx_vif *wlvif)
1689 {
1690         int ret = 0;
1691         bool is_ap = wlvif->bss_type == BSS_TYPE_AP_BSS;
1692         bool is_sta = wlvif->bss_type == BSS_TYPE_STA_BSS;
1693
1694         if ((!is_ap) && (!is_sta))
1695                 return;
1696
1697         if ((is_sta && !test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags)) ||
1698             (is_ap && !test_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags)))
1699                 return;
1700
1701         wl1271_configure_wowlan(wl, NULL);
1702
1703         if (is_sta) {
1704                 if ((wl->conf.conn.suspend_wake_up_event ==
1705                      wl->conf.conn.wake_up_event) &&
1706                     (wl->conf.conn.suspend_listen_interval ==
1707                      wl->conf.conn.listen_interval))
1708                         return;
1709
1710                 ret = wl1271_acx_wake_up_conditions(wl, wlvif,
1711                                     wl->conf.conn.wake_up_event,
1712                                     wl->conf.conn.listen_interval);
1713
1714                 if (ret < 0)
1715                         wl1271_error("resume: wake up conditions failed: %d",
1716                                      ret);
1717
1718         } else if (is_ap) {
1719                 ret = wl1271_acx_beacon_filter_opt(wl, wlvif, false);
1720         }
1721 }
1722
1723 static int __maybe_unused wl1271_op_suspend(struct ieee80211_hw *hw,
1724                                             struct cfg80211_wowlan *wow)
1725 {
1726         struct wl1271 *wl = hw->priv;
1727         struct wl12xx_vif *wlvif;
1728         unsigned long flags;
1729         int ret;
1730
1731         wl1271_debug(DEBUG_MAC80211, "mac80211 suspend wow=%d", !!wow);
1732         WARN_ON(!wow);
1733
1734         /* we want to perform the recovery before suspending */
1735         if (test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags)) {
1736                 wl1271_warning("postponing suspend to perform recovery");
1737                 return -EBUSY;
1738         }
1739
1740         wl1271_tx_flush(wl);
1741
1742         mutex_lock(&wl->mutex);
1743
1744         ret = pm_runtime_get_sync(wl->dev);
1745         if (ret < 0) {
1746                 pm_runtime_put_noidle(wl->dev);
1747                 mutex_unlock(&wl->mutex);
1748                 return ret;
1749         }
1750
1751         wl->wow_enabled = true;
1752         wl12xx_for_each_wlvif(wl, wlvif) {
1753                 if (wlcore_is_p2p_mgmt(wlvif))
1754                         continue;
1755
1756                 ret = wl1271_configure_suspend(wl, wlvif, wow);
1757                 if (ret < 0) {
1758                         goto out_sleep;
1759                 }
1760         }
1761
1762         /* disable fast link flow control notifications from FW */
1763         ret = wlcore_hw_interrupt_notify(wl, false);
1764         if (ret < 0)
1765                 goto out_sleep;
1766
1767         /* if filtering is enabled, configure the FW to drop all RX BA frames */
1768         ret = wlcore_hw_rx_ba_filter(wl,
1769                                      !!wl->conf.conn.suspend_rx_ba_activity);
1770         if (ret < 0)
1771                 goto out_sleep;
1772
1773 out_sleep:
1774         pm_runtime_put_noidle(wl->dev);
1775         mutex_unlock(&wl->mutex);
1776
1777         if (ret < 0) {
1778                 wl1271_warning("couldn't prepare device to suspend");
1779                 return ret;
1780         }
1781
1782         /* flush any remaining work */
1783         wl1271_debug(DEBUG_MAC80211, "flushing remaining works");
1784
1785         flush_work(&wl->tx_work);
1786
1787         /*
1788          * Cancel the watchdog even if above tx_flush failed. We will detect
1789          * it on resume anyway.
1790          */
1791         cancel_delayed_work(&wl->tx_watchdog_work);
1792
1793         /*
1794          * set suspended flag to avoid triggering a new threaded_irq
1795          * work.
1796          */
1797         spin_lock_irqsave(&wl->wl_lock, flags);
1798         set_bit(WL1271_FLAG_SUSPENDED, &wl->flags);
1799         spin_unlock_irqrestore(&wl->wl_lock, flags);
1800
1801         return pm_runtime_force_suspend(wl->dev);
1802 }
1803
1804 static int __maybe_unused wl1271_op_resume(struct ieee80211_hw *hw)
1805 {
1806         struct wl1271 *wl = hw->priv;
1807         struct wl12xx_vif *wlvif;
1808         unsigned long flags;
1809         bool run_irq_work = false, pending_recovery;
1810         int ret;
1811
1812         wl1271_debug(DEBUG_MAC80211, "mac80211 resume wow=%d",
1813                      wl->wow_enabled);
1814         WARN_ON(!wl->wow_enabled);
1815
1816         ret = pm_runtime_force_resume(wl->dev);
1817         if (ret < 0) {
1818                 wl1271_error("ELP wakeup failure!");
1819                 goto out_sleep;
1820         }
1821
1822         /*
1823          * re-enable irq_work enqueuing, and call irq_work directly if
1824          * there is a pending work.
1825          */
1826         spin_lock_irqsave(&wl->wl_lock, flags);
1827         clear_bit(WL1271_FLAG_SUSPENDED, &wl->flags);
1828         if (test_and_clear_bit(WL1271_FLAG_PENDING_WORK, &wl->flags))
1829                 run_irq_work = true;
1830         spin_unlock_irqrestore(&wl->wl_lock, flags);
1831
1832         mutex_lock(&wl->mutex);
1833
1834         /* test the recovery flag before calling any SDIO functions */
1835         pending_recovery = test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS,
1836                                     &wl->flags);
1837
1838         if (run_irq_work) {
1839                 wl1271_debug(DEBUG_MAC80211,
1840                              "run postponed irq_work directly");
1841
1842                 /* don't talk to the HW if recovery is pending */
1843                 if (!pending_recovery) {
1844                         ret = wlcore_irq_locked(wl);
1845                         if (ret)
1846                                 wl12xx_queue_recovery_work(wl);
1847                 }
1848
1849                 wlcore_enable_interrupts(wl);
1850         }
1851
1852         if (pending_recovery) {
1853                 wl1271_warning("queuing forgotten recovery on resume");
1854                 ieee80211_queue_work(wl->hw, &wl->recovery_work);
1855                 goto out_sleep;
1856         }
1857
1858         ret = pm_runtime_get_sync(wl->dev);
1859         if (ret < 0) {
1860                 pm_runtime_put_noidle(wl->dev);
1861                 goto out;
1862         }
1863
1864         wl12xx_for_each_wlvif(wl, wlvif) {
1865                 if (wlcore_is_p2p_mgmt(wlvif))
1866                         continue;
1867
1868                 wl1271_configure_resume(wl, wlvif);
1869         }
1870
1871         ret = wlcore_hw_interrupt_notify(wl, true);
1872         if (ret < 0)
1873                 goto out_sleep;
1874
1875         /* if filtering is enabled, configure the FW to drop all RX BA frames */
1876         ret = wlcore_hw_rx_ba_filter(wl, false);
1877         if (ret < 0)
1878                 goto out_sleep;
1879
1880 out_sleep:
1881         pm_runtime_mark_last_busy(wl->dev);
1882         pm_runtime_put_autosuspend(wl->dev);
1883
1884 out:
1885         wl->wow_enabled = false;
1886
1887         /*
1888          * Set a flag to re-init the watchdog on the first Tx after resume.
1889          * That way we avoid possible conditions where Tx-complete interrupts
1890          * fail to arrive and we perform a spurious recovery.
1891          */
1892         set_bit(WL1271_FLAG_REINIT_TX_WDOG, &wl->flags);
1893         mutex_unlock(&wl->mutex);
1894
1895         return 0;
1896 }
1897
1898 static int wl1271_op_start(struct ieee80211_hw *hw)
1899 {
1900         wl1271_debug(DEBUG_MAC80211, "mac80211 start");
1901
1902         /*
1903          * We have to delay the booting of the hardware because
1904          * we need to know the local MAC address before downloading and
1905          * initializing the firmware. The MAC address cannot be changed
1906          * after boot, and without the proper MAC address, the firmware
1907          * will not function properly.
1908          *
1909          * The MAC address is first known when the corresponding interface
1910          * is added. That is where we will initialize the hardware.
1911          */
1912
1913         return 0;
1914 }
1915
1916 static void wlcore_op_stop_locked(struct wl1271 *wl)
1917 {
1918         int i;
1919
1920         if (wl->state == WLCORE_STATE_OFF) {
1921                 if (test_and_clear_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS,
1922                                         &wl->flags))
1923                         wlcore_enable_interrupts(wl);
1924
1925                 return;
1926         }
1927
1928         /*
1929          * this must be before the cancel_work calls below, so that the work
1930          * functions don't perform further work.
1931          */
1932         wl->state = WLCORE_STATE_OFF;
1933
1934         /*
1935          * Use the nosync variant to disable interrupts, so the mutex could be
1936          * held while doing so without deadlocking.
1937          */
1938         wlcore_disable_interrupts_nosync(wl);
1939
1940         mutex_unlock(&wl->mutex);
1941
1942         wlcore_synchronize_interrupts(wl);
1943         if (!test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags))
1944                 cancel_work_sync(&wl->recovery_work);
1945         wl1271_flush_deferred_work(wl);
1946         cancel_delayed_work_sync(&wl->scan_complete_work);
1947         cancel_work_sync(&wl->netstack_work);
1948         cancel_work_sync(&wl->tx_work);
1949         cancel_delayed_work_sync(&wl->tx_watchdog_work);
1950
1951         /* let's notify MAC80211 about the remaining pending TX frames */
1952         mutex_lock(&wl->mutex);
1953         wl12xx_tx_reset(wl);
1954
1955         wl1271_power_off(wl);
1956         /*
1957          * In case a recovery was scheduled, interrupts were disabled to avoid
1958          * an interrupt storm. Now that the power is down, it is safe to
1959          * re-enable interrupts to balance the disable depth
1960          */
1961         if (test_and_clear_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags))
1962                 wlcore_enable_interrupts(wl);
1963
1964         wl->band = NL80211_BAND_2GHZ;
1965
1966         wl->rx_counter = 0;
1967         wl->power_level = WL1271_DEFAULT_POWER_LEVEL;
1968         wl->channel_type = NL80211_CHAN_NO_HT;
1969         wl->tx_blocks_available = 0;
1970         wl->tx_allocated_blocks = 0;
1971         wl->tx_results_count = 0;
1972         wl->tx_packets_count = 0;
1973         wl->time_offset = 0;
1974         wl->ap_fw_ps_map = 0;
1975         wl->ap_ps_map = 0;
1976         wl->sleep_auth = WL1271_PSM_ILLEGAL;
1977         memset(wl->roles_map, 0, sizeof(wl->roles_map));
1978         memset(wl->links_map, 0, sizeof(wl->links_map));
1979         memset(wl->roc_map, 0, sizeof(wl->roc_map));
1980         memset(wl->session_ids, 0, sizeof(wl->session_ids));
1981         memset(wl->rx_filter_enabled, 0, sizeof(wl->rx_filter_enabled));
1982         wl->active_sta_count = 0;
1983         wl->active_link_count = 0;
1984
1985         /* The system link is always allocated */
1986         wl->links[WL12XX_SYSTEM_HLID].allocated_pkts = 0;
1987         wl->links[WL12XX_SYSTEM_HLID].prev_freed_pkts = 0;
1988         __set_bit(WL12XX_SYSTEM_HLID, wl->links_map);
1989
1990         /*
1991          * this is performed after the cancel_work calls and the associated
1992          * mutex_lock, so that wl1271_op_add_interface does not accidentally
1993          * get executed before all these vars have been reset.
1994          */
1995         wl->flags = 0;
1996
1997         wl->tx_blocks_freed = 0;
1998
1999         for (i = 0; i < NUM_TX_QUEUES; i++) {
2000                 wl->tx_pkts_freed[i] = 0;
2001                 wl->tx_allocated_pkts[i] = 0;
2002         }
2003
2004         wl1271_debugfs_reset(wl);
2005
2006         kfree(wl->raw_fw_status);
2007         wl->raw_fw_status = NULL;
2008         kfree(wl->fw_status);
2009         wl->fw_status = NULL;
2010         kfree(wl->tx_res_if);
2011         wl->tx_res_if = NULL;
2012         kfree(wl->target_mem_map);
2013         wl->target_mem_map = NULL;
2014
2015         /*
2016          * FW channels must be re-calibrated after recovery,
2017          * save current Reg-Domain channel configuration and clear it.
2018          */
2019         memcpy(wl->reg_ch_conf_pending, wl->reg_ch_conf_last,
2020                sizeof(wl->reg_ch_conf_pending));
2021         memset(wl->reg_ch_conf_last, 0, sizeof(wl->reg_ch_conf_last));
2022 }
2023
2024 static void wlcore_op_stop(struct ieee80211_hw *hw)
2025 {
2026         struct wl1271 *wl = hw->priv;
2027
2028         wl1271_debug(DEBUG_MAC80211, "mac80211 stop");
2029
2030         mutex_lock(&wl->mutex);
2031
2032         wlcore_op_stop_locked(wl);
2033
2034         mutex_unlock(&wl->mutex);
2035 }
2036
2037 static void wlcore_channel_switch_work(struct work_struct *work)
2038 {
2039         struct delayed_work *dwork;
2040         struct wl1271 *wl;
2041         struct ieee80211_vif *vif;
2042         struct wl12xx_vif *wlvif;
2043         int ret;
2044
2045         dwork = to_delayed_work(work);
2046         wlvif = container_of(dwork, struct wl12xx_vif, channel_switch_work);
2047         wl = wlvif->wl;
2048
2049         wl1271_info("channel switch failed (role_id: %d).", wlvif->role_id);
2050
2051         mutex_lock(&wl->mutex);
2052
2053         if (unlikely(wl->state != WLCORE_STATE_ON))
2054                 goto out;
2055
2056         /* check the channel switch is still ongoing */
2057         if (!test_and_clear_bit(WLVIF_FLAG_CS_PROGRESS, &wlvif->flags))
2058                 goto out;
2059
2060         vif = wl12xx_wlvif_to_vif(wlvif);
2061         ieee80211_chswitch_done(vif, false);
2062
2063         ret = pm_runtime_get_sync(wl->dev);
2064         if (ret < 0) {
2065                 pm_runtime_put_noidle(wl->dev);
2066                 goto out;
2067         }
2068
2069         wl12xx_cmd_stop_channel_switch(wl, wlvif);
2070
2071         pm_runtime_mark_last_busy(wl->dev);
2072         pm_runtime_put_autosuspend(wl->dev);
2073 out:
2074         mutex_unlock(&wl->mutex);
2075 }
2076
2077 static void wlcore_connection_loss_work(struct work_struct *work)
2078 {
2079         struct delayed_work *dwork;
2080         struct wl1271 *wl;
2081         struct ieee80211_vif *vif;
2082         struct wl12xx_vif *wlvif;
2083
2084         dwork = to_delayed_work(work);
2085         wlvif = container_of(dwork, struct wl12xx_vif, connection_loss_work);
2086         wl = wlvif->wl;
2087
2088         wl1271_info("Connection loss work (role_id: %d).", wlvif->role_id);
2089
2090         mutex_lock(&wl->mutex);
2091
2092         if (unlikely(wl->state != WLCORE_STATE_ON))
2093                 goto out;
2094
2095         /* Call mac80211 connection loss */
2096         if (!test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags))
2097                 goto out;
2098
2099         vif = wl12xx_wlvif_to_vif(wlvif);
2100         ieee80211_connection_loss(vif);
2101 out:
2102         mutex_unlock(&wl->mutex);
2103 }
2104
2105 static void wlcore_pending_auth_complete_work(struct work_struct *work)
2106 {
2107         struct delayed_work *dwork;
2108         struct wl1271 *wl;
2109         struct wl12xx_vif *wlvif;
2110         unsigned long time_spare;
2111         int ret;
2112
2113         dwork = to_delayed_work(work);
2114         wlvif = container_of(dwork, struct wl12xx_vif,
2115                              pending_auth_complete_work);
2116         wl = wlvif->wl;
2117
2118         mutex_lock(&wl->mutex);
2119
2120         if (unlikely(wl->state != WLCORE_STATE_ON))
2121                 goto out;
2122
2123         /*
2124          * Make sure a second really passed since the last auth reply. Maybe
2125          * a second auth reply arrived while we were stuck on the mutex.
2126          * Check for a little less than the timeout to protect from scheduler
2127          * irregularities.
2128          */
2129         time_spare = jiffies +
2130                         msecs_to_jiffies(WLCORE_PEND_AUTH_ROC_TIMEOUT - 50);
2131         if (!time_after(time_spare, wlvif->pending_auth_reply_time))
2132                 goto out;
2133
2134         ret = pm_runtime_get_sync(wl->dev);
2135         if (ret < 0) {
2136                 pm_runtime_put_noidle(wl->dev);
2137                 goto out;
2138         }
2139
2140         /* cancel the ROC if active */
2141         wlcore_update_inconn_sta(wl, wlvif, NULL, false);
2142
2143         pm_runtime_mark_last_busy(wl->dev);
2144         pm_runtime_put_autosuspend(wl->dev);
2145 out:
2146         mutex_unlock(&wl->mutex);
2147 }
2148
2149 static int wl12xx_allocate_rate_policy(struct wl1271 *wl, u8 *idx)
2150 {
2151         u8 policy = find_first_zero_bit(wl->rate_policies_map,
2152                                         WL12XX_MAX_RATE_POLICIES);
2153         if (policy >= WL12XX_MAX_RATE_POLICIES)
2154                 return -EBUSY;
2155
2156         __set_bit(policy, wl->rate_policies_map);
2157         *idx = policy;
2158         return 0;
2159 }
2160
2161 static void wl12xx_free_rate_policy(struct wl1271 *wl, u8 *idx)
2162 {
2163         if (WARN_ON(*idx >= WL12XX_MAX_RATE_POLICIES))
2164                 return;
2165
2166         __clear_bit(*idx, wl->rate_policies_map);
2167         *idx = WL12XX_MAX_RATE_POLICIES;
2168 }
2169
2170 static int wlcore_allocate_klv_template(struct wl1271 *wl, u8 *idx)
2171 {
2172         u8 policy = find_first_zero_bit(wl->klv_templates_map,
2173                                         WLCORE_MAX_KLV_TEMPLATES);
2174         if (policy >= WLCORE_MAX_KLV_TEMPLATES)
2175                 return -EBUSY;
2176
2177         __set_bit(policy, wl->klv_templates_map);
2178         *idx = policy;
2179         return 0;
2180 }
2181
2182 static void wlcore_free_klv_template(struct wl1271 *wl, u8 *idx)
2183 {
2184         if (WARN_ON(*idx >= WLCORE_MAX_KLV_TEMPLATES))
2185                 return;
2186
2187         __clear_bit(*idx, wl->klv_templates_map);
2188         *idx = WLCORE_MAX_KLV_TEMPLATES;
2189 }
2190
2191 static u8 wl12xx_get_role_type(struct wl1271 *wl, struct wl12xx_vif *wlvif)
2192 {
2193         struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
2194
2195         switch (wlvif->bss_type) {
2196         case BSS_TYPE_AP_BSS:
2197                 if (wlvif->p2p)
2198                         return WL1271_ROLE_P2P_GO;
2199                 else if (ieee80211_vif_is_mesh(vif))
2200                         return WL1271_ROLE_MESH_POINT;
2201                 else
2202                         return WL1271_ROLE_AP;
2203
2204         case BSS_TYPE_STA_BSS:
2205                 if (wlvif->p2p)
2206                         return WL1271_ROLE_P2P_CL;
2207                 else
2208                         return WL1271_ROLE_STA;
2209
2210         case BSS_TYPE_IBSS:
2211                 return WL1271_ROLE_IBSS;
2212
2213         default:
2214                 wl1271_error("invalid bss_type: %d", wlvif->bss_type);
2215         }
2216         return WL12XX_INVALID_ROLE_TYPE;
2217 }
2218
2219 static int wl12xx_init_vif_data(struct wl1271 *wl, struct ieee80211_vif *vif)
2220 {
2221         struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
2222         int i;
2223
2224         /* clear everything but the persistent data */
2225         memset(wlvif, 0, offsetof(struct wl12xx_vif, persistent));
2226
2227         switch (ieee80211_vif_type_p2p(vif)) {
2228         case NL80211_IFTYPE_P2P_CLIENT:
2229                 wlvif->p2p = 1;
2230                 fallthrough;
2231         case NL80211_IFTYPE_STATION:
2232         case NL80211_IFTYPE_P2P_DEVICE:
2233                 wlvif->bss_type = BSS_TYPE_STA_BSS;
2234                 break;
2235         case NL80211_IFTYPE_ADHOC:
2236                 wlvif->bss_type = BSS_TYPE_IBSS;
2237                 break;
2238         case NL80211_IFTYPE_P2P_GO:
2239                 wlvif->p2p = 1;
2240                 fallthrough;
2241         case NL80211_IFTYPE_AP:
2242         case NL80211_IFTYPE_MESH_POINT:
2243                 wlvif->bss_type = BSS_TYPE_AP_BSS;
2244                 break;
2245         default:
2246                 wlvif->bss_type = MAX_BSS_TYPE;
2247                 return -EOPNOTSUPP;
2248         }
2249
2250         wlvif->role_id = WL12XX_INVALID_ROLE_ID;
2251         wlvif->dev_role_id = WL12XX_INVALID_ROLE_ID;
2252         wlvif->dev_hlid = WL12XX_INVALID_LINK_ID;
2253
2254         if (wlvif->bss_type == BSS_TYPE_STA_BSS ||
2255             wlvif->bss_type == BSS_TYPE_IBSS) {
2256                 /* init sta/ibss data */
2257                 wlvif->sta.hlid = WL12XX_INVALID_LINK_ID;
2258                 wl12xx_allocate_rate_policy(wl, &wlvif->sta.basic_rate_idx);
2259                 wl12xx_allocate_rate_policy(wl, &wlvif->sta.ap_rate_idx);
2260                 wl12xx_allocate_rate_policy(wl, &wlvif->sta.p2p_rate_idx);
2261                 wlcore_allocate_klv_template(wl, &wlvif->sta.klv_template_id);
2262                 wlvif->basic_rate_set = CONF_TX_RATE_MASK_BASIC;
2263                 wlvif->basic_rate = CONF_TX_RATE_MASK_BASIC;
2264                 wlvif->rate_set = CONF_TX_RATE_MASK_BASIC;
2265         } else {
2266                 /* init ap data */
2267                 wlvif->ap.bcast_hlid = WL12XX_INVALID_LINK_ID;
2268                 wlvif->ap.global_hlid = WL12XX_INVALID_LINK_ID;
2269                 wl12xx_allocate_rate_policy(wl, &wlvif->ap.mgmt_rate_idx);
2270                 wl12xx_allocate_rate_policy(wl, &wlvif->ap.bcast_rate_idx);
2271                 for (i = 0; i < CONF_TX_MAX_AC_COUNT; i++)
2272                         wl12xx_allocate_rate_policy(wl,
2273                                                 &wlvif->ap.ucast_rate_idx[i]);
2274                 wlvif->basic_rate_set = CONF_TX_ENABLED_RATES;
2275                 /*
2276                  * TODO: check if basic_rate shouldn't be
2277                  * wl1271_tx_min_rate_get(wl, wlvif->basic_rate_set);
2278                  * instead (the same thing for STA above).
2279                 */
2280                 wlvif->basic_rate = CONF_TX_ENABLED_RATES;
2281                 /* TODO: this seems to be used only for STA, check it */
2282                 wlvif->rate_set = CONF_TX_ENABLED_RATES;
2283         }
2284
2285         wlvif->bitrate_masks[NL80211_BAND_2GHZ] = wl->conf.tx.basic_rate;
2286         wlvif->bitrate_masks[NL80211_BAND_5GHZ] = wl->conf.tx.basic_rate_5;
2287         wlvif->beacon_int = WL1271_DEFAULT_BEACON_INT;
2288
2289         /*
2290          * mac80211 configures some values globally, while we treat them
2291          * per-interface. thus, on init, we have to copy them from wl
2292          */
2293         wlvif->band = wl->band;
2294         wlvif->channel = wl->channel;
2295         wlvif->power_level = wl->power_level;
2296         wlvif->channel_type = wl->channel_type;
2297
2298         INIT_WORK(&wlvif->rx_streaming_enable_work,
2299                   wl1271_rx_streaming_enable_work);
2300         INIT_WORK(&wlvif->rx_streaming_disable_work,
2301                   wl1271_rx_streaming_disable_work);
2302         INIT_WORK(&wlvif->rc_update_work, wlcore_rc_update_work);
2303         INIT_DELAYED_WORK(&wlvif->channel_switch_work,
2304                           wlcore_channel_switch_work);
2305         INIT_DELAYED_WORK(&wlvif->connection_loss_work,
2306                           wlcore_connection_loss_work);
2307         INIT_DELAYED_WORK(&wlvif->pending_auth_complete_work,
2308                           wlcore_pending_auth_complete_work);
2309         INIT_LIST_HEAD(&wlvif->list);
2310
2311         timer_setup(&wlvif->rx_streaming_timer, wl1271_rx_streaming_timer, 0);
2312         return 0;
2313 }
2314
2315 static int wl12xx_init_fw(struct wl1271 *wl)
2316 {
2317         int retries = WL1271_BOOT_RETRIES;
2318         bool booted = false;
2319         struct wiphy *wiphy = wl->hw->wiphy;
2320         int ret;
2321
2322         while (retries) {
2323                 retries--;
2324                 ret = wl12xx_chip_wakeup(wl, false);
2325                 if (ret < 0)
2326                         goto power_off;
2327
2328                 ret = wl->ops->boot(wl);
2329                 if (ret < 0)
2330                         goto power_off;
2331
2332                 ret = wl1271_hw_init(wl);
2333                 if (ret < 0)
2334                         goto irq_disable;
2335
2336                 booted = true;
2337                 break;
2338
2339 irq_disable:
2340                 mutex_unlock(&wl->mutex);
2341                 /* Unlocking the mutex in the middle of handling is
2342                    inherently unsafe. In this case we deem it safe to do,
2343                    because we need to let any possibly pending IRQ out of
2344                    the system (and while we are WLCORE_STATE_OFF the IRQ
2345                    work function will not do anything.) Also, any other
2346                    possible concurrent operations will fail due to the
2347                    current state, hence the wl1271 struct should be safe. */
2348                 wlcore_disable_interrupts(wl);
2349                 wl1271_flush_deferred_work(wl);
2350                 cancel_work_sync(&wl->netstack_work);
2351                 mutex_lock(&wl->mutex);
2352 power_off:
2353                 wl1271_power_off(wl);
2354         }
2355
2356         if (!booted) {
2357                 wl1271_error("firmware boot failed despite %d retries",
2358                              WL1271_BOOT_RETRIES);
2359                 goto out;
2360         }
2361
2362         wl1271_info("firmware booted (%s)", wl->chip.fw_ver_str);
2363
2364         /* update hw/fw version info in wiphy struct */
2365         wiphy->hw_version = wl->chip.id;
2366         strncpy(wiphy->fw_version, wl->chip.fw_ver_str,
2367                 sizeof(wiphy->fw_version));
2368
2369         /*
2370          * Now we know if 11a is supported (info from the NVS), so disable
2371          * 11a channels if not supported
2372          */
2373         if (!wl->enable_11a)
2374                 wiphy->bands[NL80211_BAND_5GHZ]->n_channels = 0;
2375
2376         wl1271_debug(DEBUG_MAC80211, "11a is %ssupported",
2377                      wl->enable_11a ? "" : "not ");
2378
2379         wl->state = WLCORE_STATE_ON;
2380 out:
2381         return ret;
2382 }
2383
2384 static bool wl12xx_dev_role_started(struct wl12xx_vif *wlvif)
2385 {
2386         return wlvif->dev_hlid != WL12XX_INVALID_LINK_ID;
2387 }
2388
2389 /*
2390  * Check whether a fw switch (i.e. moving from one loaded
2391  * fw to another) is needed. This function is also responsible
2392  * for updating wl->last_vif_count, so it must be called before
2393  * loading a non-plt fw (so the correct fw (single-role/multi-role)
2394  * will be used).
2395  */
2396 static bool wl12xx_need_fw_change(struct wl1271 *wl,
2397                                   struct vif_counter_data vif_counter_data,
2398                                   bool add)
2399 {
2400         enum wl12xx_fw_type current_fw = wl->fw_type;
2401         u8 vif_count = vif_counter_data.counter;
2402
2403         if (test_bit(WL1271_FLAG_VIF_CHANGE_IN_PROGRESS, &wl->flags))
2404                 return false;
2405
2406         /* increase the vif count if this is a new vif */
2407         if (add && !vif_counter_data.cur_vif_running)
2408                 vif_count++;
2409
2410         wl->last_vif_count = vif_count;
2411
2412         /* no need for fw change if the device is OFF */
2413         if (wl->state == WLCORE_STATE_OFF)
2414                 return false;
2415
2416         /* no need for fw change if a single fw is used */
2417         if (!wl->mr_fw_name)
2418                 return false;
2419
2420         if (vif_count > 1 && current_fw == WL12XX_FW_TYPE_NORMAL)
2421                 return true;
2422         if (vif_count <= 1 && current_fw == WL12XX_FW_TYPE_MULTI)
2423                 return true;
2424
2425         return false;
2426 }
2427
2428 /*
2429  * Enter "forced psm". Make sure the sta is in psm against the ap,
2430  * to make the fw switch a bit more disconnection-persistent.
2431  */
2432 static void wl12xx_force_active_psm(struct wl1271 *wl)
2433 {
2434         struct wl12xx_vif *wlvif;
2435
2436         wl12xx_for_each_wlvif_sta(wl, wlvif) {
2437                 wl1271_ps_set_mode(wl, wlvif, STATION_POWER_SAVE_MODE);
2438         }
2439 }
2440
2441 struct wlcore_hw_queue_iter_data {
2442         unsigned long hw_queue_map[BITS_TO_LONGS(WLCORE_NUM_MAC_ADDRESSES)];
2443         /* current vif */
2444         struct ieee80211_vif *vif;
2445         /* is the current vif among those iterated */
2446         bool cur_running;
2447 };
2448
2449 static void wlcore_hw_queue_iter(void *data, u8 *mac,
2450                                  struct ieee80211_vif *vif)
2451 {
2452         struct wlcore_hw_queue_iter_data *iter_data = data;
2453
2454         if (vif->type == NL80211_IFTYPE_P2P_DEVICE ||
2455             WARN_ON_ONCE(vif->hw_queue[0] == IEEE80211_INVAL_HW_QUEUE))
2456                 return;
2457
2458         if (iter_data->cur_running || vif == iter_data->vif) {
2459                 iter_data->cur_running = true;
2460                 return;
2461         }
2462
2463         __set_bit(vif->hw_queue[0] / NUM_TX_QUEUES, iter_data->hw_queue_map);
2464 }
2465
2466 static int wlcore_allocate_hw_queue_base(struct wl1271 *wl,
2467                                          struct wl12xx_vif *wlvif)
2468 {
2469         struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
2470         struct wlcore_hw_queue_iter_data iter_data = {};
2471         int i, q_base;
2472
2473         if (vif->type == NL80211_IFTYPE_P2P_DEVICE) {
2474                 vif->cab_queue = IEEE80211_INVAL_HW_QUEUE;
2475                 return 0;
2476         }
2477
2478         iter_data.vif = vif;
2479
2480         /* mark all bits taken by active interfaces */
2481         ieee80211_iterate_active_interfaces_atomic(wl->hw,
2482                                         IEEE80211_IFACE_ITER_RESUME_ALL,
2483                                         wlcore_hw_queue_iter, &iter_data);
2484
2485         /* the current vif is already running in mac80211 (resume/recovery) */
2486         if (iter_data.cur_running) {
2487                 wlvif->hw_queue_base = vif->hw_queue[0];
2488                 wl1271_debug(DEBUG_MAC80211,
2489                              "using pre-allocated hw queue base %d",
2490                              wlvif->hw_queue_base);
2491
2492                 /* interface type might have changed type */
2493                 goto adjust_cab_queue;
2494         }
2495
2496         q_base = find_first_zero_bit(iter_data.hw_queue_map,
2497                                      WLCORE_NUM_MAC_ADDRESSES);
2498         if (q_base >= WLCORE_NUM_MAC_ADDRESSES)
2499                 return -EBUSY;
2500
2501         wlvif->hw_queue_base = q_base * NUM_TX_QUEUES;
2502         wl1271_debug(DEBUG_MAC80211, "allocating hw queue base: %d",
2503                      wlvif->hw_queue_base);
2504
2505         for (i = 0; i < NUM_TX_QUEUES; i++) {
2506                 wl->queue_stop_reasons[wlvif->hw_queue_base + i] = 0;
2507                 /* register hw queues in mac80211 */
2508                 vif->hw_queue[i] = wlvif->hw_queue_base + i;
2509         }
2510
2511 adjust_cab_queue:
2512         /* the last places are reserved for cab queues per interface */
2513         if (wlvif->bss_type == BSS_TYPE_AP_BSS)
2514                 vif->cab_queue = NUM_TX_QUEUES * WLCORE_NUM_MAC_ADDRESSES +
2515                                  wlvif->hw_queue_base / NUM_TX_QUEUES;
2516         else
2517                 vif->cab_queue = IEEE80211_INVAL_HW_QUEUE;
2518
2519         return 0;
2520 }
2521
2522 static int wl1271_op_add_interface(struct ieee80211_hw *hw,
2523                                    struct ieee80211_vif *vif)
2524 {
2525         struct wl1271 *wl = hw->priv;
2526         struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
2527         struct vif_counter_data vif_count;
2528         int ret = 0;
2529         u8 role_type;
2530
2531         if (wl->plt) {
2532                 wl1271_error("Adding Interface not allowed while in PLT mode");
2533                 return -EBUSY;
2534         }
2535
2536         vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER |
2537                              IEEE80211_VIF_SUPPORTS_UAPSD |
2538                              IEEE80211_VIF_SUPPORTS_CQM_RSSI;
2539
2540         wl1271_debug(DEBUG_MAC80211, "mac80211 add interface type %d mac %pM",
2541                      ieee80211_vif_type_p2p(vif), vif->addr);
2542
2543         wl12xx_get_vif_count(hw, vif, &vif_count);
2544
2545         mutex_lock(&wl->mutex);
2546
2547         /*
2548          * in some very corner case HW recovery scenarios its possible to
2549          * get here before __wl1271_op_remove_interface is complete, so
2550          * opt out if that is the case.
2551          */
2552         if (test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags) ||
2553             test_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags)) {
2554                 ret = -EBUSY;
2555                 goto out;
2556         }
2557
2558
2559         ret = wl12xx_init_vif_data(wl, vif);
2560         if (ret < 0)
2561                 goto out;
2562
2563         wlvif->wl = wl;
2564         role_type = wl12xx_get_role_type(wl, wlvif);
2565         if (role_type == WL12XX_INVALID_ROLE_TYPE) {
2566                 ret = -EINVAL;
2567                 goto out;
2568         }
2569
2570         ret = wlcore_allocate_hw_queue_base(wl, wlvif);
2571         if (ret < 0)
2572                 goto out;
2573
2574         /*
2575          * TODO: after the nvs issue will be solved, move this block
2576          * to start(), and make sure here the driver is ON.
2577          */
2578         if (wl->state == WLCORE_STATE_OFF) {
2579                 /*
2580                  * we still need this in order to configure the fw
2581                  * while uploading the nvs
2582                  */
2583                 memcpy(wl->addresses[0].addr, vif->addr, ETH_ALEN);
2584
2585                 ret = wl12xx_init_fw(wl);
2586                 if (ret < 0)
2587                         goto out;
2588         }
2589
2590         /*
2591          * Call runtime PM only after possible wl12xx_init_fw() above
2592          * is done. Otherwise we do not have interrupts enabled.
2593          */
2594         ret = pm_runtime_get_sync(wl->dev);
2595         if (ret < 0) {
2596                 pm_runtime_put_noidle(wl->dev);
2597                 goto out_unlock;
2598         }
2599
2600         if (wl12xx_need_fw_change(wl, vif_count, true)) {
2601                 wl12xx_force_active_psm(wl);
2602                 set_bit(WL1271_FLAG_INTENDED_FW_RECOVERY, &wl->flags);
2603                 mutex_unlock(&wl->mutex);
2604                 wl1271_recovery_work(&wl->recovery_work);
2605                 return 0;
2606         }
2607
2608         if (!wlcore_is_p2p_mgmt(wlvif)) {
2609                 ret = wl12xx_cmd_role_enable(wl, vif->addr,
2610                                              role_type, &wlvif->role_id);
2611                 if (ret < 0)
2612                         goto out;
2613
2614                 ret = wl1271_init_vif_specific(wl, vif);
2615                 if (ret < 0)
2616                         goto out;
2617
2618         } else {
2619                 ret = wl12xx_cmd_role_enable(wl, vif->addr, WL1271_ROLE_DEVICE,
2620                                              &wlvif->dev_role_id);
2621                 if (ret < 0)
2622                         goto out;
2623
2624                 /* needed mainly for configuring rate policies */
2625                 ret = wl1271_sta_hw_init(wl, wlvif);
2626                 if (ret < 0)
2627                         goto out;
2628         }
2629
2630         list_add(&wlvif->list, &wl->wlvif_list);
2631         set_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags);
2632
2633         if (wlvif->bss_type == BSS_TYPE_AP_BSS)
2634                 wl->ap_count++;
2635         else
2636                 wl->sta_count++;
2637 out:
2638         pm_runtime_mark_last_busy(wl->dev);
2639         pm_runtime_put_autosuspend(wl->dev);
2640 out_unlock:
2641         mutex_unlock(&wl->mutex);
2642
2643         return ret;
2644 }
2645
2646 static void __wl1271_op_remove_interface(struct wl1271 *wl,
2647                                          struct ieee80211_vif *vif,
2648                                          bool reset_tx_queues)
2649 {
2650         struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
2651         int i, ret;
2652         bool is_ap = (wlvif->bss_type == BSS_TYPE_AP_BSS);
2653
2654         wl1271_debug(DEBUG_MAC80211, "mac80211 remove interface");
2655
2656         if (!test_and_clear_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags))
2657                 return;
2658
2659         /* because of hardware recovery, we may get here twice */
2660         if (wl->state == WLCORE_STATE_OFF)
2661                 return;
2662
2663         wl1271_info("down");
2664
2665         if (wl->scan.state != WL1271_SCAN_STATE_IDLE &&
2666             wl->scan_wlvif == wlvif) {
2667                 struct cfg80211_scan_info info = {
2668                         .aborted = true,
2669                 };
2670
2671                 /*
2672                  * Rearm the tx watchdog just before idling scan. This
2673                  * prevents just-finished scans from triggering the watchdog
2674                  */
2675                 wl12xx_rearm_tx_watchdog_locked(wl);
2676
2677                 wl->scan.state = WL1271_SCAN_STATE_IDLE;
2678                 memset(wl->scan.scanned_ch, 0, sizeof(wl->scan.scanned_ch));
2679                 wl->scan_wlvif = NULL;
2680                 wl->scan.req = NULL;
2681                 ieee80211_scan_completed(wl->hw, &info);
2682         }
2683
2684         if (wl->sched_vif == wlvif)
2685                 wl->sched_vif = NULL;
2686
2687         if (wl->roc_vif == vif) {
2688                 wl->roc_vif = NULL;
2689                 ieee80211_remain_on_channel_expired(wl->hw);
2690         }
2691
2692         if (!test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags)) {
2693                 /* disable active roles */
2694                 ret = pm_runtime_get_sync(wl->dev);
2695                 if (ret < 0) {
2696                         pm_runtime_put_noidle(wl->dev);
2697                         goto deinit;
2698                 }
2699
2700                 if (wlvif->bss_type == BSS_TYPE_STA_BSS ||
2701                     wlvif->bss_type == BSS_TYPE_IBSS) {
2702                         if (wl12xx_dev_role_started(wlvif))
2703                                 wl12xx_stop_dev(wl, wlvif);
2704                 }
2705
2706                 if (!wlcore_is_p2p_mgmt(wlvif)) {
2707                         ret = wl12xx_cmd_role_disable(wl, &wlvif->role_id);
2708                         if (ret < 0) {
2709                                 pm_runtime_put_noidle(wl->dev);
2710                                 goto deinit;
2711                         }
2712                 } else {
2713                         ret = wl12xx_cmd_role_disable(wl, &wlvif->dev_role_id);
2714                         if (ret < 0) {
2715                                 pm_runtime_put_noidle(wl->dev);
2716                                 goto deinit;
2717                         }
2718                 }
2719
2720                 pm_runtime_mark_last_busy(wl->dev);
2721                 pm_runtime_put_autosuspend(wl->dev);
2722         }
2723 deinit:
2724         wl12xx_tx_reset_wlvif(wl, wlvif);
2725
2726         /* clear all hlids (except system_hlid) */
2727         wlvif->dev_hlid = WL12XX_INVALID_LINK_ID;
2728
2729         if (wlvif->bss_type == BSS_TYPE_STA_BSS ||
2730             wlvif->bss_type == BSS_TYPE_IBSS) {
2731                 wlvif->sta.hlid = WL12XX_INVALID_LINK_ID;
2732                 wl12xx_free_rate_policy(wl, &wlvif->sta.basic_rate_idx);
2733                 wl12xx_free_rate_policy(wl, &wlvif->sta.ap_rate_idx);
2734                 wl12xx_free_rate_policy(wl, &wlvif->sta.p2p_rate_idx);
2735                 wlcore_free_klv_template(wl, &wlvif->sta.klv_template_id);
2736         } else {
2737                 wlvif->ap.bcast_hlid = WL12XX_INVALID_LINK_ID;
2738                 wlvif->ap.global_hlid = WL12XX_INVALID_LINK_ID;
2739                 wl12xx_free_rate_policy(wl, &wlvif->ap.mgmt_rate_idx);
2740                 wl12xx_free_rate_policy(wl, &wlvif->ap.bcast_rate_idx);
2741                 for (i = 0; i < CONF_TX_MAX_AC_COUNT; i++)
2742                         wl12xx_free_rate_policy(wl,
2743                                                 &wlvif->ap.ucast_rate_idx[i]);
2744                 wl1271_free_ap_keys(wl, wlvif);
2745         }
2746
2747         dev_kfree_skb(wlvif->probereq);
2748         wlvif->probereq = NULL;
2749         if (wl->last_wlvif == wlvif)
2750                 wl->last_wlvif = NULL;
2751         list_del(&wlvif->list);
2752         memset(wlvif->ap.sta_hlid_map, 0, sizeof(wlvif->ap.sta_hlid_map));
2753         wlvif->role_id = WL12XX_INVALID_ROLE_ID;
2754         wlvif->dev_role_id = WL12XX_INVALID_ROLE_ID;
2755
2756         if (is_ap)
2757                 wl->ap_count--;
2758         else
2759                 wl->sta_count--;
2760
2761         /*
2762          * Last AP, have more stations. Configure sleep auth according to STA.
2763          * Don't do thin on unintended recovery.
2764          */
2765         if (test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags) &&
2766             !test_bit(WL1271_FLAG_INTENDED_FW_RECOVERY, &wl->flags))
2767                 goto unlock;
2768
2769         if (wl->ap_count == 0 && is_ap) {
2770                 /* mask ap events */
2771                 wl->event_mask &= ~wl->ap_event_mask;
2772                 wl1271_event_unmask(wl);
2773         }
2774
2775         if (wl->ap_count == 0 && is_ap && wl->sta_count) {
2776                 u8 sta_auth = wl->conf.conn.sta_sleep_auth;
2777                 /* Configure for power according to debugfs */
2778                 if (sta_auth != WL1271_PSM_ILLEGAL)
2779                         wl1271_acx_sleep_auth(wl, sta_auth);
2780                 /* Configure for ELP power saving */
2781                 else
2782                         wl1271_acx_sleep_auth(wl, WL1271_PSM_ELP);
2783         }
2784
2785 unlock:
2786         mutex_unlock(&wl->mutex);
2787
2788         del_timer_sync(&wlvif->rx_streaming_timer);
2789         cancel_work_sync(&wlvif->rx_streaming_enable_work);
2790         cancel_work_sync(&wlvif->rx_streaming_disable_work);
2791         cancel_work_sync(&wlvif->rc_update_work);
2792         cancel_delayed_work_sync(&wlvif->connection_loss_work);
2793         cancel_delayed_work_sync(&wlvif->channel_switch_work);
2794         cancel_delayed_work_sync(&wlvif->pending_auth_complete_work);
2795
2796         mutex_lock(&wl->mutex);
2797 }
2798
2799 static void wl1271_op_remove_interface(struct ieee80211_hw *hw,
2800                                        struct ieee80211_vif *vif)
2801 {
2802         struct wl1271 *wl = hw->priv;
2803         struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
2804         struct wl12xx_vif *iter;
2805         struct vif_counter_data vif_count;
2806
2807         wl12xx_get_vif_count(hw, vif, &vif_count);
2808         mutex_lock(&wl->mutex);
2809
2810         if (wl->state == WLCORE_STATE_OFF ||
2811             !test_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags))
2812                 goto out;
2813
2814         /*
2815          * wl->vif can be null here if someone shuts down the interface
2816          * just when hardware recovery has been started.
2817          */
2818         wl12xx_for_each_wlvif(wl, iter) {
2819                 if (iter != wlvif)
2820                         continue;
2821
2822                 __wl1271_op_remove_interface(wl, vif, true);
2823                 break;
2824         }
2825         WARN_ON(iter != wlvif);
2826         if (wl12xx_need_fw_change(wl, vif_count, false)) {
2827                 wl12xx_force_active_psm(wl);
2828                 set_bit(WL1271_FLAG_INTENDED_FW_RECOVERY, &wl->flags);
2829                 wl12xx_queue_recovery_work(wl);
2830         }
2831 out:
2832         mutex_unlock(&wl->mutex);
2833 }
2834
2835 static int wl12xx_op_change_interface(struct ieee80211_hw *hw,
2836                                       struct ieee80211_vif *vif,
2837                                       enum nl80211_iftype new_type, bool p2p)
2838 {
2839         struct wl1271 *wl = hw->priv;
2840         int ret;
2841
2842         set_bit(WL1271_FLAG_VIF_CHANGE_IN_PROGRESS, &wl->flags);
2843         wl1271_op_remove_interface(hw, vif);
2844
2845         vif->type = new_type;
2846         vif->p2p = p2p;
2847         ret = wl1271_op_add_interface(hw, vif);
2848
2849         clear_bit(WL1271_FLAG_VIF_CHANGE_IN_PROGRESS, &wl->flags);
2850         return ret;
2851 }
2852
2853 static int wlcore_join(struct wl1271 *wl, struct wl12xx_vif *wlvif)
2854 {
2855         int ret;
2856         bool is_ibss = (wlvif->bss_type == BSS_TYPE_IBSS);
2857
2858         /*
2859          * One of the side effects of the JOIN command is that is clears
2860          * WPA/WPA2 keys from the chipset. Performing a JOIN while associated
2861          * to a WPA/WPA2 access point will therefore kill the data-path.
2862          * Currently the only valid scenario for JOIN during association
2863          * is on roaming, in which case we will also be given new keys.
2864          * Keep the below message for now, unless it starts bothering
2865          * users who really like to roam a lot :)
2866          */
2867         if (test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags))
2868                 wl1271_info("JOIN while associated.");
2869
2870         /* clear encryption type */
2871         wlvif->encryption_type = KEY_NONE;
2872
2873         if (is_ibss)
2874                 ret = wl12xx_cmd_role_start_ibss(wl, wlvif);
2875         else
2876                 ret = wl12xx_cmd_role_start_sta(wl, wlvif);
2877
2878         return ret;
2879 }
2880
2881 static int wl1271_ssid_set(struct wl12xx_vif *wlvif, struct sk_buff *skb,
2882                             int offset)
2883 {
2884         u8 ssid_len;
2885         const u8 *ptr = cfg80211_find_ie(WLAN_EID_SSID, skb->data + offset,
2886                                          skb->len - offset);
2887
2888         if (!ptr) {
2889                 wl1271_error("No SSID in IEs!");
2890                 return -ENOENT;
2891         }
2892
2893         ssid_len = ptr[1];
2894         if (ssid_len > IEEE80211_MAX_SSID_LEN) {
2895                 wl1271_error("SSID is too long!");
2896                 return -EINVAL;
2897         }
2898
2899         wlvif->ssid_len = ssid_len;
2900         memcpy(wlvif->ssid, ptr+2, ssid_len);
2901         return 0;
2902 }
2903
2904 static int wlcore_set_ssid(struct wl1271 *wl, struct wl12xx_vif *wlvif)
2905 {
2906         struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
2907         struct sk_buff *skb;
2908         int ieoffset;
2909
2910         /* we currently only support setting the ssid from the ap probe req */
2911         if (wlvif->bss_type != BSS_TYPE_STA_BSS)
2912                 return -EINVAL;
2913
2914         skb = ieee80211_ap_probereq_get(wl->hw, vif);
2915         if (!skb)
2916                 return -EINVAL;
2917
2918         ieoffset = offsetof(struct ieee80211_mgmt,
2919                             u.probe_req.variable);
2920         wl1271_ssid_set(wlvif, skb, ieoffset);
2921         dev_kfree_skb(skb);
2922
2923         return 0;
2924 }
2925
2926 static int wlcore_set_assoc(struct wl1271 *wl, struct wl12xx_vif *wlvif,
2927                             struct ieee80211_bss_conf *bss_conf,
2928                             u32 sta_rate_set)
2929 {
2930         int ieoffset;
2931         int ret;
2932
2933         wlvif->aid = bss_conf->aid;
2934         wlvif->channel_type = cfg80211_get_chandef_type(&bss_conf->chandef);
2935         wlvif->beacon_int = bss_conf->beacon_int;
2936         wlvif->wmm_enabled = bss_conf->qos;
2937
2938         set_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags);
2939
2940         /*
2941          * with wl1271, we don't need to update the
2942          * beacon_int and dtim_period, because the firmware
2943          * updates it by itself when the first beacon is
2944          * received after a join.
2945          */
2946         ret = wl1271_cmd_build_ps_poll(wl, wlvif, wlvif->aid);
2947         if (ret < 0)
2948                 return ret;
2949
2950         /*
2951          * Get a template for hardware connection maintenance
2952          */
2953         dev_kfree_skb(wlvif->probereq);
2954         wlvif->probereq = wl1271_cmd_build_ap_probe_req(wl,
2955                                                         wlvif,
2956                                                         NULL);
2957         ieoffset = offsetof(struct ieee80211_mgmt,
2958                             u.probe_req.variable);
2959         wl1271_ssid_set(wlvif, wlvif->probereq, ieoffset);
2960
2961         /* enable the connection monitoring feature */
2962         ret = wl1271_acx_conn_monit_params(wl, wlvif, true);
2963         if (ret < 0)
2964                 return ret;
2965
2966         /*
2967          * The join command disable the keep-alive mode, shut down its process,
2968          * and also clear the template config, so we need to reset it all after
2969          * the join. The acx_aid starts the keep-alive process, and the order
2970          * of the commands below is relevant.
2971          */
2972         ret = wl1271_acx_keep_alive_mode(wl, wlvif, true);
2973         if (ret < 0)
2974                 return ret;
2975
2976         ret = wl1271_acx_aid(wl, wlvif, wlvif->aid);
2977         if (ret < 0)
2978                 return ret;
2979
2980         ret = wl12xx_cmd_build_klv_null_data(wl, wlvif);
2981         if (ret < 0)
2982                 return ret;
2983
2984         ret = wl1271_acx_keep_alive_config(wl, wlvif,
2985                                            wlvif->sta.klv_template_id,
2986                                            ACX_KEEP_ALIVE_TPL_VALID);
2987         if (ret < 0)
2988                 return ret;
2989
2990         /*
2991          * The default fw psm configuration is AUTO, while mac80211 default
2992          * setting is off (ACTIVE), so sync the fw with the correct value.
2993          */
2994         ret = wl1271_ps_set_mode(wl, wlvif, STATION_ACTIVE_MODE);
2995         if (ret < 0)
2996                 return ret;
2997
2998         if (sta_rate_set) {
2999                 wlvif->rate_set =
3000                         wl1271_tx_enabled_rates_get(wl,
3001                                                     sta_rate_set,
3002                                                     wlvif->band);
3003                 ret = wl1271_acx_sta_rate_policies(wl, wlvif);
3004                 if (ret < 0)
3005                         return ret;
3006         }
3007
3008         return ret;
3009 }
3010
3011 static int wlcore_unset_assoc(struct wl1271 *wl, struct wl12xx_vif *wlvif)
3012 {
3013         int ret;
3014         bool sta = wlvif->bss_type == BSS_TYPE_STA_BSS;
3015
3016         /* make sure we are connected (sta) joined */
3017         if (sta &&
3018             !test_and_clear_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags))
3019                 return false;
3020
3021         /* make sure we are joined (ibss) */
3022         if (!sta &&
3023             test_and_clear_bit(WLVIF_FLAG_IBSS_JOINED, &wlvif->flags))
3024                 return false;
3025
3026         if (sta) {
3027                 /* use defaults when not associated */
3028                 wlvif->aid = 0;
3029
3030                 /* free probe-request template */
3031                 dev_kfree_skb(wlvif->probereq);
3032                 wlvif->probereq = NULL;
3033
3034                 /* disable connection monitor features */
3035                 ret = wl1271_acx_conn_monit_params(wl, wlvif, false);
3036                 if (ret < 0)
3037                         return ret;
3038
3039                 /* Disable the keep-alive feature */
3040                 ret = wl1271_acx_keep_alive_mode(wl, wlvif, false);
3041                 if (ret < 0)
3042                         return ret;
3043
3044                 /* disable beacon filtering */
3045                 ret = wl1271_acx_beacon_filter_opt(wl, wlvif, false);
3046                 if (ret < 0)
3047                         return ret;
3048         }
3049
3050         if (test_and_clear_bit(WLVIF_FLAG_CS_PROGRESS, &wlvif->flags)) {
3051                 struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
3052
3053                 wl12xx_cmd_stop_channel_switch(wl, wlvif);
3054                 ieee80211_chswitch_done(vif, false);
3055                 cancel_delayed_work(&wlvif->channel_switch_work);
3056         }
3057
3058         /* invalidate keep-alive template */
3059         wl1271_acx_keep_alive_config(wl, wlvif,
3060                                      wlvif->sta.klv_template_id,
3061                                      ACX_KEEP_ALIVE_TPL_INVALID);
3062
3063         return 0;
3064 }
3065
3066 static void wl1271_set_band_rate(struct wl1271 *wl, struct wl12xx_vif *wlvif)
3067 {
3068         wlvif->basic_rate_set = wlvif->bitrate_masks[wlvif->band];
3069         wlvif->rate_set = wlvif->basic_rate_set;
3070 }
3071
3072 static void wl1271_sta_handle_idle(struct wl1271 *wl, struct wl12xx_vif *wlvif,
3073                                    bool idle)
3074 {
3075         bool cur_idle = !test_bit(WLVIF_FLAG_ACTIVE, &wlvif->flags);
3076
3077         if (idle == cur_idle)
3078                 return;
3079
3080         if (idle) {
3081                 clear_bit(WLVIF_FLAG_ACTIVE, &wlvif->flags);
3082         } else {
3083                 /* The current firmware only supports sched_scan in idle */
3084                 if (wl->sched_vif == wlvif)
3085                         wl->ops->sched_scan_stop(wl, wlvif);
3086
3087                 set_bit(WLVIF_FLAG_ACTIVE, &wlvif->flags);
3088         }
3089 }
3090
3091 static int wl12xx_config_vif(struct wl1271 *wl, struct wl12xx_vif *wlvif,
3092                              struct ieee80211_conf *conf, u32 changed)
3093 {
3094         int ret;
3095
3096         if (wlcore_is_p2p_mgmt(wlvif))
3097                 return 0;
3098
3099         if (conf->power_level != wlvif->power_level) {
3100                 ret = wl1271_acx_tx_power(wl, wlvif, conf->power_level);
3101                 if (ret < 0)
3102                         return ret;
3103
3104                 wlvif->power_level = conf->power_level;
3105         }
3106
3107         return 0;
3108 }
3109
3110 static int wl1271_op_config(struct ieee80211_hw *hw, u32 changed)
3111 {
3112         struct wl1271 *wl = hw->priv;
3113         struct wl12xx_vif *wlvif;
3114         struct ieee80211_conf *conf = &hw->conf;
3115         int ret = 0;
3116
3117         wl1271_debug(DEBUG_MAC80211, "mac80211 config psm %s power %d %s"
3118                      " changed 0x%x",
3119                      conf->flags & IEEE80211_CONF_PS ? "on" : "off",
3120                      conf->power_level,
3121                      conf->flags & IEEE80211_CONF_IDLE ? "idle" : "in use",
3122                          changed);
3123
3124         mutex_lock(&wl->mutex);
3125
3126         if (changed & IEEE80211_CONF_CHANGE_POWER)
3127                 wl->power_level = conf->power_level;
3128
3129         if (unlikely(wl->state != WLCORE_STATE_ON))
3130                 goto out;
3131
3132         ret = pm_runtime_get_sync(wl->dev);
3133         if (ret < 0) {
3134                 pm_runtime_put_noidle(wl->dev);
3135                 goto out;
3136         }
3137
3138         /* configure each interface */
3139         wl12xx_for_each_wlvif(wl, wlvif) {
3140                 ret = wl12xx_config_vif(wl, wlvif, conf, changed);
3141                 if (ret < 0)
3142                         goto out_sleep;
3143         }
3144
3145 out_sleep:
3146         pm_runtime_mark_last_busy(wl->dev);
3147         pm_runtime_put_autosuspend(wl->dev);
3148
3149 out:
3150         mutex_unlock(&wl->mutex);
3151
3152         return ret;
3153 }
3154
3155 struct wl1271_filter_params {
3156         bool enabled;
3157         int mc_list_length;
3158         u8 mc_list[ACX_MC_ADDRESS_GROUP_MAX][ETH_ALEN];
3159 };
3160
3161 static u64 wl1271_op_prepare_multicast(struct ieee80211_hw *hw,
3162                                        struct netdev_hw_addr_list *mc_list)
3163 {
3164         struct wl1271_filter_params *fp;
3165         struct netdev_hw_addr *ha;
3166
3167         fp = kzalloc(sizeof(*fp), GFP_ATOMIC);
3168         if (!fp) {
3169                 wl1271_error("Out of memory setting filters.");
3170                 return 0;
3171         }
3172
3173         /* update multicast filtering parameters */
3174         fp->mc_list_length = 0;
3175         if (netdev_hw_addr_list_count(mc_list) > ACX_MC_ADDRESS_GROUP_MAX) {
3176                 fp->enabled = false;
3177         } else {
3178                 fp->enabled = true;
3179                 netdev_hw_addr_list_for_each(ha, mc_list) {
3180                         memcpy(fp->mc_list[fp->mc_list_length],
3181                                         ha->addr, ETH_ALEN);
3182                         fp->mc_list_length++;
3183                 }
3184         }
3185
3186         return (u64)(unsigned long)fp;
3187 }
3188
3189 #define WL1271_SUPPORTED_FILTERS (FIF_ALLMULTI | \
3190                                   FIF_FCSFAIL | \
3191                                   FIF_BCN_PRBRESP_PROMISC | \
3192                                   FIF_CONTROL | \
3193                                   FIF_OTHER_BSS)
3194
3195 static void wl1271_op_configure_filter(struct ieee80211_hw *hw,
3196                                        unsigned int changed,
3197                                        unsigned int *total, u64 multicast)
3198 {
3199         struct wl1271_filter_params *fp = (void *)(unsigned long)multicast;
3200         struct wl1271 *wl = hw->priv;
3201         struct wl12xx_vif *wlvif;
3202
3203         int ret;
3204
3205         wl1271_debug(DEBUG_MAC80211, "mac80211 configure filter changed %x"
3206                      " total %x", changed, *total);
3207
3208         mutex_lock(&wl->mutex);
3209
3210         *total &= WL1271_SUPPORTED_FILTERS;
3211         changed &= WL1271_SUPPORTED_FILTERS;
3212
3213         if (unlikely(wl->state != WLCORE_STATE_ON))
3214                 goto out;
3215
3216         ret = pm_runtime_get_sync(wl->dev);
3217         if (ret < 0) {
3218                 pm_runtime_put_noidle(wl->dev);
3219                 goto out;
3220         }
3221
3222         wl12xx_for_each_wlvif(wl, wlvif) {
3223                 if (wlcore_is_p2p_mgmt(wlvif))
3224                         continue;
3225
3226                 if (wlvif->bss_type != BSS_TYPE_AP_BSS) {
3227                         if (*total & FIF_ALLMULTI)
3228                                 ret = wl1271_acx_group_address_tbl(wl, wlvif,
3229                                                                    false,
3230                                                                    NULL, 0);
3231                         else if (fp)
3232                                 ret = wl1271_acx_group_address_tbl(wl, wlvif,
3233                                                         fp->enabled,
3234                                                         fp->mc_list,
3235                                                         fp->mc_list_length);
3236                         if (ret < 0)
3237                                 goto out_sleep;
3238                 }
3239
3240                 /*
3241                  * If interface in AP mode and created with allmulticast then disable
3242                  * the firmware filters so that all multicast packets are passed
3243                  * This is mandatory for MDNS based discovery protocols 
3244                  */
3245                 if (wlvif->bss_type == BSS_TYPE_AP_BSS) {
3246                         if (*total & FIF_ALLMULTI) {
3247                                 ret = wl1271_acx_group_address_tbl(wl, wlvif,
3248                                                         false,
3249                                                         NULL, 0);
3250                                 if (ret < 0)
3251                                         goto out_sleep;
3252                         }
3253                 }
3254         }
3255
3256         /*
3257          * the fw doesn't provide an api to configure the filters. instead,
3258          * the filters configuration is based on the active roles / ROC
3259          * state.
3260          */
3261
3262 out_sleep:
3263         pm_runtime_mark_last_busy(wl->dev);
3264         pm_runtime_put_autosuspend(wl->dev);
3265
3266 out:
3267         mutex_unlock(&wl->mutex);
3268         kfree(fp);
3269 }
3270
3271 static int wl1271_record_ap_key(struct wl1271 *wl, struct wl12xx_vif *wlvif,
3272                                 u8 id, u8 key_type, u8 key_size,
3273                                 const u8 *key, u8 hlid, u32 tx_seq_32,
3274                                 u16 tx_seq_16, bool is_pairwise)
3275 {
3276         struct wl1271_ap_key *ap_key;
3277         int i;
3278
3279         wl1271_debug(DEBUG_CRYPT, "record ap key id %d", (int)id);
3280
3281         if (key_size > MAX_KEY_SIZE)
3282                 return -EINVAL;
3283
3284         /*
3285          * Find next free entry in ap_keys. Also check we are not replacing
3286          * an existing key.
3287          */
3288         for (i = 0; i < MAX_NUM_KEYS; i++) {
3289                 if (wlvif->ap.recorded_keys[i] == NULL)
3290                         break;
3291
3292                 if (wlvif->ap.recorded_keys[i]->id == id) {
3293                         wl1271_warning("trying to record key replacement");
3294                         return -EINVAL;
3295                 }
3296         }
3297
3298         if (i == MAX_NUM_KEYS)
3299                 return -EBUSY;
3300
3301         ap_key = kzalloc(sizeof(*ap_key), GFP_KERNEL);
3302         if (!ap_key)
3303                 return -ENOMEM;
3304
3305         ap_key->id = id;
3306         ap_key->key_type = key_type;
3307         ap_key->key_size = key_size;
3308         memcpy(ap_key->key, key, key_size);
3309         ap_key->hlid = hlid;
3310         ap_key->tx_seq_32 = tx_seq_32;
3311         ap_key->tx_seq_16 = tx_seq_16;
3312         ap_key->is_pairwise = is_pairwise;
3313
3314         wlvif->ap.recorded_keys[i] = ap_key;
3315         return 0;
3316 }
3317
3318 static void wl1271_free_ap_keys(struct wl1271 *wl, struct wl12xx_vif *wlvif)
3319 {
3320         int i;
3321
3322         for (i = 0; i < MAX_NUM_KEYS; i++) {
3323                 kfree(wlvif->ap.recorded_keys[i]);
3324                 wlvif->ap.recorded_keys[i] = NULL;
3325         }
3326 }
3327
3328 static int wl1271_ap_init_hwenc(struct wl1271 *wl, struct wl12xx_vif *wlvif)
3329 {
3330         int i, ret = 0;
3331         struct wl1271_ap_key *key;
3332         bool wep_key_added = false;
3333
3334         for (i = 0; i < MAX_NUM_KEYS; i++) {
3335                 u8 hlid;
3336                 if (wlvif->ap.recorded_keys[i] == NULL)
3337                         break;
3338
3339                 key = wlvif->ap.recorded_keys[i];
3340                 hlid = key->hlid;
3341                 if (hlid == WL12XX_INVALID_LINK_ID)
3342                         hlid = wlvif->ap.bcast_hlid;
3343
3344                 ret = wl1271_cmd_set_ap_key(wl, wlvif, KEY_ADD_OR_REPLACE,
3345                                             key->id, key->key_type,
3346                                             key->key_size, key->key,
3347                                             hlid, key->tx_seq_32,
3348                                             key->tx_seq_16, key->is_pairwise);
3349                 if (ret < 0)
3350                         goto out;
3351
3352                 if (key->key_type == KEY_WEP)
3353                         wep_key_added = true;
3354         }
3355
3356         if (wep_key_added) {
3357                 ret = wl12xx_cmd_set_default_wep_key(wl, wlvif->default_key,
3358                                                      wlvif->ap.bcast_hlid);
3359                 if (ret < 0)
3360                         goto out;
3361         }
3362
3363 out:
3364         wl1271_free_ap_keys(wl, wlvif);
3365         return ret;
3366 }
3367
3368 static int wl1271_set_key(struct wl1271 *wl, struct wl12xx_vif *wlvif,
3369                        u16 action, u8 id, u8 key_type,
3370                        u8 key_size, const u8 *key, u32 tx_seq_32,
3371                        u16 tx_seq_16, struct ieee80211_sta *sta,
3372                        bool is_pairwise)
3373 {
3374         int ret;
3375         bool is_ap = (wlvif->bss_type == BSS_TYPE_AP_BSS);
3376
3377         if (is_ap) {
3378                 struct wl1271_station *wl_sta;
3379                 u8 hlid;
3380
3381                 if (sta) {
3382                         wl_sta = (struct wl1271_station *)sta->drv_priv;
3383                         hlid = wl_sta->hlid;
3384                 } else {
3385                         hlid = wlvif->ap.bcast_hlid;
3386                 }
3387
3388                 if (!test_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags)) {
3389                         /*
3390                          * We do not support removing keys after AP shutdown.
3391                          * Pretend we do to make mac80211 happy.
3392                          */
3393                         if (action != KEY_ADD_OR_REPLACE)
3394                                 return 0;
3395
3396                         ret = wl1271_record_ap_key(wl, wlvif, id,
3397                                              key_type, key_size,
3398                                              key, hlid, tx_seq_32,
3399                                              tx_seq_16, is_pairwise);
3400                 } else {
3401                         ret = wl1271_cmd_set_ap_key(wl, wlvif, action,
3402                                              id, key_type, key_size,
3403                                              key, hlid, tx_seq_32,
3404                                              tx_seq_16, is_pairwise);
3405                 }
3406
3407                 if (ret < 0)
3408                         return ret;
3409         } else {
3410                 const u8 *addr;
3411                 static const u8 bcast_addr[ETH_ALEN] = {
3412                         0xff, 0xff, 0xff, 0xff, 0xff, 0xff
3413                 };
3414
3415                 addr = sta ? sta->addr : bcast_addr;
3416
3417                 if (is_zero_ether_addr(addr)) {
3418                         /* We dont support TX only encryption */
3419                         return -EOPNOTSUPP;
3420                 }
3421
3422                 /* The wl1271 does not allow to remove unicast keys - they
3423                    will be cleared automatically on next CMD_JOIN. Ignore the
3424                    request silently, as we dont want the mac80211 to emit
3425                    an error message. */
3426                 if (action == KEY_REMOVE && !is_broadcast_ether_addr(addr))
3427                         return 0;
3428
3429                 /* don't remove key if hlid was already deleted */
3430                 if (action == KEY_REMOVE &&
3431                     wlvif->sta.hlid == WL12XX_INVALID_LINK_ID)
3432                         return 0;
3433
3434                 ret = wl1271_cmd_set_sta_key(wl, wlvif, action,
3435                                              id, key_type, key_size,
3436                                              key, addr, tx_seq_32,
3437                                              tx_seq_16);
3438                 if (ret < 0)
3439                         return ret;
3440
3441         }
3442
3443         return 0;
3444 }
3445
3446 static int wlcore_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
3447                              struct ieee80211_vif *vif,
3448                              struct ieee80211_sta *sta,
3449                              struct ieee80211_key_conf *key_conf)
3450 {
3451         struct wl1271 *wl = hw->priv;
3452         int ret;
3453         bool might_change_spare =
3454                 key_conf->cipher == WL1271_CIPHER_SUITE_GEM ||
3455                 key_conf->cipher == WLAN_CIPHER_SUITE_TKIP;
3456
3457         if (might_change_spare) {
3458                 /*
3459                  * stop the queues and flush to ensure the next packets are
3460                  * in sync with FW spare block accounting
3461                  */
3462                 wlcore_stop_queues(wl, WLCORE_QUEUE_STOP_REASON_SPARE_BLK);
3463                 wl1271_tx_flush(wl);
3464         }
3465
3466         mutex_lock(&wl->mutex);
3467
3468         if (unlikely(wl->state != WLCORE_STATE_ON)) {
3469                 ret = -EAGAIN;
3470                 goto out_wake_queues;
3471         }
3472
3473         ret = pm_runtime_get_sync(wl->dev);
3474         if (ret < 0) {
3475                 pm_runtime_put_noidle(wl->dev);
3476                 goto out_wake_queues;
3477         }
3478
3479         ret = wlcore_hw_set_key(wl, cmd, vif, sta, key_conf);
3480
3481         pm_runtime_mark_last_busy(wl->dev);
3482         pm_runtime_put_autosuspend(wl->dev);
3483
3484 out_wake_queues:
3485         if (might_change_spare)
3486                 wlcore_wake_queues(wl, WLCORE_QUEUE_STOP_REASON_SPARE_BLK);
3487
3488         mutex_unlock(&wl->mutex);
3489
3490         return ret;
3491 }
3492
3493 int wlcore_set_key(struct wl1271 *wl, enum set_key_cmd cmd,
3494                    struct ieee80211_vif *vif,
3495                    struct ieee80211_sta *sta,
3496                    struct ieee80211_key_conf *key_conf)
3497 {
3498         struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
3499         int ret;
3500         u32 tx_seq_32 = 0;
3501         u16 tx_seq_16 = 0;
3502         u8 key_type;
3503         u8 hlid;
3504         bool is_pairwise;
3505
3506         wl1271_debug(DEBUG_MAC80211, "mac80211 set key");
3507
3508         wl1271_debug(DEBUG_CRYPT, "CMD: 0x%x sta: %p", cmd, sta);
3509         wl1271_debug(DEBUG_CRYPT, "Key: algo:0x%x, id:%d, len:%d flags 0x%x",
3510                      key_conf->cipher, key_conf->keyidx,
3511                      key_conf->keylen, key_conf->flags);
3512         wl1271_dump(DEBUG_CRYPT, "KEY: ", key_conf->key, key_conf->keylen);
3513
3514         if (wlvif->bss_type == BSS_TYPE_AP_BSS)
3515                 if (sta) {
3516                         struct wl1271_station *wl_sta = (void *)sta->drv_priv;
3517                         hlid = wl_sta->hlid;
3518                 } else {
3519                         hlid = wlvif->ap.bcast_hlid;
3520                 }
3521         else
3522                 hlid = wlvif->sta.hlid;
3523
3524         if (hlid != WL12XX_INVALID_LINK_ID) {
3525                 u64 tx_seq = wl->links[hlid].total_freed_pkts;
3526                 tx_seq_32 = WL1271_TX_SECURITY_HI32(tx_seq);
3527                 tx_seq_16 = WL1271_TX_SECURITY_LO16(tx_seq);
3528         }
3529
3530         switch (key_conf->cipher) {
3531         case WLAN_CIPHER_SUITE_WEP40:
3532         case WLAN_CIPHER_SUITE_WEP104:
3533                 key_type = KEY_WEP;
3534
3535                 key_conf->hw_key_idx = key_conf->keyidx;
3536                 break;
3537         case WLAN_CIPHER_SUITE_TKIP:
3538                 key_type = KEY_TKIP;
3539                 key_conf->hw_key_idx = key_conf->keyidx;
3540                 break;
3541         case WLAN_CIPHER_SUITE_CCMP:
3542                 key_type = KEY_AES;
3543                 key_conf->flags |= IEEE80211_KEY_FLAG_PUT_IV_SPACE;
3544                 break;
3545         case WL1271_CIPHER_SUITE_GEM:
3546                 key_type = KEY_GEM;
3547                 break;
3548         default:
3549                 wl1271_error("Unknown key algo 0x%x", key_conf->cipher);
3550
3551                 return -EOPNOTSUPP;
3552         }
3553
3554         is_pairwise = key_conf->flags & IEEE80211_KEY_FLAG_PAIRWISE;
3555
3556         switch (cmd) {
3557         case SET_KEY:
3558                 ret = wl1271_set_key(wl, wlvif, KEY_ADD_OR_REPLACE,
3559                                  key_conf->keyidx, key_type,
3560                                  key_conf->keylen, key_conf->key,
3561                                  tx_seq_32, tx_seq_16, sta, is_pairwise);
3562                 if (ret < 0) {
3563                         wl1271_error("Could not add or replace key");
3564                         return ret;
3565                 }
3566
3567                 /*
3568                  * reconfiguring arp response if the unicast (or common)
3569                  * encryption key type was changed
3570                  */
3571                 if (wlvif->bss_type == BSS_TYPE_STA_BSS &&
3572                     (sta || key_type == KEY_WEP) &&
3573                     wlvif->encryption_type != key_type) {
3574                         wlvif->encryption_type = key_type;
3575                         ret = wl1271_cmd_build_arp_rsp(wl, wlvif);
3576                         if (ret < 0) {
3577                                 wl1271_warning("build arp rsp failed: %d", ret);
3578                                 return ret;
3579                         }
3580                 }
3581                 break;
3582
3583         case DISABLE_KEY:
3584                 ret = wl1271_set_key(wl, wlvif, KEY_REMOVE,
3585                                      key_conf->keyidx, key_type,
3586                                      key_conf->keylen, key_conf->key,
3587                                      0, 0, sta, is_pairwise);
3588                 if (ret < 0) {
3589                         wl1271_error("Could not remove key");
3590                         return ret;
3591                 }
3592                 break;
3593
3594         default:
3595                 wl1271_error("Unsupported key cmd 0x%x", cmd);
3596                 return -EOPNOTSUPP;
3597         }
3598
3599         return ret;
3600 }
3601 EXPORT_SYMBOL_GPL(wlcore_set_key);
3602
3603 static void wl1271_op_set_default_key_idx(struct ieee80211_hw *hw,
3604                                           struct ieee80211_vif *vif,
3605                                           int key_idx)
3606 {
3607         struct wl1271 *wl = hw->priv;
3608         struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
3609         int ret;
3610
3611         wl1271_debug(DEBUG_MAC80211, "mac80211 set default key idx %d",
3612                      key_idx);
3613
3614         /* we don't handle unsetting of default key */
3615         if (key_idx == -1)
3616                 return;
3617
3618         mutex_lock(&wl->mutex);
3619
3620         if (unlikely(wl->state != WLCORE_STATE_ON)) {
3621                 ret = -EAGAIN;
3622                 goto out_unlock;
3623         }
3624
3625         ret = pm_runtime_get_sync(wl->dev);
3626         if (ret < 0) {
3627                 pm_runtime_put_noidle(wl->dev);
3628                 goto out_unlock;
3629         }
3630
3631         wlvif->default_key = key_idx;
3632
3633         /* the default WEP key needs to be configured at least once */
3634         if (wlvif->encryption_type == KEY_WEP) {
3635                 ret = wl12xx_cmd_set_default_wep_key(wl,
3636                                 key_idx,
3637                                 wlvif->sta.hlid);
3638                 if (ret < 0)
3639                         goto out_sleep;
3640         }
3641
3642 out_sleep:
3643         pm_runtime_mark_last_busy(wl->dev);
3644         pm_runtime_put_autosuspend(wl->dev);
3645
3646 out_unlock:
3647         mutex_unlock(&wl->mutex);
3648 }
3649
3650 void wlcore_regdomain_config(struct wl1271 *wl)
3651 {
3652         int ret;
3653
3654         if (!(wl->quirks & WLCORE_QUIRK_REGDOMAIN_CONF))
3655                 return;
3656
3657         mutex_lock(&wl->mutex);
3658
3659         if (unlikely(wl->state != WLCORE_STATE_ON))
3660                 goto out;
3661
3662         ret = pm_runtime_get_sync(wl->dev);
3663         if (ret < 0) {
3664                 pm_runtime_put_autosuspend(wl->dev);
3665                 goto out;
3666         }
3667
3668         ret = wlcore_cmd_regdomain_config_locked(wl);
3669         if (ret < 0) {
3670                 wl12xx_queue_recovery_work(wl);
3671                 goto out;
3672         }
3673
3674         pm_runtime_mark_last_busy(wl->dev);
3675         pm_runtime_put_autosuspend(wl->dev);
3676 out:
3677         mutex_unlock(&wl->mutex);
3678 }
3679
3680 static int wl1271_op_hw_scan(struct ieee80211_hw *hw,
3681                              struct ieee80211_vif *vif,
3682                              struct ieee80211_scan_request *hw_req)
3683 {
3684         struct cfg80211_scan_request *req = &hw_req->req;
3685         struct wl1271 *wl = hw->priv;
3686         int ret;
3687         u8 *ssid = NULL;
3688         size_t len = 0;
3689
3690         wl1271_debug(DEBUG_MAC80211, "mac80211 hw scan");
3691
3692         if (req->n_ssids) {
3693                 ssid = req->ssids[0].ssid;
3694                 len = req->ssids[0].ssid_len;
3695         }
3696
3697         mutex_lock(&wl->mutex);
3698
3699         if (unlikely(wl->state != WLCORE_STATE_ON)) {
3700                 /*
3701                  * We cannot return -EBUSY here because cfg80211 will expect
3702                  * a call to ieee80211_scan_completed if we do - in this case
3703                  * there won't be any call.
3704                  */
3705                 ret = -EAGAIN;
3706                 goto out;
3707         }
3708
3709         ret = pm_runtime_get_sync(wl->dev);
3710         if (ret < 0) {
3711                 pm_runtime_put_noidle(wl->dev);
3712                 goto out;
3713         }
3714
3715         /* fail if there is any role in ROC */
3716         if (find_first_bit(wl->roc_map, WL12XX_MAX_ROLES) < WL12XX_MAX_ROLES) {
3717                 /* don't allow scanning right now */
3718                 ret = -EBUSY;
3719                 goto out_sleep;
3720         }
3721
3722         ret = wlcore_scan(hw->priv, vif, ssid, len, req);
3723 out_sleep:
3724         pm_runtime_mark_last_busy(wl->dev);
3725         pm_runtime_put_autosuspend(wl->dev);
3726 out:
3727         mutex_unlock(&wl->mutex);
3728
3729         return ret;
3730 }
3731
3732 static void wl1271_op_cancel_hw_scan(struct ieee80211_hw *hw,
3733                                      struct ieee80211_vif *vif)
3734 {
3735         struct wl1271 *wl = hw->priv;
3736         struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
3737         struct cfg80211_scan_info info = {
3738                 .aborted = true,
3739         };
3740         int ret;
3741
3742         wl1271_debug(DEBUG_MAC80211, "mac80211 cancel hw scan");
3743
3744         mutex_lock(&wl->mutex);
3745
3746         if (unlikely(wl->state != WLCORE_STATE_ON))
3747                 goto out;
3748
3749         if (wl->scan.state == WL1271_SCAN_STATE_IDLE)
3750                 goto out;
3751
3752         ret = pm_runtime_get_sync(wl->dev);
3753         if (ret < 0) {
3754                 pm_runtime_put_noidle(wl->dev);
3755                 goto out;
3756         }
3757
3758         if (wl->scan.state != WL1271_SCAN_STATE_DONE) {
3759                 ret = wl->ops->scan_stop(wl, wlvif);
3760                 if (ret < 0)
3761                         goto out_sleep;
3762         }
3763
3764         /*
3765          * Rearm the tx watchdog just before idling scan. This
3766          * prevents just-finished scans from triggering the watchdog
3767          */
3768         wl12xx_rearm_tx_watchdog_locked(wl);
3769
3770         wl->scan.state = WL1271_SCAN_STATE_IDLE;
3771         memset(wl->scan.scanned_ch, 0, sizeof(wl->scan.scanned_ch));
3772         wl->scan_wlvif = NULL;
3773         wl->scan.req = NULL;
3774         ieee80211_scan_completed(wl->hw, &info);
3775
3776 out_sleep:
3777         pm_runtime_mark_last_busy(wl->dev);
3778         pm_runtime_put_autosuspend(wl->dev);
3779 out:
3780         mutex_unlock(&wl->mutex);
3781
3782         cancel_delayed_work_sync(&wl->scan_complete_work);
3783 }
3784
3785 static int wl1271_op_sched_scan_start(struct ieee80211_hw *hw,
3786                                       struct ieee80211_vif *vif,
3787                                       struct cfg80211_sched_scan_request *req,
3788                                       struct ieee80211_scan_ies *ies)
3789 {
3790         struct wl1271 *wl = hw->priv;
3791         struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
3792         int ret;
3793
3794         wl1271_debug(DEBUG_MAC80211, "wl1271_op_sched_scan_start");
3795
3796         mutex_lock(&wl->mutex);
3797
3798         if (unlikely(wl->state != WLCORE_STATE_ON)) {
3799                 ret = -EAGAIN;
3800                 goto out;
3801         }
3802
3803         ret = pm_runtime_get_sync(wl->dev);
3804         if (ret < 0) {
3805                 pm_runtime_put_noidle(wl->dev);
3806                 goto out;
3807         }
3808
3809         ret = wl->ops->sched_scan_start(wl, wlvif, req, ies);
3810         if (ret < 0)
3811                 goto out_sleep;
3812
3813         wl->sched_vif = wlvif;
3814
3815 out_sleep:
3816         pm_runtime_mark_last_busy(wl->dev);
3817         pm_runtime_put_autosuspend(wl->dev);
3818 out:
3819         mutex_unlock(&wl->mutex);
3820         return ret;
3821 }
3822
3823 static int wl1271_op_sched_scan_stop(struct ieee80211_hw *hw,
3824                                      struct ieee80211_vif *vif)
3825 {
3826         struct wl1271 *wl = hw->priv;
3827         struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
3828         int ret;
3829
3830         wl1271_debug(DEBUG_MAC80211, "wl1271_op_sched_scan_stop");
3831
3832         mutex_lock(&wl->mutex);
3833
3834         if (unlikely(wl->state != WLCORE_STATE_ON))
3835                 goto out;
3836
3837         ret = pm_runtime_get_sync(wl->dev);
3838         if (ret < 0) {
3839                 pm_runtime_put_noidle(wl->dev);
3840                 goto out;
3841         }
3842
3843         wl->ops->sched_scan_stop(wl, wlvif);
3844
3845         pm_runtime_mark_last_busy(wl->dev);
3846         pm_runtime_put_autosuspend(wl->dev);
3847 out:
3848         mutex_unlock(&wl->mutex);
3849
3850         return 0;
3851 }
3852
3853 static int wl1271_op_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
3854 {
3855         struct wl1271 *wl = hw->priv;
3856         int ret = 0;
3857
3858         mutex_lock(&wl->mutex);
3859
3860         if (unlikely(wl->state != WLCORE_STATE_ON)) {
3861                 ret = -EAGAIN;
3862                 goto out;
3863         }
3864
3865         ret = pm_runtime_get_sync(wl->dev);
3866         if (ret < 0) {
3867                 pm_runtime_put_noidle(wl->dev);
3868                 goto out;
3869         }
3870
3871         ret = wl1271_acx_frag_threshold(wl, value);
3872         if (ret < 0)
3873                 wl1271_warning("wl1271_op_set_frag_threshold failed: %d", ret);
3874
3875         pm_runtime_mark_last_busy(wl->dev);
3876         pm_runtime_put_autosuspend(wl->dev);
3877
3878 out:
3879         mutex_unlock(&wl->mutex);
3880
3881         return ret;
3882 }
3883
3884 static int wl1271_op_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
3885 {
3886         struct wl1271 *wl = hw->priv;
3887         struct wl12xx_vif *wlvif;
3888         int ret = 0;
3889
3890         mutex_lock(&wl->mutex);
3891
3892         if (unlikely(wl->state != WLCORE_STATE_ON)) {
3893                 ret = -EAGAIN;
3894                 goto out;
3895         }
3896
3897         ret = pm_runtime_get_sync(wl->dev);
3898         if (ret < 0) {
3899                 pm_runtime_put_noidle(wl->dev);
3900                 goto out;
3901         }
3902
3903         wl12xx_for_each_wlvif(wl, wlvif) {
3904                 ret = wl1271_acx_rts_threshold(wl, wlvif, value);
3905                 if (ret < 0)
3906                         wl1271_warning("set rts threshold failed: %d", ret);
3907         }
3908         pm_runtime_mark_last_busy(wl->dev);
3909         pm_runtime_put_autosuspend(wl->dev);
3910
3911 out:
3912         mutex_unlock(&wl->mutex);
3913
3914         return ret;
3915 }
3916
3917 static void wl12xx_remove_ie(struct sk_buff *skb, u8 eid, int ieoffset)
3918 {
3919         int len;
3920         const u8 *next, *end = skb->data + skb->len;
3921         u8 *ie = (u8 *)cfg80211_find_ie(eid, skb->data + ieoffset,
3922                                         skb->len - ieoffset);
3923         if (!ie)
3924                 return;
3925         len = ie[1] + 2;
3926         next = ie + len;
3927         memmove(ie, next, end - next);
3928         skb_trim(skb, skb->len - len);
3929 }
3930
3931 static void wl12xx_remove_vendor_ie(struct sk_buff *skb,
3932                                             unsigned int oui, u8 oui_type,
3933                                             int ieoffset)
3934 {
3935         int len;
3936         const u8 *next, *end = skb->data + skb->len;
3937         u8 *ie = (u8 *)cfg80211_find_vendor_ie(oui, oui_type,
3938                                                skb->data + ieoffset,
3939                                                skb->len - ieoffset);
3940         if (!ie)
3941                 return;
3942         len = ie[1] + 2;
3943         next = ie + len;
3944         memmove(ie, next, end - next);
3945         skb_trim(skb, skb->len - len);
3946 }
3947
3948 static int wl1271_ap_set_probe_resp_tmpl(struct wl1271 *wl, u32 rates,
3949                                          struct ieee80211_vif *vif)
3950 {
3951         struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
3952         struct sk_buff *skb;
3953         int ret;
3954
3955         skb = ieee80211_proberesp_get(wl->hw, vif);
3956         if (!skb)
3957                 return -EOPNOTSUPP;
3958
3959         ret = wl1271_cmd_template_set(wl, wlvif->role_id,
3960                                       CMD_TEMPL_AP_PROBE_RESPONSE,
3961                                       skb->data,
3962                                       skb->len, 0,
3963                                       rates);
3964         dev_kfree_skb(skb);
3965
3966         if (ret < 0)
3967                 goto out;
3968
3969         wl1271_debug(DEBUG_AP, "probe response updated");
3970         set_bit(WLVIF_FLAG_AP_PROBE_RESP_SET, &wlvif->flags);
3971
3972 out:
3973         return ret;
3974 }
3975
3976 static int wl1271_ap_set_probe_resp_tmpl_legacy(struct wl1271 *wl,
3977                                              struct ieee80211_vif *vif,
3978                                              u8 *probe_rsp_data,
3979                                              size_t probe_rsp_len,
3980                                              u32 rates)
3981 {
3982         struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
3983         struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
3984         u8 probe_rsp_templ[WL1271_CMD_TEMPL_MAX_SIZE];
3985         int ssid_ie_offset, ie_offset, templ_len;
3986         const u8 *ptr;
3987
3988         /* no need to change probe response if the SSID is set correctly */
3989         if (wlvif->ssid_len > 0)
3990                 return wl1271_cmd_template_set(wl, wlvif->role_id,
3991                                                CMD_TEMPL_AP_PROBE_RESPONSE,
3992                                                probe_rsp_data,
3993                                                probe_rsp_len, 0,
3994                                                rates);
3995
3996         if (probe_rsp_len + bss_conf->ssid_len > WL1271_CMD_TEMPL_MAX_SIZE) {
3997                 wl1271_error("probe_rsp template too big");
3998                 return -EINVAL;
3999         }
4000
4001         /* start searching from IE offset */
4002         ie_offset = offsetof(struct ieee80211_mgmt, u.probe_resp.variable);
4003
4004         ptr = cfg80211_find_ie(WLAN_EID_SSID, probe_rsp_data + ie_offset,
4005                                probe_rsp_len - ie_offset);
4006         if (!ptr) {
4007                 wl1271_error("No SSID in beacon!");
4008                 return -EINVAL;
4009         }
4010
4011         ssid_ie_offset = ptr - probe_rsp_data;
4012         ptr += (ptr[1] + 2);
4013
4014         memcpy(probe_rsp_templ, probe_rsp_data, ssid_ie_offset);
4015
4016         /* insert SSID from bss_conf */
4017         probe_rsp_templ[ssid_ie_offset] = WLAN_EID_SSID;
4018         probe_rsp_templ[ssid_ie_offset + 1] = bss_conf->ssid_len;
4019         memcpy(probe_rsp_templ + ssid_ie_offset + 2,
4020                bss_conf->ssid, bss_conf->ssid_len);
4021         templ_len = ssid_ie_offset + 2 + bss_conf->ssid_len;
4022
4023         memcpy(probe_rsp_templ + ssid_ie_offset + 2 + bss_conf->ssid_len,
4024                ptr, probe_rsp_len - (ptr - probe_rsp_data));
4025         templ_len += probe_rsp_len - (ptr - probe_rsp_data);
4026
4027         return wl1271_cmd_template_set(wl, wlvif->role_id,
4028                                        CMD_TEMPL_AP_PROBE_RESPONSE,
4029                                        probe_rsp_templ,
4030                                        templ_len, 0,
4031                                        rates);
4032 }
4033
4034 static int wl1271_bss_erp_info_changed(struct wl1271 *wl,
4035                                        struct ieee80211_vif *vif,
4036                                        struct ieee80211_bss_conf *bss_conf,
4037                                        u32 changed)
4038 {
4039         struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
4040         int ret = 0;
4041
4042         if (changed & BSS_CHANGED_ERP_SLOT) {
4043                 if (bss_conf->use_short_slot)
4044                         ret = wl1271_acx_slot(wl, wlvif, SLOT_TIME_SHORT);
4045                 else
4046                         ret = wl1271_acx_slot(wl, wlvif, SLOT_TIME_LONG);
4047                 if (ret < 0) {
4048                         wl1271_warning("Set slot time failed %d", ret);
4049                         goto out;
4050                 }
4051         }
4052
4053         if (changed & BSS_CHANGED_ERP_PREAMBLE) {
4054                 if (bss_conf->use_short_preamble)
4055                         wl1271_acx_set_preamble(wl, wlvif, ACX_PREAMBLE_SHORT);
4056                 else
4057                         wl1271_acx_set_preamble(wl, wlvif, ACX_PREAMBLE_LONG);
4058         }
4059
4060         if (changed & BSS_CHANGED_ERP_CTS_PROT) {
4061                 if (bss_conf->use_cts_prot)
4062                         ret = wl1271_acx_cts_protect(wl, wlvif,
4063                                                      CTSPROTECT_ENABLE);
4064                 else
4065                         ret = wl1271_acx_cts_protect(wl, wlvif,
4066                                                      CTSPROTECT_DISABLE);
4067                 if (ret < 0) {
4068                         wl1271_warning("Set ctsprotect failed %d", ret);
4069                         goto out;
4070                 }
4071         }
4072
4073 out:
4074         return ret;
4075 }
4076
4077 static int wlcore_set_beacon_template(struct wl1271 *wl,
4078                                       struct ieee80211_vif *vif,
4079                                       bool is_ap)
4080 {
4081         struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
4082         struct ieee80211_hdr *hdr;
4083         u32 min_rate;
4084         int ret;
4085         int ieoffset = offsetof(struct ieee80211_mgmt, u.beacon.variable);
4086         struct sk_buff *beacon = ieee80211_beacon_get(wl->hw, vif);
4087         u16 tmpl_id;
4088
4089         if (!beacon) {
4090                 ret = -EINVAL;
4091                 goto out;
4092         }
4093
4094         wl1271_debug(DEBUG_MASTER, "beacon updated");
4095
4096         ret = wl1271_ssid_set(wlvif, beacon, ieoffset);
4097         if (ret < 0) {
4098                 dev_kfree_skb(beacon);
4099                 goto out;
4100         }
4101         min_rate = wl1271_tx_min_rate_get(wl, wlvif->basic_rate_set);
4102         tmpl_id = is_ap ? CMD_TEMPL_AP_BEACON :
4103                 CMD_TEMPL_BEACON;
4104         ret = wl1271_cmd_template_set(wl, wlvif->role_id, tmpl_id,
4105                                       beacon->data,
4106                                       beacon->len, 0,
4107                                       min_rate);
4108         if (ret < 0) {
4109                 dev_kfree_skb(beacon);
4110                 goto out;
4111         }
4112
4113         wlvif->wmm_enabled =
4114                 cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
4115                                         WLAN_OUI_TYPE_MICROSOFT_WMM,
4116                                         beacon->data + ieoffset,
4117                                         beacon->len - ieoffset);
4118
4119         /*
4120          * In case we already have a probe-resp beacon set explicitly
4121          * by usermode, don't use the beacon data.
4122          */
4123         if (test_bit(WLVIF_FLAG_AP_PROBE_RESP_SET, &wlvif->flags))
4124                 goto end_bcn;
4125
4126         /* remove TIM ie from probe response */
4127         wl12xx_remove_ie(beacon, WLAN_EID_TIM, ieoffset);
4128
4129         /*
4130          * remove p2p ie from probe response.
4131          * the fw reponds to probe requests that don't include
4132          * the p2p ie. probe requests with p2p ie will be passed,
4133          * and will be responded by the supplicant (the spec
4134          * forbids including the p2p ie when responding to probe
4135          * requests that didn't include it).
4136          */
4137         wl12xx_remove_vendor_ie(beacon, WLAN_OUI_WFA,
4138                                 WLAN_OUI_TYPE_WFA_P2P, ieoffset);
4139
4140         hdr = (struct ieee80211_hdr *) beacon->data;
4141         hdr->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
4142                                          IEEE80211_STYPE_PROBE_RESP);
4143         if (is_ap)
4144                 ret = wl1271_ap_set_probe_resp_tmpl_legacy(wl, vif,
4145                                                            beacon->data,
4146                                                            beacon->len,
4147                                                            min_rate);
4148         else
4149                 ret = wl1271_cmd_template_set(wl, wlvif->role_id,
4150                                               CMD_TEMPL_PROBE_RESPONSE,
4151                                               beacon->data,
4152                                               beacon->len, 0,
4153                                               min_rate);
4154 end_bcn:
4155         dev_kfree_skb(beacon);
4156         if (ret < 0)
4157                 goto out;
4158
4159 out:
4160         return ret;
4161 }
4162
4163 static int wl1271_bss_beacon_info_changed(struct wl1271 *wl,
4164                                           struct ieee80211_vif *vif,
4165                                           struct ieee80211_bss_conf *bss_conf,
4166                                           u32 changed)
4167 {
4168         struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
4169         bool is_ap = (wlvif->bss_type == BSS_TYPE_AP_BSS);
4170         int ret = 0;
4171
4172         if (changed & BSS_CHANGED_BEACON_INT) {
4173                 wl1271_debug(DEBUG_MASTER, "beacon interval updated: %d",
4174                         bss_conf->beacon_int);
4175
4176                 wlvif->beacon_int = bss_conf->beacon_int;
4177         }
4178
4179         if ((changed & BSS_CHANGED_AP_PROBE_RESP) && is_ap) {
4180                 u32 rate = wl1271_tx_min_rate_get(wl, wlvif->basic_rate_set);
4181
4182                 wl1271_ap_set_probe_resp_tmpl(wl, rate, vif);
4183         }
4184
4185         if (changed & BSS_CHANGED_BEACON) {
4186                 ret = wlcore_set_beacon_template(wl, vif, is_ap);
4187                 if (ret < 0)
4188                         goto out;
4189
4190                 if (test_and_clear_bit(WLVIF_FLAG_BEACON_DISABLED,
4191                                        &wlvif->flags)) {
4192                         ret = wlcore_hw_dfs_master_restart(wl, wlvif);
4193                         if (ret < 0)
4194                                 goto out;
4195                 }
4196         }
4197 out:
4198         if (ret != 0)
4199                 wl1271_error("beacon info change failed: %d", ret);
4200         return ret;
4201 }
4202
4203 /* AP mode changes */
4204 static void wl1271_bss_info_changed_ap(struct wl1271 *wl,
4205                                        struct ieee80211_vif *vif,
4206                                        struct ieee80211_bss_conf *bss_conf,
4207                                        u32 changed)
4208 {
4209         struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
4210         int ret = 0;
4211
4212         if (changed & BSS_CHANGED_BASIC_RATES) {
4213                 u32 rates = bss_conf->basic_rates;
4214
4215                 wlvif->basic_rate_set = wl1271_tx_enabled_rates_get(wl, rates,
4216                                                                  wlvif->band);
4217                 wlvif->basic_rate = wl1271_tx_min_rate_get(wl,
4218                                                         wlvif->basic_rate_set);
4219
4220                 ret = wl1271_init_ap_rates(wl, wlvif);
4221                 if (ret < 0) {
4222                         wl1271_error("AP rate policy change failed %d", ret);
4223                         goto out;
4224                 }
4225
4226                 ret = wl1271_ap_init_templates(wl, vif);
4227                 if (ret < 0)
4228                         goto out;
4229
4230                 /* No need to set probe resp template for mesh */
4231                 if (!ieee80211_vif_is_mesh(vif)) {
4232                         ret = wl1271_ap_set_probe_resp_tmpl(wl,
4233                                                             wlvif->basic_rate,
4234                                                             vif);
4235                         if (ret < 0)
4236                                 goto out;
4237                 }
4238
4239                 ret = wlcore_set_beacon_template(wl, vif, true);
4240                 if (ret < 0)
4241                         goto out;
4242         }
4243
4244         ret = wl1271_bss_beacon_info_changed(wl, vif, bss_conf, changed);
4245         if (ret < 0)
4246                 goto out;
4247
4248         if (changed & BSS_CHANGED_BEACON_ENABLED) {
4249                 if (bss_conf->enable_beacon) {
4250                         if (!test_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags)) {
4251                                 ret = wl12xx_cmd_role_start_ap(wl, wlvif);
4252                                 if (ret < 0)
4253                                         goto out;
4254
4255                                 ret = wl1271_ap_init_hwenc(wl, wlvif);
4256                                 if (ret < 0)
4257                                         goto out;
4258
4259                                 set_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags);
4260                                 wl1271_debug(DEBUG_AP, "started AP");
4261                         }
4262                 } else {
4263                         if (test_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags)) {
4264                                 /*
4265                                  * AP might be in ROC in case we have just
4266                                  * sent auth reply. handle it.
4267                                  */
4268                                 if (test_bit(wlvif->role_id, wl->roc_map))
4269                                         wl12xx_croc(wl, wlvif->role_id);
4270
4271                                 ret = wl12xx_cmd_role_stop_ap(wl, wlvif);
4272                                 if (ret < 0)
4273                                         goto out;
4274
4275                                 clear_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags);
4276                                 clear_bit(WLVIF_FLAG_AP_PROBE_RESP_SET,
4277                                           &wlvif->flags);
4278                                 wl1271_debug(DEBUG_AP, "stopped AP");
4279                         }
4280                 }
4281         }
4282
4283         ret = wl1271_bss_erp_info_changed(wl, vif, bss_conf, changed);
4284         if (ret < 0)
4285                 goto out;
4286
4287         /* Handle HT information change */
4288         if ((changed & BSS_CHANGED_HT) &&
4289             (bss_conf->chandef.width != NL80211_CHAN_WIDTH_20_NOHT)) {
4290                 ret = wl1271_acx_set_ht_information(wl, wlvif,
4291                                         bss_conf->ht_operation_mode);
4292                 if (ret < 0) {
4293                         wl1271_warning("Set ht information failed %d", ret);
4294                         goto out;
4295                 }
4296         }
4297
4298 out:
4299         return;
4300 }
4301
4302 static int wlcore_set_bssid(struct wl1271 *wl, struct wl12xx_vif *wlvif,
4303                             struct ieee80211_bss_conf *bss_conf,
4304                             u32 sta_rate_set)
4305 {
4306         u32 rates;
4307         int ret;
4308
4309         wl1271_debug(DEBUG_MAC80211,
4310              "changed_bssid: %pM, aid: %d, bcn_int: %d, brates: 0x%x sta_rate_set: 0x%x",
4311              bss_conf->bssid, bss_conf->aid,
4312              bss_conf->beacon_int,
4313              bss_conf->basic_rates, sta_rate_set);
4314
4315         wlvif->beacon_int = bss_conf->beacon_int;
4316         rates = bss_conf->basic_rates;
4317         wlvif->basic_rate_set =
4318                 wl1271_tx_enabled_rates_get(wl, rates,
4319                                             wlvif->band);
4320         wlvif->basic_rate =
4321                 wl1271_tx_min_rate_get(wl,
4322                                        wlvif->basic_rate_set);
4323
4324         if (sta_rate_set)
4325                 wlvif->rate_set =
4326                         wl1271_tx_enabled_rates_get(wl,
4327                                                 sta_rate_set,
4328                                                 wlvif->band);
4329
4330         /* we only support sched_scan while not connected */
4331         if (wl->sched_vif == wlvif)
4332                 wl->ops->sched_scan_stop(wl, wlvif);
4333
4334         ret = wl1271_acx_sta_rate_policies(wl, wlvif);
4335         if (ret < 0)
4336                 return ret;
4337
4338         ret = wl12xx_cmd_build_null_data(wl, wlvif);
4339         if (ret < 0)
4340                 return ret;
4341
4342         ret = wl1271_build_qos_null_data(wl, wl12xx_wlvif_to_vif(wlvif));
4343         if (ret < 0)
4344                 return ret;
4345
4346         wlcore_set_ssid(wl, wlvif);
4347
4348         set_bit(WLVIF_FLAG_IN_USE, &wlvif->flags);
4349
4350         return 0;
4351 }
4352
4353 static int wlcore_clear_bssid(struct wl1271 *wl, struct wl12xx_vif *wlvif)
4354 {
4355         int ret;
4356
4357         /* revert back to minimum rates for the current band */
4358         wl1271_set_band_rate(wl, wlvif);
4359         wlvif->basic_rate = wl1271_tx_min_rate_get(wl, wlvif->basic_rate_set);
4360
4361         ret = wl1271_acx_sta_rate_policies(wl, wlvif);
4362         if (ret < 0)
4363                 return ret;
4364
4365         if (wlvif->bss_type == BSS_TYPE_STA_BSS &&
4366             test_bit(WLVIF_FLAG_IN_USE, &wlvif->flags)) {
4367                 ret = wl12xx_cmd_role_stop_sta(wl, wlvif);
4368                 if (ret < 0)
4369                         return ret;
4370         }
4371
4372         clear_bit(WLVIF_FLAG_IN_USE, &wlvif->flags);
4373         return 0;
4374 }
4375 /* STA/IBSS mode changes */
4376 static void wl1271_bss_info_changed_sta(struct wl1271 *wl,
4377                                         struct ieee80211_vif *vif,
4378                                         struct ieee80211_bss_conf *bss_conf,
4379                                         u32 changed)
4380 {
4381         struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
4382         bool do_join = false;
4383         bool is_ibss = (wlvif->bss_type == BSS_TYPE_IBSS);
4384         bool ibss_joined = false;
4385         u32 sta_rate_set = 0;
4386         int ret;
4387         struct ieee80211_sta *sta;
4388         bool sta_exists = false;
4389         struct ieee80211_sta_ht_cap sta_ht_cap;
4390
4391         if (is_ibss) {
4392                 ret = wl1271_bss_beacon_info_changed(wl, vif, bss_conf,
4393                                                      changed);
4394                 if (ret < 0)
4395                         goto out;
4396         }
4397
4398         if (changed & BSS_CHANGED_IBSS) {
4399                 if (bss_conf->ibss_joined) {
4400                         set_bit(WLVIF_FLAG_IBSS_JOINED, &wlvif->flags);
4401                         ibss_joined = true;
4402                 } else {
4403                         wlcore_unset_assoc(wl, wlvif);
4404                         wl12xx_cmd_role_stop_sta(wl, wlvif);
4405                 }
4406         }
4407
4408         if ((changed & BSS_CHANGED_BEACON_INT) && ibss_joined)
4409                 do_join = true;
4410
4411         /* Need to update the SSID (for filtering etc) */
4412         if ((changed & BSS_CHANGED_BEACON) && ibss_joined)
4413                 do_join = true;
4414
4415         if ((changed & BSS_CHANGED_BEACON_ENABLED) && ibss_joined) {
4416                 wl1271_debug(DEBUG_ADHOC, "ad-hoc beaconing: %s",
4417                              bss_conf->enable_beacon ? "enabled" : "disabled");
4418
4419                 do_join = true;
4420         }
4421
4422         if (changed & BSS_CHANGED_IDLE && !is_ibss)
4423                 wl1271_sta_handle_idle(wl, wlvif, bss_conf->idle);
4424
4425         if (changed & BSS_CHANGED_CQM) {
4426                 bool enable = false;
4427                 if (bss_conf->cqm_rssi_thold)
4428                         enable = true;
4429                 ret = wl1271_acx_rssi_snr_trigger(wl, wlvif, enable,
4430                                                   bss_conf->cqm_rssi_thold,
4431                                                   bss_conf->cqm_rssi_hyst);
4432                 if (ret < 0)
4433                         goto out;
4434                 wlvif->rssi_thold = bss_conf->cqm_rssi_thold;
4435         }
4436
4437         if (changed & (BSS_CHANGED_BSSID | BSS_CHANGED_HT |
4438                        BSS_CHANGED_ASSOC)) {
4439                 rcu_read_lock();
4440                 sta = ieee80211_find_sta(vif, bss_conf->bssid);
4441                 if (sta) {
4442                         u8 *rx_mask = sta->ht_cap.mcs.rx_mask;
4443
4444                         /* save the supp_rates of the ap */
4445                         sta_rate_set = sta->supp_rates[wlvif->band];
4446                         if (sta->ht_cap.ht_supported)
4447                                 sta_rate_set |=
4448                                         (rx_mask[0] << HW_HT_RATES_OFFSET) |
4449                                         (rx_mask[1] << HW_MIMO_RATES_OFFSET);
4450                         sta_ht_cap = sta->ht_cap;
4451                         sta_exists = true;
4452                 }
4453
4454                 rcu_read_unlock();
4455         }
4456
4457         if (changed & BSS_CHANGED_BSSID) {
4458                 if (!is_zero_ether_addr(bss_conf->bssid)) {
4459                         ret = wlcore_set_bssid(wl, wlvif, bss_conf,
4460                                                sta_rate_set);
4461                         if (ret < 0)
4462                                 goto out;
4463
4464                         /* Need to update the BSSID (for filtering etc) */
4465                         do_join = true;
4466                 } else {
4467                         ret = wlcore_clear_bssid(wl, wlvif);
4468                         if (ret < 0)
4469                                 goto out;
4470                 }
4471         }
4472
4473         if (changed & BSS_CHANGED_IBSS) {
4474                 wl1271_debug(DEBUG_ADHOC, "ibss_joined: %d",
4475                              bss_conf->ibss_joined);
4476
4477                 if (bss_conf->ibss_joined) {
4478                         u32 rates = bss_conf->basic_rates;
4479                         wlvif->basic_rate_set =
4480                                 wl1271_tx_enabled_rates_get(wl, rates,
4481                                                             wlvif->band);
4482                         wlvif->basic_rate =
4483                                 wl1271_tx_min_rate_get(wl,
4484                                                        wlvif->basic_rate_set);
4485
4486                         /* by default, use 11b + OFDM rates */
4487                         wlvif->rate_set = CONF_TX_IBSS_DEFAULT_RATES;
4488                         ret = wl1271_acx_sta_rate_policies(wl, wlvif);
4489                         if (ret < 0)
4490                                 goto out;
4491                 }
4492         }
4493
4494         if ((changed & BSS_CHANGED_BEACON_INFO) && bss_conf->dtim_period) {
4495                 /* enable beacon filtering */
4496                 ret = wl1271_acx_beacon_filter_opt(wl, wlvif, true);
4497                 if (ret < 0)
4498                         goto out;
4499         }
4500
4501         ret = wl1271_bss_erp_info_changed(wl, vif, bss_conf, changed);
4502         if (ret < 0)
4503                 goto out;
4504
4505         if (do_join) {
4506                 ret = wlcore_join(wl, wlvif);
4507                 if (ret < 0) {
4508                         wl1271_warning("cmd join failed %d", ret);
4509                         goto out;
4510                 }
4511         }
4512
4513         if (changed & BSS_CHANGED_ASSOC) {
4514                 if (bss_conf->assoc) {
4515                         ret = wlcore_set_assoc(wl, wlvif, bss_conf,
4516                                                sta_rate_set);
4517                         if (ret < 0)
4518                                 goto out;
4519
4520                         if (test_bit(WLVIF_FLAG_STA_AUTHORIZED, &wlvif->flags))
4521                                 wl12xx_set_authorized(wl, wlvif);
4522                 } else {
4523                         wlcore_unset_assoc(wl, wlvif);
4524                 }
4525         }
4526
4527         if (changed & BSS_CHANGED_PS) {
4528                 if ((bss_conf->ps) &&
4529                     test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags) &&
4530                     !test_bit(WLVIF_FLAG_IN_PS, &wlvif->flags)) {
4531                         int ps_mode;
4532                         char *ps_mode_str;
4533
4534                         if (wl->conf.conn.forced_ps) {
4535                                 ps_mode = STATION_POWER_SAVE_MODE;
4536                                 ps_mode_str = "forced";
4537                         } else {
4538                                 ps_mode = STATION_AUTO_PS_MODE;
4539                                 ps_mode_str = "auto";
4540                         }
4541
4542                         wl1271_debug(DEBUG_PSM, "%s ps enabled", ps_mode_str);
4543
4544                         ret = wl1271_ps_set_mode(wl, wlvif, ps_mode);
4545                         if (ret < 0)
4546                                 wl1271_warning("enter %s ps failed %d",
4547                                                ps_mode_str, ret);
4548                 } else if (!bss_conf->ps &&
4549                            test_bit(WLVIF_FLAG_IN_PS, &wlvif->flags)) {
4550                         wl1271_debug(DEBUG_PSM, "auto ps disabled");
4551
4552                         ret = wl1271_ps_set_mode(wl, wlvif,
4553                                                  STATION_ACTIVE_MODE);
4554                         if (ret < 0)
4555                                 wl1271_warning("exit auto ps failed %d", ret);
4556                 }
4557         }
4558
4559         /* Handle new association with HT. Do this after join. */
4560         if (sta_exists) {
4561                 bool enabled =
4562                         bss_conf->chandef.width != NL80211_CHAN_WIDTH_20_NOHT;
4563
4564                 ret = wlcore_hw_set_peer_cap(wl,
4565                                              &sta_ht_cap,
4566                                              enabled,
4567                                              wlvif->rate_set,
4568                                              wlvif->sta.hlid);
4569                 if (ret < 0) {
4570                         wl1271_warning("Set ht cap failed %d", ret);
4571                         goto out;
4572
4573                 }
4574
4575                 if (enabled) {
4576                         ret = wl1271_acx_set_ht_information(wl, wlvif,
4577                                                 bss_conf->ht_operation_mode);
4578                         if (ret < 0) {
4579                                 wl1271_warning("Set ht information failed %d",
4580                                                ret);
4581                                 goto out;
4582                         }
4583                 }
4584         }
4585
4586         /* Handle arp filtering. Done after join. */
4587         if ((changed & BSS_CHANGED_ARP_FILTER) ||
4588             (!is_ibss && (changed & BSS_CHANGED_QOS))) {
4589                 __be32 addr = bss_conf->arp_addr_list[0];
4590                 wlvif->sta.qos = bss_conf->qos;
4591                 WARN_ON(wlvif->bss_type != BSS_TYPE_STA_BSS);
4592
4593                 if (bss_conf->arp_addr_cnt == 1 && bss_conf->assoc) {
4594                         wlvif->ip_addr = addr;
4595                         /*
4596                          * The template should have been configured only upon
4597                          * association. however, it seems that the correct ip
4598                          * isn't being set (when sending), so we have to
4599                          * reconfigure the template upon every ip change.
4600                          */
4601                         ret = wl1271_cmd_build_arp_rsp(wl, wlvif);
4602                         if (ret < 0) {
4603                                 wl1271_warning("build arp rsp failed: %d", ret);
4604                                 goto out;
4605                         }
4606
4607                         ret = wl1271_acx_arp_ip_filter(wl, wlvif,
4608                                 (ACX_ARP_FILTER_ARP_FILTERING |
4609                                  ACX_ARP_FILTER_AUTO_ARP),
4610                                 addr);
4611                 } else {
4612                         wlvif->ip_addr = 0;
4613                         ret = wl1271_acx_arp_ip_filter(wl, wlvif, 0, addr);
4614                 }
4615
4616                 if (ret < 0)
4617                         goto out;
4618         }
4619
4620 out:
4621         return;
4622 }
4623
4624 static void wl1271_op_bss_info_changed(struct ieee80211_hw *hw,
4625                                        struct ieee80211_vif *vif,
4626                                        struct ieee80211_bss_conf *bss_conf,
4627                                        u32 changed)
4628 {
4629         struct wl1271 *wl = hw->priv;
4630         struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
4631         bool is_ap = (wlvif->bss_type == BSS_TYPE_AP_BSS);
4632         int ret;
4633
4634         wl1271_debug(DEBUG_MAC80211, "mac80211 bss info role %d changed 0x%x",
4635                      wlvif->role_id, (int)changed);
4636
4637         /*
4638          * make sure to cancel pending disconnections if our association
4639          * state changed
4640          */
4641         if (!is_ap && (changed & BSS_CHANGED_ASSOC))
4642                 cancel_delayed_work_sync(&wlvif->connection_loss_work);
4643
4644         if (is_ap && (changed & BSS_CHANGED_BEACON_ENABLED) &&
4645             !bss_conf->enable_beacon)
4646                 wl1271_tx_flush(wl);
4647
4648         mutex_lock(&wl->mutex);
4649
4650         if (unlikely(wl->state != WLCORE_STATE_ON))
4651                 goto out;
4652
4653         if (unlikely(!test_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags)))
4654                 goto out;
4655
4656         ret = pm_runtime_get_sync(wl->dev);
4657         if (ret < 0) {
4658                 pm_runtime_put_noidle(wl->dev);
4659                 goto out;
4660         }
4661
4662         if ((changed & BSS_CHANGED_TXPOWER) &&
4663             bss_conf->txpower != wlvif->power_level) {
4664
4665                 ret = wl1271_acx_tx_power(wl, wlvif, bss_conf->txpower);
4666                 if (ret < 0)
4667                         goto out;
4668
4669                 wlvif->power_level = bss_conf->txpower;
4670         }
4671
4672         if (is_ap)
4673                 wl1271_bss_info_changed_ap(wl, vif, bss_conf, changed);
4674         else
4675                 wl1271_bss_info_changed_sta(wl, vif, bss_conf, changed);
4676
4677         pm_runtime_mark_last_busy(wl->dev);
4678         pm_runtime_put_autosuspend(wl->dev);
4679
4680 out:
4681         mutex_unlock(&wl->mutex);
4682 }
4683
4684 static int wlcore_op_add_chanctx(struct ieee80211_hw *hw,
4685                                  struct ieee80211_chanctx_conf *ctx)
4686 {
4687         wl1271_debug(DEBUG_MAC80211, "mac80211 add chanctx %d (type %d)",
4688                      ieee80211_frequency_to_channel(ctx->def.chan->center_freq),
4689                      cfg80211_get_chandef_type(&ctx->def));
4690         return 0;
4691 }
4692
4693 static void wlcore_op_remove_chanctx(struct ieee80211_hw *hw,
4694                                      struct ieee80211_chanctx_conf *ctx)
4695 {
4696         wl1271_debug(DEBUG_MAC80211, "mac80211 remove chanctx %d (type %d)",
4697                      ieee80211_frequency_to_channel(ctx->def.chan->center_freq),
4698                      cfg80211_get_chandef_type(&ctx->def));
4699 }
4700
4701 static void wlcore_op_change_chanctx(struct ieee80211_hw *hw,
4702                                      struct ieee80211_chanctx_conf *ctx,
4703                                      u32 changed)
4704 {
4705         struct wl1271 *wl = hw->priv;
4706         struct wl12xx_vif *wlvif;
4707         int ret;
4708         int channel = ieee80211_frequency_to_channel(
4709                 ctx->def.chan->center_freq);
4710
4711         wl1271_debug(DEBUG_MAC80211,
4712                      "mac80211 change chanctx %d (type %d) changed 0x%x",
4713                      channel, cfg80211_get_chandef_type(&ctx->def), changed);
4714
4715         mutex_lock(&wl->mutex);
4716
4717         ret = pm_runtime_get_sync(wl->dev);
4718         if (ret < 0) {
4719                 pm_runtime_put_noidle(wl->dev);
4720                 goto out;
4721         }
4722
4723         wl12xx_for_each_wlvif(wl, wlvif) {
4724                 struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
4725
4726                 rcu_read_lock();
4727                 if (rcu_access_pointer(vif->chanctx_conf) != ctx) {
4728                         rcu_read_unlock();
4729                         continue;
4730                 }
4731                 rcu_read_unlock();
4732
4733                 /* start radar if needed */
4734                 if (changed & IEEE80211_CHANCTX_CHANGE_RADAR &&
4735                     wlvif->bss_type == BSS_TYPE_AP_BSS &&
4736                     ctx->radar_enabled && !wlvif->radar_enabled &&
4737                     ctx->def.chan->dfs_state == NL80211_DFS_USABLE) {
4738                         wl1271_debug(DEBUG_MAC80211, "Start radar detection");
4739                         wlcore_hw_set_cac(wl, wlvif, true);
4740                         wlvif->radar_enabled = true;
4741                 }
4742         }
4743
4744         pm_runtime_mark_last_busy(wl->dev);
4745         pm_runtime_put_autosuspend(wl->dev);
4746 out:
4747         mutex_unlock(&wl->mutex);
4748 }
4749
4750 static int wlcore_op_assign_vif_chanctx(struct ieee80211_hw *hw,
4751                                         struct ieee80211_vif *vif,
4752                                         struct ieee80211_chanctx_conf *ctx)
4753 {
4754         struct wl1271 *wl = hw->priv;
4755         struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
4756         int channel = ieee80211_frequency_to_channel(
4757                 ctx->def.chan->center_freq);
4758         int ret = -EINVAL;
4759
4760         wl1271_debug(DEBUG_MAC80211,
4761                      "mac80211 assign chanctx (role %d) %d (type %d) (radar %d dfs_state %d)",
4762                      wlvif->role_id, channel,
4763                      cfg80211_get_chandef_type(&ctx->def),
4764                      ctx->radar_enabled, ctx->def.chan->dfs_state);
4765
4766         mutex_lock(&wl->mutex);
4767
4768         if (unlikely(wl->state != WLCORE_STATE_ON))
4769                 goto out;
4770
4771         if (unlikely(!test_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags)))
4772                 goto out;
4773
4774         ret = pm_runtime_get_sync(wl->dev);
4775         if (ret < 0) {
4776                 pm_runtime_put_noidle(wl->dev);
4777                 goto out;
4778         }
4779
4780         wlvif->band = ctx->def.chan->band;
4781         wlvif->channel = channel;
4782         wlvif->channel_type = cfg80211_get_chandef_type(&ctx->def);
4783
4784         /* update default rates according to the band */
4785         wl1271_set_band_rate(wl, wlvif);
4786
4787         if (ctx->radar_enabled &&
4788             ctx->def.chan->dfs_state == NL80211_DFS_USABLE) {
4789                 wl1271_debug(DEBUG_MAC80211, "Start radar detection");
4790                 wlcore_hw_set_cac(wl, wlvif, true);
4791                 wlvif->radar_enabled = true;
4792         }
4793
4794         pm_runtime_mark_last_busy(wl->dev);
4795         pm_runtime_put_autosuspend(wl->dev);
4796 out:
4797         mutex_unlock(&wl->mutex);
4798
4799         return 0;
4800 }
4801
4802 static void wlcore_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
4803                                            struct ieee80211_vif *vif,
4804                                            struct ieee80211_chanctx_conf *ctx)
4805 {
4806         struct wl1271 *wl = hw->priv;
4807         struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
4808         int ret;
4809
4810         wl1271_debug(DEBUG_MAC80211,
4811                      "mac80211 unassign chanctx (role %d) %d (type %d)",
4812                      wlvif->role_id,
4813                      ieee80211_frequency_to_channel(ctx->def.chan->center_freq),
4814                      cfg80211_get_chandef_type(&ctx->def));
4815
4816         wl1271_tx_flush(wl);
4817
4818         mutex_lock(&wl->mutex);
4819
4820         if (unlikely(wl->state != WLCORE_STATE_ON))
4821                 goto out;
4822
4823         if (unlikely(!test_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags)))
4824                 goto out;
4825
4826         ret = pm_runtime_get_sync(wl->dev);
4827         if (ret < 0) {
4828                 pm_runtime_put_noidle(wl->dev);
4829                 goto out;
4830         }
4831
4832         if (wlvif->radar_enabled) {
4833                 wl1271_debug(DEBUG_MAC80211, "Stop radar detection");
4834                 wlcore_hw_set_cac(wl, wlvif, false);
4835                 wlvif->radar_enabled = false;
4836         }
4837
4838         pm_runtime_mark_last_busy(wl->dev);
4839         pm_runtime_put_autosuspend(wl->dev);
4840 out:
4841         mutex_unlock(&wl->mutex);
4842 }
4843
4844 static int __wlcore_switch_vif_chan(struct wl1271 *wl,
4845                                     struct wl12xx_vif *wlvif,
4846                                     struct ieee80211_chanctx_conf *new_ctx)
4847 {
4848         int channel = ieee80211_frequency_to_channel(
4849                 new_ctx->def.chan->center_freq);
4850
4851         wl1271_debug(DEBUG_MAC80211,
4852                      "switch vif (role %d) %d -> %d chan_type: %d",
4853                      wlvif->role_id, wlvif->channel, channel,
4854                      cfg80211_get_chandef_type(&new_ctx->def));
4855
4856         if (WARN_ON_ONCE(wlvif->bss_type != BSS_TYPE_AP_BSS))
4857                 return 0;
4858
4859         WARN_ON(!test_bit(WLVIF_FLAG_BEACON_DISABLED, &wlvif->flags));
4860
4861         if (wlvif->radar_enabled) {
4862                 wl1271_debug(DEBUG_MAC80211, "Stop radar detection");
4863                 wlcore_hw_set_cac(wl, wlvif, false);
4864                 wlvif->radar_enabled = false;
4865         }
4866
4867         wlvif->band = new_ctx->def.chan->band;
4868         wlvif->channel = channel;
4869         wlvif->channel_type = cfg80211_get_chandef_type(&new_ctx->def);
4870
4871         /* start radar if needed */
4872         if (new_ctx->radar_enabled) {
4873                 wl1271_debug(DEBUG_MAC80211, "Start radar detection");
4874                 wlcore_hw_set_cac(wl, wlvif, true);
4875                 wlvif->radar_enabled = true;
4876         }
4877
4878         return 0;
4879 }
4880
4881 static int
4882 wlcore_op_switch_vif_chanctx(struct ieee80211_hw *hw,
4883                              struct ieee80211_vif_chanctx_switch *vifs,
4884                              int n_vifs,
4885                              enum ieee80211_chanctx_switch_mode mode)
4886 {
4887         struct wl1271 *wl = hw->priv;
4888         int i, ret;
4889
4890         wl1271_debug(DEBUG_MAC80211,
4891                      "mac80211 switch chanctx n_vifs %d mode %d",
4892                      n_vifs, mode);
4893
4894         mutex_lock(&wl->mutex);
4895
4896         ret = pm_runtime_get_sync(wl->dev);
4897         if (ret < 0) {
4898                 pm_runtime_put_noidle(wl->dev);
4899                 goto out;
4900         }
4901
4902         for (i = 0; i < n_vifs; i++) {
4903                 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vifs[i].vif);
4904
4905                 ret = __wlcore_switch_vif_chan(wl, wlvif, vifs[i].new_ctx);
4906                 if (ret)
4907                         goto out_sleep;
4908         }
4909 out_sleep:
4910         pm_runtime_mark_last_busy(wl->dev);
4911         pm_runtime_put_autosuspend(wl->dev);
4912 out:
4913         mutex_unlock(&wl->mutex);
4914
4915         return 0;
4916 }
4917
4918 static int wl1271_op_conf_tx(struct ieee80211_hw *hw,
4919                              struct ieee80211_vif *vif, u16 queue,
4920                              const struct ieee80211_tx_queue_params *params)
4921 {
4922         struct wl1271 *wl = hw->priv;
4923         struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
4924         u8 ps_scheme;
4925         int ret = 0;
4926
4927         if (wlcore_is_p2p_mgmt(wlvif))
4928                 return 0;
4929
4930         mutex_lock(&wl->mutex);
4931
4932         wl1271_debug(DEBUG_MAC80211, "mac80211 conf tx %d", queue);
4933
4934         if (params->uapsd)
4935                 ps_scheme = CONF_PS_SCHEME_UPSD_TRIGGER;
4936         else
4937                 ps_scheme = CONF_PS_SCHEME_LEGACY;
4938
4939         if (!test_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags))
4940                 goto out;
4941
4942         ret = pm_runtime_get_sync(wl->dev);
4943         if (ret < 0) {
4944                 pm_runtime_put_noidle(wl->dev);
4945                 goto out;
4946         }
4947
4948         /*
4949          * the txop is confed in units of 32us by the mac80211,
4950          * we need us
4951          */
4952         ret = wl1271_acx_ac_cfg(wl, wlvif, wl1271_tx_get_queue(queue),
4953                                 params->cw_min, params->cw_max,
4954                                 params->aifs, params->txop << 5);
4955         if (ret < 0)
4956                 goto out_sleep;
4957
4958         ret = wl1271_acx_tid_cfg(wl, wlvif, wl1271_tx_get_queue(queue),
4959                                  CONF_CHANNEL_TYPE_EDCF,
4960                                  wl1271_tx_get_queue(queue),
4961                                  ps_scheme, CONF_ACK_POLICY_LEGACY,
4962                                  0, 0);
4963
4964 out_sleep:
4965         pm_runtime_mark_last_busy(wl->dev);
4966         pm_runtime_put_autosuspend(wl->dev);
4967
4968 out:
4969         mutex_unlock(&wl->mutex);
4970
4971         return ret;
4972 }
4973
4974 static u64 wl1271_op_get_tsf(struct ieee80211_hw *hw,
4975                              struct ieee80211_vif *vif)
4976 {
4977
4978         struct wl1271 *wl = hw->priv;
4979         struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
4980         u64 mactime = ULLONG_MAX;
4981         int ret;
4982
4983         wl1271_debug(DEBUG_MAC80211, "mac80211 get tsf");
4984
4985         mutex_lock(&wl->mutex);
4986
4987         if (unlikely(wl->state != WLCORE_STATE_ON))
4988                 goto out;
4989
4990         ret = pm_runtime_get_sync(wl->dev);
4991         if (ret < 0) {
4992                 pm_runtime_put_noidle(wl->dev);
4993                 goto out;
4994         }
4995
4996         ret = wl12xx_acx_tsf_info(wl, wlvif, &mactime);
4997         if (ret < 0)
4998                 goto out_sleep;
4999
5000 out_sleep:
5001         pm_runtime_mark_last_busy(wl->dev);
5002         pm_runtime_put_autosuspend(wl->dev);
5003
5004 out:
5005         mutex_unlock(&wl->mutex);
5006         return mactime;
5007 }
5008
5009 static int wl1271_op_get_survey(struct ieee80211_hw *hw, int idx,
5010                                 struct survey_info *survey)
5011 {
5012         struct ieee80211_conf *conf = &hw->conf;
5013
5014         if (idx != 0)
5015                 return -ENOENT;
5016
5017         survey->channel = conf->chandef.chan;
5018         survey->filled = 0;
5019         return 0;
5020 }
5021
5022 static int wl1271_allocate_sta(struct wl1271 *wl,
5023                              struct wl12xx_vif *wlvif,
5024                              struct ieee80211_sta *sta)
5025 {
5026         struct wl1271_station *wl_sta;
5027         int ret;
5028
5029
5030         if (wl->active_sta_count >= wl->max_ap_stations) {
5031                 wl1271_warning("could not allocate HLID - too much stations");
5032                 return -EBUSY;
5033         }
5034
5035         wl_sta = (struct wl1271_station *)sta->drv_priv;
5036         ret = wl12xx_allocate_link(wl, wlvif, &wl_sta->hlid);
5037         if (ret < 0) {
5038                 wl1271_warning("could not allocate HLID - too many links");
5039                 return -EBUSY;
5040         }
5041
5042         /* use the previous security seq, if this is a recovery/resume */
5043         wl->links[wl_sta->hlid].total_freed_pkts = wl_sta->total_freed_pkts;
5044
5045         set_bit(wl_sta->hlid, wlvif->ap.sta_hlid_map);
5046         memcpy(wl->links[wl_sta->hlid].addr, sta->addr, ETH_ALEN);
5047         wl->active_sta_count++;
5048         return 0;
5049 }
5050
5051 void wl1271_free_sta(struct wl1271 *wl, struct wl12xx_vif *wlvif, u8 hlid)
5052 {
5053         if (!test_bit(hlid, wlvif->ap.sta_hlid_map))
5054                 return;
5055
5056         clear_bit(hlid, wlvif->ap.sta_hlid_map);
5057         __clear_bit(hlid, &wl->ap_ps_map);
5058         __clear_bit(hlid, &wl->ap_fw_ps_map);
5059
5060         /*
5061          * save the last used PN in the private part of iee80211_sta,
5062          * in case of recovery/suspend
5063          */
5064         wlcore_save_freed_pkts_addr(wl, wlvif, hlid, wl->links[hlid].addr);
5065
5066         wl12xx_free_link(wl, wlvif, &hlid);
5067         wl->active_sta_count--;
5068
5069         /*
5070          * rearm the tx watchdog when the last STA is freed - give the FW a
5071          * chance to return STA-buffered packets before complaining.
5072          */
5073         if (wl->active_sta_count == 0)
5074                 wl12xx_rearm_tx_watchdog_locked(wl);
5075 }
5076
5077 static int wl12xx_sta_add(struct wl1271 *wl,
5078                           struct wl12xx_vif *wlvif,
5079                           struct ieee80211_sta *sta)
5080 {
5081         struct wl1271_station *wl_sta;
5082         int ret = 0;
5083         u8 hlid;
5084
5085         wl1271_debug(DEBUG_MAC80211, "mac80211 add sta %d", (int)sta->aid);
5086
5087         ret = wl1271_allocate_sta(wl, wlvif, sta);
5088         if (ret < 0)
5089                 return ret;
5090
5091         wl_sta = (struct wl1271_station *)sta->drv_priv;
5092         hlid = wl_sta->hlid;
5093
5094         ret = wl12xx_cmd_add_peer(wl, wlvif, sta, hlid);
5095         if (ret < 0)
5096                 wl1271_free_sta(wl, wlvif, hlid);
5097
5098         return ret;
5099 }
5100
5101 static int wl12xx_sta_remove(struct wl1271 *wl,
5102                              struct wl12xx_vif *wlvif,
5103                              struct ieee80211_sta *sta)
5104 {
5105         struct wl1271_station *wl_sta;
5106         int ret = 0, id;
5107
5108         wl1271_debug(DEBUG_MAC80211, "mac80211 remove sta %d", (int)sta->aid);
5109
5110         wl_sta = (struct wl1271_station *)sta->drv_priv;
5111         id = wl_sta->hlid;
5112         if (WARN_ON(!test_bit(id, wlvif->ap.sta_hlid_map)))
5113                 return -EINVAL;
5114
5115         ret = wl12xx_cmd_remove_peer(wl, wlvif, wl_sta->hlid);
5116         if (ret < 0)
5117                 return ret;
5118
5119         wl1271_free_sta(wl, wlvif, wl_sta->hlid);
5120         return ret;
5121 }
5122
5123 static void wlcore_roc_if_possible(struct wl1271 *wl,
5124                                    struct wl12xx_vif *wlvif)
5125 {
5126         if (find_first_bit(wl->roc_map,
5127                            WL12XX_MAX_ROLES) < WL12XX_MAX_ROLES)
5128                 return;
5129
5130         if (WARN_ON(wlvif->role_id == WL12XX_INVALID_ROLE_ID))
5131                 return;
5132
5133         wl12xx_roc(wl, wlvif, wlvif->role_id, wlvif->band, wlvif->channel);
5134 }
5135
5136 /*
5137  * when wl_sta is NULL, we treat this call as if coming from a
5138  * pending auth reply.
5139  * wl->mutex must be taken and the FW must be awake when the call
5140  * takes place.
5141  */
5142 void wlcore_update_inconn_sta(struct wl1271 *wl, struct wl12xx_vif *wlvif,
5143                               struct wl1271_station *wl_sta, bool in_conn)
5144 {
5145         if (in_conn) {
5146                 if (WARN_ON(wl_sta && wl_sta->in_connection))
5147                         return;
5148
5149                 if (!wlvif->ap_pending_auth_reply &&
5150                     !wlvif->inconn_count)
5151                         wlcore_roc_if_possible(wl, wlvif);
5152
5153                 if (wl_sta) {
5154                         wl_sta->in_connection = true;
5155                         wlvif->inconn_count++;
5156                 } else {
5157                         wlvif->ap_pending_auth_reply = true;
5158                 }
5159         } else {
5160                 if (wl_sta && !wl_sta->in_connection)
5161                         return;
5162
5163                 if (WARN_ON(!wl_sta && !wlvif->ap_pending_auth_reply))
5164                         return;
5165
5166                 if (WARN_ON(wl_sta && !wlvif->inconn_count))
5167                         return;
5168
5169                 if (wl_sta) {
5170                         wl_sta->in_connection = false;
5171                         wlvif->inconn_count--;
5172                 } else {
5173                         wlvif->ap_pending_auth_reply = false;
5174                 }
5175
5176                 if (!wlvif->inconn_count && !wlvif->ap_pending_auth_reply &&
5177                     test_bit(wlvif->role_id, wl->roc_map))
5178                         wl12xx_croc(wl, wlvif->role_id);
5179         }
5180 }
5181
5182 static int wl12xx_update_sta_state(struct wl1271 *wl,
5183                                    struct wl12xx_vif *wlvif,
5184                                    struct ieee80211_sta *sta,
5185                                    enum ieee80211_sta_state old_state,
5186                                    enum ieee80211_sta_state new_state)
5187 {
5188         struct wl1271_station *wl_sta;
5189         bool is_ap = wlvif->bss_type == BSS_TYPE_AP_BSS;
5190         bool is_sta = wlvif->bss_type == BSS_TYPE_STA_BSS;
5191         int ret;
5192
5193         wl_sta = (struct wl1271_station *)sta->drv_priv;
5194
5195         /* Add station (AP mode) */
5196         if (is_ap &&
5197             old_state == IEEE80211_STA_NOTEXIST &&
5198             new_state == IEEE80211_STA_NONE) {
5199                 ret = wl12xx_sta_add(wl, wlvif, sta);
5200                 if (ret)
5201                         return ret;
5202
5203                 wlcore_update_inconn_sta(wl, wlvif, wl_sta, true);
5204         }
5205
5206         /* Remove station (AP mode) */
5207         if (is_ap &&
5208             old_state == IEEE80211_STA_NONE &&
5209             new_state == IEEE80211_STA_NOTEXIST) {
5210                 /* must not fail */
5211                 wl12xx_sta_remove(wl, wlvif, sta);
5212
5213                 wlcore_update_inconn_sta(wl, wlvif, wl_sta, false);
5214         }
5215
5216         /* Authorize station (AP mode) */
5217         if (is_ap &&
5218             new_state == IEEE80211_STA_AUTHORIZED) {
5219                 ret = wl12xx_cmd_set_peer_state(wl, wlvif, wl_sta->hlid);
5220                 if (ret < 0)
5221                         return ret;
5222
5223                 /* reconfigure rates */
5224                 ret = wl12xx_cmd_add_peer(wl, wlvif, sta, wl_sta->hlid);
5225                 if (ret < 0)
5226                         return ret;
5227
5228                 ret = wl1271_acx_set_ht_capabilities(wl, &sta->ht_cap, true,
5229                                                      wl_sta->hlid);
5230                 if (ret)
5231                         return ret;
5232
5233                 wlcore_update_inconn_sta(wl, wlvif, wl_sta, false);
5234         }
5235
5236         /* Authorize station */
5237         if (is_sta &&
5238             new_state == IEEE80211_STA_AUTHORIZED) {
5239                 set_bit(WLVIF_FLAG_STA_AUTHORIZED, &wlvif->flags);
5240                 ret = wl12xx_set_authorized(wl, wlvif);
5241                 if (ret)
5242                         return ret;
5243         }
5244
5245         if (is_sta &&
5246             old_state == IEEE80211_STA_AUTHORIZED &&
5247             new_state == IEEE80211_STA_ASSOC) {
5248                 clear_bit(WLVIF_FLAG_STA_AUTHORIZED, &wlvif->flags);
5249                 clear_bit(WLVIF_FLAG_STA_STATE_SENT, &wlvif->flags);
5250         }
5251
5252         /* save seq number on disassoc (suspend) */
5253         if (is_sta &&
5254             old_state == IEEE80211_STA_ASSOC &&
5255             new_state == IEEE80211_STA_AUTH) {
5256                 wlcore_save_freed_pkts(wl, wlvif, wlvif->sta.hlid, sta);
5257                 wlvif->total_freed_pkts = 0;
5258         }
5259
5260         /* restore seq number on assoc (resume) */
5261         if (is_sta &&
5262             old_state == IEEE80211_STA_AUTH &&
5263             new_state == IEEE80211_STA_ASSOC) {
5264                 wlvif->total_freed_pkts = wl_sta->total_freed_pkts;
5265         }
5266
5267         /* clear ROCs on failure or authorization */
5268         if (is_sta &&
5269             (new_state == IEEE80211_STA_AUTHORIZED ||
5270              new_state == IEEE80211_STA_NOTEXIST)) {
5271                 if (test_bit(wlvif->role_id, wl->roc_map))
5272                         wl12xx_croc(wl, wlvif->role_id);
5273         }
5274
5275         if (is_sta &&
5276             old_state == IEEE80211_STA_NOTEXIST &&
5277             new_state == IEEE80211_STA_NONE) {
5278                 if (find_first_bit(wl->roc_map,
5279                                    WL12XX_MAX_ROLES) >= WL12XX_MAX_ROLES) {
5280                         WARN_ON(wlvif->role_id == WL12XX_INVALID_ROLE_ID);
5281                         wl12xx_roc(wl, wlvif, wlvif->role_id,
5282                                    wlvif->band, wlvif->channel);
5283                 }
5284         }
5285         return 0;
5286 }
5287
5288 static int wl12xx_op_sta_state(struct ieee80211_hw *hw,
5289                                struct ieee80211_vif *vif,
5290                                struct ieee80211_sta *sta,
5291                                enum ieee80211_sta_state old_state,
5292                                enum ieee80211_sta_state new_state)
5293 {
5294         struct wl1271 *wl = hw->priv;
5295         struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
5296         int ret;
5297
5298         wl1271_debug(DEBUG_MAC80211, "mac80211 sta %d state=%d->%d",
5299                      sta->aid, old_state, new_state);
5300
5301         mutex_lock(&wl->mutex);
5302
5303         if (unlikely(wl->state != WLCORE_STATE_ON)) {
5304                 ret = -EBUSY;
5305                 goto out;
5306         }
5307
5308         ret = pm_runtime_get_sync(wl->dev);
5309         if (ret < 0) {
5310                 pm_runtime_put_noidle(wl->dev);
5311                 goto out;
5312         }
5313
5314         ret = wl12xx_update_sta_state(wl, wlvif, sta, old_state, new_state);
5315
5316         pm_runtime_mark_last_busy(wl->dev);
5317         pm_runtime_put_autosuspend(wl->dev);
5318 out:
5319         mutex_unlock(&wl->mutex);
5320         if (new_state < old_state)
5321                 return 0;
5322         return ret;
5323 }
5324
5325 static int wl1271_op_ampdu_action(struct ieee80211_hw *hw,
5326                                   struct ieee80211_vif *vif,
5327                                   struct ieee80211_ampdu_params *params)
5328 {
5329         struct wl1271 *wl = hw->priv;
5330         struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
5331         int ret;
5332         u8 hlid, *ba_bitmap;
5333         struct ieee80211_sta *sta = params->sta;
5334         enum ieee80211_ampdu_mlme_action action = params->action;
5335         u16 tid = params->tid;
5336         u16 *ssn = &params->ssn;
5337
5338         wl1271_debug(DEBUG_MAC80211, "mac80211 ampdu action %d tid %d", action,
5339                      tid);
5340
5341         /* sanity check - the fields in FW are only 8bits wide */
5342         if (WARN_ON(tid > 0xFF))
5343                 return -ENOTSUPP;
5344
5345         mutex_lock(&wl->mutex);
5346
5347         if (unlikely(wl->state != WLCORE_STATE_ON)) {
5348                 ret = -EAGAIN;
5349                 goto out;
5350         }
5351
5352         if (wlvif->bss_type == BSS_TYPE_STA_BSS) {
5353                 hlid = wlvif->sta.hlid;
5354         } else if (wlvif->bss_type == BSS_TYPE_AP_BSS) {
5355                 struct wl1271_station *wl_sta;
5356
5357                 wl_sta = (struct wl1271_station *)sta->drv_priv;
5358                 hlid = wl_sta->hlid;
5359         } else {
5360                 ret = -EINVAL;
5361                 goto out;
5362         }
5363
5364         ba_bitmap = &wl->links[hlid].ba_bitmap;
5365
5366         ret = pm_runtime_get_sync(wl->dev);
5367         if (ret < 0) {
5368                 pm_runtime_put_noidle(wl->dev);
5369                 goto out;
5370         }
5371
5372         wl1271_debug(DEBUG_MAC80211, "mac80211 ampdu: Rx tid %d action %d",
5373                      tid, action);
5374
5375         switch (action) {
5376         case IEEE80211_AMPDU_RX_START:
5377                 if (!wlvif->ba_support || !wlvif->ba_allowed) {
5378                         ret = -ENOTSUPP;
5379                         break;
5380                 }
5381
5382                 if (wl->ba_rx_session_count >= wl->ba_rx_session_count_max) {
5383                         ret = -EBUSY;
5384                         wl1271_debug(DEBUG_RX, "exceeded max RX BA sessions");
5385                         break;
5386                 }
5387
5388                 if (*ba_bitmap & BIT(tid)) {
5389                         ret = -EINVAL;
5390                         wl1271_error("cannot enable RX BA session on active "
5391                                      "tid: %d", tid);
5392                         break;
5393                 }
5394
5395                 ret = wl12xx_acx_set_ba_receiver_session(wl, tid, *ssn, true,
5396                                 hlid,
5397                                 params->buf_size);
5398
5399                 if (!ret) {
5400                         *ba_bitmap |= BIT(tid);
5401                         wl->ba_rx_session_count++;
5402                 }
5403                 break;
5404
5405         case IEEE80211_AMPDU_RX_STOP:
5406                 if (!(*ba_bitmap & BIT(tid))) {
5407                         /*
5408                          * this happens on reconfig - so only output a debug
5409                          * message for now, and don't fail the function.
5410                          */
5411                         wl1271_debug(DEBUG_MAC80211,
5412                                      "no active RX BA session on tid: %d",
5413                                      tid);
5414                         ret = 0;
5415                         break;
5416                 }
5417
5418                 ret = wl12xx_acx_set_ba_receiver_session(wl, tid, 0, false,
5419                                                          hlid, 0);
5420                 if (!ret) {
5421                         *ba_bitmap &= ~BIT(tid);
5422                         wl->ba_rx_session_count--;
5423                 }
5424                 break;
5425
5426         /*
5427          * The BA initiator session management in FW independently.
5428          * Falling break here on purpose for all TX APDU commands.
5429          */
5430         case IEEE80211_AMPDU_TX_START:
5431         case IEEE80211_AMPDU_TX_STOP_CONT:
5432         case IEEE80211_AMPDU_TX_STOP_FLUSH:
5433         case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
5434         case IEEE80211_AMPDU_TX_OPERATIONAL:
5435                 ret = -EINVAL;
5436                 break;
5437
5438         default:
5439                 wl1271_error("Incorrect ampdu action id=%x\n", action);
5440                 ret = -EINVAL;
5441         }
5442
5443         pm_runtime_mark_last_busy(wl->dev);
5444         pm_runtime_put_autosuspend(wl->dev);
5445
5446 out:
5447         mutex_unlock(&wl->mutex);
5448
5449         return ret;
5450 }
5451
5452 static int wl12xx_set_bitrate_mask(struct ieee80211_hw *hw,
5453                                    struct ieee80211_vif *vif,
5454                                    const struct cfg80211_bitrate_mask *mask)
5455 {
5456         struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
5457         struct wl1271 *wl = hw->priv;
5458         int i, ret = 0;
5459
5460         wl1271_debug(DEBUG_MAC80211, "mac80211 set_bitrate_mask 0x%x 0x%x",
5461                 mask->control[NL80211_BAND_2GHZ].legacy,
5462                 mask->control[NL80211_BAND_5GHZ].legacy);
5463
5464         mutex_lock(&wl->mutex);
5465
5466         for (i = 0; i < WLCORE_NUM_BANDS; i++)
5467                 wlvif->bitrate_masks[i] =
5468                         wl1271_tx_enabled_rates_get(wl,
5469                                                     mask->control[i].legacy,
5470                                                     i);
5471
5472         if (unlikely(wl->state != WLCORE_STATE_ON))
5473                 goto out;
5474
5475         if (wlvif->bss_type == BSS_TYPE_STA_BSS &&
5476             !test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags)) {
5477
5478                 ret = pm_runtime_get_sync(wl->dev);
5479                 if (ret < 0) {
5480                         pm_runtime_put_noidle(wl->dev);
5481                         goto out;
5482                 }
5483
5484                 wl1271_set_band_rate(wl, wlvif);
5485                 wlvif->basic_rate =
5486                         wl1271_tx_min_rate_get(wl, wlvif->basic_rate_set);
5487                 ret = wl1271_acx_sta_rate_policies(wl, wlvif);
5488
5489                 pm_runtime_mark_last_busy(wl->dev);
5490                 pm_runtime_put_autosuspend(wl->dev);
5491         }
5492 out:
5493         mutex_unlock(&wl->mutex);
5494
5495         return ret;
5496 }
5497
5498 static void wl12xx_op_channel_switch(struct ieee80211_hw *hw,
5499                                      struct ieee80211_vif *vif,
5500                                      struct ieee80211_channel_switch *ch_switch)
5501 {
5502         struct wl1271 *wl = hw->priv;
5503         struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
5504         int ret;
5505
5506         wl1271_debug(DEBUG_MAC80211, "mac80211 channel switch");
5507
5508         wl1271_tx_flush(wl);
5509
5510         mutex_lock(&wl->mutex);
5511
5512         if (unlikely(wl->state == WLCORE_STATE_OFF)) {
5513                 if (test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags))
5514                         ieee80211_chswitch_done(vif, false);
5515                 goto out;
5516         } else if (unlikely(wl->state != WLCORE_STATE_ON)) {
5517                 goto out;
5518         }
5519
5520         ret = pm_runtime_get_sync(wl->dev);
5521         if (ret < 0) {
5522                 pm_runtime_put_noidle(wl->dev);
5523                 goto out;
5524         }
5525
5526         /* TODO: change mac80211 to pass vif as param */
5527
5528         if (test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags)) {
5529                 unsigned long delay_usec;
5530
5531                 ret = wl->ops->channel_switch(wl, wlvif, ch_switch);
5532                 if (ret)
5533                         goto out_sleep;
5534
5535                 set_bit(WLVIF_FLAG_CS_PROGRESS, &wlvif->flags);
5536
5537                 /* indicate failure 5 seconds after channel switch time */
5538                 delay_usec = ieee80211_tu_to_usec(wlvif->beacon_int) *
5539                         ch_switch->count;
5540                 ieee80211_queue_delayed_work(hw, &wlvif->channel_switch_work,
5541                                              usecs_to_jiffies(delay_usec) +
5542                                              msecs_to_jiffies(5000));
5543         }
5544
5545 out_sleep:
5546         pm_runtime_mark_last_busy(wl->dev);
5547         pm_runtime_put_autosuspend(wl->dev);
5548
5549 out:
5550         mutex_unlock(&wl->mutex);
5551 }
5552
5553 static const void *wlcore_get_beacon_ie(struct wl1271 *wl,
5554                                         struct wl12xx_vif *wlvif,
5555                                         u8 eid)
5556 {
5557         int ieoffset = offsetof(struct ieee80211_mgmt, u.beacon.variable);
5558         struct sk_buff *beacon =
5559                 ieee80211_beacon_get(wl->hw, wl12xx_wlvif_to_vif(wlvif));
5560
5561         if (!beacon)
5562                 return NULL;
5563
5564         return cfg80211_find_ie(eid,
5565                                 beacon->data + ieoffset,
5566                                 beacon->len - ieoffset);
5567 }
5568
5569 static int wlcore_get_csa_count(struct wl1271 *wl, struct wl12xx_vif *wlvif,
5570                                 u8 *csa_count)
5571 {
5572         const u8 *ie;
5573         const struct ieee80211_channel_sw_ie *ie_csa;
5574
5575         ie = wlcore_get_beacon_ie(wl, wlvif, WLAN_EID_CHANNEL_SWITCH);
5576         if (!ie)
5577                 return -EINVAL;
5578
5579         ie_csa = (struct ieee80211_channel_sw_ie *)&ie[2];
5580         *csa_count = ie_csa->count;
5581
5582         return 0;
5583 }
5584
5585 static void wlcore_op_channel_switch_beacon(struct ieee80211_hw *hw,
5586                                             struct ieee80211_vif *vif,
5587                                             struct cfg80211_chan_def *chandef)
5588 {
5589         struct wl1271 *wl = hw->priv;
5590         struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
5591         struct ieee80211_channel_switch ch_switch = {
5592                 .block_tx = true,
5593                 .chandef = *chandef,
5594         };
5595         int ret;
5596
5597         wl1271_debug(DEBUG_MAC80211,
5598                      "mac80211 channel switch beacon (role %d)",
5599                      wlvif->role_id);
5600
5601         ret = wlcore_get_csa_count(wl, wlvif, &ch_switch.count);
5602         if (ret < 0) {
5603                 wl1271_error("error getting beacon (for CSA counter)");
5604                 return;
5605         }
5606
5607         mutex_lock(&wl->mutex);
5608
5609         if (unlikely(wl->state != WLCORE_STATE_ON)) {
5610                 ret = -EBUSY;
5611                 goto out;
5612         }
5613
5614         ret = pm_runtime_get_sync(wl->dev);
5615         if (ret < 0) {
5616                 pm_runtime_put_noidle(wl->dev);
5617                 goto out;
5618         }
5619
5620         ret = wl->ops->channel_switch(wl, wlvif, &ch_switch);
5621         if (ret)
5622                 goto out_sleep;
5623
5624         set_bit(WLVIF_FLAG_CS_PROGRESS, &wlvif->flags);
5625
5626 out_sleep:
5627         pm_runtime_mark_last_busy(wl->dev);
5628         pm_runtime_put_autosuspend(wl->dev);
5629 out:
5630         mutex_unlock(&wl->mutex);
5631 }
5632
5633 static void wlcore_op_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
5634                             u32 queues, bool drop)
5635 {
5636         struct wl1271 *wl = hw->priv;
5637
5638         wl1271_tx_flush(wl);
5639 }
5640
5641 static int wlcore_op_remain_on_channel(struct ieee80211_hw *hw,
5642                                        struct ieee80211_vif *vif,
5643                                        struct ieee80211_channel *chan,
5644                                        int duration,
5645                                        enum ieee80211_roc_type type)
5646 {
5647         struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
5648         struct wl1271 *wl = hw->priv;
5649         int channel, active_roc, ret = 0;
5650
5651         channel = ieee80211_frequency_to_channel(chan->center_freq);
5652
5653         wl1271_debug(DEBUG_MAC80211, "mac80211 roc %d (%d)",
5654                      channel, wlvif->role_id);
5655
5656         mutex_lock(&wl->mutex);
5657
5658         if (unlikely(wl->state != WLCORE_STATE_ON))
5659                 goto out;
5660
5661         /* return EBUSY if we can't ROC right now */
5662         active_roc = find_first_bit(wl->roc_map, WL12XX_MAX_ROLES);
5663         if (wl->roc_vif || active_roc < WL12XX_MAX_ROLES) {
5664                 wl1271_warning("active roc on role %d", active_roc);
5665                 ret = -EBUSY;
5666                 goto out;
5667         }
5668
5669         ret = pm_runtime_get_sync(wl->dev);
5670         if (ret < 0) {
5671                 pm_runtime_put_noidle(wl->dev);
5672                 goto out;
5673         }
5674
5675         ret = wl12xx_start_dev(wl, wlvif, chan->band, channel);
5676         if (ret < 0)
5677                 goto out_sleep;
5678
5679         wl->roc_vif = vif;
5680         ieee80211_queue_delayed_work(hw, &wl->roc_complete_work,
5681                                      msecs_to_jiffies(duration));
5682 out_sleep:
5683         pm_runtime_mark_last_busy(wl->dev);
5684         pm_runtime_put_autosuspend(wl->dev);
5685 out:
5686         mutex_unlock(&wl->mutex);
5687         return ret;
5688 }
5689
5690 static int __wlcore_roc_completed(struct wl1271 *wl)
5691 {
5692         struct wl12xx_vif *wlvif;
5693         int ret;
5694
5695         /* already completed */
5696         if (unlikely(!wl->roc_vif))
5697                 return 0;
5698
5699         wlvif = wl12xx_vif_to_data(wl->roc_vif);
5700
5701         if (!test_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags))
5702                 return -EBUSY;
5703
5704         ret = wl12xx_stop_dev(wl, wlvif);
5705         if (ret < 0)
5706                 return ret;
5707
5708         wl->roc_vif = NULL;
5709
5710         return 0;
5711 }
5712
5713 static int wlcore_roc_completed(struct wl1271 *wl)
5714 {
5715         int ret;
5716
5717         wl1271_debug(DEBUG_MAC80211, "roc complete");
5718
5719         mutex_lock(&wl->mutex);
5720
5721         if (unlikely(wl->state != WLCORE_STATE_ON)) {
5722                 ret = -EBUSY;
5723                 goto out;
5724         }
5725
5726         ret = pm_runtime_get_sync(wl->dev);
5727         if (ret < 0) {
5728                 pm_runtime_put_noidle(wl->dev);
5729                 goto out;
5730         }
5731
5732         ret = __wlcore_roc_completed(wl);
5733
5734         pm_runtime_mark_last_busy(wl->dev);
5735         pm_runtime_put_autosuspend(wl->dev);
5736 out:
5737         mutex_unlock(&wl->mutex);
5738
5739         return ret;
5740 }
5741
5742 static void wlcore_roc_complete_work(struct work_struct *work)
5743 {
5744         struct delayed_work *dwork;
5745         struct wl1271 *wl;
5746         int ret;
5747
5748         dwork = to_delayed_work(work);
5749         wl = container_of(dwork, struct wl1271, roc_complete_work);
5750
5751         ret = wlcore_roc_completed(wl);
5752         if (!ret)
5753                 ieee80211_remain_on_channel_expired(wl->hw);
5754 }
5755
5756 static int wlcore_op_cancel_remain_on_channel(struct ieee80211_hw *hw,
5757                                               struct ieee80211_vif *vif)
5758 {
5759         struct wl1271 *wl = hw->priv;
5760
5761         wl1271_debug(DEBUG_MAC80211, "mac80211 croc");
5762
5763         /* TODO: per-vif */
5764         wl1271_tx_flush(wl);
5765
5766         /*
5767          * we can't just flush_work here, because it might deadlock
5768          * (as we might get called from the same workqueue)
5769          */
5770         cancel_delayed_work_sync(&wl->roc_complete_work);
5771         wlcore_roc_completed(wl);
5772
5773         return 0;
5774 }
5775
5776 static void wlcore_op_sta_rc_update(struct ieee80211_hw *hw,
5777                                     struct ieee80211_vif *vif,
5778                                     struct ieee80211_sta *sta,
5779                                     u32 changed)
5780 {
5781         struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
5782
5783         wl1271_debug(DEBUG_MAC80211, "mac80211 sta_rc_update");
5784
5785         if (!(changed & IEEE80211_RC_BW_CHANGED))
5786                 return;
5787
5788         /* this callback is atomic, so schedule a new work */
5789         wlvif->rc_update_bw = sta->bandwidth;
5790         memcpy(&wlvif->rc_ht_cap, &sta->ht_cap, sizeof(sta->ht_cap));
5791         ieee80211_queue_work(hw, &wlvif->rc_update_work);
5792 }
5793
5794 static void wlcore_op_sta_statistics(struct ieee80211_hw *hw,
5795                                      struct ieee80211_vif *vif,
5796                                      struct ieee80211_sta *sta,
5797                                      struct station_info *sinfo)
5798 {
5799         struct wl1271 *wl = hw->priv;
5800         struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
5801         s8 rssi_dbm;
5802         int ret;
5803
5804         wl1271_debug(DEBUG_MAC80211, "mac80211 get_rssi");
5805
5806         mutex_lock(&wl->mutex);
5807
5808         if (unlikely(wl->state != WLCORE_STATE_ON))
5809                 goto out;
5810
5811         ret = pm_runtime_get_sync(wl->dev);
5812         if (ret < 0) {
5813                 pm_runtime_put_noidle(wl->dev);
5814                 goto out_sleep;
5815         }
5816
5817         ret = wlcore_acx_average_rssi(wl, wlvif, &rssi_dbm);
5818         if (ret < 0)
5819                 goto out_sleep;
5820
5821         sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
5822         sinfo->signal = rssi_dbm;
5823
5824 out_sleep:
5825         pm_runtime_mark_last_busy(wl->dev);
5826         pm_runtime_put_autosuspend(wl->dev);
5827
5828 out:
5829         mutex_unlock(&wl->mutex);
5830 }
5831
5832 static u32 wlcore_op_get_expected_throughput(struct ieee80211_hw *hw,
5833                                              struct ieee80211_sta *sta)
5834 {
5835         struct wl1271_station *wl_sta = (struct wl1271_station *)sta->drv_priv;
5836         struct wl1271 *wl = hw->priv;
5837         u8 hlid = wl_sta->hlid;
5838
5839         /* return in units of Kbps */
5840         return (wl->links[hlid].fw_rate_mbps * 1000);
5841 }
5842
5843 static bool wl1271_tx_frames_pending(struct ieee80211_hw *hw)
5844 {
5845         struct wl1271 *wl = hw->priv;
5846         bool ret = false;
5847
5848         mutex_lock(&wl->mutex);
5849
5850         if (unlikely(wl->state != WLCORE_STATE_ON))
5851                 goto out;
5852
5853         /* packets are considered pending if in the TX queue or the FW */
5854         ret = (wl1271_tx_total_queue_count(wl) > 0) || (wl->tx_frames_cnt > 0);
5855 out:
5856         mutex_unlock(&wl->mutex);
5857
5858         return ret;
5859 }
5860
5861 /* can't be const, mac80211 writes to this */
5862 static struct ieee80211_rate wl1271_rates[] = {
5863         { .bitrate = 10,
5864           .hw_value = CONF_HW_BIT_RATE_1MBPS,
5865           .hw_value_short = CONF_HW_BIT_RATE_1MBPS, },
5866         { .bitrate = 20,
5867           .hw_value = CONF_HW_BIT_RATE_2MBPS,
5868           .hw_value_short = CONF_HW_BIT_RATE_2MBPS,
5869           .flags = IEEE80211_RATE_SHORT_PREAMBLE },
5870         { .bitrate = 55,
5871           .hw_value = CONF_HW_BIT_RATE_5_5MBPS,
5872           .hw_value_short = CONF_HW_BIT_RATE_5_5MBPS,
5873           .flags = IEEE80211_RATE_SHORT_PREAMBLE },
5874         { .bitrate = 110,
5875           .hw_value = CONF_HW_BIT_RATE_11MBPS,
5876           .hw_value_short = CONF_HW_BIT_RATE_11MBPS,
5877           .flags = IEEE80211_RATE_SHORT_PREAMBLE },
5878         { .bitrate = 60,
5879           .hw_value = CONF_HW_BIT_RATE_6MBPS,
5880           .hw_value_short = CONF_HW_BIT_RATE_6MBPS, },
5881         { .bitrate = 90,
5882           .hw_value = CONF_HW_BIT_RATE_9MBPS,
5883           .hw_value_short = CONF_HW_BIT_RATE_9MBPS, },
5884         { .bitrate = 120,
5885           .hw_value = CONF_HW_BIT_RATE_12MBPS,
5886           .hw_value_short = CONF_HW_BIT_RATE_12MBPS, },
5887         { .bitrate = 180,
5888           .hw_value = CONF_HW_BIT_RATE_18MBPS,
5889           .hw_value_short = CONF_HW_BIT_RATE_18MBPS, },
5890         { .bitrate = 240,
5891           .hw_value = CONF_HW_BIT_RATE_24MBPS,
5892           .hw_value_short = CONF_HW_BIT_RATE_24MBPS, },
5893         { .bitrate = 360,
5894          .hw_value = CONF_HW_BIT_RATE_36MBPS,
5895          .hw_value_short = CONF_HW_BIT_RATE_36MBPS, },
5896         { .bitrate = 480,
5897           .hw_value = CONF_HW_BIT_RATE_48MBPS,
5898           .hw_value_short = CONF_HW_BIT_RATE_48MBPS, },
5899         { .bitrate = 540,
5900           .hw_value = CONF_HW_BIT_RATE_54MBPS,
5901           .hw_value_short = CONF_HW_BIT_RATE_54MBPS, },
5902 };
5903
5904 /* can't be const, mac80211 writes to this */
5905 static struct ieee80211_channel wl1271_channels[] = {
5906         { .hw_value = 1, .center_freq = 2412, .max_power = WLCORE_MAX_TXPWR },
5907         { .hw_value = 2, .center_freq = 2417, .max_power = WLCORE_MAX_TXPWR },
5908         { .hw_value = 3, .center_freq = 2422, .max_power = WLCORE_MAX_TXPWR },
5909         { .hw_value = 4, .center_freq = 2427, .max_power = WLCORE_MAX_TXPWR },
5910         { .hw_value = 5, .center_freq = 2432, .max_power = WLCORE_MAX_TXPWR },
5911         { .hw_value = 6, .center_freq = 2437, .max_power = WLCORE_MAX_TXPWR },
5912         { .hw_value = 7, .center_freq = 2442, .max_power = WLCORE_MAX_TXPWR },
5913         { .hw_value = 8, .center_freq = 2447, .max_power = WLCORE_MAX_TXPWR },
5914         { .hw_value = 9, .center_freq = 2452, .max_power = WLCORE_MAX_TXPWR },
5915         { .hw_value = 10, .center_freq = 2457, .max_power = WLCORE_MAX_TXPWR },
5916         { .hw_value = 11, .center_freq = 2462, .max_power = WLCORE_MAX_TXPWR },
5917         { .hw_value = 12, .center_freq = 2467, .max_power = WLCORE_MAX_TXPWR },
5918         { .hw_value = 13, .center_freq = 2472, .max_power = WLCORE_MAX_TXPWR },
5919         { .hw_value = 14, .center_freq = 2484, .max_power = WLCORE_MAX_TXPWR },
5920 };
5921
5922 /* can't be const, mac80211 writes to this */
5923 static struct ieee80211_supported_band wl1271_band_2ghz = {
5924         .channels = wl1271_channels,
5925         .n_channels = ARRAY_SIZE(wl1271_channels),
5926         .bitrates = wl1271_rates,
5927         .n_bitrates = ARRAY_SIZE(wl1271_rates),
5928 };
5929
5930 /* 5 GHz data rates for WL1273 */
5931 static struct ieee80211_rate wl1271_rates_5ghz[] = {
5932         { .bitrate = 60,
5933           .hw_value = CONF_HW_BIT_RATE_6MBPS,
5934           .hw_value_short = CONF_HW_BIT_RATE_6MBPS, },
5935         { .bitrate = 90,
5936           .hw_value = CONF_HW_BIT_RATE_9MBPS,
5937           .hw_value_short = CONF_HW_BIT_RATE_9MBPS, },
5938         { .bitrate = 120,
5939           .hw_value = CONF_HW_BIT_RATE_12MBPS,
5940           .hw_value_short = CONF_HW_BIT_RATE_12MBPS, },
5941         { .bitrate = 180,
5942           .hw_value = CONF_HW_BIT_RATE_18MBPS,
5943           .hw_value_short = CONF_HW_BIT_RATE_18MBPS, },
5944         { .bitrate = 240,
5945           .hw_value = CONF_HW_BIT_RATE_24MBPS,
5946           .hw_value_short = CONF_HW_BIT_RATE_24MBPS, },
5947         { .bitrate = 360,
5948          .hw_value = CONF_HW_BIT_RATE_36MBPS,
5949          .hw_value_short = CONF_HW_BIT_RATE_36MBPS, },
5950         { .bitrate = 480,
5951           .hw_value = CONF_HW_BIT_RATE_48MBPS,
5952           .hw_value_short = CONF_HW_BIT_RATE_48MBPS, },
5953         { .bitrate = 540,
5954           .hw_value = CONF_HW_BIT_RATE_54MBPS,
5955           .hw_value_short = CONF_HW_BIT_RATE_54MBPS, },
5956 };
5957
5958 /* 5 GHz band channels for WL1273 */
5959 static struct ieee80211_channel wl1271_channels_5ghz[] = {
5960         { .hw_value = 8, .center_freq = 5040, .max_power = WLCORE_MAX_TXPWR },
5961         { .hw_value = 12, .center_freq = 5060, .max_power = WLCORE_MAX_TXPWR },
5962         { .hw_value = 16, .center_freq = 5080, .max_power = WLCORE_MAX_TXPWR },
5963         { .hw_value = 34, .center_freq = 5170, .max_power = WLCORE_MAX_TXPWR },
5964         { .hw_value = 36, .center_freq = 5180, .max_power = WLCORE_MAX_TXPWR },
5965         { .hw_value = 38, .center_freq = 5190, .max_power = WLCORE_MAX_TXPWR },
5966         { .hw_value = 40, .center_freq = 5200, .max_power = WLCORE_MAX_TXPWR },
5967         { .hw_value = 42, .center_freq = 5210, .max_power = WLCORE_MAX_TXPWR },
5968         { .hw_value = 44, .center_freq = 5220, .max_power = WLCORE_MAX_TXPWR },
5969         { .hw_value = 46, .center_freq = 5230, .max_power = WLCORE_MAX_TXPWR },
5970         { .hw_value = 48, .center_freq = 5240, .max_power = WLCORE_MAX_TXPWR },
5971         { .hw_value = 52, .center_freq = 5260, .max_power = WLCORE_MAX_TXPWR },
5972         { .hw_value = 56, .center_freq = 5280, .max_power = WLCORE_MAX_TXPWR },
5973         { .hw_value = 60, .center_freq = 5300, .max_power = WLCORE_MAX_TXPWR },
5974         { .hw_value = 64, .center_freq = 5320, .max_power = WLCORE_MAX_TXPWR },
5975         { .hw_value = 100, .center_freq = 5500, .max_power = WLCORE_MAX_TXPWR },
5976         { .hw_value = 104, .center_freq = 5520, .max_power = WLCORE_MAX_TXPWR },
5977         { .hw_value = 108, .center_freq = 5540, .max_power = WLCORE_MAX_TXPWR },
5978         { .hw_value = 112, .center_freq = 5560, .max_power = WLCORE_MAX_TXPWR },
5979         { .hw_value = 116, .center_freq = 5580, .max_power = WLCORE_MAX_TXPWR },
5980         { .hw_value = 120, .center_freq = 5600, .max_power = WLCORE_MAX_TXPWR },
5981         { .hw_value = 124, .center_freq = 5620, .max_power = WLCORE_MAX_TXPWR },
5982         { .hw_value = 128, .center_freq = 5640, .max_power = WLCORE_MAX_TXPWR },
5983         { .hw_value = 132, .center_freq = 5660, .max_power = WLCORE_MAX_TXPWR },
5984         { .hw_value = 136, .center_freq = 5680, .max_power = WLCORE_MAX_TXPWR },
5985         { .hw_value = 140, .center_freq = 5700, .max_power = WLCORE_MAX_TXPWR },
5986         { .hw_value = 149, .center_freq = 5745, .max_power = WLCORE_MAX_TXPWR },
5987         { .hw_value = 153, .center_freq = 5765, .max_power = WLCORE_MAX_TXPWR },
5988         { .hw_value = 157, .center_freq = 5785, .max_power = WLCORE_MAX_TXPWR },
5989         { .hw_value = 161, .center_freq = 5805, .max_power = WLCORE_MAX_TXPWR },
5990         { .hw_value = 165, .center_freq = 5825, .max_power = WLCORE_MAX_TXPWR },
5991 };
5992
5993 static struct ieee80211_supported_band wl1271_band_5ghz = {
5994         .channels = wl1271_channels_5ghz,
5995         .n_channels = ARRAY_SIZE(wl1271_channels_5ghz),
5996         .bitrates = wl1271_rates_5ghz,
5997         .n_bitrates = ARRAY_SIZE(wl1271_rates_5ghz),
5998 };
5999
6000 static const struct ieee80211_ops wl1271_ops = {
6001         .start = wl1271_op_start,
6002         .stop = wlcore_op_stop,
6003         .add_interface = wl1271_op_add_interface,
6004         .remove_interface = wl1271_op_remove_interface,
6005         .change_interface = wl12xx_op_change_interface,
6006 #ifdef CONFIG_PM
6007         .suspend = wl1271_op_suspend,
6008         .resume = wl1271_op_resume,
6009 #endif
6010         .config = wl1271_op_config,
6011         .prepare_multicast = wl1271_op_prepare_multicast,
6012         .configure_filter = wl1271_op_configure_filter,
6013         .tx = wl1271_op_tx,
6014         .set_key = wlcore_op_set_key,
6015         .hw_scan = wl1271_op_hw_scan,
6016         .cancel_hw_scan = wl1271_op_cancel_hw_scan,
6017         .sched_scan_start = wl1271_op_sched_scan_start,
6018         .sched_scan_stop = wl1271_op_sched_scan_stop,
6019         .bss_info_changed = wl1271_op_bss_info_changed,
6020         .set_frag_threshold = wl1271_op_set_frag_threshold,
6021         .set_rts_threshold = wl1271_op_set_rts_threshold,
6022         .conf_tx = wl1271_op_conf_tx,
6023         .get_tsf = wl1271_op_get_tsf,
6024         .get_survey = wl1271_op_get_survey,
6025         .sta_state = wl12xx_op_sta_state,
6026         .ampdu_action = wl1271_op_ampdu_action,
6027         .tx_frames_pending = wl1271_tx_frames_pending,
6028         .set_bitrate_mask = wl12xx_set_bitrate_mask,
6029         .set_default_unicast_key = wl1271_op_set_default_key_idx,
6030         .channel_switch = wl12xx_op_channel_switch,
6031         .channel_switch_beacon = wlcore_op_channel_switch_beacon,
6032         .flush = wlcore_op_flush,
6033         .remain_on_channel = wlcore_op_remain_on_channel,
6034         .cancel_remain_on_channel = wlcore_op_cancel_remain_on_channel,
6035         .add_chanctx = wlcore_op_add_chanctx,
6036         .remove_chanctx = wlcore_op_remove_chanctx,
6037         .change_chanctx = wlcore_op_change_chanctx,
6038         .assign_vif_chanctx = wlcore_op_assign_vif_chanctx,
6039         .unassign_vif_chanctx = wlcore_op_unassign_vif_chanctx,
6040         .switch_vif_chanctx = wlcore_op_switch_vif_chanctx,
6041         .sta_rc_update = wlcore_op_sta_rc_update,
6042         .sta_statistics = wlcore_op_sta_statistics,
6043         .get_expected_throughput = wlcore_op_get_expected_throughput,
6044         CFG80211_TESTMODE_CMD(wl1271_tm_cmd)
6045 };
6046
6047
6048 u8 wlcore_rate_to_idx(struct wl1271 *wl, u8 rate, enum nl80211_band band)
6049 {
6050         u8 idx;
6051
6052         BUG_ON(band >= 2);
6053
6054         if (unlikely(rate >= wl->hw_tx_rate_tbl_size)) {
6055                 wl1271_error("Illegal RX rate from HW: %d", rate);
6056                 return 0;
6057         }
6058
6059         idx = wl->band_rate_to_idx[band][rate];
6060         if (unlikely(idx == CONF_HW_RXTX_RATE_UNSUPPORTED)) {
6061                 wl1271_error("Unsupported RX rate from HW: %d", rate);
6062                 return 0;
6063         }
6064
6065         return idx;
6066 }
6067
6068 static void wl12xx_derive_mac_addresses(struct wl1271 *wl, u32 oui, u32 nic)
6069 {
6070         int i;
6071
6072         wl1271_debug(DEBUG_PROBE, "base address: oui %06x nic %06x",
6073                      oui, nic);
6074
6075         if (nic + WLCORE_NUM_MAC_ADDRESSES - wl->num_mac_addr > 0xffffff)
6076                 wl1271_warning("NIC part of the MAC address wraps around!");
6077
6078         for (i = 0; i < wl->num_mac_addr; i++) {
6079                 wl->addresses[i].addr[0] = (u8)(oui >> 16);
6080                 wl->addresses[i].addr[1] = (u8)(oui >> 8);
6081                 wl->addresses[i].addr[2] = (u8) oui;
6082                 wl->addresses[i].addr[3] = (u8)(nic >> 16);
6083                 wl->addresses[i].addr[4] = (u8)(nic >> 8);
6084                 wl->addresses[i].addr[5] = (u8) nic;
6085                 nic++;
6086         }
6087
6088         /* we may be one address short at the most */
6089         WARN_ON(wl->num_mac_addr + 1 < WLCORE_NUM_MAC_ADDRESSES);
6090
6091         /*
6092          * turn on the LAA bit in the first address and use it as
6093          * the last address.
6094          */
6095         if (wl->num_mac_addr < WLCORE_NUM_MAC_ADDRESSES) {
6096                 int idx = WLCORE_NUM_MAC_ADDRESSES - 1;
6097                 memcpy(&wl->addresses[idx], &wl->addresses[0],
6098                        sizeof(wl->addresses[0]));
6099                 /* LAA bit */
6100                 wl->addresses[idx].addr[0] |= BIT(1);
6101         }
6102
6103         wl->hw->wiphy->n_addresses = WLCORE_NUM_MAC_ADDRESSES;
6104         wl->hw->wiphy->addresses = wl->addresses;
6105 }
6106
6107 static int wl12xx_get_hw_info(struct wl1271 *wl)
6108 {
6109         int ret;
6110
6111         ret = wlcore_read_reg(wl, REG_CHIP_ID_B, &wl->chip.id);
6112         if (ret < 0)
6113                 goto out;
6114
6115         wl->fuse_oui_addr = 0;
6116         wl->fuse_nic_addr = 0;
6117
6118         ret = wl->ops->get_pg_ver(wl, &wl->hw_pg_ver);
6119         if (ret < 0)
6120                 goto out;
6121
6122         if (wl->ops->get_mac)
6123                 ret = wl->ops->get_mac(wl);
6124
6125 out:
6126         return ret;
6127 }
6128
6129 static int wl1271_register_hw(struct wl1271 *wl)
6130 {
6131         int ret;
6132         u32 oui_addr = 0, nic_addr = 0;
6133         struct platform_device *pdev = wl->pdev;
6134         struct wlcore_platdev_data *pdev_data = dev_get_platdata(&pdev->dev);
6135
6136         if (wl->mac80211_registered)
6137                 return 0;
6138
6139         if (wl->nvs_len >= 12) {
6140                 /* NOTE: The wl->nvs->nvs element must be first, in
6141                  * order to simplify the casting, we assume it is at
6142                  * the beginning of the wl->nvs structure.
6143                  */
6144                 u8 *nvs_ptr = (u8 *)wl->nvs;
6145
6146                 oui_addr =
6147                         (nvs_ptr[11] << 16) + (nvs_ptr[10] << 8) + nvs_ptr[6];
6148                 nic_addr =
6149                         (nvs_ptr[5] << 16) + (nvs_ptr[4] << 8) + nvs_ptr[3];
6150         }
6151
6152         /* if the MAC address is zeroed in the NVS derive from fuse */
6153         if (oui_addr == 0 && nic_addr == 0) {
6154                 oui_addr = wl->fuse_oui_addr;
6155                 /* fuse has the BD_ADDR, the WLAN addresses are the next two */
6156                 nic_addr = wl->fuse_nic_addr + 1;
6157         }
6158
6159         if (oui_addr == 0xdeadbe && nic_addr == 0xef0000) {
6160                 wl1271_warning("Detected unconfigured mac address in nvs, derive from fuse instead.");
6161                 if (!strcmp(pdev_data->family->name, "wl18xx")) {
6162                         wl1271_warning("This default nvs file can be removed from the file system");
6163                 } else {
6164                         wl1271_warning("Your device performance is not optimized.");
6165                         wl1271_warning("Please use the calibrator tool to configure your device.");
6166                 }
6167
6168                 if (wl->fuse_oui_addr == 0 && wl->fuse_nic_addr == 0) {
6169                         wl1271_warning("Fuse mac address is zero. using random mac");
6170                         /* Use TI oui and a random nic */
6171                         oui_addr = WLCORE_TI_OUI_ADDRESS;
6172                         nic_addr = get_random_int();
6173                 } else {
6174                         oui_addr = wl->fuse_oui_addr;
6175                         /* fuse has the BD_ADDR, the WLAN addresses are the next two */
6176                         nic_addr = wl->fuse_nic_addr + 1;
6177                 }
6178         }
6179
6180         wl12xx_derive_mac_addresses(wl, oui_addr, nic_addr);
6181
6182         ret = ieee80211_register_hw(wl->hw);
6183         if (ret < 0) {
6184                 wl1271_error("unable to register mac80211 hw: %d", ret);
6185                 goto out;
6186         }
6187
6188         wl->mac80211_registered = true;
6189
6190         wl1271_debugfs_init(wl);
6191
6192         wl1271_notice("loaded");
6193
6194 out:
6195         return ret;
6196 }
6197
6198 static void wl1271_unregister_hw(struct wl1271 *wl)
6199 {
6200         if (wl->plt)
6201                 wl1271_plt_stop(wl);
6202
6203         ieee80211_unregister_hw(wl->hw);
6204         wl->mac80211_registered = false;
6205
6206 }
6207
6208 static int wl1271_init_ieee80211(struct wl1271 *wl)
6209 {
6210         int i;
6211         static const u32 cipher_suites[] = {
6212                 WLAN_CIPHER_SUITE_WEP40,
6213                 WLAN_CIPHER_SUITE_WEP104,
6214                 WLAN_CIPHER_SUITE_TKIP,
6215                 WLAN_CIPHER_SUITE_CCMP,
6216                 WL1271_CIPHER_SUITE_GEM,
6217         };
6218
6219         /* The tx descriptor buffer */
6220         wl->hw->extra_tx_headroom = sizeof(struct wl1271_tx_hw_descr);
6221
6222         if (wl->quirks & WLCORE_QUIRK_TKIP_HEADER_SPACE)
6223                 wl->hw->extra_tx_headroom += WL1271_EXTRA_SPACE_TKIP;
6224
6225         /* unit us */
6226         /* FIXME: find a proper value */
6227         wl->hw->max_listen_interval = wl->conf.conn.max_listen_interval;
6228
6229         ieee80211_hw_set(wl->hw, SUPPORT_FAST_XMIT);
6230         ieee80211_hw_set(wl->hw, CHANCTX_STA_CSA);
6231         ieee80211_hw_set(wl->hw, SUPPORTS_PER_STA_GTK);
6232         ieee80211_hw_set(wl->hw, QUEUE_CONTROL);
6233         ieee80211_hw_set(wl->hw, TX_AMPDU_SETUP_IN_HW);
6234         ieee80211_hw_set(wl->hw, AMPDU_AGGREGATION);
6235         ieee80211_hw_set(wl->hw, AP_LINK_PS);
6236         ieee80211_hw_set(wl->hw, SPECTRUM_MGMT);
6237         ieee80211_hw_set(wl->hw, REPORTS_TX_ACK_STATUS);
6238         ieee80211_hw_set(wl->hw, CONNECTION_MONITOR);
6239         ieee80211_hw_set(wl->hw, HAS_RATE_CONTROL);
6240         ieee80211_hw_set(wl->hw, SUPPORTS_DYNAMIC_PS);
6241         ieee80211_hw_set(wl->hw, SIGNAL_DBM);
6242         ieee80211_hw_set(wl->hw, SUPPORTS_PS);
6243         ieee80211_hw_set(wl->hw, SUPPORTS_TX_FRAG);
6244
6245         wl->hw->wiphy->cipher_suites = cipher_suites;
6246         wl->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
6247
6248         wl->hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
6249                                          BIT(NL80211_IFTYPE_AP) |
6250                                          BIT(NL80211_IFTYPE_P2P_DEVICE) |
6251                                          BIT(NL80211_IFTYPE_P2P_CLIENT) |
6252 #ifdef CONFIG_MAC80211_MESH
6253                                          BIT(NL80211_IFTYPE_MESH_POINT) |
6254 #endif
6255                                          BIT(NL80211_IFTYPE_P2P_GO);
6256
6257         wl->hw->wiphy->max_scan_ssids = 1;
6258         wl->hw->wiphy->max_sched_scan_ssids = 16;
6259         wl->hw->wiphy->max_match_sets = 16;
6260         /*
6261          * Maximum length of elements in scanning probe request templates
6262          * should be the maximum length possible for a template, without
6263          * the IEEE80211 header of the template
6264          */
6265         wl->hw->wiphy->max_scan_ie_len = WL1271_CMD_TEMPL_MAX_SIZE -
6266                         sizeof(struct ieee80211_header);
6267
6268         wl->hw->wiphy->max_sched_scan_reqs = 1;
6269         wl->hw->wiphy->max_sched_scan_ie_len = WL1271_CMD_TEMPL_MAX_SIZE -
6270                 sizeof(struct ieee80211_header);
6271
6272         wl->hw->wiphy->max_remain_on_channel_duration = 30000;
6273
6274         wl->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD |
6275                                 WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL |
6276                                 WIPHY_FLAG_HAS_CHANNEL_SWITCH |
6277                                 WIPHY_FLAG_IBSS_RSN;
6278
6279         wl->hw->wiphy->features |= NL80211_FEATURE_AP_SCAN;
6280
6281         /* make sure all our channels fit in the scanned_ch bitmask */
6282         BUILD_BUG_ON(ARRAY_SIZE(wl1271_channels) +
6283                      ARRAY_SIZE(wl1271_channels_5ghz) >
6284                      WL1271_MAX_CHANNELS);
6285         /*
6286         * clear channel flags from the previous usage
6287         * and restore max_power & max_antenna_gain values.
6288         */
6289         for (i = 0; i < ARRAY_SIZE(wl1271_channels); i++) {
6290                 wl1271_band_2ghz.channels[i].flags = 0;
6291                 wl1271_band_2ghz.channels[i].max_power = WLCORE_MAX_TXPWR;
6292                 wl1271_band_2ghz.channels[i].max_antenna_gain = 0;
6293         }
6294
6295         for (i = 0; i < ARRAY_SIZE(wl1271_channels_5ghz); i++) {
6296                 wl1271_band_5ghz.channels[i].flags = 0;
6297                 wl1271_band_5ghz.channels[i].max_power = WLCORE_MAX_TXPWR;
6298                 wl1271_band_5ghz.channels[i].max_antenna_gain = 0;
6299         }
6300
6301         /*
6302          * We keep local copies of the band structs because we need to
6303          * modify them on a per-device basis.
6304          */
6305         memcpy(&wl->bands[NL80211_BAND_2GHZ], &wl1271_band_2ghz,
6306                sizeof(wl1271_band_2ghz));
6307         memcpy(&wl->bands[NL80211_BAND_2GHZ].ht_cap,
6308                &wl->ht_cap[NL80211_BAND_2GHZ],
6309                sizeof(*wl->ht_cap));
6310         memcpy(&wl->bands[NL80211_BAND_5GHZ], &wl1271_band_5ghz,
6311                sizeof(wl1271_band_5ghz));
6312         memcpy(&wl->bands[NL80211_BAND_5GHZ].ht_cap,
6313                &wl->ht_cap[NL80211_BAND_5GHZ],
6314                sizeof(*wl->ht_cap));
6315
6316         wl->hw->wiphy->bands[NL80211_BAND_2GHZ] =
6317                 &wl->bands[NL80211_BAND_2GHZ];
6318         wl->hw->wiphy->bands[NL80211_BAND_5GHZ] =
6319                 &wl->bands[NL80211_BAND_5GHZ];
6320
6321         /*
6322          * allow 4 queues per mac address we support +
6323          * 1 cab queue per mac + one global offchannel Tx queue
6324          */
6325         wl->hw->queues = (NUM_TX_QUEUES + 1) * WLCORE_NUM_MAC_ADDRESSES + 1;
6326
6327         /* the last queue is the offchannel queue */
6328         wl->hw->offchannel_tx_hw_queue = wl->hw->queues - 1;
6329         wl->hw->max_rates = 1;
6330
6331         wl->hw->wiphy->reg_notifier = wl1271_reg_notify;
6332
6333         /* the FW answers probe-requests in AP-mode */
6334         wl->hw->wiphy->flags |= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD;
6335         wl->hw->wiphy->probe_resp_offload =
6336                 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS |
6337                 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS2 |
6338                 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_P2P;
6339
6340         /* allowed interface combinations */
6341         wl->hw->wiphy->iface_combinations = wl->iface_combinations;
6342         wl->hw->wiphy->n_iface_combinations = wl->n_iface_combinations;
6343
6344         /* register vendor commands */
6345         wlcore_set_vendor_commands(wl->hw->wiphy);
6346
6347         SET_IEEE80211_DEV(wl->hw, wl->dev);
6348
6349         wl->hw->sta_data_size = sizeof(struct wl1271_station);
6350         wl->hw->vif_data_size = sizeof(struct wl12xx_vif);
6351
6352         wl->hw->max_rx_aggregation_subframes = wl->conf.ht.rx_ba_win_size;
6353
6354         return 0;
6355 }
6356
6357 struct ieee80211_hw *wlcore_alloc_hw(size_t priv_size, u32 aggr_buf_size,
6358                                      u32 mbox_size)
6359 {
6360         struct ieee80211_hw *hw;
6361         struct wl1271 *wl;
6362         int i, j, ret;
6363         unsigned int order;
6364
6365         hw = ieee80211_alloc_hw(sizeof(*wl), &wl1271_ops);
6366         if (!hw) {
6367                 wl1271_error("could not alloc ieee80211_hw");
6368                 ret = -ENOMEM;
6369                 goto err_hw_alloc;
6370         }
6371
6372         wl = hw->priv;
6373         memset(wl, 0, sizeof(*wl));
6374
6375         wl->priv = kzalloc(priv_size, GFP_KERNEL);
6376         if (!wl->priv) {
6377                 wl1271_error("could not alloc wl priv");
6378                 ret = -ENOMEM;
6379                 goto err_priv_alloc;
6380         }
6381
6382         INIT_LIST_HEAD(&wl->wlvif_list);
6383
6384         wl->hw = hw;
6385
6386         /*
6387          * wl->num_links is not configured yet, so just use WLCORE_MAX_LINKS.
6388          * we don't allocate any additional resource here, so that's fine.
6389          */
6390         for (i = 0; i < NUM_TX_QUEUES; i++)
6391                 for (j = 0; j < WLCORE_MAX_LINKS; j++)
6392                         skb_queue_head_init(&wl->links[j].tx_queue[i]);
6393
6394         skb_queue_head_init(&wl->deferred_rx_queue);
6395         skb_queue_head_init(&wl->deferred_tx_queue);
6396
6397         INIT_WORK(&wl->netstack_work, wl1271_netstack_work);
6398         INIT_WORK(&wl->tx_work, wl1271_tx_work);
6399         INIT_WORK(&wl->recovery_work, wl1271_recovery_work);
6400         INIT_DELAYED_WORK(&wl->scan_complete_work, wl1271_scan_complete_work);
6401         INIT_DELAYED_WORK(&wl->roc_complete_work, wlcore_roc_complete_work);
6402         INIT_DELAYED_WORK(&wl->tx_watchdog_work, wl12xx_tx_watchdog_work);
6403
6404         wl->freezable_wq = create_freezable_workqueue("wl12xx_wq");
6405         if (!wl->freezable_wq) {
6406                 ret = -ENOMEM;
6407                 goto err_hw;
6408         }
6409
6410         wl->channel = 0;
6411         wl->rx_counter = 0;
6412         wl->power_level = WL1271_DEFAULT_POWER_LEVEL;
6413         wl->band = NL80211_BAND_2GHZ;
6414         wl->channel_type = NL80211_CHAN_NO_HT;
6415         wl->flags = 0;
6416         wl->sg_enabled = true;
6417         wl->sleep_auth = WL1271_PSM_ILLEGAL;
6418         wl->recovery_count = 0;
6419         wl->hw_pg_ver = -1;
6420         wl->ap_ps_map = 0;
6421         wl->ap_fw_ps_map = 0;
6422         wl->quirks = 0;
6423         wl->system_hlid = WL12XX_SYSTEM_HLID;
6424         wl->active_sta_count = 0;
6425         wl->active_link_count = 0;
6426         wl->fwlog_size = 0;
6427
6428         /* The system link is always allocated */
6429         __set_bit(WL12XX_SYSTEM_HLID, wl->links_map);
6430
6431         memset(wl->tx_frames_map, 0, sizeof(wl->tx_frames_map));
6432         for (i = 0; i < wl->num_tx_desc; i++)
6433                 wl->tx_frames[i] = NULL;
6434
6435         spin_lock_init(&wl->wl_lock);
6436
6437         wl->state = WLCORE_STATE_OFF;
6438         wl->fw_type = WL12XX_FW_TYPE_NONE;
6439         mutex_init(&wl->mutex);
6440         mutex_init(&wl->flush_mutex);
6441         init_completion(&wl->nvs_loading_complete);
6442
6443         order = get_order(aggr_buf_size);
6444         wl->aggr_buf = (u8 *)__get_free_pages(GFP_KERNEL, order);
6445         if (!wl->aggr_buf) {
6446                 ret = -ENOMEM;
6447                 goto err_wq;
6448         }
6449         wl->aggr_buf_size = aggr_buf_size;
6450
6451         wl->dummy_packet = wl12xx_alloc_dummy_packet(wl);
6452         if (!wl->dummy_packet) {
6453                 ret = -ENOMEM;
6454                 goto err_aggr;
6455         }
6456
6457         /* Allocate one page for the FW log */
6458         wl->fwlog = (u8 *)get_zeroed_page(GFP_KERNEL);
6459         if (!wl->fwlog) {
6460                 ret = -ENOMEM;
6461                 goto err_dummy_packet;
6462         }
6463
6464         wl->mbox_size = mbox_size;
6465         wl->mbox = kmalloc(wl->mbox_size, GFP_KERNEL | GFP_DMA);
6466         if (!wl->mbox) {
6467                 ret = -ENOMEM;
6468                 goto err_fwlog;
6469         }
6470
6471         wl->buffer_32 = kmalloc(sizeof(*wl->buffer_32), GFP_KERNEL);
6472         if (!wl->buffer_32) {
6473                 ret = -ENOMEM;
6474                 goto err_mbox;
6475         }
6476
6477         return hw;
6478
6479 err_mbox:
6480         kfree(wl->mbox);
6481
6482 err_fwlog:
6483         free_page((unsigned long)wl->fwlog);
6484
6485 err_dummy_packet:
6486         dev_kfree_skb(wl->dummy_packet);
6487
6488 err_aggr:
6489         free_pages((unsigned long)wl->aggr_buf, order);
6490
6491 err_wq:
6492         destroy_workqueue(wl->freezable_wq);
6493
6494 err_hw:
6495         wl1271_debugfs_exit(wl);
6496         kfree(wl->priv);
6497
6498 err_priv_alloc:
6499         ieee80211_free_hw(hw);
6500
6501 err_hw_alloc:
6502
6503         return ERR_PTR(ret);
6504 }
6505 EXPORT_SYMBOL_GPL(wlcore_alloc_hw);
6506
6507 int wlcore_free_hw(struct wl1271 *wl)
6508 {
6509         /* Unblock any fwlog readers */
6510         mutex_lock(&wl->mutex);
6511         wl->fwlog_size = -1;
6512         mutex_unlock(&wl->mutex);
6513
6514         wlcore_sysfs_free(wl);
6515
6516         kfree(wl->buffer_32);
6517         kfree(wl->mbox);
6518         free_page((unsigned long)wl->fwlog);
6519         dev_kfree_skb(wl->dummy_packet);
6520         free_pages((unsigned long)wl->aggr_buf, get_order(wl->aggr_buf_size));
6521
6522         wl1271_debugfs_exit(wl);
6523
6524         vfree(wl->fw);
6525         wl->fw = NULL;
6526         wl->fw_type = WL12XX_FW_TYPE_NONE;
6527         kfree(wl->nvs);
6528         wl->nvs = NULL;
6529
6530         kfree(wl->raw_fw_status);
6531         kfree(wl->fw_status);
6532         kfree(wl->tx_res_if);
6533         destroy_workqueue(wl->freezable_wq);
6534
6535         kfree(wl->priv);
6536         ieee80211_free_hw(wl->hw);
6537
6538         return 0;
6539 }
6540 EXPORT_SYMBOL_GPL(wlcore_free_hw);
6541
6542 #ifdef CONFIG_PM
6543 static const struct wiphy_wowlan_support wlcore_wowlan_support = {
6544         .flags = WIPHY_WOWLAN_ANY,
6545         .n_patterns = WL1271_MAX_RX_FILTERS,
6546         .pattern_min_len = 1,
6547         .pattern_max_len = WL1271_RX_FILTER_MAX_PATTERN_SIZE,
6548 };
6549 #endif
6550
6551 static irqreturn_t wlcore_hardirq(int irq, void *cookie)
6552 {
6553         return IRQ_WAKE_THREAD;
6554 }
6555
6556 static void wlcore_nvs_cb(const struct firmware *fw, void *context)
6557 {
6558         struct wl1271 *wl = context;
6559         struct platform_device *pdev = wl->pdev;
6560         struct wlcore_platdev_data *pdev_data = dev_get_platdata(&pdev->dev);
6561         struct resource *res;
6562
6563         int ret;
6564         irq_handler_t hardirq_fn = NULL;
6565
6566         if (fw) {
6567                 wl->nvs = kmemdup(fw->data, fw->size, GFP_KERNEL);
6568                 if (!wl->nvs) {
6569                         wl1271_error("Could not allocate nvs data");
6570                         goto out;
6571                 }
6572                 wl->nvs_len = fw->size;
6573         } else if (pdev_data->family->nvs_name) {
6574                 wl1271_debug(DEBUG_BOOT, "Could not get nvs file %s",
6575                              pdev_data->family->nvs_name);
6576                 wl->nvs = NULL;
6577                 wl->nvs_len = 0;
6578         } else {
6579                 wl->nvs = NULL;
6580                 wl->nvs_len = 0;
6581         }
6582
6583         ret = wl->ops->setup(wl);
6584         if (ret < 0)
6585                 goto out_free_nvs;
6586
6587         BUG_ON(wl->num_tx_desc > WLCORE_MAX_TX_DESCRIPTORS);
6588
6589         /* adjust some runtime configuration parameters */
6590         wlcore_adjust_conf(wl);
6591
6592         res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
6593         if (!res) {
6594                 wl1271_error("Could not get IRQ resource");
6595                 goto out_free_nvs;
6596         }
6597
6598         wl->irq = res->start;
6599         wl->irq_flags = res->flags & IRQF_TRIGGER_MASK;
6600         wl->if_ops = pdev_data->if_ops;
6601
6602         if (wl->irq_flags & (IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING))
6603                 hardirq_fn = wlcore_hardirq;
6604         else
6605                 wl->irq_flags |= IRQF_ONESHOT;
6606
6607         ret = wl12xx_set_power_on(wl);
6608         if (ret < 0)
6609                 goto out_free_nvs;
6610
6611         ret = wl12xx_get_hw_info(wl);
6612         if (ret < 0) {
6613                 wl1271_error("couldn't get hw info");
6614                 wl1271_power_off(wl);
6615                 goto out_free_nvs;
6616         }
6617
6618         ret = request_threaded_irq(wl->irq, hardirq_fn, wlcore_irq,
6619                                    wl->irq_flags, pdev->name, wl);
6620         if (ret < 0) {
6621                 wl1271_error("interrupt configuration failed");
6622                 wl1271_power_off(wl);
6623                 goto out_free_nvs;
6624         }
6625
6626 #ifdef CONFIG_PM
6627         device_init_wakeup(wl->dev, true);
6628
6629         ret = enable_irq_wake(wl->irq);
6630         if (!ret) {
6631                 wl->irq_wake_enabled = true;
6632                 if (pdev_data->pwr_in_suspend)
6633                         wl->hw->wiphy->wowlan = &wlcore_wowlan_support;
6634         }
6635
6636         res = platform_get_resource(pdev, IORESOURCE_IRQ, 1);
6637         if (res) {
6638                 wl->wakeirq = res->start;
6639                 wl->wakeirq_flags = res->flags & IRQF_TRIGGER_MASK;
6640                 ret = dev_pm_set_dedicated_wake_irq(wl->dev, wl->wakeirq);
6641                 if (ret)
6642                         wl->wakeirq = -ENODEV;
6643         } else {
6644                 wl->wakeirq = -ENODEV;
6645         }
6646 #endif
6647         disable_irq(wl->irq);
6648         wl1271_power_off(wl);
6649
6650         ret = wl->ops->identify_chip(wl);
6651         if (ret < 0)
6652                 goto out_irq;
6653
6654         ret = wl1271_init_ieee80211(wl);
6655         if (ret)
6656                 goto out_irq;
6657
6658         ret = wl1271_register_hw(wl);
6659         if (ret)
6660                 goto out_irq;
6661
6662         ret = wlcore_sysfs_init(wl);
6663         if (ret)
6664                 goto out_unreg;
6665
6666         wl->initialized = true;
6667         goto out;
6668
6669 out_unreg:
6670         wl1271_unregister_hw(wl);
6671
6672 out_irq:
6673         if (wl->wakeirq >= 0)
6674                 dev_pm_clear_wake_irq(wl->dev);
6675         device_init_wakeup(wl->dev, false);
6676         free_irq(wl->irq, wl);
6677
6678 out_free_nvs:
6679         kfree(wl->nvs);
6680
6681 out:
6682         release_firmware(fw);
6683         complete_all(&wl->nvs_loading_complete);
6684 }
6685
6686 static int __maybe_unused wlcore_runtime_suspend(struct device *dev)
6687 {
6688         struct wl1271 *wl = dev_get_drvdata(dev);
6689         struct wl12xx_vif *wlvif;
6690         int error;
6691
6692         /* We do not enter elp sleep in PLT mode */
6693         if (wl->plt)
6694                 return 0;
6695
6696         /* Nothing to do if no ELP mode requested */
6697         if (wl->sleep_auth != WL1271_PSM_ELP)
6698                 return 0;
6699
6700         wl12xx_for_each_wlvif(wl, wlvif) {
6701                 if (!test_bit(WLVIF_FLAG_IN_PS, &wlvif->flags) &&
6702                     test_bit(WLVIF_FLAG_IN_USE, &wlvif->flags))
6703                         return -EBUSY;
6704         }
6705
6706         wl1271_debug(DEBUG_PSM, "chip to elp");
6707         error = wlcore_raw_write32(wl, HW_ACCESS_ELP_CTRL_REG, ELPCTRL_SLEEP);
6708         if (error < 0) {
6709                 wl12xx_queue_recovery_work(wl);
6710
6711                 return error;
6712         }
6713
6714         set_bit(WL1271_FLAG_IN_ELP, &wl->flags);
6715
6716         return 0;
6717 }
6718
6719 static int __maybe_unused wlcore_runtime_resume(struct device *dev)
6720 {
6721         struct wl1271 *wl = dev_get_drvdata(dev);
6722         DECLARE_COMPLETION_ONSTACK(compl);
6723         unsigned long flags;
6724         int ret;
6725         unsigned long start_time = jiffies;
6726         bool recovery = false;
6727
6728         /* Nothing to do if no ELP mode requested */
6729         if (!test_bit(WL1271_FLAG_IN_ELP, &wl->flags))
6730                 return 0;
6731
6732         wl1271_debug(DEBUG_PSM, "waking up chip from elp");
6733
6734         spin_lock_irqsave(&wl->wl_lock, flags);
6735         wl->elp_compl = &compl;
6736         spin_unlock_irqrestore(&wl->wl_lock, flags);
6737
6738         ret = wlcore_raw_write32(wl, HW_ACCESS_ELP_CTRL_REG, ELPCTRL_WAKE_UP);
6739         if (ret < 0) {
6740                 recovery = true;
6741         } else if (!test_bit(WL1271_FLAG_IRQ_RUNNING, &wl->flags)) {
6742                 ret = wait_for_completion_timeout(&compl,
6743                         msecs_to_jiffies(WL1271_WAKEUP_TIMEOUT));
6744                 if (ret == 0) {
6745                         wl1271_warning("ELP wakeup timeout!");
6746                         recovery = true;
6747                 }
6748         }
6749
6750         spin_lock_irqsave(&wl->wl_lock, flags);
6751         wl->elp_compl = NULL;
6752         spin_unlock_irqrestore(&wl->wl_lock, flags);
6753         clear_bit(WL1271_FLAG_IN_ELP, &wl->flags);
6754
6755         if (recovery) {
6756                 set_bit(WL1271_FLAG_INTENDED_FW_RECOVERY, &wl->flags);
6757                 wl12xx_queue_recovery_work(wl);
6758         } else {
6759                 wl1271_debug(DEBUG_PSM, "wakeup time: %u ms",
6760                              jiffies_to_msecs(jiffies - start_time));
6761         }
6762
6763         return 0;
6764 }
6765
6766 static const struct dev_pm_ops wlcore_pm_ops = {
6767         SET_RUNTIME_PM_OPS(wlcore_runtime_suspend,
6768                            wlcore_runtime_resume,
6769                            NULL)
6770 };
6771
6772 int wlcore_probe(struct wl1271 *wl, struct platform_device *pdev)
6773 {
6774         struct wlcore_platdev_data *pdev_data = dev_get_platdata(&pdev->dev);
6775         const char *nvs_name;
6776         int ret = 0;
6777
6778         if (!wl->ops || !wl->ptable || !pdev_data)
6779                 return -EINVAL;
6780
6781         wl->dev = &pdev->dev;
6782         wl->pdev = pdev;
6783         platform_set_drvdata(pdev, wl);
6784
6785         if (pdev_data->family && pdev_data->family->nvs_name) {
6786                 nvs_name = pdev_data->family->nvs_name;
6787                 ret = request_firmware_nowait(THIS_MODULE, FW_ACTION_HOTPLUG,
6788                                               nvs_name, &pdev->dev, GFP_KERNEL,
6789                                               wl, wlcore_nvs_cb);
6790                 if (ret < 0) {
6791                         wl1271_error("request_firmware_nowait failed for %s: %d",
6792                                      nvs_name, ret);
6793                         complete_all(&wl->nvs_loading_complete);
6794                 }
6795         } else {
6796                 wlcore_nvs_cb(NULL, wl);
6797         }
6798
6799         wl->dev->driver->pm = &wlcore_pm_ops;
6800         pm_runtime_set_autosuspend_delay(wl->dev, 50);
6801         pm_runtime_use_autosuspend(wl->dev);
6802         pm_runtime_enable(wl->dev);
6803
6804         return ret;
6805 }
6806 EXPORT_SYMBOL_GPL(wlcore_probe);
6807
6808 int wlcore_remove(struct platform_device *pdev)
6809 {
6810         struct wlcore_platdev_data *pdev_data = dev_get_platdata(&pdev->dev);
6811         struct wl1271 *wl = platform_get_drvdata(pdev);
6812         int error;
6813
6814         error = pm_runtime_get_sync(wl->dev);
6815         if (error < 0)
6816                 dev_warn(wl->dev, "PM runtime failed: %i\n", error);
6817
6818         wl->dev->driver->pm = NULL;
6819
6820         if (pdev_data->family && pdev_data->family->nvs_name)
6821                 wait_for_completion(&wl->nvs_loading_complete);
6822         if (!wl->initialized)
6823                 return 0;
6824
6825         if (wl->wakeirq >= 0) {
6826                 dev_pm_clear_wake_irq(wl->dev);
6827                 wl->wakeirq = -ENODEV;
6828         }
6829
6830         device_init_wakeup(wl->dev, false);
6831
6832         if (wl->irq_wake_enabled)
6833                 disable_irq_wake(wl->irq);
6834
6835         wl1271_unregister_hw(wl);
6836
6837         pm_runtime_put_sync(wl->dev);
6838         pm_runtime_dont_use_autosuspend(wl->dev);
6839         pm_runtime_disable(wl->dev);
6840
6841         free_irq(wl->irq, wl);
6842         wlcore_free_hw(wl);
6843
6844         return 0;
6845 }
6846 EXPORT_SYMBOL_GPL(wlcore_remove);
6847
6848 u32 wl12xx_debug_level = DEBUG_NONE;
6849 EXPORT_SYMBOL_GPL(wl12xx_debug_level);
6850 module_param_named(debug_level, wl12xx_debug_level, uint, 0600);
6851 MODULE_PARM_DESC(debug_level, "wl12xx debugging level");
6852
6853 module_param_named(fwlog, fwlog_param, charp, 0);
6854 MODULE_PARM_DESC(fwlog,
6855                  "FW logger options: continuous, dbgpins or disable");
6856
6857 module_param(fwlog_mem_blocks, int, 0600);
6858 MODULE_PARM_DESC(fwlog_mem_blocks, "fwlog mem_blocks");
6859
6860 module_param(bug_on_recovery, int, 0600);
6861 MODULE_PARM_DESC(bug_on_recovery, "BUG() on fw recovery");
6862
6863 module_param(no_recovery, int, 0600);
6864 MODULE_PARM_DESC(no_recovery, "Prevent HW recovery. FW will remain stuck.");
6865
6866 MODULE_LICENSE("GPL");
6867 MODULE_AUTHOR("Luciano Coelho <coelho@ti.com>");
6868 MODULE_AUTHOR("Juuso Oikarinen <juuso.oikarinen@nokia.com>");