1 /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ 2 /* 3 * Copyright (C) 2012-2014, 2018 Intel Corporation 4 * Copyright (C) 2013-2015 Intel Mobile Communications GmbH 5 * Copyright (C) 2016-2017 Intel Deutschland GmbH 6 */ 7 #ifndef __iwl_fw_api_tdls_h__ 8 #define __iwl_fw_api_tdls_h__ 9 10 #include "fw/api/tx.h" 11 #include "fw/api/phy-ctxt.h" 12 13 #define IWL_MVM_TDLS_STA_COUNT 4 14 15 /* Type of TDLS request */ 16 enum iwl_tdls_channel_switch_type { 17 TDLS_SEND_CHAN_SW_REQ = 0, 18 TDLS_SEND_CHAN_SW_RESP_AND_MOVE_CH, 19 TDLS_MOVE_CH, 20 }; /* TDLS_STA_CHANNEL_SWITCH_CMD_TYPE_API_E_VER_1 */ 21 22 /** 23 * struct iwl_tdls_channel_switch_timing - Switch timing in TDLS channel-switch 24 * @frame_timestamp: GP2 timestamp of channel-switch request/response packet 25 * received from peer 26 * @max_offchan_duration: What amount of microseconds out of a DTIM is given 27 * to the TDLS off-channel communication. For instance if the DTIM is 28 * 200TU and the TDLS peer is to be given 25% of the time, the value 29 * given will be 50TU, or 50 * 1024 if translated into microseconds. 30 * @switch_time: switch time the peer sent in its channel switch timing IE 31 * @switch_timeout: switch timeout the peer sent in its channel switch timing IE 32 */ 33 struct iwl_tdls_channel_switch_timing { 34 __le32 frame_timestamp; /* GP2 time of peer packet Rx */ 35 __le32 max_offchan_duration; /* given in micro-seconds */ 36 __le32 switch_time; /* given in micro-seconds */ 37 __le32 switch_timeout; /* given in micro-seconds */ 38 } __packed; /* TDLS_STA_CHANNEL_SWITCH_TIMING_DATA_API_S_VER_1 */ 39 40 #define IWL_TDLS_CH_SW_FRAME_MAX_SIZE 200 41 42 /** 43 * struct iwl_tdls_channel_switch_frame - TDLS channel switch frame template 44 * 45 * A template representing a TDLS channel-switch request or response frame 46 * 47 * @switch_time_offset: offset to the channel switch timing IE in the template 48 * @tx_cmd: Tx parameters for the frame 49 * @data: frame data 50 */ 51 struct iwl_tdls_channel_switch_frame { 52 __le32 switch_time_offset; 53 struct iwl_tx_cmd tx_cmd; 54 u8 data[IWL_TDLS_CH_SW_FRAME_MAX_SIZE]; 55 } __packed; /* TDLS_STA_CHANNEL_SWITCH_FRAME_API_S_VER_1 */ 56 57 /** 58 * struct iwl_tdls_channel_switch_cmd_tail - tail of iwl_tdls_channel_switch_cmd 59 * 60 * @timing: timing related data for command 61 * @frame: channel-switch request/response template, depending to switch_type 62 */ 63 struct iwl_tdls_channel_switch_cmd_tail { 64 struct iwl_tdls_channel_switch_timing timing; 65 struct iwl_tdls_channel_switch_frame frame; 66 } __packed; 67 68 /** 69 * struct iwl_tdls_channel_switch_cmd - TDLS channel switch command 70 * 71 * The command is sent to initiate a channel switch and also in response to 72 * incoming TDLS channel-switch request/response packets from remote peers. 73 * 74 * @switch_type: see &enum iwl_tdls_channel_switch_type 75 * @peer_sta_id: station id of TDLS peer 76 * @ci: channel we switch to 77 * @tail: command tail 78 */ 79 struct iwl_tdls_channel_switch_cmd { 80 u8 switch_type; 81 __le32 peer_sta_id; 82 struct iwl_fw_channel_info ci; 83 struct iwl_tdls_channel_switch_cmd_tail tail; 84 } __packed; /* TDLS_STA_CHANNEL_SWITCH_CMD_API_S_VER_1 */ 85 86 /** 87 * struct iwl_tdls_channel_switch_notif - TDLS channel switch start notification 88 * 89 * @status: non-zero on success 90 * @offchannel_duration: duration given in microseconds 91 * @sta_id: peer currently performing the channel-switch with 92 */ 93 struct iwl_tdls_channel_switch_notif { 94 __le32 status; 95 __le32 offchannel_duration; 96 __le32 sta_id; 97 } __packed; /* TDLS_STA_CHANNEL_SWITCH_NTFY_API_S_VER_1 */ 98 99 /** 100 * struct iwl_tdls_sta_info - TDLS station info 101 * 102 * @sta_id: station id of the TDLS peer 103 * @tx_to_peer_tid: TID reserved vs. the peer for FW based Tx 104 * @tx_to_peer_ssn: initial SSN the FW should use for Tx on its TID vs the peer 105 * @is_initiator: 1 if the peer is the TDLS link initiator, 0 otherwise 106 */ 107 struct iwl_tdls_sta_info { 108 u8 sta_id; 109 u8 tx_to_peer_tid; 110 __le16 tx_to_peer_ssn; 111 __le32 is_initiator; 112 } __packed; /* TDLS_STA_INFO_VER_1 */ 113 114 /** 115 * struct iwl_tdls_config_cmd - TDLS basic config command 116 * 117 * @id_and_color: MAC id and color being configured 118 * @tdls_peer_count: amount of currently connected TDLS peers 119 * @tx_to_ap_tid: TID reverved vs. the AP for FW based Tx 120 * @tx_to_ap_ssn: initial SSN the FW should use for Tx on its TID vs. the AP 121 * @sta_info: per-station info. Only the first tdls_peer_count entries are set 122 * @pti_req_data_offset: offset of network-level data for the PTI template 123 * @pti_req_tx_cmd: Tx parameters for PTI request template 124 * @pti_req_template: PTI request template data 125 */ 126 struct iwl_tdls_config_cmd { 127 __le32 id_and_color; /* mac id and color */ 128 u8 tdls_peer_count; 129 u8 tx_to_ap_tid; 130 __le16 tx_to_ap_ssn; 131 struct iwl_tdls_sta_info sta_info[IWL_MVM_TDLS_STA_COUNT]; 132 133 __le32 pti_req_data_offset; 134 struct iwl_tx_cmd pti_req_tx_cmd; 135 u8 pti_req_template[0]; 136 } __packed; /* TDLS_CONFIG_CMD_API_S_VER_1 */ 137 138 /** 139 * struct iwl_tdls_config_sta_info_res - TDLS per-station config information 140 * 141 * @sta_id: station id of the TDLS peer 142 * @tx_to_peer_last_seq: last sequence number used by FW during FW-based Tx to 143 * the peer 144 */ 145 struct iwl_tdls_config_sta_info_res { 146 __le16 sta_id; 147 __le16 tx_to_peer_last_seq; 148 } __packed; /* TDLS_STA_INFO_RSP_VER_1 */ 149 150 /** 151 * struct iwl_tdls_config_res - TDLS config information from FW 152 * 153 * @tx_to_ap_last_seq: last sequence number used by FW during FW-based Tx to AP 154 * @sta_info: per-station TDLS config information 155 */ 156 struct iwl_tdls_config_res { 157 __le32 tx_to_ap_last_seq; 158 struct iwl_tdls_config_sta_info_res sta_info[IWL_MVM_TDLS_STA_COUNT]; 159 } __packed; /* TDLS_CONFIG_RSP_API_S_VER_1 */ 160 161 #endif /* __iwl_fw_api_tdls_h__ */ 162