blob: 8658a983c463e37f98882b5de24161bdfeeade9a [file] [log] [blame]
Gregory Greenmance792912015-06-02 18:06:16 +03001/******************************************************************************
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 *
Johannes Bergacf91dd2017-05-16 16:15:42 +02008 * Copyright(c) 2015 - 2017 Intel Deutschland GmbH
Gregory Greenmance792912015-06-02 18:06:16 +03009 *
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 Grumbachd01c5362015-11-17 15:39:56 +020028 * Intel Linux Wireless <linuxwifi@intel.com>
Gregory Greenmance792912015-06-02 18:06:16 +030029 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
30 *
31 * BSD LICENSE
32 *
Johannes Bergacf91dd2017-05-16 16:15:42 +020033 * Copyright(c) 2015 - 2017 Intel Deutschland GmbH
Gregory Greenmance792912015-06-02 18:06:16 +030034 * 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
Gregory Greenmance792912015-06-02 18:06:16 +030066/* ToF sub-group command IDs */
67enum iwl_mvm_tof_sub_grp_ids {
68 TOF_RANGE_REQ_CMD = 0x1,
69 TOF_CONFIG_CMD = 0x2,
70 TOF_RANGE_ABORT_CMD = 0x3,
71 TOF_RANGE_REQ_EXT_CMD = 0x4,
72 TOF_RESPONDER_CONFIG_CMD = 0x5,
73 TOF_NW_INITIATED_RES_SEND_CMD = 0x6,
74 TOF_NEIGHBOR_REPORT_REQ_CMD = 0x7,
75 TOF_NEIGHBOR_REPORT_RSP_NOTIF = 0xFC,
76 TOF_NW_INITIATED_REQ_RCVD_NOTIF = 0xFD,
77 TOF_RANGE_RESPONSE_NOTIF = 0xFE,
78 TOF_MCSI_DEBUG_NOTIF = 0xFB,
79};
80
81/**
82 * struct iwl_tof_config_cmd - ToF configuration
83 * @tof_disabled: 0 enabled, 1 - disabled
84 * @one_sided_disabled: 0 enabled, 1 - disabled
85 * @is_debug_mode: 1 debug mode, 0 - otherwise
86 * @is_buf_required: 1 channel estimation buffer required, 0 - otherwise
87 */
88struct iwl_tof_config_cmd {
Gregory Greenmance792912015-06-02 18:06:16 +030089 __le32 sub_grp_cmd_id;
90 u8 tof_disabled;
91 u8 one_sided_disabled;
92 u8 is_debug_mode;
93 u8 is_buf_required;
94} __packed;
95
96/**
97 * struct iwl_tof_responder_config_cmd - ToF AP mode (for debug)
98 * @burst_period: future use: (currently hard coded in the LMAC)
99 * The interval between two sequential bursts.
100 * @min_delta_ftm: future use: (currently hard coded in the LMAC)
101 * The minimum delay between two sequential FTM Responses
102 * in the same burst.
103 * @burst_duration: future use: (currently hard coded in the LMAC)
104 * The total time for all FTMs handshake in the same burst.
105 * Affect the time events duration in the LMAC.
106 * @num_of_burst_exp: future use: (currently hard coded in the LMAC)
107 * The number of bursts for the current ToF request. Affect
108 * the number of events allocations in the current iteration.
109 * @get_ch_est: for xVT only, NA for driver
110 * @abort_responder: when set to '1' - Responder will terminate its activity
111 * (all other fields in the command are ignored)
112 * @recv_sta_req_params: 1 - Responder will ignore the other Responder's
113 * params and use the recomended Initiator params.
114 * 0 - otherwise
115 * @channel_num: current AP Channel
116 * @bandwidth: current AP Bandwidth: 0 20MHz, 1 40MHz, 2 80MHz
117 * @rate: current AP rate
118 * @ctrl_ch_position: coding of the control channel position relative to
Johannes Berg3a07d362017-03-15 10:18:20 +0100119 * the center frequency:
120 *
121 * 40 MHz
122 * 0 below center, 1 above center
123 *
124 * 80 MHz
125 * bits [0..1]
126 * * 0 the near 20MHz to the center,
127 * * 1 the far 20MHz to the center
128 * bit[2]
129 * as above 40MHz
Gregory Greenmance792912015-06-02 18:06:16 +0300130 * @ftm_per_burst: FTMs per Burst
131 * @ftm_resp_ts_avail: '0' - we don't measure over the Initial FTM Response,
132 * '1' - we measure over the Initial FTM Response
133 * @asap_mode: ASAP / Non ASAP mode for the current WLS station
134 * @sta_id: index of the AP STA when in AP mode
135 * @tsf_timer_offset_msecs: The dictated time offset (mSec) from the AP's TSF
136 * @toa_offset: Artificial addition [0.1nsec] for the ToA - to be used for debug
137 * purposes, simulating station movement by adding various values
138 * to this field
139 * @bssid: Current AP BSSID
140 */
141struct iwl_tof_responder_config_cmd {
Gregory Greenmance792912015-06-02 18:06:16 +0300142 __le32 sub_grp_cmd_id;
143 __le16 burst_period;
144 u8 min_delta_ftm;
145 u8 burst_duration;
146 u8 num_of_burst_exp;
147 u8 get_ch_est;
148 u8 abort_responder;
149 u8 recv_sta_req_params;
150 u8 channel_num;
151 u8 bandwidth;
152 u8 rate;
153 u8 ctrl_ch_position;
154 u8 ftm_per_burst;
155 u8 ftm_resp_ts_avail;
156 u8 asap_mode;
157 u8 sta_id;
158 __le16 tsf_timer_offset_msecs;
159 __le16 toa_offset;
160 u8 bssid[ETH_ALEN];
161} __packed;
162
163/**
164 * struct iwl_tof_range_request_ext_cmd - extended range req for WLS
165 * @tsf_timer_offset_msec: the recommended time offset (mSec) from the AP's TSF
Johannes Bergacf91dd2017-05-16 16:15:42 +0200166 * @reserved: reserved
Gregory Greenmance792912015-06-02 18:06:16 +0300167 * @min_delta_ftm: Minimal time between two consecutive measurements,
168 * in units of 100us. 0 means no preference by station
169 * @ftm_format_and_bw20M: FTM Channel Spacing/Format for 20MHz: recommended
170 * value be sent to the AP
171 * @ftm_format_and_bw40M: FTM Channel Spacing/Format for 40MHz: recommended
172 * value to be sent to the AP
173 * @ftm_format_and_bw80M: FTM Channel Spacing/Format for 80MHz: recommended
174 * value to be sent to the AP
175 */
176struct iwl_tof_range_req_ext_cmd {
Gregory Greenmance792912015-06-02 18:06:16 +0300177 __le32 sub_grp_cmd_id;
178 __le16 tsf_timer_offset_msec;
179 __le16 reserved;
180 u8 min_delta_ftm;
181 u8 ftm_format_and_bw20M;
182 u8 ftm_format_and_bw40M;
183 u8 ftm_format_and_bw80M;
184} __packed;
185
186#define IWL_MVM_TOF_MAX_APS 21
187
188/**
189 * struct iwl_tof_range_req_ap_entry - AP configuration parameters
190 * @channel_num: Current AP Channel
191 * @bandwidth: Current AP Bandwidth: 0 20MHz, 1 40MHz, 2 80MHz
192 * @tsf_delta_direction: TSF relatively to the subject AP
193 * @ctrl_ch_position: Coding of the control channel position relative to the
194 * center frequency.
195 * 40MHz 0 below center, 1 above center
196 * 80MHz bits [0..1]: 0 the near 20MHz to the center,
197 * 1 the far 20MHz to the center
198 * bit[2] as above 40MHz
199 * @bssid: AP's bss id
200 * @measure_type: Measurement type: 0 - two sided, 1 - One sided
201 * @num_of_bursts: Recommended value to be sent to the AP. 2s Exponent of the
202 * number of measurement iterations (min 2^0 = 1, max 2^14)
203 * @burst_period: Recommended value to be sent to the AP. Measurement
204 * periodicity In units of 100ms. ignored if num_of_bursts = 0
205 * @samples_per_burst: 2-sided: the number of FTMs pairs in single Burst (1-31)
206 * 1-sided: how many rts/cts pairs should be used per burst.
207 * @retries_per_sample: Max number of retries that the LMAC should send
208 * in case of no replies by the AP.
209 * @tsf_delta: TSF Delta in units of microseconds.
210 * The difference between the AP TSF and the device local clock.
211 * @location_req: Location Request Bit[0] LCI should be sent in the FTMR
212 * Bit[1] Civic should be sent in the FTMR
213 * @asap_mode: 0 - non asap mode, 1 - asap mode (not relevant for one sided)
214 * @enable_dyn_ack: Enable Dynamic ACK BW.
215 * 0 Initiator interact with regular AP
216 * 1 Initiator interact with Responder machine: need to send the
217 * Initiator Acks with HT 40MHz / 80MHz, since the Responder should
218 * use it for its ch est measurement (this flag will be set when we
219 * configure the opposite machine to be Responder).
220 * @rssi: Last received value
221 * leagal values: -128-0 (0x7f). above 0x0 indicating an invalid value.
222 */
223struct iwl_tof_range_req_ap_entry {
224 u8 channel_num;
225 u8 bandwidth;
226 u8 tsf_delta_direction;
227 u8 ctrl_ch_position;
228 u8 bssid[ETH_ALEN];
229 u8 measure_type;
230 u8 num_of_bursts;
231 __le16 burst_period;
232 u8 samples_per_burst;
233 u8 retries_per_sample;
234 __le32 tsf_delta;
235 u8 location_req;
236 u8 asap_mode;
237 u8 enable_dyn_ack;
238 s8 rssi;
239} __packed;
240
241/**
242 * enum iwl_tof_response_mode
243 * @IWL_MVM_TOF_RESPOSE_ASAP: report each AP measurement separately as soon as
244 * possible (not supported for this release)
245 * @IWL_MVM_TOF_RESPOSE_TIMEOUT: report all AP measurements as a batch upon
246 * timeout expiration
247 * @IWL_MVM_TOF_RESPOSE_COMPLETE: report all AP measurements as a batch at the
248 * earlier of: measurements completion / timeout
249 * expiration.
250 */
251enum iwl_tof_response_mode {
252 IWL_MVM_TOF_RESPOSE_ASAP = 1,
253 IWL_MVM_TOF_RESPOSE_TIMEOUT,
254 IWL_MVM_TOF_RESPOSE_COMPLETE,
255};
256
257/**
258 * struct iwl_tof_range_req_cmd - start measurement cmd
259 * @request_id: A Token incremented per request. The same Token will be
260 * sent back in the range response
261 * @initiator: 0- NW initiated, 1 - Client Initiated
262 * @one_sided_los_disable: '0'- run ML-Algo for both ToF/OneSided,
263 * '1' - run ML-Algo for ToF only
264 * @req_timeout: Requested timeout of the response in units of 100ms.
265 * This is equivalent to the session time configured to the
266 * LMAC in Initiator Request
267 * @report_policy: Supported partially for this release: For current release -
268 * the range report will be uploaded as a batch when ready or
269 * when the session is done (successfully / partially).
270 * one of iwl_tof_response_mode.
271 * @num_of_ap: Number of APs to measure (error if > IWL_MVM_TOF_MAX_APS)
272 * @macaddr_random: '0' Use default source MAC address (i.e. p2_p),
273 * '1' Use MAC Address randomization according to the below
274 * @macaddr_mask: Bits set to 0 shall be copied from the MAC address template.
275 * Bits set to 1 shall be randomized by the UMAC
Johannes Bergacf91dd2017-05-16 16:15:42 +0200276 * @ap: per-AP request data
Gregory Greenmance792912015-06-02 18:06:16 +0300277 */
278struct iwl_tof_range_req_cmd {
Gregory Greenmance792912015-06-02 18:06:16 +0300279 __le32 sub_grp_cmd_id;
280 u8 request_id;
281 u8 initiator;
282 u8 one_sided_los_disable;
283 u8 req_timeout;
284 u8 report_policy;
285 u8 los_det_disable;
286 u8 num_of_ap;
287 u8 macaddr_random;
288 u8 macaddr_template[ETH_ALEN];
289 u8 macaddr_mask[ETH_ALEN];
290 struct iwl_tof_range_req_ap_entry ap[IWL_MVM_TOF_MAX_APS];
291} __packed;
292
293/**
294 * struct iwl_tof_gen_resp_cmd - generic ToF response
295 */
296struct iwl_tof_gen_resp_cmd {
297 __le32 sub_grp_cmd_id;
298 u8 data[];
299} __packed;
300
301/**
302 * struct iwl_tof_range_rsp_ap_entry_ntfy - AP parameters (response)
Johannes Bergacf91dd2017-05-16 16:15:42 +0200303 * @bssid: BSSID of the AP
304 * @measure_status: current APs measurement status, one of
305 * &enum iwl_tof_entry_status.
Gregory Greenmance792912015-06-02 18:06:16 +0300306 * @measure_bw: Current AP Bandwidth: 0 20MHz, 1 40MHz, 2 80MHz
307 * @rtt: The Round Trip Time that took for the last measurement for
308 * current AP [nSec]
309 * @rtt_variance: The Variance of the RTT values measured for current AP
310 * @rtt_spread: The Difference between the maximum and the minimum RTT
311 * values measured for current AP in the current session [nsec]
312 * @rssi: RSSI as uploaded in the Channel Estimation notification
313 * @rssi_spread: The Difference between the maximum and the minimum RSSI values
314 * measured for current AP in the current session
Johannes Bergacf91dd2017-05-16 16:15:42 +0200315 * @reserved: reserved
Gregory Greenmance792912015-06-02 18:06:16 +0300316 * @range: Measured range [cm]
317 * @range_variance: Measured range variance [cm]
318 * @timestamp: The GP2 Clock [usec] where Channel Estimation notification was
319 * uploaded by the LMAC
320 */
321struct iwl_tof_range_rsp_ap_entry_ntfy {
322 u8 bssid[ETH_ALEN];
323 u8 measure_status;
324 u8 measure_bw;
325 __le32 rtt;
326 __le32 rtt_variance;
327 __le32 rtt_spread;
328 s8 rssi;
329 u8 rssi_spread;
330 __le16 reserved;
331 __le32 range;
332 __le32 range_variance;
333 __le32 timestamp;
334} __packed;
335
336/**
337 * struct iwl_tof_range_rsp_ntfy -
338 * @request_id: A Token ID of the corresponding Range request
339 * @request_status: status of current measurement session
340 * @last_in_batch: reprot policy (when not all responses are uploaded at once)
341 * @num_of_aps: Number of APs to measure (error if > IWL_MVM_TOF_MAX_APS)
Johannes Bergacf91dd2017-05-16 16:15:42 +0200342 * @ap: per-AP data
Gregory Greenmance792912015-06-02 18:06:16 +0300343 */
344struct iwl_tof_range_rsp_ntfy {
345 u8 request_id;
346 u8 request_status;
347 u8 last_in_batch;
348 u8 num_of_aps;
349 struct iwl_tof_range_rsp_ap_entry_ntfy ap[IWL_MVM_TOF_MAX_APS];
350} __packed;
351
352#define IWL_MVM_TOF_MCSI_BUF_SIZE (245)
353/**
354 * struct iwl_tof_mcsi_notif - used for debug
355 * @token: token ID for the current session
356 * @role: '0' - initiator, '1' - responder
Johannes Bergacf91dd2017-05-16 16:15:42 +0200357 * @reserved: reserved
Gregory Greenmance792912015-06-02 18:06:16 +0300358 * @initiator_bssid: initiator machine
359 * @responder_bssid: responder machine
360 * @mcsi_buffer: debug data
361 */
362struct iwl_tof_mcsi_notif {
363 u8 token;
364 u8 role;
365 __le16 reserved;
366 u8 initiator_bssid[ETH_ALEN];
367 u8 responder_bssid[ETH_ALEN];
368 u8 mcsi_buffer[IWL_MVM_TOF_MCSI_BUF_SIZE * 4];
369} __packed;
370
371/**
372 * struct iwl_tof_neighbor_report_notif
373 * @bssid: BSSID of the AP which sent the report
374 * @request_token: same token as the corresponding request
375 * @status:
376 * @report_ie_len: the length of the response frame starting from the Element ID
377 * @data: the IEs
378 */
379struct iwl_tof_neighbor_report {
380 u8 bssid[ETH_ALEN];
381 u8 request_token;
382 u8 status;
383 __le16 report_ie_len;
384 u8 data[];
385} __packed;
386
387/**
388 * struct iwl_tof_range_abort_cmd
389 * @request_id: corresponds to a range request
Johannes Bergacf91dd2017-05-16 16:15:42 +0200390 * @reserved: reserved
Gregory Greenmance792912015-06-02 18:06:16 +0300391 */
392struct iwl_tof_range_abort_cmd {
Gregory Greenmance792912015-06-02 18:06:16 +0300393 __le32 sub_grp_cmd_id;
394 u8 request_id;
395 u8 reserved[3];
396} __packed;
397
398#endif