linux/drivers/net/wireless/quantenna/qtnfmac/qlink.h
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2015-2016 Quantenna Communications, Inc.
   3 * All rights reserved.
   4 *
   5 * This program is free software; you can redistribute it and/or
   6 * modify it under the terms of the GNU General Public License
   7 * as published by the Free Software Foundation; either version 2
   8 * of the License, or (at your option) any later version.
   9 *
  10 * This program is distributed in the hope that it will be useful,
  11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13 * GNU General Public License for more details.
  14 *
  15 */
  16
  17#ifndef _QTN_QLINK_H_
  18#define _QTN_QLINK_H_
  19
  20#include <linux/ieee80211.h>
  21
  22#define QLINK_PROTO_VER         3
  23
  24#define QLINK_MACID_RSVD                0xFF
  25#define QLINK_VIFID_RSVD                0xFF
  26
  27/* Common QLINK protocol messages definitions.
  28 */
  29
  30/**
  31 * enum qlink_msg_type - QLINK message types
  32 *
  33 * Used to distinguish between message types of QLINK protocol.
  34 *
  35 * @QLINK_MSG_TYPE_CMD: Message is carrying data of a command sent from
  36 *      driver to wireless hardware.
  37 * @QLINK_MSG_TYPE_CMDRSP: Message is carrying data of a response to a command.
  38 *      Sent from wireless HW to driver in reply to previously issued command.
  39 * @QLINK_MSG_TYPE_EVENT: Data for an event originated in wireless hardware and
  40 *      sent asynchronously to driver.
  41 */
  42enum qlink_msg_type {
  43        QLINK_MSG_TYPE_CMD      = 1,
  44        QLINK_MSG_TYPE_CMDRSP   = 2,
  45        QLINK_MSG_TYPE_EVENT    = 3
  46};
  47
  48/**
  49 * struct qlink_msg_header - common QLINK protocol message header
  50 *
  51 * Portion of QLINK protocol header common for all message types.
  52 *
  53 * @type: Message type, one of &enum qlink_msg_type.
  54 * @len: Total length of message including all headers.
  55 */
  56struct qlink_msg_header {
  57        __le16 type;
  58        __le16 len;
  59} __packed;
  60
  61/* Generic definitions of data and information carried in QLINK messages
  62 */
  63
  64enum qlink_hw_capab {
  65        QLINK_HW_SUPPORTS_REG_UPDATE    = BIT(0),
  66};
  67
  68enum qlink_phy_mode {
  69        QLINK_PHYMODE_BGN       = BIT(0),
  70        QLINK_PHYMODE_AN        = BIT(1),
  71        QLINK_PHYMODE_AC        = BIT(2),
  72};
  73
  74enum qlink_iface_type {
  75        QLINK_IFTYPE_AP         = 1,
  76        QLINK_IFTYPE_STATION    = 2,
  77        QLINK_IFTYPE_ADHOC      = 3,
  78        QLINK_IFTYPE_MONITOR    = 4,
  79        QLINK_IFTYPE_WDS        = 5,
  80};
  81
  82/**
  83 * struct qlink_intf_info - information on virtual interface.
  84 *
  85 * Data describing a single virtual interface.
  86 *
  87 * @if_type: Mode of interface operation, one of &enum qlink_iface_type
  88 * @flags: interface flagsmap.
  89 * @mac_addr: MAC address of virtual interface.
  90 */
  91struct qlink_intf_info {
  92        __le16 if_type;
  93        __le16 flags;
  94        u8 mac_addr[ETH_ALEN];
  95        u8 rsvd[2];
  96} __packed;
  97
  98enum qlink_sta_flags {
  99        QLINK_STA_FLAG_INVALID          = 0,
 100        QLINK_STA_FLAG_AUTHORIZED               = BIT(0),
 101        QLINK_STA_FLAG_SHORT_PREAMBLE   = BIT(1),
 102        QLINK_STA_FLAG_WME                      = BIT(2),
 103        QLINK_STA_FLAG_MFP                      = BIT(3),
 104        QLINK_STA_FLAG_AUTHENTICATED            = BIT(4),
 105        QLINK_STA_FLAG_TDLS_PEER                = BIT(5),
 106        QLINK_STA_FLAG_ASSOCIATED               = BIT(6),
 107};
 108
 109enum qlink_channel_width {
 110        QLINK_CHAN_WIDTH_5              = BIT(0),
 111        QLINK_CHAN_WIDTH_10             = BIT(1),
 112        QLINK_CHAN_WIDTH_20_NOHT        = BIT(2),
 113        QLINK_CHAN_WIDTH_20             = BIT(3),
 114        QLINK_CHAN_WIDTH_40             = BIT(4),
 115        QLINK_CHAN_WIDTH_80             = BIT(5),
 116        QLINK_CHAN_WIDTH_80P80          = BIT(6),
 117        QLINK_CHAN_WIDTH_160            = BIT(7),
 118};
 119
 120/* QLINK Command messages related definitions
 121 */
 122
 123/**
 124 * enum qlink_cmd_type - list of supported commands
 125 *
 126 * Commands are QLINK messages of type @QLINK_MSG_TYPE_CMD, sent by driver to
 127 * wireless network device for processing. Device is expected to send back a
 128 * reply message of type &QLINK_MSG_TYPE_CMDRSP, containing at least command
 129 * execution status (one of &enum qlink_cmd_result) at least. Reply message
 130 * may also contain data payload specific to the command type.
 131 *
 132 * @QLINK_CMD_CHANS_INFO_GET: for the specified MAC and specified band, get
 133 *      number of operational channels and information on each of the channel.
 134 *      This command is generic to a specified MAC, interface index must be set
 135 *      to QLINK_VIFID_RSVD in command header.
 136 */
 137enum qlink_cmd_type {
 138        QLINK_CMD_FW_INIT               = 0x0001,
 139        QLINK_CMD_FW_DEINIT             = 0x0002,
 140        QLINK_CMD_REGISTER_MGMT         = 0x0003,
 141        QLINK_CMD_SEND_MGMT_FRAME       = 0x0004,
 142        QLINK_CMD_MGMT_SET_APPIE        = 0x0005,
 143        QLINK_CMD_PHY_PARAMS_GET        = 0x0011,
 144        QLINK_CMD_PHY_PARAMS_SET        = 0x0012,
 145        QLINK_CMD_GET_HW_INFO           = 0x0013,
 146        QLINK_CMD_MAC_INFO              = 0x0014,
 147        QLINK_CMD_ADD_INTF              = 0x0015,
 148        QLINK_CMD_DEL_INTF              = 0x0016,
 149        QLINK_CMD_CHANGE_INTF           = 0x0017,
 150        QLINK_CMD_UPDOWN_INTF           = 0x0018,
 151        QLINK_CMD_REG_REGION            = 0x0019,
 152        QLINK_CMD_CHANS_INFO_GET        = 0x001A,
 153        QLINK_CMD_CONFIG_AP             = 0x0020,
 154        QLINK_CMD_START_AP              = 0x0021,
 155        QLINK_CMD_STOP_AP               = 0x0022,
 156        QLINK_CMD_GET_STA_INFO          = 0x0030,
 157        QLINK_CMD_ADD_KEY               = 0x0040,
 158        QLINK_CMD_DEL_KEY               = 0x0041,
 159        QLINK_CMD_SET_DEFAULT_KEY       = 0x0042,
 160        QLINK_CMD_SET_DEFAULT_MGMT_KEY  = 0x0043,
 161        QLINK_CMD_CHANGE_STA            = 0x0051,
 162        QLINK_CMD_DEL_STA               = 0x0052,
 163        QLINK_CMD_SCAN                  = 0x0053,
 164        QLINK_CMD_CONNECT               = 0x0060,
 165        QLINK_CMD_DISCONNECT            = 0x0061,
 166};
 167
 168/**
 169 * struct qlink_cmd - QLINK command message header
 170 *
 171 * Header used for QLINK messages of QLINK_MSG_TYPE_CMD type.
 172 *
 173 * @mhdr: Common QLINK message header.
 174 * @cmd_id: command id, one of &enum qlink_cmd_type.
 175 * @seq_num: sequence number of command message, used for matching with
 176 *      response message.
 177 * @macid: index of physical radio device the command is destined to or
 178 *      QLINK_MACID_RSVD if not applicable.
 179 * @vifid: index of virtual wireless interface on specified @macid the command
 180 *      is destined to or QLINK_VIFID_RSVD if not applicable.
 181 */
 182struct qlink_cmd {
 183        struct qlink_msg_header mhdr;
 184        __le16 cmd_id;
 185        __le16 seq_num;
 186        u8 rsvd[2];
 187        u8 macid;
 188        u8 vifid;
 189} __packed;
 190
 191/**
 192 * struct qlink_cmd_manage_intf - interface management command
 193 *
 194 * Data for interface management commands QLINK_CMD_ADD_INTF, QLINK_CMD_DEL_INTF
 195 * and QLINK_CMD_CHANGE_INTF.
 196 *
 197 * @intf_info: interface description.
 198 */
 199struct qlink_cmd_manage_intf {
 200        struct qlink_cmd chdr;
 201        struct qlink_intf_info intf_info;
 202} __packed;
 203
 204enum qlink_mgmt_frame_type {
 205        QLINK_MGMT_FRAME_ASSOC_REQ      = 0x00,
 206        QLINK_MGMT_FRAME_ASSOC_RESP     = 0x01,
 207        QLINK_MGMT_FRAME_REASSOC_REQ    = 0x02,
 208        QLINK_MGMT_FRAME_REASSOC_RESP   = 0x03,
 209        QLINK_MGMT_FRAME_PROBE_REQ      = 0x04,
 210        QLINK_MGMT_FRAME_PROBE_RESP     = 0x05,
 211        QLINK_MGMT_FRAME_BEACON         = 0x06,
 212        QLINK_MGMT_FRAME_ATIM           = 0x07,
 213        QLINK_MGMT_FRAME_DISASSOC       = 0x08,
 214        QLINK_MGMT_FRAME_AUTH           = 0x09,
 215        QLINK_MGMT_FRAME_DEAUTH         = 0x0A,
 216        QLINK_MGMT_FRAME_ACTION         = 0x0B,
 217
 218        QLINK_MGMT_FRAME_TYPE_COUNT
 219};
 220
 221/**
 222 * struct qlink_cmd_mgmt_frame_register - data for QLINK_CMD_REGISTER_MGMT
 223 *
 224 * @frame_type: MGMT frame type the registration request describes, one of
 225 *      &enum qlink_mgmt_frame_type.
 226 * @do_register: 0 - unregister, otherwise register for reception of specified
 227 *      MGMT frame type.
 228 */
 229struct qlink_cmd_mgmt_frame_register {
 230        struct qlink_cmd chdr;
 231        __le16 frame_type;
 232        u8 do_register;
 233} __packed;
 234
 235enum qlink_mgmt_frame_tx_flags {
 236        QLINK_MGMT_FRAME_TX_FLAG_NONE           = 0,
 237        QLINK_MGMT_FRAME_TX_FLAG_OFFCHAN        = BIT(0),
 238        QLINK_MGMT_FRAME_TX_FLAG_NO_CCK         = BIT(1),
 239        QLINK_MGMT_FRAME_TX_FLAG_ACK_NOWAIT     = BIT(2),
 240};
 241
 242/**
 243 * struct qlink_cmd_mgmt_frame_tx - data for QLINK_CMD_SEND_MGMT_FRAME command
 244 *
 245 * @cookie: opaque request identifier.
 246 * @freq: Frequency to use for frame transmission.
 247 * @flags: Transmission flags, one of &enum qlink_mgmt_frame_tx_flags.
 248 * @frame_data: frame to transmit.
 249 */
 250struct qlink_cmd_mgmt_frame_tx {
 251        struct qlink_cmd chdr;
 252        __le32 cookie;
 253        __le16 freq;
 254        __le16 flags;
 255        u8 frame_data[0];
 256} __packed;
 257
 258/**
 259 * struct qlink_cmd_mgmt_append_ie - data for QLINK_CMD_MGMT_SET_APPIE command
 260 *
 261 * @type: type of MGMT frame to appent requested IEs to, one of
 262 *      &enum qlink_mgmt_frame_type.
 263 * @flags: for future use.
 264 * @ie_data: IEs data to append.
 265 */
 266struct qlink_cmd_mgmt_append_ie {
 267        struct qlink_cmd chdr;
 268        u8 type;
 269        u8 flags;
 270        u8 ie_data[0];
 271} __packed;
 272
 273/**
 274 * struct qlink_cmd_get_sta_info - data for QLINK_CMD_GET_STA_INFO command
 275 *
 276 * @sta_addr: MAC address of the STA statistics is requested for.
 277 */
 278struct qlink_cmd_get_sta_info {
 279        struct qlink_cmd chdr;
 280        u8 sta_addr[ETH_ALEN];
 281} __packed;
 282
 283/**
 284 * struct qlink_cmd_add_key - data for QLINK_CMD_ADD_KEY command.
 285 *
 286 * @key_index: index of the key being installed.
 287 * @pairwise: whether to use pairwise key.
 288 * @addr: MAC address of a STA key is being installed to.
 289 * @cipher: cipher suite.
 290 * @key_data: key data itself.
 291 */
 292struct qlink_cmd_add_key {
 293        struct qlink_cmd chdr;
 294        u8 key_index;
 295        u8 pairwise;
 296        u8 addr[ETH_ALEN];
 297        __le32 cipher;
 298        u8 key_data[0];
 299} __packed;
 300
 301/**
 302 * struct qlink_cmd_del_key_req - data for QLINK_CMD_DEL_KEY command
 303 *
 304 * @key_index: index of the key being removed.
 305 * @pairwise: whether to use pairwise key.
 306 * @addr: MAC address of a STA for which a key is removed.
 307 */
 308struct qlink_cmd_del_key {
 309        struct qlink_cmd chdr;
 310        u8 key_index;
 311        u8 pairwise;
 312        u8 addr[ETH_ALEN];
 313} __packed;
 314
 315/**
 316 * struct qlink_cmd_set_def_key - data for QLINK_CMD_SET_DEFAULT_KEY command
 317 *
 318 * @key_index: index of the key to be set as default one.
 319 * @unicast: key is unicast.
 320 * @multicast: key is multicast.
 321 */
 322struct qlink_cmd_set_def_key {
 323        struct qlink_cmd chdr;
 324        u8 key_index;
 325        u8 unicast;
 326        u8 multicast;
 327} __packed;
 328
 329/**
 330 * struct qlink_cmd_set_def_mgmt_key - data for QLINK_CMD_SET_DEFAULT_MGMT_KEY
 331 *
 332 * @key_index: index of the key to be set as default MGMT key.
 333 */
 334struct qlink_cmd_set_def_mgmt_key {
 335        struct qlink_cmd chdr;
 336        u8 key_index;
 337} __packed;
 338
 339/**
 340 * struct qlink_cmd_change_sta - data for QLINK_CMD_CHANGE_STA command
 341 *
 342 * @sta_flags_mask: STA flags mask, bitmap of &enum qlink_sta_flags
 343 * @sta_flags_set: STA flags values, bitmap of &enum qlink_sta_flags
 344 * @sta_addr: address of the STA for which parameters are set.
 345 */
 346struct qlink_cmd_change_sta {
 347        struct qlink_cmd chdr;
 348        __le32 sta_flags_mask;
 349        __le32 sta_flags_set;
 350        u8 sta_addr[ETH_ALEN];
 351} __packed;
 352
 353/**
 354 * struct qlink_cmd_del_sta - data for QLINK_CMD_DEL_STA command.
 355 *
 356 * See &struct station_del_parameters
 357 */
 358struct qlink_cmd_del_sta {
 359        struct qlink_cmd chdr;
 360        __le16 reason_code;
 361        u8 subtype;
 362        u8 sta_addr[ETH_ALEN];
 363} __packed;
 364
 365enum qlink_sta_connect_flags {
 366        QLINK_STA_CONNECT_DISABLE_HT    = BIT(0),
 367        QLINK_STA_CONNECT_DISABLE_VHT   = BIT(1),
 368        QLINK_STA_CONNECT_USE_RRM       = BIT(2),
 369};
 370
 371/**
 372 * struct qlink_cmd_connect - data for QLINK_CMD_CONNECT command
 373 *
 374 * @flags: for future use.
 375 * @freq: center frequence of a channel which should be used to connect.
 376 * @bg_scan_period: period of background scan.
 377 * @bssid: BSSID of the BSS to connect to.
 378 * @payload: variable portion of connection request.
 379 */
 380struct qlink_cmd_connect {
 381        struct qlink_cmd chdr;
 382        __le32 flags;
 383        __le16 freq;
 384        __le16 bg_scan_period;
 385        u8 bssid[ETH_ALEN];
 386        u8 payload[0];
 387} __packed;
 388
 389/**
 390 * struct qlink_cmd_disconnect - data for QLINK_CMD_DISCONNECT command
 391 *
 392 * @reason: code of the reason of disconnect, see &enum ieee80211_reasoncode.
 393 */
 394struct qlink_cmd_disconnect {
 395        struct qlink_cmd chdr;
 396        __le16 reason;
 397} __packed;
 398
 399/**
 400 * struct qlink_cmd_updown - data for QLINK_CMD_UPDOWN_INTF command
 401 *
 402 * @if_up: bring specified interface DOWN (if_up==0) or UP (otherwise).
 403 *      Interface is specified in common command header @chdr.
 404 */
 405struct qlink_cmd_updown {
 406        struct qlink_cmd chdr;
 407        u8 if_up;
 408} __packed;
 409
 410/**
 411 * enum qlink_band - a list of frequency bands
 412 *
 413 * @QLINK_BAND_2GHZ: 2.4GHz band
 414 * @QLINK_BAND_5GHZ: 5GHz band
 415 * @QLINK_BAND_60GHZ: 60GHz band
 416 */
 417enum qlink_band {
 418        QLINK_BAND_2GHZ = BIT(0),
 419        QLINK_BAND_5GHZ = BIT(1),
 420        QLINK_BAND_60GHZ = BIT(2),
 421};
 422
 423/**
 424 * struct qlink_cmd_chans_info_get - data for QLINK_CMD_CHANS_INFO_GET command
 425 *
 426 * @band: a PHY band for which channels info is needed, one of @enum qlink_band
 427 */
 428struct qlink_cmd_chans_info_get {
 429        struct qlink_cmd chdr;
 430        u8 band;
 431} __packed;
 432
 433/* QLINK Command Responses messages related definitions
 434 */
 435
 436enum qlink_cmd_result {
 437        QLINK_CMD_RESULT_OK = 0,
 438        QLINK_CMD_RESULT_INVALID,
 439        QLINK_CMD_RESULT_ENOTSUPP,
 440        QLINK_CMD_RESULT_ENOTFOUND,
 441};
 442
 443/**
 444 * struct qlink_resp - QLINK command response message header
 445 *
 446 * Header used for QLINK messages of QLINK_MSG_TYPE_CMDRSP type.
 447 *
 448 * @mhdr: see &struct qlink_msg_header.
 449 * @cmd_id: command ID the response corresponds to, one of &enum qlink_cmd_type.
 450 * @seq_num: sequence number of command message, used for matching with
 451 *      response message.
 452 * @result: result of the command execution, one of &enum qlink_cmd_result.
 453 * @macid: index of physical radio device the response is sent from or
 454 *      QLINK_MACID_RSVD if not applicable.
 455 * @vifid: index of virtual wireless interface on specified @macid the response
 456 *      is sent from or QLINK_VIFID_RSVD if not applicable.
 457 */
 458struct qlink_resp {
 459        struct qlink_msg_header mhdr;
 460        __le16 cmd_id;
 461        __le16 seq_num;
 462        __le16 result;
 463        u8 macid;
 464        u8 vifid;
 465} __packed;
 466
 467/**
 468 * struct qlink_resp_get_mac_info - response for QLINK_CMD_MAC_INFO command
 469 *
 470 * Data describing specific physical device providing wireless MAC
 471 * functionality.
 472 *
 473 * @dev_mac: MAC address of physical WMAC device (used for first BSS on
 474 *      specified WMAC).
 475 * @num_tx_chain: Number of transmit chains used by WMAC.
 476 * @num_rx_chain: Number of receive chains used by WMAC.
 477 * @vht_cap: VHT capabilities.
 478 * @ht_cap: HT capabilities.
 479 * @bands_cap: wireless bands WMAC can operate in, bitmap of &enum qlink_band.
 480 * @phymode_cap: PHY modes WMAC can operate in, bitmap of &enum qlink_phy_mode.
 481 * @max_ap_assoc_sta: Maximum number of associations supported by WMAC.
 482 * @radar_detect_widths: bitmask of channels BW for which WMAC can detect radar.
 483 * @var_info: variable-length WMAC info data.
 484 */
 485struct qlink_resp_get_mac_info {
 486        struct qlink_resp rhdr;
 487        u8 dev_mac[ETH_ALEN];
 488        u8 num_tx_chain;
 489        u8 num_rx_chain;
 490        struct ieee80211_vht_cap vht_cap;
 491        struct ieee80211_ht_cap ht_cap;
 492        u8 bands_cap;
 493        u8 phymode_cap;
 494        __le16 max_ap_assoc_sta;
 495        __le16 radar_detect_widths;
 496        u8 var_info[0];
 497} __packed;
 498
 499/**
 500 * struct qlink_resp_get_hw_info - response for QLINK_CMD_GET_HW_INFO command
 501 *
 502 * Description of wireless hardware capabilities and features.
 503 *
 504 * @fw_ver: wireless hardware firmware version.
 505 * @hw_capab: Bitmap of capabilities supported by firmware.
 506 * @ql_proto_ver: Version of QLINK protocol used by firmware.
 507 * @country_code: country code ID firmware is configured to.
 508 * @num_mac: Number of separate physical radio devices provided by hardware.
 509 * @mac_bitmap: Bitmap of MAC IDs that are active and can be used in firmware.
 510 * @total_tx_chains: total number of transmit chains used by device.
 511 * @total_rx_chains: total number of receive chains.
 512 */
 513struct qlink_resp_get_hw_info {
 514        struct qlink_resp rhdr;
 515        __le32 fw_ver;
 516        __le32 hw_capab;
 517        __le16 ql_proto_ver;
 518        u8 alpha2_code[2];
 519        u8 num_mac;
 520        u8 mac_bitmap;
 521        u8 total_tx_chain;
 522        u8 total_rx_chain;
 523} __packed;
 524
 525/**
 526 * struct qlink_resp_manage_intf - response for interface management commands
 527 *
 528 * Response data for QLINK_CMD_ADD_INTF and QLINK_CMD_CHANGE_INTF commands.
 529 *
 530 * @rhdr: Common Command Response message header.
 531 * @intf_info: interface description.
 532 */
 533struct qlink_resp_manage_intf {
 534        struct qlink_resp rhdr;
 535        struct qlink_intf_info intf_info;
 536} __packed;
 537
 538/**
 539 * struct qlink_resp_get_sta_info - response for QLINK_CMD_GET_STA_INFO command
 540 *
 541 * Response data containing statistics for specified STA.
 542 *
 543 * @sta_addr: MAC address of STA the response carries statistic for.
 544 * @info: statistics for specified STA.
 545 */
 546struct qlink_resp_get_sta_info {
 547        struct qlink_resp rhdr;
 548        u8 sta_addr[ETH_ALEN];
 549        u8 info[0];
 550} __packed;
 551
 552/**
 553 * struct qlink_resp_get_chan_info - response for QLINK_CMD_CHANS_INFO_GET cmd
 554 *
 555 * @band: frequency band to which channels belong to, one of @enum qlink_band.
 556 * @num_chans: total number of channels info data contained in reply data.
 557 * @info: variable-length channels info.
 558 */
 559struct qlink_resp_get_chan_info {
 560        struct qlink_resp rhdr;
 561        u8 band;
 562        u8 num_chans;
 563        u8 rsvd[2];
 564        u8 info[0];
 565} __packed;
 566
 567/**
 568 * struct qlink_resp_phy_params - response for QLINK_CMD_PHY_PARAMS_GET command
 569 *
 570 * @info: variable-length array of PHY params.
 571 */
 572struct qlink_resp_phy_params {
 573        struct qlink_resp rhdr;
 574        u8 info[0];
 575} __packed;
 576
 577/* QLINK Events messages related definitions
 578 */
 579
 580enum qlink_event_type {
 581        QLINK_EVENT_STA_ASSOCIATED      = 0x0021,
 582        QLINK_EVENT_STA_DEAUTH          = 0x0022,
 583        QLINK_EVENT_MGMT_RECEIVED       = 0x0023,
 584        QLINK_EVENT_SCAN_RESULTS        = 0x0024,
 585        QLINK_EVENT_SCAN_COMPLETE       = 0x0025,
 586        QLINK_EVENT_BSS_JOIN            = 0x0026,
 587        QLINK_EVENT_BSS_LEAVE           = 0x0027,
 588};
 589
 590/**
 591 * struct qlink_event - QLINK event message header
 592 *
 593 * Header used for QLINK messages of QLINK_MSG_TYPE_EVENT type.
 594 *
 595 * @mhdr: Common QLINK message header.
 596 * @event_id: Specifies specific event ID, one of &enum qlink_event_type.
 597 * @macid: index of physical radio device the event was generated on or
 598 *      QLINK_MACID_RSVD if not applicable.
 599 * @vifid: index of virtual wireless interface on specified @macid the event
 600 *      was generated on or QLINK_VIFID_RSVD if not applicable.
 601 */
 602struct qlink_event {
 603        struct qlink_msg_header mhdr;
 604        __le16 event_id;
 605        u8 macid;
 606        u8 vifid;
 607} __packed;
 608
 609/**
 610 * struct qlink_event_sta_assoc - data for QLINK_EVENT_STA_ASSOCIATED event
 611 *
 612 * @sta_addr: Address of a STA for which new association event was generated
 613 * @frame_control: control bits from 802.11 ASSOC_REQUEST header.
 614 * @payload: IEs from association request.
 615 */
 616struct qlink_event_sta_assoc {
 617        struct qlink_event ehdr;
 618        u8 sta_addr[ETH_ALEN];
 619        __le16 frame_control;
 620        u8 ies[0];
 621} __packed;
 622
 623/**
 624 * struct qlink_event_sta_deauth - data for QLINK_EVENT_STA_DEAUTH event
 625 *
 626 * @sta_addr: Address of a deauthenticated STA.
 627 * @reason: reason for deauthentication.
 628 */
 629struct qlink_event_sta_deauth {
 630        struct qlink_event ehdr;
 631        u8 sta_addr[ETH_ALEN];
 632        __le16 reason;
 633} __packed;
 634
 635/**
 636 * struct qlink_event_bss_join - data for QLINK_EVENT_BSS_JOIN event
 637 *
 638 * @bssid: BSSID of a BSS which interface tried to joined.
 639 * @status: status of joining attempt, see &enum ieee80211_statuscode.
 640 */
 641struct qlink_event_bss_join {
 642        struct qlink_event ehdr;
 643        u8 bssid[ETH_ALEN];
 644        __le16 status;
 645} __packed;
 646
 647/**
 648 * struct qlink_event_bss_leave - data for QLINK_EVENT_BSS_LEAVE event
 649 *
 650 * @reason: reason of disconnecting from BSS.
 651 */
 652struct qlink_event_bss_leave {
 653        struct qlink_event ehdr;
 654        u16 reason;
 655} __packed;
 656
 657enum qlink_rxmgmt_flags {
 658        QLINK_RXMGMT_FLAG_ANSWERED = 1 << 0,
 659};
 660
 661/**
 662 * struct qlink_event_rxmgmt - data for QLINK_EVENT_MGMT_RECEIVED event
 663 *
 664 * @freq: Frequency on which the frame was received in MHz.
 665 * @sig_dbm: signal strength in dBm.
 666 * @flags: bitmap of &enum qlink_rxmgmt_flags.
 667 * @frame_data: data of Rx'd frame itself.
 668 */
 669struct qlink_event_rxmgmt {
 670        struct qlink_event ehdr;
 671        __le32 freq;
 672        __le32 sig_dbm;
 673        __le32 flags;
 674        u8 frame_data[0];
 675} __packed;
 676
 677enum qlink_frame_type {
 678        QLINK_BSS_FTYPE_UNKNOWN,
 679        QLINK_BSS_FTYPE_BEACON,
 680        QLINK_BSS_FTYPE_PRESP,
 681};
 682
 683/**
 684 * struct qlink_event_scan_result - data for QLINK_EVENT_SCAN_RESULTS event
 685 *
 686 * @tsf: TSF timestamp indicating when scan results were generated.
 687 * @freq: Center frequency of the channel where BSS for which the scan result
 688 *      event was generated was discovered.
 689 * @capab: capabilities field.
 690 * @bintval: beacon interval announced by discovered BSS.
 691 * @signal: signal strength.
 692 * @frame_type: frame type used to get scan result, see &enum qlink_frame_type.
 693 * @bssid: BSSID announced by discovered BSS.
 694 * @ssid_len: length of SSID announced by BSS.
 695 * @ssid: SSID announced by discovered BSS.
 696 * @payload: IEs that are announced by discovered BSS in its MGMt frames.
 697 */
 698struct qlink_event_scan_result {
 699        struct qlink_event ehdr;
 700        __le64 tsf;
 701        __le16 freq;
 702        __le16 capab;
 703        __le16 bintval;
 704        s8 signal;
 705        u8 frame_type;
 706        u8 bssid[ETH_ALEN];
 707        u8 ssid_len;
 708        u8 ssid[IEEE80211_MAX_SSID_LEN];
 709        u8 payload[0];
 710} __packed;
 711
 712/**
 713 * enum qlink_scan_complete_flags - indicates result of scan request.
 714 *
 715 * @QLINK_SCAN_NONE: Scan request was processed.
 716 * @QLINK_SCAN_ABORTED: Scan was aborted.
 717 */
 718enum qlink_scan_complete_flags {
 719        QLINK_SCAN_NONE         = 0,
 720        QLINK_SCAN_ABORTED      = BIT(0),
 721};
 722
 723/**
 724 * struct qlink_event_scan_complete - data for QLINK_EVENT_SCAN_COMPLETE event
 725 *
 726 * @flags: flags indicating the status of pending scan request,
 727 *      see &enum qlink_scan_complete_flags.
 728 */
 729struct qlink_event_scan_complete {
 730        struct qlink_event ehdr;
 731        __le32 flags;
 732} __packed;
 733
 734/* QLINK TLVs (Type-Length Values) definitions
 735 */
 736
 737enum qlink_tlv_id {
 738        QTN_TLV_ID_FRAG_THRESH          = 0x0201,
 739        QTN_TLV_ID_RTS_THRESH           = 0x0202,
 740        QTN_TLV_ID_SRETRY_LIMIT         = 0x0203,
 741        QTN_TLV_ID_LRETRY_LIMIT         = 0x0204,
 742        QTN_TLV_ID_BCN_PERIOD           = 0x0205,
 743        QTN_TLV_ID_DTIM                 = 0x0206,
 744        QTN_TLV_ID_CHANNEL              = 0x020F,
 745        QTN_TLV_ID_COVERAGE_CLASS       = 0x0213,
 746        QTN_TLV_ID_IFACE_LIMIT          = 0x0214,
 747        QTN_TLV_ID_NUM_IFACE_COMB       = 0x0215,
 748        QTN_TLV_ID_STA_BASIC_COUNTERS   = 0x0300,
 749        QTN_TLV_ID_STA_GENERIC_INFO     = 0x0301,
 750        QTN_TLV_ID_KEY                  = 0x0302,
 751        QTN_TLV_ID_SEQ                  = 0x0303,
 752        QTN_TLV_ID_CRYPTO               = 0x0304,
 753        QTN_TLV_ID_IE_SET               = 0x0305,
 754};
 755
 756struct qlink_tlv_hdr {
 757        __le16 type;
 758        __le16 len;
 759        u8 val[0];
 760} __packed;
 761
 762struct qlink_iface_limit {
 763        __le16 max_num;
 764        __le16 type_mask;
 765} __packed;
 766
 767struct qlink_iface_comb_num {
 768        __le16 iface_comb_num;
 769} __packed;
 770
 771struct qlink_sta_stat_basic_counters {
 772        __le64 rx_bytes;
 773        __le64 tx_bytes;
 774        __le64 rx_beacons;
 775        __le32 rx_packets;
 776        __le32 tx_packets;
 777        __le32 rx_dropped;
 778        __le32 tx_failed;
 779} __packed;
 780
 781enum qlink_sta_info_rate_flags {
 782        QLINK_STA_INFO_RATE_FLAG_INVALID        = 0,
 783        QLINK_STA_INFO_RATE_FLAG_HT_MCS         = BIT(0),
 784        QLINK_STA_INFO_RATE_FLAG_VHT_MCS        = BIT(1),
 785        QLINK_STA_INFO_RATE_FLAG_SHORT_GI       = BIT(2),
 786        QLINK_STA_INFO_RATE_FLAG_60G            = BIT(3),
 787};
 788
 789enum qlink_sta_info_rate_bw {
 790        QLINK_STA_INFO_RATE_BW_5                = 0,
 791        QLINK_STA_INFO_RATE_BW_10               = 1,
 792        QLINK_STA_INFO_RATE_BW_20               = 2,
 793        QLINK_STA_INFO_RATE_BW_40               = 3,
 794        QLINK_STA_INFO_RATE_BW_80               = 4,
 795        QLINK_STA_INFO_RATE_BW_160              = 5,
 796};
 797
 798/**
 799 * struct qlink_sta_info_rate - STA rate statistics
 800 *
 801 * @rate: data rate in Mbps.
 802 * @flags: bitmap of &enum qlink_sta_flags.
 803 * @mcs: 802.11-defined MCS index.
 804 * nss: Number of Spatial Streams.
 805 * @bw: bandwidth, one of &enum qlink_sta_info_rate_bw.
 806 */
 807struct qlink_sta_info_rate {
 808        __le16 rate;
 809        u8 flags;
 810        u8 mcs;
 811        u8 nss;
 812        u8 bw;
 813} __packed;
 814
 815struct qlink_sta_info_state {
 816        __le32 mask;
 817        __le32 value;
 818} __packed;
 819
 820#define QLINK_RSSI_OFFSET       120
 821
 822struct qlink_sta_info_generic {
 823        struct qlink_sta_info_state state;
 824        __le32 connected_time;
 825        __le32 inactive_time;
 826        struct qlink_sta_info_rate rx_rate;
 827        struct qlink_sta_info_rate tx_rate;
 828        u8 rssi;
 829        u8 rssi_avg;
 830} __packed;
 831
 832struct qlink_tlv_frag_rts_thr {
 833        struct qlink_tlv_hdr hdr;
 834        __le16 thr;
 835} __packed;
 836
 837struct qlink_tlv_rlimit {
 838        struct qlink_tlv_hdr hdr;
 839        u8 rlimit;
 840} __packed;
 841
 842struct qlink_tlv_cclass {
 843        struct qlink_tlv_hdr hdr;
 844        u8 cclass;
 845} __packed;
 846
 847enum qlink_dfs_state {
 848        QLINK_DFS_USABLE,
 849        QLINK_DFS_UNAVAILABLE,
 850        QLINK_DFS_AVAILABLE,
 851};
 852
 853enum qlink_channel_flags {
 854        QLINK_CHAN_DISABLED             = BIT(0),
 855        QLINK_CHAN_NO_IR                = BIT(1),
 856        QLINK_CHAN_RADAR                = BIT(3),
 857        QLINK_CHAN_NO_HT40PLUS          = BIT(4),
 858        QLINK_CHAN_NO_HT40MINUS         = BIT(5),
 859        QLINK_CHAN_NO_OFDM              = BIT(6),
 860        QLINK_CHAN_NO_80MHZ             = BIT(7),
 861        QLINK_CHAN_NO_160MHZ            = BIT(8),
 862        QLINK_CHAN_INDOOR_ONLY          = BIT(9),
 863        QLINK_CHAN_IR_CONCURRENT        = BIT(10),
 864        QLINK_CHAN_NO_20MHZ             = BIT(11),
 865        QLINK_CHAN_NO_10MHZ             = BIT(12),
 866};
 867
 868struct qlink_tlv_channel {
 869        struct qlink_tlv_hdr hdr;
 870        __le16 hw_value;
 871        __le16 center_freq;
 872        __le32 flags;
 873        u8 band;
 874        u8 max_antenna_gain;
 875        u8 max_power;
 876        u8 max_reg_power;
 877        __le32 dfs_cac_ms;
 878        u8 dfs_state;
 879        u8 beacon_found;
 880        u8 rsvd[2];
 881} __packed;
 882
 883#define QLINK_MAX_NR_CIPHER_SUITES            5
 884#define QLINK_MAX_NR_AKM_SUITES               2
 885
 886struct qlink_auth_encr {
 887        __le32 wpa_versions;
 888        __le32 cipher_group;
 889        __le32 n_ciphers_pairwise;
 890        __le32 ciphers_pairwise[QLINK_MAX_NR_CIPHER_SUITES];
 891        __le32 n_akm_suites;
 892        __le32 akm_suites[QLINK_MAX_NR_AKM_SUITES];
 893        __le16 control_port_ethertype;
 894        u8 auth_type;
 895        u8 privacy;
 896        u8 mfp;
 897        u8 control_port;
 898        u8 control_port_no_encrypt;
 899} __packed;
 900
 901#endif /* _QTN_QLINK_H_ */
 902