2 * This file is part of wl1271
4 * Copyright (C) 2009 Nokia Corporation
6 * Contact: Luciano Coelho <luciano.coelho@nokia.com>
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * version 2 as published by the Free Software Foundation.
12 * This program is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
24 #include <linux/module.h>
25 #include <linux/platform_device.h>
26 #include <linux/crc7.h>
27 #include <linux/spi/spi.h>
28 #include <linux/etherdevice.h>
31 #include "wl1271_reg.h"
32 #include "wl1271_spi.h"
33 #include "wl1271_acx.h"
34 #include "wl12xx_80211.h"
35 #include "wl1271_cmd.h"
38 * send command to firmware
42 * @buf: buffer containing the command, must work with dma
43 * @len: length of the buffer
45 int wl1271_cmd_send(struct wl1271
*wl
, u16 id
, void *buf
, size_t len
)
47 struct wl1271_cmd_header
*cmd
;
48 unsigned long timeout
;
56 WARN_ON(len
% 4 != 0);
58 wl1271_spi_mem_write(wl
, wl
->cmd_box_addr
, buf
, len
);
60 wl1271_reg_write32(wl
, ACX_REG_INTERRUPT_TRIG
, INTR_TRIG_CMD
);
62 timeout
= jiffies
+ msecs_to_jiffies(WL1271_COMMAND_TIMEOUT
);
64 intr
= wl1271_reg_read32(wl
, ACX_REG_INTERRUPT_NO_CLEAR
);
65 while (!(intr
& WL1271_ACX_INTR_CMD_COMPLETE
)) {
66 if (time_after(jiffies
, timeout
)) {
67 wl1271_error("command complete timeout");
74 intr
= wl1271_reg_read32(wl
, ACX_REG_INTERRUPT_NO_CLEAR
);
77 wl1271_reg_write32(wl
, ACX_REG_INTERRUPT_ACK
,
78 WL1271_ACX_INTR_CMD_COMPLETE
);
84 int wl1271_cmd_cal_channel_tune(struct wl1271
*wl
)
86 struct wl1271_cmd_cal_channel_tune
*cmd
;
89 cmd
= kzalloc(sizeof(*cmd
), GFP_KERNEL
);
93 cmd
->test
.id
= TEST_CMD_CHANNEL_TUNE
;
95 cmd
->band
= WL1271_CHANNEL_TUNE_BAND_2_4
;
96 /* set up any channel, 7 is in the middle of the range */
99 ret
= wl1271_cmd_test(wl
, cmd
, sizeof(*cmd
), 0);
101 wl1271_warning("TEST_CMD_CHANNEL_TUNE failed");
107 int wl1271_cmd_cal_update_ref_point(struct wl1271
*wl
)
109 struct wl1271_cmd_cal_update_ref_point
*cmd
;
112 cmd
= kzalloc(sizeof(*cmd
), GFP_KERNEL
);
116 cmd
->test
.id
= TEST_CMD_UPDATE_PD_REFERENCE_POINT
;
118 /* FIXME: still waiting for the correct values */
120 cmd
->ref_detector
= 0;
122 cmd
->sub_band
= WL1271_PD_REFERENCE_POINT_BAND_B_G
;
124 ret
= wl1271_cmd_test(wl
, cmd
, sizeof(*cmd
), 0);
126 wl1271_warning("TEST_CMD_UPDATE_PD_REFERENCE_POINT failed");
132 int wl1271_cmd_cal_p2g(struct wl1271
*wl
)
134 struct wl1271_cmd_cal_p2g
*cmd
;
137 cmd
= kzalloc(sizeof(*cmd
), GFP_KERNEL
);
141 cmd
->test
.id
= TEST_CMD_P2G_CAL
;
143 cmd
->sub_band_mask
= WL1271_CAL_P2G_BAND_B_G
;
145 ret
= wl1271_cmd_test(wl
, cmd
, sizeof(*cmd
), 0);
147 wl1271_warning("TEST_CMD_P2G_CAL failed");
153 int wl1271_cmd_cal(struct wl1271
*wl
)
156 * FIXME: we must make sure that we're not sleeping when calibration
161 wl1271_notice("performing tx calibration");
163 ret
= wl1271_cmd_cal_channel_tune(wl
);
167 ret
= wl1271_cmd_cal_update_ref_point(wl
);
171 ret
= wl1271_cmd_cal_p2g(wl
);
178 int wl1271_cmd_join(struct wl1271
*wl
, u8 bss_type
, u8 dtim_interval
,
179 u16 beacon_interval
, u8 wait
)
181 static bool do_cal
= true;
182 unsigned long timeout
;
183 struct wl1271_cmd_join
*join
;
187 /* FIXME: remove when we get calibration from the factory */
189 ret
= wl1271_cmd_cal(wl
);
191 wl1271_warning("couldn't calibrate");
197 join
= kzalloc(sizeof(*join
), GFP_KERNEL
);
203 wl1271_debug(DEBUG_CMD
, "cmd join");
205 /* Reverse order BSSID */
206 bssid
= (u8
*) &join
->bssid_lsb
;
207 for (i
= 0; i
< ETH_ALEN
; i
++)
208 bssid
[i
] = wl
->bssid
[ETH_ALEN
- i
- 1];
210 join
->rx_config_options
= wl
->rx_config
;
211 join
->rx_filter_options
= wl
->rx_filter
;
213 join
->basic_rate_set
= RATE_MASK_1MBPS
| RATE_MASK_2MBPS
|
214 RATE_MASK_5_5MBPS
| RATE_MASK_11MBPS
;
216 join
->beacon_interval
= beacon_interval
;
217 join
->dtim_interval
= dtim_interval
;
218 join
->bss_type
= bss_type
;
219 join
->channel
= wl
->channel
;
220 join
->ssid_len
= wl
->ssid_len
;
221 memcpy(join
->ssid
, wl
->ssid
, wl
->ssid_len
);
222 join
->ctrl
= WL1271_JOIN_CMD_CTRL_TX_FLUSH
;
224 /* increment the session counter */
225 wl
->session_counter
++;
226 if (wl
->session_counter
>= SESSION_COUNTER_MAX
)
227 wl
->session_counter
= 0;
229 join
->ctrl
|= wl
->session_counter
<< WL1271_JOIN_CMD_TX_SESSION_OFFSET
;
232 ret
= wl1271_cmd_send(wl
, CMD_START_JOIN
, join
, sizeof(*join
));
234 wl1271_error("failed to initiate cmd join");
238 timeout
= msecs_to_jiffies(JOIN_TIMEOUT
);
241 * ugly hack: we should wait for JOIN_EVENT_COMPLETE_ID but to
242 * simplify locking we just sleep instead, for now
255 * send test command to firmware
258 * @buf: buffer containing the command, with all headers, must work with dma
259 * @len: length of the buffer
260 * @answer: is answer needed
262 int wl1271_cmd_test(struct wl1271
*wl
, void *buf
, size_t buf_len
, u8 answer
)
266 wl1271_debug(DEBUG_CMD
, "cmd test");
268 ret
= wl1271_cmd_send(wl
, CMD_TEST
, buf
, buf_len
);
271 wl1271_warning("TEST command failed");
276 struct wl1271_command
*cmd_answer
;
279 * The test command got in, we can read the answer.
280 * The answer would be a wl1271_command, where the
281 * parameter array contains the actual answer.
283 wl1271_spi_mem_read(wl
, wl
->cmd_box_addr
, buf
, buf_len
);
287 if (cmd_answer
->header
.status
!= CMD_STATUS_SUCCESS
)
288 wl1271_error("TEST command answer error: %d",
289 cmd_answer
->header
.status
);
296 * read acx from firmware
300 * @buf: buffer for the response, including all headers, must work with dma
301 * @len: lenght of buf
303 int wl1271_cmd_interrogate(struct wl1271
*wl
, u16 id
, void *buf
, size_t len
)
305 struct acx_header
*acx
= buf
;
308 wl1271_debug(DEBUG_CMD
, "cmd interrogate");
312 /* payload length, does not include any headers */
313 acx
->len
= len
- sizeof(*acx
);
315 ret
= wl1271_cmd_send(wl
, CMD_INTERROGATE
, acx
, sizeof(*acx
));
317 wl1271_error("INTERROGATE command failed");
321 /* the interrogate command got in, we can read the answer */
322 wl1271_spi_mem_read(wl
, wl
->cmd_box_addr
, buf
, len
);
325 if (acx
->cmd
.status
!= CMD_STATUS_SUCCESS
)
326 wl1271_error("INTERROGATE command error: %d",
334 * write acx value to firmware
338 * @buf: buffer containing acx, including all headers, must work with dma
339 * @len: length of buf
341 int wl1271_cmd_configure(struct wl1271
*wl
, u16 id
, void *buf
, size_t len
)
343 struct acx_header
*acx
= buf
;
346 wl1271_debug(DEBUG_CMD
, "cmd configure");
350 /* payload length, does not include any headers */
351 acx
->len
= len
- sizeof(*acx
);
353 ret
= wl1271_cmd_send(wl
, CMD_CONFIGURE
, acx
, len
);
355 wl1271_warning("CONFIGURE command NOK");
362 int wl1271_cmd_data_path(struct wl1271
*wl
, u8 channel
, bool enable
)
364 struct cmd_enabledisable_path
*cmd
;
368 wl1271_debug(DEBUG_CMD
, "cmd data path");
370 cmd
= kzalloc(sizeof(*cmd
), GFP_KERNEL
);
376 cmd
->channel
= channel
;
379 cmd_rx
= CMD_ENABLE_RX
;
380 cmd_tx
= CMD_ENABLE_TX
;
382 cmd_rx
= CMD_DISABLE_RX
;
383 cmd_tx
= CMD_DISABLE_TX
;
386 ret
= wl1271_cmd_send(wl
, cmd_rx
, cmd
, sizeof(*cmd
));
388 wl1271_error("rx %s cmd for channel %d failed",
389 enable
? "start" : "stop", channel
);
393 wl1271_debug(DEBUG_BOOT
, "rx %s cmd channel %d",
394 enable
? "start" : "stop", channel
);
396 ret
= wl1271_cmd_send(wl
, cmd_tx
, cmd
, sizeof(*cmd
));
398 wl1271_error("tx %s cmd for channel %d failed",
399 enable
? "start" : "stop", channel
);
403 wl1271_debug(DEBUG_BOOT
, "tx %s cmd channel %d",
404 enable
? "start" : "stop", channel
);
411 int wl1271_cmd_ps_mode(struct wl1271
*wl
, u8 ps_mode
)
413 struct wl1271_cmd_ps_params
*ps_params
= NULL
;
416 /* FIXME: this should be in ps.c */
417 ret
= wl1271_acx_wake_up_conditions(wl
, WAKE_UP_EVENT_DTIM_BITMAP
,
420 wl1271_error("couldn't set wake up conditions");
424 wl1271_debug(DEBUG_CMD
, "cmd set ps mode");
426 ps_params
= kzalloc(sizeof(*ps_params
), GFP_KERNEL
);
432 ps_params
->ps_mode
= ps_mode
;
433 ps_params
->send_null_data
= 1;
434 ps_params
->retries
= 5;
435 ps_params
->hang_over_period
= 128;
436 ps_params
->null_data_rate
= 1; /* 1 Mbps */
438 ret
= wl1271_cmd_send(wl
, CMD_SET_PS_MODE
, ps_params
,
441 wl1271_error("cmd set_ps_mode failed");
450 int wl1271_cmd_read_memory(struct wl1271
*wl
, u32 addr
, void *answer
,
453 struct cmd_read_write_memory
*cmd
;
456 wl1271_debug(DEBUG_CMD
, "cmd read memory");
458 cmd
= kzalloc(sizeof(*cmd
), GFP_KERNEL
);
464 WARN_ON(len
> MAX_READ_SIZE
);
465 len
= min_t(size_t, len
, MAX_READ_SIZE
);
470 ret
= wl1271_cmd_send(wl
, CMD_READ_MEMORY
, cmd
, sizeof(*cmd
));
472 wl1271_error("read memory command failed: %d", ret
);
476 /* the read command got in, we can now read the answer */
477 wl1271_spi_mem_read(wl
, wl
->cmd_box_addr
, cmd
, sizeof(*cmd
));
479 if (cmd
->header
.status
!= CMD_STATUS_SUCCESS
)
480 wl1271_error("error in read command result: %d",
483 memcpy(answer
, cmd
->value
, len
);
490 int wl1271_cmd_scan(struct wl1271
*wl
, u8
*ssid
, size_t len
,
491 u8 active_scan
, u8 high_prio
, u8 num_channels
,
495 struct wl1271_cmd_trigger_scan_to
*trigger
= NULL
;
496 struct wl1271_cmd_scan
*params
= NULL
;
498 u16 scan_options
= 0;
503 params
= kzalloc(sizeof(*params
), GFP_KERNEL
);
507 params
->params
.rx_config_options
= cpu_to_le32(CFG_RX_ALL_GOOD
);
508 params
->params
.rx_filter_options
=
509 cpu_to_le32(CFG_RX_PRSP_EN
| CFG_RX_MGMT_EN
| CFG_RX_BCN_EN
);
512 scan_options
|= WL1271_SCAN_OPT_PASSIVE
;
514 scan_options
|= WL1271_SCAN_OPT_PRIORITY_HIGH
;
515 params
->params
.scan_options
= scan_options
;
517 params
->params
.num_channels
= num_channels
;
518 params
->params
.num_probe_requests
= probe_requests
;
519 params
->params
.tx_rate
= cpu_to_le32(RATE_MASK_2MBPS
);
520 params
->params
.tid_trigger
= 0;
521 params
->params
.scan_tag
= WL1271_SCAN_DEFAULT_TAG
;
523 for (i
= 0; i
< num_channels
; i
++) {
524 params
->channels
[i
].min_duration
=
525 cpu_to_le32(WL1271_SCAN_CHAN_MIN_DURATION
);
526 params
->channels
[i
].max_duration
=
527 cpu_to_le32(WL1271_SCAN_CHAN_MAX_DURATION
);
528 memset(¶ms
->channels
[i
].bssid_lsb
, 0xff, 4);
529 memset(¶ms
->channels
[i
].bssid_msb
, 0xff, 2);
530 params
->channels
[i
].early_termination
= 0;
531 params
->channels
[i
].tx_power_att
= WL1271_SCAN_CURRENT_TX_PWR
;
532 params
->channels
[i
].channel
= i
+ 1;
536 params
->params
.ssid_len
= len
;
537 memcpy(params
->params
.ssid
, ssid
, len
);
540 ret
= wl1271_cmd_build_probe_req(wl
, ssid
, len
);
542 wl1271_error("PROBE request template failed");
546 trigger
= kzalloc(sizeof(*trigger
), GFP_KERNEL
);
552 /* disable the timeout */
553 trigger
->timeout
= 0;
555 ret
= wl1271_cmd_send(wl
, CMD_TRIGGER_SCAN_TO
, trigger
,
558 wl1271_error("trigger scan to failed for hw scan");
562 wl1271_dump(DEBUG_SCAN
, "SCAN: ", params
, sizeof(*params
));
566 ret
= wl1271_cmd_send(wl
, CMD_SCAN
, params
, sizeof(*params
));
568 wl1271_error("SCAN failed");
572 wl1271_spi_mem_read(wl
, wl
->cmd_box_addr
, params
, sizeof(*params
));
574 if (params
->header
.status
!= CMD_STATUS_SUCCESS
) {
575 wl1271_error("Scan command error: %d",
576 params
->header
.status
);
577 wl
->scanning
= false;
587 int wl1271_cmd_template_set(struct wl1271
*wl
, u16 template_id
,
588 void *buf
, size_t buf_len
)
590 struct wl1271_cmd_template_set
*cmd
;
593 wl1271_debug(DEBUG_CMD
, "cmd template_set %d", template_id
);
595 WARN_ON(buf_len
> WL1271_CMD_TEMPL_MAX_SIZE
);
596 buf_len
= min_t(size_t, buf_len
, WL1271_CMD_TEMPL_MAX_SIZE
);
598 cmd
= kzalloc(sizeof(*cmd
), GFP_KERNEL
);
604 cmd
->len
= cpu_to_le16(buf_len
);
605 cmd
->template_type
= template_id
;
606 cmd
->enabled_rates
= ACX_RATE_MASK_UNSPECIFIED
;
607 cmd
->short_retry_limit
= ACX_RATE_RETRY_LIMIT
;
608 cmd
->long_retry_limit
= ACX_RATE_RETRY_LIMIT
;
611 memcpy(cmd
->template_data
, buf
, buf_len
);
613 ret
= wl1271_cmd_send(wl
, CMD_SET_TEMPLATE
, cmd
, sizeof(*cmd
));
615 wl1271_warning("cmd set_template failed: %d", ret
);
626 static int wl1271_build_basic_rates(char *rates
)
630 rates
[index
++] = IEEE80211_BASIC_RATE_MASK
| IEEE80211_CCK_RATE_1MB
;
631 rates
[index
++] = IEEE80211_BASIC_RATE_MASK
| IEEE80211_CCK_RATE_2MB
;
632 rates
[index
++] = IEEE80211_BASIC_RATE_MASK
| IEEE80211_CCK_RATE_5MB
;
633 rates
[index
++] = IEEE80211_BASIC_RATE_MASK
| IEEE80211_CCK_RATE_11MB
;
638 static int wl1271_build_extended_rates(char *rates
)
642 rates
[index
++] = IEEE80211_OFDM_RATE_6MB
;
643 rates
[index
++] = IEEE80211_OFDM_RATE_9MB
;
644 rates
[index
++] = IEEE80211_OFDM_RATE_12MB
;
645 rates
[index
++] = IEEE80211_OFDM_RATE_18MB
;
646 rates
[index
++] = IEEE80211_OFDM_RATE_24MB
;
647 rates
[index
++] = IEEE80211_OFDM_RATE_36MB
;
648 rates
[index
++] = IEEE80211_OFDM_RATE_48MB
;
649 rates
[index
++] = IEEE80211_OFDM_RATE_54MB
;
654 int wl1271_cmd_build_null_data(struct wl1271
*wl
)
656 struct wl12xx_null_data_template
template;
658 if (!is_zero_ether_addr(wl
->bssid
)) {
659 memcpy(template.header
.da
, wl
->bssid
, ETH_ALEN
);
660 memcpy(template.header
.bssid
, wl
->bssid
, ETH_ALEN
);
662 memset(template.header
.da
, 0xff, ETH_ALEN
);
663 memset(template.header
.bssid
, 0xff, ETH_ALEN
);
666 memcpy(template.header
.sa
, wl
->mac_addr
, ETH_ALEN
);
667 template.header
.frame_ctl
= cpu_to_le16(IEEE80211_FTYPE_DATA
|
668 IEEE80211_STYPE_NULLFUNC
);
670 return wl1271_cmd_template_set(wl
, CMD_TEMPL_NULL_DATA
, &template,
675 int wl1271_cmd_build_ps_poll(struct wl1271
*wl
, u16 aid
)
677 struct wl12xx_ps_poll_template
template;
679 memcpy(template.bssid
, wl
->bssid
, ETH_ALEN
);
680 memcpy(template.ta
, wl
->mac_addr
, ETH_ALEN
);
682 template.fc
= cpu_to_le16(IEEE80211_FTYPE_CTL
| IEEE80211_STYPE_PSPOLL
);
684 return wl1271_cmd_template_set(wl
, CMD_TEMPL_PS_POLL
, &template,
689 int wl1271_cmd_build_probe_req(struct wl1271
*wl
, u8
*ssid
, size_t ssid_len
)
691 struct wl12xx_probe_req_template
template;
692 struct wl12xx_ie_rates
*rates
;
696 ptr
= (char *)&template;
697 size
= sizeof(struct ieee80211_header
);
699 memset(template.header
.da
, 0xff, ETH_ALEN
);
700 memset(template.header
.bssid
, 0xff, ETH_ALEN
);
701 memcpy(template.header
.sa
, wl
->mac_addr
, ETH_ALEN
);
702 template.header
.frame_ctl
= cpu_to_le16(IEEE80211_STYPE_PROBE_REQ
);
706 template.ssid
.header
.id
= WLAN_EID_SSID
;
707 template.ssid
.header
.len
= ssid_len
;
708 if (ssid_len
&& ssid
)
709 memcpy(template.ssid
.ssid
, ssid
, ssid_len
);
710 size
+= sizeof(struct wl12xx_ie_header
) + ssid_len
;
714 rates
= (struct wl12xx_ie_rates
*)ptr
;
715 rates
->header
.id
= WLAN_EID_SUPP_RATES
;
716 rates
->header
.len
= wl1271_build_basic_rates(rates
->rates
);
717 size
+= sizeof(struct wl12xx_ie_header
) + rates
->header
.len
;
718 ptr
+= sizeof(struct wl12xx_ie_header
) + rates
->header
.len
;
721 rates
= (struct wl12xx_ie_rates
*)ptr
;
722 rates
->header
.id
= WLAN_EID_EXT_SUPP_RATES
;
723 rates
->header
.len
= wl1271_build_extended_rates(rates
->rates
);
724 size
+= sizeof(struct wl12xx_ie_header
) + rates
->header
.len
;
726 wl1271_dump(DEBUG_SCAN
, "PROBE REQ: ", &template, size
);
728 return wl1271_cmd_template_set(wl
, CMD_TEMPL_CFG_PROBE_REQ_2_4
,
732 int wl1271_cmd_set_default_wep_key(struct wl1271
*wl
, u8 id
)
734 struct wl1271_cmd_set_keys
*cmd
;
737 wl1271_debug(DEBUG_CMD
, "cmd set_default_wep_key %d", id
);
739 cmd
= kzalloc(sizeof(*cmd
), GFP_KERNEL
);
746 cmd
->key_action
= KEY_SET_ID
;
747 cmd
->key_type
= KEY_WEP
;
749 ret
= wl1271_cmd_send(wl
, CMD_SET_KEYS
, cmd
, sizeof(*cmd
));
751 wl1271_warning("cmd set_default_wep_key failed: %d", ret
);
761 int wl1271_cmd_set_key(struct wl1271
*wl
, u16 action
, u8 id
, u8 key_type
,
762 u8 key_size
, const u8
*key
, const u8
*addr
)
764 struct wl1271_cmd_set_keys
*cmd
;
767 cmd
= kzalloc(sizeof(*cmd
), GFP_KERNEL
);
773 if (key_type
!= KEY_WEP
)
774 memcpy(cmd
->addr
, addr
, ETH_ALEN
);
776 cmd
->key_action
= action
;
777 cmd
->key_size
= key_size
;
778 cmd
->key_type
= key_type
;
780 /* we have only one SSID profile */
781 cmd
->ssid_profile
= 0;
785 /* FIXME: this is from wl1251, needs to be checked */
786 if (key_type
== KEY_TKIP
) {
788 * We get the key in the following form:
789 * TKIP (16 bytes) - TX MIC (8 bytes) - RX MIC (8 bytes)
790 * but the target is expecting:
791 * TKIP - RX MIC - TX MIC
793 memcpy(cmd
->key
, key
, 16);
794 memcpy(cmd
->key
+ 16, key
+ 24, 8);
795 memcpy(cmd
->key
+ 24, key
+ 16, 8);
798 memcpy(cmd
->key
, key
, key_size
);
801 wl1271_dump(DEBUG_CRYPT
, "TARGET KEY: ", cmd
, sizeof(*cmd
));
803 ret
= wl1271_cmd_send(wl
, CMD_SET_KEYS
, cmd
, sizeof(*cmd
));
805 wl1271_warning("could not set keys");