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