1 /*
2 * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved.
3 *
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16
17 /**
18 * DOC: contains T2LM APIs
19 */
20
21 #ifndef _WLAN_MLO_T2LM_H_
22 #define _WLAN_MLO_T2LM_H_
23
24 #include <wlan_cmn_ieee80211.h>
25 #include <wlan_mlo_mgr_public_structs.h>
26 #ifdef WMI_AP_SUPPORT
27 #include <wlan_cmn.h>
28 #endif
29
30 struct mlo_vdev_host_tid_to_link_map_resp;
31 struct wlan_mlo_dev_context;
32
33 /* Max T2LM TIDS count */
34 #define T2LM_MAX_NUM_TIDS 8
35
36 #ifdef WMI_AP_SUPPORT
37 /* Max no. of Preferred links */
38 #define MAX_PREFERRED_LINKS 4
39 #endif
40
41 /* Max T2LM callback handlers */
42 #define MAX_T2LM_HANDLERS 50
43
44 #define T2LM_EXPECTED_DURATION_MAX_VALUE 0xFFFFFF
45
46 /* Mapping switch time represented as bits 10 to 25 of the TSF value */
47 #define WLAN_T2LM_MAPPING_SWITCH_TSF_BITS 0x3FFFC00
48
49 /* There is a delay involved to receive and process the beacon/probe response
50 * T2LM IE from AP. To match mapping switch timer expiry in both AP and STA,
51 * advance timer expiry in STA by 100ms (= 98 * 1024 / 1000 = 100).
52 */
53 #define WLAN_T2LM_MAPPING_SWITCH_TIME_DELAY 98
54
55 /**
56 * enum wlan_t2lm_direction - Indicates the direction for which TID-to-link
57 * mapping is available.
58 *
59 * @WLAN_T2LM_DL_DIRECTION: Downlink
60 * @WLAN_T2LM_UL_DIRECTION: Uplink
61 * @WLAN_T2LM_BIDI_DIRECTION: Both downlink and uplink
62 * @WLAN_T2LM_MAX_DIRECTION: Max direction, this is used only internally
63 * @WLAN_T2LM_INVALID_DIRECTION: Invalid, this is used only internally to check
64 * if the mapping present in wlan_t2lm_info
65 * structure is valid or not.
66 */
67 enum wlan_t2lm_direction {
68 WLAN_T2LM_DL_DIRECTION,
69 WLAN_T2LM_UL_DIRECTION,
70 WLAN_T2LM_BIDI_DIRECTION,
71 WLAN_T2LM_MAX_DIRECTION,
72 WLAN_T2LM_INVALID_DIRECTION,
73 };
74
75 #ifdef WMI_AP_SUPPORT
76 /**
77 * enum wlan_link_band_caps - Represents the band capability of
78 * a link.
79 *
80 * @WLAN_LINK_BAND_INVALID: Invalid band
81 * @WLAN_LINK_BAND_2GHZ: 2GHz link
82 * @WLAN_LINK_BAND_5GHZ: 5GHz link
83 * @WLAN_LINK_BAND_5GHZ_LOW: 5GHz Low band link
84 * @WLAN_LINK_BAND_5GHZ_HIGH: 5GHz High band link
85 * @WLAN_LINK_BAND_6GHZ: 6GHz link
86 * @WLAN_LINK_BAND_6GHZ_LOW: 6GHz Low band link
87 * @WLAN_LINK_BAND_6GHZ_HIGH: 6GHz High band link
88 */
89 enum wlan_link_band_caps {
90 WLAN_LINK_BAND_INVALID = 0,
91 WLAN_LINK_BAND_2GHZ = 1,
92 WLAN_LINK_BAND_5GHZ = 2,
93 WLAN_LINK_BAND_5GHZ_LOW = 3,
94 WLAN_LINK_BAND_5GHZ_HIGH = 4,
95 WLAN_LINK_BAND_6GHZ = 5,
96 WLAN_LINK_BAND_6GHZ_LOW = 6,
97 WLAN_LINK_BAND_6GHZ_HIGH = 7,
98 };
99
100 /**
101 * struct wlan_link_preference - Preferred link structure
102 * @num_pref_links: non-zero values indicate that preferred link order
103 * is present.
104 * @pref_order: Preferred links in order.it is in form of hardware link id.
105 * @timeout: timeout values for all the access categories.
106 * @tlt_characterization_params: Bitmask to select Tx-Link Tuple from ordered
107 * list.
108 * Bit 0-15: Each bit maps to the corresponding Link ID
109 * Bit 16-31: Reserved
110 * @qualifier_flags: u32 flags to check that link order is
111 * for TLT or link preference. Bit definition for the flags.
112 * Bit 0: TLT bit
113 * Bit 1: Preferred Link bit
114 * Bit 2-31: Reserved
115 */
116 struct wlan_link_preference {
117 uint8_t num_pref_links;
118 uint8_t pref_order[MAX_PREFERRED_LINKS];
119 uint32_t timeout[WIFI_AC_MAX];
120 uint32_t tlt_characterization_params;
121 uint32_t qualifier_flags;
122 };
123
124 /**
125 * struct wlan_t2lm_of_tids - TID-to-link mapping for a given direction
126 * @direction: direction from 'enum wlan_t2lm_direction'
127 * @t2lm_provisioned_links: Link mapping for all the TIDs. Represented as
128 * bitmap of type wlan_link_band_caps enum.
129 */
130 struct wlan_t2lm_of_tids {
131 enum wlan_t2lm_direction direction;
132 uint16_t t2lm_provisioned_links[T2LM_MAX_NUM_TIDS];
133 };
134
135 /**
136 * struct wlan_preferred_links - Preferred link structure
137 * @peer_mld_mac_addr: STA MLD macaddr
138 * @num_t2lm_of_tids: non-zero value indicates that this structure is
139 * carrying the TID-to-link mapping.It indicates for how many directions,
140 * the TID-to-link mapping is present.
141 * @homogeneous_mapping: non-zero value indicates the provided mapping
142 * is homogeneous.
143 * @t2lm: Valid TID-to-link mapping for the directions
144 * @num_pref_links: non-zero values indicate that preferred link order is
145 * present.
146 * @preffered_link_order: Preferred links in order.
147 * The links will be represented interms of wlan_link_band_caps enum.
148 * @timeout: Timeout values for all the access categories.
149 */
150 struct wlan_preferred_links {
151 uint8_t peer_mld_mac_addr[6];
152 uint8_t num_t2lm_of_tids;
153 int8_t homogeneous_mapping;
154 struct wlan_t2lm_of_tids t2lm[WLAN_T2LM_MAX_DIRECTION];
155 uint8_t num_pref_links;
156 enum wlan_link_band_caps preffered_link_order[MAX_PREFERRED_LINKS];
157 uint32_t timeout[WIFI_AC_MAX];
158 };
159 #endif
160
161 /**
162 * struct wlan_t2lm_info - TID-to-Link mapping information for the frames
163 * transmitted on the uplink, downlink and bidirectional.
164 *
165 * @direction: 0 - Downlink, 1 - uplink 2 - Both uplink and downlink
166 * @default_link_mapping: value 1 indicates the default T2LM, where all the TIDs
167 * are mapped to all the links.
168 * value 0 indicates the preferred T2LM mapping
169 * @mapping_switch_time_present: Indicates if mapping switch time field present
170 * in the T2LM IE
171 * @expected_duration_present: Indicates if expected duration present in the
172 * T2LM IE
173 * @mapping_switch_time: Mapping switch time of this T2LM IE
174 * @expected_duration: Expected duration of this T2LM IE
175 * @ieee_link_map_tid: Indicates ieee link id mapping of all the TIDS
176 * @hw_link_map_tid: Indicates hw link id mapping of all the TIDS
177 * @timer_started: flag to check if T2LM timer is started for this T2LM IE
178 * @link_mapping_size: value 1 indicates the length of Link Mapping Of TIDn
179 * field is 1 octet, value 0 indicates the length of the
180 * Link Mapping of TIDn field is 2 octets
181 */
182 struct wlan_t2lm_info {
183 enum wlan_t2lm_direction direction;
184 bool default_link_mapping;
185 bool mapping_switch_time_present;
186 bool expected_duration_present;
187 uint16_t mapping_switch_time;
188 uint32_t expected_duration;
189 uint16_t ieee_link_map_tid[T2LM_MAX_NUM_TIDS];
190 uint16_t hw_link_map_tid[T2LM_MAX_NUM_TIDS];
191 bool timer_started;
192 bool link_mapping_size;
193 };
194
195 /**
196 * enum wlan_t2lm_category - T2LM category
197 *
198 * @WLAN_T2LM_CATEGORY_NONE: none
199 * @WLAN_T2LM_CATEGORY_REQUEST: T2LM request
200 * @WLAN_T2LM_CATEGORY_RESPONSE: T2LM response
201 * @WLAN_T2LM_CATEGORY_TEARDOWN: T2LM teardown
202 * @WLAN_T2LM_CATEGORY_INVALID: Invalid
203 */
204 enum wlan_t2lm_category {
205 WLAN_T2LM_CATEGORY_NONE = 0,
206 WLAN_T2LM_CATEGORY_REQUEST = 1,
207 WLAN_T2LM_CATEGORY_RESPONSE = 2,
208 WLAN_T2LM_CATEGORY_TEARDOWN = 3,
209 WLAN_T2LM_CATEGORY_INVALID,
210 };
211
212 /**
213 * enum wlan_t2lm_tx_status - Status code applicable for the T2LM frames
214 * transmitted by the current peer.
215 *
216 * @WLAN_T2LM_TX_STATUS_NONE: Status code is not applicable
217 * @WLAN_T2LM_TX_STATUS_SUCCESS: AP/STA successfully transmitted the T2LM frame
218 * @WLAN_T2LM_TX_STATUS_FAILURE: Tx failure received from the FW.
219 * @WLAN_T2LM_TX_STATUS_RX_TIMEOUT: T2LM response frame not received from the
220 * peer for the transmitted T2LM request frame.
221 * @WLAN_T2LM_TX_STATUS_INVALID: Invalid status code
222 */
223 enum wlan_t2lm_tx_status {
224 WLAN_T2LM_TX_STATUS_NONE = 0,
225 WLAN_T2LM_TX_STATUS_SUCCESS = 1,
226 WLAN_T2LM_TX_STATUS_FAILURE = 2,
227 WLAN_T2LM_TX_STATUS_RX_TIMEOUT = 3,
228 WLAN_T2LM_TX_STATUS_INVALID,
229 };
230
231 /**
232 * enum wlan_t2lm_resp_frm_type - T2LM status corresponds to T2LM response frame
233 *
234 * @WLAN_T2LM_RESP_TYPE_SUCCESS: T2LM mapping provided in the T2LM request is
235 * accepted either by the AP or STA
236 * @WLAN_T2LM_RESP_TYPE_DENIED_TID_TO_LINK_MAPPING: T2LM Request denied because
237 * the requested TID-to-link mapping is unacceptable.
238 * @WLAN_T2LM_RESP_TYPE_PREFERRED_TID_TO_LINK_MAPPING: T2LM Request rejected and
239 * preferred TID-to-link mapping is suggested.
240 * @WLAN_T2LM_RESP_TYPE_INVALID: Status code is not applicable.
241 */
242 enum wlan_t2lm_resp_frm_type {
243 WLAN_T2LM_RESP_TYPE_SUCCESS = 0,
244 WLAN_T2LM_RESP_TYPE_DENIED_TID_TO_LINK_MAPPING = 133,
245 WLAN_T2LM_RESP_TYPE_PREFERRED_TID_TO_LINK_MAPPING = 134,
246 WLAN_T2LM_RESP_TYPE_INVALID,
247 };
248
249 /**
250 * enum wlan_t2lm_enable - TID-to-link negotiation supported by the mlo peer
251 *
252 * @WLAN_T2LM_NOT_SUPPORTED: T2LM is not supported by the MLD
253 * @WLAN_T2LM_MAP_ALL_TIDS_TO_SAME_LINK_SET: MLD only supports the mapping of
254 * all TIDs to the same link set.
255 * @WLAN_T2LM_MAP_RESERVED: reserved value
256 * @WLAN_T2LM_MAP_EACH_TID_TO_SAME_OR_DIFFERENET_LINK_SET: MLD supports the
257 * mapping of each TID to the same or different link set (Disjoint mapping).
258 * @WLAN_T2LM_ENABLE_INVALID: invalid
259 */
260 enum wlan_t2lm_enable {
261 WLAN_T2LM_NOT_SUPPORTED = 0,
262 WLAN_T2LM_MAP_ALL_TIDS_TO_SAME_LINK_SET = 1,
263 WLAN_T2LM_MAP_RESERVED = 2,
264 WLAN_T2LM_MAP_EACH_TID_TO_SAME_OR_DIFFERENET_LINK_SET = 3,
265 WLAN_T2LM_ENABLE_INVALID,
266 };
267
268 /**
269 * struct wlan_prev_t2lm_negotiated_info - Previous successful T2LM negotiation
270 * is saved here.
271 *
272 * @dialog_token: Save the dialog token used in T2LM request and response frame.
273 * @t2lm_info: Provides the TID to LINK mapping information
274 * @link_preference: Provides the preferred link information
275 */
276 struct wlan_prev_t2lm_negotiated_info {
277 uint16_t dialog_token;
278 struct wlan_t2lm_info t2lm_info[WLAN_T2LM_MAX_DIRECTION];
279 #ifdef WMI_AP_SUPPORT
280 struct wlan_link_preference link_preference;
281 #endif
282 };
283
284 /**
285 * struct wlan_t2lm_onging_negotiation_info - Current ongoing T2LM negotiation
286 * (information about transmitted T2LM request/response frame)
287 *
288 * @category: T2LM category as T2LM request frame
289 * @dialog_token: Save the dialog token used in T2LM request and response frame.
290 * @t2lm_info: Provides the TID-to-link mapping info for UL/DL/BiDi
291 * @t2lm_tx_status: Status code corresponds to the transmitted T2LM frames
292 * @t2lm_resp_type: T2LM status corresponds to T2LM response frame.
293 * @link_preference: Provides the preferred link information
294 * @t2lm_info_present: It will show the t2lm_info present or not
295 * @pref_link_present: It will show the preference link is present or not
296 * @ml_grp_id: MLO Group id which it belongs to
297 */
298 struct wlan_t2lm_onging_negotiation_info {
299 enum wlan_t2lm_category category;
300 uint8_t dialog_token;
301 struct wlan_t2lm_info t2lm_info[WLAN_T2LM_MAX_DIRECTION];
302 enum wlan_t2lm_tx_status t2lm_tx_status;
303 enum wlan_t2lm_resp_frm_type t2lm_resp_type;
304 #ifdef WMI_AP_SUPPORT
305 struct wlan_link_preference link_preference;
306 bool t2lm_info_present;
307 bool pref_link_present;
308 uint8_t ml_grp_id;
309 #endif
310 };
311
312 /**
313 * struct wlan_mlo_peer_t2lm_policy - TID-to-link mapping information
314 *
315 * @self_gen_dialog_token: self generated dialog token used to send T2LM request
316 * frame;
317 * @t2lm_enable_val: TID-to-link enable value supported by this peer.
318 * @t2lm_negotiated_info: Previous successful T2LM negotiation is saved here.
319 * @ongoing_tid_to_link_mapping: This has the ongoing TID-to-link mapping info
320 * transmitted by this peer to the connected peer.
321 */
322 struct wlan_mlo_peer_t2lm_policy {
323 uint8_t self_gen_dialog_token;
324 enum wlan_t2lm_enable t2lm_enable_val;
325 struct wlan_prev_t2lm_negotiated_info t2lm_negotiated_info;
326 struct wlan_t2lm_onging_negotiation_info ongoing_tid_to_link_mapping;
327 };
328
329 /**
330 * struct wlan_mlo_t2lm_ie - T2LM information
331 *
332 * @disabled_link_bitmap: Bitmap of disabled links. This is used to update the
333 * disabled link field of RNR IE
334 * @t2lm: T2LM info structure
335 */
336 struct wlan_mlo_t2lm_ie {
337 uint16_t disabled_link_bitmap;
338 struct wlan_t2lm_info t2lm;
339 };
340
341 /*
342 * In a beacon or probe response frame, at max two T2LM IEs can be present
343 * first one to represent the already existing mapping and the other one
344 * represents the new T2LM mapping that is yet to establish.
345 */
346 #define WLAN_MAX_T2LM_IE 2
347 /**
348 * struct wlan_t2lm_timer - T2LM timer information
349 *
350 * @t2lm_timer: T2LM timer
351 * @timer_interval: T2LM Timer value
352 * @timer_started: T2LM timer started or not
353 * @timer_out_time: T2LM timer target out time
354 * @t2lm_dev_lock: lock to access struct
355 */
356 struct wlan_t2lm_timer {
357 qdf_timer_t t2lm_timer;
358 uint32_t timer_interval;
359 uint32_t timer_out_time;
360 bool timer_started;
361 #ifdef WLAN_MLO_USE_SPINLOCK
362 qdf_spinlock_t t2lm_dev_lock;
363 #else
364 qdf_mutex_t t2lm_dev_lock;
365 #endif
366 };
367
368 struct wlan_mlo_dev_context;
369
370 /**
371 * typedef wlan_mlo_t2lm_link_update_handler - T2LM handler API to notify the
372 * link update.
373 * @vdev: Pointer to vdev context
374 * @t2lm: Pointer to wlan_t2lm_info
375 *
376 * Return: QDF_STATUS
377 */
378 typedef QDF_STATUS (*wlan_mlo_t2lm_link_update_handler)(
379 struct wlan_objmgr_vdev *vdev,
380 struct wlan_t2lm_info *t2lm);
381
382 /**
383 * struct wlan_t2lm_context - T2LM IE information
384 *
385 * @established_t2lm: Indicates the already established broadcast T2LM IE
386 * advertised by the AP in beacon/probe response frames.
387 * In this T2LM IE, expected duration flag is set to 1 and
388 * mapping switch time present flag is set to 0 when the
389 * mapping is non-default.
390 * @upcoming_t2lm: Indicates the new broadcast T2LM IE advertised by the AP in
391 * beacon/probe response frames. STA needs to use this mapping
392 * when expected duration in the established T2LM is expires.
393 * @t2lm_timer: T2LM timer information
394 * @t2lm_dev_lock: t2lm dev context lock
395 * @tsf: time sync func value received via beacon
396 * @link_update_handler: handler to update T2LM link
397 * @is_valid_handler: T2LM handler is valid or not
398 * @mst_start_tsf: calculated mapping switch start tsf
399 * @mst_end_tsf: calculated mapping switch end tsf
400 * @link_update_callback_index: Link update callback index. This callback is
401 * invoked as part of mapping switch time and
402 * expected duration expiry.
403 */
404 struct wlan_t2lm_context {
405 struct wlan_mlo_t2lm_ie established_t2lm;
406 struct wlan_mlo_t2lm_ie upcoming_t2lm;
407 struct wlan_t2lm_timer t2lm_timer;
408 #ifdef WLAN_MLO_USE_SPINLOCK
409 qdf_spinlock_t t2lm_dev_lock;
410 #else
411 qdf_mutex_t t2lm_dev_lock;
412 #endif
413 uint64_t tsf;
414 wlan_mlo_t2lm_link_update_handler
415 link_update_handler[MAX_T2LM_HANDLERS];
416 bool is_valid_handler[MAX_T2LM_HANDLERS];
417 #ifdef WLAN_FEATURE_11BE_MLO_ADV_FEATURE
418 uint64_t mst_start_tsf;
419 uint64_t mst_end_tsf;
420 #endif
421 int link_update_callback_index;
422 };
423
424 #ifdef WLAN_FEATURE_11BE
425
426 #define t2lm_alert(format, args...) \
427 QDF_TRACE_FATAL(QDF_MODULE_ID_T2LM, format, ## args)
428
429 #define t2lm_err(format, args...) \
430 QDF_TRACE_ERROR(QDF_MODULE_ID_T2LM, format, ## args)
431
432 #define t2lm_warn(format, args...) \
433 QDF_TRACE_WARN(QDF_MODULE_ID_T2LM, format, ## args)
434
435 #define t2lm_info(format, args...) \
436 QDF_TRACE_INFO(QDF_MODULE_ID_T2LM, format, ## args)
437
438 #define t2lm_debug(format, args...) \
439 QDF_TRACE_DEBUG(QDF_MODULE_ID_T2LM, format, ## args)
440
441 #define t2lm_rl_debug(format, args...) \
442 QDF_TRACE_DEBUG_RL(QDF_MODULE_ID_T2LM, format, ## args)
443
444 #define WLAN_T2LM_MAX_NUM_LINKS 16
445
446 #ifdef WLAN_MLO_USE_SPINLOCK
447 /**
448 * t2lm_dev_lock_create - Create T2LM device mutex/spinlock
449 * @t2lm_ctx: T2LM context
450 *
451 * Creates mutex/spinlock
452 *
453 * Return: void
454 */
455 static inline void
t2lm_dev_lock_create(struct wlan_t2lm_context * t2lm_ctx)456 t2lm_dev_lock_create(struct wlan_t2lm_context *t2lm_ctx)
457 {
458 qdf_spinlock_create(&t2lm_ctx->t2lm_dev_lock);
459 }
460
461 /**
462 * t2lm_dev_lock_destroy - Destroy T2LM mutex/spinlock
463 * @t2lm_ctx: T2LM context
464 *
465 * Destroy mutex/spinlock
466 *
467 * Return: void
468 */
469 static inline void
t2lm_dev_lock_destroy(struct wlan_t2lm_context * t2lm_ctx)470 t2lm_dev_lock_destroy(struct wlan_t2lm_context *t2lm_ctx)
471 {
472 qdf_spinlock_destroy(&t2lm_ctx->t2lm_dev_lock);
473 }
474
475 /**
476 * t2lm_dev_lock_acquire - acquire T2LM mutex/spinlock
477 * @t2lm_ctx: T2LM context
478 *
479 * acquire mutex/spinlock
480 *
481 * return: void
482 */
483 static inline
t2lm_dev_lock_acquire(struct wlan_t2lm_context * t2lm_ctx)484 void t2lm_dev_lock_acquire(struct wlan_t2lm_context *t2lm_ctx)
485 {
486 qdf_spin_lock_bh(&t2lm_ctx->t2lm_dev_lock);
487 }
488
489 /**
490 * t2lm_dev_lock_release - release T2LM dev mutex/spinlock
491 * @t2lm_ctx: T2LM context
492 *
493 * release mutex/spinlock
494 *
495 * return: void
496 */
497 static inline
t2lm_dev_lock_release(struct wlan_t2lm_context * t2lm_ctx)498 void t2lm_dev_lock_release(struct wlan_t2lm_context *t2lm_ctx)
499 {
500 qdf_spin_unlock_bh(&t2lm_ctx->t2lm_dev_lock);
501 }
502 #else /* WLAN_MLO_USE_SPINLOCK */
503 static inline
t2lm_dev_lock_create(struct wlan_t2lm_context * t2lm_ctx)504 void t2lm_dev_lock_create(struct wlan_t2lm_context *t2lm_ctx)
505 {
506 qdf_mutex_create(&t2lm_ctx->t2lm_dev_lock);
507 }
508
509 static inline
t2lm_dev_lock_destroy(struct wlan_t2lm_context * t2lm_ctx)510 void t2lm_dev_lock_destroy(struct wlan_t2lm_context *t2lm_ctx)
511 {
512 qdf_mutex_destroy(&t2lm_ctx->t2lm_dev_lock);
513 }
514
t2lm_dev_lock_acquire(struct wlan_t2lm_context * t2lm_ctx)515 static inline void t2lm_dev_lock_acquire(struct wlan_t2lm_context *t2lm_ctx)
516 {
517 qdf_mutex_acquire(&t2lm_ctx->t2lm_dev_lock);
518 }
519
t2lm_dev_lock_release(struct wlan_t2lm_context * t2lm_ctx)520 static inline void t2lm_dev_lock_release(struct wlan_t2lm_context *t2lm_ctx)
521 {
522 qdf_mutex_release(&t2lm_ctx->t2lm_dev_lock);
523 }
524 #endif
525
526 /**
527 * wlan_register_t2lm_link_update_notify_handler() - API to register the
528 * handlers to receive link update notification
529 * @handler: handler for T2LM link update
530 * @mldev: Pointer to mlo context
531 *
532 * Return: Index on which handler is registered
533 */
534 int wlan_register_t2lm_link_update_notify_handler(
535 wlan_mlo_t2lm_link_update_handler handler,
536 struct wlan_mlo_dev_context *mldev);
537
538 /**
539 * wlan_unregister_t2lm_link_update_notify_handler() - API to unregister the
540 * T2LM related handlers
541 * @mldev: Pointer to mlo context
542 * @index: Index on which the handler was registered
543 *
544 * Return: None
545 */
546 void wlan_unregister_t2lm_link_update_notify_handler(
547 struct wlan_mlo_dev_context *mldev, uint8_t index);
548
549 /**
550 * wlan_mlo_dev_t2lm_notify_link_update() - API to call the registered handlers
551 * when there is a link update happens using T2LM
552 * @vdev: Pointer to vdev
553 * @t2lm: Pointer to T2LM info
554 *
555 * Return: QDF_STATUS
556 */
557 QDF_STATUS wlan_mlo_dev_t2lm_notify_link_update(
558 struct wlan_objmgr_vdev *vdev,
559 struct wlan_t2lm_info *t2lm);
560
561 /**
562 * wlan_mlo_parse_t2lm_ie() - API to parse the T2LM IE
563 * @t2lm: Pointer to T2LM structure
564 * @ie: Pointer to T2LM IE
565 * @frame_len: Action Frame length
566 *
567 * Return: QDF_STATUS
568 */
569 QDF_STATUS wlan_mlo_parse_t2lm_ie(
570 struct wlan_t2lm_onging_negotiation_info *t2lm, uint8_t *ie,
571 uint32_t frame_len);
572
573 /**
574 * wlan_mlo_add_t2lm_ie() - API to add TID-to-link mapping IE
575 * @frm: Pointer to buffer
576 * @t2lm: Pointer to t2lm mapping structure
577 * @vdev: Pointer to vdev structure
578 *
579 * Return: Updated frame pointer
580 */
581 uint8_t *wlan_mlo_add_t2lm_ie(uint8_t *frm,
582 struct wlan_t2lm_onging_negotiation_info *t2lm,
583 struct wlan_objmgr_vdev *vdev);
584
585 /**
586 * wlan_mlo_vdev_tid_to_link_map_event() - API to process the revceived T2LM
587 * event.
588 * @psoc: psoc object
589 * @event: Pointer to received T2LM info
590 *
591 * Return: QDF_STATUS
592 */
593 QDF_STATUS wlan_mlo_vdev_tid_to_link_map_event(
594 struct wlan_objmgr_psoc *psoc,
595 struct mlo_vdev_host_tid_to_link_map_resp *event);
596
597 /**
598 * wlan_mlo_parse_t2lm_action_frame() - API to parse T2LM action frame
599 * @t2lm: Pointer to T2LM structure
600 * @action_frm: Pointer to action frame
601 * @frame_len: Action frame length
602 * @category: T2LM action frame category
603 *
604 * Return: 0 - success, else failure
605 */
606 int wlan_mlo_parse_t2lm_action_frame(
607 struct wlan_t2lm_onging_negotiation_info *t2lm,
608 struct wlan_action_frame *action_frm,
609 uint32_t frame_len,
610 enum wlan_t2lm_category category);
611
612 /**
613 * wlan_mlo_add_t2lm_action_frame() - API to add T2LM action frame
614 * @frm: Pointer to a frame to add T2LM IE
615 * @args: T2LM action frame related info
616 * @buf: Pointer to T2LM IE values
617 * @category: T2LM action frame category
618 *
619 * Return: Pointer to the updated frame buffer
620 */
621 uint8_t *wlan_mlo_add_t2lm_action_frame(
622 uint8_t *frm, struct wlan_action_frame_args *args,
623 uint8_t *buf, enum wlan_t2lm_category category);
624
625 /**
626 * wlan_mlo_parse_bcn_prbresp_t2lm_ie() - API to parse the T2LM IE from beacon/
627 * probe response frame
628 * @t2lm_ctx: T2LM context
629 * @ie: Pointer to T2LM IE
630 * @frame_len: Frame length
631 *
632 * Return: QDF_STATUS
633 */
634 QDF_STATUS wlan_mlo_parse_bcn_prbresp_t2lm_ie(
635 struct wlan_t2lm_context *t2lm_ctx, uint8_t *ie,
636 uint32_t frame_len);
637
638 /**
639 * wlan_mlo_parse_t2lm_info() - Parse T2LM IE fields
640 * @ie: Pointer to T2LM IE
641 * @t2lm: Pointer to T2LM structure
642 *
643 * Return: QDF_STATUS
644 */
645 QDF_STATUS wlan_mlo_parse_t2lm_info(uint8_t *ie,
646 struct wlan_t2lm_info *t2lm);
647
648 /**
649 * wlan_mlo_add_t2lm_info_ie() - Add T2LM IE for UL/DL/Bidirection
650 * @frm: Pointer to buffer
651 * @t2lm: Pointer to t2lm mapping structure
652 * @vdev: Pointer to vdev structure
653 *
654 * Return: Updated frame pointer
655 */
656 uint8_t *wlan_mlo_add_t2lm_info_ie(uint8_t *frm, struct wlan_t2lm_info *t2lm,
657 struct wlan_objmgr_vdev *vdev);
658
659 /**
660 * wlan_mlo_t2lm_timer_init() - API to initialize t2lm timer
661 * @vdev: Pointer to vdev
662 *
663 * Return: qdf status
664 */
665 QDF_STATUS
666 wlan_mlo_t2lm_timer_init(struct wlan_objmgr_vdev *vdev);
667
668 /**
669 * wlan_mlo_t2lm_timer_deinit() - API to deinit t2lm timer
670 * @vdev: Pointer to vdev
671 *
672 * Return: qdf status
673 */
674 QDF_STATUS
675 wlan_mlo_t2lm_timer_deinit(struct wlan_objmgr_vdev *vdev);
676
677 /**
678 * wlan_mlo_t2lm_timer_start() - API to start T2LM timer
679 * @vdev: Pointer to vdev
680 * @interval: T2LM timer interval
681 *
682 * Return: qdf status
683 */
684 QDF_STATUS
685 wlan_mlo_t2lm_timer_start(struct wlan_objmgr_vdev *vdev,
686 uint32_t interval);
687
688 /**
689 * wlan_mlo_t2lm_timer_stop() - API to stop TID-to-link mapping timer
690 * @vdev: Pointer to vdev
691 *
692 * Return: qdf status
693 */
694 QDF_STATUS
695 wlan_mlo_t2lm_timer_stop(struct wlan_objmgr_vdev *vdev);
696
697 /**
698 * wlan_mlo_t2lm_timer_expiry_handler() - API to handle t2lm timer expiry
699 * @vdev: Pointer to vdev structure
700 *
701 * Return: none
702 */
703 void
704 wlan_mlo_t2lm_timer_expiry_handler(void *vdev);
705
706 /**
707 * wlan_handle_t2lm_timer() - API to handle TID-to-link mapping timer
708 * @vdev: Pointer to vdev
709 *
710 * Return: qdf status
711 */
712 QDF_STATUS
713 wlan_handle_t2lm_timer(struct wlan_objmgr_vdev *vdev);
714
715 #ifndef WLAN_FEATURE_11BE_MLO_ADV_FEATURE
716 /**
717 * wlan_mlo_t2lm_register_link_update_notify_handler() - API to register a T2LM
718 * callback that needs to be invoked on mapping switch time expiry and expected
719 * duration expiry.
720 * @ml_dev: Pointer MLO dev context
721 *
722 * Return: QDF_STATUS
723 */
724 QDF_STATUS wlan_mlo_t2lm_register_link_update_notify_handler(
725 struct wlan_mlo_dev_context *ml_dev);
726 #else
727 static inline QDF_STATUS
wlan_mlo_t2lm_register_link_update_notify_handler(struct wlan_mlo_dev_context * ml_dev)728 wlan_mlo_t2lm_register_link_update_notify_handler(struct wlan_mlo_dev_context *ml_dev)
729 {
730 return QDF_STATUS_SUCCESS;
731 }
732 #endif
733
734 /**
735 * wlan_process_bcn_prbrsp_t2lm_ie() - API to process the received T2LM IE from
736 * beacon/probe response.
737 * @vdev: Pointer to vdev
738 * @rx_t2lm_ie: Received T2LM IE
739 * @tsf: Local TSF value
740 *
741 * Return QDF_STATUS
742 */
743 QDF_STATUS wlan_process_bcn_prbrsp_t2lm_ie(struct wlan_objmgr_vdev *vdev,
744 struct wlan_t2lm_context *rx_t2lm_ie,
745 uint64_t tsf);
746
747 /**
748 * wlan_send_tid_to_link_mapping() - API to send T2LM info received from beacon,
749 * probe response or action frame to FW.
750 *
751 * @vdev: Pointer to vdev
752 * @t2lm: T2LM info
753 *
754 * Return QDF_STATUS
755 */
756 QDF_STATUS wlan_send_tid_to_link_mapping(struct wlan_objmgr_vdev *vdev,
757 struct wlan_t2lm_info *t2lm);
758
759 /**
760 * wlan_get_t2lm_mapping_status() - API to get T2LM info
761 * @vdev: Pointer to vdev
762 * @t2lm: T2LM info
763 *
764 * Return: QDF_STATUS
765 */
766 QDF_STATUS wlan_get_t2lm_mapping_status(struct wlan_objmgr_vdev *vdev,
767 struct wlan_t2lm_info *t2lm);
768
769 /**
770 * wlan_send_peer_level_tid_to_link_mapping() - API to send peer level T2LM info
771 * negotiated using action frames to FW.
772 *
773 * @vdev: Pointer to vdev
774 * @peer: pointer to peer
775 *
776 * Return QDF_STATUS
777 */
778 QDF_STATUS
779 wlan_send_peer_level_tid_to_link_mapping(struct wlan_objmgr_vdev *vdev,
780 struct wlan_objmgr_peer *peer);
781 #else
wlan_mlo_parse_t2lm_ie(struct wlan_t2lm_onging_negotiation_info * t2lm,uint8_t * ie,uint32_t frame_len)782 static inline QDF_STATUS wlan_mlo_parse_t2lm_ie(
783 struct wlan_t2lm_onging_negotiation_info *t2lm, uint8_t *ie,
784 uint32_t frame_len)
785 {
786 return QDF_STATUS_E_FAILURE;
787 }
788
789 static inline
wlan_mlo_add_t2lm_ie(uint8_t * frm,struct wlan_t2lm_onging_negotiation_info * t2lm,struct wlan_objmgr_vdev * vdev)790 int8_t *wlan_mlo_add_t2lm_ie(uint8_t *frm,
791 struct wlan_t2lm_onging_negotiation_info *t2lm,
792 struct wlan_objmgr_vdev *vdev)
793 {
794 return frm;
795 }
796
797 static inline
wlan_mlo_parse_t2lm_action_frame(struct wlan_t2lm_onging_negotiation_info * t2lm,struct wlan_action_frame * action_frm,uint32_t frame_len,enum wlan_t2lm_category category)798 int wlan_mlo_parse_t2lm_action_frame(
799 struct wlan_t2lm_onging_negotiation_info *t2lm,
800 struct wlan_action_frame *action_frm,
801 uint32_t frame_len,
802 enum wlan_t2lm_category category)
803 {
804 return 0;
805 }
806
807 static inline
wlan_mlo_add_t2lm_action_frame(uint8_t * frm,struct wlan_action_frame_args * args,uint8_t * buf,enum wlan_t2lm_category category)808 uint8_t *wlan_mlo_add_t2lm_action_frame(
809 uint8_t *frm, struct wlan_action_frame_args *args,
810 uint8_t *buf, enum wlan_t2lm_category category)
811 {
812 return frm;
813 }
814
815 static inline
wlan_mlo_parse_bcn_prbresp_t2lm_ie(struct wlan_t2lm_context * t2lm_ctx,uint8_t * ie,uint32_t frame_len)816 QDF_STATUS wlan_mlo_parse_bcn_prbresp_t2lm_ie(
817 struct wlan_t2lm_context *t2lm_ctx, uint8_t *ie,
818 uint32_t frame_len)
819 {
820 return QDF_STATUS_E_FAILURE;
821 }
822
823 static inline
wlan_mlo_parse_t2lm_info(uint8_t * ie,struct wlan_t2lm_info * t2lm)824 QDF_STATUS wlan_mlo_parse_t2lm_info(uint8_t *ie,
825 struct wlan_t2lm_info *t2lm)
826 {
827 return QDF_STATUS_E_FAILURE;
828 }
829
830 static inline
wlan_mlo_add_t2lm_info_ie(uint8_t * frm,struct wlan_t2lm_info * t2lm,struct wlan_objmgr_vdev * vdev)831 uint8_t *wlan_mlo_add_t2lm_info_ie(uint8_t *frm, struct wlan_t2lm_info *t2lm,
832 struct wlan_objmgr_vdev *vdev)
833 {
834 return frm;
835 }
836
837 static inline QDF_STATUS
wlan_mlo_t2lm_timer_init(struct wlan_objmgr_vdev * vdev)838 wlan_mlo_t2lm_timer_init(struct wlan_objmgr_vdev *vdev)
839 {
840 return QDF_STATUS_E_NOSUPPORT;
841 }
842
843 static inline QDF_STATUS
wlan_mlo_t2lm_timer_deinit(struct wlan_objmgr_vdev * vdev)844 wlan_mlo_t2lm_timer_deinit(struct wlan_objmgr_vdev *vdev)
845 {
846 return QDF_STATUS_E_NOSUPPORT;
847 }
848
849 static inline QDF_STATUS
wlan_mlo_t2lm_timer_start(struct wlan_objmgr_vdev * vdev,uint32_t interval)850 wlan_mlo_t2lm_timer_start(struct wlan_objmgr_vdev *vdev,
851 uint32_t interval)
852 {
853 return QDF_STATUS_E_NOSUPPORT;
854 }
855
856 static inline QDF_STATUS
wlan_mlo_t2lm_timer_stop(struct wlan_objmgr_vdev * vdev)857 wlan_mlo_t2lm_timer_stop(struct wlan_objmgr_vdev *vdev)
858 {
859 return QDF_STATUS_E_NOSUPPORT;
860 }
861
862 static inline void
wlan_mlo_t2lm_timer_expiry_handler(void * vdev)863 wlan_mlo_t2lm_timer_expiry_handler(void *vdev)
864 {}
865
866 static inline QDF_STATUS
wlan_handle_t2lm_timer(struct wlan_objmgr_vdev * vdev)867 wlan_handle_t2lm_timer(struct wlan_objmgr_vdev *vdev)
868 {
869 return QDF_STATUS_E_NOSUPPORT;
870 }
871
872 static inline
wlan_mlo_t2lm_register_link_update_notify_handler(struct wlan_mlo_dev_context * ml_dev)873 QDF_STATUS wlan_mlo_t2lm_register_link_update_notify_handler(
874 struct wlan_mlo_dev_context *ml_dev)
875 {
876 return QDF_STATUS_SUCCESS;
877 }
878
879 static inline QDF_STATUS
wlan_process_bcn_prbrsp_t2lm_ie(struct wlan_objmgr_vdev * vdev,struct wlan_t2lm_context * rx_t2lm_ie,uint64_t tsf)880 wlan_process_bcn_prbrsp_t2lm_ie(struct wlan_objmgr_vdev *vdev,
881 struct wlan_t2lm_context *rx_t2lm_ie,
882 uint64_t tsf)
883 {
884 return QDF_STATUS_SUCCESS;
885 }
886
887 static inline
wlan_register_t2lm_link_update_notify_handler(wlan_mlo_t2lm_link_update_handler handler,struct wlan_mlo_dev_context * mldev)888 int wlan_register_t2lm_link_update_notify_handler(
889 wlan_mlo_t2lm_link_update_handler handler,
890 struct wlan_mlo_dev_context *mldev)
891 {
892 return 0;
893 }
894
895 static inline
wlan_unregister_t2lm_link_update_notify_handler(struct wlan_mlo_dev_context * mldev,uint8_t index)896 void wlan_unregister_t2lm_link_update_notify_handler(
897 struct wlan_mlo_dev_context *mldev, uint8_t index)
898 {
899 }
900
wlan_mlo_dev_t2lm_notify_link_update(struct wlan_objmgr_vdev * vdev,struct wlan_t2lm_info * t2lm)901 static inline QDF_STATUS wlan_mlo_dev_t2lm_notify_link_update(
902 struct wlan_objmgr_vdev *vdev,
903 struct wlan_t2lm_info *t2lm)
904 {
905 return QDF_STATUS_SUCCESS;
906 }
907
908 static inline
wlan_send_tid_to_link_mapping(struct wlan_objmgr_vdev * vdev,struct wlan_t2lm_info * t2lm)909 QDF_STATUS wlan_send_tid_to_link_mapping(struct wlan_objmgr_vdev *vdev,
910 struct wlan_t2lm_info *t2lm)
911 {
912 return QDF_STATUS_SUCCESS;
913 }
914
915 static inline QDF_STATUS
wlan_send_peer_level_tid_to_link_mapping(struct wlan_objmgr_vdev * vdev,struct wlan_objmgr_peer * peer)916 wlan_send_peer_level_tid_to_link_mapping(struct wlan_objmgr_vdev *vdev,
917 struct wlan_objmgr_peer *peer)
918 {
919 return QDF_STATUS_SUCCESS;
920 }
921 #endif /* WLAN_FEATURE_11BE */
922
923 #if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_FEATURE_11BE_MLO_ADV_FEATURE)
924 /**
925 * wlan_clear_peer_level_tid_to_link_mapping() - API to clear peer level T2LM
926 * info negotiated using action frames to FW.
927 *
928 * @vdev: Pointer to vdev
929 *
930 * Return: none
931 */
932 void
933 wlan_clear_peer_level_tid_to_link_mapping(struct wlan_objmgr_vdev *vdev);
934
935 /**
936 * wlan_mlo_link_disable_request_handler() - API to handle mlo link disable
937 * request handler.
938 *
939 * @psoc: Pointer to psoc
940 * @evt_params: MLO Link disable request params
941 *
942 * Return QDF_STATUS
943 */
944 QDF_STATUS
945 wlan_mlo_link_disable_request_handler(struct wlan_objmgr_psoc *psoc,
946 void *evt_params);
947 #else
948 static inline void
wlan_clear_peer_level_tid_to_link_mapping(struct wlan_objmgr_vdev * vdev)949 wlan_clear_peer_level_tid_to_link_mapping(struct wlan_objmgr_vdev *vdev)
950 {
951 }
952
953 static inline QDF_STATUS
wlan_mlo_link_disable_request_handler(struct wlan_objmgr_psoc * psoc,void * evt_params)954 wlan_mlo_link_disable_request_handler(struct wlan_objmgr_psoc *psoc,
955 void *evt_params)
956 {
957 return QDF_STATUS_E_NOSUPPORT;
958 }
959 #endif
960 #endif /* _WLAN_MLO_T2LM_H_ */
961