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