2 * This file is part of wl1271
4 * Copyright (C) 2009-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/platform_device.h>
26 #include <linux/spi/spi.h>
27 #include <linux/etherdevice.h>
28 #include <linux/ieee80211.h>
29 #include <linux/slab.h>
35 #include "wl12xx_80211.h"
40 #define WL1271_CMD_FAST_POLL_COUNT 50
43 * send command to firmware
47 * @buf: buffer containing the command, must work with dma
48 * @len: length of the buffer
50 int wl1271_cmd_send(struct wl1271
*wl
, u16 id
, void *buf
, size_t len
,
53 struct wl1271_cmd_header
*cmd
;
54 unsigned long timeout
;
61 cmd
->id
= cpu_to_le16(id
);
64 WARN_ON(len
% 4 != 0);
65 WARN_ON(test_bit(WL1271_FLAG_IN_ELP
, &wl
->flags
));
67 wl1271_write(wl
, wl
->cmd_box_addr
, buf
, len
, false);
69 wl1271_write32(wl
, ACX_REG_INTERRUPT_TRIG
, INTR_TRIG_CMD
);
71 timeout
= jiffies
+ msecs_to_jiffies(WL1271_COMMAND_TIMEOUT
);
73 intr
= wl1271_read32(wl
, ACX_REG_INTERRUPT_NO_CLEAR
);
74 while (!(intr
& WL1271_ACX_INTR_CMD_COMPLETE
)) {
75 if (time_after(jiffies
, timeout
)) {
76 wl1271_error("command complete timeout");
82 if (poll_count
< WL1271_CMD_FAST_POLL_COUNT
)
87 intr
= wl1271_read32(wl
, ACX_REG_INTERRUPT_NO_CLEAR
);
90 /* read back the status code of the command */
92 res_len
= sizeof(struct wl1271_cmd_header
);
93 wl1271_read(wl
, wl
->cmd_box_addr
, cmd
, res_len
, false);
95 status
= le16_to_cpu(cmd
->status
);
96 if (status
!= CMD_STATUS_SUCCESS
) {
97 wl1271_error("command execute failure %d", status
);
102 wl1271_write32(wl
, ACX_REG_INTERRUPT_ACK
,
103 WL1271_ACX_INTR_CMD_COMPLETE
);
108 wl12xx_queue_recovery_work(wl
);
112 int wl1271_cmd_general_parms(struct wl1271
*wl
)
114 struct wl1271_general_parms_cmd
*gen_parms
;
115 struct wl1271_ini_general_params
*gp
=
116 &((struct wl1271_nvs_file
*)wl
->nvs
)->general_params
;
123 gen_parms
= kzalloc(sizeof(*gen_parms
), GFP_KERNEL
);
127 gen_parms
->test
.id
= TEST_CMD_INI_FILE_GENERAL_PARAM
;
129 memcpy(&gen_parms
->general_params
, gp
, sizeof(*gp
));
131 if (gp
->tx_bip_fem_auto_detect
)
134 /* Override the REF CLK from the NVS with the one from platform data */
135 gen_parms
->general_params
.ref_clock
= wl
->ref_clock
;
137 /* LPD mode enable (bits 6-7) in WL1271 AP mode only */
138 if (wl
->quirks
& WL12XX_QUIRK_LPD_MODE
)
139 gen_parms
->general_params
.general_settings
|=
140 GENERAL_SETTINGS_DRPW_LPD
;
142 ret
= wl1271_cmd_test(wl
, gen_parms
, sizeof(*gen_parms
), answer
);
144 wl1271_warning("CMD_INI_FILE_GENERAL_PARAM failed");
148 gp
->tx_bip_fem_manufacturer
=
149 gen_parms
->general_params
.tx_bip_fem_manufacturer
;
151 wl1271_debug(DEBUG_CMD
, "FEM autodetect: %s, manufacturer: %d\n",
152 answer
? "auto" : "manual", gp
->tx_bip_fem_manufacturer
);
159 int wl128x_cmd_general_parms(struct wl1271
*wl
)
161 struct wl128x_general_parms_cmd
*gen_parms
;
162 struct wl128x_ini_general_params
*gp
=
163 &((struct wl128x_nvs_file
*)wl
->nvs
)->general_params
;
170 gen_parms
= kzalloc(sizeof(*gen_parms
), GFP_KERNEL
);
174 gen_parms
->test
.id
= TEST_CMD_INI_FILE_GENERAL_PARAM
;
176 memcpy(&gen_parms
->general_params
, gp
, sizeof(*gp
));
178 if (gp
->tx_bip_fem_auto_detect
)
181 /* Replace REF and TCXO CLKs with the ones from platform data */
182 gen_parms
->general_params
.ref_clock
= wl
->ref_clock
;
183 gen_parms
->general_params
.tcxo_ref_clock
= wl
->tcxo_clock
;
185 ret
= wl1271_cmd_test(wl
, gen_parms
, sizeof(*gen_parms
), answer
);
187 wl1271_warning("CMD_INI_FILE_GENERAL_PARAM failed");
191 gp
->tx_bip_fem_manufacturer
=
192 gen_parms
->general_params
.tx_bip_fem_manufacturer
;
194 wl1271_debug(DEBUG_CMD
, "FEM autodetect: %s, manufacturer: %d\n",
195 answer
? "auto" : "manual", gp
->tx_bip_fem_manufacturer
);
202 int wl1271_cmd_radio_parms(struct wl1271
*wl
)
204 struct wl1271_nvs_file
*nvs
= (struct wl1271_nvs_file
*)wl
->nvs
;
205 struct wl1271_radio_parms_cmd
*radio_parms
;
206 struct wl1271_ini_general_params
*gp
= &nvs
->general_params
;
212 radio_parms
= kzalloc(sizeof(*radio_parms
), GFP_KERNEL
);
216 radio_parms
->test
.id
= TEST_CMD_INI_FILE_RADIO_PARAM
;
218 /* 2.4GHz parameters */
219 memcpy(&radio_parms
->static_params_2
, &nvs
->stat_radio_params_2
,
220 sizeof(struct wl1271_ini_band_params_2
));
221 memcpy(&radio_parms
->dyn_params_2
,
222 &nvs
->dyn_radio_params_2
[gp
->tx_bip_fem_manufacturer
].params
,
223 sizeof(struct wl1271_ini_fem_params_2
));
225 /* 5GHz parameters */
226 memcpy(&radio_parms
->static_params_5
,
227 &nvs
->stat_radio_params_5
,
228 sizeof(struct wl1271_ini_band_params_5
));
229 memcpy(&radio_parms
->dyn_params_5
,
230 &nvs
->dyn_radio_params_5
[gp
->tx_bip_fem_manufacturer
].params
,
231 sizeof(struct wl1271_ini_fem_params_5
));
233 wl1271_dump(DEBUG_CMD
, "TEST_CMD_INI_FILE_RADIO_PARAM: ",
234 radio_parms
, sizeof(*radio_parms
));
236 ret
= wl1271_cmd_test(wl
, radio_parms
, sizeof(*radio_parms
), 0);
238 wl1271_warning("CMD_INI_FILE_RADIO_PARAM failed");
244 int wl128x_cmd_radio_parms(struct wl1271
*wl
)
246 struct wl128x_nvs_file
*nvs
= (struct wl128x_nvs_file
*)wl
->nvs
;
247 struct wl128x_radio_parms_cmd
*radio_parms
;
248 struct wl128x_ini_general_params
*gp
= &nvs
->general_params
;
254 radio_parms
= kzalloc(sizeof(*radio_parms
), GFP_KERNEL
);
258 radio_parms
->test
.id
= TEST_CMD_INI_FILE_RADIO_PARAM
;
260 /* 2.4GHz parameters */
261 memcpy(&radio_parms
->static_params_2
, &nvs
->stat_radio_params_2
,
262 sizeof(struct wl128x_ini_band_params_2
));
263 memcpy(&radio_parms
->dyn_params_2
,
264 &nvs
->dyn_radio_params_2
[gp
->tx_bip_fem_manufacturer
].params
,
265 sizeof(struct wl128x_ini_fem_params_2
));
267 /* 5GHz parameters */
268 memcpy(&radio_parms
->static_params_5
,
269 &nvs
->stat_radio_params_5
,
270 sizeof(struct wl128x_ini_band_params_5
));
271 memcpy(&radio_parms
->dyn_params_5
,
272 &nvs
->dyn_radio_params_5
[gp
->tx_bip_fem_manufacturer
].params
,
273 sizeof(struct wl128x_ini_fem_params_5
));
275 radio_parms
->fem_vendor_and_options
= nvs
->fem_vendor_and_options
;
277 wl1271_dump(DEBUG_CMD
, "TEST_CMD_INI_FILE_RADIO_PARAM: ",
278 radio_parms
, sizeof(*radio_parms
));
280 ret
= wl1271_cmd_test(wl
, radio_parms
, sizeof(*radio_parms
), 0);
282 wl1271_warning("CMD_INI_FILE_RADIO_PARAM failed");
288 int wl1271_cmd_ext_radio_parms(struct wl1271
*wl
)
290 struct wl1271_ext_radio_parms_cmd
*ext_radio_parms
;
291 struct conf_rf_settings
*rf
= &wl
->conf
.rf
;
297 ext_radio_parms
= kzalloc(sizeof(*ext_radio_parms
), GFP_KERNEL
);
298 if (!ext_radio_parms
)
301 ext_radio_parms
->test
.id
= TEST_CMD_INI_FILE_RF_EXTENDED_PARAM
;
303 memcpy(ext_radio_parms
->tx_per_channel_power_compensation_2
,
304 rf
->tx_per_channel_power_compensation_2
,
305 CONF_TX_PWR_COMPENSATION_LEN_2
);
306 memcpy(ext_radio_parms
->tx_per_channel_power_compensation_5
,
307 rf
->tx_per_channel_power_compensation_5
,
308 CONF_TX_PWR_COMPENSATION_LEN_5
);
310 wl1271_dump(DEBUG_CMD
, "TEST_CMD_INI_FILE_EXT_RADIO_PARAM: ",
311 ext_radio_parms
, sizeof(*ext_radio_parms
));
313 ret
= wl1271_cmd_test(wl
, ext_radio_parms
, sizeof(*ext_radio_parms
), 0);
315 wl1271_warning("TEST_CMD_INI_FILE_RF_EXTENDED_PARAM failed");
317 kfree(ext_radio_parms
);
322 * Poll the mailbox event field until any of the bits in the mask is set or a
323 * timeout occurs (WL1271_EVENT_TIMEOUT in msecs)
325 static int wl1271_cmd_wait_for_event_or_timeout(struct wl1271
*wl
, u32 mask
)
327 u32 events_vector
, event
;
328 unsigned long timeout
;
330 timeout
= jiffies
+ msecs_to_jiffies(WL1271_EVENT_TIMEOUT
);
333 if (time_after(jiffies
, timeout
)) {
334 wl1271_debug(DEBUG_CMD
, "timeout waiting for event %d",
341 /* read from both event fields */
342 wl1271_read(wl
, wl
->mbox_ptr
[0], &events_vector
,
343 sizeof(events_vector
), false);
344 event
= events_vector
& mask
;
345 wl1271_read(wl
, wl
->mbox_ptr
[1], &events_vector
,
346 sizeof(events_vector
), false);
347 event
|= events_vector
& mask
;
353 static int wl1271_cmd_wait_for_event(struct wl1271
*wl
, u32 mask
)
357 ret
= wl1271_cmd_wait_for_event_or_timeout(wl
, mask
);
359 wl12xx_queue_recovery_work(wl
);
366 int wl1271_cmd_join(struct wl1271
*wl
, u8 bss_type
)
368 struct wl1271_cmd_join
*join
;
372 join
= kzalloc(sizeof(*join
), GFP_KERNEL
);
378 wl1271_debug(DEBUG_CMD
, "cmd join");
380 /* Reverse order BSSID */
381 bssid
= (u8
*) &join
->bssid_lsb
;
382 for (i
= 0; i
< ETH_ALEN
; i
++)
383 bssid
[i
] = wl
->bssid
[ETH_ALEN
- i
- 1];
385 join
->rx_config_options
= cpu_to_le32(wl
->rx_config
);
386 join
->rx_filter_options
= cpu_to_le32(wl
->rx_filter
);
387 join
->bss_type
= bss_type
;
388 join
->basic_rate_set
= cpu_to_le32(wl
->basic_rate_set
);
389 join
->supported_rate_set
= cpu_to_le32(wl
->rate_set
);
391 if (wl
->band
== IEEE80211_BAND_5GHZ
)
392 join
->bss_type
|= WL1271_JOIN_CMD_BSS_TYPE_5GHZ
;
394 join
->beacon_interval
= cpu_to_le16(wl
->beacon_int
);
395 join
->dtim_interval
= WL1271_DEFAULT_DTIM_PERIOD
;
397 join
->channel
= wl
->channel
;
398 join
->ssid_len
= wl
->ssid_len
;
399 memcpy(join
->ssid
, wl
->ssid
, wl
->ssid_len
);
401 join
->ctrl
|= wl
->session_counter
<< WL1271_JOIN_CMD_TX_SESSION_OFFSET
;
403 /* reset TX security counters */
404 wl
->tx_security_last_seq
= 0;
405 wl
->tx_security_seq
= 0;
407 wl1271_debug(DEBUG_CMD
, "cmd join: basic_rate_set=0x%x, rate_set=0x%x",
408 join
->basic_rate_set
, join
->supported_rate_set
);
410 ret
= wl1271_cmd_send(wl
, CMD_START_JOIN
, join
, sizeof(*join
), 0);
412 wl1271_error("failed to initiate cmd join");
416 ret
= wl1271_cmd_wait_for_event(wl
, JOIN_EVENT_COMPLETE_ID
);
418 wl1271_error("cmd join event completion error");
428 * send test command to firmware
431 * @buf: buffer containing the command, with all headers, must work with dma
432 * @len: length of the buffer
433 * @answer: is answer needed
435 int wl1271_cmd_test(struct wl1271
*wl
, void *buf
, size_t buf_len
, u8 answer
)
440 wl1271_debug(DEBUG_CMD
, "cmd test");
445 ret
= wl1271_cmd_send(wl
, CMD_TEST
, buf
, buf_len
, res_len
);
448 wl1271_warning("TEST command failed");
456 * read acx from firmware
460 * @buf: buffer for the response, including all headers, must work with dma
461 * @len: length of buf
463 int wl1271_cmd_interrogate(struct wl1271
*wl
, u16 id
, void *buf
, size_t len
)
465 struct acx_header
*acx
= buf
;
468 wl1271_debug(DEBUG_CMD
, "cmd interrogate");
470 acx
->id
= cpu_to_le16(id
);
472 /* payload length, does not include any headers */
473 acx
->len
= cpu_to_le16(len
- sizeof(*acx
));
475 ret
= wl1271_cmd_send(wl
, CMD_INTERROGATE
, acx
, sizeof(*acx
), len
);
477 wl1271_error("INTERROGATE command failed");
483 * write acx value to firmware
487 * @buf: buffer containing acx, including all headers, must work with dma
488 * @len: length of buf
490 int wl1271_cmd_configure(struct wl1271
*wl
, u16 id
, void *buf
, size_t len
)
492 struct acx_header
*acx
= buf
;
495 wl1271_debug(DEBUG_CMD
, "cmd configure");
497 acx
->id
= cpu_to_le16(id
);
499 /* payload length, does not include any headers */
500 acx
->len
= cpu_to_le16(len
- sizeof(*acx
));
502 ret
= wl1271_cmd_send(wl
, CMD_CONFIGURE
, acx
, len
, 0);
504 wl1271_warning("CONFIGURE command NOK");
511 int wl1271_cmd_data_path(struct wl1271
*wl
, bool enable
)
513 struct cmd_enabledisable_path
*cmd
;
517 wl1271_debug(DEBUG_CMD
, "cmd data path");
519 cmd
= kzalloc(sizeof(*cmd
), GFP_KERNEL
);
525 /* the channel here is only used for calibration, so hardcoded to 1 */
529 cmd_rx
= CMD_ENABLE_RX
;
530 cmd_tx
= CMD_ENABLE_TX
;
532 cmd_rx
= CMD_DISABLE_RX
;
533 cmd_tx
= CMD_DISABLE_TX
;
536 ret
= wl1271_cmd_send(wl
, cmd_rx
, cmd
, sizeof(*cmd
), 0);
538 wl1271_error("rx %s cmd for channel %d failed",
539 enable
? "start" : "stop", cmd
->channel
);
543 wl1271_debug(DEBUG_BOOT
, "rx %s cmd channel %d",
544 enable
? "start" : "stop", cmd
->channel
);
546 ret
= wl1271_cmd_send(wl
, cmd_tx
, cmd
, sizeof(*cmd
), 0);
548 wl1271_error("tx %s cmd for channel %d failed",
549 enable
? "start" : "stop", cmd
->channel
);
553 wl1271_debug(DEBUG_BOOT
, "tx %s cmd channel %d",
554 enable
? "start" : "stop", cmd
->channel
);
561 int wl1271_cmd_ps_mode(struct wl1271
*wl
, u8 ps_mode
)
563 struct wl1271_cmd_ps_params
*ps_params
= NULL
;
566 wl1271_debug(DEBUG_CMD
, "cmd set ps mode");
568 ps_params
= kzalloc(sizeof(*ps_params
), GFP_KERNEL
);
574 ps_params
->ps_mode
= ps_mode
;
576 ret
= wl1271_cmd_send(wl
, CMD_SET_PS_MODE
, ps_params
,
577 sizeof(*ps_params
), 0);
579 wl1271_error("cmd set_ps_mode failed");
588 int wl1271_cmd_template_set(struct wl1271
*wl
, u16 template_id
,
589 void *buf
, size_t buf_len
, int index
, u32 rates
)
591 struct wl1271_cmd_template_set
*cmd
;
594 wl1271_debug(DEBUG_CMD
, "cmd template_set %d", template_id
);
596 WARN_ON(buf_len
> WL1271_CMD_TEMPL_MAX_SIZE
);
597 buf_len
= min_t(size_t, buf_len
, WL1271_CMD_TEMPL_MAX_SIZE
);
599 cmd
= kzalloc(sizeof(*cmd
), GFP_KERNEL
);
605 cmd
->len
= cpu_to_le16(buf_len
);
606 cmd
->template_type
= template_id
;
607 cmd
->enabled_rates
= cpu_to_le32(rates
);
608 cmd
->short_retry_limit
= wl
->conf
.tx
.tmpl_short_retry_limit
;
609 cmd
->long_retry_limit
= wl
->conf
.tx
.tmpl_long_retry_limit
;
613 memcpy(cmd
->template_data
, buf
, buf_len
);
615 ret
= wl1271_cmd_send(wl
, CMD_SET_TEMPLATE
, cmd
, sizeof(*cmd
), 0);
617 wl1271_warning("cmd set_template failed: %d", ret
);
628 int wl1271_cmd_build_null_data(struct wl1271
*wl
)
630 struct sk_buff
*skb
= NULL
;
636 if (wl
->bss_type
== BSS_TYPE_IBSS
) {
637 size
= sizeof(struct wl12xx_null_data_template
);
640 skb
= ieee80211_nullfunc_get(wl
->hw
, wl
->vif
);
647 ret
= wl1271_cmd_template_set(wl
, CMD_TEMPL_NULL_DATA
, ptr
, size
, 0,
653 wl1271_warning("cmd buld null data failed %d", ret
);
659 int wl1271_cmd_build_klv_null_data(struct wl1271
*wl
)
661 struct sk_buff
*skb
= NULL
;
664 skb
= ieee80211_nullfunc_get(wl
->hw
, wl
->vif
);
668 ret
= wl1271_cmd_template_set(wl
, CMD_TEMPL_KLV
,
670 CMD_TEMPL_KLV_IDX_NULL_DATA
,
676 wl1271_warning("cmd build klv null data failed %d", ret
);
682 int wl1271_cmd_build_ps_poll(struct wl1271
*wl
, u16 aid
)
687 skb
= ieee80211_pspoll_get(wl
->hw
, wl
->vif
);
691 ret
= wl1271_cmd_template_set(wl
, CMD_TEMPL_PS_POLL
, skb
->data
,
692 skb
->len
, 0, wl
->basic_rate_set
);
699 int wl1271_cmd_build_probe_req(struct wl1271
*wl
,
700 const u8
*ssid
, size_t ssid_len
,
701 const u8
*ie
, size_t ie_len
, u8 band
)
706 skb
= ieee80211_probereq_get(wl
->hw
, wl
->vif
, ssid
, ssid_len
,
713 wl1271_dump(DEBUG_SCAN
, "PROBE REQ: ", skb
->data
, skb
->len
);
715 if (band
== IEEE80211_BAND_2GHZ
)
716 ret
= wl1271_cmd_template_set(wl
, CMD_TEMPL_CFG_PROBE_REQ_2_4
,
717 skb
->data
, skb
->len
, 0,
718 wl
->conf
.tx
.basic_rate
);
720 ret
= wl1271_cmd_template_set(wl
, CMD_TEMPL_CFG_PROBE_REQ_5
,
721 skb
->data
, skb
->len
, 0,
722 wl
->conf
.tx
.basic_rate_5
);
729 struct sk_buff
*wl1271_cmd_build_ap_probe_req(struct wl1271
*wl
,
735 skb
= ieee80211_ap_probereq_get(wl
->hw
, wl
->vif
);
739 wl1271_dump(DEBUG_SCAN
, "AP PROBE REQ: ", skb
->data
, skb
->len
);
741 if (wl
->band
== IEEE80211_BAND_2GHZ
)
742 ret
= wl1271_cmd_template_set(wl
, CMD_TEMPL_CFG_PROBE_REQ_2_4
,
743 skb
->data
, skb
->len
, 0,
744 wl
->conf
.tx
.basic_rate
);
746 ret
= wl1271_cmd_template_set(wl
, CMD_TEMPL_CFG_PROBE_REQ_5
,
747 skb
->data
, skb
->len
, 0,
748 wl
->conf
.tx
.basic_rate_5
);
751 wl1271_error("Unable to set ap probe request template.");
757 int wl1271_cmd_build_arp_rsp(struct wl1271
*wl
, __be32 ip_addr
)
760 struct wl12xx_arp_rsp_template tmpl
;
761 struct ieee80211_hdr_3addr
*hdr
;
762 struct arphdr
*arp_hdr
;
764 memset(&tmpl
, 0, sizeof(tmpl
));
766 /* mac80211 header */
768 hdr
->frame_control
= cpu_to_le16(IEEE80211_FTYPE_DATA
|
769 IEEE80211_STYPE_DATA
|
770 IEEE80211_FCTL_TODS
);
771 memcpy(hdr
->addr1
, wl
->vif
->bss_conf
.bssid
, ETH_ALEN
);
772 memcpy(hdr
->addr2
, wl
->vif
->addr
, ETH_ALEN
);
773 memset(hdr
->addr3
, 0xff, ETH_ALEN
);
776 memcpy(tmpl
.llc_hdr
, rfc1042_header
, sizeof(rfc1042_header
));
777 tmpl
.llc_type
= cpu_to_be16(ETH_P_ARP
);
780 arp_hdr
= &tmpl
.arp_hdr
;
781 arp_hdr
->ar_hrd
= cpu_to_be16(ARPHRD_ETHER
);
782 arp_hdr
->ar_pro
= cpu_to_be16(ETH_P_IP
);
783 arp_hdr
->ar_hln
= ETH_ALEN
;
785 arp_hdr
->ar_op
= cpu_to_be16(ARPOP_REPLY
);
788 memcpy(tmpl
.sender_hw
, wl
->vif
->addr
, ETH_ALEN
);
789 tmpl
.sender_ip
= ip_addr
;
791 ret
= wl1271_cmd_template_set(wl
, CMD_TEMPL_ARP_RSP
,
792 &tmpl
, sizeof(tmpl
), 0,
798 int wl1271_build_qos_null_data(struct wl1271
*wl
)
800 struct ieee80211_qos_hdr
template;
802 memset(&template, 0, sizeof(template));
804 memcpy(template.addr1
, wl
->bssid
, ETH_ALEN
);
805 memcpy(template.addr2
, wl
->mac_addr
, ETH_ALEN
);
806 memcpy(template.addr3
, wl
->bssid
, ETH_ALEN
);
808 template.frame_control
= cpu_to_le16(IEEE80211_FTYPE_DATA
|
809 IEEE80211_STYPE_QOS_NULLFUNC
|
810 IEEE80211_FCTL_TODS
);
812 /* FIXME: not sure what priority to use here */
813 template.qos_ctrl
= cpu_to_le16(0);
815 return wl1271_cmd_template_set(wl
, CMD_TEMPL_QOS_NULL_DATA
, &template,
820 int wl1271_cmd_set_sta_default_wep_key(struct wl1271
*wl
, u8 id
)
822 struct wl1271_cmd_set_sta_keys
*cmd
;
825 wl1271_debug(DEBUG_CMD
, "cmd set_default_wep_key %d", id
);
827 cmd
= kzalloc(sizeof(*cmd
), GFP_KERNEL
);
834 cmd
->key_action
= cpu_to_le16(KEY_SET_ID
);
835 cmd
->key_type
= KEY_WEP
;
837 ret
= wl1271_cmd_send(wl
, CMD_SET_KEYS
, cmd
, sizeof(*cmd
), 0);
839 wl1271_warning("cmd set_default_wep_key failed: %d", ret
);
849 int wl1271_cmd_set_ap_default_wep_key(struct wl1271
*wl
, u8 id
)
851 struct wl1271_cmd_set_ap_keys
*cmd
;
854 wl1271_debug(DEBUG_CMD
, "cmd set_ap_default_wep_key %d", id
);
856 cmd
= kzalloc(sizeof(*cmd
), GFP_KERNEL
);
862 cmd
->hlid
= WL1271_AP_BROADCAST_HLID
;
864 cmd
->lid_key_type
= WEP_DEFAULT_LID_TYPE
;
865 cmd
->key_action
= cpu_to_le16(KEY_SET_ID
);
866 cmd
->key_type
= KEY_WEP
;
868 ret
= wl1271_cmd_send(wl
, CMD_SET_KEYS
, cmd
, sizeof(*cmd
), 0);
870 wl1271_warning("cmd set_ap_default_wep_key failed: %d", ret
);
880 int wl1271_cmd_set_sta_key(struct wl1271
*wl
, u16 action
, u8 id
, u8 key_type
,
881 u8 key_size
, const u8
*key
, const u8
*addr
,
882 u32 tx_seq_32
, u16 tx_seq_16
)
884 struct wl1271_cmd_set_sta_keys
*cmd
;
887 cmd
= kzalloc(sizeof(*cmd
), GFP_KERNEL
);
893 if (key_type
!= KEY_WEP
)
894 memcpy(cmd
->addr
, addr
, ETH_ALEN
);
896 cmd
->key_action
= cpu_to_le16(action
);
897 cmd
->key_size
= key_size
;
898 cmd
->key_type
= key_type
;
900 cmd
->ac_seq_num16
[0] = cpu_to_le16(tx_seq_16
);
901 cmd
->ac_seq_num32
[0] = cpu_to_le32(tx_seq_32
);
903 /* we have only one SSID profile */
904 cmd
->ssid_profile
= 0;
908 if (key_type
== KEY_TKIP
) {
910 * We get the key in the following form:
911 * TKIP (16 bytes) - TX MIC (8 bytes) - RX MIC (8 bytes)
912 * but the target is expecting:
913 * TKIP - RX MIC - TX MIC
915 memcpy(cmd
->key
, key
, 16);
916 memcpy(cmd
->key
+ 16, key
+ 24, 8);
917 memcpy(cmd
->key
+ 24, key
+ 16, 8);
920 memcpy(cmd
->key
, key
, key_size
);
923 wl1271_dump(DEBUG_CRYPT
, "TARGET KEY: ", cmd
, sizeof(*cmd
));
925 ret
= wl1271_cmd_send(wl
, CMD_SET_KEYS
, cmd
, sizeof(*cmd
), 0);
927 wl1271_warning("could not set keys");
937 int wl1271_cmd_set_ap_key(struct wl1271
*wl
, u16 action
, u8 id
, u8 key_type
,
938 u8 key_size
, const u8
*key
, u8 hlid
, u32 tx_seq_32
,
941 struct wl1271_cmd_set_ap_keys
*cmd
;
945 cmd
= kzalloc(sizeof(*cmd
), GFP_KERNEL
);
949 if (hlid
== WL1271_AP_BROADCAST_HLID
) {
950 if (key_type
== KEY_WEP
)
951 lid_type
= WEP_DEFAULT_LID_TYPE
;
953 lid_type
= BROADCAST_LID_TYPE
;
955 lid_type
= UNICAST_LID_TYPE
;
958 wl1271_debug(DEBUG_CRYPT
, "ap key action: %d id: %d lid: %d type: %d"
959 " hlid: %d", (int)action
, (int)id
, (int)lid_type
,
960 (int)key_type
, (int)hlid
);
962 cmd
->lid_key_type
= lid_type
;
964 cmd
->key_action
= cpu_to_le16(action
);
965 cmd
->key_size
= key_size
;
966 cmd
->key_type
= key_type
;
968 cmd
->ac_seq_num16
[0] = cpu_to_le16(tx_seq_16
);
969 cmd
->ac_seq_num32
[0] = cpu_to_le32(tx_seq_32
);
971 if (key_type
== KEY_TKIP
) {
973 * We get the key in the following form:
974 * TKIP (16 bytes) - TX MIC (8 bytes) - RX MIC (8 bytes)
975 * but the target is expecting:
976 * TKIP - RX MIC - TX MIC
978 memcpy(cmd
->key
, key
, 16);
979 memcpy(cmd
->key
+ 16, key
+ 24, 8);
980 memcpy(cmd
->key
+ 24, key
+ 16, 8);
982 memcpy(cmd
->key
, key
, key_size
);
985 wl1271_dump(DEBUG_CRYPT
, "TARGET AP KEY: ", cmd
, sizeof(*cmd
));
987 ret
= wl1271_cmd_send(wl
, CMD_SET_KEYS
, cmd
, sizeof(*cmd
), 0);
989 wl1271_warning("could not set ap keys");
998 int wl1271_cmd_disconnect(struct wl1271
*wl
)
1000 struct wl1271_cmd_disconnect
*cmd
;
1003 wl1271_debug(DEBUG_CMD
, "cmd disconnect");
1005 cmd
= kzalloc(sizeof(*cmd
), GFP_KERNEL
);
1011 cmd
->rx_config_options
= cpu_to_le32(wl
->rx_config
);
1012 cmd
->rx_filter_options
= cpu_to_le32(wl
->rx_filter
);
1013 /* disconnect reason is not used in immediate disconnections */
1014 cmd
->type
= DISCONNECT_IMMEDIATE
;
1016 ret
= wl1271_cmd_send(wl
, CMD_DISCONNECT
, cmd
, sizeof(*cmd
), 0);
1018 wl1271_error("failed to send disconnect command");
1022 ret
= wl1271_cmd_wait_for_event(wl
, DISCONNECT_EVENT_COMPLETE_ID
);
1024 wl1271_error("cmd disconnect event completion error");
1033 int wl1271_cmd_set_sta_state(struct wl1271
*wl
)
1035 struct wl1271_cmd_set_sta_state
*cmd
;
1038 wl1271_debug(DEBUG_CMD
, "cmd set sta state");
1040 cmd
= kzalloc(sizeof(*cmd
), GFP_KERNEL
);
1046 cmd
->state
= WL1271_CMD_STA_STATE_CONNECTED
;
1048 ret
= wl1271_cmd_send(wl
, CMD_SET_STA_STATE
, cmd
, sizeof(*cmd
), 0);
1050 wl1271_error("failed to send set STA state command");
1061 int wl1271_cmd_start_bss(struct wl1271
*wl
)
1063 struct wl1271_cmd_bss_start
*cmd
;
1064 struct ieee80211_bss_conf
*bss_conf
= &wl
->vif
->bss_conf
;
1067 wl1271_debug(DEBUG_CMD
, "cmd start bss");
1070 * FIXME: We currently do not support hidden SSID. The real SSID
1071 * should be fetched from mac80211 first.
1073 if (wl
->ssid_len
== 0) {
1074 wl1271_warning("Hidden SSID currently not supported for AP");
1079 cmd
= kzalloc(sizeof(*cmd
), GFP_KERNEL
);
1085 memcpy(cmd
->bssid
, bss_conf
->bssid
, ETH_ALEN
);
1087 cmd
->aging_period
= cpu_to_le16(WL1271_AP_DEF_INACTIV_SEC
);
1088 cmd
->bss_index
= WL1271_AP_BSS_INDEX
;
1089 cmd
->global_hlid
= WL1271_AP_GLOBAL_HLID
;
1090 cmd
->broadcast_hlid
= WL1271_AP_BROADCAST_HLID
;
1091 cmd
->basic_rate_set
= cpu_to_le32(wl
->basic_rate_set
);
1092 cmd
->beacon_interval
= cpu_to_le16(wl
->beacon_int
);
1093 cmd
->dtim_interval
= bss_conf
->dtim_period
;
1094 cmd
->beacon_expiry
= WL1271_AP_DEF_BEACON_EXP
;
1095 cmd
->channel
= wl
->channel
;
1096 cmd
->ssid_len
= wl
->ssid_len
;
1097 cmd
->ssid_type
= SSID_TYPE_PUBLIC
;
1098 memcpy(cmd
->ssid
, wl
->ssid
, wl
->ssid_len
);
1101 case IEEE80211_BAND_2GHZ
:
1102 cmd
->band
= RADIO_BAND_2_4GHZ
;
1104 case IEEE80211_BAND_5GHZ
:
1105 cmd
->band
= RADIO_BAND_5GHZ
;
1108 wl1271_warning("bss start - unknown band: %d", (int)wl
->band
);
1109 cmd
->band
= RADIO_BAND_2_4GHZ
;
1113 ret
= wl1271_cmd_send(wl
, CMD_BSS_START
, cmd
, sizeof(*cmd
), 0);
1115 wl1271_error("failed to initiate cmd start bss");
1126 int wl1271_cmd_stop_bss(struct wl1271
*wl
)
1128 struct wl1271_cmd_bss_start
*cmd
;
1131 wl1271_debug(DEBUG_CMD
, "cmd stop bss");
1133 cmd
= kzalloc(sizeof(*cmd
), GFP_KERNEL
);
1139 cmd
->bss_index
= WL1271_AP_BSS_INDEX
;
1141 ret
= wl1271_cmd_send(wl
, CMD_BSS_STOP
, cmd
, sizeof(*cmd
), 0);
1143 wl1271_error("failed to initiate cmd stop bss");
1154 int wl1271_cmd_add_sta(struct wl1271
*wl
, struct ieee80211_sta
*sta
, u8 hlid
)
1156 struct wl1271_cmd_add_sta
*cmd
;
1159 wl1271_debug(DEBUG_CMD
, "cmd add sta %d", (int)hlid
);
1161 cmd
= kzalloc(sizeof(*cmd
), GFP_KERNEL
);
1167 /* currently we don't support UAPSD */
1170 memcpy(cmd
->addr
, sta
->addr
, ETH_ALEN
);
1171 cmd
->bss_index
= WL1271_AP_BSS_INDEX
;
1172 cmd
->aid
= sta
->aid
;
1174 cmd
->wmm
= sta
->wme
? 1 : 0;
1176 cmd
->supported_rates
= cpu_to_le32(wl1271_tx_enabled_rates_get(wl
,
1177 sta
->supp_rates
[wl
->band
]));
1179 wl1271_debug(DEBUG_CMD
, "new sta rates: 0x%x", cmd
->supported_rates
);
1181 ret
= wl1271_cmd_send(wl
, CMD_ADD_STA
, cmd
, sizeof(*cmd
), 0);
1183 wl1271_error("failed to initiate cmd add sta");
1194 int wl1271_cmd_remove_sta(struct wl1271
*wl
, u8 hlid
)
1196 struct wl1271_cmd_remove_sta
*cmd
;
1199 wl1271_debug(DEBUG_CMD
, "cmd remove sta %d", (int)hlid
);
1201 cmd
= kzalloc(sizeof(*cmd
), GFP_KERNEL
);
1208 /* We never send a deauth, mac80211 is in charge of this */
1209 cmd
->reason_opcode
= 0;
1210 cmd
->send_deauth_flag
= 0;
1212 ret
= wl1271_cmd_send(wl
, CMD_REMOVE_STA
, cmd
, sizeof(*cmd
), 0);
1214 wl1271_error("failed to initiate cmd remove sta");
1219 * We are ok with a timeout here. The event is sometimes not sent
1220 * due to a firmware bug.
1222 wl1271_cmd_wait_for_event_or_timeout(wl
, STA_REMOVE_COMPLETE_EVENT_ID
);
1231 int wl12xx_cmd_config_fwlog(struct wl1271
*wl
)
1233 struct wl12xx_cmd_config_fwlog
*cmd
;
1236 wl1271_debug(DEBUG_CMD
, "cmd config firmware logger");
1238 cmd
= kzalloc(sizeof(*cmd
), GFP_KERNEL
);
1244 cmd
->logger_mode
= wl
->conf
.fwlog
.mode
;
1245 cmd
->log_severity
= wl
->conf
.fwlog
.severity
;
1246 cmd
->timestamp
= wl
->conf
.fwlog
.timestamp
;
1247 cmd
->output
= wl
->conf
.fwlog
.output
;
1248 cmd
->threshold
= wl
->conf
.fwlog
.threshold
;
1250 ret
= wl1271_cmd_send(wl
, CMD_CONFIG_FWLOGGER
, cmd
, sizeof(*cmd
), 0);
1252 wl1271_error("failed to send config firmware logger command");
1263 int wl12xx_cmd_start_fwlog(struct wl1271
*wl
)
1265 struct wl12xx_cmd_start_fwlog
*cmd
;
1268 wl1271_debug(DEBUG_CMD
, "cmd start firmware logger");
1270 cmd
= kzalloc(sizeof(*cmd
), GFP_KERNEL
);
1276 ret
= wl1271_cmd_send(wl
, CMD_START_FWLOGGER
, cmd
, sizeof(*cmd
), 0);
1278 wl1271_error("failed to send start firmware logger command");
1289 int wl12xx_cmd_stop_fwlog(struct wl1271
*wl
)
1291 struct wl12xx_cmd_stop_fwlog
*cmd
;
1294 wl1271_debug(DEBUG_CMD
, "cmd stop firmware logger");
1296 cmd
= kzalloc(sizeof(*cmd
), GFP_KERNEL
);
1302 ret
= wl1271_cmd_send(wl
, CMD_STOP_FWLOGGER
, cmd
, sizeof(*cmd
), 0);
1304 wl1271_error("failed to send stop firmware logger command");