GNU Linux-libre 4.19.207-gnu1
[releases.git] / drivers / net / wireless / intel / iwlwifi / fw / api / tof.h
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