Merge branch 'slub/hotplug' into slab/urgent
[pandora-kernel.git] / drivers / net / wireless / wl12xx / main.c
1 /*
2  * This file is part of wl1271
3  *
4  * Copyright (C) 2008-2010 Nokia Corporation
5  *
6  * Contact: Luciano Coelho <luciano.coelho@nokia.com>
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * version 2 as published by the Free Software Foundation.
11  *
12  * This program is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
20  * 02110-1301 USA
21  *
22  */
23
24 #include <linux/module.h>
25 #include <linux/firmware.h>
26 #include <linux/delay.h>
27 #include <linux/spi/spi.h>
28 #include <linux/crc32.h>
29 #include <linux/etherdevice.h>
30 #include <linux/vmalloc.h>
31 #include <linux/platform_device.h>
32 #include <linux/slab.h>
33
34 #include "wl12xx.h"
35 #include "wl12xx_80211.h"
36 #include "reg.h"
37 #include "io.h"
38 #include "event.h"
39 #include "tx.h"
40 #include "rx.h"
41 #include "ps.h"
42 #include "init.h"
43 #include "debugfs.h"
44 #include "cmd.h"
45 #include "boot.h"
46 #include "testmode.h"
47 #include "scan.h"
48
49 #define WL1271_BOOT_RETRIES 3
50
51 static struct conf_drv_settings default_conf = {
52         .sg = {
53                 .params = {
54                         [CONF_SG_BT_PER_THRESHOLD]                  = 7500,
55                         [CONF_SG_HV3_MAX_OVERRIDE]                  = 0,
56                         [CONF_SG_BT_NFS_SAMPLE_INTERVAL]            = 400,
57                         [CONF_SG_BT_LOAD_RATIO]                     = 50,
58                         [CONF_SG_AUTO_PS_MODE]                      = 1,
59                         [CONF_SG_AUTO_SCAN_PROBE_REQ]               = 170,
60                         [CONF_SG_ACTIVE_SCAN_DURATION_FACTOR_HV3]   = 50,
61                         [CONF_SG_ANTENNA_CONFIGURATION]             = 0,
62                         [CONF_SG_BEACON_MISS_PERCENT]               = 60,
63                         [CONF_SG_RATE_ADAPT_THRESH]                 = 12,
64                         [CONF_SG_RATE_ADAPT_SNR]                    = 0,
65                         [CONF_SG_WLAN_PS_BT_ACL_MASTER_MIN_BR]      = 10,
66                         [CONF_SG_WLAN_PS_BT_ACL_MASTER_MAX_BR]      = 30,
67                         [CONF_SG_WLAN_PS_MAX_BT_ACL_MASTER_BR]      = 8,
68                         [CONF_SG_WLAN_PS_BT_ACL_SLAVE_MIN_BR]       = 20,
69                         [CONF_SG_WLAN_PS_BT_ACL_SLAVE_MAX_BR]       = 50,
70                         /* Note: with UPSD, this should be 4 */
71                         [CONF_SG_WLAN_PS_MAX_BT_ACL_SLAVE_BR]       = 8,
72                         [CONF_SG_WLAN_PS_BT_ACL_MASTER_MIN_EDR]     = 7,
73                         [CONF_SG_WLAN_PS_BT_ACL_MASTER_MAX_EDR]     = 25,
74                         [CONF_SG_WLAN_PS_MAX_BT_ACL_MASTER_EDR]     = 20,
75                         /* Note: with UPDS, this should be 15 */
76                         [CONF_SG_WLAN_PS_BT_ACL_SLAVE_MIN_EDR]      = 8,
77                         /* Note: with UPDS, this should be 50 */
78                         [CONF_SG_WLAN_PS_BT_ACL_SLAVE_MAX_EDR]      = 40,
79                         /* Note: with UPDS, this should be 10 */
80                         [CONF_SG_WLAN_PS_MAX_BT_ACL_SLAVE_EDR]      = 20,
81                         [CONF_SG_RXT]                               = 1200,
82                         [CONF_SG_TXT]                               = 1000,
83                         [CONF_SG_ADAPTIVE_RXT_TXT]                  = 1,
84                         [CONF_SG_PS_POLL_TIMEOUT]                   = 10,
85                         [CONF_SG_UPSD_TIMEOUT]                      = 10,
86                         [CONF_SG_WLAN_ACTIVE_BT_ACL_MASTER_MIN_EDR] = 7,
87                         [CONF_SG_WLAN_ACTIVE_BT_ACL_MASTER_MAX_EDR] = 15,
88                         [CONF_SG_WLAN_ACTIVE_MAX_BT_ACL_MASTER_EDR] = 15,
89                         [CONF_SG_WLAN_ACTIVE_BT_ACL_SLAVE_MIN_EDR]  = 8,
90                         [CONF_SG_WLAN_ACTIVE_BT_ACL_SLAVE_MAX_EDR]  = 20,
91                         [CONF_SG_WLAN_ACTIVE_MAX_BT_ACL_SLAVE_EDR]  = 15,
92                         [CONF_SG_WLAN_ACTIVE_BT_ACL_MIN_BR]         = 20,
93                         [CONF_SG_WLAN_ACTIVE_BT_ACL_MAX_BR]         = 50,
94                         [CONF_SG_WLAN_ACTIVE_MAX_BT_ACL_BR]         = 10,
95                         [CONF_SG_PASSIVE_SCAN_DURATION_FACTOR_HV3]  = 200,
96                         [CONF_SG_PASSIVE_SCAN_DURATION_FACTOR_A2DP] = 800,
97                         [CONF_SG_PASSIVE_SCAN_A2DP_BT_TIME]         = 75,
98                         [CONF_SG_PASSIVE_SCAN_A2DP_WLAN_TIME]       = 15,
99                         [CONF_SG_HV3_MAX_SERVED]                    = 6,
100                         [CONF_SG_DHCP_TIME]                         = 5000,
101                         [CONF_SG_ACTIVE_SCAN_DURATION_FACTOR_A2DP]  = 100,
102                 },
103                 .state = CONF_SG_PROTECTIVE,
104         },
105         .rx = {
106                 .rx_msdu_life_time           = 512000,
107                 .packet_detection_threshold  = 0,
108                 .ps_poll_timeout             = 15,
109                 .upsd_timeout                = 15,
110                 .rts_threshold               = 2347,
111                 .rx_cca_threshold            = 0,
112                 .irq_blk_threshold           = 0xFFFF,
113                 .irq_pkt_threshold           = 0,
114                 .irq_timeout                 = 600,
115                 .queue_type                  = CONF_RX_QUEUE_TYPE_LOW_PRIORITY,
116         },
117         .tx = {
118                 .tx_energy_detection         = 0,
119                 .rc_conf                     = {
120                         .enabled_rates       = 0,
121                         .short_retry_limit   = 10,
122                         .long_retry_limit    = 10,
123                         .aflags              = 0
124                 },
125                 .ac_conf_count               = 4,
126                 .ac_conf                     = {
127                         [CONF_TX_AC_BE] = {
128                                 .ac          = CONF_TX_AC_BE,
129                                 .cw_min      = 15,
130                                 .cw_max      = 63,
131                                 .aifsn       = 3,
132                                 .tx_op_limit = 0,
133                         },
134                         [CONF_TX_AC_BK] = {
135                                 .ac          = CONF_TX_AC_BK,
136                                 .cw_min      = 15,
137                                 .cw_max      = 63,
138                                 .aifsn       = 7,
139                                 .tx_op_limit = 0,
140                         },
141                         [CONF_TX_AC_VI] = {
142                                 .ac          = CONF_TX_AC_VI,
143                                 .cw_min      = 15,
144                                 .cw_max      = 63,
145                                 .aifsn       = CONF_TX_AIFS_PIFS,
146                                 .tx_op_limit = 3008,
147                         },
148                         [CONF_TX_AC_VO] = {
149                                 .ac          = CONF_TX_AC_VO,
150                                 .cw_min      = 15,
151                                 .cw_max      = 63,
152                                 .aifsn       = CONF_TX_AIFS_PIFS,
153                                 .tx_op_limit = 1504,
154                         },
155                 },
156                 .tid_conf_count = 4,
157                 .tid_conf = {
158                         [CONF_TX_AC_BE] = {
159                                 .queue_id    = CONF_TX_AC_BE,
160                                 .channel_type = CONF_CHANNEL_TYPE_EDCF,
161                                 .tsid        = CONF_TX_AC_BE,
162                                 .ps_scheme   = CONF_PS_SCHEME_LEGACY,
163                                 .ack_policy  = CONF_ACK_POLICY_LEGACY,
164                                 .apsd_conf   = {0, 0},
165                         },
166                         [CONF_TX_AC_BK] = {
167                                 .queue_id    = CONF_TX_AC_BK,
168                                 .channel_type = CONF_CHANNEL_TYPE_EDCF,
169                                 .tsid        = CONF_TX_AC_BK,
170                                 .ps_scheme   = CONF_PS_SCHEME_LEGACY,
171                                 .ack_policy  = CONF_ACK_POLICY_LEGACY,
172                                 .apsd_conf   = {0, 0},
173                         },
174                         [CONF_TX_AC_VI] = {
175                                 .queue_id    = CONF_TX_AC_VI,
176                                 .channel_type = CONF_CHANNEL_TYPE_EDCF,
177                                 .tsid        = CONF_TX_AC_VI,
178                                 .ps_scheme   = CONF_PS_SCHEME_LEGACY,
179                                 .ack_policy  = CONF_ACK_POLICY_LEGACY,
180                                 .apsd_conf   = {0, 0},
181                         },
182                         [CONF_TX_AC_VO] = {
183                                 .queue_id    = CONF_TX_AC_VO,
184                                 .channel_type = CONF_CHANNEL_TYPE_EDCF,
185                                 .tsid        = CONF_TX_AC_VO,
186                                 .ps_scheme   = CONF_PS_SCHEME_LEGACY,
187                                 .ack_policy  = CONF_ACK_POLICY_LEGACY,
188                                 .apsd_conf   = {0, 0},
189                         },
190                 },
191                 .frag_threshold              = IEEE80211_MAX_FRAG_THRESHOLD,
192                 .tx_compl_timeout            = 700,
193                 .tx_compl_threshold          = 4,
194                 .basic_rate                  = CONF_HW_BIT_RATE_1MBPS,
195                 .basic_rate_5                = CONF_HW_BIT_RATE_6MBPS,
196         },
197         .conn = {
198                 .wake_up_event               = CONF_WAKE_UP_EVENT_DTIM,
199                 .listen_interval             = 1,
200                 .bcn_filt_mode               = CONF_BCN_FILT_MODE_ENABLED,
201                 .bcn_filt_ie_count           = 1,
202                 .bcn_filt_ie = {
203                         [0] = {
204                                 .ie          = WLAN_EID_CHANNEL_SWITCH,
205                                 .rule        = CONF_BCN_RULE_PASS_ON_APPEARANCE,
206                         }
207                 },
208                 .synch_fail_thold            = 10,
209                 .bss_lose_timeout            = 100,
210                 .beacon_rx_timeout           = 10000,
211                 .broadcast_timeout           = 20000,
212                 .rx_broadcast_in_ps          = 1,
213                 .ps_poll_threshold           = 10,
214                 .ps_poll_recovery_period     = 700,
215                 .bet_enable                  = CONF_BET_MODE_ENABLE,
216                 .bet_max_consecutive         = 10,
217                 .psm_entry_retries           = 5,
218                 .psm_entry_nullfunc_retries  = 3,
219                 .psm_entry_hangover_period   = 1,
220                 .keep_alive_interval         = 55000,
221                 .max_listen_interval         = 20,
222         },
223         .itrim = {
224                 .enable = false,
225                 .timeout = 50000,
226         },
227         .pm_config = {
228                 .host_clk_settling_time = 5000,
229                 .host_fast_wakeup_support = false
230         },
231         .roam_trigger = {
232                 .trigger_pacing               = 1,
233                 .avg_weight_rssi_beacon       = 20,
234                 .avg_weight_rssi_data         = 10,
235                 .avg_weight_snr_beacon        = 20,
236                 .avg_weight_snr_data          = 10
237         },
238         .scan = {
239                 .min_dwell_time_active        = 7500,
240                 .max_dwell_time_active        = 30000,
241                 .min_dwell_time_passive       = 30000,
242                 .max_dwell_time_passive       = 60000,
243                 .num_probe_reqs               = 2,
244         },
245         .rf = {
246                 .tx_per_channel_power_compensation_2 = {
247                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
248                 },
249                 .tx_per_channel_power_compensation_5 = {
250                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
251                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
252                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
253                 },
254         },
255 };
256
257 static void __wl1271_op_remove_interface(struct wl1271 *wl);
258
259
260 static void wl1271_device_release(struct device *dev)
261 {
262
263 }
264
265 static struct platform_device wl1271_device = {
266         .name           = "wl1271",
267         .id             = -1,
268
269         /* device model insists to have a release function */
270         .dev            = {
271                 .release = wl1271_device_release,
272         },
273 };
274
275 static LIST_HEAD(wl_list);
276
277 static int wl1271_dev_notify(struct notifier_block *me, unsigned long what,
278                              void *arg)
279 {
280         struct net_device *dev = arg;
281         struct wireless_dev *wdev;
282         struct wiphy *wiphy;
283         struct ieee80211_hw *hw;
284         struct wl1271 *wl;
285         struct wl1271 *wl_temp;
286         int ret = 0;
287
288         /* Check that this notification is for us. */
289         if (what != NETDEV_CHANGE)
290                 return NOTIFY_DONE;
291
292         wdev = dev->ieee80211_ptr;
293         if (wdev == NULL)
294                 return NOTIFY_DONE;
295
296         wiphy = wdev->wiphy;
297         if (wiphy == NULL)
298                 return NOTIFY_DONE;
299
300         hw = wiphy_priv(wiphy);
301         if (hw == NULL)
302                 return NOTIFY_DONE;
303
304         wl_temp = hw->priv;
305         list_for_each_entry(wl, &wl_list, list) {
306                 if (wl == wl_temp)
307                         break;
308         }
309         if (wl != wl_temp)
310                 return NOTIFY_DONE;
311
312         mutex_lock(&wl->mutex);
313
314         if (wl->state == WL1271_STATE_OFF)
315                 goto out;
316
317         if (!test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags))
318                 goto out;
319
320         ret = wl1271_ps_elp_wakeup(wl, false);
321         if (ret < 0)
322                 goto out;
323
324         if ((dev->operstate == IF_OPER_UP) &&
325             !test_and_set_bit(WL1271_FLAG_STA_STATE_SENT, &wl->flags)) {
326                 wl1271_cmd_set_sta_state(wl);
327                 wl1271_info("Association completed.");
328         }
329
330         wl1271_ps_elp_sleep(wl);
331
332 out:
333         mutex_unlock(&wl->mutex);
334
335         return NOTIFY_OK;
336 }
337
338 static int wl1271_reg_notify(struct wiphy *wiphy,
339                              struct regulatory_request *request)
340 {
341         struct ieee80211_supported_band *band;
342         struct ieee80211_channel *ch;
343         int i;
344
345         band = wiphy->bands[IEEE80211_BAND_5GHZ];
346         for (i = 0; i < band->n_channels; i++) {
347                 ch = &band->channels[i];
348                 if (ch->flags & IEEE80211_CHAN_DISABLED)
349                         continue;
350
351                 if (ch->flags & IEEE80211_CHAN_RADAR)
352                         ch->flags |= IEEE80211_CHAN_NO_IBSS |
353                                      IEEE80211_CHAN_PASSIVE_SCAN;
354
355         }
356
357         return 0;
358 }
359
360 static void wl1271_conf_init(struct wl1271 *wl)
361 {
362
363         /*
364          * This function applies the default configuration to the driver. This
365          * function is invoked upon driver load (spi probe.)
366          *
367          * The configuration is stored in a run-time structure in order to
368          * facilitate for run-time adjustment of any of the parameters. Making
369          * changes to the configuration structure will apply the new values on
370          * the next interface up (wl1271_op_start.)
371          */
372
373         /* apply driver default configuration */
374         memcpy(&wl->conf, &default_conf, sizeof(default_conf));
375 }
376
377
378 static int wl1271_plt_init(struct wl1271 *wl)
379 {
380         struct conf_tx_ac_category *conf_ac;
381         struct conf_tx_tid *conf_tid;
382         int ret, i;
383
384         ret = wl1271_cmd_general_parms(wl);
385         if (ret < 0)
386                 return ret;
387
388         ret = wl1271_cmd_radio_parms(wl);
389         if (ret < 0)
390                 return ret;
391
392         ret = wl1271_cmd_ext_radio_parms(wl);
393         if (ret < 0)
394                 return ret;
395
396         ret = wl1271_init_templates_config(wl);
397         if (ret < 0)
398                 return ret;
399
400         ret = wl1271_acx_init_mem_config(wl);
401         if (ret < 0)
402                 return ret;
403
404         /* PHY layer config */
405         ret = wl1271_init_phy_config(wl);
406         if (ret < 0)
407                 goto out_free_memmap;
408
409         ret = wl1271_acx_dco_itrim_params(wl);
410         if (ret < 0)
411                 goto out_free_memmap;
412
413         /* Initialize connection monitoring thresholds */
414         ret = wl1271_acx_conn_monit_params(wl, false);
415         if (ret < 0)
416                 goto out_free_memmap;
417
418         /* Bluetooth WLAN coexistence */
419         ret = wl1271_init_pta(wl);
420         if (ret < 0)
421                 goto out_free_memmap;
422
423         /* Energy detection */
424         ret = wl1271_init_energy_detection(wl);
425         if (ret < 0)
426                 goto out_free_memmap;
427
428         /* Default fragmentation threshold */
429         ret = wl1271_acx_frag_threshold(wl, wl->conf.tx.frag_threshold);
430         if (ret < 0)
431                 goto out_free_memmap;
432
433         /* Default TID/AC configuration */
434         BUG_ON(wl->conf.tx.tid_conf_count != wl->conf.tx.ac_conf_count);
435         for (i = 0; i < wl->conf.tx.tid_conf_count; i++) {
436                 conf_ac = &wl->conf.tx.ac_conf[i];
437                 ret = wl1271_acx_ac_cfg(wl, conf_ac->ac, conf_ac->cw_min,
438                                         conf_ac->cw_max, conf_ac->aifsn,
439                                         conf_ac->tx_op_limit);
440                 if (ret < 0)
441                         goto out_free_memmap;
442
443                 conf_tid = &wl->conf.tx.tid_conf[i];
444                 ret = wl1271_acx_tid_cfg(wl, conf_tid->queue_id,
445                                          conf_tid->channel_type,
446                                          conf_tid->tsid,
447                                          conf_tid->ps_scheme,
448                                          conf_tid->ack_policy,
449                                          conf_tid->apsd_conf[0],
450                                          conf_tid->apsd_conf[1]);
451                 if (ret < 0)
452                         goto out_free_memmap;
453         }
454
455         /* Enable data path */
456         ret = wl1271_cmd_data_path(wl, 1);
457         if (ret < 0)
458                 goto out_free_memmap;
459
460         /* Configure for CAM power saving (ie. always active) */
461         ret = wl1271_acx_sleep_auth(wl, WL1271_PSM_CAM);
462         if (ret < 0)
463                 goto out_free_memmap;
464
465         /* configure PM */
466         ret = wl1271_acx_pm_config(wl);
467         if (ret < 0)
468                 goto out_free_memmap;
469
470         return 0;
471
472  out_free_memmap:
473         kfree(wl->target_mem_map);
474         wl->target_mem_map = NULL;
475
476         return ret;
477 }
478
479 static void wl1271_fw_status(struct wl1271 *wl,
480                              struct wl1271_fw_status *status)
481 {
482         struct timespec ts;
483         u32 total = 0;
484         int i;
485
486         wl1271_raw_read(wl, FW_STATUS_ADDR, status, sizeof(*status), false);
487
488         wl1271_debug(DEBUG_IRQ, "intr: 0x%x (fw_rx_counter = %d, "
489                      "drv_rx_counter = %d, tx_results_counter = %d)",
490                      status->intr,
491                      status->fw_rx_counter,
492                      status->drv_rx_counter,
493                      status->tx_results_counter);
494
495         /* update number of available TX blocks */
496         for (i = 0; i < NUM_TX_QUEUES; i++) {
497                 u32 cnt = le32_to_cpu(status->tx_released_blks[i]) -
498                         wl->tx_blocks_freed[i];
499
500                 wl->tx_blocks_freed[i] =
501                         le32_to_cpu(status->tx_released_blks[i]);
502                 wl->tx_blocks_available += cnt;
503                 total += cnt;
504         }
505
506         /* if more blocks are available now, tx work can be scheduled */
507         if (total)
508                 clear_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags);
509
510         /* update the host-chipset time offset */
511         getnstimeofday(&ts);
512         wl->time_offset = (timespec_to_ns(&ts) >> 10) -
513                 (s64)le32_to_cpu(status->fw_localtime);
514 }
515
516 #define WL1271_IRQ_MAX_LOOPS 10
517
518 static void wl1271_irq_work(struct work_struct *work)
519 {
520         int ret;
521         u32 intr;
522         int loopcount = WL1271_IRQ_MAX_LOOPS;
523         unsigned long flags;
524         struct wl1271 *wl =
525                 container_of(work, struct wl1271, irq_work);
526
527         mutex_lock(&wl->mutex);
528
529         wl1271_debug(DEBUG_IRQ, "IRQ work");
530
531         if (unlikely(wl->state == WL1271_STATE_OFF))
532                 goto out;
533
534         ret = wl1271_ps_elp_wakeup(wl, true);
535         if (ret < 0)
536                 goto out;
537
538         spin_lock_irqsave(&wl->wl_lock, flags);
539         while (test_bit(WL1271_FLAG_IRQ_PENDING, &wl->flags) && loopcount) {
540                 clear_bit(WL1271_FLAG_IRQ_PENDING, &wl->flags);
541                 spin_unlock_irqrestore(&wl->wl_lock, flags);
542                 loopcount--;
543
544                 wl1271_fw_status(wl, wl->fw_status);
545                 intr = le32_to_cpu(wl->fw_status->intr);
546                 if (!intr) {
547                         wl1271_debug(DEBUG_IRQ, "Zero interrupt received.");
548                         spin_lock_irqsave(&wl->wl_lock, flags);
549                         continue;
550                 }
551
552                 intr &= WL1271_INTR_MASK;
553
554                 if (unlikely(intr & WL1271_ACX_INTR_WATCHDOG)) {
555                         wl1271_error("watchdog interrupt received! "
556                                      "starting recovery.");
557                         ieee80211_queue_work(wl->hw, &wl->recovery_work);
558
559                         /* restarting the chip. ignore any other interrupt. */
560                         goto out;
561                 }
562
563                 if (intr & WL1271_ACX_INTR_DATA) {
564                         wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_DATA");
565
566                         /* check for tx results */
567                         if (wl->fw_status->tx_results_counter !=
568                             (wl->tx_results_count & 0xff))
569                                 wl1271_tx_complete(wl);
570
571                         /* Check if any tx blocks were freed */
572                         if (!test_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags) &&
573                             wl->tx_queue_count) {
574                                 /*
575                                  * In order to avoid starvation of the TX path,
576                                  * call the work function directly.
577                                  */
578                                 wl1271_tx_work_locked(wl);
579                         }
580
581                         wl1271_rx(wl, wl->fw_status);
582                 }
583
584                 if (intr & WL1271_ACX_INTR_EVENT_A) {
585                         wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_EVENT_A");
586                         wl1271_event_handle(wl, 0);
587                 }
588
589                 if (intr & WL1271_ACX_INTR_EVENT_B) {
590                         wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_EVENT_B");
591                         wl1271_event_handle(wl, 1);
592                 }
593
594                 if (intr & WL1271_ACX_INTR_INIT_COMPLETE)
595                         wl1271_debug(DEBUG_IRQ,
596                                      "WL1271_ACX_INTR_INIT_COMPLETE");
597
598                 if (intr & WL1271_ACX_INTR_HW_AVAILABLE)
599                         wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_HW_AVAILABLE");
600
601                 spin_lock_irqsave(&wl->wl_lock, flags);
602         }
603
604         if (test_bit(WL1271_FLAG_IRQ_PENDING, &wl->flags))
605                 ieee80211_queue_work(wl->hw, &wl->irq_work);
606         else
607                 clear_bit(WL1271_FLAG_IRQ_RUNNING, &wl->flags);
608         spin_unlock_irqrestore(&wl->wl_lock, flags);
609
610         wl1271_ps_elp_sleep(wl);
611
612 out:
613         mutex_unlock(&wl->mutex);
614 }
615
616 static int wl1271_fetch_firmware(struct wl1271 *wl)
617 {
618         const struct firmware *fw;
619         int ret;
620
621         ret = request_firmware(&fw, WL1271_FW_NAME, wl1271_wl_to_dev(wl));
622
623         if (ret < 0) {
624                 wl1271_error("could not get firmware: %d", ret);
625                 return ret;
626         }
627
628         if (fw->size % 4) {
629                 wl1271_error("firmware size is not multiple of 32 bits: %zu",
630                              fw->size);
631                 ret = -EILSEQ;
632                 goto out;
633         }
634
635         wl->fw_len = fw->size;
636         wl->fw = vmalloc(wl->fw_len);
637
638         if (!wl->fw) {
639                 wl1271_error("could not allocate memory for the firmware");
640                 ret = -ENOMEM;
641                 goto out;
642         }
643
644         memcpy(wl->fw, fw->data, wl->fw_len);
645
646         ret = 0;
647
648 out:
649         release_firmware(fw);
650
651         return ret;
652 }
653
654 static int wl1271_fetch_nvs(struct wl1271 *wl)
655 {
656         const struct firmware *fw;
657         int ret;
658
659         ret = request_firmware(&fw, WL1271_NVS_NAME, wl1271_wl_to_dev(wl));
660
661         if (ret < 0) {
662                 wl1271_error("could not get nvs file: %d", ret);
663                 return ret;
664         }
665
666         wl->nvs = kmemdup(fw->data, sizeof(struct wl1271_nvs_file), GFP_KERNEL);
667
668         if (!wl->nvs) {
669                 wl1271_error("could not allocate memory for the nvs file");
670                 ret = -ENOMEM;
671                 goto out;
672         }
673
674         wl->nvs_len = fw->size;
675
676 out:
677         release_firmware(fw);
678
679         return ret;
680 }
681
682 static void wl1271_recovery_work(struct work_struct *work)
683 {
684         struct wl1271 *wl =
685                 container_of(work, struct wl1271, recovery_work);
686
687         mutex_lock(&wl->mutex);
688
689         if (wl->state != WL1271_STATE_ON)
690                 goto out;
691
692         wl1271_info("Hardware recovery in progress.");
693
694         if (test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags))
695                 ieee80211_connection_loss(wl->vif);
696
697         /* reboot the chipset */
698         __wl1271_op_remove_interface(wl);
699         ieee80211_restart_hw(wl->hw);
700
701 out:
702         mutex_unlock(&wl->mutex);
703 }
704
705 static void wl1271_fw_wakeup(struct wl1271 *wl)
706 {
707         u32 elp_reg;
708
709         elp_reg = ELPCTRL_WAKE_UP;
710         wl1271_raw_write32(wl, HW_ACCESS_ELP_CTRL_REG_ADDR, elp_reg);
711 }
712
713 static int wl1271_setup(struct wl1271 *wl)
714 {
715         wl->fw_status = kmalloc(sizeof(*wl->fw_status), GFP_KERNEL);
716         if (!wl->fw_status)
717                 return -ENOMEM;
718
719         wl->tx_res_if = kmalloc(sizeof(*wl->tx_res_if), GFP_KERNEL);
720         if (!wl->tx_res_if) {
721                 kfree(wl->fw_status);
722                 return -ENOMEM;
723         }
724
725         return 0;
726 }
727
728 static int wl1271_chip_wakeup(struct wl1271 *wl)
729 {
730         struct wl1271_partition_set partition;
731         int ret = 0;
732
733         msleep(WL1271_PRE_POWER_ON_SLEEP);
734         ret = wl1271_power_on(wl);
735         if (ret < 0)
736                 goto out;
737         msleep(WL1271_POWER_ON_SLEEP);
738         wl1271_io_reset(wl);
739         wl1271_io_init(wl);
740
741         /* We don't need a real memory partition here, because we only want
742          * to use the registers at this point. */
743         memset(&partition, 0, sizeof(partition));
744         partition.reg.start = REGISTERS_BASE;
745         partition.reg.size = REGISTERS_DOWN_SIZE;
746         wl1271_set_partition(wl, &partition);
747
748         /* ELP module wake up */
749         wl1271_fw_wakeup(wl);
750
751         /* whal_FwCtrl_BootSm() */
752
753         /* 0. read chip id from CHIP_ID */
754         wl->chip.id = wl1271_read32(wl, CHIP_ID_B);
755
756         /* 1. check if chip id is valid */
757
758         switch (wl->chip.id) {
759         case CHIP_ID_1271_PG10:
760                 wl1271_warning("chip id 0x%x (1271 PG10) support is obsolete",
761                                wl->chip.id);
762
763                 ret = wl1271_setup(wl);
764                 if (ret < 0)
765                         goto out;
766                 break;
767         case CHIP_ID_1271_PG20:
768                 wl1271_debug(DEBUG_BOOT, "chip id 0x%x (1271 PG20)",
769                              wl->chip.id);
770
771                 ret = wl1271_setup(wl);
772                 if (ret < 0)
773                         goto out;
774                 break;
775         default:
776                 wl1271_warning("unsupported chip id: 0x%x", wl->chip.id);
777                 ret = -ENODEV;
778                 goto out;
779         }
780
781         if (wl->fw == NULL) {
782                 ret = wl1271_fetch_firmware(wl);
783                 if (ret < 0)
784                         goto out;
785         }
786
787         /* No NVS from netlink, try to get it from the filesystem */
788         if (wl->nvs == NULL) {
789                 ret = wl1271_fetch_nvs(wl);
790                 if (ret < 0)
791                         goto out;
792         }
793
794 out:
795         return ret;
796 }
797
798 int wl1271_plt_start(struct wl1271 *wl)
799 {
800         int retries = WL1271_BOOT_RETRIES;
801         int ret;
802
803         mutex_lock(&wl->mutex);
804
805         wl1271_notice("power up");
806
807         if (wl->state != WL1271_STATE_OFF) {
808                 wl1271_error("cannot go into PLT state because not "
809                              "in off state: %d", wl->state);
810                 ret = -EBUSY;
811                 goto out;
812         }
813
814         while (retries) {
815                 retries--;
816                 ret = wl1271_chip_wakeup(wl);
817                 if (ret < 0)
818                         goto power_off;
819
820                 ret = wl1271_boot(wl);
821                 if (ret < 0)
822                         goto power_off;
823
824                 ret = wl1271_plt_init(wl);
825                 if (ret < 0)
826                         goto irq_disable;
827
828                 wl->state = WL1271_STATE_PLT;
829                 wl1271_notice("firmware booted in PLT mode (%s)",
830                               wl->chip.fw_ver);
831                 goto out;
832
833 irq_disable:
834                 wl1271_disable_interrupts(wl);
835                 mutex_unlock(&wl->mutex);
836                 /* Unlocking the mutex in the middle of handling is
837                    inherently unsafe. In this case we deem it safe to do,
838                    because we need to let any possibly pending IRQ out of
839                    the system (and while we are WL1271_STATE_OFF the IRQ
840                    work function will not do anything.) Also, any other
841                    possible concurrent operations will fail due to the
842                    current state, hence the wl1271 struct should be safe. */
843                 cancel_work_sync(&wl->irq_work);
844                 mutex_lock(&wl->mutex);
845 power_off:
846                 wl1271_power_off(wl);
847         }
848
849         wl1271_error("firmware boot in PLT mode failed despite %d retries",
850                      WL1271_BOOT_RETRIES);
851 out:
852         mutex_unlock(&wl->mutex);
853
854         return ret;
855 }
856
857 int wl1271_plt_stop(struct wl1271 *wl)
858 {
859         int ret = 0;
860
861         mutex_lock(&wl->mutex);
862
863         wl1271_notice("power down");
864
865         if (wl->state != WL1271_STATE_PLT) {
866                 wl1271_error("cannot power down because not in PLT "
867                              "state: %d", wl->state);
868                 ret = -EBUSY;
869                 goto out;
870         }
871
872         wl1271_disable_interrupts(wl);
873         wl1271_power_off(wl);
874
875         wl->state = WL1271_STATE_OFF;
876         wl->rx_counter = 0;
877
878 out:
879         mutex_unlock(&wl->mutex);
880
881         cancel_work_sync(&wl->irq_work);
882         cancel_work_sync(&wl->recovery_work);
883
884         return ret;
885 }
886
887 static int wl1271_op_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
888 {
889         struct wl1271 *wl = hw->priv;
890         struct ieee80211_conf *conf = &hw->conf;
891         struct ieee80211_tx_info *txinfo = IEEE80211_SKB_CB(skb);
892         struct ieee80211_sta *sta = txinfo->control.sta;
893         unsigned long flags;
894         int q;
895
896         /*
897          * peek into the rates configured in the STA entry.
898          * The rates set after connection stage, The first block only BG sets:
899          * the compare is for bit 0-16 of sta_rate_set. The second block add
900          * HT rates in case of HT supported.
901          */
902         spin_lock_irqsave(&wl->wl_lock, flags);
903         if (sta &&
904             (sta->supp_rates[conf->channel->band] !=
905             (wl->sta_rate_set & HW_BG_RATES_MASK))) {
906                 wl->sta_rate_set = sta->supp_rates[conf->channel->band];
907                 set_bit(WL1271_FLAG_STA_RATES_CHANGED, &wl->flags);
908         }
909
910 #ifdef CONFIG_WL12XX_HT
911         if (sta &&
912             sta->ht_cap.ht_supported &&
913             ((wl->sta_rate_set >> HW_HT_RATES_OFFSET) !=
914               sta->ht_cap.mcs.rx_mask[0])) {
915                 /* Clean MCS bits before setting them */
916                 wl->sta_rate_set &= HW_BG_RATES_MASK;
917                 wl->sta_rate_set |=
918                         (sta->ht_cap.mcs.rx_mask[0] << HW_HT_RATES_OFFSET);
919                 set_bit(WL1271_FLAG_STA_RATES_CHANGED, &wl->flags);
920         }
921 #endif
922         wl->tx_queue_count++;
923         spin_unlock_irqrestore(&wl->wl_lock, flags);
924
925         /* queue the packet */
926         q = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
927         skb_queue_tail(&wl->tx_queue[q], skb);
928
929         /*
930          * The chip specific setup must run before the first TX packet -
931          * before that, the tx_work will not be initialized!
932          */
933
934         if (!test_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags))
935                 ieee80211_queue_work(wl->hw, &wl->tx_work);
936
937         /*
938          * The workqueue is slow to process the tx_queue and we need stop
939          * the queue here, otherwise the queue will get too long.
940          */
941         if (wl->tx_queue_count >= WL1271_TX_QUEUE_HIGH_WATERMARK) {
942                 wl1271_debug(DEBUG_TX, "op_tx: stopping queues");
943
944                 spin_lock_irqsave(&wl->wl_lock, flags);
945                 ieee80211_stop_queues(wl->hw);
946                 set_bit(WL1271_FLAG_TX_QUEUE_STOPPED, &wl->flags);
947                 spin_unlock_irqrestore(&wl->wl_lock, flags);
948         }
949
950         return NETDEV_TX_OK;
951 }
952
953 static struct notifier_block wl1271_dev_notifier = {
954         .notifier_call = wl1271_dev_notify,
955 };
956
957 static int wl1271_op_start(struct ieee80211_hw *hw)
958 {
959         wl1271_debug(DEBUG_MAC80211, "mac80211 start");
960
961         /*
962          * We have to delay the booting of the hardware because
963          * we need to know the local MAC address before downloading and
964          * initializing the firmware. The MAC address cannot be changed
965          * after boot, and without the proper MAC address, the firmware
966          * will not function properly.
967          *
968          * The MAC address is first known when the corresponding interface
969          * is added. That is where we will initialize the hardware.
970          */
971
972         return 0;
973 }
974
975 static void wl1271_op_stop(struct ieee80211_hw *hw)
976 {
977         wl1271_debug(DEBUG_MAC80211, "mac80211 stop");
978 }
979
980 static int wl1271_op_add_interface(struct ieee80211_hw *hw,
981                                    struct ieee80211_vif *vif)
982 {
983         struct wl1271 *wl = hw->priv;
984         struct wiphy *wiphy = hw->wiphy;
985         int retries = WL1271_BOOT_RETRIES;
986         int ret = 0;
987         bool booted = false;
988
989         wl1271_debug(DEBUG_MAC80211, "mac80211 add interface type %d mac %pM",
990                      vif->type, vif->addr);
991
992         mutex_lock(&wl->mutex);
993         if (wl->vif) {
994                 wl1271_debug(DEBUG_MAC80211,
995                              "multiple vifs are not supported yet");
996                 ret = -EBUSY;
997                 goto out;
998         }
999
1000         switch (vif->type) {
1001         case NL80211_IFTYPE_STATION:
1002                 wl->bss_type = BSS_TYPE_STA_BSS;
1003                 wl->set_bss_type = BSS_TYPE_STA_BSS;
1004                 break;
1005         case NL80211_IFTYPE_ADHOC:
1006                 wl->bss_type = BSS_TYPE_IBSS;
1007                 wl->set_bss_type = BSS_TYPE_STA_BSS;
1008                 break;
1009         default:
1010                 ret = -EOPNOTSUPP;
1011                 goto out;
1012         }
1013
1014         memcpy(wl->mac_addr, vif->addr, ETH_ALEN);
1015
1016         if (wl->state != WL1271_STATE_OFF) {
1017                 wl1271_error("cannot start because not in off state: %d",
1018                              wl->state);
1019                 ret = -EBUSY;
1020                 goto out;
1021         }
1022
1023         while (retries) {
1024                 retries--;
1025                 ret = wl1271_chip_wakeup(wl);
1026                 if (ret < 0)
1027                         goto power_off;
1028
1029                 ret = wl1271_boot(wl);
1030                 if (ret < 0)
1031                         goto power_off;
1032
1033                 ret = wl1271_hw_init(wl);
1034                 if (ret < 0)
1035                         goto irq_disable;
1036
1037                 booted = true;
1038                 break;
1039
1040 irq_disable:
1041                 wl1271_disable_interrupts(wl);
1042                 mutex_unlock(&wl->mutex);
1043                 /* Unlocking the mutex in the middle of handling is
1044                    inherently unsafe. In this case we deem it safe to do,
1045                    because we need to let any possibly pending IRQ out of
1046                    the system (and while we are WL1271_STATE_OFF the IRQ
1047                    work function will not do anything.) Also, any other
1048                    possible concurrent operations will fail due to the
1049                    current state, hence the wl1271 struct should be safe. */
1050                 cancel_work_sync(&wl->irq_work);
1051                 mutex_lock(&wl->mutex);
1052 power_off:
1053                 wl1271_power_off(wl);
1054         }
1055
1056         if (!booted) {
1057                 wl1271_error("firmware boot failed despite %d retries",
1058                              WL1271_BOOT_RETRIES);
1059                 goto out;
1060         }
1061
1062         wl->vif = vif;
1063         wl->state = WL1271_STATE_ON;
1064         wl1271_info("firmware booted (%s)", wl->chip.fw_ver);
1065
1066         /* update hw/fw version info in wiphy struct */
1067         wiphy->hw_version = wl->chip.id;
1068         strncpy(wiphy->fw_version, wl->chip.fw_ver,
1069                 sizeof(wiphy->fw_version));
1070
1071         /*
1072          * Now we know if 11a is supported (info from the NVS), so disable
1073          * 11a channels if not supported
1074          */
1075         if (!wl->enable_11a)
1076                 wiphy->bands[IEEE80211_BAND_5GHZ]->n_channels = 0;
1077
1078         wl1271_debug(DEBUG_MAC80211, "11a is %ssupported",
1079                      wl->enable_11a ? "" : "not ");
1080
1081 out:
1082         mutex_unlock(&wl->mutex);
1083
1084         if (!ret)
1085                 list_add(&wl->list, &wl_list);
1086
1087         return ret;
1088 }
1089
1090 static void __wl1271_op_remove_interface(struct wl1271 *wl)
1091 {
1092         int i;
1093
1094         wl1271_debug(DEBUG_MAC80211, "mac80211 remove interface");
1095
1096         wl1271_info("down");
1097
1098         list_del(&wl->list);
1099
1100         WARN_ON(wl->state != WL1271_STATE_ON);
1101
1102         /* enable dyn ps just in case (if left on due to fw crash etc) */
1103         if (wl->bss_type == BSS_TYPE_STA_BSS)
1104                 ieee80211_enable_dyn_ps(wl->vif);
1105
1106         if (wl->scan.state != WL1271_SCAN_STATE_IDLE) {
1107                 wl->scan.state = WL1271_SCAN_STATE_IDLE;
1108                 kfree(wl->scan.scanned_ch);
1109                 wl->scan.scanned_ch = NULL;
1110                 wl->scan.req = NULL;
1111                 ieee80211_scan_completed(wl->hw, true);
1112         }
1113
1114         wl->state = WL1271_STATE_OFF;
1115
1116         wl1271_disable_interrupts(wl);
1117
1118         mutex_unlock(&wl->mutex);
1119
1120         cancel_delayed_work_sync(&wl->scan_complete_work);
1121         cancel_work_sync(&wl->irq_work);
1122         cancel_work_sync(&wl->tx_work);
1123         cancel_delayed_work_sync(&wl->pspoll_work);
1124         cancel_delayed_work_sync(&wl->elp_work);
1125
1126         mutex_lock(&wl->mutex);
1127
1128         /* let's notify MAC80211 about the remaining pending TX frames */
1129         wl1271_tx_reset(wl);
1130         wl1271_power_off(wl);
1131
1132         memset(wl->bssid, 0, ETH_ALEN);
1133         memset(wl->ssid, 0, IW_ESSID_MAX_SIZE + 1);
1134         wl->ssid_len = 0;
1135         wl->bss_type = MAX_BSS_TYPE;
1136         wl->set_bss_type = MAX_BSS_TYPE;
1137         wl->band = IEEE80211_BAND_2GHZ;
1138
1139         wl->rx_counter = 0;
1140         wl->psm_entry_retry = 0;
1141         wl->power_level = WL1271_DEFAULT_POWER_LEVEL;
1142         wl->tx_blocks_available = 0;
1143         wl->tx_results_count = 0;
1144         wl->tx_packets_count = 0;
1145         wl->tx_security_last_seq = 0;
1146         wl->tx_security_seq = 0;
1147         wl->time_offset = 0;
1148         wl->session_counter = 0;
1149         wl->rate_set = CONF_TX_RATE_MASK_BASIC;
1150         wl->sta_rate_set = 0;
1151         wl->flags = 0;
1152         wl->vif = NULL;
1153         wl->filters = 0;
1154
1155         for (i = 0; i < NUM_TX_QUEUES; i++)
1156                 wl->tx_blocks_freed[i] = 0;
1157
1158         wl1271_debugfs_reset(wl);
1159
1160         kfree(wl->fw_status);
1161         wl->fw_status = NULL;
1162         kfree(wl->tx_res_if);
1163         wl->tx_res_if = NULL;
1164         kfree(wl->target_mem_map);
1165         wl->target_mem_map = NULL;
1166 }
1167
1168 static void wl1271_op_remove_interface(struct ieee80211_hw *hw,
1169                                        struct ieee80211_vif *vif)
1170 {
1171         struct wl1271 *wl = hw->priv;
1172
1173         mutex_lock(&wl->mutex);
1174         /*
1175          * wl->vif can be null here if someone shuts down the interface
1176          * just when hardware recovery has been started.
1177          */
1178         if (wl->vif) {
1179                 WARN_ON(wl->vif != vif);
1180                 __wl1271_op_remove_interface(wl);
1181         }
1182
1183         mutex_unlock(&wl->mutex);
1184         cancel_work_sync(&wl->recovery_work);
1185 }
1186
1187 static void wl1271_configure_filters(struct wl1271 *wl, unsigned int filters)
1188 {
1189         wl->rx_config = WL1271_DEFAULT_RX_CONFIG;
1190         wl->rx_filter = WL1271_DEFAULT_RX_FILTER;
1191
1192         /* combine requested filters with current filter config */
1193         filters = wl->filters | filters;
1194
1195         wl1271_debug(DEBUG_FILTERS, "RX filters set: ");
1196
1197         if (filters & FIF_PROMISC_IN_BSS) {
1198                 wl1271_debug(DEBUG_FILTERS, " - FIF_PROMISC_IN_BSS");
1199                 wl->rx_config &= ~CFG_UNI_FILTER_EN;
1200                 wl->rx_config |= CFG_BSSID_FILTER_EN;
1201         }
1202         if (filters & FIF_BCN_PRBRESP_PROMISC) {
1203                 wl1271_debug(DEBUG_FILTERS, " - FIF_BCN_PRBRESP_PROMISC");
1204                 wl->rx_config &= ~CFG_BSSID_FILTER_EN;
1205                 wl->rx_config &= ~CFG_SSID_FILTER_EN;
1206         }
1207         if (filters & FIF_OTHER_BSS) {
1208                 wl1271_debug(DEBUG_FILTERS, " - FIF_OTHER_BSS");
1209                 wl->rx_config &= ~CFG_BSSID_FILTER_EN;
1210         }
1211         if (filters & FIF_CONTROL) {
1212                 wl1271_debug(DEBUG_FILTERS, " - FIF_CONTROL");
1213                 wl->rx_filter |= CFG_RX_CTL_EN;
1214         }
1215         if (filters & FIF_FCSFAIL) {
1216                 wl1271_debug(DEBUG_FILTERS, " - FIF_FCSFAIL");
1217                 wl->rx_filter |= CFG_RX_FCS_ERROR;
1218         }
1219 }
1220
1221 static int wl1271_dummy_join(struct wl1271 *wl)
1222 {
1223         int ret = 0;
1224         /* we need to use a dummy BSSID for now */
1225         static const u8 dummy_bssid[ETH_ALEN] = { 0x0b, 0xad, 0xde,
1226                                                   0xad, 0xbe, 0xef };
1227
1228         memcpy(wl->bssid, dummy_bssid, ETH_ALEN);
1229
1230         /* pass through frames from all BSS */
1231         wl1271_configure_filters(wl, FIF_OTHER_BSS);
1232
1233         ret = wl1271_cmd_join(wl, wl->set_bss_type);
1234         if (ret < 0)
1235                 goto out;
1236
1237         set_bit(WL1271_FLAG_JOINED, &wl->flags);
1238
1239 out:
1240         return ret;
1241 }
1242
1243 static int wl1271_join(struct wl1271 *wl, bool set_assoc)
1244 {
1245         int ret;
1246
1247         /*
1248          * One of the side effects of the JOIN command is that is clears
1249          * WPA/WPA2 keys from the chipset. Performing a JOIN while associated
1250          * to a WPA/WPA2 access point will therefore kill the data-path.
1251          * Currently there is no supported scenario for JOIN during
1252          * association - if it becomes a supported scenario, the WPA/WPA2 keys
1253          * must be handled somehow.
1254          *
1255          */
1256         if (test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags))
1257                 wl1271_info("JOIN while associated.");
1258
1259         if (set_assoc)
1260                 set_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags);
1261
1262         ret = wl1271_cmd_join(wl, wl->set_bss_type);
1263         if (ret < 0)
1264                 goto out;
1265
1266         set_bit(WL1271_FLAG_JOINED, &wl->flags);
1267
1268         if (!test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags))
1269                 goto out;
1270
1271         /*
1272          * The join command disable the keep-alive mode, shut down its process,
1273          * and also clear the template config, so we need to reset it all after
1274          * the join. The acx_aid starts the keep-alive process, and the order
1275          * of the commands below is relevant.
1276          */
1277         ret = wl1271_acx_keep_alive_mode(wl, true);
1278         if (ret < 0)
1279                 goto out;
1280
1281         ret = wl1271_acx_aid(wl, wl->aid);
1282         if (ret < 0)
1283                 goto out;
1284
1285         ret = wl1271_cmd_build_klv_null_data(wl);
1286         if (ret < 0)
1287                 goto out;
1288
1289         ret = wl1271_acx_keep_alive_config(wl, CMD_TEMPL_KLV_IDX_NULL_DATA,
1290                                            ACX_KEEP_ALIVE_TPL_VALID);
1291         if (ret < 0)
1292                 goto out;
1293
1294 out:
1295         return ret;
1296 }
1297
1298 static int wl1271_unjoin(struct wl1271 *wl)
1299 {
1300         int ret;
1301
1302         /* to stop listening to a channel, we disconnect */
1303         ret = wl1271_cmd_disconnect(wl);
1304         if (ret < 0)
1305                 goto out;
1306
1307         clear_bit(WL1271_FLAG_JOINED, &wl->flags);
1308         memset(wl->bssid, 0, ETH_ALEN);
1309
1310         /* stop filterting packets based on bssid */
1311         wl1271_configure_filters(wl, FIF_OTHER_BSS);
1312
1313 out:
1314         return ret;
1315 }
1316
1317 static void wl1271_set_band_rate(struct wl1271 *wl)
1318 {
1319         if (wl->band == IEEE80211_BAND_2GHZ)
1320                 wl->basic_rate_set = wl->conf.tx.basic_rate;
1321         else
1322                 wl->basic_rate_set = wl->conf.tx.basic_rate_5;
1323 }
1324
1325 static u32 wl1271_min_rate_get(struct wl1271 *wl)
1326 {
1327         int i;
1328         u32 rate = 0;
1329
1330         if (!wl->basic_rate_set) {
1331                 WARN_ON(1);
1332                 wl->basic_rate_set = wl->conf.tx.basic_rate;
1333         }
1334
1335         for (i = 0; !rate; i++) {
1336                 if ((wl->basic_rate_set >> i) & 0x1)
1337                         rate = 1 << i;
1338         }
1339
1340         return rate;
1341 }
1342
1343 static int wl1271_handle_idle(struct wl1271 *wl, bool idle)
1344 {
1345         int ret;
1346
1347         if (idle) {
1348                 if (test_bit(WL1271_FLAG_JOINED, &wl->flags)) {
1349                         ret = wl1271_unjoin(wl);
1350                         if (ret < 0)
1351                                 goto out;
1352                 }
1353                 wl->rate_set = wl1271_min_rate_get(wl);
1354                 wl->sta_rate_set = 0;
1355                 ret = wl1271_acx_rate_policies(wl);
1356                 if (ret < 0)
1357                         goto out;
1358                 ret = wl1271_acx_keep_alive_config(
1359                         wl, CMD_TEMPL_KLV_IDX_NULL_DATA,
1360                         ACX_KEEP_ALIVE_TPL_INVALID);
1361                 if (ret < 0)
1362                         goto out;
1363                 set_bit(WL1271_FLAG_IDLE, &wl->flags);
1364         } else {
1365                 /* increment the session counter */
1366                 wl->session_counter++;
1367                 if (wl->session_counter >= SESSION_COUNTER_MAX)
1368                         wl->session_counter = 0;
1369                 ret = wl1271_dummy_join(wl);
1370                 if (ret < 0)
1371                         goto out;
1372                 clear_bit(WL1271_FLAG_IDLE, &wl->flags);
1373         }
1374
1375 out:
1376         return ret;
1377 }
1378
1379 static int wl1271_op_config(struct ieee80211_hw *hw, u32 changed)
1380 {
1381         struct wl1271 *wl = hw->priv;
1382         struct ieee80211_conf *conf = &hw->conf;
1383         int channel, ret = 0;
1384
1385         channel = ieee80211_frequency_to_channel(conf->channel->center_freq);
1386
1387         wl1271_debug(DEBUG_MAC80211, "mac80211 config ch %d psm %s power %d %s",
1388                      channel,
1389                      conf->flags & IEEE80211_CONF_PS ? "on" : "off",
1390                      conf->power_level,
1391                      conf->flags & IEEE80211_CONF_IDLE ? "idle" : "in use");
1392
1393         /*
1394          * mac80211 will go to idle nearly immediately after transmitting some
1395          * frames, such as the deauth. To make sure those frames reach the air,
1396          * wait here until the TX queue is fully flushed.
1397          */
1398         if ((changed & IEEE80211_CONF_CHANGE_IDLE) &&
1399             (conf->flags & IEEE80211_CONF_IDLE))
1400                 wl1271_tx_flush(wl);
1401
1402         mutex_lock(&wl->mutex);
1403
1404         if (unlikely(wl->state == WL1271_STATE_OFF)) {
1405                 ret = -EAGAIN;
1406                 goto out;
1407         }
1408
1409         ret = wl1271_ps_elp_wakeup(wl, false);
1410         if (ret < 0)
1411                 goto out;
1412
1413         /* if the channel changes while joined, join again */
1414         if (changed & IEEE80211_CONF_CHANGE_CHANNEL &&
1415             ((wl->band != conf->channel->band) ||
1416              (wl->channel != channel))) {
1417                 wl->band = conf->channel->band;
1418                 wl->channel = channel;
1419
1420                 /*
1421                  * FIXME: the mac80211 should really provide a fixed rate
1422                  * to use here. for now, just use the smallest possible rate
1423                  * for the band as a fixed rate for association frames and
1424                  * other control messages.
1425                  */
1426                 if (!test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags))
1427                         wl1271_set_band_rate(wl);
1428
1429                 wl->basic_rate = wl1271_min_rate_get(wl);
1430                 ret = wl1271_acx_rate_policies(wl);
1431                 if (ret < 0)
1432                         wl1271_warning("rate policy for update channel "
1433                                        "failed %d", ret);
1434
1435                 if (test_bit(WL1271_FLAG_JOINED, &wl->flags)) {
1436                         ret = wl1271_join(wl, false);
1437                         if (ret < 0)
1438                                 wl1271_warning("cmd join to update channel "
1439                                                "failed %d", ret);
1440                 }
1441         }
1442
1443         if (changed & IEEE80211_CONF_CHANGE_IDLE) {
1444                 ret = wl1271_handle_idle(wl, conf->flags & IEEE80211_CONF_IDLE);
1445                 if (ret < 0)
1446                         wl1271_warning("idle mode change failed %d", ret);
1447         }
1448
1449         /*
1450          * if mac80211 changes the PSM mode, make sure the mode is not
1451          * incorrectly changed after the pspoll failure active window.
1452          */
1453         if (changed & IEEE80211_CONF_CHANGE_PS)
1454                 clear_bit(WL1271_FLAG_PSPOLL_FAILURE, &wl->flags);
1455
1456         if (conf->flags & IEEE80211_CONF_PS &&
1457             !test_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags)) {
1458                 set_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags);
1459
1460                 /*
1461                  * We enter PSM only if we're already associated.
1462                  * If we're not, we'll enter it when joining an SSID,
1463                  * through the bss_info_changed() hook.
1464                  */
1465                 if (test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags)) {
1466                         wl1271_debug(DEBUG_PSM, "psm enabled");
1467                         ret = wl1271_ps_set_mode(wl, STATION_POWER_SAVE_MODE,
1468                                                  wl->basic_rate, true);
1469                 }
1470         } else if (!(conf->flags & IEEE80211_CONF_PS) &&
1471                    test_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags)) {
1472                 wl1271_debug(DEBUG_PSM, "psm disabled");
1473
1474                 clear_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags);
1475
1476                 if (test_bit(WL1271_FLAG_PSM, &wl->flags))
1477                         ret = wl1271_ps_set_mode(wl, STATION_ACTIVE_MODE,
1478                                                  wl->basic_rate, true);
1479         }
1480
1481         if (conf->power_level != wl->power_level) {
1482                 ret = wl1271_acx_tx_power(wl, conf->power_level);
1483                 if (ret < 0)
1484                         goto out_sleep;
1485
1486                 wl->power_level = conf->power_level;
1487         }
1488
1489 out_sleep:
1490         wl1271_ps_elp_sleep(wl);
1491
1492 out:
1493         mutex_unlock(&wl->mutex);
1494
1495         return ret;
1496 }
1497
1498 struct wl1271_filter_params {
1499         bool enabled;
1500         int mc_list_length;
1501         u8 mc_list[ACX_MC_ADDRESS_GROUP_MAX][ETH_ALEN];
1502 };
1503
1504 static u64 wl1271_op_prepare_multicast(struct ieee80211_hw *hw,
1505                                        struct netdev_hw_addr_list *mc_list)
1506 {
1507         struct wl1271_filter_params *fp;
1508         struct netdev_hw_addr *ha;
1509         struct wl1271 *wl = hw->priv;
1510
1511         if (unlikely(wl->state == WL1271_STATE_OFF))
1512                 return 0;
1513
1514         fp = kzalloc(sizeof(*fp), GFP_ATOMIC);
1515         if (!fp) {
1516                 wl1271_error("Out of memory setting filters.");
1517                 return 0;
1518         }
1519
1520         /* update multicast filtering parameters */
1521         fp->mc_list_length = 0;
1522         if (netdev_hw_addr_list_count(mc_list) > ACX_MC_ADDRESS_GROUP_MAX) {
1523                 fp->enabled = false;
1524         } else {
1525                 fp->enabled = true;
1526                 netdev_hw_addr_list_for_each(ha, mc_list) {
1527                         memcpy(fp->mc_list[fp->mc_list_length],
1528                                         ha->addr, ETH_ALEN);
1529                         fp->mc_list_length++;
1530                 }
1531         }
1532
1533         return (u64)(unsigned long)fp;
1534 }
1535
1536 #define WL1271_SUPPORTED_FILTERS (FIF_PROMISC_IN_BSS | \
1537                                   FIF_ALLMULTI | \
1538                                   FIF_FCSFAIL | \
1539                                   FIF_BCN_PRBRESP_PROMISC | \
1540                                   FIF_CONTROL | \
1541                                   FIF_OTHER_BSS)
1542
1543 static void wl1271_op_configure_filter(struct ieee80211_hw *hw,
1544                                        unsigned int changed,
1545                                        unsigned int *total, u64 multicast)
1546 {
1547         struct wl1271_filter_params *fp = (void *)(unsigned long)multicast;
1548         struct wl1271 *wl = hw->priv;
1549         int ret;
1550
1551         wl1271_debug(DEBUG_MAC80211, "mac80211 configure filter");
1552
1553         mutex_lock(&wl->mutex);
1554
1555         *total &= WL1271_SUPPORTED_FILTERS;
1556         changed &= WL1271_SUPPORTED_FILTERS;
1557
1558         if (unlikely(wl->state == WL1271_STATE_OFF))
1559                 goto out;
1560
1561         ret = wl1271_ps_elp_wakeup(wl, false);
1562         if (ret < 0)
1563                 goto out;
1564
1565
1566         if (*total & FIF_ALLMULTI)
1567                 ret = wl1271_acx_group_address_tbl(wl, false, NULL, 0);
1568         else if (fp)
1569                 ret = wl1271_acx_group_address_tbl(wl, fp->enabled,
1570                                                    fp->mc_list,
1571                                                    fp->mc_list_length);
1572         if (ret < 0)
1573                 goto out_sleep;
1574
1575         /* determine, whether supported filter values have changed */
1576         if (changed == 0)
1577                 goto out_sleep;
1578
1579         /* configure filters */
1580         wl->filters = *total;
1581         wl1271_configure_filters(wl, 0);
1582
1583         /* apply configured filters */
1584         ret = wl1271_acx_rx_config(wl, wl->rx_config, wl->rx_filter);
1585         if (ret < 0)
1586                 goto out_sleep;
1587
1588 out_sleep:
1589         wl1271_ps_elp_sleep(wl);
1590
1591 out:
1592         mutex_unlock(&wl->mutex);
1593         kfree(fp);
1594 }
1595
1596 static int wl1271_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
1597                              struct ieee80211_vif *vif,
1598                              struct ieee80211_sta *sta,
1599                              struct ieee80211_key_conf *key_conf)
1600 {
1601         struct wl1271 *wl = hw->priv;
1602         const u8 *addr;
1603         int ret;
1604         u32 tx_seq_32 = 0;
1605         u16 tx_seq_16 = 0;
1606         u8 key_type;
1607
1608         static const u8 bcast_addr[ETH_ALEN] =
1609                 { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
1610
1611         wl1271_debug(DEBUG_MAC80211, "mac80211 set key");
1612
1613         addr = sta ? sta->addr : bcast_addr;
1614
1615         wl1271_debug(DEBUG_CRYPT, "CMD: 0x%x", cmd);
1616         wl1271_dump(DEBUG_CRYPT, "ADDR: ", addr, ETH_ALEN);
1617         wl1271_debug(DEBUG_CRYPT, "Key: algo:0x%x, id:%d, len:%d flags 0x%x",
1618                      key_conf->cipher, key_conf->keyidx,
1619                      key_conf->keylen, key_conf->flags);
1620         wl1271_dump(DEBUG_CRYPT, "KEY: ", key_conf->key, key_conf->keylen);
1621
1622         if (is_zero_ether_addr(addr)) {
1623                 /* We dont support TX only encryption */
1624                 ret = -EOPNOTSUPP;
1625                 goto out;
1626         }
1627
1628         mutex_lock(&wl->mutex);
1629
1630         if (unlikely(wl->state == WL1271_STATE_OFF)) {
1631                 ret = -EAGAIN;
1632                 goto out_unlock;
1633         }
1634
1635         ret = wl1271_ps_elp_wakeup(wl, false);
1636         if (ret < 0)
1637                 goto out_unlock;
1638
1639         switch (key_conf->cipher) {
1640         case WLAN_CIPHER_SUITE_WEP40:
1641         case WLAN_CIPHER_SUITE_WEP104:
1642                 key_type = KEY_WEP;
1643
1644                 key_conf->hw_key_idx = key_conf->keyidx;
1645                 break;
1646         case WLAN_CIPHER_SUITE_TKIP:
1647                 key_type = KEY_TKIP;
1648
1649                 key_conf->hw_key_idx = key_conf->keyidx;
1650                 tx_seq_32 = WL1271_TX_SECURITY_HI32(wl->tx_security_seq);
1651                 tx_seq_16 = WL1271_TX_SECURITY_LO16(wl->tx_security_seq);
1652                 break;
1653         case WLAN_CIPHER_SUITE_CCMP:
1654                 key_type = KEY_AES;
1655
1656                 key_conf->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
1657                 tx_seq_32 = WL1271_TX_SECURITY_HI32(wl->tx_security_seq);
1658                 tx_seq_16 = WL1271_TX_SECURITY_LO16(wl->tx_security_seq);
1659                 break;
1660         case WL1271_CIPHER_SUITE_GEM:
1661                 key_type = KEY_GEM;
1662                 tx_seq_32 = WL1271_TX_SECURITY_HI32(wl->tx_security_seq);
1663                 tx_seq_16 = WL1271_TX_SECURITY_LO16(wl->tx_security_seq);
1664                 break;
1665         default:
1666                 wl1271_error("Unknown key algo 0x%x", key_conf->cipher);
1667
1668                 ret = -EOPNOTSUPP;
1669                 goto out_sleep;
1670         }
1671
1672         switch (cmd) {
1673         case SET_KEY:
1674                 ret = wl1271_cmd_set_key(wl, KEY_ADD_OR_REPLACE,
1675                                          key_conf->keyidx, key_type,
1676                                          key_conf->keylen, key_conf->key,
1677                                          addr, tx_seq_32, tx_seq_16);
1678                 if (ret < 0) {
1679                         wl1271_error("Could not add or replace key");
1680                         goto out_sleep;
1681                 }
1682
1683                 /* the default WEP key needs to be configured at least once */
1684                 if (key_type == KEY_WEP) {
1685                         ret = wl1271_cmd_set_default_wep_key(wl,
1686                                                              wl->default_key);
1687                         if (ret < 0)
1688                                 goto out_sleep;
1689                 }
1690                 break;
1691
1692         case DISABLE_KEY:
1693                 /* The wl1271 does not allow to remove unicast keys - they
1694                    will be cleared automatically on next CMD_JOIN. Ignore the
1695                    request silently, as we dont want the mac80211 to emit
1696                    an error message. */
1697                 if (!is_broadcast_ether_addr(addr))
1698                         break;
1699
1700                 ret = wl1271_cmd_set_key(wl, KEY_REMOVE,
1701                                          key_conf->keyidx, key_type,
1702                                          key_conf->keylen, key_conf->key,
1703                                          addr, 0, 0);
1704                 if (ret < 0) {
1705                         wl1271_error("Could not remove key");
1706                         goto out_sleep;
1707                 }
1708                 break;
1709
1710         default:
1711                 wl1271_error("Unsupported key cmd 0x%x", cmd);
1712                 ret = -EOPNOTSUPP;
1713                 break;
1714         }
1715
1716 out_sleep:
1717         wl1271_ps_elp_sleep(wl);
1718
1719 out_unlock:
1720         mutex_unlock(&wl->mutex);
1721
1722 out:
1723         return ret;
1724 }
1725
1726 static int wl1271_op_hw_scan(struct ieee80211_hw *hw,
1727                              struct ieee80211_vif *vif,
1728                              struct cfg80211_scan_request *req)
1729 {
1730         struct wl1271 *wl = hw->priv;
1731         int ret;
1732         u8 *ssid = NULL;
1733         size_t len = 0;
1734
1735         wl1271_debug(DEBUG_MAC80211, "mac80211 hw scan");
1736
1737         if (req->n_ssids) {
1738                 ssid = req->ssids[0].ssid;
1739                 len = req->ssids[0].ssid_len;
1740         }
1741
1742         mutex_lock(&wl->mutex);
1743
1744         if (wl->state == WL1271_STATE_OFF) {
1745                 /*
1746                  * We cannot return -EBUSY here because cfg80211 will expect
1747                  * a call to ieee80211_scan_completed if we do - in this case
1748                  * there won't be any call.
1749                  */
1750                 ret = -EAGAIN;
1751                 goto out;
1752         }
1753
1754         ret = wl1271_ps_elp_wakeup(wl, false);
1755         if (ret < 0)
1756                 goto out;
1757
1758         ret = wl1271_scan(hw->priv, ssid, len, req);
1759
1760         wl1271_ps_elp_sleep(wl);
1761
1762 out:
1763         mutex_unlock(&wl->mutex);
1764
1765         return ret;
1766 }
1767
1768 static int wl1271_op_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
1769 {
1770         struct wl1271 *wl = hw->priv;
1771         int ret = 0;
1772
1773         mutex_lock(&wl->mutex);
1774
1775         if (unlikely(wl->state == WL1271_STATE_OFF)) {
1776                 ret = -EAGAIN;
1777                 goto out;
1778         }
1779
1780         ret = wl1271_ps_elp_wakeup(wl, false);
1781         if (ret < 0)
1782                 goto out;
1783
1784         ret = wl1271_acx_frag_threshold(wl, (u16)value);
1785         if (ret < 0)
1786                 wl1271_warning("wl1271_op_set_frag_threshold failed: %d", ret);
1787
1788         wl1271_ps_elp_sleep(wl);
1789
1790 out:
1791         mutex_unlock(&wl->mutex);
1792
1793         return ret;
1794 }
1795
1796 static int wl1271_op_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
1797 {
1798         struct wl1271 *wl = hw->priv;
1799         int ret = 0;
1800
1801         mutex_lock(&wl->mutex);
1802
1803         if (unlikely(wl->state == WL1271_STATE_OFF)) {
1804                 ret = -EAGAIN;
1805                 goto out;
1806         }
1807
1808         ret = wl1271_ps_elp_wakeup(wl, false);
1809         if (ret < 0)
1810                 goto out;
1811
1812         ret = wl1271_acx_rts_threshold(wl, (u16) value);
1813         if (ret < 0)
1814                 wl1271_warning("wl1271_op_set_rts_threshold failed: %d", ret);
1815
1816         wl1271_ps_elp_sleep(wl);
1817
1818 out:
1819         mutex_unlock(&wl->mutex);
1820
1821         return ret;
1822 }
1823
1824 static void wl1271_ssid_set(struct wl1271 *wl, struct sk_buff *skb,
1825                             int offset)
1826 {
1827         u8 *ptr = skb->data + offset;
1828
1829         /* find the location of the ssid in the beacon */
1830         while (ptr < skb->data + skb->len) {
1831                 if (ptr[0] == WLAN_EID_SSID) {
1832                         wl->ssid_len = ptr[1];
1833                         memcpy(wl->ssid, ptr+2, wl->ssid_len);
1834                         return;
1835                 }
1836                 ptr += (ptr[1] + 2);
1837         }
1838         wl1271_error("No SSID in IEs!\n");
1839 }
1840
1841 static void wl1271_op_bss_info_changed(struct ieee80211_hw *hw,
1842                                        struct ieee80211_vif *vif,
1843                                        struct ieee80211_bss_conf *bss_conf,
1844                                        u32 changed)
1845 {
1846         enum wl1271_cmd_ps_mode mode;
1847         struct wl1271 *wl = hw->priv;
1848         struct ieee80211_sta *sta = ieee80211_find_sta(vif, bss_conf->bssid);
1849         bool do_join = false;
1850         bool set_assoc = false;
1851         int ret;
1852
1853         wl1271_debug(DEBUG_MAC80211, "mac80211 bss info changed");
1854
1855         mutex_lock(&wl->mutex);
1856
1857         if (unlikely(wl->state == WL1271_STATE_OFF))
1858                 goto out;
1859
1860         ret = wl1271_ps_elp_wakeup(wl, false);
1861         if (ret < 0)
1862                 goto out;
1863
1864         if ((changed & BSS_CHANGED_BEACON_INT) &&
1865             (wl->bss_type == BSS_TYPE_IBSS)) {
1866                 wl1271_debug(DEBUG_ADHOC, "ad-hoc beacon interval updated: %d",
1867                         bss_conf->beacon_int);
1868
1869                 wl->beacon_int = bss_conf->beacon_int;
1870                 do_join = true;
1871         }
1872
1873         if ((changed & BSS_CHANGED_BEACON) &&
1874             (wl->bss_type == BSS_TYPE_IBSS)) {
1875                 struct sk_buff *beacon = ieee80211_beacon_get(hw, vif);
1876
1877                 wl1271_debug(DEBUG_ADHOC, "ad-hoc beacon updated");
1878
1879                 if (beacon) {
1880                         struct ieee80211_hdr *hdr;
1881                         int ieoffset = offsetof(struct ieee80211_mgmt,
1882                                                 u.beacon.variable);
1883
1884                         wl1271_ssid_set(wl, beacon, ieoffset);
1885
1886                         ret = wl1271_cmd_template_set(wl, CMD_TEMPL_BEACON,
1887                                                       beacon->data,
1888                                                       beacon->len, 0,
1889                                                       wl1271_min_rate_get(wl));
1890
1891                         if (ret < 0) {
1892                                 dev_kfree_skb(beacon);
1893                                 goto out_sleep;
1894                         }
1895
1896                         hdr = (struct ieee80211_hdr *) beacon->data;
1897                         hdr->frame_control = cpu_to_le16(
1898                                 IEEE80211_FTYPE_MGMT |
1899                                 IEEE80211_STYPE_PROBE_RESP);
1900
1901                         ret = wl1271_cmd_template_set(wl,
1902                                                       CMD_TEMPL_PROBE_RESPONSE,
1903                                                       beacon->data,
1904                                                       beacon->len, 0,
1905                                                       wl1271_min_rate_get(wl));
1906                         dev_kfree_skb(beacon);
1907                         if (ret < 0)
1908                                 goto out_sleep;
1909
1910                         /* Need to update the SSID (for filtering etc) */
1911                         do_join = true;
1912                 }
1913         }
1914
1915         if ((changed & BSS_CHANGED_BEACON_ENABLED) &&
1916             (wl->bss_type == BSS_TYPE_IBSS)) {
1917                 wl1271_debug(DEBUG_ADHOC, "ad-hoc beaconing: %s",
1918                              bss_conf->enable_beacon ? "enabled" : "disabled");
1919
1920                 if (bss_conf->enable_beacon)
1921                         wl->set_bss_type = BSS_TYPE_IBSS;
1922                 else
1923                         wl->set_bss_type = BSS_TYPE_STA_BSS;
1924                 do_join = true;
1925         }
1926
1927         if (changed & BSS_CHANGED_CQM) {
1928                 bool enable = false;
1929                 if (bss_conf->cqm_rssi_thold)
1930                         enable = true;
1931                 ret = wl1271_acx_rssi_snr_trigger(wl, enable,
1932                                                   bss_conf->cqm_rssi_thold,
1933                                                   bss_conf->cqm_rssi_hyst);
1934                 if (ret < 0)
1935                         goto out;
1936                 wl->rssi_thold = bss_conf->cqm_rssi_thold;
1937         }
1938
1939         if ((changed & BSS_CHANGED_BSSID) &&
1940             /*
1941              * Now we know the correct bssid, so we send a new join command
1942              * and enable the BSSID filter
1943              */
1944             memcmp(wl->bssid, bss_conf->bssid, ETH_ALEN)) {
1945                         memcpy(wl->bssid, bss_conf->bssid, ETH_ALEN);
1946
1947                         ret = wl1271_cmd_build_null_data(wl);
1948                         if (ret < 0)
1949                                 goto out_sleep;
1950
1951                         ret = wl1271_build_qos_null_data(wl);
1952                         if (ret < 0)
1953                                 goto out_sleep;
1954
1955                         /* filter out all packets not from this BSSID */
1956                         wl1271_configure_filters(wl, 0);
1957
1958                         /* Need to update the BSSID (for filtering etc) */
1959                         do_join = true;
1960         }
1961
1962         if (changed & BSS_CHANGED_ASSOC) {
1963                 if (bss_conf->assoc) {
1964                         u32 rates;
1965                         int ieoffset;
1966                         wl->aid = bss_conf->aid;
1967                         set_assoc = true;
1968
1969                         wl->ps_poll_failures = 0;
1970
1971                         /*
1972                          * use basic rates from AP, and determine lowest rate
1973                          * to use with control frames.
1974                          */
1975                         rates = bss_conf->basic_rates;
1976                         wl->basic_rate_set = wl1271_tx_enabled_rates_get(wl,
1977                                                                          rates);
1978                         wl->basic_rate = wl1271_min_rate_get(wl);
1979                         ret = wl1271_acx_rate_policies(wl);
1980                         if (ret < 0)
1981                                 goto out_sleep;
1982
1983                         /*
1984                          * with wl1271, we don't need to update the
1985                          * beacon_int and dtim_period, because the firmware
1986                          * updates it by itself when the first beacon is
1987                          * received after a join.
1988                          */
1989                         ret = wl1271_cmd_build_ps_poll(wl, wl->aid);
1990                         if (ret < 0)
1991                                 goto out_sleep;
1992
1993                         /*
1994                          * Get a template for hardware connection maintenance
1995                          */
1996                         dev_kfree_skb(wl->probereq);
1997                         wl->probereq = wl1271_cmd_build_ap_probe_req(wl, NULL);
1998                         ieoffset = offsetof(struct ieee80211_mgmt,
1999                                             u.probe_req.variable);
2000                         wl1271_ssid_set(wl, wl->probereq, ieoffset);
2001
2002                         /* enable the connection monitoring feature */
2003                         ret = wl1271_acx_conn_monit_params(wl, true);
2004                         if (ret < 0)
2005                                 goto out_sleep;
2006
2007                         /* If we want to go in PSM but we're not there yet */
2008                         if (test_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags) &&
2009                             !test_bit(WL1271_FLAG_PSM, &wl->flags)) {
2010                                 mode = STATION_POWER_SAVE_MODE;
2011                                 ret = wl1271_ps_set_mode(wl, mode,
2012                                                          wl->basic_rate,
2013                                                          true);
2014                                 if (ret < 0)
2015                                         goto out_sleep;
2016                         }
2017                 } else {
2018                         /* use defaults when not associated */
2019                         clear_bit(WL1271_FLAG_STA_STATE_SENT, &wl->flags);
2020                         clear_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags);
2021                         wl->aid = 0;
2022
2023                         /* free probe-request template */
2024                         dev_kfree_skb(wl->probereq);
2025                         wl->probereq = NULL;
2026
2027                         /* re-enable dynamic ps - just in case */
2028                         ieee80211_enable_dyn_ps(wl->vif);
2029
2030                         /* revert back to minimum rates for the current band */
2031                         wl1271_set_band_rate(wl);
2032                         wl->basic_rate = wl1271_min_rate_get(wl);
2033                         ret = wl1271_acx_rate_policies(wl);
2034                         if (ret < 0)
2035                                 goto out_sleep;
2036
2037                         /* disable connection monitor features */
2038                         ret = wl1271_acx_conn_monit_params(wl, false);
2039
2040                         /* Disable the keep-alive feature */
2041                         ret = wl1271_acx_keep_alive_mode(wl, false);
2042                         if (ret < 0)
2043                                 goto out_sleep;
2044
2045                         /* restore the bssid filter and go to dummy bssid */
2046                         wl1271_unjoin(wl);
2047                         wl1271_dummy_join(wl);
2048                 }
2049
2050         }
2051
2052         if (changed & BSS_CHANGED_ERP_SLOT) {
2053                 if (bss_conf->use_short_slot)
2054                         ret = wl1271_acx_slot(wl, SLOT_TIME_SHORT);
2055                 else
2056                         ret = wl1271_acx_slot(wl, SLOT_TIME_LONG);
2057                 if (ret < 0) {
2058                         wl1271_warning("Set slot time failed %d", ret);
2059                         goto out_sleep;
2060                 }
2061         }
2062
2063         if (changed & BSS_CHANGED_ERP_PREAMBLE) {
2064                 if (bss_conf->use_short_preamble)
2065                         wl1271_acx_set_preamble(wl, ACX_PREAMBLE_SHORT);
2066                 else
2067                         wl1271_acx_set_preamble(wl, ACX_PREAMBLE_LONG);
2068         }
2069
2070         if (changed & BSS_CHANGED_ERP_CTS_PROT) {
2071                 if (bss_conf->use_cts_prot)
2072                         ret = wl1271_acx_cts_protect(wl, CTSPROTECT_ENABLE);
2073                 else
2074                         ret = wl1271_acx_cts_protect(wl, CTSPROTECT_DISABLE);
2075                 if (ret < 0) {
2076                         wl1271_warning("Set ctsprotect failed %d", ret);
2077                         goto out_sleep;
2078                 }
2079         }
2080
2081         /*
2082          * Takes care of: New association with HT enable,
2083          *                HT information change in beacon.
2084          */
2085         if (sta &&
2086             (changed & BSS_CHANGED_HT) &&
2087             (bss_conf->channel_type != NL80211_CHAN_NO_HT)) {
2088                 ret = wl1271_acx_set_ht_capabilities(wl, &sta->ht_cap, true);
2089                 if (ret < 0) {
2090                         wl1271_warning("Set ht cap true failed %d", ret);
2091                         goto out_sleep;
2092                 }
2093                         ret = wl1271_acx_set_ht_information(wl,
2094                                 bss_conf->ht_operation_mode);
2095                 if (ret < 0) {
2096                         wl1271_warning("Set ht information failed %d", ret);
2097                         goto out_sleep;
2098                 }
2099         }
2100         /*
2101          * Takes care of: New association without HT,
2102          *                Disassociation.
2103          */
2104         else if (sta && (changed & BSS_CHANGED_ASSOC)) {
2105                 ret = wl1271_acx_set_ht_capabilities(wl, &sta->ht_cap, false);
2106                 if (ret < 0) {
2107                         wl1271_warning("Set ht cap false failed %d", ret);
2108                         goto out_sleep;
2109                 }
2110         }
2111
2112         if (changed & BSS_CHANGED_ARP_FILTER) {
2113                 __be32 addr = bss_conf->arp_addr_list[0];
2114                 WARN_ON(wl->bss_type != BSS_TYPE_STA_BSS);
2115
2116                 if (bss_conf->arp_addr_cnt == 1 &&
2117                     bss_conf->arp_filter_enabled) {
2118                         /*
2119                          * The template should have been configured only upon
2120                          * association. however, it seems that the correct ip
2121                          * isn't being set (when sending), so we have to
2122                          * reconfigure the template upon every ip change.
2123                          */
2124                         ret = wl1271_cmd_build_arp_rsp(wl, addr);
2125                         if (ret < 0) {
2126                                 wl1271_warning("build arp rsp failed: %d", ret);
2127                                 goto out_sleep;
2128                         }
2129
2130                         ret = wl1271_acx_arp_ip_filter(wl,
2131                                 (ACX_ARP_FILTER_ARP_FILTERING |
2132                                  ACX_ARP_FILTER_AUTO_ARP),
2133                                 addr);
2134                 } else
2135                         ret = wl1271_acx_arp_ip_filter(wl, 0, addr);
2136
2137                 if (ret < 0)
2138                         goto out_sleep;
2139         }
2140
2141         if (do_join) {
2142                 ret = wl1271_join(wl, set_assoc);
2143                 if (ret < 0) {
2144                         wl1271_warning("cmd join failed %d", ret);
2145                         goto out_sleep;
2146                 }
2147         }
2148
2149 out_sleep:
2150         wl1271_ps_elp_sleep(wl);
2151
2152 out:
2153         mutex_unlock(&wl->mutex);
2154 }
2155
2156 static int wl1271_op_conf_tx(struct ieee80211_hw *hw, u16 queue,
2157                              const struct ieee80211_tx_queue_params *params)
2158 {
2159         struct wl1271 *wl = hw->priv;
2160         u8 ps_scheme;
2161         int ret;
2162
2163         mutex_lock(&wl->mutex);
2164
2165         wl1271_debug(DEBUG_MAC80211, "mac80211 conf tx %d", queue);
2166
2167         if (unlikely(wl->state == WL1271_STATE_OFF)) {
2168                 ret = -EAGAIN;
2169                 goto out;
2170         }
2171
2172         ret = wl1271_ps_elp_wakeup(wl, false);
2173         if (ret < 0)
2174                 goto out;
2175
2176         /* the txop is confed in units of 32us by the mac80211, we need us */
2177         ret = wl1271_acx_ac_cfg(wl, wl1271_tx_get_queue(queue),
2178                                 params->cw_min, params->cw_max,
2179                                 params->aifs, params->txop << 5);
2180         if (ret < 0)
2181                 goto out_sleep;
2182
2183         if (params->uapsd)
2184                 ps_scheme = CONF_PS_SCHEME_UPSD_TRIGGER;
2185         else
2186                 ps_scheme = CONF_PS_SCHEME_LEGACY;
2187
2188         ret = wl1271_acx_tid_cfg(wl, wl1271_tx_get_queue(queue),
2189                                  CONF_CHANNEL_TYPE_EDCF,
2190                                  wl1271_tx_get_queue(queue),
2191                                  ps_scheme, CONF_ACK_POLICY_LEGACY, 0, 0);
2192         if (ret < 0)
2193                 goto out_sleep;
2194
2195 out_sleep:
2196         wl1271_ps_elp_sleep(wl);
2197
2198 out:
2199         mutex_unlock(&wl->mutex);
2200
2201         return ret;
2202 }
2203
2204 static u64 wl1271_op_get_tsf(struct ieee80211_hw *hw)
2205 {
2206
2207         struct wl1271 *wl = hw->priv;
2208         u64 mactime = ULLONG_MAX;
2209         int ret;
2210
2211         wl1271_debug(DEBUG_MAC80211, "mac80211 get tsf");
2212
2213         mutex_lock(&wl->mutex);
2214
2215         if (unlikely(wl->state == WL1271_STATE_OFF))
2216                 goto out;
2217
2218         ret = wl1271_ps_elp_wakeup(wl, false);
2219         if (ret < 0)
2220                 goto out;
2221
2222         ret = wl1271_acx_tsf_info(wl, &mactime);
2223         if (ret < 0)
2224                 goto out_sleep;
2225
2226 out_sleep:
2227         wl1271_ps_elp_sleep(wl);
2228
2229 out:
2230         mutex_unlock(&wl->mutex);
2231         return mactime;
2232 }
2233
2234 static int wl1271_op_get_survey(struct ieee80211_hw *hw, int idx,
2235                                 struct survey_info *survey)
2236 {
2237         struct wl1271 *wl = hw->priv;
2238         struct ieee80211_conf *conf = &hw->conf;
2239
2240         if (idx != 0)
2241                 return -ENOENT;
2242
2243         survey->channel = conf->channel;
2244         survey->filled = SURVEY_INFO_NOISE_DBM;
2245         survey->noise = wl->noise;
2246
2247         return 0;
2248 }
2249
2250 /* can't be const, mac80211 writes to this */
2251 static struct ieee80211_rate wl1271_rates[] = {
2252         { .bitrate = 10,
2253           .hw_value = CONF_HW_BIT_RATE_1MBPS,
2254           .hw_value_short = CONF_HW_BIT_RATE_1MBPS, },
2255         { .bitrate = 20,
2256           .hw_value = CONF_HW_BIT_RATE_2MBPS,
2257           .hw_value_short = CONF_HW_BIT_RATE_2MBPS,
2258           .flags = IEEE80211_RATE_SHORT_PREAMBLE },
2259         { .bitrate = 55,
2260           .hw_value = CONF_HW_BIT_RATE_5_5MBPS,
2261           .hw_value_short = CONF_HW_BIT_RATE_5_5MBPS,
2262           .flags = IEEE80211_RATE_SHORT_PREAMBLE },
2263         { .bitrate = 110,
2264           .hw_value = CONF_HW_BIT_RATE_11MBPS,
2265           .hw_value_short = CONF_HW_BIT_RATE_11MBPS,
2266           .flags = IEEE80211_RATE_SHORT_PREAMBLE },
2267         { .bitrate = 60,
2268           .hw_value = CONF_HW_BIT_RATE_6MBPS,
2269           .hw_value_short = CONF_HW_BIT_RATE_6MBPS, },
2270         { .bitrate = 90,
2271           .hw_value = CONF_HW_BIT_RATE_9MBPS,
2272           .hw_value_short = CONF_HW_BIT_RATE_9MBPS, },
2273         { .bitrate = 120,
2274           .hw_value = CONF_HW_BIT_RATE_12MBPS,
2275           .hw_value_short = CONF_HW_BIT_RATE_12MBPS, },
2276         { .bitrate = 180,
2277           .hw_value = CONF_HW_BIT_RATE_18MBPS,
2278           .hw_value_short = CONF_HW_BIT_RATE_18MBPS, },
2279         { .bitrate = 240,
2280           .hw_value = CONF_HW_BIT_RATE_24MBPS,
2281           .hw_value_short = CONF_HW_BIT_RATE_24MBPS, },
2282         { .bitrate = 360,
2283          .hw_value = CONF_HW_BIT_RATE_36MBPS,
2284          .hw_value_short = CONF_HW_BIT_RATE_36MBPS, },
2285         { .bitrate = 480,
2286           .hw_value = CONF_HW_BIT_RATE_48MBPS,
2287           .hw_value_short = CONF_HW_BIT_RATE_48MBPS, },
2288         { .bitrate = 540,
2289           .hw_value = CONF_HW_BIT_RATE_54MBPS,
2290           .hw_value_short = CONF_HW_BIT_RATE_54MBPS, },
2291 };
2292
2293 /* can't be const, mac80211 writes to this */
2294 static struct ieee80211_channel wl1271_channels[] = {
2295         { .hw_value = 1, .center_freq = 2412, .max_power = 25 },
2296         { .hw_value = 2, .center_freq = 2417, .max_power = 25 },
2297         { .hw_value = 3, .center_freq = 2422, .max_power = 25 },
2298         { .hw_value = 4, .center_freq = 2427, .max_power = 25 },
2299         { .hw_value = 5, .center_freq = 2432, .max_power = 25 },
2300         { .hw_value = 6, .center_freq = 2437, .max_power = 25 },
2301         { .hw_value = 7, .center_freq = 2442, .max_power = 25 },
2302         { .hw_value = 8, .center_freq = 2447, .max_power = 25 },
2303         { .hw_value = 9, .center_freq = 2452, .max_power = 25 },
2304         { .hw_value = 10, .center_freq = 2457, .max_power = 25 },
2305         { .hw_value = 11, .center_freq = 2462, .max_power = 25 },
2306         { .hw_value = 12, .center_freq = 2467, .max_power = 25 },
2307         { .hw_value = 13, .center_freq = 2472, .max_power = 25 },
2308 };
2309
2310 /* mapping to indexes for wl1271_rates */
2311 static const u8 wl1271_rate_to_idx_2ghz[] = {
2312         /* MCS rates are used only with 11n */
2313         7,                            /* CONF_HW_RXTX_RATE_MCS7 */
2314         6,                            /* CONF_HW_RXTX_RATE_MCS6 */
2315         5,                            /* CONF_HW_RXTX_RATE_MCS5 */
2316         4,                            /* CONF_HW_RXTX_RATE_MCS4 */
2317         3,                            /* CONF_HW_RXTX_RATE_MCS3 */
2318         2,                            /* CONF_HW_RXTX_RATE_MCS2 */
2319         1,                            /* CONF_HW_RXTX_RATE_MCS1 */
2320         0,                            /* CONF_HW_RXTX_RATE_MCS0 */
2321
2322         11,                            /* CONF_HW_RXTX_RATE_54   */
2323         10,                            /* CONF_HW_RXTX_RATE_48   */
2324         9,                             /* CONF_HW_RXTX_RATE_36   */
2325         8,                             /* CONF_HW_RXTX_RATE_24   */
2326
2327         /* TI-specific rate */
2328         CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_22   */
2329
2330         7,                             /* CONF_HW_RXTX_RATE_18   */
2331         6,                             /* CONF_HW_RXTX_RATE_12   */
2332         3,                             /* CONF_HW_RXTX_RATE_11   */
2333         5,                             /* CONF_HW_RXTX_RATE_9    */
2334         4,                             /* CONF_HW_RXTX_RATE_6    */
2335         2,                             /* CONF_HW_RXTX_RATE_5_5  */
2336         1,                             /* CONF_HW_RXTX_RATE_2    */
2337         0                              /* CONF_HW_RXTX_RATE_1    */
2338 };
2339
2340 /* 11n STA capabilities */
2341 #define HW_RX_HIGHEST_RATE      72
2342
2343 #ifdef CONFIG_WL12XX_HT
2344 #define WL12XX_HT_CAP { \
2345         .cap = IEEE80211_HT_CAP_GRN_FLD | IEEE80211_HT_CAP_SGI_20, \
2346         .ht_supported = true, \
2347         .ampdu_factor = IEEE80211_HT_MAX_AMPDU_8K, \
2348         .ampdu_density = IEEE80211_HT_MPDU_DENSITY_8, \
2349         .mcs = { \
2350                 .rx_mask = { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, \
2351                 .rx_highest = cpu_to_le16(HW_RX_HIGHEST_RATE), \
2352                 .tx_params = IEEE80211_HT_MCS_TX_DEFINED, \
2353                 }, \
2354 }
2355 #else
2356 #define WL12XX_HT_CAP { \
2357         .ht_supported = false, \
2358 }
2359 #endif
2360
2361 /* can't be const, mac80211 writes to this */
2362 static struct ieee80211_supported_band wl1271_band_2ghz = {
2363         .channels = wl1271_channels,
2364         .n_channels = ARRAY_SIZE(wl1271_channels),
2365         .bitrates = wl1271_rates,
2366         .n_bitrates = ARRAY_SIZE(wl1271_rates),
2367         .ht_cap = WL12XX_HT_CAP,
2368 };
2369
2370 /* 5 GHz data rates for WL1273 */
2371 static struct ieee80211_rate wl1271_rates_5ghz[] = {
2372         { .bitrate = 60,
2373           .hw_value = CONF_HW_BIT_RATE_6MBPS,
2374           .hw_value_short = CONF_HW_BIT_RATE_6MBPS, },
2375         { .bitrate = 90,
2376           .hw_value = CONF_HW_BIT_RATE_9MBPS,
2377           .hw_value_short = CONF_HW_BIT_RATE_9MBPS, },
2378         { .bitrate = 120,
2379           .hw_value = CONF_HW_BIT_RATE_12MBPS,
2380           .hw_value_short = CONF_HW_BIT_RATE_12MBPS, },
2381         { .bitrate = 180,
2382           .hw_value = CONF_HW_BIT_RATE_18MBPS,
2383           .hw_value_short = CONF_HW_BIT_RATE_18MBPS, },
2384         { .bitrate = 240,
2385           .hw_value = CONF_HW_BIT_RATE_24MBPS,
2386           .hw_value_short = CONF_HW_BIT_RATE_24MBPS, },
2387         { .bitrate = 360,
2388          .hw_value = CONF_HW_BIT_RATE_36MBPS,
2389          .hw_value_short = CONF_HW_BIT_RATE_36MBPS, },
2390         { .bitrate = 480,
2391           .hw_value = CONF_HW_BIT_RATE_48MBPS,
2392           .hw_value_short = CONF_HW_BIT_RATE_48MBPS, },
2393         { .bitrate = 540,
2394           .hw_value = CONF_HW_BIT_RATE_54MBPS,
2395           .hw_value_short = CONF_HW_BIT_RATE_54MBPS, },
2396 };
2397
2398 /* 5 GHz band channels for WL1273 */
2399 static struct ieee80211_channel wl1271_channels_5ghz[] = {
2400         { .hw_value = 7, .center_freq = 5035},
2401         { .hw_value = 8, .center_freq = 5040},
2402         { .hw_value = 9, .center_freq = 5045},
2403         { .hw_value = 11, .center_freq = 5055},
2404         { .hw_value = 12, .center_freq = 5060},
2405         { .hw_value = 16, .center_freq = 5080},
2406         { .hw_value = 34, .center_freq = 5170},
2407         { .hw_value = 36, .center_freq = 5180},
2408         { .hw_value = 38, .center_freq = 5190},
2409         { .hw_value = 40, .center_freq = 5200},
2410         { .hw_value = 42, .center_freq = 5210},
2411         { .hw_value = 44, .center_freq = 5220},
2412         { .hw_value = 46, .center_freq = 5230},
2413         { .hw_value = 48, .center_freq = 5240},
2414         { .hw_value = 52, .center_freq = 5260},
2415         { .hw_value = 56, .center_freq = 5280},
2416         { .hw_value = 60, .center_freq = 5300},
2417         { .hw_value = 64, .center_freq = 5320},
2418         { .hw_value = 100, .center_freq = 5500},
2419         { .hw_value = 104, .center_freq = 5520},
2420         { .hw_value = 108, .center_freq = 5540},
2421         { .hw_value = 112, .center_freq = 5560},
2422         { .hw_value = 116, .center_freq = 5580},
2423         { .hw_value = 120, .center_freq = 5600},
2424         { .hw_value = 124, .center_freq = 5620},
2425         { .hw_value = 128, .center_freq = 5640},
2426         { .hw_value = 132, .center_freq = 5660},
2427         { .hw_value = 136, .center_freq = 5680},
2428         { .hw_value = 140, .center_freq = 5700},
2429         { .hw_value = 149, .center_freq = 5745},
2430         { .hw_value = 153, .center_freq = 5765},
2431         { .hw_value = 157, .center_freq = 5785},
2432         { .hw_value = 161, .center_freq = 5805},
2433         { .hw_value = 165, .center_freq = 5825},
2434 };
2435
2436 /* mapping to indexes for wl1271_rates_5ghz */
2437 static const u8 wl1271_rate_to_idx_5ghz[] = {
2438         /* MCS rates are used only with 11n */
2439         7,                            /* CONF_HW_RXTX_RATE_MCS7 */
2440         6,                            /* CONF_HW_RXTX_RATE_MCS6 */
2441         5,                            /* CONF_HW_RXTX_RATE_MCS5 */
2442         4,                            /* CONF_HW_RXTX_RATE_MCS4 */
2443         3,                            /* CONF_HW_RXTX_RATE_MCS3 */
2444         2,                            /* CONF_HW_RXTX_RATE_MCS2 */
2445         1,                            /* CONF_HW_RXTX_RATE_MCS1 */
2446         0,                            /* CONF_HW_RXTX_RATE_MCS0 */
2447
2448         7,                             /* CONF_HW_RXTX_RATE_54   */
2449         6,                             /* CONF_HW_RXTX_RATE_48   */
2450         5,                             /* CONF_HW_RXTX_RATE_36   */
2451         4,                             /* CONF_HW_RXTX_RATE_24   */
2452
2453         /* TI-specific rate */
2454         CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_22   */
2455
2456         3,                             /* CONF_HW_RXTX_RATE_18   */
2457         2,                             /* CONF_HW_RXTX_RATE_12   */
2458         CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_11   */
2459         1,                             /* CONF_HW_RXTX_RATE_9    */
2460         0,                             /* CONF_HW_RXTX_RATE_6    */
2461         CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_5_5  */
2462         CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_2    */
2463         CONF_HW_RXTX_RATE_UNSUPPORTED  /* CONF_HW_RXTX_RATE_1    */
2464 };
2465
2466 static struct ieee80211_supported_band wl1271_band_5ghz = {
2467         .channels = wl1271_channels_5ghz,
2468         .n_channels = ARRAY_SIZE(wl1271_channels_5ghz),
2469         .bitrates = wl1271_rates_5ghz,
2470         .n_bitrates = ARRAY_SIZE(wl1271_rates_5ghz),
2471         .ht_cap = WL12XX_HT_CAP,
2472 };
2473
2474 static const u8 *wl1271_band_rate_to_idx[] = {
2475         [IEEE80211_BAND_2GHZ] = wl1271_rate_to_idx_2ghz,
2476         [IEEE80211_BAND_5GHZ] = wl1271_rate_to_idx_5ghz
2477 };
2478
2479 static const struct ieee80211_ops wl1271_ops = {
2480         .start = wl1271_op_start,
2481         .stop = wl1271_op_stop,
2482         .add_interface = wl1271_op_add_interface,
2483         .remove_interface = wl1271_op_remove_interface,
2484         .config = wl1271_op_config,
2485         .prepare_multicast = wl1271_op_prepare_multicast,
2486         .configure_filter = wl1271_op_configure_filter,
2487         .tx = wl1271_op_tx,
2488         .set_key = wl1271_op_set_key,
2489         .hw_scan = wl1271_op_hw_scan,
2490         .bss_info_changed = wl1271_op_bss_info_changed,
2491         .set_frag_threshold = wl1271_op_set_frag_threshold,
2492         .set_rts_threshold = wl1271_op_set_rts_threshold,
2493         .conf_tx = wl1271_op_conf_tx,
2494         .get_tsf = wl1271_op_get_tsf,
2495         .get_survey = wl1271_op_get_survey,
2496         CFG80211_TESTMODE_CMD(wl1271_tm_cmd)
2497 };
2498
2499
2500 u8 wl1271_rate_to_idx(int rate, enum ieee80211_band band)
2501 {
2502         u8 idx;
2503
2504         BUG_ON(band >= sizeof(wl1271_band_rate_to_idx)/sizeof(u8 *));
2505
2506         if (unlikely(rate >= CONF_HW_RXTX_RATE_MAX)) {
2507                 wl1271_error("Illegal RX rate from HW: %d", rate);
2508                 return 0;
2509         }
2510
2511         idx = wl1271_band_rate_to_idx[band][rate];
2512         if (unlikely(idx == CONF_HW_RXTX_RATE_UNSUPPORTED)) {
2513                 wl1271_error("Unsupported RX rate from HW: %d", rate);
2514                 return 0;
2515         }
2516
2517         return idx;
2518 }
2519
2520 static ssize_t wl1271_sysfs_show_bt_coex_state(struct device *dev,
2521                                                struct device_attribute *attr,
2522                                                char *buf)
2523 {
2524         struct wl1271 *wl = dev_get_drvdata(dev);
2525         ssize_t len;
2526
2527         len = PAGE_SIZE;
2528
2529         mutex_lock(&wl->mutex);
2530         len = snprintf(buf, len, "%d\n\n0 - off\n1 - on\n",
2531                        wl->sg_enabled);
2532         mutex_unlock(&wl->mutex);
2533
2534         return len;
2535
2536 }
2537
2538 static ssize_t wl1271_sysfs_store_bt_coex_state(struct device *dev,
2539                                                 struct device_attribute *attr,
2540                                                 const char *buf, size_t count)
2541 {
2542         struct wl1271 *wl = dev_get_drvdata(dev);
2543         unsigned long res;
2544         int ret;
2545
2546         ret = strict_strtoul(buf, 10, &res);
2547
2548         if (ret < 0) {
2549                 wl1271_warning("incorrect value written to bt_coex_mode");
2550                 return count;
2551         }
2552
2553         mutex_lock(&wl->mutex);
2554
2555         res = !!res;
2556
2557         if (res == wl->sg_enabled)
2558                 goto out;
2559
2560         wl->sg_enabled = res;
2561
2562         if (wl->state == WL1271_STATE_OFF)
2563                 goto out;
2564
2565         ret = wl1271_ps_elp_wakeup(wl, false);
2566         if (ret < 0)
2567                 goto out;
2568
2569         wl1271_acx_sg_enable(wl, wl->sg_enabled);
2570         wl1271_ps_elp_sleep(wl);
2571
2572  out:
2573         mutex_unlock(&wl->mutex);
2574         return count;
2575 }
2576
2577 static DEVICE_ATTR(bt_coex_state, S_IRUGO | S_IWUSR,
2578                    wl1271_sysfs_show_bt_coex_state,
2579                    wl1271_sysfs_store_bt_coex_state);
2580
2581 static ssize_t wl1271_sysfs_show_hw_pg_ver(struct device *dev,
2582                                            struct device_attribute *attr,
2583                                            char *buf)
2584 {
2585         struct wl1271 *wl = dev_get_drvdata(dev);
2586         ssize_t len;
2587
2588         len = PAGE_SIZE;
2589
2590         mutex_lock(&wl->mutex);
2591         if (wl->hw_pg_ver >= 0)
2592                 len = snprintf(buf, len, "%d\n", wl->hw_pg_ver);
2593         else
2594                 len = snprintf(buf, len, "n/a\n");
2595         mutex_unlock(&wl->mutex);
2596
2597         return len;
2598 }
2599
2600 static DEVICE_ATTR(hw_pg_ver, S_IRUGO | S_IWUSR,
2601                    wl1271_sysfs_show_hw_pg_ver, NULL);
2602
2603 int wl1271_register_hw(struct wl1271 *wl)
2604 {
2605         int ret;
2606
2607         if (wl->mac80211_registered)
2608                 return 0;
2609
2610         SET_IEEE80211_PERM_ADDR(wl->hw, wl->mac_addr);
2611
2612         ret = ieee80211_register_hw(wl->hw);
2613         if (ret < 0) {
2614                 wl1271_error("unable to register mac80211 hw: %d", ret);
2615                 return ret;
2616         }
2617
2618         wl->mac80211_registered = true;
2619
2620         wl1271_debugfs_init(wl);
2621
2622         register_netdevice_notifier(&wl1271_dev_notifier);
2623
2624         wl1271_notice("loaded");
2625
2626         return 0;
2627 }
2628 EXPORT_SYMBOL_GPL(wl1271_register_hw);
2629
2630 void wl1271_unregister_hw(struct wl1271 *wl)
2631 {
2632         unregister_netdevice_notifier(&wl1271_dev_notifier);
2633         ieee80211_unregister_hw(wl->hw);
2634         wl->mac80211_registered = false;
2635
2636 }
2637 EXPORT_SYMBOL_GPL(wl1271_unregister_hw);
2638
2639 int wl1271_init_ieee80211(struct wl1271 *wl)
2640 {
2641         static const u32 cipher_suites[] = {
2642                 WLAN_CIPHER_SUITE_WEP40,
2643                 WLAN_CIPHER_SUITE_WEP104,
2644                 WLAN_CIPHER_SUITE_TKIP,
2645                 WLAN_CIPHER_SUITE_CCMP,
2646                 WL1271_CIPHER_SUITE_GEM,
2647         };
2648
2649         /* The tx descriptor buffer and the TKIP space. */
2650         wl->hw->extra_tx_headroom = WL1271_TKIP_IV_SPACE +
2651                 sizeof(struct wl1271_tx_hw_descr);
2652
2653         /* unit us */
2654         /* FIXME: find a proper value */
2655         wl->hw->channel_change_time = 10000;
2656         wl->hw->max_listen_interval = wl->conf.conn.max_listen_interval;
2657
2658         wl->hw->flags = IEEE80211_HW_SIGNAL_DBM |
2659                 IEEE80211_HW_BEACON_FILTER |
2660                 IEEE80211_HW_SUPPORTS_PS |
2661                 IEEE80211_HW_SUPPORTS_UAPSD |
2662                 IEEE80211_HW_HAS_RATE_CONTROL |
2663                 IEEE80211_HW_CONNECTION_MONITOR |
2664                 IEEE80211_HW_SUPPORTS_CQM_RSSI;
2665
2666         wl->hw->wiphy->cipher_suites = cipher_suites;
2667         wl->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
2668
2669         wl->hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
2670                 BIT(NL80211_IFTYPE_ADHOC);
2671         wl->hw->wiphy->max_scan_ssids = 1;
2672         /*
2673          * Maximum length of elements in scanning probe request templates
2674          * should be the maximum length possible for a template, without
2675          * the IEEE80211 header of the template
2676          */
2677         wl->hw->wiphy->max_scan_ie_len = WL1271_CMD_TEMPL_MAX_SIZE -
2678                         sizeof(struct ieee80211_header);
2679         wl->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = &wl1271_band_2ghz;
2680         wl->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = &wl1271_band_5ghz;
2681
2682         wl->hw->queues = 4;
2683         wl->hw->max_rates = 1;
2684
2685         wl->hw->wiphy->reg_notifier = wl1271_reg_notify;
2686
2687         SET_IEEE80211_DEV(wl->hw, wl1271_wl_to_dev(wl));
2688
2689         return 0;
2690 }
2691 EXPORT_SYMBOL_GPL(wl1271_init_ieee80211);
2692
2693 #define WL1271_DEFAULT_CHANNEL 0
2694
2695 struct ieee80211_hw *wl1271_alloc_hw(void)
2696 {
2697         struct ieee80211_hw *hw;
2698         struct platform_device *plat_dev = NULL;
2699         struct wl1271 *wl;
2700         int i, ret;
2701         unsigned int order;
2702
2703         hw = ieee80211_alloc_hw(sizeof(*wl), &wl1271_ops);
2704         if (!hw) {
2705                 wl1271_error("could not alloc ieee80211_hw");
2706                 ret = -ENOMEM;
2707                 goto err_hw_alloc;
2708         }
2709
2710         plat_dev = kmemdup(&wl1271_device, sizeof(wl1271_device), GFP_KERNEL);
2711         if (!plat_dev) {
2712                 wl1271_error("could not allocate platform_device");
2713                 ret = -ENOMEM;
2714                 goto err_plat_alloc;
2715         }
2716
2717         wl = hw->priv;
2718         memset(wl, 0, sizeof(*wl));
2719
2720         INIT_LIST_HEAD(&wl->list);
2721
2722         wl->hw = hw;
2723         wl->plat_dev = plat_dev;
2724
2725         for (i = 0; i < NUM_TX_QUEUES; i++)
2726                 skb_queue_head_init(&wl->tx_queue[i]);
2727
2728         INIT_DELAYED_WORK(&wl->elp_work, wl1271_elp_work);
2729         INIT_DELAYED_WORK(&wl->pspoll_work, wl1271_pspoll_work);
2730         INIT_WORK(&wl->irq_work, wl1271_irq_work);
2731         INIT_WORK(&wl->tx_work, wl1271_tx_work);
2732         INIT_WORK(&wl->recovery_work, wl1271_recovery_work);
2733         INIT_DELAYED_WORK(&wl->scan_complete_work, wl1271_scan_complete_work);
2734         wl->channel = WL1271_DEFAULT_CHANNEL;
2735         wl->beacon_int = WL1271_DEFAULT_BEACON_INT;
2736         wl->default_key = 0;
2737         wl->rx_counter = 0;
2738         wl->rx_config = WL1271_DEFAULT_RX_CONFIG;
2739         wl->rx_filter = WL1271_DEFAULT_RX_FILTER;
2740         wl->psm_entry_retry = 0;
2741         wl->power_level = WL1271_DEFAULT_POWER_LEVEL;
2742         wl->basic_rate_set = CONF_TX_RATE_MASK_BASIC;
2743         wl->basic_rate = CONF_TX_RATE_MASK_BASIC;
2744         wl->rate_set = CONF_TX_RATE_MASK_BASIC;
2745         wl->sta_rate_set = 0;
2746         wl->band = IEEE80211_BAND_2GHZ;
2747         wl->vif = NULL;
2748         wl->flags = 0;
2749         wl->sg_enabled = true;
2750         wl->hw_pg_ver = -1;
2751
2752         memset(wl->tx_frames_map, 0, sizeof(wl->tx_frames_map));
2753         for (i = 0; i < ACX_TX_DESCRIPTORS; i++)
2754                 wl->tx_frames[i] = NULL;
2755
2756         spin_lock_init(&wl->wl_lock);
2757
2758         wl->state = WL1271_STATE_OFF;
2759         mutex_init(&wl->mutex);
2760
2761         /* Apply default driver configuration. */
2762         wl1271_conf_init(wl);
2763
2764         order = get_order(WL1271_AGGR_BUFFER_SIZE);
2765         wl->aggr_buf = (u8 *)__get_free_pages(GFP_KERNEL, order);
2766         if (!wl->aggr_buf) {
2767                 ret = -ENOMEM;
2768                 goto err_hw;
2769         }
2770
2771         /* Register platform device */
2772         ret = platform_device_register(wl->plat_dev);
2773         if (ret) {
2774                 wl1271_error("couldn't register platform device");
2775                 goto err_aggr;
2776         }
2777         dev_set_drvdata(&wl->plat_dev->dev, wl);
2778
2779         /* Create sysfs file to control bt coex state */
2780         ret = device_create_file(&wl->plat_dev->dev, &dev_attr_bt_coex_state);
2781         if (ret < 0) {
2782                 wl1271_error("failed to create sysfs file bt_coex_state");
2783                 goto err_platform;
2784         }
2785
2786         /* Create sysfs file to get HW PG version */
2787         ret = device_create_file(&wl->plat_dev->dev, &dev_attr_hw_pg_ver);
2788         if (ret < 0) {
2789                 wl1271_error("failed to create sysfs file hw_pg_ver");
2790                 goto err_bt_coex_state;
2791         }
2792
2793         return hw;
2794
2795 err_bt_coex_state:
2796         device_remove_file(&wl->plat_dev->dev, &dev_attr_bt_coex_state);
2797
2798 err_platform:
2799         platform_device_unregister(wl->plat_dev);
2800
2801 err_aggr:
2802         free_pages((unsigned long)wl->aggr_buf, order);
2803
2804 err_hw:
2805         wl1271_debugfs_exit(wl);
2806         kfree(plat_dev);
2807
2808 err_plat_alloc:
2809         ieee80211_free_hw(hw);
2810
2811 err_hw_alloc:
2812
2813         return ERR_PTR(ret);
2814 }
2815 EXPORT_SYMBOL_GPL(wl1271_alloc_hw);
2816
2817 int wl1271_free_hw(struct wl1271 *wl)
2818 {
2819         platform_device_unregister(wl->plat_dev);
2820         free_pages((unsigned long)wl->aggr_buf,
2821                         get_order(WL1271_AGGR_BUFFER_SIZE));
2822         kfree(wl->plat_dev);
2823
2824         wl1271_debugfs_exit(wl);
2825
2826         vfree(wl->fw);
2827         wl->fw = NULL;
2828         kfree(wl->nvs);
2829         wl->nvs = NULL;
2830
2831         kfree(wl->fw_status);
2832         kfree(wl->tx_res_if);
2833
2834         ieee80211_free_hw(wl->hw);
2835
2836         return 0;
2837 }
2838 EXPORT_SYMBOL_GPL(wl1271_free_hw);
2839
2840 u32 wl12xx_debug_level;
2841 EXPORT_SYMBOL_GPL(wl12xx_debug_level);
2842 module_param_named(debug_level, wl12xx_debug_level, uint, DEBUG_NONE);
2843 MODULE_PARM_DESC(debug_level, "wl12xx debugging level");
2844
2845 MODULE_LICENSE("GPL");
2846 MODULE_AUTHOR("Luciano Coelho <luciano.coelho@nokia.com>");
2847 MODULE_AUTHOR("Juuso Oikarinen <juuso.oikarinen@nokia.com>");