1 /* 2 * This file contains the function prototypes, data structure 3 * and defines for all the host/station commands 4 */ 5 #ifndef _LBS_HOSTCMD_H 6 #define _LBS_HOSTCMD_H 7 8 #include <linux/wireless.h> 9 #include "11d.h" 10 #include "types.h" 11 12 /* 802.11-related definitions */ 13 14 /* TxPD descriptor */ 15 struct txpd { 16 /* Current Tx packet status */ 17 __le32 tx_status; 18 /* Tx control */ 19 __le32 tx_control; 20 __le32 tx_packet_location; 21 /* Tx packet length */ 22 __le16 tx_packet_length; 23 /* First 2 byte of destination MAC address */ 24 u8 tx_dest_addr_high[2]; 25 /* Last 4 byte of destination MAC address */ 26 u8 tx_dest_addr_low[4]; 27 /* Pkt Priority */ 28 u8 priority; 29 /* Pkt Trasnit Power control */ 30 u8 powermgmt; 31 /* Amount of time the packet has been queued in the driver (units = 2ms) */ 32 u8 pktdelay_2ms; 33 /* reserved */ 34 u8 reserved1; 35 } __attribute__ ((packed)); 36 37 /* RxPD Descriptor */ 38 struct rxpd { 39 /* Current Rx packet status */ 40 __le16 status; 41 42 /* SNR */ 43 u8 snr; 44 45 /* Tx control */ 46 u8 rx_control; 47 48 /* Pkt length */ 49 __le16 pkt_len; 50 51 /* Noise Floor */ 52 u8 nf; 53 54 /* Rx Packet Rate */ 55 u8 rx_rate; 56 57 /* Pkt addr */ 58 __le32 pkt_ptr; 59 60 /* Next Rx RxPD addr */ 61 __le32 next_rxpd_ptr; 62 63 /* Pkt Priority */ 64 u8 priority; 65 u8 reserved[3]; 66 } __attribute__ ((packed)); 67 68 struct cmd_header { 69 __le16 command; 70 __le16 size; 71 __le16 seqnum; 72 __le16 result; 73 } __attribute__ ((packed)); 74 75 struct cmd_ctrl_node { 76 struct list_head list; 77 int result; 78 /* command response */ 79 int (*callback)(struct lbs_private *, unsigned long, struct cmd_header *); 80 unsigned long callback_arg; 81 /* command data */ 82 struct cmd_header *cmdbuf; 83 /* wait queue */ 84 u16 cmdwaitqwoken; 85 wait_queue_head_t cmdwait_q; 86 }; 87 88 /* Generic structure to hold all key types. */ 89 struct enc_key { 90 u16 len; 91 u16 flags; /* KEY_INFO_* from defs.h */ 92 u16 type; /* KEY_TYPE_* from defs.h */ 93 u8 key[32]; 94 }; 95 96 /* lbs_offset_value */ 97 struct lbs_offset_value { 98 u32 offset; 99 u32 value; 100 } __attribute__ ((packed)); 101 102 /* Define general data structure */ 103 /* cmd_DS_GEN */ 104 struct cmd_ds_gen { 105 __le16 command; 106 __le16 size; 107 __le16 seqnum; 108 __le16 result; 109 void *cmdresp[0]; 110 } __attribute__ ((packed)); 111 112 #define S_DS_GEN sizeof(struct cmd_ds_gen) 113 114 115 /* 116 * Define data structure for CMD_GET_HW_SPEC 117 * This structure defines the response for the GET_HW_SPEC command 118 */ 119 struct cmd_ds_get_hw_spec { 120 struct cmd_header hdr; 121 122 /* HW Interface version number */ 123 __le16 hwifversion; 124 /* HW version number */ 125 __le16 version; 126 /* Max number of TxPD FW can handle */ 127 __le16 nr_txpd; 128 /* Max no of Multicast address */ 129 __le16 nr_mcast_adr; 130 /* MAC address */ 131 u8 permanentaddr[6]; 132 133 /* region Code */ 134 __le16 regioncode; 135 136 /* Number of antenna used */ 137 __le16 nr_antenna; 138 139 /* FW release number, example 0x01030304 = 2.3.4p1 */ 140 __le32 fwrelease; 141 142 /* Base Address of TxPD queue */ 143 __le32 wcb_base; 144 /* Read Pointer of RxPd queue */ 145 __le32 rxpd_rdptr; 146 147 /* Write Pointer of RxPd queue */ 148 __le32 rxpd_wrptr; 149 150 /*FW/HW capability */ 151 __le32 fwcapinfo; 152 } __attribute__ ((packed)); 153 154 struct cmd_ds_802_11_subscribe_event { 155 struct cmd_header hdr; 156 157 __le16 action; 158 __le16 events; 159 160 /* A TLV to the CMD_802_11_SUBSCRIBE_EVENT command can contain a 161 * number of TLVs. From the v5.1 manual, those TLVs would add up to 162 * 40 bytes. However, future firmware might add additional TLVs, so I 163 * bump this up a bit. 164 */ 165 uint8_t tlv[128]; 166 } __attribute__ ((packed)); 167 168 /* 169 * This scan handle Country Information IE(802.11d compliant) 170 * Define data structure for CMD_802_11_SCAN 171 */ 172 struct cmd_ds_802_11_scan { 173 struct cmd_header hdr; 174 175 uint8_t bsstype; 176 uint8_t bssid[ETH_ALEN]; 177 uint8_t tlvbuffer[0]; 178 #if 0 179 mrvlietypes_ssidparamset_t ssidParamSet; 180 mrvlietypes_chanlistparamset_t ChanListParamSet; 181 mrvlietypes_ratesparamset_t OpRateSet; 182 #endif 183 } __attribute__ ((packed)); 184 185 struct cmd_ds_802_11_scan_rsp { 186 struct cmd_header hdr; 187 188 __le16 bssdescriptsize; 189 uint8_t nr_sets; 190 uint8_t bssdesc_and_tlvbuffer[0]; 191 } __attribute__ ((packed)); 192 193 struct cmd_ds_802_11_get_log { 194 struct cmd_header hdr; 195 196 __le32 mcasttxframe; 197 __le32 failed; 198 __le32 retry; 199 __le32 multiretry; 200 __le32 framedup; 201 __le32 rtssuccess; 202 __le32 rtsfailure; 203 __le32 ackfailure; 204 __le32 rxfrag; 205 __le32 mcastrxframe; 206 __le32 fcserror; 207 __le32 txframe; 208 __le32 wepundecryptable; 209 } __attribute__ ((packed)); 210 211 struct cmd_ds_mac_control { 212 struct cmd_header hdr; 213 __le16 action; 214 u16 reserved; 215 } __attribute__ ((packed)); 216 217 struct cmd_ds_mac_multicast_adr { 218 struct cmd_header hdr; 219 __le16 action; 220 __le16 nr_of_adrs; 221 u8 maclist[ETH_ALEN * MRVDRV_MAX_MULTICAST_LIST_SIZE]; 222 } __attribute__ ((packed)); 223 224 struct cmd_ds_802_11_authenticate { 225 u8 macaddr[ETH_ALEN]; 226 u8 authtype; 227 u8 reserved[10]; 228 } __attribute__ ((packed)); 229 230 struct cmd_ds_802_11_deauthenticate { 231 struct cmd_header hdr; 232 233 u8 macaddr[ETH_ALEN]; 234 __le16 reasoncode; 235 } __attribute__ ((packed)); 236 237 struct cmd_ds_802_11_associate { 238 u8 peerstaaddr[6]; 239 __le16 capability; 240 __le16 listeninterval; 241 __le16 bcnperiod; 242 u8 dtimperiod; 243 244 #if 0 245 mrvlietypes_ssidparamset_t ssidParamSet; 246 mrvlietypes_phyparamset_t phyparamset; 247 mrvlietypes_ssparamset_t ssparamset; 248 mrvlietypes_ratesparamset_t ratesParamSet; 249 #endif 250 } __attribute__ ((packed)); 251 252 struct cmd_ds_802_11_associate_rsp { 253 struct ieeetypes_assocrsp assocRsp; 254 } __attribute__ ((packed)); 255 256 struct cmd_ds_802_11_set_wep { 257 struct cmd_header hdr; 258 259 /* ACT_ADD, ACT_REMOVE or ACT_ENABLE */ 260 __le16 action; 261 262 /* key Index selected for Tx */ 263 __le16 keyindex; 264 265 /* 40, 128bit or TXWEP */ 266 uint8_t keytype[4]; 267 uint8_t keymaterial[4][16]; 268 } __attribute__ ((packed)); 269 270 struct cmd_ds_802_3_get_stat { 271 __le32 xmitok; 272 __le32 rcvok; 273 __le32 xmiterror; 274 __le32 rcverror; 275 __le32 rcvnobuffer; 276 __le32 rcvcrcerror; 277 } __attribute__ ((packed)); 278 279 struct cmd_ds_802_11_get_stat { 280 __le32 txfragmentcnt; 281 __le32 mcasttxframecnt; 282 __le32 failedcnt; 283 __le32 retrycnt; 284 __le32 Multipleretrycnt; 285 __le32 rtssuccesscnt; 286 __le32 rtsfailurecnt; 287 __le32 ackfailurecnt; 288 __le32 frameduplicatecnt; 289 __le32 rxfragmentcnt; 290 __le32 mcastrxframecnt; 291 __le32 fcserrorcnt; 292 __le32 bcasttxframecnt; 293 __le32 bcastrxframecnt; 294 __le32 txbeacon; 295 __le32 rxbeacon; 296 __le32 wepundecryptable; 297 } __attribute__ ((packed)); 298 299 struct cmd_ds_802_11_snmp_mib { 300 struct cmd_header hdr; 301 302 __le16 action; 303 __le16 oid; 304 __le16 bufsize; 305 u8 value[128]; 306 } __attribute__ ((packed)); 307 308 struct cmd_ds_mac_reg_map { 309 __le16 buffersize; 310 u8 regmap[128]; 311 __le16 reserved; 312 } __attribute__ ((packed)); 313 314 struct cmd_ds_bbp_reg_map { 315 __le16 buffersize; 316 u8 regmap[128]; 317 __le16 reserved; 318 } __attribute__ ((packed)); 319 320 struct cmd_ds_rf_reg_map { 321 __le16 buffersize; 322 u8 regmap[64]; 323 __le16 reserved; 324 } __attribute__ ((packed)); 325 326 struct cmd_ds_mac_reg_access { 327 __le16 action; 328 __le16 offset; 329 __le32 value; 330 } __attribute__ ((packed)); 331 332 struct cmd_ds_bbp_reg_access { 333 __le16 action; 334 __le16 offset; 335 u8 value; 336 u8 reserved[3]; 337 } __attribute__ ((packed)); 338 339 struct cmd_ds_rf_reg_access { 340 __le16 action; 341 __le16 offset; 342 u8 value; 343 u8 reserved[3]; 344 } __attribute__ ((packed)); 345 346 struct cmd_ds_802_11_radio_control { 347 struct cmd_header hdr; 348 349 __le16 action; 350 __le16 control; 351 } __attribute__ ((packed)); 352 353 struct cmd_ds_802_11_beacon_control { 354 __le16 action; 355 __le16 beacon_enable; 356 __le16 beacon_period; 357 } __attribute__ ((packed)); 358 359 struct cmd_ds_802_11_sleep_params { 360 struct cmd_header hdr; 361 362 /* ACT_GET/ACT_SET */ 363 __le16 action; 364 365 /* Sleep clock error in ppm */ 366 __le16 error; 367 368 /* Wakeup offset in usec */ 369 __le16 offset; 370 371 /* Clock stabilization time in usec */ 372 __le16 stabletime; 373 374 /* control periodic calibration */ 375 uint8_t calcontrol; 376 377 /* control the use of external sleep clock */ 378 uint8_t externalsleepclk; 379 380 /* reserved field, should be set to zero */ 381 __le16 reserved; 382 } __attribute__ ((packed)); 383 384 struct cmd_ds_802_11_inactivity_timeout { 385 struct cmd_header hdr; 386 387 /* ACT_GET/ACT_SET */ 388 __le16 action; 389 390 /* Inactivity timeout in msec */ 391 __le16 timeout; 392 } __attribute__ ((packed)); 393 394 struct cmd_ds_802_11_rf_channel { 395 struct cmd_header hdr; 396 397 __le16 action; 398 __le16 channel; 399 __le16 rftype; /* unused */ 400 __le16 reserved; /* unused */ 401 u8 channellist[32]; /* unused */ 402 } __attribute__ ((packed)); 403 404 struct cmd_ds_802_11_rssi { 405 /* weighting factor */ 406 __le16 N; 407 408 __le16 reserved_0; 409 __le16 reserved_1; 410 __le16 reserved_2; 411 } __attribute__ ((packed)); 412 413 struct cmd_ds_802_11_rssi_rsp { 414 __le16 SNR; 415 __le16 noisefloor; 416 __le16 avgSNR; 417 __le16 avgnoisefloor; 418 } __attribute__ ((packed)); 419 420 struct cmd_ds_802_11_mac_address { 421 struct cmd_header hdr; 422 423 __le16 action; 424 u8 macadd[ETH_ALEN]; 425 } __attribute__ ((packed)); 426 427 struct cmd_ds_802_11_rf_tx_power { 428 struct cmd_header hdr; 429 430 __le16 action; 431 __le16 curlevel; 432 s8 maxlevel; 433 s8 minlevel; 434 } __attribute__ ((packed)); 435 436 struct cmd_ds_802_11_rf_antenna { 437 __le16 action; 438 439 /* Number of antennas or 0xffff(diversity) */ 440 __le16 antennamode; 441 442 } __attribute__ ((packed)); 443 444 struct cmd_ds_802_11_monitor_mode { 445 __le16 action; 446 __le16 mode; 447 } __attribute__ ((packed)); 448 449 struct cmd_ds_set_boot2_ver { 450 struct cmd_header hdr; 451 452 __le16 action; 453 __le16 version; 454 } __attribute__ ((packed)); 455 456 struct cmd_ds_802_11_fw_wake_method { 457 struct cmd_header hdr; 458 459 __le16 action; 460 __le16 method; 461 } __attribute__ ((packed)); 462 463 struct cmd_ds_802_11_sleep_period { 464 struct cmd_header hdr; 465 466 __le16 action; 467 __le16 period; 468 } __attribute__ ((packed)); 469 470 struct cmd_ds_802_11_ps_mode { 471 __le16 action; 472 __le16 nullpktinterval; 473 __le16 multipledtim; 474 __le16 reserved; 475 __le16 locallisteninterval; 476 } __attribute__ ((packed)); 477 478 struct cmd_confirm_sleep { 479 struct cmd_header hdr; 480 481 __le16 action; 482 __le16 nullpktinterval; 483 __le16 multipledtim; 484 __le16 reserved; 485 __le16 locallisteninterval; 486 } __attribute__ ((packed)); 487 488 struct cmd_ds_802_11_data_rate { 489 struct cmd_header hdr; 490 491 __le16 action; 492 __le16 reserved; 493 u8 rates[MAX_RATES]; 494 } __attribute__ ((packed)); 495 496 struct cmd_ds_802_11_rate_adapt_rateset { 497 struct cmd_header hdr; 498 __le16 action; 499 __le16 enablehwauto; 500 __le16 bitmap; 501 } __attribute__ ((packed)); 502 503 struct cmd_ds_802_11_ad_hoc_start { 504 struct cmd_header hdr; 505 506 u8 ssid[IW_ESSID_MAX_SIZE]; 507 u8 bsstype; 508 __le16 beaconperiod; 509 u8 dtimperiod; /* Reserved on v9 and later */ 510 union IEEEtypes_ssparamset ssparamset; 511 union ieeetypes_phyparamset phyparamset; 512 __le16 probedelay; 513 __le16 capability; 514 u8 rates[MAX_RATES]; 515 u8 tlv_memory_size_pad[100]; 516 } __attribute__ ((packed)); 517 518 struct cmd_ds_802_11_ad_hoc_result { 519 struct cmd_header hdr; 520 521 u8 pad[3]; 522 u8 bssid[ETH_ALEN]; 523 } __attribute__ ((packed)); 524 525 struct adhoc_bssdesc { 526 u8 bssid[ETH_ALEN]; 527 u8 ssid[IW_ESSID_MAX_SIZE]; 528 u8 type; 529 __le16 beaconperiod; 530 u8 dtimperiod; 531 __le64 timestamp; 532 __le64 localtime; 533 union ieeetypes_phyparamset phyparamset; 534 union IEEEtypes_ssparamset ssparamset; 535 __le16 capability; 536 u8 rates[MAX_RATES]; 537 538 /* DO NOT ADD ANY FIELDS TO THIS STRUCTURE. It is used below in the 539 * Adhoc join command and will cause a binary layout mismatch with 540 * the firmware 541 */ 542 } __attribute__ ((packed)); 543 544 struct cmd_ds_802_11_ad_hoc_join { 545 struct cmd_header hdr; 546 547 struct adhoc_bssdesc bss; 548 __le16 failtimeout; /* Reserved on v9 and later */ 549 __le16 probedelay; /* Reserved on v9 and later */ 550 } __attribute__ ((packed)); 551 552 struct cmd_ds_802_11_ad_hoc_stop { 553 struct cmd_header hdr; 554 } __attribute__ ((packed)); 555 556 struct cmd_ds_802_11_enable_rsn { 557 struct cmd_header hdr; 558 559 __le16 action; 560 __le16 enable; 561 } __attribute__ ((packed)); 562 563 struct MrvlIEtype_keyParamSet { 564 /* type ID */ 565 __le16 type; 566 567 /* length of Payload */ 568 __le16 length; 569 570 /* type of key: WEP=0, TKIP=1, AES=2 */ 571 __le16 keytypeid; 572 573 /* key control Info specific to a keytypeid */ 574 __le16 keyinfo; 575 576 /* length of key */ 577 __le16 keylen; 578 579 /* key material of size keylen */ 580 u8 key[32]; 581 } __attribute__ ((packed)); 582 583 #define MAX_WOL_RULES 16 584 585 struct host_wol_rule { 586 uint8_t rule_no; 587 uint8_t rule_ops; 588 __le16 sig_offset; 589 __le16 sig_length; 590 __le16 reserve; 591 __be32 sig_mask; 592 __be32 signature; 593 } __attribute__ ((packed)); 594 595 struct wol_config { 596 uint8_t action; 597 uint8_t pattern; 598 uint8_t no_rules_in_cmd; 599 uint8_t result; 600 struct host_wol_rule rule[MAX_WOL_RULES]; 601 } __attribute__ ((packed)); 602 603 struct cmd_ds_host_sleep { 604 struct cmd_header hdr; 605 __le32 criteria; 606 uint8_t gpio; 607 uint16_t gap; 608 struct wol_config wol_conf; 609 } __attribute__ ((packed)); 610 611 612 613 struct cmd_ds_802_11_key_material { 614 struct cmd_header hdr; 615 616 __le16 action; 617 struct MrvlIEtype_keyParamSet keyParamSet[2]; 618 } __attribute__ ((packed)); 619 620 struct cmd_ds_802_11_eeprom_access { 621 struct cmd_header hdr; 622 __le16 action; 623 __le16 offset; 624 __le16 len; 625 /* firmware says it returns a maximum of 20 bytes */ 626 #define LBS_EEPROM_READ_LEN 20 627 u8 value[LBS_EEPROM_READ_LEN]; 628 } __attribute__ ((packed)); 629 630 struct cmd_ds_802_11_tpc_cfg { 631 struct cmd_header hdr; 632 633 __le16 action; 634 uint8_t enable; 635 int8_t P0; 636 int8_t P1; 637 int8_t P2; 638 uint8_t usesnr; 639 } __attribute__ ((packed)); 640 641 642 struct cmd_ds_802_11_pa_cfg { 643 struct cmd_header hdr; 644 645 __le16 action; 646 uint8_t enable; 647 int8_t P0; 648 int8_t P1; 649 int8_t P2; 650 } __attribute__ ((packed)); 651 652 653 struct cmd_ds_802_11_led_ctrl { 654 __le16 action; 655 __le16 numled; 656 u8 data[256]; 657 } __attribute__ ((packed)); 658 659 struct cmd_ds_802_11_afc { 660 __le16 afc_auto; 661 union { 662 struct { 663 __le16 threshold; 664 __le16 period; 665 }; 666 struct { 667 __le16 timing_offset; /* signed */ 668 __le16 carrier_offset; /* signed */ 669 }; 670 }; 671 } __attribute__ ((packed)); 672 673 struct cmd_tx_rate_query { 674 __le16 txrate; 675 } __attribute__ ((packed)); 676 677 struct cmd_ds_get_tsf { 678 __le64 tsfvalue; 679 } __attribute__ ((packed)); 680 681 struct cmd_ds_bt_access { 682 __le16 action; 683 __le32 id; 684 u8 addr1[ETH_ALEN]; 685 u8 addr2[ETH_ALEN]; 686 } __attribute__ ((packed)); 687 688 struct cmd_ds_fwt_access { 689 __le16 action; 690 __le32 id; 691 u8 valid; 692 u8 da[ETH_ALEN]; 693 u8 dir; 694 u8 ra[ETH_ALEN]; 695 __le32 ssn; 696 __le32 dsn; 697 __le32 metric; 698 u8 rate; 699 u8 hopcount; 700 u8 ttl; 701 __le32 expiration; 702 u8 sleepmode; 703 __le32 snr; 704 __le32 references; 705 u8 prec[ETH_ALEN]; 706 } __attribute__ ((packed)); 707 708 709 struct cmd_ds_mesh_config { 710 struct cmd_header hdr; 711 712 __le16 action; 713 __le16 channel; 714 __le16 type; 715 __le16 length; 716 u8 data[128]; /* last position reserved */ 717 } __attribute__ ((packed)); 718 719 720 struct cmd_ds_mesh_access { 721 struct cmd_header hdr; 722 723 __le16 action; 724 __le32 data[32]; /* last position reserved */ 725 } __attribute__ ((packed)); 726 727 /* Number of stats counters returned by the firmware */ 728 #define MESH_STATS_NUM 8 729 730 struct cmd_ds_command { 731 /* command header */ 732 __le16 command; 733 __le16 size; 734 __le16 seqnum; 735 __le16 result; 736 737 /* command Body */ 738 union { 739 struct cmd_ds_802_11_ps_mode psmode; 740 struct cmd_ds_802_11_associate associate; 741 struct cmd_ds_802_11_authenticate auth; 742 struct cmd_ds_802_11_get_stat gstat; 743 struct cmd_ds_802_3_get_stat gstat_8023; 744 struct cmd_ds_802_11_rf_antenna rant; 745 struct cmd_ds_802_11_monitor_mode monitor; 746 struct cmd_ds_802_11_rssi rssi; 747 struct cmd_ds_802_11_rssi_rsp rssirsp; 748 struct cmd_ds_mac_reg_access macreg; 749 struct cmd_ds_bbp_reg_access bbpreg; 750 struct cmd_ds_rf_reg_access rfreg; 751 752 struct cmd_ds_802_11d_domain_info domaininfo; 753 struct cmd_ds_802_11d_domain_info domaininforesp; 754 755 struct cmd_ds_802_11_tpc_cfg tpccfg; 756 struct cmd_ds_802_11_afc afc; 757 struct cmd_ds_802_11_led_ctrl ledgpio; 758 759 struct cmd_tx_rate_query txrate; 760 struct cmd_ds_bt_access bt; 761 struct cmd_ds_fwt_access fwt; 762 struct cmd_ds_get_tsf gettsf; 763 struct cmd_ds_802_11_beacon_control bcn_ctrl; 764 } params; 765 } __attribute__ ((packed)); 766 767 #endif 768