1 /****************************************************************************** 2 * 3 * This file is provided under a dual BSD/GPLv2 license. When using or 4 * redistributing this file, you may do so under either license. 5 * 6 * GPL LICENSE SUMMARY 7 * 8 * Copyright(c) 2015 - 2017 Intel Deutschland GmbH 9 * 10 * This program is free software; you can redistribute it and/or modify 11 * it under the terms of version 2 of the GNU General Public License as 12 * published by the Free Software Foundation. 13 * 14 * This program is distributed in the hope that it will be useful, but 15 * WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17 * General Public License for more details. 18 * 19 * The full GNU General Public License is included in this distribution 20 * in the file called COPYING. 21 * 22 * Contact Information: 23 * Intel Linux Wireless <linuxwifi@intel.com> 24 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 25 * 26 * BSD LICENSE 27 * 28 * Copyright(c) 2015 - 2017 Intel Deutschland GmbH 29 * All rights reserved. 30 * 31 * Redistribution and use in source and binary forms, with or without 32 * modification, are permitted provided that the following conditions 33 * are met: 34 * 35 * * Redistributions of source code must retain the above copyright 36 * notice, this list of conditions and the following disclaimer. 37 * * Redistributions in binary form must reproduce the above copyright 38 * notice, this list of conditions and the following disclaimer in 39 * the documentation and/or other materials provided with the 40 * distribution. 41 * * Neither the name Intel Corporation nor the names of its 42 * contributors may be used to endorse or promote products derived 43 * from this software without specific prior written permission. 44 * 45 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 46 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 47 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 48 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 49 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 50 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 51 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 52 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 53 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 54 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 55 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 56 * 57 *****************************************************************************/ 58 #ifndef __iwl_fw_api_tof_h__ 59 #define __iwl_fw_api_tof_h__ 60 61 /* ToF sub-group command IDs */ 62 enum iwl_mvm_tof_sub_grp_ids { 63 TOF_RANGE_REQ_CMD = 0x1, 64 TOF_CONFIG_CMD = 0x2, 65 TOF_RANGE_ABORT_CMD = 0x3, 66 TOF_RANGE_REQ_EXT_CMD = 0x4, 67 TOF_RESPONDER_CONFIG_CMD = 0x5, 68 TOF_NW_INITIATED_RES_SEND_CMD = 0x6, 69 TOF_NEIGHBOR_REPORT_REQ_CMD = 0x7, 70 TOF_NEIGHBOR_REPORT_RSP_NOTIF = 0xFC, 71 TOF_NW_INITIATED_REQ_RCVD_NOTIF = 0xFD, 72 TOF_RANGE_RESPONSE_NOTIF = 0xFE, 73 TOF_MCSI_DEBUG_NOTIF = 0xFB, 74 }; 75 76 /** 77 * struct iwl_tof_config_cmd - ToF configuration 78 * @tof_disabled: 0 enabled, 1 - disabled 79 * @one_sided_disabled: 0 enabled, 1 - disabled 80 * @is_debug_mode: 1 debug mode, 0 - otherwise 81 * @is_buf_required: 1 channel estimation buffer required, 0 - otherwise 82 */ 83 struct iwl_tof_config_cmd { 84 __le32 sub_grp_cmd_id; 85 u8 tof_disabled; 86 u8 one_sided_disabled; 87 u8 is_debug_mode; 88 u8 is_buf_required; 89 } __packed; 90 91 /** 92 * struct iwl_tof_responder_config_cmd - ToF AP mode (for debug) 93 * @burst_period: future use: (currently hard coded in the LMAC) 94 * The interval between two sequential bursts. 95 * @min_delta_ftm: future use: (currently hard coded in the LMAC) 96 * The minimum delay between two sequential FTM Responses 97 * in the same burst. 98 * @burst_duration: future use: (currently hard coded in the LMAC) 99 * The total time for all FTMs handshake in the same burst. 100 * Affect the time events duration in the LMAC. 101 * @num_of_burst_exp: future use: (currently hard coded in the LMAC) 102 * The number of bursts for the current ToF request. Affect 103 * the number of events allocations in the current iteration. 104 * @get_ch_est: for xVT only, NA for driver 105 * @abort_responder: when set to '1' - Responder will terminate its activity 106 * (all other fields in the command are ignored) 107 * @recv_sta_req_params: 1 - Responder will ignore the other Responder's 108 * params and use the recomended Initiator params. 109 * 0 - otherwise 110 * @channel_num: current AP Channel 111 * @bandwidth: current AP Bandwidth: 0 20MHz, 1 40MHz, 2 80MHz 112 * @rate: current AP rate 113 * @ctrl_ch_position: coding of the control channel position relative to 114 * the center frequency: 115 * 116 * 40 MHz 117 * 0 below center, 1 above center 118 * 119 * 80 MHz 120 * bits [0..1] 121 * * 0 the near 20MHz to the center, 122 * * 1 the far 20MHz to the center 123 * bit[2] 124 * as above 40MHz 125 * @ftm_per_burst: FTMs per Burst 126 * @ftm_resp_ts_avail: '0' - we don't measure over the Initial FTM Response, 127 * '1' - we measure over the Initial FTM Response 128 * @asap_mode: ASAP / Non ASAP mode for the current WLS station 129 * @sta_id: index of the AP STA when in AP mode 130 * @tsf_timer_offset_msecs: The dictated time offset (mSec) from the AP's TSF 131 * @toa_offset: Artificial addition [0.1nsec] for the ToA - to be used for debug 132 * purposes, simulating station movement by adding various values 133 * to this field 134 * @bssid: Current AP BSSID 135 */ 136 struct iwl_tof_responder_config_cmd { 137 __le32 sub_grp_cmd_id; 138 __le16 burst_period; 139 u8 min_delta_ftm; 140 u8 burst_duration; 141 u8 num_of_burst_exp; 142 u8 get_ch_est; 143 u8 abort_responder; 144 u8 recv_sta_req_params; 145 u8 channel_num; 146 u8 bandwidth; 147 u8 rate; 148 u8 ctrl_ch_position; 149 u8 ftm_per_burst; 150 u8 ftm_resp_ts_avail; 151 u8 asap_mode; 152 u8 sta_id; 153 __le16 tsf_timer_offset_msecs; 154 __le16 toa_offset; 155 u8 bssid[ETH_ALEN]; 156 } __packed; 157 158 /** 159 * struct iwl_tof_range_request_ext_cmd - extended range req for WLS 160 * @tsf_timer_offset_msec: the recommended time offset (mSec) from the AP's TSF 161 * @reserved: reserved 162 * @min_delta_ftm: Minimal time between two consecutive measurements, 163 * in units of 100us. 0 means no preference by station 164 * @ftm_format_and_bw20M: FTM Channel Spacing/Format for 20MHz: recommended 165 * value be sent to the AP 166 * @ftm_format_and_bw40M: FTM Channel Spacing/Format for 40MHz: recommended 167 * value to be sent to the AP 168 * @ftm_format_and_bw80M: FTM Channel Spacing/Format for 80MHz: recommended 169 * value to be sent to the AP 170 */ 171 struct iwl_tof_range_req_ext_cmd { 172 __le32 sub_grp_cmd_id; 173 __le16 tsf_timer_offset_msec; 174 __le16 reserved; 175 u8 min_delta_ftm; 176 u8 ftm_format_and_bw20M; 177 u8 ftm_format_and_bw40M; 178 u8 ftm_format_and_bw80M; 179 } __packed; 180 181 #define IWL_MVM_TOF_MAX_APS 21 182 183 /** 184 * struct iwl_tof_range_req_ap_entry - AP configuration parameters 185 * @channel_num: Current AP Channel 186 * @bandwidth: Current AP Bandwidth: 0 20MHz, 1 40MHz, 2 80MHz 187 * @tsf_delta_direction: TSF relatively to the subject AP 188 * @ctrl_ch_position: Coding of the control channel position relative to the 189 * center frequency. 190 * 40MHz 0 below center, 1 above center 191 * 80MHz bits [0..1]: 0 the near 20MHz to the center, 192 * 1 the far 20MHz to the center 193 * bit[2] as above 40MHz 194 * @bssid: AP's bss id 195 * @measure_type: Measurement type: 0 - two sided, 1 - One sided 196 * @num_of_bursts: Recommended value to be sent to the AP. 2s Exponent of the 197 * number of measurement iterations (min 2^0 = 1, max 2^14) 198 * @burst_period: Recommended value to be sent to the AP. Measurement 199 * periodicity In units of 100ms. ignored if num_of_bursts = 0 200 * @samples_per_burst: 2-sided: the number of FTMs pairs in single Burst (1-31) 201 * 1-sided: how many rts/cts pairs should be used per burst. 202 * @retries_per_sample: Max number of retries that the LMAC should send 203 * in case of no replies by the AP. 204 * @tsf_delta: TSF Delta in units of microseconds. 205 * The difference between the AP TSF and the device local clock. 206 * @location_req: Location Request Bit[0] LCI should be sent in the FTMR 207 * Bit[1] Civic should be sent in the FTMR 208 * @asap_mode: 0 - non asap mode, 1 - asap mode (not relevant for one sided) 209 * @enable_dyn_ack: Enable Dynamic ACK BW. 210 * 0 Initiator interact with regular AP 211 * 1 Initiator interact with Responder machine: need to send the 212 * Initiator Acks with HT 40MHz / 80MHz, since the Responder should 213 * use it for its ch est measurement (this flag will be set when we 214 * configure the opposite machine to be Responder). 215 * @rssi: Last received value 216 * leagal values: -128-0 (0x7f). above 0x0 indicating an invalid value. 217 */ 218 struct iwl_tof_range_req_ap_entry { 219 u8 channel_num; 220 u8 bandwidth; 221 u8 tsf_delta_direction; 222 u8 ctrl_ch_position; 223 u8 bssid[ETH_ALEN]; 224 u8 measure_type; 225 u8 num_of_bursts; 226 __le16 burst_period; 227 u8 samples_per_burst; 228 u8 retries_per_sample; 229 __le32 tsf_delta; 230 u8 location_req; 231 u8 asap_mode; 232 u8 enable_dyn_ack; 233 s8 rssi; 234 } __packed; 235 236 /** 237 * enum iwl_tof_response_mode 238 * @IWL_MVM_TOF_RESPOSE_ASAP: report each AP measurement separately as soon as 239 * possible (not supported for this release) 240 * @IWL_MVM_TOF_RESPOSE_TIMEOUT: report all AP measurements as a batch upon 241 * timeout expiration 242 * @IWL_MVM_TOF_RESPOSE_COMPLETE: report all AP measurements as a batch at the 243 * earlier of: measurements completion / timeout 244 * expiration. 245 */ 246 enum iwl_tof_response_mode { 247 IWL_MVM_TOF_RESPOSE_ASAP = 1, 248 IWL_MVM_TOF_RESPOSE_TIMEOUT, 249 IWL_MVM_TOF_RESPOSE_COMPLETE, 250 }; 251 252 /** 253 * struct iwl_tof_range_req_cmd - start measurement cmd 254 * @request_id: A Token incremented per request. The same Token will be 255 * sent back in the range response 256 * @initiator: 0- NW initiated, 1 - Client Initiated 257 * @one_sided_los_disable: '0'- run ML-Algo for both ToF/OneSided, 258 * '1' - run ML-Algo for ToF only 259 * @req_timeout: Requested timeout of the response in units of 100ms. 260 * This is equivalent to the session time configured to the 261 * LMAC in Initiator Request 262 * @report_policy: Supported partially for this release: For current release - 263 * the range report will be uploaded as a batch when ready or 264 * when the session is done (successfully / partially). 265 * one of iwl_tof_response_mode. 266 * @num_of_ap: Number of APs to measure (error if > IWL_MVM_TOF_MAX_APS) 267 * @macaddr_random: '0' Use default source MAC address (i.e. p2_p), 268 * '1' Use MAC Address randomization according to the below 269 * @macaddr_mask: Bits set to 0 shall be copied from the MAC address template. 270 * Bits set to 1 shall be randomized by the UMAC 271 * @ap: per-AP request data 272 */ 273 struct iwl_tof_range_req_cmd { 274 __le32 sub_grp_cmd_id; 275 u8 request_id; 276 u8 initiator; 277 u8 one_sided_los_disable; 278 u8 req_timeout; 279 u8 report_policy; 280 u8 los_det_disable; 281 u8 num_of_ap; 282 u8 macaddr_random; 283 u8 macaddr_template[ETH_ALEN]; 284 u8 macaddr_mask[ETH_ALEN]; 285 struct iwl_tof_range_req_ap_entry ap[IWL_MVM_TOF_MAX_APS]; 286 } __packed; 287 288 /** 289 * struct iwl_tof_gen_resp_cmd - generic ToF response 290 */ 291 struct iwl_tof_gen_resp_cmd { 292 __le32 sub_grp_cmd_id; 293 u8 data[]; 294 } __packed; 295 296 /** 297 * struct iwl_tof_range_rsp_ap_entry_ntfy - AP parameters (response) 298 * @bssid: BSSID of the AP 299 * @measure_status: current APs measurement status, one of 300 * &enum iwl_tof_entry_status. 301 * @measure_bw: Current AP Bandwidth: 0 20MHz, 1 40MHz, 2 80MHz 302 * @rtt: The Round Trip Time that took for the last measurement for 303 * current AP [nSec] 304 * @rtt_variance: The Variance of the RTT values measured for current AP 305 * @rtt_spread: The Difference between the maximum and the minimum RTT 306 * values measured for current AP in the current session [nsec] 307 * @rssi: RSSI as uploaded in the Channel Estimation notification 308 * @rssi_spread: The Difference between the maximum and the minimum RSSI values 309 * measured for current AP in the current session 310 * @reserved: reserved 311 * @range: Measured range [cm] 312 * @range_variance: Measured range variance [cm] 313 * @timestamp: The GP2 Clock [usec] where Channel Estimation notification was 314 * uploaded by the LMAC 315 */ 316 struct iwl_tof_range_rsp_ap_entry_ntfy { 317 u8 bssid[ETH_ALEN]; 318 u8 measure_status; 319 u8 measure_bw; 320 __le32 rtt; 321 __le32 rtt_variance; 322 __le32 rtt_spread; 323 s8 rssi; 324 u8 rssi_spread; 325 __le16 reserved; 326 __le32 range; 327 __le32 range_variance; 328 __le32 timestamp; 329 } __packed; 330 331 /** 332 * struct iwl_tof_range_rsp_ntfy - 333 * @request_id: A Token ID of the corresponding Range request 334 * @request_status: status of current measurement session 335 * @last_in_batch: reprot policy (when not all responses are uploaded at once) 336 * @num_of_aps: Number of APs to measure (error if > IWL_MVM_TOF_MAX_APS) 337 * @ap: per-AP data 338 */ 339 struct iwl_tof_range_rsp_ntfy { 340 u8 request_id; 341 u8 request_status; 342 u8 last_in_batch; 343 u8 num_of_aps; 344 struct iwl_tof_range_rsp_ap_entry_ntfy ap[IWL_MVM_TOF_MAX_APS]; 345 } __packed; 346 347 #define IWL_MVM_TOF_MCSI_BUF_SIZE (245) 348 /** 349 * struct iwl_tof_mcsi_notif - used for debug 350 * @token: token ID for the current session 351 * @role: '0' - initiator, '1' - responder 352 * @reserved: reserved 353 * @initiator_bssid: initiator machine 354 * @responder_bssid: responder machine 355 * @mcsi_buffer: debug data 356 */ 357 struct iwl_tof_mcsi_notif { 358 u8 token; 359 u8 role; 360 __le16 reserved; 361 u8 initiator_bssid[ETH_ALEN]; 362 u8 responder_bssid[ETH_ALEN]; 363 u8 mcsi_buffer[IWL_MVM_TOF_MCSI_BUF_SIZE * 4]; 364 } __packed; 365 366 /** 367 * struct iwl_tof_neighbor_report_notif 368 * @bssid: BSSID of the AP which sent the report 369 * @request_token: same token as the corresponding request 370 * @status: 371 * @report_ie_len: the length of the response frame starting from the Element ID 372 * @data: the IEs 373 */ 374 struct iwl_tof_neighbor_report { 375 u8 bssid[ETH_ALEN]; 376 u8 request_token; 377 u8 status; 378 __le16 report_ie_len; 379 u8 data[]; 380 } __packed; 381 382 /** 383 * struct iwl_tof_range_abort_cmd 384 * @request_id: corresponds to a range request 385 * @reserved: reserved 386 */ 387 struct iwl_tof_range_abort_cmd { 388 __le32 sub_grp_cmd_id; 389 u8 request_id; 390 u8 reserved[3]; 391 } __packed; 392 393 #endif 394