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