WIP FPC-III support
[linux/fpc-iii.git] / drivers / net / wireless / ti / wlcore / main.c
blob122c7a4b374f17b36b7b00081bf891014c251600
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3 * This file is part of wlcore
5 * Copyright (C) 2008-2010 Nokia Corporation
6 * Copyright (C) 2011-2013 Texas Instruments Inc.
7 */
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>
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"
32 #define WL1271_BOOT_RETRIES 3
33 #define WL1271_WAKEUP_TIMEOUT 500
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;
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);
46 static int wl12xx_set_authorized(struct wl1271 *wl, struct wl12xx_vif *wlvif)
48 int ret;
50 if (WARN_ON(wlvif->bss_type != BSS_TYPE_STA_BSS))
51 return -EINVAL;
53 if (!test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags))
54 return 0;
56 if (test_and_set_bit(WLVIF_FLAG_STA_STATE_SENT, &wlvif->flags))
57 return 0;
59 ret = wl12xx_cmd_set_peer_state(wl, wlvif, wlvif->sta.hlid);
60 if (ret < 0)
61 return ret;
63 wl1271_info("Association completed.");
64 return 0;
67 static void wl1271_reg_notify(struct wiphy *wiphy,
68 struct regulatory_request *request)
70 struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
71 struct wl1271 *wl = hw->priv;
73 /* copy the current dfs region */
74 if (request)
75 wl->dfs_region = request->dfs_region;
77 wlcore_regdomain_config(wl);
80 static int wl1271_set_rx_streaming(struct wl1271 *wl, struct wl12xx_vif *wlvif,
81 bool enable)
83 int ret = 0;
85 /* we should hold wl->mutex */
86 ret = wl1271_acx_ps_rx_streaming(wl, wlvif, enable);
87 if (ret < 0)
88 goto out;
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;
99 * this function is being called when the rx_streaming interval
100 * has beed changed or rx_streaming should be disabled
102 int wl1271_recalc_rx_streaming(struct wl1271 *wl, struct wl12xx_vif *wlvif)
104 int ret = 0;
105 int period = wl->conf.rx_streaming.interval;
107 /* don't reconfigure if rx_streaming is disabled */
108 if (!test_bit(WLVIF_FLAG_RX_STREAMING_STARTED, &wlvif->flags))
109 goto out;
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);
122 out:
123 return ret;
126 static void wl1271_rx_streaming_enable_work(struct work_struct *work)
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;
133 mutex_lock(&wl->mutex);
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;
141 if (!wl->conf.rx_streaming.interval)
142 goto out;
144 ret = pm_runtime_get_sync(wl->dev);
145 if (ret < 0) {
146 pm_runtime_put_noidle(wl->dev);
147 goto out;
150 ret = wl1271_set_rx_streaming(wl, wlvif, true);
151 if (ret < 0)
152 goto out_sleep;
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));
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);
165 static void wl1271_rx_streaming_disable_work(struct work_struct *work)
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;
172 mutex_lock(&wl->mutex);
174 if (!test_bit(WLVIF_FLAG_RX_STREAMING_STARTED, &wlvif->flags))
175 goto out;
177 ret = pm_runtime_get_sync(wl->dev);
178 if (ret < 0) {
179 pm_runtime_put_noidle(wl->dev);
180 goto out;
183 ret = wl1271_set_rx_streaming(wl, wlvif, false);
184 if (ret)
185 goto out_sleep;
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);
194 static void wl1271_rx_streaming_timer(struct timer_list *t)
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);
201 /* wl->mutex must be taken */
202 void wl12xx_rearm_tx_watchdog_locked(struct wl1271 *wl)
204 /* if the watchdog is not armed, don't do anything */
205 if (wl->tx_allocated_blocks == 0)
206 return;
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));
213 static void wlcore_rc_update_work(struct work_struct *work)
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);
221 mutex_lock(&wl->mutex);
223 if (unlikely(wl->state != WLCORE_STATE_ON))
224 goto out;
226 ret = pm_runtime_get_sync(wl->dev);
227 if (ret < 0) {
228 pm_runtime_put_noidle(wl->dev);
229 goto out;
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);
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);
248 static void wl12xx_tx_watchdog_work(struct work_struct *work)
250 struct delayed_work *dwork;
251 struct wl1271 *wl;
253 dwork = to_delayed_work(work);
254 wl = container_of(dwork, struct wl1271, tx_watchdog_work);
256 mutex_lock(&wl->mutex);
258 if (unlikely(wl->state != WLCORE_STATE_ON))
259 goto out;
261 /* Tx went out in the meantime - everything is ok */
262 if (unlikely(wl->tx_allocated_blocks == 0))
263 goto out;
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)
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;
277 * if a scan is in progress, we might not have any Tx for a long
278 * time
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;
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.
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;
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);
306 out:
307 mutex_unlock(&wl->mutex);
310 static void wlcore_adjust_conf(struct wl1271 *wl)
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);
328 if (bug_on_recovery != -1)
329 wl->conf.recovery.bug_on_recovery = (u8) bug_on_recovery;
331 if (no_recovery != -1)
332 wl->conf.recovery.no_recovery = (u8) no_recovery;
335 static void wl12xx_irq_ps_regulate_link(struct wl1271 *wl,
336 struct wl12xx_vif *wlvif,
337 u8 hlid, u8 tx_pkts)
339 bool fw_ps;
341 fw_ps = test_bit(hlid, &wl->ap_fw_ps_map);
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.
347 if (!fw_ps || tx_pkts < WL1271_PS_STA_MAX_PACKETS)
348 wl12xx_ps_link_end(wl, wlvif, hlid);
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.
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);
364 static void wl12xx_irq_update_links_status(struct wl1271 *wl,
365 struct wl12xx_vif *wlvif,
366 struct wl_fw_status *status)
368 unsigned long cur_fw_ps_map;
369 u8 hlid;
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);
378 wl->ap_fw_ps_map = cur_fw_ps_map;
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);
386 static int wlcore_fw_status(struct wl1271 *wl, struct wl_fw_status *status)
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;
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;
401 wlcore_hw_convert_fw_status(wl, wl->raw_fw_status, wl->fw_status);
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);
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;
416 wl->tx_pkts_freed[i] = status->counters.tx_released_pkts[i];
420 for_each_set_bit(i, wl->links_map, wl->num_links) {
421 u8 diff;
422 lnk = &wl->links[i];
424 /* prevent wrap-around in freed-packets counter */
425 diff = (status->counters.tx_lnk_free_pkts[i] -
426 lnk->prev_freed_pkts) & 0xff;
428 if (diff == 0)
429 continue;
431 lnk->allocated_pkts -= diff;
432 lnk->prev_freed_pkts = status->counters.tx_lnk_free_pkts[i];
434 /* accumulate the prev_freed_pkts counter */
435 lnk->total_freed_pkts += diff;
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;
446 wl->tx_blocks_freed = status->total_released_blks;
448 wl->tx_allocated_blocks -= freed_blocks;
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).
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);
462 avail = status->tx_total - wl->tx_allocated_blocks;
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.
472 wl->tx_blocks_available = max((int)wl->tx_blocks_available,
473 avail);
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);
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);
484 /* update the host-chipset time offset */
485 wl->time_offset = (ktime_get_boottime_ns() >> 10) -
486 (s64)(status->fw_localtime);
488 wl->fw_fast_lnk_map = status->link_fast_bitmap;
490 return 0;
493 static void wl1271_flush_deferred_work(struct wl1271 *wl)
495 struct sk_buff *skb;
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);
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);
506 static void wl1271_netstack_work(struct work_struct *work)
508 struct wl1271 *wl =
509 container_of(work, struct wl1271, netstack_work);
511 do {
512 wl1271_flush_deferred_work(wl);
513 } while (skb_queue_len(&wl->deferred_rx_queue));
516 #define WL1271_IRQ_MAX_LOOPS 256
518 static int wlcore_irq_locked(struct wl1271 *wl)
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;
529 * In case edge triggered interrupt must be used, we cannot iterate
530 * more than once without introducing race conditions with the hardirq.
532 if (wl->irq_flags & (IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING))
533 loopcount = 1;
535 wl1271_debug(DEBUG_IRQ, "IRQ work");
537 if (unlikely(wl->state != WLCORE_STATE_ON))
538 goto out;
540 ret = pm_runtime_get_sync(wl->dev);
541 if (ret < 0) {
542 pm_runtime_put_noidle(wl->dev);
543 goto out;
546 while (!done && loopcount--) {
547 smp_mb__after_atomic();
549 ret = wlcore_fw_status(wl, wl->fw_status);
550 if (ret < 0)
551 goto err_ret;
553 wlcore_hw_tx_immediate_compl(wl);
555 intr = wl->fw_status->intr;
556 intr &= WLCORE_ALL_INTR_MASK;
557 if (!intr) {
558 done = true;
559 continue;
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;
567 /* restarting the chip. ignore any other interrupt. */
568 goto err_ret;
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;
577 /* restarting the chip. ignore any other interrupt. */
578 goto err_ret;
581 if (likely(intr & WL1271_ACX_INTR_DATA)) {
582 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_DATA");
584 ret = wlcore_rx(wl, wl->fw_status);
585 if (ret < 0)
586 goto err_ret;
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);
597 * In order to avoid starvation of the TX path,
598 * call the work function directly.
600 if (run_tx_queue) {
601 ret = wlcore_tx_work_locked(wl);
602 if (ret < 0)
603 goto err_ret;
607 /* check for tx results */
608 ret = wlcore_hw_tx_delayed_compl(wl);
609 if (ret < 0)
610 goto err_ret;
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);
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;
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;
633 if (intr & WL1271_ACX_INTR_INIT_COMPLETE)
634 wl1271_debug(DEBUG_IRQ,
635 "WL1271_ACX_INTR_INIT_COMPLETE");
637 if (intr & WL1271_ACX_INTR_HW_AVAILABLE)
638 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_HW_AVAILABLE");
641 err_ret:
642 pm_runtime_mark_last_busy(wl->dev);
643 pm_runtime_put_autosuspend(wl->dev);
645 out:
646 return ret;
649 static irqreturn_t wlcore_irq(int irq, void *cookie)
651 int ret;
652 unsigned long flags;
653 struct wl1271 *wl = cookie;
654 bool queue_tx_work = true;
656 set_bit(WL1271_FLAG_IRQ_RUNNING, &wl->flags);
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);
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;
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);
681 mutex_lock(&wl->mutex);
683 ret = wlcore_irq_locked(wl);
684 if (ret)
685 wl12xx_queue_recovery_work(wl);
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);
695 if (queue_tx_work)
696 ieee80211_queue_work(wl->hw, &wl->tx_work);
699 mutex_unlock(&wl->mutex);
701 out_handled:
702 clear_bit(WL1271_FLAG_IRQ_RUNNING, &wl->flags);
704 return IRQ_HANDLED;
707 struct vif_counter_data {
708 u8 counter;
710 struct ieee80211_vif *cur_vif;
711 bool cur_vif_running;
714 static void wl12xx_vif_count_iter(void *data, u8 *mac,
715 struct ieee80211_vif *vif)
717 struct vif_counter_data *counter = data;
719 counter->counter++;
720 if (counter->cur_vif == vif)
721 counter->cur_vif_running = true;
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)
729 memset(data, 0, sizeof(*data));
730 data->cur_vif = cur_vif;
732 ieee80211_iterate_active_interfaces(hw, IEEE80211_IFACE_ITER_RESUME_ALL,
733 wl12xx_vif_count_iter, data);
736 static int wl12xx_fetch_firmware(struct wl1271 *wl, bool plt)
738 const struct firmware *fw;
739 const char *fw_name;
740 enum wl12xx_fw_type fw_type;
741 int ret;
743 if (plt) {
744 fw_type = WL12XX_FW_TYPE_PLT;
745 fw_name = wl->plt_fw_name;
746 } else {
748 * we can't call wl12xx_get_vif_count() here because
749 * wl->mutex is taken, so use the cached last_vif_count value
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;
760 if (wl->fw_type == fw_type)
761 return 0;
763 wl1271_debug(DEBUG_BOOT, "booting firmware %s", fw_name);
765 ret = request_firmware(&fw, fw_name, wl->dev);
767 if (ret < 0) {
768 wl1271_error("could not get firmware %s: %d", fw_name, ret);
769 return ret;
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;
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);
784 if (!wl->fw) {
785 wl1271_error("could not allocate memory for the firmware");
786 ret = -ENOMEM;
787 goto out;
790 memcpy(wl->fw, fw->data, wl->fw_len);
791 ret = 0;
792 wl->fw_type = fw_type;
793 out:
794 release_firmware(fw);
796 return ret;
799 void wl12xx_queue_recovery_work(struct wl1271 *wl)
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));
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);
812 size_t wl12xx_copy_fwlog(struct wl1271 *wl, u8 *memblock, size_t maxlen)
814 size_t len;
816 /* Make sure we have enough room */
817 len = min_t(size_t, maxlen, PAGE_SIZE - wl->fwlog_size);
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;
823 return len;
826 static void wl12xx_read_fwlog_panic(struct wl1271 *wl)
828 u32 end_of_log = 0;
829 int error;
831 if (wl->quirks & WLCORE_QUIRK_FWLOG_NOT_IMPLEMENTED)
832 return;
834 wl1271_info("Reading FW panic log");
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).
841 error = pm_runtime_get_sync(wl->dev);
842 if (error < 0) {
843 pm_runtime_put_noidle(wl->dev);
844 return;
846 if (!wl->watchdog_recovery &&
847 wl->conf.fwlog.output != WL12XX_FWLOG_OUTPUT_DBG_PINS)
848 wl12xx_cmd_stop_fwlog(wl);
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);
857 } while (end_of_log != 0);
860 static void wlcore_save_freed_pkts(struct wl1271 *wl, struct wl12xx_vif *wlvif,
861 u8 hlid, struct ieee80211_sta *sta)
863 struct wl1271_station *wl_sta;
864 u32 sqn_recovery_padding = WL1271_TX_SQN_POST_RECOVERY_PADDING;
866 wl_sta = (void *)sta->drv_priv;
867 wl_sta->total_freed_pkts = wl->links[hlid].total_freed_pkts;
870 * increment the initial seq number on recovery to account for
871 * transmitted packets that we haven't yet got in the FW status
873 if (wlvif->encryption_type == KEY_GEM)
874 sqn_recovery_padding = WL1271_TX_SQN_POST_RECOVERY_PADDING_GEM;
876 if (test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags))
877 wl_sta->total_freed_pkts += sqn_recovery_padding;
880 static void wlcore_save_freed_pkts_addr(struct wl1271 *wl,
881 struct wl12xx_vif *wlvif,
882 u8 hlid, const u8 *addr)
884 struct ieee80211_sta *sta;
885 struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
887 if (WARN_ON(hlid == WL12XX_INVALID_LINK_ID ||
888 is_zero_ether_addr(addr)))
889 return;
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();
898 static void wlcore_print_recovery(struct wl1271 *wl)
900 u32 pc = 0;
901 u32 hint_sts = 0;
902 int ret;
904 wl1271_info("Hardware recovery in progress. FW ver: %s",
905 wl->chip.fw_ver_str);
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;
912 ret = wlcore_read_reg(wl, REG_PC_ON_RECOVERY, &pc);
913 if (ret < 0)
914 return;
916 ret = wlcore_read_reg(wl, REG_INTERRUPT_NO_CLEAR, &hint_sts);
917 if (ret < 0)
918 return;
920 wl1271_info("pc: 0x%x, hint_sts: 0x%08x count: %d",
921 pc, hint_sts, ++wl->recovery_count);
923 wlcore_set_partition(wl, &wl->ptable[PART_WORK]);
927 static void wl1271_recovery_work(struct work_struct *work)
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;
935 mutex_lock(&wl->mutex);
937 if (wl->state == WLCORE_STATE_OFF || wl->plt)
938 goto out_unlock;
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);
945 wlcore_disable_interrupts_nosync(wl);
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);
953 BUG_ON(wl->conf.recovery.bug_on_recovery &&
954 !test_bit(WL1271_FLAG_INTENDED_FW_RECOVERY, &wl->flags));
956 clear_bit(WL1271_FLAG_INTENDED_FW_RECOVERY, &wl->flags);
958 if (wl->conf.recovery.no_recovery) {
959 wl1271_info("No recovery (chosen on module load). Fw will remain stuck.");
960 goto out_unlock;
963 /* Prevent spurious TX during FW restart */
964 wlcore_stop_queues(wl, WLCORE_QUEUE_STOP_REASON_FW_RESTART);
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);
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);
978 __wl1271_op_remove_interface(wl, vif, false);
981 wlcore_op_stop_locked(wl);
982 pm_runtime_mark_last_busy(wl->dev);
983 pm_runtime_put_autosuspend(wl->dev);
985 ieee80211_restart_hw(wl->hw);
988 * Its safe to enable TX now - the queues are stopped after a request
989 * to restart the HW.
991 wlcore_wake_queues(wl, WLCORE_QUEUE_STOP_REASON_FW_RESTART);
993 out_unlock:
994 wl->watchdog_recovery = false;
995 clear_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags);
996 mutex_unlock(&wl->mutex);
999 static int wlcore_fw_wakeup(struct wl1271 *wl)
1001 return wlcore_raw_write32(wl, HW_ACCESS_ELP_CTRL_REG, ELPCTRL_WAKE_UP);
1004 static int wl1271_setup(struct wl1271 *wl)
1006 wl->raw_fw_status = kzalloc(wl->fw_status_len, GFP_KERNEL);
1007 if (!wl->raw_fw_status)
1008 goto err;
1010 wl->fw_status = kzalloc(sizeof(*wl->fw_status), GFP_KERNEL);
1011 if (!wl->fw_status)
1012 goto err;
1014 wl->tx_res_if = kzalloc(sizeof(*wl->tx_res_if), GFP_KERNEL);
1015 if (!wl->tx_res_if)
1016 goto err;
1018 return 0;
1019 err:
1020 kfree(wl->fw_status);
1021 kfree(wl->raw_fw_status);
1022 return -ENOMEM;
1025 static int wl12xx_set_power_on(struct wl1271 *wl)
1027 int ret;
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);
1037 ret = wlcore_set_partition(wl, &wl->ptable[PART_BOOT]);
1038 if (ret < 0)
1039 goto fail;
1041 /* ELP module wake up */
1042 ret = wlcore_fw_wakeup(wl);
1043 if (ret < 0)
1044 goto fail;
1046 out:
1047 return ret;
1049 fail:
1050 wl1271_power_off(wl);
1051 return ret;
1054 static int wl12xx_chip_wakeup(struct wl1271 *wl, bool plt)
1056 int ret = 0;
1058 ret = wl12xx_set_power_on(wl);
1059 if (ret < 0)
1060 goto out;
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.
1070 * Check if the bus supports blocksize alignment and, if it
1071 * doesn't, make sure we don't have the quirk.
1073 if (!wl1271_set_block_size(wl))
1074 wl->quirks &= ~WLCORE_QUIRK_TX_BLOCKSIZE_ALIGN;
1076 /* TODO: make sure the lower driver has set things up correctly */
1078 ret = wl1271_setup(wl);
1079 if (ret < 0)
1080 goto out;
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);
1089 out:
1090 return ret;
1093 int wl1271_plt_start(struct wl1271 *wl, const enum plt_mode plt_mode)
1095 int retries = WL1271_BOOT_RETRIES;
1096 struct wiphy *wiphy = wl->hw->wiphy;
1098 static const char* const PLT_MODE[] = {
1099 "PLT_OFF",
1100 "PLT_ON",
1101 "PLT_FEM_DETECT",
1102 "PLT_CHIP_AWAKE"
1105 int ret;
1107 mutex_lock(&wl->mutex);
1109 wl1271_notice("power up");
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;
1118 /* Indicate to lower levels that we are now in PLT mode */
1119 wl->plt = true;
1120 wl->plt_mode = plt_mode;
1122 while (retries) {
1123 retries--;
1124 ret = wl12xx_chip_wakeup(wl, true);
1125 if (ret < 0)
1126 goto power_off;
1128 if (plt_mode != PLT_CHIP_AWAKE) {
1129 ret = wl->ops->plt_init(wl);
1130 if (ret < 0)
1131 goto power_off;
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);
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));
1144 goto out;
1146 power_off:
1147 wl1271_power_off(wl);
1150 wl->plt = false;
1151 wl->plt_mode = PLT_OFF;
1153 wl1271_error("firmware boot in PLT mode failed despite %d retries",
1154 WL1271_BOOT_RETRIES);
1155 out:
1156 mutex_unlock(&wl->mutex);
1158 return ret;
1161 int wl1271_plt_stop(struct wl1271 *wl)
1163 int ret = 0;
1165 wl1271_notice("power down");
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.
1172 wlcore_disable_interrupts(wl);
1173 mutex_lock(&wl->mutex);
1174 if (!wl->plt) {
1175 mutex_unlock(&wl->mutex);
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().
1182 wlcore_enable_interrupts(wl);
1184 wl1271_error("cannot power down because not in PLT "
1185 "state: %d", wl->state);
1186 ret = -EBUSY;
1187 goto out;
1190 mutex_unlock(&wl->mutex);
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);
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);
1207 out:
1208 return ret;
1211 static void wl1271_op_tx(struct ieee80211_hw *hw,
1212 struct ieee80211_tx_control *control,
1213 struct sk_buff *skb)
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;
1223 if (!vif) {
1224 wl1271_debug(DEBUG_TX, "DROP skb with no vif");
1225 ieee80211_free_txskb(hw, skb);
1226 return;
1229 wlvif = wl12xx_vif_to_data(vif);
1230 mapping = skb_get_queue_mapping(skb);
1231 q = wl1271_tx_get_queue(mapping);
1233 hlid = wl12xx_tx_get_hlid(wl, wlvif, skb, control->sta);
1235 spin_lock_irqsave(&wl->wl_lock, flags);
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.
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;
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);
1256 wl->tx_queue_count[q]++;
1257 wlvif->tx_queue_count[q]++;
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.
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);
1272 * The chip specific setup must run before the first TX packet -
1273 * before that, the tx_work will not be initialized!
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);
1280 out:
1281 spin_unlock_irqrestore(&wl->wl_lock, flags);
1284 int wl1271_tx_dummy_packet(struct wl1271 *wl)
1286 unsigned long flags;
1287 int q;
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;
1293 q = wl1271_tx_get_queue(skb_get_queue_mapping(wl->dummy_packet));
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);
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);
1305 * If the FW TX is busy, TX work will be scheduled by the threaded
1306 * interrupt handler function
1308 return 0;
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
1316 #define TOTAL_TX_DUMMY_PACKET_SIZE (ALIGN(1400, 512))
1318 static struct sk_buff *wl12xx_alloc_dummy_packet(struct wl1271 *wl)
1320 struct sk_buff *skb;
1321 struct ieee80211_hdr_3addr *hdr;
1322 unsigned int dummy_packet_size;
1324 dummy_packet_size = TOTAL_TX_DUMMY_PACKET_SIZE -
1325 sizeof(struct wl1271_tx_hw_descr) - sizeof(*hdr);
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;
1333 skb_reserve(skb, sizeof(struct wl1271_tx_hw_descr));
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);
1340 skb_put_zero(skb, dummy_packet_size);
1342 /* Dummy packets require the TID to be management */
1343 skb->priority = WL1271_TID_MGMT;
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));
1349 return skb;
1353 static int
1354 wl1271_validate_wowlan_pattern(struct cfg80211_pkt_pattern *p)
1356 int num_fields = 0, in_field = 0, fields_size = 0;
1357 int i, pattern_len = 0;
1359 if (!p->mask) {
1360 wl1271_warning("No mask in WoWLAN pattern");
1361 return -EINVAL;
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.
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++;
1387 } else {
1388 if (in_field) {
1389 in_field = 0;
1390 fields_size += pattern_len +
1391 RX_FILTER_FIELD_OVERHEAD;
1392 num_fields++;
1397 if (in_field) {
1398 fields_size += pattern_len + RX_FILTER_FIELD_OVERHEAD;
1399 num_fields++;
1402 if (num_fields > WL1271_RX_FILTER_MAX_FIELDS) {
1403 wl1271_warning("RX Filter too complex. Too many segments");
1404 return -EINVAL;
1407 if (fields_size > WL1271_RX_FILTER_MAX_FIELDS_SIZE) {
1408 wl1271_warning("RX filter pattern is too big");
1409 return -E2BIG;
1412 return 0;
1415 struct wl12xx_rx_filter *wl1271_rx_filter_alloc(void)
1417 return kzalloc(sizeof(struct wl12xx_rx_filter), GFP_KERNEL);
1420 void wl1271_rx_filter_free(struct wl12xx_rx_filter *filter)
1422 int i;
1424 if (filter == NULL)
1425 return;
1427 for (i = 0; i < filter->num_fields; i++)
1428 kfree(filter->fields[i].pattern);
1430 kfree(filter);
1433 int wl1271_rx_filter_alloc_field(struct wl12xx_rx_filter *filter,
1434 u16 offset, u8 flags,
1435 const u8 *pattern, u8 len)
1437 struct wl12xx_rx_filter_field *field;
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;
1444 field = &filter->fields[filter->num_fields];
1446 field->pattern = kmemdup(pattern, len, GFP_KERNEL);
1447 if (!field->pattern) {
1448 wl1271_warning("Failed to allocate RX filter pattern");
1449 return -ENOMEM;
1452 filter->num_fields++;
1454 field->offset = cpu_to_le16(offset);
1455 field->flags = flags;
1456 field->len = len;
1458 return 0;
1461 int wl1271_rx_filter_get_fields_size(struct wl12xx_rx_filter *filter)
1463 int i, fields_size = 0;
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 *);
1470 return fields_size;
1473 void wl1271_rx_filter_flatten_fields(struct wl12xx_rx_filter *filter,
1474 u8 *buf)
1476 int i;
1477 struct wl12xx_rx_filter_field *field;
1479 for (i = 0; i < filter->num_fields; i++) {
1480 field = (struct wl12xx_rx_filter_field *)buf;
1482 field->offset = filter->fields[i].offset;
1483 field->flags = filter->fields[i].flags;
1484 field->len = filter->fields[i].len;
1486 memcpy(&field->pattern, filter->fields[i].pattern, field->len);
1487 buf += sizeof(struct wl12xx_rx_filter_field) -
1488 sizeof(u8 *) + field->len;
1493 * Allocates an RX filter returned through f
1494 * which needs to be freed using rx_filter_free()
1496 static int
1497 wl1271_convert_wowlan_pattern_to_rx_filter(struct cfg80211_pkt_pattern *p,
1498 struct wl12xx_rx_filter **f)
1500 int i, j, ret = 0;
1501 struct wl12xx_rx_filter *filter;
1502 u16 offset;
1503 u8 flags, len;
1505 filter = wl1271_rx_filter_alloc();
1506 if (!filter) {
1507 wl1271_warning("Failed to alloc rx filter");
1508 ret = -ENOMEM;
1509 goto err;
1512 i = 0;
1513 while (i < p->pattern_len) {
1514 if (!test_bit(i, (unsigned long *)p->mask)) {
1515 i++;
1516 continue;
1519 for (j = i; j < p->pattern_len; j++) {
1520 if (!test_bit(j, (unsigned long *)p->mask))
1521 break;
1523 if (i < WL1271_RX_FILTER_ETH_HEADER_SIZE &&
1524 j >= WL1271_RX_FILTER_ETH_HEADER_SIZE)
1525 break;
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;
1536 len = j - i;
1538 ret = wl1271_rx_filter_alloc_field(filter,
1539 offset,
1540 flags,
1541 &p->pattern[i], len);
1542 if (ret)
1543 goto err;
1545 i = j;
1548 filter->action = FILTER_SIGNAL;
1550 *f = filter;
1551 return 0;
1553 err:
1554 wl1271_rx_filter_free(filter);
1555 *f = NULL;
1557 return ret;
1560 static int wl1271_configure_wowlan(struct wl1271 *wl,
1561 struct cfg80211_wowlan *wow)
1563 int i, ret;
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;
1571 ret = wl1271_rx_filter_clear_all(wl);
1572 if (ret)
1573 goto out;
1575 return 0;
1578 if (WARN_ON(wow->n_patterns > WL1271_MAX_RX_FILTERS))
1579 return -EINVAL;
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;
1590 ret = wl1271_acx_default_rx_filter_enable(wl, 0, FILTER_SIGNAL);
1591 if (ret)
1592 goto out;
1594 ret = wl1271_rx_filter_clear_all(wl);
1595 if (ret)
1596 goto out;
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;
1603 p = &wow->patterns[i];
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;
1612 ret = wl1271_rx_filter_enable(wl, i, 1, filter);
1614 wl1271_rx_filter_free(filter);
1615 if (ret)
1616 goto out;
1619 ret = wl1271_acx_default_rx_filter_enable(wl, 1, FILTER_DROP);
1621 out:
1622 return ret;
1625 static int wl1271_configure_suspend_sta(struct wl1271 *wl,
1626 struct wl12xx_vif *wlvif,
1627 struct cfg80211_wowlan *wow)
1629 int ret = 0;
1631 if (!test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags))
1632 goto out;
1634 ret = wl1271_configure_wowlan(wl, wow);
1635 if (ret < 0)
1636 goto out;
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;
1644 ret = wl1271_acx_wake_up_conditions(wl, wlvif,
1645 wl->conf.conn.suspend_wake_up_event,
1646 wl->conf.conn.suspend_listen_interval);
1648 if (ret < 0)
1649 wl1271_error("suspend: set wake up conditions failed: %d", ret);
1650 out:
1651 return ret;
1655 static int wl1271_configure_suspend_ap(struct wl1271 *wl,
1656 struct wl12xx_vif *wlvif,
1657 struct cfg80211_wowlan *wow)
1659 int ret = 0;
1661 if (!test_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags))
1662 goto out;
1664 ret = wl1271_acx_beacon_filter_opt(wl, wlvif, true);
1665 if (ret < 0)
1666 goto out;
1668 ret = wl1271_configure_wowlan(wl, wow);
1669 if (ret < 0)
1670 goto out;
1672 out:
1673 return ret;
1677 static int wl1271_configure_suspend(struct wl1271 *wl,
1678 struct wl12xx_vif *wlvif,
1679 struct cfg80211_wowlan *wow)
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;
1688 static void wl1271_configure_resume(struct wl1271 *wl, struct wl12xx_vif *wlvif)
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;
1694 if ((!is_ap) && (!is_sta))
1695 return;
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;
1701 wl1271_configure_wowlan(wl, NULL);
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;
1710 ret = wl1271_acx_wake_up_conditions(wl, wlvif,
1711 wl->conf.conn.wake_up_event,
1712 wl->conf.conn.listen_interval);
1714 if (ret < 0)
1715 wl1271_error("resume: wake up conditions failed: %d",
1716 ret);
1718 } else if (is_ap) {
1719 ret = wl1271_acx_beacon_filter_opt(wl, wlvif, false);
1723 static int __maybe_unused wl1271_op_suspend(struct ieee80211_hw *hw,
1724 struct cfg80211_wowlan *wow)
1726 struct wl1271 *wl = hw->priv;
1727 struct wl12xx_vif *wlvif;
1728 unsigned long flags;
1729 int ret;
1731 wl1271_debug(DEBUG_MAC80211, "mac80211 suspend wow=%d", !!wow);
1732 WARN_ON(!wow);
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;
1740 wl1271_tx_flush(wl);
1742 mutex_lock(&wl->mutex);
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;
1751 wl->wow_enabled = true;
1752 wl12xx_for_each_wlvif(wl, wlvif) {
1753 if (wlcore_is_p2p_mgmt(wlvif))
1754 continue;
1756 ret = wl1271_configure_suspend(wl, wlvif, wow);
1757 if (ret < 0) {
1758 goto out_sleep;
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;
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;
1773 out_sleep:
1774 pm_runtime_put_noidle(wl->dev);
1775 mutex_unlock(&wl->mutex);
1777 if (ret < 0) {
1778 wl1271_warning("couldn't prepare device to suspend");
1779 return ret;
1782 /* flush any remaining work */
1783 wl1271_debug(DEBUG_MAC80211, "flushing remaining works");
1785 flush_work(&wl->tx_work);
1788 * Cancel the watchdog even if above tx_flush failed. We will detect
1789 * it on resume anyway.
1791 cancel_delayed_work(&wl->tx_watchdog_work);
1794 * set suspended flag to avoid triggering a new threaded_irq
1795 * work.
1797 spin_lock_irqsave(&wl->wl_lock, flags);
1798 set_bit(WL1271_FLAG_SUSPENDED, &wl->flags);
1799 spin_unlock_irqrestore(&wl->wl_lock, flags);
1801 return pm_runtime_force_suspend(wl->dev);
1804 static int __maybe_unused wl1271_op_resume(struct ieee80211_hw *hw)
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;
1812 wl1271_debug(DEBUG_MAC80211, "mac80211 resume wow=%d",
1813 wl->wow_enabled);
1814 WARN_ON(!wl->wow_enabled);
1816 ret = pm_runtime_force_resume(wl->dev);
1817 if (ret < 0) {
1818 wl1271_error("ELP wakeup failure!");
1819 goto out_sleep;
1823 * re-enable irq_work enqueuing, and call irq_work directly if
1824 * there is a pending work.
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);
1832 mutex_lock(&wl->mutex);
1834 /* test the recovery flag before calling any SDIO functions */
1835 pending_recovery = test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS,
1836 &wl->flags);
1838 if (run_irq_work) {
1839 wl1271_debug(DEBUG_MAC80211,
1840 "run postponed irq_work directly");
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);
1849 wlcore_enable_interrupts(wl);
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;
1858 ret = pm_runtime_get_sync(wl->dev);
1859 if (ret < 0) {
1860 pm_runtime_put_noidle(wl->dev);
1861 goto out;
1864 wl12xx_for_each_wlvif(wl, wlvif) {
1865 if (wlcore_is_p2p_mgmt(wlvif))
1866 continue;
1868 wl1271_configure_resume(wl, wlvif);
1871 ret = wlcore_hw_interrupt_notify(wl, true);
1872 if (ret < 0)
1873 goto out_sleep;
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;
1880 out_sleep:
1881 pm_runtime_mark_last_busy(wl->dev);
1882 pm_runtime_put_autosuspend(wl->dev);
1884 out:
1885 wl->wow_enabled = false;
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.
1892 set_bit(WL1271_FLAG_REINIT_TX_WDOG, &wl->flags);
1893 mutex_unlock(&wl->mutex);
1895 return 0;
1898 static int wl1271_op_start(struct ieee80211_hw *hw)
1900 wl1271_debug(DEBUG_MAC80211, "mac80211 start");
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.
1909 * The MAC address is first known when the corresponding interface
1910 * is added. That is where we will initialize the hardware.
1913 return 0;
1916 static void wlcore_op_stop_locked(struct wl1271 *wl)
1918 int i;
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);
1925 return;
1929 * this must be before the cancel_work calls below, so that the work
1930 * functions don't perform further work.
1932 wl->state = WLCORE_STATE_OFF;
1935 * Use the nosync variant to disable interrupts, so the mutex could be
1936 * held while doing so without deadlocking.
1938 wlcore_disable_interrupts_nosync(wl);
1940 mutex_unlock(&wl->mutex);
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);
1951 /* let's notify MAC80211 about the remaining pending TX frames */
1952 mutex_lock(&wl->mutex);
1953 wl12xx_tx_reset(wl);
1955 wl1271_power_off(wl);
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
1961 if (test_and_clear_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags))
1962 wlcore_enable_interrupts(wl);
1964 wl->band = NL80211_BAND_2GHZ;
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;
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);
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.
1995 wl->flags = 0;
1997 wl->tx_blocks_freed = 0;
1999 for (i = 0; i < NUM_TX_QUEUES; i++) {
2000 wl->tx_pkts_freed[i] = 0;
2001 wl->tx_allocated_pkts[i] = 0;
2004 wl1271_debugfs_reset(wl);
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;
2016 * FW channels must be re-calibrated after recovery,
2017 * save current Reg-Domain channel configuration and clear it.
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));
2024 static void wlcore_op_stop(struct ieee80211_hw *hw)
2026 struct wl1271 *wl = hw->priv;
2028 wl1271_debug(DEBUG_MAC80211, "mac80211 stop");
2030 mutex_lock(&wl->mutex);
2032 wlcore_op_stop_locked(wl);
2034 mutex_unlock(&wl->mutex);
2037 static void wlcore_channel_switch_work(struct work_struct *work)
2039 struct delayed_work *dwork;
2040 struct wl1271 *wl;
2041 struct ieee80211_vif *vif;
2042 struct wl12xx_vif *wlvif;
2043 int ret;
2045 dwork = to_delayed_work(work);
2046 wlvif = container_of(dwork, struct wl12xx_vif, channel_switch_work);
2047 wl = wlvif->wl;
2049 wl1271_info("channel switch failed (role_id: %d).", wlvif->role_id);
2051 mutex_lock(&wl->mutex);
2053 if (unlikely(wl->state != WLCORE_STATE_ON))
2054 goto out;
2056 /* check the channel switch is still ongoing */
2057 if (!test_and_clear_bit(WLVIF_FLAG_CS_PROGRESS, &wlvif->flags))
2058 goto out;
2060 vif = wl12xx_wlvif_to_vif(wlvif);
2061 ieee80211_chswitch_done(vif, false);
2063 ret = pm_runtime_get_sync(wl->dev);
2064 if (ret < 0) {
2065 pm_runtime_put_noidle(wl->dev);
2066 goto out;
2069 wl12xx_cmd_stop_channel_switch(wl, wlvif);
2071 pm_runtime_mark_last_busy(wl->dev);
2072 pm_runtime_put_autosuspend(wl->dev);
2073 out:
2074 mutex_unlock(&wl->mutex);
2077 static void wlcore_connection_loss_work(struct work_struct *work)
2079 struct delayed_work *dwork;
2080 struct wl1271 *wl;
2081 struct ieee80211_vif *vif;
2082 struct wl12xx_vif *wlvif;
2084 dwork = to_delayed_work(work);
2085 wlvif = container_of(dwork, struct wl12xx_vif, connection_loss_work);
2086 wl = wlvif->wl;
2088 wl1271_info("Connection loss work (role_id: %d).", wlvif->role_id);
2090 mutex_lock(&wl->mutex);
2092 if (unlikely(wl->state != WLCORE_STATE_ON))
2093 goto out;
2095 /* Call mac80211 connection loss */
2096 if (!test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags))
2097 goto out;
2099 vif = wl12xx_wlvif_to_vif(wlvif);
2100 ieee80211_connection_loss(vif);
2101 out:
2102 mutex_unlock(&wl->mutex);
2105 static void wlcore_pending_auth_complete_work(struct work_struct *work)
2107 struct delayed_work *dwork;
2108 struct wl1271 *wl;
2109 struct wl12xx_vif *wlvif;
2110 unsigned long time_spare;
2111 int ret;
2113 dwork = to_delayed_work(work);
2114 wlvif = container_of(dwork, struct wl12xx_vif,
2115 pending_auth_complete_work);
2116 wl = wlvif->wl;
2118 mutex_lock(&wl->mutex);
2120 if (unlikely(wl->state != WLCORE_STATE_ON))
2121 goto out;
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.
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;
2134 ret = pm_runtime_get_sync(wl->dev);
2135 if (ret < 0) {
2136 pm_runtime_put_noidle(wl->dev);
2137 goto out;
2140 /* cancel the ROC if active */
2141 wlcore_update_inconn_sta(wl, wlvif, NULL, false);
2143 pm_runtime_mark_last_busy(wl->dev);
2144 pm_runtime_put_autosuspend(wl->dev);
2145 out:
2146 mutex_unlock(&wl->mutex);
2149 static int wl12xx_allocate_rate_policy(struct wl1271 *wl, u8 *idx)
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;
2156 __set_bit(policy, wl->rate_policies_map);
2157 *idx = policy;
2158 return 0;
2161 static void wl12xx_free_rate_policy(struct wl1271 *wl, u8 *idx)
2163 if (WARN_ON(*idx >= WL12XX_MAX_RATE_POLICIES))
2164 return;
2166 __clear_bit(*idx, wl->rate_policies_map);
2167 *idx = WL12XX_MAX_RATE_POLICIES;
2170 static int wlcore_allocate_klv_template(struct wl1271 *wl, u8 *idx)
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;
2177 __set_bit(policy, wl->klv_templates_map);
2178 *idx = policy;
2179 return 0;
2182 static void wlcore_free_klv_template(struct wl1271 *wl, u8 *idx)
2184 if (WARN_ON(*idx >= WLCORE_MAX_KLV_TEMPLATES))
2185 return;
2187 __clear_bit(*idx, wl->klv_templates_map);
2188 *idx = WLCORE_MAX_KLV_TEMPLATES;
2191 static u8 wl12xx_get_role_type(struct wl1271 *wl, struct wl12xx_vif *wlvif)
2193 struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
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;
2204 case BSS_TYPE_STA_BSS:
2205 if (wlvif->p2p)
2206 return WL1271_ROLE_P2P_CL;
2207 else
2208 return WL1271_ROLE_STA;
2210 case BSS_TYPE_IBSS:
2211 return WL1271_ROLE_IBSS;
2213 default:
2214 wl1271_error("invalid bss_type: %d", wlvif->bss_type);
2216 return WL12XX_INVALID_ROLE_TYPE;
2219 static int wl12xx_init_vif_data(struct wl1271 *wl, struct ieee80211_vif *vif)
2221 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
2222 int i;
2224 /* clear everything but the persistent data */
2225 memset(wlvif, 0, offsetof(struct wl12xx_vif, persistent));
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;
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;
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;
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).
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;
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;
2290 * mac80211 configures some values globally, while we treat them
2291 * per-interface. thus, on init, we have to copy them from wl
2293 wlvif->band = wl->band;
2294 wlvif->channel = wl->channel;
2295 wlvif->power_level = wl->power_level;
2296 wlvif->channel_type = wl->channel_type;
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);
2311 timer_setup(&wlvif->rx_streaming_timer, wl1271_rx_streaming_timer, 0);
2312 return 0;
2315 static int wl12xx_init_fw(struct wl1271 *wl)
2317 int retries = WL1271_BOOT_RETRIES;
2318 bool booted = false;
2319 struct wiphy *wiphy = wl->hw->wiphy;
2320 int ret;
2322 while (retries) {
2323 retries--;
2324 ret = wl12xx_chip_wakeup(wl, false);
2325 if (ret < 0)
2326 goto power_off;
2328 ret = wl->ops->boot(wl);
2329 if (ret < 0)
2330 goto power_off;
2332 ret = wl1271_hw_init(wl);
2333 if (ret < 0)
2334 goto irq_disable;
2336 booted = true;
2337 break;
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);
2356 if (!booted) {
2357 wl1271_error("firmware boot failed despite %d retries",
2358 WL1271_BOOT_RETRIES);
2359 goto out;
2362 wl1271_info("firmware booted (%s)", wl->chip.fw_ver_str);
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));
2370 * Now we know if 11a is supported (info from the NVS), so disable
2371 * 11a channels if not supported
2373 if (!wl->enable_11a)
2374 wiphy->bands[NL80211_BAND_5GHZ]->n_channels = 0;
2376 wl1271_debug(DEBUG_MAC80211, "11a is %ssupported",
2377 wl->enable_11a ? "" : "not ");
2379 wl->state = WLCORE_STATE_ON;
2380 out:
2381 return ret;
2384 static bool wl12xx_dev_role_started(struct wl12xx_vif *wlvif)
2386 return wlvif->dev_hlid != WL12XX_INVALID_LINK_ID;
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).
2396 static bool wl12xx_need_fw_change(struct wl1271 *wl,
2397 struct vif_counter_data vif_counter_data,
2398 bool add)
2400 enum wl12xx_fw_type current_fw = wl->fw_type;
2401 u8 vif_count = vif_counter_data.counter;
2403 if (test_bit(WL1271_FLAG_VIF_CHANGE_IN_PROGRESS, &wl->flags))
2404 return false;
2406 /* increase the vif count if this is a new vif */
2407 if (add && !vif_counter_data.cur_vif_running)
2408 vif_count++;
2410 wl->last_vif_count = vif_count;
2412 /* no need for fw change if the device is OFF */
2413 if (wl->state == WLCORE_STATE_OFF)
2414 return false;
2416 /* no need for fw change if a single fw is used */
2417 if (!wl->mr_fw_name)
2418 return false;
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;
2425 return false;
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.
2432 static void wl12xx_force_active_psm(struct wl1271 *wl)
2434 struct wl12xx_vif *wlvif;
2436 wl12xx_for_each_wlvif_sta(wl, wlvif) {
2437 wl1271_ps_set_mode(wl, wlvif, STATION_POWER_SAVE_MODE);
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;
2449 static void wlcore_hw_queue_iter(void *data, u8 *mac,
2450 struct ieee80211_vif *vif)
2452 struct wlcore_hw_queue_iter_data *iter_data = data;
2454 if (vif->type == NL80211_IFTYPE_P2P_DEVICE ||
2455 WARN_ON_ONCE(vif->hw_queue[0] == IEEE80211_INVAL_HW_QUEUE))
2456 return;
2458 if (iter_data->cur_running || vif == iter_data->vif) {
2459 iter_data->cur_running = true;
2460 return;
2463 __set_bit(vif->hw_queue[0] / NUM_TX_QUEUES, iter_data->hw_queue_map);
2466 static int wlcore_allocate_hw_queue_base(struct wl1271 *wl,
2467 struct wl12xx_vif *wlvif)
2469 struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
2470 struct wlcore_hw_queue_iter_data iter_data = {};
2471 int i, q_base;
2473 if (vif->type == NL80211_IFTYPE_P2P_DEVICE) {
2474 vif->cab_queue = IEEE80211_INVAL_HW_QUEUE;
2475 return 0;
2478 iter_data.vif = vif;
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);
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);
2492 /* interface type might have changed type */
2493 goto adjust_cab_queue;
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;
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);
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;
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;
2519 return 0;
2522 static int wl1271_op_add_interface(struct ieee80211_hw *hw,
2523 struct ieee80211_vif *vif)
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;
2531 if (wl->plt) {
2532 wl1271_error("Adding Interface not allowed while in PLT mode");
2533 return -EBUSY;
2536 vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER |
2537 IEEE80211_VIF_SUPPORTS_UAPSD |
2538 IEEE80211_VIF_SUPPORTS_CQM_RSSI;
2540 wl1271_debug(DEBUG_MAC80211, "mac80211 add interface type %d mac %pM",
2541 ieee80211_vif_type_p2p(vif), vif->addr);
2543 wl12xx_get_vif_count(hw, vif, &vif_count);
2545 mutex_lock(&wl->mutex);
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.
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;
2559 ret = wl12xx_init_vif_data(wl, vif);
2560 if (ret < 0)
2561 goto out;
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;
2570 ret = wlcore_allocate_hw_queue_base(wl, wlvif);
2571 if (ret < 0)
2572 goto out;
2575 * TODO: after the nvs issue will be solved, move this block
2576 * to start(), and make sure here the driver is ON.
2578 if (wl->state == WLCORE_STATE_OFF) {
2580 * we still need this in order to configure the fw
2581 * while uploading the nvs
2583 memcpy(wl->addresses[0].addr, vif->addr, ETH_ALEN);
2585 ret = wl12xx_init_fw(wl);
2586 if (ret < 0)
2587 goto out;
2591 * Call runtime PM only after possible wl12xx_init_fw() above
2592 * is done. Otherwise we do not have interrupts enabled.
2594 ret = pm_runtime_get_sync(wl->dev);
2595 if (ret < 0) {
2596 pm_runtime_put_noidle(wl->dev);
2597 goto out_unlock;
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;
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;
2614 ret = wl1271_init_vif_specific(wl, vif);
2615 if (ret < 0)
2616 goto out;
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;
2624 /* needed mainly for configuring rate policies */
2625 ret = wl1271_sta_hw_init(wl, wlvif);
2626 if (ret < 0)
2627 goto out;
2630 list_add(&wlvif->list, &wl->wlvif_list);
2631 set_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags);
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);
2643 return ret;
2646 static void __wl1271_op_remove_interface(struct wl1271 *wl,
2647 struct ieee80211_vif *vif,
2648 bool reset_tx_queues)
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);
2654 wl1271_debug(DEBUG_MAC80211, "mac80211 remove interface");
2656 if (!test_and_clear_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags))
2657 return;
2659 /* because of hardware recovery, we may get here twice */
2660 if (wl->state == WLCORE_STATE_OFF)
2661 return;
2663 wl1271_info("down");
2665 if (wl->scan.state != WL1271_SCAN_STATE_IDLE &&
2666 wl->scan_wlvif == wlvif) {
2667 struct cfg80211_scan_info info = {
2668 .aborted = true,
2672 * Rearm the tx watchdog just before idling scan. This
2673 * prevents just-finished scans from triggering the watchdog
2675 wl12xx_rearm_tx_watchdog_locked(wl);
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);
2684 if (wl->sched_vif == wlvif)
2685 wl->sched_vif = NULL;
2687 if (wl->roc_vif == vif) {
2688 wl->roc_vif = NULL;
2689 ieee80211_remain_on_channel_expired(wl->hw);
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;
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);
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;
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;
2720 pm_runtime_mark_last_busy(wl->dev);
2721 pm_runtime_put_autosuspend(wl->dev);
2723 deinit:
2724 wl12xx_tx_reset_wlvif(wl, wlvif);
2726 /* clear all hlids (except system_hlid) */
2727 wlvif->dev_hlid = WL12XX_INVALID_LINK_ID;
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);
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;
2756 if (is_ap)
2757 wl->ap_count--;
2758 else
2759 wl->sta_count--;
2762 * Last AP, have more stations. Configure sleep auth according to STA.
2763 * Don't do thin on unintended recovery.
2765 if (test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags) &&
2766 !test_bit(WL1271_FLAG_INTENDED_FW_RECOVERY, &wl->flags))
2767 goto unlock;
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);
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);
2785 unlock:
2786 mutex_unlock(&wl->mutex);
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);
2796 mutex_lock(&wl->mutex);
2799 static void wl1271_op_remove_interface(struct ieee80211_hw *hw,
2800 struct ieee80211_vif *vif)
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;
2807 wl12xx_get_vif_count(hw, vif, &vif_count);
2808 mutex_lock(&wl->mutex);
2810 if (wl->state == WLCORE_STATE_OFF ||
2811 !test_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags))
2812 goto out;
2815 * wl->vif can be null here if someone shuts down the interface
2816 * just when hardware recovery has been started.
2818 wl12xx_for_each_wlvif(wl, iter) {
2819 if (iter != wlvif)
2820 continue;
2822 __wl1271_op_remove_interface(wl, vif, true);
2823 break;
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);
2831 out:
2832 mutex_unlock(&wl->mutex);
2835 static int wl12xx_op_change_interface(struct ieee80211_hw *hw,
2836 struct ieee80211_vif *vif,
2837 enum nl80211_iftype new_type, bool p2p)
2839 struct wl1271 *wl = hw->priv;
2840 int ret;
2842 set_bit(WL1271_FLAG_VIF_CHANGE_IN_PROGRESS, &wl->flags);
2843 wl1271_op_remove_interface(hw, vif);
2845 vif->type = new_type;
2846 vif->p2p = p2p;
2847 ret = wl1271_op_add_interface(hw, vif);
2849 clear_bit(WL1271_FLAG_VIF_CHANGE_IN_PROGRESS, &wl->flags);
2850 return ret;
2853 static int wlcore_join(struct wl1271 *wl, struct wl12xx_vif *wlvif)
2855 int ret;
2856 bool is_ibss = (wlvif->bss_type == BSS_TYPE_IBSS);
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 :)
2867 if (test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags))
2868 wl1271_info("JOIN while associated.");
2870 /* clear encryption type */
2871 wlvif->encryption_type = KEY_NONE;
2873 if (is_ibss)
2874 ret = wl12xx_cmd_role_start_ibss(wl, wlvif);
2875 else {
2876 if (wl->quirks & WLCORE_QUIRK_START_STA_FAILS) {
2878 * TODO: this is an ugly workaround for wl12xx fw
2879 * bug - we are not able to tx/rx after the first
2880 * start_sta, so make dummy start+stop calls,
2881 * and then call start_sta again.
2882 * this should be fixed in the fw.
2884 wl12xx_cmd_role_start_sta(wl, wlvif);
2885 wl12xx_cmd_role_stop_sta(wl, wlvif);
2888 ret = wl12xx_cmd_role_start_sta(wl, wlvif);
2891 return ret;
2894 static int wl1271_ssid_set(struct wl12xx_vif *wlvif, struct sk_buff *skb,
2895 int offset)
2897 u8 ssid_len;
2898 const u8 *ptr = cfg80211_find_ie(WLAN_EID_SSID, skb->data + offset,
2899 skb->len - offset);
2901 if (!ptr) {
2902 wl1271_error("No SSID in IEs!");
2903 return -ENOENT;
2906 ssid_len = ptr[1];
2907 if (ssid_len > IEEE80211_MAX_SSID_LEN) {
2908 wl1271_error("SSID is too long!");
2909 return -EINVAL;
2912 wlvif->ssid_len = ssid_len;
2913 memcpy(wlvif->ssid, ptr+2, ssid_len);
2914 return 0;
2917 static int wlcore_set_ssid(struct wl1271 *wl, struct wl12xx_vif *wlvif)
2919 struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
2920 struct sk_buff *skb;
2921 int ieoffset;
2923 /* we currently only support setting the ssid from the ap probe req */
2924 if (wlvif->bss_type != BSS_TYPE_STA_BSS)
2925 return -EINVAL;
2927 skb = ieee80211_ap_probereq_get(wl->hw, vif);
2928 if (!skb)
2929 return -EINVAL;
2931 ieoffset = offsetof(struct ieee80211_mgmt,
2932 u.probe_req.variable);
2933 wl1271_ssid_set(wlvif, skb, ieoffset);
2934 dev_kfree_skb(skb);
2936 return 0;
2939 static int wlcore_set_assoc(struct wl1271 *wl, struct wl12xx_vif *wlvif,
2940 struct ieee80211_bss_conf *bss_conf,
2941 u32 sta_rate_set)
2943 int ieoffset;
2944 int ret;
2946 wlvif->aid = bss_conf->aid;
2947 wlvif->channel_type = cfg80211_get_chandef_type(&bss_conf->chandef);
2948 wlvif->beacon_int = bss_conf->beacon_int;
2949 wlvif->wmm_enabled = bss_conf->qos;
2951 set_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags);
2954 * with wl1271, we don't need to update the
2955 * beacon_int and dtim_period, because the firmware
2956 * updates it by itself when the first beacon is
2957 * received after a join.
2959 ret = wl1271_cmd_build_ps_poll(wl, wlvif, wlvif->aid);
2960 if (ret < 0)
2961 return ret;
2964 * Get a template for hardware connection maintenance
2966 dev_kfree_skb(wlvif->probereq);
2967 wlvif->probereq = wl1271_cmd_build_ap_probe_req(wl,
2968 wlvif,
2969 NULL);
2970 ieoffset = offsetof(struct ieee80211_mgmt,
2971 u.probe_req.variable);
2972 wl1271_ssid_set(wlvif, wlvif->probereq, ieoffset);
2974 /* enable the connection monitoring feature */
2975 ret = wl1271_acx_conn_monit_params(wl, wlvif, true);
2976 if (ret < 0)
2977 return ret;
2980 * The join command disable the keep-alive mode, shut down its process,
2981 * and also clear the template config, so we need to reset it all after
2982 * the join. The acx_aid starts the keep-alive process, and the order
2983 * of the commands below is relevant.
2985 ret = wl1271_acx_keep_alive_mode(wl, wlvif, true);
2986 if (ret < 0)
2987 return ret;
2989 ret = wl1271_acx_aid(wl, wlvif, wlvif->aid);
2990 if (ret < 0)
2991 return ret;
2993 ret = wl12xx_cmd_build_klv_null_data(wl, wlvif);
2994 if (ret < 0)
2995 return ret;
2997 ret = wl1271_acx_keep_alive_config(wl, wlvif,
2998 wlvif->sta.klv_template_id,
2999 ACX_KEEP_ALIVE_TPL_VALID);
3000 if (ret < 0)
3001 return ret;
3004 * The default fw psm configuration is AUTO, while mac80211 default
3005 * setting is off (ACTIVE), so sync the fw with the correct value.
3007 ret = wl1271_ps_set_mode(wl, wlvif, STATION_ACTIVE_MODE);
3008 if (ret < 0)
3009 return ret;
3011 if (sta_rate_set) {
3012 wlvif->rate_set =
3013 wl1271_tx_enabled_rates_get(wl,
3014 sta_rate_set,
3015 wlvif->band);
3016 ret = wl1271_acx_sta_rate_policies(wl, wlvif);
3017 if (ret < 0)
3018 return ret;
3021 return ret;
3024 static int wlcore_unset_assoc(struct wl1271 *wl, struct wl12xx_vif *wlvif)
3026 int ret;
3027 bool sta = wlvif->bss_type == BSS_TYPE_STA_BSS;
3029 /* make sure we are connected (sta) joined */
3030 if (sta &&
3031 !test_and_clear_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags))
3032 return false;
3034 /* make sure we are joined (ibss) */
3035 if (!sta &&
3036 test_and_clear_bit(WLVIF_FLAG_IBSS_JOINED, &wlvif->flags))
3037 return false;
3039 if (sta) {
3040 /* use defaults when not associated */
3041 wlvif->aid = 0;
3043 /* free probe-request template */
3044 dev_kfree_skb(wlvif->probereq);
3045 wlvif->probereq = NULL;
3047 /* disable connection monitor features */
3048 ret = wl1271_acx_conn_monit_params(wl, wlvif, false);
3049 if (ret < 0)
3050 return ret;
3052 /* Disable the keep-alive feature */
3053 ret = wl1271_acx_keep_alive_mode(wl, wlvif, false);
3054 if (ret < 0)
3055 return ret;
3057 /* disable beacon filtering */
3058 ret = wl1271_acx_beacon_filter_opt(wl, wlvif, false);
3059 if (ret < 0)
3060 return ret;
3063 if (test_and_clear_bit(WLVIF_FLAG_CS_PROGRESS, &wlvif->flags)) {
3064 struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
3066 wl12xx_cmd_stop_channel_switch(wl, wlvif);
3067 ieee80211_chswitch_done(vif, false);
3068 cancel_delayed_work(&wlvif->channel_switch_work);
3071 /* invalidate keep-alive template */
3072 wl1271_acx_keep_alive_config(wl, wlvif,
3073 wlvif->sta.klv_template_id,
3074 ACX_KEEP_ALIVE_TPL_INVALID);
3076 return 0;
3079 static void wl1271_set_band_rate(struct wl1271 *wl, struct wl12xx_vif *wlvif)
3081 wlvif->basic_rate_set = wlvif->bitrate_masks[wlvif->band];
3082 wlvif->rate_set = wlvif->basic_rate_set;
3085 static void wl1271_sta_handle_idle(struct wl1271 *wl, struct wl12xx_vif *wlvif,
3086 bool idle)
3088 bool cur_idle = !test_bit(WLVIF_FLAG_ACTIVE, &wlvif->flags);
3090 if (idle == cur_idle)
3091 return;
3093 if (idle) {
3094 clear_bit(WLVIF_FLAG_ACTIVE, &wlvif->flags);
3095 } else {
3096 /* The current firmware only supports sched_scan in idle */
3097 if (wl->sched_vif == wlvif)
3098 wl->ops->sched_scan_stop(wl, wlvif);
3100 set_bit(WLVIF_FLAG_ACTIVE, &wlvif->flags);
3104 static int wl12xx_config_vif(struct wl1271 *wl, struct wl12xx_vif *wlvif,
3105 struct ieee80211_conf *conf, u32 changed)
3107 int ret;
3109 if (wlcore_is_p2p_mgmt(wlvif))
3110 return 0;
3112 if (conf->power_level != wlvif->power_level) {
3113 ret = wl1271_acx_tx_power(wl, wlvif, conf->power_level);
3114 if (ret < 0)
3115 return ret;
3117 wlvif->power_level = conf->power_level;
3120 return 0;
3123 static int wl1271_op_config(struct ieee80211_hw *hw, u32 changed)
3125 struct wl1271 *wl = hw->priv;
3126 struct wl12xx_vif *wlvif;
3127 struct ieee80211_conf *conf = &hw->conf;
3128 int ret = 0;
3130 wl1271_debug(DEBUG_MAC80211, "mac80211 config psm %s power %d %s"
3131 " changed 0x%x",
3132 conf->flags & IEEE80211_CONF_PS ? "on" : "off",
3133 conf->power_level,
3134 conf->flags & IEEE80211_CONF_IDLE ? "idle" : "in use",
3135 changed);
3137 mutex_lock(&wl->mutex);
3139 if (changed & IEEE80211_CONF_CHANGE_POWER)
3140 wl->power_level = conf->power_level;
3142 if (unlikely(wl->state != WLCORE_STATE_ON))
3143 goto out;
3145 ret = pm_runtime_get_sync(wl->dev);
3146 if (ret < 0) {
3147 pm_runtime_put_noidle(wl->dev);
3148 goto out;
3151 /* configure each interface */
3152 wl12xx_for_each_wlvif(wl, wlvif) {
3153 ret = wl12xx_config_vif(wl, wlvif, conf, changed);
3154 if (ret < 0)
3155 goto out_sleep;
3158 out_sleep:
3159 pm_runtime_mark_last_busy(wl->dev);
3160 pm_runtime_put_autosuspend(wl->dev);
3162 out:
3163 mutex_unlock(&wl->mutex);
3165 return ret;
3168 struct wl1271_filter_params {
3169 bool enabled;
3170 int mc_list_length;
3171 u8 mc_list[ACX_MC_ADDRESS_GROUP_MAX][ETH_ALEN];
3174 static u64 wl1271_op_prepare_multicast(struct ieee80211_hw *hw,
3175 struct netdev_hw_addr_list *mc_list)
3177 struct wl1271_filter_params *fp;
3178 struct netdev_hw_addr *ha;
3180 fp = kzalloc(sizeof(*fp), GFP_ATOMIC);
3181 if (!fp) {
3182 wl1271_error("Out of memory setting filters.");
3183 return 0;
3186 /* update multicast filtering parameters */
3187 fp->mc_list_length = 0;
3188 if (netdev_hw_addr_list_count(mc_list) > ACX_MC_ADDRESS_GROUP_MAX) {
3189 fp->enabled = false;
3190 } else {
3191 fp->enabled = true;
3192 netdev_hw_addr_list_for_each(ha, mc_list) {
3193 memcpy(fp->mc_list[fp->mc_list_length],
3194 ha->addr, ETH_ALEN);
3195 fp->mc_list_length++;
3199 return (u64)(unsigned long)fp;
3202 #define WL1271_SUPPORTED_FILTERS (FIF_ALLMULTI | \
3203 FIF_FCSFAIL | \
3204 FIF_BCN_PRBRESP_PROMISC | \
3205 FIF_CONTROL | \
3206 FIF_OTHER_BSS)
3208 static void wl1271_op_configure_filter(struct ieee80211_hw *hw,
3209 unsigned int changed,
3210 unsigned int *total, u64 multicast)
3212 struct wl1271_filter_params *fp = (void *)(unsigned long)multicast;
3213 struct wl1271 *wl = hw->priv;
3214 struct wl12xx_vif *wlvif;
3216 int ret;
3218 wl1271_debug(DEBUG_MAC80211, "mac80211 configure filter changed %x"
3219 " total %x", changed, *total);
3221 mutex_lock(&wl->mutex);
3223 *total &= WL1271_SUPPORTED_FILTERS;
3224 changed &= WL1271_SUPPORTED_FILTERS;
3226 if (unlikely(wl->state != WLCORE_STATE_ON))
3227 goto out;
3229 ret = pm_runtime_get_sync(wl->dev);
3230 if (ret < 0) {
3231 pm_runtime_put_noidle(wl->dev);
3232 goto out;
3235 wl12xx_for_each_wlvif(wl, wlvif) {
3236 if (wlcore_is_p2p_mgmt(wlvif))
3237 continue;
3239 if (wlvif->bss_type != BSS_TYPE_AP_BSS) {
3240 if (*total & FIF_ALLMULTI)
3241 ret = wl1271_acx_group_address_tbl(wl, wlvif,
3242 false,
3243 NULL, 0);
3244 else if (fp)
3245 ret = wl1271_acx_group_address_tbl(wl, wlvif,
3246 fp->enabled,
3247 fp->mc_list,
3248 fp->mc_list_length);
3249 if (ret < 0)
3250 goto out_sleep;
3254 * If interface in AP mode and created with allmulticast then disable
3255 * the firmware filters so that all multicast packets are passed
3256 * This is mandatory for MDNS based discovery protocols
3258 if (wlvif->bss_type == BSS_TYPE_AP_BSS) {
3259 if (*total & FIF_ALLMULTI) {
3260 ret = wl1271_acx_group_address_tbl(wl, wlvif,
3261 false,
3262 NULL, 0);
3263 if (ret < 0)
3264 goto out_sleep;
3270 * the fw doesn't provide an api to configure the filters. instead,
3271 * the filters configuration is based on the active roles / ROC
3272 * state.
3275 out_sleep:
3276 pm_runtime_mark_last_busy(wl->dev);
3277 pm_runtime_put_autosuspend(wl->dev);
3279 out:
3280 mutex_unlock(&wl->mutex);
3281 kfree(fp);
3284 static int wl1271_record_ap_key(struct wl1271 *wl, struct wl12xx_vif *wlvif,
3285 u8 id, u8 key_type, u8 key_size,
3286 const u8 *key, u8 hlid, u32 tx_seq_32,
3287 u16 tx_seq_16, bool is_pairwise)
3289 struct wl1271_ap_key *ap_key;
3290 int i;
3292 wl1271_debug(DEBUG_CRYPT, "record ap key id %d", (int)id);
3294 if (key_size > MAX_KEY_SIZE)
3295 return -EINVAL;
3298 * Find next free entry in ap_keys. Also check we are not replacing
3299 * an existing key.
3301 for (i = 0; i < MAX_NUM_KEYS; i++) {
3302 if (wlvif->ap.recorded_keys[i] == NULL)
3303 break;
3305 if (wlvif->ap.recorded_keys[i]->id == id) {
3306 wl1271_warning("trying to record key replacement");
3307 return -EINVAL;
3311 if (i == MAX_NUM_KEYS)
3312 return -EBUSY;
3314 ap_key = kzalloc(sizeof(*ap_key), GFP_KERNEL);
3315 if (!ap_key)
3316 return -ENOMEM;
3318 ap_key->id = id;
3319 ap_key->key_type = key_type;
3320 ap_key->key_size = key_size;
3321 memcpy(ap_key->key, key, key_size);
3322 ap_key->hlid = hlid;
3323 ap_key->tx_seq_32 = tx_seq_32;
3324 ap_key->tx_seq_16 = tx_seq_16;
3325 ap_key->is_pairwise = is_pairwise;
3327 wlvif->ap.recorded_keys[i] = ap_key;
3328 return 0;
3331 static void wl1271_free_ap_keys(struct wl1271 *wl, struct wl12xx_vif *wlvif)
3333 int i;
3335 for (i = 0; i < MAX_NUM_KEYS; i++) {
3336 kfree(wlvif->ap.recorded_keys[i]);
3337 wlvif->ap.recorded_keys[i] = NULL;
3341 static int wl1271_ap_init_hwenc(struct wl1271 *wl, struct wl12xx_vif *wlvif)
3343 int i, ret = 0;
3344 struct wl1271_ap_key *key;
3345 bool wep_key_added = false;
3347 for (i = 0; i < MAX_NUM_KEYS; i++) {
3348 u8 hlid;
3349 if (wlvif->ap.recorded_keys[i] == NULL)
3350 break;
3352 key = wlvif->ap.recorded_keys[i];
3353 hlid = key->hlid;
3354 if (hlid == WL12XX_INVALID_LINK_ID)
3355 hlid = wlvif->ap.bcast_hlid;
3357 ret = wl1271_cmd_set_ap_key(wl, wlvif, KEY_ADD_OR_REPLACE,
3358 key->id, key->key_type,
3359 key->key_size, key->key,
3360 hlid, key->tx_seq_32,
3361 key->tx_seq_16, key->is_pairwise);
3362 if (ret < 0)
3363 goto out;
3365 if (key->key_type == KEY_WEP)
3366 wep_key_added = true;
3369 if (wep_key_added) {
3370 ret = wl12xx_cmd_set_default_wep_key(wl, wlvif->default_key,
3371 wlvif->ap.bcast_hlid);
3372 if (ret < 0)
3373 goto out;
3376 out:
3377 wl1271_free_ap_keys(wl, wlvif);
3378 return ret;
3381 static int wl1271_set_key(struct wl1271 *wl, struct wl12xx_vif *wlvif,
3382 u16 action, u8 id, u8 key_type,
3383 u8 key_size, const u8 *key, u32 tx_seq_32,
3384 u16 tx_seq_16, struct ieee80211_sta *sta,
3385 bool is_pairwise)
3387 int ret;
3388 bool is_ap = (wlvif->bss_type == BSS_TYPE_AP_BSS);
3390 if (is_ap) {
3391 struct wl1271_station *wl_sta;
3392 u8 hlid;
3394 if (sta) {
3395 wl_sta = (struct wl1271_station *)sta->drv_priv;
3396 hlid = wl_sta->hlid;
3397 } else {
3398 hlid = wlvif->ap.bcast_hlid;
3401 if (!test_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags)) {
3403 * We do not support removing keys after AP shutdown.
3404 * Pretend we do to make mac80211 happy.
3406 if (action != KEY_ADD_OR_REPLACE)
3407 return 0;
3409 ret = wl1271_record_ap_key(wl, wlvif, id,
3410 key_type, key_size,
3411 key, hlid, tx_seq_32,
3412 tx_seq_16, is_pairwise);
3413 } else {
3414 ret = wl1271_cmd_set_ap_key(wl, wlvif, action,
3415 id, key_type, key_size,
3416 key, hlid, tx_seq_32,
3417 tx_seq_16, is_pairwise);
3420 if (ret < 0)
3421 return ret;
3422 } else {
3423 const u8 *addr;
3424 static const u8 bcast_addr[ETH_ALEN] = {
3425 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
3428 addr = sta ? sta->addr : bcast_addr;
3430 if (is_zero_ether_addr(addr)) {
3431 /* We dont support TX only encryption */
3432 return -EOPNOTSUPP;
3435 /* The wl1271 does not allow to remove unicast keys - they
3436 will be cleared automatically on next CMD_JOIN. Ignore the
3437 request silently, as we dont want the mac80211 to emit
3438 an error message. */
3439 if (action == KEY_REMOVE && !is_broadcast_ether_addr(addr))
3440 return 0;
3442 /* don't remove key if hlid was already deleted */
3443 if (action == KEY_REMOVE &&
3444 wlvif->sta.hlid == WL12XX_INVALID_LINK_ID)
3445 return 0;
3447 ret = wl1271_cmd_set_sta_key(wl, wlvif, action,
3448 id, key_type, key_size,
3449 key, addr, tx_seq_32,
3450 tx_seq_16);
3451 if (ret < 0)
3452 return ret;
3456 return 0;
3459 static int wlcore_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
3460 struct ieee80211_vif *vif,
3461 struct ieee80211_sta *sta,
3462 struct ieee80211_key_conf *key_conf)
3464 struct wl1271 *wl = hw->priv;
3465 int ret;
3466 bool might_change_spare =
3467 key_conf->cipher == WL1271_CIPHER_SUITE_GEM ||
3468 key_conf->cipher == WLAN_CIPHER_SUITE_TKIP;
3470 if (might_change_spare) {
3472 * stop the queues and flush to ensure the next packets are
3473 * in sync with FW spare block accounting
3475 wlcore_stop_queues(wl, WLCORE_QUEUE_STOP_REASON_SPARE_BLK);
3476 wl1271_tx_flush(wl);
3479 mutex_lock(&wl->mutex);
3481 if (unlikely(wl->state != WLCORE_STATE_ON)) {
3482 ret = -EAGAIN;
3483 goto out_wake_queues;
3486 ret = pm_runtime_get_sync(wl->dev);
3487 if (ret < 0) {
3488 pm_runtime_put_noidle(wl->dev);
3489 goto out_wake_queues;
3492 ret = wlcore_hw_set_key(wl, cmd, vif, sta, key_conf);
3494 pm_runtime_mark_last_busy(wl->dev);
3495 pm_runtime_put_autosuspend(wl->dev);
3497 out_wake_queues:
3498 if (might_change_spare)
3499 wlcore_wake_queues(wl, WLCORE_QUEUE_STOP_REASON_SPARE_BLK);
3501 mutex_unlock(&wl->mutex);
3503 return ret;
3506 int wlcore_set_key(struct wl1271 *wl, enum set_key_cmd cmd,
3507 struct ieee80211_vif *vif,
3508 struct ieee80211_sta *sta,
3509 struct ieee80211_key_conf *key_conf)
3511 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
3512 int ret;
3513 u32 tx_seq_32 = 0;
3514 u16 tx_seq_16 = 0;
3515 u8 key_type;
3516 u8 hlid;
3517 bool is_pairwise;
3519 wl1271_debug(DEBUG_MAC80211, "mac80211 set key");
3521 wl1271_debug(DEBUG_CRYPT, "CMD: 0x%x sta: %p", cmd, sta);
3522 wl1271_debug(DEBUG_CRYPT, "Key: algo:0x%x, id:%d, len:%d flags 0x%x",
3523 key_conf->cipher, key_conf->keyidx,
3524 key_conf->keylen, key_conf->flags);
3525 wl1271_dump(DEBUG_CRYPT, "KEY: ", key_conf->key, key_conf->keylen);
3527 if (wlvif->bss_type == BSS_TYPE_AP_BSS)
3528 if (sta) {
3529 struct wl1271_station *wl_sta = (void *)sta->drv_priv;
3530 hlid = wl_sta->hlid;
3531 } else {
3532 hlid = wlvif->ap.bcast_hlid;
3534 else
3535 hlid = wlvif->sta.hlid;
3537 if (hlid != WL12XX_INVALID_LINK_ID) {
3538 u64 tx_seq = wl->links[hlid].total_freed_pkts;
3539 tx_seq_32 = WL1271_TX_SECURITY_HI32(tx_seq);
3540 tx_seq_16 = WL1271_TX_SECURITY_LO16(tx_seq);
3543 switch (key_conf->cipher) {
3544 case WLAN_CIPHER_SUITE_WEP40:
3545 case WLAN_CIPHER_SUITE_WEP104:
3546 key_type = KEY_WEP;
3548 key_conf->hw_key_idx = key_conf->keyidx;
3549 break;
3550 case WLAN_CIPHER_SUITE_TKIP:
3551 key_type = KEY_TKIP;
3552 key_conf->hw_key_idx = key_conf->keyidx;
3553 break;
3554 case WLAN_CIPHER_SUITE_CCMP:
3555 key_type = KEY_AES;
3556 key_conf->flags |= IEEE80211_KEY_FLAG_PUT_IV_SPACE;
3557 break;
3558 case WL1271_CIPHER_SUITE_GEM:
3559 key_type = KEY_GEM;
3560 break;
3561 default:
3562 wl1271_error("Unknown key algo 0x%x", key_conf->cipher);
3564 return -EOPNOTSUPP;
3567 is_pairwise = key_conf->flags & IEEE80211_KEY_FLAG_PAIRWISE;
3569 switch (cmd) {
3570 case SET_KEY:
3571 ret = wl1271_set_key(wl, wlvif, KEY_ADD_OR_REPLACE,
3572 key_conf->keyidx, key_type,
3573 key_conf->keylen, key_conf->key,
3574 tx_seq_32, tx_seq_16, sta, is_pairwise);
3575 if (ret < 0) {
3576 wl1271_error("Could not add or replace key");
3577 return ret;
3581 * reconfiguring arp response if the unicast (or common)
3582 * encryption key type was changed
3584 if (wlvif->bss_type == BSS_TYPE_STA_BSS &&
3585 (sta || key_type == KEY_WEP) &&
3586 wlvif->encryption_type != key_type) {
3587 wlvif->encryption_type = key_type;
3588 ret = wl1271_cmd_build_arp_rsp(wl, wlvif);
3589 if (ret < 0) {
3590 wl1271_warning("build arp rsp failed: %d", ret);
3591 return ret;
3594 break;
3596 case DISABLE_KEY:
3597 ret = wl1271_set_key(wl, wlvif, KEY_REMOVE,
3598 key_conf->keyidx, key_type,
3599 key_conf->keylen, key_conf->key,
3600 0, 0, sta, is_pairwise);
3601 if (ret < 0) {
3602 wl1271_error("Could not remove key");
3603 return ret;
3605 break;
3607 default:
3608 wl1271_error("Unsupported key cmd 0x%x", cmd);
3609 return -EOPNOTSUPP;
3612 return ret;
3614 EXPORT_SYMBOL_GPL(wlcore_set_key);
3616 static void wl1271_op_set_default_key_idx(struct ieee80211_hw *hw,
3617 struct ieee80211_vif *vif,
3618 int key_idx)
3620 struct wl1271 *wl = hw->priv;
3621 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
3622 int ret;
3624 wl1271_debug(DEBUG_MAC80211, "mac80211 set default key idx %d",
3625 key_idx);
3627 /* we don't handle unsetting of default key */
3628 if (key_idx == -1)
3629 return;
3631 mutex_lock(&wl->mutex);
3633 if (unlikely(wl->state != WLCORE_STATE_ON)) {
3634 ret = -EAGAIN;
3635 goto out_unlock;
3638 ret = pm_runtime_get_sync(wl->dev);
3639 if (ret < 0) {
3640 pm_runtime_put_noidle(wl->dev);
3641 goto out_unlock;
3644 wlvif->default_key = key_idx;
3646 /* the default WEP key needs to be configured at least once */
3647 if (wlvif->encryption_type == KEY_WEP) {
3648 ret = wl12xx_cmd_set_default_wep_key(wl,
3649 key_idx,
3650 wlvif->sta.hlid);
3651 if (ret < 0)
3652 goto out_sleep;
3655 out_sleep:
3656 pm_runtime_mark_last_busy(wl->dev);
3657 pm_runtime_put_autosuspend(wl->dev);
3659 out_unlock:
3660 mutex_unlock(&wl->mutex);
3663 void wlcore_regdomain_config(struct wl1271 *wl)
3665 int ret;
3667 if (!(wl->quirks & WLCORE_QUIRK_REGDOMAIN_CONF))
3668 return;
3670 mutex_lock(&wl->mutex);
3672 if (unlikely(wl->state != WLCORE_STATE_ON))
3673 goto out;
3675 ret = pm_runtime_get_sync(wl->dev);
3676 if (ret < 0) {
3677 pm_runtime_put_autosuspend(wl->dev);
3678 goto out;
3681 ret = wlcore_cmd_regdomain_config_locked(wl);
3682 if (ret < 0) {
3683 wl12xx_queue_recovery_work(wl);
3684 goto out;
3687 pm_runtime_mark_last_busy(wl->dev);
3688 pm_runtime_put_autosuspend(wl->dev);
3689 out:
3690 mutex_unlock(&wl->mutex);
3693 static int wl1271_op_hw_scan(struct ieee80211_hw *hw,
3694 struct ieee80211_vif *vif,
3695 struct ieee80211_scan_request *hw_req)
3697 struct cfg80211_scan_request *req = &hw_req->req;
3698 struct wl1271 *wl = hw->priv;
3699 int ret;
3700 u8 *ssid = NULL;
3701 size_t len = 0;
3703 wl1271_debug(DEBUG_MAC80211, "mac80211 hw scan");
3705 if (req->n_ssids) {
3706 ssid = req->ssids[0].ssid;
3707 len = req->ssids[0].ssid_len;
3710 mutex_lock(&wl->mutex);
3712 if (unlikely(wl->state != WLCORE_STATE_ON)) {
3714 * We cannot return -EBUSY here because cfg80211 will expect
3715 * a call to ieee80211_scan_completed if we do - in this case
3716 * there won't be any call.
3718 ret = -EAGAIN;
3719 goto out;
3722 ret = pm_runtime_get_sync(wl->dev);
3723 if (ret < 0) {
3724 pm_runtime_put_noidle(wl->dev);
3725 goto out;
3728 /* fail if there is any role in ROC */
3729 if (find_first_bit(wl->roc_map, WL12XX_MAX_ROLES) < WL12XX_MAX_ROLES) {
3730 /* don't allow scanning right now */
3731 ret = -EBUSY;
3732 goto out_sleep;
3735 ret = wlcore_scan(hw->priv, vif, ssid, len, req);
3736 out_sleep:
3737 pm_runtime_mark_last_busy(wl->dev);
3738 pm_runtime_put_autosuspend(wl->dev);
3739 out:
3740 mutex_unlock(&wl->mutex);
3742 return ret;
3745 static void wl1271_op_cancel_hw_scan(struct ieee80211_hw *hw,
3746 struct ieee80211_vif *vif)
3748 struct wl1271 *wl = hw->priv;
3749 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
3750 struct cfg80211_scan_info info = {
3751 .aborted = true,
3753 int ret;
3755 wl1271_debug(DEBUG_MAC80211, "mac80211 cancel hw scan");
3757 mutex_lock(&wl->mutex);
3759 if (unlikely(wl->state != WLCORE_STATE_ON))
3760 goto out;
3762 if (wl->scan.state == WL1271_SCAN_STATE_IDLE)
3763 goto out;
3765 ret = pm_runtime_get_sync(wl->dev);
3766 if (ret < 0) {
3767 pm_runtime_put_noidle(wl->dev);
3768 goto out;
3771 if (wl->scan.state != WL1271_SCAN_STATE_DONE) {
3772 ret = wl->ops->scan_stop(wl, wlvif);
3773 if (ret < 0)
3774 goto out_sleep;
3778 * Rearm the tx watchdog just before idling scan. This
3779 * prevents just-finished scans from triggering the watchdog
3781 wl12xx_rearm_tx_watchdog_locked(wl);
3783 wl->scan.state = WL1271_SCAN_STATE_IDLE;
3784 memset(wl->scan.scanned_ch, 0, sizeof(wl->scan.scanned_ch));
3785 wl->scan_wlvif = NULL;
3786 wl->scan.req = NULL;
3787 ieee80211_scan_completed(wl->hw, &info);
3789 out_sleep:
3790 pm_runtime_mark_last_busy(wl->dev);
3791 pm_runtime_put_autosuspend(wl->dev);
3792 out:
3793 mutex_unlock(&wl->mutex);
3795 cancel_delayed_work_sync(&wl->scan_complete_work);
3798 static int wl1271_op_sched_scan_start(struct ieee80211_hw *hw,
3799 struct ieee80211_vif *vif,
3800 struct cfg80211_sched_scan_request *req,
3801 struct ieee80211_scan_ies *ies)
3803 struct wl1271 *wl = hw->priv;
3804 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
3805 int ret;
3807 wl1271_debug(DEBUG_MAC80211, "wl1271_op_sched_scan_start");
3809 mutex_lock(&wl->mutex);
3811 if (unlikely(wl->state != WLCORE_STATE_ON)) {
3812 ret = -EAGAIN;
3813 goto out;
3816 ret = pm_runtime_get_sync(wl->dev);
3817 if (ret < 0) {
3818 pm_runtime_put_noidle(wl->dev);
3819 goto out;
3822 ret = wl->ops->sched_scan_start(wl, wlvif, req, ies);
3823 if (ret < 0)
3824 goto out_sleep;
3826 wl->sched_vif = wlvif;
3828 out_sleep:
3829 pm_runtime_mark_last_busy(wl->dev);
3830 pm_runtime_put_autosuspend(wl->dev);
3831 out:
3832 mutex_unlock(&wl->mutex);
3833 return ret;
3836 static int wl1271_op_sched_scan_stop(struct ieee80211_hw *hw,
3837 struct ieee80211_vif *vif)
3839 struct wl1271 *wl = hw->priv;
3840 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
3841 int ret;
3843 wl1271_debug(DEBUG_MAC80211, "wl1271_op_sched_scan_stop");
3845 mutex_lock(&wl->mutex);
3847 if (unlikely(wl->state != WLCORE_STATE_ON))
3848 goto out;
3850 ret = pm_runtime_get_sync(wl->dev);
3851 if (ret < 0) {
3852 pm_runtime_put_noidle(wl->dev);
3853 goto out;
3856 wl->ops->sched_scan_stop(wl, wlvif);
3858 pm_runtime_mark_last_busy(wl->dev);
3859 pm_runtime_put_autosuspend(wl->dev);
3860 out:
3861 mutex_unlock(&wl->mutex);
3863 return 0;
3866 static int wl1271_op_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
3868 struct wl1271 *wl = hw->priv;
3869 int ret = 0;
3871 mutex_lock(&wl->mutex);
3873 if (unlikely(wl->state != WLCORE_STATE_ON)) {
3874 ret = -EAGAIN;
3875 goto out;
3878 ret = pm_runtime_get_sync(wl->dev);
3879 if (ret < 0) {
3880 pm_runtime_put_noidle(wl->dev);
3881 goto out;
3884 ret = wl1271_acx_frag_threshold(wl, value);
3885 if (ret < 0)
3886 wl1271_warning("wl1271_op_set_frag_threshold failed: %d", ret);
3888 pm_runtime_mark_last_busy(wl->dev);
3889 pm_runtime_put_autosuspend(wl->dev);
3891 out:
3892 mutex_unlock(&wl->mutex);
3894 return ret;
3897 static int wl1271_op_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
3899 struct wl1271 *wl = hw->priv;
3900 struct wl12xx_vif *wlvif;
3901 int ret = 0;
3903 mutex_lock(&wl->mutex);
3905 if (unlikely(wl->state != WLCORE_STATE_ON)) {
3906 ret = -EAGAIN;
3907 goto out;
3910 ret = pm_runtime_get_sync(wl->dev);
3911 if (ret < 0) {
3912 pm_runtime_put_noidle(wl->dev);
3913 goto out;
3916 wl12xx_for_each_wlvif(wl, wlvif) {
3917 ret = wl1271_acx_rts_threshold(wl, wlvif, value);
3918 if (ret < 0)
3919 wl1271_warning("set rts threshold failed: %d", ret);
3921 pm_runtime_mark_last_busy(wl->dev);
3922 pm_runtime_put_autosuspend(wl->dev);
3924 out:
3925 mutex_unlock(&wl->mutex);
3927 return ret;
3930 static void wl12xx_remove_ie(struct sk_buff *skb, u8 eid, int ieoffset)
3932 int len;
3933 const u8 *next, *end = skb->data + skb->len;
3934 u8 *ie = (u8 *)cfg80211_find_ie(eid, skb->data + ieoffset,
3935 skb->len - ieoffset);
3936 if (!ie)
3937 return;
3938 len = ie[1] + 2;
3939 next = ie + len;
3940 memmove(ie, next, end - next);
3941 skb_trim(skb, skb->len - len);
3944 static void wl12xx_remove_vendor_ie(struct sk_buff *skb,
3945 unsigned int oui, u8 oui_type,
3946 int ieoffset)
3948 int len;
3949 const u8 *next, *end = skb->data + skb->len;
3950 u8 *ie = (u8 *)cfg80211_find_vendor_ie(oui, oui_type,
3951 skb->data + ieoffset,
3952 skb->len - ieoffset);
3953 if (!ie)
3954 return;
3955 len = ie[1] + 2;
3956 next = ie + len;
3957 memmove(ie, next, end - next);
3958 skb_trim(skb, skb->len - len);
3961 static int wl1271_ap_set_probe_resp_tmpl(struct wl1271 *wl, u32 rates,
3962 struct ieee80211_vif *vif)
3964 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
3965 struct sk_buff *skb;
3966 int ret;
3968 skb = ieee80211_proberesp_get(wl->hw, vif);
3969 if (!skb)
3970 return -EOPNOTSUPP;
3972 ret = wl1271_cmd_template_set(wl, wlvif->role_id,
3973 CMD_TEMPL_AP_PROBE_RESPONSE,
3974 skb->data,
3975 skb->len, 0,
3976 rates);
3977 dev_kfree_skb(skb);
3979 if (ret < 0)
3980 goto out;
3982 wl1271_debug(DEBUG_AP, "probe response updated");
3983 set_bit(WLVIF_FLAG_AP_PROBE_RESP_SET, &wlvif->flags);
3985 out:
3986 return ret;
3989 static int wl1271_ap_set_probe_resp_tmpl_legacy(struct wl1271 *wl,
3990 struct ieee80211_vif *vif,
3991 u8 *probe_rsp_data,
3992 size_t probe_rsp_len,
3993 u32 rates)
3995 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
3996 struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
3997 u8 probe_rsp_templ[WL1271_CMD_TEMPL_MAX_SIZE];
3998 int ssid_ie_offset, ie_offset, templ_len;
3999 const u8 *ptr;
4001 /* no need to change probe response if the SSID is set correctly */
4002 if (wlvif->ssid_len > 0)
4003 return wl1271_cmd_template_set(wl, wlvif->role_id,
4004 CMD_TEMPL_AP_PROBE_RESPONSE,
4005 probe_rsp_data,
4006 probe_rsp_len, 0,
4007 rates);
4009 if (probe_rsp_len + bss_conf->ssid_len > WL1271_CMD_TEMPL_MAX_SIZE) {
4010 wl1271_error("probe_rsp template too big");
4011 return -EINVAL;
4014 /* start searching from IE offset */
4015 ie_offset = offsetof(struct ieee80211_mgmt, u.probe_resp.variable);
4017 ptr = cfg80211_find_ie(WLAN_EID_SSID, probe_rsp_data + ie_offset,
4018 probe_rsp_len - ie_offset);
4019 if (!ptr) {
4020 wl1271_error("No SSID in beacon!");
4021 return -EINVAL;
4024 ssid_ie_offset = ptr - probe_rsp_data;
4025 ptr += (ptr[1] + 2);
4027 memcpy(probe_rsp_templ, probe_rsp_data, ssid_ie_offset);
4029 /* insert SSID from bss_conf */
4030 probe_rsp_templ[ssid_ie_offset] = WLAN_EID_SSID;
4031 probe_rsp_templ[ssid_ie_offset + 1] = bss_conf->ssid_len;
4032 memcpy(probe_rsp_templ + ssid_ie_offset + 2,
4033 bss_conf->ssid, bss_conf->ssid_len);
4034 templ_len = ssid_ie_offset + 2 + bss_conf->ssid_len;
4036 memcpy(probe_rsp_templ + ssid_ie_offset + 2 + bss_conf->ssid_len,
4037 ptr, probe_rsp_len - (ptr - probe_rsp_data));
4038 templ_len += probe_rsp_len - (ptr - probe_rsp_data);
4040 return wl1271_cmd_template_set(wl, wlvif->role_id,
4041 CMD_TEMPL_AP_PROBE_RESPONSE,
4042 probe_rsp_templ,
4043 templ_len, 0,
4044 rates);
4047 static int wl1271_bss_erp_info_changed(struct wl1271 *wl,
4048 struct ieee80211_vif *vif,
4049 struct ieee80211_bss_conf *bss_conf,
4050 u32 changed)
4052 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
4053 int ret = 0;
4055 if (changed & BSS_CHANGED_ERP_SLOT) {
4056 if (bss_conf->use_short_slot)
4057 ret = wl1271_acx_slot(wl, wlvif, SLOT_TIME_SHORT);
4058 else
4059 ret = wl1271_acx_slot(wl, wlvif, SLOT_TIME_LONG);
4060 if (ret < 0) {
4061 wl1271_warning("Set slot time failed %d", ret);
4062 goto out;
4066 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
4067 if (bss_conf->use_short_preamble)
4068 wl1271_acx_set_preamble(wl, wlvif, ACX_PREAMBLE_SHORT);
4069 else
4070 wl1271_acx_set_preamble(wl, wlvif, ACX_PREAMBLE_LONG);
4073 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
4074 if (bss_conf->use_cts_prot)
4075 ret = wl1271_acx_cts_protect(wl, wlvif,
4076 CTSPROTECT_ENABLE);
4077 else
4078 ret = wl1271_acx_cts_protect(wl, wlvif,
4079 CTSPROTECT_DISABLE);
4080 if (ret < 0) {
4081 wl1271_warning("Set ctsprotect failed %d", ret);
4082 goto out;
4086 out:
4087 return ret;
4090 static int wlcore_set_beacon_template(struct wl1271 *wl,
4091 struct ieee80211_vif *vif,
4092 bool is_ap)
4094 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
4095 struct ieee80211_hdr *hdr;
4096 u32 min_rate;
4097 int ret;
4098 int ieoffset = offsetof(struct ieee80211_mgmt, u.beacon.variable);
4099 struct sk_buff *beacon = ieee80211_beacon_get(wl->hw, vif);
4100 u16 tmpl_id;
4102 if (!beacon) {
4103 ret = -EINVAL;
4104 goto out;
4107 wl1271_debug(DEBUG_MASTER, "beacon updated");
4109 ret = wl1271_ssid_set(wlvif, beacon, ieoffset);
4110 if (ret < 0) {
4111 dev_kfree_skb(beacon);
4112 goto out;
4114 min_rate = wl1271_tx_min_rate_get(wl, wlvif->basic_rate_set);
4115 tmpl_id = is_ap ? CMD_TEMPL_AP_BEACON :
4116 CMD_TEMPL_BEACON;
4117 ret = wl1271_cmd_template_set(wl, wlvif->role_id, tmpl_id,
4118 beacon->data,
4119 beacon->len, 0,
4120 min_rate);
4121 if (ret < 0) {
4122 dev_kfree_skb(beacon);
4123 goto out;
4126 wlvif->wmm_enabled =
4127 cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
4128 WLAN_OUI_TYPE_MICROSOFT_WMM,
4129 beacon->data + ieoffset,
4130 beacon->len - ieoffset);
4133 * In case we already have a probe-resp beacon set explicitly
4134 * by usermode, don't use the beacon data.
4136 if (test_bit(WLVIF_FLAG_AP_PROBE_RESP_SET, &wlvif->flags))
4137 goto end_bcn;
4139 /* remove TIM ie from probe response */
4140 wl12xx_remove_ie(beacon, WLAN_EID_TIM, ieoffset);
4143 * remove p2p ie from probe response.
4144 * the fw reponds to probe requests that don't include
4145 * the p2p ie. probe requests with p2p ie will be passed,
4146 * and will be responded by the supplicant (the spec
4147 * forbids including the p2p ie when responding to probe
4148 * requests that didn't include it).
4150 wl12xx_remove_vendor_ie(beacon, WLAN_OUI_WFA,
4151 WLAN_OUI_TYPE_WFA_P2P, ieoffset);
4153 hdr = (struct ieee80211_hdr *) beacon->data;
4154 hdr->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
4155 IEEE80211_STYPE_PROBE_RESP);
4156 if (is_ap)
4157 ret = wl1271_ap_set_probe_resp_tmpl_legacy(wl, vif,
4158 beacon->data,
4159 beacon->len,
4160 min_rate);
4161 else
4162 ret = wl1271_cmd_template_set(wl, wlvif->role_id,
4163 CMD_TEMPL_PROBE_RESPONSE,
4164 beacon->data,
4165 beacon->len, 0,
4166 min_rate);
4167 end_bcn:
4168 dev_kfree_skb(beacon);
4169 if (ret < 0)
4170 goto out;
4172 out:
4173 return ret;
4176 static int wl1271_bss_beacon_info_changed(struct wl1271 *wl,
4177 struct ieee80211_vif *vif,
4178 struct ieee80211_bss_conf *bss_conf,
4179 u32 changed)
4181 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
4182 bool is_ap = (wlvif->bss_type == BSS_TYPE_AP_BSS);
4183 int ret = 0;
4185 if (changed & BSS_CHANGED_BEACON_INT) {
4186 wl1271_debug(DEBUG_MASTER, "beacon interval updated: %d",
4187 bss_conf->beacon_int);
4189 wlvif->beacon_int = bss_conf->beacon_int;
4192 if ((changed & BSS_CHANGED_AP_PROBE_RESP) && is_ap) {
4193 u32 rate = wl1271_tx_min_rate_get(wl, wlvif->basic_rate_set);
4195 wl1271_ap_set_probe_resp_tmpl(wl, rate, vif);
4198 if (changed & BSS_CHANGED_BEACON) {
4199 ret = wlcore_set_beacon_template(wl, vif, is_ap);
4200 if (ret < 0)
4201 goto out;
4203 if (test_and_clear_bit(WLVIF_FLAG_BEACON_DISABLED,
4204 &wlvif->flags)) {
4205 ret = wlcore_hw_dfs_master_restart(wl, wlvif);
4206 if (ret < 0)
4207 goto out;
4210 out:
4211 if (ret != 0)
4212 wl1271_error("beacon info change failed: %d", ret);
4213 return ret;
4216 /* AP mode changes */
4217 static void wl1271_bss_info_changed_ap(struct wl1271 *wl,
4218 struct ieee80211_vif *vif,
4219 struct ieee80211_bss_conf *bss_conf,
4220 u32 changed)
4222 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
4223 int ret = 0;
4225 if (changed & BSS_CHANGED_BASIC_RATES) {
4226 u32 rates = bss_conf->basic_rates;
4228 wlvif->basic_rate_set = wl1271_tx_enabled_rates_get(wl, rates,
4229 wlvif->band);
4230 wlvif->basic_rate = wl1271_tx_min_rate_get(wl,
4231 wlvif->basic_rate_set);
4233 ret = wl1271_init_ap_rates(wl, wlvif);
4234 if (ret < 0) {
4235 wl1271_error("AP rate policy change failed %d", ret);
4236 goto out;
4239 ret = wl1271_ap_init_templates(wl, vif);
4240 if (ret < 0)
4241 goto out;
4243 /* No need to set probe resp template for mesh */
4244 if (!ieee80211_vif_is_mesh(vif)) {
4245 ret = wl1271_ap_set_probe_resp_tmpl(wl,
4246 wlvif->basic_rate,
4247 vif);
4248 if (ret < 0)
4249 goto out;
4252 ret = wlcore_set_beacon_template(wl, vif, true);
4253 if (ret < 0)
4254 goto out;
4257 ret = wl1271_bss_beacon_info_changed(wl, vif, bss_conf, changed);
4258 if (ret < 0)
4259 goto out;
4261 if (changed & BSS_CHANGED_BEACON_ENABLED) {
4262 if (bss_conf->enable_beacon) {
4263 if (!test_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags)) {
4264 ret = wl12xx_cmd_role_start_ap(wl, wlvif);
4265 if (ret < 0)
4266 goto out;
4268 ret = wl1271_ap_init_hwenc(wl, wlvif);
4269 if (ret < 0)
4270 goto out;
4272 set_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags);
4273 wl1271_debug(DEBUG_AP, "started AP");
4275 } else {
4276 if (test_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags)) {
4278 * AP might be in ROC in case we have just
4279 * sent auth reply. handle it.
4281 if (test_bit(wlvif->role_id, wl->roc_map))
4282 wl12xx_croc(wl, wlvif->role_id);
4284 ret = wl12xx_cmd_role_stop_ap(wl, wlvif);
4285 if (ret < 0)
4286 goto out;
4288 clear_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags);
4289 clear_bit(WLVIF_FLAG_AP_PROBE_RESP_SET,
4290 &wlvif->flags);
4291 wl1271_debug(DEBUG_AP, "stopped AP");
4296 ret = wl1271_bss_erp_info_changed(wl, vif, bss_conf, changed);
4297 if (ret < 0)
4298 goto out;
4300 /* Handle HT information change */
4301 if ((changed & BSS_CHANGED_HT) &&
4302 (bss_conf->chandef.width != NL80211_CHAN_WIDTH_20_NOHT)) {
4303 ret = wl1271_acx_set_ht_information(wl, wlvif,
4304 bss_conf->ht_operation_mode);
4305 if (ret < 0) {
4306 wl1271_warning("Set ht information failed %d", ret);
4307 goto out;
4311 out:
4312 return;
4315 static int wlcore_set_bssid(struct wl1271 *wl, struct wl12xx_vif *wlvif,
4316 struct ieee80211_bss_conf *bss_conf,
4317 u32 sta_rate_set)
4319 u32 rates;
4320 int ret;
4322 wl1271_debug(DEBUG_MAC80211,
4323 "changed_bssid: %pM, aid: %d, bcn_int: %d, brates: 0x%x sta_rate_set: 0x%x",
4324 bss_conf->bssid, bss_conf->aid,
4325 bss_conf->beacon_int,
4326 bss_conf->basic_rates, sta_rate_set);
4328 wlvif->beacon_int = bss_conf->beacon_int;
4329 rates = bss_conf->basic_rates;
4330 wlvif->basic_rate_set =
4331 wl1271_tx_enabled_rates_get(wl, rates,
4332 wlvif->band);
4333 wlvif->basic_rate =
4334 wl1271_tx_min_rate_get(wl,
4335 wlvif->basic_rate_set);
4337 if (sta_rate_set)
4338 wlvif->rate_set =
4339 wl1271_tx_enabled_rates_get(wl,
4340 sta_rate_set,
4341 wlvif->band);
4343 /* we only support sched_scan while not connected */
4344 if (wl->sched_vif == wlvif)
4345 wl->ops->sched_scan_stop(wl, wlvif);
4347 ret = wl1271_acx_sta_rate_policies(wl, wlvif);
4348 if (ret < 0)
4349 return ret;
4351 ret = wl12xx_cmd_build_null_data(wl, wlvif);
4352 if (ret < 0)
4353 return ret;
4355 ret = wl1271_build_qos_null_data(wl, wl12xx_wlvif_to_vif(wlvif));
4356 if (ret < 0)
4357 return ret;
4359 wlcore_set_ssid(wl, wlvif);
4361 set_bit(WLVIF_FLAG_IN_USE, &wlvif->flags);
4363 return 0;
4366 static int wlcore_clear_bssid(struct wl1271 *wl, struct wl12xx_vif *wlvif)
4368 int ret;
4370 /* revert back to minimum rates for the current band */
4371 wl1271_set_band_rate(wl, wlvif);
4372 wlvif->basic_rate = wl1271_tx_min_rate_get(wl, wlvif->basic_rate_set);
4374 ret = wl1271_acx_sta_rate_policies(wl, wlvif);
4375 if (ret < 0)
4376 return ret;
4378 if (wlvif->bss_type == BSS_TYPE_STA_BSS &&
4379 test_bit(WLVIF_FLAG_IN_USE, &wlvif->flags)) {
4380 ret = wl12xx_cmd_role_stop_sta(wl, wlvif);
4381 if (ret < 0)
4382 return ret;
4385 clear_bit(WLVIF_FLAG_IN_USE, &wlvif->flags);
4386 return 0;
4388 /* STA/IBSS mode changes */
4389 static void wl1271_bss_info_changed_sta(struct wl1271 *wl,
4390 struct ieee80211_vif *vif,
4391 struct ieee80211_bss_conf *bss_conf,
4392 u32 changed)
4394 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
4395 bool do_join = false;
4396 bool is_ibss = (wlvif->bss_type == BSS_TYPE_IBSS);
4397 bool ibss_joined = false;
4398 u32 sta_rate_set = 0;
4399 int ret;
4400 struct ieee80211_sta *sta;
4401 bool sta_exists = false;
4402 struct ieee80211_sta_ht_cap sta_ht_cap;
4404 if (is_ibss) {
4405 ret = wl1271_bss_beacon_info_changed(wl, vif, bss_conf,
4406 changed);
4407 if (ret < 0)
4408 goto out;
4411 if (changed & BSS_CHANGED_IBSS) {
4412 if (bss_conf->ibss_joined) {
4413 set_bit(WLVIF_FLAG_IBSS_JOINED, &wlvif->flags);
4414 ibss_joined = true;
4415 } else {
4416 wlcore_unset_assoc(wl, wlvif);
4417 wl12xx_cmd_role_stop_sta(wl, wlvif);
4421 if ((changed & BSS_CHANGED_BEACON_INT) && ibss_joined)
4422 do_join = true;
4424 /* Need to update the SSID (for filtering etc) */
4425 if ((changed & BSS_CHANGED_BEACON) && ibss_joined)
4426 do_join = true;
4428 if ((changed & BSS_CHANGED_BEACON_ENABLED) && ibss_joined) {
4429 wl1271_debug(DEBUG_ADHOC, "ad-hoc beaconing: %s",
4430 bss_conf->enable_beacon ? "enabled" : "disabled");
4432 do_join = true;
4435 if (changed & BSS_CHANGED_IDLE && !is_ibss)
4436 wl1271_sta_handle_idle(wl, wlvif, bss_conf->idle);
4438 if (changed & BSS_CHANGED_CQM) {
4439 bool enable = false;
4440 if (bss_conf->cqm_rssi_thold)
4441 enable = true;
4442 ret = wl1271_acx_rssi_snr_trigger(wl, wlvif, enable,
4443 bss_conf->cqm_rssi_thold,
4444 bss_conf->cqm_rssi_hyst);
4445 if (ret < 0)
4446 goto out;
4447 wlvif->rssi_thold = bss_conf->cqm_rssi_thold;
4450 if (changed & (BSS_CHANGED_BSSID | BSS_CHANGED_HT |
4451 BSS_CHANGED_ASSOC)) {
4452 rcu_read_lock();
4453 sta = ieee80211_find_sta(vif, bss_conf->bssid);
4454 if (sta) {
4455 u8 *rx_mask = sta->ht_cap.mcs.rx_mask;
4457 /* save the supp_rates of the ap */
4458 sta_rate_set = sta->supp_rates[wlvif->band];
4459 if (sta->ht_cap.ht_supported)
4460 sta_rate_set |=
4461 (rx_mask[0] << HW_HT_RATES_OFFSET) |
4462 (rx_mask[1] << HW_MIMO_RATES_OFFSET);
4463 sta_ht_cap = sta->ht_cap;
4464 sta_exists = true;
4467 rcu_read_unlock();
4470 if (changed & BSS_CHANGED_BSSID) {
4471 if (!is_zero_ether_addr(bss_conf->bssid)) {
4472 ret = wlcore_set_bssid(wl, wlvif, bss_conf,
4473 sta_rate_set);
4474 if (ret < 0)
4475 goto out;
4477 /* Need to update the BSSID (for filtering etc) */
4478 do_join = true;
4479 } else {
4480 ret = wlcore_clear_bssid(wl, wlvif);
4481 if (ret < 0)
4482 goto out;
4486 if (changed & BSS_CHANGED_IBSS) {
4487 wl1271_debug(DEBUG_ADHOC, "ibss_joined: %d",
4488 bss_conf->ibss_joined);
4490 if (bss_conf->ibss_joined) {
4491 u32 rates = bss_conf->basic_rates;
4492 wlvif->basic_rate_set =
4493 wl1271_tx_enabled_rates_get(wl, rates,
4494 wlvif->band);
4495 wlvif->basic_rate =
4496 wl1271_tx_min_rate_get(wl,
4497 wlvif->basic_rate_set);
4499 /* by default, use 11b + OFDM rates */
4500 wlvif->rate_set = CONF_TX_IBSS_DEFAULT_RATES;
4501 ret = wl1271_acx_sta_rate_policies(wl, wlvif);
4502 if (ret < 0)
4503 goto out;
4507 if ((changed & BSS_CHANGED_BEACON_INFO) && bss_conf->dtim_period) {
4508 /* enable beacon filtering */
4509 ret = wl1271_acx_beacon_filter_opt(wl, wlvif, true);
4510 if (ret < 0)
4511 goto out;
4514 ret = wl1271_bss_erp_info_changed(wl, vif, bss_conf, changed);
4515 if (ret < 0)
4516 goto out;
4518 if (do_join) {
4519 ret = wlcore_join(wl, wlvif);
4520 if (ret < 0) {
4521 wl1271_warning("cmd join failed %d", ret);
4522 goto out;
4526 if (changed & BSS_CHANGED_ASSOC) {
4527 if (bss_conf->assoc) {
4528 ret = wlcore_set_assoc(wl, wlvif, bss_conf,
4529 sta_rate_set);
4530 if (ret < 0)
4531 goto out;
4533 if (test_bit(WLVIF_FLAG_STA_AUTHORIZED, &wlvif->flags))
4534 wl12xx_set_authorized(wl, wlvif);
4535 } else {
4536 wlcore_unset_assoc(wl, wlvif);
4540 if (changed & BSS_CHANGED_PS) {
4541 if ((bss_conf->ps) &&
4542 test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags) &&
4543 !test_bit(WLVIF_FLAG_IN_PS, &wlvif->flags)) {
4544 int ps_mode;
4545 char *ps_mode_str;
4547 if (wl->conf.conn.forced_ps) {
4548 ps_mode = STATION_POWER_SAVE_MODE;
4549 ps_mode_str = "forced";
4550 } else {
4551 ps_mode = STATION_AUTO_PS_MODE;
4552 ps_mode_str = "auto";
4555 wl1271_debug(DEBUG_PSM, "%s ps enabled", ps_mode_str);
4557 ret = wl1271_ps_set_mode(wl, wlvif, ps_mode);
4558 if (ret < 0)
4559 wl1271_warning("enter %s ps failed %d",
4560 ps_mode_str, ret);
4561 } else if (!bss_conf->ps &&
4562 test_bit(WLVIF_FLAG_IN_PS, &wlvif->flags)) {
4563 wl1271_debug(DEBUG_PSM, "auto ps disabled");
4565 ret = wl1271_ps_set_mode(wl, wlvif,
4566 STATION_ACTIVE_MODE);
4567 if (ret < 0)
4568 wl1271_warning("exit auto ps failed %d", ret);
4572 /* Handle new association with HT. Do this after join. */
4573 if (sta_exists) {
4574 bool enabled =
4575 bss_conf->chandef.width != NL80211_CHAN_WIDTH_20_NOHT;
4577 ret = wlcore_hw_set_peer_cap(wl,
4578 &sta_ht_cap,
4579 enabled,
4580 wlvif->rate_set,
4581 wlvif->sta.hlid);
4582 if (ret < 0) {
4583 wl1271_warning("Set ht cap failed %d", ret);
4584 goto out;
4588 if (enabled) {
4589 ret = wl1271_acx_set_ht_information(wl, wlvif,
4590 bss_conf->ht_operation_mode);
4591 if (ret < 0) {
4592 wl1271_warning("Set ht information failed %d",
4593 ret);
4594 goto out;
4599 /* Handle arp filtering. Done after join. */
4600 if ((changed & BSS_CHANGED_ARP_FILTER) ||
4601 (!is_ibss && (changed & BSS_CHANGED_QOS))) {
4602 __be32 addr = bss_conf->arp_addr_list[0];
4603 wlvif->sta.qos = bss_conf->qos;
4604 WARN_ON(wlvif->bss_type != BSS_TYPE_STA_BSS);
4606 if (bss_conf->arp_addr_cnt == 1 && bss_conf->assoc) {
4607 wlvif->ip_addr = addr;
4609 * The template should have been configured only upon
4610 * association. however, it seems that the correct ip
4611 * isn't being set (when sending), so we have to
4612 * reconfigure the template upon every ip change.
4614 ret = wl1271_cmd_build_arp_rsp(wl, wlvif);
4615 if (ret < 0) {
4616 wl1271_warning("build arp rsp failed: %d", ret);
4617 goto out;
4620 ret = wl1271_acx_arp_ip_filter(wl, wlvif,
4621 (ACX_ARP_FILTER_ARP_FILTERING |
4622 ACX_ARP_FILTER_AUTO_ARP),
4623 addr);
4624 } else {
4625 wlvif->ip_addr = 0;
4626 ret = wl1271_acx_arp_ip_filter(wl, wlvif, 0, addr);
4629 if (ret < 0)
4630 goto out;
4633 out:
4634 return;
4637 static void wl1271_op_bss_info_changed(struct ieee80211_hw *hw,
4638 struct ieee80211_vif *vif,
4639 struct ieee80211_bss_conf *bss_conf,
4640 u32 changed)
4642 struct wl1271 *wl = hw->priv;
4643 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
4644 bool is_ap = (wlvif->bss_type == BSS_TYPE_AP_BSS);
4645 int ret;
4647 wl1271_debug(DEBUG_MAC80211, "mac80211 bss info role %d changed 0x%x",
4648 wlvif->role_id, (int)changed);
4651 * make sure to cancel pending disconnections if our association
4652 * state changed
4654 if (!is_ap && (changed & BSS_CHANGED_ASSOC))
4655 cancel_delayed_work_sync(&wlvif->connection_loss_work);
4657 if (is_ap && (changed & BSS_CHANGED_BEACON_ENABLED) &&
4658 !bss_conf->enable_beacon)
4659 wl1271_tx_flush(wl);
4661 mutex_lock(&wl->mutex);
4663 if (unlikely(wl->state != WLCORE_STATE_ON))
4664 goto out;
4666 if (unlikely(!test_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags)))
4667 goto out;
4669 ret = pm_runtime_get_sync(wl->dev);
4670 if (ret < 0) {
4671 pm_runtime_put_noidle(wl->dev);
4672 goto out;
4675 if ((changed & BSS_CHANGED_TXPOWER) &&
4676 bss_conf->txpower != wlvif->power_level) {
4678 ret = wl1271_acx_tx_power(wl, wlvif, bss_conf->txpower);
4679 if (ret < 0)
4680 goto out;
4682 wlvif->power_level = bss_conf->txpower;
4685 if (is_ap)
4686 wl1271_bss_info_changed_ap(wl, vif, bss_conf, changed);
4687 else
4688 wl1271_bss_info_changed_sta(wl, vif, bss_conf, changed);
4690 pm_runtime_mark_last_busy(wl->dev);
4691 pm_runtime_put_autosuspend(wl->dev);
4693 out:
4694 mutex_unlock(&wl->mutex);
4697 static int wlcore_op_add_chanctx(struct ieee80211_hw *hw,
4698 struct ieee80211_chanctx_conf *ctx)
4700 wl1271_debug(DEBUG_MAC80211, "mac80211 add chanctx %d (type %d)",
4701 ieee80211_frequency_to_channel(ctx->def.chan->center_freq),
4702 cfg80211_get_chandef_type(&ctx->def));
4703 return 0;
4706 static void wlcore_op_remove_chanctx(struct ieee80211_hw *hw,
4707 struct ieee80211_chanctx_conf *ctx)
4709 wl1271_debug(DEBUG_MAC80211, "mac80211 remove chanctx %d (type %d)",
4710 ieee80211_frequency_to_channel(ctx->def.chan->center_freq),
4711 cfg80211_get_chandef_type(&ctx->def));
4714 static void wlcore_op_change_chanctx(struct ieee80211_hw *hw,
4715 struct ieee80211_chanctx_conf *ctx,
4716 u32 changed)
4718 struct wl1271 *wl = hw->priv;
4719 struct wl12xx_vif *wlvif;
4720 int ret;
4721 int channel = ieee80211_frequency_to_channel(
4722 ctx->def.chan->center_freq);
4724 wl1271_debug(DEBUG_MAC80211,
4725 "mac80211 change chanctx %d (type %d) changed 0x%x",
4726 channel, cfg80211_get_chandef_type(&ctx->def), changed);
4728 mutex_lock(&wl->mutex);
4730 ret = pm_runtime_get_sync(wl->dev);
4731 if (ret < 0) {
4732 pm_runtime_put_noidle(wl->dev);
4733 goto out;
4736 wl12xx_for_each_wlvif(wl, wlvif) {
4737 struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
4739 rcu_read_lock();
4740 if (rcu_access_pointer(vif->chanctx_conf) != ctx) {
4741 rcu_read_unlock();
4742 continue;
4744 rcu_read_unlock();
4746 /* start radar if needed */
4747 if (changed & IEEE80211_CHANCTX_CHANGE_RADAR &&
4748 wlvif->bss_type == BSS_TYPE_AP_BSS &&
4749 ctx->radar_enabled && !wlvif->radar_enabled &&
4750 ctx->def.chan->dfs_state == NL80211_DFS_USABLE) {
4751 wl1271_debug(DEBUG_MAC80211, "Start radar detection");
4752 wlcore_hw_set_cac(wl, wlvif, true);
4753 wlvif->radar_enabled = true;
4757 pm_runtime_mark_last_busy(wl->dev);
4758 pm_runtime_put_autosuspend(wl->dev);
4759 out:
4760 mutex_unlock(&wl->mutex);
4763 static int wlcore_op_assign_vif_chanctx(struct ieee80211_hw *hw,
4764 struct ieee80211_vif *vif,
4765 struct ieee80211_chanctx_conf *ctx)
4767 struct wl1271 *wl = hw->priv;
4768 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
4769 int channel = ieee80211_frequency_to_channel(
4770 ctx->def.chan->center_freq);
4771 int ret = -EINVAL;
4773 wl1271_debug(DEBUG_MAC80211,
4774 "mac80211 assign chanctx (role %d) %d (type %d) (radar %d dfs_state %d)",
4775 wlvif->role_id, channel,
4776 cfg80211_get_chandef_type(&ctx->def),
4777 ctx->radar_enabled, ctx->def.chan->dfs_state);
4779 mutex_lock(&wl->mutex);
4781 if (unlikely(wl->state != WLCORE_STATE_ON))
4782 goto out;
4784 if (unlikely(!test_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags)))
4785 goto out;
4787 ret = pm_runtime_get_sync(wl->dev);
4788 if (ret < 0) {
4789 pm_runtime_put_noidle(wl->dev);
4790 goto out;
4793 wlvif->band = ctx->def.chan->band;
4794 wlvif->channel = channel;
4795 wlvif->channel_type = cfg80211_get_chandef_type(&ctx->def);
4797 /* update default rates according to the band */
4798 wl1271_set_band_rate(wl, wlvif);
4800 if (ctx->radar_enabled &&
4801 ctx->def.chan->dfs_state == NL80211_DFS_USABLE) {
4802 wl1271_debug(DEBUG_MAC80211, "Start radar detection");
4803 wlcore_hw_set_cac(wl, wlvif, true);
4804 wlvif->radar_enabled = true;
4807 pm_runtime_mark_last_busy(wl->dev);
4808 pm_runtime_put_autosuspend(wl->dev);
4809 out:
4810 mutex_unlock(&wl->mutex);
4812 return 0;
4815 static void wlcore_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
4816 struct ieee80211_vif *vif,
4817 struct ieee80211_chanctx_conf *ctx)
4819 struct wl1271 *wl = hw->priv;
4820 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
4821 int ret;
4823 wl1271_debug(DEBUG_MAC80211,
4824 "mac80211 unassign chanctx (role %d) %d (type %d)",
4825 wlvif->role_id,
4826 ieee80211_frequency_to_channel(ctx->def.chan->center_freq),
4827 cfg80211_get_chandef_type(&ctx->def));
4829 wl1271_tx_flush(wl);
4831 mutex_lock(&wl->mutex);
4833 if (unlikely(wl->state != WLCORE_STATE_ON))
4834 goto out;
4836 if (unlikely(!test_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags)))
4837 goto out;
4839 ret = pm_runtime_get_sync(wl->dev);
4840 if (ret < 0) {
4841 pm_runtime_put_noidle(wl->dev);
4842 goto out;
4845 if (wlvif->radar_enabled) {
4846 wl1271_debug(DEBUG_MAC80211, "Stop radar detection");
4847 wlcore_hw_set_cac(wl, wlvif, false);
4848 wlvif->radar_enabled = false;
4851 pm_runtime_mark_last_busy(wl->dev);
4852 pm_runtime_put_autosuspend(wl->dev);
4853 out:
4854 mutex_unlock(&wl->mutex);
4857 static int __wlcore_switch_vif_chan(struct wl1271 *wl,
4858 struct wl12xx_vif *wlvif,
4859 struct ieee80211_chanctx_conf *new_ctx)
4861 int channel = ieee80211_frequency_to_channel(
4862 new_ctx->def.chan->center_freq);
4864 wl1271_debug(DEBUG_MAC80211,
4865 "switch vif (role %d) %d -> %d chan_type: %d",
4866 wlvif->role_id, wlvif->channel, channel,
4867 cfg80211_get_chandef_type(&new_ctx->def));
4869 if (WARN_ON_ONCE(wlvif->bss_type != BSS_TYPE_AP_BSS))
4870 return 0;
4872 WARN_ON(!test_bit(WLVIF_FLAG_BEACON_DISABLED, &wlvif->flags));
4874 if (wlvif->radar_enabled) {
4875 wl1271_debug(DEBUG_MAC80211, "Stop radar detection");
4876 wlcore_hw_set_cac(wl, wlvif, false);
4877 wlvif->radar_enabled = false;
4880 wlvif->band = new_ctx->def.chan->band;
4881 wlvif->channel = channel;
4882 wlvif->channel_type = cfg80211_get_chandef_type(&new_ctx->def);
4884 /* start radar if needed */
4885 if (new_ctx->radar_enabled) {
4886 wl1271_debug(DEBUG_MAC80211, "Start radar detection");
4887 wlcore_hw_set_cac(wl, wlvif, true);
4888 wlvif->radar_enabled = true;
4891 return 0;
4894 static int
4895 wlcore_op_switch_vif_chanctx(struct ieee80211_hw *hw,
4896 struct ieee80211_vif_chanctx_switch *vifs,
4897 int n_vifs,
4898 enum ieee80211_chanctx_switch_mode mode)
4900 struct wl1271 *wl = hw->priv;
4901 int i, ret;
4903 wl1271_debug(DEBUG_MAC80211,
4904 "mac80211 switch chanctx n_vifs %d mode %d",
4905 n_vifs, mode);
4907 mutex_lock(&wl->mutex);
4909 ret = pm_runtime_get_sync(wl->dev);
4910 if (ret < 0) {
4911 pm_runtime_put_noidle(wl->dev);
4912 goto out;
4915 for (i = 0; i < n_vifs; i++) {
4916 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vifs[i].vif);
4918 ret = __wlcore_switch_vif_chan(wl, wlvif, vifs[i].new_ctx);
4919 if (ret)
4920 goto out_sleep;
4922 out_sleep:
4923 pm_runtime_mark_last_busy(wl->dev);
4924 pm_runtime_put_autosuspend(wl->dev);
4925 out:
4926 mutex_unlock(&wl->mutex);
4928 return 0;
4931 static int wl1271_op_conf_tx(struct ieee80211_hw *hw,
4932 struct ieee80211_vif *vif, u16 queue,
4933 const struct ieee80211_tx_queue_params *params)
4935 struct wl1271 *wl = hw->priv;
4936 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
4937 u8 ps_scheme;
4938 int ret = 0;
4940 if (wlcore_is_p2p_mgmt(wlvif))
4941 return 0;
4943 mutex_lock(&wl->mutex);
4945 wl1271_debug(DEBUG_MAC80211, "mac80211 conf tx %d", queue);
4947 if (params->uapsd)
4948 ps_scheme = CONF_PS_SCHEME_UPSD_TRIGGER;
4949 else
4950 ps_scheme = CONF_PS_SCHEME_LEGACY;
4952 if (!test_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags))
4953 goto out;
4955 ret = pm_runtime_get_sync(wl->dev);
4956 if (ret < 0) {
4957 pm_runtime_put_noidle(wl->dev);
4958 goto out;
4962 * the txop is confed in units of 32us by the mac80211,
4963 * we need us
4965 ret = wl1271_acx_ac_cfg(wl, wlvif, wl1271_tx_get_queue(queue),
4966 params->cw_min, params->cw_max,
4967 params->aifs, params->txop << 5);
4968 if (ret < 0)
4969 goto out_sleep;
4971 ret = wl1271_acx_tid_cfg(wl, wlvif, wl1271_tx_get_queue(queue),
4972 CONF_CHANNEL_TYPE_EDCF,
4973 wl1271_tx_get_queue(queue),
4974 ps_scheme, CONF_ACK_POLICY_LEGACY,
4975 0, 0);
4977 out_sleep:
4978 pm_runtime_mark_last_busy(wl->dev);
4979 pm_runtime_put_autosuspend(wl->dev);
4981 out:
4982 mutex_unlock(&wl->mutex);
4984 return ret;
4987 static u64 wl1271_op_get_tsf(struct ieee80211_hw *hw,
4988 struct ieee80211_vif *vif)
4991 struct wl1271 *wl = hw->priv;
4992 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
4993 u64 mactime = ULLONG_MAX;
4994 int ret;
4996 wl1271_debug(DEBUG_MAC80211, "mac80211 get tsf");
4998 mutex_lock(&wl->mutex);
5000 if (unlikely(wl->state != WLCORE_STATE_ON))
5001 goto out;
5003 ret = pm_runtime_get_sync(wl->dev);
5004 if (ret < 0) {
5005 pm_runtime_put_noidle(wl->dev);
5006 goto out;
5009 ret = wl12xx_acx_tsf_info(wl, wlvif, &mactime);
5010 if (ret < 0)
5011 goto out_sleep;
5013 out_sleep:
5014 pm_runtime_mark_last_busy(wl->dev);
5015 pm_runtime_put_autosuspend(wl->dev);
5017 out:
5018 mutex_unlock(&wl->mutex);
5019 return mactime;
5022 static int wl1271_op_get_survey(struct ieee80211_hw *hw, int idx,
5023 struct survey_info *survey)
5025 struct ieee80211_conf *conf = &hw->conf;
5027 if (idx != 0)
5028 return -ENOENT;
5030 survey->channel = conf->chandef.chan;
5031 survey->filled = 0;
5032 return 0;
5035 static int wl1271_allocate_sta(struct wl1271 *wl,
5036 struct wl12xx_vif *wlvif,
5037 struct ieee80211_sta *sta)
5039 struct wl1271_station *wl_sta;
5040 int ret;
5043 if (wl->active_sta_count >= wl->max_ap_stations) {
5044 wl1271_warning("could not allocate HLID - too much stations");
5045 return -EBUSY;
5048 wl_sta = (struct wl1271_station *)sta->drv_priv;
5049 ret = wl12xx_allocate_link(wl, wlvif, &wl_sta->hlid);
5050 if (ret < 0) {
5051 wl1271_warning("could not allocate HLID - too many links");
5052 return -EBUSY;
5055 /* use the previous security seq, if this is a recovery/resume */
5056 wl->links[wl_sta->hlid].total_freed_pkts = wl_sta->total_freed_pkts;
5058 set_bit(wl_sta->hlid, wlvif->ap.sta_hlid_map);
5059 memcpy(wl->links[wl_sta->hlid].addr, sta->addr, ETH_ALEN);
5060 wl->active_sta_count++;
5061 return 0;
5064 void wl1271_free_sta(struct wl1271 *wl, struct wl12xx_vif *wlvif, u8 hlid)
5066 if (!test_bit(hlid, wlvif->ap.sta_hlid_map))
5067 return;
5069 clear_bit(hlid, wlvif->ap.sta_hlid_map);
5070 __clear_bit(hlid, &wl->ap_ps_map);
5071 __clear_bit(hlid, &wl->ap_fw_ps_map);
5074 * save the last used PN in the private part of iee80211_sta,
5075 * in case of recovery/suspend
5077 wlcore_save_freed_pkts_addr(wl, wlvif, hlid, wl->links[hlid].addr);
5079 wl12xx_free_link(wl, wlvif, &hlid);
5080 wl->active_sta_count--;
5083 * rearm the tx watchdog when the last STA is freed - give the FW a
5084 * chance to return STA-buffered packets before complaining.
5086 if (wl->active_sta_count == 0)
5087 wl12xx_rearm_tx_watchdog_locked(wl);
5090 static int wl12xx_sta_add(struct wl1271 *wl,
5091 struct wl12xx_vif *wlvif,
5092 struct ieee80211_sta *sta)
5094 struct wl1271_station *wl_sta;
5095 int ret = 0;
5096 u8 hlid;
5098 wl1271_debug(DEBUG_MAC80211, "mac80211 add sta %d", (int)sta->aid);
5100 ret = wl1271_allocate_sta(wl, wlvif, sta);
5101 if (ret < 0)
5102 return ret;
5104 wl_sta = (struct wl1271_station *)sta->drv_priv;
5105 hlid = wl_sta->hlid;
5107 ret = wl12xx_cmd_add_peer(wl, wlvif, sta, hlid);
5108 if (ret < 0)
5109 wl1271_free_sta(wl, wlvif, hlid);
5111 return ret;
5114 static int wl12xx_sta_remove(struct wl1271 *wl,
5115 struct wl12xx_vif *wlvif,
5116 struct ieee80211_sta *sta)
5118 struct wl1271_station *wl_sta;
5119 int ret = 0, id;
5121 wl1271_debug(DEBUG_MAC80211, "mac80211 remove sta %d", (int)sta->aid);
5123 wl_sta = (struct wl1271_station *)sta->drv_priv;
5124 id = wl_sta->hlid;
5125 if (WARN_ON(!test_bit(id, wlvif->ap.sta_hlid_map)))
5126 return -EINVAL;
5128 ret = wl12xx_cmd_remove_peer(wl, wlvif, wl_sta->hlid);
5129 if (ret < 0)
5130 return ret;
5132 wl1271_free_sta(wl, wlvif, wl_sta->hlid);
5133 return ret;
5136 static void wlcore_roc_if_possible(struct wl1271 *wl,
5137 struct wl12xx_vif *wlvif)
5139 if (find_first_bit(wl->roc_map,
5140 WL12XX_MAX_ROLES) < WL12XX_MAX_ROLES)
5141 return;
5143 if (WARN_ON(wlvif->role_id == WL12XX_INVALID_ROLE_ID))
5144 return;
5146 wl12xx_roc(wl, wlvif, wlvif->role_id, wlvif->band, wlvif->channel);
5150 * when wl_sta is NULL, we treat this call as if coming from a
5151 * pending auth reply.
5152 * wl->mutex must be taken and the FW must be awake when the call
5153 * takes place.
5155 void wlcore_update_inconn_sta(struct wl1271 *wl, struct wl12xx_vif *wlvif,
5156 struct wl1271_station *wl_sta, bool in_conn)
5158 if (in_conn) {
5159 if (WARN_ON(wl_sta && wl_sta->in_connection))
5160 return;
5162 if (!wlvif->ap_pending_auth_reply &&
5163 !wlvif->inconn_count)
5164 wlcore_roc_if_possible(wl, wlvif);
5166 if (wl_sta) {
5167 wl_sta->in_connection = true;
5168 wlvif->inconn_count++;
5169 } else {
5170 wlvif->ap_pending_auth_reply = true;
5172 } else {
5173 if (wl_sta && !wl_sta->in_connection)
5174 return;
5176 if (WARN_ON(!wl_sta && !wlvif->ap_pending_auth_reply))
5177 return;
5179 if (WARN_ON(wl_sta && !wlvif->inconn_count))
5180 return;
5182 if (wl_sta) {
5183 wl_sta->in_connection = false;
5184 wlvif->inconn_count--;
5185 } else {
5186 wlvif->ap_pending_auth_reply = false;
5189 if (!wlvif->inconn_count && !wlvif->ap_pending_auth_reply &&
5190 test_bit(wlvif->role_id, wl->roc_map))
5191 wl12xx_croc(wl, wlvif->role_id);
5195 static int wl12xx_update_sta_state(struct wl1271 *wl,
5196 struct wl12xx_vif *wlvif,
5197 struct ieee80211_sta *sta,
5198 enum ieee80211_sta_state old_state,
5199 enum ieee80211_sta_state new_state)
5201 struct wl1271_station *wl_sta;
5202 bool is_ap = wlvif->bss_type == BSS_TYPE_AP_BSS;
5203 bool is_sta = wlvif->bss_type == BSS_TYPE_STA_BSS;
5204 int ret;
5206 wl_sta = (struct wl1271_station *)sta->drv_priv;
5208 /* Add station (AP mode) */
5209 if (is_ap &&
5210 old_state == IEEE80211_STA_NOTEXIST &&
5211 new_state == IEEE80211_STA_NONE) {
5212 ret = wl12xx_sta_add(wl, wlvif, sta);
5213 if (ret)
5214 return ret;
5216 wlcore_update_inconn_sta(wl, wlvif, wl_sta, true);
5219 /* Remove station (AP mode) */
5220 if (is_ap &&
5221 old_state == IEEE80211_STA_NONE &&
5222 new_state == IEEE80211_STA_NOTEXIST) {
5223 /* must not fail */
5224 wl12xx_sta_remove(wl, wlvif, sta);
5226 wlcore_update_inconn_sta(wl, wlvif, wl_sta, false);
5229 /* Authorize station (AP mode) */
5230 if (is_ap &&
5231 new_state == IEEE80211_STA_AUTHORIZED) {
5232 ret = wl12xx_cmd_set_peer_state(wl, wlvif, wl_sta->hlid);
5233 if (ret < 0)
5234 return ret;
5236 /* reconfigure rates */
5237 ret = wl12xx_cmd_add_peer(wl, wlvif, sta, wl_sta->hlid);
5238 if (ret < 0)
5239 return ret;
5241 ret = wl1271_acx_set_ht_capabilities(wl, &sta->ht_cap, true,
5242 wl_sta->hlid);
5243 if (ret)
5244 return ret;
5246 wlcore_update_inconn_sta(wl, wlvif, wl_sta, false);
5249 /* Authorize station */
5250 if (is_sta &&
5251 new_state == IEEE80211_STA_AUTHORIZED) {
5252 set_bit(WLVIF_FLAG_STA_AUTHORIZED, &wlvif->flags);
5253 ret = wl12xx_set_authorized(wl, wlvif);
5254 if (ret)
5255 return ret;
5258 if (is_sta &&
5259 old_state == IEEE80211_STA_AUTHORIZED &&
5260 new_state == IEEE80211_STA_ASSOC) {
5261 clear_bit(WLVIF_FLAG_STA_AUTHORIZED, &wlvif->flags);
5262 clear_bit(WLVIF_FLAG_STA_STATE_SENT, &wlvif->flags);
5265 /* save seq number on disassoc (suspend) */
5266 if (is_sta &&
5267 old_state == IEEE80211_STA_ASSOC &&
5268 new_state == IEEE80211_STA_AUTH) {
5269 wlcore_save_freed_pkts(wl, wlvif, wlvif->sta.hlid, sta);
5270 wlvif->total_freed_pkts = 0;
5273 /* restore seq number on assoc (resume) */
5274 if (is_sta &&
5275 old_state == IEEE80211_STA_AUTH &&
5276 new_state == IEEE80211_STA_ASSOC) {
5277 wlvif->total_freed_pkts = wl_sta->total_freed_pkts;
5280 /* clear ROCs on failure or authorization */
5281 if (is_sta &&
5282 (new_state == IEEE80211_STA_AUTHORIZED ||
5283 new_state == IEEE80211_STA_NOTEXIST)) {
5284 if (test_bit(wlvif->role_id, wl->roc_map))
5285 wl12xx_croc(wl, wlvif->role_id);
5288 if (is_sta &&
5289 old_state == IEEE80211_STA_NOTEXIST &&
5290 new_state == IEEE80211_STA_NONE) {
5291 if (find_first_bit(wl->roc_map,
5292 WL12XX_MAX_ROLES) >= WL12XX_MAX_ROLES) {
5293 WARN_ON(wlvif->role_id == WL12XX_INVALID_ROLE_ID);
5294 wl12xx_roc(wl, wlvif, wlvif->role_id,
5295 wlvif->band, wlvif->channel);
5298 return 0;
5301 static int wl12xx_op_sta_state(struct ieee80211_hw *hw,
5302 struct ieee80211_vif *vif,
5303 struct ieee80211_sta *sta,
5304 enum ieee80211_sta_state old_state,
5305 enum ieee80211_sta_state new_state)
5307 struct wl1271 *wl = hw->priv;
5308 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
5309 int ret;
5311 wl1271_debug(DEBUG_MAC80211, "mac80211 sta %d state=%d->%d",
5312 sta->aid, old_state, new_state);
5314 mutex_lock(&wl->mutex);
5316 if (unlikely(wl->state != WLCORE_STATE_ON)) {
5317 ret = -EBUSY;
5318 goto out;
5321 ret = pm_runtime_get_sync(wl->dev);
5322 if (ret < 0) {
5323 pm_runtime_put_noidle(wl->dev);
5324 goto out;
5327 ret = wl12xx_update_sta_state(wl, wlvif, sta, old_state, new_state);
5329 pm_runtime_mark_last_busy(wl->dev);
5330 pm_runtime_put_autosuspend(wl->dev);
5331 out:
5332 mutex_unlock(&wl->mutex);
5333 if (new_state < old_state)
5334 return 0;
5335 return ret;
5338 static int wl1271_op_ampdu_action(struct ieee80211_hw *hw,
5339 struct ieee80211_vif *vif,
5340 struct ieee80211_ampdu_params *params)
5342 struct wl1271 *wl = hw->priv;
5343 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
5344 int ret;
5345 u8 hlid, *ba_bitmap;
5346 struct ieee80211_sta *sta = params->sta;
5347 enum ieee80211_ampdu_mlme_action action = params->action;
5348 u16 tid = params->tid;
5349 u16 *ssn = &params->ssn;
5351 wl1271_debug(DEBUG_MAC80211, "mac80211 ampdu action %d tid %d", action,
5352 tid);
5354 /* sanity check - the fields in FW are only 8bits wide */
5355 if (WARN_ON(tid > 0xFF))
5356 return -ENOTSUPP;
5358 mutex_lock(&wl->mutex);
5360 if (unlikely(wl->state != WLCORE_STATE_ON)) {
5361 ret = -EAGAIN;
5362 goto out;
5365 if (wlvif->bss_type == BSS_TYPE_STA_BSS) {
5366 hlid = wlvif->sta.hlid;
5367 } else if (wlvif->bss_type == BSS_TYPE_AP_BSS) {
5368 struct wl1271_station *wl_sta;
5370 wl_sta = (struct wl1271_station *)sta->drv_priv;
5371 hlid = wl_sta->hlid;
5372 } else {
5373 ret = -EINVAL;
5374 goto out;
5377 ba_bitmap = &wl->links[hlid].ba_bitmap;
5379 ret = pm_runtime_get_sync(wl->dev);
5380 if (ret < 0) {
5381 pm_runtime_put_noidle(wl->dev);
5382 goto out;
5385 wl1271_debug(DEBUG_MAC80211, "mac80211 ampdu: Rx tid %d action %d",
5386 tid, action);
5388 switch (action) {
5389 case IEEE80211_AMPDU_RX_START:
5390 if (!wlvif->ba_support || !wlvif->ba_allowed) {
5391 ret = -ENOTSUPP;
5392 break;
5395 if (wl->ba_rx_session_count >= wl->ba_rx_session_count_max) {
5396 ret = -EBUSY;
5397 wl1271_error("exceeded max RX BA sessions");
5398 break;
5401 if (*ba_bitmap & BIT(tid)) {
5402 ret = -EINVAL;
5403 wl1271_error("cannot enable RX BA session on active "
5404 "tid: %d", tid);
5405 break;
5408 ret = wl12xx_acx_set_ba_receiver_session(wl, tid, *ssn, true,
5409 hlid,
5410 params->buf_size);
5412 if (!ret) {
5413 *ba_bitmap |= BIT(tid);
5414 wl->ba_rx_session_count++;
5416 break;
5418 case IEEE80211_AMPDU_RX_STOP:
5419 if (!(*ba_bitmap & BIT(tid))) {
5421 * this happens on reconfig - so only output a debug
5422 * message for now, and don't fail the function.
5424 wl1271_debug(DEBUG_MAC80211,
5425 "no active RX BA session on tid: %d",
5426 tid);
5427 ret = 0;
5428 break;
5431 ret = wl12xx_acx_set_ba_receiver_session(wl, tid, 0, false,
5432 hlid, 0);
5433 if (!ret) {
5434 *ba_bitmap &= ~BIT(tid);
5435 wl->ba_rx_session_count--;
5437 break;
5440 * The BA initiator session management in FW independently.
5441 * Falling break here on purpose for all TX APDU commands.
5443 case IEEE80211_AMPDU_TX_START:
5444 case IEEE80211_AMPDU_TX_STOP_CONT:
5445 case IEEE80211_AMPDU_TX_STOP_FLUSH:
5446 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
5447 case IEEE80211_AMPDU_TX_OPERATIONAL:
5448 ret = -EINVAL;
5449 break;
5451 default:
5452 wl1271_error("Incorrect ampdu action id=%x\n", action);
5453 ret = -EINVAL;
5456 pm_runtime_mark_last_busy(wl->dev);
5457 pm_runtime_put_autosuspend(wl->dev);
5459 out:
5460 mutex_unlock(&wl->mutex);
5462 return ret;
5465 static int wl12xx_set_bitrate_mask(struct ieee80211_hw *hw,
5466 struct ieee80211_vif *vif,
5467 const struct cfg80211_bitrate_mask *mask)
5469 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
5470 struct wl1271 *wl = hw->priv;
5471 int i, ret = 0;
5473 wl1271_debug(DEBUG_MAC80211, "mac80211 set_bitrate_mask 0x%x 0x%x",
5474 mask->control[NL80211_BAND_2GHZ].legacy,
5475 mask->control[NL80211_BAND_5GHZ].legacy);
5477 mutex_lock(&wl->mutex);
5479 for (i = 0; i < WLCORE_NUM_BANDS; i++)
5480 wlvif->bitrate_masks[i] =
5481 wl1271_tx_enabled_rates_get(wl,
5482 mask->control[i].legacy,
5485 if (unlikely(wl->state != WLCORE_STATE_ON))
5486 goto out;
5488 if (wlvif->bss_type == BSS_TYPE_STA_BSS &&
5489 !test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags)) {
5491 ret = pm_runtime_get_sync(wl->dev);
5492 if (ret < 0) {
5493 pm_runtime_put_noidle(wl->dev);
5494 goto out;
5497 wl1271_set_band_rate(wl, wlvif);
5498 wlvif->basic_rate =
5499 wl1271_tx_min_rate_get(wl, wlvif->basic_rate_set);
5500 ret = wl1271_acx_sta_rate_policies(wl, wlvif);
5502 pm_runtime_mark_last_busy(wl->dev);
5503 pm_runtime_put_autosuspend(wl->dev);
5505 out:
5506 mutex_unlock(&wl->mutex);
5508 return ret;
5511 static void wl12xx_op_channel_switch(struct ieee80211_hw *hw,
5512 struct ieee80211_vif *vif,
5513 struct ieee80211_channel_switch *ch_switch)
5515 struct wl1271 *wl = hw->priv;
5516 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
5517 int ret;
5519 wl1271_debug(DEBUG_MAC80211, "mac80211 channel switch");
5521 wl1271_tx_flush(wl);
5523 mutex_lock(&wl->mutex);
5525 if (unlikely(wl->state == WLCORE_STATE_OFF)) {
5526 if (test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags))
5527 ieee80211_chswitch_done(vif, false);
5528 goto out;
5529 } else if (unlikely(wl->state != WLCORE_STATE_ON)) {
5530 goto out;
5533 ret = pm_runtime_get_sync(wl->dev);
5534 if (ret < 0) {
5535 pm_runtime_put_noidle(wl->dev);
5536 goto out;
5539 /* TODO: change mac80211 to pass vif as param */
5541 if (test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags)) {
5542 unsigned long delay_usec;
5544 ret = wl->ops->channel_switch(wl, wlvif, ch_switch);
5545 if (ret)
5546 goto out_sleep;
5548 set_bit(WLVIF_FLAG_CS_PROGRESS, &wlvif->flags);
5550 /* indicate failure 5 seconds after channel switch time */
5551 delay_usec = ieee80211_tu_to_usec(wlvif->beacon_int) *
5552 ch_switch->count;
5553 ieee80211_queue_delayed_work(hw, &wlvif->channel_switch_work,
5554 usecs_to_jiffies(delay_usec) +
5555 msecs_to_jiffies(5000));
5558 out_sleep:
5559 pm_runtime_mark_last_busy(wl->dev);
5560 pm_runtime_put_autosuspend(wl->dev);
5562 out:
5563 mutex_unlock(&wl->mutex);
5566 static const void *wlcore_get_beacon_ie(struct wl1271 *wl,
5567 struct wl12xx_vif *wlvif,
5568 u8 eid)
5570 int ieoffset = offsetof(struct ieee80211_mgmt, u.beacon.variable);
5571 struct sk_buff *beacon =
5572 ieee80211_beacon_get(wl->hw, wl12xx_wlvif_to_vif(wlvif));
5574 if (!beacon)
5575 return NULL;
5577 return cfg80211_find_ie(eid,
5578 beacon->data + ieoffset,
5579 beacon->len - ieoffset);
5582 static int wlcore_get_csa_count(struct wl1271 *wl, struct wl12xx_vif *wlvif,
5583 u8 *csa_count)
5585 const u8 *ie;
5586 const struct ieee80211_channel_sw_ie *ie_csa;
5588 ie = wlcore_get_beacon_ie(wl, wlvif, WLAN_EID_CHANNEL_SWITCH);
5589 if (!ie)
5590 return -EINVAL;
5592 ie_csa = (struct ieee80211_channel_sw_ie *)&ie[2];
5593 *csa_count = ie_csa->count;
5595 return 0;
5598 static void wlcore_op_channel_switch_beacon(struct ieee80211_hw *hw,
5599 struct ieee80211_vif *vif,
5600 struct cfg80211_chan_def *chandef)
5602 struct wl1271 *wl = hw->priv;
5603 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
5604 struct ieee80211_channel_switch ch_switch = {
5605 .block_tx = true,
5606 .chandef = *chandef,
5608 int ret;
5610 wl1271_debug(DEBUG_MAC80211,
5611 "mac80211 channel switch beacon (role %d)",
5612 wlvif->role_id);
5614 ret = wlcore_get_csa_count(wl, wlvif, &ch_switch.count);
5615 if (ret < 0) {
5616 wl1271_error("error getting beacon (for CSA counter)");
5617 return;
5620 mutex_lock(&wl->mutex);
5622 if (unlikely(wl->state != WLCORE_STATE_ON)) {
5623 ret = -EBUSY;
5624 goto out;
5627 ret = pm_runtime_get_sync(wl->dev);
5628 if (ret < 0) {
5629 pm_runtime_put_noidle(wl->dev);
5630 goto out;
5633 ret = wl->ops->channel_switch(wl, wlvif, &ch_switch);
5634 if (ret)
5635 goto out_sleep;
5637 set_bit(WLVIF_FLAG_CS_PROGRESS, &wlvif->flags);
5639 out_sleep:
5640 pm_runtime_mark_last_busy(wl->dev);
5641 pm_runtime_put_autosuspend(wl->dev);
5642 out:
5643 mutex_unlock(&wl->mutex);
5646 static void wlcore_op_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
5647 u32 queues, bool drop)
5649 struct wl1271 *wl = hw->priv;
5651 wl1271_tx_flush(wl);
5654 static int wlcore_op_remain_on_channel(struct ieee80211_hw *hw,
5655 struct ieee80211_vif *vif,
5656 struct ieee80211_channel *chan,
5657 int duration,
5658 enum ieee80211_roc_type type)
5660 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
5661 struct wl1271 *wl = hw->priv;
5662 int channel, active_roc, ret = 0;
5664 channel = ieee80211_frequency_to_channel(chan->center_freq);
5666 wl1271_debug(DEBUG_MAC80211, "mac80211 roc %d (%d)",
5667 channel, wlvif->role_id);
5669 mutex_lock(&wl->mutex);
5671 if (unlikely(wl->state != WLCORE_STATE_ON))
5672 goto out;
5674 /* return EBUSY if we can't ROC right now */
5675 active_roc = find_first_bit(wl->roc_map, WL12XX_MAX_ROLES);
5676 if (wl->roc_vif || active_roc < WL12XX_MAX_ROLES) {
5677 wl1271_warning("active roc on role %d", active_roc);
5678 ret = -EBUSY;
5679 goto out;
5682 ret = pm_runtime_get_sync(wl->dev);
5683 if (ret < 0) {
5684 pm_runtime_put_noidle(wl->dev);
5685 goto out;
5688 ret = wl12xx_start_dev(wl, wlvif, chan->band, channel);
5689 if (ret < 0)
5690 goto out_sleep;
5692 wl->roc_vif = vif;
5693 ieee80211_queue_delayed_work(hw, &wl->roc_complete_work,
5694 msecs_to_jiffies(duration));
5695 out_sleep:
5696 pm_runtime_mark_last_busy(wl->dev);
5697 pm_runtime_put_autosuspend(wl->dev);
5698 out:
5699 mutex_unlock(&wl->mutex);
5700 return ret;
5703 static int __wlcore_roc_completed(struct wl1271 *wl)
5705 struct wl12xx_vif *wlvif;
5706 int ret;
5708 /* already completed */
5709 if (unlikely(!wl->roc_vif))
5710 return 0;
5712 wlvif = wl12xx_vif_to_data(wl->roc_vif);
5714 if (!test_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags))
5715 return -EBUSY;
5717 ret = wl12xx_stop_dev(wl, wlvif);
5718 if (ret < 0)
5719 return ret;
5721 wl->roc_vif = NULL;
5723 return 0;
5726 static int wlcore_roc_completed(struct wl1271 *wl)
5728 int ret;
5730 wl1271_debug(DEBUG_MAC80211, "roc complete");
5732 mutex_lock(&wl->mutex);
5734 if (unlikely(wl->state != WLCORE_STATE_ON)) {
5735 ret = -EBUSY;
5736 goto out;
5739 ret = pm_runtime_get_sync(wl->dev);
5740 if (ret < 0) {
5741 pm_runtime_put_noidle(wl->dev);
5742 goto out;
5745 ret = __wlcore_roc_completed(wl);
5747 pm_runtime_mark_last_busy(wl->dev);
5748 pm_runtime_put_autosuspend(wl->dev);
5749 out:
5750 mutex_unlock(&wl->mutex);
5752 return ret;
5755 static void wlcore_roc_complete_work(struct work_struct *work)
5757 struct delayed_work *dwork;
5758 struct wl1271 *wl;
5759 int ret;
5761 dwork = to_delayed_work(work);
5762 wl = container_of(dwork, struct wl1271, roc_complete_work);
5764 ret = wlcore_roc_completed(wl);
5765 if (!ret)
5766 ieee80211_remain_on_channel_expired(wl->hw);
5769 static int wlcore_op_cancel_remain_on_channel(struct ieee80211_hw *hw,
5770 struct ieee80211_vif *vif)
5772 struct wl1271 *wl = hw->priv;
5774 wl1271_debug(DEBUG_MAC80211, "mac80211 croc");
5776 /* TODO: per-vif */
5777 wl1271_tx_flush(wl);
5780 * we can't just flush_work here, because it might deadlock
5781 * (as we might get called from the same workqueue)
5783 cancel_delayed_work_sync(&wl->roc_complete_work);
5784 wlcore_roc_completed(wl);
5786 return 0;
5789 static void wlcore_op_sta_rc_update(struct ieee80211_hw *hw,
5790 struct ieee80211_vif *vif,
5791 struct ieee80211_sta *sta,
5792 u32 changed)
5794 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
5796 wl1271_debug(DEBUG_MAC80211, "mac80211 sta_rc_update");
5798 if (!(changed & IEEE80211_RC_BW_CHANGED))
5799 return;
5801 /* this callback is atomic, so schedule a new work */
5802 wlvif->rc_update_bw = sta->bandwidth;
5803 memcpy(&wlvif->rc_ht_cap, &sta->ht_cap, sizeof(sta->ht_cap));
5804 ieee80211_queue_work(hw, &wlvif->rc_update_work);
5807 static void wlcore_op_sta_statistics(struct ieee80211_hw *hw,
5808 struct ieee80211_vif *vif,
5809 struct ieee80211_sta *sta,
5810 struct station_info *sinfo)
5812 struct wl1271 *wl = hw->priv;
5813 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
5814 s8 rssi_dbm;
5815 int ret;
5817 wl1271_debug(DEBUG_MAC80211, "mac80211 get_rssi");
5819 mutex_lock(&wl->mutex);
5821 if (unlikely(wl->state != WLCORE_STATE_ON))
5822 goto out;
5824 ret = pm_runtime_get_sync(wl->dev);
5825 if (ret < 0) {
5826 pm_runtime_put_noidle(wl->dev);
5827 goto out_sleep;
5830 ret = wlcore_acx_average_rssi(wl, wlvif, &rssi_dbm);
5831 if (ret < 0)
5832 goto out_sleep;
5834 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
5835 sinfo->signal = rssi_dbm;
5837 out_sleep:
5838 pm_runtime_mark_last_busy(wl->dev);
5839 pm_runtime_put_autosuspend(wl->dev);
5841 out:
5842 mutex_unlock(&wl->mutex);
5845 static u32 wlcore_op_get_expected_throughput(struct ieee80211_hw *hw,
5846 struct ieee80211_sta *sta)
5848 struct wl1271_station *wl_sta = (struct wl1271_station *)sta->drv_priv;
5849 struct wl1271 *wl = hw->priv;
5850 u8 hlid = wl_sta->hlid;
5852 /* return in units of Kbps */
5853 return (wl->links[hlid].fw_rate_mbps * 1000);
5856 static bool wl1271_tx_frames_pending(struct ieee80211_hw *hw)
5858 struct wl1271 *wl = hw->priv;
5859 bool ret = false;
5861 mutex_lock(&wl->mutex);
5863 if (unlikely(wl->state != WLCORE_STATE_ON))
5864 goto out;
5866 /* packets are considered pending if in the TX queue or the FW */
5867 ret = (wl1271_tx_total_queue_count(wl) > 0) || (wl->tx_frames_cnt > 0);
5868 out:
5869 mutex_unlock(&wl->mutex);
5871 return ret;
5874 /* can't be const, mac80211 writes to this */
5875 static struct ieee80211_rate wl1271_rates[] = {
5876 { .bitrate = 10,
5877 .hw_value = CONF_HW_BIT_RATE_1MBPS,
5878 .hw_value_short = CONF_HW_BIT_RATE_1MBPS, },
5879 { .bitrate = 20,
5880 .hw_value = CONF_HW_BIT_RATE_2MBPS,
5881 .hw_value_short = CONF_HW_BIT_RATE_2MBPS,
5882 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
5883 { .bitrate = 55,
5884 .hw_value = CONF_HW_BIT_RATE_5_5MBPS,
5885 .hw_value_short = CONF_HW_BIT_RATE_5_5MBPS,
5886 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
5887 { .bitrate = 110,
5888 .hw_value = CONF_HW_BIT_RATE_11MBPS,
5889 .hw_value_short = CONF_HW_BIT_RATE_11MBPS,
5890 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
5891 { .bitrate = 60,
5892 .hw_value = CONF_HW_BIT_RATE_6MBPS,
5893 .hw_value_short = CONF_HW_BIT_RATE_6MBPS, },
5894 { .bitrate = 90,
5895 .hw_value = CONF_HW_BIT_RATE_9MBPS,
5896 .hw_value_short = CONF_HW_BIT_RATE_9MBPS, },
5897 { .bitrate = 120,
5898 .hw_value = CONF_HW_BIT_RATE_12MBPS,
5899 .hw_value_short = CONF_HW_BIT_RATE_12MBPS, },
5900 { .bitrate = 180,
5901 .hw_value = CONF_HW_BIT_RATE_18MBPS,
5902 .hw_value_short = CONF_HW_BIT_RATE_18MBPS, },
5903 { .bitrate = 240,
5904 .hw_value = CONF_HW_BIT_RATE_24MBPS,
5905 .hw_value_short = CONF_HW_BIT_RATE_24MBPS, },
5906 { .bitrate = 360,
5907 .hw_value = CONF_HW_BIT_RATE_36MBPS,
5908 .hw_value_short = CONF_HW_BIT_RATE_36MBPS, },
5909 { .bitrate = 480,
5910 .hw_value = CONF_HW_BIT_RATE_48MBPS,
5911 .hw_value_short = CONF_HW_BIT_RATE_48MBPS, },
5912 { .bitrate = 540,
5913 .hw_value = CONF_HW_BIT_RATE_54MBPS,
5914 .hw_value_short = CONF_HW_BIT_RATE_54MBPS, },
5917 /* can't be const, mac80211 writes to this */
5918 static struct ieee80211_channel wl1271_channels[] = {
5919 { .hw_value = 1, .center_freq = 2412, .max_power = WLCORE_MAX_TXPWR },
5920 { .hw_value = 2, .center_freq = 2417, .max_power = WLCORE_MAX_TXPWR },
5921 { .hw_value = 3, .center_freq = 2422, .max_power = WLCORE_MAX_TXPWR },
5922 { .hw_value = 4, .center_freq = 2427, .max_power = WLCORE_MAX_TXPWR },
5923 { .hw_value = 5, .center_freq = 2432, .max_power = WLCORE_MAX_TXPWR },
5924 { .hw_value = 6, .center_freq = 2437, .max_power = WLCORE_MAX_TXPWR },
5925 { .hw_value = 7, .center_freq = 2442, .max_power = WLCORE_MAX_TXPWR },
5926 { .hw_value = 8, .center_freq = 2447, .max_power = WLCORE_MAX_TXPWR },
5927 { .hw_value = 9, .center_freq = 2452, .max_power = WLCORE_MAX_TXPWR },
5928 { .hw_value = 10, .center_freq = 2457, .max_power = WLCORE_MAX_TXPWR },
5929 { .hw_value = 11, .center_freq = 2462, .max_power = WLCORE_MAX_TXPWR },
5930 { .hw_value = 12, .center_freq = 2467, .max_power = WLCORE_MAX_TXPWR },
5931 { .hw_value = 13, .center_freq = 2472, .max_power = WLCORE_MAX_TXPWR },
5932 { .hw_value = 14, .center_freq = 2484, .max_power = WLCORE_MAX_TXPWR },
5935 /* can't be const, mac80211 writes to this */
5936 static struct ieee80211_supported_band wl1271_band_2ghz = {
5937 .channels = wl1271_channels,
5938 .n_channels = ARRAY_SIZE(wl1271_channels),
5939 .bitrates = wl1271_rates,
5940 .n_bitrates = ARRAY_SIZE(wl1271_rates),
5943 /* 5 GHz data rates for WL1273 */
5944 static struct ieee80211_rate wl1271_rates_5ghz[] = {
5945 { .bitrate = 60,
5946 .hw_value = CONF_HW_BIT_RATE_6MBPS,
5947 .hw_value_short = CONF_HW_BIT_RATE_6MBPS, },
5948 { .bitrate = 90,
5949 .hw_value = CONF_HW_BIT_RATE_9MBPS,
5950 .hw_value_short = CONF_HW_BIT_RATE_9MBPS, },
5951 { .bitrate = 120,
5952 .hw_value = CONF_HW_BIT_RATE_12MBPS,
5953 .hw_value_short = CONF_HW_BIT_RATE_12MBPS, },
5954 { .bitrate = 180,
5955 .hw_value = CONF_HW_BIT_RATE_18MBPS,
5956 .hw_value_short = CONF_HW_BIT_RATE_18MBPS, },
5957 { .bitrate = 240,
5958 .hw_value = CONF_HW_BIT_RATE_24MBPS,
5959 .hw_value_short = CONF_HW_BIT_RATE_24MBPS, },
5960 { .bitrate = 360,
5961 .hw_value = CONF_HW_BIT_RATE_36MBPS,
5962 .hw_value_short = CONF_HW_BIT_RATE_36MBPS, },
5963 { .bitrate = 480,
5964 .hw_value = CONF_HW_BIT_RATE_48MBPS,
5965 .hw_value_short = CONF_HW_BIT_RATE_48MBPS, },
5966 { .bitrate = 540,
5967 .hw_value = CONF_HW_BIT_RATE_54MBPS,
5968 .hw_value_short = CONF_HW_BIT_RATE_54MBPS, },
5971 /* 5 GHz band channels for WL1273 */
5972 static struct ieee80211_channel wl1271_channels_5ghz[] = {
5973 { .hw_value = 8, .center_freq = 5040, .max_power = WLCORE_MAX_TXPWR },
5974 { .hw_value = 12, .center_freq = 5060, .max_power = WLCORE_MAX_TXPWR },
5975 { .hw_value = 16, .center_freq = 5080, .max_power = WLCORE_MAX_TXPWR },
5976 { .hw_value = 34, .center_freq = 5170, .max_power = WLCORE_MAX_TXPWR },
5977 { .hw_value = 36, .center_freq = 5180, .max_power = WLCORE_MAX_TXPWR },
5978 { .hw_value = 38, .center_freq = 5190, .max_power = WLCORE_MAX_TXPWR },
5979 { .hw_value = 40, .center_freq = 5200, .max_power = WLCORE_MAX_TXPWR },
5980 { .hw_value = 42, .center_freq = 5210, .max_power = WLCORE_MAX_TXPWR },
5981 { .hw_value = 44, .center_freq = 5220, .max_power = WLCORE_MAX_TXPWR },
5982 { .hw_value = 46, .center_freq = 5230, .max_power = WLCORE_MAX_TXPWR },
5983 { .hw_value = 48, .center_freq = 5240, .max_power = WLCORE_MAX_TXPWR },
5984 { .hw_value = 52, .center_freq = 5260, .max_power = WLCORE_MAX_TXPWR },
5985 { .hw_value = 56, .center_freq = 5280, .max_power = WLCORE_MAX_TXPWR },
5986 { .hw_value = 60, .center_freq = 5300, .max_power = WLCORE_MAX_TXPWR },
5987 { .hw_value = 64, .center_freq = 5320, .max_power = WLCORE_MAX_TXPWR },
5988 { .hw_value = 100, .center_freq = 5500, .max_power = WLCORE_MAX_TXPWR },
5989 { .hw_value = 104, .center_freq = 5520, .max_power = WLCORE_MAX_TXPWR },
5990 { .hw_value = 108, .center_freq = 5540, .max_power = WLCORE_MAX_TXPWR },
5991 { .hw_value = 112, .center_freq = 5560, .max_power = WLCORE_MAX_TXPWR },
5992 { .hw_value = 116, .center_freq = 5580, .max_power = WLCORE_MAX_TXPWR },
5993 { .hw_value = 120, .center_freq = 5600, .max_power = WLCORE_MAX_TXPWR },
5994 { .hw_value = 124, .center_freq = 5620, .max_power = WLCORE_MAX_TXPWR },
5995 { .hw_value = 128, .center_freq = 5640, .max_power = WLCORE_MAX_TXPWR },
5996 { .hw_value = 132, .center_freq = 5660, .max_power = WLCORE_MAX_TXPWR },
5997 { .hw_value = 136, .center_freq = 5680, .max_power = WLCORE_MAX_TXPWR },
5998 { .hw_value = 140, .center_freq = 5700, .max_power = WLCORE_MAX_TXPWR },
5999 { .hw_value = 149, .center_freq = 5745, .max_power = WLCORE_MAX_TXPWR },
6000 { .hw_value = 153, .center_freq = 5765, .max_power = WLCORE_MAX_TXPWR },
6001 { .hw_value = 157, .center_freq = 5785, .max_power = WLCORE_MAX_TXPWR },
6002 { .hw_value = 161, .center_freq = 5805, .max_power = WLCORE_MAX_TXPWR },
6003 { .hw_value = 165, .center_freq = 5825, .max_power = WLCORE_MAX_TXPWR },
6006 static struct ieee80211_supported_band wl1271_band_5ghz = {
6007 .channels = wl1271_channels_5ghz,
6008 .n_channels = ARRAY_SIZE(wl1271_channels_5ghz),
6009 .bitrates = wl1271_rates_5ghz,
6010 .n_bitrates = ARRAY_SIZE(wl1271_rates_5ghz),
6013 static const struct ieee80211_ops wl1271_ops = {
6014 .start = wl1271_op_start,
6015 .stop = wlcore_op_stop,
6016 .add_interface = wl1271_op_add_interface,
6017 .remove_interface = wl1271_op_remove_interface,
6018 .change_interface = wl12xx_op_change_interface,
6019 #ifdef CONFIG_PM
6020 .suspend = wl1271_op_suspend,
6021 .resume = wl1271_op_resume,
6022 #endif
6023 .config = wl1271_op_config,
6024 .prepare_multicast = wl1271_op_prepare_multicast,
6025 .configure_filter = wl1271_op_configure_filter,
6026 .tx = wl1271_op_tx,
6027 .set_key = wlcore_op_set_key,
6028 .hw_scan = wl1271_op_hw_scan,
6029 .cancel_hw_scan = wl1271_op_cancel_hw_scan,
6030 .sched_scan_start = wl1271_op_sched_scan_start,
6031 .sched_scan_stop = wl1271_op_sched_scan_stop,
6032 .bss_info_changed = wl1271_op_bss_info_changed,
6033 .set_frag_threshold = wl1271_op_set_frag_threshold,
6034 .set_rts_threshold = wl1271_op_set_rts_threshold,
6035 .conf_tx = wl1271_op_conf_tx,
6036 .get_tsf = wl1271_op_get_tsf,
6037 .get_survey = wl1271_op_get_survey,
6038 .sta_state = wl12xx_op_sta_state,
6039 .ampdu_action = wl1271_op_ampdu_action,
6040 .tx_frames_pending = wl1271_tx_frames_pending,
6041 .set_bitrate_mask = wl12xx_set_bitrate_mask,
6042 .set_default_unicast_key = wl1271_op_set_default_key_idx,
6043 .channel_switch = wl12xx_op_channel_switch,
6044 .channel_switch_beacon = wlcore_op_channel_switch_beacon,
6045 .flush = wlcore_op_flush,
6046 .remain_on_channel = wlcore_op_remain_on_channel,
6047 .cancel_remain_on_channel = wlcore_op_cancel_remain_on_channel,
6048 .add_chanctx = wlcore_op_add_chanctx,
6049 .remove_chanctx = wlcore_op_remove_chanctx,
6050 .change_chanctx = wlcore_op_change_chanctx,
6051 .assign_vif_chanctx = wlcore_op_assign_vif_chanctx,
6052 .unassign_vif_chanctx = wlcore_op_unassign_vif_chanctx,
6053 .switch_vif_chanctx = wlcore_op_switch_vif_chanctx,
6054 .sta_rc_update = wlcore_op_sta_rc_update,
6055 .sta_statistics = wlcore_op_sta_statistics,
6056 .get_expected_throughput = wlcore_op_get_expected_throughput,
6057 CFG80211_TESTMODE_CMD(wl1271_tm_cmd)
6061 u8 wlcore_rate_to_idx(struct wl1271 *wl, u8 rate, enum nl80211_band band)
6063 u8 idx;
6065 BUG_ON(band >= 2);
6067 if (unlikely(rate >= wl->hw_tx_rate_tbl_size)) {
6068 wl1271_error("Illegal RX rate from HW: %d", rate);
6069 return 0;
6072 idx = wl->band_rate_to_idx[band][rate];
6073 if (unlikely(idx == CONF_HW_RXTX_RATE_UNSUPPORTED)) {
6074 wl1271_error("Unsupported RX rate from HW: %d", rate);
6075 return 0;
6078 return idx;
6081 static void wl12xx_derive_mac_addresses(struct wl1271 *wl, u32 oui, u32 nic)
6083 int i;
6085 wl1271_debug(DEBUG_PROBE, "base address: oui %06x nic %06x",
6086 oui, nic);
6088 if (nic + WLCORE_NUM_MAC_ADDRESSES - wl->num_mac_addr > 0xffffff)
6089 wl1271_warning("NIC part of the MAC address wraps around!");
6091 for (i = 0; i < wl->num_mac_addr; i++) {
6092 wl->addresses[i].addr[0] = (u8)(oui >> 16);
6093 wl->addresses[i].addr[1] = (u8)(oui >> 8);
6094 wl->addresses[i].addr[2] = (u8) oui;
6095 wl->addresses[i].addr[3] = (u8)(nic >> 16);
6096 wl->addresses[i].addr[4] = (u8)(nic >> 8);
6097 wl->addresses[i].addr[5] = (u8) nic;
6098 nic++;
6101 /* we may be one address short at the most */
6102 WARN_ON(wl->num_mac_addr + 1 < WLCORE_NUM_MAC_ADDRESSES);
6105 * turn on the LAA bit in the first address and use it as
6106 * the last address.
6108 if (wl->num_mac_addr < WLCORE_NUM_MAC_ADDRESSES) {
6109 int idx = WLCORE_NUM_MAC_ADDRESSES - 1;
6110 memcpy(&wl->addresses[idx], &wl->addresses[0],
6111 sizeof(wl->addresses[0]));
6112 /* LAA bit */
6113 wl->addresses[idx].addr[0] |= BIT(1);
6116 wl->hw->wiphy->n_addresses = WLCORE_NUM_MAC_ADDRESSES;
6117 wl->hw->wiphy->addresses = wl->addresses;
6120 static int wl12xx_get_hw_info(struct wl1271 *wl)
6122 int ret;
6124 ret = wlcore_read_reg(wl, REG_CHIP_ID_B, &wl->chip.id);
6125 if (ret < 0)
6126 goto out;
6128 wl->fuse_oui_addr = 0;
6129 wl->fuse_nic_addr = 0;
6131 ret = wl->ops->get_pg_ver(wl, &wl->hw_pg_ver);
6132 if (ret < 0)
6133 goto out;
6135 if (wl->ops->get_mac)
6136 ret = wl->ops->get_mac(wl);
6138 out:
6139 return ret;
6142 static int wl1271_register_hw(struct wl1271 *wl)
6144 int ret;
6145 u32 oui_addr = 0, nic_addr = 0;
6146 struct platform_device *pdev = wl->pdev;
6147 struct wlcore_platdev_data *pdev_data = dev_get_platdata(&pdev->dev);
6149 if (wl->mac80211_registered)
6150 return 0;
6152 if (wl->nvs_len >= 12) {
6153 /* NOTE: The wl->nvs->nvs element must be first, in
6154 * order to simplify the casting, we assume it is at
6155 * the beginning of the wl->nvs structure.
6157 u8 *nvs_ptr = (u8 *)wl->nvs;
6159 oui_addr =
6160 (nvs_ptr[11] << 16) + (nvs_ptr[10] << 8) + nvs_ptr[6];
6161 nic_addr =
6162 (nvs_ptr[5] << 16) + (nvs_ptr[4] << 8) + nvs_ptr[3];
6165 /* if the MAC address is zeroed in the NVS derive from fuse */
6166 if (oui_addr == 0 && nic_addr == 0) {
6167 oui_addr = wl->fuse_oui_addr;
6168 /* fuse has the BD_ADDR, the WLAN addresses are the next two */
6169 nic_addr = wl->fuse_nic_addr + 1;
6172 if (oui_addr == 0xdeadbe && nic_addr == 0xef0000) {
6173 wl1271_warning("Detected unconfigured mac address in nvs, derive from fuse instead.");
6174 if (!strcmp(pdev_data->family->name, "wl18xx")) {
6175 wl1271_warning("This default nvs file can be removed from the file system");
6176 } else {
6177 wl1271_warning("Your device performance is not optimized.");
6178 wl1271_warning("Please use the calibrator tool to configure your device.");
6181 if (wl->fuse_oui_addr == 0 && wl->fuse_nic_addr == 0) {
6182 wl1271_warning("Fuse mac address is zero. using random mac");
6183 /* Use TI oui and a random nic */
6184 oui_addr = WLCORE_TI_OUI_ADDRESS;
6185 nic_addr = get_random_int();
6186 } else {
6187 oui_addr = wl->fuse_oui_addr;
6188 /* fuse has the BD_ADDR, the WLAN addresses are the next two */
6189 nic_addr = wl->fuse_nic_addr + 1;
6193 wl12xx_derive_mac_addresses(wl, oui_addr, nic_addr);
6195 ret = ieee80211_register_hw(wl->hw);
6196 if (ret < 0) {
6197 wl1271_error("unable to register mac80211 hw: %d", ret);
6198 goto out;
6201 wl->mac80211_registered = true;
6203 wl1271_debugfs_init(wl);
6205 wl1271_notice("loaded");
6207 out:
6208 return ret;
6211 static void wl1271_unregister_hw(struct wl1271 *wl)
6213 if (wl->plt)
6214 wl1271_plt_stop(wl);
6216 ieee80211_unregister_hw(wl->hw);
6217 wl->mac80211_registered = false;
6221 static int wl1271_init_ieee80211(struct wl1271 *wl)
6223 int i;
6224 static const u32 cipher_suites[] = {
6225 WLAN_CIPHER_SUITE_WEP40,
6226 WLAN_CIPHER_SUITE_WEP104,
6227 WLAN_CIPHER_SUITE_TKIP,
6228 WLAN_CIPHER_SUITE_CCMP,
6229 WL1271_CIPHER_SUITE_GEM,
6232 /* The tx descriptor buffer */
6233 wl->hw->extra_tx_headroom = sizeof(struct wl1271_tx_hw_descr);
6235 if (wl->quirks & WLCORE_QUIRK_TKIP_HEADER_SPACE)
6236 wl->hw->extra_tx_headroom += WL1271_EXTRA_SPACE_TKIP;
6238 /* unit us */
6239 /* FIXME: find a proper value */
6240 wl->hw->max_listen_interval = wl->conf.conn.max_listen_interval;
6242 ieee80211_hw_set(wl->hw, SUPPORT_FAST_XMIT);
6243 ieee80211_hw_set(wl->hw, CHANCTX_STA_CSA);
6244 ieee80211_hw_set(wl->hw, SUPPORTS_PER_STA_GTK);
6245 ieee80211_hw_set(wl->hw, QUEUE_CONTROL);
6246 ieee80211_hw_set(wl->hw, TX_AMPDU_SETUP_IN_HW);
6247 ieee80211_hw_set(wl->hw, AMPDU_AGGREGATION);
6248 ieee80211_hw_set(wl->hw, AP_LINK_PS);
6249 ieee80211_hw_set(wl->hw, SPECTRUM_MGMT);
6250 ieee80211_hw_set(wl->hw, REPORTS_TX_ACK_STATUS);
6251 ieee80211_hw_set(wl->hw, CONNECTION_MONITOR);
6252 ieee80211_hw_set(wl->hw, HAS_RATE_CONTROL);
6253 ieee80211_hw_set(wl->hw, SUPPORTS_DYNAMIC_PS);
6254 ieee80211_hw_set(wl->hw, SIGNAL_DBM);
6255 ieee80211_hw_set(wl->hw, SUPPORTS_PS);
6256 ieee80211_hw_set(wl->hw, SUPPORTS_TX_FRAG);
6258 wl->hw->wiphy->cipher_suites = cipher_suites;
6259 wl->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
6261 wl->hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
6262 BIT(NL80211_IFTYPE_AP) |
6263 BIT(NL80211_IFTYPE_P2P_DEVICE) |
6264 BIT(NL80211_IFTYPE_P2P_CLIENT) |
6265 #ifdef CONFIG_MAC80211_MESH
6266 BIT(NL80211_IFTYPE_MESH_POINT) |
6267 #endif
6268 BIT(NL80211_IFTYPE_P2P_GO);
6270 wl->hw->wiphy->max_scan_ssids = 1;
6271 wl->hw->wiphy->max_sched_scan_ssids = 16;
6272 wl->hw->wiphy->max_match_sets = 16;
6274 * Maximum length of elements in scanning probe request templates
6275 * should be the maximum length possible for a template, without
6276 * the IEEE80211 header of the template
6278 wl->hw->wiphy->max_scan_ie_len = WL1271_CMD_TEMPL_MAX_SIZE -
6279 sizeof(struct ieee80211_header);
6281 wl->hw->wiphy->max_sched_scan_reqs = 1;
6282 wl->hw->wiphy->max_sched_scan_ie_len = WL1271_CMD_TEMPL_MAX_SIZE -
6283 sizeof(struct ieee80211_header);
6285 wl->hw->wiphy->max_remain_on_channel_duration = 30000;
6287 wl->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD |
6288 WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL |
6289 WIPHY_FLAG_HAS_CHANNEL_SWITCH |
6290 WIPHY_FLAG_IBSS_RSN;
6292 wl->hw->wiphy->features |= NL80211_FEATURE_AP_SCAN;
6294 /* make sure all our channels fit in the scanned_ch bitmask */
6295 BUILD_BUG_ON(ARRAY_SIZE(wl1271_channels) +
6296 ARRAY_SIZE(wl1271_channels_5ghz) >
6297 WL1271_MAX_CHANNELS);
6299 * clear channel flags from the previous usage
6300 * and restore max_power & max_antenna_gain values.
6302 for (i = 0; i < ARRAY_SIZE(wl1271_channels); i++) {
6303 wl1271_band_2ghz.channels[i].flags = 0;
6304 wl1271_band_2ghz.channels[i].max_power = WLCORE_MAX_TXPWR;
6305 wl1271_band_2ghz.channels[i].max_antenna_gain = 0;
6308 for (i = 0; i < ARRAY_SIZE(wl1271_channels_5ghz); i++) {
6309 wl1271_band_5ghz.channels[i].flags = 0;
6310 wl1271_band_5ghz.channels[i].max_power = WLCORE_MAX_TXPWR;
6311 wl1271_band_5ghz.channels[i].max_antenna_gain = 0;
6315 * We keep local copies of the band structs because we need to
6316 * modify them on a per-device basis.
6318 memcpy(&wl->bands[NL80211_BAND_2GHZ], &wl1271_band_2ghz,
6319 sizeof(wl1271_band_2ghz));
6320 memcpy(&wl->bands[NL80211_BAND_2GHZ].ht_cap,
6321 &wl->ht_cap[NL80211_BAND_2GHZ],
6322 sizeof(*wl->ht_cap));
6323 memcpy(&wl->bands[NL80211_BAND_5GHZ], &wl1271_band_5ghz,
6324 sizeof(wl1271_band_5ghz));
6325 memcpy(&wl->bands[NL80211_BAND_5GHZ].ht_cap,
6326 &wl->ht_cap[NL80211_BAND_5GHZ],
6327 sizeof(*wl->ht_cap));
6329 wl->hw->wiphy->bands[NL80211_BAND_2GHZ] =
6330 &wl->bands[NL80211_BAND_2GHZ];
6331 wl->hw->wiphy->bands[NL80211_BAND_5GHZ] =
6332 &wl->bands[NL80211_BAND_5GHZ];
6335 * allow 4 queues per mac address we support +
6336 * 1 cab queue per mac + one global offchannel Tx queue
6338 wl->hw->queues = (NUM_TX_QUEUES + 1) * WLCORE_NUM_MAC_ADDRESSES + 1;
6340 /* the last queue is the offchannel queue */
6341 wl->hw->offchannel_tx_hw_queue = wl->hw->queues - 1;
6342 wl->hw->max_rates = 1;
6344 wl->hw->wiphy->reg_notifier = wl1271_reg_notify;
6346 /* the FW answers probe-requests in AP-mode */
6347 wl->hw->wiphy->flags |= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD;
6348 wl->hw->wiphy->probe_resp_offload =
6349 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS |
6350 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS2 |
6351 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_P2P;
6353 /* allowed interface combinations */
6354 wl->hw->wiphy->iface_combinations = wl->iface_combinations;
6355 wl->hw->wiphy->n_iface_combinations = wl->n_iface_combinations;
6357 /* register vendor commands */
6358 wlcore_set_vendor_commands(wl->hw->wiphy);
6360 SET_IEEE80211_DEV(wl->hw, wl->dev);
6362 wl->hw->sta_data_size = sizeof(struct wl1271_station);
6363 wl->hw->vif_data_size = sizeof(struct wl12xx_vif);
6365 wl->hw->max_rx_aggregation_subframes = wl->conf.ht.rx_ba_win_size;
6367 return 0;
6370 struct ieee80211_hw *wlcore_alloc_hw(size_t priv_size, u32 aggr_buf_size,
6371 u32 mbox_size)
6373 struct ieee80211_hw *hw;
6374 struct wl1271 *wl;
6375 int i, j, ret;
6376 unsigned int order;
6378 hw = ieee80211_alloc_hw(sizeof(*wl), &wl1271_ops);
6379 if (!hw) {
6380 wl1271_error("could not alloc ieee80211_hw");
6381 ret = -ENOMEM;
6382 goto err_hw_alloc;
6385 wl = hw->priv;
6386 memset(wl, 0, sizeof(*wl));
6388 wl->priv = kzalloc(priv_size, GFP_KERNEL);
6389 if (!wl->priv) {
6390 wl1271_error("could not alloc wl priv");
6391 ret = -ENOMEM;
6392 goto err_priv_alloc;
6395 INIT_LIST_HEAD(&wl->wlvif_list);
6397 wl->hw = hw;
6400 * wl->num_links is not configured yet, so just use WLCORE_MAX_LINKS.
6401 * we don't allocate any additional resource here, so that's fine.
6403 for (i = 0; i < NUM_TX_QUEUES; i++)
6404 for (j = 0; j < WLCORE_MAX_LINKS; j++)
6405 skb_queue_head_init(&wl->links[j].tx_queue[i]);
6407 skb_queue_head_init(&wl->deferred_rx_queue);
6408 skb_queue_head_init(&wl->deferred_tx_queue);
6410 INIT_WORK(&wl->netstack_work, wl1271_netstack_work);
6411 INIT_WORK(&wl->tx_work, wl1271_tx_work);
6412 INIT_WORK(&wl->recovery_work, wl1271_recovery_work);
6413 INIT_DELAYED_WORK(&wl->scan_complete_work, wl1271_scan_complete_work);
6414 INIT_DELAYED_WORK(&wl->roc_complete_work, wlcore_roc_complete_work);
6415 INIT_DELAYED_WORK(&wl->tx_watchdog_work, wl12xx_tx_watchdog_work);
6417 wl->freezable_wq = create_freezable_workqueue("wl12xx_wq");
6418 if (!wl->freezable_wq) {
6419 ret = -ENOMEM;
6420 goto err_hw;
6423 wl->channel = 0;
6424 wl->rx_counter = 0;
6425 wl->power_level = WL1271_DEFAULT_POWER_LEVEL;
6426 wl->band = NL80211_BAND_2GHZ;
6427 wl->channel_type = NL80211_CHAN_NO_HT;
6428 wl->flags = 0;
6429 wl->sg_enabled = true;
6430 wl->sleep_auth = WL1271_PSM_ILLEGAL;
6431 wl->recovery_count = 0;
6432 wl->hw_pg_ver = -1;
6433 wl->ap_ps_map = 0;
6434 wl->ap_fw_ps_map = 0;
6435 wl->quirks = 0;
6436 wl->system_hlid = WL12XX_SYSTEM_HLID;
6437 wl->active_sta_count = 0;
6438 wl->active_link_count = 0;
6439 wl->fwlog_size = 0;
6441 /* The system link is always allocated */
6442 __set_bit(WL12XX_SYSTEM_HLID, wl->links_map);
6444 memset(wl->tx_frames_map, 0, sizeof(wl->tx_frames_map));
6445 for (i = 0; i < wl->num_tx_desc; i++)
6446 wl->tx_frames[i] = NULL;
6448 spin_lock_init(&wl->wl_lock);
6450 wl->state = WLCORE_STATE_OFF;
6451 wl->fw_type = WL12XX_FW_TYPE_NONE;
6452 mutex_init(&wl->mutex);
6453 mutex_init(&wl->flush_mutex);
6454 init_completion(&wl->nvs_loading_complete);
6456 order = get_order(aggr_buf_size);
6457 wl->aggr_buf = (u8 *)__get_free_pages(GFP_KERNEL, order);
6458 if (!wl->aggr_buf) {
6459 ret = -ENOMEM;
6460 goto err_wq;
6462 wl->aggr_buf_size = aggr_buf_size;
6464 wl->dummy_packet = wl12xx_alloc_dummy_packet(wl);
6465 if (!wl->dummy_packet) {
6466 ret = -ENOMEM;
6467 goto err_aggr;
6470 /* Allocate one page for the FW log */
6471 wl->fwlog = (u8 *)get_zeroed_page(GFP_KERNEL);
6472 if (!wl->fwlog) {
6473 ret = -ENOMEM;
6474 goto err_dummy_packet;
6477 wl->mbox_size = mbox_size;
6478 wl->mbox = kmalloc(wl->mbox_size, GFP_KERNEL | GFP_DMA);
6479 if (!wl->mbox) {
6480 ret = -ENOMEM;
6481 goto err_fwlog;
6484 wl->buffer_32 = kmalloc(sizeof(*wl->buffer_32), GFP_KERNEL);
6485 if (!wl->buffer_32) {
6486 ret = -ENOMEM;
6487 goto err_mbox;
6490 return hw;
6492 err_mbox:
6493 kfree(wl->mbox);
6495 err_fwlog:
6496 free_page((unsigned long)wl->fwlog);
6498 err_dummy_packet:
6499 dev_kfree_skb(wl->dummy_packet);
6501 err_aggr:
6502 free_pages((unsigned long)wl->aggr_buf, order);
6504 err_wq:
6505 destroy_workqueue(wl->freezable_wq);
6507 err_hw:
6508 wl1271_debugfs_exit(wl);
6509 kfree(wl->priv);
6511 err_priv_alloc:
6512 ieee80211_free_hw(hw);
6514 err_hw_alloc:
6516 return ERR_PTR(ret);
6518 EXPORT_SYMBOL_GPL(wlcore_alloc_hw);
6520 int wlcore_free_hw(struct wl1271 *wl)
6522 /* Unblock any fwlog readers */
6523 mutex_lock(&wl->mutex);
6524 wl->fwlog_size = -1;
6525 mutex_unlock(&wl->mutex);
6527 wlcore_sysfs_free(wl);
6529 kfree(wl->buffer_32);
6530 kfree(wl->mbox);
6531 free_page((unsigned long)wl->fwlog);
6532 dev_kfree_skb(wl->dummy_packet);
6533 free_pages((unsigned long)wl->aggr_buf, get_order(wl->aggr_buf_size));
6535 wl1271_debugfs_exit(wl);
6537 vfree(wl->fw);
6538 wl->fw = NULL;
6539 wl->fw_type = WL12XX_FW_TYPE_NONE;
6540 kfree(wl->nvs);
6541 wl->nvs = NULL;
6543 kfree(wl->raw_fw_status);
6544 kfree(wl->fw_status);
6545 kfree(wl->tx_res_if);
6546 destroy_workqueue(wl->freezable_wq);
6548 kfree(wl->priv);
6549 ieee80211_free_hw(wl->hw);
6551 return 0;
6553 EXPORT_SYMBOL_GPL(wlcore_free_hw);
6555 #ifdef CONFIG_PM
6556 static const struct wiphy_wowlan_support wlcore_wowlan_support = {
6557 .flags = WIPHY_WOWLAN_ANY,
6558 .n_patterns = WL1271_MAX_RX_FILTERS,
6559 .pattern_min_len = 1,
6560 .pattern_max_len = WL1271_RX_FILTER_MAX_PATTERN_SIZE,
6562 #endif
6564 static irqreturn_t wlcore_hardirq(int irq, void *cookie)
6566 return IRQ_WAKE_THREAD;
6569 static void wlcore_nvs_cb(const struct firmware *fw, void *context)
6571 struct wl1271 *wl = context;
6572 struct platform_device *pdev = wl->pdev;
6573 struct wlcore_platdev_data *pdev_data = dev_get_platdata(&pdev->dev);
6574 struct resource *res;
6576 int ret;
6577 irq_handler_t hardirq_fn = NULL;
6579 if (fw) {
6580 wl->nvs = kmemdup(fw->data, fw->size, GFP_KERNEL);
6581 if (!wl->nvs) {
6582 wl1271_error("Could not allocate nvs data");
6583 goto out;
6585 wl->nvs_len = fw->size;
6586 } else if (pdev_data->family->nvs_name) {
6587 wl1271_debug(DEBUG_BOOT, "Could not get nvs file %s",
6588 pdev_data->family->nvs_name);
6589 wl->nvs = NULL;
6590 wl->nvs_len = 0;
6591 } else {
6592 wl->nvs = NULL;
6593 wl->nvs_len = 0;
6596 ret = wl->ops->setup(wl);
6597 if (ret < 0)
6598 goto out_free_nvs;
6600 BUG_ON(wl->num_tx_desc > WLCORE_MAX_TX_DESCRIPTORS);
6602 /* adjust some runtime configuration parameters */
6603 wlcore_adjust_conf(wl);
6605 res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
6606 if (!res) {
6607 wl1271_error("Could not get IRQ resource");
6608 goto out_free_nvs;
6611 wl->irq = res->start;
6612 wl->irq_flags = res->flags & IRQF_TRIGGER_MASK;
6613 wl->if_ops = pdev_data->if_ops;
6615 if (wl->irq_flags & (IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING))
6616 hardirq_fn = wlcore_hardirq;
6617 else
6618 wl->irq_flags |= IRQF_ONESHOT;
6620 ret = wl12xx_set_power_on(wl);
6621 if (ret < 0)
6622 goto out_free_nvs;
6624 ret = wl12xx_get_hw_info(wl);
6625 if (ret < 0) {
6626 wl1271_error("couldn't get hw info");
6627 wl1271_power_off(wl);
6628 goto out_free_nvs;
6631 ret = request_threaded_irq(wl->irq, hardirq_fn, wlcore_irq,
6632 wl->irq_flags, pdev->name, wl);
6633 if (ret < 0) {
6634 wl1271_error("interrupt configuration failed");
6635 wl1271_power_off(wl);
6636 goto out_free_nvs;
6639 #ifdef CONFIG_PM
6640 device_init_wakeup(wl->dev, true);
6642 ret = enable_irq_wake(wl->irq);
6643 if (!ret) {
6644 wl->irq_wake_enabled = true;
6645 if (pdev_data->pwr_in_suspend)
6646 wl->hw->wiphy->wowlan = &wlcore_wowlan_support;
6649 res = platform_get_resource(pdev, IORESOURCE_IRQ, 1);
6650 if (res) {
6651 wl->wakeirq = res->start;
6652 wl->wakeirq_flags = res->flags & IRQF_TRIGGER_MASK;
6653 ret = dev_pm_set_dedicated_wake_irq(wl->dev, wl->wakeirq);
6654 if (ret)
6655 wl->wakeirq = -ENODEV;
6656 } else {
6657 wl->wakeirq = -ENODEV;
6659 #endif
6660 disable_irq(wl->irq);
6661 wl1271_power_off(wl);
6663 ret = wl->ops->identify_chip(wl);
6664 if (ret < 0)
6665 goto out_irq;
6667 ret = wl1271_init_ieee80211(wl);
6668 if (ret)
6669 goto out_irq;
6671 ret = wl1271_register_hw(wl);
6672 if (ret)
6673 goto out_irq;
6675 ret = wlcore_sysfs_init(wl);
6676 if (ret)
6677 goto out_unreg;
6679 wl->initialized = true;
6680 goto out;
6682 out_unreg:
6683 wl1271_unregister_hw(wl);
6685 out_irq:
6686 if (wl->wakeirq >= 0)
6687 dev_pm_clear_wake_irq(wl->dev);
6688 device_init_wakeup(wl->dev, false);
6689 free_irq(wl->irq, wl);
6691 out_free_nvs:
6692 kfree(wl->nvs);
6694 out:
6695 release_firmware(fw);
6696 complete_all(&wl->nvs_loading_complete);
6699 static int __maybe_unused wlcore_runtime_suspend(struct device *dev)
6701 struct wl1271 *wl = dev_get_drvdata(dev);
6702 struct wl12xx_vif *wlvif;
6703 int error;
6705 /* We do not enter elp sleep in PLT mode */
6706 if (wl->plt)
6707 return 0;
6709 /* Nothing to do if no ELP mode requested */
6710 if (wl->sleep_auth != WL1271_PSM_ELP)
6711 return 0;
6713 wl12xx_for_each_wlvif(wl, wlvif) {
6714 if (!test_bit(WLVIF_FLAG_IN_PS, &wlvif->flags) &&
6715 test_bit(WLVIF_FLAG_IN_USE, &wlvif->flags))
6716 return -EBUSY;
6719 wl1271_debug(DEBUG_PSM, "chip to elp");
6720 error = wlcore_raw_write32(wl, HW_ACCESS_ELP_CTRL_REG, ELPCTRL_SLEEP);
6721 if (error < 0) {
6722 wl12xx_queue_recovery_work(wl);
6724 return error;
6727 set_bit(WL1271_FLAG_IN_ELP, &wl->flags);
6729 return 0;
6732 static int __maybe_unused wlcore_runtime_resume(struct device *dev)
6734 struct wl1271 *wl = dev_get_drvdata(dev);
6735 DECLARE_COMPLETION_ONSTACK(compl);
6736 unsigned long flags;
6737 int ret;
6738 unsigned long start_time = jiffies;
6739 bool recovery = false;
6741 /* Nothing to do if no ELP mode requested */
6742 if (!test_bit(WL1271_FLAG_IN_ELP, &wl->flags))
6743 return 0;
6745 wl1271_debug(DEBUG_PSM, "waking up chip from elp");
6747 spin_lock_irqsave(&wl->wl_lock, flags);
6748 wl->elp_compl = &compl;
6749 spin_unlock_irqrestore(&wl->wl_lock, flags);
6751 ret = wlcore_raw_write32(wl, HW_ACCESS_ELP_CTRL_REG, ELPCTRL_WAKE_UP);
6752 if (ret < 0) {
6753 recovery = true;
6754 } else if (!test_bit(WL1271_FLAG_IRQ_RUNNING, &wl->flags)) {
6755 ret = wait_for_completion_timeout(&compl,
6756 msecs_to_jiffies(WL1271_WAKEUP_TIMEOUT));
6757 if (ret == 0) {
6758 wl1271_warning("ELP wakeup timeout!");
6759 recovery = true;
6763 spin_lock_irqsave(&wl->wl_lock, flags);
6764 wl->elp_compl = NULL;
6765 spin_unlock_irqrestore(&wl->wl_lock, flags);
6766 clear_bit(WL1271_FLAG_IN_ELP, &wl->flags);
6768 if (recovery) {
6769 set_bit(WL1271_FLAG_INTENDED_FW_RECOVERY, &wl->flags);
6770 wl12xx_queue_recovery_work(wl);
6771 } else {
6772 wl1271_debug(DEBUG_PSM, "wakeup time: %u ms",
6773 jiffies_to_msecs(jiffies - start_time));
6776 return 0;
6779 static const struct dev_pm_ops wlcore_pm_ops = {
6780 SET_RUNTIME_PM_OPS(wlcore_runtime_suspend,
6781 wlcore_runtime_resume,
6782 NULL)
6785 int wlcore_probe(struct wl1271 *wl, struct platform_device *pdev)
6787 struct wlcore_platdev_data *pdev_data = dev_get_platdata(&pdev->dev);
6788 const char *nvs_name;
6789 int ret = 0;
6791 if (!wl->ops || !wl->ptable || !pdev_data)
6792 return -EINVAL;
6794 wl->dev = &pdev->dev;
6795 wl->pdev = pdev;
6796 platform_set_drvdata(pdev, wl);
6798 if (pdev_data->family && pdev_data->family->nvs_name) {
6799 nvs_name = pdev_data->family->nvs_name;
6800 ret = request_firmware_nowait(THIS_MODULE, FW_ACTION_HOTPLUG,
6801 nvs_name, &pdev->dev, GFP_KERNEL,
6802 wl, wlcore_nvs_cb);
6803 if (ret < 0) {
6804 wl1271_error("request_firmware_nowait failed for %s: %d",
6805 nvs_name, ret);
6806 complete_all(&wl->nvs_loading_complete);
6808 } else {
6809 wlcore_nvs_cb(NULL, wl);
6812 wl->dev->driver->pm = &wlcore_pm_ops;
6813 pm_runtime_set_autosuspend_delay(wl->dev, 50);
6814 pm_runtime_use_autosuspend(wl->dev);
6815 pm_runtime_enable(wl->dev);
6817 return ret;
6819 EXPORT_SYMBOL_GPL(wlcore_probe);
6821 int wlcore_remove(struct platform_device *pdev)
6823 struct wlcore_platdev_data *pdev_data = dev_get_platdata(&pdev->dev);
6824 struct wl1271 *wl = platform_get_drvdata(pdev);
6825 int error;
6827 error = pm_runtime_get_sync(wl->dev);
6828 if (error < 0)
6829 dev_warn(wl->dev, "PM runtime failed: %i\n", error);
6831 wl->dev->driver->pm = NULL;
6833 if (pdev_data->family && pdev_data->family->nvs_name)
6834 wait_for_completion(&wl->nvs_loading_complete);
6835 if (!wl->initialized)
6836 return 0;
6838 if (wl->wakeirq >= 0) {
6839 dev_pm_clear_wake_irq(wl->dev);
6840 wl->wakeirq = -ENODEV;
6843 device_init_wakeup(wl->dev, false);
6845 if (wl->irq_wake_enabled)
6846 disable_irq_wake(wl->irq);
6848 wl1271_unregister_hw(wl);
6850 pm_runtime_put_sync(wl->dev);
6851 pm_runtime_dont_use_autosuspend(wl->dev);
6852 pm_runtime_disable(wl->dev);
6854 free_irq(wl->irq, wl);
6855 wlcore_free_hw(wl);
6857 return 0;
6859 EXPORT_SYMBOL_GPL(wlcore_remove);
6861 u32 wl12xx_debug_level = DEBUG_NONE;
6862 EXPORT_SYMBOL_GPL(wl12xx_debug_level);
6863 module_param_named(debug_level, wl12xx_debug_level, uint, 0600);
6864 MODULE_PARM_DESC(debug_level, "wl12xx debugging level");
6866 module_param_named(fwlog, fwlog_param, charp, 0);
6867 MODULE_PARM_DESC(fwlog,
6868 "FW logger options: continuous, dbgpins or disable");
6870 module_param(fwlog_mem_blocks, int, 0600);
6871 MODULE_PARM_DESC(fwlog_mem_blocks, "fwlog mem_blocks");
6873 module_param(bug_on_recovery, int, 0600);
6874 MODULE_PARM_DESC(bug_on_recovery, "BUG() on fw recovery");
6876 module_param(no_recovery, int, 0600);
6877 MODULE_PARM_DESC(no_recovery, "Prevent HW recovery. FW will remain stuck.");
6879 MODULE_LICENSE("GPL");
6880 MODULE_AUTHOR("Luciano Coelho <coelho@ti.com>");
6881 MODULE_AUTHOR("Juuso Oikarinen <juuso.oikarinen@nokia.com>");