hc
2024-08-16 62c46c9150c4afde7e5b25436263fddf79d66f0b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
#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;
};
 
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 /* __SPRD_RTT_H__ */