2 * This file is part of wl1271
4 * Copyright (C) 2008-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 "wl1271_acx.h"
26 #include <linux/module.h>
27 #include <linux/platform_device.h>
28 #include <linux/crc7.h>
29 #include <linux/spi/spi.h>
32 #include "wl12xx_80211.h"
33 #include "wl1271_reg.h"
34 #include "wl1271_spi.h"
35 #include "wl1271_ps.h"
37 int wl1271_acx_wake_up_conditions(struct wl1271 *wl, u8 wake_up_event,
40 struct acx_wake_up_condition *wake_up;
43 wl1271_debug(DEBUG_ACX, "acx wake up conditions");
45 wake_up = kzalloc(sizeof(*wake_up), GFP_KERNEL);
51 wake_up->wake_up_event = wake_up_event;
52 wake_up->listen_interval = listen_interval;
54 ret = wl1271_cmd_configure(wl, ACX_WAKE_UP_CONDITIONS,
55 wake_up, sizeof(*wake_up));
57 wl1271_warning("could not set wake up conditions: %d", ret);
66 int wl1271_acx_sleep_auth(struct wl1271 *wl, u8 sleep_auth)
68 struct acx_sleep_auth *auth;
71 wl1271_debug(DEBUG_ACX, "acx sleep auth");
73 auth = kzalloc(sizeof(*auth), GFP_KERNEL);
79 auth->sleep_auth = sleep_auth;
81 ret = wl1271_cmd_configure(wl, ACX_SLEEP_AUTH, auth, sizeof(*auth));
90 int wl1271_acx_fw_version(struct wl1271 *wl, char *buf, size_t len)
92 struct acx_revision *rev;
95 wl1271_debug(DEBUG_ACX, "acx fw rev");
97 rev = kzalloc(sizeof(*rev), GFP_KERNEL);
103 ret = wl1271_cmd_interrogate(wl, ACX_FW_REV, rev, sizeof(*rev));
105 wl1271_warning("ACX_FW_REV interrogate failed");
109 /* be careful with the buffer sizes */
110 strncpy(buf, rev->fw_version, min(len, sizeof(rev->fw_version)));
113 * if the firmware version string is exactly
114 * sizeof(rev->fw_version) long or fw_len is less than
115 * sizeof(rev->fw_version) it won't be null terminated
117 buf[min(len, sizeof(rev->fw_version)) - 1] = '\0';
124 int wl1271_acx_tx_power(struct wl1271 *wl, int power)
126 struct acx_current_tx_power *acx;
129 wl1271_debug(DEBUG_ACX, "acx dot11_cur_tx_pwr");
131 if (power < 0 || power > 25)
134 acx = kzalloc(sizeof(*acx), GFP_KERNEL);
140 acx->current_tx_power = power * 10;
142 ret = wl1271_cmd_configure(wl, DOT11_CUR_TX_PWR, acx, sizeof(*acx));
144 wl1271_warning("configure of tx power failed: %d", ret);
153 int wl1271_acx_feature_cfg(struct wl1271 *wl)
155 struct acx_feature_config *feature;
158 wl1271_debug(DEBUG_ACX, "acx feature cfg");
160 feature = kzalloc(sizeof(*feature), GFP_KERNEL);
166 /* DF_ENCRYPTION_DISABLE and DF_SNIFF_MODE_ENABLE are disabled */
167 feature->data_flow_options = 0;
168 feature->options = 0;
170 ret = wl1271_cmd_configure(wl, ACX_FEATURE_CFG,
171 feature, sizeof(*feature));
173 wl1271_error("Couldnt set HW encryption");
182 int wl1271_acx_mem_map(struct wl1271 *wl, struct acx_header *mem_map,
187 wl1271_debug(DEBUG_ACX, "acx mem map");
189 ret = wl1271_cmd_interrogate(wl, ACX_MEM_MAP, mem_map, len);
196 int wl1271_acx_rx_msdu_life_time(struct wl1271 *wl, u32 life_time)
198 struct acx_rx_msdu_lifetime *acx;
201 wl1271_debug(DEBUG_ACX, "acx rx msdu life time");
203 acx = kzalloc(sizeof(*acx), GFP_KERNEL);
209 acx->lifetime = life_time;
210 ret = wl1271_cmd_configure(wl, DOT11_RX_MSDU_LIFE_TIME,
213 wl1271_warning("failed to set rx msdu life time: %d", ret);
222 int wl1271_acx_rx_config(struct wl1271 *wl, u32 config, u32 filter)
224 struct acx_rx_config *rx_config;
227 wl1271_debug(DEBUG_ACX, "acx rx config");
229 rx_config = kzalloc(sizeof(*rx_config), GFP_KERNEL);
235 rx_config->config_options = config;
236 rx_config->filter_options = filter;
238 ret = wl1271_cmd_configure(wl, ACX_RX_CFG,
239 rx_config, sizeof(*rx_config));
241 wl1271_warning("failed to set rx config: %d", ret);
250 int wl1271_acx_pd_threshold(struct wl1271 *wl)
252 struct acx_packet_detection *pd;
255 wl1271_debug(DEBUG_ACX, "acx data pd threshold");
257 pd = kzalloc(sizeof(*pd), GFP_KERNEL);
263 /* FIXME: threshold value not set */
265 ret = wl1271_cmd_configure(wl, ACX_PD_THRESHOLD, pd, sizeof(*pd));
267 wl1271_warning("failed to set pd threshold: %d", ret);
276 int wl1271_acx_slot(struct wl1271 *wl, enum acx_slot_type slot_time)
278 struct acx_slot *slot;
281 wl1271_debug(DEBUG_ACX, "acx slot");
283 slot = kzalloc(sizeof(*slot), GFP_KERNEL);
289 slot->wone_index = STATION_WONE_INDEX;
290 slot->slot_time = slot_time;
292 ret = wl1271_cmd_configure(wl, ACX_SLOT, slot, sizeof(*slot));
294 wl1271_warning("failed to set slot time: %d", ret);
303 int wl1271_acx_group_address_tbl(struct wl1271 *wl)
305 struct acx_dot11_grp_addr_tbl *acx;
308 wl1271_debug(DEBUG_ACX, "acx group address tbl");
310 acx = kzalloc(sizeof(*acx), GFP_KERNEL);
319 memset(acx->mac_table, 0, ADDRESS_GROUP_MAX_LEN);
321 ret = wl1271_cmd_configure(wl, DOT11_GROUP_ADDRESS_TBL,
324 wl1271_warning("failed to set group addr table: %d", ret);
333 int wl1271_acx_service_period_timeout(struct wl1271 *wl)
335 struct acx_rx_timeout *rx_timeout;
338 rx_timeout = kzalloc(sizeof(*rx_timeout), GFP_KERNEL);
344 wl1271_debug(DEBUG_ACX, "acx service period timeout");
346 rx_timeout->ps_poll_timeout = RX_TIMEOUT_PS_POLL_DEF;
347 rx_timeout->upsd_timeout = RX_TIMEOUT_UPSD_DEF;
349 ret = wl1271_cmd_configure(wl, ACX_SERVICE_PERIOD_TIMEOUT,
350 rx_timeout, sizeof(*rx_timeout));
352 wl1271_warning("failed to set service period timeout: %d",
362 int wl1271_acx_rts_threshold(struct wl1271 *wl, u16 rts_threshold)
364 struct acx_rts_threshold *rts;
367 wl1271_debug(DEBUG_ACX, "acx rts threshold");
369 rts = kzalloc(sizeof(*rts), GFP_KERNEL);
375 rts->threshold = rts_threshold;
377 ret = wl1271_cmd_configure(wl, DOT11_RTS_THRESHOLD, rts, sizeof(*rts));
379 wl1271_warning("failed to set rts threshold: %d", ret);
388 int wl1271_acx_beacon_filter_opt(struct wl1271 *wl)
390 struct acx_beacon_filter_option *beacon_filter;
393 wl1271_debug(DEBUG_ACX, "acx beacon filter opt");
395 beacon_filter = kzalloc(sizeof(*beacon_filter), GFP_KERNEL);
396 if (!beacon_filter) {
401 beacon_filter->enable = 0;
402 beacon_filter->max_num_beacons = 0;
404 ret = wl1271_cmd_configure(wl, ACX_BEACON_FILTER_OPT,
405 beacon_filter, sizeof(*beacon_filter));
407 wl1271_warning("failed to set beacon filter opt: %d", ret);
412 kfree(beacon_filter);
416 int wl1271_acx_beacon_filter_table(struct wl1271 *wl)
418 struct acx_beacon_filter_ie_table *ie_table;
421 wl1271_debug(DEBUG_ACX, "acx beacon filter table");
423 ie_table = kzalloc(sizeof(*ie_table), GFP_KERNEL);
429 ie_table->num_ie = 0;
430 memset(ie_table->table, 0, BEACON_FILTER_TABLE_MAX_SIZE);
432 ret = wl1271_cmd_configure(wl, ACX_BEACON_FILTER_TABLE,
433 ie_table, sizeof(*ie_table));
435 wl1271_warning("failed to set beacon filter table: %d", ret);
444 int wl1271_acx_sg_enable(struct wl1271 *wl)
446 struct acx_bt_wlan_coex *pta;
449 wl1271_debug(DEBUG_ACX, "acx sg enable");
451 pta = kzalloc(sizeof(*pta), GFP_KERNEL);
457 pta->enable = SG_ENABLE;
459 ret = wl1271_cmd_configure(wl, ACX_SG_ENABLE, pta, sizeof(*pta));
461 wl1271_warning("failed to set softgemini enable: %d", ret);
470 int wl1271_acx_sg_cfg(struct wl1271 *wl)
472 struct acx_bt_wlan_coex_param *param;
475 wl1271_debug(DEBUG_ACX, "acx sg cfg");
477 param = kzalloc(sizeof(*param), GFP_KERNEL);
483 /* BT-WLAN coext parameters */
484 param->min_rate = RATE_INDEX_24MBPS;
485 param->bt_hp_max_time = PTA_BT_HP_MAXTIME_DEF;
486 param->wlan_hp_max_time = PTA_WLAN_HP_MAX_TIME_DEF;
487 param->sense_disable_timer = PTA_SENSE_DISABLE_TIMER_DEF;
488 param->rx_time_bt_hp = PTA_PROTECTIVE_RX_TIME_DEF;
489 param->tx_time_bt_hp = PTA_PROTECTIVE_TX_TIME_DEF;
490 param->rx_time_bt_hp_fast = PTA_PROTECTIVE_RX_TIME_FAST_DEF;
491 param->tx_time_bt_hp_fast = PTA_PROTECTIVE_TX_TIME_FAST_DEF;
492 param->wlan_cycle_fast = PTA_CYCLE_TIME_FAST_DEF;
493 param->bt_anti_starvation_period = PTA_ANTI_STARVE_PERIOD_DEF;
494 param->next_bt_lp_packet = PTA_TIMEOUT_NEXT_BT_LP_PACKET_DEF;
495 param->wake_up_beacon = PTA_TIME_BEFORE_BEACON_DEF;
496 param->hp_dm_max_guard_time = PTA_HPDM_MAX_TIME_DEF;
497 param->next_wlan_packet = PTA_TIME_OUT_NEXT_WLAN_DEF;
498 param->antenna_type = PTA_ANTENNA_TYPE_DEF;
499 param->signal_type = PTA_SIGNALING_TYPE_DEF;
500 param->afh_leverage_on = PTA_AFH_LEVERAGE_ON_DEF;
501 param->quiet_cycle_num = PTA_NUMBER_QUIET_CYCLE_DEF;
502 param->max_cts = PTA_MAX_NUM_CTS_DEF;
503 param->wlan_packets_num = PTA_NUMBER_OF_WLAN_PACKETS_DEF;
504 param->bt_packets_num = PTA_NUMBER_OF_BT_PACKETS_DEF;
505 param->missed_rx_avalanche = PTA_RX_FOR_AVALANCHE_DEF;
506 param->wlan_elp_hp = PTA_ELP_HP_DEF;
507 param->bt_anti_starvation_cycles = PTA_ANTI_STARVE_NUM_CYCLE_DEF;
508 param->ack_mode_dual_ant = PTA_ACK_MODE_DEF;
509 param->pa_sd_enable = PTA_ALLOW_PA_SD_DEF;
510 param->pta_auto_mode_enable = PTA_AUTO_MODE_NO_CTS_DEF;
511 param->bt_hp_respected_num = PTA_BT_HP_RESPECTED_DEF;
513 ret = wl1271_cmd_configure(wl, ACX_SG_CFG, param, sizeof(*param));
515 wl1271_warning("failed to set sg config: %d", ret);
524 int wl1271_acx_cca_threshold(struct wl1271 *wl)
526 struct acx_energy_detection *detection;
529 wl1271_debug(DEBUG_ACX, "acx cca threshold");
531 detection = kzalloc(sizeof(*detection), GFP_KERNEL);
537 detection->rx_cca_threshold = CCA_THRSH_DISABLE_ENERGY_D;
538 detection->tx_energy_detection = 0;
540 ret = wl1271_cmd_configure(wl, ACX_CCA_THRESHOLD,
541 detection, sizeof(*detection));
543 wl1271_warning("failed to set cca threshold: %d", ret);
552 int wl1271_acx_bcn_dtim_options(struct wl1271 *wl)
554 struct acx_beacon_broadcast *bb;
557 wl1271_debug(DEBUG_ACX, "acx bcn dtim options");
559 bb = kzalloc(sizeof(*bb), GFP_KERNEL);
565 bb->beacon_rx_timeout = BCN_RX_TIMEOUT_DEF_VALUE;
566 bb->broadcast_timeout = BROADCAST_RX_TIMEOUT_DEF_VALUE;
567 bb->rx_broadcast_in_ps = RX_BROADCAST_IN_PS_DEF_VALUE;
568 bb->ps_poll_threshold = CONSECUTIVE_PS_POLL_FAILURE_DEF;
570 ret = wl1271_cmd_configure(wl, ACX_BCN_DTIM_OPTIONS, bb, sizeof(*bb));
572 wl1271_warning("failed to set rx config: %d", ret);
581 int wl1271_acx_aid(struct wl1271 *wl, u16 aid)
583 struct acx_aid *acx_aid;
586 wl1271_debug(DEBUG_ACX, "acx aid");
588 acx_aid = kzalloc(sizeof(*acx_aid), GFP_KERNEL);
596 ret = wl1271_cmd_configure(wl, ACX_AID, acx_aid, sizeof(*acx_aid));
598 wl1271_warning("failed to set aid: %d", ret);
607 int wl1271_acx_event_mbox_mask(struct wl1271 *wl, u32 event_mask)
609 struct acx_event_mask *mask;
612 wl1271_debug(DEBUG_ACX, "acx event mbox mask");
614 mask = kzalloc(sizeof(*mask), GFP_KERNEL);
620 /* high event mask is unused */
621 mask->high_event_mask = 0xffffffff;
623 mask->event_mask = event_mask;
625 ret = wl1271_cmd_configure(wl, ACX_EVENT_MBOX_MASK,
626 mask, sizeof(*mask));
628 wl1271_warning("failed to set acx_event_mbox_mask: %d", ret);
637 int wl1271_acx_set_preamble(struct wl1271 *wl, enum acx_preamble_type preamble)
639 struct acx_preamble *acx;
642 wl1271_debug(DEBUG_ACX, "acx_set_preamble");
644 acx = kzalloc(sizeof(*acx), GFP_KERNEL);
650 acx->preamble = preamble;
652 ret = wl1271_cmd_configure(wl, ACX_PREAMBLE_TYPE, acx, sizeof(*acx));
654 wl1271_warning("Setting of preamble failed: %d", ret);
663 int wl1271_acx_cts_protect(struct wl1271 *wl,
664 enum acx_ctsprotect_type ctsprotect)
666 struct acx_ctsprotect *acx;
669 wl1271_debug(DEBUG_ACX, "acx_set_ctsprotect");
671 acx = kzalloc(sizeof(*acx), GFP_KERNEL);
677 acx->ctsprotect = ctsprotect;
679 ret = wl1271_cmd_configure(wl, ACX_CTS_PROTECTION, acx, sizeof(*acx));
681 wl1271_warning("Setting of ctsprotect failed: %d", ret);
690 int wl1271_acx_statistics(struct wl1271 *wl, struct acx_statistics *stats)
694 wl1271_debug(DEBUG_ACX, "acx statistics");
696 ret = wl1271_cmd_interrogate(wl, ACX_STATISTICS, stats,
699 wl1271_warning("acx statistics failed: %d", ret);
706 int wl1271_acx_rate_policies(struct wl1271 *wl)
708 struct acx_rate_policy *acx;
711 wl1271_debug(DEBUG_ACX, "acx rate policies");
713 acx = kzalloc(sizeof(*acx), GFP_KERNEL);
720 /* configure one default (one-size-fits-all) rate class */
721 acx->rate_class_cnt = 1;
722 acx->rate_class[0].enabled_rates = ACX_RATE_MASK_ALL;
723 acx->rate_class[0].short_retry_limit = ACX_RATE_RETRY_LIMIT;
724 acx->rate_class[0].long_retry_limit = ACX_RATE_RETRY_LIMIT;
725 acx->rate_class[0].aflags = 0;
727 ret = wl1271_cmd_configure(wl, ACX_RATE_POLICY, acx, sizeof(*acx));
729 wl1271_warning("Setting of rate policies failed: %d", ret);
738 int wl1271_acx_ac_cfg(struct wl1271 *wl)
740 struct acx_ac_cfg *acx;
743 wl1271_debug(DEBUG_ACX, "acx access category config");
745 acx = kzalloc(sizeof(*acx), GFP_KERNEL);
753 * FIXME: Configure each AC with appropriate values (most suitable
754 * values will probably be different for each AC.
756 for (i = 0; i < WL1271_ACX_AC_COUNT; i++) {
760 * FIXME: The following default values originate from
761 * the TI reference driver. What do they mean?
767 acx->tx_op_limit = 0;
769 ret = wl1271_cmd_configure(wl, ACX_AC_CFG, acx, sizeof(*acx));
771 wl1271_warning("Setting of access category "
782 int wl1271_acx_tid_cfg(struct wl1271 *wl)
784 struct acx_tid_config *acx;
787 wl1271_debug(DEBUG_ACX, "acx tid config");
789 acx = kzalloc(sizeof(*acx), GFP_KERNEL);
796 /* FIXME: configure each TID with a different AC reference */
797 for (i = 0; i < WL1271_ACX_TID_COUNT; i++) {
799 acx->tsid = WL1271_ACX_AC_BE;
800 acx->ps_scheme = WL1271_ACX_PS_SCHEME_LEGACY;
801 acx->ack_policy = WL1271_ACX_ACK_POLICY_LEGACY;
803 ret = wl1271_cmd_configure(wl, ACX_TID_CFG, acx, sizeof(*acx));
805 wl1271_warning("Setting of tid config failed: %d", ret);
815 int wl1271_acx_frag_threshold(struct wl1271 *wl)
817 struct acx_frag_threshold *acx;
820 wl1271_debug(DEBUG_ACX, "acx frag threshold");
822 acx = kzalloc(sizeof(*acx), GFP_KERNEL);
829 acx->frag_threshold = IEEE80211_MAX_FRAG_THRESHOLD;
830 ret = wl1271_cmd_configure(wl, ACX_FRAG_CFG, acx, sizeof(*acx));
832 wl1271_warning("Setting of frag threshold failed: %d", ret);
841 int wl1271_acx_tx_config_options(struct wl1271 *wl)
843 struct acx_tx_config_options *acx;
846 wl1271_debug(DEBUG_ACX, "acx tx config options");
848 acx = kzalloc(sizeof(*acx), GFP_KERNEL);
855 acx->tx_compl_timeout = WL1271_ACX_TX_COMPL_TIMEOUT;
856 acx->tx_compl_threshold = WL1271_ACX_TX_COMPL_THRESHOLD;
857 ret = wl1271_cmd_configure(wl, ACX_TX_CONFIG_OPT, acx, sizeof(*acx));
859 wl1271_warning("Setting of tx options failed: %d", ret);
868 int wl1271_acx_mem_cfg(struct wl1271 *wl)
870 struct wl1271_acx_config_memory *mem_conf;
873 wl1271_debug(DEBUG_ACX, "wl1271 mem cfg");
875 mem_conf = kzalloc(sizeof(*mem_conf), GFP_KERNEL);
882 mem_conf->num_stations = cpu_to_le16(DEFAULT_NUM_STATIONS);
883 mem_conf->rx_mem_block_num = ACX_RX_MEM_BLOCKS;
884 mem_conf->tx_min_mem_block_num = ACX_TX_MIN_MEM_BLOCKS;
885 mem_conf->num_ssid_profiles = ACX_NUM_SSID_PROFILES;
886 mem_conf->total_tx_descriptors = ACX_TX_DESCRIPTORS;
888 ret = wl1271_cmd_configure(wl, ACX_MEM_CFG, mem_conf,
891 wl1271_warning("wl1271 mem config failed: %d", ret);
900 int wl1271_acx_init_mem_config(struct wl1271 *wl)
904 ret = wl1271_acx_mem_cfg(wl);
908 wl->target_mem_map = kzalloc(sizeof(struct wl1271_acx_mem_map),
910 if (!wl->target_mem_map) {
911 wl1271_error("couldn't allocate target memory map");
915 /* we now ask for the firmware built memory map */
916 ret = wl1271_acx_mem_map(wl, (void *)wl->target_mem_map,
917 sizeof(struct wl1271_acx_mem_map));
919 wl1271_error("couldn't retrieve firmware memory map");
920 kfree(wl->target_mem_map);
921 wl->target_mem_map = NULL;
925 /* initialize TX block book keeping */
926 wl->tx_blocks_available = wl->target_mem_map->num_tx_mem_blocks;
927 wl1271_debug(DEBUG_TX, "available tx blocks: %d",
928 wl->tx_blocks_available);
933 int wl1271_acx_init_rx_interrupt(struct wl1271 *wl)
935 struct wl1271_acx_rx_config_opt *rx_conf;
938 wl1271_debug(DEBUG_ACX, "wl1271 rx interrupt config");
940 rx_conf = kzalloc(sizeof(*rx_conf), GFP_KERNEL);
946 rx_conf->threshold = WL1271_RX_INTR_THRESHOLD_DEF;
947 rx_conf->timeout = WL1271_RX_INTR_TIMEOUT_DEF;
948 rx_conf->mblk_threshold = USHORT_MAX; /* Disabled */
949 rx_conf->queue_type = RX_QUEUE_TYPE_RX_LOW_PRIORITY;
951 ret = wl1271_cmd_configure(wl, ACX_RX_CONFIG_OPT, rx_conf,
954 wl1271_warning("wl1271 rx config opt failed: %d", ret);