]> bbs.cooldavid.org Git - net-next-2.6.git/blame - drivers/net/wireless/wl12xx/wl1271_main.c
wl1271: Fix event acknowledging functionality
[net-next-2.6.git] / drivers / net / wireless / wl12xx / wl1271_main.c
CommitLineData
f5fc0f86
LC
1/*
2 * This file is part of wl1271
3 *
4 * Copyright (C) 2008-2009 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/platform_device.h>
26#include <linux/interrupt.h>
27#include <linux/firmware.h>
28#include <linux/delay.h>
29#include <linux/irq.h>
30#include <linux/spi/spi.h>
31#include <linux/crc32.h>
32#include <linux/etherdevice.h>
1fba4974 33#include <linux/vmalloc.h>
f5fc0f86 34#include <linux/spi/wl12xx.h>
01c09162 35#include <linux/inetdevice.h>
f5fc0f86
LC
36
37#include "wl1271.h"
38#include "wl12xx_80211.h"
39#include "wl1271_reg.h"
40#include "wl1271_spi.h"
41#include "wl1271_event.h"
42#include "wl1271_tx.h"
43#include "wl1271_rx.h"
44#include "wl1271_ps.h"
45#include "wl1271_init.h"
46#include "wl1271_debugfs.h"
47#include "wl1271_cmd.h"
48#include "wl1271_boot.h"
49
8a08048a
JO
50static struct conf_drv_settings default_conf = {
51 .sg = {
52 .per_threshold = 7500,
53 .max_scan_compensation_time = 120000,
54 .nfs_sample_interval = 400,
55 .load_ratio = 50,
56 .auto_ps_mode = 0,
57 .probe_req_compensation = 170,
58 .scan_window_compensation = 50,
59 .antenna_config = 0,
60 .beacon_miss_threshold = 60,
61 .rate_adaptation_threshold = CONF_HW_BIT_RATE_12MBPS,
62 .rate_adaptation_snr = 0
63 },
64 .rx = {
65 .rx_msdu_life_time = 512000,
66 .packet_detection_threshold = 0,
67 .ps_poll_timeout = 15,
68 .upsd_timeout = 15,
69 .rts_threshold = 2347,
3ed8f2c6
LC
70 .rx_cca_threshold = 0,
71 .irq_blk_threshold = 0xFFFF,
72 .irq_pkt_threshold = 0,
73 .irq_timeout = 600,
8a08048a
JO
74 .queue_type = CONF_RX_QUEUE_TYPE_LOW_PRIORITY,
75 },
76 .tx = {
77 .tx_energy_detection = 0,
78 .rc_conf = {
79 .enabled_rates = CONF_TX_RATE_MASK_UNSPECIFIED,
80 .short_retry_limit = 10,
81 .long_retry_limit = 10,
82 .aflags = 0
45b531a8 83 },
8a08048a
JO
84 .ac_conf_count = 4,
85 .ac_conf = {
86 [0] = {
87 .ac = CONF_TX_AC_BE,
88 .cw_min = 15,
89 .cw_max = 63,
90 .aifsn = 3,
91 .tx_op_limit = 0,
45b531a8 92 },
8a08048a
JO
93 [1] = {
94 .ac = CONF_TX_AC_BK,
95 .cw_min = 15,
96 .cw_max = 63,
97 .aifsn = 7,
98 .tx_op_limit = 0,
45b531a8 99 },
8a08048a
JO
100 [2] = {
101 .ac = CONF_TX_AC_VI,
102 .cw_min = 15,
103 .cw_max = 63,
104 .aifsn = CONF_TX_AIFS_PIFS,
105 .tx_op_limit = 3008,
106 },
107 [3] = {
108 .ac = CONF_TX_AC_VO,
109 .cw_min = 15,
110 .cw_max = 63,
111 .aifsn = CONF_TX_AIFS_PIFS,
112 .tx_op_limit = 1504,
45b531a8 113 },
51f2be24 114 },
8a08048a
JO
115 .tid_conf_count = 7,
116 .tid_conf = {
117 [0] = {
118 .queue_id = 0,
119 .channel_type = CONF_CHANNEL_TYPE_DCF,
120 .tsid = CONF_TX_AC_BE,
121 .ps_scheme = CONF_PS_SCHEME_LEGACY,
122 .ack_policy = CONF_ACK_POLICY_LEGACY,
123 .apsd_conf = {0, 0},
124 },
125 [1] = {
126 .queue_id = 1,
127 .channel_type = CONF_CHANNEL_TYPE_DCF,
128 .tsid = CONF_TX_AC_BE,
129 .ps_scheme = CONF_PS_SCHEME_LEGACY,
130 .ack_policy = CONF_ACK_POLICY_LEGACY,
131 .apsd_conf = {0, 0},
51f2be24 132 },
8a08048a
JO
133 [2] = {
134 .queue_id = 2,
135 .channel_type = CONF_CHANNEL_TYPE_DCF,
136 .tsid = CONF_TX_AC_BE,
137 .ps_scheme = CONF_PS_SCHEME_LEGACY,
138 .ack_policy = CONF_ACK_POLICY_LEGACY,
139 .apsd_conf = {0, 0},
51f2be24 140 },
8a08048a
JO
141 [3] = {
142 .queue_id = 3,
143 .channel_type = CONF_CHANNEL_TYPE_DCF,
144 .tsid = CONF_TX_AC_BE,
145 .ps_scheme = CONF_PS_SCHEME_LEGACY,
146 .ack_policy = CONF_ACK_POLICY_LEGACY,
147 .apsd_conf = {0, 0},
148 },
149 [4] = {
150 .queue_id = 4,
151 .channel_type = CONF_CHANNEL_TYPE_DCF,
152 .tsid = CONF_TX_AC_BE,
153 .ps_scheme = CONF_PS_SCHEME_LEGACY,
154 .ack_policy = CONF_ACK_POLICY_LEGACY,
155 .apsd_conf = {0, 0},
156 },
157 [5] = {
158 .queue_id = 5,
159 .channel_type = CONF_CHANNEL_TYPE_DCF,
160 .tsid = CONF_TX_AC_BE,
161 .ps_scheme = CONF_PS_SCHEME_LEGACY,
162 .ack_policy = CONF_ACK_POLICY_LEGACY,
163 .apsd_conf = {0, 0},
164 },
165 [6] = {
166 .queue_id = 6,
167 .channel_type = CONF_CHANNEL_TYPE_DCF,
168 .tsid = CONF_TX_AC_BE,
169 .ps_scheme = CONF_PS_SCHEME_LEGACY,
170 .ack_policy = CONF_ACK_POLICY_LEGACY,
171 .apsd_conf = {0, 0},
172 }
173 },
174 .frag_threshold = IEEE80211_MAX_FRAG_THRESHOLD,
3ed8f2c6
LC
175 .tx_compl_timeout = 700,
176 .tx_compl_threshold = 4
8a08048a
JO
177 },
178 .conn = {
179 .wake_up_event = CONF_WAKE_UP_EVENT_DTIM,
180 .listen_interval = 0,
181 .bcn_filt_mode = CONF_BCN_FILT_MODE_ENABLED,
182 .bcn_filt_ie_count = 1,
183 .bcn_filt_ie = {
184 [0] = {
185 .ie = WLAN_EID_CHANNEL_SWITCH,
186 .rule = CONF_BCN_RULE_PASS_ON_APPEARANCE,
51f2be24 187 }
47fab7d5 188 },
3ed8f2c6 189 .synch_fail_thold = 10,
8a08048a
JO
190 .bss_lose_timeout = 100,
191 .beacon_rx_timeout = 10000,
192 .broadcast_timeout = 20000,
193 .rx_broadcast_in_ps = 1,
3ed8f2c6 194 .ps_poll_threshold = 20,
8a08048a
JO
195 .sig_trigger_count = 2,
196 .sig_trigger = {
197 [0] = {
198 .threshold = -75,
199 .pacing = 500,
200 .metric = CONF_TRIG_METRIC_RSSI_BEACON,
201 .type = CONF_TRIG_EVENT_TYPE_EDGE,
202 .direction = CONF_TRIG_EVENT_DIR_LOW,
203 .hysteresis = 2,
204 .index = 0,
205 .enable = 1
47fab7d5 206 },
8a08048a
JO
207 [1] = {
208 .threshold = -75,
209 .pacing = 500,
210 .metric = CONF_TRIG_METRIC_RSSI_BEACON,
211 .type = CONF_TRIG_EVENT_TYPE_EDGE,
212 .direction = CONF_TRIG_EVENT_DIR_HIGH,
213 .hysteresis = 2,
214 .index = 1,
215 .enable = 1
216 }
217 },
218 .sig_weights = {
219 .rssi_bcn_avg_weight = 10,
220 .rssi_pkt_avg_weight = 10,
221 .snr_bcn_avg_weight = 10,
222 .snr_pkt_avg_weight = 10
11f70f97
JO
223 },
224 .bet_enable = CONF_BET_MODE_ENABLE,
84502563 225 .bet_max_consecutive = 10,
19ad0715 226 .psm_entry_retries = 3
8a08048a
JO
227 },
228 .init = {
8a08048a 229 .genparam = {
c7c8adb5 230 .ref_clk = CONF_REF_CLK_38_4_E,
8a08048a
JO
231 .settling_time = 5,
232 .clk_valid_on_wakeup = 0,
233 .dc2dcmode = 0,
1ebec3d7 234 .single_dual_band = CONF_SINGLE_BAND,
a3e84847 235 .tx_bip_fem_autodetect = 1,
8a08048a
JO
236 .tx_bip_fem_manufacturer = 1,
237 .settings = 1,
76c0f8d3 238 .sr_state = 1,
149e3878
JO
239 .srf1 = { 0x07, 0x03, 0x18, 0x10, 0x05, 0xfb, 0xf0,
240 0xe8, 0, 0, 0, 0, 0, 0, 0, 0 },
241 .srf2 = { 0x07, 0x03, 0x18, 0x10, 0x05, 0xfb, 0xf0,
242 0xe8, 0, 0, 0, 0, 0, 0, 0, 0 },
243 .srf3 = { 0x07, 0x03, 0x18, 0x10, 0x05, 0xfb, 0xf0,
244 0xe8, 0, 0, 0, 0, 0, 0, 0, 0 },
76c0f8d3
LC
245 .sr_debug_table = { 0, 0, 0, 0, 0, 0, 0, 0,
246 0, 0, 0, 0, 0, 0, 0, 0 },
247 .sr_sen_n_p = 0,
248 .sr_sen_n_p_gain = 0,
249 .sr_sen_nrn = 0,
250 .sr_sen_prn = 0,
8a08048a
JO
251 },
252 .radioparam = {
a3e84847
LC
253 .rx_trace_loss = 0x24,
254 .tx_trace_loss = 0x0,
8a08048a
JO
255 .rx_rssi_and_proc_compens = {
256 0xec, 0xf6, 0x00, 0x0c, 0x18, 0xf8,
1b38ea88 257 0xfc, 0x00, 0x80, 0x10, 0xf0, 0xf8,
8a08048a
JO
258 0x00, 0x0a, 0x14 },
259 .rx_trace_loss_5 = { 0, 0, 0, 0, 0, 0, 0 },
260 .tx_trace_loss_5 = { 0, 0, 0, 0, 0, 0, 0 },
261 .rx_rssi_and_proc_compens_5 = {
262 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
263 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
264 0x00, 0x00, 0x00 },
a3e84847
LC
265 .tx_ref_pd_voltage = 0x1a9,
266 .tx_ref_power = 0x80,
8a08048a
JO
267 .tx_offset_db = 0x0,
268 .tx_rate_limits_normal = {
a3e84847 269 0x1d, 0x1f, 0x24, 0x28, 0x28, 0x29 },
8a08048a 270 .tx_rate_limits_degraded = {
a3e84847 271 0x19, 0x1f, 0x22, 0x23, 0x27, 0x28 },
cf18be44
LC
272 .tx_rate_limits_extreme = {
273 0x19, 0x1c, 0x1e, 0x20, 0x24, 0x25 },
8a08048a
JO
274 .tx_channel_limits_11b = {
275 0x22, 0x50, 0x50, 0x50, 0x50, 0x50,
276 0x50, 0x50, 0x50, 0x50, 0x22, 0x50,
277 0x22, 0x50 },
278 .tx_channel_limits_ofdm = {
279 0x20, 0x50, 0x50, 0x50, 0x50, 0x50,
280 0x50, 0x50, 0x50, 0x50, 0x20, 0x50,
281 0x20, 0x50 },
282 .tx_pdv_rate_offsets = {
a3e84847 283 0x07, 0x08, 0x04, 0x02, 0x02, 0x00 },
8a08048a 284 .tx_ibias = {
a3e84847
LC
285 0x11, 0x11, 0x15, 0x11, 0x15, 0x0f },
286 .rx_fem_insertion_loss = 0x0e,
cf18be44
LC
287 .degraded_low_to_normal_threshold = 0x1e,
288 .degraded_normal_to_high_threshold = 0x2d,
1ebec3d7
TP
289 .tx_ref_pd_voltage_5 = {
290 0x0190, 0x01a4, 0x01c3, 0x01d8,
291 0x020a, 0x021c },
292 .tx_ref_power_5 = {
293 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 },
294 .tx_offset_db_5 = {
8a08048a 295 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1ebec3d7
TP
296 .tx_rate_limits_normal_5 = {
297 0x1b, 0x1e, 0x21, 0x23, 0x27, 0x00 },
8a08048a 298 .tx_rate_limits_degraded_5 = {
1ebec3d7 299 0x1b, 0x1e, 0x21, 0x23, 0x27, 0x00 },
cf18be44
LC
300 .tx_rate_limits_extreme_5 = {
301 0x1b, 0x1e, 0x21, 0x23, 0x27, 0x00 },
8a08048a 302 .tx_channel_limits_ofdm_5 = {
1ebec3d7
TP
303 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50,
304 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50,
305 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50,
306 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50,
307 0x50, 0x50, 0x50 },
8a08048a 308 .tx_pdv_rate_offsets_5 = {
1ebec3d7 309 0x01, 0x02, 0x02, 0x02, 0x02, 0x00 },
8a08048a 310 .tx_ibias_5 = {
1ebec3d7
TP
311 0x10, 0x10, 0x10, 0x10, 0x10, 0x10 },
312 .rx_fem_insertion_loss_5 = {
cf18be44
LC
313 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10 },
314 .degraded_low_to_normal_threshold_5 = 0x00,
315 .degraded_normal_to_high_threshold_5 = 0x00
2b60100b 316 }
6e92b416
LC
317 },
318 .itrim = {
319 .enable = false,
320 .timeout = 50000,
8a08048a
JO
321 }
322};
323
01c09162
JO
324static LIST_HEAD(wl_list);
325
8a08048a
JO
326static void wl1271_conf_init(struct wl1271 *wl)
327{
2b60100b
JO
328
329 /*
330 * This function applies the default configuration to the driver. This
331 * function is invoked upon driver load (spi probe.)
332 *
333 * The configuration is stored in a run-time structure in order to
334 * facilitate for run-time adjustment of any of the parameters. Making
335 * changes to the configuration structure will apply the new values on
336 * the next interface up (wl1271_op_start.)
337 */
338
339 /* apply driver default configuration */
8a08048a 340 memcpy(&wl->conf, &default_conf, sizeof(default_conf));
1ebec3d7
TP
341
342 if (wl1271_11a_enabled())
343 wl->conf.init.genparam.single_dual_band = CONF_DUAL_BAND;
2b60100b
JO
344}
345
346
f5fc0f86
LC
347static int wl1271_plt_init(struct wl1271 *wl)
348{
349 int ret;
350
98b5dd5d 351 ret = wl1271_cmd_general_parms(wl);
4a90406b 352 if (ret < 0)
cc7defa3
LC
353 return ret;
354
98b5dd5d 355 ret = wl1271_cmd_radio_parms(wl);
4a90406b 356 if (ret < 0)
cc7defa3
LC
357 return ret;
358
f5fc0f86
LC
359 ret = wl1271_acx_init_mem_config(wl);
360 if (ret < 0)
361 return ret;
362
94210897 363 ret = wl1271_cmd_data_path(wl, 1);
f5fc0f86
LC
364 if (ret < 0)
365 return ret;
366
367 return 0;
368}
369
370static void wl1271_disable_interrupts(struct wl1271 *wl)
371{
372 disable_irq(wl->irq);
373}
374
375static void wl1271_power_off(struct wl1271 *wl)
376{
377 wl->set_power(false);
98b2a684 378 wl->gpio_power = false;
f5fc0f86
LC
379}
380
381static void wl1271_power_on(struct wl1271 *wl)
382{
383 wl->set_power(true);
98b2a684 384 wl->gpio_power = true;
f5fc0f86
LC
385}
386
c15f63bf
JO
387static void wl1271_fw_status(struct wl1271 *wl,
388 struct wl1271_fw_status *status)
f5fc0f86
LC
389{
390 u32 total = 0;
391 int i;
392
74621417
JO
393 wl1271_spi_read(wl, FW_STATUS_ADDR, status,
394 sizeof(*status), false);
f5fc0f86
LC
395
396 wl1271_debug(DEBUG_IRQ, "intr: 0x%x (fw_rx_counter = %d, "
397 "drv_rx_counter = %d, tx_results_counter = %d)",
398 status->intr,
399 status->fw_rx_counter,
400 status->drv_rx_counter,
401 status->tx_results_counter);
402
403 /* update number of available TX blocks */
404 for (i = 0; i < NUM_TX_QUEUES; i++) {
d0f63b20
LC
405 u32 cnt = le32_to_cpu(status->tx_released_blks[i]) -
406 wl->tx_blocks_freed[i];
407
408 wl->tx_blocks_freed[i] =
409 le32_to_cpu(status->tx_released_blks[i]);
f5fc0f86
LC
410 wl->tx_blocks_available += cnt;
411 total += cnt;
412 }
413
414 /* if more blocks are available now, schedule some tx work */
415 if (total && !skb_queue_empty(&wl->tx_queue))
a64b07e8 416 ieee80211_queue_work(wl->hw, &wl->tx_work);
f5fc0f86
LC
417
418 /* update the host-chipset time offset */
d0f63b20
LC
419 wl->time_offset = jiffies_to_usecs(jiffies) -
420 le32_to_cpu(status->fw_localtime);
f5fc0f86
LC
421}
422
f5fc0f86
LC
423static void wl1271_irq_work(struct work_struct *work)
424{
f5fc0f86 425 int ret;
c15f63bf 426 u32 intr;
f5fc0f86
LC
427 struct wl1271 *wl =
428 container_of(work, struct wl1271, irq_work);
429
430 mutex_lock(&wl->mutex);
431
432 wl1271_debug(DEBUG_IRQ, "IRQ work");
433
434 if (wl->state == WL1271_STATE_OFF)
435 goto out;
436
437 ret = wl1271_ps_elp_wakeup(wl, true);
438 if (ret < 0)
439 goto out;
440
74621417 441 wl1271_spi_write32(wl, ACX_REG_INTERRUPT_MASK, WL1271_ACX_INTR_ALL);
f5fc0f86 442
c15f63bf 443 wl1271_fw_status(wl, wl->fw_status);
d0f63b20 444 intr = le32_to_cpu(wl->fw_status->intr);
f5fc0f86
LC
445 if (!intr) {
446 wl1271_debug(DEBUG_IRQ, "Zero interrupt received.");
447 goto out_sleep;
448 }
449
450 intr &= WL1271_INTR_MASK;
451
1fd2794f 452 if (intr & WL1271_ACX_INTR_EVENT_A) {
1fd2794f 453 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_EVENT_A");
13f2dc52 454 wl1271_event_handle(wl, 0);
1fd2794f
JO
455 }
456
457 if (intr & WL1271_ACX_INTR_EVENT_B) {
458 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_EVENT_B");
13f2dc52 459 wl1271_event_handle(wl, 1);
c15f63bf 460 }
f5fc0f86 461
c15f63bf
JO
462 if (intr & WL1271_ACX_INTR_INIT_COMPLETE)
463 wl1271_debug(DEBUG_IRQ,
464 "WL1271_ACX_INTR_INIT_COMPLETE");
f5fc0f86 465
c15f63bf
JO
466 if (intr & WL1271_ACX_INTR_HW_AVAILABLE)
467 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_HW_AVAILABLE");
f5fc0f86 468
c15f63bf
JO
469 if (intr & WL1271_ACX_INTR_DATA) {
470 u8 tx_res_cnt = wl->fw_status->tx_results_counter -
471 wl->tx_results_count;
f5fc0f86 472
c15f63bf 473 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_DATA");
f5fc0f86 474
c15f63bf
JO
475 /* check for tx results */
476 if (tx_res_cnt)
477 wl1271_tx_complete(wl, tx_res_cnt);
f5fc0f86 478
c15f63bf
JO
479 wl1271_rx(wl, wl->fw_status);
480 }
f5fc0f86
LC
481
482out_sleep:
74621417 483 wl1271_spi_write32(wl, ACX_REG_INTERRUPT_MASK,
73d0a13c 484 WL1271_ACX_INTR_ALL & ~(WL1271_INTR_MASK));
f5fc0f86
LC
485 wl1271_ps_elp_sleep(wl);
486
487out:
488 mutex_unlock(&wl->mutex);
489}
490
491static irqreturn_t wl1271_irq(int irq, void *cookie)
492{
493 struct wl1271 *wl;
494 unsigned long flags;
495
496 wl1271_debug(DEBUG_IRQ, "IRQ");
497
498 wl = cookie;
499
500 /* complete the ELP completion */
501 spin_lock_irqsave(&wl->wl_lock, flags);
502 if (wl->elp_compl) {
503 complete(wl->elp_compl);
504 wl->elp_compl = NULL;
505 }
506
a64b07e8 507 ieee80211_queue_work(wl->hw, &wl->irq_work);
f5fc0f86
LC
508 spin_unlock_irqrestore(&wl->wl_lock, flags);
509
510 return IRQ_HANDLED;
511}
512
513static int wl1271_fetch_firmware(struct wl1271 *wl)
514{
515 const struct firmware *fw;
516 int ret;
517
518 ret = request_firmware(&fw, WL1271_FW_NAME, &wl->spi->dev);
519
520 if (ret < 0) {
521 wl1271_error("could not get firmware: %d", ret);
522 return ret;
523 }
524
525 if (fw->size % 4) {
526 wl1271_error("firmware size is not multiple of 32 bits: %zu",
527 fw->size);
528 ret = -EILSEQ;
529 goto out;
530 }
531
532 wl->fw_len = fw->size;
1fba4974 533 wl->fw = vmalloc(wl->fw_len);
f5fc0f86
LC
534
535 if (!wl->fw) {
536 wl1271_error("could not allocate memory for the firmware");
537 ret = -ENOMEM;
538 goto out;
539 }
540
541 memcpy(wl->fw, fw->data, wl->fw_len);
542
543 ret = 0;
544
545out:
546 release_firmware(fw);
547
548 return ret;
549}
550
551static int wl1271_fetch_nvs(struct wl1271 *wl)
552{
553 const struct firmware *fw;
554 int ret;
555
556 ret = request_firmware(&fw, WL1271_NVS_NAME, &wl->spi->dev);
557
558 if (ret < 0) {
559 wl1271_error("could not get nvs file: %d", ret);
560 return ret;
561 }
562
563 if (fw->size % 4) {
564 wl1271_error("nvs size is not multiple of 32 bits: %zu",
565 fw->size);
566 ret = -EILSEQ;
567 goto out;
568 }
569
570 wl->nvs_len = fw->size;
571 wl->nvs = kmalloc(wl->nvs_len, GFP_KERNEL);
572
573 if (!wl->nvs) {
574 wl1271_error("could not allocate memory for the nvs file");
575 ret = -ENOMEM;
576 goto out;
577 }
578
579 memcpy(wl->nvs, fw->data, wl->nvs_len);
580
581 ret = 0;
582
583out:
584 release_firmware(fw);
585
586 return ret;
587}
588
589static void wl1271_fw_wakeup(struct wl1271 *wl)
590{
591 u32 elp_reg;
592
593 elp_reg = ELPCTRL_WAKE_UP;
74621417 594 wl1271_raw_write32(wl, HW_ACCESS_ELP_CTRL_REG_ADDR, elp_reg);
f5fc0f86
LC
595}
596
597static int wl1271_setup(struct wl1271 *wl)
598{
599 wl->fw_status = kmalloc(sizeof(*wl->fw_status), GFP_KERNEL);
600 if (!wl->fw_status)
601 return -ENOMEM;
602
603 wl->tx_res_if = kmalloc(sizeof(*wl->tx_res_if), GFP_KERNEL);
604 if (!wl->tx_res_if) {
605 kfree(wl->fw_status);
606 return -ENOMEM;
607 }
608
609 INIT_WORK(&wl->irq_work, wl1271_irq_work);
610 INIT_WORK(&wl->tx_work, wl1271_tx_work);
611 return 0;
612}
613
614static int wl1271_chip_wakeup(struct wl1271 *wl)
615{
451de97a 616 struct wl1271_partition_set partition;
f5fc0f86
LC
617 int ret = 0;
618
619 wl1271_power_on(wl);
620 msleep(WL1271_POWER_ON_SLEEP);
621 wl1271_spi_reset(wl);
622 wl1271_spi_init(wl);
623
624 /* We don't need a real memory partition here, because we only want
625 * to use the registers at this point. */
451de97a
JO
626 memset(&partition, 0, sizeof(partition));
627 partition.reg.start = REGISTERS_BASE;
628 partition.reg.size = REGISTERS_DOWN_SIZE;
629 wl1271_set_partition(wl, &partition);
f5fc0f86
LC
630
631 /* ELP module wake up */
632 wl1271_fw_wakeup(wl);
633
634 /* whal_FwCtrl_BootSm() */
635
636 /* 0. read chip id from CHIP_ID */
74621417 637 wl->chip.id = wl1271_spi_read32(wl, CHIP_ID_B);
f5fc0f86
LC
638
639 /* 1. check if chip id is valid */
640
641 switch (wl->chip.id) {
642 case CHIP_ID_1271_PG10:
643 wl1271_warning("chip id 0x%x (1271 PG10) support is obsolete",
644 wl->chip.id);
645
646 ret = wl1271_setup(wl);
647 if (ret < 0)
eb5b28d0 648 goto out_power_off;
f5fc0f86
LC
649 break;
650 case CHIP_ID_1271_PG20:
651 wl1271_debug(DEBUG_BOOT, "chip id 0x%x (1271 PG20)",
652 wl->chip.id);
653
654 ret = wl1271_setup(wl);
655 if (ret < 0)
eb5b28d0 656 goto out_power_off;
f5fc0f86
LC
657 break;
658 default:
659 wl1271_error("unsupported chip id: 0x%x", wl->chip.id);
660 ret = -ENODEV;
eb5b28d0 661 goto out_power_off;
f5fc0f86
LC
662 }
663
664 if (wl->fw == NULL) {
665 ret = wl1271_fetch_firmware(wl);
666 if (ret < 0)
eb5b28d0 667 goto out_power_off;
f5fc0f86
LC
668 }
669
670 /* No NVS from netlink, try to get it from the filesystem */
671 if (wl->nvs == NULL) {
672 ret = wl1271_fetch_nvs(wl);
673 if (ret < 0)
eb5b28d0 674 goto out_power_off;
f5fc0f86
LC
675 }
676
eb5b28d0
JO
677 goto out;
678
679out_power_off:
680 wl1271_power_off(wl);
681
f5fc0f86
LC
682out:
683 return ret;
684}
685
f5fc0f86
LC
686int wl1271_plt_start(struct wl1271 *wl)
687{
688 int ret;
689
690 mutex_lock(&wl->mutex);
691
692 wl1271_notice("power up");
693
694 if (wl->state != WL1271_STATE_OFF) {
695 wl1271_error("cannot go into PLT state because not "
696 "in off state: %d", wl->state);
697 ret = -EBUSY;
698 goto out;
699 }
700
701 wl->state = WL1271_STATE_PLT;
702
703 ret = wl1271_chip_wakeup(wl);
704 if (ret < 0)
705 goto out;
706
707 ret = wl1271_boot(wl);
708 if (ret < 0)
eb5b28d0 709 goto out_power_off;
f5fc0f86
LC
710
711 wl1271_notice("firmware booted in PLT mode (%s)", wl->chip.fw_ver);
712
713 ret = wl1271_plt_init(wl);
714 if (ret < 0)
eb5b28d0
JO
715 goto out_irq_disable;
716
bd5ea18f
LC
717 /* Make sure power saving is disabled */
718 ret = wl1271_acx_sleep_auth(wl, WL1271_PSM_CAM);
719 if (ret < 0)
720 goto out_irq_disable;
721
eb5b28d0
JO
722 goto out;
723
724out_irq_disable:
725 wl1271_disable_interrupts(wl);
726
727out_power_off:
728 wl1271_power_off(wl);
f5fc0f86
LC
729
730out:
731 mutex_unlock(&wl->mutex);
732
733 return ret;
734}
735
736int wl1271_plt_stop(struct wl1271 *wl)
737{
738 int ret = 0;
739
740 mutex_lock(&wl->mutex);
741
742 wl1271_notice("power down");
743
744 if (wl->state != WL1271_STATE_PLT) {
745 wl1271_error("cannot power down because not in PLT "
746 "state: %d", wl->state);
747 ret = -EBUSY;
748 goto out;
749 }
750
751 wl1271_disable_interrupts(wl);
752 wl1271_power_off(wl);
753
754 wl->state = WL1271_STATE_OFF;
bd5ea18f 755 wl->rx_counter = 0;
f5fc0f86
LC
756
757out:
758 mutex_unlock(&wl->mutex);
759
760 return ret;
761}
762
763
764static int wl1271_op_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
765{
766 struct wl1271 *wl = hw->priv;
767
768 skb_queue_tail(&wl->tx_queue, skb);
769
770 /*
771 * The chip specific setup must run before the first TX packet -
772 * before that, the tx_work will not be initialized!
773 */
774
a64b07e8 775 ieee80211_queue_work(wl->hw, &wl->tx_work);
f5fc0f86
LC
776
777 /*
778 * The workqueue is slow to process the tx_queue and we need stop
779 * the queue here, otherwise the queue will get too long.
780 */
781 if (skb_queue_len(&wl->tx_queue) >= WL1271_TX_QUEUE_MAX_LENGTH) {
782 ieee80211_stop_queues(wl->hw);
783
784 /*
785 * FIXME: this is racy, the variable is not properly
786 * protected. Maybe fix this by removing the stupid
787 * variable altogether and checking the real queue state?
788 */
789 wl->tx_queue_stopped = true;
790 }
791
792 return NETDEV_TX_OK;
793}
794
01c09162
JO
795static int wl1271_dev_notify(struct notifier_block *me, unsigned long what,
796 void *arg)
797{
798 struct net_device *dev;
799 struct wireless_dev *wdev;
800 struct wiphy *wiphy;
801 struct ieee80211_hw *hw;
802 struct wl1271 *wl;
803 struct wl1271 *wl_temp;
804 struct in_device *idev;
805 struct in_ifaddr *ifa = arg;
806 int ret = 0;
807
808 /* FIXME: this ugly function should probably be implemented in the
809 * mac80211, and here should only be a simple callback handling actual
810 * setting of the filters. Now we need to dig up references to
811 * various structures to gain access to what we need.
812 * Also, because of this, there is no "initial" setting of the filter
813 * in "op_start", because we don't want to dig up struct net_device
814 * there - the filter will be set upon first change of the interface
815 * IP address. */
816
817 dev = ifa->ifa_dev->dev;
818
819 wdev = dev->ieee80211_ptr;
820 if (wdev == NULL)
17d7265c 821 return NOTIFY_DONE;
01c09162
JO
822
823 wiphy = wdev->wiphy;
824 if (wiphy == NULL)
17d7265c 825 return NOTIFY_DONE;
01c09162
JO
826
827 hw = wiphy_priv(wiphy);
828 if (hw == NULL)
17d7265c 829 return NOTIFY_DONE;
01c09162
JO
830
831 /* Check that the interface is one supported by this driver. */
832 wl_temp = hw->priv;
833 list_for_each_entry(wl, &wl_list, list) {
834 if (wl == wl_temp)
835 break;
836 }
837 if (wl == NULL)
17d7265c 838 return NOTIFY_DONE;
01c09162
JO
839
840 /* Get the interface IP address for the device. "ifa" will become
841 NULL if:
842 - there is no IPV4 protocol address configured
843 - there are multiple (virtual) IPV4 addresses configured
844 When "ifa" is NULL, filtering will be disabled.
845 */
846 ifa = NULL;
847 idev = dev->ip_ptr;
848 if (idev)
849 ifa = idev->ifa_list;
850
851 if (ifa && ifa->ifa_next)
852 ifa = NULL;
853
854 mutex_lock(&wl->mutex);
855
856 if (wl->state == WL1271_STATE_OFF)
857 goto out;
858
859 ret = wl1271_ps_elp_wakeup(wl, false);
860 if (ret < 0)
861 goto out;
862 if (ifa)
863 ret = wl1271_acx_arp_ip_filter(wl, true,
864 (u8 *)&ifa->ifa_address,
865 ACX_IPV4_VERSION);
866 else
867 ret = wl1271_acx_arp_ip_filter(wl, false, NULL,
868 ACX_IPV4_VERSION);
869 wl1271_ps_elp_sleep(wl);
870
871out:
872 mutex_unlock(&wl->mutex);
873
17d7265c 874 return NOTIFY_OK;
01c09162
JO
875}
876
877static struct notifier_block wl1271_dev_notifier = {
878 .notifier_call = wl1271_dev_notify,
879};
880
881
f5fc0f86
LC
882static int wl1271_op_start(struct ieee80211_hw *hw)
883{
884 struct wl1271 *wl = hw->priv;
885 int ret = 0;
886
887 wl1271_debug(DEBUG_MAC80211, "mac80211 start");
888
889 mutex_lock(&wl->mutex);
890
891 if (wl->state != WL1271_STATE_OFF) {
892 wl1271_error("cannot start because not in off state: %d",
893 wl->state);
894 ret = -EBUSY;
895 goto out;
896 }
897
898 ret = wl1271_chip_wakeup(wl);
899 if (ret < 0)
900 goto out;
901
902 ret = wl1271_boot(wl);
903 if (ret < 0)
eb5b28d0 904 goto out_power_off;
f5fc0f86
LC
905
906 ret = wl1271_hw_init(wl);
907 if (ret < 0)
eb5b28d0 908 goto out_irq_disable;
f5fc0f86
LC
909
910 wl->state = WL1271_STATE_ON;
911
912 wl1271_info("firmware booted (%s)", wl->chip.fw_ver);
913
eb5b28d0 914 goto out;
f5fc0f86 915
eb5b28d0
JO
916out_irq_disable:
917 wl1271_disable_interrupts(wl);
918
919out_power_off:
920 wl1271_power_off(wl);
921
922out:
f5fc0f86
LC
923 mutex_unlock(&wl->mutex);
924
01c09162
JO
925 if (!ret) {
926 list_add(&wl->list, &wl_list);
927 register_inetaddr_notifier(&wl1271_dev_notifier);
928 }
929
f5fc0f86
LC
930 return ret;
931}
932
933static void wl1271_op_stop(struct ieee80211_hw *hw)
934{
935 struct wl1271 *wl = hw->priv;
936 int i;
937
938 wl1271_info("down");
939
940 wl1271_debug(DEBUG_MAC80211, "mac80211 stop");
941
01c09162
JO
942 unregister_inetaddr_notifier(&wl1271_dev_notifier);
943 list_del(&wl->list);
944
f5fc0f86
LC
945 mutex_lock(&wl->mutex);
946
947 WARN_ON(wl->state != WL1271_STATE_ON);
948
949 if (wl->scanning) {
950 mutex_unlock(&wl->mutex);
951 ieee80211_scan_completed(wl->hw, true);
952 mutex_lock(&wl->mutex);
953 wl->scanning = false;
954 }
955
956 wl->state = WL1271_STATE_OFF;
957
958 wl1271_disable_interrupts(wl);
959
960 mutex_unlock(&wl->mutex);
961
962 cancel_work_sync(&wl->irq_work);
963 cancel_work_sync(&wl->tx_work);
f5fc0f86
LC
964
965 mutex_lock(&wl->mutex);
966
967 /* let's notify MAC80211 about the remaining pending TX frames */
968 wl1271_tx_flush(wl);
969 wl1271_power_off(wl);
970
971 memset(wl->bssid, 0, ETH_ALEN);
972 memset(wl->ssid, 0, IW_ESSID_MAX_SIZE + 1);
973 wl->ssid_len = 0;
f5fc0f86 974 wl->bss_type = MAX_BSS_TYPE;
8a5a37a6 975 wl->band = IEEE80211_BAND_2GHZ;
f5fc0f86
LC
976
977 wl->rx_counter = 0;
978 wl->elp = false;
979 wl->psm = 0;
19ad0715 980 wl->psm_entry_retry = 0;
f5fc0f86
LC
981 wl->tx_queue_stopped = false;
982 wl->power_level = WL1271_DEFAULT_POWER_LEVEL;
983 wl->tx_blocks_available = 0;
984 wl->tx_results_count = 0;
985 wl->tx_packets_count = 0;
ac4e4ce5
JO
986 wl->tx_security_last_seq = 0;
987 wl->tx_security_seq_16 = 0;
988 wl->tx_security_seq_32 = 0;
f5fc0f86
LC
989 wl->time_offset = 0;
990 wl->session_counter = 0;
d6e19d13
LC
991 wl->joined = false;
992
f5fc0f86
LC
993 for (i = 0; i < NUM_TX_QUEUES; i++)
994 wl->tx_blocks_freed[i] = 0;
995
996 wl1271_debugfs_reset(wl);
997 mutex_unlock(&wl->mutex);
998}
999
1000static int wl1271_op_add_interface(struct ieee80211_hw *hw,
1001 struct ieee80211_if_init_conf *conf)
1002{
1003 struct wl1271 *wl = hw->priv;
f5fc0f86
LC
1004 int ret = 0;
1005
e5539bcb
JL
1006 wl1271_debug(DEBUG_MAC80211, "mac80211 add interface type %d mac %pM",
1007 conf->type, conf->mac_addr);
f5fc0f86
LC
1008
1009 mutex_lock(&wl->mutex);
b771eee5
JO
1010 if (wl->vif) {
1011 ret = -EBUSY;
1012 goto out;
1013 }
1014
1015 wl->vif = conf->vif;
f5fc0f86
LC
1016
1017 switch (conf->type) {
1018 case NL80211_IFTYPE_STATION:
1019 wl->bss_type = BSS_TYPE_STA_BSS;
1020 break;
1021 case NL80211_IFTYPE_ADHOC:
1022 wl->bss_type = BSS_TYPE_IBSS;
1023 break;
1024 default:
1025 ret = -EOPNOTSUPP;
1026 goto out;
1027 }
1028
1029 /* FIXME: what if conf->mac_addr changes? */
1030
1031out:
1032 mutex_unlock(&wl->mutex);
1033 return ret;
1034}
1035
1036static void wl1271_op_remove_interface(struct ieee80211_hw *hw,
1037 struct ieee80211_if_init_conf *conf)
1038{
b771eee5
JO
1039 struct wl1271 *wl = hw->priv;
1040
1041 mutex_lock(&wl->mutex);
f5fc0f86 1042 wl1271_debug(DEBUG_MAC80211, "mac80211 remove interface");
b771eee5
JO
1043 wl->vif = NULL;
1044 mutex_unlock(&wl->mutex);
f5fc0f86
LC
1045}
1046
1047#if 0
1048static int wl1271_op_config_interface(struct ieee80211_hw *hw,
1049 struct ieee80211_vif *vif,
1050 struct ieee80211_if_conf *conf)
1051{
1052 struct wl1271 *wl = hw->priv;
1053 struct sk_buff *beacon;
f5fc0f86
LC
1054 int ret;
1055
3264690b
DM
1056 wl1271_debug(DEBUG_MAC80211, "mac80211 config_interface bssid %pM",
1057 conf->bssid);
f5fc0f86
LC
1058 wl1271_dump_ascii(DEBUG_MAC80211, "ssid: ", conf->ssid,
1059 conf->ssid_len);
1060
1061 mutex_lock(&wl->mutex);
1062
1063 ret = wl1271_ps_elp_wakeup(wl, false);
1064 if (ret < 0)
1065 goto out;
1066
ae751bab
LC
1067 if (memcmp(wl->bssid, conf->bssid, ETH_ALEN)) {
1068 wl1271_debug(DEBUG_MAC80211, "bssid changed");
1069
1070 memcpy(wl->bssid, conf->bssid, ETH_ALEN);
1071
1072 ret = wl1271_cmd_join(wl);
1073 if (ret < 0)
1074 goto out_sleep;
f5fc0f86 1075
c6317a54
JO
1076 ret = wl1271_cmd_build_null_data(wl);
1077 if (ret < 0)
1078 goto out_sleep;
1079 }
f5fc0f86
LC
1080
1081 wl->ssid_len = conf->ssid_len;
1082 if (wl->ssid_len)
1083 memcpy(wl->ssid, conf->ssid, wl->ssid_len);
1084
f5fc0f86
LC
1085 if (conf->changed & IEEE80211_IFCC_BEACON) {
1086 beacon = ieee80211_beacon_get(hw, vif);
1087 ret = wl1271_cmd_template_set(wl, CMD_TEMPL_BEACON,
1088 beacon->data, beacon->len);
1089
1090 if (ret < 0) {
1091 dev_kfree_skb(beacon);
1092 goto out_sleep;
1093 }
1094
1095 ret = wl1271_cmd_template_set(wl, CMD_TEMPL_PROBE_RESPONSE,
1096 beacon->data, beacon->len);
1097
1098 dev_kfree_skb(beacon);
1099
f5fc0f86
LC
1100 if (ret < 0)
1101 goto out_sleep;
1102 }
1103
1104out_sleep:
1105 wl1271_ps_elp_sleep(wl);
1106
1107out:
1108 mutex_unlock(&wl->mutex);
1109
1110 return ret;
1111}
1112#endif
1113
c7f43e45
LC
1114static int wl1271_join_channel(struct wl1271 *wl, int channel)
1115{
1116 int ret;
1117 /* we need to use a dummy BSSID for now */
1118 static const u8 dummy_bssid[ETH_ALEN] = { 0x0b, 0xad, 0xde,
1119 0xad, 0xbe, 0xef };
1120
1121 /* disable mac filter, so we hear everything */
1122 wl->rx_config &= ~CFG_BSSID_FILTER_EN;
1123
1124 wl->channel = channel;
1125 memcpy(wl->bssid, dummy_bssid, ETH_ALEN);
1126
1127 ret = wl1271_cmd_join(wl);
1128 if (ret < 0)
1129 goto out;
1130
1131 wl->joined = true;
1132
1133out:
1134 return ret;
1135}
1136
1137static int wl1271_unjoin_channel(struct wl1271 *wl)
1138{
1139 int ret;
1140
1141 /* to stop listening to a channel, we disconnect */
1142 ret = wl1271_cmd_disconnect(wl);
1143 if (ret < 0)
1144 goto out;
1145
1146 wl->joined = false;
1147 wl->channel = 0;
1148 memset(wl->bssid, 0, ETH_ALEN);
1149 wl->rx_config = WL1271_DEFAULT_RX_CONFIG;
1150
1151out:
1152 return ret;
1153}
1154
f5fc0f86
LC
1155static int wl1271_op_config(struct ieee80211_hw *hw, u32 changed)
1156{
1157 struct wl1271 *wl = hw->priv;
1158 struct ieee80211_conf *conf = &hw->conf;
1159 int channel, ret = 0;
1160
1161 channel = ieee80211_frequency_to_channel(conf->channel->center_freq);
1162
c7f43e45 1163 wl1271_debug(DEBUG_MAC80211, "mac80211 config ch %d psm %s power %d %s",
f5fc0f86
LC
1164 channel,
1165 conf->flags & IEEE80211_CONF_PS ? "on" : "off",
c7f43e45
LC
1166 conf->power_level,
1167 conf->flags & IEEE80211_CONF_IDLE ? "idle" : "in use");
f5fc0f86
LC
1168
1169 mutex_lock(&wl->mutex);
1170
8a5a37a6
JO
1171 wl->band = conf->channel->band;
1172
f5fc0f86
LC
1173 ret = wl1271_ps_elp_wakeup(wl, false);
1174 if (ret < 0)
1175 goto out;
1176
c7f43e45
LC
1177 if (changed & IEEE80211_CONF_CHANGE_IDLE) {
1178 if (conf->flags & IEEE80211_CONF_IDLE && wl->joined)
1179 wl1271_unjoin_channel(wl);
1180 else
1181 wl1271_join_channel(wl, channel);
a6fe2313
JO
1182
1183 if (conf->flags & IEEE80211_CONF_IDLE) {
1184 wl->basic_rate_set = CONF_TX_RATE_MASK_BASIC;
1185 wl1271_acx_rate_policies(wl, CONF_TX_RATE_MASK_BASIC);
1186 }
f5fc0f86
LC
1187 }
1188
c7f43e45
LC
1189 /* if the channel changes while joined, join again */
1190 if (channel != wl->channel && wl->joined)
1191 wl1271_join_channel(wl, channel);
1192
f5fc0f86
LC
1193 if (conf->flags & IEEE80211_CONF_PS && !wl->psm_requested) {
1194 wl1271_info("psm enabled");
1195
1196 wl->psm_requested = true;
1197
1198 /*
1199 * We enter PSM only if we're already associated.
1200 * If we're not, we'll enter it when joining an SSID,
1201 * through the bss_info_changed() hook.
1202 */
1203 ret = wl1271_ps_set_mode(wl, STATION_POWER_SAVE_MODE);
1204 } else if (!(conf->flags & IEEE80211_CONF_PS) &&
1205 wl->psm_requested) {
1206 wl1271_info("psm disabled");
1207
1208 wl->psm_requested = false;
1209
1210 if (wl->psm)
1211 ret = wl1271_ps_set_mode(wl, STATION_ACTIVE_MODE);
1212 }
1213
1214 if (conf->power_level != wl->power_level) {
1215 ret = wl1271_acx_tx_power(wl, conf->power_level);
1216 if (ret < 0)
c6317a54 1217 goto out_sleep;
f5fc0f86
LC
1218
1219 wl->power_level = conf->power_level;
1220 }
1221
1222out_sleep:
1223 wl1271_ps_elp_sleep(wl);
1224
1225out:
1226 mutex_unlock(&wl->mutex);
1227
1228 return ret;
1229}
1230
b54853f1
JO
1231struct wl1271_filter_params {
1232 bool enabled;
1233 int mc_list_length;
1234 u8 mc_list[ACX_MC_ADDRESS_GROUP_MAX][ETH_ALEN];
1235};
1236
c87dec9f
JO
1237static u64 wl1271_op_prepare_multicast(struct ieee80211_hw *hw, int mc_count,
1238 struct dev_addr_list *mc_list)
1239{
c87dec9f 1240 struct wl1271_filter_params *fp;
c87dec9f
JO
1241 int i;
1242
74441130 1243 fp = kzalloc(sizeof(*fp), GFP_ATOMIC);
c87dec9f
JO
1244 if (!fp) {
1245 wl1271_error("Out of memory setting filters.");
1246 return 0;
1247 }
1248
1249 /* update multicast filtering parameters */
b54853f1 1250 fp->enabled = true;
c87dec9f
JO
1251 if (mc_count > ACX_MC_ADDRESS_GROUP_MAX) {
1252 mc_count = 0;
b54853f1 1253 fp->enabled = false;
c87dec9f
JO
1254 }
1255
1256 fp->mc_list_length = 0;
1257 for (i = 0; i < mc_count; i++) {
1258 if (mc_list->da_addrlen == ETH_ALEN) {
1259 memcpy(fp->mc_list[fp->mc_list_length],
1260 mc_list->da_addr, ETH_ALEN);
1261 fp->mc_list_length++;
1262 } else
1263 wl1271_warning("Unknown mc address length.");
74441130 1264 mc_list = mc_list->next;
c87dec9f
JO
1265 }
1266
b54853f1 1267 return (u64)(unsigned long)fp;
c87dec9f 1268}
f5fc0f86 1269
b54853f1
JO
1270#define WL1271_SUPPORTED_FILTERS (FIF_PROMISC_IN_BSS | \
1271 FIF_ALLMULTI | \
1272 FIF_FCSFAIL | \
1273 FIF_BCN_PRBRESP_PROMISC | \
1274 FIF_CONTROL | \
1275 FIF_OTHER_BSS)
1276
f5fc0f86
LC
1277static void wl1271_op_configure_filter(struct ieee80211_hw *hw,
1278 unsigned int changed,
c87dec9f 1279 unsigned int *total, u64 multicast)
f5fc0f86 1280{
b54853f1 1281 struct wl1271_filter_params *fp = (void *)(unsigned long)multicast;
f5fc0f86 1282 struct wl1271 *wl = hw->priv;
b54853f1 1283 int ret;
f5fc0f86
LC
1284
1285 wl1271_debug(DEBUG_MAC80211, "mac80211 configure filter");
1286
b54853f1
JO
1287 mutex_lock(&wl->mutex);
1288
1289 if (wl->state == WL1271_STATE_OFF)
1290 goto out;
1291
1292 ret = wl1271_ps_elp_wakeup(wl, false);
1293 if (ret < 0)
1294 goto out;
1295
f5fc0f86
LC
1296 *total &= WL1271_SUPPORTED_FILTERS;
1297 changed &= WL1271_SUPPORTED_FILTERS;
1298
b54853f1
JO
1299 if (*total & FIF_ALLMULTI)
1300 ret = wl1271_acx_group_address_tbl(wl, false, NULL, 0);
1301 else if (fp)
1302 ret = wl1271_acx_group_address_tbl(wl, fp->enabled,
1303 fp->mc_list,
1304 fp->mc_list_length);
1305 if (ret < 0)
1306 goto out_sleep;
f5fc0f86 1307
b54853f1
JO
1308 kfree(fp);
1309
1310 /* FIXME: We still need to set our filters properly */
c87dec9f 1311
b54853f1
JO
1312 /* determine, whether supported filter values have changed */
1313 if (changed == 0)
1314 goto out_sleep;
c87dec9f 1315
b54853f1
JO
1316 /* apply configured filters */
1317 ret = wl1271_acx_rx_config(wl, wl->rx_config, wl->rx_filter);
1318 if (ret < 0)
1319 goto out_sleep;
1320
1321out_sleep:
1322 wl1271_ps_elp_sleep(wl);
1323
1324out:
1325 mutex_unlock(&wl->mutex);
f5fc0f86
LC
1326}
1327
1328static int wl1271_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
1329 struct ieee80211_vif *vif,
1330 struct ieee80211_sta *sta,
1331 struct ieee80211_key_conf *key_conf)
1332{
1333 struct wl1271 *wl = hw->priv;
1334 const u8 *addr;
1335 int ret;
ac4e4ce5
JO
1336 u32 tx_seq_32 = 0;
1337 u16 tx_seq_16 = 0;
f5fc0f86
LC
1338 u8 key_type;
1339
1340 static const u8 bcast_addr[ETH_ALEN] =
1341 { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
1342
1343 wl1271_debug(DEBUG_MAC80211, "mac80211 set key");
1344
1345 addr = sta ? sta->addr : bcast_addr;
1346
1347 wl1271_debug(DEBUG_CRYPT, "CMD: 0x%x", cmd);
1348 wl1271_dump(DEBUG_CRYPT, "ADDR: ", addr, ETH_ALEN);
1349 wl1271_debug(DEBUG_CRYPT, "Key: algo:0x%x, id:%d, len:%d flags 0x%x",
1350 key_conf->alg, key_conf->keyidx,
1351 key_conf->keylen, key_conf->flags);
1352 wl1271_dump(DEBUG_CRYPT, "KEY: ", key_conf->key, key_conf->keylen);
1353
1354 if (is_zero_ether_addr(addr)) {
1355 /* We dont support TX only encryption */
1356 ret = -EOPNOTSUPP;
1357 goto out;
1358 }
1359
1360 mutex_lock(&wl->mutex);
1361
1362 ret = wl1271_ps_elp_wakeup(wl, false);
1363 if (ret < 0)
1364 goto out_unlock;
1365
1366 switch (key_conf->alg) {
1367 case ALG_WEP:
1368 key_type = KEY_WEP;
1369
1370 key_conf->hw_key_idx = key_conf->keyidx;
1371 break;
1372 case ALG_TKIP:
1373 key_type = KEY_TKIP;
1374
1375 key_conf->hw_key_idx = key_conf->keyidx;
ac4e4ce5
JO
1376 tx_seq_32 = wl->tx_security_seq_32;
1377 tx_seq_16 = wl->tx_security_seq_16;
f5fc0f86
LC
1378 break;
1379 case ALG_CCMP:
1380 key_type = KEY_AES;
1381
1382 key_conf->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
ac4e4ce5
JO
1383 tx_seq_32 = wl->tx_security_seq_32;
1384 tx_seq_16 = wl->tx_security_seq_16;
f5fc0f86
LC
1385 break;
1386 default:
1387 wl1271_error("Unknown key algo 0x%x", key_conf->alg);
1388
1389 ret = -EOPNOTSUPP;
1390 goto out_sleep;
1391 }
1392
1393 switch (cmd) {
1394 case SET_KEY:
1395 ret = wl1271_cmd_set_key(wl, KEY_ADD_OR_REPLACE,
1396 key_conf->keyidx, key_type,
1397 key_conf->keylen, key_conf->key,
ac4e4ce5 1398 addr, tx_seq_32, tx_seq_16);
f5fc0f86
LC
1399 if (ret < 0) {
1400 wl1271_error("Could not add or replace key");
1401 goto out_sleep;
1402 }
1403 break;
1404
1405 case DISABLE_KEY:
1406 ret = wl1271_cmd_set_key(wl, KEY_REMOVE,
1407 key_conf->keyidx, key_type,
1408 key_conf->keylen, key_conf->key,
ac4e4ce5 1409 addr, 0, 0);
f5fc0f86
LC
1410 if (ret < 0) {
1411 wl1271_error("Could not remove key");
1412 goto out_sleep;
1413 }
1414 break;
1415
1416 default:
1417 wl1271_error("Unsupported key cmd 0x%x", cmd);
1418 ret = -EOPNOTSUPP;
1419 goto out_sleep;
1420
1421 break;
1422 }
1423
1424out_sleep:
1425 wl1271_ps_elp_sleep(wl);
1426
1427out_unlock:
1428 mutex_unlock(&wl->mutex);
1429
1430out:
1431 return ret;
1432}
1433
1434static int wl1271_op_hw_scan(struct ieee80211_hw *hw,
1435 struct cfg80211_scan_request *req)
1436{
1437 struct wl1271 *wl = hw->priv;
1438 int ret;
1439 u8 *ssid = NULL;
abb0b3bf 1440 size_t len = 0;
f5fc0f86
LC
1441
1442 wl1271_debug(DEBUG_MAC80211, "mac80211 hw scan");
1443
1444 if (req->n_ssids) {
1445 ssid = req->ssids[0].ssid;
abb0b3bf 1446 len = req->ssids[0].ssid_len;
f5fc0f86
LC
1447 }
1448
1449 mutex_lock(&wl->mutex);
1450
1451 ret = wl1271_ps_elp_wakeup(wl, false);
1452 if (ret < 0)
1453 goto out;
1454
abb0b3bf
TP
1455 if (wl1271_11a_enabled())
1456 ret = wl1271_cmd_scan(hw->priv, ssid, len, 1, 0,
1457 WL1271_SCAN_BAND_DUAL, 3);
1458 else
1459 ret = wl1271_cmd_scan(hw->priv, ssid, len, 1, 0,
1460 WL1271_SCAN_BAND_2_4_GHZ, 3);
f5fc0f86
LC
1461
1462 wl1271_ps_elp_sleep(wl);
1463
1464out:
1465 mutex_unlock(&wl->mutex);
1466
1467 return ret;
1468}
1469
1470static int wl1271_op_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
1471{
1472 struct wl1271 *wl = hw->priv;
1473 int ret;
1474
1475 mutex_lock(&wl->mutex);
1476
1477 ret = wl1271_ps_elp_wakeup(wl, false);
1478 if (ret < 0)
1479 goto out;
1480
1481 ret = wl1271_acx_rts_threshold(wl, (u16) value);
1482 if (ret < 0)
1483 wl1271_warning("wl1271_op_set_rts_threshold failed: %d", ret);
1484
1485 wl1271_ps_elp_sleep(wl);
1486
1487out:
1488 mutex_unlock(&wl->mutex);
1489
1490 return ret;
1491}
1492
8a5a37a6
JO
1493static u32 wl1271_enabled_rates_get(struct wl1271 *wl, u64 basic_rate_set)
1494{
1495 struct ieee80211_supported_band *band;
1496 u32 enabled_rates = 0;
1497 int bit;
1498
1499 band = wl->hw->wiphy->bands[wl->band];
1500 for (bit = 0; bit < band->n_bitrates; bit++) {
1501 if (basic_rate_set & 0x1)
1502 enabled_rates |= band->bitrates[bit].hw_value;
1503 basic_rate_set >>= 1;
1504 }
1505
1506 return enabled_rates;
1507}
1508
f5fc0f86
LC
1509static void wl1271_op_bss_info_changed(struct ieee80211_hw *hw,
1510 struct ieee80211_vif *vif,
1511 struct ieee80211_bss_conf *bss_conf,
1512 u32 changed)
1513{
1514 enum wl1271_cmd_ps_mode mode;
1515 struct wl1271 *wl = hw->priv;
1516 int ret;
1517
1518 wl1271_debug(DEBUG_MAC80211, "mac80211 bss info changed");
1519
1520 mutex_lock(&wl->mutex);
1521
1522 ret = wl1271_ps_elp_wakeup(wl, false);
1523 if (ret < 0)
1524 goto out;
1525
c7f43e45
LC
1526 if ((changed & BSS_CHANGED_BSSID) &&
1527 /*
1528 * Now we know the correct bssid, so we send a new join command
1529 * and enable the BSSID filter
1530 */
1531 memcmp(wl->bssid, bss_conf->bssid, ETH_ALEN)) {
1532 wl->rx_config |= CFG_BSSID_FILTER_EN;
1533 memcpy(wl->bssid, bss_conf->bssid, ETH_ALEN);
bdcbbb94
LC
1534 ret = wl1271_cmd_build_null_data(wl);
1535 if (ret < 0) {
1536 wl1271_warning("cmd buld null data failed %d",
1537 ret);
1538 goto out_sleep;
1539 }
cd264769
LC
1540 ret = wl1271_cmd_join(wl);
1541 if (ret < 0) {
1542 wl1271_warning("cmd join failed %d", ret);
1543 goto out_sleep;
1544 }
c7f43e45
LC
1545 wl->joined = true;
1546 }
1547
f5fc0f86
LC
1548 if (changed & BSS_CHANGED_ASSOC) {
1549 if (bss_conf->assoc) {
1550 wl->aid = bss_conf->aid;
1551
ae751bab
LC
1552 /*
1553 * with wl1271, we don't need to update the
1554 * beacon_int and dtim_period, because the firmware
1555 * updates it by itself when the first beacon is
1556 * received after a join.
1557 */
f5fc0f86
LC
1558 ret = wl1271_cmd_build_ps_poll(wl, wl->aid);
1559 if (ret < 0)
1560 goto out_sleep;
1561
1562 ret = wl1271_acx_aid(wl, wl->aid);
1563 if (ret < 0)
1564 goto out_sleep;
1565
1566 /* If we want to go in PSM but we're not there yet */
1567 if (wl->psm_requested && !wl->psm) {
1568 mode = STATION_POWER_SAVE_MODE;
1569 ret = wl1271_ps_set_mode(wl, mode);
1570 if (ret < 0)
1571 goto out_sleep;
1572 }
d94cd297
JO
1573 } else {
1574 /* use defaults when not associated */
d94cd297 1575 wl->aid = 0;
f5fc0f86 1576 }
d94cd297 1577
f5fc0f86 1578 }
8a5a37a6 1579
f5fc0f86
LC
1580 if (changed & BSS_CHANGED_ERP_SLOT) {
1581 if (bss_conf->use_short_slot)
1582 ret = wl1271_acx_slot(wl, SLOT_TIME_SHORT);
1583 else
1584 ret = wl1271_acx_slot(wl, SLOT_TIME_LONG);
1585 if (ret < 0) {
1586 wl1271_warning("Set slot time failed %d", ret);
1587 goto out_sleep;
1588 }
1589 }
1590
1591 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
1592 if (bss_conf->use_short_preamble)
1593 wl1271_acx_set_preamble(wl, ACX_PREAMBLE_SHORT);
1594 else
1595 wl1271_acx_set_preamble(wl, ACX_PREAMBLE_LONG);
1596 }
1597
1598 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
1599 if (bss_conf->use_cts_prot)
1600 ret = wl1271_acx_cts_protect(wl, CTSPROTECT_ENABLE);
1601 else
1602 ret = wl1271_acx_cts_protect(wl, CTSPROTECT_DISABLE);
1603 if (ret < 0) {
1604 wl1271_warning("Set ctsprotect failed %d", ret);
1605 goto out_sleep;
1606 }
1607 }
1608
8a5a37a6 1609 if (changed & BSS_CHANGED_BASIC_RATES) {
d94cd297 1610 wl->basic_rate_set = wl1271_enabled_rates_get(
8a5a37a6 1611 wl, bss_conf->basic_rates);
d94cd297 1612
ae751bab 1613 ret = wl1271_acx_rate_policies(wl, wl->basic_rate_set);
8a5a37a6
JO
1614 if (ret < 0) {
1615 wl1271_warning("Set rate policies failed %d", ret);
1616 goto out_sleep;
1617 }
1618 }
1619
f5fc0f86
LC
1620out_sleep:
1621 wl1271_ps_elp_sleep(wl);
1622
1623out:
1624 mutex_unlock(&wl->mutex);
1625}
1626
1627
1628/* can't be const, mac80211 writes to this */
1629static struct ieee80211_rate wl1271_rates[] = {
1630 { .bitrate = 10,
2b60100b
JO
1631 .hw_value = CONF_HW_BIT_RATE_1MBPS,
1632 .hw_value_short = CONF_HW_BIT_RATE_1MBPS, },
f5fc0f86 1633 { .bitrate = 20,
2b60100b
JO
1634 .hw_value = CONF_HW_BIT_RATE_2MBPS,
1635 .hw_value_short = CONF_HW_BIT_RATE_2MBPS,
f5fc0f86
LC
1636 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
1637 { .bitrate = 55,
2b60100b
JO
1638 .hw_value = CONF_HW_BIT_RATE_5_5MBPS,
1639 .hw_value_short = CONF_HW_BIT_RATE_5_5MBPS,
f5fc0f86
LC
1640 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
1641 { .bitrate = 110,
2b60100b
JO
1642 .hw_value = CONF_HW_BIT_RATE_11MBPS,
1643 .hw_value_short = CONF_HW_BIT_RATE_11MBPS,
f5fc0f86
LC
1644 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
1645 { .bitrate = 60,
2b60100b
JO
1646 .hw_value = CONF_HW_BIT_RATE_6MBPS,
1647 .hw_value_short = CONF_HW_BIT_RATE_6MBPS, },
f5fc0f86 1648 { .bitrate = 90,
2b60100b
JO
1649 .hw_value = CONF_HW_BIT_RATE_9MBPS,
1650 .hw_value_short = CONF_HW_BIT_RATE_9MBPS, },
f5fc0f86 1651 { .bitrate = 120,
2b60100b
JO
1652 .hw_value = CONF_HW_BIT_RATE_12MBPS,
1653 .hw_value_short = CONF_HW_BIT_RATE_12MBPS, },
f5fc0f86 1654 { .bitrate = 180,
2b60100b
JO
1655 .hw_value = CONF_HW_BIT_RATE_18MBPS,
1656 .hw_value_short = CONF_HW_BIT_RATE_18MBPS, },
f5fc0f86 1657 { .bitrate = 240,
2b60100b
JO
1658 .hw_value = CONF_HW_BIT_RATE_24MBPS,
1659 .hw_value_short = CONF_HW_BIT_RATE_24MBPS, },
f5fc0f86 1660 { .bitrate = 360,
2b60100b
JO
1661 .hw_value = CONF_HW_BIT_RATE_36MBPS,
1662 .hw_value_short = CONF_HW_BIT_RATE_36MBPS, },
f5fc0f86 1663 { .bitrate = 480,
2b60100b
JO
1664 .hw_value = CONF_HW_BIT_RATE_48MBPS,
1665 .hw_value_short = CONF_HW_BIT_RATE_48MBPS, },
f5fc0f86 1666 { .bitrate = 540,
2b60100b
JO
1667 .hw_value = CONF_HW_BIT_RATE_54MBPS,
1668 .hw_value_short = CONF_HW_BIT_RATE_54MBPS, },
f5fc0f86
LC
1669};
1670
1671/* can't be const, mac80211 writes to this */
1672static struct ieee80211_channel wl1271_channels[] = {
a2d0e3f1
LC
1673 { .hw_value = 1, .center_freq = 2412, .max_power = 25 },
1674 { .hw_value = 2, .center_freq = 2417, .max_power = 25 },
1675 { .hw_value = 3, .center_freq = 2422, .max_power = 25 },
1676 { .hw_value = 4, .center_freq = 2427, .max_power = 25 },
1677 { .hw_value = 5, .center_freq = 2432, .max_power = 25 },
1678 { .hw_value = 6, .center_freq = 2437, .max_power = 25 },
1679 { .hw_value = 7, .center_freq = 2442, .max_power = 25 },
1680 { .hw_value = 8, .center_freq = 2447, .max_power = 25 },
1681 { .hw_value = 9, .center_freq = 2452, .max_power = 25 },
1682 { .hw_value = 10, .center_freq = 2457, .max_power = 25 },
1683 { .hw_value = 11, .center_freq = 2462, .max_power = 25 },
1684 { .hw_value = 12, .center_freq = 2467, .max_power = 25 },
1685 { .hw_value = 13, .center_freq = 2472, .max_power = 25 },
f5fc0f86
LC
1686};
1687
1688/* can't be const, mac80211 writes to this */
1689static struct ieee80211_supported_band wl1271_band_2ghz = {
1690 .channels = wl1271_channels,
1691 .n_channels = ARRAY_SIZE(wl1271_channels),
1692 .bitrates = wl1271_rates,
1693 .n_bitrates = ARRAY_SIZE(wl1271_rates),
1694};
1695
1ebec3d7
TP
1696/* 5 GHz data rates for WL1273 */
1697static struct ieee80211_rate wl1271_rates_5ghz[] = {
1698 { .bitrate = 60,
1699 .hw_value = CONF_HW_BIT_RATE_6MBPS,
1700 .hw_value_short = CONF_HW_BIT_RATE_6MBPS, },
1701 { .bitrate = 90,
1702 .hw_value = CONF_HW_BIT_RATE_9MBPS,
1703 .hw_value_short = CONF_HW_BIT_RATE_9MBPS, },
1704 { .bitrate = 120,
1705 .hw_value = CONF_HW_BIT_RATE_12MBPS,
1706 .hw_value_short = CONF_HW_BIT_RATE_12MBPS, },
1707 { .bitrate = 180,
1708 .hw_value = CONF_HW_BIT_RATE_18MBPS,
1709 .hw_value_short = CONF_HW_BIT_RATE_18MBPS, },
1710 { .bitrate = 240,
1711 .hw_value = CONF_HW_BIT_RATE_24MBPS,
1712 .hw_value_short = CONF_HW_BIT_RATE_24MBPS, },
1713 { .bitrate = 360,
1714 .hw_value = CONF_HW_BIT_RATE_36MBPS,
1715 .hw_value_short = CONF_HW_BIT_RATE_36MBPS, },
1716 { .bitrate = 480,
1717 .hw_value = CONF_HW_BIT_RATE_48MBPS,
1718 .hw_value_short = CONF_HW_BIT_RATE_48MBPS, },
1719 { .bitrate = 540,
1720 .hw_value = CONF_HW_BIT_RATE_54MBPS,
1721 .hw_value_short = CONF_HW_BIT_RATE_54MBPS, },
1722};
1723
1724/* 5 GHz band channels for WL1273 */
1725static struct ieee80211_channel wl1271_channels_5ghz[] = {
1726 { .hw_value = 183, .center_freq = 4915},
1727 { .hw_value = 184, .center_freq = 4920},
1728 { .hw_value = 185, .center_freq = 4925},
1729 { .hw_value = 187, .center_freq = 4935},
1730 { .hw_value = 188, .center_freq = 4940},
1731 { .hw_value = 189, .center_freq = 4945},
1732 { .hw_value = 192, .center_freq = 4960},
1733 { .hw_value = 196, .center_freq = 4980},
1734 { .hw_value = 7, .center_freq = 5035},
1735 { .hw_value = 8, .center_freq = 5040},
1736 { .hw_value = 9, .center_freq = 5045},
1737 { .hw_value = 11, .center_freq = 5055},
1738 { .hw_value = 12, .center_freq = 5060},
1739 { .hw_value = 16, .center_freq = 5080},
1740 { .hw_value = 34, .center_freq = 5170},
1741 { .hw_value = 36, .center_freq = 5180},
1742 { .hw_value = 38, .center_freq = 5190},
1743 { .hw_value = 40, .center_freq = 5200},
1744 { .hw_value = 42, .center_freq = 5210},
1745 { .hw_value = 44, .center_freq = 5220},
1746 { .hw_value = 46, .center_freq = 5230},
1747 { .hw_value = 48, .center_freq = 5240},
1748 { .hw_value = 52, .center_freq = 5260},
1749 { .hw_value = 56, .center_freq = 5280},
1750 { .hw_value = 60, .center_freq = 5300},
1751 { .hw_value = 64, .center_freq = 5320},
1752 { .hw_value = 100, .center_freq = 5500},
1753 { .hw_value = 104, .center_freq = 5520},
1754 { .hw_value = 108, .center_freq = 5540},
1755 { .hw_value = 112, .center_freq = 5560},
1756 { .hw_value = 116, .center_freq = 5580},
1757 { .hw_value = 120, .center_freq = 5600},
1758 { .hw_value = 124, .center_freq = 5620},
1759 { .hw_value = 128, .center_freq = 5640},
1760 { .hw_value = 132, .center_freq = 5660},
1761 { .hw_value = 136, .center_freq = 5680},
1762 { .hw_value = 140, .center_freq = 5700},
1763 { .hw_value = 149, .center_freq = 5745},
1764 { .hw_value = 153, .center_freq = 5765},
1765 { .hw_value = 157, .center_freq = 5785},
1766 { .hw_value = 161, .center_freq = 5805},
1767 { .hw_value = 165, .center_freq = 5825},
1768};
1769
1770
1771static struct ieee80211_supported_band wl1271_band_5ghz = {
1772 .channels = wl1271_channels_5ghz,
1773 .n_channels = ARRAY_SIZE(wl1271_channels_5ghz),
1774 .bitrates = wl1271_rates_5ghz,
1775 .n_bitrates = ARRAY_SIZE(wl1271_rates_5ghz),
1776};
1777
f5fc0f86
LC
1778static const struct ieee80211_ops wl1271_ops = {
1779 .start = wl1271_op_start,
1780 .stop = wl1271_op_stop,
1781 .add_interface = wl1271_op_add_interface,
1782 .remove_interface = wl1271_op_remove_interface,
1783 .config = wl1271_op_config,
1784/* .config_interface = wl1271_op_config_interface, */
c87dec9f 1785 .prepare_multicast = wl1271_op_prepare_multicast,
f5fc0f86
LC
1786 .configure_filter = wl1271_op_configure_filter,
1787 .tx = wl1271_op_tx,
1788 .set_key = wl1271_op_set_key,
1789 .hw_scan = wl1271_op_hw_scan,
1790 .bss_info_changed = wl1271_op_bss_info_changed,
1791 .set_rts_threshold = wl1271_op_set_rts_threshold,
1792};
1793
1794static int wl1271_register_hw(struct wl1271 *wl)
1795{
1796 int ret;
1797
1798 if (wl->mac80211_registered)
1799 return 0;
1800
1801 SET_IEEE80211_PERM_ADDR(wl->hw, wl->mac_addr);
1802
1803 ret = ieee80211_register_hw(wl->hw);
1804 if (ret < 0) {
1805 wl1271_error("unable to register mac80211 hw: %d", ret);
1806 return ret;
1807 }
1808
1809 wl->mac80211_registered = true;
1810
1811 wl1271_notice("loaded");
1812
1813 return 0;
1814}
1815
1816static int wl1271_init_ieee80211(struct wl1271 *wl)
1817{
1e2b7976
JO
1818 /* The tx descriptor buffer and the TKIP space. */
1819 wl->hw->extra_tx_headroom = WL1271_TKIP_IV_SPACE +
1820 sizeof(struct wl1271_tx_hw_descr);
f5fc0f86
LC
1821
1822 /* unit us */
1823 /* FIXME: find a proper value */
1824 wl->hw->channel_change_time = 10000;
1825
1826 wl->hw->flags = IEEE80211_HW_SIGNAL_DBM |
1922167b 1827 IEEE80211_HW_NOISE_DBM |
03442a33
JO
1828 IEEE80211_HW_BEACON_FILTER |
1829 IEEE80211_HW_SUPPORTS_PS;
f5fc0f86
LC
1830
1831 wl->hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION);
1832 wl->hw->wiphy->max_scan_ssids = 1;
1833 wl->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = &wl1271_band_2ghz;
1834
1ebec3d7
TP
1835 if (wl1271_11a_enabled())
1836 wl->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = &wl1271_band_5ghz;
1837
f5fc0f86
LC
1838 SET_IEEE80211_DEV(wl->hw, &wl->spi->dev);
1839
1840 return 0;
1841}
1842
1843static void wl1271_device_release(struct device *dev)
1844{
1845
1846}
1847
1848static struct platform_device wl1271_device = {
1849 .name = "wl1271",
1850 .id = -1,
1851
1852 /* device model insists to have a release function */
1853 .dev = {
1854 .release = wl1271_device_release,
1855 },
1856};
1857
1858#define WL1271_DEFAULT_CHANNEL 0
1859static int __devinit wl1271_probe(struct spi_device *spi)
1860{
1861 struct wl12xx_platform_data *pdata;
1862 struct ieee80211_hw *hw;
1863 struct wl1271 *wl;
1864 int ret, i;
1865 static const u8 nokia_oui[3] = {0x00, 0x1f, 0xdf};
1866
1867 pdata = spi->dev.platform_data;
1868 if (!pdata) {
1869 wl1271_error("no platform data");
1870 return -ENODEV;
1871 }
1872
1873 hw = ieee80211_alloc_hw(sizeof(*wl), &wl1271_ops);
1874 if (!hw) {
1875 wl1271_error("could not alloc ieee80211_hw");
1876 return -ENOMEM;
1877 }
1878
1879 wl = hw->priv;
1880 memset(wl, 0, sizeof(*wl));
1881
01c09162
JO
1882 INIT_LIST_HEAD(&wl->list);
1883
f5fc0f86
LC
1884 wl->hw = hw;
1885 dev_set_drvdata(&spi->dev, wl);
1886 wl->spi = spi;
1887
1888 skb_queue_head_init(&wl->tx_queue);
1889
37b70a81 1890 INIT_DELAYED_WORK(&wl->elp_work, wl1271_elp_work);
f5fc0f86
LC
1891 wl->channel = WL1271_DEFAULT_CHANNEL;
1892 wl->scanning = false;
1893 wl->default_key = 0;
f5fc0f86
LC
1894 wl->rx_counter = 0;
1895 wl->rx_config = WL1271_DEFAULT_RX_CONFIG;
1896 wl->rx_filter = WL1271_DEFAULT_RX_FILTER;
1897 wl->elp = false;
1898 wl->psm = 0;
1899 wl->psm_requested = false;
19ad0715 1900 wl->psm_entry_retry = 0;
f5fc0f86
LC
1901 wl->tx_queue_stopped = false;
1902 wl->power_level = WL1271_DEFAULT_POWER_LEVEL;
a6fe2313 1903 wl->basic_rate_set = CONF_TX_RATE_MASK_BASIC;
8a5a37a6 1904 wl->band = IEEE80211_BAND_2GHZ;
b771eee5 1905 wl->vif = NULL;
d6e19d13 1906 wl->joined = false;
98b2a684 1907 wl->gpio_power = false;
f5fc0f86 1908
be7078c2 1909 for (i = 0; i < ACX_TX_DESCRIPTORS; i++)
f5fc0f86
LC
1910 wl->tx_frames[i] = NULL;
1911
1912 spin_lock_init(&wl->wl_lock);
1913
1914 /*
1915 * In case our MAC address is not correctly set,
1916 * we use a random but Nokia MAC.
1917 */
1918 memcpy(wl->mac_addr, nokia_oui, 3);
1919 get_random_bytes(wl->mac_addr + 3, 3);
1920
1921 wl->state = WL1271_STATE_OFF;
1922 mutex_init(&wl->mutex);
1923
f5fc0f86
LC
1924 /* This is the only SPI value that we need to set here, the rest
1925 * comes from the board-peripherals file */
1926 spi->bits_per_word = 32;
1927
1928 ret = spi_setup(spi);
1929 if (ret < 0) {
1930 wl1271_error("spi_setup failed");
1931 goto out_free;
1932 }
1933
1934 wl->set_power = pdata->set_power;
1935 if (!wl->set_power) {
1936 wl1271_error("set power function missing in platform data");
1937 ret = -ENODEV;
1938 goto out_free;
1939 }
1940
1941 wl->irq = spi->irq;
1942 if (wl->irq < 0) {
1943 wl1271_error("irq missing in platform data");
1944 ret = -ENODEV;
1945 goto out_free;
1946 }
1947
1948 ret = request_irq(wl->irq, wl1271_irq, 0, DRIVER_NAME, wl);
1949 if (ret < 0) {
1950 wl1271_error("request_irq() failed: %d", ret);
1951 goto out_free;
1952 }
1953
1954 set_irq_type(wl->irq, IRQ_TYPE_EDGE_RISING);
1955
1956 disable_irq(wl->irq);
1957
1958 ret = platform_device_register(&wl1271_device);
1959 if (ret) {
1960 wl1271_error("couldn't register platform device");
1961 goto out_irq;
1962 }
1963 dev_set_drvdata(&wl1271_device.dev, wl);
1964
2b60100b
JO
1965 /* Apply default driver configuration. */
1966 wl1271_conf_init(wl);
1967
f5fc0f86
LC
1968 ret = wl1271_init_ieee80211(wl);
1969 if (ret)
1970 goto out_platform;
1971
1972 ret = wl1271_register_hw(wl);
1973 if (ret)
1974 goto out_platform;
1975
1976 wl1271_debugfs_init(wl);
1977
1978 wl1271_notice("initialized");
1979
1980 return 0;
1981
1982 out_platform:
1983 platform_device_unregister(&wl1271_device);
1984
1985 out_irq:
1986 free_irq(wl->irq, wl);
1987
1988 out_free:
f5fc0f86
LC
1989 ieee80211_free_hw(hw);
1990
1991 return ret;
1992}
1993
1994static int __devexit wl1271_remove(struct spi_device *spi)
1995{
1996 struct wl1271 *wl = dev_get_drvdata(&spi->dev);
1997
1998 ieee80211_unregister_hw(wl->hw);
1999
2000 wl1271_debugfs_exit(wl);
2001 platform_device_unregister(&wl1271_device);
2002 free_irq(wl->irq, wl);
2003 kfree(wl->target_mem_map);
1fba4974 2004 vfree(wl->fw);
f5fc0f86
LC
2005 wl->fw = NULL;
2006 kfree(wl->nvs);
2007 wl->nvs = NULL;
2008
f5fc0f86
LC
2009 kfree(wl->fw_status);
2010 kfree(wl->tx_res_if);
2011
2012 ieee80211_free_hw(wl->hw);
2013
2014 return 0;
2015}
2016
2017
2018static struct spi_driver wl1271_spi_driver = {
2019 .driver = {
2020 .name = "wl1271",
2021 .bus = &spi_bus_type,
2022 .owner = THIS_MODULE,
2023 },
2024
2025 .probe = wl1271_probe,
2026 .remove = __devexit_p(wl1271_remove),
2027};
2028
2029static int __init wl1271_init(void)
2030{
2031 int ret;
2032
2033 ret = spi_register_driver(&wl1271_spi_driver);
2034 if (ret < 0) {
2035 wl1271_error("failed to register spi driver: %d", ret);
2036 goto out;
2037 }
2038
2039out:
2040 return ret;
2041}
2042
2043static void __exit wl1271_exit(void)
2044{
2045 spi_unregister_driver(&wl1271_spi_driver);
2046
2047 wl1271_notice("unloaded");
2048}
2049
2050module_init(wl1271_init);
2051module_exit(wl1271_exit);
2052
2053MODULE_LICENSE("GPL");
2054MODULE_AUTHOR("Luciano Coelho <luciano.coelho@nokia.com>");
2f018725 2055MODULE_AUTHOR("Juuso Oikarinen <juuso.oikarinen@nokia.com>");
49f146de 2056MODULE_FIRMWARE(WL1271_FW_NAME);