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
230 .ref_clk
= CONF_REF_CLK_38_4_E
,
232 .clk_valid_on_wakeup
= 0,
234 .single_dual_band
= CONF_SINGLE_BAND
,
235 .tx_bip_fem_autodetect
= 1,
236 .tx_bip_fem_manufacturer
= 1,
239 .srf1
= { 0x07, 0x03, 0x18, 0x10, 0x05, 0xfb, 0xf0,
240 0xe8, 0, 0, 0, 0, 0, 0, 0, 0 },
241 .srf2
= { 0x07, 0x03, 0x18, 0x10, 0x05, 0xfb, 0xf0,
242 0xe8, 0, 0, 0, 0, 0, 0, 0, 0 },
243 .srf3
= { 0x07, 0x03, 0x18, 0x10, 0x05, 0xfb, 0xf0,
244 0xe8, 0, 0, 0, 0, 0, 0, 0, 0 },
245 .sr_debug_table
= { 0, 0, 0, 0, 0, 0, 0, 0,
246 0, 0, 0, 0, 0, 0, 0, 0 },
248 .sr_sen_n_p_gain
= 0,
253 .rx_trace_loss
= 0x24,
254 .tx_trace_loss
= 0x0,
255 .rx_rssi_and_proc_compens
= {
256 0xec, 0xf6, 0x00, 0x0c, 0x18, 0xf8,
257 0xfc, 0x00, 0x80, 0x10, 0xf0, 0xf8,
259 .rx_trace_loss_5
= { 0, 0, 0, 0, 0, 0, 0 },
260 .tx_trace_loss_5
= { 0, 0, 0, 0, 0, 0, 0 },
261 .rx_rssi_and_proc_compens_5
= {
262 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
263 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
265 .tx_ref_pd_voltage
= 0x1a9,
266 .tx_ref_power
= 0x80,
268 .tx_rate_limits_normal
= {
269 0x1d, 0x1f, 0x24, 0x28, 0x28, 0x29 },
270 .tx_rate_limits_degraded
= {
271 0x19, 0x1f, 0x22, 0x23, 0x27, 0x28 },
272 .tx_rate_limits_extreme
= {
273 0x19, 0x1c, 0x1e, 0x20, 0x24, 0x25 },
274 .tx_channel_limits_11b
= {
275 0x22, 0x50, 0x50, 0x50, 0x50, 0x50,
276 0x50, 0x50, 0x50, 0x50, 0x22, 0x50,
278 .tx_channel_limits_ofdm
= {
279 0x20, 0x50, 0x50, 0x50, 0x50, 0x50,
280 0x50, 0x50, 0x50, 0x50, 0x20, 0x50,
282 .tx_pdv_rate_offsets
= {
283 0x07, 0x08, 0x04, 0x02, 0x02, 0x00 },
285 0x11, 0x11, 0x15, 0x11, 0x15, 0x0f },
286 .rx_fem_insertion_loss
= 0x0e,
287 .degraded_low_to_normal_threshold
= 0x1e,
288 .degraded_normal_to_high_threshold
= 0x2d,
289 .tx_ref_pd_voltage_5
= {
290 0x0190, 0x01a4, 0x01c3, 0x01d8,
293 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 },
295 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
296 .tx_rate_limits_normal_5
= {
297 0x1b, 0x1e, 0x21, 0x23, 0x27, 0x00 },
298 .tx_rate_limits_degraded_5
= {
299 0x1b, 0x1e, 0x21, 0x23, 0x27, 0x00 },
300 .tx_rate_limits_extreme_5
= {
301 0x1b, 0x1e, 0x21, 0x23, 0x27, 0x00 },
302 .tx_channel_limits_ofdm_5
= {
303 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50,
304 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50,
305 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50,
306 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50,
308 .tx_pdv_rate_offsets_5
= {
309 0x01, 0x02, 0x02, 0x02, 0x02, 0x00 },
311 0x10, 0x10, 0x10, 0x10, 0x10, 0x10 },
312 .rx_fem_insertion_loss_5
= {
313 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10 },
314 .degraded_low_to_normal_threshold_5
= 0x00,
315 .degraded_normal_to_high_threshold_5
= 0x00
324 static LIST_HEAD(wl_list
);
326 static void wl1271_conf_init(struct wl1271
*wl
)
330 * This function applies the default configuration to the driver. This
331 * function is invoked upon driver load (spi probe.)
333 * The configuration is stored in a run-time structure in order to
334 * facilitate for run-time adjustment of any of the parameters. Making
335 * changes to the configuration structure will apply the new values on
336 * the next interface up (wl1271_op_start.)
339 /* apply driver default configuration */
340 memcpy(&wl
->conf
, &default_conf
, sizeof(default_conf
));
342 if (wl1271_11a_enabled())
343 wl
->conf
.init
.genparam
.single_dual_band
= CONF_DUAL_BAND
;
347 static int wl1271_plt_init(struct wl1271
*wl
)
351 ret
= wl1271_cmd_general_parms(wl
);
355 ret
= wl1271_cmd_radio_parms(wl
);
359 ret
= wl1271_acx_init_mem_config(wl
);
363 ret
= wl1271_cmd_data_path(wl
, 1);
370 static void wl1271_disable_interrupts(struct wl1271
*wl
)
372 disable_irq(wl
->irq
);
375 static void wl1271_power_off(struct wl1271
*wl
)
377 wl
->set_power(false);
378 wl
->gpio_power
= false;
381 static void wl1271_power_on(struct wl1271
*wl
)
384 wl
->gpio_power
= true;
387 static void wl1271_fw_status(struct wl1271
*wl
,
388 struct wl1271_fw_status
*status
)
393 wl1271_spi_read(wl
, FW_STATUS_ADDR
, status
,
394 sizeof(*status
), false);
396 wl1271_debug(DEBUG_IRQ
, "intr: 0x%x (fw_rx_counter = %d, "
397 "drv_rx_counter = %d, tx_results_counter = %d)",
399 status
->fw_rx_counter
,
400 status
->drv_rx_counter
,
401 status
->tx_results_counter
);
403 /* update number of available TX blocks */
404 for (i
= 0; i
< NUM_TX_QUEUES
; i
++) {
405 u32 cnt
= le32_to_cpu(status
->tx_released_blks
[i
]) -
406 wl
->tx_blocks_freed
[i
];
408 wl
->tx_blocks_freed
[i
] =
409 le32_to_cpu(status
->tx_released_blks
[i
]);
410 wl
->tx_blocks_available
+= cnt
;
414 /* if more blocks are available now, schedule some tx work */
415 if (total
&& !skb_queue_empty(&wl
->tx_queue
))
416 ieee80211_queue_work(wl
->hw
, &wl
->tx_work
);
418 /* update the host-chipset time offset */
419 wl
->time_offset
= jiffies_to_usecs(jiffies
) -
420 le32_to_cpu(status
->fw_localtime
);
423 static void wl1271_irq_work(struct work_struct
*work
)
428 container_of(work
, struct wl1271
, irq_work
);
430 mutex_lock(&wl
->mutex
);
432 wl1271_debug(DEBUG_IRQ
, "IRQ work");
434 if (wl
->state
== WL1271_STATE_OFF
)
437 ret
= wl1271_ps_elp_wakeup(wl
, true);
441 wl1271_spi_write32(wl
, ACX_REG_INTERRUPT_MASK
, WL1271_ACX_INTR_ALL
);
443 wl1271_fw_status(wl
, wl
->fw_status
);
444 intr
= le32_to_cpu(wl
->fw_status
->intr
);
446 wl1271_debug(DEBUG_IRQ
, "Zero interrupt received.");
450 intr
&= WL1271_INTR_MASK
;
452 if (intr
& WL1271_ACX_INTR_EVENT_A
) {
453 wl1271_debug(DEBUG_IRQ
, "WL1271_ACX_INTR_EVENT_A");
454 wl1271_event_handle(wl
, 0);
457 if (intr
& WL1271_ACX_INTR_EVENT_B
) {
458 wl1271_debug(DEBUG_IRQ
, "WL1271_ACX_INTR_EVENT_B");
459 wl1271_event_handle(wl
, 1);
462 if (intr
& WL1271_ACX_INTR_INIT_COMPLETE
)
463 wl1271_debug(DEBUG_IRQ
,
464 "WL1271_ACX_INTR_INIT_COMPLETE");
466 if (intr
& WL1271_ACX_INTR_HW_AVAILABLE
)
467 wl1271_debug(DEBUG_IRQ
, "WL1271_ACX_INTR_HW_AVAILABLE");
469 if (intr
& WL1271_ACX_INTR_DATA
) {
470 u8 tx_res_cnt
= wl
->fw_status
->tx_results_counter
-
471 wl
->tx_results_count
;
473 wl1271_debug(DEBUG_IRQ
, "WL1271_ACX_INTR_DATA");
475 /* check for tx results */
477 wl1271_tx_complete(wl
, tx_res_cnt
);
479 wl1271_rx(wl
, wl
->fw_status
);
483 wl1271_spi_write32(wl
, ACX_REG_INTERRUPT_MASK
,
484 WL1271_ACX_INTR_ALL
& ~(WL1271_INTR_MASK
));
485 wl1271_ps_elp_sleep(wl
);
488 mutex_unlock(&wl
->mutex
);
491 static irqreturn_t
wl1271_irq(int irq
, void *cookie
)
496 wl1271_debug(DEBUG_IRQ
, "IRQ");
500 /* complete the ELP completion */
501 spin_lock_irqsave(&wl
->wl_lock
, flags
);
503 complete(wl
->elp_compl
);
504 wl
->elp_compl
= NULL
;
507 ieee80211_queue_work(wl
->hw
, &wl
->irq_work
);
508 spin_unlock_irqrestore(&wl
->wl_lock
, flags
);
513 static int wl1271_fetch_firmware(struct wl1271
*wl
)
515 const struct firmware
*fw
;
518 ret
= request_firmware(&fw
, WL1271_FW_NAME
, &wl
->spi
->dev
);
521 wl1271_error("could not get firmware: %d", ret
);
526 wl1271_error("firmware size is not multiple of 32 bits: %zu",
532 wl
->fw_len
= fw
->size
;
533 wl
->fw
= vmalloc(wl
->fw_len
);
536 wl1271_error("could not allocate memory for the firmware");
541 memcpy(wl
->fw
, fw
->data
, wl
->fw_len
);
546 release_firmware(fw
);
551 static int wl1271_fetch_nvs(struct wl1271
*wl
)
553 const struct firmware
*fw
;
556 ret
= request_firmware(&fw
, WL1271_NVS_NAME
, &wl
->spi
->dev
);
559 wl1271_error("could not get nvs file: %d", ret
);
564 wl1271_error("nvs size is not multiple of 32 bits: %zu",
570 wl
->nvs_len
= fw
->size
;
571 wl
->nvs
= kmalloc(wl
->nvs_len
, GFP_KERNEL
);
574 wl1271_error("could not allocate memory for the nvs file");
579 memcpy(wl
->nvs
, fw
->data
, wl
->nvs_len
);
584 release_firmware(fw
);
589 static void wl1271_fw_wakeup(struct wl1271
*wl
)
593 elp_reg
= ELPCTRL_WAKE_UP
;
594 wl1271_raw_write32(wl
, HW_ACCESS_ELP_CTRL_REG_ADDR
, elp_reg
);
597 static int wl1271_setup(struct wl1271
*wl
)
599 wl
->fw_status
= kmalloc(sizeof(*wl
->fw_status
), GFP_KERNEL
);
603 wl
->tx_res_if
= kmalloc(sizeof(*wl
->tx_res_if
), GFP_KERNEL
);
604 if (!wl
->tx_res_if
) {
605 kfree(wl
->fw_status
);
609 INIT_WORK(&wl
->irq_work
, wl1271_irq_work
);
610 INIT_WORK(&wl
->tx_work
, wl1271_tx_work
);
614 static int wl1271_chip_wakeup(struct wl1271
*wl
)
616 struct wl1271_partition_set partition
;
620 msleep(WL1271_POWER_ON_SLEEP
);
621 wl1271_spi_reset(wl
);
624 /* We don't need a real memory partition here, because we only want
625 * to use the registers at this point. */
626 memset(&partition
, 0, sizeof(partition
));
627 partition
.reg
.start
= REGISTERS_BASE
;
628 partition
.reg
.size
= REGISTERS_DOWN_SIZE
;
629 wl1271_set_partition(wl
, &partition
);
631 /* ELP module wake up */
632 wl1271_fw_wakeup(wl
);
634 /* whal_FwCtrl_BootSm() */
636 /* 0. read chip id from CHIP_ID */
637 wl
->chip
.id
= wl1271_spi_read32(wl
, CHIP_ID_B
);
639 /* 1. check if chip id is valid */
641 switch (wl
->chip
.id
) {
642 case CHIP_ID_1271_PG10
:
643 wl1271_warning("chip id 0x%x (1271 PG10) support is obsolete",
646 ret
= wl1271_setup(wl
);
650 case CHIP_ID_1271_PG20
:
651 wl1271_debug(DEBUG_BOOT
, "chip id 0x%x (1271 PG20)",
654 ret
= wl1271_setup(wl
);
659 wl1271_error("unsupported chip id: 0x%x", wl
->chip
.id
);
664 if (wl
->fw
== NULL
) {
665 ret
= wl1271_fetch_firmware(wl
);
670 /* No NVS from netlink, try to get it from the filesystem */
671 if (wl
->nvs
== NULL
) {
672 ret
= wl1271_fetch_nvs(wl
);
680 wl1271_power_off(wl
);
686 int wl1271_plt_start(struct wl1271
*wl
)
690 mutex_lock(&wl
->mutex
);
692 wl1271_notice("power up");
694 if (wl
->state
!= WL1271_STATE_OFF
) {
695 wl1271_error("cannot go into PLT state because not "
696 "in off state: %d", wl
->state
);
701 wl
->state
= WL1271_STATE_PLT
;
703 ret
= wl1271_chip_wakeup(wl
);
707 ret
= wl1271_boot(wl
);
711 wl1271_notice("firmware booted in PLT mode (%s)", wl
->chip
.fw_ver
);
713 ret
= wl1271_plt_init(wl
);
715 goto out_irq_disable
;
717 /* Make sure power saving is disabled */
718 ret
= wl1271_acx_sleep_auth(wl
, WL1271_PSM_CAM
);
720 goto out_irq_disable
;
725 wl1271_disable_interrupts(wl
);
728 wl1271_power_off(wl
);
731 mutex_unlock(&wl
->mutex
);
736 int wl1271_plt_stop(struct wl1271
*wl
)
740 mutex_lock(&wl
->mutex
);
742 wl1271_notice("power down");
744 if (wl
->state
!= WL1271_STATE_PLT
) {
745 wl1271_error("cannot power down because not in PLT "
746 "state: %d", wl
->state
);
751 wl1271_disable_interrupts(wl
);
752 wl1271_power_off(wl
);
754 wl
->state
= WL1271_STATE_OFF
;
758 mutex_unlock(&wl
->mutex
);
764 static int wl1271_op_tx(struct ieee80211_hw
*hw
, struct sk_buff
*skb
)
766 struct wl1271
*wl
= hw
->priv
;
768 skb_queue_tail(&wl
->tx_queue
, skb
);
771 * The chip specific setup must run before the first TX packet -
772 * before that, the tx_work will not be initialized!
775 ieee80211_queue_work(wl
->hw
, &wl
->tx_work
);
778 * The workqueue is slow to process the tx_queue and we need stop
779 * the queue here, otherwise the queue will get too long.
781 if (skb_queue_len(&wl
->tx_queue
) >= WL1271_TX_QUEUE_MAX_LENGTH
) {
782 ieee80211_stop_queues(wl
->hw
);
785 * FIXME: this is racy, the variable is not properly
786 * protected. Maybe fix this by removing the stupid
787 * variable altogether and checking the real queue state?
789 wl
->tx_queue_stopped
= true;
795 static int wl1271_dev_notify(struct notifier_block
*me
, unsigned long what
,
798 struct net_device
*dev
;
799 struct wireless_dev
*wdev
;
801 struct ieee80211_hw
*hw
;
803 struct wl1271
*wl_temp
;
804 struct in_device
*idev
;
805 struct in_ifaddr
*ifa
= arg
;
808 /* FIXME: this ugly function should probably be implemented in the
809 * mac80211, and here should only be a simple callback handling actual
810 * setting of the filters. Now we need to dig up references to
811 * various structures to gain access to what we need.
812 * Also, because of this, there is no "initial" setting of the filter
813 * in "op_start", because we don't want to dig up struct net_device
814 * there - the filter will be set upon first change of the interface
817 dev
= ifa
->ifa_dev
->dev
;
819 wdev
= dev
->ieee80211_ptr
;
827 hw
= wiphy_priv(wiphy
);
831 /* Check that the interface is one supported by this driver. */
833 list_for_each_entry(wl
, &wl_list
, list
) {
840 /* Get the interface IP address for the device. "ifa" will become
842 - there is no IPV4 protocol address configured
843 - there are multiple (virtual) IPV4 addresses configured
844 When "ifa" is NULL, filtering will be disabled.
849 ifa
= idev
->ifa_list
;
851 if (ifa
&& ifa
->ifa_next
)
854 mutex_lock(&wl
->mutex
);
856 if (wl
->state
== WL1271_STATE_OFF
)
859 ret
= wl1271_ps_elp_wakeup(wl
, false);
863 ret
= wl1271_acx_arp_ip_filter(wl
, true,
864 (u8
*)&ifa
->ifa_address
,
867 ret
= wl1271_acx_arp_ip_filter(wl
, false, NULL
,
869 wl1271_ps_elp_sleep(wl
);
872 mutex_unlock(&wl
->mutex
);
877 static struct notifier_block wl1271_dev_notifier
= {
878 .notifier_call
= wl1271_dev_notify
,
882 static int wl1271_op_start(struct ieee80211_hw
*hw
)
884 struct wl1271
*wl
= hw
->priv
;
887 wl1271_debug(DEBUG_MAC80211
, "mac80211 start");
889 mutex_lock(&wl
->mutex
);
891 if (wl
->state
!= WL1271_STATE_OFF
) {
892 wl1271_error("cannot start because not in off state: %d",
898 ret
= wl1271_chip_wakeup(wl
);
902 ret
= wl1271_boot(wl
);
906 ret
= wl1271_hw_init(wl
);
908 goto out_irq_disable
;
910 wl
->state
= WL1271_STATE_ON
;
912 wl1271_info("firmware booted (%s)", wl
->chip
.fw_ver
);
917 wl1271_disable_interrupts(wl
);
920 wl1271_power_off(wl
);
923 mutex_unlock(&wl
->mutex
);
926 list_add(&wl
->list
, &wl_list
);
927 register_inetaddr_notifier(&wl1271_dev_notifier
);
933 static void wl1271_op_stop(struct ieee80211_hw
*hw
)
935 struct wl1271
*wl
= hw
->priv
;
940 wl1271_debug(DEBUG_MAC80211
, "mac80211 stop");
942 unregister_inetaddr_notifier(&wl1271_dev_notifier
);
945 mutex_lock(&wl
->mutex
);
947 WARN_ON(wl
->state
!= WL1271_STATE_ON
);
950 mutex_unlock(&wl
->mutex
);
951 ieee80211_scan_completed(wl
->hw
, true);
952 mutex_lock(&wl
->mutex
);
953 wl
->scanning
= false;
956 wl
->state
= WL1271_STATE_OFF
;
958 wl1271_disable_interrupts(wl
);
960 mutex_unlock(&wl
->mutex
);
962 cancel_work_sync(&wl
->irq_work
);
963 cancel_work_sync(&wl
->tx_work
);
965 mutex_lock(&wl
->mutex
);
967 /* let's notify MAC80211 about the remaining pending TX frames */
969 wl1271_power_off(wl
);
971 memset(wl
->bssid
, 0, ETH_ALEN
);
972 memset(wl
->ssid
, 0, IW_ESSID_MAX_SIZE
+ 1);
974 wl
->bss_type
= MAX_BSS_TYPE
;
975 wl
->band
= IEEE80211_BAND_2GHZ
;
980 wl
->psm_entry_retry
= 0;
981 wl
->associated
= false;
982 wl
->tx_queue_stopped
= false;
983 wl
->power_level
= WL1271_DEFAULT_POWER_LEVEL
;
984 wl
->tx_blocks_available
= 0;
985 wl
->tx_results_count
= 0;
986 wl
->tx_packets_count
= 0;
987 wl
->tx_security_last_seq
= 0;
988 wl
->tx_security_seq_16
= 0;
989 wl
->tx_security_seq_32
= 0;
991 wl
->session_counter
= 0;
994 for (i
= 0; i
< NUM_TX_QUEUES
; i
++)
995 wl
->tx_blocks_freed
[i
] = 0;
997 wl1271_debugfs_reset(wl
);
998 mutex_unlock(&wl
->mutex
);
1001 static int wl1271_op_add_interface(struct ieee80211_hw
*hw
,
1002 struct ieee80211_if_init_conf
*conf
)
1004 struct wl1271
*wl
= hw
->priv
;
1007 wl1271_debug(DEBUG_MAC80211
, "mac80211 add interface type %d mac %pM",
1008 conf
->type
, conf
->mac_addr
);
1010 mutex_lock(&wl
->mutex
);
1016 wl
->vif
= conf
->vif
;
1018 switch (conf
->type
) {
1019 case NL80211_IFTYPE_STATION
:
1020 wl
->bss_type
= BSS_TYPE_STA_BSS
;
1022 case NL80211_IFTYPE_ADHOC
:
1023 wl
->bss_type
= BSS_TYPE_IBSS
;
1030 /* FIXME: what if conf->mac_addr changes? */
1033 mutex_unlock(&wl
->mutex
);
1037 static void wl1271_op_remove_interface(struct ieee80211_hw
*hw
,
1038 struct ieee80211_if_init_conf
*conf
)
1040 struct wl1271
*wl
= hw
->priv
;
1042 mutex_lock(&wl
->mutex
);
1043 wl1271_debug(DEBUG_MAC80211
, "mac80211 remove interface");
1045 mutex_unlock(&wl
->mutex
);
1049 static int wl1271_op_config_interface(struct ieee80211_hw
*hw
,
1050 struct ieee80211_vif
*vif
,
1051 struct ieee80211_if_conf
*conf
)
1053 struct wl1271
*wl
= hw
->priv
;
1054 struct sk_buff
*beacon
;
1057 wl1271_debug(DEBUG_MAC80211
, "mac80211 config_interface bssid %pM",
1059 wl1271_dump_ascii(DEBUG_MAC80211
, "ssid: ", conf
->ssid
,
1062 mutex_lock(&wl
->mutex
);
1064 ret
= wl1271_ps_elp_wakeup(wl
, false);
1068 if (memcmp(wl
->bssid
, conf
->bssid
, ETH_ALEN
)) {
1069 wl1271_debug(DEBUG_MAC80211
, "bssid changed");
1071 memcpy(wl
->bssid
, conf
->bssid
, ETH_ALEN
);
1073 ret
= wl1271_cmd_join(wl
);
1077 ret
= wl1271_cmd_build_null_data(wl
);
1082 wl
->ssid_len
= conf
->ssid_len
;
1084 memcpy(wl
->ssid
, conf
->ssid
, wl
->ssid_len
);
1086 if (conf
->changed
& IEEE80211_IFCC_BEACON
) {
1087 beacon
= ieee80211_beacon_get(hw
, vif
);
1088 ret
= wl1271_cmd_template_set(wl
, CMD_TEMPL_BEACON
,
1089 beacon
->data
, beacon
->len
);
1092 dev_kfree_skb(beacon
);
1096 ret
= wl1271_cmd_template_set(wl
, CMD_TEMPL_PROBE_RESPONSE
,
1097 beacon
->data
, beacon
->len
);
1099 dev_kfree_skb(beacon
);
1106 wl1271_ps_elp_sleep(wl
);
1109 mutex_unlock(&wl
->mutex
);
1115 static int wl1271_join_channel(struct wl1271
*wl
, int channel
)
1118 /* we need to use a dummy BSSID for now */
1119 static const u8 dummy_bssid
[ETH_ALEN
] = { 0x0b, 0xad, 0xde,
1122 /* disable mac filter, so we hear everything */
1123 wl
->rx_config
&= ~CFG_BSSID_FILTER_EN
;
1125 wl
->channel
= channel
;
1126 memcpy(wl
->bssid
, dummy_bssid
, ETH_ALEN
);
1128 ret
= wl1271_cmd_join(wl
);
1138 static int wl1271_unjoin_channel(struct wl1271
*wl
)
1142 /* to stop listening to a channel, we disconnect */
1143 ret
= wl1271_cmd_disconnect(wl
);
1149 memset(wl
->bssid
, 0, ETH_ALEN
);
1150 wl
->rx_config
= WL1271_DEFAULT_RX_CONFIG
;
1156 static int wl1271_op_config(struct ieee80211_hw
*hw
, u32 changed
)
1158 struct wl1271
*wl
= hw
->priv
;
1159 struct ieee80211_conf
*conf
= &hw
->conf
;
1160 int channel
, ret
= 0;
1162 channel
= ieee80211_frequency_to_channel(conf
->channel
->center_freq
);
1164 wl1271_debug(DEBUG_MAC80211
, "mac80211 config ch %d psm %s power %d %s",
1166 conf
->flags
& IEEE80211_CONF_PS
? "on" : "off",
1168 conf
->flags
& IEEE80211_CONF_IDLE
? "idle" : "in use");
1170 mutex_lock(&wl
->mutex
);
1172 wl
->band
= conf
->channel
->band
;
1174 ret
= wl1271_ps_elp_wakeup(wl
, false);
1178 if (changed
& IEEE80211_CONF_CHANGE_IDLE
) {
1179 if (conf
->flags
& IEEE80211_CONF_IDLE
&& wl
->joined
)
1180 wl1271_unjoin_channel(wl
);
1182 wl1271_join_channel(wl
, channel
);
1184 if (conf
->flags
& IEEE80211_CONF_IDLE
) {
1185 wl
->basic_rate_set
= CONF_TX_RATE_MASK_BASIC
;
1186 wl1271_acx_rate_policies(wl
, CONF_TX_RATE_MASK_BASIC
);
1190 /* if the channel changes while joined, join again */
1191 if (channel
!= wl
->channel
&& wl
->joined
)
1192 wl1271_join_channel(wl
, channel
);
1194 if (conf
->flags
& IEEE80211_CONF_PS
&& !wl
->psm_requested
) {
1195 wl
->psm_requested
= true;
1198 * We enter PSM only if we're already associated.
1199 * If we're not, we'll enter it when joining an SSID,
1200 * through the bss_info_changed() hook.
1202 if (wl
->associated
) {
1203 wl1271_info("psm enabled");
1204 ret
= wl1271_ps_set_mode(wl
, STATION_POWER_SAVE_MODE
);
1206 } else if (!(conf
->flags
& IEEE80211_CONF_PS
) &&
1207 wl
->psm_requested
) {
1208 wl1271_info("psm disabled");
1210 wl
->psm_requested
= false;
1213 ret
= wl1271_ps_set_mode(wl
, STATION_ACTIVE_MODE
);
1216 if (conf
->power_level
!= wl
->power_level
) {
1217 ret
= wl1271_acx_tx_power(wl
, conf
->power_level
);
1221 wl
->power_level
= conf
->power_level
;
1225 wl1271_ps_elp_sleep(wl
);
1228 mutex_unlock(&wl
->mutex
);
1233 struct wl1271_filter_params
{
1236 u8 mc_list
[ACX_MC_ADDRESS_GROUP_MAX
][ETH_ALEN
];
1239 static u64
wl1271_op_prepare_multicast(struct ieee80211_hw
*hw
, int mc_count
,
1240 struct dev_addr_list
*mc_list
)
1242 struct wl1271_filter_params
*fp
;
1245 fp
= kzalloc(sizeof(*fp
), GFP_ATOMIC
);
1247 wl1271_error("Out of memory setting filters.");
1251 /* update multicast filtering parameters */
1253 if (mc_count
> ACX_MC_ADDRESS_GROUP_MAX
) {
1255 fp
->enabled
= false;
1258 fp
->mc_list_length
= 0;
1259 for (i
= 0; i
< mc_count
; i
++) {
1260 if (mc_list
->da_addrlen
== ETH_ALEN
) {
1261 memcpy(fp
->mc_list
[fp
->mc_list_length
],
1262 mc_list
->da_addr
, ETH_ALEN
);
1263 fp
->mc_list_length
++;
1265 wl1271_warning("Unknown mc address length.");
1266 mc_list
= mc_list
->next
;
1269 return (u64
)(unsigned long)fp
;
1272 #define WL1271_SUPPORTED_FILTERS (FIF_PROMISC_IN_BSS | \
1275 FIF_BCN_PRBRESP_PROMISC | \
1279 static void wl1271_op_configure_filter(struct ieee80211_hw
*hw
,
1280 unsigned int changed
,
1281 unsigned int *total
, u64 multicast
)
1283 struct wl1271_filter_params
*fp
= (void *)(unsigned long)multicast
;
1284 struct wl1271
*wl
= hw
->priv
;
1287 wl1271_debug(DEBUG_MAC80211
, "mac80211 configure filter");
1289 mutex_lock(&wl
->mutex
);
1291 if (wl
->state
== WL1271_STATE_OFF
)
1294 ret
= wl1271_ps_elp_wakeup(wl
, false);
1298 *total
&= WL1271_SUPPORTED_FILTERS
;
1299 changed
&= WL1271_SUPPORTED_FILTERS
;
1301 if (*total
& FIF_ALLMULTI
)
1302 ret
= wl1271_acx_group_address_tbl(wl
, false, NULL
, 0);
1304 ret
= wl1271_acx_group_address_tbl(wl
, fp
->enabled
,
1306 fp
->mc_list_length
);
1312 /* FIXME: We still need to set our filters properly */
1314 /* determine, whether supported filter values have changed */
1318 /* apply configured filters */
1319 ret
= wl1271_acx_rx_config(wl
, wl
->rx_config
, wl
->rx_filter
);
1324 wl1271_ps_elp_sleep(wl
);
1327 mutex_unlock(&wl
->mutex
);
1330 static int wl1271_op_set_key(struct ieee80211_hw
*hw
, enum set_key_cmd cmd
,
1331 struct ieee80211_vif
*vif
,
1332 struct ieee80211_sta
*sta
,
1333 struct ieee80211_key_conf
*key_conf
)
1335 struct wl1271
*wl
= hw
->priv
;
1342 static const u8 bcast_addr
[ETH_ALEN
] =
1343 { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
1345 wl1271_debug(DEBUG_MAC80211
, "mac80211 set key");
1347 addr
= sta
? sta
->addr
: bcast_addr
;
1349 wl1271_debug(DEBUG_CRYPT
, "CMD: 0x%x", cmd
);
1350 wl1271_dump(DEBUG_CRYPT
, "ADDR: ", addr
, ETH_ALEN
);
1351 wl1271_debug(DEBUG_CRYPT
, "Key: algo:0x%x, id:%d, len:%d flags 0x%x",
1352 key_conf
->alg
, key_conf
->keyidx
,
1353 key_conf
->keylen
, key_conf
->flags
);
1354 wl1271_dump(DEBUG_CRYPT
, "KEY: ", key_conf
->key
, key_conf
->keylen
);
1356 if (is_zero_ether_addr(addr
)) {
1357 /* We dont support TX only encryption */
1362 mutex_lock(&wl
->mutex
);
1364 ret
= wl1271_ps_elp_wakeup(wl
, false);
1368 switch (key_conf
->alg
) {
1372 key_conf
->hw_key_idx
= key_conf
->keyidx
;
1375 key_type
= KEY_TKIP
;
1377 key_conf
->hw_key_idx
= key_conf
->keyidx
;
1378 tx_seq_32
= wl
->tx_security_seq_32
;
1379 tx_seq_16
= wl
->tx_security_seq_16
;
1384 key_conf
->flags
|= IEEE80211_KEY_FLAG_GENERATE_IV
;
1385 tx_seq_32
= wl
->tx_security_seq_32
;
1386 tx_seq_16
= wl
->tx_security_seq_16
;
1389 wl1271_error("Unknown key algo 0x%x", key_conf
->alg
);
1397 ret
= wl1271_cmd_set_key(wl
, KEY_ADD_OR_REPLACE
,
1398 key_conf
->keyidx
, key_type
,
1399 key_conf
->keylen
, key_conf
->key
,
1400 addr
, tx_seq_32
, tx_seq_16
);
1402 wl1271_error("Could not add or replace key");
1408 ret
= wl1271_cmd_set_key(wl
, KEY_REMOVE
,
1409 key_conf
->keyidx
, key_type
,
1410 key_conf
->keylen
, key_conf
->key
,
1413 wl1271_error("Could not remove key");
1419 wl1271_error("Unsupported key cmd 0x%x", cmd
);
1427 wl1271_ps_elp_sleep(wl
);
1430 mutex_unlock(&wl
->mutex
);
1436 static int wl1271_op_hw_scan(struct ieee80211_hw
*hw
,
1437 struct cfg80211_scan_request
*req
)
1439 struct wl1271
*wl
= hw
->priv
;
1444 wl1271_debug(DEBUG_MAC80211
, "mac80211 hw scan");
1447 ssid
= req
->ssids
[0].ssid
;
1448 len
= req
->ssids
[0].ssid_len
;
1451 mutex_lock(&wl
->mutex
);
1453 ret
= wl1271_ps_elp_wakeup(wl
, false);
1457 if (wl1271_11a_enabled())
1458 ret
= wl1271_cmd_scan(hw
->priv
, ssid
, len
, 1, 0,
1459 WL1271_SCAN_BAND_DUAL
, 3);
1461 ret
= wl1271_cmd_scan(hw
->priv
, ssid
, len
, 1, 0,
1462 WL1271_SCAN_BAND_2_4_GHZ
, 3);
1464 wl1271_ps_elp_sleep(wl
);
1467 mutex_unlock(&wl
->mutex
);
1472 static int wl1271_op_set_rts_threshold(struct ieee80211_hw
*hw
, u32 value
)
1474 struct wl1271
*wl
= hw
->priv
;
1477 mutex_lock(&wl
->mutex
);
1479 ret
= wl1271_ps_elp_wakeup(wl
, false);
1483 ret
= wl1271_acx_rts_threshold(wl
, (u16
) value
);
1485 wl1271_warning("wl1271_op_set_rts_threshold failed: %d", ret
);
1487 wl1271_ps_elp_sleep(wl
);
1490 mutex_unlock(&wl
->mutex
);
1495 static u32
wl1271_enabled_rates_get(struct wl1271
*wl
, u64 basic_rate_set
)
1497 struct ieee80211_supported_band
*band
;
1498 u32 enabled_rates
= 0;
1501 band
= wl
->hw
->wiphy
->bands
[wl
->band
];
1502 for (bit
= 0; bit
< band
->n_bitrates
; bit
++) {
1503 if (basic_rate_set
& 0x1)
1504 enabled_rates
|= band
->bitrates
[bit
].hw_value
;
1505 basic_rate_set
>>= 1;
1508 return enabled_rates
;
1511 static void wl1271_op_bss_info_changed(struct ieee80211_hw
*hw
,
1512 struct ieee80211_vif
*vif
,
1513 struct ieee80211_bss_conf
*bss_conf
,
1516 enum wl1271_cmd_ps_mode mode
;
1517 struct wl1271
*wl
= hw
->priv
;
1520 wl1271_debug(DEBUG_MAC80211
, "mac80211 bss info changed");
1522 mutex_lock(&wl
->mutex
);
1524 ret
= wl1271_ps_elp_wakeup(wl
, false);
1528 if ((changed
& BSS_CHANGED_BSSID
) &&
1530 * Now we know the correct bssid, so we send a new join command
1531 * and enable the BSSID filter
1533 memcmp(wl
->bssid
, bss_conf
->bssid
, ETH_ALEN
)) {
1534 wl
->rx_config
|= CFG_BSSID_FILTER_EN
;
1535 memcpy(wl
->bssid
, bss_conf
->bssid
, ETH_ALEN
);
1536 ret
= wl1271_cmd_build_null_data(wl
);
1538 wl1271_warning("cmd buld null data failed %d",
1542 ret
= wl1271_cmd_join(wl
);
1544 wl1271_warning("cmd join failed %d", ret
);
1550 if (changed
& BSS_CHANGED_ASSOC
) {
1551 if (bss_conf
->assoc
) {
1552 wl
->aid
= bss_conf
->aid
;
1553 wl
->associated
= true;
1556 * with wl1271, we don't need to update the
1557 * beacon_int and dtim_period, because the firmware
1558 * updates it by itself when the first beacon is
1559 * received after a join.
1561 ret
= wl1271_cmd_build_ps_poll(wl
, wl
->aid
);
1565 ret
= wl1271_acx_aid(wl
, wl
->aid
);
1569 /* If we want to go in PSM but we're not there yet */
1570 if (wl
->psm_requested
&& !wl
->psm
) {
1571 mode
= STATION_POWER_SAVE_MODE
;
1572 ret
= wl1271_ps_set_mode(wl
, mode
);
1577 /* use defaults when not associated */
1578 wl
->associated
= false;
1584 if (changed
& BSS_CHANGED_ERP_SLOT
) {
1585 if (bss_conf
->use_short_slot
)
1586 ret
= wl1271_acx_slot(wl
, SLOT_TIME_SHORT
);
1588 ret
= wl1271_acx_slot(wl
, SLOT_TIME_LONG
);
1590 wl1271_warning("Set slot time failed %d", ret
);
1595 if (changed
& BSS_CHANGED_ERP_PREAMBLE
) {
1596 if (bss_conf
->use_short_preamble
)
1597 wl1271_acx_set_preamble(wl
, ACX_PREAMBLE_SHORT
);
1599 wl1271_acx_set_preamble(wl
, ACX_PREAMBLE_LONG
);
1602 if (changed
& BSS_CHANGED_ERP_CTS_PROT
) {
1603 if (bss_conf
->use_cts_prot
)
1604 ret
= wl1271_acx_cts_protect(wl
, CTSPROTECT_ENABLE
);
1606 ret
= wl1271_acx_cts_protect(wl
, CTSPROTECT_DISABLE
);
1608 wl1271_warning("Set ctsprotect failed %d", ret
);
1613 if (changed
& BSS_CHANGED_BASIC_RATES
) {
1614 wl
->basic_rate_set
= wl1271_enabled_rates_get(
1615 wl
, bss_conf
->basic_rates
);
1617 ret
= wl1271_acx_rate_policies(wl
, wl
->basic_rate_set
);
1619 wl1271_warning("Set rate policies failed %d", ret
);
1625 wl1271_ps_elp_sleep(wl
);
1628 mutex_unlock(&wl
->mutex
);
1632 /* can't be const, mac80211 writes to this */
1633 static struct ieee80211_rate wl1271_rates
[] = {
1635 .hw_value
= CONF_HW_BIT_RATE_1MBPS
,
1636 .hw_value_short
= CONF_HW_BIT_RATE_1MBPS
, },
1638 .hw_value
= CONF_HW_BIT_RATE_2MBPS
,
1639 .hw_value_short
= CONF_HW_BIT_RATE_2MBPS
,
1640 .flags
= IEEE80211_RATE_SHORT_PREAMBLE
},
1642 .hw_value
= CONF_HW_BIT_RATE_5_5MBPS
,
1643 .hw_value_short
= CONF_HW_BIT_RATE_5_5MBPS
,
1644 .flags
= IEEE80211_RATE_SHORT_PREAMBLE
},
1646 .hw_value
= CONF_HW_BIT_RATE_11MBPS
,
1647 .hw_value_short
= CONF_HW_BIT_RATE_11MBPS
,
1648 .flags
= IEEE80211_RATE_SHORT_PREAMBLE
},
1650 .hw_value
= CONF_HW_BIT_RATE_6MBPS
,
1651 .hw_value_short
= CONF_HW_BIT_RATE_6MBPS
, },
1653 .hw_value
= CONF_HW_BIT_RATE_9MBPS
,
1654 .hw_value_short
= CONF_HW_BIT_RATE_9MBPS
, },
1656 .hw_value
= CONF_HW_BIT_RATE_12MBPS
,
1657 .hw_value_short
= CONF_HW_BIT_RATE_12MBPS
, },
1659 .hw_value
= CONF_HW_BIT_RATE_18MBPS
,
1660 .hw_value_short
= CONF_HW_BIT_RATE_18MBPS
, },
1662 .hw_value
= CONF_HW_BIT_RATE_24MBPS
,
1663 .hw_value_short
= CONF_HW_BIT_RATE_24MBPS
, },
1665 .hw_value
= CONF_HW_BIT_RATE_36MBPS
,
1666 .hw_value_short
= CONF_HW_BIT_RATE_36MBPS
, },
1668 .hw_value
= CONF_HW_BIT_RATE_48MBPS
,
1669 .hw_value_short
= CONF_HW_BIT_RATE_48MBPS
, },
1671 .hw_value
= CONF_HW_BIT_RATE_54MBPS
,
1672 .hw_value_short
= CONF_HW_BIT_RATE_54MBPS
, },
1675 /* can't be const, mac80211 writes to this */
1676 static struct ieee80211_channel wl1271_channels
[] = {
1677 { .hw_value
= 1, .center_freq
= 2412, .max_power
= 25 },
1678 { .hw_value
= 2, .center_freq
= 2417, .max_power
= 25 },
1679 { .hw_value
= 3, .center_freq
= 2422, .max_power
= 25 },
1680 { .hw_value
= 4, .center_freq
= 2427, .max_power
= 25 },
1681 { .hw_value
= 5, .center_freq
= 2432, .max_power
= 25 },
1682 { .hw_value
= 6, .center_freq
= 2437, .max_power
= 25 },
1683 { .hw_value
= 7, .center_freq
= 2442, .max_power
= 25 },
1684 { .hw_value
= 8, .center_freq
= 2447, .max_power
= 25 },
1685 { .hw_value
= 9, .center_freq
= 2452, .max_power
= 25 },
1686 { .hw_value
= 10, .center_freq
= 2457, .max_power
= 25 },
1687 { .hw_value
= 11, .center_freq
= 2462, .max_power
= 25 },
1688 { .hw_value
= 12, .center_freq
= 2467, .max_power
= 25 },
1689 { .hw_value
= 13, .center_freq
= 2472, .max_power
= 25 },
1692 /* can't be const, mac80211 writes to this */
1693 static struct ieee80211_supported_band wl1271_band_2ghz
= {
1694 .channels
= wl1271_channels
,
1695 .n_channels
= ARRAY_SIZE(wl1271_channels
),
1696 .bitrates
= wl1271_rates
,
1697 .n_bitrates
= ARRAY_SIZE(wl1271_rates
),
1700 /* 5 GHz data rates for WL1273 */
1701 static struct ieee80211_rate wl1271_rates_5ghz
[] = {
1703 .hw_value
= CONF_HW_BIT_RATE_6MBPS
,
1704 .hw_value_short
= CONF_HW_BIT_RATE_6MBPS
, },
1706 .hw_value
= CONF_HW_BIT_RATE_9MBPS
,
1707 .hw_value_short
= CONF_HW_BIT_RATE_9MBPS
, },
1709 .hw_value
= CONF_HW_BIT_RATE_12MBPS
,
1710 .hw_value_short
= CONF_HW_BIT_RATE_12MBPS
, },
1712 .hw_value
= CONF_HW_BIT_RATE_18MBPS
,
1713 .hw_value_short
= CONF_HW_BIT_RATE_18MBPS
, },
1715 .hw_value
= CONF_HW_BIT_RATE_24MBPS
,
1716 .hw_value_short
= CONF_HW_BIT_RATE_24MBPS
, },
1718 .hw_value
= CONF_HW_BIT_RATE_36MBPS
,
1719 .hw_value_short
= CONF_HW_BIT_RATE_36MBPS
, },
1721 .hw_value
= CONF_HW_BIT_RATE_48MBPS
,
1722 .hw_value_short
= CONF_HW_BIT_RATE_48MBPS
, },
1724 .hw_value
= CONF_HW_BIT_RATE_54MBPS
,
1725 .hw_value_short
= CONF_HW_BIT_RATE_54MBPS
, },
1728 /* 5 GHz band channels for WL1273 */
1729 static struct ieee80211_channel wl1271_channels_5ghz
[] = {
1730 { .hw_value
= 183, .center_freq
= 4915},
1731 { .hw_value
= 184, .center_freq
= 4920},
1732 { .hw_value
= 185, .center_freq
= 4925},
1733 { .hw_value
= 187, .center_freq
= 4935},
1734 { .hw_value
= 188, .center_freq
= 4940},
1735 { .hw_value
= 189, .center_freq
= 4945},
1736 { .hw_value
= 192, .center_freq
= 4960},
1737 { .hw_value
= 196, .center_freq
= 4980},
1738 { .hw_value
= 7, .center_freq
= 5035},
1739 { .hw_value
= 8, .center_freq
= 5040},
1740 { .hw_value
= 9, .center_freq
= 5045},
1741 { .hw_value
= 11, .center_freq
= 5055},
1742 { .hw_value
= 12, .center_freq
= 5060},
1743 { .hw_value
= 16, .center_freq
= 5080},
1744 { .hw_value
= 34, .center_freq
= 5170},
1745 { .hw_value
= 36, .center_freq
= 5180},
1746 { .hw_value
= 38, .center_freq
= 5190},
1747 { .hw_value
= 40, .center_freq
= 5200},
1748 { .hw_value
= 42, .center_freq
= 5210},
1749 { .hw_value
= 44, .center_freq
= 5220},
1750 { .hw_value
= 46, .center_freq
= 5230},
1751 { .hw_value
= 48, .center_freq
= 5240},
1752 { .hw_value
= 52, .center_freq
= 5260},
1753 { .hw_value
= 56, .center_freq
= 5280},
1754 { .hw_value
= 60, .center_freq
= 5300},
1755 { .hw_value
= 64, .center_freq
= 5320},
1756 { .hw_value
= 100, .center_freq
= 5500},
1757 { .hw_value
= 104, .center_freq
= 5520},
1758 { .hw_value
= 108, .center_freq
= 5540},
1759 { .hw_value
= 112, .center_freq
= 5560},
1760 { .hw_value
= 116, .center_freq
= 5580},
1761 { .hw_value
= 120, .center_freq
= 5600},
1762 { .hw_value
= 124, .center_freq
= 5620},
1763 { .hw_value
= 128, .center_freq
= 5640},
1764 { .hw_value
= 132, .center_freq
= 5660},
1765 { .hw_value
= 136, .center_freq
= 5680},
1766 { .hw_value
= 140, .center_freq
= 5700},
1767 { .hw_value
= 149, .center_freq
= 5745},
1768 { .hw_value
= 153, .center_freq
= 5765},
1769 { .hw_value
= 157, .center_freq
= 5785},
1770 { .hw_value
= 161, .center_freq
= 5805},
1771 { .hw_value
= 165, .center_freq
= 5825},
1775 static struct ieee80211_supported_band wl1271_band_5ghz
= {
1776 .channels
= wl1271_channels_5ghz
,
1777 .n_channels
= ARRAY_SIZE(wl1271_channels_5ghz
),
1778 .bitrates
= wl1271_rates_5ghz
,
1779 .n_bitrates
= ARRAY_SIZE(wl1271_rates_5ghz
),
1782 static const struct ieee80211_ops wl1271_ops
= {
1783 .start
= wl1271_op_start
,
1784 .stop
= wl1271_op_stop
,
1785 .add_interface
= wl1271_op_add_interface
,
1786 .remove_interface
= wl1271_op_remove_interface
,
1787 .config
= wl1271_op_config
,
1788 /* .config_interface = wl1271_op_config_interface, */
1789 .prepare_multicast
= wl1271_op_prepare_multicast
,
1790 .configure_filter
= wl1271_op_configure_filter
,
1792 .set_key
= wl1271_op_set_key
,
1793 .hw_scan
= wl1271_op_hw_scan
,
1794 .bss_info_changed
= wl1271_op_bss_info_changed
,
1795 .set_rts_threshold
= wl1271_op_set_rts_threshold
,
1798 static int wl1271_register_hw(struct wl1271
*wl
)
1802 if (wl
->mac80211_registered
)
1805 SET_IEEE80211_PERM_ADDR(wl
->hw
, wl
->mac_addr
);
1807 ret
= ieee80211_register_hw(wl
->hw
);
1809 wl1271_error("unable to register mac80211 hw: %d", ret
);
1813 wl
->mac80211_registered
= true;
1815 wl1271_notice("loaded");
1820 static int wl1271_init_ieee80211(struct wl1271
*wl
)
1822 /* The tx descriptor buffer and the TKIP space. */
1823 wl
->hw
->extra_tx_headroom
= WL1271_TKIP_IV_SPACE
+
1824 sizeof(struct wl1271_tx_hw_descr
);
1827 /* FIXME: find a proper value */
1828 wl
->hw
->channel_change_time
= 10000;
1830 wl
->hw
->flags
= IEEE80211_HW_SIGNAL_DBM
|
1831 IEEE80211_HW_NOISE_DBM
|
1832 IEEE80211_HW_BEACON_FILTER
|
1833 IEEE80211_HW_SUPPORTS_PS
;
1835 wl
->hw
->wiphy
->interface_modes
= BIT(NL80211_IFTYPE_STATION
);
1836 wl
->hw
->wiphy
->max_scan_ssids
= 1;
1837 wl
->hw
->wiphy
->bands
[IEEE80211_BAND_2GHZ
] = &wl1271_band_2ghz
;
1839 if (wl1271_11a_enabled())
1840 wl
->hw
->wiphy
->bands
[IEEE80211_BAND_5GHZ
] = &wl1271_band_5ghz
;
1842 SET_IEEE80211_DEV(wl
->hw
, &wl
->spi
->dev
);
1847 static void wl1271_device_release(struct device
*dev
)
1852 static struct platform_device wl1271_device
= {
1856 /* device model insists to have a release function */
1858 .release
= wl1271_device_release
,
1862 #define WL1271_DEFAULT_CHANNEL 0
1863 static int __devinit
wl1271_probe(struct spi_device
*spi
)
1865 struct wl12xx_platform_data
*pdata
;
1866 struct ieee80211_hw
*hw
;
1869 static const u8 nokia_oui
[3] = {0x00, 0x1f, 0xdf};
1871 pdata
= spi
->dev
.platform_data
;
1873 wl1271_error("no platform data");
1877 hw
= ieee80211_alloc_hw(sizeof(*wl
), &wl1271_ops
);
1879 wl1271_error("could not alloc ieee80211_hw");
1884 memset(wl
, 0, sizeof(*wl
));
1886 INIT_LIST_HEAD(&wl
->list
);
1889 dev_set_drvdata(&spi
->dev
, wl
);
1892 skb_queue_head_init(&wl
->tx_queue
);
1894 INIT_DELAYED_WORK(&wl
->elp_work
, wl1271_elp_work
);
1895 wl
->channel
= WL1271_DEFAULT_CHANNEL
;
1896 wl
->scanning
= false;
1897 wl
->default_key
= 0;
1899 wl
->rx_config
= WL1271_DEFAULT_RX_CONFIG
;
1900 wl
->rx_filter
= WL1271_DEFAULT_RX_FILTER
;
1903 wl
->psm_requested
= false;
1904 wl
->psm_entry_retry
= 0;
1905 wl
->associated
= false;
1906 wl
->tx_queue_stopped
= false;
1907 wl
->power_level
= WL1271_DEFAULT_POWER_LEVEL
;
1908 wl
->basic_rate_set
= CONF_TX_RATE_MASK_BASIC
;
1909 wl
->band
= IEEE80211_BAND_2GHZ
;
1912 wl
->gpio_power
= false;
1914 for (i
= 0; i
< ACX_TX_DESCRIPTORS
; i
++)
1915 wl
->tx_frames
[i
] = NULL
;
1917 spin_lock_init(&wl
->wl_lock
);
1920 * In case our MAC address is not correctly set,
1921 * we use a random but Nokia MAC.
1923 memcpy(wl
->mac_addr
, nokia_oui
, 3);
1924 get_random_bytes(wl
->mac_addr
+ 3, 3);
1926 wl
->state
= WL1271_STATE_OFF
;
1927 mutex_init(&wl
->mutex
);
1929 /* This is the only SPI value that we need to set here, the rest
1930 * comes from the board-peripherals file */
1931 spi
->bits_per_word
= 32;
1933 ret
= spi_setup(spi
);
1935 wl1271_error("spi_setup failed");
1939 wl
->set_power
= pdata
->set_power
;
1940 if (!wl
->set_power
) {
1941 wl1271_error("set power function missing in platform data");
1948 wl1271_error("irq missing in platform data");
1953 ret
= request_irq(wl
->irq
, wl1271_irq
, 0, DRIVER_NAME
, wl
);
1955 wl1271_error("request_irq() failed: %d", ret
);
1959 set_irq_type(wl
->irq
, IRQ_TYPE_EDGE_RISING
);
1961 disable_irq(wl
->irq
);
1963 ret
= platform_device_register(&wl1271_device
);
1965 wl1271_error("couldn't register platform device");
1968 dev_set_drvdata(&wl1271_device
.dev
, wl
);
1970 /* Apply default driver configuration. */
1971 wl1271_conf_init(wl
);
1973 ret
= wl1271_init_ieee80211(wl
);
1977 ret
= wl1271_register_hw(wl
);
1981 wl1271_debugfs_init(wl
);
1983 wl1271_notice("initialized");
1988 platform_device_unregister(&wl1271_device
);
1991 free_irq(wl
->irq
, wl
);
1994 ieee80211_free_hw(hw
);
1999 static int __devexit
wl1271_remove(struct spi_device
*spi
)
2001 struct wl1271
*wl
= dev_get_drvdata(&spi
->dev
);
2003 ieee80211_unregister_hw(wl
->hw
);
2005 wl1271_debugfs_exit(wl
);
2006 platform_device_unregister(&wl1271_device
);
2007 free_irq(wl
->irq
, wl
);
2008 kfree(wl
->target_mem_map
);
2014 kfree(wl
->fw_status
);
2015 kfree(wl
->tx_res_if
);
2017 ieee80211_free_hw(wl
->hw
);
2023 static struct spi_driver wl1271_spi_driver
= {
2026 .bus
= &spi_bus_type
,
2027 .owner
= THIS_MODULE
,
2030 .probe
= wl1271_probe
,
2031 .remove
= __devexit_p(wl1271_remove
),
2034 static int __init
wl1271_init(void)
2038 ret
= spi_register_driver(&wl1271_spi_driver
);
2040 wl1271_error("failed to register spi driver: %d", ret
);
2048 static void __exit
wl1271_exit(void)
2050 spi_unregister_driver(&wl1271_spi_driver
);
2052 wl1271_notice("unloaded");
2055 module_init(wl1271_init
);
2056 module_exit(wl1271_exit
);
2058 MODULE_LICENSE("GPL");
2059 MODULE_AUTHOR("Luciano Coelho <luciano.coelho@nokia.com>");
2060 MODULE_AUTHOR("Juuso Oikarinen <juuso.oikarinen@nokia.com>");
2061 MODULE_FIRMWARE(WL1271_FW_NAME
);