2025-05-10 21:58:58 +08:00

532 lines
21 KiB
C

/* SPDX-License-Identifier: GPL-2.0 */
#ifndef __SPRD_RTT_H__
#define __SPRD_RTT_H__
#include "vendor.h"
/* FTM/indoor location subcommands */
enum sprd_ftm_vendor_subcmds {
SPRD_NL80211_VENDOR_SUBCMD_LOC_GET_CAPA = 128,
SPRD_NL80211_VENDOR_SUBCMD_FTM_START_SESSION = 129,
SPRD_NL80211_VENDOR_SUBCMD_FTM_ABORT_SESSION = 130,
SPRD_NL80211_VENDOR_SUBCMD_FTM_MEAS_RESULT = 131,
SPRD_NL80211_VENDOR_SUBCMD_FTM_SESSION_DONE = 132,
SPRD_NL80211_VENDOR_SUBCMD_FTM_CFG_RESPONDER = 133,
SPRD_NL80211_VENDOR_SUBCMD_AOA_MEAS = 134,
SPRD_NL80211_VENDOR_SUBCMD_AOA_ABORT_MEAS = 135,
SPRD_NL80211_VENDOR_SUBCMD_AOA_MEAS_RESULT = 136,
};
/**
* enum sprdwl_vendor_attr_loc - attributes for FTM and AOA commands
*
* @SPRDWL_VENDOR_ATTR_FTM_SESSION_COOKIE: Session cookie, specified in
* %SPRD_NL80211_VENDOR_SUBCMD_FTM_START_SESSION. It will be provided by driver
* events and can be used to identify events targeted for this session.
* @SPRDWL_VENDOR_ATTR_LOC_CAPA: Nested attribute containing extra
* FTM/AOA capabilities, returned by %SPRD_NL80211_VENDOR_SUBCMD_LOC_GET_CAPA.
* see %enum sprdwl_vendor_attr_loc_capa.
* @SPRDWL_VENDOR_ATTR_FTM_MEAS_PEERS: array of nested attributes
* containing information about each peer in measurement session
* request. See %enum sprdwl_vendor_attr_peer_info for supported
* attributes for each peer
* @SPRDWL_VENDOR_ATTR_FTM_PEER_RESULTS: nested attribute containing
* measurement results for a peer. reported by the
* %SPRD_NL80211_VENDOR_SUBCMD_FTM_MEAS_RESULT event.
* See %enum sprdwl_vendor_attr_peer_result for list of supported
* attributes.
* @SPRDWL_VENDOR_ATTR_FTM_RESPONDER_ENABLE: flag attribute for
* enabling or disabling responder functionality.
* @SPRDWL_VENDOR_ATTR_FTM_LCI: used in the
* %SPRD_NL80211_VENDOR_SUBCMD_FTM_CFG_RESPONDER command in order to
* specify the LCI report that will be sent by the responder during
* a measurement exchange. The format is defined in IEEE P802.11-REVmc/D5.0,
* 9.4.2.22.10
* @SPRDWL_VENDOR_ATTR_FTM_LCR: provided with the
* %SPRD_NL80211_VENDOR_SUBCMD_FTM_CFG_RESPONDER command in order to
* specify the location civic report that will be sent by the responder during
* a measurement exchange. The format is defined in IEEE P802.11-REVmc/D5.0,
* 9.4.2.22.13
* @SPRDWL_VENDOR_ATTR_LOC_SESSION_STATUS: session/measurement completion
* status code, reported in %SPRD_NL80211_VENDOR_SUBCMD_FTM_SESSION_DONE
* and %SPRD_NL80211_VENDOR_SUBCMD_AOA_MEAS_RESULT
* @SPRDWL_VENDOR_ATTR_FTM_INITIAL_TOKEN: initial dialog token used
* by responder (0 if not specified)
* @SPRDWL_VENDOR_ATTR_AOA_TYPE: AOA measurement type. Requested in
* %SPRD_NL80211_VENDOR_SUBCMD_AOA_MEAS and optionally in
* %SPRD_NL80211_VENDOR_SUBCMD_FTM_START_SESSION if AOA measurements
* are needed as part of an FTM session.
* Reported by SPRD_NL80211_VENDOR_SUBCMD_AOA_MEAS_RESULT.
* See enum sprdwl_vendor_attr_aoa_type.
* @SPRDWL_VENDOR_ATTR_LOC_ANTENNA_ARRAY_MASK: bit mask indicating
* which antenna arrays were used in location measurement.
* Reported in %SPRD_NL80211_VENDOR_SUBCMD_FTM_MEAS_RESULT and
* %SPRD_NL80211_VENDOR_SUBCMD_AOA_MEAS_RESULT
* @SPRDWL_VENDOR_ATTR_AOA_MEAS_RESULT: AOA measurement data.
* Its contents depends on the AOA type and antenna array mask:
* %SPRDWL_VENDOR_ATTR_AOA_TYPE_TOP_CIR_PHASE: array of U16 values,
* phase of the strongest CIR path for each antenna in the measured
* array(s).
* %SPRDWL_VENDOR_ATTR_AOA_TYPE_TOP_CIR_PHASE_AMP: array of 2 U16
* values, phase and amplitude of the strongest CIR path for each
* antenna in the measured array(s)
* @SPRDWL_VENDOR_ATTR_FREQ: Frequency where peer is listening, in MHz.
* Unsigned 32 bit value.
*/
enum sprdwl_vendor_attr_loc {
/* we reuse these attributes */
SPRDWL_VENDOR_ATTR_MAC_ADDR = 6,
SPRDWL_VENDOR_ATTR_PAD = 13,
SPRDWL_VENDOR_ATTR_FTM_SESSION_COOKIE = 14,
SPRDWL_VENDOR_ATTR_LOC_CAPA = 15,
SPRDWL_VENDOR_ATTR_FTM_MEAS_PEERS = 16,
SPRDWL_VENDOR_ATTR_FTM_MEAS_PEER_RESULTS = 17,
SPRDWL_VENDOR_ATTR_FTM_RESPONDER_ENABLE = 18,
SPRDWL_VENDOR_ATTR_FTM_LCI = 19,
SPRDWL_VENDOR_ATTR_FTM_LCR = 20,
SPRDWL_VENDOR_ATTR_LOC_SESSION_STATUS = 21,
SPRDWL_VENDOR_ATTR_FTM_INITIAL_TOKEN = 22,
SPRDWL_VENDOR_ATTR_AOA_TYPE = 23,
SPRDWL_VENDOR_ATTR_LOC_ANTENNA_ARRAY_MASK = 24,
SPRDWL_VENDOR_ATTR_AOA_MEAS_RESULT = 25,
SPRDWL_VENDOR_ATTR_FREQ = 28,
/* keep last */
SPRDWL_VENDOR_ATTR_LOC_AFTER_LAST,
SPRDWL_VENDOR_ATTR_LOC_MAX = SPRDWL_VENDOR_ATTR_LOC_AFTER_LAST - 1,
};
/**
* enum sprdwl_vendor_attr_loc_capa - indoor location capabilities
*
* @SPRDWL_VENDOR_ATTR_LOC_CAPA_FLAGS: various flags. See
* %enum sprdwl_vendor_attr_loc_capa_flags
* @SPRDWL_VENDOR_ATTR_FTM_CAPA_MAX_NUM_SESSIONS: Maximum number
* of measurement sessions that can run concurrently.
* Default is one session (no session concurrency)
* @SPRDWL_VENDOR_ATTR_FTM_CAPA_MAX_NUM_PEERS: The total number of unique
* peers that are supported in running sessions. For example,
* if the value is 8 and maximum number of sessions is 2, you can
* have one session with 8 unique peers, or 2 sessions with 4 unique
* peers each, and so on.
* @SPRDWL_VENDOR_ATTR_FTM_CAPA_MAX_NUM_BURSTS_EXP: Maximum number
* of bursts per peer, as an exponent (2^value). Default is 0,
* meaning no multi-burst support.
* @SPRDWL_VENDOR_ATTR_FTM_CAPA_MAX_MEAS_PER_BURST: Maximum number
* of measurement exchanges allowed in a single burst
* @SPRDWL_VENDOR_ATTR_AOA_CAPA_SUPPORTED_TYPES: Supported AOA measurement
* types. A bit mask (unsigned 32 bit value), each bit corresponds
* to an AOA type as defined by %enum qca_vendor_attr_aoa_type.
*/
enum sprdwl_vendor_attr_loc_capa {
SPRDWL_VENDOR_ATTR_LOC_CAPA_INVALID,
SPRDWL_VENDOR_ATTR_LOC_CAPA_FLAGS,
SPRDWL_VENDOR_ATTR_FTM_CAPA_MAX_NUM_SESSIONS,
SPRDWL_VENDOR_ATTR_FTM_CAPA_MAX_NUM_PEERS,
SPRDWL_VENDOR_ATTR_FTM_CAPA_MAX_NUM_BURSTS_EXP,
SPRDWL_VENDOR_ATTR_FTM_CAPA_MAX_MEAS_PER_BURST,
SPRDWL_VENDOR_ATTR_AOA_CAPA_SUPPORTED_TYPES,
/* keep last */
SPRDWL_VENDOR_ATTR_LOC_CAPA_AFTER_LAST,
SPRDWL_VENDOR_ATTR_LOC_CAPA_MAX =
SPRDWL_VENDOR_ATTR_LOC_CAPA_AFTER_LAST - 1,
};
/**
* enum sprdwl_vendor_attr_loc_capa_flags: Indoor location capability flags
*
* @SPRDWL_VENDOR_ATTR_LOC_CAPA_FLAG_FTM_RESPONDER: Set if driver
* can be configured as an FTM responder (for example, an AP that
* services FTM requests). %SPRD_NL80211_VENDOR_SUBCMD_FTM_CFG_RESPONDER
* will be supported if set.
* @SPRDWL_VENDOR_ATTR_LOC_CAPA_FLAG_FTM_INITIATOR: Set if driver
* can run FTM sessions. %SPRD_NL80211_VENDOR_SUBCMD_FTM_START_SESSION
* will be supported if set.
* @SPRDWL_VENDOR_ATTR_LOC_CAPA_FLAG_ASAP: Set if FTM responder
* supports immediate (ASAP) response.
* @SPRDWL_VENDOR_ATTR_LOC_CAPA_FLAG_AOA: Set if driver supports standalone
* AOA measurement using %SPRD_NL80211_VENDOR_SUBCMD_AOA_MEAS
* @SPRDWL_VENDOR_ATTR_LOC_CAPA_FLAG_AOA_IN_FTM: Set if driver supports
* requesting AOA measurements as part of an FTM session.
*/
enum sprdwl_vendor_attr_loc_capa_flags {
SPRDWL_VENDOR_ATTR_LOC_CAPA_FLAG_FTM_RESPONDER = 1 << 0,
SPRDWL_VENDOR_ATTR_LOC_CAPA_FLAG_FTM_INITIATOR = 1 << 1,
SPRDWL_VENDOR_ATTR_LOC_CAPA_FLAG_ASAP = 1 << 2,
SPRDWL_VENDOR_ATTR_LOC_CAPA_FLAG_AOA = 1 << 3,
SPRDWL_VENDOR_ATTR_LOC_CAPA_FLAG_AOA_IN_FTM = 1 << 4,
};
/**
* enum sprdwl_vendor_attr_peer_info: information about
* a single peer in a measurement session.
*
* @SPRDWL_VENDOR_ATTR_FTM_PEER_MAC_ADDR: The MAC address of the peer.
* @SPRDWL_VENDOR_ATTR_FTM_PEER_MEAS_FLAGS: Various flags related
* to measurement. See %enum sprdwl_vendor_attr_ftm_peer_meas_flags.
* @SPRDWL_VENDOR_ATTR_FTM_PEER_MEAS_PARAMS: Nested attribute of
* FTM measurement parameters, as specified by IEEE P802.11-REVmc/D7.0,
* 9.4.2.167. See %enum sprdwl_vendor_attr_ftm_meas_param for
* list of supported attributes.
* @SPRDWL_VENDOR_ATTR_FTM_PEER_SECURE_TOKEN_ID: Initial token ID for
* secure measurement
* @SPRDWL_VENDOR_ATTR_FTM_PEER_AOA_BURST_PERIOD: Request AOA
* measurement every _value_ bursts. If 0 or not specified,
* AOA measurements will be disabled for this peer.
* @SPRDWL_VENDOR_ATTR_FTM_PEER_FREQ: Frequency in MHz where
* peer is listening. Optional; if not specified, use the
* entry from the kernel scan results cache.
*/
enum sprdwl_vendor_attr_ftm_peer_info {
SPRDWL_VENDOR_ATTR_FTM_PEER_INVALID,
SPRDWL_VENDOR_ATTR_FTM_PEER_MAC_ADDR,
SPRDWL_VENDOR_ATTR_FTM_PEER_MEAS_FLAGS,
SPRDWL_VENDOR_ATTR_FTM_PEER_MEAS_PARAMS,
SPRDWL_VENDOR_ATTR_FTM_PEER_SECURE_TOKEN_ID,
SPRDWL_VENDOR_ATTR_FTM_PEER_AOA_BURST_PERIOD,
SPRDWL_VENDOR_ATTR_FTM_PEER_FREQ,
/* keep last */
SPRDWL_VENDOR_ATTR_FTM_PEER_AFTER_LAST,
SPRDWL_VENDOR_ATTR_FTM_PEER_MAX =
SPRDWL_VENDOR_ATTR_FTM_PEER_AFTER_LAST - 1,
};
/**
* enum sprdwl_vendor_attr_ftm_peer_meas_flags: Measurement request flags,
* per-peer
* @SPRDWL_VENDOR_ATTR_FTM_PEER_MEAS_FLAG_ASAP: If set, request
* immediate (ASAP) response from peer
* @SPRDWL_VENDOR_ATTR_FTM_PEER_MEAS_FLAG_LCI: If set, request
* LCI report from peer. The LCI report includes the absolute
* location of the peer in "official" coordinates (similar to GPS).
* See IEEE P802.11-REVmc/D7.0, 11.24.6.7 for more information.
* @SPRDWL_VENDOR_ATTR_FTM_PEER_MEAS_FLAG_LCR: If set, request
* Location civic report from peer. The LCR includes the location
* of the peer in free-form format. See IEEE P802.11-REVmc/D7.0,
* 11.24.6.7 for more information.
* @SPRDWL_VENDOR_ATTR_FTM_PEER_MEAS_FLAG_SECURE: If set,
* request a secure measurement.
* %SPRDWL_VENDOR_ATTR_FTM_PEER_SECURE_TOKEN_ID must also be provided.
*/
enum sprdwl_vendor_attr_ftm_peer_meas_flags {
SPRDWL_VENDOR_ATTR_FTM_PEER_MEAS_FLAG_ASAP = 1 << 0,
SPRDWL_VENDOR_ATTR_FTM_PEER_MEAS_FLAG_LCI = 1 << 1,
SPRDWL_VENDOR_ATTR_FTM_PEER_MEAS_FLAG_LCR = 1 << 2,
SPRDWL_VENDOR_ATTR_FTM_PEER_MEAS_FLAG_SECURE = 1 << 3,
};
/**
* enum sprdwl_vendor_attr_ftm_meas_param: Measurement parameters
*
* @SPRDWL_VENDOR_ATTR_FTM_PARAM_MEAS_PER_BURST: Number of measurements
* to perform in a single burst.
* @SPRDWL_VENDOR_ATTR_FTM_PARAM_NUM_BURSTS_EXP: Number of bursts to
* perform, specified as an exponent (2^value)
* @SPRDWL_VENDOR_ATTR_FTM_PARAM_BURST_DURATION: Duration of burst
* instance, as specified in IEEE P802.11-REVmc/D7.0, 9.4.2.167
* @SPRDWL_VENDOR_ATTR_FTM_PARAM_BURST_PERIOD: Time between bursts,
* as specified in IEEE P802.11-REVmc/D7.0, 9.4.2.167. Must
* be larger than %SPRDWL_VENDOR_ATTR_FTM_PARAM_BURST_DURATION
*/
enum sprdwl_vendor_attr_ftm_meas_param {
SPRDWL_VENDOR_ATTR_FTM_PARAM_INVALID,
SPRDWL_VENDOR_ATTR_FTM_PARAM_MEAS_PER_BURST,
SPRDWL_VENDOR_ATTR_FTM_PARAM_NUM_BURSTS_EXP,
SPRDWL_VENDOR_ATTR_FTM_PARAM_BURST_DURATION,
SPRDWL_VENDOR_ATTR_FTM_PARAM_BURST_PERIOD,
/* keep last */
SPRDWL_VENDOR_ATTR_FTM_PARAM_AFTER_LAST,
SPRDWL_VENDOR_ATTR_FTM_PARAM_MAX =
SPRDWL_VENDOR_ATTR_FTM_PARAM_AFTER_LAST - 1,
};
/**
* enum sprdwl_vendor_attr_ftm_peer_result: Per-peer results
*
* @SPRDWL_VENDOR_ATTR_FTM_PEER_RES_MAC_ADDR: MAC address of the reported
* peer
* @SPRDWL_VENDOR_ATTR_FTM_PEER_RES_STATUS: Status of measurement
* request for this peer.
* See %enum sprdwl_vendor_attr_ftm_peer_result_status
* @SPRDWL_VENDOR_ATTR_FTM_PEER_RES_FLAGS: Various flags related
* to measurement results for this peer.
* See %enum sprdwl_vendor_attr_ftm_peer_result_flags
* @SPRDWL_VENDOR_ATTR_FTM_PEER_RES_VALUE_SECONDS: Specified when
* request failed and peer requested not to send an additional request
* for this number of seconds.
* @SPRDWL_VENDOR_ATTR_FTM_PEER_RES_LCI: LCI report when received
* from peer. In the format specified by IEEE P802.11-REVmc/D7.0,
* 9.4.2.22.10
* @SPRDWL_VENDOR_ATTR_FTM_PEER_RES_LCR: Location civic report when
* received from peer.In the format specified by IEEE P802.11-REVmc/D7.0,
* 9.4.2.22.13
* @SPRDWL_VENDOR_ATTR_FTM_PEER_RES_MEAS_PARAMS: Reported when peer
* overridden some measurement request parameters. See
* enum sprdwl_vendor_attr_ftm_meas_param.
* @SPRDWL_VENDOR_ATTR_FTM_PEER_RES_AOA_MEAS: AOA measurement
* for this peer. Same contents as %SPRDWL_VENDOR_ATTR_AOA_MEAS_RESULT
* @SPRDWL_VENDOR_ATTR_FTM_PEER_RES_MEAS: Array of measurement
* results. Each entry is a nested attribute defined
* by enum sprdwl_vendor_attr_ftm_meas.
*/
enum sprdwl_vendor_attr_ftm_peer_result {
SPRDWL_VENDOR_ATTR_FTM_PEER_RES_INVALID,
SPRDWL_VENDOR_ATTR_FTM_PEER_RES_MAC_ADDR,
SPRDWL_VENDOR_ATTR_FTM_PEER_RES_STATUS,
SPRDWL_VENDOR_ATTR_FTM_PEER_RES_FLAGS,
SPRDWL_VENDOR_ATTR_FTM_PEER_RES_VALUE_SECONDS,
SPRDWL_VENDOR_ATTR_FTM_PEER_RES_LCI,
SPRDWL_VENDOR_ATTR_FTM_PEER_RES_LCR,
SPRDWL_VENDOR_ATTR_FTM_PEER_RES_MEAS_PARAMS,
SPRDWL_VENDOR_ATTR_FTM_PEER_RES_AOA_MEAS,
SPRDWL_VENDOR_ATTR_FTM_PEER_RES_MEAS,
/* keep last */
SPRDWL_VENDOR_ATTR_FTM_PEER_RES_AFTER_LAST,
SPRDWL_VENDOR_ATTR_FTM_PEER_RES_MAX =
SPRDWL_VENDOR_ATTR_FTM_PEER_RES_AFTER_LAST - 1,
};
/**
* enum sprdwl_vendor_attr_ftm_peer_result_status
*
* @SPRDWL_VENDOR_ATTR_FTM_PEER_RES_STATUS_OK: Request sent ok and results
* will be provided. Peer may have overridden some measurement parameters,
* in which case overridden parameters will be report by
* %SPRDWL_VENDOR_ATTR_FTM_PEER_RES_MEAS_PARAMS attribute
* @SPRDWL_VENDOR_ATTR_FTM_PEER_RES_STATUS_INCAPABLE: Peer is incapable
* of performing the measurement request. No more results will be sent
* for this peer in this session.
* @SPRDWL_VENDOR_ATTR_FTM_PEER_RES_STATUS_FAILED: Peer reported request
* failed, and requested not to send an additional request for number
* of seconds specified by %SPRDWL_VENDOR_ATTR_FTM_PEER_RES_VALUE_SECONDS
* attribute.
* @SPRDWL_VENDOR_ATTR_FTM_PEER_RES_STATUS_INVALID: Request validation
* failed. Request was not sent over the air.
*/
enum sprdwl_vendor_attr_ftm_peer_result_status {
SPRDWL_VENDOR_ATTR_FTM_PEER_RES_STATUS_OK,
SPRDWL_VENDOR_ATTR_FTM_PEER_RES_STATUS_INCAPABLE,
SPRDWL_VENDOR_ATTR_FTM_PEER_RES_STATUS_FAILED,
SPRDWL_VENDOR_ATTR_FTM_PEER_RES_STATUS_INVALID,
};
/**
* enum sprdwl_vendor_attr_ftm_peer_result_flags : Various flags
* for measurement result, per-peer
*
* @SPRDWL_VENDOR_ATTR_FTM_PEER_RES_FLAG_DONE: If set,
* measurement completed for this peer. No more results will be reported
* for this peer in this session.
*/
enum sprdwl_vendor_attr_ftm_peer_result_flags {
SPRDWL_VENDOR_ATTR_FTM_PEER_RES_FLAG_DONE = 1 << 0,
};
/**
* enum qca_vendor_attr_loc_session_status: Session completion status code
*
* @SPRDWL_VENDOR_ATTR_LOC_SESSION_STATUS_OK: Session completed
* successfully.
* @SPRDWL_VENDOR_ATTR_LOC_SESSION_STATUS_ABORTED: Session aborted
* by request
* @SPRDWL_VENDOR_ATTR_LOC_SESSION_STATUS_INVALID: Session request
* was invalid and was not started
* @SPRDWL_VENDOR_ATTR_LOC_SESSION_STATUS_FAILED: Session had an error
* and did not complete normally (for example out of resources)
*
*/
enum sprdwl_vendor_attr_loc_session_status {
SPRDWL_VENDOR_ATTR_LOC_SESSION_STATUS_OK,
SPRDWL_VENDOR_ATTR_LOC_SESSION_STATUS_ABORTED,
SPRDWL_VENDOR_ATTR_LOC_SESSION_STATUS_INVALID,
SPRDWL_VENDOR_ATTR_LOC_SESSION_STATUS_FAILED,
};
/**
* enum sprdwl_vendor_attr_ftm_meas: Single measurement data
*
* @SPRDWL_VENDOR_ATTR_FTM_MEAS_T1: Time of departure(TOD) of FTM packet as
* recorded by responder, in picoseconds.
* See IEEE P802.11-REVmc/D7.0, 11.24.6.4 for more information.
* @SPRDWL_VENDOR_ATTR_FTM_MEAS_T2: Time of arrival(TOA) of FTM packet at
* initiator, in picoseconds.
* See IEEE P802.11-REVmc/D7.0, 11.24.6.4 for more information.
* @SPRDWL_VENDOR_ATTR_FTM_MEAS_T3: TOD of ACK packet as recorded by
* initiator, in picoseconds.
* See IEEE P802.11-REVmc/D7.0, 11.24.6.4 for more information.
* @SPRDWL_VENDOR_ATTR_FTM_MEAS_T4: TOA of ACK packet at
* responder, in picoseconds.
* See IEEE P802.11-REVmc/D7.0, 11.24.6.4 for more information.
* @SPRDWL_VENDOR_ATTR_FTM_MEAS_RSSI: RSSI (signal level) as recorded
* during this measurement exchange. Optional and will be provided if
* the hardware can measure it.
* @SPRDWL_VENDOR_ATTR_FTM_MEAS_TOD_ERR: TOD error reported by
* responder. Not always provided.
* See IEEE P802.11-REVmc/D7.0, 9.6.8.33 for more information.
* @SPRDWL_VENDOR_ATTR_FTM_MEAS_TOA_ERR: TOA error reported by
* responder. Not always provided.
* See IEEE P802.11-REVmc/D7.0, 9.6.8.33 for more information.
* @SPRDWL_VENDOR_ATTR_FTM_MEAS_INITIATOR_TOD_ERR: TOD error measured by
* initiator. Not always provided.
* See IEEE P802.11-REVmc/D7.0, 9.6.8.33 for more information.
* @SPRDWL_VENDOR_ATTR_FTM_MEAS_INITIATOR_TOA_ERR: TOA error measured by
* initiator. Not always provided.
* See IEEE P802.11-REVmc/D7.0, 9.6.8.33 for more information.
* @SPRDWL_VENDOR_ATTR_FTM_MEAS_PAD: Dummy attribute for padding.
*/
enum sprdwl_vendor_attr_ftm_meas {
SPRDWL_VENDOR_ATTR_FTM_MEAS_INVALID,
SPRDWL_VENDOR_ATTR_FTM_MEAS_T1,
SPRDWL_VENDOR_ATTR_FTM_MEAS_T2,
SPRDWL_VENDOR_ATTR_FTM_MEAS_T3,
SPRDWL_VENDOR_ATTR_FTM_MEAS_T4,
SPRDWL_VENDOR_ATTR_FTM_MEAS_RSSI,
SPRDWL_VENDOR_ATTR_FTM_MEAS_TOD_ERR,
SPRDWL_VENDOR_ATTR_FTM_MEAS_TOA_ERR,
SPRDWL_VENDOR_ATTR_FTM_MEAS_INITIATOR_TOD_ERR,
SPRDWL_VENDOR_ATTR_FTM_MEAS_INITIATOR_TOA_ERR,
SPRDWL_VENDOR_ATTR_FTM_MEAS_PAD,
/* keep last */
SPRDWL_VENDOR_ATTR_FTM_MEAS_AFTER_LAST,
SPRDWL_VENDOR_ATTR_FTM_MEAS_MAX =
SPRDWL_VENDOR_ATTR_FTM_MEAS_AFTER_LAST - 1,
};
enum sprdwl_vendor_attr_aoa_type {
SPRDWL_VENDOR_ATTR_AOA_TYPE_TOP_CIR_PHASE,
SPRDWL_VENDOR_ATTR_AOA_TYPE_TOP_CIR_PHASE_AMP,
SPRDWL_VENDOR_ATTR_AOA_TYPE_MAX,
};
/* vendor event indices, used from both cfg80211.c and ftm.c */
enum sprdwl_vendor_events_ftm_index {
SPRD_VENDOR_EVENT_FTM_MEAS_RESULT_INDEX = 64,
SPRD_VENDOR_EVENT_FTM_SESSION_DONE_INDEX,
};
/* measurement parameters. Specified for each peer as part
* of measurement request, or provided with measurement
* results for peer in case peer overridden parameters
*/
struct sprdwl_ftm_meas_params {
u8 meas_per_burst;
u8 num_of_bursts_exp;
u8 burst_duration;
u16 burst_period;
};
/* measurement request for a single peer */
struct sprdwl_ftm_meas_peer_info {
u8 mac_addr[ETH_ALEN];
u32 freq;
u32 flags; /* enum sprdwl_vendor_attr_ftm_peer_meas_flags */
struct sprdwl_ftm_meas_params params;
u8 secure_token_id;
};
/* session request, passed to wil_ftm_cfg80211_start_session */
struct sprdwl_ftm_session_request {
u64 session_cookie;
u32 n_peers;
/* keep last, variable size according to n_peers */
struct sprdwl_ftm_meas_peer_info peers[0];
};
/* single measurement for a peer */
struct sprdwl_ftm_peer_meas {
u64 t1, t2, t3, t4;
};
/* measurement results for a single peer */
struct sprdwl_ftm_peer_meas_res {
u8 mac_addr[ETH_ALEN];
u32 flags; /* enum sprdwl_vendor_attr_ftm_peer_result_flags */
u8 status; /* enum sprdwl_vendor_attr_ftm_peer_result_status */
u8 value_seconds;
bool has_params; /* true if params is valid */
struct sprdwl_ftm_meas_params params; /* peer overridden params */
u8 *lci;
u8 lci_length;
u8 *lcr;
u8 lcr_length;
u32 n_meas;
/* keep last, variable size according to n_meas */
struct sprdwl_ftm_peer_meas meas[0];
};
/* private data related to FTM. Part of the priv structure */
struct sprdwl_ftm_priv {
struct mutex lock; /* protects the FTM data */
u8 session_started;
u64 session_cookie;
struct sprdwl_ftm_peer_meas_res *ftm_res;
u8 has_ftm_res;
u32 max_ftm_meas;
/* standalone AOA measurement */
u8 aoa_started;
u8 aoa_peer_mac_addr[ETH_ALEN];
u32 aoa_type;
struct timer_list aoa_timer;
struct work_struct aoa_timeout_work;
};
/**
* RTT Capabilities
* @rtt_one_sided_supported: if 1-sided rtt data collection is supported
* @rtt_ftm_supported: if ftm rtt data collection is supported
* @lci_support: if initiator supports LCI request. Applies to 2-sided RTT
* @lcr_support: if initiator supports LCR request. Applies to 2-sided RTT
* @preamble_support: bit mask indicates what preamble is supported by initiator
* @bw_support: bit mask indicates what BW is supported by initiator
* @responder_supported: if 11mc responder mode is supported
* @mc_version: draft 11mc spec version supported by chip.
* For instance, version 4.0 should be 40 and version 4.3 should be 43 etc.
*
*/
struct sprdwl_rtt_capabilities {
u8 rtt_one_sided_supported;
u8 rtt_ftm_supported;
u8 lci_support;
u8 lcr_support;
u8 preamble_support;
u8 bw_support;
u8 responder_supported;
u8 mc_version;
};
enum wifi_rtt_preamble {
WIFI_RTT_PREAMBLE_LEGACY = 0x1,
WIFI_RTT_PREAMBLE_HT = 0x2,
WIFI_RTT_PREAMBLE_VHT = 0x4
};
struct sprdwl_rtt_responder {
struct wifi_channel_info channel;
enum wifi_rtt_preamble preamble;
};
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
int sprdwl_ftm_get_capabilities(struct wiphy *wiphy,
struct wireless_dev *wdev,
const void *data, int data_len);
int sprdwl_ftm_start_session(struct wiphy *wiphy,
struct wireless_dev *wdev,
const void *data, int data_len);
int sprdwl_ftm_abort_session(struct wiphy *wiphy,
struct wireless_dev *wdev,
const void *data, int data_len);
int sprdwl_ftm_get_responder_info(struct wiphy *wiphy,
struct wireless_dev *wdev,
const void *data, int data_len);
int sprdwl_ftm_configure_responder(struct wiphy *wiphy,
struct wireless_dev *wdev,
const void *data, int data_len);
int sprdwl_event_ftm(struct sprdwl_vif *vif, u8 *data, u16 len);
void sprdwl_ftm_init(struct sprdwl_priv *priv);
void sprdwl_ftm_deinit(struct sprdwl_priv *priv);
void sprdwl_ftm_stop_operations(struct sprdwl_priv *priv);
#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0) */
#endif /* __SPRD_RTT_H__ */