| /****************************************************************************** |
| * |
| * This file is provided under a dual BSD/GPLv2 license. When using or |
| * redistributing this file, you may do so under either license. |
| * |
| * GPL LICENSE SUMMARY |
| * |
| * Copyright(c) 2015 Intel Deutschland GmbH |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of version 2 of the GNU General Public License as |
| * published by the Free Software Foundation. |
| * |
| * This program is distributed in the hope that it will be useful, but |
| * WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, |
| * USA |
| * |
| * The full GNU General Public License is included in this distribution |
| * in the file called COPYING. |
| * |
| * Contact Information: |
| * Intel Linux Wireless <ilw@linux.intel.com> |
| * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
| * |
| * BSD LICENSE |
| * |
| * Copyright(c) 2015 Intel Deutschland GmbH |
| * All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * |
| * * Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * * Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in |
| * the documentation and/or other materials provided with the |
| * distribution. |
| * * Neither the name Intel Corporation nor the names of its |
| * contributors may be used to endorse or promote products derived |
| * from this software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| * |
| *****************************************************************************/ |
| #ifndef __fw_api_tof_h__ |
| #define __fw_api_tof_h__ |
| |
| #include "fw-api.h" |
| |
| /* ToF sub-group command IDs */ |
| enum iwl_mvm_tof_sub_grp_ids { |
| TOF_RANGE_REQ_CMD = 0x1, |
| TOF_CONFIG_CMD = 0x2, |
| TOF_RANGE_ABORT_CMD = 0x3, |
| TOF_RANGE_REQ_EXT_CMD = 0x4, |
| TOF_RESPONDER_CONFIG_CMD = 0x5, |
| TOF_NW_INITIATED_RES_SEND_CMD = 0x6, |
| TOF_NEIGHBOR_REPORT_REQ_CMD = 0x7, |
| TOF_NEIGHBOR_REPORT_RSP_NOTIF = 0xFC, |
| TOF_NW_INITIATED_REQ_RCVD_NOTIF = 0xFD, |
| TOF_RANGE_RESPONSE_NOTIF = 0xFE, |
| TOF_MCSI_DEBUG_NOTIF = 0xFB, |
| }; |
| |
| /** |
| * struct iwl_tof_config_cmd - ToF configuration |
| * @tof_disabled: 0 enabled, 1 - disabled |
| * @one_sided_disabled: 0 enabled, 1 - disabled |
| * @is_debug_mode: 1 debug mode, 0 - otherwise |
| * @is_buf_required: 1 channel estimation buffer required, 0 - otherwise |
| */ |
| struct iwl_tof_config_cmd { |
| __le32 sub_grp_cmd_id; |
| u8 tof_disabled; |
| u8 one_sided_disabled; |
| u8 is_debug_mode; |
| u8 is_buf_required; |
| } __packed; |
| |
| /** |
| * struct iwl_tof_responder_config_cmd - ToF AP mode (for debug) |
| * @burst_period: future use: (currently hard coded in the LMAC) |
| * The interval between two sequential bursts. |
| * @min_delta_ftm: future use: (currently hard coded in the LMAC) |
| * The minimum delay between two sequential FTM Responses |
| * in the same burst. |
| * @burst_duration: future use: (currently hard coded in the LMAC) |
| * The total time for all FTMs handshake in the same burst. |
| * Affect the time events duration in the LMAC. |
| * @num_of_burst_exp: future use: (currently hard coded in the LMAC) |
| * The number of bursts for the current ToF request. Affect |
| * the number of events allocations in the current iteration. |
| * @get_ch_est: for xVT only, NA for driver |
| * @abort_responder: when set to '1' - Responder will terminate its activity |
| * (all other fields in the command are ignored) |
| * @recv_sta_req_params: 1 - Responder will ignore the other Responder's |
| * params and use the recomended Initiator params. |
| * 0 - otherwise |
| * @channel_num: current AP Channel |
| * @bandwidth: current AP Bandwidth: 0 20MHz, 1 40MHz, 2 80MHz |
| * @rate: current AP rate |
| * @ctrl_ch_position: coding of the control channel position relative to |
| * the center frequency. |
| * 40MHz 0 below center, 1 above center |
| * 80MHz bits [0..1]: 0 the near 20MHz to the center, |
| * 1 the far 20MHz to the center |
| * bit[2] as above 40MHz |
| * @ftm_per_burst: FTMs per Burst |
| * @ftm_resp_ts_avail: '0' - we don't measure over the Initial FTM Response, |
| * '1' - we measure over the Initial FTM Response |
| * @asap_mode: ASAP / Non ASAP mode for the current WLS station |
| * @sta_id: index of the AP STA when in AP mode |
| * @tsf_timer_offset_msecs: The dictated time offset (mSec) from the AP's TSF |
| * @toa_offset: Artificial addition [0.1nsec] for the ToA - to be used for debug |
| * purposes, simulating station movement by adding various values |
| * to this field |
| * @bssid: Current AP BSSID |
| */ |
| struct iwl_tof_responder_config_cmd { |
| __le32 sub_grp_cmd_id; |
| __le16 burst_period; |
| u8 min_delta_ftm; |
| u8 burst_duration; |
| u8 num_of_burst_exp; |
| u8 get_ch_est; |
| u8 abort_responder; |
| u8 recv_sta_req_params; |
| u8 channel_num; |
| u8 bandwidth; |
| u8 rate; |
| u8 ctrl_ch_position; |
| u8 ftm_per_burst; |
| u8 ftm_resp_ts_avail; |
| u8 asap_mode; |
| u8 sta_id; |
| __le16 tsf_timer_offset_msecs; |
| __le16 toa_offset; |
| u8 bssid[ETH_ALEN]; |
| } __packed; |
| |
| /** |
| * struct iwl_tof_range_request_ext_cmd - extended range req for WLS |
| * @tsf_timer_offset_msec: the recommended time offset (mSec) from the AP's TSF |
| * @min_delta_ftm: Minimal time between two consecutive measurements, |
| * in units of 100us. 0 means no preference by station |
| * @ftm_format_and_bw20M: FTM Channel Spacing/Format for 20MHz: recommended |
| * value be sent to the AP |
| * @ftm_format_and_bw40M: FTM Channel Spacing/Format for 40MHz: recommended |
| * value to be sent to the AP |
| * @ftm_format_and_bw80M: FTM Channel Spacing/Format for 80MHz: recommended |
| * value to be sent to the AP |
| */ |
| struct iwl_tof_range_req_ext_cmd { |
| __le32 sub_grp_cmd_id; |
| __le16 tsf_timer_offset_msec; |
| __le16 reserved; |
| u8 min_delta_ftm; |
| u8 ftm_format_and_bw20M; |
| u8 ftm_format_and_bw40M; |
| u8 ftm_format_and_bw80M; |
| } __packed; |
| |
| #define IWL_MVM_TOF_MAX_APS 21 |
| |
| /** |
| * struct iwl_tof_range_req_ap_entry - AP configuration parameters |
| * @channel_num: Current AP Channel |
| * @bandwidth: Current AP Bandwidth: 0 20MHz, 1 40MHz, 2 80MHz |
| * @tsf_delta_direction: TSF relatively to the subject AP |
| * @ctrl_ch_position: Coding of the control channel position relative to the |
| * center frequency. |
| * 40MHz 0 below center, 1 above center |
| * 80MHz bits [0..1]: 0 the near 20MHz to the center, |
| * 1 the far 20MHz to the center |
| * bit[2] as above 40MHz |
| * @bssid: AP's bss id |
| * @measure_type: Measurement type: 0 - two sided, 1 - One sided |
| * @num_of_bursts: Recommended value to be sent to the AP. 2s Exponent of the |
| * number of measurement iterations (min 2^0 = 1, max 2^14) |
| * @burst_period: Recommended value to be sent to the AP. Measurement |
| * periodicity In units of 100ms. ignored if num_of_bursts = 0 |
| * @samples_per_burst: 2-sided: the number of FTMs pairs in single Burst (1-31) |
| * 1-sided: how many rts/cts pairs should be used per burst. |
| * @retries_per_sample: Max number of retries that the LMAC should send |
| * in case of no replies by the AP. |
| * @tsf_delta: TSF Delta in units of microseconds. |
| * The difference between the AP TSF and the device local clock. |
| * @location_req: Location Request Bit[0] LCI should be sent in the FTMR |
| * Bit[1] Civic should be sent in the FTMR |
| * @asap_mode: 0 - non asap mode, 1 - asap mode (not relevant for one sided) |
| * @enable_dyn_ack: Enable Dynamic ACK BW. |
| * 0 Initiator interact with regular AP |
| * 1 Initiator interact with Responder machine: need to send the |
| * Initiator Acks with HT 40MHz / 80MHz, since the Responder should |
| * use it for its ch est measurement (this flag will be set when we |
| * configure the opposite machine to be Responder). |
| * @rssi: Last received value |
| * leagal values: -128-0 (0x7f). above 0x0 indicating an invalid value. |
| */ |
| struct iwl_tof_range_req_ap_entry { |
| u8 channel_num; |
| u8 bandwidth; |
| u8 tsf_delta_direction; |
| u8 ctrl_ch_position; |
| u8 bssid[ETH_ALEN]; |
| u8 measure_type; |
| u8 num_of_bursts; |
| __le16 burst_period; |
| u8 samples_per_burst; |
| u8 retries_per_sample; |
| __le32 tsf_delta; |
| u8 location_req; |
| u8 asap_mode; |
| u8 enable_dyn_ack; |
| s8 rssi; |
| } __packed; |
| |
| /** |
| * enum iwl_tof_response_mode |
| * @IWL_MVM_TOF_RESPOSE_ASAP: report each AP measurement separately as soon as |
| * possible (not supported for this release) |
| * @IWL_MVM_TOF_RESPOSE_TIMEOUT: report all AP measurements as a batch upon |
| * timeout expiration |
| * @IWL_MVM_TOF_RESPOSE_COMPLETE: report all AP measurements as a batch at the |
| * earlier of: measurements completion / timeout |
| * expiration. |
| */ |
| enum iwl_tof_response_mode { |
| IWL_MVM_TOF_RESPOSE_ASAP = 1, |
| IWL_MVM_TOF_RESPOSE_TIMEOUT, |
| IWL_MVM_TOF_RESPOSE_COMPLETE, |
| }; |
| |
| /** |
| * struct iwl_tof_range_req_cmd - start measurement cmd |
| * @request_id: A Token incremented per request. The same Token will be |
| * sent back in the range response |
| * @initiator: 0- NW initiated, 1 - Client Initiated |
| * @one_sided_los_disable: '0'- run ML-Algo for both ToF/OneSided, |
| * '1' - run ML-Algo for ToF only |
| * @req_timeout: Requested timeout of the response in units of 100ms. |
| * This is equivalent to the session time configured to the |
| * LMAC in Initiator Request |
| * @report_policy: Supported partially for this release: For current release - |
| * the range report will be uploaded as a batch when ready or |
| * when the session is done (successfully / partially). |
| * one of iwl_tof_response_mode. |
| * @num_of_ap: Number of APs to measure (error if > IWL_MVM_TOF_MAX_APS) |
| * @macaddr_random: '0' Use default source MAC address (i.e. p2_p), |
| * '1' Use MAC Address randomization according to the below |
| * @macaddr_mask: Bits set to 0 shall be copied from the MAC address template. |
| * Bits set to 1 shall be randomized by the UMAC |
| */ |
| struct iwl_tof_range_req_cmd { |
| __le32 sub_grp_cmd_id; |
| u8 request_id; |
| u8 initiator; |
| u8 one_sided_los_disable; |
| u8 req_timeout; |
| u8 report_policy; |
| u8 los_det_disable; |
| u8 num_of_ap; |
| u8 macaddr_random; |
| u8 macaddr_template[ETH_ALEN]; |
| u8 macaddr_mask[ETH_ALEN]; |
| struct iwl_tof_range_req_ap_entry ap[IWL_MVM_TOF_MAX_APS]; |
| } __packed; |
| |
| /** |
| * struct iwl_tof_gen_resp_cmd - generic ToF response |
| */ |
| struct iwl_tof_gen_resp_cmd { |
| __le32 sub_grp_cmd_id; |
| u8 data[]; |
| } __packed; |
| |
| /** |
| * struct iwl_tof_range_rsp_ap_entry_ntfy - AP parameters (response) |
| * @measure_status: current APs measurement status |
| * @measure_bw: Current AP Bandwidth: 0 20MHz, 1 40MHz, 2 80MHz |
| * @rtt: The Round Trip Time that took for the last measurement for |
| * current AP [nSec] |
| * @rtt_variance: The Variance of the RTT values measured for current AP |
| * @rtt_spread: The Difference between the maximum and the minimum RTT |
| * values measured for current AP in the current session [nsec] |
| * @rssi: RSSI as uploaded in the Channel Estimation notification |
| * @rssi_spread: The Difference between the maximum and the minimum RSSI values |
| * measured for current AP in the current session |
| * @range: Measured range [cm] |
| * @range_variance: Measured range variance [cm] |
| * @timestamp: The GP2 Clock [usec] where Channel Estimation notification was |
| * uploaded by the LMAC |
| */ |
| struct iwl_tof_range_rsp_ap_entry_ntfy { |
| u8 bssid[ETH_ALEN]; |
| u8 measure_status; |
| u8 measure_bw; |
| __le32 rtt; |
| __le32 rtt_variance; |
| __le32 rtt_spread; |
| s8 rssi; |
| u8 rssi_spread; |
| __le16 reserved; |
| __le32 range; |
| __le32 range_variance; |
| __le32 timestamp; |
| } __packed; |
| |
| /** |
| * struct iwl_tof_range_rsp_ntfy - |
| * @request_id: A Token ID of the corresponding Range request |
| * @request_status: status of current measurement session |
| * @last_in_batch: reprot policy (when not all responses are uploaded at once) |
| * @num_of_aps: Number of APs to measure (error if > IWL_MVM_TOF_MAX_APS) |
| */ |
| struct iwl_tof_range_rsp_ntfy { |
| u8 request_id; |
| u8 request_status; |
| u8 last_in_batch; |
| u8 num_of_aps; |
| struct iwl_tof_range_rsp_ap_entry_ntfy ap[IWL_MVM_TOF_MAX_APS]; |
| } __packed; |
| |
| #define IWL_MVM_TOF_MCSI_BUF_SIZE (245) |
| /** |
| * struct iwl_tof_mcsi_notif - used for debug |
| * @token: token ID for the current session |
| * @role: '0' - initiator, '1' - responder |
| * @initiator_bssid: initiator machine |
| * @responder_bssid: responder machine |
| * @mcsi_buffer: debug data |
| */ |
| struct iwl_tof_mcsi_notif { |
| u8 token; |
| u8 role; |
| __le16 reserved; |
| u8 initiator_bssid[ETH_ALEN]; |
| u8 responder_bssid[ETH_ALEN]; |
| u8 mcsi_buffer[IWL_MVM_TOF_MCSI_BUF_SIZE * 4]; |
| } __packed; |
| |
| /** |
| * struct iwl_tof_neighbor_report_notif |
| * @bssid: BSSID of the AP which sent the report |
| * @request_token: same token as the corresponding request |
| * @status: |
| * @report_ie_len: the length of the response frame starting from the Element ID |
| * @data: the IEs |
| */ |
| struct iwl_tof_neighbor_report { |
| u8 bssid[ETH_ALEN]; |
| u8 request_token; |
| u8 status; |
| __le16 report_ie_len; |
| u8 data[]; |
| } __packed; |
| |
| /** |
| * struct iwl_tof_range_abort_cmd |
| * @request_id: corresponds to a range request |
| */ |
| struct iwl_tof_range_abort_cmd { |
| __le32 sub_grp_cmd_id; |
| u8 request_id; |
| u8 reserved[3]; |
| } __packed; |
| |
| #endif |