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