linux/drivers/net/wireless/ti/wl1251/acx.c
<<
>>
Prefs
   1#include "acx.h"
   2
   3#include <linux/module.h>
   4#include <linux/slab.h>
   5
   6#include "wl1251.h"
   7#include "reg.h"
   8#include "cmd.h"
   9#include "ps.h"
  10
  11int wl1251_acx_frame_rates(struct wl1251 *wl, u8 ctrl_rate, u8 ctrl_mod,
  12                           u8 mgt_rate, u8 mgt_mod)
  13{
  14        struct acx_fw_gen_frame_rates *rates;
  15        int ret;
  16
  17        wl1251_debug(DEBUG_ACX, "acx frame rates");
  18
  19        rates = kzalloc(sizeof(*rates), GFP_KERNEL);
  20        if (!rates)
  21                return -ENOMEM;
  22
  23        rates->tx_ctrl_frame_rate = ctrl_rate;
  24        rates->tx_ctrl_frame_mod = ctrl_mod;
  25        rates->tx_mgt_frame_rate = mgt_rate;
  26        rates->tx_mgt_frame_mod = mgt_mod;
  27
  28        ret = wl1251_cmd_configure(wl, ACX_FW_GEN_FRAME_RATES,
  29                                   rates, sizeof(*rates));
  30        if (ret < 0) {
  31                wl1251_error("Failed to set FW rates and modulation");
  32                goto out;
  33        }
  34
  35out:
  36        kfree(rates);
  37        return ret;
  38}
  39
  40
  41int wl1251_acx_station_id(struct wl1251 *wl)
  42{
  43        struct acx_dot11_station_id *mac;
  44        int ret, i;
  45
  46        wl1251_debug(DEBUG_ACX, "acx dot11_station_id");
  47
  48        mac = kzalloc(sizeof(*mac), GFP_KERNEL);
  49        if (!mac)
  50                return -ENOMEM;
  51
  52        for (i = 0; i < ETH_ALEN; i++)
  53                mac->mac[i] = wl->mac_addr[ETH_ALEN - 1 - i];
  54
  55        ret = wl1251_cmd_configure(wl, DOT11_STATION_ID, mac, sizeof(*mac));
  56
  57        kfree(mac);
  58        return ret;
  59}
  60
  61int wl1251_acx_default_key(struct wl1251 *wl, u8 key_id)
  62{
  63        struct acx_dot11_default_key *default_key;
  64        int ret;
  65
  66        wl1251_debug(DEBUG_ACX, "acx dot11_default_key (%d)", key_id);
  67
  68        default_key = kzalloc(sizeof(*default_key), GFP_KERNEL);
  69        if (!default_key)
  70                return -ENOMEM;
  71
  72        default_key->id = key_id;
  73
  74        ret = wl1251_cmd_configure(wl, DOT11_DEFAULT_KEY,
  75                                   default_key, sizeof(*default_key));
  76        if (ret < 0) {
  77                wl1251_error("Couldn't set default key");
  78                goto out;
  79        }
  80
  81        wl->default_key = key_id;
  82
  83out:
  84        kfree(default_key);
  85        return ret;
  86}
  87
  88int wl1251_acx_wake_up_conditions(struct wl1251 *wl, u8 wake_up_event,
  89                                  u8 listen_interval)
  90{
  91        struct acx_wake_up_condition *wake_up;
  92        int ret;
  93
  94        wl1251_debug(DEBUG_ACX, "acx wake up conditions");
  95
  96        wake_up = kzalloc(sizeof(*wake_up), GFP_KERNEL);
  97        if (!wake_up)
  98                return -ENOMEM;
  99
 100        wake_up->wake_up_event = wake_up_event;
 101        wake_up->listen_interval = listen_interval;
 102
 103        ret = wl1251_cmd_configure(wl, ACX_WAKE_UP_CONDITIONS,
 104                                   wake_up, sizeof(*wake_up));
 105        if (ret < 0) {
 106                wl1251_warning("could not set wake up conditions: %d", ret);
 107                goto out;
 108        }
 109
 110out:
 111        kfree(wake_up);
 112        return ret;
 113}
 114
 115int wl1251_acx_sleep_auth(struct wl1251 *wl, u8 sleep_auth)
 116{
 117        struct acx_sleep_auth *auth;
 118        int ret;
 119
 120        wl1251_debug(DEBUG_ACX, "acx sleep auth");
 121
 122        auth = kzalloc(sizeof(*auth), GFP_KERNEL);
 123        if (!auth)
 124                return -ENOMEM;
 125
 126        auth->sleep_auth = sleep_auth;
 127
 128        ret = wl1251_cmd_configure(wl, ACX_SLEEP_AUTH, auth, sizeof(*auth));
 129
 130        kfree(auth);
 131        return ret;
 132}
 133
 134int wl1251_acx_fw_version(struct wl1251 *wl, char *buf, size_t len)
 135{
 136        struct acx_revision *rev;
 137        int ret;
 138
 139        wl1251_debug(DEBUG_ACX, "acx fw rev");
 140
 141        rev = kzalloc(sizeof(*rev), GFP_KERNEL);
 142        if (!rev)
 143                return -ENOMEM;
 144
 145        ret = wl1251_cmd_interrogate(wl, ACX_FW_REV, rev, sizeof(*rev));
 146        if (ret < 0) {
 147                wl1251_warning("ACX_FW_REV interrogate failed");
 148                goto out;
 149        }
 150
 151        /* be careful with the buffer sizes */
 152        strncpy(buf, rev->fw_version, min(len, sizeof(rev->fw_version)));
 153
 154        /*
 155         * if the firmware version string is exactly
 156         * sizeof(rev->fw_version) long or fw_len is less than
 157         * sizeof(rev->fw_version) it won't be null terminated
 158         */
 159        buf[min(len, sizeof(rev->fw_version)) - 1] = '\0';
 160
 161out:
 162        kfree(rev);
 163        return ret;
 164}
 165
 166int wl1251_acx_tx_power(struct wl1251 *wl, int power)
 167{
 168        struct acx_current_tx_power *acx;
 169        int ret;
 170
 171        wl1251_debug(DEBUG_ACX, "acx dot11_cur_tx_pwr");
 172
 173        if (power < 0 || power > 25)
 174                return -EINVAL;
 175
 176        acx = kzalloc(sizeof(*acx), GFP_KERNEL);
 177        if (!acx)
 178                return -ENOMEM;
 179
 180        acx->current_tx_power = power * 10;
 181
 182        ret = wl1251_cmd_configure(wl, DOT11_CUR_TX_PWR, acx, sizeof(*acx));
 183        if (ret < 0) {
 184                wl1251_warning("configure of tx power failed: %d", ret);
 185                goto out;
 186        }
 187
 188out:
 189        kfree(acx);
 190        return ret;
 191}
 192
 193int wl1251_acx_feature_cfg(struct wl1251 *wl, u32 data_flow_options)
 194{
 195        struct acx_feature_config *feature;
 196        int ret;
 197
 198        wl1251_debug(DEBUG_ACX, "acx feature cfg");
 199
 200        feature = kzalloc(sizeof(*feature), GFP_KERNEL);
 201        if (!feature)
 202                return -ENOMEM;
 203
 204        /* DF_ENCRYPTION_DISABLE and DF_SNIFF_MODE_ENABLE can be set */
 205        feature->data_flow_options = data_flow_options;
 206        feature->options = 0;
 207
 208        ret = wl1251_cmd_configure(wl, ACX_FEATURE_CFG,
 209                                   feature, sizeof(*feature));
 210        if (ret < 0) {
 211                wl1251_error("Couldn't set HW encryption");
 212                goto out;
 213        }
 214
 215out:
 216        kfree(feature);
 217        return ret;
 218}
 219
 220int wl1251_acx_mem_map(struct wl1251 *wl, struct acx_header *mem_map,
 221                       size_t len)
 222{
 223        int ret;
 224
 225        wl1251_debug(DEBUG_ACX, "acx mem map");
 226
 227        ret = wl1251_cmd_interrogate(wl, ACX_MEM_MAP, mem_map, len);
 228        if (ret < 0)
 229                return ret;
 230
 231        return 0;
 232}
 233
 234int wl1251_acx_data_path_params(struct wl1251 *wl,
 235                                struct acx_data_path_params_resp *resp)
 236{
 237        struct acx_data_path_params *params;
 238        int ret;
 239
 240        wl1251_debug(DEBUG_ACX, "acx data path params");
 241
 242        params = kzalloc(sizeof(*params), GFP_KERNEL);
 243        if (!params)
 244                return -ENOMEM;
 245
 246        params->rx_packet_ring_chunk_size = DP_RX_PACKET_RING_CHUNK_SIZE;
 247        params->tx_packet_ring_chunk_size = DP_TX_PACKET_RING_CHUNK_SIZE;
 248
 249        params->rx_packet_ring_chunk_num = DP_RX_PACKET_RING_CHUNK_NUM;
 250        params->tx_packet_ring_chunk_num = DP_TX_PACKET_RING_CHUNK_NUM;
 251
 252        params->tx_complete_threshold = 1;
 253
 254        params->tx_complete_ring_depth = FW_TX_CMPLT_BLOCK_SIZE;
 255
 256        params->tx_complete_timeout = DP_TX_COMPLETE_TIME_OUT;
 257
 258        ret = wl1251_cmd_configure(wl, ACX_DATA_PATH_PARAMS,
 259                                   params, sizeof(*params));
 260        if (ret < 0)
 261                goto out;
 262
 263        /* FIXME: shouldn't this be ACX_DATA_PATH_RESP_PARAMS? */
 264        ret = wl1251_cmd_interrogate(wl, ACX_DATA_PATH_PARAMS,
 265                                     resp, sizeof(*resp));
 266
 267        if (ret < 0) {
 268                wl1251_warning("failed to read data path parameters: %d", ret);
 269                goto out;
 270        } else if (resp->header.cmd.status != CMD_STATUS_SUCCESS) {
 271                wl1251_warning("data path parameter acx status failed");
 272                ret = -EIO;
 273                goto out;
 274        }
 275
 276out:
 277        kfree(params);
 278        return ret;
 279}
 280
 281int wl1251_acx_rx_msdu_life_time(struct wl1251 *wl, u32 life_time)
 282{
 283        struct acx_rx_msdu_lifetime *acx;
 284        int ret;
 285
 286        wl1251_debug(DEBUG_ACX, "acx rx msdu life time");
 287
 288        acx = kzalloc(sizeof(*acx), GFP_KERNEL);
 289        if (!acx)
 290                return -ENOMEM;
 291
 292        acx->lifetime = life_time;
 293        ret = wl1251_cmd_configure(wl, DOT11_RX_MSDU_LIFE_TIME,
 294                                   acx, sizeof(*acx));
 295        if (ret < 0) {
 296                wl1251_warning("failed to set rx msdu life time: %d", ret);
 297                goto out;
 298        }
 299
 300out:
 301        kfree(acx);
 302        return ret;
 303}
 304
 305int wl1251_acx_rx_config(struct wl1251 *wl, u32 config, u32 filter)
 306{
 307        struct acx_rx_config *rx_config;
 308        int ret;
 309
 310        wl1251_debug(DEBUG_ACX, "acx rx config");
 311
 312        rx_config = kzalloc(sizeof(*rx_config), GFP_KERNEL);
 313        if (!rx_config)
 314                return -ENOMEM;
 315
 316        rx_config->config_options = config;
 317        rx_config->filter_options = filter;
 318
 319        ret = wl1251_cmd_configure(wl, ACX_RX_CFG,
 320                                   rx_config, sizeof(*rx_config));
 321        if (ret < 0) {
 322                wl1251_warning("failed to set rx config: %d", ret);
 323                goto out;
 324        }
 325
 326out:
 327        kfree(rx_config);
 328        return ret;
 329}
 330
 331int wl1251_acx_pd_threshold(struct wl1251 *wl)
 332{
 333        struct acx_packet_detection *pd;
 334        int ret;
 335
 336        wl1251_debug(DEBUG_ACX, "acx data pd threshold");
 337
 338        pd = kzalloc(sizeof(*pd), GFP_KERNEL);
 339        if (!pd)
 340                return -ENOMEM;
 341
 342        /* FIXME: threshold value not set */
 343
 344        ret = wl1251_cmd_configure(wl, ACX_PD_THRESHOLD, pd, sizeof(*pd));
 345        if (ret < 0) {
 346                wl1251_warning("failed to set pd threshold: %d", ret);
 347                goto out;
 348        }
 349
 350out:
 351        kfree(pd);
 352        return ret;
 353}
 354
 355int wl1251_acx_slot(struct wl1251 *wl, enum acx_slot_type slot_time)
 356{
 357        struct acx_slot *slot;
 358        int ret;
 359
 360        wl1251_debug(DEBUG_ACX, "acx slot");
 361
 362        slot = kzalloc(sizeof(*slot), GFP_KERNEL);
 363        if (!slot)
 364                return -ENOMEM;
 365
 366        slot->wone_index = STATION_WONE_INDEX;
 367        slot->slot_time = slot_time;
 368
 369        ret = wl1251_cmd_configure(wl, ACX_SLOT, slot, sizeof(*slot));
 370        if (ret < 0) {
 371                wl1251_warning("failed to set slot time: %d", ret);
 372                goto out;
 373        }
 374
 375out:
 376        kfree(slot);
 377        return ret;
 378}
 379
 380int wl1251_acx_group_address_tbl(struct wl1251 *wl, bool enable,
 381                                 void *mc_list, u32 mc_list_len)
 382{
 383        struct acx_dot11_grp_addr_tbl *acx;
 384        int ret;
 385
 386        wl1251_debug(DEBUG_ACX, "acx group address tbl");
 387
 388        acx = kzalloc(sizeof(*acx), GFP_KERNEL);
 389        if (!acx)
 390                return -ENOMEM;
 391
 392        /* MAC filtering */
 393        acx->enabled = enable;
 394        acx->num_groups = mc_list_len;
 395        memcpy(acx->mac_table, mc_list, mc_list_len * ETH_ALEN);
 396
 397        ret = wl1251_cmd_configure(wl, DOT11_GROUP_ADDRESS_TBL,
 398                                   acx, sizeof(*acx));
 399        if (ret < 0) {
 400                wl1251_warning("failed to set group addr table: %d", ret);
 401                goto out;
 402        }
 403
 404out:
 405        kfree(acx);
 406        return ret;
 407}
 408
 409int wl1251_acx_service_period_timeout(struct wl1251 *wl)
 410{
 411        struct acx_rx_timeout *rx_timeout;
 412        int ret;
 413
 414        rx_timeout = kzalloc(sizeof(*rx_timeout), GFP_KERNEL);
 415        if (!rx_timeout)
 416                return -ENOMEM;
 417
 418        wl1251_debug(DEBUG_ACX, "acx service period timeout");
 419
 420        rx_timeout->ps_poll_timeout = RX_TIMEOUT_PS_POLL_DEF;
 421        rx_timeout->upsd_timeout = RX_TIMEOUT_UPSD_DEF;
 422
 423        ret = wl1251_cmd_configure(wl, ACX_SERVICE_PERIOD_TIMEOUT,
 424                                   rx_timeout, sizeof(*rx_timeout));
 425        if (ret < 0) {
 426                wl1251_warning("failed to set service period timeout: %d",
 427                               ret);
 428                goto out;
 429        }
 430
 431out:
 432        kfree(rx_timeout);
 433        return ret;
 434}
 435
 436int wl1251_acx_rts_threshold(struct wl1251 *wl, u16 rts_threshold)
 437{
 438        struct acx_rts_threshold *rts;
 439        int ret;
 440
 441        wl1251_debug(DEBUG_ACX, "acx rts threshold");
 442
 443        rts = kzalloc(sizeof(*rts), GFP_KERNEL);
 444        if (!rts)
 445                return -ENOMEM;
 446
 447        rts->threshold = rts_threshold;
 448
 449        ret = wl1251_cmd_configure(wl, DOT11_RTS_THRESHOLD, rts, sizeof(*rts));
 450        if (ret < 0) {
 451                wl1251_warning("failed to set rts threshold: %d", ret);
 452                goto out;
 453        }
 454
 455out:
 456        kfree(rts);
 457        return ret;
 458}
 459
 460int wl1251_acx_beacon_filter_opt(struct wl1251 *wl, bool enable_filter)
 461{
 462        struct acx_beacon_filter_option *beacon_filter;
 463        int ret;
 464
 465        wl1251_debug(DEBUG_ACX, "acx beacon filter opt");
 466
 467        beacon_filter = kzalloc(sizeof(*beacon_filter), GFP_KERNEL);
 468        if (!beacon_filter)
 469                return -ENOMEM;
 470
 471        beacon_filter->enable = enable_filter;
 472        beacon_filter->max_num_beacons = 0;
 473
 474        ret = wl1251_cmd_configure(wl, ACX_BEACON_FILTER_OPT,
 475                                   beacon_filter, sizeof(*beacon_filter));
 476        if (ret < 0) {
 477                wl1251_warning("failed to set beacon filter opt: %d", ret);
 478                goto out;
 479        }
 480
 481out:
 482        kfree(beacon_filter);
 483        return ret;
 484}
 485
 486int wl1251_acx_beacon_filter_table(struct wl1251 *wl)
 487{
 488        struct acx_beacon_filter_ie_table *ie_table;
 489        int idx = 0;
 490        int ret;
 491
 492        wl1251_debug(DEBUG_ACX, "acx beacon filter table");
 493
 494        ie_table = kzalloc(sizeof(*ie_table), GFP_KERNEL);
 495        if (!ie_table)
 496                return -ENOMEM;
 497
 498        /* configure default beacon pass-through rules */
 499        ie_table->num_ie = 1;
 500        ie_table->table[idx++] = BEACON_FILTER_IE_ID_CHANNEL_SWITCH_ANN;
 501        ie_table->table[idx++] = BEACON_RULE_PASS_ON_APPEARANCE;
 502
 503        ret = wl1251_cmd_configure(wl, ACX_BEACON_FILTER_TABLE,
 504                                   ie_table, sizeof(*ie_table));
 505        if (ret < 0) {
 506                wl1251_warning("failed to set beacon filter table: %d", ret);
 507                goto out;
 508        }
 509
 510out:
 511        kfree(ie_table);
 512        return ret;
 513}
 514
 515int wl1251_acx_conn_monit_params(struct wl1251 *wl)
 516{
 517        struct acx_conn_monit_params *acx;
 518        int ret;
 519
 520        wl1251_debug(DEBUG_ACX, "acx connection monitor parameters");
 521
 522        acx = kzalloc(sizeof(*acx), GFP_KERNEL);
 523        if (!acx)
 524                return -ENOMEM;
 525
 526        acx->synch_fail_thold = SYNCH_FAIL_DEFAULT_THRESHOLD;
 527        acx->bss_lose_timeout = NO_BEACON_DEFAULT_TIMEOUT;
 528
 529        ret = wl1251_cmd_configure(wl, ACX_CONN_MONIT_PARAMS,
 530                                   acx, sizeof(*acx));
 531        if (ret < 0) {
 532                wl1251_warning("failed to set connection monitor "
 533                               "parameters: %d", ret);
 534                goto out;
 535        }
 536
 537out:
 538        kfree(acx);
 539        return ret;
 540}
 541
 542int wl1251_acx_sg_enable(struct wl1251 *wl)
 543{
 544        struct acx_bt_wlan_coex *pta;
 545        int ret;
 546
 547        wl1251_debug(DEBUG_ACX, "acx sg enable");
 548
 549        pta = kzalloc(sizeof(*pta), GFP_KERNEL);
 550        if (!pta)
 551                return -ENOMEM;
 552
 553        pta->enable = SG_ENABLE;
 554
 555        ret = wl1251_cmd_configure(wl, ACX_SG_ENABLE, pta, sizeof(*pta));
 556        if (ret < 0) {
 557                wl1251_warning("failed to set softgemini enable: %d", ret);
 558                goto out;
 559        }
 560
 561out:
 562        kfree(pta);
 563        return ret;
 564}
 565
 566int wl1251_acx_sg_cfg(struct wl1251 *wl)
 567{
 568        struct acx_bt_wlan_coex_param *param;
 569        int ret;
 570
 571        wl1251_debug(DEBUG_ACX, "acx sg cfg");
 572
 573        param = kzalloc(sizeof(*param), GFP_KERNEL);
 574        if (!param)
 575                return -ENOMEM;
 576
 577        /* BT-WLAN coext parameters */
 578        param->min_rate = RATE_INDEX_24MBPS;
 579        param->bt_hp_max_time = PTA_BT_HP_MAXTIME_DEF;
 580        param->wlan_hp_max_time = PTA_WLAN_HP_MAX_TIME_DEF;
 581        param->sense_disable_timer = PTA_SENSE_DISABLE_TIMER_DEF;
 582        param->rx_time_bt_hp = PTA_PROTECTIVE_RX_TIME_DEF;
 583        param->tx_time_bt_hp = PTA_PROTECTIVE_TX_TIME_DEF;
 584        param->rx_time_bt_hp_fast = PTA_PROTECTIVE_RX_TIME_FAST_DEF;
 585        param->tx_time_bt_hp_fast = PTA_PROTECTIVE_TX_TIME_FAST_DEF;
 586        param->wlan_cycle_fast = PTA_CYCLE_TIME_FAST_DEF;
 587        param->bt_anti_starvation_period = PTA_ANTI_STARVE_PERIOD_DEF;
 588        param->next_bt_lp_packet = PTA_TIMEOUT_NEXT_BT_LP_PACKET_DEF;
 589        param->wake_up_beacon = PTA_TIME_BEFORE_BEACON_DEF;
 590        param->hp_dm_max_guard_time = PTA_HPDM_MAX_TIME_DEF;
 591        param->next_wlan_packet = PTA_TIME_OUT_NEXT_WLAN_DEF;
 592        param->antenna_type = PTA_ANTENNA_TYPE_DEF;
 593        param->signal_type = PTA_SIGNALING_TYPE_DEF;
 594        param->afh_leverage_on = PTA_AFH_LEVERAGE_ON_DEF;
 595        param->quiet_cycle_num = PTA_NUMBER_QUIET_CYCLE_DEF;
 596        param->max_cts = PTA_MAX_NUM_CTS_DEF;
 597        param->wlan_packets_num = PTA_NUMBER_OF_WLAN_PACKETS_DEF;
 598        param->bt_packets_num = PTA_NUMBER_OF_BT_PACKETS_DEF;
 599        param->missed_rx_avalanche = PTA_RX_FOR_AVALANCHE_DEF;
 600        param->wlan_elp_hp = PTA_ELP_HP_DEF;
 601        param->bt_anti_starvation_cycles = PTA_ANTI_STARVE_NUM_CYCLE_DEF;
 602        param->ack_mode_dual_ant = PTA_ACK_MODE_DEF;
 603        param->pa_sd_enable = PTA_ALLOW_PA_SD_DEF;
 604        param->pta_auto_mode_enable = PTA_AUTO_MODE_NO_CTS_DEF;
 605        param->bt_hp_respected_num = PTA_BT_HP_RESPECTED_DEF;
 606
 607        ret = wl1251_cmd_configure(wl, ACX_SG_CFG, param, sizeof(*param));
 608        if (ret < 0) {
 609                wl1251_warning("failed to set sg config: %d", ret);
 610                goto out;
 611        }
 612
 613out:
 614        kfree(param);
 615        return ret;
 616}
 617
 618int wl1251_acx_cca_threshold(struct wl1251 *wl)
 619{
 620        struct acx_energy_detection *detection;
 621        int ret;
 622
 623        wl1251_debug(DEBUG_ACX, "acx cca threshold");
 624
 625        detection = kzalloc(sizeof(*detection), GFP_KERNEL);
 626        if (!detection)
 627                return -ENOMEM;
 628
 629        detection->rx_cca_threshold = CCA_THRSH_DISABLE_ENERGY_D;
 630        detection->tx_energy_detection = 0;
 631
 632        ret = wl1251_cmd_configure(wl, ACX_CCA_THRESHOLD,
 633                                   detection, sizeof(*detection));
 634        if (ret < 0)
 635                wl1251_warning("failed to set cca threshold: %d", ret);
 636
 637        kfree(detection);
 638        return ret;
 639}
 640
 641int wl1251_acx_bcn_dtim_options(struct wl1251 *wl)
 642{
 643        struct acx_beacon_broadcast *bb;
 644        int ret;
 645
 646        wl1251_debug(DEBUG_ACX, "acx bcn dtim options");
 647
 648        bb = kzalloc(sizeof(*bb), GFP_KERNEL);
 649        if (!bb)
 650                return -ENOMEM;
 651
 652        bb->beacon_rx_timeout = BCN_RX_TIMEOUT_DEF_VALUE;
 653        bb->broadcast_timeout = BROADCAST_RX_TIMEOUT_DEF_VALUE;
 654        bb->rx_broadcast_in_ps = RX_BROADCAST_IN_PS_DEF_VALUE;
 655        bb->ps_poll_threshold = CONSECUTIVE_PS_POLL_FAILURE_DEF;
 656
 657        ret = wl1251_cmd_configure(wl, ACX_BCN_DTIM_OPTIONS, bb, sizeof(*bb));
 658        if (ret < 0) {
 659                wl1251_warning("failed to set rx config: %d", ret);
 660                goto out;
 661        }
 662
 663out:
 664        kfree(bb);
 665        return ret;
 666}
 667
 668int wl1251_acx_aid(struct wl1251 *wl, u16 aid)
 669{
 670        struct acx_aid *acx_aid;
 671        int ret;
 672
 673        wl1251_debug(DEBUG_ACX, "acx aid");
 674
 675        acx_aid = kzalloc(sizeof(*acx_aid), GFP_KERNEL);
 676        if (!acx_aid)
 677                return -ENOMEM;
 678
 679        acx_aid->aid = aid;
 680
 681        ret = wl1251_cmd_configure(wl, ACX_AID, acx_aid, sizeof(*acx_aid));
 682        if (ret < 0) {
 683                wl1251_warning("failed to set aid: %d", ret);
 684                goto out;
 685        }
 686
 687out:
 688        kfree(acx_aid);
 689        return ret;
 690}
 691
 692int wl1251_acx_event_mbox_mask(struct wl1251 *wl, u32 event_mask)
 693{
 694        struct acx_event_mask *mask;
 695        int ret;
 696
 697        wl1251_debug(DEBUG_ACX, "acx event mbox mask");
 698
 699        mask = kzalloc(sizeof(*mask), GFP_KERNEL);
 700        if (!mask)
 701                return -ENOMEM;
 702
 703        /* high event mask is unused */
 704        mask->high_event_mask = 0xffffffff;
 705
 706        mask->event_mask = event_mask;
 707
 708        ret = wl1251_cmd_configure(wl, ACX_EVENT_MBOX_MASK,
 709                                   mask, sizeof(*mask));
 710        if (ret < 0) {
 711                wl1251_warning("failed to set acx_event_mbox_mask: %d", ret);
 712                goto out;
 713        }
 714
 715out:
 716        kfree(mask);
 717        return ret;
 718}
 719
 720int wl1251_acx_low_rssi(struct wl1251 *wl, s8 threshold, u8 weight,
 721                        u8 depth, enum wl1251_acx_low_rssi_type type)
 722{
 723        struct acx_low_rssi *rssi;
 724        int ret;
 725
 726        wl1251_debug(DEBUG_ACX, "acx low rssi");
 727
 728        rssi = kzalloc(sizeof(*rssi), GFP_KERNEL);
 729        if (!rssi)
 730                return -ENOMEM;
 731
 732        rssi->threshold = threshold;
 733        rssi->weight = weight;
 734        rssi->depth = depth;
 735        rssi->type = type;
 736
 737        ret = wl1251_cmd_configure(wl, ACX_LOW_RSSI, rssi, sizeof(*rssi));
 738        if (ret < 0)
 739                wl1251_warning("failed to set low rssi threshold: %d", ret);
 740
 741        kfree(rssi);
 742        return ret;
 743}
 744
 745int wl1251_acx_set_preamble(struct wl1251 *wl, enum acx_preamble_type preamble)
 746{
 747        struct acx_preamble *acx;
 748        int ret;
 749
 750        wl1251_debug(DEBUG_ACX, "acx_set_preamble");
 751
 752        acx = kzalloc(sizeof(*acx), GFP_KERNEL);
 753        if (!acx)
 754                return -ENOMEM;
 755
 756        acx->preamble = preamble;
 757
 758        ret = wl1251_cmd_configure(wl, ACX_PREAMBLE_TYPE, acx, sizeof(*acx));
 759        if (ret < 0) {
 760                wl1251_warning("Setting of preamble failed: %d", ret);
 761                goto out;
 762        }
 763
 764out:
 765        kfree(acx);
 766        return ret;
 767}
 768
 769int wl1251_acx_cts_protect(struct wl1251 *wl,
 770                           enum acx_ctsprotect_type ctsprotect)
 771{
 772        struct acx_ctsprotect *acx;
 773        int ret;
 774
 775        wl1251_debug(DEBUG_ACX, "acx_set_ctsprotect");
 776
 777        acx = kzalloc(sizeof(*acx), GFP_KERNEL);
 778        if (!acx)
 779                return -ENOMEM;
 780
 781        acx->ctsprotect = ctsprotect;
 782
 783        ret = wl1251_cmd_configure(wl, ACX_CTS_PROTECTION, acx, sizeof(*acx));
 784        if (ret < 0) {
 785                wl1251_warning("Setting of ctsprotect failed: %d", ret);
 786                goto out;
 787        }
 788
 789out:
 790        kfree(acx);
 791        return ret;
 792}
 793
 794int wl1251_acx_tsf_info(struct wl1251 *wl, u64 *mactime)
 795{
 796        struct acx_tsf_info *tsf_info;
 797        int ret;
 798
 799        tsf_info = kzalloc(sizeof(*tsf_info), GFP_KERNEL);
 800        if (!tsf_info)
 801                return -ENOMEM;
 802
 803        ret = wl1251_cmd_interrogate(wl, ACX_TSF_INFO,
 804                                     tsf_info, sizeof(*tsf_info));
 805        if (ret < 0) {
 806                wl1251_warning("ACX_FW_REV interrogate failed");
 807                goto out;
 808        }
 809
 810        *mactime = tsf_info->current_tsf_lsb |
 811                ((u64)tsf_info->current_tsf_msb << 32);
 812
 813out:
 814        kfree(tsf_info);
 815        return ret;
 816}
 817
 818int wl1251_acx_statistics(struct wl1251 *wl, struct acx_statistics *stats)
 819{
 820        int ret;
 821
 822        wl1251_debug(DEBUG_ACX, "acx statistics");
 823
 824        ret = wl1251_cmd_interrogate(wl, ACX_STATISTICS, stats,
 825                                     sizeof(*stats));
 826        if (ret < 0) {
 827                wl1251_warning("acx statistics failed: %d", ret);
 828                return -ENOMEM;
 829        }
 830
 831        return 0;
 832}
 833
 834int wl1251_acx_rate_policies(struct wl1251 *wl)
 835{
 836        struct acx_rate_policy *acx;
 837        int ret = 0;
 838
 839        wl1251_debug(DEBUG_ACX, "acx rate policies");
 840
 841        acx = kzalloc(sizeof(*acx), GFP_KERNEL);
 842        if (!acx)
 843                return -ENOMEM;
 844
 845        /* configure one default (one-size-fits-all) rate class */
 846        acx->rate_class_cnt = 2;
 847        acx->rate_class[0].enabled_rates = ACX_RATE_MASK_UNSPECIFIED;
 848        acx->rate_class[0].short_retry_limit = ACX_RATE_RETRY_LIMIT;
 849        acx->rate_class[0].long_retry_limit = ACX_RATE_RETRY_LIMIT;
 850        acx->rate_class[0].aflags = 0;
 851
 852        /* no-retry rate class */
 853        acx->rate_class[1].enabled_rates = ACX_RATE_MASK_UNSPECIFIED;
 854        acx->rate_class[1].short_retry_limit = 0;
 855        acx->rate_class[1].long_retry_limit = 0;
 856        acx->rate_class[1].aflags = 0;
 857
 858        ret = wl1251_cmd_configure(wl, ACX_RATE_POLICY, acx, sizeof(*acx));
 859        if (ret < 0) {
 860                wl1251_warning("Setting of rate policies failed: %d", ret);
 861                goto out;
 862        }
 863
 864out:
 865        kfree(acx);
 866        return ret;
 867}
 868
 869int wl1251_acx_mem_cfg(struct wl1251 *wl)
 870{
 871        struct wl1251_acx_config_memory *mem_conf;
 872        int ret, i;
 873
 874        wl1251_debug(DEBUG_ACX, "acx mem cfg");
 875
 876        mem_conf = kzalloc(sizeof(*mem_conf), GFP_KERNEL);
 877        if (!mem_conf)
 878                return -ENOMEM;
 879
 880        /* memory config */
 881        mem_conf->mem_config.num_stations = cpu_to_le16(DEFAULT_NUM_STATIONS);
 882        mem_conf->mem_config.rx_mem_block_num = 35;
 883        mem_conf->mem_config.tx_min_mem_block_num = 64;
 884        mem_conf->mem_config.num_tx_queues = MAX_TX_QUEUES;
 885        mem_conf->mem_config.host_if_options = HOSTIF_PKT_RING;
 886        mem_conf->mem_config.num_ssid_profiles = 1;
 887        mem_conf->mem_config.debug_buffer_size =
 888                cpu_to_le16(TRACE_BUFFER_MAX_SIZE);
 889
 890        /* RX queue config */
 891        mem_conf->rx_queue_config.dma_address = 0;
 892        mem_conf->rx_queue_config.num_descs = ACX_RX_DESC_DEF;
 893        mem_conf->rx_queue_config.priority = DEFAULT_RXQ_PRIORITY;
 894        mem_conf->rx_queue_config.type = DEFAULT_RXQ_TYPE;
 895
 896        /* TX queue config */
 897        for (i = 0; i < MAX_TX_QUEUES; i++) {
 898                mem_conf->tx_queue_config[i].num_descs = ACX_TX_DESC_DEF;
 899                mem_conf->tx_queue_config[i].attributes = i;
 900        }
 901
 902        ret = wl1251_cmd_configure(wl, ACX_MEM_CFG, mem_conf,
 903                                   sizeof(*mem_conf));
 904        if (ret < 0) {
 905                wl1251_warning("wl1251 mem config failed: %d", ret);
 906                goto out;
 907        }
 908
 909out:
 910        kfree(mem_conf);
 911        return ret;
 912}
 913
 914int wl1251_acx_wr_tbtt_and_dtim(struct wl1251 *wl, u16 tbtt, u8 dtim)
 915{
 916        struct wl1251_acx_wr_tbtt_and_dtim *acx;
 917        int ret;
 918
 919        wl1251_debug(DEBUG_ACX, "acx tbtt and dtim");
 920
 921        acx = kzalloc(sizeof(*acx), GFP_KERNEL);
 922        if (!acx)
 923                return -ENOMEM;
 924
 925        acx->tbtt = tbtt;
 926        acx->dtim = dtim;
 927
 928        ret = wl1251_cmd_configure(wl, ACX_WR_TBTT_AND_DTIM,
 929                                   acx, sizeof(*acx));
 930        if (ret < 0) {
 931                wl1251_warning("failed to set tbtt and dtim: %d", ret);
 932                goto out;
 933        }
 934
 935out:
 936        kfree(acx);
 937        return ret;
 938}
 939
 940int wl1251_acx_bet_enable(struct wl1251 *wl, enum wl1251_acx_bet_mode mode,
 941                          u8 max_consecutive)
 942{
 943        struct wl1251_acx_bet_enable *acx;
 944        int ret;
 945
 946        wl1251_debug(DEBUG_ACX, "acx bet enable");
 947
 948        acx = kzalloc(sizeof(*acx), GFP_KERNEL);
 949        if (!acx)
 950                return -ENOMEM;
 951
 952        acx->enable = mode;
 953        acx->max_consecutive = max_consecutive;
 954
 955        ret = wl1251_cmd_configure(wl, ACX_BET_ENABLE, acx, sizeof(*acx));
 956        if (ret < 0) {
 957                wl1251_warning("wl1251 acx bet enable failed: %d", ret);
 958                goto out;
 959        }
 960
 961out:
 962        kfree(acx);
 963        return ret;
 964}
 965
 966int wl1251_acx_arp_ip_filter(struct wl1251 *wl, bool enable, __be32 address)
 967{
 968        struct wl1251_acx_arp_filter *acx;
 969        int ret;
 970
 971        wl1251_debug(DEBUG_ACX, "acx arp ip filter, enable: %d", enable);
 972
 973        acx = kzalloc(sizeof(*acx), GFP_KERNEL);
 974        if (!acx)
 975                return -ENOMEM;
 976
 977        acx->version = ACX_IPV4_VERSION;
 978        acx->enable = enable;
 979
 980        if (enable)
 981                memcpy(acx->address, &address, ACX_IPV4_ADDR_SIZE);
 982
 983        ret = wl1251_cmd_configure(wl, ACX_ARP_IP_FILTER,
 984                                   acx, sizeof(*acx));
 985        if (ret < 0)
 986                wl1251_warning("failed to set arp ip filter: %d", ret);
 987
 988        kfree(acx);
 989        return ret;
 990}
 991
 992int wl1251_acx_ac_cfg(struct wl1251 *wl, u8 ac, u8 cw_min, u16 cw_max,
 993                      u8 aifs, u16 txop)
 994{
 995        struct wl1251_acx_ac_cfg *acx;
 996        int ret = 0;
 997
 998        wl1251_debug(DEBUG_ACX, "acx ac cfg %d cw_ming %d cw_max %d "
 999                     "aifs %d txop %d", ac, cw_min, cw_max, aifs, txop);
1000
1001        acx = kzalloc(sizeof(*acx), GFP_KERNEL);
1002        if (!acx)
1003                return -ENOMEM;
1004
1005        acx->ac = ac;
1006        acx->cw_min = cw_min;
1007        acx->cw_max = cw_max;
1008        acx->aifsn = aifs;
1009        acx->txop_limit = txop;
1010
1011        ret = wl1251_cmd_configure(wl, ACX_AC_CFG, acx, sizeof(*acx));
1012        if (ret < 0) {
1013                wl1251_warning("acx ac cfg failed: %d", ret);
1014                goto out;
1015        }
1016
1017out:
1018        kfree(acx);
1019        return ret;
1020}
1021
1022int wl1251_acx_tid_cfg(struct wl1251 *wl, u8 queue,
1023                       enum wl1251_acx_channel_type type,
1024                       u8 tsid, enum wl1251_acx_ps_scheme ps_scheme,
1025                       enum wl1251_acx_ack_policy ack_policy)
1026{
1027        struct wl1251_acx_tid_cfg *acx;
1028        int ret = 0;
1029
1030        wl1251_debug(DEBUG_ACX, "acx tid cfg %d type %d tsid %d "
1031                     "ps_scheme %d ack_policy %d", queue, type, tsid,
1032                     ps_scheme, ack_policy);
1033
1034        acx = kzalloc(sizeof(*acx), GFP_KERNEL);
1035        if (!acx)
1036                return -ENOMEM;
1037
1038        acx->queue = queue;
1039        acx->type = type;
1040        acx->tsid = tsid;
1041        acx->ps_scheme = ps_scheme;
1042        acx->ack_policy = ack_policy;
1043
1044        ret = wl1251_cmd_configure(wl, ACX_TID_CFG, acx, sizeof(*acx));
1045        if (ret < 0) {
1046                wl1251_warning("acx tid cfg failed: %d", ret);
1047                goto out;
1048        }
1049
1050out:
1051        kfree(acx);
1052        return ret;
1053}
1054