1 // SPDX-License-Identifier: GPL-2.0-only
3 * This file is part of wlcore
5 * Copyright (C) 2008-2010 Nokia Corporation
6 * Copyright (C) 2011-2013 Texas Instruments Inc.
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>
20 #include "wl12xx_80211.h"
27 #include "vendor_cmd.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)
50 if (WARN_ON(wlvif->bss_type != BSS_TYPE_STA_BSS))
53 if (!test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags))
56 if (test_and_set_bit(WLVIF_FLAG_STA_STATE_SENT, &wlvif->flags))
59 ret = wl12xx_cmd_set_peer_state(wl, wlvif, wlvif->sta.hlid);
63 wl1271_info("Association completed.");
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 */
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,
85 /* we should hold wl->mutex */
86 ret = wl1271_acx_ps_rx_streaming(wl, wlvif, enable);
91 set_bit(WLVIF_FLAG_RX_STREAMING_STARTED, &wlvif->flags);
93 clear_bit(WLVIF_FLAG_RX_STREAMING_STARTED, &wlvif->flags);
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)
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))
111 /* reconfigure/disable according to new streaming_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);
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);
126 static void wl1271_rx_streaming_enable_work(struct work_struct *work)
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)))
141 if (!wl->conf.rx_streaming.interval)
144 ret = pm_runtime_resume_and_get(wl->dev);
148 ret = wl1271_set_rx_streaming(wl, wlvif, true);
152 /* stop it after some time of inactivity */
153 mod_timer(&wlvif->rx_streaming_timer,
154 jiffies + msecs_to_jiffies(wl->conf.rx_streaming.duration));
157 pm_runtime_mark_last_busy(wl->dev);
158 pm_runtime_put_autosuspend(wl->dev);
160 mutex_unlock(&wl->mutex);
163 static void wl1271_rx_streaming_disable_work(struct work_struct *work)
166 struct wl12xx_vif *wlvif = container_of(work, struct wl12xx_vif,
167 rx_streaming_disable_work);
168 struct wl1271 *wl = wlvif->wl;
170 mutex_lock(&wl->mutex);
172 if (!test_bit(WLVIF_FLAG_RX_STREAMING_STARTED, &wlvif->flags))
175 ret = pm_runtime_resume_and_get(wl->dev);
179 ret = wl1271_set_rx_streaming(wl, wlvif, false);
184 pm_runtime_mark_last_busy(wl->dev);
185 pm_runtime_put_autosuspend(wl->dev);
187 mutex_unlock(&wl->mutex);
190 static void wl1271_rx_streaming_timer(struct timer_list *t)
192 struct wl12xx_vif *wlvif = from_timer(wlvif, t, rx_streaming_timer);
193 struct wl1271 *wl = wlvif->wl;
194 ieee80211_queue_work(wl->hw, &wlvif->rx_streaming_disable_work);
197 /* wl->mutex must be taken */
198 void wl12xx_rearm_tx_watchdog_locked(struct wl1271 *wl)
200 /* if the watchdog is not armed, don't do anything */
201 if (wl->tx_allocated_blocks == 0)
204 cancel_delayed_work(&wl->tx_watchdog_work);
205 ieee80211_queue_delayed_work(wl->hw, &wl->tx_watchdog_work,
206 msecs_to_jiffies(wl->conf.tx.tx_watchdog_timeout));
209 static void wlcore_rc_update_work(struct work_struct *work)
212 struct wl12xx_vif *wlvif = container_of(work, struct wl12xx_vif,
214 struct wl1271 *wl = wlvif->wl;
215 struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
217 mutex_lock(&wl->mutex);
219 if (unlikely(wl->state != WLCORE_STATE_ON))
222 ret = pm_runtime_resume_and_get(wl->dev);
226 if (ieee80211_vif_is_mesh(vif)) {
227 ret = wl1271_acx_set_ht_capabilities(wl, &wlvif->rc_ht_cap,
228 true, wlvif->sta.hlid);
232 wlcore_hw_sta_rc_update(wl, wlvif);
236 pm_runtime_mark_last_busy(wl->dev);
237 pm_runtime_put_autosuspend(wl->dev);
239 mutex_unlock(&wl->mutex);
242 static void wl12xx_tx_watchdog_work(struct work_struct *work)
244 struct delayed_work *dwork;
247 dwork = to_delayed_work(work);
248 wl = container_of(dwork, struct wl1271, tx_watchdog_work);
250 mutex_lock(&wl->mutex);
252 if (unlikely(wl->state != WLCORE_STATE_ON))
255 /* Tx went out in the meantime - everything is ok */
256 if (unlikely(wl->tx_allocated_blocks == 0))
260 * if a ROC is in progress, we might not have any Tx for a long
261 * time (e.g. pending Tx on the non-ROC channels)
263 if (find_first_bit(wl->roc_map, WL12XX_MAX_ROLES) < WL12XX_MAX_ROLES) {
264 wl1271_debug(DEBUG_TX, "No Tx (in FW) for %d ms due to ROC",
265 wl->conf.tx.tx_watchdog_timeout);
266 wl12xx_rearm_tx_watchdog_locked(wl);
271 * if a scan is in progress, we might not have any Tx for a long
274 if (wl->scan.state != WL1271_SCAN_STATE_IDLE) {
275 wl1271_debug(DEBUG_TX, "No Tx (in FW) for %d ms due to scan",
276 wl->conf.tx.tx_watchdog_timeout);
277 wl12xx_rearm_tx_watchdog_locked(wl);
282 * AP might cache a frame for a long time for a sleeping station,
283 * so rearm the timer if there's an AP interface with stations. If
284 * Tx is genuinely stuck we will most hopefully discover it when all
285 * stations are removed due to inactivity.
287 if (wl->active_sta_count) {
288 wl1271_debug(DEBUG_TX, "No Tx (in FW) for %d ms. AP has "
290 wl->conf.tx.tx_watchdog_timeout,
291 wl->active_sta_count);
292 wl12xx_rearm_tx_watchdog_locked(wl);
296 wl1271_error("Tx stuck (in FW) for %d ms. Starting recovery",
297 wl->conf.tx.tx_watchdog_timeout);
298 wl12xx_queue_recovery_work(wl);
301 mutex_unlock(&wl->mutex);
304 static void wlcore_adjust_conf(struct wl1271 *wl)
308 if (!strcmp(fwlog_param, "continuous")) {
309 wl->conf.fwlog.mode = WL12XX_FWLOG_CONTINUOUS;
310 wl->conf.fwlog.output = WL12XX_FWLOG_OUTPUT_HOST;
311 } else if (!strcmp(fwlog_param, "dbgpins")) {
312 wl->conf.fwlog.mode = WL12XX_FWLOG_CONTINUOUS;
313 wl->conf.fwlog.output = WL12XX_FWLOG_OUTPUT_DBG_PINS;
314 } else if (!strcmp(fwlog_param, "disable")) {
315 wl->conf.fwlog.mem_blocks = 0;
316 wl->conf.fwlog.output = WL12XX_FWLOG_OUTPUT_NONE;
318 wl1271_error("Unknown fwlog parameter %s", fwlog_param);
322 if (bug_on_recovery != -1)
323 wl->conf.recovery.bug_on_recovery = (u8) bug_on_recovery;
325 if (no_recovery != -1)
326 wl->conf.recovery.no_recovery = (u8) no_recovery;
329 static void wl12xx_irq_ps_regulate_link(struct wl1271 *wl,
330 struct wl12xx_vif *wlvif,
335 fw_ps = test_bit(hlid, &wl->ap_fw_ps_map);
338 * Wake up from high level PS if the STA is asleep with too little
339 * packets in FW or if the STA is awake.
341 if (!fw_ps || tx_pkts < WL1271_PS_STA_MAX_PACKETS)
342 wl12xx_ps_link_end(wl, wlvif, hlid);
345 * Start high-level PS if the STA is asleep with enough blocks in FW.
346 * Make an exception if this is the only connected link. In this
347 * case FW-memory congestion is less of a problem.
348 * Note that a single connected STA means 2*ap_count + 1 active links,
349 * since we must account for the global and broadcast AP links
350 * for each AP. The "fw_ps" check assures us the other link is a STA
351 * connected to the AP. Otherwise the FW would not set the PSM bit.
353 else if (wl->active_link_count > (wl->ap_count*2 + 1) && fw_ps &&
354 tx_pkts >= WL1271_PS_STA_MAX_PACKETS)
355 wl12xx_ps_link_start(wl, wlvif, hlid, true);
358 static void wl12xx_irq_update_links_status(struct wl1271 *wl,
359 struct wl12xx_vif *wlvif,
360 struct wl_fw_status *status)
362 unsigned long cur_fw_ps_map;
365 cur_fw_ps_map = status->link_ps_bitmap;
366 if (wl->ap_fw_ps_map != cur_fw_ps_map) {
367 wl1271_debug(DEBUG_PSM,
368 "link ps prev 0x%lx cur 0x%lx changed 0x%lx",
369 wl->ap_fw_ps_map, cur_fw_ps_map,
370 wl->ap_fw_ps_map ^ cur_fw_ps_map);
372 wl->ap_fw_ps_map = cur_fw_ps_map;
375 for_each_set_bit(hlid, wlvif->ap.sta_hlid_map, wl->num_links)
376 wl12xx_irq_ps_regulate_link(wl, wlvif, hlid,
377 wl->links[hlid].allocated_pkts);
380 static int wlcore_fw_status(struct wl1271 *wl, struct wl_fw_status *status)
382 struct wl12xx_vif *wlvifsta;
383 struct wl12xx_vif *wlvifap;
384 struct wl12xx_vif *wlvif;
385 u32 old_tx_blk_count = wl->tx_blocks_available;
386 int avail, freed_blocks;
389 struct wl1271_link *lnk;
391 ret = wlcore_raw_read_data(wl, REG_RAW_FW_STATUS_ADDR,
393 wl->fw_status_len, false);
397 wlcore_hw_convert_fw_status(wl, wl->raw_fw_status, status);
399 wl1271_debug(DEBUG_IRQ, "intr: 0x%x (fw_rx_counter = %d, "
400 "drv_rx_counter = %d, tx_results_counter = %d)",
402 status->fw_rx_counter,
403 status->drv_rx_counter,
404 status->tx_results_counter);
406 for (i = 0; i < NUM_TX_QUEUES; i++) {
407 /* prevent wrap-around in freed-packets counter */
408 wl->tx_allocated_pkts[i] -=
409 (status->counters.tx_released_pkts[i] -
410 wl->tx_pkts_freed[i]) & 0xff;
412 wl->tx_pkts_freed[i] = status->counters.tx_released_pkts[i];
415 /* Find an authorized STA vif */
417 wl12xx_for_each_wlvif_sta(wl, wlvif) {
418 if (wlvif->sta.hlid != WL12XX_INVALID_LINK_ID &&
419 test_bit(WLVIF_FLAG_STA_AUTHORIZED, &wlvif->flags)) {
425 /* Find a started AP vif */
427 wl12xx_for_each_wlvif(wl, wlvif) {
428 if (wlvif->bss_type == BSS_TYPE_AP_BSS &&
429 wlvif->inconn_count == 0 &&
430 test_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags)) {
436 for_each_set_bit(i, wl->links_map, wl->num_links) {
437 u16 diff16, sec_pn16;
438 u8 diff, tx_lnk_free_pkts;
442 /* prevent wrap-around in freed-packets counter */
443 tx_lnk_free_pkts = status->counters.tx_lnk_free_pkts[i];
444 diff = (tx_lnk_free_pkts - lnk->prev_freed_pkts) & 0xff;
447 lnk->allocated_pkts -= diff;
448 lnk->prev_freed_pkts = tx_lnk_free_pkts;
451 /* Get the current sec_pn16 value if present */
452 if (status->counters.tx_lnk_sec_pn16)
453 sec_pn16 = __le16_to_cpu(status->counters.tx_lnk_sec_pn16[i]);
456 /* prevent wrap-around in pn16 counter */
457 diff16 = (sec_pn16 - lnk->prev_sec_pn16) & 0xffff;
459 /* FIXME: since free_pkts is a 8-bit counter of packets that
460 * rolls over, it can become zero. If it is zero, then we
461 * omit processing below. Is that really correct?
463 if (tx_lnk_free_pkts <= 0)
466 /* For a station that has an authorized link: */
467 if (wlvifsta && wlvifsta->sta.hlid == i) {
468 if (wlvifsta->encryption_type == KEY_TKIP ||
469 wlvifsta->encryption_type == KEY_AES) {
471 lnk->prev_sec_pn16 = sec_pn16;
472 /* accumulate the prev_freed_pkts
473 * counter according to the PN from
476 lnk->total_freed_pkts += diff16;
480 /* accumulate the prev_freed_pkts
481 * counter according to the free packets
482 * count from firmware
484 lnk->total_freed_pkts += diff;
488 /* For an AP that has been started */
489 if (wlvifap && test_bit(i, wlvifap->ap.sta_hlid_map)) {
490 if (wlvifap->encryption_type == KEY_TKIP ||
491 wlvifap->encryption_type == KEY_AES) {
493 lnk->prev_sec_pn16 = sec_pn16;
494 /* accumulate the prev_freed_pkts
495 * counter according to the PN from
498 lnk->total_freed_pkts += diff16;
502 /* accumulate the prev_freed_pkts
503 * counter according to the free packets
504 * count from firmware
506 lnk->total_freed_pkts += diff;
511 /* prevent wrap-around in total blocks counter */
512 if (likely(wl->tx_blocks_freed <= status->total_released_blks))
513 freed_blocks = status->total_released_blks -
516 freed_blocks = 0x100000000LL - wl->tx_blocks_freed +
517 status->total_released_blks;
519 wl->tx_blocks_freed = status->total_released_blks;
521 wl->tx_allocated_blocks -= freed_blocks;
524 * If the FW freed some blocks:
525 * If we still have allocated blocks - re-arm the timer, Tx is
526 * not stuck. Otherwise, cancel the timer (no Tx currently).
529 if (wl->tx_allocated_blocks)
530 wl12xx_rearm_tx_watchdog_locked(wl);
532 cancel_delayed_work(&wl->tx_watchdog_work);
535 avail = status->tx_total - wl->tx_allocated_blocks;
538 * The FW might change the total number of TX memblocks before
539 * we get a notification about blocks being released. Thus, the
540 * available blocks calculation might yield a temporary result
541 * which is lower than the actual available blocks. Keeping in
542 * mind that only blocks that were allocated can be moved from
543 * TX to RX, tx_blocks_available should never decrease here.
545 wl->tx_blocks_available = max((int)wl->tx_blocks_available,
548 /* if more blocks are available now, tx work can be scheduled */
549 if (wl->tx_blocks_available > old_tx_blk_count)
550 clear_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags);
552 /* for AP update num of allocated TX blocks per link and ps status */
553 wl12xx_for_each_wlvif_ap(wl, wlvif) {
554 wl12xx_irq_update_links_status(wl, wlvif, status);
557 /* update the host-chipset time offset */
558 wl->time_offset = (ktime_get_boottime_ns() >> 10) -
559 (s64)(status->fw_localtime);
561 wl->fw_fast_lnk_map = status->link_fast_bitmap;
566 static void wl1271_flush_deferred_work(struct wl1271 *wl)
570 /* Pass all received frames to the network stack */
571 while ((skb = skb_dequeue(&wl->deferred_rx_queue)))
572 ieee80211_rx_ni(wl->hw, skb);
574 /* Return sent skbs to the network stack */
575 while ((skb = skb_dequeue(&wl->deferred_tx_queue)))
576 ieee80211_tx_status_ni(wl->hw, skb);
579 static void wl1271_netstack_work(struct work_struct *work)
582 container_of(work, struct wl1271, netstack_work);
585 wl1271_flush_deferred_work(wl);
586 } while (skb_queue_len(&wl->deferred_rx_queue));
589 #define WL1271_IRQ_MAX_LOOPS 256
591 static int wlcore_irq_locked(struct wl1271 *wl)
595 int loopcount = WL1271_IRQ_MAX_LOOPS;
596 bool run_tx_queue = true;
598 unsigned int defer_count;
602 * In case edge triggered interrupt must be used, we cannot iterate
603 * more than once without introducing race conditions with the hardirq.
605 if (wl->irq_flags & (IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING))
608 wl1271_debug(DEBUG_IRQ, "IRQ work");
610 if (unlikely(wl->state != WLCORE_STATE_ON))
613 ret = pm_runtime_resume_and_get(wl->dev);
617 while (!done && loopcount--) {
618 smp_mb__after_atomic();
620 ret = wlcore_fw_status(wl, wl->fw_status);
624 wlcore_hw_tx_immediate_compl(wl);
626 intr = wl->fw_status->intr;
627 intr &= WLCORE_ALL_INTR_MASK;
633 if (unlikely(intr & WL1271_ACX_INTR_WATCHDOG)) {
634 wl1271_error("HW watchdog interrupt received! starting recovery.");
635 wl->watchdog_recovery = true;
638 /* restarting the chip. ignore any other interrupt. */
642 if (unlikely(intr & WL1271_ACX_SW_INTR_WATCHDOG)) {
643 wl1271_error("SW watchdog interrupt received! "
644 "starting recovery.");
645 wl->watchdog_recovery = true;
648 /* restarting the chip. ignore any other interrupt. */
652 if (likely(intr & WL1271_ACX_INTR_DATA)) {
653 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_DATA");
655 ret = wlcore_rx(wl, wl->fw_status);
659 /* Check if any tx blocks were freed */
660 if (!test_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags)) {
661 if (spin_trylock_irqsave(&wl->wl_lock, flags)) {
662 if (!wl1271_tx_total_queue_count(wl))
663 run_tx_queue = false;
664 spin_unlock_irqrestore(&wl->wl_lock, flags);
668 * In order to avoid starvation of the TX path,
669 * call the work function directly.
672 ret = wlcore_tx_work_locked(wl);
678 /* check for tx results */
679 ret = wlcore_hw_tx_delayed_compl(wl);
683 /* Make sure the deferred queues don't get too long */
684 defer_count = skb_queue_len(&wl->deferred_tx_queue) +
685 skb_queue_len(&wl->deferred_rx_queue);
686 if (defer_count > WL1271_DEFERRED_QUEUE_LIMIT)
687 wl1271_flush_deferred_work(wl);
690 if (intr & WL1271_ACX_INTR_EVENT_A) {
691 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_EVENT_A");
692 ret = wl1271_event_handle(wl, 0);
697 if (intr & WL1271_ACX_INTR_EVENT_B) {
698 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_EVENT_B");
699 ret = wl1271_event_handle(wl, 1);
704 if (intr & WL1271_ACX_INTR_INIT_COMPLETE)
705 wl1271_debug(DEBUG_IRQ,
706 "WL1271_ACX_INTR_INIT_COMPLETE");
708 if (intr & WL1271_ACX_INTR_HW_AVAILABLE)
709 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_HW_AVAILABLE");
713 pm_runtime_mark_last_busy(wl->dev);
714 pm_runtime_put_autosuspend(wl->dev);
720 static irqreturn_t wlcore_irq(int irq, void *cookie)
724 struct wl1271 *wl = cookie;
725 bool queue_tx_work = true;
727 set_bit(WL1271_FLAG_IRQ_RUNNING, &wl->flags);
729 /* complete the ELP completion */
730 if (test_bit(WL1271_FLAG_IN_ELP, &wl->flags)) {
731 spin_lock_irqsave(&wl->wl_lock, flags);
733 complete(wl->elp_compl);
734 spin_unlock_irqrestore(&wl->wl_lock, flags);
737 if (test_bit(WL1271_FLAG_SUSPENDED, &wl->flags)) {
738 /* don't enqueue a work right now. mark it as pending */
739 set_bit(WL1271_FLAG_PENDING_WORK, &wl->flags);
740 wl1271_debug(DEBUG_IRQ, "should not enqueue work");
741 spin_lock_irqsave(&wl->wl_lock, flags);
742 disable_irq_nosync(wl->irq);
743 pm_wakeup_event(wl->dev, 0);
744 spin_unlock_irqrestore(&wl->wl_lock, flags);
748 /* TX might be handled here, avoid redundant work */
749 set_bit(WL1271_FLAG_TX_PENDING, &wl->flags);
750 cancel_work_sync(&wl->tx_work);
752 mutex_lock(&wl->mutex);
754 ret = wlcore_irq_locked(wl);
756 wl12xx_queue_recovery_work(wl);
758 /* In case TX was not handled in wlcore_irq_locked(), queue TX work */
759 clear_bit(WL1271_FLAG_TX_PENDING, &wl->flags);
760 if (!test_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags)) {
761 if (spin_trylock_irqsave(&wl->wl_lock, flags)) {
762 if (!wl1271_tx_total_queue_count(wl))
763 queue_tx_work = false;
764 spin_unlock_irqrestore(&wl->wl_lock, flags);
767 ieee80211_queue_work(wl->hw, &wl->tx_work);
770 mutex_unlock(&wl->mutex);
773 clear_bit(WL1271_FLAG_IRQ_RUNNING, &wl->flags);
778 struct vif_counter_data {
781 struct ieee80211_vif *cur_vif;
782 bool cur_vif_running;
785 static void wl12xx_vif_count_iter(void *data, u8 *mac,
786 struct ieee80211_vif *vif)
788 struct vif_counter_data *counter = data;
791 if (counter->cur_vif == vif)
792 counter->cur_vif_running = true;
795 /* caller must not hold wl->mutex, as it might deadlock */
796 static void wl12xx_get_vif_count(struct ieee80211_hw *hw,
797 struct ieee80211_vif *cur_vif,
798 struct vif_counter_data *data)
800 memset(data, 0, sizeof(*data));
801 data->cur_vif = cur_vif;
803 ieee80211_iterate_active_interfaces(hw, IEEE80211_IFACE_ITER_RESUME_ALL,
804 wl12xx_vif_count_iter, data);
807 static int wl12xx_fetch_firmware(struct wl1271 *wl, bool plt)
809 const struct firmware *fw;
811 enum wl12xx_fw_type fw_type;
815 fw_type = WL12XX_FW_TYPE_PLT;
816 fw_name = wl->plt_fw_name;
819 * we can't call wl12xx_get_vif_count() here because
820 * wl->mutex is taken, so use the cached last_vif_count value
822 if (wl->last_vif_count > 1 && wl->mr_fw_name) {
823 fw_type = WL12XX_FW_TYPE_MULTI;
824 fw_name = wl->mr_fw_name;
826 fw_type = WL12XX_FW_TYPE_NORMAL;
827 fw_name = wl->sr_fw_name;
831 if (wl->fw_type == fw_type)
834 wl1271_debug(DEBUG_BOOT, "booting firmware %s", fw_name);
836 ret = request_firmware(&fw, fw_name, wl->dev);
839 wl1271_error("could not get firmware %s: %d", fw_name, ret);
844 wl1271_error("firmware size is not multiple of 32 bits: %zu",
851 wl->fw_type = WL12XX_FW_TYPE_NONE;
852 wl->fw_len = fw->size;
853 wl->fw = vmalloc(wl->fw_len);
856 wl1271_error("could not allocate memory for the firmware");
861 memcpy(wl->fw, fw->data, wl->fw_len);
863 wl->fw_type = fw_type;
865 release_firmware(fw);
870 void wl12xx_queue_recovery_work(struct wl1271 *wl)
872 /* Avoid a recursive recovery */
873 if (wl->state == WLCORE_STATE_ON) {
874 WARN_ON(!test_bit(WL1271_FLAG_INTENDED_FW_RECOVERY,
877 wl->state = WLCORE_STATE_RESTARTING;
878 set_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags);
879 ieee80211_queue_work(wl->hw, &wl->recovery_work);
883 size_t wl12xx_copy_fwlog(struct wl1271 *wl, u8 *memblock, size_t maxlen)
887 /* Make sure we have enough room */
888 len = min_t(size_t, maxlen, PAGE_SIZE - wl->fwlog_size);
890 /* Fill the FW log file, consumed by the sysfs fwlog entry */
891 memcpy(wl->fwlog + wl->fwlog_size, memblock, len);
892 wl->fwlog_size += len;
897 static void wl12xx_read_fwlog_panic(struct wl1271 *wl)
902 if (wl->quirks & WLCORE_QUIRK_FWLOG_NOT_IMPLEMENTED)
905 wl1271_info("Reading FW panic log");
908 * Make sure the chip is awake and the logger isn't active.
909 * Do not send a stop fwlog command if the fw is hanged or if
910 * dbgpins are used (due to some fw bug).
912 error = pm_runtime_resume_and_get(wl->dev);
915 if (!wl->watchdog_recovery &&
916 wl->conf.fwlog.output != WL12XX_FWLOG_OUTPUT_DBG_PINS)
917 wl12xx_cmd_stop_fwlog(wl);
919 /* Traverse the memory blocks linked list */
921 end_of_log = wlcore_event_fw_logger(wl);
922 if (end_of_log == 0) {
924 end_of_log = wlcore_event_fw_logger(wl);
926 } while (end_of_log != 0);
929 static void wlcore_save_freed_pkts(struct wl1271 *wl, struct wl12xx_vif *wlvif,
930 u8 hlid, struct ieee80211_sta *sta)
932 struct wl1271_station *wl_sta;
933 u32 sqn_recovery_padding = WL1271_TX_SQN_POST_RECOVERY_PADDING;
935 wl_sta = (void *)sta->drv_priv;
936 wl_sta->total_freed_pkts = wl->links[hlid].total_freed_pkts;
939 * increment the initial seq number on recovery to account for
940 * transmitted packets that we haven't yet got in the FW status
942 if (wlvif->encryption_type == KEY_GEM)
943 sqn_recovery_padding = WL1271_TX_SQN_POST_RECOVERY_PADDING_GEM;
945 if (test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags))
946 wl_sta->total_freed_pkts += sqn_recovery_padding;
949 static void wlcore_save_freed_pkts_addr(struct wl1271 *wl,
950 struct wl12xx_vif *wlvif,
951 u8 hlid, const u8 *addr)
953 struct ieee80211_sta *sta;
954 struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
956 if (WARN_ON(hlid == WL12XX_INVALID_LINK_ID ||
957 is_zero_ether_addr(addr)))
961 sta = ieee80211_find_sta(vif, addr);
963 wlcore_save_freed_pkts(wl, wlvif, hlid, sta);
967 static void wlcore_print_recovery(struct wl1271 *wl)
973 wl1271_info("Hardware recovery in progress. FW ver: %s",
974 wl->chip.fw_ver_str);
976 /* change partitions momentarily so we can read the FW pc */
977 ret = wlcore_set_partition(wl, &wl->ptable[PART_BOOT]);
981 ret = wlcore_read_reg(wl, REG_PC_ON_RECOVERY, &pc);
985 ret = wlcore_read_reg(wl, REG_INTERRUPT_NO_CLEAR, &hint_sts);
989 wl1271_info("pc: 0x%x, hint_sts: 0x%08x count: %d",
990 pc, hint_sts, ++wl->recovery_count);
992 wlcore_set_partition(wl, &wl->ptable[PART_WORK]);
996 static void wl1271_recovery_work(struct work_struct *work)
999 container_of(work, struct wl1271, recovery_work);
1000 struct wl12xx_vif *wlvif;
1001 struct ieee80211_vif *vif;
1004 mutex_lock(&wl->mutex);
1006 if (wl->state == WLCORE_STATE_OFF || wl->plt)
1009 error = pm_runtime_resume_and_get(wl->dev);
1011 wl1271_warning("Enable for recovery failed");
1012 wlcore_disable_interrupts_nosync(wl);
1014 if (!test_bit(WL1271_FLAG_INTENDED_FW_RECOVERY, &wl->flags)) {
1015 if (wl->conf.fwlog.output == WL12XX_FWLOG_OUTPUT_HOST)
1016 wl12xx_read_fwlog_panic(wl);
1017 wlcore_print_recovery(wl);
1020 BUG_ON(wl->conf.recovery.bug_on_recovery &&
1021 !test_bit(WL1271_FLAG_INTENDED_FW_RECOVERY, &wl->flags));
1023 clear_bit(WL1271_FLAG_INTENDED_FW_RECOVERY, &wl->flags);
1025 if (wl->conf.recovery.no_recovery) {
1026 wl1271_info("No recovery (chosen on module load). Fw will remain stuck.");
1030 /* Prevent spurious TX during FW restart */
1031 wlcore_stop_queues(wl, WLCORE_QUEUE_STOP_REASON_FW_RESTART);
1033 /* reboot the chipset */
1034 while (!list_empty(&wl->wlvif_list)) {
1035 wlvif = list_first_entry(&wl->wlvif_list,
1036 struct wl12xx_vif, list);
1037 vif = wl12xx_wlvif_to_vif(wlvif);
1039 if (wlvif->bss_type == BSS_TYPE_STA_BSS &&
1040 test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags)) {
1041 wlcore_save_freed_pkts_addr(wl, wlvif, wlvif->sta.hlid,
1042 vif->bss_conf.bssid);
1045 __wl1271_op_remove_interface(wl, vif, false);
1048 wlcore_op_stop_locked(wl);
1049 pm_runtime_mark_last_busy(wl->dev);
1050 pm_runtime_put_autosuspend(wl->dev);
1052 ieee80211_restart_hw(wl->hw);
1055 * Its safe to enable TX now - the queues are stopped after a request
1056 * to restart the HW.
1058 wlcore_wake_queues(wl, WLCORE_QUEUE_STOP_REASON_FW_RESTART);
1061 wl->watchdog_recovery = false;
1062 clear_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags);
1063 mutex_unlock(&wl->mutex);
1066 static int wlcore_fw_wakeup(struct wl1271 *wl)
1068 return wlcore_raw_write32(wl, HW_ACCESS_ELP_CTRL_REG, ELPCTRL_WAKE_UP);
1071 static int wl1271_setup(struct wl1271 *wl)
1073 wl->raw_fw_status = kzalloc(wl->fw_status_len, GFP_KERNEL);
1074 if (!wl->raw_fw_status)
1077 wl->fw_status = kzalloc(sizeof(*wl->fw_status), GFP_KERNEL);
1081 wl->tx_res_if = kzalloc(sizeof(*wl->tx_res_if), GFP_KERNEL);
1087 kfree(wl->fw_status);
1088 kfree(wl->raw_fw_status);
1092 static int wl12xx_set_power_on(struct wl1271 *wl)
1096 msleep(WL1271_PRE_POWER_ON_SLEEP);
1097 ret = wl1271_power_on(wl);
1100 msleep(WL1271_POWER_ON_SLEEP);
1101 wl1271_io_reset(wl);
1104 ret = wlcore_set_partition(wl, &wl->ptable[PART_BOOT]);
1108 /* ELP module wake up */
1109 ret = wlcore_fw_wakeup(wl);
1117 wl1271_power_off(wl);
1121 static int wl12xx_chip_wakeup(struct wl1271 *wl, bool plt)
1125 ret = wl12xx_set_power_on(wl);
1130 * For wl127x based devices we could use the default block
1131 * size (512 bytes), but due to a bug in the sdio driver, we
1132 * need to set it explicitly after the chip is powered on. To
1133 * simplify the code and since the performance impact is
1134 * negligible, we use the same block size for all different
1137 * Check if the bus supports blocksize alignment and, if it
1138 * doesn't, make sure we don't have the quirk.
1140 if (!wl1271_set_block_size(wl))
1141 wl->quirks &= ~WLCORE_QUIRK_TX_BLOCKSIZE_ALIGN;
1143 /* TODO: make sure the lower driver has set things up correctly */
1145 ret = wl1271_setup(wl);
1149 ret = wl12xx_fetch_firmware(wl, plt);
1151 kfree(wl->fw_status);
1152 kfree(wl->raw_fw_status);
1153 kfree(wl->tx_res_if);
1160 int wl1271_plt_start(struct wl1271 *wl, const enum plt_mode plt_mode)
1162 int retries = WL1271_BOOT_RETRIES;
1163 struct wiphy *wiphy = wl->hw->wiphy;
1165 static const char* const PLT_MODE[] = {
1174 mutex_lock(&wl->mutex);
1176 wl1271_notice("power up");
1178 if (wl->state != WLCORE_STATE_OFF) {
1179 wl1271_error("cannot go into PLT state because not "
1180 "in off state: %d", wl->state);
1185 /* Indicate to lower levels that we are now in PLT mode */
1187 wl->plt_mode = plt_mode;
1191 ret = wl12xx_chip_wakeup(wl, true);
1195 if (plt_mode != PLT_CHIP_AWAKE) {
1196 ret = wl->ops->plt_init(wl);
1201 wl->state = WLCORE_STATE_ON;
1202 wl1271_notice("firmware booted in PLT mode %s (%s)",
1204 wl->chip.fw_ver_str);
1206 /* update hw/fw version info in wiphy struct */
1207 wiphy->hw_version = wl->chip.id;
1208 strscpy(wiphy->fw_version, wl->chip.fw_ver_str,
1209 sizeof(wiphy->fw_version));
1214 wl1271_power_off(wl);
1218 wl->plt_mode = PLT_OFF;
1220 wl1271_error("firmware boot in PLT mode failed despite %d retries",
1221 WL1271_BOOT_RETRIES);
1223 mutex_unlock(&wl->mutex);
1228 int wl1271_plt_stop(struct wl1271 *wl)
1232 wl1271_notice("power down");
1235 * Interrupts must be disabled before setting the state to OFF.
1236 * Otherwise, the interrupt handler might be called and exit without
1237 * reading the interrupt status.
1239 wlcore_disable_interrupts(wl);
1240 mutex_lock(&wl->mutex);
1242 mutex_unlock(&wl->mutex);
1245 * This will not necessarily enable interrupts as interrupts
1246 * may have been disabled when op_stop was called. It will,
1247 * however, balance the above call to disable_interrupts().
1249 wlcore_enable_interrupts(wl);
1251 wl1271_error("cannot power down because not in PLT "
1252 "state: %d", wl->state);
1257 mutex_unlock(&wl->mutex);
1259 wl1271_flush_deferred_work(wl);
1260 cancel_work_sync(&wl->netstack_work);
1261 cancel_work_sync(&wl->recovery_work);
1262 cancel_delayed_work_sync(&wl->tx_watchdog_work);
1264 mutex_lock(&wl->mutex);
1265 wl1271_power_off(wl);
1267 wl->sleep_auth = WL1271_PSM_ILLEGAL;
1268 wl->state = WLCORE_STATE_OFF;
1270 wl->plt_mode = PLT_OFF;
1272 mutex_unlock(&wl->mutex);
1278 static void wl1271_op_tx(struct ieee80211_hw *hw,
1279 struct ieee80211_tx_control *control,
1280 struct sk_buff *skb)
1282 struct wl1271 *wl = hw->priv;
1283 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
1284 struct ieee80211_vif *vif = info->control.vif;
1285 struct wl12xx_vif *wlvif = NULL;
1286 unsigned long flags;
1291 wl1271_debug(DEBUG_TX, "DROP skb with no vif");
1292 ieee80211_free_txskb(hw, skb);
1296 wlvif = wl12xx_vif_to_data(vif);
1297 mapping = skb_get_queue_mapping(skb);
1298 q = wl1271_tx_get_queue(mapping);
1300 hlid = wl12xx_tx_get_hlid(wl, wlvif, skb, control->sta);
1302 spin_lock_irqsave(&wl->wl_lock, flags);
1305 * drop the packet if the link is invalid or the queue is stopped
1306 * for any reason but watermark. Watermark is a "soft"-stop so we
1307 * allow these packets through.
1309 if (hlid == WL12XX_INVALID_LINK_ID ||
1310 (!test_bit(hlid, wlvif->links_map)) ||
1311 (wlcore_is_queue_stopped_locked(wl, wlvif, q) &&
1312 !wlcore_is_queue_stopped_by_reason_locked(wl, wlvif, q,
1313 WLCORE_QUEUE_STOP_REASON_WATERMARK))) {
1314 wl1271_debug(DEBUG_TX, "DROP skb hlid %d q %d", hlid, q);
1315 ieee80211_free_txskb(hw, skb);
1319 wl1271_debug(DEBUG_TX, "queue skb hlid %d q %d len %d",
1321 skb_queue_tail(&wl->links[hlid].tx_queue[q], skb);
1323 wl->tx_queue_count[q]++;
1324 wlvif->tx_queue_count[q]++;
1327 * The workqueue is slow to process the tx_queue and we need stop
1328 * the queue here, otherwise the queue will get too long.
1330 if (wlvif->tx_queue_count[q] >= WL1271_TX_QUEUE_HIGH_WATERMARK &&
1331 !wlcore_is_queue_stopped_by_reason_locked(wl, wlvif, q,
1332 WLCORE_QUEUE_STOP_REASON_WATERMARK)) {
1333 wl1271_debug(DEBUG_TX, "op_tx: stopping queues for q %d", q);
1334 wlcore_stop_queue_locked(wl, wlvif, q,
1335 WLCORE_QUEUE_STOP_REASON_WATERMARK);
1339 * The chip specific setup must run before the first TX packet -
1340 * before that, the tx_work will not be initialized!
1343 if (!test_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags) &&
1344 !test_bit(WL1271_FLAG_TX_PENDING, &wl->flags))
1345 ieee80211_queue_work(wl->hw, &wl->tx_work);
1348 spin_unlock_irqrestore(&wl->wl_lock, flags);
1351 int wl1271_tx_dummy_packet(struct wl1271 *wl)
1353 unsigned long flags;
1356 /* no need to queue a new dummy packet if one is already pending */
1357 if (test_bit(WL1271_FLAG_DUMMY_PACKET_PENDING, &wl->flags))
1360 q = wl1271_tx_get_queue(skb_get_queue_mapping(wl->dummy_packet));
1362 spin_lock_irqsave(&wl->wl_lock, flags);
1363 set_bit(WL1271_FLAG_DUMMY_PACKET_PENDING, &wl->flags);
1364 wl->tx_queue_count[q]++;
1365 spin_unlock_irqrestore(&wl->wl_lock, flags);
1367 /* The FW is low on RX memory blocks, so send the dummy packet asap */
1368 if (!test_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags))
1369 return wlcore_tx_work_locked(wl);
1372 * If the FW TX is busy, TX work will be scheduled by the threaded
1373 * interrupt handler function
1379 * The size of the dummy packet should be at least 1400 bytes. However, in
1380 * order to minimize the number of bus transactions, aligning it to 512 bytes
1381 * boundaries could be beneficial, performance wise
1383 #define TOTAL_TX_DUMMY_PACKET_SIZE (ALIGN(1400, 512))
1385 static struct sk_buff *wl12xx_alloc_dummy_packet(struct wl1271 *wl)
1387 struct sk_buff *skb;
1388 struct ieee80211_hdr_3addr *hdr;
1389 unsigned int dummy_packet_size;
1391 dummy_packet_size = TOTAL_TX_DUMMY_PACKET_SIZE -
1392 sizeof(struct wl1271_tx_hw_descr) - sizeof(*hdr);
1394 skb = dev_alloc_skb(TOTAL_TX_DUMMY_PACKET_SIZE);
1396 wl1271_warning("Failed to allocate a dummy packet skb");
1400 skb_reserve(skb, sizeof(struct wl1271_tx_hw_descr));
1402 hdr = skb_put_zero(skb, sizeof(*hdr));
1403 hdr->frame_control = cpu_to_le16(IEEE80211_FTYPE_DATA |
1404 IEEE80211_STYPE_NULLFUNC |
1405 IEEE80211_FCTL_TODS);
1407 skb_put_zero(skb, dummy_packet_size);
1409 /* Dummy packets require the TID to be management */
1410 skb->priority = WL1271_TID_MGMT;
1412 /* Initialize all fields that might be used */
1413 skb_set_queue_mapping(skb, 0);
1414 memset(IEEE80211_SKB_CB(skb), 0, sizeof(struct ieee80211_tx_info));
1421 wl1271_validate_wowlan_pattern(struct cfg80211_pkt_pattern *p)
1423 int num_fields = 0, in_field = 0, fields_size = 0;
1424 int i, pattern_len = 0;
1427 wl1271_warning("No mask in WoWLAN pattern");
1432 * The pattern is broken up into segments of bytes at different offsets
1433 * that need to be checked by the FW filter. Each segment is called
1434 * a field in the FW API. We verify that the total number of fields
1435 * required for this pattern won't exceed FW limits (8)
1436 * as well as the total fields buffer won't exceed the FW limit.
1437 * Note that if there's a pattern which crosses Ethernet/IP header
1438 * boundary a new field is required.
1440 for (i = 0; i < p->pattern_len; i++) {
1441 if (test_bit(i, (unsigned long *)p->mask)) {
1446 if (i == WL1271_RX_FILTER_ETH_HEADER_SIZE) {
1448 fields_size += pattern_len +
1449 RX_FILTER_FIELD_OVERHEAD;
1457 fields_size += pattern_len +
1458 RX_FILTER_FIELD_OVERHEAD;
1465 fields_size += pattern_len + RX_FILTER_FIELD_OVERHEAD;
1469 if (num_fields > WL1271_RX_FILTER_MAX_FIELDS) {
1470 wl1271_warning("RX Filter too complex. Too many segments");
1474 if (fields_size > WL1271_RX_FILTER_MAX_FIELDS_SIZE) {
1475 wl1271_warning("RX filter pattern is too big");
1482 struct wl12xx_rx_filter *wl1271_rx_filter_alloc(void)
1484 return kzalloc(sizeof(struct wl12xx_rx_filter), GFP_KERNEL);
1487 void wl1271_rx_filter_free(struct wl12xx_rx_filter *filter)
1494 for (i = 0; i < filter->num_fields; i++)
1495 kfree(filter->fields[i].pattern);
1500 int wl1271_rx_filter_alloc_field(struct wl12xx_rx_filter *filter,
1501 u16 offset, u8 flags,
1502 const u8 *pattern, u8 len)
1504 struct wl12xx_rx_filter_field *field;
1506 if (filter->num_fields == WL1271_RX_FILTER_MAX_FIELDS) {
1507 wl1271_warning("Max fields per RX filter. can't alloc another");
1511 field = &filter->fields[filter->num_fields];
1513 field->pattern = kmemdup(pattern, len, GFP_KERNEL);
1514 if (!field->pattern) {
1515 wl1271_warning("Failed to allocate RX filter pattern");
1519 filter->num_fields++;
1521 field->offset = cpu_to_le16(offset);
1522 field->flags = flags;
1528 int wl1271_rx_filter_get_fields_size(struct wl12xx_rx_filter *filter)
1530 int i, fields_size = 0;
1532 for (i = 0; i < filter->num_fields; i++)
1533 fields_size += filter->fields[i].len +
1534 sizeof(struct wl12xx_rx_filter_field) -
1540 void wl1271_rx_filter_flatten_fields(struct wl12xx_rx_filter *filter,
1544 struct wl12xx_rx_filter_field *field;
1546 for (i = 0; i < filter->num_fields; i++) {
1547 field = (struct wl12xx_rx_filter_field *)buf;
1549 field->offset = filter->fields[i].offset;
1550 field->flags = filter->fields[i].flags;
1551 field->len = filter->fields[i].len;
1553 memcpy(&field->pattern, filter->fields[i].pattern, field->len);
1554 buf += sizeof(struct wl12xx_rx_filter_field) -
1555 sizeof(u8 *) + field->len;
1560 * Allocates an RX filter returned through f
1561 * which needs to be freed using rx_filter_free()
1564 wl1271_convert_wowlan_pattern_to_rx_filter(struct cfg80211_pkt_pattern *p,
1565 struct wl12xx_rx_filter **f)
1568 struct wl12xx_rx_filter *filter;
1572 filter = wl1271_rx_filter_alloc();
1574 wl1271_warning("Failed to alloc rx filter");
1580 while (i < p->pattern_len) {
1581 if (!test_bit(i, (unsigned long *)p->mask)) {
1586 for (j = i; j < p->pattern_len; j++) {
1587 if (!test_bit(j, (unsigned long *)p->mask))
1590 if (i < WL1271_RX_FILTER_ETH_HEADER_SIZE &&
1591 j >= WL1271_RX_FILTER_ETH_HEADER_SIZE)
1595 if (i < WL1271_RX_FILTER_ETH_HEADER_SIZE) {
1597 flags = WL1271_RX_FILTER_FLAG_ETHERNET_HEADER;
1599 offset = i - WL1271_RX_FILTER_ETH_HEADER_SIZE;
1600 flags = WL1271_RX_FILTER_FLAG_IP_HEADER;
1605 ret = wl1271_rx_filter_alloc_field(filter,
1608 &p->pattern[i], len);
1615 filter->action = FILTER_SIGNAL;
1621 wl1271_rx_filter_free(filter);
1627 static int wl1271_configure_wowlan(struct wl1271 *wl,
1628 struct cfg80211_wowlan *wow)
1632 if (!wow || wow->any || !wow->n_patterns) {
1633 ret = wl1271_acx_default_rx_filter_enable(wl, 0,
1638 ret = wl1271_rx_filter_clear_all(wl);
1645 if (WARN_ON(wow->n_patterns > WL1271_MAX_RX_FILTERS))
1648 /* Validate all incoming patterns before clearing current FW state */
1649 for (i = 0; i < wow->n_patterns; i++) {
1650 ret = wl1271_validate_wowlan_pattern(&wow->patterns[i]);
1652 wl1271_warning("Bad wowlan pattern %d", i);
1657 ret = wl1271_acx_default_rx_filter_enable(wl, 0, FILTER_SIGNAL);
1661 ret = wl1271_rx_filter_clear_all(wl);
1665 /* Translate WoWLAN patterns into filters */
1666 for (i = 0; i < wow->n_patterns; i++) {
1667 struct cfg80211_pkt_pattern *p;
1668 struct wl12xx_rx_filter *filter = NULL;
1670 p = &wow->patterns[i];
1672 ret = wl1271_convert_wowlan_pattern_to_rx_filter(p, &filter);
1674 wl1271_warning("Failed to create an RX filter from "
1675 "wowlan pattern %d", i);
1679 ret = wl1271_rx_filter_enable(wl, i, 1, filter);
1681 wl1271_rx_filter_free(filter);
1686 ret = wl1271_acx_default_rx_filter_enable(wl, 1, FILTER_DROP);
1692 static int wl1271_configure_suspend_sta(struct wl1271 *wl,
1693 struct wl12xx_vif *wlvif,
1694 struct cfg80211_wowlan *wow)
1698 if (!test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags))
1701 ret = wl1271_configure_wowlan(wl, wow);
1705 if ((wl->conf.conn.suspend_wake_up_event ==
1706 wl->conf.conn.wake_up_event) &&
1707 (wl->conf.conn.suspend_listen_interval ==
1708 wl->conf.conn.listen_interval))
1711 ret = wl1271_acx_wake_up_conditions(wl, wlvif,
1712 wl->conf.conn.suspend_wake_up_event,
1713 wl->conf.conn.suspend_listen_interval);
1716 wl1271_error("suspend: set wake up conditions failed: %d", ret);
1722 static int wl1271_configure_suspend_ap(struct wl1271 *wl,
1723 struct wl12xx_vif *wlvif,
1724 struct cfg80211_wowlan *wow)
1728 if (!test_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags))
1731 ret = wl1271_acx_beacon_filter_opt(wl, wlvif, true);
1735 ret = wl1271_configure_wowlan(wl, wow);
1744 static int wl1271_configure_suspend(struct wl1271 *wl,
1745 struct wl12xx_vif *wlvif,
1746 struct cfg80211_wowlan *wow)
1748 if (wlvif->bss_type == BSS_TYPE_STA_BSS)
1749 return wl1271_configure_suspend_sta(wl, wlvif, wow);
1750 if (wlvif->bss_type == BSS_TYPE_AP_BSS)
1751 return wl1271_configure_suspend_ap(wl, wlvif, wow);
1755 static void wl1271_configure_resume(struct wl1271 *wl, struct wl12xx_vif *wlvif)
1758 bool is_ap = wlvif->bss_type == BSS_TYPE_AP_BSS;
1759 bool is_sta = wlvif->bss_type == BSS_TYPE_STA_BSS;
1761 if ((!is_ap) && (!is_sta))
1764 if ((is_sta && !test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags)) ||
1765 (is_ap && !test_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags)))
1768 wl1271_configure_wowlan(wl, NULL);
1771 if ((wl->conf.conn.suspend_wake_up_event ==
1772 wl->conf.conn.wake_up_event) &&
1773 (wl->conf.conn.suspend_listen_interval ==
1774 wl->conf.conn.listen_interval))
1777 ret = wl1271_acx_wake_up_conditions(wl, wlvif,
1778 wl->conf.conn.wake_up_event,
1779 wl->conf.conn.listen_interval);
1782 wl1271_error("resume: wake up conditions failed: %d",
1786 ret = wl1271_acx_beacon_filter_opt(wl, wlvif, false);
1790 static int __maybe_unused wl1271_op_suspend(struct ieee80211_hw *hw,
1791 struct cfg80211_wowlan *wow)
1793 struct wl1271 *wl = hw->priv;
1794 struct wl12xx_vif *wlvif;
1795 unsigned long flags;
1798 wl1271_debug(DEBUG_MAC80211, "mac80211 suspend wow=%d", !!wow);
1801 /* we want to perform the recovery before suspending */
1802 if (test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags)) {
1803 wl1271_warning("postponing suspend to perform recovery");
1807 wl1271_tx_flush(wl);
1809 mutex_lock(&wl->mutex);
1811 ret = pm_runtime_resume_and_get(wl->dev);
1813 mutex_unlock(&wl->mutex);
1817 wl->wow_enabled = true;
1818 wl12xx_for_each_wlvif(wl, wlvif) {
1819 if (wlcore_is_p2p_mgmt(wlvif))
1822 ret = wl1271_configure_suspend(wl, wlvif, wow);
1828 /* disable fast link flow control notifications from FW */
1829 ret = wlcore_hw_interrupt_notify(wl, false);
1833 /* if filtering is enabled, configure the FW to drop all RX BA frames */
1834 ret = wlcore_hw_rx_ba_filter(wl,
1835 !!wl->conf.conn.suspend_rx_ba_activity);
1840 pm_runtime_put_noidle(wl->dev);
1841 mutex_unlock(&wl->mutex);
1844 wl1271_warning("couldn't prepare device to suspend");
1848 /* flush any remaining work */
1849 wl1271_debug(DEBUG_MAC80211, "flushing remaining works");
1851 flush_work(&wl->tx_work);
1854 * Cancel the watchdog even if above tx_flush failed. We will detect
1855 * it on resume anyway.
1857 cancel_delayed_work(&wl->tx_watchdog_work);
1860 * set suspended flag to avoid triggering a new threaded_irq
1863 spin_lock_irqsave(&wl->wl_lock, flags);
1864 set_bit(WL1271_FLAG_SUSPENDED, &wl->flags);
1865 spin_unlock_irqrestore(&wl->wl_lock, flags);
1867 return pm_runtime_force_suspend(wl->dev);
1870 static int __maybe_unused wl1271_op_resume(struct ieee80211_hw *hw)
1872 struct wl1271 *wl = hw->priv;
1873 struct wl12xx_vif *wlvif;
1874 unsigned long flags;
1875 bool run_irq_work = false, pending_recovery;
1878 wl1271_debug(DEBUG_MAC80211, "mac80211 resume wow=%d",
1880 WARN_ON(!wl->wow_enabled);
1882 ret = pm_runtime_force_resume(wl->dev);
1884 wl1271_error("ELP wakeup failure!");
1889 * re-enable irq_work enqueuing, and call irq_work directly if
1890 * there is a pending work.
1892 spin_lock_irqsave(&wl->wl_lock, flags);
1893 clear_bit(WL1271_FLAG_SUSPENDED, &wl->flags);
1894 if (test_and_clear_bit(WL1271_FLAG_PENDING_WORK, &wl->flags))
1895 run_irq_work = true;
1896 spin_unlock_irqrestore(&wl->wl_lock, flags);
1898 mutex_lock(&wl->mutex);
1900 /* test the recovery flag before calling any SDIO functions */
1901 pending_recovery = test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS,
1905 wl1271_debug(DEBUG_MAC80211,
1906 "run postponed irq_work directly");
1908 /* don't talk to the HW if recovery is pending */
1909 if (!pending_recovery) {
1910 ret = wlcore_irq_locked(wl);
1912 wl12xx_queue_recovery_work(wl);
1915 wlcore_enable_interrupts(wl);
1918 if (pending_recovery) {
1919 wl1271_warning("queuing forgotten recovery on resume");
1920 ieee80211_queue_work(wl->hw, &wl->recovery_work);
1924 ret = pm_runtime_resume_and_get(wl->dev);
1928 wl12xx_for_each_wlvif(wl, wlvif) {
1929 if (wlcore_is_p2p_mgmt(wlvif))
1932 wl1271_configure_resume(wl, wlvif);
1935 ret = wlcore_hw_interrupt_notify(wl, true);
1939 /* if filtering is enabled, configure the FW to drop all RX BA frames */
1940 ret = wlcore_hw_rx_ba_filter(wl, false);
1945 pm_runtime_mark_last_busy(wl->dev);
1946 pm_runtime_put_autosuspend(wl->dev);
1949 wl->wow_enabled = false;
1952 * Set a flag to re-init the watchdog on the first Tx after resume.
1953 * That way we avoid possible conditions where Tx-complete interrupts
1954 * fail to arrive and we perform a spurious recovery.
1956 set_bit(WL1271_FLAG_REINIT_TX_WDOG, &wl->flags);
1957 mutex_unlock(&wl->mutex);
1962 static int wl1271_op_start(struct ieee80211_hw *hw)
1964 wl1271_debug(DEBUG_MAC80211, "mac80211 start");
1967 * We have to delay the booting of the hardware because
1968 * we need to know the local MAC address before downloading and
1969 * initializing the firmware. The MAC address cannot be changed
1970 * after boot, and without the proper MAC address, the firmware
1971 * will not function properly.
1973 * The MAC address is first known when the corresponding interface
1974 * is added. That is where we will initialize the hardware.
1980 static void wlcore_op_stop_locked(struct wl1271 *wl)
1984 if (wl->state == WLCORE_STATE_OFF) {
1985 if (test_and_clear_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS,
1987 wlcore_enable_interrupts(wl);
1993 * this must be before the cancel_work calls below, so that the work
1994 * functions don't perform further work.
1996 wl->state = WLCORE_STATE_OFF;
1999 * Use the nosync variant to disable interrupts, so the mutex could be
2000 * held while doing so without deadlocking.
2002 wlcore_disable_interrupts_nosync(wl);
2004 mutex_unlock(&wl->mutex);
2006 wlcore_synchronize_interrupts(wl);
2007 if (!test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags))
2008 cancel_work_sync(&wl->recovery_work);
2009 wl1271_flush_deferred_work(wl);
2010 cancel_delayed_work_sync(&wl->scan_complete_work);
2011 cancel_work_sync(&wl->netstack_work);
2012 cancel_work_sync(&wl->tx_work);
2013 cancel_delayed_work_sync(&wl->tx_watchdog_work);
2015 /* let's notify MAC80211 about the remaining pending TX frames */
2016 mutex_lock(&wl->mutex);
2017 wl12xx_tx_reset(wl);
2019 wl1271_power_off(wl);
2021 * In case a recovery was scheduled, interrupts were disabled to avoid
2022 * an interrupt storm. Now that the power is down, it is safe to
2023 * re-enable interrupts to balance the disable depth
2025 if (test_and_clear_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags))
2026 wlcore_enable_interrupts(wl);
2028 wl->band = NL80211_BAND_2GHZ;
2031 wl->power_level = WL1271_DEFAULT_POWER_LEVEL;
2032 wl->channel_type = NL80211_CHAN_NO_HT;
2033 wl->tx_blocks_available = 0;
2034 wl->tx_allocated_blocks = 0;
2035 wl->tx_results_count = 0;
2036 wl->tx_packets_count = 0;
2037 wl->time_offset = 0;
2038 wl->ap_fw_ps_map = 0;
2040 wl->sleep_auth = WL1271_PSM_ILLEGAL;
2041 memset(wl->roles_map, 0, sizeof(wl->roles_map));
2042 memset(wl->links_map, 0, sizeof(wl->links_map));
2043 memset(wl->roc_map, 0, sizeof(wl->roc_map));
2044 memset(wl->session_ids, 0, sizeof(wl->session_ids));
2045 memset(wl->rx_filter_enabled, 0, sizeof(wl->rx_filter_enabled));
2046 wl->active_sta_count = 0;
2047 wl->active_link_count = 0;
2049 /* The system link is always allocated */
2050 wl->links[WL12XX_SYSTEM_HLID].allocated_pkts = 0;
2051 wl->links[WL12XX_SYSTEM_HLID].prev_freed_pkts = 0;
2052 __set_bit(WL12XX_SYSTEM_HLID, wl->links_map);
2055 * this is performed after the cancel_work calls and the associated
2056 * mutex_lock, so that wl1271_op_add_interface does not accidentally
2057 * get executed before all these vars have been reset.
2061 wl->tx_blocks_freed = 0;
2063 for (i = 0; i < NUM_TX_QUEUES; i++) {
2064 wl->tx_pkts_freed[i] = 0;
2065 wl->tx_allocated_pkts[i] = 0;
2068 wl1271_debugfs_reset(wl);
2070 kfree(wl->raw_fw_status);
2071 wl->raw_fw_status = NULL;
2072 kfree(wl->fw_status);
2073 wl->fw_status = NULL;
2074 kfree(wl->tx_res_if);
2075 wl->tx_res_if = NULL;
2076 kfree(wl->target_mem_map);
2077 wl->target_mem_map = NULL;
2080 * FW channels must be re-calibrated after recovery,
2081 * save current Reg-Domain channel configuration and clear it.
2083 memcpy(wl->reg_ch_conf_pending, wl->reg_ch_conf_last,
2084 sizeof(wl->reg_ch_conf_pending));
2085 memset(wl->reg_ch_conf_last, 0, sizeof(wl->reg_ch_conf_last));
2088 static void wlcore_op_stop(struct ieee80211_hw *hw, bool suspend)
2090 struct wl1271 *wl = hw->priv;
2092 wl1271_debug(DEBUG_MAC80211, "mac80211 stop");
2094 mutex_lock(&wl->mutex);
2096 wlcore_op_stop_locked(wl);
2098 mutex_unlock(&wl->mutex);
2101 static void wlcore_channel_switch_work(struct work_struct *work)
2103 struct delayed_work *dwork;
2105 struct ieee80211_vif *vif;
2106 struct wl12xx_vif *wlvif;
2109 dwork = to_delayed_work(work);
2110 wlvif = container_of(dwork, struct wl12xx_vif, channel_switch_work);
2113 wl1271_info("channel switch failed (role_id: %d).", wlvif->role_id);
2115 mutex_lock(&wl->mutex);
2117 if (unlikely(wl->state != WLCORE_STATE_ON))
2120 /* check the channel switch is still ongoing */
2121 if (!test_and_clear_bit(WLVIF_FLAG_CS_PROGRESS, &wlvif->flags))
2124 vif = wl12xx_wlvif_to_vif(wlvif);
2125 ieee80211_chswitch_done(vif, false, 0);
2127 ret = pm_runtime_resume_and_get(wl->dev);
2131 wl12xx_cmd_stop_channel_switch(wl, wlvif);
2133 pm_runtime_mark_last_busy(wl->dev);
2134 pm_runtime_put_autosuspend(wl->dev);
2136 mutex_unlock(&wl->mutex);
2139 static void wlcore_connection_loss_work(struct work_struct *work)
2141 struct delayed_work *dwork;
2143 struct ieee80211_vif *vif;
2144 struct wl12xx_vif *wlvif;
2146 dwork = to_delayed_work(work);
2147 wlvif = container_of(dwork, struct wl12xx_vif, connection_loss_work);
2150 wl1271_info("Connection loss work (role_id: %d).", wlvif->role_id);
2152 mutex_lock(&wl->mutex);
2154 if (unlikely(wl->state != WLCORE_STATE_ON))
2157 /* Call mac80211 connection loss */
2158 if (!test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags))
2161 vif = wl12xx_wlvif_to_vif(wlvif);
2162 ieee80211_connection_loss(vif);
2164 mutex_unlock(&wl->mutex);
2167 static void wlcore_pending_auth_complete_work(struct work_struct *work)
2169 struct delayed_work *dwork;
2171 struct wl12xx_vif *wlvif;
2172 unsigned long time_spare;
2175 dwork = to_delayed_work(work);
2176 wlvif = container_of(dwork, struct wl12xx_vif,
2177 pending_auth_complete_work);
2180 mutex_lock(&wl->mutex);
2182 if (unlikely(wl->state != WLCORE_STATE_ON))
2186 * Make sure a second really passed since the last auth reply. Maybe
2187 * a second auth reply arrived while we were stuck on the mutex.
2188 * Check for a little less than the timeout to protect from scheduler
2191 time_spare = jiffies +
2192 msecs_to_jiffies(WLCORE_PEND_AUTH_ROC_TIMEOUT - 50);
2193 if (!time_after(time_spare, wlvif->pending_auth_reply_time))
2196 ret = pm_runtime_resume_and_get(wl->dev);
2200 /* cancel the ROC if active */
2201 wlcore_update_inconn_sta(wl, wlvif, NULL, false);
2203 pm_runtime_mark_last_busy(wl->dev);
2204 pm_runtime_put_autosuspend(wl->dev);
2206 mutex_unlock(&wl->mutex);
2209 static int wl12xx_allocate_rate_policy(struct wl1271 *wl, u8 *idx)
2211 u8 policy = find_first_zero_bit(wl->rate_policies_map,
2212 WL12XX_MAX_RATE_POLICIES);
2213 if (policy >= WL12XX_MAX_RATE_POLICIES)
2216 __set_bit(policy, wl->rate_policies_map);
2221 static void wl12xx_free_rate_policy(struct wl1271 *wl, u8 *idx)
2223 if (WARN_ON(*idx >= WL12XX_MAX_RATE_POLICIES))
2226 __clear_bit(*idx, wl->rate_policies_map);
2227 *idx = WL12XX_MAX_RATE_POLICIES;
2230 static int wlcore_allocate_klv_template(struct wl1271 *wl, u8 *idx)
2232 u8 policy = find_first_zero_bit(wl->klv_templates_map,
2233 WLCORE_MAX_KLV_TEMPLATES);
2234 if (policy >= WLCORE_MAX_KLV_TEMPLATES)
2237 __set_bit(policy, wl->klv_templates_map);
2242 static void wlcore_free_klv_template(struct wl1271 *wl, u8 *idx)
2244 if (WARN_ON(*idx >= WLCORE_MAX_KLV_TEMPLATES))
2247 __clear_bit(*idx, wl->klv_templates_map);
2248 *idx = WLCORE_MAX_KLV_TEMPLATES;
2251 static u8 wl12xx_get_role_type(struct wl1271 *wl, struct wl12xx_vif *wlvif)
2253 struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
2255 switch (wlvif->bss_type) {
2256 case BSS_TYPE_AP_BSS:
2258 return WL1271_ROLE_P2P_GO;
2259 else if (ieee80211_vif_is_mesh(vif))
2260 return WL1271_ROLE_MESH_POINT;
2262 return WL1271_ROLE_AP;
2264 case BSS_TYPE_STA_BSS:
2266 return WL1271_ROLE_P2P_CL;
2268 return WL1271_ROLE_STA;
2271 return WL1271_ROLE_IBSS;
2274 wl1271_error("invalid bss_type: %d", wlvif->bss_type);
2276 return WL12XX_INVALID_ROLE_TYPE;
2279 static int wl12xx_init_vif_data(struct wl1271 *wl, struct ieee80211_vif *vif)
2281 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
2284 /* clear everything but the persistent data */
2285 memset(wlvif, 0, offsetof(struct wl12xx_vif, persistent));
2287 switch (ieee80211_vif_type_p2p(vif)) {
2288 case NL80211_IFTYPE_P2P_CLIENT:
2291 case NL80211_IFTYPE_STATION:
2292 case NL80211_IFTYPE_P2P_DEVICE:
2293 wlvif->bss_type = BSS_TYPE_STA_BSS;
2295 case NL80211_IFTYPE_ADHOC:
2296 wlvif->bss_type = BSS_TYPE_IBSS;
2298 case NL80211_IFTYPE_P2P_GO:
2301 case NL80211_IFTYPE_AP:
2302 case NL80211_IFTYPE_MESH_POINT:
2303 wlvif->bss_type = BSS_TYPE_AP_BSS;
2306 wlvif->bss_type = MAX_BSS_TYPE;
2310 wlvif->role_id = WL12XX_INVALID_ROLE_ID;
2311 wlvif->dev_role_id = WL12XX_INVALID_ROLE_ID;
2312 wlvif->dev_hlid = WL12XX_INVALID_LINK_ID;
2314 if (wlvif->bss_type == BSS_TYPE_STA_BSS ||
2315 wlvif->bss_type == BSS_TYPE_IBSS) {
2316 /* init sta/ibss data */
2317 wlvif->sta.hlid = WL12XX_INVALID_LINK_ID;
2318 wl12xx_allocate_rate_policy(wl, &wlvif->sta.basic_rate_idx);
2319 wl12xx_allocate_rate_policy(wl, &wlvif->sta.ap_rate_idx);
2320 wl12xx_allocate_rate_policy(wl, &wlvif->sta.p2p_rate_idx);
2321 wlcore_allocate_klv_template(wl, &wlvif->sta.klv_template_id);
2322 wlvif->basic_rate_set = CONF_TX_RATE_MASK_BASIC;
2323 wlvif->basic_rate = CONF_TX_RATE_MASK_BASIC;
2324 wlvif->rate_set = CONF_TX_RATE_MASK_BASIC;
2327 wlvif->ap.bcast_hlid = WL12XX_INVALID_LINK_ID;
2328 wlvif->ap.global_hlid = WL12XX_INVALID_LINK_ID;
2329 wl12xx_allocate_rate_policy(wl, &wlvif->ap.mgmt_rate_idx);
2330 wl12xx_allocate_rate_policy(wl, &wlvif->ap.bcast_rate_idx);
2331 for (i = 0; i < CONF_TX_MAX_AC_COUNT; i++)
2332 wl12xx_allocate_rate_policy(wl,
2333 &wlvif->ap.ucast_rate_idx[i]);
2334 wlvif->basic_rate_set = CONF_TX_ENABLED_RATES;
2336 * TODO: check if basic_rate shouldn't be
2337 * wl1271_tx_min_rate_get(wl, wlvif->basic_rate_set);
2338 * instead (the same thing for STA above).
2340 wlvif->basic_rate = CONF_TX_ENABLED_RATES;
2341 /* TODO: this seems to be used only for STA, check it */
2342 wlvif->rate_set = CONF_TX_ENABLED_RATES;
2345 wlvif->bitrate_masks[NL80211_BAND_2GHZ] = wl->conf.tx.basic_rate;
2346 wlvif->bitrate_masks[NL80211_BAND_5GHZ] = wl->conf.tx.basic_rate_5;
2347 wlvif->beacon_int = WL1271_DEFAULT_BEACON_INT;
2350 * mac80211 configures some values globally, while we treat them
2351 * per-interface. thus, on init, we have to copy them from wl
2353 wlvif->band = wl->band;
2354 wlvif->channel = wl->channel;
2355 wlvif->power_level = wl->power_level;
2356 wlvif->channel_type = wl->channel_type;
2358 INIT_WORK(&wlvif->rx_streaming_enable_work,
2359 wl1271_rx_streaming_enable_work);
2360 INIT_WORK(&wlvif->rx_streaming_disable_work,
2361 wl1271_rx_streaming_disable_work);
2362 INIT_WORK(&wlvif->rc_update_work, wlcore_rc_update_work);
2363 INIT_DELAYED_WORK(&wlvif->channel_switch_work,
2364 wlcore_channel_switch_work);
2365 INIT_DELAYED_WORK(&wlvif->connection_loss_work,
2366 wlcore_connection_loss_work);
2367 INIT_DELAYED_WORK(&wlvif->pending_auth_complete_work,
2368 wlcore_pending_auth_complete_work);
2369 INIT_LIST_HEAD(&wlvif->list);
2371 timer_setup(&wlvif->rx_streaming_timer, wl1271_rx_streaming_timer, 0);
2375 static int wl12xx_init_fw(struct wl1271 *wl)
2377 int retries = WL1271_BOOT_RETRIES;
2378 bool booted = false;
2379 struct wiphy *wiphy = wl->hw->wiphy;
2384 ret = wl12xx_chip_wakeup(wl, false);
2388 ret = wl->ops->boot(wl);
2392 ret = wl1271_hw_init(wl);
2400 mutex_unlock(&wl->mutex);
2401 /* Unlocking the mutex in the middle of handling is
2402 inherently unsafe. In this case we deem it safe to do,
2403 because we need to let any possibly pending IRQ out of
2404 the system (and while we are WLCORE_STATE_OFF the IRQ
2405 work function will not do anything.) Also, any other
2406 possible concurrent operations will fail due to the
2407 current state, hence the wl1271 struct should be safe. */
2408 wlcore_disable_interrupts(wl);
2409 wl1271_flush_deferred_work(wl);
2410 cancel_work_sync(&wl->netstack_work);
2411 mutex_lock(&wl->mutex);
2413 wl1271_power_off(wl);
2417 wl1271_error("firmware boot failed despite %d retries",
2418 WL1271_BOOT_RETRIES);
2422 wl1271_info("firmware booted (%s)", wl->chip.fw_ver_str);
2424 /* update hw/fw version info in wiphy struct */
2425 wiphy->hw_version = wl->chip.id;
2426 strscpy(wiphy->fw_version, wl->chip.fw_ver_str,
2427 sizeof(wiphy->fw_version));
2430 * Now we know if 11a is supported (info from the NVS), so disable
2431 * 11a channels if not supported
2433 if (!wl->enable_11a)
2434 wiphy->bands[NL80211_BAND_5GHZ]->n_channels = 0;
2436 wl1271_debug(DEBUG_MAC80211, "11a is %ssupported",
2437 wl->enable_11a ? "" : "not ");
2439 wl->state = WLCORE_STATE_ON;
2444 static bool wl12xx_dev_role_started(struct wl12xx_vif *wlvif)
2446 return wlvif->dev_hlid != WL12XX_INVALID_LINK_ID;
2450 * Check whether a fw switch (i.e. moving from one loaded
2451 * fw to another) is needed. This function is also responsible
2452 * for updating wl->last_vif_count, so it must be called before
2453 * loading a non-plt fw (so the correct fw (single-role/multi-role)
2456 static bool wl12xx_need_fw_change(struct wl1271 *wl,
2457 struct vif_counter_data vif_counter_data,
2460 enum wl12xx_fw_type current_fw = wl->fw_type;
2461 u8 vif_count = vif_counter_data.counter;
2463 if (test_bit(WL1271_FLAG_VIF_CHANGE_IN_PROGRESS, &wl->flags))
2466 /* increase the vif count if this is a new vif */
2467 if (add && !vif_counter_data.cur_vif_running)
2470 wl->last_vif_count = vif_count;
2472 /* no need for fw change if the device is OFF */
2473 if (wl->state == WLCORE_STATE_OFF)
2476 /* no need for fw change if a single fw is used */
2477 if (!wl->mr_fw_name)
2480 if (vif_count > 1 && current_fw == WL12XX_FW_TYPE_NORMAL)
2482 if (vif_count <= 1 && current_fw == WL12XX_FW_TYPE_MULTI)
2489 * Enter "forced psm". Make sure the sta is in psm against the ap,
2490 * to make the fw switch a bit more disconnection-persistent.
2492 static void wl12xx_force_active_psm(struct wl1271 *wl)
2494 struct wl12xx_vif *wlvif;
2496 wl12xx_for_each_wlvif_sta(wl, wlvif) {
2497 wl1271_ps_set_mode(wl, wlvif, STATION_POWER_SAVE_MODE);
2501 struct wlcore_hw_queue_iter_data {
2502 unsigned long hw_queue_map[BITS_TO_LONGS(WLCORE_NUM_MAC_ADDRESSES)];
2504 struct ieee80211_vif *vif;
2505 /* is the current vif among those iterated */
2509 static void wlcore_hw_queue_iter(void *data, u8 *mac,
2510 struct ieee80211_vif *vif)
2512 struct wlcore_hw_queue_iter_data *iter_data = data;
2514 if (vif->type == NL80211_IFTYPE_P2P_DEVICE ||
2515 WARN_ON_ONCE(vif->hw_queue[0] == IEEE80211_INVAL_HW_QUEUE))
2518 if (iter_data->cur_running || vif == iter_data->vif) {
2519 iter_data->cur_running = true;
2523 __set_bit(vif->hw_queue[0] / NUM_TX_QUEUES, iter_data->hw_queue_map);
2526 static int wlcore_allocate_hw_queue_base(struct wl1271 *wl,
2527 struct wl12xx_vif *wlvif)
2529 struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
2530 struct wlcore_hw_queue_iter_data iter_data = {};
2533 if (vif->type == NL80211_IFTYPE_P2P_DEVICE) {
2534 vif->cab_queue = IEEE80211_INVAL_HW_QUEUE;
2538 iter_data.vif = vif;
2540 /* mark all bits taken by active interfaces */
2541 ieee80211_iterate_active_interfaces_atomic(wl->hw,
2542 IEEE80211_IFACE_ITER_RESUME_ALL,
2543 wlcore_hw_queue_iter, &iter_data);
2545 /* the current vif is already running in mac80211 (resume/recovery) */
2546 if (iter_data.cur_running) {
2547 wlvif->hw_queue_base = vif->hw_queue[0];
2548 wl1271_debug(DEBUG_MAC80211,
2549 "using pre-allocated hw queue base %d",
2550 wlvif->hw_queue_base);
2552 /* interface type might have changed type */
2553 goto adjust_cab_queue;
2556 q_base = find_first_zero_bit(iter_data.hw_queue_map,
2557 WLCORE_NUM_MAC_ADDRESSES);
2558 if (q_base >= WLCORE_NUM_MAC_ADDRESSES)
2561 wlvif->hw_queue_base = q_base * NUM_TX_QUEUES;
2562 wl1271_debug(DEBUG_MAC80211, "allocating hw queue base: %d",
2563 wlvif->hw_queue_base);
2565 for (i = 0; i < NUM_TX_QUEUES; i++) {
2566 wl->queue_stop_reasons[wlvif->hw_queue_base + i] = 0;
2567 /* register hw queues in mac80211 */
2568 vif->hw_queue[i] = wlvif->hw_queue_base + i;
2572 /* the last places are reserved for cab queues per interface */
2573 if (wlvif->bss_type == BSS_TYPE_AP_BSS)
2574 vif->cab_queue = NUM_TX_QUEUES * WLCORE_NUM_MAC_ADDRESSES +
2575 wlvif->hw_queue_base / NUM_TX_QUEUES;
2577 vif->cab_queue = IEEE80211_INVAL_HW_QUEUE;
2582 static int wl1271_op_add_interface(struct ieee80211_hw *hw,
2583 struct ieee80211_vif *vif)
2585 struct wl1271 *wl = hw->priv;
2586 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
2587 struct vif_counter_data vif_count;
2592 wl1271_error("Adding Interface not allowed while in PLT mode");
2596 vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER |
2597 IEEE80211_VIF_SUPPORTS_UAPSD |
2598 IEEE80211_VIF_SUPPORTS_CQM_RSSI;
2600 wl1271_debug(DEBUG_MAC80211, "mac80211 add interface type %d mac %pM",
2601 ieee80211_vif_type_p2p(vif), vif->addr);
2603 wl12xx_get_vif_count(hw, vif, &vif_count);
2605 mutex_lock(&wl->mutex);
2608 * in some very corner case HW recovery scenarios its possible to
2609 * get here before __wl1271_op_remove_interface is complete, so
2610 * opt out if that is the case.
2612 if (test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags) ||
2613 test_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags)) {
2619 ret = wl12xx_init_vif_data(wl, vif);
2624 role_type = wl12xx_get_role_type(wl, wlvif);
2625 if (role_type == WL12XX_INVALID_ROLE_TYPE) {
2630 ret = wlcore_allocate_hw_queue_base(wl, wlvif);
2635 * TODO: after the nvs issue will be solved, move this block
2636 * to start(), and make sure here the driver is ON.
2638 if (wl->state == WLCORE_STATE_OFF) {
2640 * we still need this in order to configure the fw
2641 * while uploading the nvs
2643 memcpy(wl->addresses[0].addr, vif->addr, ETH_ALEN);
2645 ret = wl12xx_init_fw(wl);
2651 * Call runtime PM only after possible wl12xx_init_fw() above
2652 * is done. Otherwise we do not have interrupts enabled.
2654 ret = pm_runtime_resume_and_get(wl->dev);
2658 if (wl12xx_need_fw_change(wl, vif_count, true)) {
2659 wl12xx_force_active_psm(wl);
2660 set_bit(WL1271_FLAG_INTENDED_FW_RECOVERY, &wl->flags);
2661 mutex_unlock(&wl->mutex);
2662 wl1271_recovery_work(&wl->recovery_work);
2666 if (!wlcore_is_p2p_mgmt(wlvif)) {
2667 ret = wl12xx_cmd_role_enable(wl, vif->addr,
2668 role_type, &wlvif->role_id);
2672 ret = wl1271_init_vif_specific(wl, vif);
2677 ret = wl12xx_cmd_role_enable(wl, vif->addr, WL1271_ROLE_DEVICE,
2678 &wlvif->dev_role_id);
2682 /* needed mainly for configuring rate policies */
2683 ret = wl1271_sta_hw_init(wl, wlvif);
2688 list_add(&wlvif->list, &wl->wlvif_list);
2689 set_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags);
2691 if (wlvif->bss_type == BSS_TYPE_AP_BSS)
2696 pm_runtime_mark_last_busy(wl->dev);
2697 pm_runtime_put_autosuspend(wl->dev);
2699 mutex_unlock(&wl->mutex);
2704 static void __wl1271_op_remove_interface(struct wl1271 *wl,
2705 struct ieee80211_vif *vif,
2706 bool reset_tx_queues)
2708 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
2710 bool is_ap = (wlvif->bss_type == BSS_TYPE_AP_BSS);
2712 wl1271_debug(DEBUG_MAC80211, "mac80211 remove interface");
2714 if (!test_and_clear_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags))
2717 /* because of hardware recovery, we may get here twice */
2718 if (wl->state == WLCORE_STATE_OFF)
2721 wl1271_info("down");
2723 if (wl->scan.state != WL1271_SCAN_STATE_IDLE &&
2724 wl->scan_wlvif == wlvif) {
2725 struct cfg80211_scan_info info = {
2730 * Rearm the tx watchdog just before idling scan. This
2731 * prevents just-finished scans from triggering the watchdog
2733 wl12xx_rearm_tx_watchdog_locked(wl);
2735 wl->scan.state = WL1271_SCAN_STATE_IDLE;
2736 memset(wl->scan.scanned_ch, 0, sizeof(wl->scan.scanned_ch));
2737 wl->scan_wlvif = NULL;
2738 wl->scan.req = NULL;
2739 ieee80211_scan_completed(wl->hw, &info);
2742 if (wl->sched_vif == wlvif)
2743 wl->sched_vif = NULL;
2745 if (wl->roc_vif == vif) {
2747 ieee80211_remain_on_channel_expired(wl->hw);
2750 if (!test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags)) {
2751 /* disable active roles */
2752 ret = pm_runtime_resume_and_get(wl->dev);
2756 if (wlvif->bss_type == BSS_TYPE_STA_BSS ||
2757 wlvif->bss_type == BSS_TYPE_IBSS) {
2758 if (wl12xx_dev_role_started(wlvif))
2759 wl12xx_stop_dev(wl, wlvif);
2762 if (!wlcore_is_p2p_mgmt(wlvif)) {
2763 ret = wl12xx_cmd_role_disable(wl, &wlvif->role_id);
2765 pm_runtime_put_noidle(wl->dev);
2769 ret = wl12xx_cmd_role_disable(wl, &wlvif->dev_role_id);
2771 pm_runtime_put_noidle(wl->dev);
2776 pm_runtime_mark_last_busy(wl->dev);
2777 pm_runtime_put_autosuspend(wl->dev);
2780 wl12xx_tx_reset_wlvif(wl, wlvif);
2782 /* clear all hlids (except system_hlid) */
2783 wlvif->dev_hlid = WL12XX_INVALID_LINK_ID;
2785 if (wlvif->bss_type == BSS_TYPE_STA_BSS ||
2786 wlvif->bss_type == BSS_TYPE_IBSS) {
2787 wlvif->sta.hlid = WL12XX_INVALID_LINK_ID;
2788 wl12xx_free_rate_policy(wl, &wlvif->sta.basic_rate_idx);
2789 wl12xx_free_rate_policy(wl, &wlvif->sta.ap_rate_idx);
2790 wl12xx_free_rate_policy(wl, &wlvif->sta.p2p_rate_idx);
2791 wlcore_free_klv_template(wl, &wlvif->sta.klv_template_id);
2793 wlvif->ap.bcast_hlid = WL12XX_INVALID_LINK_ID;
2794 wlvif->ap.global_hlid = WL12XX_INVALID_LINK_ID;
2795 wl12xx_free_rate_policy(wl, &wlvif->ap.mgmt_rate_idx);
2796 wl12xx_free_rate_policy(wl, &wlvif->ap.bcast_rate_idx);
2797 for (i = 0; i < CONF_TX_MAX_AC_COUNT; i++)
2798 wl12xx_free_rate_policy(wl,
2799 &wlvif->ap.ucast_rate_idx[i]);
2800 wl1271_free_ap_keys(wl, wlvif);
2803 dev_kfree_skb(wlvif->probereq);
2804 wlvif->probereq = NULL;
2805 if (wl->last_wlvif == wlvif)
2806 wl->last_wlvif = NULL;
2807 list_del(&wlvif->list);
2808 memset(wlvif->ap.sta_hlid_map, 0, sizeof(wlvif->ap.sta_hlid_map));
2809 wlvif->role_id = WL12XX_INVALID_ROLE_ID;
2810 wlvif->dev_role_id = WL12XX_INVALID_ROLE_ID;
2818 * Last AP, have more stations. Configure sleep auth according to STA.
2819 * Don't do thin on unintended recovery.
2821 if (test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags) &&
2822 !test_bit(WL1271_FLAG_INTENDED_FW_RECOVERY, &wl->flags))
2825 if (wl->ap_count == 0 && is_ap) {
2826 /* mask ap events */
2827 wl->event_mask &= ~wl->ap_event_mask;
2828 wl1271_event_unmask(wl);
2831 if (wl->ap_count == 0 && is_ap && wl->sta_count) {
2832 u8 sta_auth = wl->conf.conn.sta_sleep_auth;
2833 /* Configure for power according to debugfs */
2834 if (sta_auth != WL1271_PSM_ILLEGAL)
2835 wl1271_acx_sleep_auth(wl, sta_auth);
2836 /* Configure for ELP power saving */
2838 wl1271_acx_sleep_auth(wl, WL1271_PSM_ELP);
2842 mutex_unlock(&wl->mutex);
2844 del_timer_sync(&wlvif->rx_streaming_timer);
2845 cancel_work_sync(&wlvif->rx_streaming_enable_work);
2846 cancel_work_sync(&wlvif->rx_streaming_disable_work);
2847 cancel_work_sync(&wlvif->rc_update_work);
2848 cancel_delayed_work_sync(&wlvif->connection_loss_work);
2849 cancel_delayed_work_sync(&wlvif->channel_switch_work);
2850 cancel_delayed_work_sync(&wlvif->pending_auth_complete_work);
2852 mutex_lock(&wl->mutex);
2855 static void wl1271_op_remove_interface(struct ieee80211_hw *hw,
2856 struct ieee80211_vif *vif)
2858 struct wl1271 *wl = hw->priv;
2859 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
2860 struct wl12xx_vif *iter;
2861 struct vif_counter_data vif_count;
2863 wl12xx_get_vif_count(hw, vif, &vif_count);
2864 mutex_lock(&wl->mutex);
2866 if (wl->state == WLCORE_STATE_OFF ||
2867 !test_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags))
2871 * wl->vif can be null here if someone shuts down the interface
2872 * just when hardware recovery has been started.
2874 wl12xx_for_each_wlvif(wl, iter) {
2878 __wl1271_op_remove_interface(wl, vif, true);
2881 WARN_ON(iter != wlvif);
2882 if (wl12xx_need_fw_change(wl, vif_count, false)) {
2883 wl12xx_force_active_psm(wl);
2884 set_bit(WL1271_FLAG_INTENDED_FW_RECOVERY, &wl->flags);
2885 wl12xx_queue_recovery_work(wl);
2888 mutex_unlock(&wl->mutex);
2891 static int wl12xx_op_change_interface(struct ieee80211_hw *hw,
2892 struct ieee80211_vif *vif,
2893 enum nl80211_iftype new_type, bool p2p)
2895 struct wl1271 *wl = hw->priv;
2898 set_bit(WL1271_FLAG_VIF_CHANGE_IN_PROGRESS, &wl->flags);
2899 wl1271_op_remove_interface(hw, vif);
2901 vif->type = new_type;
2903 ret = wl1271_op_add_interface(hw, vif);
2905 clear_bit(WL1271_FLAG_VIF_CHANGE_IN_PROGRESS, &wl->flags);
2909 static int wlcore_join(struct wl1271 *wl, struct wl12xx_vif *wlvif)
2912 bool is_ibss = (wlvif->bss_type == BSS_TYPE_IBSS);
2915 * One of the side effects of the JOIN command is that is clears
2916 * WPA/WPA2 keys from the chipset. Performing a JOIN while associated
2917 * to a WPA/WPA2 access point will therefore kill the data-path.
2918 * Currently the only valid scenario for JOIN during association
2919 * is on roaming, in which case we will also be given new keys.
2920 * Keep the below message for now, unless it starts bothering
2921 * users who really like to roam a lot :)
2923 if (test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags))
2924 wl1271_info("JOIN while associated.");
2926 /* clear encryption type */
2927 wlvif->encryption_type = KEY_NONE;
2930 ret = wl12xx_cmd_role_start_ibss(wl, wlvif);
2932 ret = wl12xx_cmd_role_start_sta(wl, wlvif);
2937 static int wl1271_ssid_set(struct wl12xx_vif *wlvif, struct sk_buff *skb,
2941 const u8 *ptr = cfg80211_find_ie(WLAN_EID_SSID, skb->data + offset,
2945 wl1271_error("No SSID in IEs!");
2950 if (ssid_len > IEEE80211_MAX_SSID_LEN) {
2951 wl1271_error("SSID is too long!");
2955 wlvif->ssid_len = ssid_len;
2956 memcpy(wlvif->ssid, ptr+2, ssid_len);
2960 static int wlcore_set_ssid(struct wl1271 *wl, struct wl12xx_vif *wlvif)
2962 struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
2963 struct sk_buff *skb;
2966 /* we currently only support setting the ssid from the ap probe req */
2967 if (wlvif->bss_type != BSS_TYPE_STA_BSS)
2970 skb = ieee80211_ap_probereq_get(wl->hw, vif);
2974 ieoffset = offsetof(struct ieee80211_mgmt,
2975 u.probe_req.variable);
2976 wl1271_ssid_set(wlvif, skb, ieoffset);
2982 static int wlcore_set_assoc(struct wl1271 *wl, struct wl12xx_vif *wlvif,
2983 struct ieee80211_bss_conf *bss_conf,
2986 struct ieee80211_vif *vif = container_of(bss_conf, struct ieee80211_vif,
2991 wlvif->aid = vif->cfg.aid;
2992 wlvif->channel_type = cfg80211_get_chandef_type(&bss_conf->chanreq.oper);
2993 wlvif->beacon_int = bss_conf->beacon_int;
2994 wlvif->wmm_enabled = bss_conf->qos;
2996 set_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags);
2999 * with wl1271, we don't need to update the
3000 * beacon_int and dtim_period, because the firmware
3001 * updates it by itself when the first beacon is
3002 * received after a join.
3004 ret = wl1271_cmd_build_ps_poll(wl, wlvif, wlvif->aid);
3009 * Get a template for hardware connection maintenance
3011 dev_kfree_skb(wlvif->probereq);
3012 wlvif->probereq = wl1271_cmd_build_ap_probe_req(wl,
3015 ieoffset = offsetof(struct ieee80211_mgmt,
3016 u.probe_req.variable);
3017 wl1271_ssid_set(wlvif, wlvif->probereq, ieoffset);
3019 /* enable the connection monitoring feature */
3020 ret = wl1271_acx_conn_monit_params(wl, wlvif, true);
3025 * The join command disable the keep-alive mode, shut down its process,
3026 * and also clear the template config, so we need to reset it all after
3027 * the join. The acx_aid starts the keep-alive process, and the order
3028 * of the commands below is relevant.
3030 ret = wl1271_acx_keep_alive_mode(wl, wlvif, true);
3034 ret = wl1271_acx_aid(wl, wlvif, wlvif->aid);
3038 ret = wl12xx_cmd_build_klv_null_data(wl, wlvif);
3042 ret = wl1271_acx_keep_alive_config(wl, wlvif,
3043 wlvif->sta.klv_template_id,
3044 ACX_KEEP_ALIVE_TPL_VALID);
3049 * The default fw psm configuration is AUTO, while mac80211 default
3050 * setting is off (ACTIVE), so sync the fw with the correct value.
3052 ret = wl1271_ps_set_mode(wl, wlvif, STATION_ACTIVE_MODE);
3058 wl1271_tx_enabled_rates_get(wl,
3061 ret = wl1271_acx_sta_rate_policies(wl, wlvif);
3069 static int wlcore_unset_assoc(struct wl1271 *wl, struct wl12xx_vif *wlvif)
3072 bool sta = wlvif->bss_type == BSS_TYPE_STA_BSS;
3074 /* make sure we are connected (sta) joined */
3076 !test_and_clear_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags))
3079 /* make sure we are joined (ibss) */
3081 test_and_clear_bit(WLVIF_FLAG_IBSS_JOINED, &wlvif->flags))
3085 /* use defaults when not associated */
3088 /* free probe-request template */
3089 dev_kfree_skb(wlvif->probereq);
3090 wlvif->probereq = NULL;
3092 /* disable connection monitor features */
3093 ret = wl1271_acx_conn_monit_params(wl, wlvif, false);
3097 /* Disable the keep-alive feature */
3098 ret = wl1271_acx_keep_alive_mode(wl, wlvif, false);
3102 /* disable beacon filtering */
3103 ret = wl1271_acx_beacon_filter_opt(wl, wlvif, false);
3108 if (test_and_clear_bit(WLVIF_FLAG_CS_PROGRESS, &wlvif->flags)) {
3109 struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
3111 wl12xx_cmd_stop_channel_switch(wl, wlvif);
3112 ieee80211_chswitch_done(vif, false, 0);
3113 cancel_delayed_work(&wlvif->channel_switch_work);
3116 /* invalidate keep-alive template */
3117 wl1271_acx_keep_alive_config(wl, wlvif,
3118 wlvif->sta.klv_template_id,
3119 ACX_KEEP_ALIVE_TPL_INVALID);
3124 static void wl1271_set_band_rate(struct wl1271 *wl, struct wl12xx_vif *wlvif)
3126 wlvif->basic_rate_set = wlvif->bitrate_masks[wlvif->band];
3127 wlvif->rate_set = wlvif->basic_rate_set;
3130 static void wl1271_sta_handle_idle(struct wl1271 *wl, struct wl12xx_vif *wlvif,
3133 bool cur_idle = !test_bit(WLVIF_FLAG_ACTIVE, &wlvif->flags);
3135 if (idle == cur_idle)
3139 clear_bit(WLVIF_FLAG_ACTIVE, &wlvif->flags);
3141 /* The current firmware only supports sched_scan in idle */
3142 if (wl->sched_vif == wlvif)
3143 wl->ops->sched_scan_stop(wl, wlvif);
3145 set_bit(WLVIF_FLAG_ACTIVE, &wlvif->flags);
3149 static int wl12xx_config_vif(struct wl1271 *wl, struct wl12xx_vif *wlvif,
3150 struct ieee80211_conf *conf, u32 changed)
3154 if (wlcore_is_p2p_mgmt(wlvif))
3157 if (conf->power_level != wlvif->power_level) {
3158 ret = wl1271_acx_tx_power(wl, wlvif, conf->power_level);
3162 wlvif->power_level = conf->power_level;
3168 static int wl1271_op_config(struct ieee80211_hw *hw, u32 changed)
3170 struct wl1271 *wl = hw->priv;
3171 struct wl12xx_vif *wlvif;
3172 struct ieee80211_conf *conf = &hw->conf;
3175 wl1271_debug(DEBUG_MAC80211, "mac80211 config psm %s power %d %s"
3177 conf->flags & IEEE80211_CONF_PS ? "on" : "off",
3179 conf->flags & IEEE80211_CONF_IDLE ? "idle" : "in use",
3182 mutex_lock(&wl->mutex);
3184 if (changed & IEEE80211_CONF_CHANGE_POWER)
3185 wl->power_level = conf->power_level;
3187 if (unlikely(wl->state != WLCORE_STATE_ON))
3190 ret = pm_runtime_resume_and_get(wl->dev);
3194 /* configure each interface */
3195 wl12xx_for_each_wlvif(wl, wlvif) {
3196 ret = wl12xx_config_vif(wl, wlvif, conf, changed);
3202 pm_runtime_mark_last_busy(wl->dev);
3203 pm_runtime_put_autosuspend(wl->dev);
3206 mutex_unlock(&wl->mutex);
3211 struct wl1271_filter_params {
3214 u8 mc_list[ACX_MC_ADDRESS_GROUP_MAX][ETH_ALEN];
3217 static u64 wl1271_op_prepare_multicast(struct ieee80211_hw *hw,
3218 struct netdev_hw_addr_list *mc_list)
3220 struct wl1271_filter_params *fp;
3221 struct netdev_hw_addr *ha;
3223 fp = kzalloc(sizeof(*fp), GFP_ATOMIC);
3225 wl1271_error("Out of memory setting filters.");
3229 /* update multicast filtering parameters */
3230 fp->mc_list_length = 0;
3231 if (netdev_hw_addr_list_count(mc_list) > ACX_MC_ADDRESS_GROUP_MAX) {
3232 fp->enabled = false;
3235 netdev_hw_addr_list_for_each(ha, mc_list) {
3236 memcpy(fp->mc_list[fp->mc_list_length],
3237 ha->addr, ETH_ALEN);
3238 fp->mc_list_length++;
3242 return (u64)(unsigned long)fp;
3245 #define WL1271_SUPPORTED_FILTERS (FIF_ALLMULTI | \
3247 FIF_BCN_PRBRESP_PROMISC | \
3251 static void wl1271_op_configure_filter(struct ieee80211_hw *hw,
3252 unsigned int changed,
3253 unsigned int *total, u64 multicast)
3255 struct wl1271_filter_params *fp = (void *)(unsigned long)multicast;
3256 struct wl1271 *wl = hw->priv;
3257 struct wl12xx_vif *wlvif;
3261 wl1271_debug(DEBUG_MAC80211, "mac80211 configure filter changed %x"
3262 " total %x", changed, *total);
3264 mutex_lock(&wl->mutex);
3266 *total &= WL1271_SUPPORTED_FILTERS;
3267 changed &= WL1271_SUPPORTED_FILTERS;
3269 if (unlikely(wl->state != WLCORE_STATE_ON))
3272 ret = pm_runtime_resume_and_get(wl->dev);
3276 wl12xx_for_each_wlvif(wl, wlvif) {
3277 if (wlcore_is_p2p_mgmt(wlvif))
3280 if (wlvif->bss_type != BSS_TYPE_AP_BSS) {
3281 if (*total & FIF_ALLMULTI)
3282 ret = wl1271_acx_group_address_tbl(wl, wlvif,
3286 ret = wl1271_acx_group_address_tbl(wl, wlvif,
3289 fp->mc_list_length);
3295 * If interface in AP mode and created with allmulticast then disable
3296 * the firmware filters so that all multicast packets are passed
3297 * This is mandatory for MDNS based discovery protocols
3299 if (wlvif->bss_type == BSS_TYPE_AP_BSS) {
3300 if (*total & FIF_ALLMULTI) {
3301 ret = wl1271_acx_group_address_tbl(wl, wlvif,
3311 * the fw doesn't provide an api to configure the filters. instead,
3312 * the filters configuration is based on the active roles / ROC
3317 pm_runtime_mark_last_busy(wl->dev);
3318 pm_runtime_put_autosuspend(wl->dev);
3321 mutex_unlock(&wl->mutex);
3325 static int wl1271_record_ap_key(struct wl1271 *wl, struct wl12xx_vif *wlvif,
3326 u8 id, u8 key_type, u8 key_size,
3327 const u8 *key, u8 hlid, u32 tx_seq_32,
3328 u16 tx_seq_16, bool is_pairwise)
3330 struct wl1271_ap_key *ap_key;
3333 wl1271_debug(DEBUG_CRYPT, "record ap key id %d", (int)id);
3335 if (key_size > MAX_KEY_SIZE)
3339 * Find next free entry in ap_keys. Also check we are not replacing
3342 for (i = 0; i < MAX_NUM_KEYS; i++) {
3343 if (wlvif->ap.recorded_keys[i] == NULL)
3346 if (wlvif->ap.recorded_keys[i]->id == id) {
3347 wl1271_warning("trying to record key replacement");
3352 if (i == MAX_NUM_KEYS)
3355 ap_key = kzalloc(sizeof(*ap_key), GFP_KERNEL);
3360 ap_key->key_type = key_type;
3361 ap_key->key_size = key_size;
3362 memcpy(ap_key->key, key, key_size);
3363 ap_key->hlid = hlid;
3364 ap_key->tx_seq_32 = tx_seq_32;
3365 ap_key->tx_seq_16 = tx_seq_16;
3366 ap_key->is_pairwise = is_pairwise;
3368 wlvif->ap.recorded_keys[i] = ap_key;
3372 static void wl1271_free_ap_keys(struct wl1271 *wl, struct wl12xx_vif *wlvif)
3376 for (i = 0; i < MAX_NUM_KEYS; i++) {
3377 kfree(wlvif->ap.recorded_keys[i]);
3378 wlvif->ap.recorded_keys[i] = NULL;
3382 static int wl1271_ap_init_hwenc(struct wl1271 *wl, struct wl12xx_vif *wlvif)
3385 struct wl1271_ap_key *key;
3386 bool wep_key_added = false;
3388 for (i = 0; i < MAX_NUM_KEYS; i++) {
3390 if (wlvif->ap.recorded_keys[i] == NULL)
3393 key = wlvif->ap.recorded_keys[i];
3395 if (hlid == WL12XX_INVALID_LINK_ID)
3396 hlid = wlvif->ap.bcast_hlid;
3398 ret = wl1271_cmd_set_ap_key(wl, wlvif, KEY_ADD_OR_REPLACE,
3399 key->id, key->key_type,
3400 key->key_size, key->key,
3401 hlid, key->tx_seq_32,
3402 key->tx_seq_16, key->is_pairwise);
3406 if (key->key_type == KEY_WEP)
3407 wep_key_added = true;
3410 if (wep_key_added) {
3411 ret = wl12xx_cmd_set_default_wep_key(wl, wlvif->default_key,
3412 wlvif->ap.bcast_hlid);
3418 wl1271_free_ap_keys(wl, wlvif);
3422 static int wl1271_set_key(struct wl1271 *wl, struct wl12xx_vif *wlvif,
3423 u16 action, u8 id, u8 key_type,
3424 u8 key_size, const u8 *key, u32 tx_seq_32,
3425 u16 tx_seq_16, struct ieee80211_sta *sta,
3429 bool is_ap = (wlvif->bss_type == BSS_TYPE_AP_BSS);
3432 struct wl1271_station *wl_sta;
3436 wl_sta = (struct wl1271_station *)sta->drv_priv;
3437 hlid = wl_sta->hlid;
3439 hlid = wlvif->ap.bcast_hlid;
3442 if (!test_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags)) {
3444 * We do not support removing keys after AP shutdown.
3445 * Pretend we do to make mac80211 happy.
3447 if (action != KEY_ADD_OR_REPLACE)
3450 ret = wl1271_record_ap_key(wl, wlvif, id,
3452 key, hlid, tx_seq_32,
3453 tx_seq_16, is_pairwise);
3455 ret = wl1271_cmd_set_ap_key(wl, wlvif, action,
3456 id, key_type, key_size,
3457 key, hlid, tx_seq_32,
3458 tx_seq_16, is_pairwise);
3465 static const u8 bcast_addr[ETH_ALEN] = {
3466 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
3469 addr = sta ? sta->addr : bcast_addr;
3471 if (is_zero_ether_addr(addr)) {
3472 /* We dont support TX only encryption */
3476 /* The wl1271 does not allow to remove unicast keys - they
3477 will be cleared automatically on next CMD_JOIN. Ignore the
3478 request silently, as we dont want the mac80211 to emit
3479 an error message. */
3480 if (action == KEY_REMOVE && !is_broadcast_ether_addr(addr))
3483 /* don't remove key if hlid was already deleted */
3484 if (action == KEY_REMOVE &&
3485 wlvif->sta.hlid == WL12XX_INVALID_LINK_ID)
3488 ret = wl1271_cmd_set_sta_key(wl, wlvif, action,
3489 id, key_type, key_size,
3490 key, addr, tx_seq_32,
3500 static int wlcore_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
3501 struct ieee80211_vif *vif,
3502 struct ieee80211_sta *sta,
3503 struct ieee80211_key_conf *key_conf)
3505 struct wl1271 *wl = hw->priv;
3507 bool might_change_spare =
3508 key_conf->cipher == WL1271_CIPHER_SUITE_GEM ||
3509 key_conf->cipher == WLAN_CIPHER_SUITE_TKIP;
3511 if (might_change_spare) {
3513 * stop the queues and flush to ensure the next packets are
3514 * in sync with FW spare block accounting
3516 wlcore_stop_queues(wl, WLCORE_QUEUE_STOP_REASON_SPARE_BLK);
3517 wl1271_tx_flush(wl);
3520 mutex_lock(&wl->mutex);
3522 if (unlikely(wl->state != WLCORE_STATE_ON)) {
3524 goto out_wake_queues;
3527 ret = pm_runtime_resume_and_get(wl->dev);
3529 goto out_wake_queues;
3531 ret = wlcore_hw_set_key(wl, cmd, vif, sta, key_conf);
3533 pm_runtime_mark_last_busy(wl->dev);
3534 pm_runtime_put_autosuspend(wl->dev);
3537 if (might_change_spare)
3538 wlcore_wake_queues(wl, WLCORE_QUEUE_STOP_REASON_SPARE_BLK);
3540 mutex_unlock(&wl->mutex);
3545 int wlcore_set_key(struct wl1271 *wl, enum set_key_cmd cmd,
3546 struct ieee80211_vif *vif,
3547 struct ieee80211_sta *sta,
3548 struct ieee80211_key_conf *key_conf)
3550 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
3558 wl1271_debug(DEBUG_MAC80211, "mac80211 set key");
3560 wl1271_debug(DEBUG_CRYPT, "CMD: 0x%x sta: %p", cmd, sta);
3561 wl1271_debug(DEBUG_CRYPT, "Key: algo:0x%x, id:%d, len:%d flags 0x%x",
3562 key_conf->cipher, key_conf->keyidx,
3563 key_conf->keylen, key_conf->flags);
3564 wl1271_dump(DEBUG_CRYPT, "KEY: ", key_conf->key, key_conf->keylen);
3566 if (wlvif->bss_type == BSS_TYPE_AP_BSS)
3568 struct wl1271_station *wl_sta = (void *)sta->drv_priv;
3569 hlid = wl_sta->hlid;
3571 hlid = wlvif->ap.bcast_hlid;
3574 hlid = wlvif->sta.hlid;
3576 if (hlid != WL12XX_INVALID_LINK_ID) {
3577 u64 tx_seq = wl->links[hlid].total_freed_pkts;
3578 tx_seq_32 = WL1271_TX_SECURITY_HI32(tx_seq);
3579 tx_seq_16 = WL1271_TX_SECURITY_LO16(tx_seq);
3582 switch (key_conf->cipher) {
3583 case WLAN_CIPHER_SUITE_WEP40:
3584 case WLAN_CIPHER_SUITE_WEP104:
3587 key_conf->hw_key_idx = key_conf->keyidx;
3589 case WLAN_CIPHER_SUITE_TKIP:
3590 key_type = KEY_TKIP;
3591 key_conf->hw_key_idx = key_conf->keyidx;
3593 case WLAN_CIPHER_SUITE_CCMP:
3595 key_conf->flags |= IEEE80211_KEY_FLAG_PUT_IV_SPACE;
3597 case WL1271_CIPHER_SUITE_GEM:
3601 wl1271_error("Unknown key algo 0x%x", key_conf->cipher);
3606 is_pairwise = key_conf->flags & IEEE80211_KEY_FLAG_PAIRWISE;
3610 ret = wl1271_set_key(wl, wlvif, KEY_ADD_OR_REPLACE,
3611 key_conf->keyidx, key_type,
3612 key_conf->keylen, key_conf->key,
3613 tx_seq_32, tx_seq_16, sta, is_pairwise);
3615 wl1271_error("Could not add or replace key");
3619 /* Store AP encryption key type */
3620 if (wlvif->bss_type == BSS_TYPE_AP_BSS)
3621 wlvif->encryption_type = key_type;
3624 * reconfiguring arp response if the unicast (or common)
3625 * encryption key type was changed
3627 if (wlvif->bss_type == BSS_TYPE_STA_BSS &&
3628 (sta || key_type == KEY_WEP) &&
3629 wlvif->encryption_type != key_type) {
3630 wlvif->encryption_type = key_type;
3631 ret = wl1271_cmd_build_arp_rsp(wl, wlvif);
3633 wl1271_warning("build arp rsp failed: %d", ret);
3640 ret = wl1271_set_key(wl, wlvif, KEY_REMOVE,
3641 key_conf->keyidx, key_type,
3642 key_conf->keylen, key_conf->key,
3643 0, 0, sta, is_pairwise);
3645 wl1271_error("Could not remove key");
3651 wl1271_error("Unsupported key cmd 0x%x", cmd);
3657 EXPORT_SYMBOL_GPL(wlcore_set_key);
3659 static void wl1271_op_set_default_key_idx(struct ieee80211_hw *hw,
3660 struct ieee80211_vif *vif,
3663 struct wl1271 *wl = hw->priv;
3664 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
3667 wl1271_debug(DEBUG_MAC80211, "mac80211 set default key idx %d",
3670 /* we don't handle unsetting of default key */
3674 mutex_lock(&wl->mutex);
3676 if (unlikely(wl->state != WLCORE_STATE_ON)) {
3681 ret = pm_runtime_resume_and_get(wl->dev);
3685 wlvif->default_key = key_idx;
3687 /* the default WEP key needs to be configured at least once */
3688 if (wlvif->encryption_type == KEY_WEP) {
3689 ret = wl12xx_cmd_set_default_wep_key(wl,
3697 pm_runtime_mark_last_busy(wl->dev);
3698 pm_runtime_put_autosuspend(wl->dev);
3701 mutex_unlock(&wl->mutex);
3704 void wlcore_regdomain_config(struct wl1271 *wl)
3708 if (!(wl->quirks & WLCORE_QUIRK_REGDOMAIN_CONF))
3711 mutex_lock(&wl->mutex);
3713 if (unlikely(wl->state != WLCORE_STATE_ON))
3716 ret = pm_runtime_resume_and_get(wl->dev);
3720 ret = wlcore_cmd_regdomain_config_locked(wl);
3722 wl12xx_queue_recovery_work(wl);
3726 pm_runtime_mark_last_busy(wl->dev);
3727 pm_runtime_put_autosuspend(wl->dev);
3729 mutex_unlock(&wl->mutex);
3732 static int wl1271_op_hw_scan(struct ieee80211_hw *hw,
3733 struct ieee80211_vif *vif,
3734 struct ieee80211_scan_request *hw_req)
3736 struct cfg80211_scan_request *req = &hw_req->req;
3737 struct wl1271 *wl = hw->priv;
3742 wl1271_debug(DEBUG_MAC80211, "mac80211 hw scan");
3745 ssid = req->ssids[0].ssid;
3746 len = req->ssids[0].ssid_len;
3749 mutex_lock(&wl->mutex);
3751 if (unlikely(wl->state != WLCORE_STATE_ON)) {
3753 * We cannot return -EBUSY here because cfg80211 will expect
3754 * a call to ieee80211_scan_completed if we do - in this case
3755 * there won't be any call.
3761 ret = pm_runtime_resume_and_get(wl->dev);
3765 /* fail if there is any role in ROC */
3766 if (find_first_bit(wl->roc_map, WL12XX_MAX_ROLES) < WL12XX_MAX_ROLES) {
3767 /* don't allow scanning right now */
3772 ret = wlcore_scan(hw->priv, vif, ssid, len, req);
3774 pm_runtime_mark_last_busy(wl->dev);
3775 pm_runtime_put_autosuspend(wl->dev);
3777 mutex_unlock(&wl->mutex);
3782 static void wl1271_op_cancel_hw_scan(struct ieee80211_hw *hw,
3783 struct ieee80211_vif *vif)
3785 struct wl1271 *wl = hw->priv;
3786 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
3787 struct cfg80211_scan_info info = {
3792 wl1271_debug(DEBUG_MAC80211, "mac80211 cancel hw scan");
3794 mutex_lock(&wl->mutex);
3796 if (unlikely(wl->state != WLCORE_STATE_ON))
3799 if (wl->scan.state == WL1271_SCAN_STATE_IDLE)
3802 ret = pm_runtime_resume_and_get(wl->dev);
3806 if (wl->scan.state != WL1271_SCAN_STATE_DONE) {
3807 ret = wl->ops->scan_stop(wl, wlvif);
3813 * Rearm the tx watchdog just before idling scan. This
3814 * prevents just-finished scans from triggering the watchdog
3816 wl12xx_rearm_tx_watchdog_locked(wl);
3818 wl->scan.state = WL1271_SCAN_STATE_IDLE;
3819 memset(wl->scan.scanned_ch, 0, sizeof(wl->scan.scanned_ch));
3820 wl->scan_wlvif = NULL;
3821 wl->scan.req = NULL;
3822 ieee80211_scan_completed(wl->hw, &info);
3825 pm_runtime_mark_last_busy(wl->dev);
3826 pm_runtime_put_autosuspend(wl->dev);
3828 mutex_unlock(&wl->mutex);
3830 cancel_delayed_work_sync(&wl->scan_complete_work);
3833 static int wl1271_op_sched_scan_start(struct ieee80211_hw *hw,
3834 struct ieee80211_vif *vif,
3835 struct cfg80211_sched_scan_request *req,
3836 struct ieee80211_scan_ies *ies)
3838 struct wl1271 *wl = hw->priv;
3839 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
3842 wl1271_debug(DEBUG_MAC80211, "wl1271_op_sched_scan_start");
3844 mutex_lock(&wl->mutex);
3846 if (unlikely(wl->state != WLCORE_STATE_ON)) {
3851 ret = pm_runtime_resume_and_get(wl->dev);
3855 ret = wl->ops->sched_scan_start(wl, wlvif, req, ies);
3859 wl->sched_vif = wlvif;
3862 pm_runtime_mark_last_busy(wl->dev);
3863 pm_runtime_put_autosuspend(wl->dev);
3865 mutex_unlock(&wl->mutex);
3869 static int wl1271_op_sched_scan_stop(struct ieee80211_hw *hw,
3870 struct ieee80211_vif *vif)
3872 struct wl1271 *wl = hw->priv;
3873 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
3876 wl1271_debug(DEBUG_MAC80211, "wl1271_op_sched_scan_stop");
3878 mutex_lock(&wl->mutex);
3880 if (unlikely(wl->state != WLCORE_STATE_ON))
3883 ret = pm_runtime_resume_and_get(wl->dev);
3887 wl->ops->sched_scan_stop(wl, wlvif);
3889 pm_runtime_mark_last_busy(wl->dev);
3890 pm_runtime_put_autosuspend(wl->dev);
3892 mutex_unlock(&wl->mutex);
3897 static int wl1271_op_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
3899 struct wl1271 *wl = hw->priv;
3902 mutex_lock(&wl->mutex);
3904 if (unlikely(wl->state != WLCORE_STATE_ON)) {
3909 ret = pm_runtime_resume_and_get(wl->dev);
3913 ret = wl1271_acx_frag_threshold(wl, value);
3915 wl1271_warning("wl1271_op_set_frag_threshold failed: %d", ret);
3917 pm_runtime_mark_last_busy(wl->dev);
3918 pm_runtime_put_autosuspend(wl->dev);
3921 mutex_unlock(&wl->mutex);
3926 static int wl1271_op_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
3928 struct wl1271 *wl = hw->priv;
3929 struct wl12xx_vif *wlvif;
3932 mutex_lock(&wl->mutex);
3934 if (unlikely(wl->state != WLCORE_STATE_ON)) {
3939 ret = pm_runtime_resume_and_get(wl->dev);
3943 wl12xx_for_each_wlvif(wl, wlvif) {
3944 ret = wl1271_acx_rts_threshold(wl, wlvif, value);
3946 wl1271_warning("set rts threshold failed: %d", ret);
3948 pm_runtime_mark_last_busy(wl->dev);
3949 pm_runtime_put_autosuspend(wl->dev);
3952 mutex_unlock(&wl->mutex);
3957 static void wl12xx_remove_ie(struct sk_buff *skb, u8 eid, int ieoffset)
3960 const u8 *next, *end = skb->data + skb->len;
3961 u8 *ie = (u8 *)cfg80211_find_ie(eid, skb->data + ieoffset,
3962 skb->len - ieoffset);
3967 memmove(ie, next, end - next);
3968 skb_trim(skb, skb->len - len);
3971 static void wl12xx_remove_vendor_ie(struct sk_buff *skb,
3972 unsigned int oui, u8 oui_type,
3976 const u8 *next, *end = skb->data + skb->len;
3977 u8 *ie = (u8 *)cfg80211_find_vendor_ie(oui, oui_type,
3978 skb->data + ieoffset,
3979 skb->len - ieoffset);
3984 memmove(ie, next, end - next);
3985 skb_trim(skb, skb->len - len);
3988 static int wl1271_ap_set_probe_resp_tmpl(struct wl1271 *wl, u32 rates,
3989 struct ieee80211_vif *vif)
3991 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
3992 struct sk_buff *skb;
3995 skb = ieee80211_proberesp_get(wl->hw, vif);
3999 ret = wl1271_cmd_template_set(wl, wlvif->role_id,
4000 CMD_TEMPL_AP_PROBE_RESPONSE,
4009 wl1271_debug(DEBUG_AP, "probe response updated");
4010 set_bit(WLVIF_FLAG_AP_PROBE_RESP_SET, &wlvif->flags);
4016 static int wl1271_ap_set_probe_resp_tmpl_legacy(struct wl1271 *wl,
4017 struct ieee80211_vif *vif,
4019 size_t probe_rsp_len,
4022 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
4023 u8 probe_rsp_templ[WL1271_CMD_TEMPL_MAX_SIZE];
4024 int ssid_ie_offset, ie_offset, templ_len;
4027 /* no need to change probe response if the SSID is set correctly */
4028 if (wlvif->ssid_len > 0)
4029 return wl1271_cmd_template_set(wl, wlvif->role_id,
4030 CMD_TEMPL_AP_PROBE_RESPONSE,
4035 if (probe_rsp_len + vif->cfg.ssid_len > WL1271_CMD_TEMPL_MAX_SIZE) {
4036 wl1271_error("probe_rsp template too big");
4040 /* start searching from IE offset */
4041 ie_offset = offsetof(struct ieee80211_mgmt, u.probe_resp.variable);
4043 ptr = cfg80211_find_ie(WLAN_EID_SSID, probe_rsp_data + ie_offset,
4044 probe_rsp_len - ie_offset);
4046 wl1271_error("No SSID in beacon!");
4050 ssid_ie_offset = ptr - probe_rsp_data;
4051 ptr += (ptr[1] + 2);
4053 memcpy(probe_rsp_templ, probe_rsp_data, ssid_ie_offset);
4055 /* insert SSID from bss_conf */
4056 probe_rsp_templ[ssid_ie_offset] = WLAN_EID_SSID;
4057 probe_rsp_templ[ssid_ie_offset + 1] = vif->cfg.ssid_len;
4058 memcpy(probe_rsp_templ + ssid_ie_offset + 2,
4059 vif->cfg.ssid, vif->cfg.ssid_len);
4060 templ_len = ssid_ie_offset + 2 + vif->cfg.ssid_len;
4062 memcpy(probe_rsp_templ + ssid_ie_offset + 2 + vif->cfg.ssid_len,
4063 ptr, probe_rsp_len - (ptr - probe_rsp_data));
4064 templ_len += probe_rsp_len - (ptr - probe_rsp_data);
4066 return wl1271_cmd_template_set(wl, wlvif->role_id,
4067 CMD_TEMPL_AP_PROBE_RESPONSE,
4073 static int wl1271_bss_erp_info_changed(struct wl1271 *wl,
4074 struct ieee80211_vif *vif,
4075 struct ieee80211_bss_conf *bss_conf,
4078 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
4081 if (changed & BSS_CHANGED_ERP_SLOT) {
4082 if (bss_conf->use_short_slot)
4083 ret = wl1271_acx_slot(wl, wlvif, SLOT_TIME_SHORT);
4085 ret = wl1271_acx_slot(wl, wlvif, SLOT_TIME_LONG);
4087 wl1271_warning("Set slot time failed %d", ret);
4092 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
4093 if (bss_conf->use_short_preamble)
4094 wl1271_acx_set_preamble(wl, wlvif, ACX_PREAMBLE_SHORT);
4096 wl1271_acx_set_preamble(wl, wlvif, ACX_PREAMBLE_LONG);
4099 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
4100 if (bss_conf->use_cts_prot)
4101 ret = wl1271_acx_cts_protect(wl, wlvif,
4104 ret = wl1271_acx_cts_protect(wl, wlvif,
4105 CTSPROTECT_DISABLE);
4107 wl1271_warning("Set ctsprotect failed %d", ret);
4116 static int wlcore_set_beacon_template(struct wl1271 *wl,
4117 struct ieee80211_vif *vif,
4120 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
4121 struct ieee80211_hdr *hdr;
4124 int ieoffset = offsetof(struct ieee80211_mgmt, u.beacon.variable);
4125 struct sk_buff *beacon = ieee80211_beacon_get(wl->hw, vif, 0);
4133 wl1271_debug(DEBUG_MASTER, "beacon updated");
4135 ret = wl1271_ssid_set(wlvif, beacon, ieoffset);
4137 dev_kfree_skb(beacon);
4140 min_rate = wl1271_tx_min_rate_get(wl, wlvif->basic_rate_set);
4141 tmpl_id = is_ap ? CMD_TEMPL_AP_BEACON :
4143 ret = wl1271_cmd_template_set(wl, wlvif->role_id, tmpl_id,
4148 dev_kfree_skb(beacon);
4152 wlvif->wmm_enabled =
4153 cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
4154 WLAN_OUI_TYPE_MICROSOFT_WMM,
4155 beacon->data + ieoffset,
4156 beacon->len - ieoffset);
4159 * In case we already have a probe-resp beacon set explicitly
4160 * by usermode, don't use the beacon data.
4162 if (test_bit(WLVIF_FLAG_AP_PROBE_RESP_SET, &wlvif->flags))
4165 /* remove TIM ie from probe response */
4166 wl12xx_remove_ie(beacon, WLAN_EID_TIM, ieoffset);
4169 * remove p2p ie from probe response.
4170 * the fw reponds to probe requests that don't include
4171 * the p2p ie. probe requests with p2p ie will be passed,
4172 * and will be responded by the supplicant (the spec
4173 * forbids including the p2p ie when responding to probe
4174 * requests that didn't include it).
4176 wl12xx_remove_vendor_ie(beacon, WLAN_OUI_WFA,
4177 WLAN_OUI_TYPE_WFA_P2P, ieoffset);
4179 hdr = (struct ieee80211_hdr *) beacon->data;
4180 hdr->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
4181 IEEE80211_STYPE_PROBE_RESP);
4183 ret = wl1271_ap_set_probe_resp_tmpl_legacy(wl, vif,
4188 ret = wl1271_cmd_template_set(wl, wlvif->role_id,
4189 CMD_TEMPL_PROBE_RESPONSE,
4194 dev_kfree_skb(beacon);
4202 static int wl1271_bss_beacon_info_changed(struct wl1271 *wl,
4203 struct ieee80211_vif *vif,
4204 struct ieee80211_bss_conf *bss_conf,
4207 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
4208 bool is_ap = (wlvif->bss_type == BSS_TYPE_AP_BSS);
4211 if (changed & BSS_CHANGED_BEACON_INT) {
4212 wl1271_debug(DEBUG_MASTER, "beacon interval updated: %d",
4213 bss_conf->beacon_int);
4215 wlvif->beacon_int = bss_conf->beacon_int;
4218 if ((changed & BSS_CHANGED_AP_PROBE_RESP) && is_ap) {
4219 u32 rate = wl1271_tx_min_rate_get(wl, wlvif->basic_rate_set);
4221 wl1271_ap_set_probe_resp_tmpl(wl, rate, vif);
4224 if (changed & BSS_CHANGED_BEACON) {
4225 ret = wlcore_set_beacon_template(wl, vif, is_ap);
4229 if (test_and_clear_bit(WLVIF_FLAG_BEACON_DISABLED,
4231 ret = wlcore_hw_dfs_master_restart(wl, wlvif);
4238 wl1271_error("beacon info change failed: %d", ret);
4242 /* AP mode changes */
4243 static void wl1271_bss_info_changed_ap(struct wl1271 *wl,
4244 struct ieee80211_vif *vif,
4245 struct ieee80211_bss_conf *bss_conf,
4248 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
4251 if (changed & BSS_CHANGED_BASIC_RATES) {
4252 u32 rates = bss_conf->basic_rates;
4254 wlvif->basic_rate_set = wl1271_tx_enabled_rates_get(wl, rates,
4256 wlvif->basic_rate = wl1271_tx_min_rate_get(wl,
4257 wlvif->basic_rate_set);
4259 ret = wl1271_init_ap_rates(wl, wlvif);
4261 wl1271_error("AP rate policy change failed %d", ret);
4265 ret = wl1271_ap_init_templates(wl, vif);
4269 /* No need to set probe resp template for mesh */
4270 if (!ieee80211_vif_is_mesh(vif)) {
4271 ret = wl1271_ap_set_probe_resp_tmpl(wl,
4278 ret = wlcore_set_beacon_template(wl, vif, true);
4283 ret = wl1271_bss_beacon_info_changed(wl, vif, bss_conf, changed);
4287 if (changed & BSS_CHANGED_BEACON_ENABLED) {
4288 if (bss_conf->enable_beacon) {
4289 if (!test_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags)) {
4290 ret = wl12xx_cmd_role_start_ap(wl, wlvif);
4294 ret = wl1271_ap_init_hwenc(wl, wlvif);
4298 set_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags);
4299 wl1271_debug(DEBUG_AP, "started AP");
4302 if (test_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags)) {
4304 * AP might be in ROC in case we have just
4305 * sent auth reply. handle it.
4307 if (test_bit(wlvif->role_id, wl->roc_map))
4308 wl12xx_croc(wl, wlvif->role_id);
4310 ret = wl12xx_cmd_role_stop_ap(wl, wlvif);
4314 clear_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags);
4315 clear_bit(WLVIF_FLAG_AP_PROBE_RESP_SET,
4317 wl1271_debug(DEBUG_AP, "stopped AP");
4322 ret = wl1271_bss_erp_info_changed(wl, vif, bss_conf, changed);
4326 /* Handle HT information change */
4327 if ((changed & BSS_CHANGED_HT) &&
4328 (bss_conf->chanreq.oper.width != NL80211_CHAN_WIDTH_20_NOHT)) {
4329 ret = wl1271_acx_set_ht_information(wl, wlvif,
4330 bss_conf->ht_operation_mode);
4332 wl1271_warning("Set ht information failed %d", ret);
4341 static int wlcore_set_bssid(struct wl1271 *wl, struct wl12xx_vif *wlvif,
4342 struct ieee80211_vif *vif, u32 sta_rate_set)
4344 struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
4348 wl1271_debug(DEBUG_MAC80211,
4349 "changed_bssid: %pM, aid: %d, bcn_int: %d, brates: 0x%x sta_rate_set: 0x%x",
4350 bss_conf->bssid, vif->cfg.aid,
4351 bss_conf->beacon_int,
4352 bss_conf->basic_rates, sta_rate_set);
4354 wlvif->beacon_int = bss_conf->beacon_int;
4355 rates = bss_conf->basic_rates;
4356 wlvif->basic_rate_set =
4357 wl1271_tx_enabled_rates_get(wl, rates,
4360 wl1271_tx_min_rate_get(wl,
4361 wlvif->basic_rate_set);
4365 wl1271_tx_enabled_rates_get(wl,
4369 /* we only support sched_scan while not connected */
4370 if (wl->sched_vif == wlvif)
4371 wl->ops->sched_scan_stop(wl, wlvif);
4373 ret = wl1271_acx_sta_rate_policies(wl, wlvif);
4377 ret = wl12xx_cmd_build_null_data(wl, wlvif);
4381 ret = wl1271_build_qos_null_data(wl, wl12xx_wlvif_to_vif(wlvif));
4385 wlcore_set_ssid(wl, wlvif);
4387 set_bit(WLVIF_FLAG_IN_USE, &wlvif->flags);
4392 static int wlcore_clear_bssid(struct wl1271 *wl, struct wl12xx_vif *wlvif)
4396 /* revert back to minimum rates for the current band */
4397 wl1271_set_band_rate(wl, wlvif);
4398 wlvif->basic_rate = wl1271_tx_min_rate_get(wl, wlvif->basic_rate_set);
4400 ret = wl1271_acx_sta_rate_policies(wl, wlvif);
4404 if (wlvif->bss_type == BSS_TYPE_STA_BSS &&
4405 test_bit(WLVIF_FLAG_IN_USE, &wlvif->flags)) {
4406 ret = wl12xx_cmd_role_stop_sta(wl, wlvif);
4411 clear_bit(WLVIF_FLAG_IN_USE, &wlvif->flags);
4414 /* STA/IBSS mode changes */
4415 static void wl1271_bss_info_changed_sta(struct wl1271 *wl,
4416 struct ieee80211_vif *vif,
4417 struct ieee80211_bss_conf *bss_conf,
4420 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
4421 bool do_join = false;
4422 bool is_ibss = (wlvif->bss_type == BSS_TYPE_IBSS);
4423 bool ibss_joined = false;
4424 u32 sta_rate_set = 0;
4426 struct ieee80211_sta *sta;
4427 bool sta_exists = false;
4428 struct ieee80211_sta_ht_cap sta_ht_cap;
4431 ret = wl1271_bss_beacon_info_changed(wl, vif, bss_conf,
4437 if (changed & BSS_CHANGED_IBSS) {
4438 if (vif->cfg.ibss_joined) {
4439 set_bit(WLVIF_FLAG_IBSS_JOINED, &wlvif->flags);
4442 wlcore_unset_assoc(wl, wlvif);
4443 wl12xx_cmd_role_stop_sta(wl, wlvif);
4447 if ((changed & BSS_CHANGED_BEACON_INT) && ibss_joined)
4450 /* Need to update the SSID (for filtering etc) */
4451 if ((changed & BSS_CHANGED_BEACON) && ibss_joined)
4454 if ((changed & BSS_CHANGED_BEACON_ENABLED) && ibss_joined) {
4455 wl1271_debug(DEBUG_ADHOC, "ad-hoc beaconing: %s",
4456 bss_conf->enable_beacon ? "enabled" : "disabled");
4461 if (changed & BSS_CHANGED_IDLE && !is_ibss)
4462 wl1271_sta_handle_idle(wl, wlvif, vif->cfg.idle);
4464 if (changed & BSS_CHANGED_CQM) {
4465 bool enable = false;
4466 if (bss_conf->cqm_rssi_thold)
4468 ret = wl1271_acx_rssi_snr_trigger(wl, wlvif, enable,
4469 bss_conf->cqm_rssi_thold,
4470 bss_conf->cqm_rssi_hyst);
4473 wlvif->rssi_thold = bss_conf->cqm_rssi_thold;
4476 if (changed & (BSS_CHANGED_BSSID | BSS_CHANGED_HT |
4477 BSS_CHANGED_ASSOC)) {
4479 sta = ieee80211_find_sta(vif, bss_conf->bssid);
4481 u8 *rx_mask = sta->deflink.ht_cap.mcs.rx_mask;
4483 /* save the supp_rates of the ap */
4484 sta_rate_set = sta->deflink.supp_rates[wlvif->band];
4485 if (sta->deflink.ht_cap.ht_supported)
4487 (rx_mask[0] << HW_HT_RATES_OFFSET) |
4488 (rx_mask[1] << HW_MIMO_RATES_OFFSET);
4489 sta_ht_cap = sta->deflink.ht_cap;
4496 if (changed & BSS_CHANGED_BSSID) {
4497 if (!is_zero_ether_addr(bss_conf->bssid)) {
4498 ret = wlcore_set_bssid(wl, wlvif, vif,
4503 /* Need to update the BSSID (for filtering etc) */
4506 ret = wlcore_clear_bssid(wl, wlvif);
4512 if (changed & BSS_CHANGED_IBSS) {
4513 wl1271_debug(DEBUG_ADHOC, "ibss_joined: %d",
4514 vif->cfg.ibss_joined);
4516 if (vif->cfg.ibss_joined) {
4517 u32 rates = bss_conf->basic_rates;
4518 wlvif->basic_rate_set =
4519 wl1271_tx_enabled_rates_get(wl, rates,
4522 wl1271_tx_min_rate_get(wl,
4523 wlvif->basic_rate_set);
4525 /* by default, use 11b + OFDM rates */
4526 wlvif->rate_set = CONF_TX_IBSS_DEFAULT_RATES;
4527 ret = wl1271_acx_sta_rate_policies(wl, wlvif);
4533 if ((changed & BSS_CHANGED_BEACON_INFO) && bss_conf->dtim_period) {
4534 /* enable beacon filtering */
4535 ret = wl1271_acx_beacon_filter_opt(wl, wlvif, true);
4540 ret = wl1271_bss_erp_info_changed(wl, vif, bss_conf, changed);
4545 ret = wlcore_join(wl, wlvif);
4547 wl1271_warning("cmd join failed %d", ret);
4552 if (changed & BSS_CHANGED_ASSOC) {
4553 if (vif->cfg.assoc) {
4554 ret = wlcore_set_assoc(wl, wlvif, bss_conf,
4559 if (test_bit(WLVIF_FLAG_STA_AUTHORIZED, &wlvif->flags))
4560 wl12xx_set_authorized(wl, wlvif);
4562 wlcore_unset_assoc(wl, wlvif);
4566 if (changed & BSS_CHANGED_PS) {
4568 test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags) &&
4569 !test_bit(WLVIF_FLAG_IN_PS, &wlvif->flags)) {
4573 if (wl->conf.conn.forced_ps) {
4574 ps_mode = STATION_POWER_SAVE_MODE;
4575 ps_mode_str = "forced";
4577 ps_mode = STATION_AUTO_PS_MODE;
4578 ps_mode_str = "auto";
4581 wl1271_debug(DEBUG_PSM, "%s ps enabled", ps_mode_str);
4583 ret = wl1271_ps_set_mode(wl, wlvif, ps_mode);
4585 wl1271_warning("enter %s ps failed %d",
4587 } else if (!vif->cfg.ps &&
4588 test_bit(WLVIF_FLAG_IN_PS, &wlvif->flags)) {
4589 wl1271_debug(DEBUG_PSM, "auto ps disabled");
4591 ret = wl1271_ps_set_mode(wl, wlvif,
4592 STATION_ACTIVE_MODE);
4594 wl1271_warning("exit auto ps failed %d", ret);
4598 /* Handle new association with HT. Do this after join. */
4601 bss_conf->chanreq.oper.width != NL80211_CHAN_WIDTH_20_NOHT;
4603 ret = wlcore_hw_set_peer_cap(wl,
4609 wl1271_warning("Set ht cap failed %d", ret);
4615 ret = wl1271_acx_set_ht_information(wl, wlvif,
4616 bss_conf->ht_operation_mode);
4618 wl1271_warning("Set ht information failed %d",
4625 /* Handle arp filtering. Done after join. */
4626 if ((changed & BSS_CHANGED_ARP_FILTER) ||
4627 (!is_ibss && (changed & BSS_CHANGED_QOS))) {
4628 __be32 addr = vif->cfg.arp_addr_list[0];
4629 wlvif->sta.qos = bss_conf->qos;
4630 WARN_ON(wlvif->bss_type != BSS_TYPE_STA_BSS);
4632 if (vif->cfg.arp_addr_cnt == 1 && vif->cfg.assoc) {
4633 wlvif->ip_addr = addr;
4635 * The template should have been configured only upon
4636 * association. however, it seems that the correct ip
4637 * isn't being set (when sending), so we have to
4638 * reconfigure the template upon every ip change.
4640 ret = wl1271_cmd_build_arp_rsp(wl, wlvif);
4642 wl1271_warning("build arp rsp failed: %d", ret);
4646 ret = wl1271_acx_arp_ip_filter(wl, wlvif,
4647 (ACX_ARP_FILTER_ARP_FILTERING |
4648 ACX_ARP_FILTER_AUTO_ARP),
4652 ret = wl1271_acx_arp_ip_filter(wl, wlvif, 0, addr);
4663 static void wl1271_op_bss_info_changed(struct ieee80211_hw *hw,
4664 struct ieee80211_vif *vif,
4665 struct ieee80211_bss_conf *bss_conf,
4668 struct wl1271 *wl = hw->priv;
4669 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
4670 bool is_ap = (wlvif->bss_type == BSS_TYPE_AP_BSS);
4673 wl1271_debug(DEBUG_MAC80211, "mac80211 bss info role %d changed 0x%x",
4674 wlvif->role_id, (int)changed);
4677 * make sure to cancel pending disconnections if our association
4680 if (!is_ap && (changed & BSS_CHANGED_ASSOC))
4681 cancel_delayed_work_sync(&wlvif->connection_loss_work);
4683 if (is_ap && (changed & BSS_CHANGED_BEACON_ENABLED) &&
4684 !bss_conf->enable_beacon)
4685 wl1271_tx_flush(wl);
4687 mutex_lock(&wl->mutex);
4689 if (unlikely(wl->state != WLCORE_STATE_ON))
4692 if (unlikely(!test_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags)))
4695 ret = pm_runtime_resume_and_get(wl->dev);
4699 if ((changed & BSS_CHANGED_TXPOWER) &&
4700 bss_conf->txpower != wlvif->power_level) {
4702 ret = wl1271_acx_tx_power(wl, wlvif, bss_conf->txpower);
4706 wlvif->power_level = bss_conf->txpower;
4710 wl1271_bss_info_changed_ap(wl, vif, bss_conf, changed);
4712 wl1271_bss_info_changed_sta(wl, vif, bss_conf, changed);
4714 pm_runtime_mark_last_busy(wl->dev);
4715 pm_runtime_put_autosuspend(wl->dev);
4718 mutex_unlock(&wl->mutex);
4721 static int wlcore_op_add_chanctx(struct ieee80211_hw *hw,
4722 struct ieee80211_chanctx_conf *ctx)
4724 wl1271_debug(DEBUG_MAC80211, "mac80211 add chanctx %d (type %d)",
4725 ieee80211_frequency_to_channel(ctx->def.chan->center_freq),
4726 cfg80211_get_chandef_type(&ctx->def));
4730 static void wlcore_op_remove_chanctx(struct ieee80211_hw *hw,
4731 struct ieee80211_chanctx_conf *ctx)
4733 wl1271_debug(DEBUG_MAC80211, "mac80211 remove chanctx %d (type %d)",
4734 ieee80211_frequency_to_channel(ctx->def.chan->center_freq),
4735 cfg80211_get_chandef_type(&ctx->def));
4738 static void wlcore_op_change_chanctx(struct ieee80211_hw *hw,
4739 struct ieee80211_chanctx_conf *ctx,
4742 struct wl1271 *wl = hw->priv;
4743 struct wl12xx_vif *wlvif;
4745 int channel = ieee80211_frequency_to_channel(
4746 ctx->def.chan->center_freq);
4748 wl1271_debug(DEBUG_MAC80211,
4749 "mac80211 change chanctx %d (type %d) changed 0x%x",
4750 channel, cfg80211_get_chandef_type(&ctx->def), changed);
4752 mutex_lock(&wl->mutex);
4754 ret = pm_runtime_resume_and_get(wl->dev);
4758 wl12xx_for_each_wlvif(wl, wlvif) {
4759 struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
4762 if (rcu_access_pointer(vif->bss_conf.chanctx_conf) != ctx) {
4768 /* start radar if needed */
4769 if (changed & IEEE80211_CHANCTX_CHANGE_RADAR &&
4770 wlvif->bss_type == BSS_TYPE_AP_BSS &&
4771 ctx->radar_enabled && !wlvif->radar_enabled &&
4772 ctx->def.chan->dfs_state == NL80211_DFS_USABLE) {
4773 wl1271_debug(DEBUG_MAC80211, "Start radar detection");
4774 wlcore_hw_set_cac(wl, wlvif, true);
4775 wlvif->radar_enabled = true;
4779 pm_runtime_mark_last_busy(wl->dev);
4780 pm_runtime_put_autosuspend(wl->dev);
4782 mutex_unlock(&wl->mutex);
4785 static int wlcore_op_assign_vif_chanctx(struct ieee80211_hw *hw,
4786 struct ieee80211_vif *vif,
4787 struct ieee80211_bss_conf *link_conf,
4788 struct ieee80211_chanctx_conf *ctx)
4790 struct wl1271 *wl = hw->priv;
4791 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
4792 int channel = ieee80211_frequency_to_channel(
4793 ctx->def.chan->center_freq);
4796 wl1271_debug(DEBUG_MAC80211,
4797 "mac80211 assign chanctx (role %d) %d (type %d) (radar %d dfs_state %d)",
4798 wlvif->role_id, channel,
4799 cfg80211_get_chandef_type(&ctx->def),
4800 ctx->radar_enabled, ctx->def.chan->dfs_state);
4802 mutex_lock(&wl->mutex);
4804 if (unlikely(wl->state != WLCORE_STATE_ON))
4807 if (unlikely(!test_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags)))
4810 ret = pm_runtime_resume_and_get(wl->dev);
4814 wlvif->band = ctx->def.chan->band;
4815 wlvif->channel = channel;
4816 wlvif->channel_type = cfg80211_get_chandef_type(&ctx->def);
4818 /* update default rates according to the band */
4819 wl1271_set_band_rate(wl, wlvif);
4821 if (ctx->radar_enabled &&
4822 ctx->def.chan->dfs_state == NL80211_DFS_USABLE) {
4823 wl1271_debug(DEBUG_MAC80211, "Start radar detection");
4824 wlcore_hw_set_cac(wl, wlvif, true);
4825 wlvif->radar_enabled = true;
4828 pm_runtime_mark_last_busy(wl->dev);
4829 pm_runtime_put_autosuspend(wl->dev);
4831 mutex_unlock(&wl->mutex);
4836 static void wlcore_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
4837 struct ieee80211_vif *vif,
4838 struct ieee80211_bss_conf *link_conf,
4839 struct ieee80211_chanctx_conf *ctx)
4841 struct wl1271 *wl = hw->priv;
4842 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
4845 wl1271_debug(DEBUG_MAC80211,
4846 "mac80211 unassign chanctx (role %d) %d (type %d)",
4848 ieee80211_frequency_to_channel(ctx->def.chan->center_freq),
4849 cfg80211_get_chandef_type(&ctx->def));
4851 wl1271_tx_flush(wl);
4853 mutex_lock(&wl->mutex);
4855 if (unlikely(wl->state != WLCORE_STATE_ON))
4858 if (unlikely(!test_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags)))
4861 ret = pm_runtime_resume_and_get(wl->dev);
4865 if (wlvif->radar_enabled) {
4866 wl1271_debug(DEBUG_MAC80211, "Stop radar detection");
4867 wlcore_hw_set_cac(wl, wlvif, false);
4868 wlvif->radar_enabled = false;
4871 pm_runtime_mark_last_busy(wl->dev);
4872 pm_runtime_put_autosuspend(wl->dev);
4874 mutex_unlock(&wl->mutex);
4877 static int __wlcore_switch_vif_chan(struct wl1271 *wl,
4878 struct wl12xx_vif *wlvif,
4879 struct ieee80211_chanctx_conf *new_ctx)
4881 int channel = ieee80211_frequency_to_channel(
4882 new_ctx->def.chan->center_freq);
4884 wl1271_debug(DEBUG_MAC80211,
4885 "switch vif (role %d) %d -> %d chan_type: %d",
4886 wlvif->role_id, wlvif->channel, channel,
4887 cfg80211_get_chandef_type(&new_ctx->def));
4889 if (WARN_ON_ONCE(wlvif->bss_type != BSS_TYPE_AP_BSS))
4892 WARN_ON(!test_bit(WLVIF_FLAG_BEACON_DISABLED, &wlvif->flags));
4894 if (wlvif->radar_enabled) {
4895 wl1271_debug(DEBUG_MAC80211, "Stop radar detection");
4896 wlcore_hw_set_cac(wl, wlvif, false);
4897 wlvif->radar_enabled = false;
4900 wlvif->band = new_ctx->def.chan->band;
4901 wlvif->channel = channel;
4902 wlvif->channel_type = cfg80211_get_chandef_type(&new_ctx->def);
4904 /* start radar if needed */
4905 if (new_ctx->radar_enabled) {
4906 wl1271_debug(DEBUG_MAC80211, "Start radar detection");
4907 wlcore_hw_set_cac(wl, wlvif, true);
4908 wlvif->radar_enabled = true;
4915 wlcore_op_switch_vif_chanctx(struct ieee80211_hw *hw,
4916 struct ieee80211_vif_chanctx_switch *vifs,
4918 enum ieee80211_chanctx_switch_mode mode)
4920 struct wl1271 *wl = hw->priv;
4923 wl1271_debug(DEBUG_MAC80211,
4924 "mac80211 switch chanctx n_vifs %d mode %d",
4927 mutex_lock(&wl->mutex);
4929 ret = pm_runtime_resume_and_get(wl->dev);
4933 for (i = 0; i < n_vifs; i++) {
4934 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vifs[i].vif);
4936 ret = __wlcore_switch_vif_chan(wl, wlvif, vifs[i].new_ctx);
4941 pm_runtime_mark_last_busy(wl->dev);
4942 pm_runtime_put_autosuspend(wl->dev);
4944 mutex_unlock(&wl->mutex);
4949 static int wl1271_op_conf_tx(struct ieee80211_hw *hw,
4950 struct ieee80211_vif *vif,
4951 unsigned int link_id, u16 queue,
4952 const struct ieee80211_tx_queue_params *params)
4954 struct wl1271 *wl = hw->priv;
4955 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
4959 if (wlcore_is_p2p_mgmt(wlvif))
4962 mutex_lock(&wl->mutex);
4964 wl1271_debug(DEBUG_MAC80211, "mac80211 conf tx %d", queue);
4967 ps_scheme = CONF_PS_SCHEME_UPSD_TRIGGER;
4969 ps_scheme = CONF_PS_SCHEME_LEGACY;
4971 if (!test_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags))
4974 ret = pm_runtime_resume_and_get(wl->dev);
4979 * the txop is confed in units of 32us by the mac80211,
4982 ret = wl1271_acx_ac_cfg(wl, wlvif, wl1271_tx_get_queue(queue),
4983 params->cw_min, params->cw_max,
4984 params->aifs, params->txop << 5);
4988 ret = wl1271_acx_tid_cfg(wl, wlvif, wl1271_tx_get_queue(queue),
4989 CONF_CHANNEL_TYPE_EDCF,
4990 wl1271_tx_get_queue(queue),
4991 ps_scheme, CONF_ACK_POLICY_LEGACY,
4995 pm_runtime_mark_last_busy(wl->dev);
4996 pm_runtime_put_autosuspend(wl->dev);
4999 mutex_unlock(&wl->mutex);
5004 static u64 wl1271_op_get_tsf(struct ieee80211_hw *hw,
5005 struct ieee80211_vif *vif)
5008 struct wl1271 *wl = hw->priv;
5009 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
5010 u64 mactime = ULLONG_MAX;
5013 wl1271_debug(DEBUG_MAC80211, "mac80211 get tsf");
5015 mutex_lock(&wl->mutex);
5017 if (unlikely(wl->state != WLCORE_STATE_ON))
5020 ret = pm_runtime_resume_and_get(wl->dev);
5024 ret = wl12xx_acx_tsf_info(wl, wlvif, &mactime);
5029 pm_runtime_mark_last_busy(wl->dev);
5030 pm_runtime_put_autosuspend(wl->dev);
5033 mutex_unlock(&wl->mutex);
5037 static int wl1271_op_get_survey(struct ieee80211_hw *hw, int idx,
5038 struct survey_info *survey)
5040 struct ieee80211_conf *conf = &hw->conf;
5045 survey->channel = conf->chandef.chan;
5050 static int wl1271_allocate_sta(struct wl1271 *wl,
5051 struct wl12xx_vif *wlvif,
5052 struct ieee80211_sta *sta)
5054 struct wl1271_station *wl_sta;
5058 if (wl->active_sta_count >= wl->max_ap_stations) {
5059 wl1271_warning("could not allocate HLID - too much stations");
5063 wl_sta = (struct wl1271_station *)sta->drv_priv;
5064 ret = wl12xx_allocate_link(wl, wlvif, &wl_sta->hlid);
5066 wl1271_warning("could not allocate HLID - too many links");
5070 /* use the previous security seq, if this is a recovery/resume */
5071 wl->links[wl_sta->hlid].total_freed_pkts = wl_sta->total_freed_pkts;
5073 set_bit(wl_sta->hlid, wlvif->ap.sta_hlid_map);
5074 memcpy(wl->links[wl_sta->hlid].addr, sta->addr, ETH_ALEN);
5075 wl->active_sta_count++;
5079 void wl1271_free_sta(struct wl1271 *wl, struct wl12xx_vif *wlvif, u8 hlid)
5081 if (!test_bit(hlid, wlvif->ap.sta_hlid_map))
5084 clear_bit(hlid, wlvif->ap.sta_hlid_map);
5085 __clear_bit(hlid, &wl->ap_ps_map);
5086 __clear_bit(hlid, &wl->ap_fw_ps_map);
5089 * save the last used PN in the private part of iee80211_sta,
5090 * in case of recovery/suspend
5092 wlcore_save_freed_pkts_addr(wl, wlvif, hlid, wl->links[hlid].addr);
5094 wl12xx_free_link(wl, wlvif, &hlid);
5095 wl->active_sta_count--;
5098 * rearm the tx watchdog when the last STA is freed - give the FW a
5099 * chance to return STA-buffered packets before complaining.
5101 if (wl->active_sta_count == 0)
5102 wl12xx_rearm_tx_watchdog_locked(wl);
5105 static int wl12xx_sta_add(struct wl1271 *wl,
5106 struct wl12xx_vif *wlvif,
5107 struct ieee80211_sta *sta)
5109 struct wl1271_station *wl_sta;
5113 wl1271_debug(DEBUG_MAC80211, "mac80211 add sta %d", (int)sta->aid);
5115 ret = wl1271_allocate_sta(wl, wlvif, sta);
5119 wl_sta = (struct wl1271_station *)sta->drv_priv;
5120 hlid = wl_sta->hlid;
5122 ret = wl12xx_cmd_add_peer(wl, wlvif, sta, hlid);
5124 wl1271_free_sta(wl, wlvif, hlid);
5129 static int wl12xx_sta_remove(struct wl1271 *wl,
5130 struct wl12xx_vif *wlvif,
5131 struct ieee80211_sta *sta)
5133 struct wl1271_station *wl_sta;
5136 wl1271_debug(DEBUG_MAC80211, "mac80211 remove sta %d", (int)sta->aid);
5138 wl_sta = (struct wl1271_station *)sta->drv_priv;
5140 if (WARN_ON(!test_bit(id, wlvif->ap.sta_hlid_map)))
5143 ret = wl12xx_cmd_remove_peer(wl, wlvif, wl_sta->hlid);
5147 wl1271_free_sta(wl, wlvif, wl_sta->hlid);
5151 static void wlcore_roc_if_possible(struct wl1271 *wl,
5152 struct wl12xx_vif *wlvif)
5154 if (find_first_bit(wl->roc_map,
5155 WL12XX_MAX_ROLES) < WL12XX_MAX_ROLES)
5158 if (WARN_ON(wlvif->role_id == WL12XX_INVALID_ROLE_ID))
5161 wl12xx_roc(wl, wlvif, wlvif->role_id, wlvif->band, wlvif->channel);
5165 * when wl_sta is NULL, we treat this call as if coming from a
5166 * pending auth reply.
5167 * wl->mutex must be taken and the FW must be awake when the call
5170 void wlcore_update_inconn_sta(struct wl1271 *wl, struct wl12xx_vif *wlvif,
5171 struct wl1271_station *wl_sta, bool in_conn)
5174 if (WARN_ON(wl_sta && wl_sta->in_connection))
5177 if (!wlvif->ap_pending_auth_reply &&
5178 !wlvif->inconn_count)
5179 wlcore_roc_if_possible(wl, wlvif);
5182 wl_sta->in_connection = true;
5183 wlvif->inconn_count++;
5185 wlvif->ap_pending_auth_reply = true;
5188 if (wl_sta && !wl_sta->in_connection)
5191 if (WARN_ON(!wl_sta && !wlvif->ap_pending_auth_reply))
5194 if (WARN_ON(wl_sta && !wlvif->inconn_count))
5198 wl_sta->in_connection = false;
5199 wlvif->inconn_count--;
5201 wlvif->ap_pending_auth_reply = false;
5204 if (!wlvif->inconn_count && !wlvif->ap_pending_auth_reply &&
5205 test_bit(wlvif->role_id, wl->roc_map))
5206 wl12xx_croc(wl, wlvif->role_id);
5210 static int wl12xx_update_sta_state(struct wl1271 *wl,
5211 struct wl12xx_vif *wlvif,
5212 struct ieee80211_sta *sta,
5213 enum ieee80211_sta_state old_state,
5214 enum ieee80211_sta_state new_state)
5216 struct wl1271_station *wl_sta;
5217 bool is_ap = wlvif->bss_type == BSS_TYPE_AP_BSS;
5218 bool is_sta = wlvif->bss_type == BSS_TYPE_STA_BSS;
5221 wl_sta = (struct wl1271_station *)sta->drv_priv;
5223 /* Add station (AP mode) */
5225 old_state == IEEE80211_STA_AUTH &&
5226 new_state == IEEE80211_STA_ASSOC) {
5227 ret = wl12xx_sta_add(wl, wlvif, sta);
5231 wl_sta->fw_added = true;
5233 wlcore_update_inconn_sta(wl, wlvif, wl_sta, true);
5236 /* Remove station (AP mode) */
5238 old_state == IEEE80211_STA_ASSOC &&
5239 new_state == IEEE80211_STA_AUTH) {
5240 wl_sta->fw_added = false;
5243 wl12xx_sta_remove(wl, wlvif, sta);
5245 wlcore_update_inconn_sta(wl, wlvif, wl_sta, false);
5248 /* Authorize station (AP mode) */
5250 new_state == IEEE80211_STA_AUTHORIZED) {
5251 ret = wl12xx_cmd_set_peer_state(wl, wlvif, wl_sta->hlid);
5255 ret = wl1271_acx_set_ht_capabilities(wl, &sta->deflink.ht_cap,
5261 wlcore_update_inconn_sta(wl, wlvif, wl_sta, false);
5264 /* Authorize station */
5266 new_state == IEEE80211_STA_AUTHORIZED) {
5267 set_bit(WLVIF_FLAG_STA_AUTHORIZED, &wlvif->flags);
5268 ret = wl12xx_set_authorized(wl, wlvif);
5274 old_state == IEEE80211_STA_AUTHORIZED &&
5275 new_state == IEEE80211_STA_ASSOC) {
5276 clear_bit(WLVIF_FLAG_STA_AUTHORIZED, &wlvif->flags);
5277 clear_bit(WLVIF_FLAG_STA_STATE_SENT, &wlvif->flags);
5280 /* save seq number on disassoc (suspend) */
5282 old_state == IEEE80211_STA_ASSOC &&
5283 new_state == IEEE80211_STA_AUTH) {
5284 wlcore_save_freed_pkts(wl, wlvif, wlvif->sta.hlid, sta);
5285 wlvif->total_freed_pkts = 0;
5288 /* restore seq number on assoc (resume) */
5290 old_state == IEEE80211_STA_AUTH &&
5291 new_state == IEEE80211_STA_ASSOC) {
5292 wlvif->total_freed_pkts = wl_sta->total_freed_pkts;
5295 /* clear ROCs on failure or authorization */
5297 (new_state == IEEE80211_STA_AUTHORIZED ||
5298 new_state == IEEE80211_STA_NOTEXIST)) {
5299 if (test_bit(wlvif->role_id, wl->roc_map))
5300 wl12xx_croc(wl, wlvif->role_id);
5304 old_state == IEEE80211_STA_NOTEXIST &&
5305 new_state == IEEE80211_STA_NONE) {
5306 if (find_first_bit(wl->roc_map,
5307 WL12XX_MAX_ROLES) >= WL12XX_MAX_ROLES) {
5308 WARN_ON(wlvif->role_id == WL12XX_INVALID_ROLE_ID);
5309 wl12xx_roc(wl, wlvif, wlvif->role_id,
5310 wlvif->band, wlvif->channel);
5316 static int wl12xx_op_sta_state(struct ieee80211_hw *hw,
5317 struct ieee80211_vif *vif,
5318 struct ieee80211_sta *sta,
5319 enum ieee80211_sta_state old_state,
5320 enum ieee80211_sta_state new_state)
5322 struct wl1271 *wl = hw->priv;
5323 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
5326 wl1271_debug(DEBUG_MAC80211, "mac80211 sta %d state=%d->%d",
5327 sta->aid, old_state, new_state);
5329 mutex_lock(&wl->mutex);
5331 if (unlikely(wl->state != WLCORE_STATE_ON)) {
5336 ret = pm_runtime_resume_and_get(wl->dev);
5340 ret = wl12xx_update_sta_state(wl, wlvif, sta, old_state, new_state);
5342 pm_runtime_mark_last_busy(wl->dev);
5343 pm_runtime_put_autosuspend(wl->dev);
5345 mutex_unlock(&wl->mutex);
5346 if (new_state < old_state)
5351 static int wl1271_op_ampdu_action(struct ieee80211_hw *hw,
5352 struct ieee80211_vif *vif,
5353 struct ieee80211_ampdu_params *params)
5355 struct wl1271 *wl = hw->priv;
5356 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
5358 u8 hlid, *ba_bitmap;
5359 struct ieee80211_sta *sta = params->sta;
5360 enum ieee80211_ampdu_mlme_action action = params->action;
5361 u16 tid = params->tid;
5362 u16 *ssn = ¶ms->ssn;
5364 wl1271_debug(DEBUG_MAC80211, "mac80211 ampdu action %d tid %d", action,
5367 /* sanity check - the fields in FW are only 8bits wide */
5368 if (WARN_ON(tid > 0xFF))
5371 mutex_lock(&wl->mutex);
5373 if (unlikely(wl->state != WLCORE_STATE_ON)) {
5378 if (wlvif->bss_type == BSS_TYPE_STA_BSS) {
5379 hlid = wlvif->sta.hlid;
5380 } else if (wlvif->bss_type == BSS_TYPE_AP_BSS) {
5381 struct wl1271_station *wl_sta;
5383 wl_sta = (struct wl1271_station *)sta->drv_priv;
5384 hlid = wl_sta->hlid;
5390 ba_bitmap = &wl->links[hlid].ba_bitmap;
5392 ret = pm_runtime_resume_and_get(wl->dev);
5396 wl1271_debug(DEBUG_MAC80211, "mac80211 ampdu: Rx tid %d action %d",
5400 case IEEE80211_AMPDU_RX_START:
5401 if (!wlvif->ba_support || !wlvif->ba_allowed) {
5406 if (wl->ba_rx_session_count >= wl->ba_rx_session_count_max) {
5408 wl1271_debug(DEBUG_RX, "exceeded max RX BA sessions");
5412 if (*ba_bitmap & BIT(tid)) {
5414 wl1271_error("cannot enable RX BA session on active "
5419 ret = wl12xx_acx_set_ba_receiver_session(wl, tid, *ssn, true,
5424 *ba_bitmap |= BIT(tid);
5425 wl->ba_rx_session_count++;
5429 case IEEE80211_AMPDU_RX_STOP:
5430 if (!(*ba_bitmap & BIT(tid))) {
5432 * this happens on reconfig - so only output a debug
5433 * message for now, and don't fail the function.
5435 wl1271_debug(DEBUG_MAC80211,
5436 "no active RX BA session on tid: %d",
5442 ret = wl12xx_acx_set_ba_receiver_session(wl, tid, 0, false,
5445 *ba_bitmap &= ~BIT(tid);
5446 wl->ba_rx_session_count--;
5451 * The BA initiator session management in FW independently.
5452 * Falling break here on purpose for all TX APDU commands.
5454 case IEEE80211_AMPDU_TX_START:
5455 case IEEE80211_AMPDU_TX_STOP_CONT:
5456 case IEEE80211_AMPDU_TX_STOP_FLUSH:
5457 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
5458 case IEEE80211_AMPDU_TX_OPERATIONAL:
5463 wl1271_error("Incorrect ampdu action id=%x\n", action);
5467 pm_runtime_mark_last_busy(wl->dev);
5468 pm_runtime_put_autosuspend(wl->dev);
5471 mutex_unlock(&wl->mutex);
5476 static int wl12xx_set_bitrate_mask(struct ieee80211_hw *hw,
5477 struct ieee80211_vif *vif,
5478 const struct cfg80211_bitrate_mask *mask)
5480 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
5481 struct wl1271 *wl = hw->priv;
5484 wl1271_debug(DEBUG_MAC80211, "mac80211 set_bitrate_mask 0x%x 0x%x",
5485 mask->control[NL80211_BAND_2GHZ].legacy,
5486 mask->control[NL80211_BAND_5GHZ].legacy);
5488 mutex_lock(&wl->mutex);
5490 for (i = 0; i < WLCORE_NUM_BANDS; i++)
5491 wlvif->bitrate_masks[i] =
5492 wl1271_tx_enabled_rates_get(wl,
5493 mask->control[i].legacy,
5496 if (unlikely(wl->state != WLCORE_STATE_ON))
5499 if (wlvif->bss_type == BSS_TYPE_STA_BSS &&
5500 !test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags)) {
5502 ret = pm_runtime_resume_and_get(wl->dev);
5506 wl1271_set_band_rate(wl, wlvif);
5508 wl1271_tx_min_rate_get(wl, wlvif->basic_rate_set);
5509 ret = wl1271_acx_sta_rate_policies(wl, wlvif);
5511 pm_runtime_mark_last_busy(wl->dev);
5512 pm_runtime_put_autosuspend(wl->dev);
5515 mutex_unlock(&wl->mutex);
5520 static void wl12xx_op_channel_switch(struct ieee80211_hw *hw,
5521 struct ieee80211_vif *vif,
5522 struct ieee80211_channel_switch *ch_switch)
5524 struct wl1271 *wl = hw->priv;
5525 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
5528 wl1271_debug(DEBUG_MAC80211, "mac80211 channel switch");
5530 wl1271_tx_flush(wl);
5532 mutex_lock(&wl->mutex);
5534 if (unlikely(wl->state == WLCORE_STATE_OFF)) {
5535 if (test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags))
5536 ieee80211_chswitch_done(vif, false, 0);
5538 } else if (unlikely(wl->state != WLCORE_STATE_ON)) {
5542 ret = pm_runtime_resume_and_get(wl->dev);
5546 /* TODO: change mac80211 to pass vif as param */
5548 if (test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags)) {
5549 unsigned long delay_usec;
5551 ret = wl->ops->channel_switch(wl, wlvif, ch_switch);
5555 set_bit(WLVIF_FLAG_CS_PROGRESS, &wlvif->flags);
5557 /* indicate failure 5 seconds after channel switch time */
5558 delay_usec = ieee80211_tu_to_usec(wlvif->beacon_int) *
5560 ieee80211_queue_delayed_work(hw, &wlvif->channel_switch_work,
5561 usecs_to_jiffies(delay_usec) +
5562 msecs_to_jiffies(5000));
5566 pm_runtime_mark_last_busy(wl->dev);
5567 pm_runtime_put_autosuspend(wl->dev);
5570 mutex_unlock(&wl->mutex);
5573 static const void *wlcore_get_beacon_ie(struct wl1271 *wl,
5574 struct wl12xx_vif *wlvif,
5577 int ieoffset = offsetof(struct ieee80211_mgmt, u.beacon.variable);
5578 struct sk_buff *beacon =
5579 ieee80211_beacon_get(wl->hw, wl12xx_wlvif_to_vif(wlvif), 0);
5584 return cfg80211_find_ie(eid,
5585 beacon->data + ieoffset,
5586 beacon->len - ieoffset);
5589 static int wlcore_get_csa_count(struct wl1271 *wl, struct wl12xx_vif *wlvif,
5593 const struct ieee80211_channel_sw_ie *ie_csa;
5595 ie = wlcore_get_beacon_ie(wl, wlvif, WLAN_EID_CHANNEL_SWITCH);
5599 ie_csa = (struct ieee80211_channel_sw_ie *)&ie[2];
5600 *csa_count = ie_csa->count;
5605 static void wlcore_op_channel_switch_beacon(struct ieee80211_hw *hw,
5606 struct ieee80211_vif *vif,
5607 struct cfg80211_chan_def *chandef)
5609 struct wl1271 *wl = hw->priv;
5610 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
5611 struct ieee80211_channel_switch ch_switch = {
5613 .chandef = *chandef,
5617 wl1271_debug(DEBUG_MAC80211,
5618 "mac80211 channel switch beacon (role %d)",
5621 ret = wlcore_get_csa_count(wl, wlvif, &ch_switch.count);
5623 wl1271_error("error getting beacon (for CSA counter)");
5627 mutex_lock(&wl->mutex);
5629 if (unlikely(wl->state != WLCORE_STATE_ON)) {
5634 ret = pm_runtime_resume_and_get(wl->dev);
5638 ret = wl->ops->channel_switch(wl, wlvif, &ch_switch);
5642 set_bit(WLVIF_FLAG_CS_PROGRESS, &wlvif->flags);
5645 pm_runtime_mark_last_busy(wl->dev);
5646 pm_runtime_put_autosuspend(wl->dev);
5648 mutex_unlock(&wl->mutex);
5651 static void wlcore_op_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
5652 u32 queues, bool drop)
5654 struct wl1271 *wl = hw->priv;
5656 wl1271_tx_flush(wl);
5659 static int wlcore_op_remain_on_channel(struct ieee80211_hw *hw,
5660 struct ieee80211_vif *vif,
5661 struct ieee80211_channel *chan,
5663 enum ieee80211_roc_type type)
5665 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
5666 struct wl1271 *wl = hw->priv;
5667 int channel, active_roc, ret = 0;
5669 channel = ieee80211_frequency_to_channel(chan->center_freq);
5671 wl1271_debug(DEBUG_MAC80211, "mac80211 roc %d (%d)",
5672 channel, wlvif->role_id);
5674 mutex_lock(&wl->mutex);
5676 if (unlikely(wl->state != WLCORE_STATE_ON))
5679 /* return EBUSY if we can't ROC right now */
5680 active_roc = find_first_bit(wl->roc_map, WL12XX_MAX_ROLES);
5681 if (wl->roc_vif || active_roc < WL12XX_MAX_ROLES) {
5682 wl1271_warning("active roc on role %d", active_roc);
5687 ret = pm_runtime_resume_and_get(wl->dev);
5691 ret = wl12xx_start_dev(wl, wlvif, chan->band, channel);
5696 ieee80211_queue_delayed_work(hw, &wl->roc_complete_work,
5697 msecs_to_jiffies(duration));
5699 pm_runtime_mark_last_busy(wl->dev);
5700 pm_runtime_put_autosuspend(wl->dev);
5702 mutex_unlock(&wl->mutex);
5706 static int __wlcore_roc_completed(struct wl1271 *wl)
5708 struct wl12xx_vif *wlvif;
5711 /* already completed */
5712 if (unlikely(!wl->roc_vif))
5715 wlvif = wl12xx_vif_to_data(wl->roc_vif);
5717 if (!test_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags))
5720 ret = wl12xx_stop_dev(wl, wlvif);
5729 static int wlcore_roc_completed(struct wl1271 *wl)
5733 wl1271_debug(DEBUG_MAC80211, "roc complete");
5735 mutex_lock(&wl->mutex);
5737 if (unlikely(wl->state != WLCORE_STATE_ON)) {
5742 ret = pm_runtime_resume_and_get(wl->dev);
5746 ret = __wlcore_roc_completed(wl);
5748 pm_runtime_mark_last_busy(wl->dev);
5749 pm_runtime_put_autosuspend(wl->dev);
5751 mutex_unlock(&wl->mutex);
5756 static void wlcore_roc_complete_work(struct work_struct *work)
5758 struct delayed_work *dwork;
5762 dwork = to_delayed_work(work);
5763 wl = container_of(dwork, struct wl1271, roc_complete_work);
5765 ret = wlcore_roc_completed(wl);
5767 ieee80211_remain_on_channel_expired(wl->hw);
5770 static int wlcore_op_cancel_remain_on_channel(struct ieee80211_hw *hw,
5771 struct ieee80211_vif *vif)
5773 struct wl1271 *wl = hw->priv;
5775 wl1271_debug(DEBUG_MAC80211, "mac80211 croc");
5778 wl1271_tx_flush(wl);
5781 * we can't just flush_work here, because it might deadlock
5782 * (as we might get called from the same workqueue)
5784 cancel_delayed_work_sync(&wl->roc_complete_work);
5785 wlcore_roc_completed(wl);
5790 static void wlcore_op_sta_rc_update(struct ieee80211_hw *hw,
5791 struct ieee80211_vif *vif,
5792 struct ieee80211_link_sta *link_sta,
5795 struct ieee80211_sta *sta = link_sta->sta;
5796 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
5798 wl1271_debug(DEBUG_MAC80211, "mac80211 sta_rc_update");
5800 if (!(changed & IEEE80211_RC_BW_CHANGED))
5803 /* this callback is atomic, so schedule a new work */
5804 wlvif->rc_update_bw = sta->deflink.bandwidth;
5805 memcpy(&wlvif->rc_ht_cap, &sta->deflink.ht_cap,
5806 sizeof(sta->deflink.ht_cap));
5807 ieee80211_queue_work(hw, &wlvif->rc_update_work);
5810 static void wlcore_op_sta_statistics(struct ieee80211_hw *hw,
5811 struct ieee80211_vif *vif,
5812 struct ieee80211_sta *sta,
5813 struct station_info *sinfo)
5815 struct wl1271 *wl = hw->priv;
5816 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
5820 wl1271_debug(DEBUG_MAC80211, "mac80211 get_rssi");
5822 mutex_lock(&wl->mutex);
5824 if (unlikely(wl->state != WLCORE_STATE_ON))
5827 ret = pm_runtime_resume_and_get(wl->dev);
5831 ret = wlcore_acx_average_rssi(wl, wlvif, &rssi_dbm);
5835 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
5836 sinfo->signal = rssi_dbm;
5839 pm_runtime_mark_last_busy(wl->dev);
5840 pm_runtime_put_autosuspend(wl->dev);
5843 mutex_unlock(&wl->mutex);
5846 static u32 wlcore_op_get_expected_throughput(struct ieee80211_hw *hw,
5847 struct ieee80211_sta *sta)
5849 struct wl1271_station *wl_sta = (struct wl1271_station *)sta->drv_priv;
5850 struct wl1271 *wl = hw->priv;
5851 u8 hlid = wl_sta->hlid;
5853 /* return in units of Kbps */
5854 return (wl->links[hlid].fw_rate_mbps * 1000);
5857 static bool wl1271_tx_frames_pending(struct ieee80211_hw *hw)
5859 struct wl1271 *wl = hw->priv;
5862 mutex_lock(&wl->mutex);
5864 if (unlikely(wl->state != WLCORE_STATE_ON))
5867 /* packets are considered pending if in the TX queue or the FW */
5868 ret = (wl1271_tx_total_queue_count(wl) > 0) || (wl->tx_frames_cnt > 0);
5870 mutex_unlock(&wl->mutex);
5875 /* can't be const, mac80211 writes to this */
5876 static struct ieee80211_rate wl1271_rates[] = {
5878 .hw_value = CONF_HW_BIT_RATE_1MBPS,
5879 .hw_value_short = CONF_HW_BIT_RATE_1MBPS, },
5881 .hw_value = CONF_HW_BIT_RATE_2MBPS,
5882 .hw_value_short = CONF_HW_BIT_RATE_2MBPS,
5883 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
5885 .hw_value = CONF_HW_BIT_RATE_5_5MBPS,
5886 .hw_value_short = CONF_HW_BIT_RATE_5_5MBPS,
5887 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
5889 .hw_value = CONF_HW_BIT_RATE_11MBPS,
5890 .hw_value_short = CONF_HW_BIT_RATE_11MBPS,
5891 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
5893 .hw_value = CONF_HW_BIT_RATE_6MBPS,
5894 .hw_value_short = CONF_HW_BIT_RATE_6MBPS, },
5896 .hw_value = CONF_HW_BIT_RATE_9MBPS,
5897 .hw_value_short = CONF_HW_BIT_RATE_9MBPS, },
5899 .hw_value = CONF_HW_BIT_RATE_12MBPS,
5900 .hw_value_short = CONF_HW_BIT_RATE_12MBPS, },
5902 .hw_value = CONF_HW_BIT_RATE_18MBPS,
5903 .hw_value_short = CONF_HW_BIT_RATE_18MBPS, },
5905 .hw_value = CONF_HW_BIT_RATE_24MBPS,
5906 .hw_value_short = CONF_HW_BIT_RATE_24MBPS, },
5908 .hw_value = CONF_HW_BIT_RATE_36MBPS,
5909 .hw_value_short = CONF_HW_BIT_RATE_36MBPS, },
5911 .hw_value = CONF_HW_BIT_RATE_48MBPS,
5912 .hw_value_short = CONF_HW_BIT_RATE_48MBPS, },
5914 .hw_value = CONF_HW_BIT_RATE_54MBPS,
5915 .hw_value_short = CONF_HW_BIT_RATE_54MBPS, },
5918 /* can't be const, mac80211 writes to this */
5919 static struct ieee80211_channel wl1271_channels[] = {
5920 { .hw_value = 1, .center_freq = 2412, .max_power = WLCORE_MAX_TXPWR },
5921 { .hw_value = 2, .center_freq = 2417, .max_power = WLCORE_MAX_TXPWR },
5922 { .hw_value = 3, .center_freq = 2422, .max_power = WLCORE_MAX_TXPWR },
5923 { .hw_value = 4, .center_freq = 2427, .max_power = WLCORE_MAX_TXPWR },
5924 { .hw_value = 5, .center_freq = 2432, .max_power = WLCORE_MAX_TXPWR },
5925 { .hw_value = 6, .center_freq = 2437, .max_power = WLCORE_MAX_TXPWR },
5926 { .hw_value = 7, .center_freq = 2442, .max_power = WLCORE_MAX_TXPWR },
5927 { .hw_value = 8, .center_freq = 2447, .max_power = WLCORE_MAX_TXPWR },
5928 { .hw_value = 9, .center_freq = 2452, .max_power = WLCORE_MAX_TXPWR },
5929 { .hw_value = 10, .center_freq = 2457, .max_power = WLCORE_MAX_TXPWR },
5930 { .hw_value = 11, .center_freq = 2462, .max_power = WLCORE_MAX_TXPWR },
5931 { .hw_value = 12, .center_freq = 2467, .max_power = WLCORE_MAX_TXPWR },
5932 { .hw_value = 13, .center_freq = 2472, .max_power = WLCORE_MAX_TXPWR },
5933 { .hw_value = 14, .center_freq = 2484, .max_power = WLCORE_MAX_TXPWR },
5936 /* can't be const, mac80211 writes to this */
5937 static struct ieee80211_supported_band wl1271_band_2ghz = {
5938 .channels = wl1271_channels,
5939 .n_channels = ARRAY_SIZE(wl1271_channels),
5940 .bitrates = wl1271_rates,
5941 .n_bitrates = ARRAY_SIZE(wl1271_rates),
5944 /* 5 GHz data rates for WL1273 */
5945 static struct ieee80211_rate wl1271_rates_5ghz[] = {
5947 .hw_value = CONF_HW_BIT_RATE_6MBPS,
5948 .hw_value_short = CONF_HW_BIT_RATE_6MBPS, },
5950 .hw_value = CONF_HW_BIT_RATE_9MBPS,
5951 .hw_value_short = CONF_HW_BIT_RATE_9MBPS, },
5953 .hw_value = CONF_HW_BIT_RATE_12MBPS,
5954 .hw_value_short = CONF_HW_BIT_RATE_12MBPS, },
5956 .hw_value = CONF_HW_BIT_RATE_18MBPS,
5957 .hw_value_short = CONF_HW_BIT_RATE_18MBPS, },
5959 .hw_value = CONF_HW_BIT_RATE_24MBPS,
5960 .hw_value_short = CONF_HW_BIT_RATE_24MBPS, },
5962 .hw_value = CONF_HW_BIT_RATE_36MBPS,
5963 .hw_value_short = CONF_HW_BIT_RATE_36MBPS, },
5965 .hw_value = CONF_HW_BIT_RATE_48MBPS,
5966 .hw_value_short = CONF_HW_BIT_RATE_48MBPS, },
5968 .hw_value = CONF_HW_BIT_RATE_54MBPS,
5969 .hw_value_short = CONF_HW_BIT_RATE_54MBPS, },
5972 /* 5 GHz band channels for WL1273 */
5973 static struct ieee80211_channel wl1271_channels_5ghz[] = {
5974 { .hw_value = 8, .center_freq = 5040, .max_power = WLCORE_MAX_TXPWR },
5975 { .hw_value = 12, .center_freq = 5060, .max_power = WLCORE_MAX_TXPWR },
5976 { .hw_value = 16, .center_freq = 5080, .max_power = WLCORE_MAX_TXPWR },
5977 { .hw_value = 34, .center_freq = 5170, .max_power = WLCORE_MAX_TXPWR },
5978 { .hw_value = 36, .center_freq = 5180, .max_power = WLCORE_MAX_TXPWR },
5979 { .hw_value = 38, .center_freq = 5190, .max_power = WLCORE_MAX_TXPWR },
5980 { .hw_value = 40, .center_freq = 5200, .max_power = WLCORE_MAX_TXPWR },
5981 { .hw_value = 42, .center_freq = 5210, .max_power = WLCORE_MAX_TXPWR },
5982 { .hw_value = 44, .center_freq = 5220, .max_power = WLCORE_MAX_TXPWR },
5983 { .hw_value = 46, .center_freq = 5230, .max_power = WLCORE_MAX_TXPWR },
5984 { .hw_value = 48, .center_freq = 5240, .max_power = WLCORE_MAX_TXPWR },
5985 { .hw_value = 52, .center_freq = 5260, .max_power = WLCORE_MAX_TXPWR },
5986 { .hw_value = 56, .center_freq = 5280, .max_power = WLCORE_MAX_TXPWR },
5987 { .hw_value = 60, .center_freq = 5300, .max_power = WLCORE_MAX_TXPWR },
5988 { .hw_value = 64, .center_freq = 5320, .max_power = WLCORE_MAX_TXPWR },
5989 { .hw_value = 100, .center_freq = 5500, .max_power = WLCORE_MAX_TXPWR },
5990 { .hw_value = 104, .center_freq = 5520, .max_power = WLCORE_MAX_TXPWR },
5991 { .hw_value = 108, .center_freq = 5540, .max_power = WLCORE_MAX_TXPWR },
5992 { .hw_value = 112, .center_freq = 5560, .max_power = WLCORE_MAX_TXPWR },
5993 { .hw_value = 116, .center_freq = 5580, .max_power = WLCORE_MAX_TXPWR },
5994 { .hw_value = 120, .center_freq = 5600, .max_power = WLCORE_MAX_TXPWR },
5995 { .hw_value = 124, .center_freq = 5620, .max_power = WLCORE_MAX_TXPWR },
5996 { .hw_value = 128, .center_freq = 5640, .max_power = WLCORE_MAX_TXPWR },
5997 { .hw_value = 132, .center_freq = 5660, .max_power = WLCORE_MAX_TXPWR },
5998 { .hw_value = 136, .center_freq = 5680, .max_power = WLCORE_MAX_TXPWR },
5999 { .hw_value = 140, .center_freq = 5700, .max_power = WLCORE_MAX_TXPWR },
6000 { .hw_value = 149, .center_freq = 5745, .max_power = WLCORE_MAX_TXPWR },
6001 { .hw_value = 153, .center_freq = 5765, .max_power = WLCORE_MAX_TXPWR },
6002 { .hw_value = 157, .center_freq = 5785, .max_power = WLCORE_MAX_TXPWR },
6003 { .hw_value = 161, .center_freq = 5805, .max_power = WLCORE_MAX_TXPWR },
6004 { .hw_value = 165, .center_freq = 5825, .max_power = WLCORE_MAX_TXPWR },
6007 static struct ieee80211_supported_band wl1271_band_5ghz = {
6008 .channels = wl1271_channels_5ghz,
6009 .n_channels = ARRAY_SIZE(wl1271_channels_5ghz),
6010 .bitrates = wl1271_rates_5ghz,
6011 .n_bitrates = ARRAY_SIZE(wl1271_rates_5ghz),
6014 static const struct ieee80211_ops wl1271_ops = {
6015 .start = wl1271_op_start,
6016 .stop = wlcore_op_stop,
6017 .add_interface = wl1271_op_add_interface,
6018 .remove_interface = wl1271_op_remove_interface,
6019 .change_interface = wl12xx_op_change_interface,
6021 .suspend = wl1271_op_suspend,
6022 .resume = wl1271_op_resume,
6024 .config = wl1271_op_config,
6025 .prepare_multicast = wl1271_op_prepare_multicast,
6026 .configure_filter = wl1271_op_configure_filter,
6028 .wake_tx_queue = ieee80211_handle_wake_tx_queue,
6029 .set_key = wlcore_op_set_key,
6030 .hw_scan = wl1271_op_hw_scan,
6031 .cancel_hw_scan = wl1271_op_cancel_hw_scan,
6032 .sched_scan_start = wl1271_op_sched_scan_start,
6033 .sched_scan_stop = wl1271_op_sched_scan_stop,
6034 .bss_info_changed = wl1271_op_bss_info_changed,
6035 .set_frag_threshold = wl1271_op_set_frag_threshold,
6036 .set_rts_threshold = wl1271_op_set_rts_threshold,
6037 .conf_tx = wl1271_op_conf_tx,
6038 .get_tsf = wl1271_op_get_tsf,
6039 .get_survey = wl1271_op_get_survey,
6040 .sta_state = wl12xx_op_sta_state,
6041 .ampdu_action = wl1271_op_ampdu_action,
6042 .tx_frames_pending = wl1271_tx_frames_pending,
6043 .set_bitrate_mask = wl12xx_set_bitrate_mask,
6044 .set_default_unicast_key = wl1271_op_set_default_key_idx,
6045 .channel_switch = wl12xx_op_channel_switch,
6046 .channel_switch_beacon = wlcore_op_channel_switch_beacon,
6047 .flush = wlcore_op_flush,
6048 .remain_on_channel = wlcore_op_remain_on_channel,
6049 .cancel_remain_on_channel = wlcore_op_cancel_remain_on_channel,
6050 .add_chanctx = wlcore_op_add_chanctx,
6051 .remove_chanctx = wlcore_op_remove_chanctx,
6052 .change_chanctx = wlcore_op_change_chanctx,
6053 .assign_vif_chanctx = wlcore_op_assign_vif_chanctx,
6054 .unassign_vif_chanctx = wlcore_op_unassign_vif_chanctx,
6055 .switch_vif_chanctx = wlcore_op_switch_vif_chanctx,
6056 .link_sta_rc_update = wlcore_op_sta_rc_update,
6057 .sta_statistics = wlcore_op_sta_statistics,
6058 .get_expected_throughput = wlcore_op_get_expected_throughput,
6059 CFG80211_TESTMODE_CMD(wl1271_tm_cmd)
6063 u8 wlcore_rate_to_idx(struct wl1271 *wl, u8 rate, enum nl80211_band band)
6069 if (unlikely(rate >= wl->hw_tx_rate_tbl_size)) {
6070 wl1271_error("Illegal RX rate from HW: %d", rate);
6074 idx = wl->band_rate_to_idx[band][rate];
6075 if (unlikely(idx == CONF_HW_RXTX_RATE_UNSUPPORTED)) {
6076 wl1271_error("Unsupported RX rate from HW: %d", rate);
6083 static void wl12xx_derive_mac_addresses(struct wl1271 *wl, u32 oui, u32 nic)
6087 wl1271_debug(DEBUG_PROBE, "base address: oui %06x nic %06x",
6090 if (nic + WLCORE_NUM_MAC_ADDRESSES - wl->num_mac_addr > 0xffffff)
6091 wl1271_warning("NIC part of the MAC address wraps around!");
6093 for (i = 0; i < wl->num_mac_addr; i++) {
6094 wl->addresses[i].addr[0] = (u8)(oui >> 16);
6095 wl->addresses[i].addr[1] = (u8)(oui >> 8);
6096 wl->addresses[i].addr[2] = (u8) oui;
6097 wl->addresses[i].addr[3] = (u8)(nic >> 16);
6098 wl->addresses[i].addr[4] = (u8)(nic >> 8);
6099 wl->addresses[i].addr[5] = (u8) nic;
6103 /* we may be one address short at the most */
6104 WARN_ON(wl->num_mac_addr + 1 < WLCORE_NUM_MAC_ADDRESSES);
6107 * turn on the LAA bit in the first address and use it as
6110 if (wl->num_mac_addr < WLCORE_NUM_MAC_ADDRESSES) {
6111 int idx = WLCORE_NUM_MAC_ADDRESSES - 1;
6112 memcpy(&wl->addresses[idx], &wl->addresses[0],
6113 sizeof(wl->addresses[0]));
6115 wl->addresses[idx].addr[0] |= BIT(1);
6118 wl->hw->wiphy->n_addresses = WLCORE_NUM_MAC_ADDRESSES;
6119 wl->hw->wiphy->addresses = wl->addresses;
6122 static int wl12xx_get_hw_info(struct wl1271 *wl)
6126 ret = wlcore_read_reg(wl, REG_CHIP_ID_B, &wl->chip.id);
6130 wl->fuse_oui_addr = 0;
6131 wl->fuse_nic_addr = 0;
6133 ret = wl->ops->get_pg_ver(wl, &wl->hw_pg_ver);
6137 if (wl->ops->get_mac)
6138 ret = wl->ops->get_mac(wl);
6144 static int wl1271_register_hw(struct wl1271 *wl)
6147 u32 oui_addr = 0, nic_addr = 0;
6148 struct platform_device *pdev = wl->pdev;
6149 struct wlcore_platdev_data *pdev_data = dev_get_platdata(&pdev->dev);
6151 if (wl->mac80211_registered)
6154 if (wl->nvs_len >= 12) {
6155 /* NOTE: The wl->nvs->nvs element must be first, in
6156 * order to simplify the casting, we assume it is at
6157 * the beginning of the wl->nvs structure.
6159 u8 *nvs_ptr = (u8 *)wl->nvs;
6162 (nvs_ptr[11] << 16) + (nvs_ptr[10] << 8) + nvs_ptr[6];
6164 (nvs_ptr[5] << 16) + (nvs_ptr[4] << 8) + nvs_ptr[3];
6167 /* if the MAC address is zeroed in the NVS derive from fuse */
6168 if (oui_addr == 0 && nic_addr == 0) {
6169 oui_addr = wl->fuse_oui_addr;
6170 /* fuse has the BD_ADDR, the WLAN addresses are the next two */
6171 nic_addr = wl->fuse_nic_addr + 1;
6174 if (oui_addr == 0xdeadbe && nic_addr == 0xef0000) {
6175 wl1271_warning("Detected unconfigured mac address in nvs, derive from fuse instead.");
6176 if (!strcmp(pdev_data->family->name, "wl18xx")) {
6177 wl1271_warning("This default nvs file can be removed from the file system");
6179 wl1271_warning("Your device performance is not optimized.");
6180 wl1271_warning("Please use the calibrator tool to configure your device.");
6183 if (wl->fuse_oui_addr == 0 && wl->fuse_nic_addr == 0) {
6184 wl1271_warning("Fuse mac address is zero. using random mac");
6185 /* Use TI oui and a random nic */
6186 oui_addr = WLCORE_TI_OUI_ADDRESS;
6187 nic_addr = get_random_u32();
6189 oui_addr = wl->fuse_oui_addr;
6190 /* fuse has the BD_ADDR, the WLAN addresses are the next two */
6191 nic_addr = wl->fuse_nic_addr + 1;
6195 wl12xx_derive_mac_addresses(wl, oui_addr, nic_addr);
6197 ret = ieee80211_register_hw(wl->hw);
6199 wl1271_error("unable to register mac80211 hw: %d", ret);
6203 wl->mac80211_registered = true;
6205 wl1271_debugfs_init(wl);
6207 wl1271_notice("loaded");
6213 static void wl1271_unregister_hw(struct wl1271 *wl)
6216 wl1271_plt_stop(wl);
6218 ieee80211_unregister_hw(wl->hw);
6219 wl->mac80211_registered = false;
6223 static int wl1271_init_ieee80211(struct wl1271 *wl)
6226 static const u32 cipher_suites[] = {
6227 WLAN_CIPHER_SUITE_WEP40,
6228 WLAN_CIPHER_SUITE_WEP104,
6229 WLAN_CIPHER_SUITE_TKIP,
6230 WLAN_CIPHER_SUITE_CCMP,
6231 WL1271_CIPHER_SUITE_GEM,
6234 /* The tx descriptor buffer */
6235 wl->hw->extra_tx_headroom = sizeof(struct wl1271_tx_hw_descr);
6237 if (wl->quirks & WLCORE_QUIRK_TKIP_HEADER_SPACE)
6238 wl->hw->extra_tx_headroom += WL1271_EXTRA_SPACE_TKIP;
6241 /* FIXME: find a proper value */
6242 wl->hw->max_listen_interval = wl->conf.conn.max_listen_interval;
6244 ieee80211_hw_set(wl->hw, SUPPORT_FAST_XMIT);
6245 ieee80211_hw_set(wl->hw, CHANCTX_STA_CSA);
6246 ieee80211_hw_set(wl->hw, SUPPORTS_PER_STA_GTK);
6247 ieee80211_hw_set(wl->hw, QUEUE_CONTROL);
6248 ieee80211_hw_set(wl->hw, TX_AMPDU_SETUP_IN_HW);
6249 ieee80211_hw_set(wl->hw, AMPDU_AGGREGATION);
6250 ieee80211_hw_set(wl->hw, AP_LINK_PS);
6251 ieee80211_hw_set(wl->hw, SPECTRUM_MGMT);
6252 ieee80211_hw_set(wl->hw, REPORTS_TX_ACK_STATUS);
6253 ieee80211_hw_set(wl->hw, CONNECTION_MONITOR);
6254 ieee80211_hw_set(wl->hw, HAS_RATE_CONTROL);
6255 ieee80211_hw_set(wl->hw, SUPPORTS_DYNAMIC_PS);
6256 ieee80211_hw_set(wl->hw, SIGNAL_DBM);
6257 ieee80211_hw_set(wl->hw, SUPPORTS_PS);
6258 ieee80211_hw_set(wl->hw, SUPPORTS_TX_FRAG);
6260 wl->hw->wiphy->cipher_suites = cipher_suites;
6261 wl->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
6263 wl->hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
6264 BIT(NL80211_IFTYPE_AP) |
6265 BIT(NL80211_IFTYPE_P2P_DEVICE) |
6266 BIT(NL80211_IFTYPE_P2P_CLIENT) |
6267 #ifdef CONFIG_MAC80211_MESH
6268 BIT(NL80211_IFTYPE_MESH_POINT) |
6270 BIT(NL80211_IFTYPE_P2P_GO);
6272 wl->hw->wiphy->max_scan_ssids = 1;
6273 wl->hw->wiphy->max_sched_scan_ssids = 16;
6274 wl->hw->wiphy->max_match_sets = 16;
6276 * Maximum length of elements in scanning probe request templates
6277 * should be the maximum length possible for a template, without
6278 * the IEEE80211 header of the template
6280 wl->hw->wiphy->max_scan_ie_len = WL1271_CMD_TEMPL_MAX_SIZE -
6281 sizeof(struct ieee80211_header);
6283 wl->hw->wiphy->max_sched_scan_reqs = 1;
6284 wl->hw->wiphy->max_sched_scan_ie_len = WL1271_CMD_TEMPL_MAX_SIZE -
6285 sizeof(struct ieee80211_header);
6287 wl->hw->wiphy->max_remain_on_channel_duration = 30000;
6289 wl->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD |
6290 WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL |
6291 WIPHY_FLAG_HAS_CHANNEL_SWITCH |
6292 WIPHY_FLAG_IBSS_RSN;
6294 wl->hw->wiphy->features |= NL80211_FEATURE_AP_SCAN;
6296 /* make sure all our channels fit in the scanned_ch bitmask */
6297 BUILD_BUG_ON(ARRAY_SIZE(wl1271_channels) +
6298 ARRAY_SIZE(wl1271_channels_5ghz) >
6299 WL1271_MAX_CHANNELS);
6301 * clear channel flags from the previous usage
6302 * and restore max_power & max_antenna_gain values.
6304 for (i = 0; i < ARRAY_SIZE(wl1271_channels); i++) {
6305 wl1271_band_2ghz.channels[i].flags = 0;
6306 wl1271_band_2ghz.channels[i].max_power = WLCORE_MAX_TXPWR;
6307 wl1271_band_2ghz.channels[i].max_antenna_gain = 0;
6310 for (i = 0; i < ARRAY_SIZE(wl1271_channels_5ghz); i++) {
6311 wl1271_band_5ghz.channels[i].flags = 0;
6312 wl1271_band_5ghz.channels[i].max_power = WLCORE_MAX_TXPWR;
6313 wl1271_band_5ghz.channels[i].max_antenna_gain = 0;
6317 * We keep local copies of the band structs because we need to
6318 * modify them on a per-device basis.
6320 memcpy(&wl->bands[NL80211_BAND_2GHZ], &wl1271_band_2ghz,
6321 sizeof(wl1271_band_2ghz));
6322 memcpy(&wl->bands[NL80211_BAND_2GHZ].ht_cap,
6323 &wl->ht_cap[NL80211_BAND_2GHZ],
6324 sizeof(*wl->ht_cap));
6325 memcpy(&wl->bands[NL80211_BAND_5GHZ], &wl1271_band_5ghz,
6326 sizeof(wl1271_band_5ghz));
6327 memcpy(&wl->bands[NL80211_BAND_5GHZ].ht_cap,
6328 &wl->ht_cap[NL80211_BAND_5GHZ],
6329 sizeof(*wl->ht_cap));
6331 wl->hw->wiphy->bands[NL80211_BAND_2GHZ] =
6332 &wl->bands[NL80211_BAND_2GHZ];
6333 wl->hw->wiphy->bands[NL80211_BAND_5GHZ] =
6334 &wl->bands[NL80211_BAND_5GHZ];
6337 * allow 4 queues per mac address we support +
6338 * 1 cab queue per mac + one global offchannel Tx queue
6340 wl->hw->queues = (NUM_TX_QUEUES + 1) * WLCORE_NUM_MAC_ADDRESSES + 1;
6342 /* the last queue is the offchannel queue */
6343 wl->hw->offchannel_tx_hw_queue = wl->hw->queues - 1;
6344 wl->hw->max_rates = 1;
6346 wl->hw->wiphy->reg_notifier = wl1271_reg_notify;
6348 /* the FW answers probe-requests in AP-mode */
6349 wl->hw->wiphy->flags |= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD;
6350 wl->hw->wiphy->probe_resp_offload =
6351 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS |
6352 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS2 |
6353 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_P2P;
6355 /* allowed interface combinations */
6356 wl->hw->wiphy->iface_combinations = wl->iface_combinations;
6357 wl->hw->wiphy->n_iface_combinations = wl->n_iface_combinations;
6359 /* register vendor commands */
6360 wlcore_set_vendor_commands(wl->hw->wiphy);
6362 SET_IEEE80211_DEV(wl->hw, wl->dev);
6364 wl->hw->sta_data_size = sizeof(struct wl1271_station);
6365 wl->hw->vif_data_size = sizeof(struct wl12xx_vif);
6367 wl->hw->max_rx_aggregation_subframes = wl->conf.ht.rx_ba_win_size;
6372 struct ieee80211_hw *wlcore_alloc_hw(size_t priv_size, u32 aggr_buf_size,
6375 struct ieee80211_hw *hw;
6380 hw = ieee80211_alloc_hw(sizeof(*wl), &wl1271_ops);
6382 wl1271_error("could not alloc ieee80211_hw");
6388 memset(wl, 0, sizeof(*wl));
6390 wl->priv = kzalloc(priv_size, GFP_KERNEL);
6392 wl1271_error("could not alloc wl priv");
6394 goto err_priv_alloc;
6397 INIT_LIST_HEAD(&wl->wlvif_list);
6402 * wl->num_links is not configured yet, so just use WLCORE_MAX_LINKS.
6403 * we don't allocate any additional resource here, so that's fine.
6405 for (i = 0; i < NUM_TX_QUEUES; i++)
6406 for (j = 0; j < WLCORE_MAX_LINKS; j++)
6407 skb_queue_head_init(&wl->links[j].tx_queue[i]);
6409 skb_queue_head_init(&wl->deferred_rx_queue);
6410 skb_queue_head_init(&wl->deferred_tx_queue);
6412 INIT_WORK(&wl->netstack_work, wl1271_netstack_work);
6413 INIT_WORK(&wl->tx_work, wl1271_tx_work);
6414 INIT_WORK(&wl->recovery_work, wl1271_recovery_work);
6415 INIT_DELAYED_WORK(&wl->scan_complete_work, wl1271_scan_complete_work);
6416 INIT_DELAYED_WORK(&wl->roc_complete_work, wlcore_roc_complete_work);
6417 INIT_DELAYED_WORK(&wl->tx_watchdog_work, wl12xx_tx_watchdog_work);
6419 wl->freezable_wq = create_freezable_workqueue("wl12xx_wq");
6420 if (!wl->freezable_wq) {
6427 wl->power_level = WL1271_DEFAULT_POWER_LEVEL;
6428 wl->band = NL80211_BAND_2GHZ;
6429 wl->channel_type = NL80211_CHAN_NO_HT;
6431 wl->sg_enabled = true;
6432 wl->sleep_auth = WL1271_PSM_ILLEGAL;
6433 wl->recovery_count = 0;
6436 wl->ap_fw_ps_map = 0;
6438 wl->system_hlid = WL12XX_SYSTEM_HLID;
6439 wl->active_sta_count = 0;
6440 wl->active_link_count = 0;
6443 /* The system link is always allocated */
6444 __set_bit(WL12XX_SYSTEM_HLID, wl->links_map);
6446 memset(wl->tx_frames_map, 0, sizeof(wl->tx_frames_map));
6447 for (i = 0; i < wl->num_tx_desc; i++)
6448 wl->tx_frames[i] = NULL;
6450 spin_lock_init(&wl->wl_lock);
6452 wl->state = WLCORE_STATE_OFF;
6453 wl->fw_type = WL12XX_FW_TYPE_NONE;
6454 mutex_init(&wl->mutex);
6455 mutex_init(&wl->flush_mutex);
6456 init_completion(&wl->nvs_loading_complete);
6458 order = get_order(aggr_buf_size);
6459 wl->aggr_buf = (u8 *)__get_free_pages(GFP_KERNEL, order);
6460 if (!wl->aggr_buf) {
6464 wl->aggr_buf_size = aggr_buf_size;
6466 wl->dummy_packet = wl12xx_alloc_dummy_packet(wl);
6467 if (!wl->dummy_packet) {
6472 /* Allocate one page for the FW log */
6473 wl->fwlog = (u8 *)get_zeroed_page(GFP_KERNEL);
6476 goto err_dummy_packet;
6479 wl->mbox_size = mbox_size;
6480 wl->mbox = kmalloc(wl->mbox_size, GFP_KERNEL | GFP_DMA);
6486 wl->buffer_32 = kmalloc(sizeof(*wl->buffer_32), GFP_KERNEL);
6487 if (!wl->buffer_32) {
6498 free_page((unsigned long)wl->fwlog);
6501 dev_kfree_skb(wl->dummy_packet);
6504 free_pages((unsigned long)wl->aggr_buf, order);
6507 destroy_workqueue(wl->freezable_wq);
6510 wl1271_debugfs_exit(wl);
6514 ieee80211_free_hw(hw);
6518 return ERR_PTR(ret);
6520 EXPORT_SYMBOL_GPL(wlcore_alloc_hw);
6522 int wlcore_free_hw(struct wl1271 *wl)
6524 /* Unblock any fwlog readers */
6525 mutex_lock(&wl->mutex);
6526 wl->fwlog_size = -1;
6527 mutex_unlock(&wl->mutex);
6529 wlcore_sysfs_free(wl);
6531 kfree(wl->buffer_32);
6533 free_page((unsigned long)wl->fwlog);
6534 dev_kfree_skb(wl->dummy_packet);
6535 free_pages((unsigned long)wl->aggr_buf, get_order(wl->aggr_buf_size));
6537 wl1271_debugfs_exit(wl);
6541 wl->fw_type = WL12XX_FW_TYPE_NONE;
6545 kfree(wl->raw_fw_status);
6546 kfree(wl->fw_status);
6547 kfree(wl->tx_res_if);
6548 destroy_workqueue(wl->freezable_wq);
6551 ieee80211_free_hw(wl->hw);
6555 EXPORT_SYMBOL_GPL(wlcore_free_hw);
6558 static const struct wiphy_wowlan_support wlcore_wowlan_support = {
6559 .flags = WIPHY_WOWLAN_ANY,
6560 .n_patterns = WL1271_MAX_RX_FILTERS,
6561 .pattern_min_len = 1,
6562 .pattern_max_len = WL1271_RX_FILTER_MAX_PATTERN_SIZE,
6566 static irqreturn_t wlcore_hardirq(int irq, void *cookie)
6568 return IRQ_WAKE_THREAD;
6571 static void wlcore_nvs_cb(const struct firmware *fw, void *context)
6573 struct wl1271 *wl = context;
6574 struct platform_device *pdev = wl->pdev;
6575 struct wlcore_platdev_data *pdev_data = dev_get_platdata(&pdev->dev);
6576 struct resource *res;
6579 irq_handler_t hardirq_fn = NULL;
6582 wl->nvs = kmemdup(fw->data, fw->size, GFP_KERNEL);
6584 wl1271_error("Could not allocate nvs data");
6587 wl->nvs_len = fw->size;
6588 } else if (pdev_data->family->nvs_name) {
6589 wl1271_debug(DEBUG_BOOT, "Could not get nvs file %s",
6590 pdev_data->family->nvs_name);
6598 ret = wl->ops->setup(wl);
6602 BUG_ON(wl->num_tx_desc > WLCORE_MAX_TX_DESCRIPTORS);
6604 /* adjust some runtime configuration parameters */
6605 wlcore_adjust_conf(wl);
6607 res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
6609 wl1271_error("Could not get IRQ resource");
6613 wl->irq = res->start;
6614 wl->irq_flags = res->flags & IRQF_TRIGGER_MASK;
6615 wl->if_ops = pdev_data->if_ops;
6617 if (wl->irq_flags & (IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING))
6618 hardirq_fn = wlcore_hardirq;
6620 wl->irq_flags |= IRQF_ONESHOT;
6622 ret = wl12xx_set_power_on(wl);
6626 ret = wl12xx_get_hw_info(wl);
6628 wl1271_error("couldn't get hw info");
6629 wl1271_power_off(wl);
6633 ret = request_threaded_irq(wl->irq, hardirq_fn, wlcore_irq,
6634 wl->irq_flags, pdev->name, wl);
6636 wl1271_error("interrupt configuration failed");
6637 wl1271_power_off(wl);
6642 device_init_wakeup(wl->dev, true);
6644 ret = enable_irq_wake(wl->irq);
6646 wl->irq_wake_enabled = true;
6647 if (pdev_data->pwr_in_suspend)
6648 wl->hw->wiphy->wowlan = &wlcore_wowlan_support;
6651 res = platform_get_resource(pdev, IORESOURCE_IRQ, 1);
6653 wl->wakeirq = res->start;
6654 wl->wakeirq_flags = res->flags & IRQF_TRIGGER_MASK;
6655 ret = dev_pm_set_dedicated_wake_irq(wl->dev, wl->wakeirq);
6657 wl->wakeirq = -ENODEV;
6659 wl->wakeirq = -ENODEV;
6662 disable_irq(wl->irq);
6663 wl1271_power_off(wl);
6665 ret = wl->ops->identify_chip(wl);
6669 ret = wl1271_init_ieee80211(wl);
6673 ret = wl1271_register_hw(wl);
6677 ret = wlcore_sysfs_init(wl);
6681 wl->initialized = true;
6685 wl1271_unregister_hw(wl);
6688 if (wl->wakeirq >= 0)
6689 dev_pm_clear_wake_irq(wl->dev);
6690 device_init_wakeup(wl->dev, false);
6691 free_irq(wl->irq, wl);
6697 release_firmware(fw);
6698 complete_all(&wl->nvs_loading_complete);
6701 static int __maybe_unused wlcore_runtime_suspend(struct device *dev)
6703 struct wl1271 *wl = dev_get_drvdata(dev);
6704 struct wl12xx_vif *wlvif;
6707 /* We do not enter elp sleep in PLT mode */
6711 /* Nothing to do if no ELP mode requested */
6712 if (wl->sleep_auth != WL1271_PSM_ELP)
6715 wl12xx_for_each_wlvif(wl, wlvif) {
6716 if (!test_bit(WLVIF_FLAG_IN_PS, &wlvif->flags) &&
6717 test_bit(WLVIF_FLAG_IN_USE, &wlvif->flags))
6721 wl1271_debug(DEBUG_PSM, "chip to elp");
6722 error = wlcore_raw_write32(wl, HW_ACCESS_ELP_CTRL_REG, ELPCTRL_SLEEP);
6724 wl12xx_queue_recovery_work(wl);
6729 set_bit(WL1271_FLAG_IN_ELP, &wl->flags);
6734 static int __maybe_unused wlcore_runtime_resume(struct device *dev)
6736 struct wl1271 *wl = dev_get_drvdata(dev);
6737 DECLARE_COMPLETION_ONSTACK(compl);
6738 unsigned long flags;
6740 unsigned long start_time = jiffies;
6741 bool recovery = false;
6743 /* Nothing to do if no ELP mode requested */
6744 if (!test_bit(WL1271_FLAG_IN_ELP, &wl->flags))
6747 wl1271_debug(DEBUG_PSM, "waking up chip from elp");
6749 spin_lock_irqsave(&wl->wl_lock, flags);
6750 wl->elp_compl = &compl;
6751 spin_unlock_irqrestore(&wl->wl_lock, flags);
6753 ret = wlcore_raw_write32(wl, HW_ACCESS_ELP_CTRL_REG, ELPCTRL_WAKE_UP);
6756 } else if (!test_bit(WL1271_FLAG_IRQ_RUNNING, &wl->flags)) {
6757 ret = wait_for_completion_timeout(&compl,
6758 msecs_to_jiffies(WL1271_WAKEUP_TIMEOUT));
6760 wl1271_warning("ELP wakeup timeout!");
6765 spin_lock_irqsave(&wl->wl_lock, flags);
6766 wl->elp_compl = NULL;
6767 spin_unlock_irqrestore(&wl->wl_lock, flags);
6768 clear_bit(WL1271_FLAG_IN_ELP, &wl->flags);
6771 set_bit(WL1271_FLAG_INTENDED_FW_RECOVERY, &wl->flags);
6772 wl12xx_queue_recovery_work(wl);
6774 wl1271_debug(DEBUG_PSM, "wakeup time: %u ms",
6775 jiffies_to_msecs(jiffies - start_time));
6781 static const struct dev_pm_ops wlcore_pm_ops = {
6782 SET_RUNTIME_PM_OPS(wlcore_runtime_suspend,
6783 wlcore_runtime_resume,
6787 int wlcore_probe(struct wl1271 *wl, struct platform_device *pdev)
6789 struct wlcore_platdev_data *pdev_data = dev_get_platdata(&pdev->dev);
6790 const char *nvs_name;
6793 if (!wl->ops || !wl->ptable || !pdev_data)
6796 wl->dev = &pdev->dev;
6798 platform_set_drvdata(pdev, wl);
6800 if (pdev_data->family && pdev_data->family->nvs_name) {
6801 nvs_name = pdev_data->family->nvs_name;
6802 ret = request_firmware_nowait(THIS_MODULE, FW_ACTION_UEVENT,
6803 nvs_name, &pdev->dev, GFP_KERNEL,
6806 wl1271_error("request_firmware_nowait failed for %s: %d",
6808 complete_all(&wl->nvs_loading_complete);
6811 wlcore_nvs_cb(NULL, wl);
6814 wl->dev->driver->pm = &wlcore_pm_ops;
6815 pm_runtime_set_autosuspend_delay(wl->dev, 50);
6816 pm_runtime_use_autosuspend(wl->dev);
6817 pm_runtime_enable(wl->dev);
6821 EXPORT_SYMBOL_GPL(wlcore_probe);
6823 void wlcore_remove(struct platform_device *pdev)
6825 struct wlcore_platdev_data *pdev_data = dev_get_platdata(&pdev->dev);
6826 struct wl1271 *wl = platform_get_drvdata(pdev);
6829 error = pm_runtime_get_sync(wl->dev);
6831 dev_warn(wl->dev, "PM runtime failed: %i\n", error);
6833 wl->dev->driver->pm = NULL;
6835 if (pdev_data->family && pdev_data->family->nvs_name)
6836 wait_for_completion(&wl->nvs_loading_complete);
6837 if (!wl->initialized)
6840 if (wl->wakeirq >= 0) {
6841 dev_pm_clear_wake_irq(wl->dev);
6842 wl->wakeirq = -ENODEV;
6845 device_init_wakeup(wl->dev, false);
6847 if (wl->irq_wake_enabled)
6848 disable_irq_wake(wl->irq);
6850 wl1271_unregister_hw(wl);
6852 pm_runtime_put_sync(wl->dev);
6853 pm_runtime_dont_use_autosuspend(wl->dev);
6854 pm_runtime_disable(wl->dev);
6856 free_irq(wl->irq, wl);
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_DESCRIPTION("TI WLAN core driver");
6880 MODULE_LICENSE("GPL");