]> bbs.cooldavid.org Git - net-next-2.6.git/blame - drivers/net/wireless/wl12xx/wl1271_main.c
wl1271: use the correct macro when setting the basic rates
[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,
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
c7f43e45
LC
1133static int wl1271_join_channel(struct wl1271 *wl, int channel)
1134{
1135 int ret;
1136 /* we need to use a dummy BSSID for now */
1137 static const u8 dummy_bssid[ETH_ALEN] = { 0x0b, 0xad, 0xde,
1138 0xad, 0xbe, 0xef };
1139
1140 /* disable mac filter, so we hear everything */
1141 wl->rx_config &= ~CFG_BSSID_FILTER_EN;
1142
1143 wl->channel = channel;
1144 memcpy(wl->bssid, dummy_bssid, ETH_ALEN);
1145
1146 ret = wl1271_cmd_join(wl);
1147 if (ret < 0)
1148 goto out;
1149
1150 wl->joined = true;
1151
1152out:
1153 return ret;
1154}
1155
1156static int wl1271_unjoin_channel(struct wl1271 *wl)
1157{
1158 int ret;
1159
1160 /* to stop listening to a channel, we disconnect */
1161 ret = wl1271_cmd_disconnect(wl);
1162 if (ret < 0)
1163 goto out;
1164
1165 wl->joined = false;
1166 wl->channel = 0;
1167 memset(wl->bssid, 0, ETH_ALEN);
1168 wl->rx_config = WL1271_DEFAULT_RX_CONFIG;
1169
1170out:
1171 return ret;
1172}
1173
f5fc0f86
LC
1174static int wl1271_op_config(struct ieee80211_hw *hw, u32 changed)
1175{
1176 struct wl1271 *wl = hw->priv;
1177 struct ieee80211_conf *conf = &hw->conf;
1178 int channel, ret = 0;
1179
1180 channel = ieee80211_frequency_to_channel(conf->channel->center_freq);
1181
c7f43e45 1182 wl1271_debug(DEBUG_MAC80211, "mac80211 config ch %d psm %s power %d %s",
f5fc0f86
LC
1183 channel,
1184 conf->flags & IEEE80211_CONF_PS ? "on" : "off",
c7f43e45
LC
1185 conf->power_level,
1186 conf->flags & IEEE80211_CONF_IDLE ? "idle" : "in use");
f5fc0f86
LC
1187
1188 mutex_lock(&wl->mutex);
1189
8a5a37a6
JO
1190 wl->band = conf->channel->band;
1191
f5fc0f86
LC
1192 ret = wl1271_ps_elp_wakeup(wl, false);
1193 if (ret < 0)
1194 goto out;
1195
c7f43e45
LC
1196 if (changed & IEEE80211_CONF_CHANGE_IDLE) {
1197 if (conf->flags & IEEE80211_CONF_IDLE && wl->joined)
1198 wl1271_unjoin_channel(wl);
1199 else
1200 wl1271_join_channel(wl, channel);
f5fc0f86
LC
1201 }
1202
c7f43e45
LC
1203 /* if the channel changes while joined, join again */
1204 if (channel != wl->channel && wl->joined)
1205 wl1271_join_channel(wl, channel);
1206
f5fc0f86
LC
1207 if (conf->flags & IEEE80211_CONF_PS && !wl->psm_requested) {
1208 wl1271_info("psm enabled");
1209
1210 wl->psm_requested = true;
1211
1212 /*
1213 * We enter PSM only if we're already associated.
1214 * If we're not, we'll enter it when joining an SSID,
1215 * through the bss_info_changed() hook.
1216 */
1217 ret = wl1271_ps_set_mode(wl, STATION_POWER_SAVE_MODE);
1218 } else if (!(conf->flags & IEEE80211_CONF_PS) &&
1219 wl->psm_requested) {
1220 wl1271_info("psm disabled");
1221
1222 wl->psm_requested = false;
1223
1224 if (wl->psm)
1225 ret = wl1271_ps_set_mode(wl, STATION_ACTIVE_MODE);
1226 }
1227
1228 if (conf->power_level != wl->power_level) {
1229 ret = wl1271_acx_tx_power(wl, conf->power_level);
1230 if (ret < 0)
c6317a54 1231 goto out_sleep;
f5fc0f86
LC
1232
1233 wl->power_level = conf->power_level;
1234 }
1235
1236out_sleep:
1237 wl1271_ps_elp_sleep(wl);
1238
1239out:
1240 mutex_unlock(&wl->mutex);
1241
1242 return ret;
1243}
1244
b54853f1
JO
1245struct wl1271_filter_params {
1246 bool enabled;
1247 int mc_list_length;
1248 u8 mc_list[ACX_MC_ADDRESS_GROUP_MAX][ETH_ALEN];
1249};
1250
c87dec9f
JO
1251static u64 wl1271_op_prepare_multicast(struct ieee80211_hw *hw, int mc_count,
1252 struct dev_addr_list *mc_list)
1253{
c87dec9f 1254 struct wl1271_filter_params *fp;
c87dec9f
JO
1255 int i;
1256
74441130 1257 fp = kzalloc(sizeof(*fp), GFP_ATOMIC);
c87dec9f
JO
1258 if (!fp) {
1259 wl1271_error("Out of memory setting filters.");
1260 return 0;
1261 }
1262
1263 /* update multicast filtering parameters */
b54853f1 1264 fp->enabled = true;
c87dec9f
JO
1265 if (mc_count > ACX_MC_ADDRESS_GROUP_MAX) {
1266 mc_count = 0;
b54853f1 1267 fp->enabled = false;
c87dec9f
JO
1268 }
1269
1270 fp->mc_list_length = 0;
1271 for (i = 0; i < mc_count; i++) {
1272 if (mc_list->da_addrlen == ETH_ALEN) {
1273 memcpy(fp->mc_list[fp->mc_list_length],
1274 mc_list->da_addr, ETH_ALEN);
1275 fp->mc_list_length++;
1276 } else
1277 wl1271_warning("Unknown mc address length.");
74441130 1278 mc_list = mc_list->next;
c87dec9f
JO
1279 }
1280
b54853f1 1281 return (u64)(unsigned long)fp;
c87dec9f 1282}
f5fc0f86 1283
b54853f1
JO
1284#define WL1271_SUPPORTED_FILTERS (FIF_PROMISC_IN_BSS | \
1285 FIF_ALLMULTI | \
1286 FIF_FCSFAIL | \
1287 FIF_BCN_PRBRESP_PROMISC | \
1288 FIF_CONTROL | \
1289 FIF_OTHER_BSS)
1290
f5fc0f86
LC
1291static void wl1271_op_configure_filter(struct ieee80211_hw *hw,
1292 unsigned int changed,
c87dec9f 1293 unsigned int *total, u64 multicast)
f5fc0f86 1294{
b54853f1 1295 struct wl1271_filter_params *fp = (void *)(unsigned long)multicast;
f5fc0f86 1296 struct wl1271 *wl = hw->priv;
b54853f1 1297 int ret;
f5fc0f86
LC
1298
1299 wl1271_debug(DEBUG_MAC80211, "mac80211 configure filter");
1300
b54853f1
JO
1301 mutex_lock(&wl->mutex);
1302
1303 if (wl->state == WL1271_STATE_OFF)
1304 goto out;
1305
1306 ret = wl1271_ps_elp_wakeup(wl, false);
1307 if (ret < 0)
1308 goto out;
1309
f5fc0f86
LC
1310 *total &= WL1271_SUPPORTED_FILTERS;
1311 changed &= WL1271_SUPPORTED_FILTERS;
1312
b54853f1
JO
1313 if (*total & FIF_ALLMULTI)
1314 ret = wl1271_acx_group_address_tbl(wl, false, NULL, 0);
1315 else if (fp)
1316 ret = wl1271_acx_group_address_tbl(wl, fp->enabled,
1317 fp->mc_list,
1318 fp->mc_list_length);
1319 if (ret < 0)
1320 goto out_sleep;
f5fc0f86 1321
b54853f1
JO
1322 kfree(fp);
1323
1324 /* FIXME: We still need to set our filters properly */
c87dec9f 1325
b54853f1
JO
1326 /* determine, whether supported filter values have changed */
1327 if (changed == 0)
1328 goto out_sleep;
c87dec9f 1329
b54853f1
JO
1330 /* apply configured filters */
1331 ret = wl1271_acx_rx_config(wl, wl->rx_config, wl->rx_filter);
1332 if (ret < 0)
1333 goto out_sleep;
1334
1335out_sleep:
1336 wl1271_ps_elp_sleep(wl);
1337
1338out:
1339 mutex_unlock(&wl->mutex);
f5fc0f86
LC
1340}
1341
1342static int wl1271_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
1343 struct ieee80211_vif *vif,
1344 struct ieee80211_sta *sta,
1345 struct ieee80211_key_conf *key_conf)
1346{
1347 struct wl1271 *wl = hw->priv;
1348 const u8 *addr;
1349 int ret;
ac4e4ce5
JO
1350 u32 tx_seq_32 = 0;
1351 u16 tx_seq_16 = 0;
f5fc0f86
LC
1352 u8 key_type;
1353
1354 static const u8 bcast_addr[ETH_ALEN] =
1355 { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
1356
1357 wl1271_debug(DEBUG_MAC80211, "mac80211 set key");
1358
1359 addr = sta ? sta->addr : bcast_addr;
1360
1361 wl1271_debug(DEBUG_CRYPT, "CMD: 0x%x", cmd);
1362 wl1271_dump(DEBUG_CRYPT, "ADDR: ", addr, ETH_ALEN);
1363 wl1271_debug(DEBUG_CRYPT, "Key: algo:0x%x, id:%d, len:%d flags 0x%x",
1364 key_conf->alg, key_conf->keyidx,
1365 key_conf->keylen, key_conf->flags);
1366 wl1271_dump(DEBUG_CRYPT, "KEY: ", key_conf->key, key_conf->keylen);
1367
1368 if (is_zero_ether_addr(addr)) {
1369 /* We dont support TX only encryption */
1370 ret = -EOPNOTSUPP;
1371 goto out;
1372 }
1373
1374 mutex_lock(&wl->mutex);
1375
1376 ret = wl1271_ps_elp_wakeup(wl, false);
1377 if (ret < 0)
1378 goto out_unlock;
1379
1380 switch (key_conf->alg) {
1381 case ALG_WEP:
1382 key_type = KEY_WEP;
1383
1384 key_conf->hw_key_idx = key_conf->keyidx;
1385 break;
1386 case ALG_TKIP:
1387 key_type = KEY_TKIP;
1388
1389 key_conf->hw_key_idx = key_conf->keyidx;
ac4e4ce5
JO
1390 tx_seq_32 = wl->tx_security_seq_32;
1391 tx_seq_16 = wl->tx_security_seq_16;
f5fc0f86
LC
1392 break;
1393 case ALG_CCMP:
1394 key_type = KEY_AES;
1395
1396 key_conf->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
ac4e4ce5
JO
1397 tx_seq_32 = wl->tx_security_seq_32;
1398 tx_seq_16 = wl->tx_security_seq_16;
f5fc0f86
LC
1399 break;
1400 default:
1401 wl1271_error("Unknown key algo 0x%x", key_conf->alg);
1402
1403 ret = -EOPNOTSUPP;
1404 goto out_sleep;
1405 }
1406
1407 switch (cmd) {
1408 case SET_KEY:
1409 ret = wl1271_cmd_set_key(wl, KEY_ADD_OR_REPLACE,
1410 key_conf->keyidx, key_type,
1411 key_conf->keylen, key_conf->key,
ac4e4ce5 1412 addr, tx_seq_32, tx_seq_16);
f5fc0f86
LC
1413 if (ret < 0) {
1414 wl1271_error("Could not add or replace key");
1415 goto out_sleep;
1416 }
1417 break;
1418
1419 case DISABLE_KEY:
1420 ret = wl1271_cmd_set_key(wl, KEY_REMOVE,
1421 key_conf->keyidx, key_type,
1422 key_conf->keylen, key_conf->key,
ac4e4ce5 1423 addr, 0, 0);
f5fc0f86
LC
1424 if (ret < 0) {
1425 wl1271_error("Could not remove key");
1426 goto out_sleep;
1427 }
1428 break;
1429
1430 default:
1431 wl1271_error("Unsupported key cmd 0x%x", cmd);
1432 ret = -EOPNOTSUPP;
1433 goto out_sleep;
1434
1435 break;
1436 }
1437
1438out_sleep:
1439 wl1271_ps_elp_sleep(wl);
1440
1441out_unlock:
1442 mutex_unlock(&wl->mutex);
1443
1444out:
1445 return ret;
1446}
1447
1448static int wl1271_op_hw_scan(struct ieee80211_hw *hw,
1449 struct cfg80211_scan_request *req)
1450{
1451 struct wl1271 *wl = hw->priv;
1452 int ret;
1453 u8 *ssid = NULL;
abb0b3bf 1454 size_t len = 0;
f5fc0f86
LC
1455
1456 wl1271_debug(DEBUG_MAC80211, "mac80211 hw scan");
1457
1458 if (req->n_ssids) {
1459 ssid = req->ssids[0].ssid;
abb0b3bf 1460 len = req->ssids[0].ssid_len;
f5fc0f86
LC
1461 }
1462
1463 mutex_lock(&wl->mutex);
1464
1465 ret = wl1271_ps_elp_wakeup(wl, false);
1466 if (ret < 0)
1467 goto out;
1468
abb0b3bf
TP
1469 if (wl1271_11a_enabled())
1470 ret = wl1271_cmd_scan(hw->priv, ssid, len, 1, 0,
1471 WL1271_SCAN_BAND_DUAL, 3);
1472 else
1473 ret = wl1271_cmd_scan(hw->priv, ssid, len, 1, 0,
1474 WL1271_SCAN_BAND_2_4_GHZ, 3);
f5fc0f86
LC
1475
1476 wl1271_ps_elp_sleep(wl);
1477
1478out:
1479 mutex_unlock(&wl->mutex);
1480
1481 return ret;
1482}
1483
1484static int wl1271_op_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
1485{
1486 struct wl1271 *wl = hw->priv;
1487 int ret;
1488
1489 mutex_lock(&wl->mutex);
1490
1491 ret = wl1271_ps_elp_wakeup(wl, false);
1492 if (ret < 0)
1493 goto out;
1494
1495 ret = wl1271_acx_rts_threshold(wl, (u16) value);
1496 if (ret < 0)
1497 wl1271_warning("wl1271_op_set_rts_threshold failed: %d", ret);
1498
1499 wl1271_ps_elp_sleep(wl);
1500
1501out:
1502 mutex_unlock(&wl->mutex);
1503
1504 return ret;
1505}
1506
8a5a37a6
JO
1507static u32 wl1271_enabled_rates_get(struct wl1271 *wl, u64 basic_rate_set)
1508{
1509 struct ieee80211_supported_band *band;
1510 u32 enabled_rates = 0;
1511 int bit;
1512
1513 band = wl->hw->wiphy->bands[wl->band];
1514 for (bit = 0; bit < band->n_bitrates; bit++) {
1515 if (basic_rate_set & 0x1)
1516 enabled_rates |= band->bitrates[bit].hw_value;
1517 basic_rate_set >>= 1;
1518 }
1519
1520 return enabled_rates;
1521}
1522
f5fc0f86
LC
1523static void wl1271_op_bss_info_changed(struct ieee80211_hw *hw,
1524 struct ieee80211_vif *vif,
1525 struct ieee80211_bss_conf *bss_conf,
1526 u32 changed)
1527{
1528 enum wl1271_cmd_ps_mode mode;
1529 struct wl1271 *wl = hw->priv;
1530 int ret;
1531
1532 wl1271_debug(DEBUG_MAC80211, "mac80211 bss info changed");
1533
1534 mutex_lock(&wl->mutex);
1535
1536 ret = wl1271_ps_elp_wakeup(wl, false);
1537 if (ret < 0)
1538 goto out;
1539
c7f43e45
LC
1540 if ((changed & BSS_CHANGED_BSSID) &&
1541 /*
1542 * Now we know the correct bssid, so we send a new join command
1543 * and enable the BSSID filter
1544 */
1545 memcmp(wl->bssid, bss_conf->bssid, ETH_ALEN)) {
1546 wl->rx_config |= CFG_BSSID_FILTER_EN;
1547 memcpy(wl->bssid, bss_conf->bssid, ETH_ALEN);
bdcbbb94
LC
1548 ret = wl1271_cmd_build_null_data(wl);
1549 if (ret < 0) {
1550 wl1271_warning("cmd buld null data failed %d",
1551 ret);
1552 goto out_sleep;
1553 }
cd264769
LC
1554 ret = wl1271_cmd_join(wl);
1555 if (ret < 0) {
1556 wl1271_warning("cmd join failed %d", ret);
1557 goto out_sleep;
1558 }
c7f43e45
LC
1559 wl->joined = true;
1560 }
1561
f5fc0f86
LC
1562 if (changed & BSS_CHANGED_ASSOC) {
1563 if (bss_conf->assoc) {
1564 wl->aid = bss_conf->aid;
1565
ae751bab
LC
1566 /*
1567 * with wl1271, we don't need to update the
1568 * beacon_int and dtim_period, because the firmware
1569 * updates it by itself when the first beacon is
1570 * received after a join.
1571 */
f5fc0f86
LC
1572 ret = wl1271_cmd_build_ps_poll(wl, wl->aid);
1573 if (ret < 0)
1574 goto out_sleep;
1575
1576 ret = wl1271_acx_aid(wl, wl->aid);
1577 if (ret < 0)
1578 goto out_sleep;
1579
1580 /* If we want to go in PSM but we're not there yet */
1581 if (wl->psm_requested && !wl->psm) {
1582 mode = STATION_POWER_SAVE_MODE;
1583 ret = wl1271_ps_set_mode(wl, mode);
1584 if (ret < 0)
1585 goto out_sleep;
1586 }
d94cd297
JO
1587 } else {
1588 /* use defaults when not associated */
d94cd297
JO
1589 wl->basic_rate_set = WL1271_DEFAULT_BASIC_RATE_SET;
1590 wl->aid = 0;
f5fc0f86 1591 }
d94cd297 1592
f5fc0f86 1593 }
8a5a37a6 1594
f5fc0f86
LC
1595 if (changed & BSS_CHANGED_ERP_SLOT) {
1596 if (bss_conf->use_short_slot)
1597 ret = wl1271_acx_slot(wl, SLOT_TIME_SHORT);
1598 else
1599 ret = wl1271_acx_slot(wl, SLOT_TIME_LONG);
1600 if (ret < 0) {
1601 wl1271_warning("Set slot time failed %d", ret);
1602 goto out_sleep;
1603 }
1604 }
1605
1606 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
1607 if (bss_conf->use_short_preamble)
1608 wl1271_acx_set_preamble(wl, ACX_PREAMBLE_SHORT);
1609 else
1610 wl1271_acx_set_preamble(wl, ACX_PREAMBLE_LONG);
1611 }
1612
1613 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
1614 if (bss_conf->use_cts_prot)
1615 ret = wl1271_acx_cts_protect(wl, CTSPROTECT_ENABLE);
1616 else
1617 ret = wl1271_acx_cts_protect(wl, CTSPROTECT_DISABLE);
1618 if (ret < 0) {
1619 wl1271_warning("Set ctsprotect failed %d", ret);
1620 goto out_sleep;
1621 }
1622 }
1623
8a5a37a6 1624 if (changed & BSS_CHANGED_BASIC_RATES) {
d94cd297 1625 wl->basic_rate_set = wl1271_enabled_rates_get(
8a5a37a6 1626 wl, bss_conf->basic_rates);
d94cd297 1627
ae751bab 1628 ret = wl1271_acx_rate_policies(wl, wl->basic_rate_set);
8a5a37a6
JO
1629 if (ret < 0) {
1630 wl1271_warning("Set rate policies failed %d", ret);
1631 goto out_sleep;
1632 }
1633 }
1634
f5fc0f86
LC
1635out_sleep:
1636 wl1271_ps_elp_sleep(wl);
1637
1638out:
1639 mutex_unlock(&wl->mutex);
1640}
1641
1642
1643/* can't be const, mac80211 writes to this */
1644static struct ieee80211_rate wl1271_rates[] = {
1645 { .bitrate = 10,
2b60100b
JO
1646 .hw_value = CONF_HW_BIT_RATE_1MBPS,
1647 .hw_value_short = CONF_HW_BIT_RATE_1MBPS, },
f5fc0f86 1648 { .bitrate = 20,
2b60100b
JO
1649 .hw_value = CONF_HW_BIT_RATE_2MBPS,
1650 .hw_value_short = CONF_HW_BIT_RATE_2MBPS,
f5fc0f86
LC
1651 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
1652 { .bitrate = 55,
2b60100b
JO
1653 .hw_value = CONF_HW_BIT_RATE_5_5MBPS,
1654 .hw_value_short = CONF_HW_BIT_RATE_5_5MBPS,
f5fc0f86
LC
1655 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
1656 { .bitrate = 110,
2b60100b
JO
1657 .hw_value = CONF_HW_BIT_RATE_11MBPS,
1658 .hw_value_short = CONF_HW_BIT_RATE_11MBPS,
f5fc0f86
LC
1659 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
1660 { .bitrate = 60,
2b60100b
JO
1661 .hw_value = CONF_HW_BIT_RATE_6MBPS,
1662 .hw_value_short = CONF_HW_BIT_RATE_6MBPS, },
f5fc0f86 1663 { .bitrate = 90,
2b60100b
JO
1664 .hw_value = CONF_HW_BIT_RATE_9MBPS,
1665 .hw_value_short = CONF_HW_BIT_RATE_9MBPS, },
f5fc0f86 1666 { .bitrate = 120,
2b60100b
JO
1667 .hw_value = CONF_HW_BIT_RATE_12MBPS,
1668 .hw_value_short = CONF_HW_BIT_RATE_12MBPS, },
f5fc0f86 1669 { .bitrate = 180,
2b60100b
JO
1670 .hw_value = CONF_HW_BIT_RATE_18MBPS,
1671 .hw_value_short = CONF_HW_BIT_RATE_18MBPS, },
f5fc0f86 1672 { .bitrate = 240,
2b60100b
JO
1673 .hw_value = CONF_HW_BIT_RATE_24MBPS,
1674 .hw_value_short = CONF_HW_BIT_RATE_24MBPS, },
f5fc0f86 1675 { .bitrate = 360,
2b60100b
JO
1676 .hw_value = CONF_HW_BIT_RATE_36MBPS,
1677 .hw_value_short = CONF_HW_BIT_RATE_36MBPS, },
f5fc0f86 1678 { .bitrate = 480,
2b60100b
JO
1679 .hw_value = CONF_HW_BIT_RATE_48MBPS,
1680 .hw_value_short = CONF_HW_BIT_RATE_48MBPS, },
f5fc0f86 1681 { .bitrate = 540,
2b60100b
JO
1682 .hw_value = CONF_HW_BIT_RATE_54MBPS,
1683 .hw_value_short = CONF_HW_BIT_RATE_54MBPS, },
f5fc0f86
LC
1684};
1685
1686/* can't be const, mac80211 writes to this */
1687static struct ieee80211_channel wl1271_channels[] = {
a2d0e3f1
LC
1688 { .hw_value = 1, .center_freq = 2412, .max_power = 25 },
1689 { .hw_value = 2, .center_freq = 2417, .max_power = 25 },
1690 { .hw_value = 3, .center_freq = 2422, .max_power = 25 },
1691 { .hw_value = 4, .center_freq = 2427, .max_power = 25 },
1692 { .hw_value = 5, .center_freq = 2432, .max_power = 25 },
1693 { .hw_value = 6, .center_freq = 2437, .max_power = 25 },
1694 { .hw_value = 7, .center_freq = 2442, .max_power = 25 },
1695 { .hw_value = 8, .center_freq = 2447, .max_power = 25 },
1696 { .hw_value = 9, .center_freq = 2452, .max_power = 25 },
1697 { .hw_value = 10, .center_freq = 2457, .max_power = 25 },
1698 { .hw_value = 11, .center_freq = 2462, .max_power = 25 },
1699 { .hw_value = 12, .center_freq = 2467, .max_power = 25 },
1700 { .hw_value = 13, .center_freq = 2472, .max_power = 25 },
f5fc0f86
LC
1701};
1702
1703/* can't be const, mac80211 writes to this */
1704static struct ieee80211_supported_band wl1271_band_2ghz = {
1705 .channels = wl1271_channels,
1706 .n_channels = ARRAY_SIZE(wl1271_channels),
1707 .bitrates = wl1271_rates,
1708 .n_bitrates = ARRAY_SIZE(wl1271_rates),
1709};
1710
1ebec3d7
TP
1711/* 5 GHz data rates for WL1273 */
1712static struct ieee80211_rate wl1271_rates_5ghz[] = {
1713 { .bitrate = 60,
1714 .hw_value = CONF_HW_BIT_RATE_6MBPS,
1715 .hw_value_short = CONF_HW_BIT_RATE_6MBPS, },
1716 { .bitrate = 90,
1717 .hw_value = CONF_HW_BIT_RATE_9MBPS,
1718 .hw_value_short = CONF_HW_BIT_RATE_9MBPS, },
1719 { .bitrate = 120,
1720 .hw_value = CONF_HW_BIT_RATE_12MBPS,
1721 .hw_value_short = CONF_HW_BIT_RATE_12MBPS, },
1722 { .bitrate = 180,
1723 .hw_value = CONF_HW_BIT_RATE_18MBPS,
1724 .hw_value_short = CONF_HW_BIT_RATE_18MBPS, },
1725 { .bitrate = 240,
1726 .hw_value = CONF_HW_BIT_RATE_24MBPS,
1727 .hw_value_short = CONF_HW_BIT_RATE_24MBPS, },
1728 { .bitrate = 360,
1729 .hw_value = CONF_HW_BIT_RATE_36MBPS,
1730 .hw_value_short = CONF_HW_BIT_RATE_36MBPS, },
1731 { .bitrate = 480,
1732 .hw_value = CONF_HW_BIT_RATE_48MBPS,
1733 .hw_value_short = CONF_HW_BIT_RATE_48MBPS, },
1734 { .bitrate = 540,
1735 .hw_value = CONF_HW_BIT_RATE_54MBPS,
1736 .hw_value_short = CONF_HW_BIT_RATE_54MBPS, },
1737};
1738
1739/* 5 GHz band channels for WL1273 */
1740static struct ieee80211_channel wl1271_channels_5ghz[] = {
1741 { .hw_value = 183, .center_freq = 4915},
1742 { .hw_value = 184, .center_freq = 4920},
1743 { .hw_value = 185, .center_freq = 4925},
1744 { .hw_value = 187, .center_freq = 4935},
1745 { .hw_value = 188, .center_freq = 4940},
1746 { .hw_value = 189, .center_freq = 4945},
1747 { .hw_value = 192, .center_freq = 4960},
1748 { .hw_value = 196, .center_freq = 4980},
1749 { .hw_value = 7, .center_freq = 5035},
1750 { .hw_value = 8, .center_freq = 5040},
1751 { .hw_value = 9, .center_freq = 5045},
1752 { .hw_value = 11, .center_freq = 5055},
1753 { .hw_value = 12, .center_freq = 5060},
1754 { .hw_value = 16, .center_freq = 5080},
1755 { .hw_value = 34, .center_freq = 5170},
1756 { .hw_value = 36, .center_freq = 5180},
1757 { .hw_value = 38, .center_freq = 5190},
1758 { .hw_value = 40, .center_freq = 5200},
1759 { .hw_value = 42, .center_freq = 5210},
1760 { .hw_value = 44, .center_freq = 5220},
1761 { .hw_value = 46, .center_freq = 5230},
1762 { .hw_value = 48, .center_freq = 5240},
1763 { .hw_value = 52, .center_freq = 5260},
1764 { .hw_value = 56, .center_freq = 5280},
1765 { .hw_value = 60, .center_freq = 5300},
1766 { .hw_value = 64, .center_freq = 5320},
1767 { .hw_value = 100, .center_freq = 5500},
1768 { .hw_value = 104, .center_freq = 5520},
1769 { .hw_value = 108, .center_freq = 5540},
1770 { .hw_value = 112, .center_freq = 5560},
1771 { .hw_value = 116, .center_freq = 5580},
1772 { .hw_value = 120, .center_freq = 5600},
1773 { .hw_value = 124, .center_freq = 5620},
1774 { .hw_value = 128, .center_freq = 5640},
1775 { .hw_value = 132, .center_freq = 5660},
1776 { .hw_value = 136, .center_freq = 5680},
1777 { .hw_value = 140, .center_freq = 5700},
1778 { .hw_value = 149, .center_freq = 5745},
1779 { .hw_value = 153, .center_freq = 5765},
1780 { .hw_value = 157, .center_freq = 5785},
1781 { .hw_value = 161, .center_freq = 5805},
1782 { .hw_value = 165, .center_freq = 5825},
1783};
1784
1785
1786static struct ieee80211_supported_band wl1271_band_5ghz = {
1787 .channels = wl1271_channels_5ghz,
1788 .n_channels = ARRAY_SIZE(wl1271_channels_5ghz),
1789 .bitrates = wl1271_rates_5ghz,
1790 .n_bitrates = ARRAY_SIZE(wl1271_rates_5ghz),
1791};
1792
f5fc0f86
LC
1793static const struct ieee80211_ops wl1271_ops = {
1794 .start = wl1271_op_start,
1795 .stop = wl1271_op_stop,
1796 .add_interface = wl1271_op_add_interface,
1797 .remove_interface = wl1271_op_remove_interface,
1798 .config = wl1271_op_config,
1799/* .config_interface = wl1271_op_config_interface, */
c87dec9f 1800 .prepare_multicast = wl1271_op_prepare_multicast,
f5fc0f86
LC
1801 .configure_filter = wl1271_op_configure_filter,
1802 .tx = wl1271_op_tx,
1803 .set_key = wl1271_op_set_key,
1804 .hw_scan = wl1271_op_hw_scan,
1805 .bss_info_changed = wl1271_op_bss_info_changed,
1806 .set_rts_threshold = wl1271_op_set_rts_threshold,
1807};
1808
1809static int wl1271_register_hw(struct wl1271 *wl)
1810{
1811 int ret;
1812
1813 if (wl->mac80211_registered)
1814 return 0;
1815
1816 SET_IEEE80211_PERM_ADDR(wl->hw, wl->mac_addr);
1817
1818 ret = ieee80211_register_hw(wl->hw);
1819 if (ret < 0) {
1820 wl1271_error("unable to register mac80211 hw: %d", ret);
1821 return ret;
1822 }
1823
1824 wl->mac80211_registered = true;
1825
1826 wl1271_notice("loaded");
1827
1828 return 0;
1829}
1830
1831static int wl1271_init_ieee80211(struct wl1271 *wl)
1832{
1e2b7976
JO
1833 /* The tx descriptor buffer and the TKIP space. */
1834 wl->hw->extra_tx_headroom = WL1271_TKIP_IV_SPACE +
1835 sizeof(struct wl1271_tx_hw_descr);
f5fc0f86
LC
1836
1837 /* unit us */
1838 /* FIXME: find a proper value */
1839 wl->hw->channel_change_time = 10000;
1840
1841 wl->hw->flags = IEEE80211_HW_SIGNAL_DBM |
1922167b 1842 IEEE80211_HW_NOISE_DBM |
03442a33
JO
1843 IEEE80211_HW_BEACON_FILTER |
1844 IEEE80211_HW_SUPPORTS_PS;
f5fc0f86
LC
1845
1846 wl->hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION);
1847 wl->hw->wiphy->max_scan_ssids = 1;
1848 wl->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = &wl1271_band_2ghz;
1849
1ebec3d7
TP
1850 if (wl1271_11a_enabled())
1851 wl->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = &wl1271_band_5ghz;
1852
f5fc0f86
LC
1853 SET_IEEE80211_DEV(wl->hw, &wl->spi->dev);
1854
1855 return 0;
1856}
1857
1858static void wl1271_device_release(struct device *dev)
1859{
1860
1861}
1862
1863static struct platform_device wl1271_device = {
1864 .name = "wl1271",
1865 .id = -1,
1866
1867 /* device model insists to have a release function */
1868 .dev = {
1869 .release = wl1271_device_release,
1870 },
1871};
1872
1873#define WL1271_DEFAULT_CHANNEL 0
1874static int __devinit wl1271_probe(struct spi_device *spi)
1875{
1876 struct wl12xx_platform_data *pdata;
1877 struct ieee80211_hw *hw;
1878 struct wl1271 *wl;
1879 int ret, i;
1880 static const u8 nokia_oui[3] = {0x00, 0x1f, 0xdf};
1881
1882 pdata = spi->dev.platform_data;
1883 if (!pdata) {
1884 wl1271_error("no platform data");
1885 return -ENODEV;
1886 }
1887
1888 hw = ieee80211_alloc_hw(sizeof(*wl), &wl1271_ops);
1889 if (!hw) {
1890 wl1271_error("could not alloc ieee80211_hw");
1891 return -ENOMEM;
1892 }
1893
1894 wl = hw->priv;
1895 memset(wl, 0, sizeof(*wl));
1896
01c09162
JO
1897 INIT_LIST_HEAD(&wl->list);
1898
f5fc0f86
LC
1899 wl->hw = hw;
1900 dev_set_drvdata(&spi->dev, wl);
1901 wl->spi = spi;
1902
1903 skb_queue_head_init(&wl->tx_queue);
1904
37b70a81 1905 INIT_DELAYED_WORK(&wl->elp_work, wl1271_elp_work);
f5fc0f86
LC
1906 wl->channel = WL1271_DEFAULT_CHANNEL;
1907 wl->scanning = false;
1908 wl->default_key = 0;
f5fc0f86
LC
1909 wl->rx_counter = 0;
1910 wl->rx_config = WL1271_DEFAULT_RX_CONFIG;
1911 wl->rx_filter = WL1271_DEFAULT_RX_FILTER;
1912 wl->elp = false;
1913 wl->psm = 0;
1914 wl->psm_requested = false;
19ad0715 1915 wl->psm_entry_retry = 0;
f5fc0f86
LC
1916 wl->tx_queue_stopped = false;
1917 wl->power_level = WL1271_DEFAULT_POWER_LEVEL;
d94cd297 1918 wl->basic_rate_set = WL1271_DEFAULT_BASIC_RATE_SET;
8a5a37a6 1919 wl->band = IEEE80211_BAND_2GHZ;
b771eee5 1920 wl->vif = NULL;
d6e19d13 1921 wl->joined = false;
f5fc0f86 1922
be7078c2 1923 for (i = 0; i < ACX_TX_DESCRIPTORS; i++)
f5fc0f86
LC
1924 wl->tx_frames[i] = NULL;
1925
1926 spin_lock_init(&wl->wl_lock);
1927
1928 /*
1929 * In case our MAC address is not correctly set,
1930 * we use a random but Nokia MAC.
1931 */
1932 memcpy(wl->mac_addr, nokia_oui, 3);
1933 get_random_bytes(wl->mac_addr + 3, 3);
1934
1935 wl->state = WL1271_STATE_OFF;
1936 mutex_init(&wl->mutex);
1937
f5fc0f86
LC
1938 /* This is the only SPI value that we need to set here, the rest
1939 * comes from the board-peripherals file */
1940 spi->bits_per_word = 32;
1941
1942 ret = spi_setup(spi);
1943 if (ret < 0) {
1944 wl1271_error("spi_setup failed");
1945 goto out_free;
1946 }
1947
1948 wl->set_power = pdata->set_power;
1949 if (!wl->set_power) {
1950 wl1271_error("set power function missing in platform data");
1951 ret = -ENODEV;
1952 goto out_free;
1953 }
1954
1955 wl->irq = spi->irq;
1956 if (wl->irq < 0) {
1957 wl1271_error("irq missing in platform data");
1958 ret = -ENODEV;
1959 goto out_free;
1960 }
1961
1962 ret = request_irq(wl->irq, wl1271_irq, 0, DRIVER_NAME, wl);
1963 if (ret < 0) {
1964 wl1271_error("request_irq() failed: %d", ret);
1965 goto out_free;
1966 }
1967
1968 set_irq_type(wl->irq, IRQ_TYPE_EDGE_RISING);
1969
1970 disable_irq(wl->irq);
1971
1972 ret = platform_device_register(&wl1271_device);
1973 if (ret) {
1974 wl1271_error("couldn't register platform device");
1975 goto out_irq;
1976 }
1977 dev_set_drvdata(&wl1271_device.dev, wl);
1978
2b60100b
JO
1979 /* Apply default driver configuration. */
1980 wl1271_conf_init(wl);
1981
f5fc0f86
LC
1982 ret = wl1271_init_ieee80211(wl);
1983 if (ret)
1984 goto out_platform;
1985
1986 ret = wl1271_register_hw(wl);
1987 if (ret)
1988 goto out_platform;
1989
1990 wl1271_debugfs_init(wl);
1991
1992 wl1271_notice("initialized");
1993
1994 return 0;
1995
1996 out_platform:
1997 platform_device_unregister(&wl1271_device);
1998
1999 out_irq:
2000 free_irq(wl->irq, wl);
2001
2002 out_free:
f5fc0f86
LC
2003 ieee80211_free_hw(hw);
2004
2005 return ret;
2006}
2007
2008static int __devexit wl1271_remove(struct spi_device *spi)
2009{
2010 struct wl1271 *wl = dev_get_drvdata(&spi->dev);
2011
2012 ieee80211_unregister_hw(wl->hw);
2013
2014 wl1271_debugfs_exit(wl);
2015 platform_device_unregister(&wl1271_device);
2016 free_irq(wl->irq, wl);
2017 kfree(wl->target_mem_map);
1fba4974 2018 vfree(wl->fw);
f5fc0f86
LC
2019 wl->fw = NULL;
2020 kfree(wl->nvs);
2021 wl->nvs = NULL;
2022
f5fc0f86
LC
2023 kfree(wl->fw_status);
2024 kfree(wl->tx_res_if);
2025
2026 ieee80211_free_hw(wl->hw);
2027
2028 return 0;
2029}
2030
2031
2032static struct spi_driver wl1271_spi_driver = {
2033 .driver = {
2034 .name = "wl1271",
2035 .bus = &spi_bus_type,
2036 .owner = THIS_MODULE,
2037 },
2038
2039 .probe = wl1271_probe,
2040 .remove = __devexit_p(wl1271_remove),
2041};
2042
2043static int __init wl1271_init(void)
2044{
2045 int ret;
2046
2047 ret = spi_register_driver(&wl1271_spi_driver);
2048 if (ret < 0) {
2049 wl1271_error("failed to register spi driver: %d", ret);
2050 goto out;
2051 }
2052
2053out:
2054 return ret;
2055}
2056
2057static void __exit wl1271_exit(void)
2058{
2059 spi_unregister_driver(&wl1271_spi_driver);
2060
2061 wl1271_notice("unloaded");
2062}
2063
2064module_init(wl1271_init);
2065module_exit(wl1271_exit);
2066
2067MODULE_LICENSE("GPL");
2068MODULE_AUTHOR("Luciano Coelho <luciano.coelho@nokia.com>");
2f018725 2069MODULE_AUTHOR("Juuso Oikarinen <juuso.oikarinen@nokia.com>");
49f146de 2070MODULE_FIRMWARE(WL1271_FW_NAME);