cmd.h revision 3b40c04071ce3c0d74d19518ef884fed5c981fd7
1/* 2 * This file is part of wl1271 3 * 4 * Copyright (C) 1998-2009 Texas Instruments. All rights reserved. 5 * Copyright (C) 2009 Nokia Corporation 6 * 7 * Contact: Luciano Coelho <luciano.coelho@nokia.com> 8 * 9 * This program is free software; you can redistribute it and/or 10 * modify it under the terms of the GNU General Public License 11 * version 2 as published by the Free Software Foundation. 12 * 13 * This program is distributed in the hope that it will be useful, but 14 * WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16 * General Public License for more details. 17 * 18 * You should have received a copy of the GNU General Public License 19 * along with this program; if not, write to the Free Software 20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 21 * 02110-1301 USA 22 * 23 */ 24 25#ifndef __CMD_H__ 26#define __CMD_H__ 27 28#include "wl12xx.h" 29 30struct acx_header; 31 32int wl1271_cmd_send(struct wl1271 *wl, u16 id, void *buf, size_t len, 33 size_t res_len); 34int wl1271_cmd_general_parms(struct wl1271 *wl); 35int wl128x_cmd_general_parms(struct wl1271 *wl); 36int wl1271_cmd_radio_parms(struct wl1271 *wl); 37int wl128x_cmd_radio_parms(struct wl1271 *wl); 38int wl1271_cmd_ext_radio_parms(struct wl1271 *wl); 39int wl1271_cmd_join(struct wl1271 *wl, u8 bss_type); 40int wl1271_cmd_test(struct wl1271 *wl, void *buf, size_t buf_len, u8 answer); 41int wl1271_cmd_interrogate(struct wl1271 *wl, u16 id, void *buf, size_t len); 42int wl1271_cmd_configure(struct wl1271 *wl, u16 id, void *buf, size_t len); 43int wl1271_cmd_data_path(struct wl1271 *wl, bool enable); 44int wl1271_cmd_ps_mode(struct wl1271 *wl, u8 ps_mode); 45int wl1271_cmd_read_memory(struct wl1271 *wl, u32 addr, void *answer, 46 size_t len); 47int wl1271_cmd_template_set(struct wl1271 *wl, u16 template_id, 48 void *buf, size_t buf_len, int index, u32 rates); 49int wl1271_cmd_build_null_data(struct wl1271 *wl); 50int wl1271_cmd_build_ps_poll(struct wl1271 *wl, u16 aid); 51int wl1271_cmd_build_probe_req(struct wl1271 *wl, 52 const u8 *ssid, size_t ssid_len, 53 const u8 *ie, size_t ie_len, u8 band); 54struct sk_buff *wl1271_cmd_build_ap_probe_req(struct wl1271 *wl, 55 struct sk_buff *skb); 56int wl1271_cmd_build_arp_rsp(struct wl1271 *wl, __be32 ip_addr); 57int wl1271_build_qos_null_data(struct wl1271 *wl); 58int wl1271_cmd_build_klv_null_data(struct wl1271 *wl); 59int wl1271_cmd_set_sta_default_wep_key(struct wl1271 *wl, u8 id); 60int wl1271_cmd_set_ap_default_wep_key(struct wl1271 *wl, u8 id); 61int wl1271_cmd_set_sta_key(struct wl1271 *wl, u16 action, u8 id, u8 key_type, 62 u8 key_size, const u8 *key, const u8 *addr, 63 u32 tx_seq_32, u16 tx_seq_16); 64int wl1271_cmd_set_ap_key(struct wl1271 *wl, u16 action, u8 id, u8 key_type, 65 u8 key_size, const u8 *key, u8 hlid, u32 tx_seq_32, 66 u16 tx_seq_16); 67int wl1271_cmd_disconnect(struct wl1271 *wl); 68int wl1271_cmd_set_sta_state(struct wl1271 *wl); 69int wl1271_cmd_start_bss(struct wl1271 *wl); 70int wl1271_cmd_stop_bss(struct wl1271 *wl); 71int wl1271_cmd_add_sta(struct wl1271 *wl, struct ieee80211_sta *sta, u8 hlid); 72int wl1271_cmd_remove_sta(struct wl1271 *wl, u8 hlid); 73int wl12xx_cmd_config_fwlog(struct wl1271 *wl); 74int wl12xx_cmd_start_fwlog(struct wl1271 *wl); 75int wl12xx_cmd_stop_fwlog(struct wl1271 *wl); 76 77enum wl1271_commands { 78 CMD_INTERROGATE = 1, /*use this to read information elements*/ 79 CMD_CONFIGURE = 2, /*use this to write information elements*/ 80 CMD_ENABLE_RX = 3, 81 CMD_ENABLE_TX = 4, 82 CMD_DISABLE_RX = 5, 83 CMD_DISABLE_TX = 6, 84 CMD_SCAN = 8, 85 CMD_STOP_SCAN = 9, 86 CMD_START_JOIN = 11, 87 CMD_SET_KEYS = 12, 88 CMD_READ_MEMORY = 13, 89 CMD_WRITE_MEMORY = 14, 90 CMD_SET_TEMPLATE = 19, 91 CMD_TEST = 23, 92 CMD_NOISE_HIST = 28, 93 CMD_LNA_CONTROL = 32, 94 CMD_SET_BCN_MODE = 33, 95 CMD_MEASUREMENT = 34, 96 CMD_STOP_MEASUREMENT = 35, 97 CMD_DISCONNECT = 36, 98 CMD_SET_PS_MODE = 37, 99 CMD_CHANNEL_SWITCH = 38, 100 CMD_STOP_CHANNEL_SWICTH = 39, 101 CMD_AP_DISCOVERY = 40, 102 CMD_STOP_AP_DISCOVERY = 41, 103 CMD_SPS_SCAN = 42, 104 CMD_STOP_SPS_SCAN = 43, 105 CMD_HEALTH_CHECK = 45, 106 CMD_DEBUG = 46, 107 CMD_TRIGGER_SCAN_TO = 47, 108 CMD_CONNECTION_SCAN_CFG = 48, 109 CMD_CONNECTION_SCAN_SSID_CFG = 49, 110 CMD_START_PERIODIC_SCAN = 50, 111 CMD_STOP_PERIODIC_SCAN = 51, 112 CMD_SET_STA_STATE = 52, 113 CMD_CONFIG_FWLOGGER = 53, 114 CMD_START_FWLOGGER = 54, 115 CMD_STOP_FWLOGGER = 55, 116 117 /* AP mode commands */ 118 CMD_BSS_START = 60, 119 CMD_BSS_STOP = 61, 120 CMD_ADD_STA = 62, 121 CMD_REMOVE_STA = 63, 122 123 NUM_COMMANDS, 124 MAX_COMMAND_ID = 0xFFFF, 125}; 126 127#define MAX_CMD_PARAMS 572 128 129enum { 130 CMD_TEMPL_KLV_IDX_NULL_DATA = 0, 131 CMD_TEMPL_KLV_IDX_MAX = 4 132}; 133 134enum cmd_templ { 135 CMD_TEMPL_NULL_DATA = 0, 136 CMD_TEMPL_BEACON, 137 CMD_TEMPL_CFG_PROBE_REQ_2_4, 138 CMD_TEMPL_CFG_PROBE_REQ_5, 139 CMD_TEMPL_PROBE_RESPONSE, 140 CMD_TEMPL_QOS_NULL_DATA, 141 CMD_TEMPL_PS_POLL, 142 CMD_TEMPL_KLV, 143 CMD_TEMPL_DISCONNECT, 144 CMD_TEMPL_PROBE_REQ_2_4, /* for firmware internal use only */ 145 CMD_TEMPL_PROBE_REQ_5, /* for firmware internal use only */ 146 CMD_TEMPL_BAR, /* for firmware internal use only */ 147 CMD_TEMPL_CTS, /* 148 * For CTS-to-self (FastCTS) mechanism 149 * for BT/WLAN coexistence (SoftGemini). */ 150 CMD_TEMPL_ARP_RSP, 151 CMD_TEMPL_LINK_MEASUREMENT_REPORT, 152 153 /* AP-mode specific */ 154 CMD_TEMPL_AP_BEACON = 13, 155 CMD_TEMPL_AP_PROBE_RESPONSE, 156 CMD_TEMPL_AP_ARP_RSP, 157 CMD_TEMPL_DEAUTH_AP, 158 159 CMD_TEMPL_MAX = 0xff 160}; 161 162/* unit ms */ 163#define WL1271_COMMAND_TIMEOUT 2000 164#define WL1271_CMD_TEMPL_MAX_SIZE 252 165#define WL1271_EVENT_TIMEOUT 750 166 167struct wl1271_cmd_header { 168 __le16 id; 169 __le16 status; 170 /* payload */ 171 u8 data[0]; 172} __packed; 173 174#define WL1271_CMD_MAX_PARAMS 572 175 176struct wl1271_command { 177 struct wl1271_cmd_header header; 178 u8 parameters[WL1271_CMD_MAX_PARAMS]; 179} __packed; 180 181enum { 182 CMD_MAILBOX_IDLE = 0, 183 CMD_STATUS_SUCCESS = 1, 184 CMD_STATUS_UNKNOWN_CMD = 2, 185 CMD_STATUS_UNKNOWN_IE = 3, 186 CMD_STATUS_REJECT_MEAS_SG_ACTIVE = 11, 187 CMD_STATUS_RX_BUSY = 13, 188 CMD_STATUS_INVALID_PARAM = 14, 189 CMD_STATUS_TEMPLATE_TOO_LARGE = 15, 190 CMD_STATUS_OUT_OF_MEMORY = 16, 191 CMD_STATUS_STA_TABLE_FULL = 17, 192 CMD_STATUS_RADIO_ERROR = 18, 193 CMD_STATUS_WRONG_NESTING = 19, 194 CMD_STATUS_TIMEOUT = 21, /* Driver internal use.*/ 195 CMD_STATUS_FW_RESET = 22, /* Driver internal use.*/ 196 MAX_COMMAND_STATUS = 0xff 197}; 198 199#define CMDMBOX_HEADER_LEN 4 200#define CMDMBOX_INFO_ELEM_HEADER_LEN 4 201 202enum { 203 BSS_TYPE_IBSS = 0, 204 BSS_TYPE_STA_BSS = 2, 205 BSS_TYPE_AP_BSS = 3, 206 MAX_BSS_TYPE = 0xFF 207}; 208 209#define WL1271_JOIN_CMD_CTRL_TX_FLUSH 0x80 /* Firmware flushes all Tx */ 210#define WL1271_JOIN_CMD_TX_SESSION_OFFSET 1 211#define WL1271_JOIN_CMD_BSS_TYPE_5GHZ 0x10 212 213struct wl1271_cmd_join { 214 struct wl1271_cmd_header header; 215 216 __le32 bssid_lsb; 217 __le16 bssid_msb; 218 __le16 beacon_interval; /* in TBTTs */ 219 __le32 rx_config_options; 220 __le32 rx_filter_options; 221 222 /* 223 * The target uses this field to determine the rate at 224 * which to transmit control frame responses (such as 225 * ACK or CTS frames). 226 */ 227 __le32 basic_rate_set; 228 __le32 supported_rate_set; 229 u8 dtim_interval; 230 /* 231 * bits 0-2: This bitwise field specifies the type 232 * of BSS to start or join (BSS_TYPE_*). 233 * bit 4: Band - The radio band in which to join 234 * or start. 235 * 0 - 2.4GHz band 236 * 1 - 5GHz band 237 * bits 3, 5-7: Reserved 238 */ 239 u8 bss_type; 240 u8 channel; 241 u8 ssid_len; 242 u8 ssid[IEEE80211_MAX_SSID_LEN]; 243 u8 ctrl; /* JOIN_CMD_CTRL_* */ 244 u8 reserved[3]; 245} __packed; 246 247struct cmd_enabledisable_path { 248 struct wl1271_cmd_header header; 249 250 u8 channel; 251 u8 padding[3]; 252} __packed; 253 254#define WL1271_RATE_AUTOMATIC 0 255 256struct wl1271_cmd_template_set { 257 struct wl1271_cmd_header header; 258 259 __le16 len; 260 u8 template_type; 261 u8 index; /* relevant only for KLV_TEMPLATE type */ 262 __le32 enabled_rates; 263 u8 short_retry_limit; 264 u8 long_retry_limit; 265 u8 aflags; 266 u8 reserved; 267 u8 template_data[WL1271_CMD_TEMPL_MAX_SIZE]; 268} __packed; 269 270#define TIM_ELE_ID 5 271#define PARTIAL_VBM_MAX 251 272 273struct wl1271_tim { 274 u8 identity; 275 u8 length; 276 u8 dtim_count; 277 u8 dtim_period; 278 u8 bitmap_ctrl; 279 u8 pvb_field[PARTIAL_VBM_MAX]; /* Partial Virtual Bitmap */ 280} __packed; 281 282enum wl1271_cmd_ps_mode { 283 STATION_ACTIVE_MODE, 284 STATION_POWER_SAVE_MODE 285}; 286 287struct wl1271_cmd_ps_params { 288 struct wl1271_cmd_header header; 289 290 u8 ps_mode; /* STATION_* */ 291 u8 padding[3]; 292} __packed; 293 294/* HW encryption keys */ 295#define NUM_ACCESS_CATEGORIES_COPY 4 296 297enum wl1271_cmd_key_action { 298 KEY_ADD_OR_REPLACE = 1, 299 KEY_REMOVE = 2, 300 KEY_SET_ID = 3, 301 MAX_KEY_ACTION = 0xffff, 302}; 303 304enum wl1271_cmd_key_type { 305 KEY_NONE = 0, 306 KEY_WEP = 1, 307 KEY_TKIP = 2, 308 KEY_AES = 3, 309 KEY_GEM = 4, 310}; 311 312/* FIXME: Add description for key-types */ 313 314struct wl1271_cmd_set_sta_keys { 315 struct wl1271_cmd_header header; 316 317 /* Ignored for default WEP key */ 318 u8 addr[ETH_ALEN]; 319 320 /* key_action_e */ 321 __le16 key_action; 322 323 __le16 reserved_1; 324 325 /* key size in bytes */ 326 u8 key_size; 327 328 /* key_type_e */ 329 u8 key_type; 330 u8 ssid_profile; 331 332 /* 333 * TKIP, AES: frame's key id field. 334 * For WEP default key: key id; 335 */ 336 u8 id; 337 u8 reserved_2[6]; 338 u8 key[MAX_KEY_SIZE]; 339 __le16 ac_seq_num16[NUM_ACCESS_CATEGORIES_COPY]; 340 __le32 ac_seq_num32[NUM_ACCESS_CATEGORIES_COPY]; 341} __packed; 342 343enum wl1271_cmd_lid_key_type { 344 UNICAST_LID_TYPE = 0, 345 BROADCAST_LID_TYPE = 1, 346 WEP_DEFAULT_LID_TYPE = 2 347}; 348 349struct wl1271_cmd_set_ap_keys { 350 struct wl1271_cmd_header header; 351 352 /* 353 * Indicates whether the HLID is a unicast key set 354 * or broadcast key set. A special value 0xFF is 355 * used to indicate that the HLID is on WEP-default 356 * (multi-hlids). of type wl1271_cmd_lid_key_type. 357 */ 358 u8 hlid; 359 360 /* 361 * In WEP-default network (hlid == 0xFF) used to 362 * indicate which network STA/IBSS/AP role should be 363 * changed 364 */ 365 u8 lid_key_type; 366 367 /* 368 * Key ID - For TKIP and AES key types, this field 369 * indicates the value that should be inserted into 370 * the KeyID field of frames transmitted using this 371 * key entry. For broadcast keys the index use as a 372 * marker for TX/RX key. 373 * For WEP default network (HLID=0xFF), this field 374 * indicates the ID of the key to add or remove. 375 */ 376 u8 key_id; 377 u8 reserved_1; 378 379 /* key_action_e */ 380 __le16 key_action; 381 382 /* key size in bytes */ 383 u8 key_size; 384 385 /* key_type_e */ 386 u8 key_type; 387 388 /* This field holds the security key data to add to the STA table */ 389 u8 key[MAX_KEY_SIZE]; 390 __le16 ac_seq_num16[NUM_ACCESS_CATEGORIES_COPY]; 391 __le32 ac_seq_num32[NUM_ACCESS_CATEGORIES_COPY]; 392} __packed; 393 394struct wl1271_cmd_test_header { 395 u8 id; 396 u8 padding[3]; 397} __packed; 398 399enum wl1271_channel_tune_bands { 400 WL1271_CHANNEL_TUNE_BAND_2_4, 401 WL1271_CHANNEL_TUNE_BAND_5, 402 WL1271_CHANNEL_TUNE_BAND_4_9 403}; 404 405#define WL1271_PD_REFERENCE_POINT_BAND_B_G 0 406 407#define TEST_CMD_INI_FILE_RADIO_PARAM 0x19 408#define TEST_CMD_INI_FILE_GENERAL_PARAM 0x1E 409#define TEST_CMD_INI_FILE_RF_EXTENDED_PARAM 0x26 410 411struct wl1271_general_parms_cmd { 412 struct wl1271_cmd_header header; 413 414 struct wl1271_cmd_test_header test; 415 416 struct wl1271_ini_general_params general_params; 417 418 u8 sr_debug_table[WL1271_INI_MAX_SMART_REFLEX_PARAM]; 419 u8 sr_sen_n_p; 420 u8 sr_sen_n_p_gain; 421 u8 sr_sen_nrn; 422 u8 sr_sen_prn; 423 u8 padding[3]; 424} __packed; 425 426struct wl128x_general_parms_cmd { 427 struct wl1271_cmd_header header; 428 429 struct wl1271_cmd_test_header test; 430 431 struct wl128x_ini_general_params general_params; 432 433 u8 sr_debug_table[WL1271_INI_MAX_SMART_REFLEX_PARAM]; 434 u8 sr_sen_n_p; 435 u8 sr_sen_n_p_gain; 436 u8 sr_sen_nrn; 437 u8 sr_sen_prn; 438 u8 padding[3]; 439} __packed; 440 441struct wl1271_radio_parms_cmd { 442 struct wl1271_cmd_header header; 443 444 struct wl1271_cmd_test_header test; 445 446 /* Static radio parameters */ 447 struct wl1271_ini_band_params_2 static_params_2; 448 struct wl1271_ini_band_params_5 static_params_5; 449 450 /* Dynamic radio parameters */ 451 struct wl1271_ini_fem_params_2 dyn_params_2; 452 u8 padding2; 453 struct wl1271_ini_fem_params_5 dyn_params_5; 454 u8 padding3[2]; 455} __packed; 456 457struct wl128x_radio_parms_cmd { 458 struct wl1271_cmd_header header; 459 460 struct wl1271_cmd_test_header test; 461 462 /* Static radio parameters */ 463 struct wl128x_ini_band_params_2 static_params_2; 464 struct wl128x_ini_band_params_5 static_params_5; 465 466 u8 fem_vendor_and_options; 467 468 /* Dynamic radio parameters */ 469 struct wl128x_ini_fem_params_2 dyn_params_2; 470 u8 padding2; 471 struct wl128x_ini_fem_params_5 dyn_params_5; 472} __packed; 473 474struct wl1271_ext_radio_parms_cmd { 475 struct wl1271_cmd_header header; 476 477 struct wl1271_cmd_test_header test; 478 479 u8 tx_per_channel_power_compensation_2[CONF_TX_PWR_COMPENSATION_LEN_2]; 480 u8 tx_per_channel_power_compensation_5[CONF_TX_PWR_COMPENSATION_LEN_5]; 481 u8 padding[3]; 482} __packed; 483 484/* 485 * There are three types of disconnections: 486 * 487 * DISCONNECT_IMMEDIATE: the fw doesn't send any frames 488 * DISCONNECT_DEAUTH: the fw generates a DEAUTH request with the reason 489 * we have passed 490 * DISCONNECT_DISASSOC: the fw generates a DESASSOC request with the reason 491 * we have passed 492 */ 493enum wl1271_disconnect_type { 494 DISCONNECT_IMMEDIATE, 495 DISCONNECT_DEAUTH, 496 DISCONNECT_DISASSOC 497}; 498 499struct wl1271_cmd_disconnect { 500 struct wl1271_cmd_header header; 501 502 __le32 rx_config_options; 503 __le32 rx_filter_options; 504 505 __le16 reason; 506 u8 type; 507 508 u8 padding; 509} __packed; 510 511#define WL1271_CMD_STA_STATE_CONNECTED 1 512 513struct wl1271_cmd_set_sta_state { 514 struct wl1271_cmd_header header; 515 516 u8 state; 517 u8 padding[3]; 518} __packed; 519 520enum wl1271_ssid_type { 521 SSID_TYPE_PUBLIC = 0, 522 SSID_TYPE_HIDDEN = 1 523}; 524 525struct wl1271_cmd_bss_start { 526 struct wl1271_cmd_header header; 527 528 /* wl1271_ssid_type */ 529 u8 ssid_type; 530 u8 ssid_len; 531 u8 ssid[IEEE80211_MAX_SSID_LEN]; 532 u8 padding_1[2]; 533 534 /* Basic rate set */ 535 __le32 basic_rate_set; 536 /* Aging period in seconds*/ 537 __le16 aging_period; 538 539 /* 540 * This field specifies the time between target beacon 541 * transmission times (TBTTs), in time units (TUs). 542 * Valid values are 1 to 1024. 543 */ 544 __le16 beacon_interval; 545 u8 bssid[ETH_ALEN]; 546 u8 bss_index; 547 /* Radio band */ 548 u8 band; 549 u8 channel; 550 /* The host link id for the AP's global queue */ 551 u8 global_hlid; 552 /* The host link id for the AP's broadcast queue */ 553 u8 broadcast_hlid; 554 /* DTIM count */ 555 u8 dtim_interval; 556 /* Beacon expiry time in ms */ 557 u8 beacon_expiry; 558 u8 padding_2[3]; 559} __packed; 560 561struct wl1271_cmd_add_sta { 562 struct wl1271_cmd_header header; 563 564 u8 addr[ETH_ALEN]; 565 u8 hlid; 566 u8 aid; 567 u8 psd_type[NUM_ACCESS_CATEGORIES_COPY]; 568 __le32 supported_rates; 569 u8 bss_index; 570 u8 sp_len; 571 u8 wmm; 572 u8 padding1; 573} __packed; 574 575struct wl1271_cmd_remove_sta { 576 struct wl1271_cmd_header header; 577 578 u8 hlid; 579 u8 reason_opcode; 580 u8 send_deauth_flag; 581 u8 padding1; 582} __packed; 583 584/* 585 * Continuous mode - packets are transferred to the host periodically 586 * via the data path. 587 * On demand - Log messages are stored in a cyclic buffer in the 588 * firmware, and only transferred to the host when explicitly requested 589 */ 590enum wl12xx_fwlogger_log_mode { 591 WL12XX_FWLOG_CONTINUOUS, 592 WL12XX_FWLOG_ON_DEMAND 593}; 594 595/* Include/exclude timestamps from the log messages */ 596enum wl12xx_fwlogger_timestamp { 597 WL12XX_FWLOG_TIMESTAMP_DISABLED, 598 WL12XX_FWLOG_TIMESTAMP_ENABLED 599}; 600 601/* 602 * Logs can be routed to the debug pinouts (where available), to the host bus 603 * (SDIO/SPI), or dropped 604 */ 605enum wl12xx_fwlogger_output { 606 WL12XX_FWLOG_OUTPUT_NONE, 607 WL12XX_FWLOG_OUTPUT_DBG_PINS, 608 WL12XX_FWLOG_OUTPUT_HOST, 609}; 610 611struct wl12xx_cmd_config_fwlog { 612 struct wl1271_cmd_header header; 613 614 /* See enum wl12xx_fwlogger_log_mode */ 615 u8 logger_mode; 616 617 /* Minimum log level threshold */ 618 u8 log_severity; 619 620 /* Include/exclude timestamps from the log messages */ 621 u8 timestamp; 622 623 /* See enum wl1271_fwlogger_output */ 624 u8 output; 625 626 /* Regulates the frequency of log messages */ 627 u8 threshold; 628 629 u8 padding[3]; 630} __packed; 631 632struct wl12xx_cmd_start_fwlog { 633 struct wl1271_cmd_header header; 634} __packed; 635 636struct wl12xx_cmd_stop_fwlog { 637 struct wl1271_cmd_header header; 638} __packed; 639 640#endif /* __WL1271_CMD_H__ */ 641