forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/dhd_rtt.h
....@@ -1,15 +1,16 @@
1
-/* SPDX-License-Identifier: GPL-2.0 */
21 /*
32 * Broadcom Dongle Host Driver (DHD), RTT
43 *
5
- * Copyright (C) 1999-2019, Broadcom Corporation
6
- *
4
+ * Portions of this code are copyright (c) 2022 Cypress Semiconductor Corporation
5
+ *
6
+ * Copyright (C) 1999-2017, Broadcom Corporation
7
+ *
78 * Unless you and Broadcom execute a separate written software license
89 * agreement governing use of this software, this software is licensed to you
910 * under the terms of the GNU General Public License version 2 (the "GPL"),
1011 * available at http://www.broadcom.com/licenses/GPLv2.php, with the
1112 * following added to such license:
12
- *
13
+ *
1314 * As a special exception, the copyright holders of this software give you
1415 * permission to link this software with independent modules, and to copy and
1516 * distribute the resulting executable under terms of your choice, provided that
....@@ -17,30 +18,40 @@
1718 * the license of that module. An independent module is a module which is not
1819 * derived from this software. The special exception does not apply to any
1920 * modifications of the software.
20
- *
21
+ *
2122 * Notwithstanding the above, under no circumstances may you combine this
2223 * software in any way with any other Broadcom software provided under a license
2324 * other than the GPL, without Broadcom's express prior written consent.
2425 *
25
- * $Id: dhd_rtt.h 578013 2015-08-10 05:56:41Z $
26
+ *
27
+ * <<Broadcom-WL-IPTag/Open:>>
28
+ *
29
+ * $Id$
2630 */
2731 #ifndef __DHD_RTT_H__
2832 #define __DHD_RTT_H__
2933
3034 #include "dngl_stats.h"
3135
32
-#define RTT_MAX_TARGET_CNT 50
33
-#define RTT_MAX_FRAME_CNT 25
34
-#define RTT_MAX_RETRY_CNT 10
35
-#define DEFAULT_FTM_CNT 6
36
-#define DEFAULT_RETRY_CNT 6
36
+#define RTT_MAX_TARGET_CNT 50
37
+#define RTT_MAX_FRAME_CNT 25
38
+#define RTT_MAX_RETRY_CNT 10
39
+#define DEFAULT_FTM_CNT 6
40
+#define DEFAULT_RETRY_CNT 6
41
+#define DEFAULT_FTM_FREQ 5180
42
+#define DEFAULT_FTM_CNTR_FREQ0 5210
43
+#define RTT_MAX_GEOFENCE_TARGET_CNT 8
44
+
3745 #define TARGET_INFO_SIZE(count) (sizeof(rtt_target_info_t) * count)
3846
3947 #define TARGET_TYPE(target) (target->type)
4048
49
+#define RTT_IS_ENABLED(rtt_status) (rtt_status->status == RTT_ENABLED)
50
+#define RTT_IS_STOPPED(rtt_status) (rtt_status->status == RTT_STOPPED)
51
+
4152 #ifndef BIT
4253 #define BIT(x) (1 << (x))
43
-#endif
54
+#endif // endif
4455
4556 /* DSSS, CCK and 802.11n rates in [500kbps] units */
4657 #define WL_MAXRATE 108 /* in 500kbps units */
....@@ -56,22 +67,25 @@
5667 #define WL_RATE_36M 72 /* in 500kbps units */
5768 #define WL_RATE_48M 96 /* in 500kbps units */
5869 #define WL_RATE_54M 108 /* in 500kbps units */
70
+#define GET_RTTSTATE(dhd) ((rtt_status_info_t *)dhd->rtt_state)
5971
72
+/* RTT Retry Timer Interval */
73
+#define DHD_RTT_RETRY_TIMER_INTERVAL_MS 3000u
74
+
75
+#define DHD_RTT_INVALID_TARGET_INDEX -1
6076
6177 enum rtt_role {
6278 RTT_INITIATOR = 0,
6379 RTT_TARGET = 1
6480 };
65
-
6681 enum rtt_status {
6782 RTT_STOPPED = 0,
6883 RTT_STARTED = 1,
6984 RTT_ENABLED = 2
7085 };
71
-
7286 typedef int64_t wifi_timestamp; /* In microseconds (us) */
7387 typedef int64_t wifi_timespan;
74
-typedef int32 wifi_rssi;
88
+typedef int32 wifi_rssi_rtt;
7589
7690 typedef enum {
7791 RTT_INVALID,
....@@ -80,28 +94,35 @@
8094 RTT_AUTO
8195 } rtt_type_t;
8296
97
+/* RTT peer type */
8398 typedef enum {
84
- RTT_PEER_STA,
85
- RTT_PEER_AP,
86
- RTT_PEER_P2P,
87
- RTT_PEER_NAN,
88
- RTT_PEER_INVALID
99
+ RTT_PEER_AP = 0x1,
100
+ RTT_PEER_STA = 0x2,
101
+ RTT_PEER_P2P_GO = 0x3,
102
+ RTT_PEER_P2P_CLIENT = 0x4,
103
+ RTT_PEER_NAN = 0x5,
104
+ RTT_PEER_INVALID = 0x6
89105 } rtt_peer_type_t;
90106
107
+/* Ranging status */
91108 typedef enum rtt_reason {
92
- RTT_REASON_SUCCESS,
93
- RTT_REASON_FAILURE,
94
- RTT_REASON_FAIL_NO_RSP,
95
- RTT_REASON_FAIL_INVALID_TS, /* Invalid timestamp */
96
- RTT_REASON_FAIL_PROTOCOL, /* 11mc protocol failed */
97
- RTT_REASON_FAIL_REJECTED,
98
- RTT_REASON_FAIL_NOT_SCHEDULED_YET,
99
- RTT_REASON_FAIL_SCHEDULE, /* schedule failed */
100
- RTT_REASON_FAIL_TM_TIMEOUT,
101
- RTT_REASON_FAIL_AP_ON_DIFF_CHANNEL,
102
- RTT_REASON_FAIL_NO_CAPABILITY,
103
- RTT_REASON_FAIL_BUSY_TRY_LATER,
104
- RTT_REASON_ABORTED
109
+ RTT_STATUS_SUCCESS = 0,
110
+ RTT_STATUS_FAILURE = 1, // general failure status
111
+ RTT_STATUS_FAIL_NO_RSP = 2, // target STA does not respond to request
112
+ RTT_STATUS_FAIL_REJECTED = 3, // request rejected. Applies to 2-sided RTT only
113
+ RTT_STATUS_FAIL_NOT_SCHEDULED_YET = 4,
114
+ RTT_STATUS_FAIL_TM_TIMEOUT = 5, // timing measurement times out
115
+ RTT_STATUS_FAIL_AP_ON_DIFF_CHANNEL = 6, // Target on different channel, cannot range
116
+ RTT_STATUS_FAIL_NO_CAPABILITY = 7, // ranging not supported
117
+ RTT_STATUS_ABORTED = 8, // request aborted for unknown reason
118
+ RTT_STATUS_FAIL_INVALID_TS = 9, // Invalid T1-T4 timestamp
119
+ RTT_STATUS_FAIL_PROTOCOL = 10, // 11mc protocol failed
120
+ RTT_STATUS_FAIL_SCHEDULE = 11, // request could not be scheduled
121
+ RTT_STATUS_FAIL_BUSY_TRY_LATER = 12, // responder cannot collaborate at time of request
122
+ RTT_STATUS_INVALID_REQ = 13, // bad request args
123
+ RTT_STATUS_NO_WIFI = 14, // WiFi not enabled Responder overrides param info
124
+ // cannot range with new params
125
+ RTT_STATUS_FAIL_FTM_PARAM_OVERRIDE = 15
105126 } rtt_reason_t;
106127
107128 enum {
....@@ -132,6 +153,20 @@
132153 RTT_BW_160 = BIT(5)
133154 };
134155
156
+enum rtt_rate_bw {
157
+ RTT_RATE_20M,
158
+ RTT_RATE_40M,
159
+ RTT_RATE_80M,
160
+ RTT_RATE_160M
161
+};
162
+
163
+typedef enum ranging_type {
164
+ RTT_TYPE_INVALID = 0,
165
+ RTT_TYPE_LEGACY = 1,
166
+ RTT_TYPE_NAN_DIRECTED = 2,
167
+ RTT_TYPE_NAN_GEOFENCE = 3
168
+} ranging_type_t;
169
+
135170 #define FTM_MAX_NUM_BURST_EXP 14
136171 #define HAS_11MC_CAP(cap) (cap & RTT_CAP_FTM_WAY)
137172 #define HAS_ONEWAY_CAP(cap) (cap & RTT_CAP_ONE_WAY)
....@@ -145,7 +180,7 @@
145180 } wifi_channel_info_t;
146181
147182 typedef struct wifi_rate {
148
- uint32 preamble :3; /* 0: OFDM, 1: CCK, 2 : HT, 3: VHT, 4..7 reserved */
183
+ uint32 preamble :3; /* 0: OFDM, 1: CCK, 2 : HT, 3: VHT, 4..7 reserved */
149184 uint32 nss :2; /* 1 : 1x1, 2: 2x2, 3: 3x3, 4: 4x4 */
150185 uint32 bw :3; /* 0: 20Mhz, 1: 40Mhz, 2: 80Mhz, 3: 160Mhz */
151186 /* OFDM/CCK rate code would be as per IEEE std in the unit of 0.5 mb
....@@ -158,6 +193,7 @@
158193
159194 typedef struct rtt_target_info {
160195 struct ether_addr addr;
196
+ struct ether_addr local_addr;
161197 rtt_type_t type; /* rtt_type */
162198 rtt_peer_type_t peer; /* peer type */
163199 wifi_channel_info_t channel; /* channel information */
....@@ -192,7 +228,8 @@
192228 * in a single frame
193229 */
194230 uint32 num_frames_per_burst;
195
- /* num of frames in each RTT burst
231
+ /*
232
+ * num of frames in each RTT burst
196233 * for single side, measurement result num = frame number
197234 * for 2 side RTT, measurement result num = frame number - 1
198235 */
....@@ -212,9 +249,81 @@
212249 * at the end of the burst_duration it requested.
213250 */
214251 uint32 burst_duration;
252
+ uint32 burst_timeout;
215253 uint8 preamble; /* 1 - Legacy, 2 - HT, 4 - VHT */
216254 uint8 bw; /* 5, 10, 20, 40, 80, 160 */
217255 } rtt_target_info_t;
256
+
257
+typedef struct rtt_goefence_target_info {
258
+ bool valid;
259
+ struct ether_addr peer_addr;
260
+} rtt_geofence_target_info_t;
261
+
262
+typedef struct rtt_config_params {
263
+ int8 rtt_target_cnt;
264
+ rtt_target_info_t *target_info;
265
+} rtt_config_params_t;
266
+
267
+typedef struct rtt_geofence_cfg {
268
+ int8 geofence_target_cnt;
269
+ bool rtt_in_progress;
270
+ bool role_concurr_state;
271
+ int8 cur_target_idx;
272
+ rtt_geofence_target_info_t geofence_target_info[RTT_MAX_GEOFENCE_TARGET_CNT];
273
+} rtt_geofence_cfg_t;
274
+
275
+/*
276
+ * Keep Adding more reasons
277
+ * going forward if needed
278
+ */
279
+enum rtt_schedule_reason {
280
+ RTT_SCHED_HOST_TRIGGER = 1, /* On host command for directed RTT */
281
+ RTT_SCHED_SUB_MATCH = 2, /* on Sub Match for svc with range req */
282
+ RTT_SCHED_DIR_TRIGGER_FAIL = 3, /* On failure of Directed RTT Trigger */
283
+ RTT_SCHED_DP_END = 4, /* ON NDP End event from fw */
284
+ RTT_SCHED_DP_REJECTED = 5, /* On receving reject dp event from fw */
285
+ RTT_SCHED_RNG_RPT_DIRECTED = 6, /* On Ranging report for directed RTT */
286
+ RTT_SCHED_RNG_TERM = 7, /* On Range Term Indicator */
287
+ RTT_SHCED_HOST_DIRECTED_TERM = 8, /* On host terminating directed RTT sessions */
288
+ RTT_SCHED_RNG_RPT_GEOFENCE = 9, /* On Ranging report for geofence RTT */
289
+ RTT_SCHED_RTT_RETRY_GEOFENCE = 10 /* On Geofence Retry */
290
+};
291
+
292
+/*
293
+ * Keep Adding more invalid RTT states
294
+ * going forward if needed
295
+ */
296
+enum rtt_invalid_state {
297
+ RTT_STATE_VALID = 0, /* RTT state is valid */
298
+ RTT_STATE_INV_REASON_NDP_EXIST = 1 /* RTT state invalid as ndp exists */
299
+};
300
+
301
+typedef struct rtt_status_info {
302
+ dhd_pub_t *dhd;
303
+ int8 status; /* current status for the current entry */
304
+ int8 txchain; /* current device tx chain */
305
+ int pm; /* to save current value of pm */
306
+ int8 pm_restore; /* flag to reset the old value of pm */
307
+ int8 cur_idx; /* current entry to do RTT */
308
+ bool all_cancel; /* cancel all request once we got the cancel requet */
309
+ uint32 flags; /* indicate whether device is configured as initiator or target */
310
+ struct capability {
311
+ int32 proto :8;
312
+ int32 feature :8;
313
+ int32 preamble :8;
314
+ int32 bw :8;
315
+ } rtt_capa; /* rtt capability */
316
+ struct mutex rtt_mutex;
317
+ struct mutex geofence_mutex;
318
+ rtt_config_params_t rtt_config;
319
+ rtt_geofence_cfg_t geofence_cfg;
320
+ struct work_struct work;
321
+ struct list_head noti_fn_list;
322
+ struct list_head rtt_results_cache; /* store results for RTT */
323
+ int rtt_sched_reason; /* rtt_schedule_reason: what scheduled RTT */
324
+ struct delayed_work proxd_timeout; /* Proxd Timeout work */
325
+ struct delayed_work rtt_retry_timer; /* Timer for retry RTT after all targets done */
326
+} rtt_status_info_t;
218327
219328 typedef struct rtt_report {
220329 struct ether_addr addr;
....@@ -226,8 +335,8 @@
226335 /* in s, 11mc only, only for RTT_REASON_FAIL_BUSY_TRY_LATER, 1- 31s */
227336 uint8 retry_after_duration;
228337 rtt_type_t type; /* rtt type */
229
- wifi_rssi rssi; /* average rssi in 0.5 dB steps e.g. 143 implies -71.5 dB */
230
- wifi_rssi rssi_spread; /* rssi spread in 0.5 db steps e.g. 5 implies 2.5 spread */
338
+ wifi_rssi_rtt rssi; /* average rssi in 0.5 dB steps e.g. 143 implies -71.5 dB */
339
+ wifi_rssi_rtt rssi_spread; /* rssi spread in 0.5 db steps e.g. 5 implies 2.5 spread */
231340 /*
232341 * 1-sided RTT: TX rate of RTT frame.
233342 * 2-sided RTT: TX rate of initiator's Ack in response to FTM frame.
....@@ -250,7 +359,6 @@
250359 bcm_tlv_t *LCI; /* LCI Report */
251360 bcm_tlv_t *LCR; /* Location Civic Report */
252361 } rtt_report_t;
253
-
254362 #define RTT_REPORT_SIZE (sizeof(rtt_report_t))
255363
256364 /* rtt_results_header to maintain rtt result list per mac address */
....@@ -261,12 +369,17 @@
261369 struct list_head list;
262370 struct list_head result_list;
263371 } rtt_results_header_t;
264
-
372
+struct rtt_result_detail {
373
+ uint8 num_ota_meas;
374
+ uint32 result_flags;
375
+};
265376 /* rtt_result to link all of rtt_report */
266377 typedef struct rtt_result {
267378 struct list_head list;
268379 struct rtt_report report;
269380 int32 report_len; /* total length of rtt_report */
381
+ struct rtt_result_detail rtt_detail;
382
+ int32 detail_len;
270383 } rtt_result_t;
271384
272385 /* RTT Capabilities */
....@@ -279,14 +392,13 @@
279392 uint8 bw_support; /* bit mask indicate what BW is supported */
280393 } rtt_capabilities_t;
281394
282
-typedef struct rtt_config_params {
283
- int8 rtt_target_cnt;
284
- rtt_target_info_t *target_info;
285
-} rtt_config_params_t;
395
+/* RTT responder information */
396
+typedef struct wifi_rtt_responder {
397
+ wifi_channel_info channel; /* channel of responder */
398
+ uint8 preamble; /* preamble supported by responder */
399
+} wifi_rtt_responder_t;
286400
287401 typedef void (*dhd_rtt_compl_noti_fn)(void *ctx, void *rtt_data);
288
-
289
-#ifdef RTT_SUPPORT
290402 /* Linux wrapper to call common dhd_rtt_set_cfg */
291403 int
292404 dhd_dev_rtt_set_cfg(struct net_device *dev, void *buf);
....@@ -304,6 +416,14 @@
304416 int
305417 dhd_dev_rtt_capability(struct net_device *dev, rtt_capabilities_t *capa);
306418
419
+int
420
+dhd_dev_rtt_avail_channel(struct net_device *dev, wifi_channel_info *channel_info);
421
+
422
+int
423
+dhd_dev_rtt_enable_responder(struct net_device *dev, wifi_channel_info *channel_info);
424
+
425
+int
426
+dhd_dev_rtt_cancel_responder(struct net_device *dev);
307427 /* export to upper layer */
308428 chanspec_t
309429 dhd_rtt_convert_to_chspec(wifi_channel_info_t channel);
....@@ -314,9 +434,48 @@
314434 int
315435 dhd_rtt_set_cfg(dhd_pub_t *dhd, rtt_config_params_t *params);
316436
437
+void dhd_rtt_set_role_concurrency_state(dhd_pub_t *dhd, bool state);
438
+
439
+bool dhd_rtt_get_role_concurrency_state(dhd_pub_t *dhd);
440
+
441
+int8 dhd_rtt_get_geofence_target_cnt(dhd_pub_t *dhd);
442
+
443
+#ifdef WL_NAN
444
+void dhd_rtt_set_geofence_rtt_state(dhd_pub_t *dhd, bool state);
445
+
446
+bool dhd_rtt_get_geofence_rtt_state(dhd_pub_t *dhd);
447
+
448
+rtt_geofence_target_info_t*
449
+dhd_rtt_get_geofence_target_head(dhd_pub_t *dhd);
450
+
451
+rtt_geofence_target_info_t*
452
+dhd_rtt_get_geofence_current_target(dhd_pub_t *dhd);
453
+
454
+rtt_geofence_target_info_t*
455
+dhd_rtt_get_geofence_target(dhd_pub_t *dhd, struct ether_addr* peer_addr,
456
+ int8 *index);
457
+
458
+int
459
+dhd_rtt_add_geofence_target(dhd_pub_t *dhd, rtt_geofence_target_info_t *target);
460
+
461
+int
462
+dhd_rtt_remove_geofence_target(dhd_pub_t *dhd, struct ether_addr *peer_addr);
463
+
464
+int
465
+dhd_rtt_delete_geofence_target_list(dhd_pub_t *dhd);
466
+
467
+int
468
+dhd_rtt_delete_nan_session(dhd_pub_t *dhd);
469
+#endif /* WL_NAN */
470
+
471
+uint8
472
+dhd_rtt_invalid_states(struct net_device *ndev, struct ether_addr *peer_addr);
473
+
474
+void
475
+dhd_rtt_schedule_rtt_work_thread(dhd_pub_t *dhd, int sched_reason);
476
+
317477 int
318478 dhd_rtt_stop(dhd_pub_t *dhd, struct ether_addr *mac_list, int mac_cnt);
319
-
320479
321480 int
322481 dhd_rtt_register_noti_callback(dhd_pub_t *dhd, void *ctx, dhd_rtt_compl_noti_fn noti_fn);
....@@ -331,9 +490,27 @@
331490 dhd_rtt_capability(dhd_pub_t *dhd, rtt_capabilities_t *capa);
332491
333492 int
493
+dhd_rtt_avail_channel(dhd_pub_t *dhd, wifi_channel_info *channel_info);
494
+
495
+int
496
+dhd_rtt_enable_responder(dhd_pub_t *dhd, wifi_channel_info *channel_info);
497
+
498
+int
499
+dhd_rtt_cancel_responder(dhd_pub_t *dhd);
500
+
501
+int
334502 dhd_rtt_init(dhd_pub_t *dhd);
335503
336504 int
337505 dhd_rtt_deinit(dhd_pub_t *dhd);
338
-#endif /* RTT_SUPPORT */
506
+
507
+#ifdef WL_CFG80211
508
+int dhd_rtt_handle_nan_rtt_session_end(dhd_pub_t *dhd,
509
+ struct ether_addr *peer);
510
+
511
+void dhd_rtt_move_geofence_cur_target_idx_to_next(dhd_pub_t *dhd);
512
+
513
+int8 dhd_rtt_get_geofence_cur_target_idx(dhd_pub_t *dhd);
514
+#endif /* WL_CFG80211 */
515
+
339516 #endif /* __DHD_RTT_H__ */