Gregory Greenman | ce79291 | 2015-06-02 18:06:16 +0300 | [diff] [blame] | 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 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 | * You should have received a copy of the GNU General Public License |
| 20 | * along with this program; if not, write to the Free Software |
| 21 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, |
| 22 | * USA |
| 23 | * |
| 24 | * The full GNU General Public License is included in this distribution |
| 25 | * in the file called COPYING. |
| 26 | * |
| 27 | * Contact Information: |
Emmanuel Grumbach | d01c536 | 2015-11-17 15:39:56 +0200 | [diff] [blame] | 28 | * Intel Linux Wireless <linuxwifi@intel.com> |
Gregory Greenman | ce79291 | 2015-06-02 18:06:16 +0300 | [diff] [blame] | 29 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
| 30 | * |
| 31 | * BSD LICENSE |
| 32 | * |
| 33 | * Copyright(c) 2015 Intel Deutschland GmbH |
| 34 | * All rights reserved. |
| 35 | * |
| 36 | * Redistribution and use in source and binary forms, with or without |
| 37 | * modification, are permitted provided that the following conditions |
| 38 | * are met: |
| 39 | * |
| 40 | * * Redistributions of source code must retain the above copyright |
| 41 | * notice, this list of conditions and the following disclaimer. |
| 42 | * * Redistributions in binary form must reproduce the above copyright |
| 43 | * notice, this list of conditions and the following disclaimer in |
| 44 | * the documentation and/or other materials provided with the |
| 45 | * distribution. |
| 46 | * * Neither the name Intel Corporation nor the names of its |
| 47 | * contributors may be used to endorse or promote products derived |
| 48 | * from this software without specific prior written permission. |
| 49 | * |
| 50 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| 51 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| 52 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| 53 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| 54 | * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| 55 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| 56 | * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| 57 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| 58 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 59 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| 60 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 61 | * |
| 62 | *****************************************************************************/ |
| 63 | #ifndef __fw_api_tof_h__ |
| 64 | #define __fw_api_tof_h__ |
| 65 | |
| 66 | #include "fw-api.h" |
| 67 | |
| 68 | /* ToF sub-group command IDs */ |
| 69 | enum iwl_mvm_tof_sub_grp_ids { |
| 70 | TOF_RANGE_REQ_CMD = 0x1, |
| 71 | TOF_CONFIG_CMD = 0x2, |
| 72 | TOF_RANGE_ABORT_CMD = 0x3, |
| 73 | TOF_RANGE_REQ_EXT_CMD = 0x4, |
| 74 | TOF_RESPONDER_CONFIG_CMD = 0x5, |
| 75 | TOF_NW_INITIATED_RES_SEND_CMD = 0x6, |
| 76 | TOF_NEIGHBOR_REPORT_REQ_CMD = 0x7, |
| 77 | TOF_NEIGHBOR_REPORT_RSP_NOTIF = 0xFC, |
| 78 | TOF_NW_INITIATED_REQ_RCVD_NOTIF = 0xFD, |
| 79 | TOF_RANGE_RESPONSE_NOTIF = 0xFE, |
| 80 | TOF_MCSI_DEBUG_NOTIF = 0xFB, |
| 81 | }; |
| 82 | |
| 83 | /** |
| 84 | * struct iwl_tof_config_cmd - ToF configuration |
| 85 | * @tof_disabled: 0 enabled, 1 - disabled |
| 86 | * @one_sided_disabled: 0 enabled, 1 - disabled |
| 87 | * @is_debug_mode: 1 debug mode, 0 - otherwise |
| 88 | * @is_buf_required: 1 channel estimation buffer required, 0 - otherwise |
| 89 | */ |
| 90 | struct iwl_tof_config_cmd { |
Gregory Greenman | ce79291 | 2015-06-02 18:06:16 +0300 | [diff] [blame] | 91 | __le32 sub_grp_cmd_id; |
| 92 | u8 tof_disabled; |
| 93 | u8 one_sided_disabled; |
| 94 | u8 is_debug_mode; |
| 95 | u8 is_buf_required; |
| 96 | } __packed; |
| 97 | |
| 98 | /** |
| 99 | * struct iwl_tof_responder_config_cmd - ToF AP mode (for debug) |
| 100 | * @burst_period: future use: (currently hard coded in the LMAC) |
| 101 | * The interval between two sequential bursts. |
| 102 | * @min_delta_ftm: future use: (currently hard coded in the LMAC) |
| 103 | * The minimum delay between two sequential FTM Responses |
| 104 | * in the same burst. |
| 105 | * @burst_duration: future use: (currently hard coded in the LMAC) |
| 106 | * The total time for all FTMs handshake in the same burst. |
| 107 | * Affect the time events duration in the LMAC. |
| 108 | * @num_of_burst_exp: future use: (currently hard coded in the LMAC) |
| 109 | * The number of bursts for the current ToF request. Affect |
| 110 | * the number of events allocations in the current iteration. |
| 111 | * @get_ch_est: for xVT only, NA for driver |
| 112 | * @abort_responder: when set to '1' - Responder will terminate its activity |
| 113 | * (all other fields in the command are ignored) |
| 114 | * @recv_sta_req_params: 1 - Responder will ignore the other Responder's |
| 115 | * params and use the recomended Initiator params. |
| 116 | * 0 - otherwise |
| 117 | * @channel_num: current AP Channel |
| 118 | * @bandwidth: current AP Bandwidth: 0 20MHz, 1 40MHz, 2 80MHz |
| 119 | * @rate: current AP rate |
| 120 | * @ctrl_ch_position: coding of the control channel position relative to |
| 121 | * the center frequency. |
| 122 | * 40MHz 0 below center, 1 above center |
| 123 | * 80MHz bits [0..1]: 0 the near 20MHz to the center, |
| 124 | * 1 the far 20MHz to the center |
| 125 | * bit[2] as above 40MHz |
| 126 | * @ftm_per_burst: FTMs per Burst |
| 127 | * @ftm_resp_ts_avail: '0' - we don't measure over the Initial FTM Response, |
| 128 | * '1' - we measure over the Initial FTM Response |
| 129 | * @asap_mode: ASAP / Non ASAP mode for the current WLS station |
| 130 | * @sta_id: index of the AP STA when in AP mode |
| 131 | * @tsf_timer_offset_msecs: The dictated time offset (mSec) from the AP's TSF |
| 132 | * @toa_offset: Artificial addition [0.1nsec] for the ToA - to be used for debug |
| 133 | * purposes, simulating station movement by adding various values |
| 134 | * to this field |
| 135 | * @bssid: Current AP BSSID |
| 136 | */ |
| 137 | struct iwl_tof_responder_config_cmd { |
Gregory Greenman | ce79291 | 2015-06-02 18:06:16 +0300 | [diff] [blame] | 138 | __le32 sub_grp_cmd_id; |
| 139 | __le16 burst_period; |
| 140 | u8 min_delta_ftm; |
| 141 | u8 burst_duration; |
| 142 | u8 num_of_burst_exp; |
| 143 | u8 get_ch_est; |
| 144 | u8 abort_responder; |
| 145 | u8 recv_sta_req_params; |
| 146 | u8 channel_num; |
| 147 | u8 bandwidth; |
| 148 | u8 rate; |
| 149 | u8 ctrl_ch_position; |
| 150 | u8 ftm_per_burst; |
| 151 | u8 ftm_resp_ts_avail; |
| 152 | u8 asap_mode; |
| 153 | u8 sta_id; |
| 154 | __le16 tsf_timer_offset_msecs; |
| 155 | __le16 toa_offset; |
| 156 | u8 bssid[ETH_ALEN]; |
| 157 | } __packed; |
| 158 | |
| 159 | /** |
| 160 | * struct iwl_tof_range_request_ext_cmd - extended range req for WLS |
| 161 | * @tsf_timer_offset_msec: the recommended time offset (mSec) from the AP's TSF |
| 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 { |
Gregory Greenman | ce79291 | 2015-06-02 18:06:16 +0300 | [diff] [blame] | 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 | */ |
| 272 | struct iwl_tof_range_req_cmd { |
Gregory Greenman | ce79291 | 2015-06-02 18:06:16 +0300 | [diff] [blame] | 273 | __le32 sub_grp_cmd_id; |
| 274 | u8 request_id; |
| 275 | u8 initiator; |
| 276 | u8 one_sided_los_disable; |
| 277 | u8 req_timeout; |
| 278 | u8 report_policy; |
| 279 | u8 los_det_disable; |
| 280 | u8 num_of_ap; |
| 281 | u8 macaddr_random; |
| 282 | u8 macaddr_template[ETH_ALEN]; |
| 283 | u8 macaddr_mask[ETH_ALEN]; |
| 284 | struct iwl_tof_range_req_ap_entry ap[IWL_MVM_TOF_MAX_APS]; |
| 285 | } __packed; |
| 286 | |
| 287 | /** |
| 288 | * struct iwl_tof_gen_resp_cmd - generic ToF response |
| 289 | */ |
| 290 | struct iwl_tof_gen_resp_cmd { |
| 291 | __le32 sub_grp_cmd_id; |
| 292 | u8 data[]; |
| 293 | } __packed; |
| 294 | |
| 295 | /** |
| 296 | * struct iwl_tof_range_rsp_ap_entry_ntfy - AP parameters (response) |
| 297 | * @measure_status: current APs measurement status |
| 298 | * @measure_bw: Current AP Bandwidth: 0 20MHz, 1 40MHz, 2 80MHz |
| 299 | * @rtt: The Round Trip Time that took for the last measurement for |
| 300 | * current AP [nSec] |
| 301 | * @rtt_variance: The Variance of the RTT values measured for current AP |
| 302 | * @rtt_spread: The Difference between the maximum and the minimum RTT |
| 303 | * values measured for current AP in the current session [nsec] |
| 304 | * @rssi: RSSI as uploaded in the Channel Estimation notification |
| 305 | * @rssi_spread: The Difference between the maximum and the minimum RSSI values |
| 306 | * measured for current AP in the current session |
| 307 | * @range: Measured range [cm] |
| 308 | * @range_variance: Measured range variance [cm] |
| 309 | * @timestamp: The GP2 Clock [usec] where Channel Estimation notification was |
| 310 | * uploaded by the LMAC |
| 311 | */ |
| 312 | struct iwl_tof_range_rsp_ap_entry_ntfy { |
| 313 | u8 bssid[ETH_ALEN]; |
| 314 | u8 measure_status; |
| 315 | u8 measure_bw; |
| 316 | __le32 rtt; |
| 317 | __le32 rtt_variance; |
| 318 | __le32 rtt_spread; |
| 319 | s8 rssi; |
| 320 | u8 rssi_spread; |
| 321 | __le16 reserved; |
| 322 | __le32 range; |
| 323 | __le32 range_variance; |
| 324 | __le32 timestamp; |
| 325 | } __packed; |
| 326 | |
| 327 | /** |
| 328 | * struct iwl_tof_range_rsp_ntfy - |
| 329 | * @request_id: A Token ID of the corresponding Range request |
| 330 | * @request_status: status of current measurement session |
| 331 | * @last_in_batch: reprot policy (when not all responses are uploaded at once) |
| 332 | * @num_of_aps: Number of APs to measure (error if > IWL_MVM_TOF_MAX_APS) |
| 333 | */ |
| 334 | struct iwl_tof_range_rsp_ntfy { |
| 335 | u8 request_id; |
| 336 | u8 request_status; |
| 337 | u8 last_in_batch; |
| 338 | u8 num_of_aps; |
| 339 | struct iwl_tof_range_rsp_ap_entry_ntfy ap[IWL_MVM_TOF_MAX_APS]; |
| 340 | } __packed; |
| 341 | |
| 342 | #define IWL_MVM_TOF_MCSI_BUF_SIZE (245) |
| 343 | /** |
| 344 | * struct iwl_tof_mcsi_notif - used for debug |
| 345 | * @token: token ID for the current session |
| 346 | * @role: '0' - initiator, '1' - responder |
| 347 | * @initiator_bssid: initiator machine |
| 348 | * @responder_bssid: responder machine |
| 349 | * @mcsi_buffer: debug data |
| 350 | */ |
| 351 | struct iwl_tof_mcsi_notif { |
| 352 | u8 token; |
| 353 | u8 role; |
| 354 | __le16 reserved; |
| 355 | u8 initiator_bssid[ETH_ALEN]; |
| 356 | u8 responder_bssid[ETH_ALEN]; |
| 357 | u8 mcsi_buffer[IWL_MVM_TOF_MCSI_BUF_SIZE * 4]; |
| 358 | } __packed; |
| 359 | |
| 360 | /** |
| 361 | * struct iwl_tof_neighbor_report_notif |
| 362 | * @bssid: BSSID of the AP which sent the report |
| 363 | * @request_token: same token as the corresponding request |
| 364 | * @status: |
| 365 | * @report_ie_len: the length of the response frame starting from the Element ID |
| 366 | * @data: the IEs |
| 367 | */ |
| 368 | struct iwl_tof_neighbor_report { |
| 369 | u8 bssid[ETH_ALEN]; |
| 370 | u8 request_token; |
| 371 | u8 status; |
| 372 | __le16 report_ie_len; |
| 373 | u8 data[]; |
| 374 | } __packed; |
| 375 | |
| 376 | /** |
| 377 | * struct iwl_tof_range_abort_cmd |
| 378 | * @request_id: corresponds to a range request |
| 379 | */ |
| 380 | struct iwl_tof_range_abort_cmd { |
Gregory Greenman | ce79291 | 2015-06-02 18:06:16 +0300 | [diff] [blame] | 381 | __le32 sub_grp_cmd_id; |
| 382 | u8 request_id; |
| 383 | u8 reserved[3]; |
| 384 | } __packed; |
| 385 | |
| 386 | #endif |