Save sram context after changing MPU, DSP or core clocks
[linux-ginger.git] / drivers / net / wireless / wl12xx / wl1271_acx.c
blobf622a40926150b6de6fc8a2117b0f7ea556567e0
1 /*
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
20 * 02110-1301 USA
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>
31 #include "wl1271.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,
38 u8 listen_interval)
40 struct acx_wake_up_condition *wake_up;
41 int ret;
43 wl1271_debug(DEBUG_ACX, "acx wake up conditions");
45 wake_up = kzalloc(sizeof(*wake_up), GFP_KERNEL);
46 if (!wake_up) {
47 ret = -ENOMEM;
48 goto out;
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));
56 if (ret < 0) {
57 wl1271_warning("could not set wake up conditions: %d", ret);
58 goto out;
61 out:
62 kfree(wake_up);
63 return ret;
66 int wl1271_acx_sleep_auth(struct wl1271 *wl, u8 sleep_auth)
68 struct acx_sleep_auth *auth;
69 int ret;
71 wl1271_debug(DEBUG_ACX, "acx sleep auth");
73 auth = kzalloc(sizeof(*auth), GFP_KERNEL);
74 if (!auth) {
75 ret = -ENOMEM;
76 goto out;
79 auth->sleep_auth = sleep_auth;
81 ret = wl1271_cmd_configure(wl, ACX_SLEEP_AUTH, auth, sizeof(*auth));
82 if (ret < 0)
83 return ret;
85 out:
86 kfree(auth);
87 return ret;
90 int wl1271_acx_fw_version(struct wl1271 *wl, char *buf, size_t len)
92 struct acx_revision *rev;
93 int ret;
95 wl1271_debug(DEBUG_ACX, "acx fw rev");
97 rev = kzalloc(sizeof(*rev), GFP_KERNEL);
98 if (!rev) {
99 ret = -ENOMEM;
100 goto out;
103 ret = wl1271_cmd_interrogate(wl, ACX_FW_REV, rev, sizeof(*rev));
104 if (ret < 0) {
105 wl1271_warning("ACX_FW_REV interrogate failed");
106 goto out;
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';
119 out:
120 kfree(rev);
121 return ret;
124 int wl1271_acx_tx_power(struct wl1271 *wl, int power)
126 struct acx_current_tx_power *acx;
127 int ret;
129 wl1271_debug(DEBUG_ACX, "acx dot11_cur_tx_pwr");
131 if (power < 0 || power > 25)
132 return -EINVAL;
134 acx = kzalloc(sizeof(*acx), GFP_KERNEL);
135 if (!acx) {
136 ret = -ENOMEM;
137 goto out;
140 acx->current_tx_power = power * 10;
142 ret = wl1271_cmd_configure(wl, DOT11_CUR_TX_PWR, acx, sizeof(*acx));
143 if (ret < 0) {
144 wl1271_warning("configure of tx power failed: %d", ret);
145 goto out;
148 out:
149 kfree(acx);
150 return ret;
153 int wl1271_acx_feature_cfg(struct wl1271 *wl)
155 struct acx_feature_config *feature;
156 int ret;
158 wl1271_debug(DEBUG_ACX, "acx feature cfg");
160 feature = kzalloc(sizeof(*feature), GFP_KERNEL);
161 if (!feature) {
162 ret = -ENOMEM;
163 goto out;
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));
172 if (ret < 0) {
173 wl1271_error("Couldnt set HW encryption");
174 goto out;
177 out:
178 kfree(feature);
179 return ret;
182 int wl1271_acx_mem_map(struct wl1271 *wl, struct acx_header *mem_map,
183 size_t len)
185 int ret;
187 wl1271_debug(DEBUG_ACX, "acx mem map");
189 ret = wl1271_cmd_interrogate(wl, ACX_MEM_MAP, mem_map, len);
190 if (ret < 0)
191 return ret;
193 return 0;
196 int wl1271_acx_rx_msdu_life_time(struct wl1271 *wl, u32 life_time)
198 struct acx_rx_msdu_lifetime *acx;
199 int ret;
201 wl1271_debug(DEBUG_ACX, "acx rx msdu life time");
203 acx = kzalloc(sizeof(*acx), GFP_KERNEL);
204 if (!acx) {
205 ret = -ENOMEM;
206 goto out;
209 acx->lifetime = life_time;
210 ret = wl1271_cmd_configure(wl, DOT11_RX_MSDU_LIFE_TIME,
211 acx, sizeof(*acx));
212 if (ret < 0) {
213 wl1271_warning("failed to set rx msdu life time: %d", ret);
214 goto out;
217 out:
218 kfree(acx);
219 return ret;
222 int wl1271_acx_rx_config(struct wl1271 *wl, u32 config, u32 filter)
224 struct acx_rx_config *rx_config;
225 int ret;
227 wl1271_debug(DEBUG_ACX, "acx rx config");
229 rx_config = kzalloc(sizeof(*rx_config), GFP_KERNEL);
230 if (!rx_config) {
231 ret = -ENOMEM;
232 goto out;
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));
240 if (ret < 0) {
241 wl1271_warning("failed to set rx config: %d", ret);
242 goto out;
245 out:
246 kfree(rx_config);
247 return ret;
250 int wl1271_acx_pd_threshold(struct wl1271 *wl)
252 struct acx_packet_detection *pd;
253 int ret;
255 wl1271_debug(DEBUG_ACX, "acx data pd threshold");
257 pd = kzalloc(sizeof(*pd), GFP_KERNEL);
258 if (!pd) {
259 ret = -ENOMEM;
260 goto out;
263 /* FIXME: threshold value not set */
265 ret = wl1271_cmd_configure(wl, ACX_PD_THRESHOLD, pd, sizeof(*pd));
266 if (ret < 0) {
267 wl1271_warning("failed to set pd threshold: %d", ret);
268 goto out;
271 out:
272 kfree(pd);
273 return 0;
276 int wl1271_acx_slot(struct wl1271 *wl, enum acx_slot_type slot_time)
278 struct acx_slot *slot;
279 int ret;
281 wl1271_debug(DEBUG_ACX, "acx slot");
283 slot = kzalloc(sizeof(*slot), GFP_KERNEL);
284 if (!slot) {
285 ret = -ENOMEM;
286 goto out;
289 slot->wone_index = STATION_WONE_INDEX;
290 slot->slot_time = slot_time;
292 ret = wl1271_cmd_configure(wl, ACX_SLOT, slot, sizeof(*slot));
293 if (ret < 0) {
294 wl1271_warning("failed to set slot time: %d", ret);
295 goto out;
298 out:
299 kfree(slot);
300 return ret;
303 int wl1271_acx_group_address_tbl(struct wl1271 *wl)
305 struct acx_dot11_grp_addr_tbl *acx;
306 int ret;
308 wl1271_debug(DEBUG_ACX, "acx group address tbl");
310 acx = kzalloc(sizeof(*acx), GFP_KERNEL);
311 if (!acx) {
312 ret = -ENOMEM;
313 goto out;
316 /* MAC filtering */
317 acx->enabled = 0;
318 acx->num_groups = 0;
319 memset(acx->mac_table, 0, ADDRESS_GROUP_MAX_LEN);
321 ret = wl1271_cmd_configure(wl, DOT11_GROUP_ADDRESS_TBL,
322 acx, sizeof(*acx));
323 if (ret < 0) {
324 wl1271_warning("failed to set group addr table: %d", ret);
325 goto out;
328 out:
329 kfree(acx);
330 return ret;
333 int wl1271_acx_service_period_timeout(struct wl1271 *wl)
335 struct acx_rx_timeout *rx_timeout;
336 int ret;
338 rx_timeout = kzalloc(sizeof(*rx_timeout), GFP_KERNEL);
339 if (!rx_timeout) {
340 ret = -ENOMEM;
341 goto out;
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));
351 if (ret < 0) {
352 wl1271_warning("failed to set service period timeout: %d",
353 ret);
354 goto out;
357 out:
358 kfree(rx_timeout);
359 return ret;
362 int wl1271_acx_rts_threshold(struct wl1271 *wl, u16 rts_threshold)
364 struct acx_rts_threshold *rts;
365 int ret;
367 wl1271_debug(DEBUG_ACX, "acx rts threshold");
369 rts = kzalloc(sizeof(*rts), GFP_KERNEL);
370 if (!rts) {
371 ret = -ENOMEM;
372 goto out;
375 rts->threshold = rts_threshold;
377 ret = wl1271_cmd_configure(wl, DOT11_RTS_THRESHOLD, rts, sizeof(*rts));
378 if (ret < 0) {
379 wl1271_warning("failed to set rts threshold: %d", ret);
380 goto out;
383 out:
384 kfree(rts);
385 return ret;
388 int wl1271_acx_beacon_filter_opt(struct wl1271 *wl)
390 struct acx_beacon_filter_option *beacon_filter;
391 int ret;
393 wl1271_debug(DEBUG_ACX, "acx beacon filter opt");
395 beacon_filter = kzalloc(sizeof(*beacon_filter), GFP_KERNEL);
396 if (!beacon_filter) {
397 ret = -ENOMEM;
398 goto out;
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));
406 if (ret < 0) {
407 wl1271_warning("failed to set beacon filter opt: %d", ret);
408 goto out;
411 out:
412 kfree(beacon_filter);
413 return ret;
416 int wl1271_acx_beacon_filter_table(struct wl1271 *wl)
418 struct acx_beacon_filter_ie_table *ie_table;
419 int ret;
421 wl1271_debug(DEBUG_ACX, "acx beacon filter table");
423 ie_table = kzalloc(sizeof(*ie_table), GFP_KERNEL);
424 if (!ie_table) {
425 ret = -ENOMEM;
426 goto out;
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));
434 if (ret < 0) {
435 wl1271_warning("failed to set beacon filter table: %d", ret);
436 goto out;
439 out:
440 kfree(ie_table);
441 return ret;
444 int wl1271_acx_sg_enable(struct wl1271 *wl)
446 struct acx_bt_wlan_coex *pta;
447 int ret;
449 wl1271_debug(DEBUG_ACX, "acx sg enable");
451 pta = kzalloc(sizeof(*pta), GFP_KERNEL);
452 if (!pta) {
453 ret = -ENOMEM;
454 goto out;
457 pta->enable = SG_ENABLE;
459 ret = wl1271_cmd_configure(wl, ACX_SG_ENABLE, pta, sizeof(*pta));
460 if (ret < 0) {
461 wl1271_warning("failed to set softgemini enable: %d", ret);
462 goto out;
465 out:
466 kfree(pta);
467 return ret;
470 int wl1271_acx_sg_cfg(struct wl1271 *wl)
472 struct acx_bt_wlan_coex_param *param;
473 int ret;
475 wl1271_debug(DEBUG_ACX, "acx sg cfg");
477 param = kzalloc(sizeof(*param), GFP_KERNEL);
478 if (!param) {
479 ret = -ENOMEM;
480 goto out;
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));
514 if (ret < 0) {
515 wl1271_warning("failed to set sg config: %d", ret);
516 goto out;
519 out:
520 kfree(param);
521 return ret;
524 int wl1271_acx_cca_threshold(struct wl1271 *wl)
526 struct acx_energy_detection *detection;
527 int ret;
529 wl1271_debug(DEBUG_ACX, "acx cca threshold");
531 detection = kzalloc(sizeof(*detection), GFP_KERNEL);
532 if (!detection) {
533 ret = -ENOMEM;
534 goto out;
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));
542 if (ret < 0) {
543 wl1271_warning("failed to set cca threshold: %d", ret);
544 return ret;
547 out:
548 kfree(detection);
549 return ret;
552 int wl1271_acx_bcn_dtim_options(struct wl1271 *wl)
554 struct acx_beacon_broadcast *bb;
555 int ret;
557 wl1271_debug(DEBUG_ACX, "acx bcn dtim options");
559 bb = kzalloc(sizeof(*bb), GFP_KERNEL);
560 if (!bb) {
561 ret = -ENOMEM;
562 goto out;
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));
571 if (ret < 0) {
572 wl1271_warning("failed to set rx config: %d", ret);
573 goto out;
576 out:
577 kfree(bb);
578 return ret;
581 int wl1271_acx_aid(struct wl1271 *wl, u16 aid)
583 struct acx_aid *acx_aid;
584 int ret;
586 wl1271_debug(DEBUG_ACX, "acx aid");
588 acx_aid = kzalloc(sizeof(*acx_aid), GFP_KERNEL);
589 if (!acx_aid) {
590 ret = -ENOMEM;
591 goto out;
594 acx_aid->aid = aid;
596 ret = wl1271_cmd_configure(wl, ACX_AID, acx_aid, sizeof(*acx_aid));
597 if (ret < 0) {
598 wl1271_warning("failed to set aid: %d", ret);
599 goto out;
602 out:
603 kfree(acx_aid);
604 return ret;
607 int wl1271_acx_event_mbox_mask(struct wl1271 *wl, u32 event_mask)
609 struct acx_event_mask *mask;
610 int ret;
612 wl1271_debug(DEBUG_ACX, "acx event mbox mask");
614 mask = kzalloc(sizeof(*mask), GFP_KERNEL);
615 if (!mask) {
616 ret = -ENOMEM;
617 goto out;
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));
627 if (ret < 0) {
628 wl1271_warning("failed to set acx_event_mbox_mask: %d", ret);
629 goto out;
632 out:
633 kfree(mask);
634 return ret;
637 int wl1271_acx_set_preamble(struct wl1271 *wl, enum acx_preamble_type preamble)
639 struct acx_preamble *acx;
640 int ret;
642 wl1271_debug(DEBUG_ACX, "acx_set_preamble");
644 acx = kzalloc(sizeof(*acx), GFP_KERNEL);
645 if (!acx) {
646 ret = -ENOMEM;
647 goto out;
650 acx->preamble = preamble;
652 ret = wl1271_cmd_configure(wl, ACX_PREAMBLE_TYPE, acx, sizeof(*acx));
653 if (ret < 0) {
654 wl1271_warning("Setting of preamble failed: %d", ret);
655 goto out;
658 out:
659 kfree(acx);
660 return ret;
663 int wl1271_acx_cts_protect(struct wl1271 *wl,
664 enum acx_ctsprotect_type ctsprotect)
666 struct acx_ctsprotect *acx;
667 int ret;
669 wl1271_debug(DEBUG_ACX, "acx_set_ctsprotect");
671 acx = kzalloc(sizeof(*acx), GFP_KERNEL);
672 if (!acx) {
673 ret = -ENOMEM;
674 goto out;
677 acx->ctsprotect = ctsprotect;
679 ret = wl1271_cmd_configure(wl, ACX_CTS_PROTECTION, acx, sizeof(*acx));
680 if (ret < 0) {
681 wl1271_warning("Setting of ctsprotect failed: %d", ret);
682 goto out;
685 out:
686 kfree(acx);
687 return ret;
690 int wl1271_acx_statistics(struct wl1271 *wl, struct acx_statistics *stats)
692 int ret;
694 wl1271_debug(DEBUG_ACX, "acx statistics");
696 ret = wl1271_cmd_interrogate(wl, ACX_STATISTICS, stats,
697 sizeof(*stats));
698 if (ret < 0) {
699 wl1271_warning("acx statistics failed: %d", ret);
700 return -ENOMEM;
703 return 0;
706 int wl1271_acx_rate_policies(struct wl1271 *wl)
708 struct acx_rate_policy *acx;
709 int ret = 0;
711 wl1271_debug(DEBUG_ACX, "acx rate policies");
713 acx = kzalloc(sizeof(*acx), GFP_KERNEL);
715 if (!acx) {
716 ret = -ENOMEM;
717 goto out;
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));
728 if (ret < 0) {
729 wl1271_warning("Setting of rate policies failed: %d", ret);
730 goto out;
733 out:
734 kfree(acx);
735 return ret;
738 int wl1271_acx_ac_cfg(struct wl1271 *wl)
740 struct acx_ac_cfg *acx;
741 int i, ret = 0;
743 wl1271_debug(DEBUG_ACX, "acx access category config");
745 acx = kzalloc(sizeof(*acx), GFP_KERNEL);
747 if (!acx) {
748 ret = -ENOMEM;
749 goto out;
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++) {
757 acx->ac = i;
760 * FIXME: The following default values originate from
761 * the TI reference driver. What do they mean?
763 acx->cw_min = 15;
764 acx->cw_max = 63;
765 acx->aifsn = 3;
766 acx->reserved = 0;
767 acx->tx_op_limit = 0;
769 ret = wl1271_cmd_configure(wl, ACX_AC_CFG, acx, sizeof(*acx));
770 if (ret < 0) {
771 wl1271_warning("Setting of access category "
772 "config: %d", ret);
773 goto out;
777 out:
778 kfree(acx);
779 return ret;
782 int wl1271_acx_tid_cfg(struct wl1271 *wl)
784 struct acx_tid_config *acx;
785 int i, ret = 0;
787 wl1271_debug(DEBUG_ACX, "acx tid config");
789 acx = kzalloc(sizeof(*acx), GFP_KERNEL);
791 if (!acx) {
792 ret = -ENOMEM;
793 goto out;
796 /* FIXME: configure each TID with a different AC reference */
797 for (i = 0; i < WL1271_ACX_TID_COUNT; i++) {
798 acx->queue_id = 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));
804 if (ret < 0) {
805 wl1271_warning("Setting of tid config failed: %d", ret);
806 goto out;
810 out:
811 kfree(acx);
812 return ret;
815 int wl1271_acx_frag_threshold(struct wl1271 *wl)
817 struct acx_frag_threshold *acx;
818 int ret = 0;
820 wl1271_debug(DEBUG_ACX, "acx frag threshold");
822 acx = kzalloc(sizeof(*acx), GFP_KERNEL);
824 if (!acx) {
825 ret = -ENOMEM;
826 goto out;
829 acx->frag_threshold = IEEE80211_MAX_FRAG_THRESHOLD;
830 ret = wl1271_cmd_configure(wl, ACX_FRAG_CFG, acx, sizeof(*acx));
831 if (ret < 0) {
832 wl1271_warning("Setting of frag threshold failed: %d", ret);
833 goto out;
836 out:
837 kfree(acx);
838 return ret;
841 int wl1271_acx_tx_config_options(struct wl1271 *wl)
843 struct acx_tx_config_options *acx;
844 int ret = 0;
846 wl1271_debug(DEBUG_ACX, "acx tx config options");
848 acx = kzalloc(sizeof(*acx), GFP_KERNEL);
850 if (!acx) {
851 ret = -ENOMEM;
852 goto out;
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));
858 if (ret < 0) {
859 wl1271_warning("Setting of tx options failed: %d", ret);
860 goto out;
863 out:
864 kfree(acx);
865 return ret;
868 int wl1271_acx_mem_cfg(struct wl1271 *wl)
870 struct wl1271_acx_config_memory *mem_conf;
871 int ret;
873 wl1271_debug(DEBUG_ACX, "wl1271 mem cfg");
875 mem_conf = kzalloc(sizeof(*mem_conf), GFP_KERNEL);
876 if (!mem_conf) {
877 ret = -ENOMEM;
878 goto out;
881 /* memory config */
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,
889 sizeof(*mem_conf));
890 if (ret < 0) {
891 wl1271_warning("wl1271 mem config failed: %d", ret);
892 goto out;
895 out:
896 kfree(mem_conf);
897 return ret;
900 int wl1271_acx_init_mem_config(struct wl1271 *wl)
902 int ret;
904 ret = wl1271_acx_mem_cfg(wl);
905 if (ret < 0)
906 return ret;
908 wl->target_mem_map = kzalloc(sizeof(struct wl1271_acx_mem_map),
909 GFP_KERNEL);
910 if (!wl->target_mem_map) {
911 wl1271_error("couldn't allocate target memory map");
912 return -ENOMEM;
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));
918 if (ret < 0) {
919 wl1271_error("couldn't retrieve firmware memory map");
920 kfree(wl->target_mem_map);
921 wl->target_mem_map = NULL;
922 return ret;
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);
930 return 0;
933 int wl1271_acx_init_rx_interrupt(struct wl1271 *wl)
935 struct wl1271_acx_rx_config_opt *rx_conf;
936 int ret;
938 wl1271_debug(DEBUG_ACX, "wl1271 rx interrupt config");
940 rx_conf = kzalloc(sizeof(*rx_conf), GFP_KERNEL);
941 if (!rx_conf) {
942 ret = -ENOMEM;
943 goto out;
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,
952 sizeof(*rx_conf));
953 if (ret < 0) {
954 wl1271_warning("wl1271 rx config opt failed: %d", ret);
955 goto out;
958 out:
959 kfree(rx_conf);
960 return ret;