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_get_sync(wl
->dev
);
146 pm_runtime_put_noidle(wl
->dev
);
150 ret
= wl1271_set_rx_streaming(wl
, wlvif
, true);
154 /* stop it after some time of inactivity */
155 mod_timer(&wlvif
->rx_streaming_timer
,
156 jiffies
+ msecs_to_jiffies(wl
->conf
.rx_streaming
.duration
));
159 pm_runtime_mark_last_busy(wl
->dev
);
160 pm_runtime_put_autosuspend(wl
->dev
);
162 mutex_unlock(&wl
->mutex
);
165 static void wl1271_rx_streaming_disable_work(struct work_struct
*work
)
168 struct wl12xx_vif
*wlvif
= container_of(work
, struct wl12xx_vif
,
169 rx_streaming_disable_work
);
170 struct wl1271
*wl
= wlvif
->wl
;
172 mutex_lock(&wl
->mutex
);
174 if (!test_bit(WLVIF_FLAG_RX_STREAMING_STARTED
, &wlvif
->flags
))
177 ret
= pm_runtime_get_sync(wl
->dev
);
179 pm_runtime_put_noidle(wl
->dev
);
183 ret
= wl1271_set_rx_streaming(wl
, wlvif
, false);
188 pm_runtime_mark_last_busy(wl
->dev
);
189 pm_runtime_put_autosuspend(wl
->dev
);
191 mutex_unlock(&wl
->mutex
);
194 static void wl1271_rx_streaming_timer(struct timer_list
*t
)
196 struct wl12xx_vif
*wlvif
= from_timer(wlvif
, t
, rx_streaming_timer
);
197 struct wl1271
*wl
= wlvif
->wl
;
198 ieee80211_queue_work(wl
->hw
, &wlvif
->rx_streaming_disable_work
);
201 /* wl->mutex must be taken */
202 void wl12xx_rearm_tx_watchdog_locked(struct wl1271
*wl
)
204 /* if the watchdog is not armed, don't do anything */
205 if (wl
->tx_allocated_blocks
== 0)
208 cancel_delayed_work(&wl
->tx_watchdog_work
);
209 ieee80211_queue_delayed_work(wl
->hw
, &wl
->tx_watchdog_work
,
210 msecs_to_jiffies(wl
->conf
.tx
.tx_watchdog_timeout
));
213 static void wlcore_rc_update_work(struct work_struct
*work
)
216 struct wl12xx_vif
*wlvif
= container_of(work
, struct wl12xx_vif
,
218 struct wl1271
*wl
= wlvif
->wl
;
219 struct ieee80211_vif
*vif
= wl12xx_wlvif_to_vif(wlvif
);
221 mutex_lock(&wl
->mutex
);
223 if (unlikely(wl
->state
!= WLCORE_STATE_ON
))
226 ret
= pm_runtime_get_sync(wl
->dev
);
228 pm_runtime_put_noidle(wl
->dev
);
232 if (ieee80211_vif_is_mesh(vif
)) {
233 ret
= wl1271_acx_set_ht_capabilities(wl
, &wlvif
->rc_ht_cap
,
234 true, wlvif
->sta
.hlid
);
238 wlcore_hw_sta_rc_update(wl
, wlvif
);
242 pm_runtime_mark_last_busy(wl
->dev
);
243 pm_runtime_put_autosuspend(wl
->dev
);
245 mutex_unlock(&wl
->mutex
);
248 static void wl12xx_tx_watchdog_work(struct work_struct
*work
)
250 struct delayed_work
*dwork
;
253 dwork
= to_delayed_work(work
);
254 wl
= container_of(dwork
, struct wl1271
, tx_watchdog_work
);
256 mutex_lock(&wl
->mutex
);
258 if (unlikely(wl
->state
!= WLCORE_STATE_ON
))
261 /* Tx went out in the meantime - everything is ok */
262 if (unlikely(wl
->tx_allocated_blocks
== 0))
266 * if a ROC is in progress, we might not have any Tx for a long
267 * time (e.g. pending Tx on the non-ROC channels)
269 if (find_first_bit(wl
->roc_map
, WL12XX_MAX_ROLES
) < WL12XX_MAX_ROLES
) {
270 wl1271_debug(DEBUG_TX
, "No Tx (in FW) for %d ms due to ROC",
271 wl
->conf
.tx
.tx_watchdog_timeout
);
272 wl12xx_rearm_tx_watchdog_locked(wl
);
277 * if a scan is in progress, we might not have any Tx for a long
280 if (wl
->scan
.state
!= WL1271_SCAN_STATE_IDLE
) {
281 wl1271_debug(DEBUG_TX
, "No Tx (in FW) for %d ms due to scan",
282 wl
->conf
.tx
.tx_watchdog_timeout
);
283 wl12xx_rearm_tx_watchdog_locked(wl
);
288 * AP might cache a frame for a long time for a sleeping station,
289 * so rearm the timer if there's an AP interface with stations. If
290 * Tx is genuinely stuck we will most hopefully discover it when all
291 * stations are removed due to inactivity.
293 if (wl
->active_sta_count
) {
294 wl1271_debug(DEBUG_TX
, "No Tx (in FW) for %d ms. AP has "
296 wl
->conf
.tx
.tx_watchdog_timeout
,
297 wl
->active_sta_count
);
298 wl12xx_rearm_tx_watchdog_locked(wl
);
302 wl1271_error("Tx stuck (in FW) for %d ms. Starting recovery",
303 wl
->conf
.tx
.tx_watchdog_timeout
);
304 wl12xx_queue_recovery_work(wl
);
307 mutex_unlock(&wl
->mutex
);
310 static void wlcore_adjust_conf(struct wl1271
*wl
)
314 if (!strcmp(fwlog_param
, "continuous")) {
315 wl
->conf
.fwlog
.mode
= WL12XX_FWLOG_CONTINUOUS
;
316 wl
->conf
.fwlog
.output
= WL12XX_FWLOG_OUTPUT_HOST
;
317 } else if (!strcmp(fwlog_param
, "dbgpins")) {
318 wl
->conf
.fwlog
.mode
= WL12XX_FWLOG_CONTINUOUS
;
319 wl
->conf
.fwlog
.output
= WL12XX_FWLOG_OUTPUT_DBG_PINS
;
320 } else if (!strcmp(fwlog_param
, "disable")) {
321 wl
->conf
.fwlog
.mem_blocks
= 0;
322 wl
->conf
.fwlog
.output
= WL12XX_FWLOG_OUTPUT_NONE
;
324 wl1271_error("Unknown fwlog parameter %s", fwlog_param
);
328 if (bug_on_recovery
!= -1)
329 wl
->conf
.recovery
.bug_on_recovery
= (u8
) bug_on_recovery
;
331 if (no_recovery
!= -1)
332 wl
->conf
.recovery
.no_recovery
= (u8
) no_recovery
;
335 static void wl12xx_irq_ps_regulate_link(struct wl1271
*wl
,
336 struct wl12xx_vif
*wlvif
,
341 fw_ps
= test_bit(hlid
, &wl
->ap_fw_ps_map
);
344 * Wake up from high level PS if the STA is asleep with too little
345 * packets in FW or if the STA is awake.
347 if (!fw_ps
|| tx_pkts
< WL1271_PS_STA_MAX_PACKETS
)
348 wl12xx_ps_link_end(wl
, wlvif
, hlid
);
351 * Start high-level PS if the STA is asleep with enough blocks in FW.
352 * Make an exception if this is the only connected link. In this
353 * case FW-memory congestion is less of a problem.
354 * Note that a single connected STA means 2*ap_count + 1 active links,
355 * since we must account for the global and broadcast AP links
356 * for each AP. The "fw_ps" check assures us the other link is a STA
357 * connected to the AP. Otherwise the FW would not set the PSM bit.
359 else if (wl
->active_link_count
> (wl
->ap_count
*2 + 1) && fw_ps
&&
360 tx_pkts
>= WL1271_PS_STA_MAX_PACKETS
)
361 wl12xx_ps_link_start(wl
, wlvif
, hlid
, true);
364 static void wl12xx_irq_update_links_status(struct wl1271
*wl
,
365 struct wl12xx_vif
*wlvif
,
366 struct wl_fw_status
*status
)
368 unsigned long cur_fw_ps_map
;
371 cur_fw_ps_map
= status
->link_ps_bitmap
;
372 if (wl
->ap_fw_ps_map
!= cur_fw_ps_map
) {
373 wl1271_debug(DEBUG_PSM
,
374 "link ps prev 0x%lx cur 0x%lx changed 0x%lx",
375 wl
->ap_fw_ps_map
, cur_fw_ps_map
,
376 wl
->ap_fw_ps_map
^ cur_fw_ps_map
);
378 wl
->ap_fw_ps_map
= cur_fw_ps_map
;
381 for_each_set_bit(hlid
, wlvif
->ap
.sta_hlid_map
, wl
->num_links
)
382 wl12xx_irq_ps_regulate_link(wl
, wlvif
, hlid
,
383 wl
->links
[hlid
].allocated_pkts
);
386 static int wlcore_fw_status(struct wl1271
*wl
, struct wl_fw_status
*status
)
388 struct wl12xx_vif
*wlvif
;
389 u32 old_tx_blk_count
= wl
->tx_blocks_available
;
390 int avail
, freed_blocks
;
393 struct wl1271_link
*lnk
;
395 ret
= wlcore_raw_read_data(wl
, REG_RAW_FW_STATUS_ADDR
,
397 wl
->fw_status_len
, false);
401 wlcore_hw_convert_fw_status(wl
, wl
->raw_fw_status
, wl
->fw_status
);
403 wl1271_debug(DEBUG_IRQ
, "intr: 0x%x (fw_rx_counter = %d, "
404 "drv_rx_counter = %d, tx_results_counter = %d)",
406 status
->fw_rx_counter
,
407 status
->drv_rx_counter
,
408 status
->tx_results_counter
);
410 for (i
= 0; i
< NUM_TX_QUEUES
; i
++) {
411 /* prevent wrap-around in freed-packets counter */
412 wl
->tx_allocated_pkts
[i
] -=
413 (status
->counters
.tx_released_pkts
[i
] -
414 wl
->tx_pkts_freed
[i
]) & 0xff;
416 wl
->tx_pkts_freed
[i
] = status
->counters
.tx_released_pkts
[i
];
420 for_each_set_bit(i
, wl
->links_map
, wl
->num_links
) {
424 /* prevent wrap-around in freed-packets counter */
425 diff
= (status
->counters
.tx_lnk_free_pkts
[i
] -
426 lnk
->prev_freed_pkts
) & 0xff;
431 lnk
->allocated_pkts
-= diff
;
432 lnk
->prev_freed_pkts
= status
->counters
.tx_lnk_free_pkts
[i
];
434 /* accumulate the prev_freed_pkts counter */
435 lnk
->total_freed_pkts
+= diff
;
438 /* prevent wrap-around in total blocks counter */
439 if (likely(wl
->tx_blocks_freed
<= status
->total_released_blks
))
440 freed_blocks
= status
->total_released_blks
-
443 freed_blocks
= 0x100000000LL
- wl
->tx_blocks_freed
+
444 status
->total_released_blks
;
446 wl
->tx_blocks_freed
= status
->total_released_blks
;
448 wl
->tx_allocated_blocks
-= freed_blocks
;
451 * If the FW freed some blocks:
452 * If we still have allocated blocks - re-arm the timer, Tx is
453 * not stuck. Otherwise, cancel the timer (no Tx currently).
456 if (wl
->tx_allocated_blocks
)
457 wl12xx_rearm_tx_watchdog_locked(wl
);
459 cancel_delayed_work(&wl
->tx_watchdog_work
);
462 avail
= status
->tx_total
- wl
->tx_allocated_blocks
;
465 * The FW might change the total number of TX memblocks before
466 * we get a notification about blocks being released. Thus, the
467 * available blocks calculation might yield a temporary result
468 * which is lower than the actual available blocks. Keeping in
469 * mind that only blocks that were allocated can be moved from
470 * TX to RX, tx_blocks_available should never decrease here.
472 wl
->tx_blocks_available
= max((int)wl
->tx_blocks_available
,
475 /* if more blocks are available now, tx work can be scheduled */
476 if (wl
->tx_blocks_available
> old_tx_blk_count
)
477 clear_bit(WL1271_FLAG_FW_TX_BUSY
, &wl
->flags
);
479 /* for AP update num of allocated TX blocks per link and ps status */
480 wl12xx_for_each_wlvif_ap(wl
, wlvif
) {
481 wl12xx_irq_update_links_status(wl
, wlvif
, status
);
484 /* update the host-chipset time offset */
485 wl
->time_offset
= (ktime_get_boottime_ns() >> 10) -
486 (s64
)(status
->fw_localtime
);
488 wl
->fw_fast_lnk_map
= status
->link_fast_bitmap
;
493 static void wl1271_flush_deferred_work(struct wl1271
*wl
)
497 /* Pass all received frames to the network stack */
498 while ((skb
= skb_dequeue(&wl
->deferred_rx_queue
)))
499 ieee80211_rx_ni(wl
->hw
, skb
);
501 /* Return sent skbs to the network stack */
502 while ((skb
= skb_dequeue(&wl
->deferred_tx_queue
)))
503 ieee80211_tx_status_ni(wl
->hw
, skb
);
506 static void wl1271_netstack_work(struct work_struct
*work
)
509 container_of(work
, struct wl1271
, netstack_work
);
512 wl1271_flush_deferred_work(wl
);
513 } while (skb_queue_len(&wl
->deferred_rx_queue
));
516 #define WL1271_IRQ_MAX_LOOPS 256
518 static int wlcore_irq_locked(struct wl1271
*wl
)
522 int loopcount
= WL1271_IRQ_MAX_LOOPS
;
523 bool run_tx_queue
= true;
525 unsigned int defer_count
;
529 * In case edge triggered interrupt must be used, we cannot iterate
530 * more than once without introducing race conditions with the hardirq.
532 if (wl
->irq_flags
& (IRQF_TRIGGER_RISING
| IRQF_TRIGGER_FALLING
))
535 wl1271_debug(DEBUG_IRQ
, "IRQ work");
537 if (unlikely(wl
->state
!= WLCORE_STATE_ON
))
540 ret
= pm_runtime_get_sync(wl
->dev
);
542 pm_runtime_put_noidle(wl
->dev
);
546 while (!done
&& loopcount
--) {
547 smp_mb__after_atomic();
549 ret
= wlcore_fw_status(wl
, wl
->fw_status
);
553 wlcore_hw_tx_immediate_compl(wl
);
555 intr
= wl
->fw_status
->intr
;
556 intr
&= WLCORE_ALL_INTR_MASK
;
562 if (unlikely(intr
& WL1271_ACX_INTR_WATCHDOG
)) {
563 wl1271_error("HW watchdog interrupt received! starting recovery.");
564 wl
->watchdog_recovery
= true;
567 /* restarting the chip. ignore any other interrupt. */
571 if (unlikely(intr
& WL1271_ACX_SW_INTR_WATCHDOG
)) {
572 wl1271_error("SW watchdog interrupt received! "
573 "starting recovery.");
574 wl
->watchdog_recovery
= true;
577 /* restarting the chip. ignore any other interrupt. */
581 if (likely(intr
& WL1271_ACX_INTR_DATA
)) {
582 wl1271_debug(DEBUG_IRQ
, "WL1271_ACX_INTR_DATA");
584 ret
= wlcore_rx(wl
, wl
->fw_status
);
588 /* Check if any tx blocks were freed */
589 if (!test_bit(WL1271_FLAG_FW_TX_BUSY
, &wl
->flags
)) {
590 if (spin_trylock_irqsave(&wl
->wl_lock
, flags
)) {
591 if (!wl1271_tx_total_queue_count(wl
))
592 run_tx_queue
= false;
593 spin_unlock_irqrestore(&wl
->wl_lock
, flags
);
597 * In order to avoid starvation of the TX path,
598 * call the work function directly.
601 ret
= wlcore_tx_work_locked(wl
);
607 /* check for tx results */
608 ret
= wlcore_hw_tx_delayed_compl(wl
);
612 /* Make sure the deferred queues don't get too long */
613 defer_count
= skb_queue_len(&wl
->deferred_tx_queue
) +
614 skb_queue_len(&wl
->deferred_rx_queue
);
615 if (defer_count
> WL1271_DEFERRED_QUEUE_LIMIT
)
616 wl1271_flush_deferred_work(wl
);
619 if (intr
& WL1271_ACX_INTR_EVENT_A
) {
620 wl1271_debug(DEBUG_IRQ
, "WL1271_ACX_INTR_EVENT_A");
621 ret
= wl1271_event_handle(wl
, 0);
626 if (intr
& WL1271_ACX_INTR_EVENT_B
) {
627 wl1271_debug(DEBUG_IRQ
, "WL1271_ACX_INTR_EVENT_B");
628 ret
= wl1271_event_handle(wl
, 1);
633 if (intr
& WL1271_ACX_INTR_INIT_COMPLETE
)
634 wl1271_debug(DEBUG_IRQ
,
635 "WL1271_ACX_INTR_INIT_COMPLETE");
637 if (intr
& WL1271_ACX_INTR_HW_AVAILABLE
)
638 wl1271_debug(DEBUG_IRQ
, "WL1271_ACX_INTR_HW_AVAILABLE");
642 pm_runtime_mark_last_busy(wl
->dev
);
643 pm_runtime_put_autosuspend(wl
->dev
);
649 static irqreturn_t
wlcore_irq(int irq
, void *cookie
)
653 struct wl1271
*wl
= cookie
;
654 bool queue_tx_work
= true;
656 set_bit(WL1271_FLAG_IRQ_RUNNING
, &wl
->flags
);
658 /* complete the ELP completion */
659 if (test_bit(WL1271_FLAG_IN_ELP
, &wl
->flags
)) {
660 spin_lock_irqsave(&wl
->wl_lock
, flags
);
662 complete(wl
->elp_compl
);
663 spin_unlock_irqrestore(&wl
->wl_lock
, flags
);
666 if (test_bit(WL1271_FLAG_SUSPENDED
, &wl
->flags
)) {
667 /* don't enqueue a work right now. mark it as pending */
668 set_bit(WL1271_FLAG_PENDING_WORK
, &wl
->flags
);
669 wl1271_debug(DEBUG_IRQ
, "should not enqueue work");
670 spin_lock_irqsave(&wl
->wl_lock
, flags
);
671 disable_irq_nosync(wl
->irq
);
672 pm_wakeup_event(wl
->dev
, 0);
673 spin_unlock_irqrestore(&wl
->wl_lock
, flags
);
677 /* TX might be handled here, avoid redundant work */
678 set_bit(WL1271_FLAG_TX_PENDING
, &wl
->flags
);
679 cancel_work_sync(&wl
->tx_work
);
681 mutex_lock(&wl
->mutex
);
683 ret
= wlcore_irq_locked(wl
);
685 wl12xx_queue_recovery_work(wl
);
687 /* In case TX was not handled in wlcore_irq_locked(), queue TX work */
688 clear_bit(WL1271_FLAG_TX_PENDING
, &wl
->flags
);
689 if (!test_bit(WL1271_FLAG_FW_TX_BUSY
, &wl
->flags
)) {
690 if (spin_trylock_irqsave(&wl
->wl_lock
, flags
)) {
691 if (!wl1271_tx_total_queue_count(wl
))
692 queue_tx_work
= false;
693 spin_unlock_irqrestore(&wl
->wl_lock
, flags
);
696 ieee80211_queue_work(wl
->hw
, &wl
->tx_work
);
699 mutex_unlock(&wl
->mutex
);
702 clear_bit(WL1271_FLAG_IRQ_RUNNING
, &wl
->flags
);
707 struct vif_counter_data
{
710 struct ieee80211_vif
*cur_vif
;
711 bool cur_vif_running
;
714 static void wl12xx_vif_count_iter(void *data
, u8
*mac
,
715 struct ieee80211_vif
*vif
)
717 struct vif_counter_data
*counter
= data
;
720 if (counter
->cur_vif
== vif
)
721 counter
->cur_vif_running
= true;
724 /* caller must not hold wl->mutex, as it might deadlock */
725 static void wl12xx_get_vif_count(struct ieee80211_hw
*hw
,
726 struct ieee80211_vif
*cur_vif
,
727 struct vif_counter_data
*data
)
729 memset(data
, 0, sizeof(*data
));
730 data
->cur_vif
= cur_vif
;
732 ieee80211_iterate_active_interfaces(hw
, IEEE80211_IFACE_ITER_RESUME_ALL
,
733 wl12xx_vif_count_iter
, data
);
736 static int wl12xx_fetch_firmware(struct wl1271
*wl
, bool plt
)
738 const struct firmware
*fw
;
740 enum wl12xx_fw_type fw_type
;
744 fw_type
= WL12XX_FW_TYPE_PLT
;
745 fw_name
= wl
->plt_fw_name
;
748 * we can't call wl12xx_get_vif_count() here because
749 * wl->mutex is taken, so use the cached last_vif_count value
751 if (wl
->last_vif_count
> 1 && wl
->mr_fw_name
) {
752 fw_type
= WL12XX_FW_TYPE_MULTI
;
753 fw_name
= wl
->mr_fw_name
;
755 fw_type
= WL12XX_FW_TYPE_NORMAL
;
756 fw_name
= wl
->sr_fw_name
;
760 if (wl
->fw_type
== fw_type
)
763 wl1271_debug(DEBUG_BOOT
, "booting firmware %s", fw_name
);
765 ret
= request_firmware(&fw
, fw_name
, wl
->dev
);
768 wl1271_error("could not get firmware %s: %d", fw_name
, ret
);
773 wl1271_error("firmware size is not multiple of 32 bits: %zu",
780 wl
->fw_type
= WL12XX_FW_TYPE_NONE
;
781 wl
->fw_len
= fw
->size
;
782 wl
->fw
= vmalloc(wl
->fw_len
);
785 wl1271_error("could not allocate memory for the firmware");
790 memcpy(wl
->fw
, fw
->data
, wl
->fw_len
);
792 wl
->fw_type
= fw_type
;
794 release_firmware(fw
);
799 void wl12xx_queue_recovery_work(struct wl1271
*wl
)
801 /* Avoid a recursive recovery */
802 if (wl
->state
== WLCORE_STATE_ON
) {
803 WARN_ON(!test_bit(WL1271_FLAG_INTENDED_FW_RECOVERY
,
806 wl
->state
= WLCORE_STATE_RESTARTING
;
807 set_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS
, &wl
->flags
);
808 ieee80211_queue_work(wl
->hw
, &wl
->recovery_work
);
812 size_t wl12xx_copy_fwlog(struct wl1271
*wl
, u8
*memblock
, size_t maxlen
)
816 /* Make sure we have enough room */
817 len
= min_t(size_t, maxlen
, PAGE_SIZE
- wl
->fwlog_size
);
819 /* Fill the FW log file, consumed by the sysfs fwlog entry */
820 memcpy(wl
->fwlog
+ wl
->fwlog_size
, memblock
, len
);
821 wl
->fwlog_size
+= len
;
826 static void wl12xx_read_fwlog_panic(struct wl1271
*wl
)
831 if (wl
->quirks
& WLCORE_QUIRK_FWLOG_NOT_IMPLEMENTED
)
834 wl1271_info("Reading FW panic log");
837 * Make sure the chip is awake and the logger isn't active.
838 * Do not send a stop fwlog command if the fw is hanged or if
839 * dbgpins are used (due to some fw bug).
841 error
= pm_runtime_get_sync(wl
->dev
);
843 pm_runtime_put_noidle(wl
->dev
);
846 if (!wl
->watchdog_recovery
&&
847 wl
->conf
.fwlog
.output
!= WL12XX_FWLOG_OUTPUT_DBG_PINS
)
848 wl12xx_cmd_stop_fwlog(wl
);
850 /* Traverse the memory blocks linked list */
852 end_of_log
= wlcore_event_fw_logger(wl
);
853 if (end_of_log
== 0) {
855 end_of_log
= wlcore_event_fw_logger(wl
);
857 } while (end_of_log
!= 0);
860 static void wlcore_save_freed_pkts(struct wl1271
*wl
, struct wl12xx_vif
*wlvif
,
861 u8 hlid
, struct ieee80211_sta
*sta
)
863 struct wl1271_station
*wl_sta
;
864 u32 sqn_recovery_padding
= WL1271_TX_SQN_POST_RECOVERY_PADDING
;
866 wl_sta
= (void *)sta
->drv_priv
;
867 wl_sta
->total_freed_pkts
= wl
->links
[hlid
].total_freed_pkts
;
870 * increment the initial seq number on recovery to account for
871 * transmitted packets that we haven't yet got in the FW status
873 if (wlvif
->encryption_type
== KEY_GEM
)
874 sqn_recovery_padding
= WL1271_TX_SQN_POST_RECOVERY_PADDING_GEM
;
876 if (test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS
, &wl
->flags
))
877 wl_sta
->total_freed_pkts
+= sqn_recovery_padding
;
880 static void wlcore_save_freed_pkts_addr(struct wl1271
*wl
,
881 struct wl12xx_vif
*wlvif
,
882 u8 hlid
, const u8
*addr
)
884 struct ieee80211_sta
*sta
;
885 struct ieee80211_vif
*vif
= wl12xx_wlvif_to_vif(wlvif
);
887 if (WARN_ON(hlid
== WL12XX_INVALID_LINK_ID
||
888 is_zero_ether_addr(addr
)))
892 sta
= ieee80211_find_sta(vif
, addr
);
894 wlcore_save_freed_pkts(wl
, wlvif
, hlid
, sta
);
898 static void wlcore_print_recovery(struct wl1271
*wl
)
904 wl1271_info("Hardware recovery in progress. FW ver: %s",
905 wl
->chip
.fw_ver_str
);
907 /* change partitions momentarily so we can read the FW pc */
908 ret
= wlcore_set_partition(wl
, &wl
->ptable
[PART_BOOT
]);
912 ret
= wlcore_read_reg(wl
, REG_PC_ON_RECOVERY
, &pc
);
916 ret
= wlcore_read_reg(wl
, REG_INTERRUPT_NO_CLEAR
, &hint_sts
);
920 wl1271_info("pc: 0x%x, hint_sts: 0x%08x count: %d",
921 pc
, hint_sts
, ++wl
->recovery_count
);
923 wlcore_set_partition(wl
, &wl
->ptable
[PART_WORK
]);
927 static void wl1271_recovery_work(struct work_struct
*work
)
930 container_of(work
, struct wl1271
, recovery_work
);
931 struct wl12xx_vif
*wlvif
;
932 struct ieee80211_vif
*vif
;
935 mutex_lock(&wl
->mutex
);
937 if (wl
->state
== WLCORE_STATE_OFF
|| wl
->plt
)
940 error
= pm_runtime_get_sync(wl
->dev
);
942 wl1271_warning("Enable for recovery failed");
943 pm_runtime_put_noidle(wl
->dev
);
945 wlcore_disable_interrupts_nosync(wl
);
947 if (!test_bit(WL1271_FLAG_INTENDED_FW_RECOVERY
, &wl
->flags
)) {
948 if (wl
->conf
.fwlog
.output
== WL12XX_FWLOG_OUTPUT_HOST
)
949 wl12xx_read_fwlog_panic(wl
);
950 wlcore_print_recovery(wl
);
953 BUG_ON(wl
->conf
.recovery
.bug_on_recovery
&&
954 !test_bit(WL1271_FLAG_INTENDED_FW_RECOVERY
, &wl
->flags
));
956 clear_bit(WL1271_FLAG_INTENDED_FW_RECOVERY
, &wl
->flags
);
958 if (wl
->conf
.recovery
.no_recovery
) {
959 wl1271_info("No recovery (chosen on module load). Fw will remain stuck.");
963 /* Prevent spurious TX during FW restart */
964 wlcore_stop_queues(wl
, WLCORE_QUEUE_STOP_REASON_FW_RESTART
);
966 /* reboot the chipset */
967 while (!list_empty(&wl
->wlvif_list
)) {
968 wlvif
= list_first_entry(&wl
->wlvif_list
,
969 struct wl12xx_vif
, list
);
970 vif
= wl12xx_wlvif_to_vif(wlvif
);
972 if (wlvif
->bss_type
== BSS_TYPE_STA_BSS
&&
973 test_bit(WLVIF_FLAG_STA_ASSOCIATED
, &wlvif
->flags
)) {
974 wlcore_save_freed_pkts_addr(wl
, wlvif
, wlvif
->sta
.hlid
,
975 vif
->bss_conf
.bssid
);
978 __wl1271_op_remove_interface(wl
, vif
, false);
981 wlcore_op_stop_locked(wl
);
982 pm_runtime_mark_last_busy(wl
->dev
);
983 pm_runtime_put_autosuspend(wl
->dev
);
985 ieee80211_restart_hw(wl
->hw
);
988 * Its safe to enable TX now - the queues are stopped after a request
991 wlcore_wake_queues(wl
, WLCORE_QUEUE_STOP_REASON_FW_RESTART
);
994 wl
->watchdog_recovery
= false;
995 clear_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS
, &wl
->flags
);
996 mutex_unlock(&wl
->mutex
);
999 static int wlcore_fw_wakeup(struct wl1271
*wl
)
1001 return wlcore_raw_write32(wl
, HW_ACCESS_ELP_CTRL_REG
, ELPCTRL_WAKE_UP
);
1004 static int wl1271_setup(struct wl1271
*wl
)
1006 wl
->raw_fw_status
= kzalloc(wl
->fw_status_len
, GFP_KERNEL
);
1007 if (!wl
->raw_fw_status
)
1010 wl
->fw_status
= kzalloc(sizeof(*wl
->fw_status
), GFP_KERNEL
);
1014 wl
->tx_res_if
= kzalloc(sizeof(*wl
->tx_res_if
), GFP_KERNEL
);
1020 kfree(wl
->fw_status
);
1021 kfree(wl
->raw_fw_status
);
1025 static int wl12xx_set_power_on(struct wl1271
*wl
)
1029 msleep(WL1271_PRE_POWER_ON_SLEEP
);
1030 ret
= wl1271_power_on(wl
);
1033 msleep(WL1271_POWER_ON_SLEEP
);
1034 wl1271_io_reset(wl
);
1037 ret
= wlcore_set_partition(wl
, &wl
->ptable
[PART_BOOT
]);
1041 /* ELP module wake up */
1042 ret
= wlcore_fw_wakeup(wl
);
1050 wl1271_power_off(wl
);
1054 static int wl12xx_chip_wakeup(struct wl1271
*wl
, bool plt
)
1058 ret
= wl12xx_set_power_on(wl
);
1063 * For wl127x based devices we could use the default block
1064 * size (512 bytes), but due to a bug in the sdio driver, we
1065 * need to set it explicitly after the chip is powered on. To
1066 * simplify the code and since the performance impact is
1067 * negligible, we use the same block size for all different
1070 * Check if the bus supports blocksize alignment and, if it
1071 * doesn't, make sure we don't have the quirk.
1073 if (!wl1271_set_block_size(wl
))
1074 wl
->quirks
&= ~WLCORE_QUIRK_TX_BLOCKSIZE_ALIGN
;
1076 /* TODO: make sure the lower driver has set things up correctly */
1078 ret
= wl1271_setup(wl
);
1082 ret
= wl12xx_fetch_firmware(wl
, plt
);
1084 kfree(wl
->fw_status
);
1085 kfree(wl
->raw_fw_status
);
1086 kfree(wl
->tx_res_if
);
1093 int wl1271_plt_start(struct wl1271
*wl
, const enum plt_mode plt_mode
)
1095 int retries
= WL1271_BOOT_RETRIES
;
1096 struct wiphy
*wiphy
= wl
->hw
->wiphy
;
1098 static const char* const PLT_MODE
[] = {
1107 mutex_lock(&wl
->mutex
);
1109 wl1271_notice("power up");
1111 if (wl
->state
!= WLCORE_STATE_OFF
) {
1112 wl1271_error("cannot go into PLT state because not "
1113 "in off state: %d", wl
->state
);
1118 /* Indicate to lower levels that we are now in PLT mode */
1120 wl
->plt_mode
= plt_mode
;
1124 ret
= wl12xx_chip_wakeup(wl
, true);
1128 if (plt_mode
!= PLT_CHIP_AWAKE
) {
1129 ret
= wl
->ops
->plt_init(wl
);
1134 wl
->state
= WLCORE_STATE_ON
;
1135 wl1271_notice("firmware booted in PLT mode %s (%s)",
1137 wl
->chip
.fw_ver_str
);
1139 /* update hw/fw version info in wiphy struct */
1140 wiphy
->hw_version
= wl
->chip
.id
;
1141 strncpy(wiphy
->fw_version
, wl
->chip
.fw_ver_str
,
1142 sizeof(wiphy
->fw_version
));
1147 wl1271_power_off(wl
);
1151 wl
->plt_mode
= PLT_OFF
;
1153 wl1271_error("firmware boot in PLT mode failed despite %d retries",
1154 WL1271_BOOT_RETRIES
);
1156 mutex_unlock(&wl
->mutex
);
1161 int wl1271_plt_stop(struct wl1271
*wl
)
1165 wl1271_notice("power down");
1168 * Interrupts must be disabled before setting the state to OFF.
1169 * Otherwise, the interrupt handler might be called and exit without
1170 * reading the interrupt status.
1172 wlcore_disable_interrupts(wl
);
1173 mutex_lock(&wl
->mutex
);
1175 mutex_unlock(&wl
->mutex
);
1178 * This will not necessarily enable interrupts as interrupts
1179 * may have been disabled when op_stop was called. It will,
1180 * however, balance the above call to disable_interrupts().
1182 wlcore_enable_interrupts(wl
);
1184 wl1271_error("cannot power down because not in PLT "
1185 "state: %d", wl
->state
);
1190 mutex_unlock(&wl
->mutex
);
1192 wl1271_flush_deferred_work(wl
);
1193 cancel_work_sync(&wl
->netstack_work
);
1194 cancel_work_sync(&wl
->recovery_work
);
1195 cancel_delayed_work_sync(&wl
->tx_watchdog_work
);
1197 mutex_lock(&wl
->mutex
);
1198 wl1271_power_off(wl
);
1200 wl
->sleep_auth
= WL1271_PSM_ILLEGAL
;
1201 wl
->state
= WLCORE_STATE_OFF
;
1203 wl
->plt_mode
= PLT_OFF
;
1205 mutex_unlock(&wl
->mutex
);
1211 static void wl1271_op_tx(struct ieee80211_hw
*hw
,
1212 struct ieee80211_tx_control
*control
,
1213 struct sk_buff
*skb
)
1215 struct wl1271
*wl
= hw
->priv
;
1216 struct ieee80211_tx_info
*info
= IEEE80211_SKB_CB(skb
);
1217 struct ieee80211_vif
*vif
= info
->control
.vif
;
1218 struct wl12xx_vif
*wlvif
= NULL
;
1219 unsigned long flags
;
1224 wl1271_debug(DEBUG_TX
, "DROP skb with no vif");
1225 ieee80211_free_txskb(hw
, skb
);
1229 wlvif
= wl12xx_vif_to_data(vif
);
1230 mapping
= skb_get_queue_mapping(skb
);
1231 q
= wl1271_tx_get_queue(mapping
);
1233 hlid
= wl12xx_tx_get_hlid(wl
, wlvif
, skb
, control
->sta
);
1235 spin_lock_irqsave(&wl
->wl_lock
, flags
);
1238 * drop the packet if the link is invalid or the queue is stopped
1239 * for any reason but watermark. Watermark is a "soft"-stop so we
1240 * allow these packets through.
1242 if (hlid
== WL12XX_INVALID_LINK_ID
||
1243 (!test_bit(hlid
, wlvif
->links_map
)) ||
1244 (wlcore_is_queue_stopped_locked(wl
, wlvif
, q
) &&
1245 !wlcore_is_queue_stopped_by_reason_locked(wl
, wlvif
, q
,
1246 WLCORE_QUEUE_STOP_REASON_WATERMARK
))) {
1247 wl1271_debug(DEBUG_TX
, "DROP skb hlid %d q %d", hlid
, q
);
1248 ieee80211_free_txskb(hw
, skb
);
1252 wl1271_debug(DEBUG_TX
, "queue skb hlid %d q %d len %d",
1254 skb_queue_tail(&wl
->links
[hlid
].tx_queue
[q
], skb
);
1256 wl
->tx_queue_count
[q
]++;
1257 wlvif
->tx_queue_count
[q
]++;
1260 * The workqueue is slow to process the tx_queue and we need stop
1261 * the queue here, otherwise the queue will get too long.
1263 if (wlvif
->tx_queue_count
[q
] >= WL1271_TX_QUEUE_HIGH_WATERMARK
&&
1264 !wlcore_is_queue_stopped_by_reason_locked(wl
, wlvif
, q
,
1265 WLCORE_QUEUE_STOP_REASON_WATERMARK
)) {
1266 wl1271_debug(DEBUG_TX
, "op_tx: stopping queues for q %d", q
);
1267 wlcore_stop_queue_locked(wl
, wlvif
, q
,
1268 WLCORE_QUEUE_STOP_REASON_WATERMARK
);
1272 * The chip specific setup must run before the first TX packet -
1273 * before that, the tx_work will not be initialized!
1276 if (!test_bit(WL1271_FLAG_FW_TX_BUSY
, &wl
->flags
) &&
1277 !test_bit(WL1271_FLAG_TX_PENDING
, &wl
->flags
))
1278 ieee80211_queue_work(wl
->hw
, &wl
->tx_work
);
1281 spin_unlock_irqrestore(&wl
->wl_lock
, flags
);
1284 int wl1271_tx_dummy_packet(struct wl1271
*wl
)
1286 unsigned long flags
;
1289 /* no need to queue a new dummy packet if one is already pending */
1290 if (test_bit(WL1271_FLAG_DUMMY_PACKET_PENDING
, &wl
->flags
))
1293 q
= wl1271_tx_get_queue(skb_get_queue_mapping(wl
->dummy_packet
));
1295 spin_lock_irqsave(&wl
->wl_lock
, flags
);
1296 set_bit(WL1271_FLAG_DUMMY_PACKET_PENDING
, &wl
->flags
);
1297 wl
->tx_queue_count
[q
]++;
1298 spin_unlock_irqrestore(&wl
->wl_lock
, flags
);
1300 /* The FW is low on RX memory blocks, so send the dummy packet asap */
1301 if (!test_bit(WL1271_FLAG_FW_TX_BUSY
, &wl
->flags
))
1302 return wlcore_tx_work_locked(wl
);
1305 * If the FW TX is busy, TX work will be scheduled by the threaded
1306 * interrupt handler function
1312 * The size of the dummy packet should be at least 1400 bytes. However, in
1313 * order to minimize the number of bus transactions, aligning it to 512 bytes
1314 * boundaries could be beneficial, performance wise
1316 #define TOTAL_TX_DUMMY_PACKET_SIZE (ALIGN(1400, 512))
1318 static struct sk_buff
*wl12xx_alloc_dummy_packet(struct wl1271
*wl
)
1320 struct sk_buff
*skb
;
1321 struct ieee80211_hdr_3addr
*hdr
;
1322 unsigned int dummy_packet_size
;
1324 dummy_packet_size
= TOTAL_TX_DUMMY_PACKET_SIZE
-
1325 sizeof(struct wl1271_tx_hw_descr
) - sizeof(*hdr
);
1327 skb
= dev_alloc_skb(TOTAL_TX_DUMMY_PACKET_SIZE
);
1329 wl1271_warning("Failed to allocate a dummy packet skb");
1333 skb_reserve(skb
, sizeof(struct wl1271_tx_hw_descr
));
1335 hdr
= skb_put_zero(skb
, sizeof(*hdr
));
1336 hdr
->frame_control
= cpu_to_le16(IEEE80211_FTYPE_DATA
|
1337 IEEE80211_STYPE_NULLFUNC
|
1338 IEEE80211_FCTL_TODS
);
1340 skb_put_zero(skb
, dummy_packet_size
);
1342 /* Dummy packets require the TID to be management */
1343 skb
->priority
= WL1271_TID_MGMT
;
1345 /* Initialize all fields that might be used */
1346 skb_set_queue_mapping(skb
, 0);
1347 memset(IEEE80211_SKB_CB(skb
), 0, sizeof(struct ieee80211_tx_info
));
1354 wl1271_validate_wowlan_pattern(struct cfg80211_pkt_pattern
*p
)
1356 int num_fields
= 0, in_field
= 0, fields_size
= 0;
1357 int i
, pattern_len
= 0;
1360 wl1271_warning("No mask in WoWLAN pattern");
1365 * The pattern is broken up into segments of bytes at different offsets
1366 * that need to be checked by the FW filter. Each segment is called
1367 * a field in the FW API. We verify that the total number of fields
1368 * required for this pattern won't exceed FW limits (8)
1369 * as well as the total fields buffer won't exceed the FW limit.
1370 * Note that if there's a pattern which crosses Ethernet/IP header
1371 * boundary a new field is required.
1373 for (i
= 0; i
< p
->pattern_len
; i
++) {
1374 if (test_bit(i
, (unsigned long *)p
->mask
)) {
1379 if (i
== WL1271_RX_FILTER_ETH_HEADER_SIZE
) {
1381 fields_size
+= pattern_len
+
1382 RX_FILTER_FIELD_OVERHEAD
;
1390 fields_size
+= pattern_len
+
1391 RX_FILTER_FIELD_OVERHEAD
;
1398 fields_size
+= pattern_len
+ RX_FILTER_FIELD_OVERHEAD
;
1402 if (num_fields
> WL1271_RX_FILTER_MAX_FIELDS
) {
1403 wl1271_warning("RX Filter too complex. Too many segments");
1407 if (fields_size
> WL1271_RX_FILTER_MAX_FIELDS_SIZE
) {
1408 wl1271_warning("RX filter pattern is too big");
1415 struct wl12xx_rx_filter
*wl1271_rx_filter_alloc(void)
1417 return kzalloc(sizeof(struct wl12xx_rx_filter
), GFP_KERNEL
);
1420 void wl1271_rx_filter_free(struct wl12xx_rx_filter
*filter
)
1427 for (i
= 0; i
< filter
->num_fields
; i
++)
1428 kfree(filter
->fields
[i
].pattern
);
1433 int wl1271_rx_filter_alloc_field(struct wl12xx_rx_filter
*filter
,
1434 u16 offset
, u8 flags
,
1435 const u8
*pattern
, u8 len
)
1437 struct wl12xx_rx_filter_field
*field
;
1439 if (filter
->num_fields
== WL1271_RX_FILTER_MAX_FIELDS
) {
1440 wl1271_warning("Max fields per RX filter. can't alloc another");
1444 field
= &filter
->fields
[filter
->num_fields
];
1446 field
->pattern
= kmemdup(pattern
, len
, GFP_KERNEL
);
1447 if (!field
->pattern
) {
1448 wl1271_warning("Failed to allocate RX filter pattern");
1452 filter
->num_fields
++;
1454 field
->offset
= cpu_to_le16(offset
);
1455 field
->flags
= flags
;
1461 int wl1271_rx_filter_get_fields_size(struct wl12xx_rx_filter
*filter
)
1463 int i
, fields_size
= 0;
1465 for (i
= 0; i
< filter
->num_fields
; i
++)
1466 fields_size
+= filter
->fields
[i
].len
+
1467 sizeof(struct wl12xx_rx_filter_field
) -
1473 void wl1271_rx_filter_flatten_fields(struct wl12xx_rx_filter
*filter
,
1477 struct wl12xx_rx_filter_field
*field
;
1479 for (i
= 0; i
< filter
->num_fields
; i
++) {
1480 field
= (struct wl12xx_rx_filter_field
*)buf
;
1482 field
->offset
= filter
->fields
[i
].offset
;
1483 field
->flags
= filter
->fields
[i
].flags
;
1484 field
->len
= filter
->fields
[i
].len
;
1486 memcpy(&field
->pattern
, filter
->fields
[i
].pattern
, field
->len
);
1487 buf
+= sizeof(struct wl12xx_rx_filter_field
) -
1488 sizeof(u8
*) + field
->len
;
1493 * Allocates an RX filter returned through f
1494 * which needs to be freed using rx_filter_free()
1497 wl1271_convert_wowlan_pattern_to_rx_filter(struct cfg80211_pkt_pattern
*p
,
1498 struct wl12xx_rx_filter
**f
)
1501 struct wl12xx_rx_filter
*filter
;
1505 filter
= wl1271_rx_filter_alloc();
1507 wl1271_warning("Failed to alloc rx filter");
1513 while (i
< p
->pattern_len
) {
1514 if (!test_bit(i
, (unsigned long *)p
->mask
)) {
1519 for (j
= i
; j
< p
->pattern_len
; j
++) {
1520 if (!test_bit(j
, (unsigned long *)p
->mask
))
1523 if (i
< WL1271_RX_FILTER_ETH_HEADER_SIZE
&&
1524 j
>= WL1271_RX_FILTER_ETH_HEADER_SIZE
)
1528 if (i
< WL1271_RX_FILTER_ETH_HEADER_SIZE
) {
1530 flags
= WL1271_RX_FILTER_FLAG_ETHERNET_HEADER
;
1532 offset
= i
- WL1271_RX_FILTER_ETH_HEADER_SIZE
;
1533 flags
= WL1271_RX_FILTER_FLAG_IP_HEADER
;
1538 ret
= wl1271_rx_filter_alloc_field(filter
,
1541 &p
->pattern
[i
], len
);
1548 filter
->action
= FILTER_SIGNAL
;
1554 wl1271_rx_filter_free(filter
);
1560 static int wl1271_configure_wowlan(struct wl1271
*wl
,
1561 struct cfg80211_wowlan
*wow
)
1565 if (!wow
|| wow
->any
|| !wow
->n_patterns
) {
1566 ret
= wl1271_acx_default_rx_filter_enable(wl
, 0,
1571 ret
= wl1271_rx_filter_clear_all(wl
);
1578 if (WARN_ON(wow
->n_patterns
> WL1271_MAX_RX_FILTERS
))
1581 /* Validate all incoming patterns before clearing current FW state */
1582 for (i
= 0; i
< wow
->n_patterns
; i
++) {
1583 ret
= wl1271_validate_wowlan_pattern(&wow
->patterns
[i
]);
1585 wl1271_warning("Bad wowlan pattern %d", i
);
1590 ret
= wl1271_acx_default_rx_filter_enable(wl
, 0, FILTER_SIGNAL
);
1594 ret
= wl1271_rx_filter_clear_all(wl
);
1598 /* Translate WoWLAN patterns into filters */
1599 for (i
= 0; i
< wow
->n_patterns
; i
++) {
1600 struct cfg80211_pkt_pattern
*p
;
1601 struct wl12xx_rx_filter
*filter
= NULL
;
1603 p
= &wow
->patterns
[i
];
1605 ret
= wl1271_convert_wowlan_pattern_to_rx_filter(p
, &filter
);
1607 wl1271_warning("Failed to create an RX filter from "
1608 "wowlan pattern %d", i
);
1612 ret
= wl1271_rx_filter_enable(wl
, i
, 1, filter
);
1614 wl1271_rx_filter_free(filter
);
1619 ret
= wl1271_acx_default_rx_filter_enable(wl
, 1, FILTER_DROP
);
1625 static int wl1271_configure_suspend_sta(struct wl1271
*wl
,
1626 struct wl12xx_vif
*wlvif
,
1627 struct cfg80211_wowlan
*wow
)
1631 if (!test_bit(WLVIF_FLAG_STA_ASSOCIATED
, &wlvif
->flags
))
1634 ret
= wl1271_configure_wowlan(wl
, wow
);
1638 if ((wl
->conf
.conn
.suspend_wake_up_event
==
1639 wl
->conf
.conn
.wake_up_event
) &&
1640 (wl
->conf
.conn
.suspend_listen_interval
==
1641 wl
->conf
.conn
.listen_interval
))
1644 ret
= wl1271_acx_wake_up_conditions(wl
, wlvif
,
1645 wl
->conf
.conn
.suspend_wake_up_event
,
1646 wl
->conf
.conn
.suspend_listen_interval
);
1649 wl1271_error("suspend: set wake up conditions failed: %d", ret
);
1655 static int wl1271_configure_suspend_ap(struct wl1271
*wl
,
1656 struct wl12xx_vif
*wlvif
,
1657 struct cfg80211_wowlan
*wow
)
1661 if (!test_bit(WLVIF_FLAG_AP_STARTED
, &wlvif
->flags
))
1664 ret
= wl1271_acx_beacon_filter_opt(wl
, wlvif
, true);
1668 ret
= wl1271_configure_wowlan(wl
, wow
);
1677 static int wl1271_configure_suspend(struct wl1271
*wl
,
1678 struct wl12xx_vif
*wlvif
,
1679 struct cfg80211_wowlan
*wow
)
1681 if (wlvif
->bss_type
== BSS_TYPE_STA_BSS
)
1682 return wl1271_configure_suspend_sta(wl
, wlvif
, wow
);
1683 if (wlvif
->bss_type
== BSS_TYPE_AP_BSS
)
1684 return wl1271_configure_suspend_ap(wl
, wlvif
, wow
);
1688 static void wl1271_configure_resume(struct wl1271
*wl
, struct wl12xx_vif
*wlvif
)
1691 bool is_ap
= wlvif
->bss_type
== BSS_TYPE_AP_BSS
;
1692 bool is_sta
= wlvif
->bss_type
== BSS_TYPE_STA_BSS
;
1694 if ((!is_ap
) && (!is_sta
))
1697 if ((is_sta
&& !test_bit(WLVIF_FLAG_STA_ASSOCIATED
, &wlvif
->flags
)) ||
1698 (is_ap
&& !test_bit(WLVIF_FLAG_AP_STARTED
, &wlvif
->flags
)))
1701 wl1271_configure_wowlan(wl
, NULL
);
1704 if ((wl
->conf
.conn
.suspend_wake_up_event
==
1705 wl
->conf
.conn
.wake_up_event
) &&
1706 (wl
->conf
.conn
.suspend_listen_interval
==
1707 wl
->conf
.conn
.listen_interval
))
1710 ret
= wl1271_acx_wake_up_conditions(wl
, wlvif
,
1711 wl
->conf
.conn
.wake_up_event
,
1712 wl
->conf
.conn
.listen_interval
);
1715 wl1271_error("resume: wake up conditions failed: %d",
1719 ret
= wl1271_acx_beacon_filter_opt(wl
, wlvif
, false);
1723 static int __maybe_unused
wl1271_op_suspend(struct ieee80211_hw
*hw
,
1724 struct cfg80211_wowlan
*wow
)
1726 struct wl1271
*wl
= hw
->priv
;
1727 struct wl12xx_vif
*wlvif
;
1728 unsigned long flags
;
1731 wl1271_debug(DEBUG_MAC80211
, "mac80211 suspend wow=%d", !!wow
);
1734 /* we want to perform the recovery before suspending */
1735 if (test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS
, &wl
->flags
)) {
1736 wl1271_warning("postponing suspend to perform recovery");
1740 wl1271_tx_flush(wl
);
1742 mutex_lock(&wl
->mutex
);
1744 ret
= pm_runtime_get_sync(wl
->dev
);
1746 pm_runtime_put_noidle(wl
->dev
);
1747 mutex_unlock(&wl
->mutex
);
1751 wl
->wow_enabled
= true;
1752 wl12xx_for_each_wlvif(wl
, wlvif
) {
1753 if (wlcore_is_p2p_mgmt(wlvif
))
1756 ret
= wl1271_configure_suspend(wl
, wlvif
, wow
);
1762 /* disable fast link flow control notifications from FW */
1763 ret
= wlcore_hw_interrupt_notify(wl
, false);
1767 /* if filtering is enabled, configure the FW to drop all RX BA frames */
1768 ret
= wlcore_hw_rx_ba_filter(wl
,
1769 !!wl
->conf
.conn
.suspend_rx_ba_activity
);
1774 pm_runtime_put_noidle(wl
->dev
);
1775 mutex_unlock(&wl
->mutex
);
1778 wl1271_warning("couldn't prepare device to suspend");
1782 /* flush any remaining work */
1783 wl1271_debug(DEBUG_MAC80211
, "flushing remaining works");
1785 flush_work(&wl
->tx_work
);
1788 * Cancel the watchdog even if above tx_flush failed. We will detect
1789 * it on resume anyway.
1791 cancel_delayed_work(&wl
->tx_watchdog_work
);
1794 * set suspended flag to avoid triggering a new threaded_irq
1797 spin_lock_irqsave(&wl
->wl_lock
, flags
);
1798 set_bit(WL1271_FLAG_SUSPENDED
, &wl
->flags
);
1799 spin_unlock_irqrestore(&wl
->wl_lock
, flags
);
1801 return pm_runtime_force_suspend(wl
->dev
);
1804 static int __maybe_unused
wl1271_op_resume(struct ieee80211_hw
*hw
)
1806 struct wl1271
*wl
= hw
->priv
;
1807 struct wl12xx_vif
*wlvif
;
1808 unsigned long flags
;
1809 bool run_irq_work
= false, pending_recovery
;
1812 wl1271_debug(DEBUG_MAC80211
, "mac80211 resume wow=%d",
1814 WARN_ON(!wl
->wow_enabled
);
1816 ret
= pm_runtime_force_resume(wl
->dev
);
1818 wl1271_error("ELP wakeup failure!");
1823 * re-enable irq_work enqueuing, and call irq_work directly if
1824 * there is a pending work.
1826 spin_lock_irqsave(&wl
->wl_lock
, flags
);
1827 clear_bit(WL1271_FLAG_SUSPENDED
, &wl
->flags
);
1828 if (test_and_clear_bit(WL1271_FLAG_PENDING_WORK
, &wl
->flags
))
1829 run_irq_work
= true;
1830 spin_unlock_irqrestore(&wl
->wl_lock
, flags
);
1832 mutex_lock(&wl
->mutex
);
1834 /* test the recovery flag before calling any SDIO functions */
1835 pending_recovery
= test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS
,
1839 wl1271_debug(DEBUG_MAC80211
,
1840 "run postponed irq_work directly");
1842 /* don't talk to the HW if recovery is pending */
1843 if (!pending_recovery
) {
1844 ret
= wlcore_irq_locked(wl
);
1846 wl12xx_queue_recovery_work(wl
);
1849 wlcore_enable_interrupts(wl
);
1852 if (pending_recovery
) {
1853 wl1271_warning("queuing forgotten recovery on resume");
1854 ieee80211_queue_work(wl
->hw
, &wl
->recovery_work
);
1858 ret
= pm_runtime_get_sync(wl
->dev
);
1860 pm_runtime_put_noidle(wl
->dev
);
1864 wl12xx_for_each_wlvif(wl
, wlvif
) {
1865 if (wlcore_is_p2p_mgmt(wlvif
))
1868 wl1271_configure_resume(wl
, wlvif
);
1871 ret
= wlcore_hw_interrupt_notify(wl
, true);
1875 /* if filtering is enabled, configure the FW to drop all RX BA frames */
1876 ret
= wlcore_hw_rx_ba_filter(wl
, false);
1881 pm_runtime_mark_last_busy(wl
->dev
);
1882 pm_runtime_put_autosuspend(wl
->dev
);
1885 wl
->wow_enabled
= false;
1888 * Set a flag to re-init the watchdog on the first Tx after resume.
1889 * That way we avoid possible conditions where Tx-complete interrupts
1890 * fail to arrive and we perform a spurious recovery.
1892 set_bit(WL1271_FLAG_REINIT_TX_WDOG
, &wl
->flags
);
1893 mutex_unlock(&wl
->mutex
);
1898 static int wl1271_op_start(struct ieee80211_hw
*hw
)
1900 wl1271_debug(DEBUG_MAC80211
, "mac80211 start");
1903 * We have to delay the booting of the hardware because
1904 * we need to know the local MAC address before downloading and
1905 * initializing the firmware. The MAC address cannot be changed
1906 * after boot, and without the proper MAC address, the firmware
1907 * will not function properly.
1909 * The MAC address is first known when the corresponding interface
1910 * is added. That is where we will initialize the hardware.
1916 static void wlcore_op_stop_locked(struct wl1271
*wl
)
1920 if (wl
->state
== WLCORE_STATE_OFF
) {
1921 if (test_and_clear_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS
,
1923 wlcore_enable_interrupts(wl
);
1929 * this must be before the cancel_work calls below, so that the work
1930 * functions don't perform further work.
1932 wl
->state
= WLCORE_STATE_OFF
;
1935 * Use the nosync variant to disable interrupts, so the mutex could be
1936 * held while doing so without deadlocking.
1938 wlcore_disable_interrupts_nosync(wl
);
1940 mutex_unlock(&wl
->mutex
);
1942 wlcore_synchronize_interrupts(wl
);
1943 if (!test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS
, &wl
->flags
))
1944 cancel_work_sync(&wl
->recovery_work
);
1945 wl1271_flush_deferred_work(wl
);
1946 cancel_delayed_work_sync(&wl
->scan_complete_work
);
1947 cancel_work_sync(&wl
->netstack_work
);
1948 cancel_work_sync(&wl
->tx_work
);
1949 cancel_delayed_work_sync(&wl
->tx_watchdog_work
);
1951 /* let's notify MAC80211 about the remaining pending TX frames */
1952 mutex_lock(&wl
->mutex
);
1953 wl12xx_tx_reset(wl
);
1955 wl1271_power_off(wl
);
1957 * In case a recovery was scheduled, interrupts were disabled to avoid
1958 * an interrupt storm. Now that the power is down, it is safe to
1959 * re-enable interrupts to balance the disable depth
1961 if (test_and_clear_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS
, &wl
->flags
))
1962 wlcore_enable_interrupts(wl
);
1964 wl
->band
= NL80211_BAND_2GHZ
;
1967 wl
->power_level
= WL1271_DEFAULT_POWER_LEVEL
;
1968 wl
->channel_type
= NL80211_CHAN_NO_HT
;
1969 wl
->tx_blocks_available
= 0;
1970 wl
->tx_allocated_blocks
= 0;
1971 wl
->tx_results_count
= 0;
1972 wl
->tx_packets_count
= 0;
1973 wl
->time_offset
= 0;
1974 wl
->ap_fw_ps_map
= 0;
1976 wl
->sleep_auth
= WL1271_PSM_ILLEGAL
;
1977 memset(wl
->roles_map
, 0, sizeof(wl
->roles_map
));
1978 memset(wl
->links_map
, 0, sizeof(wl
->links_map
));
1979 memset(wl
->roc_map
, 0, sizeof(wl
->roc_map
));
1980 memset(wl
->session_ids
, 0, sizeof(wl
->session_ids
));
1981 memset(wl
->rx_filter_enabled
, 0, sizeof(wl
->rx_filter_enabled
));
1982 wl
->active_sta_count
= 0;
1983 wl
->active_link_count
= 0;
1985 /* The system link is always allocated */
1986 wl
->links
[WL12XX_SYSTEM_HLID
].allocated_pkts
= 0;
1987 wl
->links
[WL12XX_SYSTEM_HLID
].prev_freed_pkts
= 0;
1988 __set_bit(WL12XX_SYSTEM_HLID
, wl
->links_map
);
1991 * this is performed after the cancel_work calls and the associated
1992 * mutex_lock, so that wl1271_op_add_interface does not accidentally
1993 * get executed before all these vars have been reset.
1997 wl
->tx_blocks_freed
= 0;
1999 for (i
= 0; i
< NUM_TX_QUEUES
; i
++) {
2000 wl
->tx_pkts_freed
[i
] = 0;
2001 wl
->tx_allocated_pkts
[i
] = 0;
2004 wl1271_debugfs_reset(wl
);
2006 kfree(wl
->raw_fw_status
);
2007 wl
->raw_fw_status
= NULL
;
2008 kfree(wl
->fw_status
);
2009 wl
->fw_status
= NULL
;
2010 kfree(wl
->tx_res_if
);
2011 wl
->tx_res_if
= NULL
;
2012 kfree(wl
->target_mem_map
);
2013 wl
->target_mem_map
= NULL
;
2016 * FW channels must be re-calibrated after recovery,
2017 * save current Reg-Domain channel configuration and clear it.
2019 memcpy(wl
->reg_ch_conf_pending
, wl
->reg_ch_conf_last
,
2020 sizeof(wl
->reg_ch_conf_pending
));
2021 memset(wl
->reg_ch_conf_last
, 0, sizeof(wl
->reg_ch_conf_last
));
2024 static void wlcore_op_stop(struct ieee80211_hw
*hw
)
2026 struct wl1271
*wl
= hw
->priv
;
2028 wl1271_debug(DEBUG_MAC80211
, "mac80211 stop");
2030 mutex_lock(&wl
->mutex
);
2032 wlcore_op_stop_locked(wl
);
2034 mutex_unlock(&wl
->mutex
);
2037 static void wlcore_channel_switch_work(struct work_struct
*work
)
2039 struct delayed_work
*dwork
;
2041 struct ieee80211_vif
*vif
;
2042 struct wl12xx_vif
*wlvif
;
2045 dwork
= to_delayed_work(work
);
2046 wlvif
= container_of(dwork
, struct wl12xx_vif
, channel_switch_work
);
2049 wl1271_info("channel switch failed (role_id: %d).", wlvif
->role_id
);
2051 mutex_lock(&wl
->mutex
);
2053 if (unlikely(wl
->state
!= WLCORE_STATE_ON
))
2056 /* check the channel switch is still ongoing */
2057 if (!test_and_clear_bit(WLVIF_FLAG_CS_PROGRESS
, &wlvif
->flags
))
2060 vif
= wl12xx_wlvif_to_vif(wlvif
);
2061 ieee80211_chswitch_done(vif
, false);
2063 ret
= pm_runtime_get_sync(wl
->dev
);
2065 pm_runtime_put_noidle(wl
->dev
);
2069 wl12xx_cmd_stop_channel_switch(wl
, wlvif
);
2071 pm_runtime_mark_last_busy(wl
->dev
);
2072 pm_runtime_put_autosuspend(wl
->dev
);
2074 mutex_unlock(&wl
->mutex
);
2077 static void wlcore_connection_loss_work(struct work_struct
*work
)
2079 struct delayed_work
*dwork
;
2081 struct ieee80211_vif
*vif
;
2082 struct wl12xx_vif
*wlvif
;
2084 dwork
= to_delayed_work(work
);
2085 wlvif
= container_of(dwork
, struct wl12xx_vif
, connection_loss_work
);
2088 wl1271_info("Connection loss work (role_id: %d).", wlvif
->role_id
);
2090 mutex_lock(&wl
->mutex
);
2092 if (unlikely(wl
->state
!= WLCORE_STATE_ON
))
2095 /* Call mac80211 connection loss */
2096 if (!test_bit(WLVIF_FLAG_STA_ASSOCIATED
, &wlvif
->flags
))
2099 vif
= wl12xx_wlvif_to_vif(wlvif
);
2100 ieee80211_connection_loss(vif
);
2102 mutex_unlock(&wl
->mutex
);
2105 static void wlcore_pending_auth_complete_work(struct work_struct
*work
)
2107 struct delayed_work
*dwork
;
2109 struct wl12xx_vif
*wlvif
;
2110 unsigned long time_spare
;
2113 dwork
= to_delayed_work(work
);
2114 wlvif
= container_of(dwork
, struct wl12xx_vif
,
2115 pending_auth_complete_work
);
2118 mutex_lock(&wl
->mutex
);
2120 if (unlikely(wl
->state
!= WLCORE_STATE_ON
))
2124 * Make sure a second really passed since the last auth reply. Maybe
2125 * a second auth reply arrived while we were stuck on the mutex.
2126 * Check for a little less than the timeout to protect from scheduler
2129 time_spare
= jiffies
+
2130 msecs_to_jiffies(WLCORE_PEND_AUTH_ROC_TIMEOUT
- 50);
2131 if (!time_after(time_spare
, wlvif
->pending_auth_reply_time
))
2134 ret
= pm_runtime_get_sync(wl
->dev
);
2136 pm_runtime_put_noidle(wl
->dev
);
2140 /* cancel the ROC if active */
2141 wlcore_update_inconn_sta(wl
, wlvif
, NULL
, false);
2143 pm_runtime_mark_last_busy(wl
->dev
);
2144 pm_runtime_put_autosuspend(wl
->dev
);
2146 mutex_unlock(&wl
->mutex
);
2149 static int wl12xx_allocate_rate_policy(struct wl1271
*wl
, u8
*idx
)
2151 u8 policy
= find_first_zero_bit(wl
->rate_policies_map
,
2152 WL12XX_MAX_RATE_POLICIES
);
2153 if (policy
>= WL12XX_MAX_RATE_POLICIES
)
2156 __set_bit(policy
, wl
->rate_policies_map
);
2161 static void wl12xx_free_rate_policy(struct wl1271
*wl
, u8
*idx
)
2163 if (WARN_ON(*idx
>= WL12XX_MAX_RATE_POLICIES
))
2166 __clear_bit(*idx
, wl
->rate_policies_map
);
2167 *idx
= WL12XX_MAX_RATE_POLICIES
;
2170 static int wlcore_allocate_klv_template(struct wl1271
*wl
, u8
*idx
)
2172 u8 policy
= find_first_zero_bit(wl
->klv_templates_map
,
2173 WLCORE_MAX_KLV_TEMPLATES
);
2174 if (policy
>= WLCORE_MAX_KLV_TEMPLATES
)
2177 __set_bit(policy
, wl
->klv_templates_map
);
2182 static void wlcore_free_klv_template(struct wl1271
*wl
, u8
*idx
)
2184 if (WARN_ON(*idx
>= WLCORE_MAX_KLV_TEMPLATES
))
2187 __clear_bit(*idx
, wl
->klv_templates_map
);
2188 *idx
= WLCORE_MAX_KLV_TEMPLATES
;
2191 static u8
wl12xx_get_role_type(struct wl1271
*wl
, struct wl12xx_vif
*wlvif
)
2193 struct ieee80211_vif
*vif
= wl12xx_wlvif_to_vif(wlvif
);
2195 switch (wlvif
->bss_type
) {
2196 case BSS_TYPE_AP_BSS
:
2198 return WL1271_ROLE_P2P_GO
;
2199 else if (ieee80211_vif_is_mesh(vif
))
2200 return WL1271_ROLE_MESH_POINT
;
2202 return WL1271_ROLE_AP
;
2204 case BSS_TYPE_STA_BSS
:
2206 return WL1271_ROLE_P2P_CL
;
2208 return WL1271_ROLE_STA
;
2211 return WL1271_ROLE_IBSS
;
2214 wl1271_error("invalid bss_type: %d", wlvif
->bss_type
);
2216 return WL12XX_INVALID_ROLE_TYPE
;
2219 static int wl12xx_init_vif_data(struct wl1271
*wl
, struct ieee80211_vif
*vif
)
2221 struct wl12xx_vif
*wlvif
= wl12xx_vif_to_data(vif
);
2224 /* clear everything but the persistent data */
2225 memset(wlvif
, 0, offsetof(struct wl12xx_vif
, persistent
));
2227 switch (ieee80211_vif_type_p2p(vif
)) {
2228 case NL80211_IFTYPE_P2P_CLIENT
:
2231 case NL80211_IFTYPE_STATION
:
2232 case NL80211_IFTYPE_P2P_DEVICE
:
2233 wlvif
->bss_type
= BSS_TYPE_STA_BSS
;
2235 case NL80211_IFTYPE_ADHOC
:
2236 wlvif
->bss_type
= BSS_TYPE_IBSS
;
2238 case NL80211_IFTYPE_P2P_GO
:
2241 case NL80211_IFTYPE_AP
:
2242 case NL80211_IFTYPE_MESH_POINT
:
2243 wlvif
->bss_type
= BSS_TYPE_AP_BSS
;
2246 wlvif
->bss_type
= MAX_BSS_TYPE
;
2250 wlvif
->role_id
= WL12XX_INVALID_ROLE_ID
;
2251 wlvif
->dev_role_id
= WL12XX_INVALID_ROLE_ID
;
2252 wlvif
->dev_hlid
= WL12XX_INVALID_LINK_ID
;
2254 if (wlvif
->bss_type
== BSS_TYPE_STA_BSS
||
2255 wlvif
->bss_type
== BSS_TYPE_IBSS
) {
2256 /* init sta/ibss data */
2257 wlvif
->sta
.hlid
= WL12XX_INVALID_LINK_ID
;
2258 wl12xx_allocate_rate_policy(wl
, &wlvif
->sta
.basic_rate_idx
);
2259 wl12xx_allocate_rate_policy(wl
, &wlvif
->sta
.ap_rate_idx
);
2260 wl12xx_allocate_rate_policy(wl
, &wlvif
->sta
.p2p_rate_idx
);
2261 wlcore_allocate_klv_template(wl
, &wlvif
->sta
.klv_template_id
);
2262 wlvif
->basic_rate_set
= CONF_TX_RATE_MASK_BASIC
;
2263 wlvif
->basic_rate
= CONF_TX_RATE_MASK_BASIC
;
2264 wlvif
->rate_set
= CONF_TX_RATE_MASK_BASIC
;
2267 wlvif
->ap
.bcast_hlid
= WL12XX_INVALID_LINK_ID
;
2268 wlvif
->ap
.global_hlid
= WL12XX_INVALID_LINK_ID
;
2269 wl12xx_allocate_rate_policy(wl
, &wlvif
->ap
.mgmt_rate_idx
);
2270 wl12xx_allocate_rate_policy(wl
, &wlvif
->ap
.bcast_rate_idx
);
2271 for (i
= 0; i
< CONF_TX_MAX_AC_COUNT
; i
++)
2272 wl12xx_allocate_rate_policy(wl
,
2273 &wlvif
->ap
.ucast_rate_idx
[i
]);
2274 wlvif
->basic_rate_set
= CONF_TX_ENABLED_RATES
;
2276 * TODO: check if basic_rate shouldn't be
2277 * wl1271_tx_min_rate_get(wl, wlvif->basic_rate_set);
2278 * instead (the same thing for STA above).
2280 wlvif
->basic_rate
= CONF_TX_ENABLED_RATES
;
2281 /* TODO: this seems to be used only for STA, check it */
2282 wlvif
->rate_set
= CONF_TX_ENABLED_RATES
;
2285 wlvif
->bitrate_masks
[NL80211_BAND_2GHZ
] = wl
->conf
.tx
.basic_rate
;
2286 wlvif
->bitrate_masks
[NL80211_BAND_5GHZ
] = wl
->conf
.tx
.basic_rate_5
;
2287 wlvif
->beacon_int
= WL1271_DEFAULT_BEACON_INT
;
2290 * mac80211 configures some values globally, while we treat them
2291 * per-interface. thus, on init, we have to copy them from wl
2293 wlvif
->band
= wl
->band
;
2294 wlvif
->channel
= wl
->channel
;
2295 wlvif
->power_level
= wl
->power_level
;
2296 wlvif
->channel_type
= wl
->channel_type
;
2298 INIT_WORK(&wlvif
->rx_streaming_enable_work
,
2299 wl1271_rx_streaming_enable_work
);
2300 INIT_WORK(&wlvif
->rx_streaming_disable_work
,
2301 wl1271_rx_streaming_disable_work
);
2302 INIT_WORK(&wlvif
->rc_update_work
, wlcore_rc_update_work
);
2303 INIT_DELAYED_WORK(&wlvif
->channel_switch_work
,
2304 wlcore_channel_switch_work
);
2305 INIT_DELAYED_WORK(&wlvif
->connection_loss_work
,
2306 wlcore_connection_loss_work
);
2307 INIT_DELAYED_WORK(&wlvif
->pending_auth_complete_work
,
2308 wlcore_pending_auth_complete_work
);
2309 INIT_LIST_HEAD(&wlvif
->list
);
2311 timer_setup(&wlvif
->rx_streaming_timer
, wl1271_rx_streaming_timer
, 0);
2315 static int wl12xx_init_fw(struct wl1271
*wl
)
2317 int retries
= WL1271_BOOT_RETRIES
;
2318 bool booted
= false;
2319 struct wiphy
*wiphy
= wl
->hw
->wiphy
;
2324 ret
= wl12xx_chip_wakeup(wl
, false);
2328 ret
= wl
->ops
->boot(wl
);
2332 ret
= wl1271_hw_init(wl
);
2340 mutex_unlock(&wl
->mutex
);
2341 /* Unlocking the mutex in the middle of handling is
2342 inherently unsafe. In this case we deem it safe to do,
2343 because we need to let any possibly pending IRQ out of
2344 the system (and while we are WLCORE_STATE_OFF the IRQ
2345 work function will not do anything.) Also, any other
2346 possible concurrent operations will fail due to the
2347 current state, hence the wl1271 struct should be safe. */
2348 wlcore_disable_interrupts(wl
);
2349 wl1271_flush_deferred_work(wl
);
2350 cancel_work_sync(&wl
->netstack_work
);
2351 mutex_lock(&wl
->mutex
);
2353 wl1271_power_off(wl
);
2357 wl1271_error("firmware boot failed despite %d retries",
2358 WL1271_BOOT_RETRIES
);
2362 wl1271_info("firmware booted (%s)", wl
->chip
.fw_ver_str
);
2364 /* update hw/fw version info in wiphy struct */
2365 wiphy
->hw_version
= wl
->chip
.id
;
2366 strncpy(wiphy
->fw_version
, wl
->chip
.fw_ver_str
,
2367 sizeof(wiphy
->fw_version
));
2370 * Now we know if 11a is supported (info from the NVS), so disable
2371 * 11a channels if not supported
2373 if (!wl
->enable_11a
)
2374 wiphy
->bands
[NL80211_BAND_5GHZ
]->n_channels
= 0;
2376 wl1271_debug(DEBUG_MAC80211
, "11a is %ssupported",
2377 wl
->enable_11a
? "" : "not ");
2379 wl
->state
= WLCORE_STATE_ON
;
2384 static bool wl12xx_dev_role_started(struct wl12xx_vif
*wlvif
)
2386 return wlvif
->dev_hlid
!= WL12XX_INVALID_LINK_ID
;
2390 * Check whether a fw switch (i.e. moving from one loaded
2391 * fw to another) is needed. This function is also responsible
2392 * for updating wl->last_vif_count, so it must be called before
2393 * loading a non-plt fw (so the correct fw (single-role/multi-role)
2396 static bool wl12xx_need_fw_change(struct wl1271
*wl
,
2397 struct vif_counter_data vif_counter_data
,
2400 enum wl12xx_fw_type current_fw
= wl
->fw_type
;
2401 u8 vif_count
= vif_counter_data
.counter
;
2403 if (test_bit(WL1271_FLAG_VIF_CHANGE_IN_PROGRESS
, &wl
->flags
))
2406 /* increase the vif count if this is a new vif */
2407 if (add
&& !vif_counter_data
.cur_vif_running
)
2410 wl
->last_vif_count
= vif_count
;
2412 /* no need for fw change if the device is OFF */
2413 if (wl
->state
== WLCORE_STATE_OFF
)
2416 /* no need for fw change if a single fw is used */
2417 if (!wl
->mr_fw_name
)
2420 if (vif_count
> 1 && current_fw
== WL12XX_FW_TYPE_NORMAL
)
2422 if (vif_count
<= 1 && current_fw
== WL12XX_FW_TYPE_MULTI
)
2429 * Enter "forced psm". Make sure the sta is in psm against the ap,
2430 * to make the fw switch a bit more disconnection-persistent.
2432 static void wl12xx_force_active_psm(struct wl1271
*wl
)
2434 struct wl12xx_vif
*wlvif
;
2436 wl12xx_for_each_wlvif_sta(wl
, wlvif
) {
2437 wl1271_ps_set_mode(wl
, wlvif
, STATION_POWER_SAVE_MODE
);
2441 struct wlcore_hw_queue_iter_data
{
2442 unsigned long hw_queue_map
[BITS_TO_LONGS(WLCORE_NUM_MAC_ADDRESSES
)];
2444 struct ieee80211_vif
*vif
;
2445 /* is the current vif among those iterated */
2449 static void wlcore_hw_queue_iter(void *data
, u8
*mac
,
2450 struct ieee80211_vif
*vif
)
2452 struct wlcore_hw_queue_iter_data
*iter_data
= data
;
2454 if (vif
->type
== NL80211_IFTYPE_P2P_DEVICE
||
2455 WARN_ON_ONCE(vif
->hw_queue
[0] == IEEE80211_INVAL_HW_QUEUE
))
2458 if (iter_data
->cur_running
|| vif
== iter_data
->vif
) {
2459 iter_data
->cur_running
= true;
2463 __set_bit(vif
->hw_queue
[0] / NUM_TX_QUEUES
, iter_data
->hw_queue_map
);
2466 static int wlcore_allocate_hw_queue_base(struct wl1271
*wl
,
2467 struct wl12xx_vif
*wlvif
)
2469 struct ieee80211_vif
*vif
= wl12xx_wlvif_to_vif(wlvif
);
2470 struct wlcore_hw_queue_iter_data iter_data
= {};
2473 if (vif
->type
== NL80211_IFTYPE_P2P_DEVICE
) {
2474 vif
->cab_queue
= IEEE80211_INVAL_HW_QUEUE
;
2478 iter_data
.vif
= vif
;
2480 /* mark all bits taken by active interfaces */
2481 ieee80211_iterate_active_interfaces_atomic(wl
->hw
,
2482 IEEE80211_IFACE_ITER_RESUME_ALL
,
2483 wlcore_hw_queue_iter
, &iter_data
);
2485 /* the current vif is already running in mac80211 (resume/recovery) */
2486 if (iter_data
.cur_running
) {
2487 wlvif
->hw_queue_base
= vif
->hw_queue
[0];
2488 wl1271_debug(DEBUG_MAC80211
,
2489 "using pre-allocated hw queue base %d",
2490 wlvif
->hw_queue_base
);
2492 /* interface type might have changed type */
2493 goto adjust_cab_queue
;
2496 q_base
= find_first_zero_bit(iter_data
.hw_queue_map
,
2497 WLCORE_NUM_MAC_ADDRESSES
);
2498 if (q_base
>= WLCORE_NUM_MAC_ADDRESSES
)
2501 wlvif
->hw_queue_base
= q_base
* NUM_TX_QUEUES
;
2502 wl1271_debug(DEBUG_MAC80211
, "allocating hw queue base: %d",
2503 wlvif
->hw_queue_base
);
2505 for (i
= 0; i
< NUM_TX_QUEUES
; i
++) {
2506 wl
->queue_stop_reasons
[wlvif
->hw_queue_base
+ i
] = 0;
2507 /* register hw queues in mac80211 */
2508 vif
->hw_queue
[i
] = wlvif
->hw_queue_base
+ i
;
2512 /* the last places are reserved for cab queues per interface */
2513 if (wlvif
->bss_type
== BSS_TYPE_AP_BSS
)
2514 vif
->cab_queue
= NUM_TX_QUEUES
* WLCORE_NUM_MAC_ADDRESSES
+
2515 wlvif
->hw_queue_base
/ NUM_TX_QUEUES
;
2517 vif
->cab_queue
= IEEE80211_INVAL_HW_QUEUE
;
2522 static int wl1271_op_add_interface(struct ieee80211_hw
*hw
,
2523 struct ieee80211_vif
*vif
)
2525 struct wl1271
*wl
= hw
->priv
;
2526 struct wl12xx_vif
*wlvif
= wl12xx_vif_to_data(vif
);
2527 struct vif_counter_data vif_count
;
2532 wl1271_error("Adding Interface not allowed while in PLT mode");
2536 vif
->driver_flags
|= IEEE80211_VIF_BEACON_FILTER
|
2537 IEEE80211_VIF_SUPPORTS_UAPSD
|
2538 IEEE80211_VIF_SUPPORTS_CQM_RSSI
;
2540 wl1271_debug(DEBUG_MAC80211
, "mac80211 add interface type %d mac %pM",
2541 ieee80211_vif_type_p2p(vif
), vif
->addr
);
2543 wl12xx_get_vif_count(hw
, vif
, &vif_count
);
2545 mutex_lock(&wl
->mutex
);
2548 * in some very corner case HW recovery scenarios its possible to
2549 * get here before __wl1271_op_remove_interface is complete, so
2550 * opt out if that is the case.
2552 if (test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS
, &wl
->flags
) ||
2553 test_bit(WLVIF_FLAG_INITIALIZED
, &wlvif
->flags
)) {
2559 ret
= wl12xx_init_vif_data(wl
, vif
);
2564 role_type
= wl12xx_get_role_type(wl
, wlvif
);
2565 if (role_type
== WL12XX_INVALID_ROLE_TYPE
) {
2570 ret
= wlcore_allocate_hw_queue_base(wl
, wlvif
);
2575 * TODO: after the nvs issue will be solved, move this block
2576 * to start(), and make sure here the driver is ON.
2578 if (wl
->state
== WLCORE_STATE_OFF
) {
2580 * we still need this in order to configure the fw
2581 * while uploading the nvs
2583 memcpy(wl
->addresses
[0].addr
, vif
->addr
, ETH_ALEN
);
2585 ret
= wl12xx_init_fw(wl
);
2591 * Call runtime PM only after possible wl12xx_init_fw() above
2592 * is done. Otherwise we do not have interrupts enabled.
2594 ret
= pm_runtime_get_sync(wl
->dev
);
2596 pm_runtime_put_noidle(wl
->dev
);
2600 if (wl12xx_need_fw_change(wl
, vif_count
, true)) {
2601 wl12xx_force_active_psm(wl
);
2602 set_bit(WL1271_FLAG_INTENDED_FW_RECOVERY
, &wl
->flags
);
2603 mutex_unlock(&wl
->mutex
);
2604 wl1271_recovery_work(&wl
->recovery_work
);
2608 if (!wlcore_is_p2p_mgmt(wlvif
)) {
2609 ret
= wl12xx_cmd_role_enable(wl
, vif
->addr
,
2610 role_type
, &wlvif
->role_id
);
2614 ret
= wl1271_init_vif_specific(wl
, vif
);
2619 ret
= wl12xx_cmd_role_enable(wl
, vif
->addr
, WL1271_ROLE_DEVICE
,
2620 &wlvif
->dev_role_id
);
2624 /* needed mainly for configuring rate policies */
2625 ret
= wl1271_sta_hw_init(wl
, wlvif
);
2630 list_add(&wlvif
->list
, &wl
->wlvif_list
);
2631 set_bit(WLVIF_FLAG_INITIALIZED
, &wlvif
->flags
);
2633 if (wlvif
->bss_type
== BSS_TYPE_AP_BSS
)
2638 pm_runtime_mark_last_busy(wl
->dev
);
2639 pm_runtime_put_autosuspend(wl
->dev
);
2641 mutex_unlock(&wl
->mutex
);
2646 static void __wl1271_op_remove_interface(struct wl1271
*wl
,
2647 struct ieee80211_vif
*vif
,
2648 bool reset_tx_queues
)
2650 struct wl12xx_vif
*wlvif
= wl12xx_vif_to_data(vif
);
2652 bool is_ap
= (wlvif
->bss_type
== BSS_TYPE_AP_BSS
);
2654 wl1271_debug(DEBUG_MAC80211
, "mac80211 remove interface");
2656 if (!test_and_clear_bit(WLVIF_FLAG_INITIALIZED
, &wlvif
->flags
))
2659 /* because of hardware recovery, we may get here twice */
2660 if (wl
->state
== WLCORE_STATE_OFF
)
2663 wl1271_info("down");
2665 if (wl
->scan
.state
!= WL1271_SCAN_STATE_IDLE
&&
2666 wl
->scan_wlvif
== wlvif
) {
2667 struct cfg80211_scan_info info
= {
2672 * Rearm the tx watchdog just before idling scan. This
2673 * prevents just-finished scans from triggering the watchdog
2675 wl12xx_rearm_tx_watchdog_locked(wl
);
2677 wl
->scan
.state
= WL1271_SCAN_STATE_IDLE
;
2678 memset(wl
->scan
.scanned_ch
, 0, sizeof(wl
->scan
.scanned_ch
));
2679 wl
->scan_wlvif
= NULL
;
2680 wl
->scan
.req
= NULL
;
2681 ieee80211_scan_completed(wl
->hw
, &info
);
2684 if (wl
->sched_vif
== wlvif
)
2685 wl
->sched_vif
= NULL
;
2687 if (wl
->roc_vif
== vif
) {
2689 ieee80211_remain_on_channel_expired(wl
->hw
);
2692 if (!test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS
, &wl
->flags
)) {
2693 /* disable active roles */
2694 ret
= pm_runtime_get_sync(wl
->dev
);
2696 pm_runtime_put_noidle(wl
->dev
);
2700 if (wlvif
->bss_type
== BSS_TYPE_STA_BSS
||
2701 wlvif
->bss_type
== BSS_TYPE_IBSS
) {
2702 if (wl12xx_dev_role_started(wlvif
))
2703 wl12xx_stop_dev(wl
, wlvif
);
2706 if (!wlcore_is_p2p_mgmt(wlvif
)) {
2707 ret
= wl12xx_cmd_role_disable(wl
, &wlvif
->role_id
);
2709 pm_runtime_put_noidle(wl
->dev
);
2713 ret
= wl12xx_cmd_role_disable(wl
, &wlvif
->dev_role_id
);
2715 pm_runtime_put_noidle(wl
->dev
);
2720 pm_runtime_mark_last_busy(wl
->dev
);
2721 pm_runtime_put_autosuspend(wl
->dev
);
2724 wl12xx_tx_reset_wlvif(wl
, wlvif
);
2726 /* clear all hlids (except system_hlid) */
2727 wlvif
->dev_hlid
= WL12XX_INVALID_LINK_ID
;
2729 if (wlvif
->bss_type
== BSS_TYPE_STA_BSS
||
2730 wlvif
->bss_type
== BSS_TYPE_IBSS
) {
2731 wlvif
->sta
.hlid
= WL12XX_INVALID_LINK_ID
;
2732 wl12xx_free_rate_policy(wl
, &wlvif
->sta
.basic_rate_idx
);
2733 wl12xx_free_rate_policy(wl
, &wlvif
->sta
.ap_rate_idx
);
2734 wl12xx_free_rate_policy(wl
, &wlvif
->sta
.p2p_rate_idx
);
2735 wlcore_free_klv_template(wl
, &wlvif
->sta
.klv_template_id
);
2737 wlvif
->ap
.bcast_hlid
= WL12XX_INVALID_LINK_ID
;
2738 wlvif
->ap
.global_hlid
= WL12XX_INVALID_LINK_ID
;
2739 wl12xx_free_rate_policy(wl
, &wlvif
->ap
.mgmt_rate_idx
);
2740 wl12xx_free_rate_policy(wl
, &wlvif
->ap
.bcast_rate_idx
);
2741 for (i
= 0; i
< CONF_TX_MAX_AC_COUNT
; i
++)
2742 wl12xx_free_rate_policy(wl
,
2743 &wlvif
->ap
.ucast_rate_idx
[i
]);
2744 wl1271_free_ap_keys(wl
, wlvif
);
2747 dev_kfree_skb(wlvif
->probereq
);
2748 wlvif
->probereq
= NULL
;
2749 if (wl
->last_wlvif
== wlvif
)
2750 wl
->last_wlvif
= NULL
;
2751 list_del(&wlvif
->list
);
2752 memset(wlvif
->ap
.sta_hlid_map
, 0, sizeof(wlvif
->ap
.sta_hlid_map
));
2753 wlvif
->role_id
= WL12XX_INVALID_ROLE_ID
;
2754 wlvif
->dev_role_id
= WL12XX_INVALID_ROLE_ID
;
2762 * Last AP, have more stations. Configure sleep auth according to STA.
2763 * Don't do thin on unintended recovery.
2765 if (test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS
, &wl
->flags
) &&
2766 !test_bit(WL1271_FLAG_INTENDED_FW_RECOVERY
, &wl
->flags
))
2769 if (wl
->ap_count
== 0 && is_ap
) {
2770 /* mask ap events */
2771 wl
->event_mask
&= ~wl
->ap_event_mask
;
2772 wl1271_event_unmask(wl
);
2775 if (wl
->ap_count
== 0 && is_ap
&& wl
->sta_count
) {
2776 u8 sta_auth
= wl
->conf
.conn
.sta_sleep_auth
;
2777 /* Configure for power according to debugfs */
2778 if (sta_auth
!= WL1271_PSM_ILLEGAL
)
2779 wl1271_acx_sleep_auth(wl
, sta_auth
);
2780 /* Configure for ELP power saving */
2782 wl1271_acx_sleep_auth(wl
, WL1271_PSM_ELP
);
2786 mutex_unlock(&wl
->mutex
);
2788 del_timer_sync(&wlvif
->rx_streaming_timer
);
2789 cancel_work_sync(&wlvif
->rx_streaming_enable_work
);
2790 cancel_work_sync(&wlvif
->rx_streaming_disable_work
);
2791 cancel_work_sync(&wlvif
->rc_update_work
);
2792 cancel_delayed_work_sync(&wlvif
->connection_loss_work
);
2793 cancel_delayed_work_sync(&wlvif
->channel_switch_work
);
2794 cancel_delayed_work_sync(&wlvif
->pending_auth_complete_work
);
2796 mutex_lock(&wl
->mutex
);
2799 static void wl1271_op_remove_interface(struct ieee80211_hw
*hw
,
2800 struct ieee80211_vif
*vif
)
2802 struct wl1271
*wl
= hw
->priv
;
2803 struct wl12xx_vif
*wlvif
= wl12xx_vif_to_data(vif
);
2804 struct wl12xx_vif
*iter
;
2805 struct vif_counter_data vif_count
;
2807 wl12xx_get_vif_count(hw
, vif
, &vif_count
);
2808 mutex_lock(&wl
->mutex
);
2810 if (wl
->state
== WLCORE_STATE_OFF
||
2811 !test_bit(WLVIF_FLAG_INITIALIZED
, &wlvif
->flags
))
2815 * wl->vif can be null here if someone shuts down the interface
2816 * just when hardware recovery has been started.
2818 wl12xx_for_each_wlvif(wl
, iter
) {
2822 __wl1271_op_remove_interface(wl
, vif
, true);
2825 WARN_ON(iter
!= wlvif
);
2826 if (wl12xx_need_fw_change(wl
, vif_count
, false)) {
2827 wl12xx_force_active_psm(wl
);
2828 set_bit(WL1271_FLAG_INTENDED_FW_RECOVERY
, &wl
->flags
);
2829 wl12xx_queue_recovery_work(wl
);
2832 mutex_unlock(&wl
->mutex
);
2835 static int wl12xx_op_change_interface(struct ieee80211_hw
*hw
,
2836 struct ieee80211_vif
*vif
,
2837 enum nl80211_iftype new_type
, bool p2p
)
2839 struct wl1271
*wl
= hw
->priv
;
2842 set_bit(WL1271_FLAG_VIF_CHANGE_IN_PROGRESS
, &wl
->flags
);
2843 wl1271_op_remove_interface(hw
, vif
);
2845 vif
->type
= new_type
;
2847 ret
= wl1271_op_add_interface(hw
, vif
);
2849 clear_bit(WL1271_FLAG_VIF_CHANGE_IN_PROGRESS
, &wl
->flags
);
2853 static int wlcore_join(struct wl1271
*wl
, struct wl12xx_vif
*wlvif
)
2856 bool is_ibss
= (wlvif
->bss_type
== BSS_TYPE_IBSS
);
2859 * One of the side effects of the JOIN command is that is clears
2860 * WPA/WPA2 keys from the chipset. Performing a JOIN while associated
2861 * to a WPA/WPA2 access point will therefore kill the data-path.
2862 * Currently the only valid scenario for JOIN during association
2863 * is on roaming, in which case we will also be given new keys.
2864 * Keep the below message for now, unless it starts bothering
2865 * users who really like to roam a lot :)
2867 if (test_bit(WLVIF_FLAG_STA_ASSOCIATED
, &wlvif
->flags
))
2868 wl1271_info("JOIN while associated.");
2870 /* clear encryption type */
2871 wlvif
->encryption_type
= KEY_NONE
;
2874 ret
= wl12xx_cmd_role_start_ibss(wl
, wlvif
);
2876 if (wl
->quirks
& WLCORE_QUIRK_START_STA_FAILS
) {
2878 * TODO: this is an ugly workaround for wl12xx fw
2879 * bug - we are not able to tx/rx after the first
2880 * start_sta, so make dummy start+stop calls,
2881 * and then call start_sta again.
2882 * this should be fixed in the fw.
2884 wl12xx_cmd_role_start_sta(wl
, wlvif
);
2885 wl12xx_cmd_role_stop_sta(wl
, wlvif
);
2888 ret
= wl12xx_cmd_role_start_sta(wl
, wlvif
);
2894 static int wl1271_ssid_set(struct wl12xx_vif
*wlvif
, struct sk_buff
*skb
,
2898 const u8
*ptr
= cfg80211_find_ie(WLAN_EID_SSID
, skb
->data
+ offset
,
2902 wl1271_error("No SSID in IEs!");
2907 if (ssid_len
> IEEE80211_MAX_SSID_LEN
) {
2908 wl1271_error("SSID is too long!");
2912 wlvif
->ssid_len
= ssid_len
;
2913 memcpy(wlvif
->ssid
, ptr
+2, ssid_len
);
2917 static int wlcore_set_ssid(struct wl1271
*wl
, struct wl12xx_vif
*wlvif
)
2919 struct ieee80211_vif
*vif
= wl12xx_wlvif_to_vif(wlvif
);
2920 struct sk_buff
*skb
;
2923 /* we currently only support setting the ssid from the ap probe req */
2924 if (wlvif
->bss_type
!= BSS_TYPE_STA_BSS
)
2927 skb
= ieee80211_ap_probereq_get(wl
->hw
, vif
);
2931 ieoffset
= offsetof(struct ieee80211_mgmt
,
2932 u
.probe_req
.variable
);
2933 wl1271_ssid_set(wlvif
, skb
, ieoffset
);
2939 static int wlcore_set_assoc(struct wl1271
*wl
, struct wl12xx_vif
*wlvif
,
2940 struct ieee80211_bss_conf
*bss_conf
,
2946 wlvif
->aid
= bss_conf
->aid
;
2947 wlvif
->channel_type
= cfg80211_get_chandef_type(&bss_conf
->chandef
);
2948 wlvif
->beacon_int
= bss_conf
->beacon_int
;
2949 wlvif
->wmm_enabled
= bss_conf
->qos
;
2951 set_bit(WLVIF_FLAG_STA_ASSOCIATED
, &wlvif
->flags
);
2954 * with wl1271, we don't need to update the
2955 * beacon_int and dtim_period, because the firmware
2956 * updates it by itself when the first beacon is
2957 * received after a join.
2959 ret
= wl1271_cmd_build_ps_poll(wl
, wlvif
, wlvif
->aid
);
2964 * Get a template for hardware connection maintenance
2966 dev_kfree_skb(wlvif
->probereq
);
2967 wlvif
->probereq
= wl1271_cmd_build_ap_probe_req(wl
,
2970 ieoffset
= offsetof(struct ieee80211_mgmt
,
2971 u
.probe_req
.variable
);
2972 wl1271_ssid_set(wlvif
, wlvif
->probereq
, ieoffset
);
2974 /* enable the connection monitoring feature */
2975 ret
= wl1271_acx_conn_monit_params(wl
, wlvif
, true);
2980 * The join command disable the keep-alive mode, shut down its process,
2981 * and also clear the template config, so we need to reset it all after
2982 * the join. The acx_aid starts the keep-alive process, and the order
2983 * of the commands below is relevant.
2985 ret
= wl1271_acx_keep_alive_mode(wl
, wlvif
, true);
2989 ret
= wl1271_acx_aid(wl
, wlvif
, wlvif
->aid
);
2993 ret
= wl12xx_cmd_build_klv_null_data(wl
, wlvif
);
2997 ret
= wl1271_acx_keep_alive_config(wl
, wlvif
,
2998 wlvif
->sta
.klv_template_id
,
2999 ACX_KEEP_ALIVE_TPL_VALID
);
3004 * The default fw psm configuration is AUTO, while mac80211 default
3005 * setting is off (ACTIVE), so sync the fw with the correct value.
3007 ret
= wl1271_ps_set_mode(wl
, wlvif
, STATION_ACTIVE_MODE
);
3013 wl1271_tx_enabled_rates_get(wl
,
3016 ret
= wl1271_acx_sta_rate_policies(wl
, wlvif
);
3024 static int wlcore_unset_assoc(struct wl1271
*wl
, struct wl12xx_vif
*wlvif
)
3027 bool sta
= wlvif
->bss_type
== BSS_TYPE_STA_BSS
;
3029 /* make sure we are connected (sta) joined */
3031 !test_and_clear_bit(WLVIF_FLAG_STA_ASSOCIATED
, &wlvif
->flags
))
3034 /* make sure we are joined (ibss) */
3036 test_and_clear_bit(WLVIF_FLAG_IBSS_JOINED
, &wlvif
->flags
))
3040 /* use defaults when not associated */
3043 /* free probe-request template */
3044 dev_kfree_skb(wlvif
->probereq
);
3045 wlvif
->probereq
= NULL
;
3047 /* disable connection monitor features */
3048 ret
= wl1271_acx_conn_monit_params(wl
, wlvif
, false);
3052 /* Disable the keep-alive feature */
3053 ret
= wl1271_acx_keep_alive_mode(wl
, wlvif
, false);
3057 /* disable beacon filtering */
3058 ret
= wl1271_acx_beacon_filter_opt(wl
, wlvif
, false);
3063 if (test_and_clear_bit(WLVIF_FLAG_CS_PROGRESS
, &wlvif
->flags
)) {
3064 struct ieee80211_vif
*vif
= wl12xx_wlvif_to_vif(wlvif
);
3066 wl12xx_cmd_stop_channel_switch(wl
, wlvif
);
3067 ieee80211_chswitch_done(vif
, false);
3068 cancel_delayed_work(&wlvif
->channel_switch_work
);
3071 /* invalidate keep-alive template */
3072 wl1271_acx_keep_alive_config(wl
, wlvif
,
3073 wlvif
->sta
.klv_template_id
,
3074 ACX_KEEP_ALIVE_TPL_INVALID
);
3079 static void wl1271_set_band_rate(struct wl1271
*wl
, struct wl12xx_vif
*wlvif
)
3081 wlvif
->basic_rate_set
= wlvif
->bitrate_masks
[wlvif
->band
];
3082 wlvif
->rate_set
= wlvif
->basic_rate_set
;
3085 static void wl1271_sta_handle_idle(struct wl1271
*wl
, struct wl12xx_vif
*wlvif
,
3088 bool cur_idle
= !test_bit(WLVIF_FLAG_ACTIVE
, &wlvif
->flags
);
3090 if (idle
== cur_idle
)
3094 clear_bit(WLVIF_FLAG_ACTIVE
, &wlvif
->flags
);
3096 /* The current firmware only supports sched_scan in idle */
3097 if (wl
->sched_vif
== wlvif
)
3098 wl
->ops
->sched_scan_stop(wl
, wlvif
);
3100 set_bit(WLVIF_FLAG_ACTIVE
, &wlvif
->flags
);
3104 static int wl12xx_config_vif(struct wl1271
*wl
, struct wl12xx_vif
*wlvif
,
3105 struct ieee80211_conf
*conf
, u32 changed
)
3109 if (wlcore_is_p2p_mgmt(wlvif
))
3112 if (conf
->power_level
!= wlvif
->power_level
) {
3113 ret
= wl1271_acx_tx_power(wl
, wlvif
, conf
->power_level
);
3117 wlvif
->power_level
= conf
->power_level
;
3123 static int wl1271_op_config(struct ieee80211_hw
*hw
, u32 changed
)
3125 struct wl1271
*wl
= hw
->priv
;
3126 struct wl12xx_vif
*wlvif
;
3127 struct ieee80211_conf
*conf
= &hw
->conf
;
3130 wl1271_debug(DEBUG_MAC80211
, "mac80211 config psm %s power %d %s"
3132 conf
->flags
& IEEE80211_CONF_PS
? "on" : "off",
3134 conf
->flags
& IEEE80211_CONF_IDLE
? "idle" : "in use",
3137 mutex_lock(&wl
->mutex
);
3139 if (changed
& IEEE80211_CONF_CHANGE_POWER
)
3140 wl
->power_level
= conf
->power_level
;
3142 if (unlikely(wl
->state
!= WLCORE_STATE_ON
))
3145 ret
= pm_runtime_get_sync(wl
->dev
);
3147 pm_runtime_put_noidle(wl
->dev
);
3151 /* configure each interface */
3152 wl12xx_for_each_wlvif(wl
, wlvif
) {
3153 ret
= wl12xx_config_vif(wl
, wlvif
, conf
, changed
);
3159 pm_runtime_mark_last_busy(wl
->dev
);
3160 pm_runtime_put_autosuspend(wl
->dev
);
3163 mutex_unlock(&wl
->mutex
);
3168 struct wl1271_filter_params
{
3171 u8 mc_list
[ACX_MC_ADDRESS_GROUP_MAX
][ETH_ALEN
];
3174 static u64
wl1271_op_prepare_multicast(struct ieee80211_hw
*hw
,
3175 struct netdev_hw_addr_list
*mc_list
)
3177 struct wl1271_filter_params
*fp
;
3178 struct netdev_hw_addr
*ha
;
3180 fp
= kzalloc(sizeof(*fp
), GFP_ATOMIC
);
3182 wl1271_error("Out of memory setting filters.");
3186 /* update multicast filtering parameters */
3187 fp
->mc_list_length
= 0;
3188 if (netdev_hw_addr_list_count(mc_list
) > ACX_MC_ADDRESS_GROUP_MAX
) {
3189 fp
->enabled
= false;
3192 netdev_hw_addr_list_for_each(ha
, mc_list
) {
3193 memcpy(fp
->mc_list
[fp
->mc_list_length
],
3194 ha
->addr
, ETH_ALEN
);
3195 fp
->mc_list_length
++;
3199 return (u64
)(unsigned long)fp
;
3202 #define WL1271_SUPPORTED_FILTERS (FIF_ALLMULTI | \
3204 FIF_BCN_PRBRESP_PROMISC | \
3208 static void wl1271_op_configure_filter(struct ieee80211_hw
*hw
,
3209 unsigned int changed
,
3210 unsigned int *total
, u64 multicast
)
3212 struct wl1271_filter_params
*fp
= (void *)(unsigned long)multicast
;
3213 struct wl1271
*wl
= hw
->priv
;
3214 struct wl12xx_vif
*wlvif
;
3218 wl1271_debug(DEBUG_MAC80211
, "mac80211 configure filter changed %x"
3219 " total %x", changed
, *total
);
3221 mutex_lock(&wl
->mutex
);
3223 *total
&= WL1271_SUPPORTED_FILTERS
;
3224 changed
&= WL1271_SUPPORTED_FILTERS
;
3226 if (unlikely(wl
->state
!= WLCORE_STATE_ON
))
3229 ret
= pm_runtime_get_sync(wl
->dev
);
3231 pm_runtime_put_noidle(wl
->dev
);
3235 wl12xx_for_each_wlvif(wl
, wlvif
) {
3236 if (wlcore_is_p2p_mgmt(wlvif
))
3239 if (wlvif
->bss_type
!= BSS_TYPE_AP_BSS
) {
3240 if (*total
& FIF_ALLMULTI
)
3241 ret
= wl1271_acx_group_address_tbl(wl
, wlvif
,
3245 ret
= wl1271_acx_group_address_tbl(wl
, wlvif
,
3248 fp
->mc_list_length
);
3254 * If interface in AP mode and created with allmulticast then disable
3255 * the firmware filters so that all multicast packets are passed
3256 * This is mandatory for MDNS based discovery protocols
3258 if (wlvif
->bss_type
== BSS_TYPE_AP_BSS
) {
3259 if (*total
& FIF_ALLMULTI
) {
3260 ret
= wl1271_acx_group_address_tbl(wl
, wlvif
,
3270 * the fw doesn't provide an api to configure the filters. instead,
3271 * the filters configuration is based on the active roles / ROC
3276 pm_runtime_mark_last_busy(wl
->dev
);
3277 pm_runtime_put_autosuspend(wl
->dev
);
3280 mutex_unlock(&wl
->mutex
);
3284 static int wl1271_record_ap_key(struct wl1271
*wl
, struct wl12xx_vif
*wlvif
,
3285 u8 id
, u8 key_type
, u8 key_size
,
3286 const u8
*key
, u8 hlid
, u32 tx_seq_32
,
3287 u16 tx_seq_16
, bool is_pairwise
)
3289 struct wl1271_ap_key
*ap_key
;
3292 wl1271_debug(DEBUG_CRYPT
, "record ap key id %d", (int)id
);
3294 if (key_size
> MAX_KEY_SIZE
)
3298 * Find next free entry in ap_keys. Also check we are not replacing
3301 for (i
= 0; i
< MAX_NUM_KEYS
; i
++) {
3302 if (wlvif
->ap
.recorded_keys
[i
] == NULL
)
3305 if (wlvif
->ap
.recorded_keys
[i
]->id
== id
) {
3306 wl1271_warning("trying to record key replacement");
3311 if (i
== MAX_NUM_KEYS
)
3314 ap_key
= kzalloc(sizeof(*ap_key
), GFP_KERNEL
);
3319 ap_key
->key_type
= key_type
;
3320 ap_key
->key_size
= key_size
;
3321 memcpy(ap_key
->key
, key
, key_size
);
3322 ap_key
->hlid
= hlid
;
3323 ap_key
->tx_seq_32
= tx_seq_32
;
3324 ap_key
->tx_seq_16
= tx_seq_16
;
3325 ap_key
->is_pairwise
= is_pairwise
;
3327 wlvif
->ap
.recorded_keys
[i
] = ap_key
;
3331 static void wl1271_free_ap_keys(struct wl1271
*wl
, struct wl12xx_vif
*wlvif
)
3335 for (i
= 0; i
< MAX_NUM_KEYS
; i
++) {
3336 kfree(wlvif
->ap
.recorded_keys
[i
]);
3337 wlvif
->ap
.recorded_keys
[i
] = NULL
;
3341 static int wl1271_ap_init_hwenc(struct wl1271
*wl
, struct wl12xx_vif
*wlvif
)
3344 struct wl1271_ap_key
*key
;
3345 bool wep_key_added
= false;
3347 for (i
= 0; i
< MAX_NUM_KEYS
; i
++) {
3349 if (wlvif
->ap
.recorded_keys
[i
] == NULL
)
3352 key
= wlvif
->ap
.recorded_keys
[i
];
3354 if (hlid
== WL12XX_INVALID_LINK_ID
)
3355 hlid
= wlvif
->ap
.bcast_hlid
;
3357 ret
= wl1271_cmd_set_ap_key(wl
, wlvif
, KEY_ADD_OR_REPLACE
,
3358 key
->id
, key
->key_type
,
3359 key
->key_size
, key
->key
,
3360 hlid
, key
->tx_seq_32
,
3361 key
->tx_seq_16
, key
->is_pairwise
);
3365 if (key
->key_type
== KEY_WEP
)
3366 wep_key_added
= true;
3369 if (wep_key_added
) {
3370 ret
= wl12xx_cmd_set_default_wep_key(wl
, wlvif
->default_key
,
3371 wlvif
->ap
.bcast_hlid
);
3377 wl1271_free_ap_keys(wl
, wlvif
);
3381 static int wl1271_set_key(struct wl1271
*wl
, struct wl12xx_vif
*wlvif
,
3382 u16 action
, u8 id
, u8 key_type
,
3383 u8 key_size
, const u8
*key
, u32 tx_seq_32
,
3384 u16 tx_seq_16
, struct ieee80211_sta
*sta
,
3388 bool is_ap
= (wlvif
->bss_type
== BSS_TYPE_AP_BSS
);
3391 struct wl1271_station
*wl_sta
;
3395 wl_sta
= (struct wl1271_station
*)sta
->drv_priv
;
3396 hlid
= wl_sta
->hlid
;
3398 hlid
= wlvif
->ap
.bcast_hlid
;
3401 if (!test_bit(WLVIF_FLAG_AP_STARTED
, &wlvif
->flags
)) {
3403 * We do not support removing keys after AP shutdown.
3404 * Pretend we do to make mac80211 happy.
3406 if (action
!= KEY_ADD_OR_REPLACE
)
3409 ret
= wl1271_record_ap_key(wl
, wlvif
, id
,
3411 key
, hlid
, tx_seq_32
,
3412 tx_seq_16
, is_pairwise
);
3414 ret
= wl1271_cmd_set_ap_key(wl
, wlvif
, action
,
3415 id
, key_type
, key_size
,
3416 key
, hlid
, tx_seq_32
,
3417 tx_seq_16
, is_pairwise
);
3424 static const u8 bcast_addr
[ETH_ALEN
] = {
3425 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
3428 addr
= sta
? sta
->addr
: bcast_addr
;
3430 if (is_zero_ether_addr(addr
)) {
3431 /* We dont support TX only encryption */
3435 /* The wl1271 does not allow to remove unicast keys - they
3436 will be cleared automatically on next CMD_JOIN. Ignore the
3437 request silently, as we dont want the mac80211 to emit
3438 an error message. */
3439 if (action
== KEY_REMOVE
&& !is_broadcast_ether_addr(addr
))
3442 /* don't remove key if hlid was already deleted */
3443 if (action
== KEY_REMOVE
&&
3444 wlvif
->sta
.hlid
== WL12XX_INVALID_LINK_ID
)
3447 ret
= wl1271_cmd_set_sta_key(wl
, wlvif
, action
,
3448 id
, key_type
, key_size
,
3449 key
, addr
, tx_seq_32
,
3459 static int wlcore_op_set_key(struct ieee80211_hw
*hw
, enum set_key_cmd cmd
,
3460 struct ieee80211_vif
*vif
,
3461 struct ieee80211_sta
*sta
,
3462 struct ieee80211_key_conf
*key_conf
)
3464 struct wl1271
*wl
= hw
->priv
;
3466 bool might_change_spare
=
3467 key_conf
->cipher
== WL1271_CIPHER_SUITE_GEM
||
3468 key_conf
->cipher
== WLAN_CIPHER_SUITE_TKIP
;
3470 if (might_change_spare
) {
3472 * stop the queues and flush to ensure the next packets are
3473 * in sync with FW spare block accounting
3475 wlcore_stop_queues(wl
, WLCORE_QUEUE_STOP_REASON_SPARE_BLK
);
3476 wl1271_tx_flush(wl
);
3479 mutex_lock(&wl
->mutex
);
3481 if (unlikely(wl
->state
!= WLCORE_STATE_ON
)) {
3483 goto out_wake_queues
;
3486 ret
= pm_runtime_get_sync(wl
->dev
);
3488 pm_runtime_put_noidle(wl
->dev
);
3489 goto out_wake_queues
;
3492 ret
= wlcore_hw_set_key(wl
, cmd
, vif
, sta
, key_conf
);
3494 pm_runtime_mark_last_busy(wl
->dev
);
3495 pm_runtime_put_autosuspend(wl
->dev
);
3498 if (might_change_spare
)
3499 wlcore_wake_queues(wl
, WLCORE_QUEUE_STOP_REASON_SPARE_BLK
);
3501 mutex_unlock(&wl
->mutex
);
3506 int wlcore_set_key(struct wl1271
*wl
, enum set_key_cmd cmd
,
3507 struct ieee80211_vif
*vif
,
3508 struct ieee80211_sta
*sta
,
3509 struct ieee80211_key_conf
*key_conf
)
3511 struct wl12xx_vif
*wlvif
= wl12xx_vif_to_data(vif
);
3519 wl1271_debug(DEBUG_MAC80211
, "mac80211 set key");
3521 wl1271_debug(DEBUG_CRYPT
, "CMD: 0x%x sta: %p", cmd
, sta
);
3522 wl1271_debug(DEBUG_CRYPT
, "Key: algo:0x%x, id:%d, len:%d flags 0x%x",
3523 key_conf
->cipher
, key_conf
->keyidx
,
3524 key_conf
->keylen
, key_conf
->flags
);
3525 wl1271_dump(DEBUG_CRYPT
, "KEY: ", key_conf
->key
, key_conf
->keylen
);
3527 if (wlvif
->bss_type
== BSS_TYPE_AP_BSS
)
3529 struct wl1271_station
*wl_sta
= (void *)sta
->drv_priv
;
3530 hlid
= wl_sta
->hlid
;
3532 hlid
= wlvif
->ap
.bcast_hlid
;
3535 hlid
= wlvif
->sta
.hlid
;
3537 if (hlid
!= WL12XX_INVALID_LINK_ID
) {
3538 u64 tx_seq
= wl
->links
[hlid
].total_freed_pkts
;
3539 tx_seq_32
= WL1271_TX_SECURITY_HI32(tx_seq
);
3540 tx_seq_16
= WL1271_TX_SECURITY_LO16(tx_seq
);
3543 switch (key_conf
->cipher
) {
3544 case WLAN_CIPHER_SUITE_WEP40
:
3545 case WLAN_CIPHER_SUITE_WEP104
:
3548 key_conf
->hw_key_idx
= key_conf
->keyidx
;
3550 case WLAN_CIPHER_SUITE_TKIP
:
3551 key_type
= KEY_TKIP
;
3552 key_conf
->hw_key_idx
= key_conf
->keyidx
;
3554 case WLAN_CIPHER_SUITE_CCMP
:
3556 key_conf
->flags
|= IEEE80211_KEY_FLAG_PUT_IV_SPACE
;
3558 case WL1271_CIPHER_SUITE_GEM
:
3562 wl1271_error("Unknown key algo 0x%x", key_conf
->cipher
);
3567 is_pairwise
= key_conf
->flags
& IEEE80211_KEY_FLAG_PAIRWISE
;
3571 ret
= wl1271_set_key(wl
, wlvif
, KEY_ADD_OR_REPLACE
,
3572 key_conf
->keyidx
, key_type
,
3573 key_conf
->keylen
, key_conf
->key
,
3574 tx_seq_32
, tx_seq_16
, sta
, is_pairwise
);
3576 wl1271_error("Could not add or replace key");
3581 * reconfiguring arp response if the unicast (or common)
3582 * encryption key type was changed
3584 if (wlvif
->bss_type
== BSS_TYPE_STA_BSS
&&
3585 (sta
|| key_type
== KEY_WEP
) &&
3586 wlvif
->encryption_type
!= key_type
) {
3587 wlvif
->encryption_type
= key_type
;
3588 ret
= wl1271_cmd_build_arp_rsp(wl
, wlvif
);
3590 wl1271_warning("build arp rsp failed: %d", ret
);
3597 ret
= wl1271_set_key(wl
, wlvif
, KEY_REMOVE
,
3598 key_conf
->keyidx
, key_type
,
3599 key_conf
->keylen
, key_conf
->key
,
3600 0, 0, sta
, is_pairwise
);
3602 wl1271_error("Could not remove key");
3608 wl1271_error("Unsupported key cmd 0x%x", cmd
);
3614 EXPORT_SYMBOL_GPL(wlcore_set_key
);
3616 static void wl1271_op_set_default_key_idx(struct ieee80211_hw
*hw
,
3617 struct ieee80211_vif
*vif
,
3620 struct wl1271
*wl
= hw
->priv
;
3621 struct wl12xx_vif
*wlvif
= wl12xx_vif_to_data(vif
);
3624 wl1271_debug(DEBUG_MAC80211
, "mac80211 set default key idx %d",
3627 /* we don't handle unsetting of default key */
3631 mutex_lock(&wl
->mutex
);
3633 if (unlikely(wl
->state
!= WLCORE_STATE_ON
)) {
3638 ret
= pm_runtime_get_sync(wl
->dev
);
3640 pm_runtime_put_noidle(wl
->dev
);
3644 wlvif
->default_key
= key_idx
;
3646 /* the default WEP key needs to be configured at least once */
3647 if (wlvif
->encryption_type
== KEY_WEP
) {
3648 ret
= wl12xx_cmd_set_default_wep_key(wl
,
3656 pm_runtime_mark_last_busy(wl
->dev
);
3657 pm_runtime_put_autosuspend(wl
->dev
);
3660 mutex_unlock(&wl
->mutex
);
3663 void wlcore_regdomain_config(struct wl1271
*wl
)
3667 if (!(wl
->quirks
& WLCORE_QUIRK_REGDOMAIN_CONF
))
3670 mutex_lock(&wl
->mutex
);
3672 if (unlikely(wl
->state
!= WLCORE_STATE_ON
))
3675 ret
= pm_runtime_get_sync(wl
->dev
);
3677 pm_runtime_put_autosuspend(wl
->dev
);
3681 ret
= wlcore_cmd_regdomain_config_locked(wl
);
3683 wl12xx_queue_recovery_work(wl
);
3687 pm_runtime_mark_last_busy(wl
->dev
);
3688 pm_runtime_put_autosuspend(wl
->dev
);
3690 mutex_unlock(&wl
->mutex
);
3693 static int wl1271_op_hw_scan(struct ieee80211_hw
*hw
,
3694 struct ieee80211_vif
*vif
,
3695 struct ieee80211_scan_request
*hw_req
)
3697 struct cfg80211_scan_request
*req
= &hw_req
->req
;
3698 struct wl1271
*wl
= hw
->priv
;
3703 wl1271_debug(DEBUG_MAC80211
, "mac80211 hw scan");
3706 ssid
= req
->ssids
[0].ssid
;
3707 len
= req
->ssids
[0].ssid_len
;
3710 mutex_lock(&wl
->mutex
);
3712 if (unlikely(wl
->state
!= WLCORE_STATE_ON
)) {
3714 * We cannot return -EBUSY here because cfg80211 will expect
3715 * a call to ieee80211_scan_completed if we do - in this case
3716 * there won't be any call.
3722 ret
= pm_runtime_get_sync(wl
->dev
);
3724 pm_runtime_put_noidle(wl
->dev
);
3728 /* fail if there is any role in ROC */
3729 if (find_first_bit(wl
->roc_map
, WL12XX_MAX_ROLES
) < WL12XX_MAX_ROLES
) {
3730 /* don't allow scanning right now */
3735 ret
= wlcore_scan(hw
->priv
, vif
, ssid
, len
, req
);
3737 pm_runtime_mark_last_busy(wl
->dev
);
3738 pm_runtime_put_autosuspend(wl
->dev
);
3740 mutex_unlock(&wl
->mutex
);
3745 static void wl1271_op_cancel_hw_scan(struct ieee80211_hw
*hw
,
3746 struct ieee80211_vif
*vif
)
3748 struct wl1271
*wl
= hw
->priv
;
3749 struct wl12xx_vif
*wlvif
= wl12xx_vif_to_data(vif
);
3750 struct cfg80211_scan_info info
= {
3755 wl1271_debug(DEBUG_MAC80211
, "mac80211 cancel hw scan");
3757 mutex_lock(&wl
->mutex
);
3759 if (unlikely(wl
->state
!= WLCORE_STATE_ON
))
3762 if (wl
->scan
.state
== WL1271_SCAN_STATE_IDLE
)
3765 ret
= pm_runtime_get_sync(wl
->dev
);
3767 pm_runtime_put_noidle(wl
->dev
);
3771 if (wl
->scan
.state
!= WL1271_SCAN_STATE_DONE
) {
3772 ret
= wl
->ops
->scan_stop(wl
, wlvif
);
3778 * Rearm the tx watchdog just before idling scan. This
3779 * prevents just-finished scans from triggering the watchdog
3781 wl12xx_rearm_tx_watchdog_locked(wl
);
3783 wl
->scan
.state
= WL1271_SCAN_STATE_IDLE
;
3784 memset(wl
->scan
.scanned_ch
, 0, sizeof(wl
->scan
.scanned_ch
));
3785 wl
->scan_wlvif
= NULL
;
3786 wl
->scan
.req
= NULL
;
3787 ieee80211_scan_completed(wl
->hw
, &info
);
3790 pm_runtime_mark_last_busy(wl
->dev
);
3791 pm_runtime_put_autosuspend(wl
->dev
);
3793 mutex_unlock(&wl
->mutex
);
3795 cancel_delayed_work_sync(&wl
->scan_complete_work
);
3798 static int wl1271_op_sched_scan_start(struct ieee80211_hw
*hw
,
3799 struct ieee80211_vif
*vif
,
3800 struct cfg80211_sched_scan_request
*req
,
3801 struct ieee80211_scan_ies
*ies
)
3803 struct wl1271
*wl
= hw
->priv
;
3804 struct wl12xx_vif
*wlvif
= wl12xx_vif_to_data(vif
);
3807 wl1271_debug(DEBUG_MAC80211
, "wl1271_op_sched_scan_start");
3809 mutex_lock(&wl
->mutex
);
3811 if (unlikely(wl
->state
!= WLCORE_STATE_ON
)) {
3816 ret
= pm_runtime_get_sync(wl
->dev
);
3818 pm_runtime_put_noidle(wl
->dev
);
3822 ret
= wl
->ops
->sched_scan_start(wl
, wlvif
, req
, ies
);
3826 wl
->sched_vif
= wlvif
;
3829 pm_runtime_mark_last_busy(wl
->dev
);
3830 pm_runtime_put_autosuspend(wl
->dev
);
3832 mutex_unlock(&wl
->mutex
);
3836 static int wl1271_op_sched_scan_stop(struct ieee80211_hw
*hw
,
3837 struct ieee80211_vif
*vif
)
3839 struct wl1271
*wl
= hw
->priv
;
3840 struct wl12xx_vif
*wlvif
= wl12xx_vif_to_data(vif
);
3843 wl1271_debug(DEBUG_MAC80211
, "wl1271_op_sched_scan_stop");
3845 mutex_lock(&wl
->mutex
);
3847 if (unlikely(wl
->state
!= WLCORE_STATE_ON
))
3850 ret
= pm_runtime_get_sync(wl
->dev
);
3852 pm_runtime_put_noidle(wl
->dev
);
3856 wl
->ops
->sched_scan_stop(wl
, wlvif
);
3858 pm_runtime_mark_last_busy(wl
->dev
);
3859 pm_runtime_put_autosuspend(wl
->dev
);
3861 mutex_unlock(&wl
->mutex
);
3866 static int wl1271_op_set_frag_threshold(struct ieee80211_hw
*hw
, u32 value
)
3868 struct wl1271
*wl
= hw
->priv
;
3871 mutex_lock(&wl
->mutex
);
3873 if (unlikely(wl
->state
!= WLCORE_STATE_ON
)) {
3878 ret
= pm_runtime_get_sync(wl
->dev
);
3880 pm_runtime_put_noidle(wl
->dev
);
3884 ret
= wl1271_acx_frag_threshold(wl
, value
);
3886 wl1271_warning("wl1271_op_set_frag_threshold failed: %d", ret
);
3888 pm_runtime_mark_last_busy(wl
->dev
);
3889 pm_runtime_put_autosuspend(wl
->dev
);
3892 mutex_unlock(&wl
->mutex
);
3897 static int wl1271_op_set_rts_threshold(struct ieee80211_hw
*hw
, u32 value
)
3899 struct wl1271
*wl
= hw
->priv
;
3900 struct wl12xx_vif
*wlvif
;
3903 mutex_lock(&wl
->mutex
);
3905 if (unlikely(wl
->state
!= WLCORE_STATE_ON
)) {
3910 ret
= pm_runtime_get_sync(wl
->dev
);
3912 pm_runtime_put_noidle(wl
->dev
);
3916 wl12xx_for_each_wlvif(wl
, wlvif
) {
3917 ret
= wl1271_acx_rts_threshold(wl
, wlvif
, value
);
3919 wl1271_warning("set rts threshold failed: %d", ret
);
3921 pm_runtime_mark_last_busy(wl
->dev
);
3922 pm_runtime_put_autosuspend(wl
->dev
);
3925 mutex_unlock(&wl
->mutex
);
3930 static void wl12xx_remove_ie(struct sk_buff
*skb
, u8 eid
, int ieoffset
)
3933 const u8
*next
, *end
= skb
->data
+ skb
->len
;
3934 u8
*ie
= (u8
*)cfg80211_find_ie(eid
, skb
->data
+ ieoffset
,
3935 skb
->len
- ieoffset
);
3940 memmove(ie
, next
, end
- next
);
3941 skb_trim(skb
, skb
->len
- len
);
3944 static void wl12xx_remove_vendor_ie(struct sk_buff
*skb
,
3945 unsigned int oui
, u8 oui_type
,
3949 const u8
*next
, *end
= skb
->data
+ skb
->len
;
3950 u8
*ie
= (u8
*)cfg80211_find_vendor_ie(oui
, oui_type
,
3951 skb
->data
+ ieoffset
,
3952 skb
->len
- ieoffset
);
3957 memmove(ie
, next
, end
- next
);
3958 skb_trim(skb
, skb
->len
- len
);
3961 static int wl1271_ap_set_probe_resp_tmpl(struct wl1271
*wl
, u32 rates
,
3962 struct ieee80211_vif
*vif
)
3964 struct wl12xx_vif
*wlvif
= wl12xx_vif_to_data(vif
);
3965 struct sk_buff
*skb
;
3968 skb
= ieee80211_proberesp_get(wl
->hw
, vif
);
3972 ret
= wl1271_cmd_template_set(wl
, wlvif
->role_id
,
3973 CMD_TEMPL_AP_PROBE_RESPONSE
,
3982 wl1271_debug(DEBUG_AP
, "probe response updated");
3983 set_bit(WLVIF_FLAG_AP_PROBE_RESP_SET
, &wlvif
->flags
);
3989 static int wl1271_ap_set_probe_resp_tmpl_legacy(struct wl1271
*wl
,
3990 struct ieee80211_vif
*vif
,
3992 size_t probe_rsp_len
,
3995 struct wl12xx_vif
*wlvif
= wl12xx_vif_to_data(vif
);
3996 struct ieee80211_bss_conf
*bss_conf
= &vif
->bss_conf
;
3997 u8 probe_rsp_templ
[WL1271_CMD_TEMPL_MAX_SIZE
];
3998 int ssid_ie_offset
, ie_offset
, templ_len
;
4001 /* no need to change probe response if the SSID is set correctly */
4002 if (wlvif
->ssid_len
> 0)
4003 return wl1271_cmd_template_set(wl
, wlvif
->role_id
,
4004 CMD_TEMPL_AP_PROBE_RESPONSE
,
4009 if (probe_rsp_len
+ bss_conf
->ssid_len
> WL1271_CMD_TEMPL_MAX_SIZE
) {
4010 wl1271_error("probe_rsp template too big");
4014 /* start searching from IE offset */
4015 ie_offset
= offsetof(struct ieee80211_mgmt
, u
.probe_resp
.variable
);
4017 ptr
= cfg80211_find_ie(WLAN_EID_SSID
, probe_rsp_data
+ ie_offset
,
4018 probe_rsp_len
- ie_offset
);
4020 wl1271_error("No SSID in beacon!");
4024 ssid_ie_offset
= ptr
- probe_rsp_data
;
4025 ptr
+= (ptr
[1] + 2);
4027 memcpy(probe_rsp_templ
, probe_rsp_data
, ssid_ie_offset
);
4029 /* insert SSID from bss_conf */
4030 probe_rsp_templ
[ssid_ie_offset
] = WLAN_EID_SSID
;
4031 probe_rsp_templ
[ssid_ie_offset
+ 1] = bss_conf
->ssid_len
;
4032 memcpy(probe_rsp_templ
+ ssid_ie_offset
+ 2,
4033 bss_conf
->ssid
, bss_conf
->ssid_len
);
4034 templ_len
= ssid_ie_offset
+ 2 + bss_conf
->ssid_len
;
4036 memcpy(probe_rsp_templ
+ ssid_ie_offset
+ 2 + bss_conf
->ssid_len
,
4037 ptr
, probe_rsp_len
- (ptr
- probe_rsp_data
));
4038 templ_len
+= probe_rsp_len
- (ptr
- probe_rsp_data
);
4040 return wl1271_cmd_template_set(wl
, wlvif
->role_id
,
4041 CMD_TEMPL_AP_PROBE_RESPONSE
,
4047 static int wl1271_bss_erp_info_changed(struct wl1271
*wl
,
4048 struct ieee80211_vif
*vif
,
4049 struct ieee80211_bss_conf
*bss_conf
,
4052 struct wl12xx_vif
*wlvif
= wl12xx_vif_to_data(vif
);
4055 if (changed
& BSS_CHANGED_ERP_SLOT
) {
4056 if (bss_conf
->use_short_slot
)
4057 ret
= wl1271_acx_slot(wl
, wlvif
, SLOT_TIME_SHORT
);
4059 ret
= wl1271_acx_slot(wl
, wlvif
, SLOT_TIME_LONG
);
4061 wl1271_warning("Set slot time failed %d", ret
);
4066 if (changed
& BSS_CHANGED_ERP_PREAMBLE
) {
4067 if (bss_conf
->use_short_preamble
)
4068 wl1271_acx_set_preamble(wl
, wlvif
, ACX_PREAMBLE_SHORT
);
4070 wl1271_acx_set_preamble(wl
, wlvif
, ACX_PREAMBLE_LONG
);
4073 if (changed
& BSS_CHANGED_ERP_CTS_PROT
) {
4074 if (bss_conf
->use_cts_prot
)
4075 ret
= wl1271_acx_cts_protect(wl
, wlvif
,
4078 ret
= wl1271_acx_cts_protect(wl
, wlvif
,
4079 CTSPROTECT_DISABLE
);
4081 wl1271_warning("Set ctsprotect failed %d", ret
);
4090 static int wlcore_set_beacon_template(struct wl1271
*wl
,
4091 struct ieee80211_vif
*vif
,
4094 struct wl12xx_vif
*wlvif
= wl12xx_vif_to_data(vif
);
4095 struct ieee80211_hdr
*hdr
;
4098 int ieoffset
= offsetof(struct ieee80211_mgmt
, u
.beacon
.variable
);
4099 struct sk_buff
*beacon
= ieee80211_beacon_get(wl
->hw
, vif
);
4107 wl1271_debug(DEBUG_MASTER
, "beacon updated");
4109 ret
= wl1271_ssid_set(wlvif
, beacon
, ieoffset
);
4111 dev_kfree_skb(beacon
);
4114 min_rate
= wl1271_tx_min_rate_get(wl
, wlvif
->basic_rate_set
);
4115 tmpl_id
= is_ap
? CMD_TEMPL_AP_BEACON
:
4117 ret
= wl1271_cmd_template_set(wl
, wlvif
->role_id
, tmpl_id
,
4122 dev_kfree_skb(beacon
);
4126 wlvif
->wmm_enabled
=
4127 cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT
,
4128 WLAN_OUI_TYPE_MICROSOFT_WMM
,
4129 beacon
->data
+ ieoffset
,
4130 beacon
->len
- ieoffset
);
4133 * In case we already have a probe-resp beacon set explicitly
4134 * by usermode, don't use the beacon data.
4136 if (test_bit(WLVIF_FLAG_AP_PROBE_RESP_SET
, &wlvif
->flags
))
4139 /* remove TIM ie from probe response */
4140 wl12xx_remove_ie(beacon
, WLAN_EID_TIM
, ieoffset
);
4143 * remove p2p ie from probe response.
4144 * the fw reponds to probe requests that don't include
4145 * the p2p ie. probe requests with p2p ie will be passed,
4146 * and will be responded by the supplicant (the spec
4147 * forbids including the p2p ie when responding to probe
4148 * requests that didn't include it).
4150 wl12xx_remove_vendor_ie(beacon
, WLAN_OUI_WFA
,
4151 WLAN_OUI_TYPE_WFA_P2P
, ieoffset
);
4153 hdr
= (struct ieee80211_hdr
*) beacon
->data
;
4154 hdr
->frame_control
= cpu_to_le16(IEEE80211_FTYPE_MGMT
|
4155 IEEE80211_STYPE_PROBE_RESP
);
4157 ret
= wl1271_ap_set_probe_resp_tmpl_legacy(wl
, vif
,
4162 ret
= wl1271_cmd_template_set(wl
, wlvif
->role_id
,
4163 CMD_TEMPL_PROBE_RESPONSE
,
4168 dev_kfree_skb(beacon
);
4176 static int wl1271_bss_beacon_info_changed(struct wl1271
*wl
,
4177 struct ieee80211_vif
*vif
,
4178 struct ieee80211_bss_conf
*bss_conf
,
4181 struct wl12xx_vif
*wlvif
= wl12xx_vif_to_data(vif
);
4182 bool is_ap
= (wlvif
->bss_type
== BSS_TYPE_AP_BSS
);
4185 if (changed
& BSS_CHANGED_BEACON_INT
) {
4186 wl1271_debug(DEBUG_MASTER
, "beacon interval updated: %d",
4187 bss_conf
->beacon_int
);
4189 wlvif
->beacon_int
= bss_conf
->beacon_int
;
4192 if ((changed
& BSS_CHANGED_AP_PROBE_RESP
) && is_ap
) {
4193 u32 rate
= wl1271_tx_min_rate_get(wl
, wlvif
->basic_rate_set
);
4195 wl1271_ap_set_probe_resp_tmpl(wl
, rate
, vif
);
4198 if (changed
& BSS_CHANGED_BEACON
) {
4199 ret
= wlcore_set_beacon_template(wl
, vif
, is_ap
);
4203 if (test_and_clear_bit(WLVIF_FLAG_BEACON_DISABLED
,
4205 ret
= wlcore_hw_dfs_master_restart(wl
, wlvif
);
4212 wl1271_error("beacon info change failed: %d", ret
);
4216 /* AP mode changes */
4217 static void wl1271_bss_info_changed_ap(struct wl1271
*wl
,
4218 struct ieee80211_vif
*vif
,
4219 struct ieee80211_bss_conf
*bss_conf
,
4222 struct wl12xx_vif
*wlvif
= wl12xx_vif_to_data(vif
);
4225 if (changed
& BSS_CHANGED_BASIC_RATES
) {
4226 u32 rates
= bss_conf
->basic_rates
;
4228 wlvif
->basic_rate_set
= wl1271_tx_enabled_rates_get(wl
, rates
,
4230 wlvif
->basic_rate
= wl1271_tx_min_rate_get(wl
,
4231 wlvif
->basic_rate_set
);
4233 ret
= wl1271_init_ap_rates(wl
, wlvif
);
4235 wl1271_error("AP rate policy change failed %d", ret
);
4239 ret
= wl1271_ap_init_templates(wl
, vif
);
4243 /* No need to set probe resp template for mesh */
4244 if (!ieee80211_vif_is_mesh(vif
)) {
4245 ret
= wl1271_ap_set_probe_resp_tmpl(wl
,
4252 ret
= wlcore_set_beacon_template(wl
, vif
, true);
4257 ret
= wl1271_bss_beacon_info_changed(wl
, vif
, bss_conf
, changed
);
4261 if (changed
& BSS_CHANGED_BEACON_ENABLED
) {
4262 if (bss_conf
->enable_beacon
) {
4263 if (!test_bit(WLVIF_FLAG_AP_STARTED
, &wlvif
->flags
)) {
4264 ret
= wl12xx_cmd_role_start_ap(wl
, wlvif
);
4268 ret
= wl1271_ap_init_hwenc(wl
, wlvif
);
4272 set_bit(WLVIF_FLAG_AP_STARTED
, &wlvif
->flags
);
4273 wl1271_debug(DEBUG_AP
, "started AP");
4276 if (test_bit(WLVIF_FLAG_AP_STARTED
, &wlvif
->flags
)) {
4278 * AP might be in ROC in case we have just
4279 * sent auth reply. handle it.
4281 if (test_bit(wlvif
->role_id
, wl
->roc_map
))
4282 wl12xx_croc(wl
, wlvif
->role_id
);
4284 ret
= wl12xx_cmd_role_stop_ap(wl
, wlvif
);
4288 clear_bit(WLVIF_FLAG_AP_STARTED
, &wlvif
->flags
);
4289 clear_bit(WLVIF_FLAG_AP_PROBE_RESP_SET
,
4291 wl1271_debug(DEBUG_AP
, "stopped AP");
4296 ret
= wl1271_bss_erp_info_changed(wl
, vif
, bss_conf
, changed
);
4300 /* Handle HT information change */
4301 if ((changed
& BSS_CHANGED_HT
) &&
4302 (bss_conf
->chandef
.width
!= NL80211_CHAN_WIDTH_20_NOHT
)) {
4303 ret
= wl1271_acx_set_ht_information(wl
, wlvif
,
4304 bss_conf
->ht_operation_mode
);
4306 wl1271_warning("Set ht information failed %d", ret
);
4315 static int wlcore_set_bssid(struct wl1271
*wl
, struct wl12xx_vif
*wlvif
,
4316 struct ieee80211_bss_conf
*bss_conf
,
4322 wl1271_debug(DEBUG_MAC80211
,
4323 "changed_bssid: %pM, aid: %d, bcn_int: %d, brates: 0x%x sta_rate_set: 0x%x",
4324 bss_conf
->bssid
, bss_conf
->aid
,
4325 bss_conf
->beacon_int
,
4326 bss_conf
->basic_rates
, sta_rate_set
);
4328 wlvif
->beacon_int
= bss_conf
->beacon_int
;
4329 rates
= bss_conf
->basic_rates
;
4330 wlvif
->basic_rate_set
=
4331 wl1271_tx_enabled_rates_get(wl
, rates
,
4334 wl1271_tx_min_rate_get(wl
,
4335 wlvif
->basic_rate_set
);
4339 wl1271_tx_enabled_rates_get(wl
,
4343 /* we only support sched_scan while not connected */
4344 if (wl
->sched_vif
== wlvif
)
4345 wl
->ops
->sched_scan_stop(wl
, wlvif
);
4347 ret
= wl1271_acx_sta_rate_policies(wl
, wlvif
);
4351 ret
= wl12xx_cmd_build_null_data(wl
, wlvif
);
4355 ret
= wl1271_build_qos_null_data(wl
, wl12xx_wlvif_to_vif(wlvif
));
4359 wlcore_set_ssid(wl
, wlvif
);
4361 set_bit(WLVIF_FLAG_IN_USE
, &wlvif
->flags
);
4366 static int wlcore_clear_bssid(struct wl1271
*wl
, struct wl12xx_vif
*wlvif
)
4370 /* revert back to minimum rates for the current band */
4371 wl1271_set_band_rate(wl
, wlvif
);
4372 wlvif
->basic_rate
= wl1271_tx_min_rate_get(wl
, wlvif
->basic_rate_set
);
4374 ret
= wl1271_acx_sta_rate_policies(wl
, wlvif
);
4378 if (wlvif
->bss_type
== BSS_TYPE_STA_BSS
&&
4379 test_bit(WLVIF_FLAG_IN_USE
, &wlvif
->flags
)) {
4380 ret
= wl12xx_cmd_role_stop_sta(wl
, wlvif
);
4385 clear_bit(WLVIF_FLAG_IN_USE
, &wlvif
->flags
);
4388 /* STA/IBSS mode changes */
4389 static void wl1271_bss_info_changed_sta(struct wl1271
*wl
,
4390 struct ieee80211_vif
*vif
,
4391 struct ieee80211_bss_conf
*bss_conf
,
4394 struct wl12xx_vif
*wlvif
= wl12xx_vif_to_data(vif
);
4395 bool do_join
= false;
4396 bool is_ibss
= (wlvif
->bss_type
== BSS_TYPE_IBSS
);
4397 bool ibss_joined
= false;
4398 u32 sta_rate_set
= 0;
4400 struct ieee80211_sta
*sta
;
4401 bool sta_exists
= false;
4402 struct ieee80211_sta_ht_cap sta_ht_cap
;
4405 ret
= wl1271_bss_beacon_info_changed(wl
, vif
, bss_conf
,
4411 if (changed
& BSS_CHANGED_IBSS
) {
4412 if (bss_conf
->ibss_joined
) {
4413 set_bit(WLVIF_FLAG_IBSS_JOINED
, &wlvif
->flags
);
4416 wlcore_unset_assoc(wl
, wlvif
);
4417 wl12xx_cmd_role_stop_sta(wl
, wlvif
);
4421 if ((changed
& BSS_CHANGED_BEACON_INT
) && ibss_joined
)
4424 /* Need to update the SSID (for filtering etc) */
4425 if ((changed
& BSS_CHANGED_BEACON
) && ibss_joined
)
4428 if ((changed
& BSS_CHANGED_BEACON_ENABLED
) && ibss_joined
) {
4429 wl1271_debug(DEBUG_ADHOC
, "ad-hoc beaconing: %s",
4430 bss_conf
->enable_beacon
? "enabled" : "disabled");
4435 if (changed
& BSS_CHANGED_IDLE
&& !is_ibss
)
4436 wl1271_sta_handle_idle(wl
, wlvif
, bss_conf
->idle
);
4438 if (changed
& BSS_CHANGED_CQM
) {
4439 bool enable
= false;
4440 if (bss_conf
->cqm_rssi_thold
)
4442 ret
= wl1271_acx_rssi_snr_trigger(wl
, wlvif
, enable
,
4443 bss_conf
->cqm_rssi_thold
,
4444 bss_conf
->cqm_rssi_hyst
);
4447 wlvif
->rssi_thold
= bss_conf
->cqm_rssi_thold
;
4450 if (changed
& (BSS_CHANGED_BSSID
| BSS_CHANGED_HT
|
4451 BSS_CHANGED_ASSOC
)) {
4453 sta
= ieee80211_find_sta(vif
, bss_conf
->bssid
);
4455 u8
*rx_mask
= sta
->ht_cap
.mcs
.rx_mask
;
4457 /* save the supp_rates of the ap */
4458 sta_rate_set
= sta
->supp_rates
[wlvif
->band
];
4459 if (sta
->ht_cap
.ht_supported
)
4461 (rx_mask
[0] << HW_HT_RATES_OFFSET
) |
4462 (rx_mask
[1] << HW_MIMO_RATES_OFFSET
);
4463 sta_ht_cap
= sta
->ht_cap
;
4470 if (changed
& BSS_CHANGED_BSSID
) {
4471 if (!is_zero_ether_addr(bss_conf
->bssid
)) {
4472 ret
= wlcore_set_bssid(wl
, wlvif
, bss_conf
,
4477 /* Need to update the BSSID (for filtering etc) */
4480 ret
= wlcore_clear_bssid(wl
, wlvif
);
4486 if (changed
& BSS_CHANGED_IBSS
) {
4487 wl1271_debug(DEBUG_ADHOC
, "ibss_joined: %d",
4488 bss_conf
->ibss_joined
);
4490 if (bss_conf
->ibss_joined
) {
4491 u32 rates
= bss_conf
->basic_rates
;
4492 wlvif
->basic_rate_set
=
4493 wl1271_tx_enabled_rates_get(wl
, rates
,
4496 wl1271_tx_min_rate_get(wl
,
4497 wlvif
->basic_rate_set
);
4499 /* by default, use 11b + OFDM rates */
4500 wlvif
->rate_set
= CONF_TX_IBSS_DEFAULT_RATES
;
4501 ret
= wl1271_acx_sta_rate_policies(wl
, wlvif
);
4507 if ((changed
& BSS_CHANGED_BEACON_INFO
) && bss_conf
->dtim_period
) {
4508 /* enable beacon filtering */
4509 ret
= wl1271_acx_beacon_filter_opt(wl
, wlvif
, true);
4514 ret
= wl1271_bss_erp_info_changed(wl
, vif
, bss_conf
, changed
);
4519 ret
= wlcore_join(wl
, wlvif
);
4521 wl1271_warning("cmd join failed %d", ret
);
4526 if (changed
& BSS_CHANGED_ASSOC
) {
4527 if (bss_conf
->assoc
) {
4528 ret
= wlcore_set_assoc(wl
, wlvif
, bss_conf
,
4533 if (test_bit(WLVIF_FLAG_STA_AUTHORIZED
, &wlvif
->flags
))
4534 wl12xx_set_authorized(wl
, wlvif
);
4536 wlcore_unset_assoc(wl
, wlvif
);
4540 if (changed
& BSS_CHANGED_PS
) {
4541 if ((bss_conf
->ps
) &&
4542 test_bit(WLVIF_FLAG_STA_ASSOCIATED
, &wlvif
->flags
) &&
4543 !test_bit(WLVIF_FLAG_IN_PS
, &wlvif
->flags
)) {
4547 if (wl
->conf
.conn
.forced_ps
) {
4548 ps_mode
= STATION_POWER_SAVE_MODE
;
4549 ps_mode_str
= "forced";
4551 ps_mode
= STATION_AUTO_PS_MODE
;
4552 ps_mode_str
= "auto";
4555 wl1271_debug(DEBUG_PSM
, "%s ps enabled", ps_mode_str
);
4557 ret
= wl1271_ps_set_mode(wl
, wlvif
, ps_mode
);
4559 wl1271_warning("enter %s ps failed %d",
4561 } else if (!bss_conf
->ps
&&
4562 test_bit(WLVIF_FLAG_IN_PS
, &wlvif
->flags
)) {
4563 wl1271_debug(DEBUG_PSM
, "auto ps disabled");
4565 ret
= wl1271_ps_set_mode(wl
, wlvif
,
4566 STATION_ACTIVE_MODE
);
4568 wl1271_warning("exit auto ps failed %d", ret
);
4572 /* Handle new association with HT. Do this after join. */
4575 bss_conf
->chandef
.width
!= NL80211_CHAN_WIDTH_20_NOHT
;
4577 ret
= wlcore_hw_set_peer_cap(wl
,
4583 wl1271_warning("Set ht cap failed %d", ret
);
4589 ret
= wl1271_acx_set_ht_information(wl
, wlvif
,
4590 bss_conf
->ht_operation_mode
);
4592 wl1271_warning("Set ht information failed %d",
4599 /* Handle arp filtering. Done after join. */
4600 if ((changed
& BSS_CHANGED_ARP_FILTER
) ||
4601 (!is_ibss
&& (changed
& BSS_CHANGED_QOS
))) {
4602 __be32 addr
= bss_conf
->arp_addr_list
[0];
4603 wlvif
->sta
.qos
= bss_conf
->qos
;
4604 WARN_ON(wlvif
->bss_type
!= BSS_TYPE_STA_BSS
);
4606 if (bss_conf
->arp_addr_cnt
== 1 && bss_conf
->assoc
) {
4607 wlvif
->ip_addr
= addr
;
4609 * The template should have been configured only upon
4610 * association. however, it seems that the correct ip
4611 * isn't being set (when sending), so we have to
4612 * reconfigure the template upon every ip change.
4614 ret
= wl1271_cmd_build_arp_rsp(wl
, wlvif
);
4616 wl1271_warning("build arp rsp failed: %d", ret
);
4620 ret
= wl1271_acx_arp_ip_filter(wl
, wlvif
,
4621 (ACX_ARP_FILTER_ARP_FILTERING
|
4622 ACX_ARP_FILTER_AUTO_ARP
),
4626 ret
= wl1271_acx_arp_ip_filter(wl
, wlvif
, 0, addr
);
4637 static void wl1271_op_bss_info_changed(struct ieee80211_hw
*hw
,
4638 struct ieee80211_vif
*vif
,
4639 struct ieee80211_bss_conf
*bss_conf
,
4642 struct wl1271
*wl
= hw
->priv
;
4643 struct wl12xx_vif
*wlvif
= wl12xx_vif_to_data(vif
);
4644 bool is_ap
= (wlvif
->bss_type
== BSS_TYPE_AP_BSS
);
4647 wl1271_debug(DEBUG_MAC80211
, "mac80211 bss info role %d changed 0x%x",
4648 wlvif
->role_id
, (int)changed
);
4651 * make sure to cancel pending disconnections if our association
4654 if (!is_ap
&& (changed
& BSS_CHANGED_ASSOC
))
4655 cancel_delayed_work_sync(&wlvif
->connection_loss_work
);
4657 if (is_ap
&& (changed
& BSS_CHANGED_BEACON_ENABLED
) &&
4658 !bss_conf
->enable_beacon
)
4659 wl1271_tx_flush(wl
);
4661 mutex_lock(&wl
->mutex
);
4663 if (unlikely(wl
->state
!= WLCORE_STATE_ON
))
4666 if (unlikely(!test_bit(WLVIF_FLAG_INITIALIZED
, &wlvif
->flags
)))
4669 ret
= pm_runtime_get_sync(wl
->dev
);
4671 pm_runtime_put_noidle(wl
->dev
);
4675 if ((changed
& BSS_CHANGED_TXPOWER
) &&
4676 bss_conf
->txpower
!= wlvif
->power_level
) {
4678 ret
= wl1271_acx_tx_power(wl
, wlvif
, bss_conf
->txpower
);
4682 wlvif
->power_level
= bss_conf
->txpower
;
4686 wl1271_bss_info_changed_ap(wl
, vif
, bss_conf
, changed
);
4688 wl1271_bss_info_changed_sta(wl
, vif
, bss_conf
, changed
);
4690 pm_runtime_mark_last_busy(wl
->dev
);
4691 pm_runtime_put_autosuspend(wl
->dev
);
4694 mutex_unlock(&wl
->mutex
);
4697 static int wlcore_op_add_chanctx(struct ieee80211_hw
*hw
,
4698 struct ieee80211_chanctx_conf
*ctx
)
4700 wl1271_debug(DEBUG_MAC80211
, "mac80211 add chanctx %d (type %d)",
4701 ieee80211_frequency_to_channel(ctx
->def
.chan
->center_freq
),
4702 cfg80211_get_chandef_type(&ctx
->def
));
4706 static void wlcore_op_remove_chanctx(struct ieee80211_hw
*hw
,
4707 struct ieee80211_chanctx_conf
*ctx
)
4709 wl1271_debug(DEBUG_MAC80211
, "mac80211 remove chanctx %d (type %d)",
4710 ieee80211_frequency_to_channel(ctx
->def
.chan
->center_freq
),
4711 cfg80211_get_chandef_type(&ctx
->def
));
4714 static void wlcore_op_change_chanctx(struct ieee80211_hw
*hw
,
4715 struct ieee80211_chanctx_conf
*ctx
,
4718 struct wl1271
*wl
= hw
->priv
;
4719 struct wl12xx_vif
*wlvif
;
4721 int channel
= ieee80211_frequency_to_channel(
4722 ctx
->def
.chan
->center_freq
);
4724 wl1271_debug(DEBUG_MAC80211
,
4725 "mac80211 change chanctx %d (type %d) changed 0x%x",
4726 channel
, cfg80211_get_chandef_type(&ctx
->def
), changed
);
4728 mutex_lock(&wl
->mutex
);
4730 ret
= pm_runtime_get_sync(wl
->dev
);
4732 pm_runtime_put_noidle(wl
->dev
);
4736 wl12xx_for_each_wlvif(wl
, wlvif
) {
4737 struct ieee80211_vif
*vif
= wl12xx_wlvif_to_vif(wlvif
);
4740 if (rcu_access_pointer(vif
->chanctx_conf
) != ctx
) {
4746 /* start radar if needed */
4747 if (changed
& IEEE80211_CHANCTX_CHANGE_RADAR
&&
4748 wlvif
->bss_type
== BSS_TYPE_AP_BSS
&&
4749 ctx
->radar_enabled
&& !wlvif
->radar_enabled
&&
4750 ctx
->def
.chan
->dfs_state
== NL80211_DFS_USABLE
) {
4751 wl1271_debug(DEBUG_MAC80211
, "Start radar detection");
4752 wlcore_hw_set_cac(wl
, wlvif
, true);
4753 wlvif
->radar_enabled
= true;
4757 pm_runtime_mark_last_busy(wl
->dev
);
4758 pm_runtime_put_autosuspend(wl
->dev
);
4760 mutex_unlock(&wl
->mutex
);
4763 static int wlcore_op_assign_vif_chanctx(struct ieee80211_hw
*hw
,
4764 struct ieee80211_vif
*vif
,
4765 struct ieee80211_chanctx_conf
*ctx
)
4767 struct wl1271
*wl
= hw
->priv
;
4768 struct wl12xx_vif
*wlvif
= wl12xx_vif_to_data(vif
);
4769 int channel
= ieee80211_frequency_to_channel(
4770 ctx
->def
.chan
->center_freq
);
4773 wl1271_debug(DEBUG_MAC80211
,
4774 "mac80211 assign chanctx (role %d) %d (type %d) (radar %d dfs_state %d)",
4775 wlvif
->role_id
, channel
,
4776 cfg80211_get_chandef_type(&ctx
->def
),
4777 ctx
->radar_enabled
, ctx
->def
.chan
->dfs_state
);
4779 mutex_lock(&wl
->mutex
);
4781 if (unlikely(wl
->state
!= WLCORE_STATE_ON
))
4784 if (unlikely(!test_bit(WLVIF_FLAG_INITIALIZED
, &wlvif
->flags
)))
4787 ret
= pm_runtime_get_sync(wl
->dev
);
4789 pm_runtime_put_noidle(wl
->dev
);
4793 wlvif
->band
= ctx
->def
.chan
->band
;
4794 wlvif
->channel
= channel
;
4795 wlvif
->channel_type
= cfg80211_get_chandef_type(&ctx
->def
);
4797 /* update default rates according to the band */
4798 wl1271_set_band_rate(wl
, wlvif
);
4800 if (ctx
->radar_enabled
&&
4801 ctx
->def
.chan
->dfs_state
== NL80211_DFS_USABLE
) {
4802 wl1271_debug(DEBUG_MAC80211
, "Start radar detection");
4803 wlcore_hw_set_cac(wl
, wlvif
, true);
4804 wlvif
->radar_enabled
= true;
4807 pm_runtime_mark_last_busy(wl
->dev
);
4808 pm_runtime_put_autosuspend(wl
->dev
);
4810 mutex_unlock(&wl
->mutex
);
4815 static void wlcore_op_unassign_vif_chanctx(struct ieee80211_hw
*hw
,
4816 struct ieee80211_vif
*vif
,
4817 struct ieee80211_chanctx_conf
*ctx
)
4819 struct wl1271
*wl
= hw
->priv
;
4820 struct wl12xx_vif
*wlvif
= wl12xx_vif_to_data(vif
);
4823 wl1271_debug(DEBUG_MAC80211
,
4824 "mac80211 unassign chanctx (role %d) %d (type %d)",
4826 ieee80211_frequency_to_channel(ctx
->def
.chan
->center_freq
),
4827 cfg80211_get_chandef_type(&ctx
->def
));
4829 wl1271_tx_flush(wl
);
4831 mutex_lock(&wl
->mutex
);
4833 if (unlikely(wl
->state
!= WLCORE_STATE_ON
))
4836 if (unlikely(!test_bit(WLVIF_FLAG_INITIALIZED
, &wlvif
->flags
)))
4839 ret
= pm_runtime_get_sync(wl
->dev
);
4841 pm_runtime_put_noidle(wl
->dev
);
4845 if (wlvif
->radar_enabled
) {
4846 wl1271_debug(DEBUG_MAC80211
, "Stop radar detection");
4847 wlcore_hw_set_cac(wl
, wlvif
, false);
4848 wlvif
->radar_enabled
= false;
4851 pm_runtime_mark_last_busy(wl
->dev
);
4852 pm_runtime_put_autosuspend(wl
->dev
);
4854 mutex_unlock(&wl
->mutex
);
4857 static int __wlcore_switch_vif_chan(struct wl1271
*wl
,
4858 struct wl12xx_vif
*wlvif
,
4859 struct ieee80211_chanctx_conf
*new_ctx
)
4861 int channel
= ieee80211_frequency_to_channel(
4862 new_ctx
->def
.chan
->center_freq
);
4864 wl1271_debug(DEBUG_MAC80211
,
4865 "switch vif (role %d) %d -> %d chan_type: %d",
4866 wlvif
->role_id
, wlvif
->channel
, channel
,
4867 cfg80211_get_chandef_type(&new_ctx
->def
));
4869 if (WARN_ON_ONCE(wlvif
->bss_type
!= BSS_TYPE_AP_BSS
))
4872 WARN_ON(!test_bit(WLVIF_FLAG_BEACON_DISABLED
, &wlvif
->flags
));
4874 if (wlvif
->radar_enabled
) {
4875 wl1271_debug(DEBUG_MAC80211
, "Stop radar detection");
4876 wlcore_hw_set_cac(wl
, wlvif
, false);
4877 wlvif
->radar_enabled
= false;
4880 wlvif
->band
= new_ctx
->def
.chan
->band
;
4881 wlvif
->channel
= channel
;
4882 wlvif
->channel_type
= cfg80211_get_chandef_type(&new_ctx
->def
);
4884 /* start radar if needed */
4885 if (new_ctx
->radar_enabled
) {
4886 wl1271_debug(DEBUG_MAC80211
, "Start radar detection");
4887 wlcore_hw_set_cac(wl
, wlvif
, true);
4888 wlvif
->radar_enabled
= true;
4895 wlcore_op_switch_vif_chanctx(struct ieee80211_hw
*hw
,
4896 struct ieee80211_vif_chanctx_switch
*vifs
,
4898 enum ieee80211_chanctx_switch_mode mode
)
4900 struct wl1271
*wl
= hw
->priv
;
4903 wl1271_debug(DEBUG_MAC80211
,
4904 "mac80211 switch chanctx n_vifs %d mode %d",
4907 mutex_lock(&wl
->mutex
);
4909 ret
= pm_runtime_get_sync(wl
->dev
);
4911 pm_runtime_put_noidle(wl
->dev
);
4915 for (i
= 0; i
< n_vifs
; i
++) {
4916 struct wl12xx_vif
*wlvif
= wl12xx_vif_to_data(vifs
[i
].vif
);
4918 ret
= __wlcore_switch_vif_chan(wl
, wlvif
, vifs
[i
].new_ctx
);
4923 pm_runtime_mark_last_busy(wl
->dev
);
4924 pm_runtime_put_autosuspend(wl
->dev
);
4926 mutex_unlock(&wl
->mutex
);
4931 static int wl1271_op_conf_tx(struct ieee80211_hw
*hw
,
4932 struct ieee80211_vif
*vif
, u16 queue
,
4933 const struct ieee80211_tx_queue_params
*params
)
4935 struct wl1271
*wl
= hw
->priv
;
4936 struct wl12xx_vif
*wlvif
= wl12xx_vif_to_data(vif
);
4940 if (wlcore_is_p2p_mgmt(wlvif
))
4943 mutex_lock(&wl
->mutex
);
4945 wl1271_debug(DEBUG_MAC80211
, "mac80211 conf tx %d", queue
);
4948 ps_scheme
= CONF_PS_SCHEME_UPSD_TRIGGER
;
4950 ps_scheme
= CONF_PS_SCHEME_LEGACY
;
4952 if (!test_bit(WLVIF_FLAG_INITIALIZED
, &wlvif
->flags
))
4955 ret
= pm_runtime_get_sync(wl
->dev
);
4957 pm_runtime_put_noidle(wl
->dev
);
4962 * the txop is confed in units of 32us by the mac80211,
4965 ret
= wl1271_acx_ac_cfg(wl
, wlvif
, wl1271_tx_get_queue(queue
),
4966 params
->cw_min
, params
->cw_max
,
4967 params
->aifs
, params
->txop
<< 5);
4971 ret
= wl1271_acx_tid_cfg(wl
, wlvif
, wl1271_tx_get_queue(queue
),
4972 CONF_CHANNEL_TYPE_EDCF
,
4973 wl1271_tx_get_queue(queue
),
4974 ps_scheme
, CONF_ACK_POLICY_LEGACY
,
4978 pm_runtime_mark_last_busy(wl
->dev
);
4979 pm_runtime_put_autosuspend(wl
->dev
);
4982 mutex_unlock(&wl
->mutex
);
4987 static u64
wl1271_op_get_tsf(struct ieee80211_hw
*hw
,
4988 struct ieee80211_vif
*vif
)
4991 struct wl1271
*wl
= hw
->priv
;
4992 struct wl12xx_vif
*wlvif
= wl12xx_vif_to_data(vif
);
4993 u64 mactime
= ULLONG_MAX
;
4996 wl1271_debug(DEBUG_MAC80211
, "mac80211 get tsf");
4998 mutex_lock(&wl
->mutex
);
5000 if (unlikely(wl
->state
!= WLCORE_STATE_ON
))
5003 ret
= pm_runtime_get_sync(wl
->dev
);
5005 pm_runtime_put_noidle(wl
->dev
);
5009 ret
= wl12xx_acx_tsf_info(wl
, wlvif
, &mactime
);
5014 pm_runtime_mark_last_busy(wl
->dev
);
5015 pm_runtime_put_autosuspend(wl
->dev
);
5018 mutex_unlock(&wl
->mutex
);
5022 static int wl1271_op_get_survey(struct ieee80211_hw
*hw
, int idx
,
5023 struct survey_info
*survey
)
5025 struct ieee80211_conf
*conf
= &hw
->conf
;
5030 survey
->channel
= conf
->chandef
.chan
;
5035 static int wl1271_allocate_sta(struct wl1271
*wl
,
5036 struct wl12xx_vif
*wlvif
,
5037 struct ieee80211_sta
*sta
)
5039 struct wl1271_station
*wl_sta
;
5043 if (wl
->active_sta_count
>= wl
->max_ap_stations
) {
5044 wl1271_warning("could not allocate HLID - too much stations");
5048 wl_sta
= (struct wl1271_station
*)sta
->drv_priv
;
5049 ret
= wl12xx_allocate_link(wl
, wlvif
, &wl_sta
->hlid
);
5051 wl1271_warning("could not allocate HLID - too many links");
5055 /* use the previous security seq, if this is a recovery/resume */
5056 wl
->links
[wl_sta
->hlid
].total_freed_pkts
= wl_sta
->total_freed_pkts
;
5058 set_bit(wl_sta
->hlid
, wlvif
->ap
.sta_hlid_map
);
5059 memcpy(wl
->links
[wl_sta
->hlid
].addr
, sta
->addr
, ETH_ALEN
);
5060 wl
->active_sta_count
++;
5064 void wl1271_free_sta(struct wl1271
*wl
, struct wl12xx_vif
*wlvif
, u8 hlid
)
5066 if (!test_bit(hlid
, wlvif
->ap
.sta_hlid_map
))
5069 clear_bit(hlid
, wlvif
->ap
.sta_hlid_map
);
5070 __clear_bit(hlid
, &wl
->ap_ps_map
);
5071 __clear_bit(hlid
, &wl
->ap_fw_ps_map
);
5074 * save the last used PN in the private part of iee80211_sta,
5075 * in case of recovery/suspend
5077 wlcore_save_freed_pkts_addr(wl
, wlvif
, hlid
, wl
->links
[hlid
].addr
);
5079 wl12xx_free_link(wl
, wlvif
, &hlid
);
5080 wl
->active_sta_count
--;
5083 * rearm the tx watchdog when the last STA is freed - give the FW a
5084 * chance to return STA-buffered packets before complaining.
5086 if (wl
->active_sta_count
== 0)
5087 wl12xx_rearm_tx_watchdog_locked(wl
);
5090 static int wl12xx_sta_add(struct wl1271
*wl
,
5091 struct wl12xx_vif
*wlvif
,
5092 struct ieee80211_sta
*sta
)
5094 struct wl1271_station
*wl_sta
;
5098 wl1271_debug(DEBUG_MAC80211
, "mac80211 add sta %d", (int)sta
->aid
);
5100 ret
= wl1271_allocate_sta(wl
, wlvif
, sta
);
5104 wl_sta
= (struct wl1271_station
*)sta
->drv_priv
;
5105 hlid
= wl_sta
->hlid
;
5107 ret
= wl12xx_cmd_add_peer(wl
, wlvif
, sta
, hlid
);
5109 wl1271_free_sta(wl
, wlvif
, hlid
);
5114 static int wl12xx_sta_remove(struct wl1271
*wl
,
5115 struct wl12xx_vif
*wlvif
,
5116 struct ieee80211_sta
*sta
)
5118 struct wl1271_station
*wl_sta
;
5121 wl1271_debug(DEBUG_MAC80211
, "mac80211 remove sta %d", (int)sta
->aid
);
5123 wl_sta
= (struct wl1271_station
*)sta
->drv_priv
;
5125 if (WARN_ON(!test_bit(id
, wlvif
->ap
.sta_hlid_map
)))
5128 ret
= wl12xx_cmd_remove_peer(wl
, wlvif
, wl_sta
->hlid
);
5132 wl1271_free_sta(wl
, wlvif
, wl_sta
->hlid
);
5136 static void wlcore_roc_if_possible(struct wl1271
*wl
,
5137 struct wl12xx_vif
*wlvif
)
5139 if (find_first_bit(wl
->roc_map
,
5140 WL12XX_MAX_ROLES
) < WL12XX_MAX_ROLES
)
5143 if (WARN_ON(wlvif
->role_id
== WL12XX_INVALID_ROLE_ID
))
5146 wl12xx_roc(wl
, wlvif
, wlvif
->role_id
, wlvif
->band
, wlvif
->channel
);
5150 * when wl_sta is NULL, we treat this call as if coming from a
5151 * pending auth reply.
5152 * wl->mutex must be taken and the FW must be awake when the call
5155 void wlcore_update_inconn_sta(struct wl1271
*wl
, struct wl12xx_vif
*wlvif
,
5156 struct wl1271_station
*wl_sta
, bool in_conn
)
5159 if (WARN_ON(wl_sta
&& wl_sta
->in_connection
))
5162 if (!wlvif
->ap_pending_auth_reply
&&
5163 !wlvif
->inconn_count
)
5164 wlcore_roc_if_possible(wl
, wlvif
);
5167 wl_sta
->in_connection
= true;
5168 wlvif
->inconn_count
++;
5170 wlvif
->ap_pending_auth_reply
= true;
5173 if (wl_sta
&& !wl_sta
->in_connection
)
5176 if (WARN_ON(!wl_sta
&& !wlvif
->ap_pending_auth_reply
))
5179 if (WARN_ON(wl_sta
&& !wlvif
->inconn_count
))
5183 wl_sta
->in_connection
= false;
5184 wlvif
->inconn_count
--;
5186 wlvif
->ap_pending_auth_reply
= false;
5189 if (!wlvif
->inconn_count
&& !wlvif
->ap_pending_auth_reply
&&
5190 test_bit(wlvif
->role_id
, wl
->roc_map
))
5191 wl12xx_croc(wl
, wlvif
->role_id
);
5195 static int wl12xx_update_sta_state(struct wl1271
*wl
,
5196 struct wl12xx_vif
*wlvif
,
5197 struct ieee80211_sta
*sta
,
5198 enum ieee80211_sta_state old_state
,
5199 enum ieee80211_sta_state new_state
)
5201 struct wl1271_station
*wl_sta
;
5202 bool is_ap
= wlvif
->bss_type
== BSS_TYPE_AP_BSS
;
5203 bool is_sta
= wlvif
->bss_type
== BSS_TYPE_STA_BSS
;
5206 wl_sta
= (struct wl1271_station
*)sta
->drv_priv
;
5208 /* Add station (AP mode) */
5210 old_state
== IEEE80211_STA_NOTEXIST
&&
5211 new_state
== IEEE80211_STA_NONE
) {
5212 ret
= wl12xx_sta_add(wl
, wlvif
, sta
);
5216 wlcore_update_inconn_sta(wl
, wlvif
, wl_sta
, true);
5219 /* Remove station (AP mode) */
5221 old_state
== IEEE80211_STA_NONE
&&
5222 new_state
== IEEE80211_STA_NOTEXIST
) {
5224 wl12xx_sta_remove(wl
, wlvif
, sta
);
5226 wlcore_update_inconn_sta(wl
, wlvif
, wl_sta
, false);
5229 /* Authorize station (AP mode) */
5231 new_state
== IEEE80211_STA_AUTHORIZED
) {
5232 ret
= wl12xx_cmd_set_peer_state(wl
, wlvif
, wl_sta
->hlid
);
5236 /* reconfigure rates */
5237 ret
= wl12xx_cmd_add_peer(wl
, wlvif
, sta
, wl_sta
->hlid
);
5241 ret
= wl1271_acx_set_ht_capabilities(wl
, &sta
->ht_cap
, true,
5246 wlcore_update_inconn_sta(wl
, wlvif
, wl_sta
, false);
5249 /* Authorize station */
5251 new_state
== IEEE80211_STA_AUTHORIZED
) {
5252 set_bit(WLVIF_FLAG_STA_AUTHORIZED
, &wlvif
->flags
);
5253 ret
= wl12xx_set_authorized(wl
, wlvif
);
5259 old_state
== IEEE80211_STA_AUTHORIZED
&&
5260 new_state
== IEEE80211_STA_ASSOC
) {
5261 clear_bit(WLVIF_FLAG_STA_AUTHORIZED
, &wlvif
->flags
);
5262 clear_bit(WLVIF_FLAG_STA_STATE_SENT
, &wlvif
->flags
);
5265 /* save seq number on disassoc (suspend) */
5267 old_state
== IEEE80211_STA_ASSOC
&&
5268 new_state
== IEEE80211_STA_AUTH
) {
5269 wlcore_save_freed_pkts(wl
, wlvif
, wlvif
->sta
.hlid
, sta
);
5270 wlvif
->total_freed_pkts
= 0;
5273 /* restore seq number on assoc (resume) */
5275 old_state
== IEEE80211_STA_AUTH
&&
5276 new_state
== IEEE80211_STA_ASSOC
) {
5277 wlvif
->total_freed_pkts
= wl_sta
->total_freed_pkts
;
5280 /* clear ROCs on failure or authorization */
5282 (new_state
== IEEE80211_STA_AUTHORIZED
||
5283 new_state
== IEEE80211_STA_NOTEXIST
)) {
5284 if (test_bit(wlvif
->role_id
, wl
->roc_map
))
5285 wl12xx_croc(wl
, wlvif
->role_id
);
5289 old_state
== IEEE80211_STA_NOTEXIST
&&
5290 new_state
== IEEE80211_STA_NONE
) {
5291 if (find_first_bit(wl
->roc_map
,
5292 WL12XX_MAX_ROLES
) >= WL12XX_MAX_ROLES
) {
5293 WARN_ON(wlvif
->role_id
== WL12XX_INVALID_ROLE_ID
);
5294 wl12xx_roc(wl
, wlvif
, wlvif
->role_id
,
5295 wlvif
->band
, wlvif
->channel
);
5301 static int wl12xx_op_sta_state(struct ieee80211_hw
*hw
,
5302 struct ieee80211_vif
*vif
,
5303 struct ieee80211_sta
*sta
,
5304 enum ieee80211_sta_state old_state
,
5305 enum ieee80211_sta_state new_state
)
5307 struct wl1271
*wl
= hw
->priv
;
5308 struct wl12xx_vif
*wlvif
= wl12xx_vif_to_data(vif
);
5311 wl1271_debug(DEBUG_MAC80211
, "mac80211 sta %d state=%d->%d",
5312 sta
->aid
, old_state
, new_state
);
5314 mutex_lock(&wl
->mutex
);
5316 if (unlikely(wl
->state
!= WLCORE_STATE_ON
)) {
5321 ret
= pm_runtime_get_sync(wl
->dev
);
5323 pm_runtime_put_noidle(wl
->dev
);
5327 ret
= wl12xx_update_sta_state(wl
, wlvif
, sta
, old_state
, new_state
);
5329 pm_runtime_mark_last_busy(wl
->dev
);
5330 pm_runtime_put_autosuspend(wl
->dev
);
5332 mutex_unlock(&wl
->mutex
);
5333 if (new_state
< old_state
)
5338 static int wl1271_op_ampdu_action(struct ieee80211_hw
*hw
,
5339 struct ieee80211_vif
*vif
,
5340 struct ieee80211_ampdu_params
*params
)
5342 struct wl1271
*wl
= hw
->priv
;
5343 struct wl12xx_vif
*wlvif
= wl12xx_vif_to_data(vif
);
5345 u8 hlid
, *ba_bitmap
;
5346 struct ieee80211_sta
*sta
= params
->sta
;
5347 enum ieee80211_ampdu_mlme_action action
= params
->action
;
5348 u16 tid
= params
->tid
;
5349 u16
*ssn
= ¶ms
->ssn
;
5351 wl1271_debug(DEBUG_MAC80211
, "mac80211 ampdu action %d tid %d", action
,
5354 /* sanity check - the fields in FW are only 8bits wide */
5355 if (WARN_ON(tid
> 0xFF))
5358 mutex_lock(&wl
->mutex
);
5360 if (unlikely(wl
->state
!= WLCORE_STATE_ON
)) {
5365 if (wlvif
->bss_type
== BSS_TYPE_STA_BSS
) {
5366 hlid
= wlvif
->sta
.hlid
;
5367 } else if (wlvif
->bss_type
== BSS_TYPE_AP_BSS
) {
5368 struct wl1271_station
*wl_sta
;
5370 wl_sta
= (struct wl1271_station
*)sta
->drv_priv
;
5371 hlid
= wl_sta
->hlid
;
5377 ba_bitmap
= &wl
->links
[hlid
].ba_bitmap
;
5379 ret
= pm_runtime_get_sync(wl
->dev
);
5381 pm_runtime_put_noidle(wl
->dev
);
5385 wl1271_debug(DEBUG_MAC80211
, "mac80211 ampdu: Rx tid %d action %d",
5389 case IEEE80211_AMPDU_RX_START
:
5390 if (!wlvif
->ba_support
|| !wlvif
->ba_allowed
) {
5395 if (wl
->ba_rx_session_count
>= wl
->ba_rx_session_count_max
) {
5397 wl1271_error("exceeded max RX BA sessions");
5401 if (*ba_bitmap
& BIT(tid
)) {
5403 wl1271_error("cannot enable RX BA session on active "
5408 ret
= wl12xx_acx_set_ba_receiver_session(wl
, tid
, *ssn
, true,
5413 *ba_bitmap
|= BIT(tid
);
5414 wl
->ba_rx_session_count
++;
5418 case IEEE80211_AMPDU_RX_STOP
:
5419 if (!(*ba_bitmap
& BIT(tid
))) {
5421 * this happens on reconfig - so only output a debug
5422 * message for now, and don't fail the function.
5424 wl1271_debug(DEBUG_MAC80211
,
5425 "no active RX BA session on tid: %d",
5431 ret
= wl12xx_acx_set_ba_receiver_session(wl
, tid
, 0, false,
5434 *ba_bitmap
&= ~BIT(tid
);
5435 wl
->ba_rx_session_count
--;
5440 * The BA initiator session management in FW independently.
5441 * Falling break here on purpose for all TX APDU commands.
5443 case IEEE80211_AMPDU_TX_START
:
5444 case IEEE80211_AMPDU_TX_STOP_CONT
:
5445 case IEEE80211_AMPDU_TX_STOP_FLUSH
:
5446 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT
:
5447 case IEEE80211_AMPDU_TX_OPERATIONAL
:
5452 wl1271_error("Incorrect ampdu action id=%x\n", action
);
5456 pm_runtime_mark_last_busy(wl
->dev
);
5457 pm_runtime_put_autosuspend(wl
->dev
);
5460 mutex_unlock(&wl
->mutex
);
5465 static int wl12xx_set_bitrate_mask(struct ieee80211_hw
*hw
,
5466 struct ieee80211_vif
*vif
,
5467 const struct cfg80211_bitrate_mask
*mask
)
5469 struct wl12xx_vif
*wlvif
= wl12xx_vif_to_data(vif
);
5470 struct wl1271
*wl
= hw
->priv
;
5473 wl1271_debug(DEBUG_MAC80211
, "mac80211 set_bitrate_mask 0x%x 0x%x",
5474 mask
->control
[NL80211_BAND_2GHZ
].legacy
,
5475 mask
->control
[NL80211_BAND_5GHZ
].legacy
);
5477 mutex_lock(&wl
->mutex
);
5479 for (i
= 0; i
< WLCORE_NUM_BANDS
; i
++)
5480 wlvif
->bitrate_masks
[i
] =
5481 wl1271_tx_enabled_rates_get(wl
,
5482 mask
->control
[i
].legacy
,
5485 if (unlikely(wl
->state
!= WLCORE_STATE_ON
))
5488 if (wlvif
->bss_type
== BSS_TYPE_STA_BSS
&&
5489 !test_bit(WLVIF_FLAG_STA_ASSOCIATED
, &wlvif
->flags
)) {
5491 ret
= pm_runtime_get_sync(wl
->dev
);
5493 pm_runtime_put_noidle(wl
->dev
);
5497 wl1271_set_band_rate(wl
, wlvif
);
5499 wl1271_tx_min_rate_get(wl
, wlvif
->basic_rate_set
);
5500 ret
= wl1271_acx_sta_rate_policies(wl
, wlvif
);
5502 pm_runtime_mark_last_busy(wl
->dev
);
5503 pm_runtime_put_autosuspend(wl
->dev
);
5506 mutex_unlock(&wl
->mutex
);
5511 static void wl12xx_op_channel_switch(struct ieee80211_hw
*hw
,
5512 struct ieee80211_vif
*vif
,
5513 struct ieee80211_channel_switch
*ch_switch
)
5515 struct wl1271
*wl
= hw
->priv
;
5516 struct wl12xx_vif
*wlvif
= wl12xx_vif_to_data(vif
);
5519 wl1271_debug(DEBUG_MAC80211
, "mac80211 channel switch");
5521 wl1271_tx_flush(wl
);
5523 mutex_lock(&wl
->mutex
);
5525 if (unlikely(wl
->state
== WLCORE_STATE_OFF
)) {
5526 if (test_bit(WLVIF_FLAG_STA_ASSOCIATED
, &wlvif
->flags
))
5527 ieee80211_chswitch_done(vif
, false);
5529 } else if (unlikely(wl
->state
!= WLCORE_STATE_ON
)) {
5533 ret
= pm_runtime_get_sync(wl
->dev
);
5535 pm_runtime_put_noidle(wl
->dev
);
5539 /* TODO: change mac80211 to pass vif as param */
5541 if (test_bit(WLVIF_FLAG_STA_ASSOCIATED
, &wlvif
->flags
)) {
5542 unsigned long delay_usec
;
5544 ret
= wl
->ops
->channel_switch(wl
, wlvif
, ch_switch
);
5548 set_bit(WLVIF_FLAG_CS_PROGRESS
, &wlvif
->flags
);
5550 /* indicate failure 5 seconds after channel switch time */
5551 delay_usec
= ieee80211_tu_to_usec(wlvif
->beacon_int
) *
5553 ieee80211_queue_delayed_work(hw
, &wlvif
->channel_switch_work
,
5554 usecs_to_jiffies(delay_usec
) +
5555 msecs_to_jiffies(5000));
5559 pm_runtime_mark_last_busy(wl
->dev
);
5560 pm_runtime_put_autosuspend(wl
->dev
);
5563 mutex_unlock(&wl
->mutex
);
5566 static const void *wlcore_get_beacon_ie(struct wl1271
*wl
,
5567 struct wl12xx_vif
*wlvif
,
5570 int ieoffset
= offsetof(struct ieee80211_mgmt
, u
.beacon
.variable
);
5571 struct sk_buff
*beacon
=
5572 ieee80211_beacon_get(wl
->hw
, wl12xx_wlvif_to_vif(wlvif
));
5577 return cfg80211_find_ie(eid
,
5578 beacon
->data
+ ieoffset
,
5579 beacon
->len
- ieoffset
);
5582 static int wlcore_get_csa_count(struct wl1271
*wl
, struct wl12xx_vif
*wlvif
,
5586 const struct ieee80211_channel_sw_ie
*ie_csa
;
5588 ie
= wlcore_get_beacon_ie(wl
, wlvif
, WLAN_EID_CHANNEL_SWITCH
);
5592 ie_csa
= (struct ieee80211_channel_sw_ie
*)&ie
[2];
5593 *csa_count
= ie_csa
->count
;
5598 static void wlcore_op_channel_switch_beacon(struct ieee80211_hw
*hw
,
5599 struct ieee80211_vif
*vif
,
5600 struct cfg80211_chan_def
*chandef
)
5602 struct wl1271
*wl
= hw
->priv
;
5603 struct wl12xx_vif
*wlvif
= wl12xx_vif_to_data(vif
);
5604 struct ieee80211_channel_switch ch_switch
= {
5606 .chandef
= *chandef
,
5610 wl1271_debug(DEBUG_MAC80211
,
5611 "mac80211 channel switch beacon (role %d)",
5614 ret
= wlcore_get_csa_count(wl
, wlvif
, &ch_switch
.count
);
5616 wl1271_error("error getting beacon (for CSA counter)");
5620 mutex_lock(&wl
->mutex
);
5622 if (unlikely(wl
->state
!= WLCORE_STATE_ON
)) {
5627 ret
= pm_runtime_get_sync(wl
->dev
);
5629 pm_runtime_put_noidle(wl
->dev
);
5633 ret
= wl
->ops
->channel_switch(wl
, wlvif
, &ch_switch
);
5637 set_bit(WLVIF_FLAG_CS_PROGRESS
, &wlvif
->flags
);
5640 pm_runtime_mark_last_busy(wl
->dev
);
5641 pm_runtime_put_autosuspend(wl
->dev
);
5643 mutex_unlock(&wl
->mutex
);
5646 static void wlcore_op_flush(struct ieee80211_hw
*hw
, struct ieee80211_vif
*vif
,
5647 u32 queues
, bool drop
)
5649 struct wl1271
*wl
= hw
->priv
;
5651 wl1271_tx_flush(wl
);
5654 static int wlcore_op_remain_on_channel(struct ieee80211_hw
*hw
,
5655 struct ieee80211_vif
*vif
,
5656 struct ieee80211_channel
*chan
,
5658 enum ieee80211_roc_type type
)
5660 struct wl12xx_vif
*wlvif
= wl12xx_vif_to_data(vif
);
5661 struct wl1271
*wl
= hw
->priv
;
5662 int channel
, active_roc
, ret
= 0;
5664 channel
= ieee80211_frequency_to_channel(chan
->center_freq
);
5666 wl1271_debug(DEBUG_MAC80211
, "mac80211 roc %d (%d)",
5667 channel
, wlvif
->role_id
);
5669 mutex_lock(&wl
->mutex
);
5671 if (unlikely(wl
->state
!= WLCORE_STATE_ON
))
5674 /* return EBUSY if we can't ROC right now */
5675 active_roc
= find_first_bit(wl
->roc_map
, WL12XX_MAX_ROLES
);
5676 if (wl
->roc_vif
|| active_roc
< WL12XX_MAX_ROLES
) {
5677 wl1271_warning("active roc on role %d", active_roc
);
5682 ret
= pm_runtime_get_sync(wl
->dev
);
5684 pm_runtime_put_noidle(wl
->dev
);
5688 ret
= wl12xx_start_dev(wl
, wlvif
, chan
->band
, channel
);
5693 ieee80211_queue_delayed_work(hw
, &wl
->roc_complete_work
,
5694 msecs_to_jiffies(duration
));
5696 pm_runtime_mark_last_busy(wl
->dev
);
5697 pm_runtime_put_autosuspend(wl
->dev
);
5699 mutex_unlock(&wl
->mutex
);
5703 static int __wlcore_roc_completed(struct wl1271
*wl
)
5705 struct wl12xx_vif
*wlvif
;
5708 /* already completed */
5709 if (unlikely(!wl
->roc_vif
))
5712 wlvif
= wl12xx_vif_to_data(wl
->roc_vif
);
5714 if (!test_bit(WLVIF_FLAG_INITIALIZED
, &wlvif
->flags
))
5717 ret
= wl12xx_stop_dev(wl
, wlvif
);
5726 static int wlcore_roc_completed(struct wl1271
*wl
)
5730 wl1271_debug(DEBUG_MAC80211
, "roc complete");
5732 mutex_lock(&wl
->mutex
);
5734 if (unlikely(wl
->state
!= WLCORE_STATE_ON
)) {
5739 ret
= pm_runtime_get_sync(wl
->dev
);
5741 pm_runtime_put_noidle(wl
->dev
);
5745 ret
= __wlcore_roc_completed(wl
);
5747 pm_runtime_mark_last_busy(wl
->dev
);
5748 pm_runtime_put_autosuspend(wl
->dev
);
5750 mutex_unlock(&wl
->mutex
);
5755 static void wlcore_roc_complete_work(struct work_struct
*work
)
5757 struct delayed_work
*dwork
;
5761 dwork
= to_delayed_work(work
);
5762 wl
= container_of(dwork
, struct wl1271
, roc_complete_work
);
5764 ret
= wlcore_roc_completed(wl
);
5766 ieee80211_remain_on_channel_expired(wl
->hw
);
5769 static int wlcore_op_cancel_remain_on_channel(struct ieee80211_hw
*hw
,
5770 struct ieee80211_vif
*vif
)
5772 struct wl1271
*wl
= hw
->priv
;
5774 wl1271_debug(DEBUG_MAC80211
, "mac80211 croc");
5777 wl1271_tx_flush(wl
);
5780 * we can't just flush_work here, because it might deadlock
5781 * (as we might get called from the same workqueue)
5783 cancel_delayed_work_sync(&wl
->roc_complete_work
);
5784 wlcore_roc_completed(wl
);
5789 static void wlcore_op_sta_rc_update(struct ieee80211_hw
*hw
,
5790 struct ieee80211_vif
*vif
,
5791 struct ieee80211_sta
*sta
,
5794 struct wl12xx_vif
*wlvif
= wl12xx_vif_to_data(vif
);
5796 wl1271_debug(DEBUG_MAC80211
, "mac80211 sta_rc_update");
5798 if (!(changed
& IEEE80211_RC_BW_CHANGED
))
5801 /* this callback is atomic, so schedule a new work */
5802 wlvif
->rc_update_bw
= sta
->bandwidth
;
5803 memcpy(&wlvif
->rc_ht_cap
, &sta
->ht_cap
, sizeof(sta
->ht_cap
));
5804 ieee80211_queue_work(hw
, &wlvif
->rc_update_work
);
5807 static void wlcore_op_sta_statistics(struct ieee80211_hw
*hw
,
5808 struct ieee80211_vif
*vif
,
5809 struct ieee80211_sta
*sta
,
5810 struct station_info
*sinfo
)
5812 struct wl1271
*wl
= hw
->priv
;
5813 struct wl12xx_vif
*wlvif
= wl12xx_vif_to_data(vif
);
5817 wl1271_debug(DEBUG_MAC80211
, "mac80211 get_rssi");
5819 mutex_lock(&wl
->mutex
);
5821 if (unlikely(wl
->state
!= WLCORE_STATE_ON
))
5824 ret
= pm_runtime_get_sync(wl
->dev
);
5826 pm_runtime_put_noidle(wl
->dev
);
5830 ret
= wlcore_acx_average_rssi(wl
, wlvif
, &rssi_dbm
);
5834 sinfo
->filled
|= BIT_ULL(NL80211_STA_INFO_SIGNAL
);
5835 sinfo
->signal
= rssi_dbm
;
5838 pm_runtime_mark_last_busy(wl
->dev
);
5839 pm_runtime_put_autosuspend(wl
->dev
);
5842 mutex_unlock(&wl
->mutex
);
5845 static u32
wlcore_op_get_expected_throughput(struct ieee80211_hw
*hw
,
5846 struct ieee80211_sta
*sta
)
5848 struct wl1271_station
*wl_sta
= (struct wl1271_station
*)sta
->drv_priv
;
5849 struct wl1271
*wl
= hw
->priv
;
5850 u8 hlid
= wl_sta
->hlid
;
5852 /* return in units of Kbps */
5853 return (wl
->links
[hlid
].fw_rate_mbps
* 1000);
5856 static bool wl1271_tx_frames_pending(struct ieee80211_hw
*hw
)
5858 struct wl1271
*wl
= hw
->priv
;
5861 mutex_lock(&wl
->mutex
);
5863 if (unlikely(wl
->state
!= WLCORE_STATE_ON
))
5866 /* packets are considered pending if in the TX queue or the FW */
5867 ret
= (wl1271_tx_total_queue_count(wl
) > 0) || (wl
->tx_frames_cnt
> 0);
5869 mutex_unlock(&wl
->mutex
);
5874 /* can't be const, mac80211 writes to this */
5875 static struct ieee80211_rate wl1271_rates
[] = {
5877 .hw_value
= CONF_HW_BIT_RATE_1MBPS
,
5878 .hw_value_short
= CONF_HW_BIT_RATE_1MBPS
, },
5880 .hw_value
= CONF_HW_BIT_RATE_2MBPS
,
5881 .hw_value_short
= CONF_HW_BIT_RATE_2MBPS
,
5882 .flags
= IEEE80211_RATE_SHORT_PREAMBLE
},
5884 .hw_value
= CONF_HW_BIT_RATE_5_5MBPS
,
5885 .hw_value_short
= CONF_HW_BIT_RATE_5_5MBPS
,
5886 .flags
= IEEE80211_RATE_SHORT_PREAMBLE
},
5888 .hw_value
= CONF_HW_BIT_RATE_11MBPS
,
5889 .hw_value_short
= CONF_HW_BIT_RATE_11MBPS
,
5890 .flags
= IEEE80211_RATE_SHORT_PREAMBLE
},
5892 .hw_value
= CONF_HW_BIT_RATE_6MBPS
,
5893 .hw_value_short
= CONF_HW_BIT_RATE_6MBPS
, },
5895 .hw_value
= CONF_HW_BIT_RATE_9MBPS
,
5896 .hw_value_short
= CONF_HW_BIT_RATE_9MBPS
, },
5898 .hw_value
= CONF_HW_BIT_RATE_12MBPS
,
5899 .hw_value_short
= CONF_HW_BIT_RATE_12MBPS
, },
5901 .hw_value
= CONF_HW_BIT_RATE_18MBPS
,
5902 .hw_value_short
= CONF_HW_BIT_RATE_18MBPS
, },
5904 .hw_value
= CONF_HW_BIT_RATE_24MBPS
,
5905 .hw_value_short
= CONF_HW_BIT_RATE_24MBPS
, },
5907 .hw_value
= CONF_HW_BIT_RATE_36MBPS
,
5908 .hw_value_short
= CONF_HW_BIT_RATE_36MBPS
, },
5910 .hw_value
= CONF_HW_BIT_RATE_48MBPS
,
5911 .hw_value_short
= CONF_HW_BIT_RATE_48MBPS
, },
5913 .hw_value
= CONF_HW_BIT_RATE_54MBPS
,
5914 .hw_value_short
= CONF_HW_BIT_RATE_54MBPS
, },
5917 /* can't be const, mac80211 writes to this */
5918 static struct ieee80211_channel wl1271_channels
[] = {
5919 { .hw_value
= 1, .center_freq
= 2412, .max_power
= WLCORE_MAX_TXPWR
},
5920 { .hw_value
= 2, .center_freq
= 2417, .max_power
= WLCORE_MAX_TXPWR
},
5921 { .hw_value
= 3, .center_freq
= 2422, .max_power
= WLCORE_MAX_TXPWR
},
5922 { .hw_value
= 4, .center_freq
= 2427, .max_power
= WLCORE_MAX_TXPWR
},
5923 { .hw_value
= 5, .center_freq
= 2432, .max_power
= WLCORE_MAX_TXPWR
},
5924 { .hw_value
= 6, .center_freq
= 2437, .max_power
= WLCORE_MAX_TXPWR
},
5925 { .hw_value
= 7, .center_freq
= 2442, .max_power
= WLCORE_MAX_TXPWR
},
5926 { .hw_value
= 8, .center_freq
= 2447, .max_power
= WLCORE_MAX_TXPWR
},
5927 { .hw_value
= 9, .center_freq
= 2452, .max_power
= WLCORE_MAX_TXPWR
},
5928 { .hw_value
= 10, .center_freq
= 2457, .max_power
= WLCORE_MAX_TXPWR
},
5929 { .hw_value
= 11, .center_freq
= 2462, .max_power
= WLCORE_MAX_TXPWR
},
5930 { .hw_value
= 12, .center_freq
= 2467, .max_power
= WLCORE_MAX_TXPWR
},
5931 { .hw_value
= 13, .center_freq
= 2472, .max_power
= WLCORE_MAX_TXPWR
},
5932 { .hw_value
= 14, .center_freq
= 2484, .max_power
= WLCORE_MAX_TXPWR
},
5935 /* can't be const, mac80211 writes to this */
5936 static struct ieee80211_supported_band wl1271_band_2ghz
= {
5937 .channels
= wl1271_channels
,
5938 .n_channels
= ARRAY_SIZE(wl1271_channels
),
5939 .bitrates
= wl1271_rates
,
5940 .n_bitrates
= ARRAY_SIZE(wl1271_rates
),
5943 /* 5 GHz data rates for WL1273 */
5944 static struct ieee80211_rate wl1271_rates_5ghz
[] = {
5946 .hw_value
= CONF_HW_BIT_RATE_6MBPS
,
5947 .hw_value_short
= CONF_HW_BIT_RATE_6MBPS
, },
5949 .hw_value
= CONF_HW_BIT_RATE_9MBPS
,
5950 .hw_value_short
= CONF_HW_BIT_RATE_9MBPS
, },
5952 .hw_value
= CONF_HW_BIT_RATE_12MBPS
,
5953 .hw_value_short
= CONF_HW_BIT_RATE_12MBPS
, },
5955 .hw_value
= CONF_HW_BIT_RATE_18MBPS
,
5956 .hw_value_short
= CONF_HW_BIT_RATE_18MBPS
, },
5958 .hw_value
= CONF_HW_BIT_RATE_24MBPS
,
5959 .hw_value_short
= CONF_HW_BIT_RATE_24MBPS
, },
5961 .hw_value
= CONF_HW_BIT_RATE_36MBPS
,
5962 .hw_value_short
= CONF_HW_BIT_RATE_36MBPS
, },
5964 .hw_value
= CONF_HW_BIT_RATE_48MBPS
,
5965 .hw_value_short
= CONF_HW_BIT_RATE_48MBPS
, },
5967 .hw_value
= CONF_HW_BIT_RATE_54MBPS
,
5968 .hw_value_short
= CONF_HW_BIT_RATE_54MBPS
, },
5971 /* 5 GHz band channels for WL1273 */
5972 static struct ieee80211_channel wl1271_channels_5ghz
[] = {
5973 { .hw_value
= 8, .center_freq
= 5040, .max_power
= WLCORE_MAX_TXPWR
},
5974 { .hw_value
= 12, .center_freq
= 5060, .max_power
= WLCORE_MAX_TXPWR
},
5975 { .hw_value
= 16, .center_freq
= 5080, .max_power
= WLCORE_MAX_TXPWR
},
5976 { .hw_value
= 34, .center_freq
= 5170, .max_power
= WLCORE_MAX_TXPWR
},
5977 { .hw_value
= 36, .center_freq
= 5180, .max_power
= WLCORE_MAX_TXPWR
},
5978 { .hw_value
= 38, .center_freq
= 5190, .max_power
= WLCORE_MAX_TXPWR
},
5979 { .hw_value
= 40, .center_freq
= 5200, .max_power
= WLCORE_MAX_TXPWR
},
5980 { .hw_value
= 42, .center_freq
= 5210, .max_power
= WLCORE_MAX_TXPWR
},
5981 { .hw_value
= 44, .center_freq
= 5220, .max_power
= WLCORE_MAX_TXPWR
},
5982 { .hw_value
= 46, .center_freq
= 5230, .max_power
= WLCORE_MAX_TXPWR
},
5983 { .hw_value
= 48, .center_freq
= 5240, .max_power
= WLCORE_MAX_TXPWR
},
5984 { .hw_value
= 52, .center_freq
= 5260, .max_power
= WLCORE_MAX_TXPWR
},
5985 { .hw_value
= 56, .center_freq
= 5280, .max_power
= WLCORE_MAX_TXPWR
},
5986 { .hw_value
= 60, .center_freq
= 5300, .max_power
= WLCORE_MAX_TXPWR
},
5987 { .hw_value
= 64, .center_freq
= 5320, .max_power
= WLCORE_MAX_TXPWR
},
5988 { .hw_value
= 100, .center_freq
= 5500, .max_power
= WLCORE_MAX_TXPWR
},
5989 { .hw_value
= 104, .center_freq
= 5520, .max_power
= WLCORE_MAX_TXPWR
},
5990 { .hw_value
= 108, .center_freq
= 5540, .max_power
= WLCORE_MAX_TXPWR
},
5991 { .hw_value
= 112, .center_freq
= 5560, .max_power
= WLCORE_MAX_TXPWR
},
5992 { .hw_value
= 116, .center_freq
= 5580, .max_power
= WLCORE_MAX_TXPWR
},
5993 { .hw_value
= 120, .center_freq
= 5600, .max_power
= WLCORE_MAX_TXPWR
},
5994 { .hw_value
= 124, .center_freq
= 5620, .max_power
= WLCORE_MAX_TXPWR
},
5995 { .hw_value
= 128, .center_freq
= 5640, .max_power
= WLCORE_MAX_TXPWR
},
5996 { .hw_value
= 132, .center_freq
= 5660, .max_power
= WLCORE_MAX_TXPWR
},
5997 { .hw_value
= 136, .center_freq
= 5680, .max_power
= WLCORE_MAX_TXPWR
},
5998 { .hw_value
= 140, .center_freq
= 5700, .max_power
= WLCORE_MAX_TXPWR
},
5999 { .hw_value
= 149, .center_freq
= 5745, .max_power
= WLCORE_MAX_TXPWR
},
6000 { .hw_value
= 153, .center_freq
= 5765, .max_power
= WLCORE_MAX_TXPWR
},
6001 { .hw_value
= 157, .center_freq
= 5785, .max_power
= WLCORE_MAX_TXPWR
},
6002 { .hw_value
= 161, .center_freq
= 5805, .max_power
= WLCORE_MAX_TXPWR
},
6003 { .hw_value
= 165, .center_freq
= 5825, .max_power
= WLCORE_MAX_TXPWR
},
6006 static struct ieee80211_supported_band wl1271_band_5ghz
= {
6007 .channels
= wl1271_channels_5ghz
,
6008 .n_channels
= ARRAY_SIZE(wl1271_channels_5ghz
),
6009 .bitrates
= wl1271_rates_5ghz
,
6010 .n_bitrates
= ARRAY_SIZE(wl1271_rates_5ghz
),
6013 static const struct ieee80211_ops wl1271_ops
= {
6014 .start
= wl1271_op_start
,
6015 .stop
= wlcore_op_stop
,
6016 .add_interface
= wl1271_op_add_interface
,
6017 .remove_interface
= wl1271_op_remove_interface
,
6018 .change_interface
= wl12xx_op_change_interface
,
6020 .suspend
= wl1271_op_suspend
,
6021 .resume
= wl1271_op_resume
,
6023 .config
= wl1271_op_config
,
6024 .prepare_multicast
= wl1271_op_prepare_multicast
,
6025 .configure_filter
= wl1271_op_configure_filter
,
6027 .set_key
= wlcore_op_set_key
,
6028 .hw_scan
= wl1271_op_hw_scan
,
6029 .cancel_hw_scan
= wl1271_op_cancel_hw_scan
,
6030 .sched_scan_start
= wl1271_op_sched_scan_start
,
6031 .sched_scan_stop
= wl1271_op_sched_scan_stop
,
6032 .bss_info_changed
= wl1271_op_bss_info_changed
,
6033 .set_frag_threshold
= wl1271_op_set_frag_threshold
,
6034 .set_rts_threshold
= wl1271_op_set_rts_threshold
,
6035 .conf_tx
= wl1271_op_conf_tx
,
6036 .get_tsf
= wl1271_op_get_tsf
,
6037 .get_survey
= wl1271_op_get_survey
,
6038 .sta_state
= wl12xx_op_sta_state
,
6039 .ampdu_action
= wl1271_op_ampdu_action
,
6040 .tx_frames_pending
= wl1271_tx_frames_pending
,
6041 .set_bitrate_mask
= wl12xx_set_bitrate_mask
,
6042 .set_default_unicast_key
= wl1271_op_set_default_key_idx
,
6043 .channel_switch
= wl12xx_op_channel_switch
,
6044 .channel_switch_beacon
= wlcore_op_channel_switch_beacon
,
6045 .flush
= wlcore_op_flush
,
6046 .remain_on_channel
= wlcore_op_remain_on_channel
,
6047 .cancel_remain_on_channel
= wlcore_op_cancel_remain_on_channel
,
6048 .add_chanctx
= wlcore_op_add_chanctx
,
6049 .remove_chanctx
= wlcore_op_remove_chanctx
,
6050 .change_chanctx
= wlcore_op_change_chanctx
,
6051 .assign_vif_chanctx
= wlcore_op_assign_vif_chanctx
,
6052 .unassign_vif_chanctx
= wlcore_op_unassign_vif_chanctx
,
6053 .switch_vif_chanctx
= wlcore_op_switch_vif_chanctx
,
6054 .sta_rc_update
= wlcore_op_sta_rc_update
,
6055 .sta_statistics
= wlcore_op_sta_statistics
,
6056 .get_expected_throughput
= wlcore_op_get_expected_throughput
,
6057 CFG80211_TESTMODE_CMD(wl1271_tm_cmd
)
6061 u8
wlcore_rate_to_idx(struct wl1271
*wl
, u8 rate
, enum nl80211_band band
)
6067 if (unlikely(rate
>= wl
->hw_tx_rate_tbl_size
)) {
6068 wl1271_error("Illegal RX rate from HW: %d", rate
);
6072 idx
= wl
->band_rate_to_idx
[band
][rate
];
6073 if (unlikely(idx
== CONF_HW_RXTX_RATE_UNSUPPORTED
)) {
6074 wl1271_error("Unsupported RX rate from HW: %d", rate
);
6081 static void wl12xx_derive_mac_addresses(struct wl1271
*wl
, u32 oui
, u32 nic
)
6085 wl1271_debug(DEBUG_PROBE
, "base address: oui %06x nic %06x",
6088 if (nic
+ WLCORE_NUM_MAC_ADDRESSES
- wl
->num_mac_addr
> 0xffffff)
6089 wl1271_warning("NIC part of the MAC address wraps around!");
6091 for (i
= 0; i
< wl
->num_mac_addr
; i
++) {
6092 wl
->addresses
[i
].addr
[0] = (u8
)(oui
>> 16);
6093 wl
->addresses
[i
].addr
[1] = (u8
)(oui
>> 8);
6094 wl
->addresses
[i
].addr
[2] = (u8
) oui
;
6095 wl
->addresses
[i
].addr
[3] = (u8
)(nic
>> 16);
6096 wl
->addresses
[i
].addr
[4] = (u8
)(nic
>> 8);
6097 wl
->addresses
[i
].addr
[5] = (u8
) nic
;
6101 /* we may be one address short at the most */
6102 WARN_ON(wl
->num_mac_addr
+ 1 < WLCORE_NUM_MAC_ADDRESSES
);
6105 * turn on the LAA bit in the first address and use it as
6108 if (wl
->num_mac_addr
< WLCORE_NUM_MAC_ADDRESSES
) {
6109 int idx
= WLCORE_NUM_MAC_ADDRESSES
- 1;
6110 memcpy(&wl
->addresses
[idx
], &wl
->addresses
[0],
6111 sizeof(wl
->addresses
[0]));
6113 wl
->addresses
[idx
].addr
[0] |= BIT(1);
6116 wl
->hw
->wiphy
->n_addresses
= WLCORE_NUM_MAC_ADDRESSES
;
6117 wl
->hw
->wiphy
->addresses
= wl
->addresses
;
6120 static int wl12xx_get_hw_info(struct wl1271
*wl
)
6124 ret
= wlcore_read_reg(wl
, REG_CHIP_ID_B
, &wl
->chip
.id
);
6128 wl
->fuse_oui_addr
= 0;
6129 wl
->fuse_nic_addr
= 0;
6131 ret
= wl
->ops
->get_pg_ver(wl
, &wl
->hw_pg_ver
);
6135 if (wl
->ops
->get_mac
)
6136 ret
= wl
->ops
->get_mac(wl
);
6142 static int wl1271_register_hw(struct wl1271
*wl
)
6145 u32 oui_addr
= 0, nic_addr
= 0;
6146 struct platform_device
*pdev
= wl
->pdev
;
6147 struct wlcore_platdev_data
*pdev_data
= dev_get_platdata(&pdev
->dev
);
6149 if (wl
->mac80211_registered
)
6152 if (wl
->nvs_len
>= 12) {
6153 /* NOTE: The wl->nvs->nvs element must be first, in
6154 * order to simplify the casting, we assume it is at
6155 * the beginning of the wl->nvs structure.
6157 u8
*nvs_ptr
= (u8
*)wl
->nvs
;
6160 (nvs_ptr
[11] << 16) + (nvs_ptr
[10] << 8) + nvs_ptr
[6];
6162 (nvs_ptr
[5] << 16) + (nvs_ptr
[4] << 8) + nvs_ptr
[3];
6165 /* if the MAC address is zeroed in the NVS derive from fuse */
6166 if (oui_addr
== 0 && nic_addr
== 0) {
6167 oui_addr
= wl
->fuse_oui_addr
;
6168 /* fuse has the BD_ADDR, the WLAN addresses are the next two */
6169 nic_addr
= wl
->fuse_nic_addr
+ 1;
6172 if (oui_addr
== 0xdeadbe && nic_addr
== 0xef0000) {
6173 wl1271_warning("Detected unconfigured mac address in nvs, derive from fuse instead.");
6174 if (!strcmp(pdev_data
->family
->name
, "wl18xx")) {
6175 wl1271_warning("This default nvs file can be removed from the file system");
6177 wl1271_warning("Your device performance is not optimized.");
6178 wl1271_warning("Please use the calibrator tool to configure your device.");
6181 if (wl
->fuse_oui_addr
== 0 && wl
->fuse_nic_addr
== 0) {
6182 wl1271_warning("Fuse mac address is zero. using random mac");
6183 /* Use TI oui and a random nic */
6184 oui_addr
= WLCORE_TI_OUI_ADDRESS
;
6185 nic_addr
= get_random_int();
6187 oui_addr
= wl
->fuse_oui_addr
;
6188 /* fuse has the BD_ADDR, the WLAN addresses are the next two */
6189 nic_addr
= wl
->fuse_nic_addr
+ 1;
6193 wl12xx_derive_mac_addresses(wl
, oui_addr
, nic_addr
);
6195 ret
= ieee80211_register_hw(wl
->hw
);
6197 wl1271_error("unable to register mac80211 hw: %d", ret
);
6201 wl
->mac80211_registered
= true;
6203 wl1271_debugfs_init(wl
);
6205 wl1271_notice("loaded");
6211 static void wl1271_unregister_hw(struct wl1271
*wl
)
6214 wl1271_plt_stop(wl
);
6216 ieee80211_unregister_hw(wl
->hw
);
6217 wl
->mac80211_registered
= false;
6221 static int wl1271_init_ieee80211(struct wl1271
*wl
)
6224 static const u32 cipher_suites
[] = {
6225 WLAN_CIPHER_SUITE_WEP40
,
6226 WLAN_CIPHER_SUITE_WEP104
,
6227 WLAN_CIPHER_SUITE_TKIP
,
6228 WLAN_CIPHER_SUITE_CCMP
,
6229 WL1271_CIPHER_SUITE_GEM
,
6232 /* The tx descriptor buffer */
6233 wl
->hw
->extra_tx_headroom
= sizeof(struct wl1271_tx_hw_descr
);
6235 if (wl
->quirks
& WLCORE_QUIRK_TKIP_HEADER_SPACE
)
6236 wl
->hw
->extra_tx_headroom
+= WL1271_EXTRA_SPACE_TKIP
;
6239 /* FIXME: find a proper value */
6240 wl
->hw
->max_listen_interval
= wl
->conf
.conn
.max_listen_interval
;
6242 ieee80211_hw_set(wl
->hw
, SUPPORT_FAST_XMIT
);
6243 ieee80211_hw_set(wl
->hw
, CHANCTX_STA_CSA
);
6244 ieee80211_hw_set(wl
->hw
, SUPPORTS_PER_STA_GTK
);
6245 ieee80211_hw_set(wl
->hw
, QUEUE_CONTROL
);
6246 ieee80211_hw_set(wl
->hw
, TX_AMPDU_SETUP_IN_HW
);
6247 ieee80211_hw_set(wl
->hw
, AMPDU_AGGREGATION
);
6248 ieee80211_hw_set(wl
->hw
, AP_LINK_PS
);
6249 ieee80211_hw_set(wl
->hw
, SPECTRUM_MGMT
);
6250 ieee80211_hw_set(wl
->hw
, REPORTS_TX_ACK_STATUS
);
6251 ieee80211_hw_set(wl
->hw
, CONNECTION_MONITOR
);
6252 ieee80211_hw_set(wl
->hw
, HAS_RATE_CONTROL
);
6253 ieee80211_hw_set(wl
->hw
, SUPPORTS_DYNAMIC_PS
);
6254 ieee80211_hw_set(wl
->hw
, SIGNAL_DBM
);
6255 ieee80211_hw_set(wl
->hw
, SUPPORTS_PS
);
6256 ieee80211_hw_set(wl
->hw
, SUPPORTS_TX_FRAG
);
6258 wl
->hw
->wiphy
->cipher_suites
= cipher_suites
;
6259 wl
->hw
->wiphy
->n_cipher_suites
= ARRAY_SIZE(cipher_suites
);
6261 wl
->hw
->wiphy
->interface_modes
= BIT(NL80211_IFTYPE_STATION
) |
6262 BIT(NL80211_IFTYPE_AP
) |
6263 BIT(NL80211_IFTYPE_P2P_DEVICE
) |
6264 BIT(NL80211_IFTYPE_P2P_CLIENT
) |
6265 #ifdef CONFIG_MAC80211_MESH
6266 BIT(NL80211_IFTYPE_MESH_POINT
) |
6268 BIT(NL80211_IFTYPE_P2P_GO
);
6270 wl
->hw
->wiphy
->max_scan_ssids
= 1;
6271 wl
->hw
->wiphy
->max_sched_scan_ssids
= 16;
6272 wl
->hw
->wiphy
->max_match_sets
= 16;
6274 * Maximum length of elements in scanning probe request templates
6275 * should be the maximum length possible for a template, without
6276 * the IEEE80211 header of the template
6278 wl
->hw
->wiphy
->max_scan_ie_len
= WL1271_CMD_TEMPL_MAX_SIZE
-
6279 sizeof(struct ieee80211_header
);
6281 wl
->hw
->wiphy
->max_sched_scan_reqs
= 1;
6282 wl
->hw
->wiphy
->max_sched_scan_ie_len
= WL1271_CMD_TEMPL_MAX_SIZE
-
6283 sizeof(struct ieee80211_header
);
6285 wl
->hw
->wiphy
->max_remain_on_channel_duration
= 30000;
6287 wl
->hw
->wiphy
->flags
|= WIPHY_FLAG_AP_UAPSD
|
6288 WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL
|
6289 WIPHY_FLAG_HAS_CHANNEL_SWITCH
|
6290 WIPHY_FLAG_IBSS_RSN
;
6292 wl
->hw
->wiphy
->features
|= NL80211_FEATURE_AP_SCAN
;
6294 /* make sure all our channels fit in the scanned_ch bitmask */
6295 BUILD_BUG_ON(ARRAY_SIZE(wl1271_channels
) +
6296 ARRAY_SIZE(wl1271_channels_5ghz
) >
6297 WL1271_MAX_CHANNELS
);
6299 * clear channel flags from the previous usage
6300 * and restore max_power & max_antenna_gain values.
6302 for (i
= 0; i
< ARRAY_SIZE(wl1271_channels
); i
++) {
6303 wl1271_band_2ghz
.channels
[i
].flags
= 0;
6304 wl1271_band_2ghz
.channels
[i
].max_power
= WLCORE_MAX_TXPWR
;
6305 wl1271_band_2ghz
.channels
[i
].max_antenna_gain
= 0;
6308 for (i
= 0; i
< ARRAY_SIZE(wl1271_channels_5ghz
); i
++) {
6309 wl1271_band_5ghz
.channels
[i
].flags
= 0;
6310 wl1271_band_5ghz
.channels
[i
].max_power
= WLCORE_MAX_TXPWR
;
6311 wl1271_band_5ghz
.channels
[i
].max_antenna_gain
= 0;
6315 * We keep local copies of the band structs because we need to
6316 * modify them on a per-device basis.
6318 memcpy(&wl
->bands
[NL80211_BAND_2GHZ
], &wl1271_band_2ghz
,
6319 sizeof(wl1271_band_2ghz
));
6320 memcpy(&wl
->bands
[NL80211_BAND_2GHZ
].ht_cap
,
6321 &wl
->ht_cap
[NL80211_BAND_2GHZ
],
6322 sizeof(*wl
->ht_cap
));
6323 memcpy(&wl
->bands
[NL80211_BAND_5GHZ
], &wl1271_band_5ghz
,
6324 sizeof(wl1271_band_5ghz
));
6325 memcpy(&wl
->bands
[NL80211_BAND_5GHZ
].ht_cap
,
6326 &wl
->ht_cap
[NL80211_BAND_5GHZ
],
6327 sizeof(*wl
->ht_cap
));
6329 wl
->hw
->wiphy
->bands
[NL80211_BAND_2GHZ
] =
6330 &wl
->bands
[NL80211_BAND_2GHZ
];
6331 wl
->hw
->wiphy
->bands
[NL80211_BAND_5GHZ
] =
6332 &wl
->bands
[NL80211_BAND_5GHZ
];
6335 * allow 4 queues per mac address we support +
6336 * 1 cab queue per mac + one global offchannel Tx queue
6338 wl
->hw
->queues
= (NUM_TX_QUEUES
+ 1) * WLCORE_NUM_MAC_ADDRESSES
+ 1;
6340 /* the last queue is the offchannel queue */
6341 wl
->hw
->offchannel_tx_hw_queue
= wl
->hw
->queues
- 1;
6342 wl
->hw
->max_rates
= 1;
6344 wl
->hw
->wiphy
->reg_notifier
= wl1271_reg_notify
;
6346 /* the FW answers probe-requests in AP-mode */
6347 wl
->hw
->wiphy
->flags
|= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD
;
6348 wl
->hw
->wiphy
->probe_resp_offload
=
6349 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS
|
6350 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS2
|
6351 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_P2P
;
6353 /* allowed interface combinations */
6354 wl
->hw
->wiphy
->iface_combinations
= wl
->iface_combinations
;
6355 wl
->hw
->wiphy
->n_iface_combinations
= wl
->n_iface_combinations
;
6357 /* register vendor commands */
6358 wlcore_set_vendor_commands(wl
->hw
->wiphy
);
6360 SET_IEEE80211_DEV(wl
->hw
, wl
->dev
);
6362 wl
->hw
->sta_data_size
= sizeof(struct wl1271_station
);
6363 wl
->hw
->vif_data_size
= sizeof(struct wl12xx_vif
);
6365 wl
->hw
->max_rx_aggregation_subframes
= wl
->conf
.ht
.rx_ba_win_size
;
6370 struct ieee80211_hw
*wlcore_alloc_hw(size_t priv_size
, u32 aggr_buf_size
,
6373 struct ieee80211_hw
*hw
;
6378 hw
= ieee80211_alloc_hw(sizeof(*wl
), &wl1271_ops
);
6380 wl1271_error("could not alloc ieee80211_hw");
6386 memset(wl
, 0, sizeof(*wl
));
6388 wl
->priv
= kzalloc(priv_size
, GFP_KERNEL
);
6390 wl1271_error("could not alloc wl priv");
6392 goto err_priv_alloc
;
6395 INIT_LIST_HEAD(&wl
->wlvif_list
);
6400 * wl->num_links is not configured yet, so just use WLCORE_MAX_LINKS.
6401 * we don't allocate any additional resource here, so that's fine.
6403 for (i
= 0; i
< NUM_TX_QUEUES
; i
++)
6404 for (j
= 0; j
< WLCORE_MAX_LINKS
; j
++)
6405 skb_queue_head_init(&wl
->links
[j
].tx_queue
[i
]);
6407 skb_queue_head_init(&wl
->deferred_rx_queue
);
6408 skb_queue_head_init(&wl
->deferred_tx_queue
);
6410 INIT_WORK(&wl
->netstack_work
, wl1271_netstack_work
);
6411 INIT_WORK(&wl
->tx_work
, wl1271_tx_work
);
6412 INIT_WORK(&wl
->recovery_work
, wl1271_recovery_work
);
6413 INIT_DELAYED_WORK(&wl
->scan_complete_work
, wl1271_scan_complete_work
);
6414 INIT_DELAYED_WORK(&wl
->roc_complete_work
, wlcore_roc_complete_work
);
6415 INIT_DELAYED_WORK(&wl
->tx_watchdog_work
, wl12xx_tx_watchdog_work
);
6417 wl
->freezable_wq
= create_freezable_workqueue("wl12xx_wq");
6418 if (!wl
->freezable_wq
) {
6425 wl
->power_level
= WL1271_DEFAULT_POWER_LEVEL
;
6426 wl
->band
= NL80211_BAND_2GHZ
;
6427 wl
->channel_type
= NL80211_CHAN_NO_HT
;
6429 wl
->sg_enabled
= true;
6430 wl
->sleep_auth
= WL1271_PSM_ILLEGAL
;
6431 wl
->recovery_count
= 0;
6434 wl
->ap_fw_ps_map
= 0;
6436 wl
->system_hlid
= WL12XX_SYSTEM_HLID
;
6437 wl
->active_sta_count
= 0;
6438 wl
->active_link_count
= 0;
6441 /* The system link is always allocated */
6442 __set_bit(WL12XX_SYSTEM_HLID
, wl
->links_map
);
6444 memset(wl
->tx_frames_map
, 0, sizeof(wl
->tx_frames_map
));
6445 for (i
= 0; i
< wl
->num_tx_desc
; i
++)
6446 wl
->tx_frames
[i
] = NULL
;
6448 spin_lock_init(&wl
->wl_lock
);
6450 wl
->state
= WLCORE_STATE_OFF
;
6451 wl
->fw_type
= WL12XX_FW_TYPE_NONE
;
6452 mutex_init(&wl
->mutex
);
6453 mutex_init(&wl
->flush_mutex
);
6454 init_completion(&wl
->nvs_loading_complete
);
6456 order
= get_order(aggr_buf_size
);
6457 wl
->aggr_buf
= (u8
*)__get_free_pages(GFP_KERNEL
, order
);
6458 if (!wl
->aggr_buf
) {
6462 wl
->aggr_buf_size
= aggr_buf_size
;
6464 wl
->dummy_packet
= wl12xx_alloc_dummy_packet(wl
);
6465 if (!wl
->dummy_packet
) {
6470 /* Allocate one page for the FW log */
6471 wl
->fwlog
= (u8
*)get_zeroed_page(GFP_KERNEL
);
6474 goto err_dummy_packet
;
6477 wl
->mbox_size
= mbox_size
;
6478 wl
->mbox
= kmalloc(wl
->mbox_size
, GFP_KERNEL
| GFP_DMA
);
6484 wl
->buffer_32
= kmalloc(sizeof(*wl
->buffer_32
), GFP_KERNEL
);
6485 if (!wl
->buffer_32
) {
6496 free_page((unsigned long)wl
->fwlog
);
6499 dev_kfree_skb(wl
->dummy_packet
);
6502 free_pages((unsigned long)wl
->aggr_buf
, order
);
6505 destroy_workqueue(wl
->freezable_wq
);
6508 wl1271_debugfs_exit(wl
);
6512 ieee80211_free_hw(hw
);
6516 return ERR_PTR(ret
);
6518 EXPORT_SYMBOL_GPL(wlcore_alloc_hw
);
6520 int wlcore_free_hw(struct wl1271
*wl
)
6522 /* Unblock any fwlog readers */
6523 mutex_lock(&wl
->mutex
);
6524 wl
->fwlog_size
= -1;
6525 mutex_unlock(&wl
->mutex
);
6527 wlcore_sysfs_free(wl
);
6529 kfree(wl
->buffer_32
);
6531 free_page((unsigned long)wl
->fwlog
);
6532 dev_kfree_skb(wl
->dummy_packet
);
6533 free_pages((unsigned long)wl
->aggr_buf
, get_order(wl
->aggr_buf_size
));
6535 wl1271_debugfs_exit(wl
);
6539 wl
->fw_type
= WL12XX_FW_TYPE_NONE
;
6543 kfree(wl
->raw_fw_status
);
6544 kfree(wl
->fw_status
);
6545 kfree(wl
->tx_res_if
);
6546 destroy_workqueue(wl
->freezable_wq
);
6549 ieee80211_free_hw(wl
->hw
);
6553 EXPORT_SYMBOL_GPL(wlcore_free_hw
);
6556 static const struct wiphy_wowlan_support wlcore_wowlan_support
= {
6557 .flags
= WIPHY_WOWLAN_ANY
,
6558 .n_patterns
= WL1271_MAX_RX_FILTERS
,
6559 .pattern_min_len
= 1,
6560 .pattern_max_len
= WL1271_RX_FILTER_MAX_PATTERN_SIZE
,
6564 static irqreturn_t
wlcore_hardirq(int irq
, void *cookie
)
6566 return IRQ_WAKE_THREAD
;
6569 static void wlcore_nvs_cb(const struct firmware
*fw
, void *context
)
6571 struct wl1271
*wl
= context
;
6572 struct platform_device
*pdev
= wl
->pdev
;
6573 struct wlcore_platdev_data
*pdev_data
= dev_get_platdata(&pdev
->dev
);
6574 struct resource
*res
;
6577 irq_handler_t hardirq_fn
= NULL
;
6580 wl
->nvs
= kmemdup(fw
->data
, fw
->size
, GFP_KERNEL
);
6582 wl1271_error("Could not allocate nvs data");
6585 wl
->nvs_len
= fw
->size
;
6586 } else if (pdev_data
->family
->nvs_name
) {
6587 wl1271_debug(DEBUG_BOOT
, "Could not get nvs file %s",
6588 pdev_data
->family
->nvs_name
);
6596 ret
= wl
->ops
->setup(wl
);
6600 BUG_ON(wl
->num_tx_desc
> WLCORE_MAX_TX_DESCRIPTORS
);
6602 /* adjust some runtime configuration parameters */
6603 wlcore_adjust_conf(wl
);
6605 res
= platform_get_resource(pdev
, IORESOURCE_IRQ
, 0);
6607 wl1271_error("Could not get IRQ resource");
6611 wl
->irq
= res
->start
;
6612 wl
->irq_flags
= res
->flags
& IRQF_TRIGGER_MASK
;
6613 wl
->if_ops
= pdev_data
->if_ops
;
6615 if (wl
->irq_flags
& (IRQF_TRIGGER_RISING
| IRQF_TRIGGER_FALLING
))
6616 hardirq_fn
= wlcore_hardirq
;
6618 wl
->irq_flags
|= IRQF_ONESHOT
;
6620 ret
= wl12xx_set_power_on(wl
);
6624 ret
= wl12xx_get_hw_info(wl
);
6626 wl1271_error("couldn't get hw info");
6627 wl1271_power_off(wl
);
6631 ret
= request_threaded_irq(wl
->irq
, hardirq_fn
, wlcore_irq
,
6632 wl
->irq_flags
, pdev
->name
, wl
);
6634 wl1271_error("interrupt configuration failed");
6635 wl1271_power_off(wl
);
6640 device_init_wakeup(wl
->dev
, true);
6642 ret
= enable_irq_wake(wl
->irq
);
6644 wl
->irq_wake_enabled
= true;
6645 if (pdev_data
->pwr_in_suspend
)
6646 wl
->hw
->wiphy
->wowlan
= &wlcore_wowlan_support
;
6649 res
= platform_get_resource(pdev
, IORESOURCE_IRQ
, 1);
6651 wl
->wakeirq
= res
->start
;
6652 wl
->wakeirq_flags
= res
->flags
& IRQF_TRIGGER_MASK
;
6653 ret
= dev_pm_set_dedicated_wake_irq(wl
->dev
, wl
->wakeirq
);
6655 wl
->wakeirq
= -ENODEV
;
6657 wl
->wakeirq
= -ENODEV
;
6660 disable_irq(wl
->irq
);
6661 wl1271_power_off(wl
);
6663 ret
= wl
->ops
->identify_chip(wl
);
6667 ret
= wl1271_init_ieee80211(wl
);
6671 ret
= wl1271_register_hw(wl
);
6675 ret
= wlcore_sysfs_init(wl
);
6679 wl
->initialized
= true;
6683 wl1271_unregister_hw(wl
);
6686 if (wl
->wakeirq
>= 0)
6687 dev_pm_clear_wake_irq(wl
->dev
);
6688 device_init_wakeup(wl
->dev
, false);
6689 free_irq(wl
->irq
, wl
);
6695 release_firmware(fw
);
6696 complete_all(&wl
->nvs_loading_complete
);
6699 static int __maybe_unused
wlcore_runtime_suspend(struct device
*dev
)
6701 struct wl1271
*wl
= dev_get_drvdata(dev
);
6702 struct wl12xx_vif
*wlvif
;
6705 /* We do not enter elp sleep in PLT mode */
6709 /* Nothing to do if no ELP mode requested */
6710 if (wl
->sleep_auth
!= WL1271_PSM_ELP
)
6713 wl12xx_for_each_wlvif(wl
, wlvif
) {
6714 if (!test_bit(WLVIF_FLAG_IN_PS
, &wlvif
->flags
) &&
6715 test_bit(WLVIF_FLAG_IN_USE
, &wlvif
->flags
))
6719 wl1271_debug(DEBUG_PSM
, "chip to elp");
6720 error
= wlcore_raw_write32(wl
, HW_ACCESS_ELP_CTRL_REG
, ELPCTRL_SLEEP
);
6722 wl12xx_queue_recovery_work(wl
);
6727 set_bit(WL1271_FLAG_IN_ELP
, &wl
->flags
);
6732 static int __maybe_unused
wlcore_runtime_resume(struct device
*dev
)
6734 struct wl1271
*wl
= dev_get_drvdata(dev
);
6735 DECLARE_COMPLETION_ONSTACK(compl);
6736 unsigned long flags
;
6738 unsigned long start_time
= jiffies
;
6739 bool recovery
= false;
6741 /* Nothing to do if no ELP mode requested */
6742 if (!test_bit(WL1271_FLAG_IN_ELP
, &wl
->flags
))
6745 wl1271_debug(DEBUG_PSM
, "waking up chip from elp");
6747 spin_lock_irqsave(&wl
->wl_lock
, flags
);
6748 wl
->elp_compl
= &compl;
6749 spin_unlock_irqrestore(&wl
->wl_lock
, flags
);
6751 ret
= wlcore_raw_write32(wl
, HW_ACCESS_ELP_CTRL_REG
, ELPCTRL_WAKE_UP
);
6754 } else if (!test_bit(WL1271_FLAG_IRQ_RUNNING
, &wl
->flags
)) {
6755 ret
= wait_for_completion_timeout(&compl,
6756 msecs_to_jiffies(WL1271_WAKEUP_TIMEOUT
));
6758 wl1271_warning("ELP wakeup timeout!");
6763 spin_lock_irqsave(&wl
->wl_lock
, flags
);
6764 wl
->elp_compl
= NULL
;
6765 spin_unlock_irqrestore(&wl
->wl_lock
, flags
);
6766 clear_bit(WL1271_FLAG_IN_ELP
, &wl
->flags
);
6769 set_bit(WL1271_FLAG_INTENDED_FW_RECOVERY
, &wl
->flags
);
6770 wl12xx_queue_recovery_work(wl
);
6772 wl1271_debug(DEBUG_PSM
, "wakeup time: %u ms",
6773 jiffies_to_msecs(jiffies
- start_time
));
6779 static const struct dev_pm_ops wlcore_pm_ops
= {
6780 SET_RUNTIME_PM_OPS(wlcore_runtime_suspend
,
6781 wlcore_runtime_resume
,
6785 int wlcore_probe(struct wl1271
*wl
, struct platform_device
*pdev
)
6787 struct wlcore_platdev_data
*pdev_data
= dev_get_platdata(&pdev
->dev
);
6788 const char *nvs_name
;
6791 if (!wl
->ops
|| !wl
->ptable
|| !pdev_data
)
6794 wl
->dev
= &pdev
->dev
;
6796 platform_set_drvdata(pdev
, wl
);
6798 if (pdev_data
->family
&& pdev_data
->family
->nvs_name
) {
6799 nvs_name
= pdev_data
->family
->nvs_name
;
6800 ret
= request_firmware_nowait(THIS_MODULE
, FW_ACTION_HOTPLUG
,
6801 nvs_name
, &pdev
->dev
, GFP_KERNEL
,
6804 wl1271_error("request_firmware_nowait failed for %s: %d",
6806 complete_all(&wl
->nvs_loading_complete
);
6809 wlcore_nvs_cb(NULL
, wl
);
6812 wl
->dev
->driver
->pm
= &wlcore_pm_ops
;
6813 pm_runtime_set_autosuspend_delay(wl
->dev
, 50);
6814 pm_runtime_use_autosuspend(wl
->dev
);
6815 pm_runtime_enable(wl
->dev
);
6819 EXPORT_SYMBOL_GPL(wlcore_probe
);
6821 int wlcore_remove(struct platform_device
*pdev
)
6823 struct wlcore_platdev_data
*pdev_data
= dev_get_platdata(&pdev
->dev
);
6824 struct wl1271
*wl
= platform_get_drvdata(pdev
);
6827 error
= pm_runtime_get_sync(wl
->dev
);
6829 dev_warn(wl
->dev
, "PM runtime failed: %i\n", error
);
6831 wl
->dev
->driver
->pm
= NULL
;
6833 if (pdev_data
->family
&& pdev_data
->family
->nvs_name
)
6834 wait_for_completion(&wl
->nvs_loading_complete
);
6835 if (!wl
->initialized
)
6838 if (wl
->wakeirq
>= 0) {
6839 dev_pm_clear_wake_irq(wl
->dev
);
6840 wl
->wakeirq
= -ENODEV
;
6843 device_init_wakeup(wl
->dev
, false);
6845 if (wl
->irq_wake_enabled
)
6846 disable_irq_wake(wl
->irq
);
6848 wl1271_unregister_hw(wl
);
6850 pm_runtime_put_sync(wl
->dev
);
6851 pm_runtime_dont_use_autosuspend(wl
->dev
);
6852 pm_runtime_disable(wl
->dev
);
6854 free_irq(wl
->irq
, wl
);
6859 EXPORT_SYMBOL_GPL(wlcore_remove
);
6861 u32 wl12xx_debug_level
= DEBUG_NONE
;
6862 EXPORT_SYMBOL_GPL(wl12xx_debug_level
);
6863 module_param_named(debug_level
, wl12xx_debug_level
, uint
, 0600);
6864 MODULE_PARM_DESC(debug_level
, "wl12xx debugging level");
6866 module_param_named(fwlog
, fwlog_param
, charp
, 0);
6867 MODULE_PARM_DESC(fwlog
,
6868 "FW logger options: continuous, dbgpins or disable");
6870 module_param(fwlog_mem_blocks
, int, 0600);
6871 MODULE_PARM_DESC(fwlog_mem_blocks
, "fwlog mem_blocks");
6873 module_param(bug_on_recovery
, int, 0600);
6874 MODULE_PARM_DESC(bug_on_recovery
, "BUG() on fw recovery");
6876 module_param(no_recovery
, int, 0600);
6877 MODULE_PARM_DESC(no_recovery
, "Prevent HW recovery. FW will remain stuck.");
6879 MODULE_LICENSE("GPL");
6880 MODULE_AUTHOR("Luciano Coelho <coelho@ti.com>");
6881 MODULE_AUTHOR("Juuso Oikarinen <juuso.oikarinen@nokia.com>");