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/inetdevice.h>
34 #include "wl12xx_80211.h"
35 #include "wl1271_reg.h"
36 #include "wl1271_io.h"
37 #include "wl1271_event.h"
38 #include "wl1271_tx.h"
39 #include "wl1271_rx.h"
40 #include "wl1271_ps.h"
41 #include "wl1271_init.h"
42 #include "wl1271_debugfs.h"
43 #include "wl1271_cmd.h"
44 #include "wl1271_boot.h"
45 #include "wl1271_testmode.h"
47 #define WL1271_BOOT_RETRIES 3
49 static struct conf_drv_settings default_conf
= {
51 .per_threshold
= 7500,
52 .max_scan_compensation_time
= 120000,
53 .nfs_sample_interval
= 400,
56 .probe_req_compensation
= 170,
57 .scan_window_compensation
= 50,
59 .beacon_miss_threshold
= 60,
60 .rate_adaptation_threshold
= CONF_HW_BIT_RATE_12MBPS
,
61 .rate_adaptation_snr
= 0
64 .rx_msdu_life_time
= 512000,
65 .packet_detection_threshold
= 0,
66 .ps_poll_timeout
= 15,
68 .rts_threshold
= 2347,
69 .rx_cca_threshold
= 0,
70 .irq_blk_threshold
= 0xFFFF,
71 .irq_pkt_threshold
= 0,
73 .queue_type
= CONF_RX_QUEUE_TYPE_LOW_PRIORITY
,
76 .tx_energy_detection
= 0,
78 .enabled_rates
= CONF_HW_BIT_RATE_1MBPS
|
79 CONF_HW_BIT_RATE_2MBPS
,
80 .short_retry_limit
= 10,
81 .long_retry_limit
= 10,
104 .aifsn
= CONF_TX_AIFS_PIFS
,
111 .aifsn
= CONF_TX_AIFS_PIFS
,
119 .channel_type
= CONF_CHANNEL_TYPE_DCF
,
120 .tsid
= CONF_TX_AC_BE
,
121 .ps_scheme
= CONF_PS_SCHEME_LEGACY
,
122 .ack_policy
= CONF_ACK_POLICY_LEGACY
,
127 .channel_type
= CONF_CHANNEL_TYPE_DCF
,
128 .tsid
= CONF_TX_AC_BE
,
129 .ps_scheme
= CONF_PS_SCHEME_LEGACY
,
130 .ack_policy
= CONF_ACK_POLICY_LEGACY
,
135 .channel_type
= CONF_CHANNEL_TYPE_DCF
,
136 .tsid
= CONF_TX_AC_BE
,
137 .ps_scheme
= CONF_PS_SCHEME_LEGACY
,
138 .ack_policy
= CONF_ACK_POLICY_LEGACY
,
143 .channel_type
= CONF_CHANNEL_TYPE_DCF
,
144 .tsid
= CONF_TX_AC_BE
,
145 .ps_scheme
= CONF_PS_SCHEME_LEGACY
,
146 .ack_policy
= CONF_ACK_POLICY_LEGACY
,
151 .channel_type
= CONF_CHANNEL_TYPE_DCF
,
152 .tsid
= CONF_TX_AC_BE
,
153 .ps_scheme
= CONF_PS_SCHEME_LEGACY
,
154 .ack_policy
= CONF_ACK_POLICY_LEGACY
,
159 .channel_type
= CONF_CHANNEL_TYPE_DCF
,
160 .tsid
= CONF_TX_AC_BE
,
161 .ps_scheme
= CONF_PS_SCHEME_LEGACY
,
162 .ack_policy
= CONF_ACK_POLICY_LEGACY
,
167 .channel_type
= CONF_CHANNEL_TYPE_DCF
,
168 .tsid
= CONF_TX_AC_BE
,
169 .ps_scheme
= CONF_PS_SCHEME_LEGACY
,
170 .ack_policy
= CONF_ACK_POLICY_LEGACY
,
174 .frag_threshold
= IEEE80211_MAX_FRAG_THRESHOLD
,
175 .tx_compl_timeout
= 700,
176 .tx_compl_threshold
= 4
179 .wake_up_event
= CONF_WAKE_UP_EVENT_DTIM
,
180 .listen_interval
= 0,
181 .bcn_filt_mode
= CONF_BCN_FILT_MODE_ENABLED
,
182 .bcn_filt_ie_count
= 1,
185 .ie
= WLAN_EID_CHANNEL_SWITCH
,
186 .rule
= CONF_BCN_RULE_PASS_ON_APPEARANCE
,
189 .synch_fail_thold
= 10,
190 .bss_lose_timeout
= 100,
191 .beacon_rx_timeout
= 10000,
192 .broadcast_timeout
= 20000,
193 .rx_broadcast_in_ps
= 1,
194 .ps_poll_threshold
= 20,
195 .sig_trigger_count
= 2,
200 .metric
= CONF_TRIG_METRIC_RSSI_BEACON
,
201 .type
= CONF_TRIG_EVENT_TYPE_EDGE
,
202 .direction
= CONF_TRIG_EVENT_DIR_LOW
,
210 .metric
= CONF_TRIG_METRIC_RSSI_BEACON
,
211 .type
= CONF_TRIG_EVENT_TYPE_EDGE
,
212 .direction
= CONF_TRIG_EVENT_DIR_HIGH
,
219 .rssi_bcn_avg_weight
= 10,
220 .rssi_pkt_avg_weight
= 10,
221 .snr_bcn_avg_weight
= 10,
222 .snr_pkt_avg_weight
= 10
224 .bet_enable
= CONF_BET_MODE_ENABLE
,
225 .bet_max_consecutive
= 10,
226 .psm_entry_retries
= 3
238 .host_clk_settling_time
= 5000,
239 .host_fast_wakeup_support
= false
243 static LIST_HEAD(wl_list
);
245 static void wl1271_conf_init(struct wl1271
*wl
)
249 * This function applies the default configuration to the driver. This
250 * function is invoked upon driver load (spi probe.)
252 * The configuration is stored in a run-time structure in order to
253 * facilitate for run-time adjustment of any of the parameters. Making
254 * changes to the configuration structure will apply the new values on
255 * the next interface up (wl1271_op_start.)
258 /* apply driver default configuration */
259 memcpy(&wl
->conf
, &default_conf
, sizeof(default_conf
));
263 static int wl1271_plt_init(struct wl1271
*wl
)
265 struct conf_tx_ac_category
*conf_ac
;
266 struct conf_tx_tid
*conf_tid
;
269 ret
= wl1271_cmd_general_parms(wl
);
273 ret
= wl1271_cmd_radio_parms(wl
);
277 ret
= wl1271_init_templates_config(wl
);
281 ret
= wl1271_acx_init_mem_config(wl
);
285 /* PHY layer config */
286 ret
= wl1271_init_phy_config(wl
);
288 goto out_free_memmap
;
290 ret
= wl1271_acx_dco_itrim_params(wl
);
292 goto out_free_memmap
;
294 /* Initialize connection monitoring thresholds */
295 ret
= wl1271_acx_conn_monit_params(wl
);
297 goto out_free_memmap
;
299 /* Bluetooth WLAN coexistence */
300 ret
= wl1271_init_pta(wl
);
302 goto out_free_memmap
;
304 /* Energy detection */
305 ret
= wl1271_init_energy_detection(wl
);
307 goto out_free_memmap
;
309 /* Default fragmentation threshold */
310 ret
= wl1271_acx_frag_threshold(wl
);
312 goto out_free_memmap
;
314 /* Default TID configuration */
315 for (i
= 0; i
< wl
->conf
.tx
.tid_conf_count
; i
++) {
316 conf_tid
= &wl
->conf
.tx
.tid_conf
[i
];
317 ret
= wl1271_acx_tid_cfg(wl
, conf_tid
->queue_id
,
318 conf_tid
->channel_type
,
321 conf_tid
->ack_policy
,
322 conf_tid
->apsd_conf
[0],
323 conf_tid
->apsd_conf
[1]);
325 goto out_free_memmap
;
328 /* Default AC configuration */
329 for (i
= 0; i
< wl
->conf
.tx
.ac_conf_count
; i
++) {
330 conf_ac
= &wl
->conf
.tx
.ac_conf
[i
];
331 ret
= wl1271_acx_ac_cfg(wl
, conf_ac
->ac
, conf_ac
->cw_min
,
332 conf_ac
->cw_max
, conf_ac
->aifsn
,
333 conf_ac
->tx_op_limit
);
335 goto out_free_memmap
;
338 /* Enable data path */
339 ret
= wl1271_cmd_data_path(wl
, 1);
341 goto out_free_memmap
;
343 /* Configure for CAM power saving (ie. always active) */
344 ret
= wl1271_acx_sleep_auth(wl
, WL1271_PSM_CAM
);
346 goto out_free_memmap
;
349 ret
= wl1271_acx_pm_config(wl
);
351 goto out_free_memmap
;
356 kfree(wl
->target_mem_map
);
357 wl
->target_mem_map
= NULL
;
362 static void wl1271_power_off(struct wl1271
*wl
)
364 wl
->set_power(false);
365 clear_bit(WL1271_FLAG_GPIO_POWER
, &wl
->flags
);
368 static void wl1271_power_on(struct wl1271
*wl
)
371 set_bit(WL1271_FLAG_GPIO_POWER
, &wl
->flags
);
374 static void wl1271_fw_status(struct wl1271
*wl
,
375 struct wl1271_fw_status
*status
)
380 wl1271_raw_read(wl
, FW_STATUS_ADDR
, status
, sizeof(*status
), false);
382 wl1271_debug(DEBUG_IRQ
, "intr: 0x%x (fw_rx_counter = %d, "
383 "drv_rx_counter = %d, tx_results_counter = %d)",
385 status
->fw_rx_counter
,
386 status
->drv_rx_counter
,
387 status
->tx_results_counter
);
389 /* update number of available TX blocks */
390 for (i
= 0; i
< NUM_TX_QUEUES
; i
++) {
391 u32 cnt
= le32_to_cpu(status
->tx_released_blks
[i
]) -
392 wl
->tx_blocks_freed
[i
];
394 wl
->tx_blocks_freed
[i
] =
395 le32_to_cpu(status
->tx_released_blks
[i
]);
396 wl
->tx_blocks_available
+= cnt
;
400 /* if more blocks are available now, schedule some tx work */
401 if (total
&& !skb_queue_empty(&wl
->tx_queue
))
402 ieee80211_queue_work(wl
->hw
, &wl
->tx_work
);
404 /* update the host-chipset time offset */
405 wl
->time_offset
= jiffies_to_usecs(jiffies
) -
406 le32_to_cpu(status
->fw_localtime
);
409 static void wl1271_irq_work(struct work_struct
*work
)
414 container_of(work
, struct wl1271
, irq_work
);
416 mutex_lock(&wl
->mutex
);
418 wl1271_debug(DEBUG_IRQ
, "IRQ work");
420 if (wl
->state
== WL1271_STATE_OFF
)
423 ret
= wl1271_ps_elp_wakeup(wl
, true);
427 wl1271_write32(wl
, ACX_REG_INTERRUPT_MASK
, WL1271_ACX_INTR_ALL
);
429 wl1271_fw_status(wl
, wl
->fw_status
);
430 intr
= le32_to_cpu(wl
->fw_status
->intr
);
432 wl1271_debug(DEBUG_IRQ
, "Zero interrupt received.");
436 intr
&= WL1271_INTR_MASK
;
438 if (intr
& WL1271_ACX_INTR_EVENT_A
) {
439 wl1271_debug(DEBUG_IRQ
, "WL1271_ACX_INTR_EVENT_A");
440 wl1271_event_handle(wl
, 0);
443 if (intr
& WL1271_ACX_INTR_EVENT_B
) {
444 wl1271_debug(DEBUG_IRQ
, "WL1271_ACX_INTR_EVENT_B");
445 wl1271_event_handle(wl
, 1);
448 if (intr
& WL1271_ACX_INTR_INIT_COMPLETE
)
449 wl1271_debug(DEBUG_IRQ
,
450 "WL1271_ACX_INTR_INIT_COMPLETE");
452 if (intr
& WL1271_ACX_INTR_HW_AVAILABLE
)
453 wl1271_debug(DEBUG_IRQ
, "WL1271_ACX_INTR_HW_AVAILABLE");
455 if (intr
& WL1271_ACX_INTR_DATA
) {
456 wl1271_debug(DEBUG_IRQ
, "WL1271_ACX_INTR_DATA");
458 /* check for tx results */
459 if (wl
->fw_status
->tx_results_counter
!=
460 (wl
->tx_results_count
& 0xff))
461 wl1271_tx_complete(wl
);
463 wl1271_rx(wl
, wl
->fw_status
);
467 wl1271_write32(wl
, ACX_REG_INTERRUPT_MASK
,
468 WL1271_ACX_INTR_ALL
& ~(WL1271_INTR_MASK
));
469 wl1271_ps_elp_sleep(wl
);
472 mutex_unlock(&wl
->mutex
);
475 static int wl1271_fetch_firmware(struct wl1271
*wl
)
477 const struct firmware
*fw
;
480 ret
= request_firmware(&fw
, WL1271_FW_NAME
, wl1271_wl_to_dev(wl
));
483 wl1271_error("could not get firmware: %d", ret
);
488 wl1271_error("firmware size is not multiple of 32 bits: %zu",
494 wl
->fw_len
= fw
->size
;
495 wl
->fw
= vmalloc(wl
->fw_len
);
498 wl1271_error("could not allocate memory for the firmware");
503 memcpy(wl
->fw
, fw
->data
, wl
->fw_len
);
508 release_firmware(fw
);
513 static int wl1271_update_mac_addr(struct wl1271
*wl
)
516 u8
*nvs_ptr
= (u8
*)wl
->nvs
->nvs
;
518 /* get mac address from the NVS */
519 wl
->mac_addr
[0] = nvs_ptr
[11];
520 wl
->mac_addr
[1] = nvs_ptr
[10];
521 wl
->mac_addr
[2] = nvs_ptr
[6];
522 wl
->mac_addr
[3] = nvs_ptr
[5];
523 wl
->mac_addr
[4] = nvs_ptr
[4];
524 wl
->mac_addr
[5] = nvs_ptr
[3];
526 /* FIXME: if it is a zero-address, we should bail out. Now, instead,
527 we randomize an address */
528 if (is_zero_ether_addr(wl
->mac_addr
)) {
529 static const u8 nokia_oui
[3] = {0x00, 0x1f, 0xdf};
530 memcpy(wl
->mac_addr
, nokia_oui
, 3);
531 get_random_bytes(wl
->mac_addr
+ 3, 3);
533 /* update this address to the NVS */
534 nvs_ptr
[11] = wl
->mac_addr
[0];
535 nvs_ptr
[10] = wl
->mac_addr
[1];
536 nvs_ptr
[6] = wl
->mac_addr
[2];
537 nvs_ptr
[5] = wl
->mac_addr
[3];
538 nvs_ptr
[4] = wl
->mac_addr
[4];
539 nvs_ptr
[3] = wl
->mac_addr
[5];
542 SET_IEEE80211_PERM_ADDR(wl
->hw
, wl
->mac_addr
);
547 static int wl1271_fetch_nvs(struct wl1271
*wl
)
549 const struct firmware
*fw
;
552 ret
= request_firmware(&fw
, WL1271_NVS_NAME
, wl1271_wl_to_dev(wl
));
555 wl1271_error("could not get nvs file: %d", ret
);
559 if (fw
->size
!= sizeof(struct wl1271_nvs_file
)) {
560 wl1271_error("nvs size is not as expected: %zu != %zu",
561 fw
->size
, sizeof(struct wl1271_nvs_file
));
566 wl
->nvs
= kmalloc(sizeof(struct wl1271_nvs_file
), GFP_KERNEL
);
569 wl1271_error("could not allocate memory for the nvs file");
574 memcpy(wl
->nvs
, fw
->data
, sizeof(struct wl1271_nvs_file
));
576 ret
= wl1271_update_mac_addr(wl
);
579 release_firmware(fw
);
584 static void wl1271_fw_wakeup(struct wl1271
*wl
)
588 elp_reg
= ELPCTRL_WAKE_UP
;
589 wl1271_raw_write32(wl
, HW_ACCESS_ELP_CTRL_REG_ADDR
, elp_reg
);
592 static int wl1271_setup(struct wl1271
*wl
)
594 wl
->fw_status
= kmalloc(sizeof(*wl
->fw_status
), GFP_KERNEL
);
598 wl
->tx_res_if
= kmalloc(sizeof(*wl
->tx_res_if
), GFP_KERNEL
);
599 if (!wl
->tx_res_if
) {
600 kfree(wl
->fw_status
);
604 INIT_WORK(&wl
->irq_work
, wl1271_irq_work
);
605 INIT_WORK(&wl
->tx_work
, wl1271_tx_work
);
609 static int wl1271_chip_wakeup(struct wl1271
*wl
)
611 struct wl1271_partition_set partition
;
614 msleep(WL1271_PRE_POWER_ON_SLEEP
);
616 msleep(WL1271_POWER_ON_SLEEP
);
620 /* We don't need a real memory partition here, because we only want
621 * to use the registers at this point. */
622 memset(&partition
, 0, sizeof(partition
));
623 partition
.reg
.start
= REGISTERS_BASE
;
624 partition
.reg
.size
= REGISTERS_DOWN_SIZE
;
625 wl1271_set_partition(wl
, &partition
);
627 /* ELP module wake up */
628 wl1271_fw_wakeup(wl
);
630 /* whal_FwCtrl_BootSm() */
632 /* 0. read chip id from CHIP_ID */
633 wl
->chip
.id
= wl1271_read32(wl
, CHIP_ID_B
);
635 /* 1. check if chip id is valid */
637 switch (wl
->chip
.id
) {
638 case CHIP_ID_1271_PG10
:
639 wl1271_warning("chip id 0x%x (1271 PG10) support is obsolete",
642 ret
= wl1271_setup(wl
);
646 case CHIP_ID_1271_PG20
:
647 wl1271_debug(DEBUG_BOOT
, "chip id 0x%x (1271 PG20)",
650 ret
= wl1271_setup(wl
);
655 wl1271_warning("unsupported chip id: 0x%x", wl
->chip
.id
);
660 if (wl
->fw
== NULL
) {
661 ret
= wl1271_fetch_firmware(wl
);
666 /* No NVS from netlink, try to get it from the filesystem */
667 if (wl
->nvs
== NULL
) {
668 ret
= wl1271_fetch_nvs(wl
);
677 int wl1271_plt_start(struct wl1271
*wl
)
679 int retries
= WL1271_BOOT_RETRIES
;
682 mutex_lock(&wl
->mutex
);
684 wl1271_notice("power up");
686 if (wl
->state
!= WL1271_STATE_OFF
) {
687 wl1271_error("cannot go into PLT state because not "
688 "in off state: %d", wl
->state
);
695 ret
= wl1271_chip_wakeup(wl
);
699 ret
= wl1271_boot(wl
);
703 ret
= wl1271_plt_init(wl
);
707 wl
->state
= WL1271_STATE_PLT
;
708 wl1271_notice("firmware booted in PLT mode (%s)",
713 wl1271_disable_interrupts(wl
);
714 mutex_unlock(&wl
->mutex
);
715 /* Unlocking the mutex in the middle of handling is
716 inherently unsafe. In this case we deem it safe to do,
717 because we need to let any possibly pending IRQ out of
718 the system (and while we are WL1271_STATE_OFF the IRQ
719 work function will not do anything.) Also, any other
720 possible concurrent operations will fail due to the
721 current state, hence the wl1271 struct should be safe. */
722 cancel_work_sync(&wl
->irq_work
);
723 mutex_lock(&wl
->mutex
);
725 wl1271_power_off(wl
);
728 wl1271_error("firmware boot in PLT mode failed despite %d retries",
729 WL1271_BOOT_RETRIES
);
731 mutex_unlock(&wl
->mutex
);
736 int wl1271_plt_stop(struct wl1271
*wl
)
740 mutex_lock(&wl
->mutex
);
742 wl1271_notice("power down");
744 if (wl
->state
!= WL1271_STATE_PLT
) {
745 wl1271_error("cannot power down because not in PLT "
746 "state: %d", wl
->state
);
751 wl1271_disable_interrupts(wl
);
752 wl1271_power_off(wl
);
754 wl
->state
= WL1271_STATE_OFF
;
758 mutex_unlock(&wl
->mutex
);
764 static int wl1271_op_tx(struct ieee80211_hw
*hw
, struct sk_buff
*skb
)
766 struct wl1271
*wl
= hw
->priv
;
767 struct ieee80211_conf
*conf
= &hw
->conf
;
768 struct ieee80211_tx_info
*txinfo
= IEEE80211_SKB_CB(skb
);
769 struct ieee80211_sta
*sta
= txinfo
->control
.sta
;
772 /* peek into the rates configured in the STA entry */
773 spin_lock_irqsave(&wl
->wl_lock
, flags
);
774 if (sta
&& sta
->supp_rates
[conf
->channel
->band
] != wl
->sta_rate_set
) {
775 wl
->sta_rate_set
= sta
->supp_rates
[conf
->channel
->band
];
776 set_bit(WL1271_FLAG_STA_RATES_CHANGED
, &wl
->flags
);
778 spin_unlock_irqrestore(&wl
->wl_lock
, flags
);
780 /* queue the packet */
781 skb_queue_tail(&wl
->tx_queue
, skb
);
784 * The chip specific setup must run before the first TX packet -
785 * before that, the tx_work will not be initialized!
788 ieee80211_queue_work(wl
->hw
, &wl
->tx_work
);
791 * The workqueue is slow to process the tx_queue and we need stop
792 * the queue here, otherwise the queue will get too long.
794 if (skb_queue_len(&wl
->tx_queue
) >= WL1271_TX_QUEUE_MAX_LENGTH
) {
795 ieee80211_stop_queues(wl
->hw
);
798 * FIXME: this is racy, the variable is not properly
799 * protected. Maybe fix this by removing the stupid
800 * variable altogether and checking the real queue state?
802 set_bit(WL1271_FLAG_TX_QUEUE_STOPPED
, &wl
->flags
);
808 static int wl1271_dev_notify(struct notifier_block
*me
, unsigned long what
,
811 struct net_device
*dev
;
812 struct wireless_dev
*wdev
;
814 struct ieee80211_hw
*hw
;
816 struct wl1271
*wl_temp
;
817 struct in_device
*idev
;
818 struct in_ifaddr
*ifa
= arg
;
821 /* FIXME: this ugly function should probably be implemented in the
822 * mac80211, and here should only be a simple callback handling actual
823 * setting of the filters. Now we need to dig up references to
824 * various structures to gain access to what we need.
825 * Also, because of this, there is no "initial" setting of the filter
826 * in "op_start", because we don't want to dig up struct net_device
827 * there - the filter will be set upon first change of the interface
830 dev
= ifa
->ifa_dev
->dev
;
832 wdev
= dev
->ieee80211_ptr
;
840 hw
= wiphy_priv(wiphy
);
844 /* Check that the interface is one supported by this driver. */
846 list_for_each_entry(wl
, &wl_list
, list
) {
853 /* Get the interface IP address for the device. "ifa" will become
855 - there is no IPV4 protocol address configured
856 - there are multiple (virtual) IPV4 addresses configured
857 When "ifa" is NULL, filtering will be disabled.
862 ifa
= idev
->ifa_list
;
864 if (ifa
&& ifa
->ifa_next
)
867 mutex_lock(&wl
->mutex
);
869 if (wl
->state
== WL1271_STATE_OFF
)
872 ret
= wl1271_ps_elp_wakeup(wl
, false);
876 ret
= wl1271_acx_arp_ip_filter(wl
, true,
877 (u8
*)&ifa
->ifa_address
,
880 ret
= wl1271_acx_arp_ip_filter(wl
, false, NULL
,
882 wl1271_ps_elp_sleep(wl
);
885 mutex_unlock(&wl
->mutex
);
890 static struct notifier_block wl1271_dev_notifier
= {
891 .notifier_call
= wl1271_dev_notify
,
895 static int wl1271_op_start(struct ieee80211_hw
*hw
)
897 struct wl1271
*wl
= hw
->priv
;
898 int retries
= WL1271_BOOT_RETRIES
;
901 wl1271_debug(DEBUG_MAC80211
, "mac80211 start");
903 mutex_lock(&wl
->mutex
);
905 if (wl
->state
!= WL1271_STATE_OFF
) {
906 wl1271_error("cannot start because not in off state: %d",
914 ret
= wl1271_chip_wakeup(wl
);
918 ret
= wl1271_boot(wl
);
922 ret
= wl1271_hw_init(wl
);
926 wl
->state
= WL1271_STATE_ON
;
927 wl1271_info("firmware booted (%s)", wl
->chip
.fw_ver
);
931 wl1271_disable_interrupts(wl
);
932 mutex_unlock(&wl
->mutex
);
933 /* Unlocking the mutex in the middle of handling is
934 inherently unsafe. In this case we deem it safe to do,
935 because we need to let any possibly pending IRQ out of
936 the system (and while we are WL1271_STATE_OFF the IRQ
937 work function will not do anything.) Also, any other
938 possible concurrent operations will fail due to the
939 current state, hence the wl1271 struct should be safe. */
940 cancel_work_sync(&wl
->irq_work
);
941 mutex_lock(&wl
->mutex
);
943 wl1271_power_off(wl
);
946 wl1271_error("firmware boot failed despite %d retries",
947 WL1271_BOOT_RETRIES
);
949 mutex_unlock(&wl
->mutex
);
952 list_add(&wl
->list
, &wl_list
);
953 register_inetaddr_notifier(&wl1271_dev_notifier
);
959 static void wl1271_op_stop(struct ieee80211_hw
*hw
)
961 struct wl1271
*wl
= hw
->priv
;
966 wl1271_debug(DEBUG_MAC80211
, "mac80211 stop");
968 unregister_inetaddr_notifier(&wl1271_dev_notifier
);
971 mutex_lock(&wl
->mutex
);
973 WARN_ON(wl
->state
!= WL1271_STATE_ON
);
975 if (test_and_clear_bit(WL1271_FLAG_SCANNING
, &wl
->flags
)) {
976 mutex_unlock(&wl
->mutex
);
977 ieee80211_scan_completed(wl
->hw
, true);
978 mutex_lock(&wl
->mutex
);
981 wl
->state
= WL1271_STATE_OFF
;
983 wl1271_disable_interrupts(wl
);
985 mutex_unlock(&wl
->mutex
);
987 cancel_work_sync(&wl
->irq_work
);
988 cancel_work_sync(&wl
->tx_work
);
990 mutex_lock(&wl
->mutex
);
992 /* let's notify MAC80211 about the remaining pending TX frames */
994 wl1271_power_off(wl
);
996 memset(wl
->bssid
, 0, ETH_ALEN
);
997 memset(wl
->ssid
, 0, IW_ESSID_MAX_SIZE
+ 1);
999 wl
->bss_type
= MAX_BSS_TYPE
;
1000 wl
->band
= IEEE80211_BAND_2GHZ
;
1003 wl
->psm_entry_retry
= 0;
1004 wl
->power_level
= WL1271_DEFAULT_POWER_LEVEL
;
1005 wl
->tx_blocks_available
= 0;
1006 wl
->tx_results_count
= 0;
1007 wl
->tx_packets_count
= 0;
1008 wl
->tx_security_last_seq
= 0;
1009 wl
->tx_security_seq_16
= 0;
1010 wl
->tx_security_seq_32
= 0;
1011 wl
->time_offset
= 0;
1012 wl
->session_counter
= 0;
1013 wl
->rate_set
= CONF_TX_RATE_MASK_BASIC
;
1014 wl
->sta_rate_set
= 0;
1017 for (i
= 0; i
< NUM_TX_QUEUES
; i
++)
1018 wl
->tx_blocks_freed
[i
] = 0;
1020 wl1271_debugfs_reset(wl
);
1021 mutex_unlock(&wl
->mutex
);
1024 static int wl1271_op_add_interface(struct ieee80211_hw
*hw
,
1025 struct ieee80211_vif
*vif
)
1027 struct wl1271
*wl
= hw
->priv
;
1030 wl1271_debug(DEBUG_MAC80211
, "mac80211 add interface type %d mac %pM",
1031 vif
->type
, vif
->addr
);
1033 mutex_lock(&wl
->mutex
);
1041 switch (vif
->type
) {
1042 case NL80211_IFTYPE_STATION
:
1043 wl
->bss_type
= BSS_TYPE_STA_BSS
;
1045 case NL80211_IFTYPE_ADHOC
:
1046 wl
->bss_type
= BSS_TYPE_IBSS
;
1053 /* FIXME: what if conf->mac_addr changes? */
1056 mutex_unlock(&wl
->mutex
);
1060 static void wl1271_op_remove_interface(struct ieee80211_hw
*hw
,
1061 struct ieee80211_vif
*vif
)
1063 struct wl1271
*wl
= hw
->priv
;
1065 mutex_lock(&wl
->mutex
);
1066 wl1271_debug(DEBUG_MAC80211
, "mac80211 remove interface");
1068 mutex_unlock(&wl
->mutex
);
1072 static int wl1271_op_config_interface(struct ieee80211_hw
*hw
,
1073 struct ieee80211_vif
*vif
,
1074 struct ieee80211_if_conf
*conf
)
1076 struct wl1271
*wl
= hw
->priv
;
1077 struct sk_buff
*beacon
;
1080 wl1271_debug(DEBUG_MAC80211
, "mac80211 config_interface bssid %pM",
1082 wl1271_dump_ascii(DEBUG_MAC80211
, "ssid: ", conf
->ssid
,
1085 mutex_lock(&wl
->mutex
);
1087 ret
= wl1271_ps_elp_wakeup(wl
, false);
1091 if (memcmp(wl
->bssid
, conf
->bssid
, ETH_ALEN
)) {
1092 wl1271_debug(DEBUG_MAC80211
, "bssid changed");
1094 memcpy(wl
->bssid
, conf
->bssid
, ETH_ALEN
);
1096 ret
= wl1271_cmd_join(wl
);
1100 ret
= wl1271_cmd_build_null_data(wl
);
1105 wl
->ssid_len
= conf
->ssid_len
;
1107 memcpy(wl
->ssid
, conf
->ssid
, wl
->ssid_len
);
1109 if (conf
->changed
& IEEE80211_IFCC_BEACON
) {
1110 beacon
= ieee80211_beacon_get(hw
, vif
);
1111 ret
= wl1271_cmd_template_set(wl
, CMD_TEMPL_BEACON
,
1112 beacon
->data
, beacon
->len
);
1115 dev_kfree_skb(beacon
);
1119 ret
= wl1271_cmd_template_set(wl
, CMD_TEMPL_PROBE_RESPONSE
,
1120 beacon
->data
, beacon
->len
);
1122 dev_kfree_skb(beacon
);
1129 wl1271_ps_elp_sleep(wl
);
1132 mutex_unlock(&wl
->mutex
);
1138 static int wl1271_join_channel(struct wl1271
*wl
, int channel
)
1141 /* we need to use a dummy BSSID for now */
1142 static const u8 dummy_bssid
[ETH_ALEN
] = { 0x0b, 0xad, 0xde,
1145 /* the dummy join is not required for ad-hoc */
1146 if (wl
->bss_type
== BSS_TYPE_IBSS
)
1149 /* disable mac filter, so we hear everything */
1150 wl
->rx_config
&= ~CFG_BSSID_FILTER_EN
;
1152 wl
->channel
= channel
;
1153 memcpy(wl
->bssid
, dummy_bssid
, ETH_ALEN
);
1155 ret
= wl1271_cmd_join(wl
);
1159 set_bit(WL1271_FLAG_JOINED
, &wl
->flags
);
1165 static int wl1271_unjoin_channel(struct wl1271
*wl
)
1169 /* to stop listening to a channel, we disconnect */
1170 ret
= wl1271_cmd_disconnect(wl
);
1174 clear_bit(WL1271_FLAG_JOINED
, &wl
->flags
);
1176 memset(wl
->bssid
, 0, ETH_ALEN
);
1177 wl
->rx_config
= WL1271_DEFAULT_RX_CONFIG
;
1183 static int wl1271_op_config(struct ieee80211_hw
*hw
, u32 changed
)
1185 struct wl1271
*wl
= hw
->priv
;
1186 struct ieee80211_conf
*conf
= &hw
->conf
;
1187 int channel
, ret
= 0;
1189 channel
= ieee80211_frequency_to_channel(conf
->channel
->center_freq
);
1191 wl1271_debug(DEBUG_MAC80211
, "mac80211 config ch %d psm %s power %d %s",
1193 conf
->flags
& IEEE80211_CONF_PS
? "on" : "off",
1195 conf
->flags
& IEEE80211_CONF_IDLE
? "idle" : "in use");
1197 mutex_lock(&wl
->mutex
);
1199 wl
->band
= conf
->channel
->band
;
1201 ret
= wl1271_ps_elp_wakeup(wl
, false);
1205 if (changed
& IEEE80211_CONF_CHANGE_IDLE
) {
1206 if (conf
->flags
& IEEE80211_CONF_IDLE
&&
1207 test_bit(WL1271_FLAG_JOINED
, &wl
->flags
))
1208 wl1271_unjoin_channel(wl
);
1209 else if (!(conf
->flags
& IEEE80211_CONF_IDLE
))
1210 wl1271_join_channel(wl
, channel
);
1212 if (conf
->flags
& IEEE80211_CONF_IDLE
) {
1213 wl
->rate_set
= CONF_TX_RATE_MASK_BASIC
;
1214 wl
->sta_rate_set
= 0;
1215 wl1271_acx_rate_policies(wl
);
1219 /* if the channel changes while joined, join again */
1220 if (channel
!= wl
->channel
&&
1221 test_bit(WL1271_FLAG_JOINED
, &wl
->flags
)) {
1222 wl
->channel
= channel
;
1223 /* FIXME: maybe use CMD_CHANNEL_SWITCH for this? */
1224 ret
= wl1271_cmd_join(wl
);
1226 wl1271_warning("cmd join to update channel failed %d",
1229 wl
->channel
= channel
;
1231 if (conf
->flags
& IEEE80211_CONF_PS
&&
1232 !test_bit(WL1271_FLAG_PSM_REQUESTED
, &wl
->flags
)) {
1233 set_bit(WL1271_FLAG_PSM_REQUESTED
, &wl
->flags
);
1236 * We enter PSM only if we're already associated.
1237 * If we're not, we'll enter it when joining an SSID,
1238 * through the bss_info_changed() hook.
1240 if (test_bit(WL1271_FLAG_STA_ASSOCIATED
, &wl
->flags
)) {
1241 wl1271_info("psm enabled");
1242 ret
= wl1271_ps_set_mode(wl
, STATION_POWER_SAVE_MODE
,
1245 } else if (!(conf
->flags
& IEEE80211_CONF_PS
) &&
1246 test_bit(WL1271_FLAG_PSM_REQUESTED
, &wl
->flags
)) {
1247 wl1271_info("psm disabled");
1249 clear_bit(WL1271_FLAG_PSM_REQUESTED
, &wl
->flags
);
1251 if (test_bit(WL1271_FLAG_PSM
, &wl
->flags
))
1252 ret
= wl1271_ps_set_mode(wl
, STATION_ACTIVE_MODE
,
1256 if (conf
->power_level
!= wl
->power_level
) {
1257 ret
= wl1271_acx_tx_power(wl
, conf
->power_level
);
1261 wl
->power_level
= conf
->power_level
;
1265 wl1271_ps_elp_sleep(wl
);
1268 mutex_unlock(&wl
->mutex
);
1273 struct wl1271_filter_params
{
1276 u8 mc_list
[ACX_MC_ADDRESS_GROUP_MAX
][ETH_ALEN
];
1279 static u64
wl1271_op_prepare_multicast(struct ieee80211_hw
*hw
, int mc_count
,
1280 struct dev_addr_list
*mc_list
)
1282 struct wl1271_filter_params
*fp
;
1285 fp
= kzalloc(sizeof(*fp
), GFP_ATOMIC
);
1287 wl1271_error("Out of memory setting filters.");
1291 /* update multicast filtering parameters */
1293 if (mc_count
> ACX_MC_ADDRESS_GROUP_MAX
) {
1295 fp
->enabled
= false;
1298 fp
->mc_list_length
= 0;
1299 for (i
= 0; i
< mc_count
; i
++) {
1300 if (mc_list
->da_addrlen
== ETH_ALEN
) {
1301 memcpy(fp
->mc_list
[fp
->mc_list_length
],
1302 mc_list
->da_addr
, ETH_ALEN
);
1303 fp
->mc_list_length
++;
1305 wl1271_warning("Unknown mc address length.");
1306 mc_list
= mc_list
->next
;
1309 return (u64
)(unsigned long)fp
;
1312 #define WL1271_SUPPORTED_FILTERS (FIF_PROMISC_IN_BSS | \
1315 FIF_BCN_PRBRESP_PROMISC | \
1319 static void wl1271_op_configure_filter(struct ieee80211_hw
*hw
,
1320 unsigned int changed
,
1321 unsigned int *total
, u64 multicast
)
1323 struct wl1271_filter_params
*fp
= (void *)(unsigned long)multicast
;
1324 struct wl1271
*wl
= hw
->priv
;
1327 wl1271_debug(DEBUG_MAC80211
, "mac80211 configure filter");
1329 mutex_lock(&wl
->mutex
);
1331 if (wl
->state
== WL1271_STATE_OFF
)
1334 ret
= wl1271_ps_elp_wakeup(wl
, false);
1338 *total
&= WL1271_SUPPORTED_FILTERS
;
1339 changed
&= WL1271_SUPPORTED_FILTERS
;
1341 if (*total
& FIF_ALLMULTI
)
1342 ret
= wl1271_acx_group_address_tbl(wl
, false, NULL
, 0);
1344 ret
= wl1271_acx_group_address_tbl(wl
, fp
->enabled
,
1346 fp
->mc_list_length
);
1352 /* FIXME: We still need to set our filters properly */
1354 /* determine, whether supported filter values have changed */
1358 /* apply configured filters */
1359 ret
= wl1271_acx_rx_config(wl
, wl
->rx_config
, wl
->rx_filter
);
1364 wl1271_ps_elp_sleep(wl
);
1367 mutex_unlock(&wl
->mutex
);
1370 static int wl1271_op_set_key(struct ieee80211_hw
*hw
, enum set_key_cmd cmd
,
1371 struct ieee80211_vif
*vif
,
1372 struct ieee80211_sta
*sta
,
1373 struct ieee80211_key_conf
*key_conf
)
1375 struct wl1271
*wl
= hw
->priv
;
1382 static const u8 bcast_addr
[ETH_ALEN
] =
1383 { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
1385 wl1271_debug(DEBUG_MAC80211
, "mac80211 set key");
1387 addr
= sta
? sta
->addr
: bcast_addr
;
1389 wl1271_debug(DEBUG_CRYPT
, "CMD: 0x%x", cmd
);
1390 wl1271_dump(DEBUG_CRYPT
, "ADDR: ", addr
, ETH_ALEN
);
1391 wl1271_debug(DEBUG_CRYPT
, "Key: algo:0x%x, id:%d, len:%d flags 0x%x",
1392 key_conf
->alg
, key_conf
->keyidx
,
1393 key_conf
->keylen
, key_conf
->flags
);
1394 wl1271_dump(DEBUG_CRYPT
, "KEY: ", key_conf
->key
, key_conf
->keylen
);
1396 if (is_zero_ether_addr(addr
)) {
1397 /* We dont support TX only encryption */
1402 mutex_lock(&wl
->mutex
);
1404 ret
= wl1271_ps_elp_wakeup(wl
, false);
1408 switch (key_conf
->alg
) {
1412 key_conf
->hw_key_idx
= key_conf
->keyidx
;
1415 key_type
= KEY_TKIP
;
1417 key_conf
->hw_key_idx
= key_conf
->keyidx
;
1418 tx_seq_32
= wl
->tx_security_seq_32
;
1419 tx_seq_16
= wl
->tx_security_seq_16
;
1424 key_conf
->flags
|= IEEE80211_KEY_FLAG_GENERATE_IV
;
1425 tx_seq_32
= wl
->tx_security_seq_32
;
1426 tx_seq_16
= wl
->tx_security_seq_16
;
1429 wl1271_error("Unknown key algo 0x%x", key_conf
->alg
);
1437 ret
= wl1271_cmd_set_key(wl
, KEY_ADD_OR_REPLACE
,
1438 key_conf
->keyidx
, key_type
,
1439 key_conf
->keylen
, key_conf
->key
,
1440 addr
, tx_seq_32
, tx_seq_16
);
1442 wl1271_error("Could not add or replace key");
1446 /* the default WEP key needs to be configured at least once */
1447 if (key_type
== KEY_WEP
) {
1448 ret
= wl1271_cmd_set_default_wep_key(wl
,
1456 /* The wl1271 does not allow to remove unicast keys - they
1457 will be cleared automatically on next CMD_JOIN. Ignore the
1458 request silently, as we dont want the mac80211 to emit
1459 an error message. */
1460 if (!is_broadcast_ether_addr(addr
))
1463 ret
= wl1271_cmd_set_key(wl
, KEY_REMOVE
,
1464 key_conf
->keyidx
, key_type
,
1465 key_conf
->keylen
, key_conf
->key
,
1468 wl1271_error("Could not remove key");
1474 wl1271_error("Unsupported key cmd 0x%x", cmd
);
1482 wl1271_ps_elp_sleep(wl
);
1485 mutex_unlock(&wl
->mutex
);
1491 static int wl1271_op_hw_scan(struct ieee80211_hw
*hw
,
1492 struct cfg80211_scan_request
*req
)
1494 struct wl1271
*wl
= hw
->priv
;
1499 wl1271_debug(DEBUG_MAC80211
, "mac80211 hw scan");
1502 ssid
= req
->ssids
[0].ssid
;
1503 len
= req
->ssids
[0].ssid_len
;
1506 mutex_lock(&wl
->mutex
);
1508 ret
= wl1271_ps_elp_wakeup(wl
, false);
1512 if (wl1271_11a_enabled())
1513 ret
= wl1271_cmd_scan(hw
->priv
, ssid
, len
, 1, 0,
1514 WL1271_SCAN_BAND_DUAL
, 3);
1516 ret
= wl1271_cmd_scan(hw
->priv
, ssid
, len
, 1, 0,
1517 WL1271_SCAN_BAND_2_4_GHZ
, 3);
1519 wl1271_ps_elp_sleep(wl
);
1522 mutex_unlock(&wl
->mutex
);
1527 static int wl1271_op_set_rts_threshold(struct ieee80211_hw
*hw
, u32 value
)
1529 struct wl1271
*wl
= hw
->priv
;
1532 mutex_lock(&wl
->mutex
);
1534 ret
= wl1271_ps_elp_wakeup(wl
, false);
1538 ret
= wl1271_acx_rts_threshold(wl
, (u16
) value
);
1540 wl1271_warning("wl1271_op_set_rts_threshold failed: %d", ret
);
1542 wl1271_ps_elp_sleep(wl
);
1545 mutex_unlock(&wl
->mutex
);
1550 static void wl1271_ssid_set(struct wl1271
*wl
, struct sk_buff
*beacon
)
1552 u8
*ptr
= beacon
->data
+
1553 offsetof(struct ieee80211_mgmt
, u
.beacon
.variable
);
1555 /* find the location of the ssid in the beacon */
1556 while (ptr
< beacon
->data
+ beacon
->len
) {
1557 if (ptr
[0] == WLAN_EID_SSID
) {
1558 wl
->ssid_len
= ptr
[1];
1559 memcpy(wl
->ssid
, ptr
+2, wl
->ssid_len
);
1564 wl1271_error("ad-hoc beacon template has no SSID!\n");
1567 static void wl1271_op_bss_info_changed(struct ieee80211_hw
*hw
,
1568 struct ieee80211_vif
*vif
,
1569 struct ieee80211_bss_conf
*bss_conf
,
1572 enum wl1271_cmd_ps_mode mode
;
1573 struct wl1271
*wl
= hw
->priv
;
1574 bool do_join
= false;
1577 wl1271_debug(DEBUG_MAC80211
, "mac80211 bss info changed");
1579 mutex_lock(&wl
->mutex
);
1581 ret
= wl1271_ps_elp_wakeup(wl
, false);
1585 if (wl
->bss_type
== BSS_TYPE_IBSS
) {
1586 /* FIXME: This implements rudimentary ad-hoc support -
1587 proper templates are on the wish list and notification
1588 on when they change. This patch will update the templates
1589 on every call to this function. */
1590 struct sk_buff
*beacon
= ieee80211_beacon_get(hw
, vif
);
1593 struct ieee80211_hdr
*hdr
;
1595 wl1271_ssid_set(wl
, beacon
);
1596 ret
= wl1271_cmd_template_set(wl
, CMD_TEMPL_BEACON
,
1601 dev_kfree_skb(beacon
);
1605 hdr
= (struct ieee80211_hdr
*) beacon
->data
;
1606 hdr
->frame_control
= cpu_to_le16(
1607 IEEE80211_FTYPE_MGMT
|
1608 IEEE80211_STYPE_PROBE_RESP
);
1610 ret
= wl1271_cmd_template_set(wl
,
1611 CMD_TEMPL_PROBE_RESPONSE
,
1614 dev_kfree_skb(beacon
);
1618 /* Need to update the SSID (for filtering etc) */
1623 if ((changed
& BSS_CHANGED_BSSID
) &&
1625 * Now we know the correct bssid, so we send a new join command
1626 * and enable the BSSID filter
1628 memcmp(wl
->bssid
, bss_conf
->bssid
, ETH_ALEN
)) {
1629 wl
->rx_config
|= CFG_BSSID_FILTER_EN
;
1630 memcpy(wl
->bssid
, bss_conf
->bssid
, ETH_ALEN
);
1631 ret
= wl1271_cmd_build_null_data(wl
);
1633 wl1271_warning("cmd buld null data failed %d",
1638 /* Need to update the BSSID (for filtering etc) */
1642 if (changed
& BSS_CHANGED_ASSOC
) {
1643 if (bss_conf
->assoc
) {
1644 wl
->aid
= bss_conf
->aid
;
1645 set_bit(WL1271_FLAG_STA_ASSOCIATED
, &wl
->flags
);
1648 * with wl1271, we don't need to update the
1649 * beacon_int and dtim_period, because the firmware
1650 * updates it by itself when the first beacon is
1651 * received after a join.
1653 ret
= wl1271_cmd_build_ps_poll(wl
, wl
->aid
);
1657 ret
= wl1271_acx_aid(wl
, wl
->aid
);
1661 /* If we want to go in PSM but we're not there yet */
1662 if (test_bit(WL1271_FLAG_PSM_REQUESTED
, &wl
->flags
) &&
1663 !test_bit(WL1271_FLAG_PSM
, &wl
->flags
)) {
1664 mode
= STATION_POWER_SAVE_MODE
;
1665 ret
= wl1271_ps_set_mode(wl
, mode
, true);
1670 /* use defaults when not associated */
1671 clear_bit(WL1271_FLAG_STA_ASSOCIATED
, &wl
->flags
);
1677 if (changed
& BSS_CHANGED_ERP_SLOT
) {
1678 if (bss_conf
->use_short_slot
)
1679 ret
= wl1271_acx_slot(wl
, SLOT_TIME_SHORT
);
1681 ret
= wl1271_acx_slot(wl
, SLOT_TIME_LONG
);
1683 wl1271_warning("Set slot time failed %d", ret
);
1688 if (changed
& BSS_CHANGED_ERP_PREAMBLE
) {
1689 if (bss_conf
->use_short_preamble
)
1690 wl1271_acx_set_preamble(wl
, ACX_PREAMBLE_SHORT
);
1692 wl1271_acx_set_preamble(wl
, ACX_PREAMBLE_LONG
);
1695 if (changed
& BSS_CHANGED_ERP_CTS_PROT
) {
1696 if (bss_conf
->use_cts_prot
)
1697 ret
= wl1271_acx_cts_protect(wl
, CTSPROTECT_ENABLE
);
1699 ret
= wl1271_acx_cts_protect(wl
, CTSPROTECT_DISABLE
);
1701 wl1271_warning("Set ctsprotect failed %d", ret
);
1707 ret
= wl1271_cmd_join(wl
);
1709 wl1271_warning("cmd join failed %d", ret
);
1712 set_bit(WL1271_FLAG_JOINED
, &wl
->flags
);
1716 wl1271_ps_elp_sleep(wl
);
1719 mutex_unlock(&wl
->mutex
);
1722 static int wl1271_op_conf_tx(struct ieee80211_hw
*hw
, u16 queue
,
1723 const struct ieee80211_tx_queue_params
*params
)
1725 struct wl1271
*wl
= hw
->priv
;
1728 mutex_lock(&wl
->mutex
);
1730 wl1271_debug(DEBUG_MAC80211
, "mac80211 conf tx %d", queue
);
1732 ret
= wl1271_ps_elp_wakeup(wl
, false);
1736 ret
= wl1271_acx_ac_cfg(wl
, wl1271_tx_get_queue(queue
),
1737 params
->cw_min
, params
->cw_max
,
1738 params
->aifs
, params
->txop
);
1742 ret
= wl1271_acx_tid_cfg(wl
, wl1271_tx_get_queue(queue
),
1743 CONF_CHANNEL_TYPE_EDCF
,
1744 wl1271_tx_get_queue(queue
),
1745 CONF_PS_SCHEME_LEGACY_PSPOLL
,
1746 CONF_ACK_POLICY_LEGACY
, 0, 0);
1751 wl1271_ps_elp_sleep(wl
);
1754 mutex_unlock(&wl
->mutex
);
1760 /* can't be const, mac80211 writes to this */
1761 static struct ieee80211_rate wl1271_rates
[] = {
1763 .hw_value
= CONF_HW_BIT_RATE_1MBPS
,
1764 .hw_value_short
= CONF_HW_BIT_RATE_1MBPS
, },
1766 .hw_value
= CONF_HW_BIT_RATE_2MBPS
,
1767 .hw_value_short
= CONF_HW_BIT_RATE_2MBPS
,
1768 .flags
= IEEE80211_RATE_SHORT_PREAMBLE
},
1770 .hw_value
= CONF_HW_BIT_RATE_5_5MBPS
,
1771 .hw_value_short
= CONF_HW_BIT_RATE_5_5MBPS
,
1772 .flags
= IEEE80211_RATE_SHORT_PREAMBLE
},
1774 .hw_value
= CONF_HW_BIT_RATE_11MBPS
,
1775 .hw_value_short
= CONF_HW_BIT_RATE_11MBPS
,
1776 .flags
= IEEE80211_RATE_SHORT_PREAMBLE
},
1778 .hw_value
= CONF_HW_BIT_RATE_6MBPS
,
1779 .hw_value_short
= CONF_HW_BIT_RATE_6MBPS
, },
1781 .hw_value
= CONF_HW_BIT_RATE_9MBPS
,
1782 .hw_value_short
= CONF_HW_BIT_RATE_9MBPS
, },
1784 .hw_value
= CONF_HW_BIT_RATE_12MBPS
,
1785 .hw_value_short
= CONF_HW_BIT_RATE_12MBPS
, },
1787 .hw_value
= CONF_HW_BIT_RATE_18MBPS
,
1788 .hw_value_short
= CONF_HW_BIT_RATE_18MBPS
, },
1790 .hw_value
= CONF_HW_BIT_RATE_24MBPS
,
1791 .hw_value_short
= CONF_HW_BIT_RATE_24MBPS
, },
1793 .hw_value
= CONF_HW_BIT_RATE_36MBPS
,
1794 .hw_value_short
= CONF_HW_BIT_RATE_36MBPS
, },
1796 .hw_value
= CONF_HW_BIT_RATE_48MBPS
,
1797 .hw_value_short
= CONF_HW_BIT_RATE_48MBPS
, },
1799 .hw_value
= CONF_HW_BIT_RATE_54MBPS
,
1800 .hw_value_short
= CONF_HW_BIT_RATE_54MBPS
, },
1803 /* can't be const, mac80211 writes to this */
1804 static struct ieee80211_channel wl1271_channels
[] = {
1805 { .hw_value
= 1, .center_freq
= 2412, .max_power
= 25 },
1806 { .hw_value
= 2, .center_freq
= 2417, .max_power
= 25 },
1807 { .hw_value
= 3, .center_freq
= 2422, .max_power
= 25 },
1808 { .hw_value
= 4, .center_freq
= 2427, .max_power
= 25 },
1809 { .hw_value
= 5, .center_freq
= 2432, .max_power
= 25 },
1810 { .hw_value
= 6, .center_freq
= 2437, .max_power
= 25 },
1811 { .hw_value
= 7, .center_freq
= 2442, .max_power
= 25 },
1812 { .hw_value
= 8, .center_freq
= 2447, .max_power
= 25 },
1813 { .hw_value
= 9, .center_freq
= 2452, .max_power
= 25 },
1814 { .hw_value
= 10, .center_freq
= 2457, .max_power
= 25 },
1815 { .hw_value
= 11, .center_freq
= 2462, .max_power
= 25 },
1816 { .hw_value
= 12, .center_freq
= 2467, .max_power
= 25 },
1817 { .hw_value
= 13, .center_freq
= 2472, .max_power
= 25 },
1820 /* can't be const, mac80211 writes to this */
1821 static struct ieee80211_supported_band wl1271_band_2ghz
= {
1822 .channels
= wl1271_channels
,
1823 .n_channels
= ARRAY_SIZE(wl1271_channels
),
1824 .bitrates
= wl1271_rates
,
1825 .n_bitrates
= ARRAY_SIZE(wl1271_rates
),
1828 /* 5 GHz data rates for WL1273 */
1829 static struct ieee80211_rate wl1271_rates_5ghz
[] = {
1831 .hw_value
= CONF_HW_BIT_RATE_6MBPS
,
1832 .hw_value_short
= CONF_HW_BIT_RATE_6MBPS
, },
1834 .hw_value
= CONF_HW_BIT_RATE_9MBPS
,
1835 .hw_value_short
= CONF_HW_BIT_RATE_9MBPS
, },
1837 .hw_value
= CONF_HW_BIT_RATE_12MBPS
,
1838 .hw_value_short
= CONF_HW_BIT_RATE_12MBPS
, },
1840 .hw_value
= CONF_HW_BIT_RATE_18MBPS
,
1841 .hw_value_short
= CONF_HW_BIT_RATE_18MBPS
, },
1843 .hw_value
= CONF_HW_BIT_RATE_24MBPS
,
1844 .hw_value_short
= CONF_HW_BIT_RATE_24MBPS
, },
1846 .hw_value
= CONF_HW_BIT_RATE_36MBPS
,
1847 .hw_value_short
= CONF_HW_BIT_RATE_36MBPS
, },
1849 .hw_value
= CONF_HW_BIT_RATE_48MBPS
,
1850 .hw_value_short
= CONF_HW_BIT_RATE_48MBPS
, },
1852 .hw_value
= CONF_HW_BIT_RATE_54MBPS
,
1853 .hw_value_short
= CONF_HW_BIT_RATE_54MBPS
, },
1856 /* 5 GHz band channels for WL1273 */
1857 static struct ieee80211_channel wl1271_channels_5ghz
[] = {
1858 { .hw_value
= 183, .center_freq
= 4915},
1859 { .hw_value
= 184, .center_freq
= 4920},
1860 { .hw_value
= 185, .center_freq
= 4925},
1861 { .hw_value
= 187, .center_freq
= 4935},
1862 { .hw_value
= 188, .center_freq
= 4940},
1863 { .hw_value
= 189, .center_freq
= 4945},
1864 { .hw_value
= 192, .center_freq
= 4960},
1865 { .hw_value
= 196, .center_freq
= 4980},
1866 { .hw_value
= 7, .center_freq
= 5035},
1867 { .hw_value
= 8, .center_freq
= 5040},
1868 { .hw_value
= 9, .center_freq
= 5045},
1869 { .hw_value
= 11, .center_freq
= 5055},
1870 { .hw_value
= 12, .center_freq
= 5060},
1871 { .hw_value
= 16, .center_freq
= 5080},
1872 { .hw_value
= 34, .center_freq
= 5170},
1873 { .hw_value
= 36, .center_freq
= 5180},
1874 { .hw_value
= 38, .center_freq
= 5190},
1875 { .hw_value
= 40, .center_freq
= 5200},
1876 { .hw_value
= 42, .center_freq
= 5210},
1877 { .hw_value
= 44, .center_freq
= 5220},
1878 { .hw_value
= 46, .center_freq
= 5230},
1879 { .hw_value
= 48, .center_freq
= 5240},
1880 { .hw_value
= 52, .center_freq
= 5260},
1881 { .hw_value
= 56, .center_freq
= 5280},
1882 { .hw_value
= 60, .center_freq
= 5300},
1883 { .hw_value
= 64, .center_freq
= 5320},
1884 { .hw_value
= 100, .center_freq
= 5500},
1885 { .hw_value
= 104, .center_freq
= 5520},
1886 { .hw_value
= 108, .center_freq
= 5540},
1887 { .hw_value
= 112, .center_freq
= 5560},
1888 { .hw_value
= 116, .center_freq
= 5580},
1889 { .hw_value
= 120, .center_freq
= 5600},
1890 { .hw_value
= 124, .center_freq
= 5620},
1891 { .hw_value
= 128, .center_freq
= 5640},
1892 { .hw_value
= 132, .center_freq
= 5660},
1893 { .hw_value
= 136, .center_freq
= 5680},
1894 { .hw_value
= 140, .center_freq
= 5700},
1895 { .hw_value
= 149, .center_freq
= 5745},
1896 { .hw_value
= 153, .center_freq
= 5765},
1897 { .hw_value
= 157, .center_freq
= 5785},
1898 { .hw_value
= 161, .center_freq
= 5805},
1899 { .hw_value
= 165, .center_freq
= 5825},
1903 static struct ieee80211_supported_band wl1271_band_5ghz
= {
1904 .channels
= wl1271_channels_5ghz
,
1905 .n_channels
= ARRAY_SIZE(wl1271_channels_5ghz
),
1906 .bitrates
= wl1271_rates_5ghz
,
1907 .n_bitrates
= ARRAY_SIZE(wl1271_rates_5ghz
),
1910 static const struct ieee80211_ops wl1271_ops
= {
1911 .start
= wl1271_op_start
,
1912 .stop
= wl1271_op_stop
,
1913 .add_interface
= wl1271_op_add_interface
,
1914 .remove_interface
= wl1271_op_remove_interface
,
1915 .config
= wl1271_op_config
,
1916 /* .config_interface = wl1271_op_config_interface, */
1917 .prepare_multicast
= wl1271_op_prepare_multicast
,
1918 .configure_filter
= wl1271_op_configure_filter
,
1920 .set_key
= wl1271_op_set_key
,
1921 .hw_scan
= wl1271_op_hw_scan
,
1922 .bss_info_changed
= wl1271_op_bss_info_changed
,
1923 .set_rts_threshold
= wl1271_op_set_rts_threshold
,
1924 .conf_tx
= wl1271_op_conf_tx
,
1925 CFG80211_TESTMODE_CMD(wl1271_tm_cmd
)
1928 int wl1271_register_hw(struct wl1271
*wl
)
1932 if (wl
->mac80211_registered
)
1935 SET_IEEE80211_PERM_ADDR(wl
->hw
, wl
->mac_addr
);
1937 ret
= ieee80211_register_hw(wl
->hw
);
1939 wl1271_error("unable to register mac80211 hw: %d", ret
);
1943 wl
->mac80211_registered
= true;
1945 wl1271_notice("loaded");
1949 EXPORT_SYMBOL_GPL(wl1271_register_hw
);
1951 int wl1271_init_ieee80211(struct wl1271
*wl
)
1953 /* The tx descriptor buffer and the TKIP space. */
1954 wl
->hw
->extra_tx_headroom
= WL1271_TKIP_IV_SPACE
+
1955 sizeof(struct wl1271_tx_hw_descr
);
1958 /* FIXME: find a proper value */
1959 wl
->hw
->channel_change_time
= 10000;
1961 wl
->hw
->flags
= IEEE80211_HW_SIGNAL_DBM
|
1962 IEEE80211_HW_NOISE_DBM
|
1963 IEEE80211_HW_BEACON_FILTER
|
1964 IEEE80211_HW_SUPPORTS_PS
;
1966 wl
->hw
->wiphy
->interface_modes
= BIT(NL80211_IFTYPE_STATION
) |
1967 BIT(NL80211_IFTYPE_ADHOC
);
1968 wl
->hw
->wiphy
->max_scan_ssids
= 1;
1969 wl
->hw
->wiphy
->bands
[IEEE80211_BAND_2GHZ
] = &wl1271_band_2ghz
;
1971 if (wl1271_11a_enabled())
1972 wl
->hw
->wiphy
->bands
[IEEE80211_BAND_5GHZ
] = &wl1271_band_5ghz
;
1974 SET_IEEE80211_DEV(wl
->hw
, wl1271_wl_to_dev(wl
));
1978 EXPORT_SYMBOL_GPL(wl1271_init_ieee80211
);
1980 #define WL1271_DEFAULT_CHANNEL 0
1982 struct ieee80211_hw
*wl1271_alloc_hw(void)
1984 struct ieee80211_hw
*hw
;
1988 hw
= ieee80211_alloc_hw(sizeof(*wl
), &wl1271_ops
);
1990 wl1271_error("could not alloc ieee80211_hw");
1991 return ERR_PTR(-ENOMEM
);
1995 memset(wl
, 0, sizeof(*wl
));
1997 INIT_LIST_HEAD(&wl
->list
);
2001 skb_queue_head_init(&wl
->tx_queue
);
2003 INIT_DELAYED_WORK(&wl
->elp_work
, wl1271_elp_work
);
2004 wl
->channel
= WL1271_DEFAULT_CHANNEL
;
2005 wl
->default_key
= 0;
2007 wl
->rx_config
= WL1271_DEFAULT_RX_CONFIG
;
2008 wl
->rx_filter
= WL1271_DEFAULT_RX_FILTER
;
2009 wl
->psm_entry_retry
= 0;
2010 wl
->power_level
= WL1271_DEFAULT_POWER_LEVEL
;
2011 wl
->basic_rate_set
= CONF_TX_RATE_MASK_BASIC
;
2012 wl
->rate_set
= CONF_TX_RATE_MASK_BASIC
;
2013 wl
->sta_rate_set
= 0;
2014 wl
->band
= IEEE80211_BAND_2GHZ
;
2018 for (i
= 0; i
< ACX_TX_DESCRIPTORS
; i
++)
2019 wl
->tx_frames
[i
] = NULL
;
2021 spin_lock_init(&wl
->wl_lock
);
2023 wl
->state
= WL1271_STATE_OFF
;
2024 mutex_init(&wl
->mutex
);
2026 /* Apply default driver configuration. */
2027 wl1271_conf_init(wl
);
2029 wl1271_debugfs_init(wl
);
2033 EXPORT_SYMBOL_GPL(wl1271_alloc_hw
);
2035 int wl1271_free_hw(struct wl1271
*wl
)
2037 ieee80211_unregister_hw(wl
->hw
);
2039 wl1271_debugfs_exit(wl
);
2041 kfree(wl
->target_mem_map
);
2047 kfree(wl
->fw_status
);
2048 kfree(wl
->tx_res_if
);
2050 ieee80211_free_hw(wl
->hw
);
2054 EXPORT_SYMBOL_GPL(wl1271_free_hw
);
2056 MODULE_LICENSE("GPL");
2057 MODULE_AUTHOR("Luciano Coelho <luciano.coelho@nokia.com>");
2058 MODULE_AUTHOR("Juuso Oikarinen <juuso.oikarinen@nokia.com>");