2 * This file is part of wl1271
4 * Copyright (C) 2008-2010 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/firmware.h>
26 #include <linux/delay.h>
27 #include <linux/spi/spi.h>
28 #include <linux/crc32.h>
29 #include <linux/etherdevice.h>
30 #include <linux/vmalloc.h>
31 #include <linux/platform_device.h>
32 #include <linux/slab.h>
35 #include "wl12xx_80211.h"
36 #include "wl1271_reg.h"
37 #include "wl1271_io.h"
38 #include "wl1271_event.h"
39 #include "wl1271_tx.h"
40 #include "wl1271_rx.h"
41 #include "wl1271_ps.h"
42 #include "wl1271_init.h"
43 #include "wl1271_debugfs.h"
44 #include "wl1271_cmd.h"
45 #include "wl1271_boot.h"
46 #include "wl1271_testmode.h"
47 #include "wl1271_scan.h"
49 #define WL1271_BOOT_RETRIES 3
51 static struct conf_drv_settings default_conf
= {
54 [CONF_SG_BT_PER_THRESHOLD
] = 7500,
55 [CONF_SG_HV3_MAX_OVERRIDE
] = 0,
56 [CONF_SG_BT_NFS_SAMPLE_INTERVAL
] = 400,
57 [CONF_SG_BT_LOAD_RATIO
] = 50,
58 [CONF_SG_AUTO_PS_MODE
] = 1,
59 [CONF_SG_AUTO_SCAN_PROBE_REQ
] = 170,
60 [CONF_SG_ACTIVE_SCAN_DURATION_FACTOR_HV3
] = 50,
61 [CONF_SG_ANTENNA_CONFIGURATION
] = 0,
62 [CONF_SG_BEACON_MISS_PERCENT
] = 60,
63 [CONF_SG_RATE_ADAPT_THRESH
] = 12,
64 [CONF_SG_RATE_ADAPT_SNR
] = 0,
65 [CONF_SG_WLAN_PS_BT_ACL_MASTER_MIN_BR
] = 10,
66 [CONF_SG_WLAN_PS_BT_ACL_MASTER_MAX_BR
] = 30,
67 [CONF_SG_WLAN_PS_MAX_BT_ACL_MASTER_BR
] = 8,
68 [CONF_SG_WLAN_PS_BT_ACL_SLAVE_MIN_BR
] = 20,
69 [CONF_SG_WLAN_PS_BT_ACL_SLAVE_MAX_BR
] = 50,
70 /* Note: with UPSD, this should be 4 */
71 [CONF_SG_WLAN_PS_MAX_BT_ACL_SLAVE_BR
] = 8,
72 [CONF_SG_WLAN_PS_BT_ACL_MASTER_MIN_EDR
] = 7,
73 [CONF_SG_WLAN_PS_BT_ACL_MASTER_MAX_EDR
] = 25,
74 [CONF_SG_WLAN_PS_MAX_BT_ACL_MASTER_EDR
] = 20,
75 /* Note: with UPDS, this should be 15 */
76 [CONF_SG_WLAN_PS_BT_ACL_SLAVE_MIN_EDR
] = 8,
77 /* Note: with UPDS, this should be 50 */
78 [CONF_SG_WLAN_PS_BT_ACL_SLAVE_MAX_EDR
] = 40,
79 /* Note: with UPDS, this should be 10 */
80 [CONF_SG_WLAN_PS_MAX_BT_ACL_SLAVE_EDR
] = 20,
83 [CONF_SG_ADAPTIVE_RXT_TXT
] = 1,
84 [CONF_SG_PS_POLL_TIMEOUT
] = 10,
85 [CONF_SG_UPSD_TIMEOUT
] = 10,
86 [CONF_SG_WLAN_ACTIVE_BT_ACL_MASTER_MIN_EDR
] = 7,
87 [CONF_SG_WLAN_ACTIVE_BT_ACL_MASTER_MAX_EDR
] = 15,
88 [CONF_SG_WLAN_ACTIVE_MAX_BT_ACL_MASTER_EDR
] = 15,
89 [CONF_SG_WLAN_ACTIVE_BT_ACL_SLAVE_MIN_EDR
] = 8,
90 [CONF_SG_WLAN_ACTIVE_BT_ACL_SLAVE_MAX_EDR
] = 20,
91 [CONF_SG_WLAN_ACTIVE_MAX_BT_ACL_SLAVE_EDR
] = 15,
92 [CONF_SG_WLAN_ACTIVE_BT_ACL_MIN_BR
] = 20,
93 [CONF_SG_WLAN_ACTIVE_BT_ACL_MAX_BR
] = 50,
94 [CONF_SG_WLAN_ACTIVE_MAX_BT_ACL_BR
] = 10,
95 [CONF_SG_PASSIVE_SCAN_DURATION_FACTOR_HV3
] = 200,
96 [CONF_SG_PASSIVE_SCAN_DURATION_FACTOR_A2DP
] = 800,
97 [CONF_SG_PASSIVE_SCAN_A2DP_BT_TIME
] = 75,
98 [CONF_SG_PASSIVE_SCAN_A2DP_WLAN_TIME
] = 15,
99 [CONF_SG_HV3_MAX_SERVED
] = 6,
100 [CONF_SG_DHCP_TIME
] = 5000,
101 [CONF_SG_ACTIVE_SCAN_DURATION_FACTOR_A2DP
] = 100,
103 .state
= CONF_SG_PROTECTIVE
,
106 .rx_msdu_life_time
= 512000,
107 .packet_detection_threshold
= 0,
108 .ps_poll_timeout
= 15,
110 .rts_threshold
= 2347,
111 .rx_cca_threshold
= 0,
112 .irq_blk_threshold
= 0xFFFF,
113 .irq_pkt_threshold
= 0,
115 .queue_type
= CONF_RX_QUEUE_TYPE_LOW_PRIORITY
,
118 .tx_energy_detection
= 0,
121 .short_retry_limit
= 10,
122 .long_retry_limit
= 10,
145 .aifsn
= CONF_TX_AIFS_PIFS
,
152 .aifsn
= CONF_TX_AIFS_PIFS
,
160 .channel_type
= CONF_CHANNEL_TYPE_DCF
,
161 .tsid
= CONF_TX_AC_BE
,
162 .ps_scheme
= CONF_PS_SCHEME_LEGACY
,
163 .ack_policy
= CONF_ACK_POLICY_LEGACY
,
168 .channel_type
= CONF_CHANNEL_TYPE_DCF
,
169 .tsid
= CONF_TX_AC_BE
,
170 .ps_scheme
= CONF_PS_SCHEME_LEGACY
,
171 .ack_policy
= CONF_ACK_POLICY_LEGACY
,
176 .channel_type
= CONF_CHANNEL_TYPE_DCF
,
177 .tsid
= CONF_TX_AC_BE
,
178 .ps_scheme
= CONF_PS_SCHEME_LEGACY
,
179 .ack_policy
= CONF_ACK_POLICY_LEGACY
,
184 .channel_type
= CONF_CHANNEL_TYPE_DCF
,
185 .tsid
= CONF_TX_AC_BE
,
186 .ps_scheme
= CONF_PS_SCHEME_LEGACY
,
187 .ack_policy
= CONF_ACK_POLICY_LEGACY
,
192 .channel_type
= CONF_CHANNEL_TYPE_DCF
,
193 .tsid
= CONF_TX_AC_BE
,
194 .ps_scheme
= CONF_PS_SCHEME_LEGACY
,
195 .ack_policy
= CONF_ACK_POLICY_LEGACY
,
200 .channel_type
= CONF_CHANNEL_TYPE_DCF
,
201 .tsid
= CONF_TX_AC_BE
,
202 .ps_scheme
= CONF_PS_SCHEME_LEGACY
,
203 .ack_policy
= CONF_ACK_POLICY_LEGACY
,
208 .channel_type
= CONF_CHANNEL_TYPE_DCF
,
209 .tsid
= CONF_TX_AC_BE
,
210 .ps_scheme
= CONF_PS_SCHEME_LEGACY
,
211 .ack_policy
= CONF_ACK_POLICY_LEGACY
,
215 .frag_threshold
= IEEE80211_MAX_FRAG_THRESHOLD
,
216 .tx_compl_timeout
= 700,
217 .tx_compl_threshold
= 4,
218 .basic_rate
= CONF_HW_BIT_RATE_1MBPS
,
219 .basic_rate_5
= CONF_HW_BIT_RATE_6MBPS
,
222 .wake_up_event
= CONF_WAKE_UP_EVENT_DTIM
,
223 .listen_interval
= 1,
224 .bcn_filt_mode
= CONF_BCN_FILT_MODE_ENABLED
,
225 .bcn_filt_ie_count
= 1,
228 .ie
= WLAN_EID_CHANNEL_SWITCH
,
229 .rule
= CONF_BCN_RULE_PASS_ON_APPEARANCE
,
232 .synch_fail_thold
= 10,
233 .bss_lose_timeout
= 100,
234 .beacon_rx_timeout
= 10000,
235 .broadcast_timeout
= 20000,
236 .rx_broadcast_in_ps
= 1,
237 .ps_poll_threshold
= 10,
238 .ps_poll_recovery_period
= 700,
239 .bet_enable
= CONF_BET_MODE_ENABLE
,
240 .bet_max_consecutive
= 10,
241 .psm_entry_retries
= 3,
242 .keep_alive_interval
= 55000,
243 .max_listen_interval
= 20,
250 .host_clk_settling_time
= 5000,
251 .host_fast_wakeup_support
= false
255 .avg_weight_rssi_beacon
= 20,
256 .avg_weight_rssi_data
= 10,
257 .avg_weight_snr_beacon
= 20,
258 .avg_weight_snr_data
= 10
262 static void wl1271_device_release(struct device
*dev
)
267 static struct platform_device wl1271_device
= {
271 /* device model insists to have a release function */
273 .release
= wl1271_device_release
,
277 static LIST_HEAD(wl_list
);
279 static void wl1271_conf_init(struct wl1271
*wl
)
283 * This function applies the default configuration to the driver. This
284 * function is invoked upon driver load (spi probe.)
286 * The configuration is stored in a run-time structure in order to
287 * facilitate for run-time adjustment of any of the parameters. Making
288 * changes to the configuration structure will apply the new values on
289 * the next interface up (wl1271_op_start.)
292 /* apply driver default configuration */
293 memcpy(&wl
->conf
, &default_conf
, sizeof(default_conf
));
297 static int wl1271_plt_init(struct wl1271
*wl
)
299 struct conf_tx_ac_category
*conf_ac
;
300 struct conf_tx_tid
*conf_tid
;
303 ret
= wl1271_cmd_general_parms(wl
);
307 ret
= wl1271_cmd_radio_parms(wl
);
311 ret
= wl1271_init_templates_config(wl
);
315 ret
= wl1271_acx_init_mem_config(wl
);
319 /* PHY layer config */
320 ret
= wl1271_init_phy_config(wl
);
322 goto out_free_memmap
;
324 ret
= wl1271_acx_dco_itrim_params(wl
);
326 goto out_free_memmap
;
328 /* Initialize connection monitoring thresholds */
329 ret
= wl1271_acx_conn_monit_params(wl
, false);
331 goto out_free_memmap
;
333 /* Bluetooth WLAN coexistence */
334 ret
= wl1271_init_pta(wl
);
336 goto out_free_memmap
;
338 /* Energy detection */
339 ret
= wl1271_init_energy_detection(wl
);
341 goto out_free_memmap
;
343 /* Default fragmentation threshold */
344 ret
= wl1271_acx_frag_threshold(wl
);
346 goto out_free_memmap
;
348 /* Default TID configuration */
349 for (i
= 0; i
< wl
->conf
.tx
.tid_conf_count
; i
++) {
350 conf_tid
= &wl
->conf
.tx
.tid_conf
[i
];
351 ret
= wl1271_acx_tid_cfg(wl
, conf_tid
->queue_id
,
352 conf_tid
->channel_type
,
355 conf_tid
->ack_policy
,
356 conf_tid
->apsd_conf
[0],
357 conf_tid
->apsd_conf
[1]);
359 goto out_free_memmap
;
362 /* Default AC configuration */
363 for (i
= 0; i
< wl
->conf
.tx
.ac_conf_count
; i
++) {
364 conf_ac
= &wl
->conf
.tx
.ac_conf
[i
];
365 ret
= wl1271_acx_ac_cfg(wl
, conf_ac
->ac
, conf_ac
->cw_min
,
366 conf_ac
->cw_max
, conf_ac
->aifsn
,
367 conf_ac
->tx_op_limit
);
369 goto out_free_memmap
;
372 /* Enable data path */
373 ret
= wl1271_cmd_data_path(wl
, 1);
375 goto out_free_memmap
;
377 /* Configure for CAM power saving (ie. always active) */
378 ret
= wl1271_acx_sleep_auth(wl
, WL1271_PSM_CAM
);
380 goto out_free_memmap
;
383 ret
= wl1271_acx_pm_config(wl
);
385 goto out_free_memmap
;
390 kfree(wl
->target_mem_map
);
391 wl
->target_mem_map
= NULL
;
396 static void wl1271_fw_status(struct wl1271
*wl
,
397 struct wl1271_fw_status
*status
)
403 wl1271_raw_read(wl
, FW_STATUS_ADDR
, status
, sizeof(*status
), false);
405 wl1271_debug(DEBUG_IRQ
, "intr: 0x%x (fw_rx_counter = %d, "
406 "drv_rx_counter = %d, tx_results_counter = %d)",
408 status
->fw_rx_counter
,
409 status
->drv_rx_counter
,
410 status
->tx_results_counter
);
412 /* update number of available TX blocks */
413 for (i
= 0; i
< NUM_TX_QUEUES
; i
++) {
414 u32 cnt
= le32_to_cpu(status
->tx_released_blks
[i
]) -
415 wl
->tx_blocks_freed
[i
];
417 wl
->tx_blocks_freed
[i
] =
418 le32_to_cpu(status
->tx_released_blks
[i
]);
419 wl
->tx_blocks_available
+= cnt
;
423 /* if more blocks are available now, schedule some tx work */
424 if (total
&& !skb_queue_empty(&wl
->tx_queue
))
425 ieee80211_queue_work(wl
->hw
, &wl
->tx_work
);
427 /* update the host-chipset time offset */
429 wl
->time_offset
= (timespec_to_ns(&ts
) >> 10) -
430 (s64
)le32_to_cpu(status
->fw_localtime
);
433 #define WL1271_IRQ_MAX_LOOPS 10
435 static void wl1271_irq_work(struct work_struct
*work
)
439 int loopcount
= WL1271_IRQ_MAX_LOOPS
;
442 container_of(work
, struct wl1271
, irq_work
);
444 mutex_lock(&wl
->mutex
);
446 wl1271_debug(DEBUG_IRQ
, "IRQ work");
448 if (unlikely(wl
->state
== WL1271_STATE_OFF
))
451 ret
= wl1271_ps_elp_wakeup(wl
, true);
455 spin_lock_irqsave(&wl
->wl_lock
, flags
);
456 while (test_bit(WL1271_FLAG_IRQ_PENDING
, &wl
->flags
) && loopcount
) {
457 clear_bit(WL1271_FLAG_IRQ_PENDING
, &wl
->flags
);
458 spin_unlock_irqrestore(&wl
->wl_lock
, flags
);
461 wl1271_fw_status(wl
, wl
->fw_status
);
462 intr
= le32_to_cpu(wl
->fw_status
->intr
);
464 wl1271_debug(DEBUG_IRQ
, "Zero interrupt received.");
465 spin_lock_irqsave(&wl
->wl_lock
, flags
);
469 intr
&= WL1271_INTR_MASK
;
471 if (intr
& WL1271_ACX_INTR_DATA
) {
472 wl1271_debug(DEBUG_IRQ
, "WL1271_ACX_INTR_DATA");
474 /* check for tx results */
475 if (wl
->fw_status
->tx_results_counter
!=
476 (wl
->tx_results_count
& 0xff))
477 wl1271_tx_complete(wl
);
479 wl1271_rx(wl
, wl
->fw_status
);
482 if (intr
& WL1271_ACX_INTR_EVENT_A
) {
483 wl1271_debug(DEBUG_IRQ
, "WL1271_ACX_INTR_EVENT_A");
484 wl1271_event_handle(wl
, 0);
487 if (intr
& WL1271_ACX_INTR_EVENT_B
) {
488 wl1271_debug(DEBUG_IRQ
, "WL1271_ACX_INTR_EVENT_B");
489 wl1271_event_handle(wl
, 1);
492 if (intr
& WL1271_ACX_INTR_INIT_COMPLETE
)
493 wl1271_debug(DEBUG_IRQ
,
494 "WL1271_ACX_INTR_INIT_COMPLETE");
496 if (intr
& WL1271_ACX_INTR_HW_AVAILABLE
)
497 wl1271_debug(DEBUG_IRQ
, "WL1271_ACX_INTR_HW_AVAILABLE");
499 spin_lock_irqsave(&wl
->wl_lock
, flags
);
502 if (test_bit(WL1271_FLAG_IRQ_PENDING
, &wl
->flags
))
503 ieee80211_queue_work(wl
->hw
, &wl
->irq_work
);
505 clear_bit(WL1271_FLAG_IRQ_RUNNING
, &wl
->flags
);
506 spin_unlock_irqrestore(&wl
->wl_lock
, flags
);
508 wl1271_ps_elp_sleep(wl
);
511 mutex_unlock(&wl
->mutex
);
514 static int wl1271_fetch_firmware(struct wl1271
*wl
)
516 const struct firmware
*fw
;
519 ret
= request_firmware(&fw
, WL1271_FW_NAME
, wl1271_wl_to_dev(wl
));
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
, wl1271_wl_to_dev(wl
));
560 wl1271_error("could not get nvs file: %d", ret
);
564 if (fw
->size
!= sizeof(struct wl1271_nvs_file
) &&
565 (fw
->size
!= WL1271_INI_LEGACY_NVS_FILE_SIZE
||
566 wl1271_11a_enabled())) {
567 wl1271_error("nvs size is not as expected: %zu != %zu",
568 fw
->size
, sizeof(struct wl1271_nvs_file
));
573 wl
->nvs
= kmemdup(fw
->data
, sizeof(struct wl1271_nvs_file
), GFP_KERNEL
);
576 wl1271_error("could not allocate memory for the nvs file");
582 release_firmware(fw
);
587 static void wl1271_fw_wakeup(struct wl1271
*wl
)
591 elp_reg
= ELPCTRL_WAKE_UP
;
592 wl1271_raw_write32(wl
, HW_ACCESS_ELP_CTRL_REG_ADDR
, elp_reg
);
595 static int wl1271_setup(struct wl1271
*wl
)
597 wl
->fw_status
= kmalloc(sizeof(*wl
->fw_status
), GFP_KERNEL
);
601 wl
->tx_res_if
= kmalloc(sizeof(*wl
->tx_res_if
), GFP_KERNEL
);
602 if (!wl
->tx_res_if
) {
603 kfree(wl
->fw_status
);
607 INIT_WORK(&wl
->irq_work
, wl1271_irq_work
);
608 INIT_WORK(&wl
->tx_work
, wl1271_tx_work
);
612 static int wl1271_chip_wakeup(struct wl1271
*wl
)
614 struct wl1271_partition_set partition
;
617 msleep(WL1271_PRE_POWER_ON_SLEEP
);
619 msleep(WL1271_POWER_ON_SLEEP
);
623 /* We don't need a real memory partition here, because we only want
624 * to use the registers at this point. */
625 memset(&partition
, 0, sizeof(partition
));
626 partition
.reg
.start
= REGISTERS_BASE
;
627 partition
.reg
.size
= REGISTERS_DOWN_SIZE
;
628 wl1271_set_partition(wl
, &partition
);
630 /* ELP module wake up */
631 wl1271_fw_wakeup(wl
);
633 /* whal_FwCtrl_BootSm() */
635 /* 0. read chip id from CHIP_ID */
636 wl
->chip
.id
= wl1271_read32(wl
, CHIP_ID_B
);
638 /* 1. check if chip id is valid */
640 switch (wl
->chip
.id
) {
641 case CHIP_ID_1271_PG10
:
642 wl1271_warning("chip id 0x%x (1271 PG10) support is obsolete",
645 ret
= wl1271_setup(wl
);
649 case CHIP_ID_1271_PG20
:
650 wl1271_debug(DEBUG_BOOT
, "chip id 0x%x (1271 PG20)",
653 ret
= wl1271_setup(wl
);
658 wl1271_warning("unsupported chip id: 0x%x", wl
->chip
.id
);
663 if (wl
->fw
== NULL
) {
664 ret
= wl1271_fetch_firmware(wl
);
669 /* No NVS from netlink, try to get it from the filesystem */
670 if (wl
->nvs
== NULL
) {
671 ret
= wl1271_fetch_nvs(wl
);
680 int wl1271_plt_start(struct wl1271
*wl
)
682 int retries
= WL1271_BOOT_RETRIES
;
685 mutex_lock(&wl
->mutex
);
687 wl1271_notice("power up");
689 if (wl
->state
!= WL1271_STATE_OFF
) {
690 wl1271_error("cannot go into PLT state because not "
691 "in off state: %d", wl
->state
);
698 ret
= wl1271_chip_wakeup(wl
);
702 ret
= wl1271_boot(wl
);
706 ret
= wl1271_plt_init(wl
);
710 wl
->state
= WL1271_STATE_PLT
;
711 wl1271_notice("firmware booted in PLT mode (%s)",
716 wl1271_disable_interrupts(wl
);
717 mutex_unlock(&wl
->mutex
);
718 /* Unlocking the mutex in the middle of handling is
719 inherently unsafe. In this case we deem it safe to do,
720 because we need to let any possibly pending IRQ out of
721 the system (and while we are WL1271_STATE_OFF the IRQ
722 work function will not do anything.) Also, any other
723 possible concurrent operations will fail due to the
724 current state, hence the wl1271 struct should be safe. */
725 cancel_work_sync(&wl
->irq_work
);
726 mutex_lock(&wl
->mutex
);
728 wl1271_power_off(wl
);
731 wl1271_error("firmware boot in PLT mode failed despite %d retries",
732 WL1271_BOOT_RETRIES
);
734 mutex_unlock(&wl
->mutex
);
739 int wl1271_plt_stop(struct wl1271
*wl
)
743 mutex_lock(&wl
->mutex
);
745 wl1271_notice("power down");
747 if (wl
->state
!= WL1271_STATE_PLT
) {
748 wl1271_error("cannot power down because not in PLT "
749 "state: %d", wl
->state
);
754 wl1271_disable_interrupts(wl
);
755 wl1271_power_off(wl
);
757 wl
->state
= WL1271_STATE_OFF
;
761 mutex_unlock(&wl
->mutex
);
767 static int wl1271_op_tx(struct ieee80211_hw
*hw
, struct sk_buff
*skb
)
769 struct wl1271
*wl
= hw
->priv
;
770 struct ieee80211_conf
*conf
= &hw
->conf
;
771 struct ieee80211_tx_info
*txinfo
= IEEE80211_SKB_CB(skb
);
772 struct ieee80211_sta
*sta
= txinfo
->control
.sta
;
775 /* peek into the rates configured in the STA entry */
776 spin_lock_irqsave(&wl
->wl_lock
, flags
);
777 if (sta
&& sta
->supp_rates
[conf
->channel
->band
] != wl
->sta_rate_set
) {
778 wl
->sta_rate_set
= sta
->supp_rates
[conf
->channel
->band
];
779 set_bit(WL1271_FLAG_STA_RATES_CHANGED
, &wl
->flags
);
781 spin_unlock_irqrestore(&wl
->wl_lock
, flags
);
783 /* queue the packet */
784 skb_queue_tail(&wl
->tx_queue
, skb
);
787 * The chip specific setup must run before the first TX packet -
788 * before that, the tx_work will not be initialized!
791 ieee80211_queue_work(wl
->hw
, &wl
->tx_work
);
794 * The workqueue is slow to process the tx_queue and we need stop
795 * the queue here, otherwise the queue will get too long.
797 if (skb_queue_len(&wl
->tx_queue
) >= WL1271_TX_QUEUE_HIGH_WATERMARK
) {
798 wl1271_debug(DEBUG_TX
, "op_tx: stopping queues");
800 spin_lock_irqsave(&wl
->wl_lock
, flags
);
801 ieee80211_stop_queues(wl
->hw
);
802 set_bit(WL1271_FLAG_TX_QUEUE_STOPPED
, &wl
->flags
);
803 spin_unlock_irqrestore(&wl
->wl_lock
, flags
);
809 static int wl1271_op_start(struct ieee80211_hw
*hw
)
811 wl1271_debug(DEBUG_MAC80211
, "mac80211 start");
814 * We have to delay the booting of the hardware because
815 * we need to know the local MAC address before downloading and
816 * initializing the firmware. The MAC address cannot be changed
817 * after boot, and without the proper MAC address, the firmware
818 * will not function properly.
820 * The MAC address is first known when the corresponding interface
821 * is added. That is where we will initialize the hardware.
827 static void wl1271_op_stop(struct ieee80211_hw
*hw
)
829 wl1271_debug(DEBUG_MAC80211
, "mac80211 stop");
832 static int wl1271_op_add_interface(struct ieee80211_hw
*hw
,
833 struct ieee80211_vif
*vif
)
835 struct wl1271
*wl
= hw
->priv
;
836 struct wiphy
*wiphy
= hw
->wiphy
;
837 int retries
= WL1271_BOOT_RETRIES
;
840 wl1271_debug(DEBUG_MAC80211
, "mac80211 add interface type %d mac %pM",
841 vif
->type
, vif
->addr
);
843 mutex_lock(&wl
->mutex
);
852 case NL80211_IFTYPE_STATION
:
853 wl
->bss_type
= BSS_TYPE_STA_BSS
;
854 wl
->set_bss_type
= BSS_TYPE_STA_BSS
;
856 case NL80211_IFTYPE_ADHOC
:
857 wl
->bss_type
= BSS_TYPE_IBSS
;
858 wl
->set_bss_type
= BSS_TYPE_STA_BSS
;
865 memcpy(wl
->mac_addr
, vif
->addr
, ETH_ALEN
);
867 if (wl
->state
!= WL1271_STATE_OFF
) {
868 wl1271_error("cannot start because not in off state: %d",
876 ret
= wl1271_chip_wakeup(wl
);
880 ret
= wl1271_boot(wl
);
884 ret
= wl1271_hw_init(wl
);
888 wl
->state
= WL1271_STATE_ON
;
889 wl1271_info("firmware booted (%s)", wl
->chip
.fw_ver
);
891 /* update hw/fw version info in wiphy struct */
892 wiphy
->hw_version
= wl
->chip
.id
;
893 strncpy(wiphy
->fw_version
, wl
->chip
.fw_ver
,
894 sizeof(wiphy
->fw_version
));
899 wl1271_disable_interrupts(wl
);
900 mutex_unlock(&wl
->mutex
);
901 /* Unlocking the mutex in the middle of handling is
902 inherently unsafe. In this case we deem it safe to do,
903 because we need to let any possibly pending IRQ out of
904 the system (and while we are WL1271_STATE_OFF the IRQ
905 work function will not do anything.) Also, any other
906 possible concurrent operations will fail due to the
907 current state, hence the wl1271 struct should be safe. */
908 cancel_work_sync(&wl
->irq_work
);
909 mutex_lock(&wl
->mutex
);
911 wl1271_power_off(wl
);
914 wl1271_error("firmware boot failed despite %d retries",
915 WL1271_BOOT_RETRIES
);
917 mutex_unlock(&wl
->mutex
);
920 list_add(&wl
->list
, &wl_list
);
925 static void wl1271_op_remove_interface(struct ieee80211_hw
*hw
,
926 struct ieee80211_vif
*vif
)
928 struct wl1271
*wl
= hw
->priv
;
931 mutex_lock(&wl
->mutex
);
932 wl1271_debug(DEBUG_MAC80211
, "mac80211 remove interface");
938 WARN_ON(wl
->state
!= WL1271_STATE_ON
);
940 /* enable dyn ps just in case (if left on due to fw crash etc) */
941 if (wl
->bss_type
== BSS_TYPE_STA_BSS
)
942 ieee80211_enable_dyn_ps(wl
->vif
);
944 if (wl
->scan
.state
!= WL1271_SCAN_STATE_IDLE
) {
945 mutex_unlock(&wl
->mutex
);
946 ieee80211_scan_completed(wl
->hw
, true);
947 mutex_lock(&wl
->mutex
);
948 wl
->scan
.state
= WL1271_SCAN_STATE_IDLE
;
949 kfree(wl
->scan
.scanned_ch
);
950 wl
->scan
.scanned_ch
= NULL
;
953 wl
->state
= WL1271_STATE_OFF
;
955 wl1271_disable_interrupts(wl
);
957 mutex_unlock(&wl
->mutex
);
959 cancel_work_sync(&wl
->irq_work
);
960 cancel_work_sync(&wl
->tx_work
);
961 cancel_delayed_work_sync(&wl
->pspoll_work
);
963 mutex_lock(&wl
->mutex
);
965 /* let's notify MAC80211 about the remaining pending TX frames */
967 wl1271_power_off(wl
);
969 memset(wl
->bssid
, 0, ETH_ALEN
);
970 memset(wl
->ssid
, 0, IW_ESSID_MAX_SIZE
+ 1);
972 wl
->bss_type
= MAX_BSS_TYPE
;
973 wl
->set_bss_type
= MAX_BSS_TYPE
;
974 wl
->band
= IEEE80211_BAND_2GHZ
;
977 wl
->psm_entry_retry
= 0;
978 wl
->power_level
= WL1271_DEFAULT_POWER_LEVEL
;
979 wl
->tx_blocks_available
= 0;
980 wl
->tx_results_count
= 0;
981 wl
->tx_packets_count
= 0;
982 wl
->tx_security_last_seq
= 0;
983 wl
->tx_security_seq
= 0;
985 wl
->session_counter
= 0;
986 wl
->rate_set
= CONF_TX_RATE_MASK_BASIC
;
987 wl
->sta_rate_set
= 0;
992 for (i
= 0; i
< NUM_TX_QUEUES
; i
++)
993 wl
->tx_blocks_freed
[i
] = 0;
995 wl1271_debugfs_reset(wl
);
997 kfree(wl
->fw_status
);
998 wl
->fw_status
= NULL
;
999 kfree(wl
->tx_res_if
);
1000 wl
->tx_res_if
= NULL
;
1001 kfree(wl
->target_mem_map
);
1002 wl
->target_mem_map
= NULL
;
1004 mutex_unlock(&wl
->mutex
);
1007 static void wl1271_configure_filters(struct wl1271
*wl
, unsigned int filters
)
1009 wl
->rx_config
= WL1271_DEFAULT_RX_CONFIG
;
1010 wl
->rx_filter
= WL1271_DEFAULT_RX_FILTER
;
1012 /* combine requested filters with current filter config */
1013 filters
= wl
->filters
| filters
;
1015 wl1271_debug(DEBUG_FILTERS
, "RX filters set: ");
1017 if (filters
& FIF_PROMISC_IN_BSS
) {
1018 wl1271_debug(DEBUG_FILTERS
, " - FIF_PROMISC_IN_BSS");
1019 wl
->rx_config
&= ~CFG_UNI_FILTER_EN
;
1020 wl
->rx_config
|= CFG_BSSID_FILTER_EN
;
1022 if (filters
& FIF_BCN_PRBRESP_PROMISC
) {
1023 wl1271_debug(DEBUG_FILTERS
, " - FIF_BCN_PRBRESP_PROMISC");
1024 wl
->rx_config
&= ~CFG_BSSID_FILTER_EN
;
1025 wl
->rx_config
&= ~CFG_SSID_FILTER_EN
;
1027 if (filters
& FIF_OTHER_BSS
) {
1028 wl1271_debug(DEBUG_FILTERS
, " - FIF_OTHER_BSS");
1029 wl
->rx_config
&= ~CFG_BSSID_FILTER_EN
;
1031 if (filters
& FIF_CONTROL
) {
1032 wl1271_debug(DEBUG_FILTERS
, " - FIF_CONTROL");
1033 wl
->rx_filter
|= CFG_RX_CTL_EN
;
1035 if (filters
& FIF_FCSFAIL
) {
1036 wl1271_debug(DEBUG_FILTERS
, " - FIF_FCSFAIL");
1037 wl
->rx_filter
|= CFG_RX_FCS_ERROR
;
1041 static int wl1271_dummy_join(struct wl1271
*wl
)
1044 /* we need to use a dummy BSSID for now */
1045 static const u8 dummy_bssid
[ETH_ALEN
] = { 0x0b, 0xad, 0xde,
1048 memcpy(wl
->bssid
, dummy_bssid
, ETH_ALEN
);
1050 /* pass through frames from all BSS */
1051 wl1271_configure_filters(wl
, FIF_OTHER_BSS
);
1053 ret
= wl1271_cmd_join(wl
, wl
->set_bss_type
);
1057 set_bit(WL1271_FLAG_JOINED
, &wl
->flags
);
1063 static int wl1271_join(struct wl1271
*wl
, bool set_assoc
)
1068 * One of the side effects of the JOIN command is that is clears
1069 * WPA/WPA2 keys from the chipset. Performing a JOIN while associated
1070 * to a WPA/WPA2 access point will therefore kill the data-path.
1071 * Currently there is no supported scenario for JOIN during
1072 * association - if it becomes a supported scenario, the WPA/WPA2 keys
1073 * must be handled somehow.
1076 if (test_bit(WL1271_FLAG_STA_ASSOCIATED
, &wl
->flags
))
1077 wl1271_info("JOIN while associated.");
1080 set_bit(WL1271_FLAG_STA_ASSOCIATED
, &wl
->flags
);
1082 ret
= wl1271_cmd_join(wl
, wl
->set_bss_type
);
1086 set_bit(WL1271_FLAG_JOINED
, &wl
->flags
);
1088 if (!test_bit(WL1271_FLAG_STA_ASSOCIATED
, &wl
->flags
))
1092 * The join command disable the keep-alive mode, shut down its process,
1093 * and also clear the template config, so we need to reset it all after
1094 * the join. The acx_aid starts the keep-alive process, and the order
1095 * of the commands below is relevant.
1097 ret
= wl1271_acx_keep_alive_mode(wl
, true);
1101 ret
= wl1271_acx_aid(wl
, wl
->aid
);
1105 ret
= wl1271_cmd_build_klv_null_data(wl
);
1109 ret
= wl1271_acx_keep_alive_config(wl
, CMD_TEMPL_KLV_IDX_NULL_DATA
,
1110 ACX_KEEP_ALIVE_TPL_VALID
);
1118 static int wl1271_unjoin(struct wl1271
*wl
)
1122 /* to stop listening to a channel, we disconnect */
1123 ret
= wl1271_cmd_disconnect(wl
);
1127 clear_bit(WL1271_FLAG_JOINED
, &wl
->flags
);
1128 memset(wl
->bssid
, 0, ETH_ALEN
);
1130 /* stop filterting packets based on bssid */
1131 wl1271_configure_filters(wl
, FIF_OTHER_BSS
);
1137 static void wl1271_set_band_rate(struct wl1271
*wl
)
1139 if (wl
->band
== IEEE80211_BAND_2GHZ
)
1140 wl
->basic_rate_set
= wl
->conf
.tx
.basic_rate
;
1142 wl
->basic_rate_set
= wl
->conf
.tx
.basic_rate_5
;
1145 static u32
wl1271_min_rate_get(struct wl1271
*wl
)
1150 if (!wl
->basic_rate_set
) {
1152 wl
->basic_rate_set
= wl
->conf
.tx
.basic_rate
;
1155 for (i
= 0; !rate
; i
++) {
1156 if ((wl
->basic_rate_set
>> i
) & 0x1)
1163 static int wl1271_handle_idle(struct wl1271
*wl
, bool idle
)
1168 if (test_bit(WL1271_FLAG_JOINED
, &wl
->flags
)) {
1169 ret
= wl1271_unjoin(wl
);
1173 wl
->rate_set
= wl1271_min_rate_get(wl
);
1174 wl
->sta_rate_set
= 0;
1175 ret
= wl1271_acx_rate_policies(wl
);
1178 ret
= wl1271_acx_keep_alive_config(
1179 wl
, CMD_TEMPL_KLV_IDX_NULL_DATA
,
1180 ACX_KEEP_ALIVE_TPL_INVALID
);
1183 set_bit(WL1271_FLAG_IDLE
, &wl
->flags
);
1185 /* increment the session counter */
1186 wl
->session_counter
++;
1187 if (wl
->session_counter
>= SESSION_COUNTER_MAX
)
1188 wl
->session_counter
= 0;
1189 ret
= wl1271_dummy_join(wl
);
1192 clear_bit(WL1271_FLAG_IDLE
, &wl
->flags
);
1199 static int wl1271_op_config(struct ieee80211_hw
*hw
, u32 changed
)
1201 struct wl1271
*wl
= hw
->priv
;
1202 struct ieee80211_conf
*conf
= &hw
->conf
;
1203 int channel
, ret
= 0;
1205 channel
= ieee80211_frequency_to_channel(conf
->channel
->center_freq
);
1207 wl1271_debug(DEBUG_MAC80211
, "mac80211 config ch %d psm %s power %d %s",
1209 conf
->flags
& IEEE80211_CONF_PS
? "on" : "off",
1211 conf
->flags
& IEEE80211_CONF_IDLE
? "idle" : "in use");
1214 * mac80211 will go to idle nearly immediately after transmitting some
1215 * frames, such as the deauth. To make sure those frames reach the air,
1216 * wait here until the TX queue is fully flushed.
1218 if ((changed
& IEEE80211_CONF_CHANGE_IDLE
) &&
1219 (conf
->flags
& IEEE80211_CONF_IDLE
))
1220 wl1271_tx_flush(wl
);
1222 mutex_lock(&wl
->mutex
);
1224 if (unlikely(wl
->state
== WL1271_STATE_OFF
))
1227 ret
= wl1271_ps_elp_wakeup(wl
, false);
1231 /* if the channel changes while joined, join again */
1232 if (changed
& IEEE80211_CONF_CHANGE_CHANNEL
&&
1233 ((wl
->band
!= conf
->channel
->band
) ||
1234 (wl
->channel
!= channel
))) {
1235 wl
->band
= conf
->channel
->band
;
1236 wl
->channel
= channel
;
1238 if (!test_bit(WL1271_FLAG_STA_ASSOCIATED
, &wl
->flags
))
1239 wl1271_set_band_rate(wl
);
1241 wl
->basic_rate
= wl1271_min_rate_get(wl
);
1242 ret
= wl1271_acx_rate_policies(wl
);
1244 wl1271_warning("rate policy for update channel "
1247 if (test_bit(WL1271_FLAG_JOINED
, &wl
->flags
)) {
1248 ret
= wl1271_join(wl
, false);
1250 wl1271_warning("cmd join to update channel "
1255 if (changed
& IEEE80211_CONF_CHANGE_IDLE
) {
1256 ret
= wl1271_handle_idle(wl
, conf
->flags
& IEEE80211_CONF_IDLE
);
1258 wl1271_warning("idle mode change failed %d", ret
);
1262 * if mac80211 changes the PSM mode, make sure the mode is not
1263 * incorrectly changed after the pspoll failure active window.
1265 if (changed
& IEEE80211_CONF_CHANGE_PS
)
1266 clear_bit(WL1271_FLAG_PSPOLL_FAILURE
, &wl
->flags
);
1268 if (conf
->flags
& IEEE80211_CONF_PS
&&
1269 !test_bit(WL1271_FLAG_PSM_REQUESTED
, &wl
->flags
)) {
1270 set_bit(WL1271_FLAG_PSM_REQUESTED
, &wl
->flags
);
1273 * We enter PSM only if we're already associated.
1274 * If we're not, we'll enter it when joining an SSID,
1275 * through the bss_info_changed() hook.
1277 if (test_bit(WL1271_FLAG_STA_ASSOCIATED
, &wl
->flags
)) {
1278 wl1271_debug(DEBUG_PSM
, "psm enabled");
1279 ret
= wl1271_ps_set_mode(wl
, STATION_POWER_SAVE_MODE
,
1282 } else if (!(conf
->flags
& IEEE80211_CONF_PS
) &&
1283 test_bit(WL1271_FLAG_PSM_REQUESTED
, &wl
->flags
)) {
1284 wl1271_debug(DEBUG_PSM
, "psm disabled");
1286 clear_bit(WL1271_FLAG_PSM_REQUESTED
, &wl
->flags
);
1288 if (test_bit(WL1271_FLAG_PSM
, &wl
->flags
))
1289 ret
= wl1271_ps_set_mode(wl
, STATION_ACTIVE_MODE
,
1293 if (conf
->power_level
!= wl
->power_level
) {
1294 ret
= wl1271_acx_tx_power(wl
, conf
->power_level
);
1298 wl
->power_level
= conf
->power_level
;
1302 wl1271_ps_elp_sleep(wl
);
1305 mutex_unlock(&wl
->mutex
);
1310 struct wl1271_filter_params
{
1313 u8 mc_list
[ACX_MC_ADDRESS_GROUP_MAX
][ETH_ALEN
];
1316 static u64
wl1271_op_prepare_multicast(struct ieee80211_hw
*hw
,
1317 struct netdev_hw_addr_list
*mc_list
)
1319 struct wl1271_filter_params
*fp
;
1320 struct netdev_hw_addr
*ha
;
1321 struct wl1271
*wl
= hw
->priv
;
1323 if (unlikely(wl
->state
== WL1271_STATE_OFF
))
1326 fp
= kzalloc(sizeof(*fp
), GFP_ATOMIC
);
1328 wl1271_error("Out of memory setting filters.");
1332 /* update multicast filtering parameters */
1333 fp
->mc_list_length
= 0;
1334 if (netdev_hw_addr_list_count(mc_list
) > ACX_MC_ADDRESS_GROUP_MAX
) {
1335 fp
->enabled
= false;
1338 netdev_hw_addr_list_for_each(ha
, mc_list
) {
1339 memcpy(fp
->mc_list
[fp
->mc_list_length
],
1340 ha
->addr
, ETH_ALEN
);
1341 fp
->mc_list_length
++;
1345 return (u64
)(unsigned long)fp
;
1348 #define WL1271_SUPPORTED_FILTERS (FIF_PROMISC_IN_BSS | \
1351 FIF_BCN_PRBRESP_PROMISC | \
1355 static void wl1271_op_configure_filter(struct ieee80211_hw
*hw
,
1356 unsigned int changed
,
1357 unsigned int *total
, u64 multicast
)
1359 struct wl1271_filter_params
*fp
= (void *)(unsigned long)multicast
;
1360 struct wl1271
*wl
= hw
->priv
;
1363 wl1271_debug(DEBUG_MAC80211
, "mac80211 configure filter");
1365 mutex_lock(&wl
->mutex
);
1367 *total
&= WL1271_SUPPORTED_FILTERS
;
1368 changed
&= WL1271_SUPPORTED_FILTERS
;
1370 if (unlikely(wl
->state
== WL1271_STATE_OFF
))
1373 ret
= wl1271_ps_elp_wakeup(wl
, false);
1378 if (*total
& FIF_ALLMULTI
)
1379 ret
= wl1271_acx_group_address_tbl(wl
, false, NULL
, 0);
1381 ret
= wl1271_acx_group_address_tbl(wl
, fp
->enabled
,
1383 fp
->mc_list_length
);
1387 /* determine, whether supported filter values have changed */
1391 /* configure filters */
1392 wl
->filters
= *total
;
1393 wl1271_configure_filters(wl
, 0);
1395 /* apply configured filters */
1396 ret
= wl1271_acx_rx_config(wl
, wl
->rx_config
, wl
->rx_filter
);
1401 wl1271_ps_elp_sleep(wl
);
1404 mutex_unlock(&wl
->mutex
);
1408 static int wl1271_op_set_key(struct ieee80211_hw
*hw
, enum set_key_cmd cmd
,
1409 struct ieee80211_vif
*vif
,
1410 struct ieee80211_sta
*sta
,
1411 struct ieee80211_key_conf
*key_conf
)
1413 struct wl1271
*wl
= hw
->priv
;
1420 static const u8 bcast_addr
[ETH_ALEN
] =
1421 { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
1423 wl1271_debug(DEBUG_MAC80211
, "mac80211 set key");
1425 addr
= sta
? sta
->addr
: bcast_addr
;
1427 wl1271_debug(DEBUG_CRYPT
, "CMD: 0x%x", cmd
);
1428 wl1271_dump(DEBUG_CRYPT
, "ADDR: ", addr
, ETH_ALEN
);
1429 wl1271_debug(DEBUG_CRYPT
, "Key: algo:0x%x, id:%d, len:%d flags 0x%x",
1430 key_conf
->alg
, key_conf
->keyidx
,
1431 key_conf
->keylen
, key_conf
->flags
);
1432 wl1271_dump(DEBUG_CRYPT
, "KEY: ", key_conf
->key
, key_conf
->keylen
);
1434 if (is_zero_ether_addr(addr
)) {
1435 /* We dont support TX only encryption */
1440 mutex_lock(&wl
->mutex
);
1442 ret
= wl1271_ps_elp_wakeup(wl
, false);
1446 switch (key_conf
->alg
) {
1450 key_conf
->hw_key_idx
= key_conf
->keyidx
;
1453 key_type
= KEY_TKIP
;
1455 key_conf
->hw_key_idx
= key_conf
->keyidx
;
1456 tx_seq_32
= WL1271_TX_SECURITY_HI32(wl
->tx_security_seq
);
1457 tx_seq_16
= WL1271_TX_SECURITY_LO16(wl
->tx_security_seq
);
1462 key_conf
->flags
|= IEEE80211_KEY_FLAG_GENERATE_IV
;
1463 tx_seq_32
= WL1271_TX_SECURITY_HI32(wl
->tx_security_seq
);
1464 tx_seq_16
= WL1271_TX_SECURITY_LO16(wl
->tx_security_seq
);
1467 wl1271_error("Unknown key algo 0x%x", key_conf
->alg
);
1475 ret
= wl1271_cmd_set_key(wl
, KEY_ADD_OR_REPLACE
,
1476 key_conf
->keyidx
, key_type
,
1477 key_conf
->keylen
, key_conf
->key
,
1478 addr
, tx_seq_32
, tx_seq_16
);
1480 wl1271_error("Could not add or replace key");
1484 /* the default WEP key needs to be configured at least once */
1485 if (key_type
== KEY_WEP
) {
1486 ret
= wl1271_cmd_set_default_wep_key(wl
,
1494 /* The wl1271 does not allow to remove unicast keys - they
1495 will be cleared automatically on next CMD_JOIN. Ignore the
1496 request silently, as we dont want the mac80211 to emit
1497 an error message. */
1498 if (!is_broadcast_ether_addr(addr
))
1501 ret
= wl1271_cmd_set_key(wl
, KEY_REMOVE
,
1502 key_conf
->keyidx
, key_type
,
1503 key_conf
->keylen
, key_conf
->key
,
1506 wl1271_error("Could not remove key");
1512 wl1271_error("Unsupported key cmd 0x%x", cmd
);
1518 wl1271_ps_elp_sleep(wl
);
1521 mutex_unlock(&wl
->mutex
);
1527 static int wl1271_op_hw_scan(struct ieee80211_hw
*hw
,
1528 struct ieee80211_vif
*vif
,
1529 struct cfg80211_scan_request
*req
)
1531 struct wl1271
*wl
= hw
->priv
;
1536 wl1271_debug(DEBUG_MAC80211
, "mac80211 hw scan");
1539 ssid
= req
->ssids
[0].ssid
;
1540 len
= req
->ssids
[0].ssid_len
;
1543 mutex_lock(&wl
->mutex
);
1545 ret
= wl1271_ps_elp_wakeup(wl
, false);
1549 if (wl1271_11a_enabled())
1550 ret
= wl1271_scan(hw
->priv
, ssid
, len
, req
);
1552 ret
= wl1271_scan(hw
->priv
, ssid
, len
, req
);
1554 wl1271_ps_elp_sleep(wl
);
1557 mutex_unlock(&wl
->mutex
);
1562 static int wl1271_op_set_rts_threshold(struct ieee80211_hw
*hw
, u32 value
)
1564 struct wl1271
*wl
= hw
->priv
;
1567 mutex_lock(&wl
->mutex
);
1569 if (unlikely(wl
->state
== WL1271_STATE_OFF
))
1572 ret
= wl1271_ps_elp_wakeup(wl
, false);
1576 ret
= wl1271_acx_rts_threshold(wl
, (u16
) value
);
1578 wl1271_warning("wl1271_op_set_rts_threshold failed: %d", ret
);
1580 wl1271_ps_elp_sleep(wl
);
1583 mutex_unlock(&wl
->mutex
);
1588 static void wl1271_ssid_set(struct wl1271
*wl
, struct sk_buff
*beacon
)
1590 u8
*ptr
= beacon
->data
+
1591 offsetof(struct ieee80211_mgmt
, u
.beacon
.variable
);
1593 /* find the location of the ssid in the beacon */
1594 while (ptr
< beacon
->data
+ beacon
->len
) {
1595 if (ptr
[0] == WLAN_EID_SSID
) {
1596 wl
->ssid_len
= ptr
[1];
1597 memcpy(wl
->ssid
, ptr
+2, wl
->ssid_len
);
1602 wl1271_error("ad-hoc beacon template has no SSID!\n");
1605 static void wl1271_op_bss_info_changed(struct ieee80211_hw
*hw
,
1606 struct ieee80211_vif
*vif
,
1607 struct ieee80211_bss_conf
*bss_conf
,
1610 enum wl1271_cmd_ps_mode mode
;
1611 struct wl1271
*wl
= hw
->priv
;
1612 bool do_join
= false;
1613 bool set_assoc
= false;
1616 wl1271_debug(DEBUG_MAC80211
, "mac80211 bss info changed");
1618 mutex_lock(&wl
->mutex
);
1620 ret
= wl1271_ps_elp_wakeup(wl
, false);
1624 if ((changed
&& BSS_CHANGED_BEACON_INT
) &&
1625 (wl
->bss_type
== BSS_TYPE_IBSS
)) {
1626 wl1271_debug(DEBUG_ADHOC
, "ad-hoc beacon interval updated: %d",
1627 bss_conf
->beacon_int
);
1629 wl
->beacon_int
= bss_conf
->beacon_int
;
1633 if ((changed
&& BSS_CHANGED_BEACON
) &&
1634 (wl
->bss_type
== BSS_TYPE_IBSS
)) {
1635 struct sk_buff
*beacon
= ieee80211_beacon_get(hw
, vif
);
1637 wl1271_debug(DEBUG_ADHOC
, "ad-hoc beacon updated");
1640 struct ieee80211_hdr
*hdr
;
1642 wl1271_ssid_set(wl
, beacon
);
1643 ret
= wl1271_cmd_template_set(wl
, CMD_TEMPL_BEACON
,
1646 wl1271_min_rate_get(wl
));
1649 dev_kfree_skb(beacon
);
1653 hdr
= (struct ieee80211_hdr
*) beacon
->data
;
1654 hdr
->frame_control
= cpu_to_le16(
1655 IEEE80211_FTYPE_MGMT
|
1656 IEEE80211_STYPE_PROBE_RESP
);
1658 ret
= wl1271_cmd_template_set(wl
,
1659 CMD_TEMPL_PROBE_RESPONSE
,
1662 wl1271_min_rate_get(wl
));
1663 dev_kfree_skb(beacon
);
1667 /* Need to update the SSID (for filtering etc) */
1672 if ((changed
& BSS_CHANGED_BEACON_ENABLED
) &&
1673 (wl
->bss_type
== BSS_TYPE_IBSS
)) {
1674 wl1271_debug(DEBUG_ADHOC
, "ad-hoc beaconing: %s",
1675 bss_conf
->enable_beacon
? "enabled" : "disabled");
1677 if (bss_conf
->enable_beacon
)
1678 wl
->set_bss_type
= BSS_TYPE_IBSS
;
1680 wl
->set_bss_type
= BSS_TYPE_STA_BSS
;
1684 if (changed
& BSS_CHANGED_CQM
) {
1685 bool enable
= false;
1686 if (bss_conf
->cqm_rssi_thold
)
1688 ret
= wl1271_acx_rssi_snr_trigger(wl
, enable
,
1689 bss_conf
->cqm_rssi_thold
,
1690 bss_conf
->cqm_rssi_hyst
);
1693 wl
->rssi_thold
= bss_conf
->cqm_rssi_thold
;
1696 if ((changed
& BSS_CHANGED_BSSID
) &&
1698 * Now we know the correct bssid, so we send a new join command
1699 * and enable the BSSID filter
1701 memcmp(wl
->bssid
, bss_conf
->bssid
, ETH_ALEN
)) {
1702 memcpy(wl
->bssid
, bss_conf
->bssid
, ETH_ALEN
);
1704 ret
= wl1271_cmd_build_null_data(wl
);
1708 ret
= wl1271_build_qos_null_data(wl
);
1712 /* filter out all packets not from this BSSID */
1713 wl1271_configure_filters(wl
, 0);
1715 /* Need to update the BSSID (for filtering etc) */
1719 if (changed
& BSS_CHANGED_ASSOC
) {
1720 if (bss_conf
->assoc
) {
1722 wl
->aid
= bss_conf
->aid
;
1725 wl
->ps_poll_failures
= 0;
1728 * use basic rates from AP, and determine lowest rate
1729 * to use with control frames.
1731 rates
= bss_conf
->basic_rates
;
1732 wl
->basic_rate_set
= wl1271_tx_enabled_rates_get(wl
,
1734 wl
->basic_rate
= wl1271_min_rate_get(wl
);
1735 ret
= wl1271_acx_rate_policies(wl
);
1740 * with wl1271, we don't need to update the
1741 * beacon_int and dtim_period, because the firmware
1742 * updates it by itself when the first beacon is
1743 * received after a join.
1745 ret
= wl1271_cmd_build_ps_poll(wl
, wl
->aid
);
1750 * The SSID is intentionally set to NULL here - the
1751 * firmware will set the probe request with a
1752 * broadcast SSID regardless of what we set in the
1755 ret
= wl1271_cmd_build_probe_req(wl
, NULL
, 0,
1758 /* enable the connection monitoring feature */
1759 ret
= wl1271_acx_conn_monit_params(wl
, true);
1763 /* If we want to go in PSM but we're not there yet */
1764 if (test_bit(WL1271_FLAG_PSM_REQUESTED
, &wl
->flags
) &&
1765 !test_bit(WL1271_FLAG_PSM
, &wl
->flags
)) {
1766 mode
= STATION_POWER_SAVE_MODE
;
1767 ret
= wl1271_ps_set_mode(wl
, mode
, true);
1772 /* use defaults when not associated */
1773 clear_bit(WL1271_FLAG_STA_ASSOCIATED
, &wl
->flags
);
1776 /* re-enable dynamic ps - just in case */
1777 ieee80211_enable_dyn_ps(wl
->vif
);
1779 /* revert back to minimum rates for the current band */
1780 wl1271_set_band_rate(wl
);
1781 wl
->basic_rate
= wl1271_min_rate_get(wl
);
1782 ret
= wl1271_acx_rate_policies(wl
);
1786 /* disable connection monitor features */
1787 ret
= wl1271_acx_conn_monit_params(wl
, false);
1789 /* Disable the keep-alive feature */
1790 ret
= wl1271_acx_keep_alive_mode(wl
, false);
1798 if (changed
& BSS_CHANGED_ERP_SLOT
) {
1799 if (bss_conf
->use_short_slot
)
1800 ret
= wl1271_acx_slot(wl
, SLOT_TIME_SHORT
);
1802 ret
= wl1271_acx_slot(wl
, SLOT_TIME_LONG
);
1804 wl1271_warning("Set slot time failed %d", ret
);
1809 if (changed
& BSS_CHANGED_ERP_PREAMBLE
) {
1810 if (bss_conf
->use_short_preamble
)
1811 wl1271_acx_set_preamble(wl
, ACX_PREAMBLE_SHORT
);
1813 wl1271_acx_set_preamble(wl
, ACX_PREAMBLE_LONG
);
1816 if (changed
& BSS_CHANGED_ERP_CTS_PROT
) {
1817 if (bss_conf
->use_cts_prot
)
1818 ret
= wl1271_acx_cts_protect(wl
, CTSPROTECT_ENABLE
);
1820 ret
= wl1271_acx_cts_protect(wl
, CTSPROTECT_DISABLE
);
1822 wl1271_warning("Set ctsprotect failed %d", ret
);
1827 if (changed
& BSS_CHANGED_ARP_FILTER
) {
1828 __be32 addr
= bss_conf
->arp_addr_list
[0];
1829 WARN_ON(wl
->bss_type
!= BSS_TYPE_STA_BSS
);
1831 if (bss_conf
->arp_addr_cnt
== 1 && bss_conf
->arp_filter_enabled
)
1832 ret
= wl1271_acx_arp_ip_filter(wl
, true, addr
);
1834 ret
= wl1271_acx_arp_ip_filter(wl
, false, addr
);
1841 ret
= wl1271_join(wl
, set_assoc
);
1843 wl1271_warning("cmd join failed %d", ret
);
1849 wl1271_ps_elp_sleep(wl
);
1852 mutex_unlock(&wl
->mutex
);
1855 static int wl1271_op_conf_tx(struct ieee80211_hw
*hw
, u16 queue
,
1856 const struct ieee80211_tx_queue_params
*params
)
1858 struct wl1271
*wl
= hw
->priv
;
1862 mutex_lock(&wl
->mutex
);
1864 wl1271_debug(DEBUG_MAC80211
, "mac80211 conf tx %d", queue
);
1866 ret
= wl1271_ps_elp_wakeup(wl
, false);
1870 /* the txop is confed in units of 32us by the mac80211, we need us */
1871 ret
= wl1271_acx_ac_cfg(wl
, wl1271_tx_get_queue(queue
),
1872 params
->cw_min
, params
->cw_max
,
1873 params
->aifs
, params
->txop
<< 5);
1878 ps_scheme
= CONF_PS_SCHEME_UPSD_TRIGGER
;
1880 ps_scheme
= CONF_PS_SCHEME_LEGACY
;
1882 ret
= wl1271_acx_tid_cfg(wl
, wl1271_tx_get_queue(queue
),
1883 CONF_CHANNEL_TYPE_EDCF
,
1884 wl1271_tx_get_queue(queue
),
1885 ps_scheme
, CONF_ACK_POLICY_LEGACY
, 0, 0);
1890 wl1271_ps_elp_sleep(wl
);
1893 mutex_unlock(&wl
->mutex
);
1898 static u64
wl1271_op_get_tsf(struct ieee80211_hw
*hw
)
1901 struct wl1271
*wl
= hw
->priv
;
1902 u64 mactime
= ULLONG_MAX
;
1905 wl1271_debug(DEBUG_MAC80211
, "mac80211 get tsf");
1907 mutex_lock(&wl
->mutex
);
1909 ret
= wl1271_ps_elp_wakeup(wl
, false);
1913 ret
= wl1271_acx_tsf_info(wl
, &mactime
);
1918 wl1271_ps_elp_sleep(wl
);
1921 mutex_unlock(&wl
->mutex
);
1925 static int wl1271_op_get_survey(struct ieee80211_hw
*hw
, int idx
,
1926 struct survey_info
*survey
)
1928 struct wl1271
*wl
= hw
->priv
;
1929 struct ieee80211_conf
*conf
= &hw
->conf
;
1934 survey
->channel
= conf
->channel
;
1935 survey
->filled
= SURVEY_INFO_NOISE_DBM
;
1936 survey
->noise
= wl
->noise
;
1941 /* can't be const, mac80211 writes to this */
1942 static struct ieee80211_rate wl1271_rates
[] = {
1944 .hw_value
= CONF_HW_BIT_RATE_1MBPS
,
1945 .hw_value_short
= CONF_HW_BIT_RATE_1MBPS
, },
1947 .hw_value
= CONF_HW_BIT_RATE_2MBPS
,
1948 .hw_value_short
= CONF_HW_BIT_RATE_2MBPS
,
1949 .flags
= IEEE80211_RATE_SHORT_PREAMBLE
},
1951 .hw_value
= CONF_HW_BIT_RATE_5_5MBPS
,
1952 .hw_value_short
= CONF_HW_BIT_RATE_5_5MBPS
,
1953 .flags
= IEEE80211_RATE_SHORT_PREAMBLE
},
1955 .hw_value
= CONF_HW_BIT_RATE_11MBPS
,
1956 .hw_value_short
= CONF_HW_BIT_RATE_11MBPS
,
1957 .flags
= IEEE80211_RATE_SHORT_PREAMBLE
},
1959 .hw_value
= CONF_HW_BIT_RATE_6MBPS
,
1960 .hw_value_short
= CONF_HW_BIT_RATE_6MBPS
, },
1962 .hw_value
= CONF_HW_BIT_RATE_9MBPS
,
1963 .hw_value_short
= CONF_HW_BIT_RATE_9MBPS
, },
1965 .hw_value
= CONF_HW_BIT_RATE_12MBPS
,
1966 .hw_value_short
= CONF_HW_BIT_RATE_12MBPS
, },
1968 .hw_value
= CONF_HW_BIT_RATE_18MBPS
,
1969 .hw_value_short
= CONF_HW_BIT_RATE_18MBPS
, },
1971 .hw_value
= CONF_HW_BIT_RATE_24MBPS
,
1972 .hw_value_short
= CONF_HW_BIT_RATE_24MBPS
, },
1974 .hw_value
= CONF_HW_BIT_RATE_36MBPS
,
1975 .hw_value_short
= CONF_HW_BIT_RATE_36MBPS
, },
1977 .hw_value
= CONF_HW_BIT_RATE_48MBPS
,
1978 .hw_value_short
= CONF_HW_BIT_RATE_48MBPS
, },
1980 .hw_value
= CONF_HW_BIT_RATE_54MBPS
,
1981 .hw_value_short
= CONF_HW_BIT_RATE_54MBPS
, },
1984 /* can't be const, mac80211 writes to this */
1985 static struct ieee80211_channel wl1271_channels
[] = {
1986 { .hw_value
= 1, .center_freq
= 2412, .max_power
= 25 },
1987 { .hw_value
= 2, .center_freq
= 2417, .max_power
= 25 },
1988 { .hw_value
= 3, .center_freq
= 2422, .max_power
= 25 },
1989 { .hw_value
= 4, .center_freq
= 2427, .max_power
= 25 },
1990 { .hw_value
= 5, .center_freq
= 2432, .max_power
= 25 },
1991 { .hw_value
= 6, .center_freq
= 2437, .max_power
= 25 },
1992 { .hw_value
= 7, .center_freq
= 2442, .max_power
= 25 },
1993 { .hw_value
= 8, .center_freq
= 2447, .max_power
= 25 },
1994 { .hw_value
= 9, .center_freq
= 2452, .max_power
= 25 },
1995 { .hw_value
= 10, .center_freq
= 2457, .max_power
= 25 },
1996 { .hw_value
= 11, .center_freq
= 2462, .max_power
= 25 },
1997 { .hw_value
= 12, .center_freq
= 2467, .max_power
= 25 },
1998 { .hw_value
= 13, .center_freq
= 2472, .max_power
= 25 },
2001 /* mapping to indexes for wl1271_rates */
2002 static const u8 wl1271_rate_to_idx_2ghz
[] = {
2003 /* MCS rates are used only with 11n */
2004 CONF_HW_RXTX_RATE_UNSUPPORTED
, /* CONF_HW_RXTX_RATE_MCS7 */
2005 CONF_HW_RXTX_RATE_UNSUPPORTED
, /* CONF_HW_RXTX_RATE_MCS6 */
2006 CONF_HW_RXTX_RATE_UNSUPPORTED
, /* CONF_HW_RXTX_RATE_MCS5 */
2007 CONF_HW_RXTX_RATE_UNSUPPORTED
, /* CONF_HW_RXTX_RATE_MCS4 */
2008 CONF_HW_RXTX_RATE_UNSUPPORTED
, /* CONF_HW_RXTX_RATE_MCS3 */
2009 CONF_HW_RXTX_RATE_UNSUPPORTED
, /* CONF_HW_RXTX_RATE_MCS2 */
2010 CONF_HW_RXTX_RATE_UNSUPPORTED
, /* CONF_HW_RXTX_RATE_MCS1 */
2011 CONF_HW_RXTX_RATE_UNSUPPORTED
, /* CONF_HW_RXTX_RATE_MCS0 */
2013 11, /* CONF_HW_RXTX_RATE_54 */
2014 10, /* CONF_HW_RXTX_RATE_48 */
2015 9, /* CONF_HW_RXTX_RATE_36 */
2016 8, /* CONF_HW_RXTX_RATE_24 */
2018 /* TI-specific rate */
2019 CONF_HW_RXTX_RATE_UNSUPPORTED
, /* CONF_HW_RXTX_RATE_22 */
2021 7, /* CONF_HW_RXTX_RATE_18 */
2022 6, /* CONF_HW_RXTX_RATE_12 */
2023 3, /* CONF_HW_RXTX_RATE_11 */
2024 5, /* CONF_HW_RXTX_RATE_9 */
2025 4, /* CONF_HW_RXTX_RATE_6 */
2026 2, /* CONF_HW_RXTX_RATE_5_5 */
2027 1, /* CONF_HW_RXTX_RATE_2 */
2028 0 /* CONF_HW_RXTX_RATE_1 */
2031 /* can't be const, mac80211 writes to this */
2032 static struct ieee80211_supported_band wl1271_band_2ghz
= {
2033 .channels
= wl1271_channels
,
2034 .n_channels
= ARRAY_SIZE(wl1271_channels
),
2035 .bitrates
= wl1271_rates
,
2036 .n_bitrates
= ARRAY_SIZE(wl1271_rates
),
2039 /* 5 GHz data rates for WL1273 */
2040 static struct ieee80211_rate wl1271_rates_5ghz
[] = {
2042 .hw_value
= CONF_HW_BIT_RATE_6MBPS
,
2043 .hw_value_short
= CONF_HW_BIT_RATE_6MBPS
, },
2045 .hw_value
= CONF_HW_BIT_RATE_9MBPS
,
2046 .hw_value_short
= CONF_HW_BIT_RATE_9MBPS
, },
2048 .hw_value
= CONF_HW_BIT_RATE_12MBPS
,
2049 .hw_value_short
= CONF_HW_BIT_RATE_12MBPS
, },
2051 .hw_value
= CONF_HW_BIT_RATE_18MBPS
,
2052 .hw_value_short
= CONF_HW_BIT_RATE_18MBPS
, },
2054 .hw_value
= CONF_HW_BIT_RATE_24MBPS
,
2055 .hw_value_short
= CONF_HW_BIT_RATE_24MBPS
, },
2057 .hw_value
= CONF_HW_BIT_RATE_36MBPS
,
2058 .hw_value_short
= CONF_HW_BIT_RATE_36MBPS
, },
2060 .hw_value
= CONF_HW_BIT_RATE_48MBPS
,
2061 .hw_value_short
= CONF_HW_BIT_RATE_48MBPS
, },
2063 .hw_value
= CONF_HW_BIT_RATE_54MBPS
,
2064 .hw_value_short
= CONF_HW_BIT_RATE_54MBPS
, },
2067 /* 5 GHz band channels for WL1273 */
2068 static struct ieee80211_channel wl1271_channels_5ghz
[] = {
2069 { .hw_value
= 183, .center_freq
= 4915},
2070 { .hw_value
= 184, .center_freq
= 4920},
2071 { .hw_value
= 185, .center_freq
= 4925},
2072 { .hw_value
= 187, .center_freq
= 4935},
2073 { .hw_value
= 188, .center_freq
= 4940},
2074 { .hw_value
= 189, .center_freq
= 4945},
2075 { .hw_value
= 192, .center_freq
= 4960},
2076 { .hw_value
= 196, .center_freq
= 4980},
2077 { .hw_value
= 7, .center_freq
= 5035},
2078 { .hw_value
= 8, .center_freq
= 5040},
2079 { .hw_value
= 9, .center_freq
= 5045},
2080 { .hw_value
= 11, .center_freq
= 5055},
2081 { .hw_value
= 12, .center_freq
= 5060},
2082 { .hw_value
= 16, .center_freq
= 5080},
2083 { .hw_value
= 34, .center_freq
= 5170},
2084 { .hw_value
= 36, .center_freq
= 5180},
2085 { .hw_value
= 38, .center_freq
= 5190},
2086 { .hw_value
= 40, .center_freq
= 5200},
2087 { .hw_value
= 42, .center_freq
= 5210},
2088 { .hw_value
= 44, .center_freq
= 5220},
2089 { .hw_value
= 46, .center_freq
= 5230},
2090 { .hw_value
= 48, .center_freq
= 5240},
2091 { .hw_value
= 52, .center_freq
= 5260},
2092 { .hw_value
= 56, .center_freq
= 5280},
2093 { .hw_value
= 60, .center_freq
= 5300},
2094 { .hw_value
= 64, .center_freq
= 5320},
2095 { .hw_value
= 100, .center_freq
= 5500},
2096 { .hw_value
= 104, .center_freq
= 5520},
2097 { .hw_value
= 108, .center_freq
= 5540},
2098 { .hw_value
= 112, .center_freq
= 5560},
2099 { .hw_value
= 116, .center_freq
= 5580},
2100 { .hw_value
= 120, .center_freq
= 5600},
2101 { .hw_value
= 124, .center_freq
= 5620},
2102 { .hw_value
= 128, .center_freq
= 5640},
2103 { .hw_value
= 132, .center_freq
= 5660},
2104 { .hw_value
= 136, .center_freq
= 5680},
2105 { .hw_value
= 140, .center_freq
= 5700},
2106 { .hw_value
= 149, .center_freq
= 5745},
2107 { .hw_value
= 153, .center_freq
= 5765},
2108 { .hw_value
= 157, .center_freq
= 5785},
2109 { .hw_value
= 161, .center_freq
= 5805},
2110 { .hw_value
= 165, .center_freq
= 5825},
2113 /* mapping to indexes for wl1271_rates_5ghz */
2114 static const u8 wl1271_rate_to_idx_5ghz
[] = {
2115 /* MCS rates are used only with 11n */
2116 CONF_HW_RXTX_RATE_UNSUPPORTED
, /* CONF_HW_RXTX_RATE_MCS7 */
2117 CONF_HW_RXTX_RATE_UNSUPPORTED
, /* CONF_HW_RXTX_RATE_MCS6 */
2118 CONF_HW_RXTX_RATE_UNSUPPORTED
, /* CONF_HW_RXTX_RATE_MCS5 */
2119 CONF_HW_RXTX_RATE_UNSUPPORTED
, /* CONF_HW_RXTX_RATE_MCS4 */
2120 CONF_HW_RXTX_RATE_UNSUPPORTED
, /* CONF_HW_RXTX_RATE_MCS3 */
2121 CONF_HW_RXTX_RATE_UNSUPPORTED
, /* CONF_HW_RXTX_RATE_MCS2 */
2122 CONF_HW_RXTX_RATE_UNSUPPORTED
, /* CONF_HW_RXTX_RATE_MCS1 */
2123 CONF_HW_RXTX_RATE_UNSUPPORTED
, /* CONF_HW_RXTX_RATE_MCS0 */
2125 7, /* CONF_HW_RXTX_RATE_54 */
2126 6, /* CONF_HW_RXTX_RATE_48 */
2127 5, /* CONF_HW_RXTX_RATE_36 */
2128 4, /* CONF_HW_RXTX_RATE_24 */
2130 /* TI-specific rate */
2131 CONF_HW_RXTX_RATE_UNSUPPORTED
, /* CONF_HW_RXTX_RATE_22 */
2133 3, /* CONF_HW_RXTX_RATE_18 */
2134 2, /* CONF_HW_RXTX_RATE_12 */
2135 CONF_HW_RXTX_RATE_UNSUPPORTED
, /* CONF_HW_RXTX_RATE_11 */
2136 1, /* CONF_HW_RXTX_RATE_9 */
2137 0, /* CONF_HW_RXTX_RATE_6 */
2138 CONF_HW_RXTX_RATE_UNSUPPORTED
, /* CONF_HW_RXTX_RATE_5_5 */
2139 CONF_HW_RXTX_RATE_UNSUPPORTED
, /* CONF_HW_RXTX_RATE_2 */
2140 CONF_HW_RXTX_RATE_UNSUPPORTED
/* CONF_HW_RXTX_RATE_1 */
2143 static struct ieee80211_supported_band wl1271_band_5ghz
= {
2144 .channels
= wl1271_channels_5ghz
,
2145 .n_channels
= ARRAY_SIZE(wl1271_channels_5ghz
),
2146 .bitrates
= wl1271_rates_5ghz
,
2147 .n_bitrates
= ARRAY_SIZE(wl1271_rates_5ghz
),
2150 static const u8
*wl1271_band_rate_to_idx
[] = {
2151 [IEEE80211_BAND_2GHZ
] = wl1271_rate_to_idx_2ghz
,
2152 [IEEE80211_BAND_5GHZ
] = wl1271_rate_to_idx_5ghz
2155 static const struct ieee80211_ops wl1271_ops
= {
2156 .start
= wl1271_op_start
,
2157 .stop
= wl1271_op_stop
,
2158 .add_interface
= wl1271_op_add_interface
,
2159 .remove_interface
= wl1271_op_remove_interface
,
2160 .config
= wl1271_op_config
,
2161 .prepare_multicast
= wl1271_op_prepare_multicast
,
2162 .configure_filter
= wl1271_op_configure_filter
,
2164 .set_key
= wl1271_op_set_key
,
2165 .hw_scan
= wl1271_op_hw_scan
,
2166 .bss_info_changed
= wl1271_op_bss_info_changed
,
2167 .set_rts_threshold
= wl1271_op_set_rts_threshold
,
2168 .conf_tx
= wl1271_op_conf_tx
,
2169 .get_tsf
= wl1271_op_get_tsf
,
2170 .get_survey
= wl1271_op_get_survey
,
2171 CFG80211_TESTMODE_CMD(wl1271_tm_cmd
)
2175 u8
wl1271_rate_to_idx(struct wl1271
*wl
, int rate
)
2179 BUG_ON(wl
->band
>= sizeof(wl1271_band_rate_to_idx
)/sizeof(u8
*));
2181 if (unlikely(rate
>= CONF_HW_RXTX_RATE_MAX
)) {
2182 wl1271_error("Illegal RX rate from HW: %d", rate
);
2186 idx
= wl1271_band_rate_to_idx
[wl
->band
][rate
];
2187 if (unlikely(idx
== CONF_HW_RXTX_RATE_UNSUPPORTED
)) {
2188 wl1271_error("Unsupported RX rate from HW: %d", rate
);
2195 static ssize_t
wl1271_sysfs_show_bt_coex_state(struct device
*dev
,
2196 struct device_attribute
*attr
,
2199 struct wl1271
*wl
= dev_get_drvdata(dev
);
2204 mutex_lock(&wl
->mutex
);
2205 len
= snprintf(buf
, len
, "%d\n\n0 - off\n1 - on\n",
2207 mutex_unlock(&wl
->mutex
);
2213 static ssize_t
wl1271_sysfs_store_bt_coex_state(struct device
*dev
,
2214 struct device_attribute
*attr
,
2215 const char *buf
, size_t count
)
2217 struct wl1271
*wl
= dev_get_drvdata(dev
);
2221 ret
= strict_strtoul(buf
, 10, &res
);
2224 wl1271_warning("incorrect value written to bt_coex_mode");
2228 mutex_lock(&wl
->mutex
);
2232 if (res
== wl
->sg_enabled
)
2235 wl
->sg_enabled
= res
;
2237 if (wl
->state
== WL1271_STATE_OFF
)
2240 ret
= wl1271_ps_elp_wakeup(wl
, false);
2244 wl1271_acx_sg_enable(wl
, wl
->sg_enabled
);
2245 wl1271_ps_elp_sleep(wl
);
2248 mutex_unlock(&wl
->mutex
);
2252 static DEVICE_ATTR(bt_coex_state
, S_IRUGO
| S_IWUSR
,
2253 wl1271_sysfs_show_bt_coex_state
,
2254 wl1271_sysfs_store_bt_coex_state
);
2256 static ssize_t
wl1271_sysfs_show_hw_pg_ver(struct device
*dev
,
2257 struct device_attribute
*attr
,
2260 struct wl1271
*wl
= dev_get_drvdata(dev
);
2265 mutex_lock(&wl
->mutex
);
2266 if (wl
->hw_pg_ver
>= 0)
2267 len
= snprintf(buf
, len
, "%d\n", wl
->hw_pg_ver
);
2269 len
= snprintf(buf
, len
, "n/a\n");
2270 mutex_unlock(&wl
->mutex
);
2275 static DEVICE_ATTR(hw_pg_ver
, S_IRUGO
| S_IWUSR
,
2276 wl1271_sysfs_show_hw_pg_ver
, NULL
);
2278 int wl1271_register_hw(struct wl1271
*wl
)
2282 if (wl
->mac80211_registered
)
2285 SET_IEEE80211_PERM_ADDR(wl
->hw
, wl
->mac_addr
);
2287 ret
= ieee80211_register_hw(wl
->hw
);
2289 wl1271_error("unable to register mac80211 hw: %d", ret
);
2293 wl
->mac80211_registered
= true;
2295 wl1271_notice("loaded");
2299 EXPORT_SYMBOL_GPL(wl1271_register_hw
);
2301 void wl1271_unregister_hw(struct wl1271
*wl
)
2303 ieee80211_unregister_hw(wl
->hw
);
2304 wl
->mac80211_registered
= false;
2307 EXPORT_SYMBOL_GPL(wl1271_unregister_hw
);
2309 int wl1271_init_ieee80211(struct wl1271
*wl
)
2311 /* The tx descriptor buffer and the TKIP space. */
2312 wl
->hw
->extra_tx_headroom
= WL1271_TKIP_IV_SPACE
+
2313 sizeof(struct wl1271_tx_hw_descr
);
2316 wl
->hw
->channel_change_time
= 10000;
2317 wl
->hw
->max_listen_interval
= wl
->conf
.conn
.max_listen_interval
;
2319 wl
->hw
->flags
= IEEE80211_HW_SIGNAL_DBM
|
2320 IEEE80211_HW_BEACON_FILTER
|
2321 IEEE80211_HW_SUPPORTS_PS
|
2322 IEEE80211_HW_SUPPORTS_UAPSD
|
2323 IEEE80211_HW_HAS_RATE_CONTROL
|
2324 IEEE80211_HW_CONNECTION_MONITOR
|
2325 IEEE80211_HW_SUPPORTS_CQM_RSSI
;
2327 wl
->hw
->wiphy
->interface_modes
= BIT(NL80211_IFTYPE_STATION
) |
2328 BIT(NL80211_IFTYPE_ADHOC
);
2329 wl
->hw
->wiphy
->max_scan_ssids
= 1;
2330 wl
->hw
->wiphy
->bands
[IEEE80211_BAND_2GHZ
] = &wl1271_band_2ghz
;
2332 if (wl1271_11a_enabled())
2333 wl
->hw
->wiphy
->bands
[IEEE80211_BAND_5GHZ
] = &wl1271_band_5ghz
;
2336 wl
->hw
->max_rates
= 1;
2338 SET_IEEE80211_DEV(wl
->hw
, wl1271_wl_to_dev(wl
));
2342 EXPORT_SYMBOL_GPL(wl1271_init_ieee80211
);
2344 #define WL1271_DEFAULT_CHANNEL 0
2346 struct ieee80211_hw
*wl1271_alloc_hw(void)
2348 struct ieee80211_hw
*hw
;
2349 struct platform_device
*plat_dev
= NULL
;
2353 hw
= ieee80211_alloc_hw(sizeof(*wl
), &wl1271_ops
);
2355 wl1271_error("could not alloc ieee80211_hw");
2360 plat_dev
= kmemdup(&wl1271_device
, sizeof(wl1271_device
), GFP_KERNEL
);
2362 wl1271_error("could not allocate platform_device");
2364 goto err_plat_alloc
;
2368 memset(wl
, 0, sizeof(*wl
));
2370 INIT_LIST_HEAD(&wl
->list
);
2373 wl
->plat_dev
= plat_dev
;
2375 skb_queue_head_init(&wl
->tx_queue
);
2377 INIT_DELAYED_WORK(&wl
->elp_work
, wl1271_elp_work
);
2378 INIT_DELAYED_WORK(&wl
->pspoll_work
, wl1271_pspoll_work
);
2379 wl
->channel
= WL1271_DEFAULT_CHANNEL
;
2380 wl
->beacon_int
= WL1271_DEFAULT_BEACON_INT
;
2381 wl
->default_key
= 0;
2383 wl
->rx_config
= WL1271_DEFAULT_RX_CONFIG
;
2384 wl
->rx_filter
= WL1271_DEFAULT_RX_FILTER
;
2385 wl
->psm_entry_retry
= 0;
2386 wl
->power_level
= WL1271_DEFAULT_POWER_LEVEL
;
2387 wl
->basic_rate_set
= CONF_TX_RATE_MASK_BASIC
;
2388 wl
->basic_rate
= CONF_TX_RATE_MASK_BASIC
;
2389 wl
->rate_set
= CONF_TX_RATE_MASK_BASIC
;
2390 wl
->sta_rate_set
= 0;
2391 wl
->band
= IEEE80211_BAND_2GHZ
;
2394 wl
->sg_enabled
= true;
2397 for (i
= 0; i
< ACX_TX_DESCRIPTORS
; i
++)
2398 wl
->tx_frames
[i
] = NULL
;
2400 spin_lock_init(&wl
->wl_lock
);
2402 wl
->state
= WL1271_STATE_OFF
;
2403 mutex_init(&wl
->mutex
);
2405 /* Apply default driver configuration. */
2406 wl1271_conf_init(wl
);
2408 wl1271_debugfs_init(wl
);
2410 /* Register platform device */
2411 ret
= platform_device_register(wl
->plat_dev
);
2413 wl1271_error("couldn't register platform device");
2416 dev_set_drvdata(&wl
->plat_dev
->dev
, wl
);
2418 /* Create sysfs file to control bt coex state */
2419 ret
= device_create_file(&wl
->plat_dev
->dev
, &dev_attr_bt_coex_state
);
2421 wl1271_error("failed to create sysfs file bt_coex_state");
2425 /* Create sysfs file to get HW PG version */
2426 ret
= device_create_file(&wl
->plat_dev
->dev
, &dev_attr_hw_pg_ver
);
2428 wl1271_error("failed to create sysfs file hw_pg_ver");
2429 goto err_bt_coex_state
;
2435 device_remove_file(&wl
->plat_dev
->dev
, &dev_attr_bt_coex_state
);
2438 platform_device_unregister(wl
->plat_dev
);
2441 wl1271_debugfs_exit(wl
);
2445 ieee80211_free_hw(hw
);
2449 return ERR_PTR(ret
);
2451 EXPORT_SYMBOL_GPL(wl1271_alloc_hw
);
2453 int wl1271_free_hw(struct wl1271
*wl
)
2455 platform_device_unregister(wl
->plat_dev
);
2456 kfree(wl
->plat_dev
);
2458 wl1271_debugfs_exit(wl
);
2465 kfree(wl
->fw_status
);
2466 kfree(wl
->tx_res_if
);
2468 ieee80211_free_hw(wl
->hw
);
2472 EXPORT_SYMBOL_GPL(wl1271_free_hw
);
2474 MODULE_LICENSE("GPL");
2475 MODULE_AUTHOR("Luciano Coelho <luciano.coelho@nokia.com>");
2476 MODULE_AUTHOR("Juuso Oikarinen <juuso.oikarinen@nokia.com>");