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"
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
,
158 .enabled_rates
= CONF_TX_AP_ENABLED_RATES
,
159 .short_retry_limit
= 10,
160 .long_retry_limit
= 10,
164 .enabled_rates
= CONF_TX_AP_ENABLED_RATES
,
165 .short_retry_limit
= 10,
166 .long_retry_limit
= 10,
170 .enabled_rates
= CONF_TX_AP_ENABLED_RATES
,
171 .short_retry_limit
= 10,
172 .long_retry_limit
= 10,
176 .enabled_rates
= CONF_TX_AP_ENABLED_RATES
,
177 .short_retry_limit
= 10,
178 .long_retry_limit
= 10,
183 .enabled_rates
= CONF_TX_AP_DEFAULT_MGMT_RATES
,
184 .short_retry_limit
= 10,
185 .long_retry_limit
= 10,
189 .enabled_rates
= CONF_HW_BIT_RATE_1MBPS
,
190 .short_retry_limit
= 10,
191 .long_retry_limit
= 10,
194 .ap_max_tx_retries
= 100,
198 .queue_id
= CONF_TX_AC_BE
,
199 .channel_type
= CONF_CHANNEL_TYPE_EDCF
,
200 .tsid
= CONF_TX_AC_BE
,
201 .ps_scheme
= CONF_PS_SCHEME_LEGACY
,
202 .ack_policy
= CONF_ACK_POLICY_LEGACY
,
206 .queue_id
= CONF_TX_AC_BK
,
207 .channel_type
= CONF_CHANNEL_TYPE_EDCF
,
208 .tsid
= CONF_TX_AC_BK
,
209 .ps_scheme
= CONF_PS_SCHEME_LEGACY
,
210 .ack_policy
= CONF_ACK_POLICY_LEGACY
,
214 .queue_id
= CONF_TX_AC_VI
,
215 .channel_type
= CONF_CHANNEL_TYPE_EDCF
,
216 .tsid
= CONF_TX_AC_VI
,
217 .ps_scheme
= CONF_PS_SCHEME_LEGACY
,
218 .ack_policy
= CONF_ACK_POLICY_LEGACY
,
222 .queue_id
= CONF_TX_AC_VO
,
223 .channel_type
= CONF_CHANNEL_TYPE_EDCF
,
224 .tsid
= CONF_TX_AC_VO
,
225 .ps_scheme
= CONF_PS_SCHEME_LEGACY
,
226 .ack_policy
= CONF_ACK_POLICY_LEGACY
,
230 .frag_threshold
= IEEE80211_MAX_FRAG_THRESHOLD
,
231 .tx_compl_timeout
= 700,
232 .tx_compl_threshold
= 4,
233 .basic_rate
= CONF_HW_BIT_RATE_1MBPS
,
234 .basic_rate_5
= CONF_HW_BIT_RATE_6MBPS
,
235 .tmpl_short_retry_limit
= 10,
236 .tmpl_long_retry_limit
= 10,
239 .wake_up_event
= CONF_WAKE_UP_EVENT_DTIM
,
240 .listen_interval
= 1,
241 .bcn_filt_mode
= CONF_BCN_FILT_MODE_ENABLED
,
242 .bcn_filt_ie_count
= 1,
245 .ie
= WLAN_EID_CHANNEL_SWITCH
,
246 .rule
= CONF_BCN_RULE_PASS_ON_APPEARANCE
,
249 .synch_fail_thold
= 10,
250 .bss_lose_timeout
= 100,
251 .beacon_rx_timeout
= 10000,
252 .broadcast_timeout
= 20000,
253 .rx_broadcast_in_ps
= 1,
254 .ps_poll_threshold
= 10,
255 .ps_poll_recovery_period
= 700,
256 .bet_enable
= CONF_BET_MODE_ENABLE
,
257 .bet_max_consecutive
= 10,
258 .psm_entry_retries
= 5,
259 .psm_entry_nullfunc_retries
= 3,
260 .psm_entry_hangover_period
= 1,
261 .keep_alive_interval
= 55000,
262 .max_listen_interval
= 20,
269 .host_clk_settling_time
= 5000,
270 .host_fast_wakeup_support
= false
274 .avg_weight_rssi_beacon
= 20,
275 .avg_weight_rssi_data
= 10,
276 .avg_weight_snr_beacon
= 20,
277 .avg_weight_snr_data
= 10
280 .min_dwell_time_active
= 7500,
281 .max_dwell_time_active
= 30000,
282 .min_dwell_time_passive
= 30000,
283 .max_dwell_time_passive
= 60000,
287 .tx_per_channel_power_compensation_2
= {
288 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
290 .tx_per_channel_power_compensation_5
= {
291 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
292 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
293 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
298 static void __wl1271_op_remove_interface(struct wl1271
*wl
);
301 static void wl1271_device_release(struct device
*dev
)
306 static struct platform_device wl1271_device
= {
310 /* device model insists to have a release function */
312 .release
= wl1271_device_release
,
316 static LIST_HEAD(wl_list
);
318 static int wl1271_dev_notify(struct notifier_block
*me
, unsigned long what
,
321 struct net_device
*dev
= arg
;
322 struct wireless_dev
*wdev
;
324 struct ieee80211_hw
*hw
;
326 struct wl1271
*wl_temp
;
329 /* Check that this notification is for us. */
330 if (what
!= NETDEV_CHANGE
)
333 wdev
= dev
->ieee80211_ptr
;
341 hw
= wiphy_priv(wiphy
);
346 list_for_each_entry(wl
, &wl_list
, list
) {
353 mutex_lock(&wl
->mutex
);
355 if (wl
->state
== WL1271_STATE_OFF
)
358 if (!test_bit(WL1271_FLAG_STA_ASSOCIATED
, &wl
->flags
))
361 ret
= wl1271_ps_elp_wakeup(wl
, false);
365 if ((dev
->operstate
== IF_OPER_UP
) &&
366 !test_and_set_bit(WL1271_FLAG_STA_STATE_SENT
, &wl
->flags
)) {
367 wl1271_cmd_set_sta_state(wl
);
368 wl1271_info("Association completed.");
371 wl1271_ps_elp_sleep(wl
);
374 mutex_unlock(&wl
->mutex
);
379 static int wl1271_reg_notify(struct wiphy
*wiphy
,
380 struct regulatory_request
*request
)
382 struct ieee80211_supported_band
*band
;
383 struct ieee80211_channel
*ch
;
386 band
= wiphy
->bands
[IEEE80211_BAND_5GHZ
];
387 for (i
= 0; i
< band
->n_channels
; i
++) {
388 ch
= &band
->channels
[i
];
389 if (ch
->flags
& IEEE80211_CHAN_DISABLED
)
392 if (ch
->flags
& IEEE80211_CHAN_RADAR
)
393 ch
->flags
|= IEEE80211_CHAN_NO_IBSS
|
394 IEEE80211_CHAN_PASSIVE_SCAN
;
401 static void wl1271_conf_init(struct wl1271
*wl
)
405 * This function applies the default configuration to the driver. This
406 * function is invoked upon driver load (spi probe.)
408 * The configuration is stored in a run-time structure in order to
409 * facilitate for run-time adjustment of any of the parameters. Making
410 * changes to the configuration structure will apply the new values on
411 * the next interface up (wl1271_op_start.)
414 /* apply driver default configuration */
415 memcpy(&wl
->conf
, &default_conf
, sizeof(default_conf
));
419 static int wl1271_plt_init(struct wl1271
*wl
)
421 struct conf_tx_ac_category
*conf_ac
;
422 struct conf_tx_tid
*conf_tid
;
425 ret
= wl1271_cmd_general_parms(wl
);
429 ret
= wl1271_cmd_radio_parms(wl
);
433 ret
= wl1271_cmd_ext_radio_parms(wl
);
437 ret
= wl1271_sta_init_templates_config(wl
);
441 ret
= wl1271_acx_init_mem_config(wl
);
445 /* PHY layer config */
446 ret
= wl1271_init_phy_config(wl
);
448 goto out_free_memmap
;
450 ret
= wl1271_acx_dco_itrim_params(wl
);
452 goto out_free_memmap
;
454 /* Initialize connection monitoring thresholds */
455 ret
= wl1271_acx_conn_monit_params(wl
, false);
457 goto out_free_memmap
;
459 /* Bluetooth WLAN coexistence */
460 ret
= wl1271_init_pta(wl
);
462 goto out_free_memmap
;
464 /* Energy detection */
465 ret
= wl1271_init_energy_detection(wl
);
467 goto out_free_memmap
;
469 /* Default fragmentation threshold */
470 ret
= wl1271_acx_frag_threshold(wl
, wl
->conf
.tx
.frag_threshold
);
472 goto out_free_memmap
;
474 /* Default TID/AC configuration */
475 BUG_ON(wl
->conf
.tx
.tid_conf_count
!= wl
->conf
.tx
.ac_conf_count
);
476 for (i
= 0; i
< wl
->conf
.tx
.tid_conf_count
; i
++) {
477 conf_ac
= &wl
->conf
.tx
.ac_conf
[i
];
478 ret
= wl1271_acx_ac_cfg(wl
, conf_ac
->ac
, conf_ac
->cw_min
,
479 conf_ac
->cw_max
, conf_ac
->aifsn
,
480 conf_ac
->tx_op_limit
);
482 goto out_free_memmap
;
484 conf_tid
= &wl
->conf
.tx
.tid_conf
[i
];
485 ret
= wl1271_acx_tid_cfg(wl
, conf_tid
->queue_id
,
486 conf_tid
->channel_type
,
489 conf_tid
->ack_policy
,
490 conf_tid
->apsd_conf
[0],
491 conf_tid
->apsd_conf
[1]);
493 goto out_free_memmap
;
496 /* Enable data path */
497 ret
= wl1271_cmd_data_path(wl
, 1);
499 goto out_free_memmap
;
501 /* Configure for CAM power saving (ie. always active) */
502 ret
= wl1271_acx_sleep_auth(wl
, WL1271_PSM_CAM
);
504 goto out_free_memmap
;
507 ret
= wl1271_acx_pm_config(wl
);
509 goto out_free_memmap
;
514 kfree(wl
->target_mem_map
);
515 wl
->target_mem_map
= NULL
;
520 static void wl1271_fw_status(struct wl1271
*wl
,
521 struct wl1271_fw_status
*status
)
527 wl1271_raw_read(wl
, FW_STATUS_ADDR
, status
, sizeof(*status
), false);
529 wl1271_debug(DEBUG_IRQ
, "intr: 0x%x (fw_rx_counter = %d, "
530 "drv_rx_counter = %d, tx_results_counter = %d)",
532 status
->fw_rx_counter
,
533 status
->drv_rx_counter
,
534 status
->tx_results_counter
);
536 /* update number of available TX blocks */
537 for (i
= 0; i
< NUM_TX_QUEUES
; i
++) {
538 u32 cnt
= le32_to_cpu(status
->tx_released_blks
[i
]) -
539 wl
->tx_blocks_freed
[i
];
541 wl
->tx_blocks_freed
[i
] =
542 le32_to_cpu(status
->tx_released_blks
[i
]);
543 wl
->tx_blocks_available
+= cnt
;
547 /* if more blocks are available now, tx work can be scheduled */
549 clear_bit(WL1271_FLAG_FW_TX_BUSY
, &wl
->flags
);
551 /* update the host-chipset time offset */
553 wl
->time_offset
= (timespec_to_ns(&ts
) >> 10) -
554 (s64
)le32_to_cpu(status
->fw_localtime
);
557 #define WL1271_IRQ_MAX_LOOPS 10
559 static void wl1271_irq_work(struct work_struct
*work
)
563 int loopcount
= WL1271_IRQ_MAX_LOOPS
;
566 container_of(work
, struct wl1271
, irq_work
);
568 mutex_lock(&wl
->mutex
);
570 wl1271_debug(DEBUG_IRQ
, "IRQ work");
572 if (unlikely(wl
->state
== WL1271_STATE_OFF
))
575 ret
= wl1271_ps_elp_wakeup(wl
, true);
579 spin_lock_irqsave(&wl
->wl_lock
, flags
);
580 while (test_bit(WL1271_FLAG_IRQ_PENDING
, &wl
->flags
) && loopcount
) {
581 clear_bit(WL1271_FLAG_IRQ_PENDING
, &wl
->flags
);
582 spin_unlock_irqrestore(&wl
->wl_lock
, flags
);
585 wl1271_fw_status(wl
, wl
->fw_status
);
586 intr
= le32_to_cpu(wl
->fw_status
->intr
);
588 wl1271_debug(DEBUG_IRQ
, "Zero interrupt received.");
589 spin_lock_irqsave(&wl
->wl_lock
, flags
);
593 intr
&= WL1271_INTR_MASK
;
595 if (unlikely(intr
& WL1271_ACX_INTR_WATCHDOG
)) {
596 wl1271_error("watchdog interrupt received! "
597 "starting recovery.");
598 ieee80211_queue_work(wl
->hw
, &wl
->recovery_work
);
600 /* restarting the chip. ignore any other interrupt. */
604 if (intr
& WL1271_ACX_INTR_DATA
) {
605 wl1271_debug(DEBUG_IRQ
, "WL1271_ACX_INTR_DATA");
607 /* check for tx results */
608 if (wl
->fw_status
->tx_results_counter
!=
609 (wl
->tx_results_count
& 0xff))
610 wl1271_tx_complete(wl
);
612 /* Check if any tx blocks were freed */
613 if (!test_bit(WL1271_FLAG_FW_TX_BUSY
, &wl
->flags
) &&
614 wl
->tx_queue_count
) {
616 * In order to avoid starvation of the TX path,
617 * call the work function directly.
619 wl1271_tx_work_locked(wl
);
622 wl1271_rx(wl
, wl
->fw_status
);
625 if (intr
& WL1271_ACX_INTR_EVENT_A
) {
626 wl1271_debug(DEBUG_IRQ
, "WL1271_ACX_INTR_EVENT_A");
627 wl1271_event_handle(wl
, 0);
630 if (intr
& WL1271_ACX_INTR_EVENT_B
) {
631 wl1271_debug(DEBUG_IRQ
, "WL1271_ACX_INTR_EVENT_B");
632 wl1271_event_handle(wl
, 1);
635 if (intr
& WL1271_ACX_INTR_INIT_COMPLETE
)
636 wl1271_debug(DEBUG_IRQ
,
637 "WL1271_ACX_INTR_INIT_COMPLETE");
639 if (intr
& WL1271_ACX_INTR_HW_AVAILABLE
)
640 wl1271_debug(DEBUG_IRQ
, "WL1271_ACX_INTR_HW_AVAILABLE");
642 spin_lock_irqsave(&wl
->wl_lock
, flags
);
645 if (test_bit(WL1271_FLAG_IRQ_PENDING
, &wl
->flags
))
646 ieee80211_queue_work(wl
->hw
, &wl
->irq_work
);
648 clear_bit(WL1271_FLAG_IRQ_RUNNING
, &wl
->flags
);
649 spin_unlock_irqrestore(&wl
->wl_lock
, flags
);
651 wl1271_ps_elp_sleep(wl
);
654 mutex_unlock(&wl
->mutex
);
657 static int wl1271_fetch_firmware(struct wl1271
*wl
)
659 const struct firmware
*fw
;
662 ret
= request_firmware(&fw
, WL1271_FW_NAME
, wl1271_wl_to_dev(wl
));
665 wl1271_error("could not get firmware: %d", ret
);
670 wl1271_error("firmware size is not multiple of 32 bits: %zu",
676 wl
->fw_len
= fw
->size
;
677 wl
->fw
= vmalloc(wl
->fw_len
);
680 wl1271_error("could not allocate memory for the firmware");
685 memcpy(wl
->fw
, fw
->data
, wl
->fw_len
);
690 release_firmware(fw
);
695 static int wl1271_fetch_nvs(struct wl1271
*wl
)
697 const struct firmware
*fw
;
700 ret
= request_firmware(&fw
, WL1271_NVS_NAME
, wl1271_wl_to_dev(wl
));
703 wl1271_error("could not get nvs file: %d", ret
);
707 wl
->nvs
= kmemdup(fw
->data
, sizeof(struct wl1271_nvs_file
), GFP_KERNEL
);
710 wl1271_error("could not allocate memory for the nvs file");
715 wl
->nvs_len
= fw
->size
;
718 release_firmware(fw
);
723 static void wl1271_recovery_work(struct work_struct
*work
)
726 container_of(work
, struct wl1271
, recovery_work
);
728 mutex_lock(&wl
->mutex
);
730 if (wl
->state
!= WL1271_STATE_ON
)
733 wl1271_info("Hardware recovery in progress.");
735 if (test_bit(WL1271_FLAG_STA_ASSOCIATED
, &wl
->flags
))
736 ieee80211_connection_loss(wl
->vif
);
738 /* reboot the chipset */
739 __wl1271_op_remove_interface(wl
);
740 ieee80211_restart_hw(wl
->hw
);
743 mutex_unlock(&wl
->mutex
);
746 static void wl1271_fw_wakeup(struct wl1271
*wl
)
750 elp_reg
= ELPCTRL_WAKE_UP
;
751 wl1271_raw_write32(wl
, HW_ACCESS_ELP_CTRL_REG_ADDR
, elp_reg
);
754 static int wl1271_setup(struct wl1271
*wl
)
756 wl
->fw_status
= kmalloc(sizeof(*wl
->fw_status
), GFP_KERNEL
);
760 wl
->tx_res_if
= kmalloc(sizeof(*wl
->tx_res_if
), GFP_KERNEL
);
761 if (!wl
->tx_res_if
) {
762 kfree(wl
->fw_status
);
769 static int wl1271_chip_wakeup(struct wl1271
*wl
)
771 struct wl1271_partition_set partition
;
774 msleep(WL1271_PRE_POWER_ON_SLEEP
);
775 ret
= wl1271_power_on(wl
);
778 msleep(WL1271_POWER_ON_SLEEP
);
782 /* We don't need a real memory partition here, because we only want
783 * to use the registers at this point. */
784 memset(&partition
, 0, sizeof(partition
));
785 partition
.reg
.start
= REGISTERS_BASE
;
786 partition
.reg
.size
= REGISTERS_DOWN_SIZE
;
787 wl1271_set_partition(wl
, &partition
);
789 /* ELP module wake up */
790 wl1271_fw_wakeup(wl
);
792 /* whal_FwCtrl_BootSm() */
794 /* 0. read chip id from CHIP_ID */
795 wl
->chip
.id
= wl1271_read32(wl
, CHIP_ID_B
);
797 /* 1. check if chip id is valid */
799 switch (wl
->chip
.id
) {
800 case CHIP_ID_1271_PG10
:
801 wl1271_warning("chip id 0x%x (1271 PG10) support is obsolete",
804 ret
= wl1271_setup(wl
);
808 case CHIP_ID_1271_PG20
:
809 wl1271_debug(DEBUG_BOOT
, "chip id 0x%x (1271 PG20)",
812 ret
= wl1271_setup(wl
);
817 wl1271_warning("unsupported chip id: 0x%x", wl
->chip
.id
);
822 if (wl
->fw
== NULL
) {
823 ret
= wl1271_fetch_firmware(wl
);
828 /* No NVS from netlink, try to get it from the filesystem */
829 if (wl
->nvs
== NULL
) {
830 ret
= wl1271_fetch_nvs(wl
);
839 int wl1271_plt_start(struct wl1271
*wl
)
841 int retries
= WL1271_BOOT_RETRIES
;
844 mutex_lock(&wl
->mutex
);
846 wl1271_notice("power up");
848 if (wl
->state
!= WL1271_STATE_OFF
) {
849 wl1271_error("cannot go into PLT state because not "
850 "in off state: %d", wl
->state
);
857 ret
= wl1271_chip_wakeup(wl
);
861 ret
= wl1271_boot(wl
);
865 ret
= wl1271_plt_init(wl
);
869 wl
->state
= WL1271_STATE_PLT
;
870 wl1271_notice("firmware booted in PLT mode (%s)",
875 wl1271_disable_interrupts(wl
);
876 mutex_unlock(&wl
->mutex
);
877 /* Unlocking the mutex in the middle of handling is
878 inherently unsafe. In this case we deem it safe to do,
879 because we need to let any possibly pending IRQ out of
880 the system (and while we are WL1271_STATE_OFF the IRQ
881 work function will not do anything.) Also, any other
882 possible concurrent operations will fail due to the
883 current state, hence the wl1271 struct should be safe. */
884 cancel_work_sync(&wl
->irq_work
);
885 mutex_lock(&wl
->mutex
);
887 wl1271_power_off(wl
);
890 wl1271_error("firmware boot in PLT mode failed despite %d retries",
891 WL1271_BOOT_RETRIES
);
893 mutex_unlock(&wl
->mutex
);
898 int wl1271_plt_stop(struct wl1271
*wl
)
902 mutex_lock(&wl
->mutex
);
904 wl1271_notice("power down");
906 if (wl
->state
!= WL1271_STATE_PLT
) {
907 wl1271_error("cannot power down because not in PLT "
908 "state: %d", wl
->state
);
913 wl1271_disable_interrupts(wl
);
914 wl1271_power_off(wl
);
916 wl
->state
= WL1271_STATE_OFF
;
920 mutex_unlock(&wl
->mutex
);
922 cancel_work_sync(&wl
->irq_work
);
923 cancel_work_sync(&wl
->recovery_work
);
928 static int wl1271_op_tx(struct ieee80211_hw
*hw
, struct sk_buff
*skb
)
930 struct wl1271
*wl
= hw
->priv
;
931 struct ieee80211_conf
*conf
= &hw
->conf
;
932 struct ieee80211_tx_info
*txinfo
= IEEE80211_SKB_CB(skb
);
933 struct ieee80211_sta
*sta
= txinfo
->control
.sta
;
938 * peek into the rates configured in the STA entry.
939 * The rates set after connection stage, The first block only BG sets:
940 * the compare is for bit 0-16 of sta_rate_set. The second block add
941 * HT rates in case of HT supported.
943 spin_lock_irqsave(&wl
->wl_lock
, flags
);
945 (sta
->supp_rates
[conf
->channel
->band
] !=
946 (wl
->sta_rate_set
& HW_BG_RATES_MASK
))) {
947 wl
->sta_rate_set
= sta
->supp_rates
[conf
->channel
->band
];
948 set_bit(WL1271_FLAG_STA_RATES_CHANGED
, &wl
->flags
);
951 #ifdef CONFIG_WL12XX_HT
953 sta
->ht_cap
.ht_supported
&&
954 ((wl
->sta_rate_set
>> HW_HT_RATES_OFFSET
) !=
955 sta
->ht_cap
.mcs
.rx_mask
[0])) {
956 /* Clean MCS bits before setting them */
957 wl
->sta_rate_set
&= HW_BG_RATES_MASK
;
959 (sta
->ht_cap
.mcs
.rx_mask
[0] << HW_HT_RATES_OFFSET
);
960 set_bit(WL1271_FLAG_STA_RATES_CHANGED
, &wl
->flags
);
963 wl
->tx_queue_count
++;
964 spin_unlock_irqrestore(&wl
->wl_lock
, flags
);
966 /* queue the packet */
967 q
= wl1271_tx_get_queue(skb_get_queue_mapping(skb
));
968 skb_queue_tail(&wl
->tx_queue
[q
], skb
);
971 * The chip specific setup must run before the first TX packet -
972 * before that, the tx_work will not be initialized!
975 if (!test_bit(WL1271_FLAG_FW_TX_BUSY
, &wl
->flags
))
976 ieee80211_queue_work(wl
->hw
, &wl
->tx_work
);
979 * The workqueue is slow to process the tx_queue and we need stop
980 * the queue here, otherwise the queue will get too long.
982 if (wl
->tx_queue_count
>= WL1271_TX_QUEUE_HIGH_WATERMARK
) {
983 wl1271_debug(DEBUG_TX
, "op_tx: stopping queues");
985 spin_lock_irqsave(&wl
->wl_lock
, flags
);
986 ieee80211_stop_queues(wl
->hw
);
987 set_bit(WL1271_FLAG_TX_QUEUE_STOPPED
, &wl
->flags
);
988 spin_unlock_irqrestore(&wl
->wl_lock
, flags
);
994 static struct notifier_block wl1271_dev_notifier
= {
995 .notifier_call
= wl1271_dev_notify
,
998 static int wl1271_op_start(struct ieee80211_hw
*hw
)
1000 wl1271_debug(DEBUG_MAC80211
, "mac80211 start");
1003 * We have to delay the booting of the hardware because
1004 * we need to know the local MAC address before downloading and
1005 * initializing the firmware. The MAC address cannot be changed
1006 * after boot, and without the proper MAC address, the firmware
1007 * will not function properly.
1009 * The MAC address is first known when the corresponding interface
1010 * is added. That is where we will initialize the hardware.
1016 static void wl1271_op_stop(struct ieee80211_hw
*hw
)
1018 wl1271_debug(DEBUG_MAC80211
, "mac80211 stop");
1021 static int wl1271_op_add_interface(struct ieee80211_hw
*hw
,
1022 struct ieee80211_vif
*vif
)
1024 struct wl1271
*wl
= hw
->priv
;
1025 struct wiphy
*wiphy
= hw
->wiphy
;
1026 int retries
= WL1271_BOOT_RETRIES
;
1028 bool booted
= false;
1030 wl1271_debug(DEBUG_MAC80211
, "mac80211 add interface type %d mac %pM",
1031 vif
->type
, vif
->addr
);
1033 mutex_lock(&wl
->mutex
);
1035 wl1271_debug(DEBUG_MAC80211
,
1036 "multiple vifs are not supported yet");
1041 switch (vif
->type
) {
1042 case NL80211_IFTYPE_STATION
:
1043 wl
->bss_type
= BSS_TYPE_STA_BSS
;
1044 wl
->set_bss_type
= BSS_TYPE_STA_BSS
;
1046 case NL80211_IFTYPE_ADHOC
:
1047 wl
->bss_type
= BSS_TYPE_IBSS
;
1048 wl
->set_bss_type
= BSS_TYPE_STA_BSS
;
1055 memcpy(wl
->mac_addr
, vif
->addr
, ETH_ALEN
);
1057 if (wl
->state
!= WL1271_STATE_OFF
) {
1058 wl1271_error("cannot start because not in off state: %d",
1066 ret
= wl1271_chip_wakeup(wl
);
1070 ret
= wl1271_boot(wl
);
1074 ret
= wl1271_hw_init(wl
);
1082 wl1271_disable_interrupts(wl
);
1083 mutex_unlock(&wl
->mutex
);
1084 /* Unlocking the mutex in the middle of handling is
1085 inherently unsafe. In this case we deem it safe to do,
1086 because we need to let any possibly pending IRQ out of
1087 the system (and while we are WL1271_STATE_OFF the IRQ
1088 work function will not do anything.) Also, any other
1089 possible concurrent operations will fail due to the
1090 current state, hence the wl1271 struct should be safe. */
1091 cancel_work_sync(&wl
->irq_work
);
1092 mutex_lock(&wl
->mutex
);
1094 wl1271_power_off(wl
);
1098 wl1271_error("firmware boot failed despite %d retries",
1099 WL1271_BOOT_RETRIES
);
1104 wl
->state
= WL1271_STATE_ON
;
1105 wl1271_info("firmware booted (%s)", wl
->chip
.fw_ver
);
1107 /* update hw/fw version info in wiphy struct */
1108 wiphy
->hw_version
= wl
->chip
.id
;
1109 strncpy(wiphy
->fw_version
, wl
->chip
.fw_ver
,
1110 sizeof(wiphy
->fw_version
));
1113 * Now we know if 11a is supported (info from the NVS), so disable
1114 * 11a channels if not supported
1116 if (!wl
->enable_11a
)
1117 wiphy
->bands
[IEEE80211_BAND_5GHZ
]->n_channels
= 0;
1119 wl1271_debug(DEBUG_MAC80211
, "11a is %ssupported",
1120 wl
->enable_11a
? "" : "not ");
1123 mutex_unlock(&wl
->mutex
);
1126 list_add(&wl
->list
, &wl_list
);
1131 static void __wl1271_op_remove_interface(struct wl1271
*wl
)
1135 wl1271_debug(DEBUG_MAC80211
, "mac80211 remove interface");
1137 wl1271_info("down");
1139 list_del(&wl
->list
);
1141 WARN_ON(wl
->state
!= WL1271_STATE_ON
);
1143 /* enable dyn ps just in case (if left on due to fw crash etc) */
1144 if (wl
->bss_type
== BSS_TYPE_STA_BSS
)
1145 ieee80211_enable_dyn_ps(wl
->vif
);
1147 if (wl
->scan
.state
!= WL1271_SCAN_STATE_IDLE
) {
1148 wl
->scan
.state
= WL1271_SCAN_STATE_IDLE
;
1149 kfree(wl
->scan
.scanned_ch
);
1150 wl
->scan
.scanned_ch
= NULL
;
1151 wl
->scan
.req
= NULL
;
1152 ieee80211_scan_completed(wl
->hw
, true);
1155 wl
->state
= WL1271_STATE_OFF
;
1157 wl1271_disable_interrupts(wl
);
1159 mutex_unlock(&wl
->mutex
);
1161 cancel_delayed_work_sync(&wl
->scan_complete_work
);
1162 cancel_work_sync(&wl
->irq_work
);
1163 cancel_work_sync(&wl
->tx_work
);
1164 cancel_delayed_work_sync(&wl
->pspoll_work
);
1165 cancel_delayed_work_sync(&wl
->elp_work
);
1167 mutex_lock(&wl
->mutex
);
1169 /* let's notify MAC80211 about the remaining pending TX frames */
1170 wl1271_tx_reset(wl
);
1171 wl1271_power_off(wl
);
1173 memset(wl
->bssid
, 0, ETH_ALEN
);
1174 memset(wl
->ssid
, 0, IW_ESSID_MAX_SIZE
+ 1);
1176 wl
->bss_type
= MAX_BSS_TYPE
;
1177 wl
->set_bss_type
= MAX_BSS_TYPE
;
1178 wl
->band
= IEEE80211_BAND_2GHZ
;
1181 wl
->psm_entry_retry
= 0;
1182 wl
->power_level
= WL1271_DEFAULT_POWER_LEVEL
;
1183 wl
->tx_blocks_available
= 0;
1184 wl
->tx_results_count
= 0;
1185 wl
->tx_packets_count
= 0;
1186 wl
->tx_security_last_seq
= 0;
1187 wl
->tx_security_seq
= 0;
1188 wl
->time_offset
= 0;
1189 wl
->session_counter
= 0;
1190 wl
->rate_set
= CONF_TX_RATE_MASK_BASIC
;
1191 wl
->sta_rate_set
= 0;
1196 for (i
= 0; i
< NUM_TX_QUEUES
; i
++)
1197 wl
->tx_blocks_freed
[i
] = 0;
1199 wl1271_debugfs_reset(wl
);
1201 kfree(wl
->fw_status
);
1202 wl
->fw_status
= NULL
;
1203 kfree(wl
->tx_res_if
);
1204 wl
->tx_res_if
= NULL
;
1205 kfree(wl
->target_mem_map
);
1206 wl
->target_mem_map
= NULL
;
1209 static void wl1271_op_remove_interface(struct ieee80211_hw
*hw
,
1210 struct ieee80211_vif
*vif
)
1212 struct wl1271
*wl
= hw
->priv
;
1214 mutex_lock(&wl
->mutex
);
1216 * wl->vif can be null here if someone shuts down the interface
1217 * just when hardware recovery has been started.
1220 WARN_ON(wl
->vif
!= vif
);
1221 __wl1271_op_remove_interface(wl
);
1224 mutex_unlock(&wl
->mutex
);
1225 cancel_work_sync(&wl
->recovery_work
);
1228 static void wl1271_configure_filters(struct wl1271
*wl
, unsigned int filters
)
1230 wl1271_set_default_filters(wl
);
1232 /* combine requested filters with current filter config */
1233 filters
= wl
->filters
| filters
;
1235 wl1271_debug(DEBUG_FILTERS
, "RX filters set: ");
1237 if (filters
& FIF_PROMISC_IN_BSS
) {
1238 wl1271_debug(DEBUG_FILTERS
, " - FIF_PROMISC_IN_BSS");
1239 wl
->rx_config
&= ~CFG_UNI_FILTER_EN
;
1240 wl
->rx_config
|= CFG_BSSID_FILTER_EN
;
1242 if (filters
& FIF_BCN_PRBRESP_PROMISC
) {
1243 wl1271_debug(DEBUG_FILTERS
, " - FIF_BCN_PRBRESP_PROMISC");
1244 wl
->rx_config
&= ~CFG_BSSID_FILTER_EN
;
1245 wl
->rx_config
&= ~CFG_SSID_FILTER_EN
;
1247 if (filters
& FIF_OTHER_BSS
) {
1248 wl1271_debug(DEBUG_FILTERS
, " - FIF_OTHER_BSS");
1249 wl
->rx_config
&= ~CFG_BSSID_FILTER_EN
;
1251 if (filters
& FIF_CONTROL
) {
1252 wl1271_debug(DEBUG_FILTERS
, " - FIF_CONTROL");
1253 wl
->rx_filter
|= CFG_RX_CTL_EN
;
1255 if (filters
& FIF_FCSFAIL
) {
1256 wl1271_debug(DEBUG_FILTERS
, " - FIF_FCSFAIL");
1257 wl
->rx_filter
|= CFG_RX_FCS_ERROR
;
1261 static int wl1271_dummy_join(struct wl1271
*wl
)
1264 /* we need to use a dummy BSSID for now */
1265 static const u8 dummy_bssid
[ETH_ALEN
] = { 0x0b, 0xad, 0xde,
1268 memcpy(wl
->bssid
, dummy_bssid
, ETH_ALEN
);
1270 /* pass through frames from all BSS */
1271 wl1271_configure_filters(wl
, FIF_OTHER_BSS
);
1273 ret
= wl1271_cmd_join(wl
, wl
->set_bss_type
);
1277 set_bit(WL1271_FLAG_JOINED
, &wl
->flags
);
1283 static int wl1271_join(struct wl1271
*wl
, bool set_assoc
)
1288 * One of the side effects of the JOIN command is that is clears
1289 * WPA/WPA2 keys from the chipset. Performing a JOIN while associated
1290 * to a WPA/WPA2 access point will therefore kill the data-path.
1291 * Currently there is no supported scenario for JOIN during
1292 * association - if it becomes a supported scenario, the WPA/WPA2 keys
1293 * must be handled somehow.
1296 if (test_bit(WL1271_FLAG_STA_ASSOCIATED
, &wl
->flags
))
1297 wl1271_info("JOIN while associated.");
1300 set_bit(WL1271_FLAG_STA_ASSOCIATED
, &wl
->flags
);
1302 ret
= wl1271_cmd_join(wl
, wl
->set_bss_type
);
1306 set_bit(WL1271_FLAG_JOINED
, &wl
->flags
);
1308 if (!test_bit(WL1271_FLAG_STA_ASSOCIATED
, &wl
->flags
))
1312 * The join command disable the keep-alive mode, shut down its process,
1313 * and also clear the template config, so we need to reset it all after
1314 * the join. The acx_aid starts the keep-alive process, and the order
1315 * of the commands below is relevant.
1317 ret
= wl1271_acx_keep_alive_mode(wl
, true);
1321 ret
= wl1271_acx_aid(wl
, wl
->aid
);
1325 ret
= wl1271_cmd_build_klv_null_data(wl
);
1329 ret
= wl1271_acx_keep_alive_config(wl
, CMD_TEMPL_KLV_IDX_NULL_DATA
,
1330 ACX_KEEP_ALIVE_TPL_VALID
);
1338 static int wl1271_unjoin(struct wl1271
*wl
)
1342 /* to stop listening to a channel, we disconnect */
1343 ret
= wl1271_cmd_disconnect(wl
);
1347 clear_bit(WL1271_FLAG_JOINED
, &wl
->flags
);
1348 memset(wl
->bssid
, 0, ETH_ALEN
);
1350 /* stop filterting packets based on bssid */
1351 wl1271_configure_filters(wl
, FIF_OTHER_BSS
);
1357 static void wl1271_set_band_rate(struct wl1271
*wl
)
1359 if (wl
->band
== IEEE80211_BAND_2GHZ
)
1360 wl
->basic_rate_set
= wl
->conf
.tx
.basic_rate
;
1362 wl
->basic_rate_set
= wl
->conf
.tx
.basic_rate_5
;
1365 static int wl1271_sta_handle_idle(struct wl1271
*wl
, bool idle
)
1370 if (test_bit(WL1271_FLAG_JOINED
, &wl
->flags
)) {
1371 ret
= wl1271_unjoin(wl
);
1375 wl
->rate_set
= wl1271_tx_min_rate_get(wl
);
1376 wl
->sta_rate_set
= 0;
1377 ret
= wl1271_acx_sta_rate_policies(wl
);
1380 ret
= wl1271_acx_keep_alive_config(
1381 wl
, CMD_TEMPL_KLV_IDX_NULL_DATA
,
1382 ACX_KEEP_ALIVE_TPL_INVALID
);
1385 set_bit(WL1271_FLAG_IDLE
, &wl
->flags
);
1387 /* increment the session counter */
1388 wl
->session_counter
++;
1389 if (wl
->session_counter
>= SESSION_COUNTER_MAX
)
1390 wl
->session_counter
= 0;
1391 ret
= wl1271_dummy_join(wl
);
1394 clear_bit(WL1271_FLAG_IDLE
, &wl
->flags
);
1401 static int wl1271_op_config(struct ieee80211_hw
*hw
, u32 changed
)
1403 struct wl1271
*wl
= hw
->priv
;
1404 struct ieee80211_conf
*conf
= &hw
->conf
;
1405 int channel
, ret
= 0;
1408 channel
= ieee80211_frequency_to_channel(conf
->channel
->center_freq
);
1410 wl1271_debug(DEBUG_MAC80211
, "mac80211 config ch %d psm %s power %d %s"
1413 conf
->flags
& IEEE80211_CONF_PS
? "on" : "off",
1415 conf
->flags
& IEEE80211_CONF_IDLE
? "idle" : "in use",
1419 * mac80211 will go to idle nearly immediately after transmitting some
1420 * frames, such as the deauth. To make sure those frames reach the air,
1421 * wait here until the TX queue is fully flushed.
1423 if ((changed
& IEEE80211_CONF_CHANGE_IDLE
) &&
1424 (conf
->flags
& IEEE80211_CONF_IDLE
))
1425 wl1271_tx_flush(wl
);
1427 mutex_lock(&wl
->mutex
);
1429 if (unlikely(wl
->state
== WL1271_STATE_OFF
)) {
1434 is_ap
= (wl
->bss_type
== BSS_TYPE_AP_BSS
);
1436 ret
= wl1271_ps_elp_wakeup(wl
, false);
1440 /* if the channel changes while joined, join again */
1441 if (changed
& IEEE80211_CONF_CHANGE_CHANNEL
&&
1442 ((wl
->band
!= conf
->channel
->band
) ||
1443 (wl
->channel
!= channel
))) {
1444 wl
->band
= conf
->channel
->band
;
1445 wl
->channel
= channel
;
1449 * FIXME: the mac80211 should really provide a fixed
1450 * rate to use here. for now, just use the smallest
1451 * possible rate for the band as a fixed rate for
1452 * association frames and other control messages.
1454 if (!test_bit(WL1271_FLAG_STA_ASSOCIATED
, &wl
->flags
))
1455 wl1271_set_band_rate(wl
);
1457 wl
->basic_rate
= wl1271_tx_min_rate_get(wl
);
1458 ret
= wl1271_acx_sta_rate_policies(wl
);
1460 wl1271_warning("rate policy for channel "
1463 if (test_bit(WL1271_FLAG_JOINED
, &wl
->flags
)) {
1464 ret
= wl1271_join(wl
, false);
1466 wl1271_warning("cmd join on channel "
1472 if (changed
& IEEE80211_CONF_CHANGE_IDLE
&& !is_ap
) {
1473 ret
= wl1271_sta_handle_idle(wl
,
1474 conf
->flags
& IEEE80211_CONF_IDLE
);
1476 wl1271_warning("idle mode change failed %d", ret
);
1480 * if mac80211 changes the PSM mode, make sure the mode is not
1481 * incorrectly changed after the pspoll failure active window.
1483 if (changed
& IEEE80211_CONF_CHANGE_PS
)
1484 clear_bit(WL1271_FLAG_PSPOLL_FAILURE
, &wl
->flags
);
1486 if (conf
->flags
& IEEE80211_CONF_PS
&&
1487 !test_bit(WL1271_FLAG_PSM_REQUESTED
, &wl
->flags
)) {
1488 set_bit(WL1271_FLAG_PSM_REQUESTED
, &wl
->flags
);
1491 * We enter PSM only if we're already associated.
1492 * If we're not, we'll enter it when joining an SSID,
1493 * through the bss_info_changed() hook.
1495 if (test_bit(WL1271_FLAG_STA_ASSOCIATED
, &wl
->flags
)) {
1496 wl1271_debug(DEBUG_PSM
, "psm enabled");
1497 ret
= wl1271_ps_set_mode(wl
, STATION_POWER_SAVE_MODE
,
1498 wl
->basic_rate
, true);
1500 } else if (!(conf
->flags
& IEEE80211_CONF_PS
) &&
1501 test_bit(WL1271_FLAG_PSM_REQUESTED
, &wl
->flags
)) {
1502 wl1271_debug(DEBUG_PSM
, "psm disabled");
1504 clear_bit(WL1271_FLAG_PSM_REQUESTED
, &wl
->flags
);
1506 if (test_bit(WL1271_FLAG_PSM
, &wl
->flags
))
1507 ret
= wl1271_ps_set_mode(wl
, STATION_ACTIVE_MODE
,
1508 wl
->basic_rate
, true);
1511 if (conf
->power_level
!= wl
->power_level
) {
1512 ret
= wl1271_acx_tx_power(wl
, conf
->power_level
);
1516 wl
->power_level
= conf
->power_level
;
1520 wl1271_ps_elp_sleep(wl
);
1523 mutex_unlock(&wl
->mutex
);
1528 struct wl1271_filter_params
{
1531 u8 mc_list
[ACX_MC_ADDRESS_GROUP_MAX
][ETH_ALEN
];
1534 static u64
wl1271_op_prepare_multicast(struct ieee80211_hw
*hw
,
1535 struct netdev_hw_addr_list
*mc_list
)
1537 struct wl1271_filter_params
*fp
;
1538 struct netdev_hw_addr
*ha
;
1539 struct wl1271
*wl
= hw
->priv
;
1541 if (unlikely(wl
->state
== WL1271_STATE_OFF
))
1544 fp
= kzalloc(sizeof(*fp
), GFP_ATOMIC
);
1546 wl1271_error("Out of memory setting filters.");
1550 /* update multicast filtering parameters */
1551 fp
->mc_list_length
= 0;
1552 if (netdev_hw_addr_list_count(mc_list
) > ACX_MC_ADDRESS_GROUP_MAX
) {
1553 fp
->enabled
= false;
1556 netdev_hw_addr_list_for_each(ha
, mc_list
) {
1557 memcpy(fp
->mc_list
[fp
->mc_list_length
],
1558 ha
->addr
, ETH_ALEN
);
1559 fp
->mc_list_length
++;
1563 return (u64
)(unsigned long)fp
;
1566 #define WL1271_SUPPORTED_FILTERS (FIF_PROMISC_IN_BSS | \
1569 FIF_BCN_PRBRESP_PROMISC | \
1573 static void wl1271_op_configure_filter(struct ieee80211_hw
*hw
,
1574 unsigned int changed
,
1575 unsigned int *total
, u64 multicast
)
1577 struct wl1271_filter_params
*fp
= (void *)(unsigned long)multicast
;
1578 struct wl1271
*wl
= hw
->priv
;
1581 wl1271_debug(DEBUG_MAC80211
, "mac80211 configure filter");
1583 mutex_lock(&wl
->mutex
);
1585 *total
&= WL1271_SUPPORTED_FILTERS
;
1586 changed
&= WL1271_SUPPORTED_FILTERS
;
1588 if (unlikely(wl
->state
== WL1271_STATE_OFF
))
1591 ret
= wl1271_ps_elp_wakeup(wl
, false);
1596 if (*total
& FIF_ALLMULTI
)
1597 ret
= wl1271_acx_group_address_tbl(wl
, false, NULL
, 0);
1599 ret
= wl1271_acx_group_address_tbl(wl
, fp
->enabled
,
1601 fp
->mc_list_length
);
1605 /* determine, whether supported filter values have changed */
1609 /* configure filters */
1610 wl
->filters
= *total
;
1611 wl1271_configure_filters(wl
, 0);
1613 /* apply configured filters */
1614 ret
= wl1271_acx_rx_config(wl
, wl
->rx_config
, wl
->rx_filter
);
1619 wl1271_ps_elp_sleep(wl
);
1622 mutex_unlock(&wl
->mutex
);
1626 static int wl1271_op_set_key(struct ieee80211_hw
*hw
, enum set_key_cmd cmd
,
1627 struct ieee80211_vif
*vif
,
1628 struct ieee80211_sta
*sta
,
1629 struct ieee80211_key_conf
*key_conf
)
1631 struct wl1271
*wl
= hw
->priv
;
1638 static const u8 bcast_addr
[ETH_ALEN
] =
1639 { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
1641 wl1271_debug(DEBUG_MAC80211
, "mac80211 set key");
1643 addr
= sta
? sta
->addr
: bcast_addr
;
1645 wl1271_debug(DEBUG_CRYPT
, "CMD: 0x%x", cmd
);
1646 wl1271_dump(DEBUG_CRYPT
, "ADDR: ", addr
, ETH_ALEN
);
1647 wl1271_debug(DEBUG_CRYPT
, "Key: algo:0x%x, id:%d, len:%d flags 0x%x",
1648 key_conf
->cipher
, key_conf
->keyidx
,
1649 key_conf
->keylen
, key_conf
->flags
);
1650 wl1271_dump(DEBUG_CRYPT
, "KEY: ", key_conf
->key
, key_conf
->keylen
);
1652 if (is_zero_ether_addr(addr
)) {
1653 /* We dont support TX only encryption */
1658 mutex_lock(&wl
->mutex
);
1660 if (unlikely(wl
->state
== WL1271_STATE_OFF
)) {
1665 ret
= wl1271_ps_elp_wakeup(wl
, false);
1669 switch (key_conf
->cipher
) {
1670 case WLAN_CIPHER_SUITE_WEP40
:
1671 case WLAN_CIPHER_SUITE_WEP104
:
1674 key_conf
->hw_key_idx
= key_conf
->keyidx
;
1676 case WLAN_CIPHER_SUITE_TKIP
:
1677 key_type
= KEY_TKIP
;
1679 key_conf
->hw_key_idx
= key_conf
->keyidx
;
1680 tx_seq_32
= WL1271_TX_SECURITY_HI32(wl
->tx_security_seq
);
1681 tx_seq_16
= WL1271_TX_SECURITY_LO16(wl
->tx_security_seq
);
1683 case WLAN_CIPHER_SUITE_CCMP
:
1686 key_conf
->flags
|= IEEE80211_KEY_FLAG_GENERATE_IV
;
1687 tx_seq_32
= WL1271_TX_SECURITY_HI32(wl
->tx_security_seq
);
1688 tx_seq_16
= WL1271_TX_SECURITY_LO16(wl
->tx_security_seq
);
1690 case WL1271_CIPHER_SUITE_GEM
:
1692 tx_seq_32
= WL1271_TX_SECURITY_HI32(wl
->tx_security_seq
);
1693 tx_seq_16
= WL1271_TX_SECURITY_LO16(wl
->tx_security_seq
);
1696 wl1271_error("Unknown key algo 0x%x", key_conf
->cipher
);
1704 ret
= wl1271_cmd_set_sta_key(wl
, KEY_ADD_OR_REPLACE
,
1705 key_conf
->keyidx
, key_type
,
1706 key_conf
->keylen
, key_conf
->key
,
1707 addr
, tx_seq_32
, tx_seq_16
);
1709 wl1271_error("Could not add or replace key");
1713 /* the default WEP key needs to be configured at least once */
1714 if (key_type
== KEY_WEP
) {
1715 ret
= wl1271_cmd_set_sta_default_wep_key(wl
,
1723 /* The wl1271 does not allow to remove unicast keys - they
1724 will be cleared automatically on next CMD_JOIN. Ignore the
1725 request silently, as we dont want the mac80211 to emit
1726 an error message. */
1727 if (!is_broadcast_ether_addr(addr
))
1730 ret
= wl1271_cmd_set_sta_key(wl
, KEY_REMOVE
,
1731 key_conf
->keyidx
, key_type
,
1732 key_conf
->keylen
, key_conf
->key
,
1735 wl1271_error("Could not remove key");
1741 wl1271_error("Unsupported key cmd 0x%x", cmd
);
1747 wl1271_ps_elp_sleep(wl
);
1750 mutex_unlock(&wl
->mutex
);
1756 static int wl1271_op_hw_scan(struct ieee80211_hw
*hw
,
1757 struct ieee80211_vif
*vif
,
1758 struct cfg80211_scan_request
*req
)
1760 struct wl1271
*wl
= hw
->priv
;
1765 wl1271_debug(DEBUG_MAC80211
, "mac80211 hw scan");
1768 ssid
= req
->ssids
[0].ssid
;
1769 len
= req
->ssids
[0].ssid_len
;
1772 mutex_lock(&wl
->mutex
);
1774 if (wl
->state
== WL1271_STATE_OFF
) {
1776 * We cannot return -EBUSY here because cfg80211 will expect
1777 * a call to ieee80211_scan_completed if we do - in this case
1778 * there won't be any call.
1784 ret
= wl1271_ps_elp_wakeup(wl
, false);
1788 ret
= wl1271_scan(hw
->priv
, ssid
, len
, req
);
1790 wl1271_ps_elp_sleep(wl
);
1793 mutex_unlock(&wl
->mutex
);
1798 static int wl1271_op_set_frag_threshold(struct ieee80211_hw
*hw
, u32 value
)
1800 struct wl1271
*wl
= hw
->priv
;
1803 mutex_lock(&wl
->mutex
);
1805 if (unlikely(wl
->state
== WL1271_STATE_OFF
)) {
1810 ret
= wl1271_ps_elp_wakeup(wl
, false);
1814 ret
= wl1271_acx_frag_threshold(wl
, (u16
)value
);
1816 wl1271_warning("wl1271_op_set_frag_threshold failed: %d", ret
);
1818 wl1271_ps_elp_sleep(wl
);
1821 mutex_unlock(&wl
->mutex
);
1826 static int wl1271_op_set_rts_threshold(struct ieee80211_hw
*hw
, u32 value
)
1828 struct wl1271
*wl
= hw
->priv
;
1831 mutex_lock(&wl
->mutex
);
1833 if (unlikely(wl
->state
== WL1271_STATE_OFF
)) {
1838 ret
= wl1271_ps_elp_wakeup(wl
, false);
1842 ret
= wl1271_acx_rts_threshold(wl
, (u16
) value
);
1844 wl1271_warning("wl1271_op_set_rts_threshold failed: %d", ret
);
1846 wl1271_ps_elp_sleep(wl
);
1849 mutex_unlock(&wl
->mutex
);
1854 static int wl1271_ssid_set(struct wl1271
*wl
, struct sk_buff
*skb
,
1857 u8
*ptr
= skb
->data
+ offset
;
1859 /* find the location of the ssid in the beacon */
1860 while (ptr
< skb
->data
+ skb
->len
) {
1861 if (ptr
[0] == WLAN_EID_SSID
) {
1862 wl
->ssid_len
= ptr
[1];
1863 memcpy(wl
->ssid
, ptr
+2, wl
->ssid_len
);
1866 ptr
+= (ptr
[1] + 2);
1869 wl1271_error("No SSID in IEs!\n");
1873 static int wl1271_bss_erp_info_changed(struct wl1271
*wl
,
1874 struct ieee80211_bss_conf
*bss_conf
,
1879 if (changed
& BSS_CHANGED_ERP_SLOT
) {
1880 if (bss_conf
->use_short_slot
)
1881 ret
= wl1271_acx_slot(wl
, SLOT_TIME_SHORT
);
1883 ret
= wl1271_acx_slot(wl
, SLOT_TIME_LONG
);
1885 wl1271_warning("Set slot time failed %d", ret
);
1890 if (changed
& BSS_CHANGED_ERP_PREAMBLE
) {
1891 if (bss_conf
->use_short_preamble
)
1892 wl1271_acx_set_preamble(wl
, ACX_PREAMBLE_SHORT
);
1894 wl1271_acx_set_preamble(wl
, ACX_PREAMBLE_LONG
);
1897 if (changed
& BSS_CHANGED_ERP_CTS_PROT
) {
1898 if (bss_conf
->use_cts_prot
)
1899 ret
= wl1271_acx_cts_protect(wl
, CTSPROTECT_ENABLE
);
1901 ret
= wl1271_acx_cts_protect(wl
, CTSPROTECT_DISABLE
);
1903 wl1271_warning("Set ctsprotect failed %d", ret
);
1912 static int wl1271_bss_beacon_info_changed(struct wl1271
*wl
,
1913 struct ieee80211_vif
*vif
,
1914 struct ieee80211_bss_conf
*bss_conf
,
1917 bool is_ap
= (wl
->bss_type
== BSS_TYPE_AP_BSS
);
1920 if ((changed
& BSS_CHANGED_BEACON_INT
)) {
1921 wl1271_debug(DEBUG_MASTER
, "beacon interval updated: %d",
1922 bss_conf
->beacon_int
);
1924 wl
->beacon_int
= bss_conf
->beacon_int
;
1927 if ((changed
& BSS_CHANGED_BEACON
)) {
1928 struct ieee80211_hdr
*hdr
;
1929 int ieoffset
= offsetof(struct ieee80211_mgmt
,
1931 struct sk_buff
*beacon
= ieee80211_beacon_get(wl
->hw
, vif
);
1937 wl1271_debug(DEBUG_MASTER
, "beacon updated");
1939 ret
= wl1271_ssid_set(wl
, beacon
, ieoffset
);
1941 dev_kfree_skb(beacon
);
1944 tmpl_id
= is_ap
? CMD_TEMPL_AP_BEACON
:
1946 ret
= wl1271_cmd_template_set(wl
, tmpl_id
,
1949 wl1271_tx_min_rate_get(wl
));
1951 dev_kfree_skb(beacon
);
1955 hdr
= (struct ieee80211_hdr
*) beacon
->data
;
1956 hdr
->frame_control
= cpu_to_le16(IEEE80211_FTYPE_MGMT
|
1957 IEEE80211_STYPE_PROBE_RESP
);
1959 tmpl_id
= is_ap
? CMD_TEMPL_AP_PROBE_RESPONSE
:
1960 CMD_TEMPL_PROBE_RESPONSE
;
1961 ret
= wl1271_cmd_template_set(wl
,
1965 wl1271_tx_min_rate_get(wl
));
1966 dev_kfree_skb(beacon
);
1975 /* AP mode changes */
1976 static void wl1271_bss_info_changed_ap(struct wl1271
*wl
,
1977 struct ieee80211_vif
*vif
,
1978 struct ieee80211_bss_conf
*bss_conf
,
1983 if ((changed
& BSS_CHANGED_BASIC_RATES
)) {
1984 u32 rates
= bss_conf
->basic_rates
;
1985 struct conf_tx_rate_class mgmt_rc
;
1987 wl
->basic_rate_set
= wl1271_tx_enabled_rates_get(wl
, rates
);
1988 wl
->basic_rate
= wl1271_tx_min_rate_get(wl
);
1989 wl1271_debug(DEBUG_AP
, "basic rates: 0x%x",
1990 wl
->basic_rate_set
);
1992 /* update the AP management rate policy with the new rates */
1993 mgmt_rc
.enabled_rates
= wl
->basic_rate_set
;
1994 mgmt_rc
.long_retry_limit
= 10;
1995 mgmt_rc
.short_retry_limit
= 10;
1997 ret
= wl1271_acx_ap_rate_policy(wl
, &mgmt_rc
,
1998 ACX_TX_AP_MODE_MGMT_RATE
);
2000 wl1271_error("AP mgmt policy change failed %d", ret
);
2005 ret
= wl1271_bss_beacon_info_changed(wl
, vif
, bss_conf
, changed
);
2009 if ((changed
& BSS_CHANGED_BEACON_ENABLED
)) {
2010 if (bss_conf
->enable_beacon
) {
2011 if (!test_bit(WL1271_FLAG_AP_STARTED
, &wl
->flags
)) {
2012 ret
= wl1271_cmd_start_bss(wl
);
2016 set_bit(WL1271_FLAG_AP_STARTED
, &wl
->flags
);
2017 wl1271_debug(DEBUG_AP
, "started AP");
2020 if (test_bit(WL1271_FLAG_AP_STARTED
, &wl
->flags
)) {
2021 ret
= wl1271_cmd_stop_bss(wl
);
2025 clear_bit(WL1271_FLAG_AP_STARTED
, &wl
->flags
);
2026 wl1271_debug(DEBUG_AP
, "stopped AP");
2031 ret
= wl1271_bss_erp_info_changed(wl
, bss_conf
, changed
);
2038 /* STA/IBSS mode changes */
2039 static void wl1271_bss_info_changed_sta(struct wl1271
*wl
,
2040 struct ieee80211_vif
*vif
,
2041 struct ieee80211_bss_conf
*bss_conf
,
2044 bool do_join
= false, set_assoc
= false;
2045 bool is_ibss
= (wl
->bss_type
== BSS_TYPE_IBSS
);
2047 struct ieee80211_sta
*sta
= ieee80211_find_sta(vif
, bss_conf
->bssid
);
2050 ret
= wl1271_bss_beacon_info_changed(wl
, vif
, bss_conf
,
2056 if ((changed
& BSS_CHANGED_BEACON_INT
) && is_ibss
)
2059 /* Need to update the SSID (for filtering etc) */
2060 if ((changed
& BSS_CHANGED_BEACON
) && is_ibss
)
2063 if ((changed
& BSS_CHANGED_BEACON_ENABLED
) && is_ibss
) {
2064 wl1271_debug(DEBUG_ADHOC
, "ad-hoc beaconing: %s",
2065 bss_conf
->enable_beacon
? "enabled" : "disabled");
2067 if (bss_conf
->enable_beacon
)
2068 wl
->set_bss_type
= BSS_TYPE_IBSS
;
2070 wl
->set_bss_type
= BSS_TYPE_STA_BSS
;
2074 if ((changed
& BSS_CHANGED_CQM
)) {
2075 bool enable
= false;
2076 if (bss_conf
->cqm_rssi_thold
)
2078 ret
= wl1271_acx_rssi_snr_trigger(wl
, enable
,
2079 bss_conf
->cqm_rssi_thold
,
2080 bss_conf
->cqm_rssi_hyst
);
2083 wl
->rssi_thold
= bss_conf
->cqm_rssi_thold
;
2086 if ((changed
& BSS_CHANGED_BSSID
) &&
2088 * Now we know the correct bssid, so we send a new join command
2089 * and enable the BSSID filter
2091 memcmp(wl
->bssid
, bss_conf
->bssid
, ETH_ALEN
)) {
2092 memcpy(wl
->bssid
, bss_conf
->bssid
, ETH_ALEN
);
2094 ret
= wl1271_cmd_build_null_data(wl
);
2098 ret
= wl1271_build_qos_null_data(wl
);
2102 /* filter out all packets not from this BSSID */
2103 wl1271_configure_filters(wl
, 0);
2105 /* Need to update the BSSID (for filtering etc) */
2109 if ((changed
& BSS_CHANGED_ASSOC
)) {
2110 if (bss_conf
->assoc
) {
2113 wl
->aid
= bss_conf
->aid
;
2116 wl
->ps_poll_failures
= 0;
2119 * use basic rates from AP, and determine lowest rate
2120 * to use with control frames.
2122 rates
= bss_conf
->basic_rates
;
2123 wl
->basic_rate_set
= wl1271_tx_enabled_rates_get(wl
,
2125 wl
->basic_rate
= wl1271_tx_min_rate_get(wl
);
2126 ret
= wl1271_acx_sta_rate_policies(wl
);
2131 * with wl1271, we don't need to update the
2132 * beacon_int and dtim_period, because the firmware
2133 * updates it by itself when the first beacon is
2134 * received after a join.
2136 ret
= wl1271_cmd_build_ps_poll(wl
, wl
->aid
);
2141 * Get a template for hardware connection maintenance
2143 dev_kfree_skb(wl
->probereq
);
2144 wl
->probereq
= wl1271_cmd_build_ap_probe_req(wl
, NULL
);
2145 ieoffset
= offsetof(struct ieee80211_mgmt
,
2146 u
.probe_req
.variable
);
2147 wl1271_ssid_set(wl
, wl
->probereq
, ieoffset
);
2149 /* enable the connection monitoring feature */
2150 ret
= wl1271_acx_conn_monit_params(wl
, true);
2154 /* If we want to go in PSM but we're not there yet */
2155 if (test_bit(WL1271_FLAG_PSM_REQUESTED
, &wl
->flags
) &&
2156 !test_bit(WL1271_FLAG_PSM
, &wl
->flags
)) {
2157 enum wl1271_cmd_ps_mode mode
;
2159 mode
= STATION_POWER_SAVE_MODE
;
2160 ret
= wl1271_ps_set_mode(wl
, mode
,
2167 /* use defaults when not associated */
2168 clear_bit(WL1271_FLAG_STA_STATE_SENT
, &wl
->flags
);
2169 clear_bit(WL1271_FLAG_STA_ASSOCIATED
, &wl
->flags
);
2172 /* free probe-request template */
2173 dev_kfree_skb(wl
->probereq
);
2174 wl
->probereq
= NULL
;
2176 /* re-enable dynamic ps - just in case */
2177 ieee80211_enable_dyn_ps(wl
->vif
);
2179 /* revert back to minimum rates for the current band */
2180 wl1271_set_band_rate(wl
);
2181 wl
->basic_rate
= wl1271_tx_min_rate_get(wl
);
2182 ret
= wl1271_acx_sta_rate_policies(wl
);
2186 /* disable connection monitor features */
2187 ret
= wl1271_acx_conn_monit_params(wl
, false);
2189 /* Disable the keep-alive feature */
2190 ret
= wl1271_acx_keep_alive_mode(wl
, false);
2194 /* restore the bssid filter and go to dummy bssid */
2196 wl1271_dummy_join(wl
);
2200 ret
= wl1271_bss_erp_info_changed(wl
, bss_conf
, changed
);
2205 * Takes care of: New association with HT enable,
2206 * HT information change in beacon.
2209 (changed
& BSS_CHANGED_HT
) &&
2210 (bss_conf
->channel_type
!= NL80211_CHAN_NO_HT
)) {
2211 ret
= wl1271_acx_set_ht_capabilities(wl
, &sta
->ht_cap
, true);
2213 wl1271_warning("Set ht cap true failed %d", ret
);
2216 ret
= wl1271_acx_set_ht_information(wl
,
2217 bss_conf
->ht_operation_mode
);
2219 wl1271_warning("Set ht information failed %d", ret
);
2224 * Takes care of: New association without HT,
2227 else if (sta
&& (changed
& BSS_CHANGED_ASSOC
)) {
2228 ret
= wl1271_acx_set_ht_capabilities(wl
, &sta
->ht_cap
, false);
2230 wl1271_warning("Set ht cap false failed %d", ret
);
2235 if (changed
& BSS_CHANGED_ARP_FILTER
) {
2236 __be32 addr
= bss_conf
->arp_addr_list
[0];
2237 WARN_ON(wl
->bss_type
!= BSS_TYPE_STA_BSS
);
2239 if (bss_conf
->arp_addr_cnt
== 1 &&
2240 bss_conf
->arp_filter_enabled
) {
2242 * The template should have been configured only upon
2243 * association. however, it seems that the correct ip
2244 * isn't being set (when sending), so we have to
2245 * reconfigure the template upon every ip change.
2247 ret
= wl1271_cmd_build_arp_rsp(wl
, addr
);
2249 wl1271_warning("build arp rsp failed: %d", ret
);
2253 ret
= wl1271_acx_arp_ip_filter(wl
,
2254 (ACX_ARP_FILTER_ARP_FILTERING
|
2255 ACX_ARP_FILTER_AUTO_ARP
),
2258 ret
= wl1271_acx_arp_ip_filter(wl
, 0, addr
);
2265 ret
= wl1271_join(wl
, set_assoc
);
2267 wl1271_warning("cmd join failed %d", ret
);
2276 static void wl1271_op_bss_info_changed(struct ieee80211_hw
*hw
,
2277 struct ieee80211_vif
*vif
,
2278 struct ieee80211_bss_conf
*bss_conf
,
2281 struct wl1271
*wl
= hw
->priv
;
2282 bool is_ap
= (wl
->bss_type
== BSS_TYPE_AP_BSS
);
2285 wl1271_debug(DEBUG_MAC80211
, "mac80211 bss info changed 0x%x",
2288 mutex_lock(&wl
->mutex
);
2290 if (unlikely(wl
->state
== WL1271_STATE_OFF
))
2293 ret
= wl1271_ps_elp_wakeup(wl
, false);
2298 wl1271_bss_info_changed_ap(wl
, vif
, bss_conf
, changed
);
2300 wl1271_bss_info_changed_sta(wl
, vif
, bss_conf
, changed
);
2302 wl1271_ps_elp_sleep(wl
);
2305 mutex_unlock(&wl
->mutex
);
2308 static int wl1271_op_conf_tx(struct ieee80211_hw
*hw
, u16 queue
,
2309 const struct ieee80211_tx_queue_params
*params
)
2311 struct wl1271
*wl
= hw
->priv
;
2315 mutex_lock(&wl
->mutex
);
2317 wl1271_debug(DEBUG_MAC80211
, "mac80211 conf tx %d", queue
);
2319 if (unlikely(wl
->state
== WL1271_STATE_OFF
)) {
2324 ret
= wl1271_ps_elp_wakeup(wl
, false);
2328 /* the txop is confed in units of 32us by the mac80211, we need us */
2329 ret
= wl1271_acx_ac_cfg(wl
, wl1271_tx_get_queue(queue
),
2330 params
->cw_min
, params
->cw_max
,
2331 params
->aifs
, params
->txop
<< 5);
2336 ps_scheme
= CONF_PS_SCHEME_UPSD_TRIGGER
;
2338 ps_scheme
= CONF_PS_SCHEME_LEGACY
;
2340 ret
= wl1271_acx_tid_cfg(wl
, wl1271_tx_get_queue(queue
),
2341 CONF_CHANNEL_TYPE_EDCF
,
2342 wl1271_tx_get_queue(queue
),
2343 ps_scheme
, CONF_ACK_POLICY_LEGACY
, 0, 0);
2348 wl1271_ps_elp_sleep(wl
);
2351 mutex_unlock(&wl
->mutex
);
2356 static u64
wl1271_op_get_tsf(struct ieee80211_hw
*hw
)
2359 struct wl1271
*wl
= hw
->priv
;
2360 u64 mactime
= ULLONG_MAX
;
2363 wl1271_debug(DEBUG_MAC80211
, "mac80211 get tsf");
2365 mutex_lock(&wl
->mutex
);
2367 if (unlikely(wl
->state
== WL1271_STATE_OFF
))
2370 ret
= wl1271_ps_elp_wakeup(wl
, false);
2374 ret
= wl1271_acx_tsf_info(wl
, &mactime
);
2379 wl1271_ps_elp_sleep(wl
);
2382 mutex_unlock(&wl
->mutex
);
2386 static int wl1271_op_get_survey(struct ieee80211_hw
*hw
, int idx
,
2387 struct survey_info
*survey
)
2389 struct wl1271
*wl
= hw
->priv
;
2390 struct ieee80211_conf
*conf
= &hw
->conf
;
2395 survey
->channel
= conf
->channel
;
2396 survey
->filled
= SURVEY_INFO_NOISE_DBM
;
2397 survey
->noise
= wl
->noise
;
2402 /* can't be const, mac80211 writes to this */
2403 static struct ieee80211_rate wl1271_rates
[] = {
2405 .hw_value
= CONF_HW_BIT_RATE_1MBPS
,
2406 .hw_value_short
= CONF_HW_BIT_RATE_1MBPS
, },
2408 .hw_value
= CONF_HW_BIT_RATE_2MBPS
,
2409 .hw_value_short
= CONF_HW_BIT_RATE_2MBPS
,
2410 .flags
= IEEE80211_RATE_SHORT_PREAMBLE
},
2412 .hw_value
= CONF_HW_BIT_RATE_5_5MBPS
,
2413 .hw_value_short
= CONF_HW_BIT_RATE_5_5MBPS
,
2414 .flags
= IEEE80211_RATE_SHORT_PREAMBLE
},
2416 .hw_value
= CONF_HW_BIT_RATE_11MBPS
,
2417 .hw_value_short
= CONF_HW_BIT_RATE_11MBPS
,
2418 .flags
= IEEE80211_RATE_SHORT_PREAMBLE
},
2420 .hw_value
= CONF_HW_BIT_RATE_6MBPS
,
2421 .hw_value_short
= CONF_HW_BIT_RATE_6MBPS
, },
2423 .hw_value
= CONF_HW_BIT_RATE_9MBPS
,
2424 .hw_value_short
= CONF_HW_BIT_RATE_9MBPS
, },
2426 .hw_value
= CONF_HW_BIT_RATE_12MBPS
,
2427 .hw_value_short
= CONF_HW_BIT_RATE_12MBPS
, },
2429 .hw_value
= CONF_HW_BIT_RATE_18MBPS
,
2430 .hw_value_short
= CONF_HW_BIT_RATE_18MBPS
, },
2432 .hw_value
= CONF_HW_BIT_RATE_24MBPS
,
2433 .hw_value_short
= CONF_HW_BIT_RATE_24MBPS
, },
2435 .hw_value
= CONF_HW_BIT_RATE_36MBPS
,
2436 .hw_value_short
= CONF_HW_BIT_RATE_36MBPS
, },
2438 .hw_value
= CONF_HW_BIT_RATE_48MBPS
,
2439 .hw_value_short
= CONF_HW_BIT_RATE_48MBPS
, },
2441 .hw_value
= CONF_HW_BIT_RATE_54MBPS
,
2442 .hw_value_short
= CONF_HW_BIT_RATE_54MBPS
, },
2445 /* can't be const, mac80211 writes to this */
2446 static struct ieee80211_channel wl1271_channels
[] = {
2447 { .hw_value
= 1, .center_freq
= 2412, .max_power
= 25 },
2448 { .hw_value
= 2, .center_freq
= 2417, .max_power
= 25 },
2449 { .hw_value
= 3, .center_freq
= 2422, .max_power
= 25 },
2450 { .hw_value
= 4, .center_freq
= 2427, .max_power
= 25 },
2451 { .hw_value
= 5, .center_freq
= 2432, .max_power
= 25 },
2452 { .hw_value
= 6, .center_freq
= 2437, .max_power
= 25 },
2453 { .hw_value
= 7, .center_freq
= 2442, .max_power
= 25 },
2454 { .hw_value
= 8, .center_freq
= 2447, .max_power
= 25 },
2455 { .hw_value
= 9, .center_freq
= 2452, .max_power
= 25 },
2456 { .hw_value
= 10, .center_freq
= 2457, .max_power
= 25 },
2457 { .hw_value
= 11, .center_freq
= 2462, .max_power
= 25 },
2458 { .hw_value
= 12, .center_freq
= 2467, .max_power
= 25 },
2459 { .hw_value
= 13, .center_freq
= 2472, .max_power
= 25 },
2462 /* mapping to indexes for wl1271_rates */
2463 static const u8 wl1271_rate_to_idx_2ghz
[] = {
2464 /* MCS rates are used only with 11n */
2465 7, /* CONF_HW_RXTX_RATE_MCS7 */
2466 6, /* CONF_HW_RXTX_RATE_MCS6 */
2467 5, /* CONF_HW_RXTX_RATE_MCS5 */
2468 4, /* CONF_HW_RXTX_RATE_MCS4 */
2469 3, /* CONF_HW_RXTX_RATE_MCS3 */
2470 2, /* CONF_HW_RXTX_RATE_MCS2 */
2471 1, /* CONF_HW_RXTX_RATE_MCS1 */
2472 0, /* CONF_HW_RXTX_RATE_MCS0 */
2474 11, /* CONF_HW_RXTX_RATE_54 */
2475 10, /* CONF_HW_RXTX_RATE_48 */
2476 9, /* CONF_HW_RXTX_RATE_36 */
2477 8, /* CONF_HW_RXTX_RATE_24 */
2479 /* TI-specific rate */
2480 CONF_HW_RXTX_RATE_UNSUPPORTED
, /* CONF_HW_RXTX_RATE_22 */
2482 7, /* CONF_HW_RXTX_RATE_18 */
2483 6, /* CONF_HW_RXTX_RATE_12 */
2484 3, /* CONF_HW_RXTX_RATE_11 */
2485 5, /* CONF_HW_RXTX_RATE_9 */
2486 4, /* CONF_HW_RXTX_RATE_6 */
2487 2, /* CONF_HW_RXTX_RATE_5_5 */
2488 1, /* CONF_HW_RXTX_RATE_2 */
2489 0 /* CONF_HW_RXTX_RATE_1 */
2492 /* 11n STA capabilities */
2493 #define HW_RX_HIGHEST_RATE 72
2495 #ifdef CONFIG_WL12XX_HT
2496 #define WL12XX_HT_CAP { \
2497 .cap = IEEE80211_HT_CAP_GRN_FLD | IEEE80211_HT_CAP_SGI_20, \
2498 .ht_supported = true, \
2499 .ampdu_factor = IEEE80211_HT_MAX_AMPDU_8K, \
2500 .ampdu_density = IEEE80211_HT_MPDU_DENSITY_8, \
2502 .rx_mask = { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, \
2503 .rx_highest = cpu_to_le16(HW_RX_HIGHEST_RATE), \
2504 .tx_params = IEEE80211_HT_MCS_TX_DEFINED, \
2508 #define WL12XX_HT_CAP { \
2509 .ht_supported = false, \
2513 /* can't be const, mac80211 writes to this */
2514 static struct ieee80211_supported_band wl1271_band_2ghz
= {
2515 .channels
= wl1271_channels
,
2516 .n_channels
= ARRAY_SIZE(wl1271_channels
),
2517 .bitrates
= wl1271_rates
,
2518 .n_bitrates
= ARRAY_SIZE(wl1271_rates
),
2519 .ht_cap
= WL12XX_HT_CAP
,
2522 /* 5 GHz data rates for WL1273 */
2523 static struct ieee80211_rate wl1271_rates_5ghz
[] = {
2525 .hw_value
= CONF_HW_BIT_RATE_6MBPS
,
2526 .hw_value_short
= CONF_HW_BIT_RATE_6MBPS
, },
2528 .hw_value
= CONF_HW_BIT_RATE_9MBPS
,
2529 .hw_value_short
= CONF_HW_BIT_RATE_9MBPS
, },
2531 .hw_value
= CONF_HW_BIT_RATE_12MBPS
,
2532 .hw_value_short
= CONF_HW_BIT_RATE_12MBPS
, },
2534 .hw_value
= CONF_HW_BIT_RATE_18MBPS
,
2535 .hw_value_short
= CONF_HW_BIT_RATE_18MBPS
, },
2537 .hw_value
= CONF_HW_BIT_RATE_24MBPS
,
2538 .hw_value_short
= CONF_HW_BIT_RATE_24MBPS
, },
2540 .hw_value
= CONF_HW_BIT_RATE_36MBPS
,
2541 .hw_value_short
= CONF_HW_BIT_RATE_36MBPS
, },
2543 .hw_value
= CONF_HW_BIT_RATE_48MBPS
,
2544 .hw_value_short
= CONF_HW_BIT_RATE_48MBPS
, },
2546 .hw_value
= CONF_HW_BIT_RATE_54MBPS
,
2547 .hw_value_short
= CONF_HW_BIT_RATE_54MBPS
, },
2550 /* 5 GHz band channels for WL1273 */
2551 static struct ieee80211_channel wl1271_channels_5ghz
[] = {
2552 { .hw_value
= 7, .center_freq
= 5035},
2553 { .hw_value
= 8, .center_freq
= 5040},
2554 { .hw_value
= 9, .center_freq
= 5045},
2555 { .hw_value
= 11, .center_freq
= 5055},
2556 { .hw_value
= 12, .center_freq
= 5060},
2557 { .hw_value
= 16, .center_freq
= 5080},
2558 { .hw_value
= 34, .center_freq
= 5170},
2559 { .hw_value
= 36, .center_freq
= 5180},
2560 { .hw_value
= 38, .center_freq
= 5190},
2561 { .hw_value
= 40, .center_freq
= 5200},
2562 { .hw_value
= 42, .center_freq
= 5210},
2563 { .hw_value
= 44, .center_freq
= 5220},
2564 { .hw_value
= 46, .center_freq
= 5230},
2565 { .hw_value
= 48, .center_freq
= 5240},
2566 { .hw_value
= 52, .center_freq
= 5260},
2567 { .hw_value
= 56, .center_freq
= 5280},
2568 { .hw_value
= 60, .center_freq
= 5300},
2569 { .hw_value
= 64, .center_freq
= 5320},
2570 { .hw_value
= 100, .center_freq
= 5500},
2571 { .hw_value
= 104, .center_freq
= 5520},
2572 { .hw_value
= 108, .center_freq
= 5540},
2573 { .hw_value
= 112, .center_freq
= 5560},
2574 { .hw_value
= 116, .center_freq
= 5580},
2575 { .hw_value
= 120, .center_freq
= 5600},
2576 { .hw_value
= 124, .center_freq
= 5620},
2577 { .hw_value
= 128, .center_freq
= 5640},
2578 { .hw_value
= 132, .center_freq
= 5660},
2579 { .hw_value
= 136, .center_freq
= 5680},
2580 { .hw_value
= 140, .center_freq
= 5700},
2581 { .hw_value
= 149, .center_freq
= 5745},
2582 { .hw_value
= 153, .center_freq
= 5765},
2583 { .hw_value
= 157, .center_freq
= 5785},
2584 { .hw_value
= 161, .center_freq
= 5805},
2585 { .hw_value
= 165, .center_freq
= 5825},
2588 /* mapping to indexes for wl1271_rates_5ghz */
2589 static const u8 wl1271_rate_to_idx_5ghz
[] = {
2590 /* MCS rates are used only with 11n */
2591 7, /* CONF_HW_RXTX_RATE_MCS7 */
2592 6, /* CONF_HW_RXTX_RATE_MCS6 */
2593 5, /* CONF_HW_RXTX_RATE_MCS5 */
2594 4, /* CONF_HW_RXTX_RATE_MCS4 */
2595 3, /* CONF_HW_RXTX_RATE_MCS3 */
2596 2, /* CONF_HW_RXTX_RATE_MCS2 */
2597 1, /* CONF_HW_RXTX_RATE_MCS1 */
2598 0, /* CONF_HW_RXTX_RATE_MCS0 */
2600 7, /* CONF_HW_RXTX_RATE_54 */
2601 6, /* CONF_HW_RXTX_RATE_48 */
2602 5, /* CONF_HW_RXTX_RATE_36 */
2603 4, /* CONF_HW_RXTX_RATE_24 */
2605 /* TI-specific rate */
2606 CONF_HW_RXTX_RATE_UNSUPPORTED
, /* CONF_HW_RXTX_RATE_22 */
2608 3, /* CONF_HW_RXTX_RATE_18 */
2609 2, /* CONF_HW_RXTX_RATE_12 */
2610 CONF_HW_RXTX_RATE_UNSUPPORTED
, /* CONF_HW_RXTX_RATE_11 */
2611 1, /* CONF_HW_RXTX_RATE_9 */
2612 0, /* CONF_HW_RXTX_RATE_6 */
2613 CONF_HW_RXTX_RATE_UNSUPPORTED
, /* CONF_HW_RXTX_RATE_5_5 */
2614 CONF_HW_RXTX_RATE_UNSUPPORTED
, /* CONF_HW_RXTX_RATE_2 */
2615 CONF_HW_RXTX_RATE_UNSUPPORTED
/* CONF_HW_RXTX_RATE_1 */
2618 static struct ieee80211_supported_band wl1271_band_5ghz
= {
2619 .channels
= wl1271_channels_5ghz
,
2620 .n_channels
= ARRAY_SIZE(wl1271_channels_5ghz
),
2621 .bitrates
= wl1271_rates_5ghz
,
2622 .n_bitrates
= ARRAY_SIZE(wl1271_rates_5ghz
),
2623 .ht_cap
= WL12XX_HT_CAP
,
2626 static const u8
*wl1271_band_rate_to_idx
[] = {
2627 [IEEE80211_BAND_2GHZ
] = wl1271_rate_to_idx_2ghz
,
2628 [IEEE80211_BAND_5GHZ
] = wl1271_rate_to_idx_5ghz
2631 static const struct ieee80211_ops wl1271_ops
= {
2632 .start
= wl1271_op_start
,
2633 .stop
= wl1271_op_stop
,
2634 .add_interface
= wl1271_op_add_interface
,
2635 .remove_interface
= wl1271_op_remove_interface
,
2636 .config
= wl1271_op_config
,
2637 .prepare_multicast
= wl1271_op_prepare_multicast
,
2638 .configure_filter
= wl1271_op_configure_filter
,
2640 .set_key
= wl1271_op_set_key
,
2641 .hw_scan
= wl1271_op_hw_scan
,
2642 .bss_info_changed
= wl1271_op_bss_info_changed
,
2643 .set_frag_threshold
= wl1271_op_set_frag_threshold
,
2644 .set_rts_threshold
= wl1271_op_set_rts_threshold
,
2645 .conf_tx
= wl1271_op_conf_tx
,
2646 .get_tsf
= wl1271_op_get_tsf
,
2647 .get_survey
= wl1271_op_get_survey
,
2648 CFG80211_TESTMODE_CMD(wl1271_tm_cmd
)
2652 u8
wl1271_rate_to_idx(int rate
, enum ieee80211_band band
)
2656 BUG_ON(band
>= sizeof(wl1271_band_rate_to_idx
)/sizeof(u8
*));
2658 if (unlikely(rate
>= CONF_HW_RXTX_RATE_MAX
)) {
2659 wl1271_error("Illegal RX rate from HW: %d", rate
);
2663 idx
= wl1271_band_rate_to_idx
[band
][rate
];
2664 if (unlikely(idx
== CONF_HW_RXTX_RATE_UNSUPPORTED
)) {
2665 wl1271_error("Unsupported RX rate from HW: %d", rate
);
2672 static ssize_t
wl1271_sysfs_show_bt_coex_state(struct device
*dev
,
2673 struct device_attribute
*attr
,
2676 struct wl1271
*wl
= dev_get_drvdata(dev
);
2681 mutex_lock(&wl
->mutex
);
2682 len
= snprintf(buf
, len
, "%d\n\n0 - off\n1 - on\n",
2684 mutex_unlock(&wl
->mutex
);
2690 static ssize_t
wl1271_sysfs_store_bt_coex_state(struct device
*dev
,
2691 struct device_attribute
*attr
,
2692 const char *buf
, size_t count
)
2694 struct wl1271
*wl
= dev_get_drvdata(dev
);
2698 ret
= strict_strtoul(buf
, 10, &res
);
2701 wl1271_warning("incorrect value written to bt_coex_mode");
2705 mutex_lock(&wl
->mutex
);
2709 if (res
== wl
->sg_enabled
)
2712 wl
->sg_enabled
= res
;
2714 if (wl
->state
== WL1271_STATE_OFF
)
2717 ret
= wl1271_ps_elp_wakeup(wl
, false);
2721 wl1271_acx_sg_enable(wl
, wl
->sg_enabled
);
2722 wl1271_ps_elp_sleep(wl
);
2725 mutex_unlock(&wl
->mutex
);
2729 static DEVICE_ATTR(bt_coex_state
, S_IRUGO
| S_IWUSR
,
2730 wl1271_sysfs_show_bt_coex_state
,
2731 wl1271_sysfs_store_bt_coex_state
);
2733 static ssize_t
wl1271_sysfs_show_hw_pg_ver(struct device
*dev
,
2734 struct device_attribute
*attr
,
2737 struct wl1271
*wl
= dev_get_drvdata(dev
);
2742 mutex_lock(&wl
->mutex
);
2743 if (wl
->hw_pg_ver
>= 0)
2744 len
= snprintf(buf
, len
, "%d\n", wl
->hw_pg_ver
);
2746 len
= snprintf(buf
, len
, "n/a\n");
2747 mutex_unlock(&wl
->mutex
);
2752 static DEVICE_ATTR(hw_pg_ver
, S_IRUGO
| S_IWUSR
,
2753 wl1271_sysfs_show_hw_pg_ver
, NULL
);
2755 int wl1271_register_hw(struct wl1271
*wl
)
2759 if (wl
->mac80211_registered
)
2762 SET_IEEE80211_PERM_ADDR(wl
->hw
, wl
->mac_addr
);
2764 ret
= ieee80211_register_hw(wl
->hw
);
2766 wl1271_error("unable to register mac80211 hw: %d", ret
);
2770 wl
->mac80211_registered
= true;
2772 wl1271_debugfs_init(wl
);
2774 register_netdevice_notifier(&wl1271_dev_notifier
);
2776 wl1271_notice("loaded");
2780 EXPORT_SYMBOL_GPL(wl1271_register_hw
);
2782 void wl1271_unregister_hw(struct wl1271
*wl
)
2784 unregister_netdevice_notifier(&wl1271_dev_notifier
);
2785 ieee80211_unregister_hw(wl
->hw
);
2786 wl
->mac80211_registered
= false;
2789 EXPORT_SYMBOL_GPL(wl1271_unregister_hw
);
2791 int wl1271_init_ieee80211(struct wl1271
*wl
)
2793 static const u32 cipher_suites
[] = {
2794 WLAN_CIPHER_SUITE_WEP40
,
2795 WLAN_CIPHER_SUITE_WEP104
,
2796 WLAN_CIPHER_SUITE_TKIP
,
2797 WLAN_CIPHER_SUITE_CCMP
,
2798 WL1271_CIPHER_SUITE_GEM
,
2801 /* The tx descriptor buffer and the TKIP space. */
2802 wl
->hw
->extra_tx_headroom
= WL1271_TKIP_IV_SPACE
+
2803 sizeof(struct wl1271_tx_hw_descr
);
2806 /* FIXME: find a proper value */
2807 wl
->hw
->channel_change_time
= 10000;
2808 wl
->hw
->max_listen_interval
= wl
->conf
.conn
.max_listen_interval
;
2810 wl
->hw
->flags
= IEEE80211_HW_SIGNAL_DBM
|
2811 IEEE80211_HW_BEACON_FILTER
|
2812 IEEE80211_HW_SUPPORTS_PS
|
2813 IEEE80211_HW_SUPPORTS_UAPSD
|
2814 IEEE80211_HW_HAS_RATE_CONTROL
|
2815 IEEE80211_HW_CONNECTION_MONITOR
|
2816 IEEE80211_HW_SUPPORTS_CQM_RSSI
;
2818 wl
->hw
->wiphy
->cipher_suites
= cipher_suites
;
2819 wl
->hw
->wiphy
->n_cipher_suites
= ARRAY_SIZE(cipher_suites
);
2821 wl
->hw
->wiphy
->interface_modes
= BIT(NL80211_IFTYPE_STATION
) |
2822 BIT(NL80211_IFTYPE_ADHOC
);
2823 wl
->hw
->wiphy
->max_scan_ssids
= 1;
2825 * Maximum length of elements in scanning probe request templates
2826 * should be the maximum length possible for a template, without
2827 * the IEEE80211 header of the template
2829 wl
->hw
->wiphy
->max_scan_ie_len
= WL1271_CMD_TEMPL_MAX_SIZE
-
2830 sizeof(struct ieee80211_header
);
2831 wl
->hw
->wiphy
->bands
[IEEE80211_BAND_2GHZ
] = &wl1271_band_2ghz
;
2832 wl
->hw
->wiphy
->bands
[IEEE80211_BAND_5GHZ
] = &wl1271_band_5ghz
;
2835 wl
->hw
->max_rates
= 1;
2837 wl
->hw
->wiphy
->reg_notifier
= wl1271_reg_notify
;
2839 SET_IEEE80211_DEV(wl
->hw
, wl1271_wl_to_dev(wl
));
2843 EXPORT_SYMBOL_GPL(wl1271_init_ieee80211
);
2845 #define WL1271_DEFAULT_CHANNEL 0
2847 struct ieee80211_hw
*wl1271_alloc_hw(void)
2849 struct ieee80211_hw
*hw
;
2850 struct platform_device
*plat_dev
= NULL
;
2855 hw
= ieee80211_alloc_hw(sizeof(*wl
), &wl1271_ops
);
2857 wl1271_error("could not alloc ieee80211_hw");
2862 plat_dev
= kmemdup(&wl1271_device
, sizeof(wl1271_device
), GFP_KERNEL
);
2864 wl1271_error("could not allocate platform_device");
2866 goto err_plat_alloc
;
2870 memset(wl
, 0, sizeof(*wl
));
2872 INIT_LIST_HEAD(&wl
->list
);
2875 wl
->plat_dev
= plat_dev
;
2877 for (i
= 0; i
< NUM_TX_QUEUES
; i
++)
2878 skb_queue_head_init(&wl
->tx_queue
[i
]);
2880 INIT_DELAYED_WORK(&wl
->elp_work
, wl1271_elp_work
);
2881 INIT_DELAYED_WORK(&wl
->pspoll_work
, wl1271_pspoll_work
);
2882 INIT_WORK(&wl
->irq_work
, wl1271_irq_work
);
2883 INIT_WORK(&wl
->tx_work
, wl1271_tx_work
);
2884 INIT_WORK(&wl
->recovery_work
, wl1271_recovery_work
);
2885 INIT_DELAYED_WORK(&wl
->scan_complete_work
, wl1271_scan_complete_work
);
2886 wl
->channel
= WL1271_DEFAULT_CHANNEL
;
2887 wl
->beacon_int
= WL1271_DEFAULT_BEACON_INT
;
2888 wl
->default_key
= 0;
2890 wl
->rx_config
= WL1271_DEFAULT_STA_RX_CONFIG
;
2891 wl
->rx_filter
= WL1271_DEFAULT_STA_RX_FILTER
;
2892 wl
->psm_entry_retry
= 0;
2893 wl
->power_level
= WL1271_DEFAULT_POWER_LEVEL
;
2894 wl
->basic_rate_set
= CONF_TX_RATE_MASK_BASIC
;
2895 wl
->basic_rate
= CONF_TX_RATE_MASK_BASIC
;
2896 wl
->rate_set
= CONF_TX_RATE_MASK_BASIC
;
2897 wl
->sta_rate_set
= 0;
2898 wl
->band
= IEEE80211_BAND_2GHZ
;
2901 wl
->sg_enabled
= true;
2904 memset(wl
->tx_frames_map
, 0, sizeof(wl
->tx_frames_map
));
2905 for (i
= 0; i
< ACX_TX_DESCRIPTORS
; i
++)
2906 wl
->tx_frames
[i
] = NULL
;
2908 spin_lock_init(&wl
->wl_lock
);
2910 wl
->state
= WL1271_STATE_OFF
;
2911 mutex_init(&wl
->mutex
);
2913 /* Apply default driver configuration. */
2914 wl1271_conf_init(wl
);
2916 order
= get_order(WL1271_AGGR_BUFFER_SIZE
);
2917 wl
->aggr_buf
= (u8
*)__get_free_pages(GFP_KERNEL
, order
);
2918 if (!wl
->aggr_buf
) {
2923 /* Register platform device */
2924 ret
= platform_device_register(wl
->plat_dev
);
2926 wl1271_error("couldn't register platform device");
2929 dev_set_drvdata(&wl
->plat_dev
->dev
, wl
);
2931 /* Create sysfs file to control bt coex state */
2932 ret
= device_create_file(&wl
->plat_dev
->dev
, &dev_attr_bt_coex_state
);
2934 wl1271_error("failed to create sysfs file bt_coex_state");
2938 /* Create sysfs file to get HW PG version */
2939 ret
= device_create_file(&wl
->plat_dev
->dev
, &dev_attr_hw_pg_ver
);
2941 wl1271_error("failed to create sysfs file hw_pg_ver");
2942 goto err_bt_coex_state
;
2948 device_remove_file(&wl
->plat_dev
->dev
, &dev_attr_bt_coex_state
);
2951 platform_device_unregister(wl
->plat_dev
);
2954 free_pages((unsigned long)wl
->aggr_buf
, order
);
2957 wl1271_debugfs_exit(wl
);
2961 ieee80211_free_hw(hw
);
2965 return ERR_PTR(ret
);
2967 EXPORT_SYMBOL_GPL(wl1271_alloc_hw
);
2969 int wl1271_free_hw(struct wl1271
*wl
)
2971 platform_device_unregister(wl
->plat_dev
);
2972 free_pages((unsigned long)wl
->aggr_buf
,
2973 get_order(WL1271_AGGR_BUFFER_SIZE
));
2974 kfree(wl
->plat_dev
);
2976 wl1271_debugfs_exit(wl
);
2983 kfree(wl
->fw_status
);
2984 kfree(wl
->tx_res_if
);
2986 ieee80211_free_hw(wl
->hw
);
2990 EXPORT_SYMBOL_GPL(wl1271_free_hw
);
2992 u32 wl12xx_debug_level
;
2993 EXPORT_SYMBOL_GPL(wl12xx_debug_level
);
2994 module_param_named(debug_level
, wl12xx_debug_level
, uint
, DEBUG_NONE
);
2995 MODULE_PARM_DESC(debug_level
, "wl12xx debugging level");
2997 MODULE_LICENSE("GPL");
2998 MODULE_AUTHOR("Luciano Coelho <luciano.coelho@nokia.com>");
2999 MODULE_AUTHOR("Juuso Oikarinen <juuso.oikarinen@nokia.com>");