0001
0002
0003
0004 #ifndef _QTN_QLINK_H_
0005 #define _QTN_QLINK_H_
0006
0007 #include <linux/ieee80211.h>
0008
0009 #define QLINK_PROTO_VER_MAJOR_M 0xFFFF
0010 #define QLINK_PROTO_VER_MAJOR_S 16
0011 #define QLINK_PROTO_VER_MINOR_M 0xFFFF
0012 #define QLINK_VER_MINOR(_ver) ((_ver) & QLINK_PROTO_VER_MINOR_M)
0013 #define QLINK_VER_MAJOR(_ver) \
0014 (((_ver) >> QLINK_PROTO_VER_MAJOR_S) & QLINK_PROTO_VER_MAJOR_M)
0015 #define QLINK_VER(_maj, _min) (((_maj) << QLINK_PROTO_VER_MAJOR_S) | (_min))
0016
0017 #define QLINK_PROTO_VER_MAJOR 18
0018 #define QLINK_PROTO_VER_MINOR 1
0019 #define QLINK_PROTO_VER \
0020 QLINK_VER(QLINK_PROTO_VER_MAJOR, QLINK_PROTO_VER_MINOR)
0021
0022 #define QLINK_ALIGN 4
0023
0024 #define QLINK_MACID_RSVD 0xFF
0025 #define QLINK_VIFID_RSVD 0xFF
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042 enum qlink_msg_type {
0043 QLINK_MSG_TYPE_CMD = 1,
0044 QLINK_MSG_TYPE_CMDRSP = 2,
0045 QLINK_MSG_TYPE_EVENT = 3
0046 };
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056 struct qlink_msg_header {
0057 __le16 type;
0058 __le16 len;
0059 } __packed;
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077 enum qlink_hw_capab {
0078 QLINK_HW_CAPAB_REG_UPDATE = 0,
0079 QLINK_HW_CAPAB_STA_INACT_TIMEOUT,
0080 QLINK_HW_CAPAB_DFS_OFFLOAD,
0081 QLINK_HW_CAPAB_SCAN_RANDOM_MAC_ADDR,
0082 QLINK_HW_CAPAB_PWR_MGMT,
0083 QLINK_HW_CAPAB_OBSS_SCAN,
0084 QLINK_HW_CAPAB_SCAN_DWELL,
0085 QLINK_HW_CAPAB_SAE,
0086 QLINK_HW_CAPAB_HW_BRIDGE,
0087 QLINK_HW_CAPAB_NUM
0088 };
0089
0090
0091
0092
0093
0094 enum qlink_driver_capab {
0095 QLINK_DRV_CAPAB_NUM = 0
0096 };
0097
0098 enum qlink_iface_type {
0099 QLINK_IFTYPE_AP = 1,
0100 QLINK_IFTYPE_STATION = 2,
0101 QLINK_IFTYPE_ADHOC = 3,
0102 QLINK_IFTYPE_MONITOR = 4,
0103 QLINK_IFTYPE_WDS = 5,
0104 QLINK_IFTYPE_AP_VLAN = 6,
0105 };
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116 struct qlink_intf_info {
0117 __le16 if_type;
0118 __le16 vlanid;
0119 u8 mac_addr[ETH_ALEN];
0120 u8 use4addr;
0121 u8 rsvd[1];
0122 } __packed;
0123
0124 enum qlink_sta_flags {
0125 QLINK_STA_FLAG_INVALID = 0,
0126 QLINK_STA_FLAG_AUTHORIZED = BIT(0),
0127 QLINK_STA_FLAG_SHORT_PREAMBLE = BIT(1),
0128 QLINK_STA_FLAG_WME = BIT(2),
0129 QLINK_STA_FLAG_MFP = BIT(3),
0130 QLINK_STA_FLAG_AUTHENTICATED = BIT(4),
0131 QLINK_STA_FLAG_TDLS_PEER = BIT(5),
0132 QLINK_STA_FLAG_ASSOCIATED = BIT(6),
0133 };
0134
0135 enum qlink_channel_width {
0136 QLINK_CHAN_WIDTH_5 = 0,
0137 QLINK_CHAN_WIDTH_10,
0138 QLINK_CHAN_WIDTH_20_NOHT,
0139 QLINK_CHAN_WIDTH_20,
0140 QLINK_CHAN_WIDTH_40,
0141 QLINK_CHAN_WIDTH_80,
0142 QLINK_CHAN_WIDTH_80P80,
0143 QLINK_CHAN_WIDTH_160,
0144 };
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162 struct qlink_channel {
0163 __le16 hw_value;
0164 __le16 center_freq;
0165 __le32 flags;
0166 u8 band;
0167 u8 max_antenna_gain;
0168 u8 max_power;
0169 u8 max_reg_power;
0170 __le32 dfs_cac_ms;
0171 u8 dfs_state;
0172 u8 beacon_found;
0173 u8 rsvd[2];
0174 } __packed;
0175
0176
0177
0178
0179
0180
0181
0182
0183
0184 struct qlink_chandef {
0185 struct qlink_channel chan;
0186 __le16 center_freq1;
0187 __le16 center_freq2;
0188 u8 width;
0189 u8 rsvd[3];
0190 } __packed;
0191
0192 #define QLINK_MAX_NR_CIPHER_SUITES 5
0193 #define QLINK_MAX_NR_AKM_SUITES 2
0194
0195 struct qlink_auth_encr {
0196 __le32 wpa_versions;
0197 __le32 cipher_group;
0198 __le32 n_ciphers_pairwise;
0199 __le32 ciphers_pairwise[QLINK_MAX_NR_CIPHER_SUITES];
0200 __le32 n_akm_suites;
0201 __le32 akm_suites[QLINK_MAX_NR_AKM_SUITES];
0202 __le16 control_port_ethertype;
0203 u8 auth_type;
0204 u8 privacy;
0205 u8 control_port;
0206 u8 control_port_no_encrypt;
0207 u8 rsvd[2];
0208 } __packed;
0209
0210
0211
0212
0213
0214
0215
0216 struct qlink_sta_info_state {
0217 __le32 mask;
0218 __le32 value;
0219 } __packed;
0220
0221
0222
0223
0224
0225
0226
0227
0228
0229
0230
0231
0232
0233
0234 enum qlink_sr_ctrl_flags {
0235 QLINK_SR_PSR_DISALLOWED = BIT(0),
0236 QLINK_SR_NON_SRG_OBSS_PD_SR_DISALLOWED = BIT(1),
0237 QLINK_SR_NON_SRG_OFFSET_PRESENT = BIT(2),
0238 QLINK_SR_SRG_INFORMATION_PRESENT = BIT(3),
0239 };
0240
0241
0242
0243
0244
0245
0246
0247
0248
0249
0250
0251
0252
0253 struct qlink_sr_params {
0254 u8 sr_control;
0255 u8 non_srg_obss_pd_max;
0256 u8 srg_obss_pd_min_offset;
0257 u8 srg_obss_pd_max_offset;
0258 } __packed;
0259
0260
0261
0262
0263
0264
0265
0266
0267
0268
0269
0270
0271
0272
0273
0274
0275
0276
0277
0278
0279
0280
0281
0282
0283
0284
0285
0286
0287
0288 enum qlink_cmd_type {
0289 QLINK_CMD_FW_INIT = 0x0001,
0290 QLINK_CMD_FW_DEINIT = 0x0002,
0291 QLINK_CMD_REGISTER_MGMT = 0x0003,
0292 QLINK_CMD_SEND_FRAME = 0x0004,
0293 QLINK_CMD_MGMT_SET_APPIE = 0x0005,
0294 QLINK_CMD_PHY_PARAMS_SET = 0x0012,
0295 QLINK_CMD_GET_HW_INFO = 0x0013,
0296 QLINK_CMD_MAC_INFO = 0x0014,
0297 QLINK_CMD_ADD_INTF = 0x0015,
0298 QLINK_CMD_DEL_INTF = 0x0016,
0299 QLINK_CMD_CHANGE_INTF = 0x0017,
0300 QLINK_CMD_UPDOWN_INTF = 0x0018,
0301 QLINK_CMD_REG_NOTIFY = 0x0019,
0302 QLINK_CMD_BAND_INFO_GET = 0x001A,
0303 QLINK_CMD_CHAN_SWITCH = 0x001B,
0304 QLINK_CMD_CHAN_GET = 0x001C,
0305 QLINK_CMD_START_CAC = 0x001D,
0306 QLINK_CMD_START_AP = 0x0021,
0307 QLINK_CMD_STOP_AP = 0x0022,
0308 QLINK_CMD_SET_MAC_ACL = 0x0023,
0309 QLINK_CMD_GET_STA_INFO = 0x0030,
0310 QLINK_CMD_ADD_KEY = 0x0040,
0311 QLINK_CMD_DEL_KEY = 0x0041,
0312 QLINK_CMD_SET_DEFAULT_KEY = 0x0042,
0313 QLINK_CMD_SET_DEFAULT_MGMT_KEY = 0x0043,
0314 QLINK_CMD_CHANGE_STA = 0x0051,
0315 QLINK_CMD_DEL_STA = 0x0052,
0316 QLINK_CMD_SCAN = 0x0053,
0317 QLINK_CMD_CHAN_STATS = 0x0054,
0318 QLINK_CMD_NDEV_EVENT = 0x0055,
0319 QLINK_CMD_CONNECT = 0x0060,
0320 QLINK_CMD_DISCONNECT = 0x0061,
0321 QLINK_CMD_PM_SET = 0x0062,
0322 QLINK_CMD_WOWLAN_SET = 0x0063,
0323 QLINK_CMD_EXTERNAL_AUTH = 0x0066,
0324 QLINK_CMD_TXPWR = 0x0067,
0325 QLINK_CMD_UPDATE_OWE = 0x0068,
0326 };
0327
0328
0329
0330
0331
0332
0333
0334
0335
0336
0337
0338
0339
0340
0341
0342 struct qlink_cmd {
0343 struct qlink_msg_header mhdr;
0344 __le16 cmd_id;
0345 __le16 seq_num;
0346 u8 macid;
0347 u8 vifid;
0348 u8 rsvd[2];
0349 } __packed;
0350
0351
0352
0353
0354
0355
0356
0357
0358
0359
0360
0361
0362 struct qlink_cmd_init_fw {
0363 struct qlink_cmd chdr;
0364 __le32 qlink_proto_ver;
0365 u8 var_info[];
0366 } __packed;
0367
0368
0369
0370
0371
0372
0373
0374
0375
0376 struct qlink_cmd_manage_intf {
0377 struct qlink_cmd chdr;
0378 struct qlink_intf_info intf_info;
0379 } __packed;
0380
0381 enum qlink_mgmt_frame_type {
0382 QLINK_MGMT_FRAME_ASSOC_REQ = 0x00,
0383 QLINK_MGMT_FRAME_ASSOC_RESP = 0x01,
0384 QLINK_MGMT_FRAME_REASSOC_REQ = 0x02,
0385 QLINK_MGMT_FRAME_REASSOC_RESP = 0x03,
0386 QLINK_MGMT_FRAME_PROBE_REQ = 0x04,
0387 QLINK_MGMT_FRAME_PROBE_RESP = 0x05,
0388 QLINK_MGMT_FRAME_BEACON = 0x06,
0389 QLINK_MGMT_FRAME_ATIM = 0x07,
0390 QLINK_MGMT_FRAME_DISASSOC = 0x08,
0391 QLINK_MGMT_FRAME_AUTH = 0x09,
0392 QLINK_MGMT_FRAME_DEAUTH = 0x0A,
0393 QLINK_MGMT_FRAME_ACTION = 0x0B,
0394
0395 QLINK_MGMT_FRAME_TYPE_COUNT
0396 };
0397
0398
0399
0400
0401
0402
0403
0404
0405
0406 struct qlink_cmd_mgmt_frame_register {
0407 struct qlink_cmd chdr;
0408 __le16 frame_type;
0409 u8 do_register;
0410 u8 rsvd[1];
0411 } __packed;
0412
0413
0414
0415
0416
0417 enum qlink_frame_tx_flags {
0418 QLINK_FRAME_TX_FLAG_OFFCHAN = BIT(0),
0419 QLINK_FRAME_TX_FLAG_NO_CCK = BIT(1),
0420 QLINK_FRAME_TX_FLAG_ACK_NOWAIT = BIT(2),
0421 QLINK_FRAME_TX_FLAG_8023 = BIT(3),
0422 };
0423
0424
0425
0426
0427
0428
0429
0430
0431
0432 struct qlink_cmd_frame_tx {
0433 struct qlink_cmd chdr;
0434 __le32 cookie;
0435 __le16 freq;
0436 __le16 flags;
0437 u8 frame_data[];
0438 } __packed;
0439
0440
0441
0442
0443
0444
0445 struct qlink_cmd_get_sta_info {
0446 struct qlink_cmd chdr;
0447 u8 sta_addr[ETH_ALEN];
0448 u8 rsvd[2];
0449 } __packed;
0450
0451
0452
0453
0454
0455
0456
0457
0458
0459
0460
0461 struct qlink_cmd_add_key {
0462 struct qlink_cmd chdr;
0463 u8 key_index;
0464 u8 pairwise;
0465 u8 addr[ETH_ALEN];
0466 __le32 cipher;
0467 __le16 vlanid;
0468 u8 rsvd[2];
0469 u8 key_data[];
0470 } __packed;
0471
0472
0473
0474
0475
0476
0477
0478
0479 struct qlink_cmd_del_key {
0480 struct qlink_cmd chdr;
0481 u8 key_index;
0482 u8 pairwise;
0483 u8 addr[ETH_ALEN];
0484 } __packed;
0485
0486
0487
0488
0489
0490
0491
0492
0493 struct qlink_cmd_set_def_key {
0494 struct qlink_cmd chdr;
0495 u8 key_index;
0496 u8 unicast;
0497 u8 multicast;
0498 u8 rsvd[1];
0499 } __packed;
0500
0501
0502
0503
0504
0505
0506 struct qlink_cmd_set_def_mgmt_key {
0507 struct qlink_cmd chdr;
0508 u8 key_index;
0509 u8 rsvd[3];
0510 } __packed;
0511
0512
0513
0514
0515
0516
0517
0518
0519
0520 struct qlink_cmd_change_sta {
0521 struct qlink_cmd chdr;
0522 struct qlink_sta_info_state flag_update;
0523 __le16 if_type;
0524 __le16 vlanid;
0525 u8 sta_addr[ETH_ALEN];
0526 u8 rsvd[2];
0527 } __packed;
0528
0529
0530
0531
0532
0533
0534 struct qlink_cmd_del_sta {
0535 struct qlink_cmd chdr;
0536 __le16 reason_code;
0537 u8 sta_addr[ETH_ALEN];
0538 u8 subtype;
0539 u8 rsvd[3];
0540 } __packed;
0541
0542 enum qlink_sta_connect_flags {
0543 QLINK_STA_CONNECT_DISABLE_HT = BIT(0),
0544 QLINK_STA_CONNECT_DISABLE_VHT = BIT(1),
0545 QLINK_STA_CONNECT_USE_RRM = BIT(2),
0546 };
0547
0548
0549
0550
0551
0552
0553
0554
0555
0556
0557
0558
0559
0560
0561
0562
0563
0564
0565
0566 struct qlink_cmd_connect {
0567 struct qlink_cmd chdr;
0568 u8 bssid[ETH_ALEN];
0569 u8 bssid_hint[ETH_ALEN];
0570 u8 prev_bssid[ETH_ALEN];
0571 __le16 bg_scan_period;
0572 __le32 flags;
0573 struct ieee80211_ht_cap ht_capa;
0574 struct ieee80211_ht_cap ht_capa_mask;
0575 struct ieee80211_vht_cap vht_capa;
0576 struct ieee80211_vht_cap vht_capa_mask;
0577 struct qlink_auth_encr aen;
0578 u8 mfp;
0579 u8 pbss;
0580 u8 rsvd[2];
0581 u8 payload[];
0582 } __packed;
0583
0584
0585
0586
0587
0588
0589
0590
0591 struct qlink_cmd_external_auth {
0592 struct qlink_cmd chdr;
0593 u8 peer[ETH_ALEN];
0594 __le16 status;
0595 u8 payload[];
0596 } __packed;
0597
0598
0599
0600
0601
0602
0603 struct qlink_cmd_disconnect {
0604 struct qlink_cmd chdr;
0605 __le16 reason;
0606 u8 rsvd[2];
0607 } __packed;
0608
0609
0610
0611
0612
0613
0614
0615 struct qlink_cmd_updown {
0616 struct qlink_cmd chdr;
0617 u8 if_up;
0618 u8 rsvd[3];
0619 } __packed;
0620
0621
0622
0623
0624
0625
0626
0627
0628 enum qlink_band {
0629 QLINK_BAND_2GHZ = BIT(0),
0630 QLINK_BAND_5GHZ = BIT(1),
0631 QLINK_BAND_60GHZ = BIT(2),
0632 };
0633
0634
0635
0636
0637
0638
0639 struct qlink_cmd_band_info_get {
0640 struct qlink_cmd chdr;
0641 u8 band;
0642 u8 rsvd[3];
0643 } __packed;
0644
0645
0646
0647
0648
0649
0650 struct qlink_cmd_get_chan_stats {
0651 struct qlink_cmd chdr;
0652 __le32 channel_freq;
0653 } __packed;
0654
0655
0656
0657
0658
0659
0660 enum qlink_reg_initiator {
0661 QLINK_REGDOM_SET_BY_CORE,
0662 QLINK_REGDOM_SET_BY_USER,
0663 QLINK_REGDOM_SET_BY_DRIVER,
0664 QLINK_REGDOM_SET_BY_COUNTRY_IE,
0665 };
0666
0667
0668
0669
0670
0671
0672 enum qlink_user_reg_hint_type {
0673 QLINK_USER_REG_HINT_USER = 0,
0674 QLINK_USER_REG_HINT_CELL_BASE = 1,
0675 QLINK_USER_REG_HINT_INDOOR = 2,
0676 };
0677
0678
0679
0680
0681
0682
0683
0684
0685
0686
0687
0688
0689
0690
0691
0692 struct qlink_cmd_reg_notify {
0693 struct qlink_cmd chdr;
0694 u8 alpha2[2];
0695 u8 initiator;
0696 u8 user_reg_hint_type;
0697 u8 num_channels;
0698 u8 dfs_region;
0699 u8 slave_radar;
0700 u8 dfs_offload;
0701 u8 info[];
0702 } __packed;
0703
0704
0705
0706
0707
0708
0709
0710
0711
0712 enum qlink_chan_sw_flags {
0713 QLINK_CHAN_SW_RADAR_REQUIRED = BIT(0),
0714 QLINK_CHAN_SW_BLOCK_TX = BIT(1),
0715 };
0716
0717
0718
0719
0720
0721
0722
0723
0724 struct qlink_cmd_chan_switch {
0725 struct qlink_cmd chdr;
0726 struct qlink_chandef channel;
0727 __le64 flags;
0728 __le32 n_counter_offsets_beacon;
0729 __le32 n_counter_offsets_presp;
0730 u8 beacon_count;
0731 u8 rsvd[3];
0732 } __packed;
0733
0734
0735
0736
0737
0738
0739 enum qlink_hidden_ssid {
0740 QLINK_HIDDEN_SSID_NOT_IN_USE,
0741 QLINK_HIDDEN_SSID_ZERO_LEN,
0742 QLINK_HIDDEN_SSID_ZERO_CONTENTS
0743 };
0744
0745
0746
0747
0748
0749
0750
0751
0752
0753
0754
0755
0756
0757
0758
0759
0760 struct qlink_cmd_start_ap {
0761 struct qlink_cmd chdr;
0762 __le16 beacon_interval;
0763 __le16 inactivity_timeout;
0764 u8 dtim_period;
0765 u8 hidden_ssid;
0766 u8 smps_mode;
0767 u8 p2p_ctwindow;
0768 u8 p2p_opp_ps;
0769 u8 pbss;
0770 u8 ht_required;
0771 u8 vht_required;
0772 struct qlink_auth_encr aen;
0773 struct qlink_sr_params sr_params;
0774 u8 twt_responder;
0775 u8 rsvd[3];
0776 u8 info[];
0777 } __packed;
0778
0779
0780
0781
0782
0783
0784
0785 struct qlink_cmd_start_cac {
0786 struct qlink_cmd chdr;
0787 struct qlink_chandef chan;
0788 __le32 cac_time_ms;
0789 } __packed;
0790
0791 enum qlink_acl_policy {
0792 QLINK_ACL_POLICY_ACCEPT_UNLESS_LISTED,
0793 QLINK_ACL_POLICY_DENY_UNLESS_LISTED,
0794 };
0795
0796 struct qlink_mac_address {
0797 u8 addr[ETH_ALEN];
0798 } __packed;
0799
0800
0801
0802
0803
0804
0805
0806
0807 struct qlink_acl_data {
0808 __le32 policy;
0809 __le32 num_entries;
0810 struct qlink_mac_address mac_addrs[];
0811 } __packed;
0812
0813
0814
0815
0816
0817
0818
0819 enum qlink_pm_mode {
0820 QLINK_PM_OFF = 0,
0821 QLINK_PM_AUTO_STANDBY = 1,
0822 };
0823
0824
0825
0826
0827
0828
0829
0830
0831 struct qlink_cmd_pm_set {
0832 struct qlink_cmd chdr;
0833 __le32 pm_standby_timer;
0834 u8 pm_mode;
0835 u8 rsvd[3];
0836 } __packed;
0837
0838
0839
0840
0841
0842
0843 enum qlink_txpwr_op {
0844 QLINK_TXPWR_SET,
0845 QLINK_TXPWR_GET
0846 };
0847
0848
0849
0850
0851
0852
0853
0854
0855
0856 struct qlink_cmd_txpwr {
0857 struct qlink_cmd chdr;
0858 __le32 txpwr;
0859 u8 txpwr_setting;
0860 u8 op_type;
0861 u8 rsvd[2];
0862 } __packed;
0863
0864
0865
0866
0867
0868
0869
0870
0871 enum qlink_wowlan_trigger {
0872 QLINK_WOWLAN_TRIG_DISCONNECT = BIT(0),
0873 QLINK_WOWLAN_TRIG_MAGIC_PKT = BIT(1),
0874 QLINK_WOWLAN_TRIG_PATTERN_PKT = BIT(2),
0875 };
0876
0877
0878
0879
0880
0881
0882 struct qlink_cmd_wowlan_set {
0883 struct qlink_cmd chdr;
0884 __le32 triggers;
0885 u8 data[];
0886 } __packed;
0887
0888 enum qlink_ndev_event_type {
0889 QLINK_NDEV_EVENT_CHANGEUPPER,
0890 };
0891
0892
0893
0894
0895
0896
0897 struct qlink_cmd_ndev_event {
0898 struct qlink_cmd chdr;
0899 __le16 event;
0900 u8 rsvd[2];
0901 } __packed;
0902
0903 enum qlink_ndev_upper_type {
0904 QLINK_NDEV_UPPER_TYPE_NONE,
0905 QLINK_NDEV_UPPER_TYPE_BRIDGE,
0906 };
0907
0908
0909
0910
0911
0912
0913
0914 struct qlink_cmd_ndev_changeupper {
0915 struct qlink_cmd_ndev_event nehdr;
0916 __le64 flags;
0917 __le32 br_domain;
0918 __le32 netspace_id;
0919 __le16 vlanid;
0920 u8 upper_type;
0921 u8 rsvd[1];
0922 } __packed;
0923
0924
0925
0926
0927
0928
0929
0930
0931 enum qlink_scan_flags {
0932 QLINK_SCAN_FLAG_FLUSH = BIT(0),
0933 QLINK_SCAN_FLAG_DURATION_MANDATORY = BIT(1),
0934 };
0935
0936
0937
0938
0939
0940
0941
0942
0943
0944
0945
0946
0947
0948
0949
0950 struct qlink_cmd_scan {
0951 struct qlink_cmd chdr;
0952 __le64 flags;
0953 __le16 n_ssids;
0954 __le16 n_channels;
0955 __le16 active_dwell;
0956 __le16 passive_dwell;
0957 __le16 sample_duration;
0958 u8 bssid[ETH_ALEN];
0959 u8 scan_width;
0960 u8 rsvd[3];
0961 u8 var_info[];
0962 } __packed;
0963
0964
0965
0966
0967
0968
0969
0970
0971 struct qlink_cmd_update_owe {
0972 struct qlink_cmd chdr;
0973 u8 peer[ETH_ALEN];
0974 __le16 status;
0975 u8 ies[];
0976 } __packed;
0977
0978
0979
0980
0981 enum qlink_cmd_result {
0982 QLINK_CMD_RESULT_OK = 0,
0983 QLINK_CMD_RESULT_INVALID,
0984 QLINK_CMD_RESULT_ENOTSUPP,
0985 QLINK_CMD_RESULT_ENOTFOUND,
0986 QLINK_CMD_RESULT_EALREADY,
0987 QLINK_CMD_RESULT_EADDRINUSE,
0988 QLINK_CMD_RESULT_EADDRNOTAVAIL,
0989 QLINK_CMD_RESULT_EBUSY,
0990 };
0991
0992
0993
0994
0995
0996
0997
0998
0999
1000
1001
1002
1003
1004
1005
1006
1007 struct qlink_resp {
1008 struct qlink_msg_header mhdr;
1009 __le16 cmd_id;
1010 __le16 seq_num;
1011 __le16 result;
1012 u8 macid;
1013 u8 vifid;
1014 } __packed;
1015
1016
1017
1018
1019
1020
1021 struct qlink_resp_init_fw {
1022 struct qlink_resp rhdr;
1023 __le32 qlink_proto_ver;
1024 } __packed;
1025
1026
1027
1028
1029
1030
1031 enum qlink_dfs_regions {
1032 QLINK_DFS_UNSET = 0,
1033 QLINK_DFS_FCC = 1,
1034 QLINK_DFS_ETSI = 2,
1035 QLINK_DFS_JP = 3,
1036 };
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060 struct qlink_resp_get_mac_info {
1061 struct qlink_resp rhdr;
1062 u8 dev_mac[ETH_ALEN];
1063 u8 num_tx_chain;
1064 u8 num_rx_chain;
1065 struct ieee80211_vht_cap vht_cap_mod_mask;
1066 struct ieee80211_ht_cap ht_cap_mod_mask;
1067
1068 __le16 max_ap_assoc_sta;
1069 __le32 hw_version;
1070 __le32 probe_resp_offload;
1071 __le32 bss_select_support;
1072 __le16 n_addresses;
1073 __le16 radar_detect_widths;
1074 __le16 max_remain_on_channel_duration;
1075 __le16 max_acl_mac_addrs;
1076
1077 __le32 frag_threshold;
1078 __le32 rts_threshold;
1079 u8 retry_short;
1080 u8 retry_long;
1081 u8 coverage_class;
1082
1083 u8 max_scan_ssids;
1084 u8 max_sched_scan_reqs;
1085 u8 max_sched_scan_ssids;
1086 u8 max_match_sets;
1087 u8 max_adj_channel_rssi_comp;
1088
1089 __le16 max_scan_ie_len;
1090 __le16 max_sched_scan_ie_len;
1091 __le32 max_sched_scan_plans;
1092 __le32 max_sched_scan_plan_interval;
1093 __le32 max_sched_scan_plan_iterations;
1094
1095 u8 n_cipher_suites;
1096 u8 n_akm_suites;
1097 u8 max_num_pmkids;
1098 u8 num_iftype_ext_capab;
1099 u8 extended_capabilities_len;
1100 u8 max_data_retry_count;
1101 u8 n_iface_combinations;
1102 u8 max_num_csa_counters;
1103
1104 u8 bands_cap;
1105 u8 alpha2[2];
1106 u8 n_reg_rules;
1107 u8 dfs_region;
1108 u8 rsvd[3];
1109 u8 var_info[];
1110 } __packed;
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124 struct qlink_resp_get_hw_info {
1125 struct qlink_resp rhdr;
1126 __le32 fw_ver;
1127 __le32 bld_tmstamp;
1128 __le32 plat_id;
1129 __le32 hw_ver;
1130 u8 num_mac;
1131 u8 mac_bitmap;
1132 u8 total_tx_chain;
1133 u8 total_rx_chain;
1134 u8 info[];
1135 } __packed;
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145 struct qlink_resp_manage_intf {
1146 struct qlink_resp rhdr;
1147 struct qlink_intf_info intf_info;
1148 } __packed;
1149
1150 enum qlink_sta_info_rate_flags {
1151 QLINK_STA_INFO_RATE_FLAG_HT_MCS = BIT(0),
1152 QLINK_STA_INFO_RATE_FLAG_VHT_MCS = BIT(1),
1153 QLINK_STA_INFO_RATE_FLAG_SHORT_GI = BIT(2),
1154 QLINK_STA_INFO_RATE_FLAG_60G = BIT(3),
1155 QLINK_STA_INFO_RATE_FLAG_HE_MCS = BIT(4),
1156 };
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166 struct qlink_resp_get_sta_info {
1167 struct qlink_resp rhdr;
1168 u8 sta_addr[ETH_ALEN];
1169 u8 rsvd[2];
1170 u8 info[];
1171 } __packed;
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181 struct qlink_resp_band_info_get {
1182 struct qlink_resp rhdr;
1183 u8 band;
1184 u8 num_chans;
1185 u8 num_bitrates;
1186 u8 rsvd[1];
1187 u8 info[];
1188 } __packed;
1189
1190
1191
1192
1193
1194
1195
1196 struct qlink_resp_get_chan_stats {
1197 struct qlink_resp rhdr;
1198 __le32 chan_freq;
1199 u8 info[];
1200 } __packed;
1201
1202
1203
1204
1205
1206
1207 struct qlink_resp_channel_get {
1208 struct qlink_resp rhdr;
1209 struct qlink_chandef chan;
1210 } __packed;
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220 struct qlink_resp_txpwr {
1221 struct qlink_resp rhdr;
1222 __le32 txpwr;
1223 } __packed;
1224
1225
1226
1227
1228 enum qlink_event_type {
1229 QLINK_EVENT_STA_ASSOCIATED = 0x0021,
1230 QLINK_EVENT_STA_DEAUTH = 0x0022,
1231 QLINK_EVENT_MGMT_RECEIVED = 0x0023,
1232 QLINK_EVENT_SCAN_RESULTS = 0x0024,
1233 QLINK_EVENT_SCAN_COMPLETE = 0x0025,
1234 QLINK_EVENT_BSS_JOIN = 0x0026,
1235 QLINK_EVENT_BSS_LEAVE = 0x0027,
1236 QLINK_EVENT_FREQ_CHANGE = 0x0028,
1237 QLINK_EVENT_RADAR = 0x0029,
1238 QLINK_EVENT_EXTERNAL_AUTH = 0x0030,
1239 QLINK_EVENT_MIC_FAILURE = 0x0031,
1240 QLINK_EVENT_UPDATE_OWE = 0x0032,
1241 };
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255 struct qlink_event {
1256 struct qlink_msg_header mhdr;
1257 __le16 event_id;
1258 u8 macid;
1259 u8 vifid;
1260 } __packed;
1261
1262
1263
1264
1265
1266
1267
1268
1269 struct qlink_event_sta_assoc {
1270 struct qlink_event ehdr;
1271 u8 sta_addr[ETH_ALEN];
1272 __le16 frame_control;
1273 u8 ies[];
1274 } __packed;
1275
1276
1277
1278
1279
1280
1281
1282 struct qlink_event_sta_deauth {
1283 struct qlink_event ehdr;
1284 u8 sta_addr[ETH_ALEN];
1285 __le16 reason;
1286 } __packed;
1287
1288
1289
1290
1291
1292
1293
1294
1295 struct qlink_event_bss_join {
1296 struct qlink_event ehdr;
1297 struct qlink_chandef chan;
1298 u8 bssid[ETH_ALEN];
1299 __le16 status;
1300 u8 ies[];
1301 } __packed;
1302
1303
1304
1305
1306
1307
1308 struct qlink_event_bss_leave {
1309 struct qlink_event ehdr;
1310 __le16 reason;
1311 u8 rsvd[2];
1312 } __packed;
1313
1314
1315
1316
1317
1318
1319 struct qlink_event_freq_change {
1320 struct qlink_event ehdr;
1321 struct qlink_chandef chan;
1322 } __packed;
1323
1324 enum qlink_rxmgmt_flags {
1325 QLINK_RXMGMT_FLAG_ANSWERED = 1 << 0,
1326 };
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336 struct qlink_event_rxmgmt {
1337 struct qlink_event ehdr;
1338 __le32 freq;
1339 __le32 flags;
1340 s8 sig_dbm;
1341 u8 rsvd[3];
1342 u8 frame_data[];
1343 } __packed;
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359 struct qlink_event_scan_result {
1360 struct qlink_event ehdr;
1361 __le64 tsf;
1362 __le16 freq;
1363 __le16 capab;
1364 __le16 bintval;
1365 s8 sig_dbm;
1366 u8 ssid_len;
1367 u8 ssid[IEEE80211_MAX_SSID_LEN];
1368 u8 bssid[ETH_ALEN];
1369 u8 rsvd[2];
1370 u8 payload[];
1371 } __packed;
1372
1373
1374
1375
1376
1377
1378
1379 enum qlink_scan_complete_flags {
1380 QLINK_SCAN_NONE = 0,
1381 QLINK_SCAN_ABORTED = BIT(0),
1382 };
1383
1384
1385
1386
1387
1388
1389
1390 struct qlink_event_scan_complete {
1391 struct qlink_event ehdr;
1392 __le32 flags;
1393 } __packed;
1394
1395 enum qlink_radar_event {
1396 QLINK_RADAR_DETECTED,
1397 QLINK_RADAR_CAC_FINISHED,
1398 QLINK_RADAR_CAC_ABORTED,
1399 QLINK_RADAR_NOP_FINISHED,
1400 QLINK_RADAR_PRE_CAC_EXPIRED,
1401 QLINK_RADAR_CAC_STARTED,
1402 };
1403
1404
1405
1406
1407
1408
1409
1410 struct qlink_event_radar {
1411 struct qlink_event ehdr;
1412 struct qlink_chandef chan;
1413 u8 event;
1414 u8 rsvd[3];
1415 } __packed;
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426 struct qlink_event_external_auth {
1427 struct qlink_event ehdr;
1428 __le32 akm_suite;
1429 u8 ssid[IEEE80211_MAX_SSID_LEN];
1430 u8 bssid[ETH_ALEN];
1431 u8 ssid_len;
1432 u8 action;
1433 } __packed;
1434
1435
1436
1437
1438
1439
1440
1441
1442 struct qlink_event_mic_failure {
1443 struct qlink_event ehdr;
1444 u8 src[ETH_ALEN];
1445 u8 key_index;
1446 u8 pairwise;
1447 } __packed;
1448
1449
1450
1451
1452
1453
1454
1455 struct qlink_event_update_owe {
1456 struct qlink_event ehdr;
1457 u8 peer[ETH_ALEN];
1458 u8 rsvd[2];
1459 u8 ies[];
1460 } __packed;
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481 enum qlink_tlv_id {
1482 QTN_TLV_ID_FRAG_THRESH = 0x0201,
1483 QTN_TLV_ID_RTS_THRESH = 0x0202,
1484 QTN_TLV_ID_SRETRY_LIMIT = 0x0203,
1485 QTN_TLV_ID_LRETRY_LIMIT = 0x0204,
1486 QTN_TLV_ID_REG_RULE = 0x0207,
1487 QTN_TLV_ID_CHANNEL = 0x020F,
1488 QTN_TLV_ID_CHANDEF = 0x0210,
1489 QTN_TLV_ID_BITMAP = 0x0211,
1490 QTN_TLV_ID_STA_STATS = 0x0212,
1491 QTN_TLV_ID_COVERAGE_CLASS = 0x0213,
1492 QTN_TLV_ID_IFACE_LIMIT = 0x0214,
1493 QTN_TLV_ID_CHANNEL_STATS = 0x0216,
1494 QTN_TLV_ID_KEY = 0x0302,
1495 QTN_TLV_ID_SEQ = 0x0303,
1496 QTN_TLV_ID_IE_SET = 0x0305,
1497 QTN_TLV_ID_EXT_CAPABILITY_MASK = 0x0306,
1498 QTN_TLV_ID_ACL_DATA = 0x0307,
1499 QTN_TLV_ID_BUILD_NAME = 0x0401,
1500 QTN_TLV_ID_BUILD_REV = 0x0402,
1501 QTN_TLV_ID_BUILD_TYPE = 0x0403,
1502 QTN_TLV_ID_BUILD_LABEL = 0x0404,
1503 QTN_TLV_ID_HW_ID = 0x0405,
1504 QTN_TLV_ID_CALIBRATION_VER = 0x0406,
1505 QTN_TLV_ID_UBOOT_VER = 0x0407,
1506 QTN_TLV_ID_RANDOM_MAC_ADDR = 0x0408,
1507 QTN_TLV_ID_WOWLAN_CAPAB = 0x0410,
1508 QTN_TLV_ID_WOWLAN_PATTERN = 0x0411,
1509 QTN_TLV_ID_IFTYPE_DATA = 0x0418,
1510 };
1511
1512 struct qlink_tlv_hdr {
1513 __le16 type;
1514 __le16 len;
1515 u8 val[];
1516 } __packed;
1517
1518 struct qlink_iface_limit {
1519 __le16 max_num;
1520 __le16 type;
1521 } __packed;
1522
1523 struct qlink_iface_limit_record {
1524 __le16 max_interfaces;
1525 u8 num_different_channels;
1526 u8 n_limits;
1527 struct qlink_iface_limit limits[];
1528 } __packed;
1529
1530 #define QLINK_RSSI_OFFSET 120
1531
1532
1533
1534
1535
1536
1537 enum qlink_reg_rule_flags {
1538 QLINK_RRF_NO_OFDM = BIT(0),
1539 QLINK_RRF_NO_CCK = BIT(1),
1540 QLINK_RRF_NO_INDOOR = BIT(2),
1541 QLINK_RRF_NO_OUTDOOR = BIT(3),
1542 QLINK_RRF_DFS = BIT(4),
1543 QLINK_RRF_PTP_ONLY = BIT(5),
1544 QLINK_RRF_PTMP_ONLY = BIT(6),
1545 QLINK_RRF_NO_IR = BIT(7),
1546 QLINK_RRF_AUTO_BW = BIT(8),
1547 QLINK_RRF_IR_CONCURRENT = BIT(9),
1548 QLINK_RRF_NO_HT40MINUS = BIT(10),
1549 QLINK_RRF_NO_HT40PLUS = BIT(11),
1550 QLINK_RRF_NO_80MHZ = BIT(12),
1551 QLINK_RRF_NO_160MHZ = BIT(13),
1552 };
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569 struct qlink_tlv_reg_rule {
1570 struct qlink_tlv_hdr hdr;
1571 __le32 start_freq_khz;
1572 __le32 end_freq_khz;
1573 __le32 max_bandwidth_khz;
1574 __le32 max_antenna_gain;
1575 __le32 max_eirp;
1576 __le32 flags;
1577 __le32 dfs_cac_ms;
1578 } __packed;
1579
1580 enum qlink_channel_flags {
1581 QLINK_CHAN_DISABLED = BIT(0),
1582 QLINK_CHAN_NO_IR = BIT(1),
1583 QLINK_CHAN_RADAR = BIT(3),
1584 QLINK_CHAN_NO_HT40PLUS = BIT(4),
1585 QLINK_CHAN_NO_HT40MINUS = BIT(5),
1586 QLINK_CHAN_NO_OFDM = BIT(6),
1587 QLINK_CHAN_NO_80MHZ = BIT(7),
1588 QLINK_CHAN_NO_160MHZ = BIT(8),
1589 QLINK_CHAN_INDOOR_ONLY = BIT(9),
1590 QLINK_CHAN_IR_CONCURRENT = BIT(10),
1591 QLINK_CHAN_NO_20MHZ = BIT(11),
1592 QLINK_CHAN_NO_10MHZ = BIT(12),
1593 };
1594
1595 enum qlink_dfs_state {
1596 QLINK_DFS_USABLE,
1597 QLINK_DFS_UNAVAILABLE,
1598 QLINK_DFS_AVAILABLE,
1599 };
1600
1601
1602
1603
1604
1605
1606
1607
1608 struct qlink_tlv_channel {
1609 struct qlink_tlv_hdr hdr;
1610 struct qlink_channel chan;
1611 } __packed;
1612
1613
1614
1615
1616
1617
1618
1619
1620 struct qlink_tlv_chandef {
1621 struct qlink_tlv_hdr hdr;
1622 struct qlink_chandef chdef;
1623 } __packed;
1624
1625 enum qlink_ie_set_type {
1626 QLINK_IE_SET_UNKNOWN,
1627 QLINK_IE_SET_ASSOC_REQ,
1628 QLINK_IE_SET_ASSOC_RESP,
1629 QLINK_IE_SET_PROBE_REQ,
1630 QLINK_IE_SET_SCAN,
1631 QLINK_IE_SET_BEACON_HEAD,
1632 QLINK_IE_SET_BEACON_TAIL,
1633 QLINK_IE_SET_BEACON_IES,
1634 QLINK_IE_SET_PROBE_RESP,
1635 QLINK_IE_SET_PROBE_RESP_IES,
1636 };
1637
1638
1639
1640
1641
1642
1643
1644
1645 struct qlink_tlv_ie_set {
1646 struct qlink_tlv_hdr hdr;
1647 u8 type;
1648 u8 flags;
1649 u8 rsvd[2];
1650 u8 ie_data[];
1651 } __packed;
1652
1653
1654
1655
1656
1657
1658
1659 struct qlink_tlv_ext_ie {
1660 struct qlink_tlv_hdr hdr;
1661 u8 eid_ext;
1662 u8 rsvd[3];
1663 u8 ie_data[];
1664 } __packed;
1665
1666 #define IEEE80211_HE_PPE_THRES_MAX_LEN 25
1667 struct qlink_sband_iftype_data {
1668 __le16 types_mask;
1669 struct ieee80211_he_cap_elem he_cap_elem;
1670 struct ieee80211_he_mcs_nss_supp he_mcs_nss_supp;
1671 u8 ppe_thres[IEEE80211_HE_PPE_THRES_MAX_LEN];
1672 } __packed;
1673
1674
1675
1676
1677
1678
1679
1680 struct qlink_tlv_iftype_data {
1681 struct qlink_tlv_hdr hdr;
1682 u8 n_iftype_data;
1683 u8 rsvd[3];
1684 struct qlink_sband_iftype_data iftype_data[];
1685 } __packed;
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702 enum qlink_chan_stat {
1703 QLINK_CHAN_STAT_TIME_ON,
1704 QLINK_CHAN_STAT_TIME_TX,
1705 QLINK_CHAN_STAT_TIME_RX,
1706 QLINK_CHAN_STAT_CCA_BUSY,
1707 QLINK_CHAN_STAT_CCA_BUSY_EXT,
1708 QLINK_CHAN_STAT_TIME_SCAN,
1709 QLINK_CHAN_STAT_CHAN_NOISE,
1710 QLINK_CHAN_STAT_NUM,
1711 };
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729 struct qlink_chan_stats {
1730 __le64 time_on;
1731 __le64 time_tx;
1732 __le64 time_rx;
1733 __le64 cca_busy;
1734 __le64 cca_busy_ext;
1735 __le64 time_scan;
1736 s8 chan_noise;
1737 u8 rsvd[3];
1738 } __packed;
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765 enum qlink_sta_info {
1766 QLINK_STA_INFO_CONNECTED_TIME,
1767 QLINK_STA_INFO_INACTIVE_TIME,
1768 QLINK_STA_INFO_RX_BYTES,
1769 QLINK_STA_INFO_TX_BYTES,
1770 QLINK_STA_INFO_RX_BYTES64,
1771 QLINK_STA_INFO_TX_BYTES64,
1772 QLINK_STA_INFO_RX_DROP_MISC,
1773 QLINK_STA_INFO_BEACON_RX,
1774 QLINK_STA_INFO_SIGNAL,
1775 QLINK_STA_INFO_SIGNAL_AVG,
1776 QLINK_STA_INFO_RX_BITRATE,
1777 QLINK_STA_INFO_TX_BITRATE,
1778 QLINK_STA_INFO_RX_PACKETS,
1779 QLINK_STA_INFO_TX_PACKETS,
1780 QLINK_STA_INFO_TX_RETRIES,
1781 QLINK_STA_INFO_TX_FAILED,
1782 QLINK_STA_INFO_STA_FLAGS,
1783 QLINK_STA_INFO_NUM,
1784 };
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795 struct qlink_sta_info_rate {
1796 __le16 rate;
1797 u8 flags;
1798 u8 mcs;
1799 u8 nss;
1800 u8 bw;
1801 } __packed;
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811 struct qlink_sta_stats {
1812 __le64 rx_bytes;
1813 __le64 tx_bytes;
1814 __le64 rx_beacon;
1815 __le64 rx_duration;
1816 __le64 t_offset;
1817 __le32 connected_time;
1818 __le32 inactive_time;
1819 __le32 rx_packets;
1820 __le32 tx_packets;
1821 __le32 tx_retries;
1822 __le32 tx_failed;
1823 __le32 rx_dropped_misc;
1824 __le32 beacon_loss_count;
1825 __le32 expected_throughput;
1826 struct qlink_sta_info_state sta_flags;
1827 struct qlink_sta_info_rate txrate;
1828 struct qlink_sta_info_rate rxrate;
1829 __le16 llid;
1830 __le16 plid;
1831 u8 local_pm;
1832 u8 peer_pm;
1833 u8 nonpeer_pm;
1834 u8 rx_beacon_signal_avg;
1835 u8 plink_state;
1836 u8 signal;
1837 u8 signal_avg;
1838 u8 rsvd[1];
1839 };
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852 struct qlink_random_mac_addr {
1853 u8 mac_addr[ETH_ALEN];
1854 u8 mac_addr_mask[ETH_ALEN];
1855 } __packed;
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867 struct qlink_wowlan_capab_data {
1868 __le16 version;
1869 __le16 len;
1870 u8 data[];
1871 } __packed;
1872
1873
1874
1875
1876
1877
1878
1879
1880 struct qlink_wowlan_support {
1881 __le32 n_patterns;
1882 __le32 pattern_max_len;
1883 __le32 pattern_min_len;
1884 } __packed;
1885
1886 #endif