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 bool do_ack
= (intr
& WL1271_ACX_INTR_EVENT_B
) ? false : true;
454 wl1271_debug(DEBUG_IRQ
, "WL1271_ACX_INTR_EVENT_A");
455 wl1271_event_handle(wl
, 0, do_ack
);
458 if (intr
& WL1271_ACX_INTR_EVENT_B
) {
459 wl1271_debug(DEBUG_IRQ
, "WL1271_ACX_INTR_EVENT_B");
460 wl1271_event_handle(wl
, 1, true);
463 if (intr
& WL1271_ACX_INTR_INIT_COMPLETE
)
464 wl1271_debug(DEBUG_IRQ
,
465 "WL1271_ACX_INTR_INIT_COMPLETE");
467 if (intr
& WL1271_ACX_INTR_HW_AVAILABLE
)
468 wl1271_debug(DEBUG_IRQ
, "WL1271_ACX_INTR_HW_AVAILABLE");
470 if (intr
& WL1271_ACX_INTR_DATA
) {
471 u8 tx_res_cnt
= wl
->fw_status
->tx_results_counter
-
472 wl
->tx_results_count
;
474 wl1271_debug(DEBUG_IRQ
, "WL1271_ACX_INTR_DATA");
476 /* check for tx results */
478 wl1271_tx_complete(wl
, tx_res_cnt
);
480 wl1271_rx(wl
, wl
->fw_status
);
484 wl1271_spi_write32(wl
, ACX_REG_INTERRUPT_MASK
,
485 WL1271_ACX_INTR_ALL
& ~(WL1271_INTR_MASK
));
486 wl1271_ps_elp_sleep(wl
);
489 mutex_unlock(&wl
->mutex
);
492 static irqreturn_t
wl1271_irq(int irq
, void *cookie
)
497 wl1271_debug(DEBUG_IRQ
, "IRQ");
501 /* complete the ELP completion */
502 spin_lock_irqsave(&wl
->wl_lock
, flags
);
504 complete(wl
->elp_compl
);
505 wl
->elp_compl
= NULL
;
508 ieee80211_queue_work(wl
->hw
, &wl
->irq_work
);
509 spin_unlock_irqrestore(&wl
->wl_lock
, flags
);
514 static int wl1271_fetch_firmware(struct wl1271
*wl
)
516 const struct firmware
*fw
;
519 ret
= request_firmware(&fw
, WL1271_FW_NAME
, &wl
->spi
->dev
);
522 wl1271_error("could not get firmware: %d", ret
);
527 wl1271_error("firmware size is not multiple of 32 bits: %zu",
533 wl
->fw_len
= fw
->size
;
534 wl
->fw
= vmalloc(wl
->fw_len
);
537 wl1271_error("could not allocate memory for the firmware");
542 memcpy(wl
->fw
, fw
->data
, wl
->fw_len
);
547 release_firmware(fw
);
552 static int wl1271_fetch_nvs(struct wl1271
*wl
)
554 const struct firmware
*fw
;
557 ret
= request_firmware(&fw
, WL1271_NVS_NAME
, &wl
->spi
->dev
);
560 wl1271_error("could not get nvs file: %d", ret
);
565 wl1271_error("nvs size is not multiple of 32 bits: %zu",
571 wl
->nvs_len
= fw
->size
;
572 wl
->nvs
= kmalloc(wl
->nvs_len
, GFP_KERNEL
);
575 wl1271_error("could not allocate memory for the nvs file");
580 memcpy(wl
->nvs
, fw
->data
, wl
->nvs_len
);
585 release_firmware(fw
);
590 static void wl1271_fw_wakeup(struct wl1271
*wl
)
594 elp_reg
= ELPCTRL_WAKE_UP
;
595 wl1271_raw_write32(wl
, HW_ACCESS_ELP_CTRL_REG_ADDR
, elp_reg
);
598 static int wl1271_setup(struct wl1271
*wl
)
600 wl
->fw_status
= kmalloc(sizeof(*wl
->fw_status
), GFP_KERNEL
);
604 wl
->tx_res_if
= kmalloc(sizeof(*wl
->tx_res_if
), GFP_KERNEL
);
605 if (!wl
->tx_res_if
) {
606 kfree(wl
->fw_status
);
610 INIT_WORK(&wl
->irq_work
, wl1271_irq_work
);
611 INIT_WORK(&wl
->tx_work
, wl1271_tx_work
);
615 static int wl1271_chip_wakeup(struct wl1271
*wl
)
617 struct wl1271_partition_set partition
;
621 msleep(WL1271_POWER_ON_SLEEP
);
622 wl1271_spi_reset(wl
);
625 /* We don't need a real memory partition here, because we only want
626 * to use the registers at this point. */
627 memset(&partition
, 0, sizeof(partition
));
628 partition
.reg
.start
= REGISTERS_BASE
;
629 partition
.reg
.size
= REGISTERS_DOWN_SIZE
;
630 wl1271_set_partition(wl
, &partition
);
632 /* ELP module wake up */
633 wl1271_fw_wakeup(wl
);
635 /* whal_FwCtrl_BootSm() */
637 /* 0. read chip id from CHIP_ID */
638 wl
->chip
.id
= wl1271_spi_read32(wl
, CHIP_ID_B
);
640 /* 1. check if chip id is valid */
642 switch (wl
->chip
.id
) {
643 case CHIP_ID_1271_PG10
:
644 wl1271_warning("chip id 0x%x (1271 PG10) support is obsolete",
647 ret
= wl1271_setup(wl
);
651 case CHIP_ID_1271_PG20
:
652 wl1271_debug(DEBUG_BOOT
, "chip id 0x%x (1271 PG20)",
655 ret
= wl1271_setup(wl
);
660 wl1271_error("unsupported chip id: 0x%x", wl
->chip
.id
);
665 if (wl
->fw
== NULL
) {
666 ret
= wl1271_fetch_firmware(wl
);
671 /* No NVS from netlink, try to get it from the filesystem */
672 if (wl
->nvs
== NULL
) {
673 ret
= wl1271_fetch_nvs(wl
);
681 wl1271_power_off(wl
);
687 int wl1271_plt_start(struct wl1271
*wl
)
691 mutex_lock(&wl
->mutex
);
693 wl1271_notice("power up");
695 if (wl
->state
!= WL1271_STATE_OFF
) {
696 wl1271_error("cannot go into PLT state because not "
697 "in off state: %d", wl
->state
);
702 wl
->state
= WL1271_STATE_PLT
;
704 ret
= wl1271_chip_wakeup(wl
);
708 ret
= wl1271_boot(wl
);
712 wl1271_notice("firmware booted in PLT mode (%s)", wl
->chip
.fw_ver
);
714 ret
= wl1271_plt_init(wl
);
716 goto out_irq_disable
;
718 /* Make sure power saving is disabled */
719 ret
= wl1271_acx_sleep_auth(wl
, WL1271_PSM_CAM
);
721 goto out_irq_disable
;
726 wl1271_disable_interrupts(wl
);
729 wl1271_power_off(wl
);
732 mutex_unlock(&wl
->mutex
);
737 int wl1271_plt_stop(struct wl1271
*wl
)
741 mutex_lock(&wl
->mutex
);
743 wl1271_notice("power down");
745 if (wl
->state
!= WL1271_STATE_PLT
) {
746 wl1271_error("cannot power down because not in PLT "
747 "state: %d", wl
->state
);
752 wl1271_disable_interrupts(wl
);
753 wl1271_power_off(wl
);
755 wl
->state
= WL1271_STATE_OFF
;
759 mutex_unlock(&wl
->mutex
);
765 static int wl1271_op_tx(struct ieee80211_hw
*hw
, struct sk_buff
*skb
)
767 struct wl1271
*wl
= hw
->priv
;
769 skb_queue_tail(&wl
->tx_queue
, skb
);
772 * The chip specific setup must run before the first TX packet -
773 * before that, the tx_work will not be initialized!
776 ieee80211_queue_work(wl
->hw
, &wl
->tx_work
);
779 * The workqueue is slow to process the tx_queue and we need stop
780 * the queue here, otherwise the queue will get too long.
782 if (skb_queue_len(&wl
->tx_queue
) >= WL1271_TX_QUEUE_MAX_LENGTH
) {
783 ieee80211_stop_queues(wl
->hw
);
786 * FIXME: this is racy, the variable is not properly
787 * protected. Maybe fix this by removing the stupid
788 * variable altogether and checking the real queue state?
790 wl
->tx_queue_stopped
= true;
796 static int wl1271_dev_notify(struct notifier_block
*me
, unsigned long what
,
799 struct net_device
*dev
;
800 struct wireless_dev
*wdev
;
802 struct ieee80211_hw
*hw
;
804 struct wl1271
*wl_temp
;
805 struct in_device
*idev
;
806 struct in_ifaddr
*ifa
= arg
;
809 /* FIXME: this ugly function should probably be implemented in the
810 * mac80211, and here should only be a simple callback handling actual
811 * setting of the filters. Now we need to dig up references to
812 * various structures to gain access to what we need.
813 * Also, because of this, there is no "initial" setting of the filter
814 * in "op_start", because we don't want to dig up struct net_device
815 * there - the filter will be set upon first change of the interface
818 dev
= ifa
->ifa_dev
->dev
;
820 wdev
= dev
->ieee80211_ptr
;
828 hw
= wiphy_priv(wiphy
);
832 /* Check that the interface is one supported by this driver. */
834 list_for_each_entry(wl
, &wl_list
, list
) {
841 /* Get the interface IP address for the device. "ifa" will become
843 - there is no IPV4 protocol address configured
844 - there are multiple (virtual) IPV4 addresses configured
845 When "ifa" is NULL, filtering will be disabled.
850 ifa
= idev
->ifa_list
;
852 if (ifa
&& ifa
->ifa_next
)
855 mutex_lock(&wl
->mutex
);
857 if (wl
->state
== WL1271_STATE_OFF
)
860 ret
= wl1271_ps_elp_wakeup(wl
, false);
864 ret
= wl1271_acx_arp_ip_filter(wl
, true,
865 (u8
*)&ifa
->ifa_address
,
868 ret
= wl1271_acx_arp_ip_filter(wl
, false, NULL
,
870 wl1271_ps_elp_sleep(wl
);
873 mutex_unlock(&wl
->mutex
);
878 static struct notifier_block wl1271_dev_notifier
= {
879 .notifier_call
= wl1271_dev_notify
,
883 static int wl1271_op_start(struct ieee80211_hw
*hw
)
885 struct wl1271
*wl
= hw
->priv
;
888 wl1271_debug(DEBUG_MAC80211
, "mac80211 start");
890 mutex_lock(&wl
->mutex
);
892 if (wl
->state
!= WL1271_STATE_OFF
) {
893 wl1271_error("cannot start because not in off state: %d",
899 ret
= wl1271_chip_wakeup(wl
);
903 ret
= wl1271_boot(wl
);
907 ret
= wl1271_hw_init(wl
);
909 goto out_irq_disable
;
911 wl
->state
= WL1271_STATE_ON
;
913 wl1271_info("firmware booted (%s)", wl
->chip
.fw_ver
);
918 wl1271_disable_interrupts(wl
);
921 wl1271_power_off(wl
);
924 mutex_unlock(&wl
->mutex
);
927 list_add(&wl
->list
, &wl_list
);
928 register_inetaddr_notifier(&wl1271_dev_notifier
);
934 static void wl1271_op_stop(struct ieee80211_hw
*hw
)
936 struct wl1271
*wl
= hw
->priv
;
941 wl1271_debug(DEBUG_MAC80211
, "mac80211 stop");
943 unregister_inetaddr_notifier(&wl1271_dev_notifier
);
946 mutex_lock(&wl
->mutex
);
948 WARN_ON(wl
->state
!= WL1271_STATE_ON
);
951 mutex_unlock(&wl
->mutex
);
952 ieee80211_scan_completed(wl
->hw
, true);
953 mutex_lock(&wl
->mutex
);
954 wl
->scanning
= false;
957 wl
->state
= WL1271_STATE_OFF
;
959 wl1271_disable_interrupts(wl
);
961 mutex_unlock(&wl
->mutex
);
963 cancel_work_sync(&wl
->irq_work
);
964 cancel_work_sync(&wl
->tx_work
);
966 mutex_lock(&wl
->mutex
);
968 /* let's notify MAC80211 about the remaining pending TX frames */
970 wl1271_power_off(wl
);
972 memset(wl
->bssid
, 0, ETH_ALEN
);
973 memset(wl
->ssid
, 0, IW_ESSID_MAX_SIZE
+ 1);
975 wl
->bss_type
= MAX_BSS_TYPE
;
976 wl
->band
= IEEE80211_BAND_2GHZ
;
981 wl
->psm_entry_retry
= 0;
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 wl1271_info("psm enabled");
1197 wl
->psm_requested
= true;
1200 * We enter PSM only if we're already associated.
1201 * If we're not, we'll enter it when joining an SSID,
1202 * through the bss_info_changed() hook.
1204 ret
= wl1271_ps_set_mode(wl
, STATION_POWER_SAVE_MODE
);
1205 } else if (!(conf
->flags
& IEEE80211_CONF_PS
) &&
1206 wl
->psm_requested
) {
1207 wl1271_info("psm disabled");
1209 wl
->psm_requested
= false;
1212 ret
= wl1271_ps_set_mode(wl
, STATION_ACTIVE_MODE
);
1215 if (conf
->power_level
!= wl
->power_level
) {
1216 ret
= wl1271_acx_tx_power(wl
, conf
->power_level
);
1220 wl
->power_level
= conf
->power_level
;
1224 wl1271_ps_elp_sleep(wl
);
1227 mutex_unlock(&wl
->mutex
);
1232 struct wl1271_filter_params
{
1235 u8 mc_list
[ACX_MC_ADDRESS_GROUP_MAX
][ETH_ALEN
];
1238 static u64
wl1271_op_prepare_multicast(struct ieee80211_hw
*hw
, int mc_count
,
1239 struct dev_addr_list
*mc_list
)
1241 struct wl1271_filter_params
*fp
;
1244 fp
= kzalloc(sizeof(*fp
), GFP_ATOMIC
);
1246 wl1271_error("Out of memory setting filters.");
1250 /* update multicast filtering parameters */
1252 if (mc_count
> ACX_MC_ADDRESS_GROUP_MAX
) {
1254 fp
->enabled
= false;
1257 fp
->mc_list_length
= 0;
1258 for (i
= 0; i
< mc_count
; i
++) {
1259 if (mc_list
->da_addrlen
== ETH_ALEN
) {
1260 memcpy(fp
->mc_list
[fp
->mc_list_length
],
1261 mc_list
->da_addr
, ETH_ALEN
);
1262 fp
->mc_list_length
++;
1264 wl1271_warning("Unknown mc address length.");
1265 mc_list
= mc_list
->next
;
1268 return (u64
)(unsigned long)fp
;
1271 #define WL1271_SUPPORTED_FILTERS (FIF_PROMISC_IN_BSS | \
1274 FIF_BCN_PRBRESP_PROMISC | \
1278 static void wl1271_op_configure_filter(struct ieee80211_hw
*hw
,
1279 unsigned int changed
,
1280 unsigned int *total
, u64 multicast
)
1282 struct wl1271_filter_params
*fp
= (void *)(unsigned long)multicast
;
1283 struct wl1271
*wl
= hw
->priv
;
1286 wl1271_debug(DEBUG_MAC80211
, "mac80211 configure filter");
1288 mutex_lock(&wl
->mutex
);
1290 if (wl
->state
== WL1271_STATE_OFF
)
1293 ret
= wl1271_ps_elp_wakeup(wl
, false);
1297 *total
&= WL1271_SUPPORTED_FILTERS
;
1298 changed
&= WL1271_SUPPORTED_FILTERS
;
1300 if (*total
& FIF_ALLMULTI
)
1301 ret
= wl1271_acx_group_address_tbl(wl
, false, NULL
, 0);
1303 ret
= wl1271_acx_group_address_tbl(wl
, fp
->enabled
,
1305 fp
->mc_list_length
);
1311 /* FIXME: We still need to set our filters properly */
1313 /* determine, whether supported filter values have changed */
1317 /* apply configured filters */
1318 ret
= wl1271_acx_rx_config(wl
, wl
->rx_config
, wl
->rx_filter
);
1323 wl1271_ps_elp_sleep(wl
);
1326 mutex_unlock(&wl
->mutex
);
1329 static int wl1271_op_set_key(struct ieee80211_hw
*hw
, enum set_key_cmd cmd
,
1330 struct ieee80211_vif
*vif
,
1331 struct ieee80211_sta
*sta
,
1332 struct ieee80211_key_conf
*key_conf
)
1334 struct wl1271
*wl
= hw
->priv
;
1341 static const u8 bcast_addr
[ETH_ALEN
] =
1342 { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
1344 wl1271_debug(DEBUG_MAC80211
, "mac80211 set key");
1346 addr
= sta
? sta
->addr
: bcast_addr
;
1348 wl1271_debug(DEBUG_CRYPT
, "CMD: 0x%x", cmd
);
1349 wl1271_dump(DEBUG_CRYPT
, "ADDR: ", addr
, ETH_ALEN
);
1350 wl1271_debug(DEBUG_CRYPT
, "Key: algo:0x%x, id:%d, len:%d flags 0x%x",
1351 key_conf
->alg
, key_conf
->keyidx
,
1352 key_conf
->keylen
, key_conf
->flags
);
1353 wl1271_dump(DEBUG_CRYPT
, "KEY: ", key_conf
->key
, key_conf
->keylen
);
1355 if (is_zero_ether_addr(addr
)) {
1356 /* We dont support TX only encryption */
1361 mutex_lock(&wl
->mutex
);
1363 ret
= wl1271_ps_elp_wakeup(wl
, false);
1367 switch (key_conf
->alg
) {
1371 key_conf
->hw_key_idx
= key_conf
->keyidx
;
1374 key_type
= KEY_TKIP
;
1376 key_conf
->hw_key_idx
= key_conf
->keyidx
;
1377 tx_seq_32
= wl
->tx_security_seq_32
;
1378 tx_seq_16
= wl
->tx_security_seq_16
;
1383 key_conf
->flags
|= IEEE80211_KEY_FLAG_GENERATE_IV
;
1384 tx_seq_32
= wl
->tx_security_seq_32
;
1385 tx_seq_16
= wl
->tx_security_seq_16
;
1388 wl1271_error("Unknown key algo 0x%x", key_conf
->alg
);
1396 ret
= wl1271_cmd_set_key(wl
, KEY_ADD_OR_REPLACE
,
1397 key_conf
->keyidx
, key_type
,
1398 key_conf
->keylen
, key_conf
->key
,
1399 addr
, tx_seq_32
, tx_seq_16
);
1401 wl1271_error("Could not add or replace key");
1407 ret
= wl1271_cmd_set_key(wl
, KEY_REMOVE
,
1408 key_conf
->keyidx
, key_type
,
1409 key_conf
->keylen
, key_conf
->key
,
1412 wl1271_error("Could not remove key");
1418 wl1271_error("Unsupported key cmd 0x%x", cmd
);
1426 wl1271_ps_elp_sleep(wl
);
1429 mutex_unlock(&wl
->mutex
);
1435 static int wl1271_op_hw_scan(struct ieee80211_hw
*hw
,
1436 struct cfg80211_scan_request
*req
)
1438 struct wl1271
*wl
= hw
->priv
;
1443 wl1271_debug(DEBUG_MAC80211
, "mac80211 hw scan");
1446 ssid
= req
->ssids
[0].ssid
;
1447 len
= req
->ssids
[0].ssid_len
;
1450 mutex_lock(&wl
->mutex
);
1452 ret
= wl1271_ps_elp_wakeup(wl
, false);
1456 if (wl1271_11a_enabled())
1457 ret
= wl1271_cmd_scan(hw
->priv
, ssid
, len
, 1, 0,
1458 WL1271_SCAN_BAND_DUAL
, 3);
1460 ret
= wl1271_cmd_scan(hw
->priv
, ssid
, len
, 1, 0,
1461 WL1271_SCAN_BAND_2_4_GHZ
, 3);
1463 wl1271_ps_elp_sleep(wl
);
1466 mutex_unlock(&wl
->mutex
);
1471 static int wl1271_op_set_rts_threshold(struct ieee80211_hw
*hw
, u32 value
)
1473 struct wl1271
*wl
= hw
->priv
;
1476 mutex_lock(&wl
->mutex
);
1478 ret
= wl1271_ps_elp_wakeup(wl
, false);
1482 ret
= wl1271_acx_rts_threshold(wl
, (u16
) value
);
1484 wl1271_warning("wl1271_op_set_rts_threshold failed: %d", ret
);
1486 wl1271_ps_elp_sleep(wl
);
1489 mutex_unlock(&wl
->mutex
);
1494 static u32
wl1271_enabled_rates_get(struct wl1271
*wl
, u64 basic_rate_set
)
1496 struct ieee80211_supported_band
*band
;
1497 u32 enabled_rates
= 0;
1500 band
= wl
->hw
->wiphy
->bands
[wl
->band
];
1501 for (bit
= 0; bit
< band
->n_bitrates
; bit
++) {
1502 if (basic_rate_set
& 0x1)
1503 enabled_rates
|= band
->bitrates
[bit
].hw_value
;
1504 basic_rate_set
>>= 1;
1507 return enabled_rates
;
1510 static void wl1271_op_bss_info_changed(struct ieee80211_hw
*hw
,
1511 struct ieee80211_vif
*vif
,
1512 struct ieee80211_bss_conf
*bss_conf
,
1515 enum wl1271_cmd_ps_mode mode
;
1516 struct wl1271
*wl
= hw
->priv
;
1519 wl1271_debug(DEBUG_MAC80211
, "mac80211 bss info changed");
1521 mutex_lock(&wl
->mutex
);
1523 ret
= wl1271_ps_elp_wakeup(wl
, false);
1527 if ((changed
& BSS_CHANGED_BSSID
) &&
1529 * Now we know the correct bssid, so we send a new join command
1530 * and enable the BSSID filter
1532 memcmp(wl
->bssid
, bss_conf
->bssid
, ETH_ALEN
)) {
1533 wl
->rx_config
|= CFG_BSSID_FILTER_EN
;
1534 memcpy(wl
->bssid
, bss_conf
->bssid
, ETH_ALEN
);
1535 ret
= wl1271_cmd_build_null_data(wl
);
1537 wl1271_warning("cmd buld null data failed %d",
1541 ret
= wl1271_cmd_join(wl
);
1543 wl1271_warning("cmd join failed %d", ret
);
1549 if (changed
& BSS_CHANGED_ASSOC
) {
1550 if (bss_conf
->assoc
) {
1551 wl
->aid
= bss_conf
->aid
;
1554 * with wl1271, we don't need to update the
1555 * beacon_int and dtim_period, because the firmware
1556 * updates it by itself when the first beacon is
1557 * received after a join.
1559 ret
= wl1271_cmd_build_ps_poll(wl
, wl
->aid
);
1563 ret
= wl1271_acx_aid(wl
, wl
->aid
);
1567 /* If we want to go in PSM but we're not there yet */
1568 if (wl
->psm_requested
&& !wl
->psm
) {
1569 mode
= STATION_POWER_SAVE_MODE
;
1570 ret
= wl1271_ps_set_mode(wl
, mode
);
1575 /* use defaults when not associated */
1581 if (changed
& BSS_CHANGED_ERP_SLOT
) {
1582 if (bss_conf
->use_short_slot
)
1583 ret
= wl1271_acx_slot(wl
, SLOT_TIME_SHORT
);
1585 ret
= wl1271_acx_slot(wl
, SLOT_TIME_LONG
);
1587 wl1271_warning("Set slot time failed %d", ret
);
1592 if (changed
& BSS_CHANGED_ERP_PREAMBLE
) {
1593 if (bss_conf
->use_short_preamble
)
1594 wl1271_acx_set_preamble(wl
, ACX_PREAMBLE_SHORT
);
1596 wl1271_acx_set_preamble(wl
, ACX_PREAMBLE_LONG
);
1599 if (changed
& BSS_CHANGED_ERP_CTS_PROT
) {
1600 if (bss_conf
->use_cts_prot
)
1601 ret
= wl1271_acx_cts_protect(wl
, CTSPROTECT_ENABLE
);
1603 ret
= wl1271_acx_cts_protect(wl
, CTSPROTECT_DISABLE
);
1605 wl1271_warning("Set ctsprotect failed %d", ret
);
1610 if (changed
& BSS_CHANGED_BASIC_RATES
) {
1611 wl
->basic_rate_set
= wl1271_enabled_rates_get(
1612 wl
, bss_conf
->basic_rates
);
1614 ret
= wl1271_acx_rate_policies(wl
, wl
->basic_rate_set
);
1616 wl1271_warning("Set rate policies failed %d", ret
);
1622 wl1271_ps_elp_sleep(wl
);
1625 mutex_unlock(&wl
->mutex
);
1629 /* can't be const, mac80211 writes to this */
1630 static struct ieee80211_rate wl1271_rates
[] = {
1632 .hw_value
= CONF_HW_BIT_RATE_1MBPS
,
1633 .hw_value_short
= CONF_HW_BIT_RATE_1MBPS
, },
1635 .hw_value
= CONF_HW_BIT_RATE_2MBPS
,
1636 .hw_value_short
= CONF_HW_BIT_RATE_2MBPS
,
1637 .flags
= IEEE80211_RATE_SHORT_PREAMBLE
},
1639 .hw_value
= CONF_HW_BIT_RATE_5_5MBPS
,
1640 .hw_value_short
= CONF_HW_BIT_RATE_5_5MBPS
,
1641 .flags
= IEEE80211_RATE_SHORT_PREAMBLE
},
1643 .hw_value
= CONF_HW_BIT_RATE_11MBPS
,
1644 .hw_value_short
= CONF_HW_BIT_RATE_11MBPS
,
1645 .flags
= IEEE80211_RATE_SHORT_PREAMBLE
},
1647 .hw_value
= CONF_HW_BIT_RATE_6MBPS
,
1648 .hw_value_short
= CONF_HW_BIT_RATE_6MBPS
, },
1650 .hw_value
= CONF_HW_BIT_RATE_9MBPS
,
1651 .hw_value_short
= CONF_HW_BIT_RATE_9MBPS
, },
1653 .hw_value
= CONF_HW_BIT_RATE_12MBPS
,
1654 .hw_value_short
= CONF_HW_BIT_RATE_12MBPS
, },
1656 .hw_value
= CONF_HW_BIT_RATE_18MBPS
,
1657 .hw_value_short
= CONF_HW_BIT_RATE_18MBPS
, },
1659 .hw_value
= CONF_HW_BIT_RATE_24MBPS
,
1660 .hw_value_short
= CONF_HW_BIT_RATE_24MBPS
, },
1662 .hw_value
= CONF_HW_BIT_RATE_36MBPS
,
1663 .hw_value_short
= CONF_HW_BIT_RATE_36MBPS
, },
1665 .hw_value
= CONF_HW_BIT_RATE_48MBPS
,
1666 .hw_value_short
= CONF_HW_BIT_RATE_48MBPS
, },
1668 .hw_value
= CONF_HW_BIT_RATE_54MBPS
,
1669 .hw_value_short
= CONF_HW_BIT_RATE_54MBPS
, },
1672 /* can't be const, mac80211 writes to this */
1673 static struct ieee80211_channel wl1271_channels
[] = {
1674 { .hw_value
= 1, .center_freq
= 2412, .max_power
= 25 },
1675 { .hw_value
= 2, .center_freq
= 2417, .max_power
= 25 },
1676 { .hw_value
= 3, .center_freq
= 2422, .max_power
= 25 },
1677 { .hw_value
= 4, .center_freq
= 2427, .max_power
= 25 },
1678 { .hw_value
= 5, .center_freq
= 2432, .max_power
= 25 },
1679 { .hw_value
= 6, .center_freq
= 2437, .max_power
= 25 },
1680 { .hw_value
= 7, .center_freq
= 2442, .max_power
= 25 },
1681 { .hw_value
= 8, .center_freq
= 2447, .max_power
= 25 },
1682 { .hw_value
= 9, .center_freq
= 2452, .max_power
= 25 },
1683 { .hw_value
= 10, .center_freq
= 2457, .max_power
= 25 },
1684 { .hw_value
= 11, .center_freq
= 2462, .max_power
= 25 },
1685 { .hw_value
= 12, .center_freq
= 2467, .max_power
= 25 },
1686 { .hw_value
= 13, .center_freq
= 2472, .max_power
= 25 },
1689 /* can't be const, mac80211 writes to this */
1690 static struct ieee80211_supported_band wl1271_band_2ghz
= {
1691 .channels
= wl1271_channels
,
1692 .n_channels
= ARRAY_SIZE(wl1271_channels
),
1693 .bitrates
= wl1271_rates
,
1694 .n_bitrates
= ARRAY_SIZE(wl1271_rates
),
1697 /* 5 GHz data rates for WL1273 */
1698 static struct ieee80211_rate wl1271_rates_5ghz
[] = {
1700 .hw_value
= CONF_HW_BIT_RATE_6MBPS
,
1701 .hw_value_short
= CONF_HW_BIT_RATE_6MBPS
, },
1703 .hw_value
= CONF_HW_BIT_RATE_9MBPS
,
1704 .hw_value_short
= CONF_HW_BIT_RATE_9MBPS
, },
1706 .hw_value
= CONF_HW_BIT_RATE_12MBPS
,
1707 .hw_value_short
= CONF_HW_BIT_RATE_12MBPS
, },
1709 .hw_value
= CONF_HW_BIT_RATE_18MBPS
,
1710 .hw_value_short
= CONF_HW_BIT_RATE_18MBPS
, },
1712 .hw_value
= CONF_HW_BIT_RATE_24MBPS
,
1713 .hw_value_short
= CONF_HW_BIT_RATE_24MBPS
, },
1715 .hw_value
= CONF_HW_BIT_RATE_36MBPS
,
1716 .hw_value_short
= CONF_HW_BIT_RATE_36MBPS
, },
1718 .hw_value
= CONF_HW_BIT_RATE_48MBPS
,
1719 .hw_value_short
= CONF_HW_BIT_RATE_48MBPS
, },
1721 .hw_value
= CONF_HW_BIT_RATE_54MBPS
,
1722 .hw_value_short
= CONF_HW_BIT_RATE_54MBPS
, },
1725 /* 5 GHz band channels for WL1273 */
1726 static struct ieee80211_channel wl1271_channels_5ghz
[] = {
1727 { .hw_value
= 183, .center_freq
= 4915},
1728 { .hw_value
= 184, .center_freq
= 4920},
1729 { .hw_value
= 185, .center_freq
= 4925},
1730 { .hw_value
= 187, .center_freq
= 4935},
1731 { .hw_value
= 188, .center_freq
= 4940},
1732 { .hw_value
= 189, .center_freq
= 4945},
1733 { .hw_value
= 192, .center_freq
= 4960},
1734 { .hw_value
= 196, .center_freq
= 4980},
1735 { .hw_value
= 7, .center_freq
= 5035},
1736 { .hw_value
= 8, .center_freq
= 5040},
1737 { .hw_value
= 9, .center_freq
= 5045},
1738 { .hw_value
= 11, .center_freq
= 5055},
1739 { .hw_value
= 12, .center_freq
= 5060},
1740 { .hw_value
= 16, .center_freq
= 5080},
1741 { .hw_value
= 34, .center_freq
= 5170},
1742 { .hw_value
= 36, .center_freq
= 5180},
1743 { .hw_value
= 38, .center_freq
= 5190},
1744 { .hw_value
= 40, .center_freq
= 5200},
1745 { .hw_value
= 42, .center_freq
= 5210},
1746 { .hw_value
= 44, .center_freq
= 5220},
1747 { .hw_value
= 46, .center_freq
= 5230},
1748 { .hw_value
= 48, .center_freq
= 5240},
1749 { .hw_value
= 52, .center_freq
= 5260},
1750 { .hw_value
= 56, .center_freq
= 5280},
1751 { .hw_value
= 60, .center_freq
= 5300},
1752 { .hw_value
= 64, .center_freq
= 5320},
1753 { .hw_value
= 100, .center_freq
= 5500},
1754 { .hw_value
= 104, .center_freq
= 5520},
1755 { .hw_value
= 108, .center_freq
= 5540},
1756 { .hw_value
= 112, .center_freq
= 5560},
1757 { .hw_value
= 116, .center_freq
= 5580},
1758 { .hw_value
= 120, .center_freq
= 5600},
1759 { .hw_value
= 124, .center_freq
= 5620},
1760 { .hw_value
= 128, .center_freq
= 5640},
1761 { .hw_value
= 132, .center_freq
= 5660},
1762 { .hw_value
= 136, .center_freq
= 5680},
1763 { .hw_value
= 140, .center_freq
= 5700},
1764 { .hw_value
= 149, .center_freq
= 5745},
1765 { .hw_value
= 153, .center_freq
= 5765},
1766 { .hw_value
= 157, .center_freq
= 5785},
1767 { .hw_value
= 161, .center_freq
= 5805},
1768 { .hw_value
= 165, .center_freq
= 5825},
1772 static struct ieee80211_supported_band wl1271_band_5ghz
= {
1773 .channels
= wl1271_channels_5ghz
,
1774 .n_channels
= ARRAY_SIZE(wl1271_channels_5ghz
),
1775 .bitrates
= wl1271_rates_5ghz
,
1776 .n_bitrates
= ARRAY_SIZE(wl1271_rates_5ghz
),
1779 static const struct ieee80211_ops wl1271_ops
= {
1780 .start
= wl1271_op_start
,
1781 .stop
= wl1271_op_stop
,
1782 .add_interface
= wl1271_op_add_interface
,
1783 .remove_interface
= wl1271_op_remove_interface
,
1784 .config
= wl1271_op_config
,
1785 /* .config_interface = wl1271_op_config_interface, */
1786 .prepare_multicast
= wl1271_op_prepare_multicast
,
1787 .configure_filter
= wl1271_op_configure_filter
,
1789 .set_key
= wl1271_op_set_key
,
1790 .hw_scan
= wl1271_op_hw_scan
,
1791 .bss_info_changed
= wl1271_op_bss_info_changed
,
1792 .set_rts_threshold
= wl1271_op_set_rts_threshold
,
1795 static int wl1271_register_hw(struct wl1271
*wl
)
1799 if (wl
->mac80211_registered
)
1802 SET_IEEE80211_PERM_ADDR(wl
->hw
, wl
->mac_addr
);
1804 ret
= ieee80211_register_hw(wl
->hw
);
1806 wl1271_error("unable to register mac80211 hw: %d", ret
);
1810 wl
->mac80211_registered
= true;
1812 wl1271_notice("loaded");
1817 static int wl1271_init_ieee80211(struct wl1271
*wl
)
1819 /* The tx descriptor buffer and the TKIP space. */
1820 wl
->hw
->extra_tx_headroom
= WL1271_TKIP_IV_SPACE
+
1821 sizeof(struct wl1271_tx_hw_descr
);
1824 /* FIXME: find a proper value */
1825 wl
->hw
->channel_change_time
= 10000;
1827 wl
->hw
->flags
= IEEE80211_HW_SIGNAL_DBM
|
1828 IEEE80211_HW_NOISE_DBM
|
1829 IEEE80211_HW_BEACON_FILTER
|
1830 IEEE80211_HW_SUPPORTS_PS
;
1832 wl
->hw
->wiphy
->interface_modes
= BIT(NL80211_IFTYPE_STATION
);
1833 wl
->hw
->wiphy
->max_scan_ssids
= 1;
1834 wl
->hw
->wiphy
->bands
[IEEE80211_BAND_2GHZ
] = &wl1271_band_2ghz
;
1836 if (wl1271_11a_enabled())
1837 wl
->hw
->wiphy
->bands
[IEEE80211_BAND_5GHZ
] = &wl1271_band_5ghz
;
1839 SET_IEEE80211_DEV(wl
->hw
, &wl
->spi
->dev
);
1844 static void wl1271_device_release(struct device
*dev
)
1849 static struct platform_device wl1271_device
= {
1853 /* device model insists to have a release function */
1855 .release
= wl1271_device_release
,
1859 #define WL1271_DEFAULT_CHANNEL 0
1860 static int __devinit
wl1271_probe(struct spi_device
*spi
)
1862 struct wl12xx_platform_data
*pdata
;
1863 struct ieee80211_hw
*hw
;
1866 static const u8 nokia_oui
[3] = {0x00, 0x1f, 0xdf};
1868 pdata
= spi
->dev
.platform_data
;
1870 wl1271_error("no platform data");
1874 hw
= ieee80211_alloc_hw(sizeof(*wl
), &wl1271_ops
);
1876 wl1271_error("could not alloc ieee80211_hw");
1881 memset(wl
, 0, sizeof(*wl
));
1883 INIT_LIST_HEAD(&wl
->list
);
1886 dev_set_drvdata(&spi
->dev
, wl
);
1889 skb_queue_head_init(&wl
->tx_queue
);
1891 INIT_DELAYED_WORK(&wl
->elp_work
, wl1271_elp_work
);
1892 wl
->channel
= WL1271_DEFAULT_CHANNEL
;
1893 wl
->scanning
= false;
1894 wl
->default_key
= 0;
1896 wl
->rx_config
= WL1271_DEFAULT_RX_CONFIG
;
1897 wl
->rx_filter
= WL1271_DEFAULT_RX_FILTER
;
1900 wl
->psm_requested
= false;
1901 wl
->psm_entry_retry
= 0;
1902 wl
->tx_queue_stopped
= false;
1903 wl
->power_level
= WL1271_DEFAULT_POWER_LEVEL
;
1904 wl
->basic_rate_set
= CONF_TX_RATE_MASK_BASIC
;
1905 wl
->band
= IEEE80211_BAND_2GHZ
;
1908 wl
->gpio_power
= false;
1910 for (i
= 0; i
< ACX_TX_DESCRIPTORS
; i
++)
1911 wl
->tx_frames
[i
] = NULL
;
1913 spin_lock_init(&wl
->wl_lock
);
1916 * In case our MAC address is not correctly set,
1917 * we use a random but Nokia MAC.
1919 memcpy(wl
->mac_addr
, nokia_oui
, 3);
1920 get_random_bytes(wl
->mac_addr
+ 3, 3);
1922 wl
->state
= WL1271_STATE_OFF
;
1923 mutex_init(&wl
->mutex
);
1925 /* This is the only SPI value that we need to set here, the rest
1926 * comes from the board-peripherals file */
1927 spi
->bits_per_word
= 32;
1929 ret
= spi_setup(spi
);
1931 wl1271_error("spi_setup failed");
1935 wl
->set_power
= pdata
->set_power
;
1936 if (!wl
->set_power
) {
1937 wl1271_error("set power function missing in platform data");
1944 wl1271_error("irq missing in platform data");
1949 ret
= request_irq(wl
->irq
, wl1271_irq
, 0, DRIVER_NAME
, wl
);
1951 wl1271_error("request_irq() failed: %d", ret
);
1955 set_irq_type(wl
->irq
, IRQ_TYPE_EDGE_RISING
);
1957 disable_irq(wl
->irq
);
1959 ret
= platform_device_register(&wl1271_device
);
1961 wl1271_error("couldn't register platform device");
1964 dev_set_drvdata(&wl1271_device
.dev
, wl
);
1966 /* Apply default driver configuration. */
1967 wl1271_conf_init(wl
);
1969 ret
= wl1271_init_ieee80211(wl
);
1973 ret
= wl1271_register_hw(wl
);
1977 wl1271_debugfs_init(wl
);
1979 wl1271_notice("initialized");
1984 platform_device_unregister(&wl1271_device
);
1987 free_irq(wl
->irq
, wl
);
1990 ieee80211_free_hw(hw
);
1995 static int __devexit
wl1271_remove(struct spi_device
*spi
)
1997 struct wl1271
*wl
= dev_get_drvdata(&spi
->dev
);
1999 ieee80211_unregister_hw(wl
->hw
);
2001 wl1271_debugfs_exit(wl
);
2002 platform_device_unregister(&wl1271_device
);
2003 free_irq(wl
->irq
, wl
);
2004 kfree(wl
->target_mem_map
);
2010 kfree(wl
->fw_status
);
2011 kfree(wl
->tx_res_if
);
2013 ieee80211_free_hw(wl
->hw
);
2019 static struct spi_driver wl1271_spi_driver
= {
2022 .bus
= &spi_bus_type
,
2023 .owner
= THIS_MODULE
,
2026 .probe
= wl1271_probe
,
2027 .remove
= __devexit_p(wl1271_remove
),
2030 static int __init
wl1271_init(void)
2034 ret
= spi_register_driver(&wl1271_spi_driver
);
2036 wl1271_error("failed to register spi driver: %d", ret
);
2044 static void __exit
wl1271_exit(void)
2046 spi_unregister_driver(&wl1271_spi_driver
);
2048 wl1271_notice("unloaded");
2051 module_init(wl1271_init
);
2052 module_exit(wl1271_exit
);
2054 MODULE_LICENSE("GPL");
2055 MODULE_AUTHOR("Luciano Coelho <luciano.coelho@nokia.com>");
2056 MODULE_AUTHOR("Juuso Oikarinen <juuso.oikarinen@nokia.com>");
2057 MODULE_FIRMWARE(WL1271_FW_NAME
);