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