2 * This file is part of wl1271
4 * Copyright (C) 2008-2009 Nokia Corporation
6 * Contact: Luciano Coelho <luciano.coelho@nokia.com>
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.
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.
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
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>
33 #include <linux/vmalloc.h>
34 #include <linux/spi/wl12xx.h>
35 #include <linux/inetdevice.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"
50 static struct conf_drv_settings default_conf
= {
52 .per_threshold
= 7500,
53 .max_scan_compensation_time
= 120000,
54 .nfs_sample_interval
= 400,
57 .probe_req_compensation
= 170,
58 .scan_window_compensation
= 50,
60 .beacon_miss_threshold
= 60,
61 .rate_adaptation_threshold
= CONF_HW_BIT_RATE_12MBPS
,
62 .rate_adaptation_snr
= 0
65 .rx_msdu_life_time
= 512000,
66 .packet_detection_threshold
= 0,
67 .ps_poll_timeout
= 15,
69 .rts_threshold
= 2347,
70 .rx_cca_threshold
= 0,
71 .irq_blk_threshold
= 0xFFFF,
72 .irq_pkt_threshold
= 0,
74 .queue_type
= CONF_RX_QUEUE_TYPE_LOW_PRIORITY
,
77 .tx_energy_detection
= 0,
79 .enabled_rates
= CONF_TX_RATE_MASK_UNSPECIFIED
,
80 .short_retry_limit
= 10,
81 .long_retry_limit
= 10,
104 .aifsn
= CONF_TX_AIFS_PIFS
,
111 .aifsn
= CONF_TX_AIFS_PIFS
,
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
,
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
,
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
,
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
,
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
,
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
,
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
,
174 .frag_threshold
= IEEE80211_MAX_FRAG_THRESHOLD
,
175 .tx_compl_timeout
= 700,
176 .tx_compl_threshold
= 4
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,
185 .ie
= WLAN_EID_CHANNEL_SWITCH
,
186 .rule
= CONF_BCN_RULE_PASS_ON_APPEARANCE
,
189 .synch_fail_thold
= 10,
190 .bss_lose_timeout
= 100,
191 .beacon_rx_timeout
= 10000,
192 .broadcast_timeout
= 20000,
193 .rx_broadcast_in_ps
= 1,
194 .ps_poll_threshold
= 20,
195 .sig_trigger_count
= 2,
200 .metric
= CONF_TRIG_METRIC_RSSI_BEACON
,
201 .type
= CONF_TRIG_EVENT_TYPE_EDGE
,
202 .direction
= CONF_TRIG_EVENT_DIR_LOW
,
210 .metric
= CONF_TRIG_METRIC_RSSI_BEACON
,
211 .type
= CONF_TRIG_EVENT_TYPE_EDGE
,
212 .direction
= CONF_TRIG_EVENT_DIR_HIGH
,
219 .rssi_bcn_avg_weight
= 10,
220 .rssi_pkt_avg_weight
= 10,
221 .snr_bcn_avg_weight
= 10,
222 .snr_pkt_avg_weight
= 10
224 .bet_enable
= CONF_BET_MODE_ENABLE
,
225 .bet_max_consecutive
= 10,
226 .psm_entry_retries
= 3
234 0x18, 0x10, 0x05, 0xfb, 0xf0, 0xe8,
241 0x18, 0x10, 0x05, 0xf6, 0xf0, 0xe8,
248 0x18, 0x10, 0x05, 0xfb, 0xf0, 0xe8,
254 .ref_clk
= CONF_REF_CLK_38_4_E
,
256 .clk_valid_on_wakeup
= 0,
258 .single_dual_band
= CONF_SINGLE_BAND
,
259 .tx_bip_fem_autodetect
= 1,
260 .tx_bip_fem_manufacturer
= 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 },
272 .sr_sen_n_p_gain
= 0,
277 .rx_trace_loss
= 0x24,
278 .tx_trace_loss
= 0x0,
279 .rx_rssi_and_proc_compens
= {
280 0xec, 0xf6, 0x00, 0x0c, 0x18, 0xf8,
281 0xfc, 0x00, 0x80, 0x10, 0xf0, 0xf8,
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,
289 .tx_ref_pd_voltage
= 0x1a9,
290 .tx_ref_power
= 0x80,
292 .tx_rate_limits_normal
= {
293 0x1d, 0x1f, 0x24, 0x28, 0x28, 0x29 },
294 .tx_rate_limits_degraded
= {
295 0x19, 0x1f, 0x22, 0x23, 0x27, 0x28 },
296 .tx_rate_limits_extreme
= {
297 0x19, 0x1c, 0x1e, 0x20, 0x24, 0x25 },
298 .tx_channel_limits_11b
= {
299 0x22, 0x50, 0x50, 0x50, 0x50, 0x50,
300 0x50, 0x50, 0x50, 0x50, 0x22, 0x50,
302 .tx_channel_limits_ofdm
= {
303 0x20, 0x50, 0x50, 0x50, 0x50, 0x50,
304 0x50, 0x50, 0x50, 0x50, 0x20, 0x50,
306 .tx_pdv_rate_offsets
= {
307 0x07, 0x08, 0x04, 0x02, 0x02, 0x00 },
309 0x11, 0x11, 0x15, 0x11, 0x15, 0x0f },
310 .rx_fem_insertion_loss
= 0x0e,
311 .degraded_low_to_normal_threshold
= 0x1e,
312 .degraded_normal_to_high_threshold
= 0x2d,
313 .tx_ref_pd_voltage_5
= {
314 0x0190, 0x01a4, 0x01c3, 0x01d8,
317 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 },
319 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
320 .tx_rate_limits_normal_5
= {
321 0x1b, 0x1e, 0x21, 0x23, 0x27, 0x00 },
322 .tx_rate_limits_degraded_5
= {
323 0x1b, 0x1e, 0x21, 0x23, 0x27, 0x00 },
324 .tx_rate_limits_extreme_5
= {
325 0x1b, 0x1e, 0x21, 0x23, 0x27, 0x00 },
326 .tx_channel_limits_ofdm_5
= {
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,
332 .tx_pdv_rate_offsets_5
= {
333 0x01, 0x02, 0x02, 0x02, 0x02, 0x00 },
335 0x10, 0x10, 0x10, 0x10, 0x10, 0x10 },
336 .rx_fem_insertion_loss_5
= {
337 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10 },
338 .degraded_low_to_normal_threshold_5
= 0x00,
339 .degraded_normal_to_high_threshold_5
= 0x00
348 static LIST_HEAD(wl_list
);
350 static void wl1271_conf_init(struct wl1271
*wl
)
354 * This function applies the default configuration to the driver. This
355 * function is invoked upon driver load (spi probe.)
357 * The configuration is stored in a run-time structure in order to
358 * facilitate for run-time adjustment of any of the parameters. Making
359 * changes to the configuration structure will apply the new values on
360 * the next interface up (wl1271_op_start.)
363 /* apply driver default configuration */
364 memcpy(&wl
->conf
, &default_conf
, sizeof(default_conf
));
366 if (wl1271_11a_enabled())
367 wl
->conf
.init
.genparam
.single_dual_band
= CONF_DUAL_BAND
;
371 static int wl1271_plt_init(struct wl1271
*wl
)
375 ret
= wl1271_cmd_general_parms(wl
);
379 ret
= wl1271_cmd_radio_parms(wl
);
383 ret
= wl1271_acx_init_mem_config(wl
);
387 ret
= wl1271_cmd_data_path(wl
, 1);
394 static void wl1271_disable_interrupts(struct wl1271
*wl
)
396 disable_irq(wl
->irq
);
399 static void wl1271_power_off(struct wl1271
*wl
)
401 wl
->set_power(false);
402 wl
->gpio_power
= false;
405 static void wl1271_power_on(struct wl1271
*wl
)
408 wl
->gpio_power
= true;
411 static void wl1271_fw_status(struct wl1271
*wl
,
412 struct wl1271_fw_status
*status
)
417 wl1271_spi_read(wl
, FW_STATUS_ADDR
, status
,
418 sizeof(*status
), false);
420 wl1271_debug(DEBUG_IRQ
, "intr: 0x%x (fw_rx_counter = %d, "
421 "drv_rx_counter = %d, tx_results_counter = %d)",
423 status
->fw_rx_counter
,
424 status
->drv_rx_counter
,
425 status
->tx_results_counter
);
427 /* update number of available TX blocks */
428 for (i
= 0; i
< NUM_TX_QUEUES
; i
++) {
429 u32 cnt
= le32_to_cpu(status
->tx_released_blks
[i
]) -
430 wl
->tx_blocks_freed
[i
];
432 wl
->tx_blocks_freed
[i
] =
433 le32_to_cpu(status
->tx_released_blks
[i
]);
434 wl
->tx_blocks_available
+= cnt
;
438 /* if more blocks are available now, schedule some tx work */
439 if (total
&& !skb_queue_empty(&wl
->tx_queue
))
440 ieee80211_queue_work(wl
->hw
, &wl
->tx_work
);
442 /* update the host-chipset time offset */
443 wl
->time_offset
= jiffies_to_usecs(jiffies
) -
444 le32_to_cpu(status
->fw_localtime
);
447 static void wl1271_irq_work(struct work_struct
*work
)
452 container_of(work
, struct wl1271
, irq_work
);
454 mutex_lock(&wl
->mutex
);
456 wl1271_debug(DEBUG_IRQ
, "IRQ work");
458 if (wl
->state
== WL1271_STATE_OFF
)
461 ret
= wl1271_ps_elp_wakeup(wl
, true);
465 wl1271_spi_write32(wl
, ACX_REG_INTERRUPT_MASK
, WL1271_ACX_INTR_ALL
);
467 wl1271_fw_status(wl
, wl
->fw_status
);
468 intr
= le32_to_cpu(wl
->fw_status
->intr
);
470 wl1271_debug(DEBUG_IRQ
, "Zero interrupt received.");
474 intr
&= WL1271_INTR_MASK
;
476 if (intr
& WL1271_ACX_INTR_EVENT_A
) {
477 bool do_ack
= (intr
& WL1271_ACX_INTR_EVENT_B
) ? false : true;
478 wl1271_debug(DEBUG_IRQ
, "WL1271_ACX_INTR_EVENT_A");
479 wl1271_event_handle(wl
, 0, do_ack
);
482 if (intr
& WL1271_ACX_INTR_EVENT_B
) {
483 wl1271_debug(DEBUG_IRQ
, "WL1271_ACX_INTR_EVENT_B");
484 wl1271_event_handle(wl
, 1, true);
487 if (intr
& WL1271_ACX_INTR_INIT_COMPLETE
)
488 wl1271_debug(DEBUG_IRQ
,
489 "WL1271_ACX_INTR_INIT_COMPLETE");
491 if (intr
& WL1271_ACX_INTR_HW_AVAILABLE
)
492 wl1271_debug(DEBUG_IRQ
, "WL1271_ACX_INTR_HW_AVAILABLE");
494 if (intr
& WL1271_ACX_INTR_DATA
) {
495 u8 tx_res_cnt
= wl
->fw_status
->tx_results_counter
-
496 wl
->tx_results_count
;
498 wl1271_debug(DEBUG_IRQ
, "WL1271_ACX_INTR_DATA");
500 /* check for tx results */
502 wl1271_tx_complete(wl
, tx_res_cnt
);
504 wl1271_rx(wl
, wl
->fw_status
);
508 wl1271_spi_write32(wl
, ACX_REG_INTERRUPT_MASK
,
509 WL1271_ACX_INTR_ALL
& ~(WL1271_INTR_MASK
));
510 wl1271_ps_elp_sleep(wl
);
513 mutex_unlock(&wl
->mutex
);
516 static irqreturn_t
wl1271_irq(int irq
, void *cookie
)
521 wl1271_debug(DEBUG_IRQ
, "IRQ");
525 /* complete the ELP completion */
526 spin_lock_irqsave(&wl
->wl_lock
, flags
);
528 complete(wl
->elp_compl
);
529 wl
->elp_compl
= NULL
;
532 ieee80211_queue_work(wl
->hw
, &wl
->irq_work
);
533 spin_unlock_irqrestore(&wl
->wl_lock
, flags
);
538 static int wl1271_fetch_firmware(struct wl1271
*wl
)
540 const struct firmware
*fw
;
543 ret
= request_firmware(&fw
, WL1271_FW_NAME
, &wl
->spi
->dev
);
546 wl1271_error("could not get firmware: %d", ret
);
551 wl1271_error("firmware size is not multiple of 32 bits: %zu",
557 wl
->fw_len
= fw
->size
;
558 wl
->fw
= vmalloc(wl
->fw_len
);
561 wl1271_error("could not allocate memory for the firmware");
566 memcpy(wl
->fw
, fw
->data
, wl
->fw_len
);
571 release_firmware(fw
);
576 static int wl1271_fetch_nvs(struct wl1271
*wl
)
578 const struct firmware
*fw
;
581 ret
= request_firmware(&fw
, WL1271_NVS_NAME
, &wl
->spi
->dev
);
584 wl1271_error("could not get nvs file: %d", ret
);
589 wl1271_error("nvs size is not multiple of 32 bits: %zu",
595 wl
->nvs_len
= fw
->size
;
596 wl
->nvs
= kmalloc(wl
->nvs_len
, GFP_KERNEL
);
599 wl1271_error("could not allocate memory for the nvs file");
604 memcpy(wl
->nvs
, fw
->data
, wl
->nvs_len
);
609 release_firmware(fw
);
614 static void wl1271_fw_wakeup(struct wl1271
*wl
)
618 elp_reg
= ELPCTRL_WAKE_UP
;
619 wl1271_raw_write32(wl
, HW_ACCESS_ELP_CTRL_REG_ADDR
, elp_reg
);
622 static int wl1271_setup(struct wl1271
*wl
)
624 wl
->fw_status
= kmalloc(sizeof(*wl
->fw_status
), GFP_KERNEL
);
628 wl
->tx_res_if
= kmalloc(sizeof(*wl
->tx_res_if
), GFP_KERNEL
);
629 if (!wl
->tx_res_if
) {
630 kfree(wl
->fw_status
);
634 INIT_WORK(&wl
->irq_work
, wl1271_irq_work
);
635 INIT_WORK(&wl
->tx_work
, wl1271_tx_work
);
639 static int wl1271_chip_wakeup(struct wl1271
*wl
)
641 struct wl1271_partition_set partition
;
645 msleep(WL1271_POWER_ON_SLEEP
);
646 wl1271_spi_reset(wl
);
649 /* We don't need a real memory partition here, because we only want
650 * to use the registers at this point. */
651 memset(&partition
, 0, sizeof(partition
));
652 partition
.reg
.start
= REGISTERS_BASE
;
653 partition
.reg
.size
= REGISTERS_DOWN_SIZE
;
654 wl1271_set_partition(wl
, &partition
);
656 /* ELP module wake up */
657 wl1271_fw_wakeup(wl
);
659 /* whal_FwCtrl_BootSm() */
661 /* 0. read chip id from CHIP_ID */
662 wl
->chip
.id
= wl1271_spi_read32(wl
, CHIP_ID_B
);
664 /* 1. check if chip id is valid */
666 switch (wl
->chip
.id
) {
667 case CHIP_ID_1271_PG10
:
668 wl1271_warning("chip id 0x%x (1271 PG10) support is obsolete",
671 ret
= wl1271_setup(wl
);
675 case CHIP_ID_1271_PG20
:
676 wl1271_debug(DEBUG_BOOT
, "chip id 0x%x (1271 PG20)",
679 ret
= wl1271_setup(wl
);
684 wl1271_error("unsupported chip id: 0x%x", wl
->chip
.id
);
689 if (wl
->fw
== NULL
) {
690 ret
= wl1271_fetch_firmware(wl
);
695 /* No NVS from netlink, try to get it from the filesystem */
696 if (wl
->nvs
== NULL
) {
697 ret
= wl1271_fetch_nvs(wl
);
705 wl1271_power_off(wl
);
711 int wl1271_plt_start(struct wl1271
*wl
)
715 mutex_lock(&wl
->mutex
);
717 wl1271_notice("power up");
719 if (wl
->state
!= WL1271_STATE_OFF
) {
720 wl1271_error("cannot go into PLT state because not "
721 "in off state: %d", wl
->state
);
726 wl
->state
= WL1271_STATE_PLT
;
728 ret
= wl1271_chip_wakeup(wl
);
732 ret
= wl1271_boot(wl
);
736 wl1271_notice("firmware booted in PLT mode (%s)", wl
->chip
.fw_ver
);
738 ret
= wl1271_plt_init(wl
);
740 goto out_irq_disable
;
742 /* Make sure power saving is disabled */
743 ret
= wl1271_acx_sleep_auth(wl
, WL1271_PSM_CAM
);
745 goto out_irq_disable
;
750 wl1271_disable_interrupts(wl
);
753 wl1271_power_off(wl
);
756 mutex_unlock(&wl
->mutex
);
761 int wl1271_plt_stop(struct wl1271
*wl
)
765 mutex_lock(&wl
->mutex
);
767 wl1271_notice("power down");
769 if (wl
->state
!= WL1271_STATE_PLT
) {
770 wl1271_error("cannot power down because not in PLT "
771 "state: %d", wl
->state
);
776 wl1271_disable_interrupts(wl
);
777 wl1271_power_off(wl
);
779 wl
->state
= WL1271_STATE_OFF
;
783 mutex_unlock(&wl
->mutex
);
789 static int wl1271_op_tx(struct ieee80211_hw
*hw
, struct sk_buff
*skb
)
791 struct wl1271
*wl
= hw
->priv
;
793 skb_queue_tail(&wl
->tx_queue
, skb
);
796 * The chip specific setup must run before the first TX packet -
797 * before that, the tx_work will not be initialized!
800 ieee80211_queue_work(wl
->hw
, &wl
->tx_work
);
803 * The workqueue is slow to process the tx_queue and we need stop
804 * the queue here, otherwise the queue will get too long.
806 if (skb_queue_len(&wl
->tx_queue
) >= WL1271_TX_QUEUE_MAX_LENGTH
) {
807 ieee80211_stop_queues(wl
->hw
);
810 * FIXME: this is racy, the variable is not properly
811 * protected. Maybe fix this by removing the stupid
812 * variable altogether and checking the real queue state?
814 wl
->tx_queue_stopped
= true;
820 static int wl1271_dev_notify(struct notifier_block
*me
, unsigned long what
,
823 struct net_device
*dev
;
824 struct wireless_dev
*wdev
;
826 struct ieee80211_hw
*hw
;
828 struct wl1271
*wl_temp
;
829 struct in_device
*idev
;
830 struct in_ifaddr
*ifa
= arg
;
833 /* FIXME: this ugly function should probably be implemented in the
834 * mac80211, and here should only be a simple callback handling actual
835 * setting of the filters. Now we need to dig up references to
836 * various structures to gain access to what we need.
837 * Also, because of this, there is no "initial" setting of the filter
838 * in "op_start", because we don't want to dig up struct net_device
839 * there - the filter will be set upon first change of the interface
842 dev
= ifa
->ifa_dev
->dev
;
844 wdev
= dev
->ieee80211_ptr
;
852 hw
= wiphy_priv(wiphy
);
856 /* Check that the interface is one supported by this driver. */
858 list_for_each_entry(wl
, &wl_list
, list
) {
865 /* Get the interface IP address for the device. "ifa" will become
867 - there is no IPV4 protocol address configured
868 - there are multiple (virtual) IPV4 addresses configured
869 When "ifa" is NULL, filtering will be disabled.
874 ifa
= idev
->ifa_list
;
876 if (ifa
&& ifa
->ifa_next
)
879 mutex_lock(&wl
->mutex
);
881 if (wl
->state
== WL1271_STATE_OFF
)
884 ret
= wl1271_ps_elp_wakeup(wl
, false);
888 ret
= wl1271_acx_arp_ip_filter(wl
, true,
889 (u8
*)&ifa
->ifa_address
,
892 ret
= wl1271_acx_arp_ip_filter(wl
, false, NULL
,
894 wl1271_ps_elp_sleep(wl
);
897 mutex_unlock(&wl
->mutex
);
902 static struct notifier_block wl1271_dev_notifier
= {
903 .notifier_call
= wl1271_dev_notify
,
907 static int wl1271_op_start(struct ieee80211_hw
*hw
)
909 struct wl1271
*wl
= hw
->priv
;
912 wl1271_debug(DEBUG_MAC80211
, "mac80211 start");
914 mutex_lock(&wl
->mutex
);
916 if (wl
->state
!= WL1271_STATE_OFF
) {
917 wl1271_error("cannot start because not in off state: %d",
923 ret
= wl1271_chip_wakeup(wl
);
927 ret
= wl1271_boot(wl
);
931 ret
= wl1271_hw_init(wl
);
933 goto out_irq_disable
;
935 wl
->state
= WL1271_STATE_ON
;
937 wl1271_info("firmware booted (%s)", wl
->chip
.fw_ver
);
942 wl1271_disable_interrupts(wl
);
945 wl1271_power_off(wl
);
948 mutex_unlock(&wl
->mutex
);
951 list_add(&wl
->list
, &wl_list
);
952 register_inetaddr_notifier(&wl1271_dev_notifier
);
958 static void wl1271_op_stop(struct ieee80211_hw
*hw
)
960 struct wl1271
*wl
= hw
->priv
;
965 wl1271_debug(DEBUG_MAC80211
, "mac80211 stop");
967 unregister_inetaddr_notifier(&wl1271_dev_notifier
);
970 mutex_lock(&wl
->mutex
);
972 WARN_ON(wl
->state
!= WL1271_STATE_ON
);
975 mutex_unlock(&wl
->mutex
);
976 ieee80211_scan_completed(wl
->hw
, true);
977 mutex_lock(&wl
->mutex
);
978 wl
->scanning
= false;
981 wl
->state
= WL1271_STATE_OFF
;
983 wl1271_disable_interrupts(wl
);
985 mutex_unlock(&wl
->mutex
);
987 cancel_work_sync(&wl
->irq_work
);
988 cancel_work_sync(&wl
->tx_work
);
990 mutex_lock(&wl
->mutex
);
992 /* let's notify MAC80211 about the remaining pending TX frames */
994 wl1271_power_off(wl
);
996 memset(wl
->bssid
, 0, ETH_ALEN
);
997 memset(wl
->ssid
, 0, IW_ESSID_MAX_SIZE
+ 1);
999 wl
->bss_type
= MAX_BSS_TYPE
;
1000 wl
->band
= IEEE80211_BAND_2GHZ
;
1005 wl
->psm_entry_retry
= 0;
1006 wl
->tx_queue_stopped
= false;
1007 wl
->power_level
= WL1271_DEFAULT_POWER_LEVEL
;
1008 wl
->tx_blocks_available
= 0;
1009 wl
->tx_results_count
= 0;
1010 wl
->tx_packets_count
= 0;
1011 wl
->tx_security_last_seq
= 0;
1012 wl
->tx_security_seq_16
= 0;
1013 wl
->tx_security_seq_32
= 0;
1014 wl
->time_offset
= 0;
1015 wl
->session_counter
= 0;
1018 for (i
= 0; i
< NUM_TX_QUEUES
; i
++)
1019 wl
->tx_blocks_freed
[i
] = 0;
1021 wl1271_debugfs_reset(wl
);
1022 mutex_unlock(&wl
->mutex
);
1025 static int wl1271_op_add_interface(struct ieee80211_hw
*hw
,
1026 struct ieee80211_if_init_conf
*conf
)
1028 struct wl1271
*wl
= hw
->priv
;
1031 wl1271_debug(DEBUG_MAC80211
, "mac80211 add interface type %d mac %pM",
1032 conf
->type
, conf
->mac_addr
);
1034 mutex_lock(&wl
->mutex
);
1040 wl
->vif
= conf
->vif
;
1042 switch (conf
->type
) {
1043 case NL80211_IFTYPE_STATION
:
1044 wl
->bss_type
= BSS_TYPE_STA_BSS
;
1046 case NL80211_IFTYPE_ADHOC
:
1047 wl
->bss_type
= BSS_TYPE_IBSS
;
1054 /* FIXME: what if conf->mac_addr changes? */
1057 mutex_unlock(&wl
->mutex
);
1061 static void wl1271_op_remove_interface(struct ieee80211_hw
*hw
,
1062 struct ieee80211_if_init_conf
*conf
)
1064 struct wl1271
*wl
= hw
->priv
;
1066 mutex_lock(&wl
->mutex
);
1067 wl1271_debug(DEBUG_MAC80211
, "mac80211 remove interface");
1069 mutex_unlock(&wl
->mutex
);
1073 static int wl1271_op_config_interface(struct ieee80211_hw
*hw
,
1074 struct ieee80211_vif
*vif
,
1075 struct ieee80211_if_conf
*conf
)
1077 struct wl1271
*wl
= hw
->priv
;
1078 struct sk_buff
*beacon
;
1081 wl1271_debug(DEBUG_MAC80211
, "mac80211 config_interface bssid %pM",
1083 wl1271_dump_ascii(DEBUG_MAC80211
, "ssid: ", conf
->ssid
,
1086 mutex_lock(&wl
->mutex
);
1088 ret
= wl1271_ps_elp_wakeup(wl
, false);
1092 if (memcmp(wl
->bssid
, conf
->bssid
, ETH_ALEN
)) {
1093 wl1271_debug(DEBUG_MAC80211
, "bssid changed");
1095 memcpy(wl
->bssid
, conf
->bssid
, ETH_ALEN
);
1097 ret
= wl1271_cmd_join(wl
);
1101 ret
= wl1271_cmd_build_null_data(wl
);
1106 wl
->ssid_len
= conf
->ssid_len
;
1108 memcpy(wl
->ssid
, conf
->ssid
, wl
->ssid_len
);
1110 if (conf
->changed
& IEEE80211_IFCC_BEACON
) {
1111 beacon
= ieee80211_beacon_get(hw
, vif
);
1112 ret
= wl1271_cmd_template_set(wl
, CMD_TEMPL_BEACON
,
1113 beacon
->data
, beacon
->len
);
1116 dev_kfree_skb(beacon
);
1120 ret
= wl1271_cmd_template_set(wl
, CMD_TEMPL_PROBE_RESPONSE
,
1121 beacon
->data
, beacon
->len
);
1123 dev_kfree_skb(beacon
);
1130 wl1271_ps_elp_sleep(wl
);
1133 mutex_unlock(&wl
->mutex
);
1139 static int wl1271_join_channel(struct wl1271
*wl
, int channel
)
1142 /* we need to use a dummy BSSID for now */
1143 static const u8 dummy_bssid
[ETH_ALEN
] = { 0x0b, 0xad, 0xde,
1146 /* disable mac filter, so we hear everything */
1147 wl
->rx_config
&= ~CFG_BSSID_FILTER_EN
;
1149 wl
->channel
= channel
;
1150 memcpy(wl
->bssid
, dummy_bssid
, ETH_ALEN
);
1152 ret
= wl1271_cmd_join(wl
);
1162 static int wl1271_unjoin_channel(struct wl1271
*wl
)
1166 /* to stop listening to a channel, we disconnect */
1167 ret
= wl1271_cmd_disconnect(wl
);
1173 memset(wl
->bssid
, 0, ETH_ALEN
);
1174 wl
->rx_config
= WL1271_DEFAULT_RX_CONFIG
;
1180 static int wl1271_op_config(struct ieee80211_hw
*hw
, u32 changed
)
1182 struct wl1271
*wl
= hw
->priv
;
1183 struct ieee80211_conf
*conf
= &hw
->conf
;
1184 int channel
, ret
= 0;
1186 channel
= ieee80211_frequency_to_channel(conf
->channel
->center_freq
);
1188 wl1271_debug(DEBUG_MAC80211
, "mac80211 config ch %d psm %s power %d %s",
1190 conf
->flags
& IEEE80211_CONF_PS
? "on" : "off",
1192 conf
->flags
& IEEE80211_CONF_IDLE
? "idle" : "in use");
1194 mutex_lock(&wl
->mutex
);
1196 wl
->band
= conf
->channel
->band
;
1198 ret
= wl1271_ps_elp_wakeup(wl
, false);
1202 if (changed
& IEEE80211_CONF_CHANGE_IDLE
) {
1203 if (conf
->flags
& IEEE80211_CONF_IDLE
&& wl
->joined
)
1204 wl1271_unjoin_channel(wl
);
1206 wl1271_join_channel(wl
, channel
);
1209 /* if the channel changes while joined, join again */
1210 if (channel
!= wl
->channel
&& wl
->joined
)
1211 wl1271_join_channel(wl
, channel
);
1213 if (conf
->flags
& IEEE80211_CONF_PS
&& !wl
->psm_requested
) {
1214 wl1271_info("psm enabled");
1216 wl
->psm_requested
= true;
1219 * We enter PSM only if we're already associated.
1220 * If we're not, we'll enter it when joining an SSID,
1221 * through the bss_info_changed() hook.
1223 ret
= wl1271_ps_set_mode(wl
, STATION_POWER_SAVE_MODE
);
1224 } else if (!(conf
->flags
& IEEE80211_CONF_PS
) &&
1225 wl
->psm_requested
) {
1226 wl1271_info("psm disabled");
1228 wl
->psm_requested
= false;
1231 ret
= wl1271_ps_set_mode(wl
, STATION_ACTIVE_MODE
);
1234 if (conf
->power_level
!= wl
->power_level
) {
1235 ret
= wl1271_acx_tx_power(wl
, conf
->power_level
);
1239 wl
->power_level
= conf
->power_level
;
1243 wl1271_ps_elp_sleep(wl
);
1246 mutex_unlock(&wl
->mutex
);
1251 struct wl1271_filter_params
{
1254 u8 mc_list
[ACX_MC_ADDRESS_GROUP_MAX
][ETH_ALEN
];
1257 static u64
wl1271_op_prepare_multicast(struct ieee80211_hw
*hw
, int mc_count
,
1258 struct dev_addr_list
*mc_list
)
1260 struct wl1271_filter_params
*fp
;
1263 fp
= kzalloc(sizeof(*fp
), GFP_ATOMIC
);
1265 wl1271_error("Out of memory setting filters.");
1269 /* update multicast filtering parameters */
1271 if (mc_count
> ACX_MC_ADDRESS_GROUP_MAX
) {
1273 fp
->enabled
= false;
1276 fp
->mc_list_length
= 0;
1277 for (i
= 0; i
< mc_count
; i
++) {
1278 if (mc_list
->da_addrlen
== ETH_ALEN
) {
1279 memcpy(fp
->mc_list
[fp
->mc_list_length
],
1280 mc_list
->da_addr
, ETH_ALEN
);
1281 fp
->mc_list_length
++;
1283 wl1271_warning("Unknown mc address length.");
1284 mc_list
= mc_list
->next
;
1287 return (u64
)(unsigned long)fp
;
1290 #define WL1271_SUPPORTED_FILTERS (FIF_PROMISC_IN_BSS | \
1293 FIF_BCN_PRBRESP_PROMISC | \
1297 static void wl1271_op_configure_filter(struct ieee80211_hw
*hw
,
1298 unsigned int changed
,
1299 unsigned int *total
, u64 multicast
)
1301 struct wl1271_filter_params
*fp
= (void *)(unsigned long)multicast
;
1302 struct wl1271
*wl
= hw
->priv
;
1305 wl1271_debug(DEBUG_MAC80211
, "mac80211 configure filter");
1307 mutex_lock(&wl
->mutex
);
1309 if (wl
->state
== WL1271_STATE_OFF
)
1312 ret
= wl1271_ps_elp_wakeup(wl
, false);
1316 *total
&= WL1271_SUPPORTED_FILTERS
;
1317 changed
&= WL1271_SUPPORTED_FILTERS
;
1319 if (*total
& FIF_ALLMULTI
)
1320 ret
= wl1271_acx_group_address_tbl(wl
, false, NULL
, 0);
1322 ret
= wl1271_acx_group_address_tbl(wl
, fp
->enabled
,
1324 fp
->mc_list_length
);
1330 /* FIXME: We still need to set our filters properly */
1332 /* determine, whether supported filter values have changed */
1336 /* apply configured filters */
1337 ret
= wl1271_acx_rx_config(wl
, wl
->rx_config
, wl
->rx_filter
);
1342 wl1271_ps_elp_sleep(wl
);
1345 mutex_unlock(&wl
->mutex
);
1348 static int wl1271_op_set_key(struct ieee80211_hw
*hw
, enum set_key_cmd cmd
,
1349 struct ieee80211_vif
*vif
,
1350 struct ieee80211_sta
*sta
,
1351 struct ieee80211_key_conf
*key_conf
)
1353 struct wl1271
*wl
= hw
->priv
;
1360 static const u8 bcast_addr
[ETH_ALEN
] =
1361 { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
1363 wl1271_debug(DEBUG_MAC80211
, "mac80211 set key");
1365 addr
= sta
? sta
->addr
: bcast_addr
;
1367 wl1271_debug(DEBUG_CRYPT
, "CMD: 0x%x", cmd
);
1368 wl1271_dump(DEBUG_CRYPT
, "ADDR: ", addr
, ETH_ALEN
);
1369 wl1271_debug(DEBUG_CRYPT
, "Key: algo:0x%x, id:%d, len:%d flags 0x%x",
1370 key_conf
->alg
, key_conf
->keyidx
,
1371 key_conf
->keylen
, key_conf
->flags
);
1372 wl1271_dump(DEBUG_CRYPT
, "KEY: ", key_conf
->key
, key_conf
->keylen
);
1374 if (is_zero_ether_addr(addr
)) {
1375 /* We dont support TX only encryption */
1380 mutex_lock(&wl
->mutex
);
1382 ret
= wl1271_ps_elp_wakeup(wl
, false);
1386 switch (key_conf
->alg
) {
1390 key_conf
->hw_key_idx
= key_conf
->keyidx
;
1393 key_type
= KEY_TKIP
;
1395 key_conf
->hw_key_idx
= key_conf
->keyidx
;
1396 tx_seq_32
= wl
->tx_security_seq_32
;
1397 tx_seq_16
= wl
->tx_security_seq_16
;
1402 key_conf
->flags
|= IEEE80211_KEY_FLAG_GENERATE_IV
;
1403 tx_seq_32
= wl
->tx_security_seq_32
;
1404 tx_seq_16
= wl
->tx_security_seq_16
;
1407 wl1271_error("Unknown key algo 0x%x", key_conf
->alg
);
1415 ret
= wl1271_cmd_set_key(wl
, KEY_ADD_OR_REPLACE
,
1416 key_conf
->keyidx
, key_type
,
1417 key_conf
->keylen
, key_conf
->key
,
1418 addr
, tx_seq_32
, tx_seq_16
);
1420 wl1271_error("Could not add or replace key");
1426 ret
= wl1271_cmd_set_key(wl
, KEY_REMOVE
,
1427 key_conf
->keyidx
, key_type
,
1428 key_conf
->keylen
, key_conf
->key
,
1431 wl1271_error("Could not remove key");
1437 wl1271_error("Unsupported key cmd 0x%x", cmd
);
1445 wl1271_ps_elp_sleep(wl
);
1448 mutex_unlock(&wl
->mutex
);
1454 static int wl1271_op_hw_scan(struct ieee80211_hw
*hw
,
1455 struct cfg80211_scan_request
*req
)
1457 struct wl1271
*wl
= hw
->priv
;
1462 wl1271_debug(DEBUG_MAC80211
, "mac80211 hw scan");
1465 ssid
= req
->ssids
[0].ssid
;
1466 len
= req
->ssids
[0].ssid_len
;
1469 mutex_lock(&wl
->mutex
);
1471 ret
= wl1271_ps_elp_wakeup(wl
, false);
1475 if (wl1271_11a_enabled())
1476 ret
= wl1271_cmd_scan(hw
->priv
, ssid
, len
, 1, 0,
1477 WL1271_SCAN_BAND_DUAL
, 3);
1479 ret
= wl1271_cmd_scan(hw
->priv
, ssid
, len
, 1, 0,
1480 WL1271_SCAN_BAND_2_4_GHZ
, 3);
1482 wl1271_ps_elp_sleep(wl
);
1485 mutex_unlock(&wl
->mutex
);
1490 static int wl1271_op_set_rts_threshold(struct ieee80211_hw
*hw
, u32 value
)
1492 struct wl1271
*wl
= hw
->priv
;
1495 mutex_lock(&wl
->mutex
);
1497 ret
= wl1271_ps_elp_wakeup(wl
, false);
1501 ret
= wl1271_acx_rts_threshold(wl
, (u16
) value
);
1503 wl1271_warning("wl1271_op_set_rts_threshold failed: %d", ret
);
1505 wl1271_ps_elp_sleep(wl
);
1508 mutex_unlock(&wl
->mutex
);
1513 static u32
wl1271_enabled_rates_get(struct wl1271
*wl
, u64 basic_rate_set
)
1515 struct ieee80211_supported_band
*band
;
1516 u32 enabled_rates
= 0;
1519 band
= wl
->hw
->wiphy
->bands
[wl
->band
];
1520 for (bit
= 0; bit
< band
->n_bitrates
; bit
++) {
1521 if (basic_rate_set
& 0x1)
1522 enabled_rates
|= band
->bitrates
[bit
].hw_value
;
1523 basic_rate_set
>>= 1;
1526 return enabled_rates
;
1529 static void wl1271_op_bss_info_changed(struct ieee80211_hw
*hw
,
1530 struct ieee80211_vif
*vif
,
1531 struct ieee80211_bss_conf
*bss_conf
,
1534 enum wl1271_cmd_ps_mode mode
;
1535 struct wl1271
*wl
= hw
->priv
;
1538 wl1271_debug(DEBUG_MAC80211
, "mac80211 bss info changed");
1540 mutex_lock(&wl
->mutex
);
1542 ret
= wl1271_ps_elp_wakeup(wl
, false);
1546 if ((changed
& BSS_CHANGED_BSSID
) &&
1548 * Now we know the correct bssid, so we send a new join command
1549 * and enable the BSSID filter
1551 memcmp(wl
->bssid
, bss_conf
->bssid
, ETH_ALEN
)) {
1552 wl
->rx_config
|= CFG_BSSID_FILTER_EN
;
1553 memcpy(wl
->bssid
, bss_conf
->bssid
, ETH_ALEN
);
1554 ret
= wl1271_cmd_build_null_data(wl
);
1556 wl1271_warning("cmd buld null data failed %d",
1560 ret
= wl1271_cmd_join(wl
);
1562 wl1271_warning("cmd join failed %d", ret
);
1568 if (changed
& BSS_CHANGED_ASSOC
) {
1569 if (bss_conf
->assoc
) {
1570 wl
->aid
= bss_conf
->aid
;
1573 * with wl1271, we don't need to update the
1574 * beacon_int and dtim_period, because the firmware
1575 * updates it by itself when the first beacon is
1576 * received after a join.
1578 ret
= wl1271_cmd_build_ps_poll(wl
, wl
->aid
);
1582 ret
= wl1271_acx_aid(wl
, wl
->aid
);
1586 /* If we want to go in PSM but we're not there yet */
1587 if (wl
->psm_requested
&& !wl
->psm
) {
1588 mode
= STATION_POWER_SAVE_MODE
;
1589 ret
= wl1271_ps_set_mode(wl
, mode
);
1594 /* use defaults when not associated */
1595 wl
->basic_rate_set
= WL1271_DEFAULT_BASIC_RATE_SET
;
1601 if (changed
& BSS_CHANGED_ERP_SLOT
) {
1602 if (bss_conf
->use_short_slot
)
1603 ret
= wl1271_acx_slot(wl
, SLOT_TIME_SHORT
);
1605 ret
= wl1271_acx_slot(wl
, SLOT_TIME_LONG
);
1607 wl1271_warning("Set slot time failed %d", ret
);
1612 if (changed
& BSS_CHANGED_ERP_PREAMBLE
) {
1613 if (bss_conf
->use_short_preamble
)
1614 wl1271_acx_set_preamble(wl
, ACX_PREAMBLE_SHORT
);
1616 wl1271_acx_set_preamble(wl
, ACX_PREAMBLE_LONG
);
1619 if (changed
& BSS_CHANGED_ERP_CTS_PROT
) {
1620 if (bss_conf
->use_cts_prot
)
1621 ret
= wl1271_acx_cts_protect(wl
, CTSPROTECT_ENABLE
);
1623 ret
= wl1271_acx_cts_protect(wl
, CTSPROTECT_DISABLE
);
1625 wl1271_warning("Set ctsprotect failed %d", ret
);
1630 if (changed
& BSS_CHANGED_BASIC_RATES
) {
1631 wl
->basic_rate_set
= wl1271_enabled_rates_get(
1632 wl
, bss_conf
->basic_rates
);
1634 ret
= wl1271_acx_rate_policies(wl
, wl
->basic_rate_set
);
1636 wl1271_warning("Set rate policies failed %d", ret
);
1642 wl1271_ps_elp_sleep(wl
);
1645 mutex_unlock(&wl
->mutex
);
1649 /* can't be const, mac80211 writes to this */
1650 static struct ieee80211_rate wl1271_rates
[] = {
1652 .hw_value
= CONF_HW_BIT_RATE_1MBPS
,
1653 .hw_value_short
= CONF_HW_BIT_RATE_1MBPS
, },
1655 .hw_value
= CONF_HW_BIT_RATE_2MBPS
,
1656 .hw_value_short
= CONF_HW_BIT_RATE_2MBPS
,
1657 .flags
= IEEE80211_RATE_SHORT_PREAMBLE
},
1659 .hw_value
= CONF_HW_BIT_RATE_5_5MBPS
,
1660 .hw_value_short
= CONF_HW_BIT_RATE_5_5MBPS
,
1661 .flags
= IEEE80211_RATE_SHORT_PREAMBLE
},
1663 .hw_value
= CONF_HW_BIT_RATE_11MBPS
,
1664 .hw_value_short
= CONF_HW_BIT_RATE_11MBPS
,
1665 .flags
= IEEE80211_RATE_SHORT_PREAMBLE
},
1667 .hw_value
= CONF_HW_BIT_RATE_6MBPS
,
1668 .hw_value_short
= CONF_HW_BIT_RATE_6MBPS
, },
1670 .hw_value
= CONF_HW_BIT_RATE_9MBPS
,
1671 .hw_value_short
= CONF_HW_BIT_RATE_9MBPS
, },
1673 .hw_value
= CONF_HW_BIT_RATE_12MBPS
,
1674 .hw_value_short
= CONF_HW_BIT_RATE_12MBPS
, },
1676 .hw_value
= CONF_HW_BIT_RATE_18MBPS
,
1677 .hw_value_short
= CONF_HW_BIT_RATE_18MBPS
, },
1679 .hw_value
= CONF_HW_BIT_RATE_24MBPS
,
1680 .hw_value_short
= CONF_HW_BIT_RATE_24MBPS
, },
1682 .hw_value
= CONF_HW_BIT_RATE_36MBPS
,
1683 .hw_value_short
= CONF_HW_BIT_RATE_36MBPS
, },
1685 .hw_value
= CONF_HW_BIT_RATE_48MBPS
,
1686 .hw_value_short
= CONF_HW_BIT_RATE_48MBPS
, },
1688 .hw_value
= CONF_HW_BIT_RATE_54MBPS
,
1689 .hw_value_short
= CONF_HW_BIT_RATE_54MBPS
, },
1692 /* can't be const, mac80211 writes to this */
1693 static struct ieee80211_channel wl1271_channels
[] = {
1694 { .hw_value
= 1, .center_freq
= 2412, .max_power
= 25 },
1695 { .hw_value
= 2, .center_freq
= 2417, .max_power
= 25 },
1696 { .hw_value
= 3, .center_freq
= 2422, .max_power
= 25 },
1697 { .hw_value
= 4, .center_freq
= 2427, .max_power
= 25 },
1698 { .hw_value
= 5, .center_freq
= 2432, .max_power
= 25 },
1699 { .hw_value
= 6, .center_freq
= 2437, .max_power
= 25 },
1700 { .hw_value
= 7, .center_freq
= 2442, .max_power
= 25 },
1701 { .hw_value
= 8, .center_freq
= 2447, .max_power
= 25 },
1702 { .hw_value
= 9, .center_freq
= 2452, .max_power
= 25 },
1703 { .hw_value
= 10, .center_freq
= 2457, .max_power
= 25 },
1704 { .hw_value
= 11, .center_freq
= 2462, .max_power
= 25 },
1705 { .hw_value
= 12, .center_freq
= 2467, .max_power
= 25 },
1706 { .hw_value
= 13, .center_freq
= 2472, .max_power
= 25 },
1709 /* can't be const, mac80211 writes to this */
1710 static struct ieee80211_supported_band wl1271_band_2ghz
= {
1711 .channels
= wl1271_channels
,
1712 .n_channels
= ARRAY_SIZE(wl1271_channels
),
1713 .bitrates
= wl1271_rates
,
1714 .n_bitrates
= ARRAY_SIZE(wl1271_rates
),
1717 /* 5 GHz data rates for WL1273 */
1718 static struct ieee80211_rate wl1271_rates_5ghz
[] = {
1720 .hw_value
= CONF_HW_BIT_RATE_6MBPS
,
1721 .hw_value_short
= CONF_HW_BIT_RATE_6MBPS
, },
1723 .hw_value
= CONF_HW_BIT_RATE_9MBPS
,
1724 .hw_value_short
= CONF_HW_BIT_RATE_9MBPS
, },
1726 .hw_value
= CONF_HW_BIT_RATE_12MBPS
,
1727 .hw_value_short
= CONF_HW_BIT_RATE_12MBPS
, },
1729 .hw_value
= CONF_HW_BIT_RATE_18MBPS
,
1730 .hw_value_short
= CONF_HW_BIT_RATE_18MBPS
, },
1732 .hw_value
= CONF_HW_BIT_RATE_24MBPS
,
1733 .hw_value_short
= CONF_HW_BIT_RATE_24MBPS
, },
1735 .hw_value
= CONF_HW_BIT_RATE_36MBPS
,
1736 .hw_value_short
= CONF_HW_BIT_RATE_36MBPS
, },
1738 .hw_value
= CONF_HW_BIT_RATE_48MBPS
,
1739 .hw_value_short
= CONF_HW_BIT_RATE_48MBPS
, },
1741 .hw_value
= CONF_HW_BIT_RATE_54MBPS
,
1742 .hw_value_short
= CONF_HW_BIT_RATE_54MBPS
, },
1745 /* 5 GHz band channels for WL1273 */
1746 static struct ieee80211_channel wl1271_channels_5ghz
[] = {
1747 { .hw_value
= 183, .center_freq
= 4915},
1748 { .hw_value
= 184, .center_freq
= 4920},
1749 { .hw_value
= 185, .center_freq
= 4925},
1750 { .hw_value
= 187, .center_freq
= 4935},
1751 { .hw_value
= 188, .center_freq
= 4940},
1752 { .hw_value
= 189, .center_freq
= 4945},
1753 { .hw_value
= 192, .center_freq
= 4960},
1754 { .hw_value
= 196, .center_freq
= 4980},
1755 { .hw_value
= 7, .center_freq
= 5035},
1756 { .hw_value
= 8, .center_freq
= 5040},
1757 { .hw_value
= 9, .center_freq
= 5045},
1758 { .hw_value
= 11, .center_freq
= 5055},
1759 { .hw_value
= 12, .center_freq
= 5060},
1760 { .hw_value
= 16, .center_freq
= 5080},
1761 { .hw_value
= 34, .center_freq
= 5170},
1762 { .hw_value
= 36, .center_freq
= 5180},
1763 { .hw_value
= 38, .center_freq
= 5190},
1764 { .hw_value
= 40, .center_freq
= 5200},
1765 { .hw_value
= 42, .center_freq
= 5210},
1766 { .hw_value
= 44, .center_freq
= 5220},
1767 { .hw_value
= 46, .center_freq
= 5230},
1768 { .hw_value
= 48, .center_freq
= 5240},
1769 { .hw_value
= 52, .center_freq
= 5260},
1770 { .hw_value
= 56, .center_freq
= 5280},
1771 { .hw_value
= 60, .center_freq
= 5300},
1772 { .hw_value
= 64, .center_freq
= 5320},
1773 { .hw_value
= 100, .center_freq
= 5500},
1774 { .hw_value
= 104, .center_freq
= 5520},
1775 { .hw_value
= 108, .center_freq
= 5540},
1776 { .hw_value
= 112, .center_freq
= 5560},
1777 { .hw_value
= 116, .center_freq
= 5580},
1778 { .hw_value
= 120, .center_freq
= 5600},
1779 { .hw_value
= 124, .center_freq
= 5620},
1780 { .hw_value
= 128, .center_freq
= 5640},
1781 { .hw_value
= 132, .center_freq
= 5660},
1782 { .hw_value
= 136, .center_freq
= 5680},
1783 { .hw_value
= 140, .center_freq
= 5700},
1784 { .hw_value
= 149, .center_freq
= 5745},
1785 { .hw_value
= 153, .center_freq
= 5765},
1786 { .hw_value
= 157, .center_freq
= 5785},
1787 { .hw_value
= 161, .center_freq
= 5805},
1788 { .hw_value
= 165, .center_freq
= 5825},
1792 static struct ieee80211_supported_band wl1271_band_5ghz
= {
1793 .channels
= wl1271_channels_5ghz
,
1794 .n_channels
= ARRAY_SIZE(wl1271_channels_5ghz
),
1795 .bitrates
= wl1271_rates_5ghz
,
1796 .n_bitrates
= ARRAY_SIZE(wl1271_rates_5ghz
),
1799 static const struct ieee80211_ops wl1271_ops
= {
1800 .start
= wl1271_op_start
,
1801 .stop
= wl1271_op_stop
,
1802 .add_interface
= wl1271_op_add_interface
,
1803 .remove_interface
= wl1271_op_remove_interface
,
1804 .config
= wl1271_op_config
,
1805 /* .config_interface = wl1271_op_config_interface, */
1806 .prepare_multicast
= wl1271_op_prepare_multicast
,
1807 .configure_filter
= wl1271_op_configure_filter
,
1809 .set_key
= wl1271_op_set_key
,
1810 .hw_scan
= wl1271_op_hw_scan
,
1811 .bss_info_changed
= wl1271_op_bss_info_changed
,
1812 .set_rts_threshold
= wl1271_op_set_rts_threshold
,
1815 static int wl1271_register_hw(struct wl1271
*wl
)
1819 if (wl
->mac80211_registered
)
1822 SET_IEEE80211_PERM_ADDR(wl
->hw
, wl
->mac_addr
);
1824 ret
= ieee80211_register_hw(wl
->hw
);
1826 wl1271_error("unable to register mac80211 hw: %d", ret
);
1830 wl
->mac80211_registered
= true;
1832 wl1271_notice("loaded");
1837 static int wl1271_init_ieee80211(struct wl1271
*wl
)
1839 /* The tx descriptor buffer and the TKIP space. */
1840 wl
->hw
->extra_tx_headroom
= WL1271_TKIP_IV_SPACE
+
1841 sizeof(struct wl1271_tx_hw_descr
);
1844 /* FIXME: find a proper value */
1845 wl
->hw
->channel_change_time
= 10000;
1847 wl
->hw
->flags
= IEEE80211_HW_SIGNAL_DBM
|
1848 IEEE80211_HW_NOISE_DBM
|
1849 IEEE80211_HW_BEACON_FILTER
|
1850 IEEE80211_HW_SUPPORTS_PS
;
1852 wl
->hw
->wiphy
->interface_modes
= BIT(NL80211_IFTYPE_STATION
);
1853 wl
->hw
->wiphy
->max_scan_ssids
= 1;
1854 wl
->hw
->wiphy
->bands
[IEEE80211_BAND_2GHZ
] = &wl1271_band_2ghz
;
1856 if (wl1271_11a_enabled())
1857 wl
->hw
->wiphy
->bands
[IEEE80211_BAND_5GHZ
] = &wl1271_band_5ghz
;
1859 SET_IEEE80211_DEV(wl
->hw
, &wl
->spi
->dev
);
1864 static void wl1271_device_release(struct device
*dev
)
1869 static struct platform_device wl1271_device
= {
1873 /* device model insists to have a release function */
1875 .release
= wl1271_device_release
,
1879 #define WL1271_DEFAULT_CHANNEL 0
1880 static int __devinit
wl1271_probe(struct spi_device
*spi
)
1882 struct wl12xx_platform_data
*pdata
;
1883 struct ieee80211_hw
*hw
;
1886 static const u8 nokia_oui
[3] = {0x00, 0x1f, 0xdf};
1888 pdata
= spi
->dev
.platform_data
;
1890 wl1271_error("no platform data");
1894 hw
= ieee80211_alloc_hw(sizeof(*wl
), &wl1271_ops
);
1896 wl1271_error("could not alloc ieee80211_hw");
1901 memset(wl
, 0, sizeof(*wl
));
1903 INIT_LIST_HEAD(&wl
->list
);
1906 dev_set_drvdata(&spi
->dev
, wl
);
1909 skb_queue_head_init(&wl
->tx_queue
);
1911 INIT_DELAYED_WORK(&wl
->elp_work
, wl1271_elp_work
);
1912 wl
->channel
= WL1271_DEFAULT_CHANNEL
;
1913 wl
->scanning
= false;
1914 wl
->default_key
= 0;
1916 wl
->rx_config
= WL1271_DEFAULT_RX_CONFIG
;
1917 wl
->rx_filter
= WL1271_DEFAULT_RX_FILTER
;
1920 wl
->psm_requested
= false;
1921 wl
->psm_entry_retry
= 0;
1922 wl
->tx_queue_stopped
= false;
1923 wl
->power_level
= WL1271_DEFAULT_POWER_LEVEL
;
1924 wl
->basic_rate_set
= WL1271_DEFAULT_BASIC_RATE_SET
;
1925 wl
->band
= IEEE80211_BAND_2GHZ
;
1928 wl
->gpio_power
= false;
1930 for (i
= 0; i
< ACX_TX_DESCRIPTORS
; i
++)
1931 wl
->tx_frames
[i
] = NULL
;
1933 spin_lock_init(&wl
->wl_lock
);
1936 * In case our MAC address is not correctly set,
1937 * we use a random but Nokia MAC.
1939 memcpy(wl
->mac_addr
, nokia_oui
, 3);
1940 get_random_bytes(wl
->mac_addr
+ 3, 3);
1942 wl
->state
= WL1271_STATE_OFF
;
1943 mutex_init(&wl
->mutex
);
1945 /* This is the only SPI value that we need to set here, the rest
1946 * comes from the board-peripherals file */
1947 spi
->bits_per_word
= 32;
1949 ret
= spi_setup(spi
);
1951 wl1271_error("spi_setup failed");
1955 wl
->set_power
= pdata
->set_power
;
1956 if (!wl
->set_power
) {
1957 wl1271_error("set power function missing in platform data");
1964 wl1271_error("irq missing in platform data");
1969 ret
= request_irq(wl
->irq
, wl1271_irq
, 0, DRIVER_NAME
, wl
);
1971 wl1271_error("request_irq() failed: %d", ret
);
1975 set_irq_type(wl
->irq
, IRQ_TYPE_EDGE_RISING
);
1977 disable_irq(wl
->irq
);
1979 ret
= platform_device_register(&wl1271_device
);
1981 wl1271_error("couldn't register platform device");
1984 dev_set_drvdata(&wl1271_device
.dev
, wl
);
1986 /* Apply default driver configuration. */
1987 wl1271_conf_init(wl
);
1989 ret
= wl1271_init_ieee80211(wl
);
1993 ret
= wl1271_register_hw(wl
);
1997 wl1271_debugfs_init(wl
);
1999 wl1271_notice("initialized");
2004 platform_device_unregister(&wl1271_device
);
2007 free_irq(wl
->irq
, wl
);
2010 ieee80211_free_hw(hw
);
2015 static int __devexit
wl1271_remove(struct spi_device
*spi
)
2017 struct wl1271
*wl
= dev_get_drvdata(&spi
->dev
);
2019 ieee80211_unregister_hw(wl
->hw
);
2021 wl1271_debugfs_exit(wl
);
2022 platform_device_unregister(&wl1271_device
);
2023 free_irq(wl
->irq
, wl
);
2024 kfree(wl
->target_mem_map
);
2030 kfree(wl
->fw_status
);
2031 kfree(wl
->tx_res_if
);
2033 ieee80211_free_hw(wl
->hw
);
2039 static struct spi_driver wl1271_spi_driver
= {
2042 .bus
= &spi_bus_type
,
2043 .owner
= THIS_MODULE
,
2046 .probe
= wl1271_probe
,
2047 .remove
= __devexit_p(wl1271_remove
),
2050 static int __init
wl1271_init(void)
2054 ret
= spi_register_driver(&wl1271_spi_driver
);
2056 wl1271_error("failed to register spi driver: %d", ret
);
2064 static void __exit
wl1271_exit(void)
2066 spi_unregister_driver(&wl1271_spi_driver
);
2068 wl1271_notice("unloaded");
2071 module_init(wl1271_init
);
2072 module_exit(wl1271_exit
);
2074 MODULE_LICENSE("GPL");
2075 MODULE_AUTHOR("Luciano Coelho <luciano.coelho@nokia.com>");
2076 MODULE_AUTHOR("Juuso Oikarinen <juuso.oikarinen@nokia.com>");
2077 MODULE_FIRMWARE(WL1271_FW_NAME
);