xref: /wlan-driver/qca-wifi-host-cmn/umac/mlo_mgr/inc/wlan_mlo_mgr_public_structs.h (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2021, The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for any
6*5113495bSYour Name  * purpose with or without fee is hereby granted, provided that the above
7*5113495bSYour Name  * copyright notice and this permission notice appear in all copies.
8*5113495bSYour Name  *
9*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10*5113495bSYour Name  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11*5113495bSYour Name  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12*5113495bSYour Name  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13*5113495bSYour Name  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14*5113495bSYour Name  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15*5113495bSYour Name  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16*5113495bSYour Name  */
17*5113495bSYour Name 
18*5113495bSYour Name /**
19*5113495bSYour Name  * DOC: contains mlo manager structure definitions
20*5113495bSYour Name  */
21*5113495bSYour Name #ifndef __MLO_MGR_PUBLIC_STRUCTS_H
22*5113495bSYour Name #define __MLO_MGR_PUBLIC_STRUCTS_H
23*5113495bSYour Name 
24*5113495bSYour Name #include <wlan_objmgr_cmn.h>
25*5113495bSYour Name #include <qdf_list.h>
26*5113495bSYour Name #include <qdf_atomic.h>
27*5113495bSYour Name #include <qdf_nbuf.h>
28*5113495bSYour Name #include <wlan_cmn_ieee80211.h>
29*5113495bSYour Name #include <wlan_cmn.h>
30*5113495bSYour Name #include <wlan_objmgr_global_obj.h>
31*5113495bSYour Name #if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_MLO_MULTI_CHIP)
32*5113495bSYour Name #include <qdf_event.h>
33*5113495bSYour Name #endif
34*5113495bSYour Name #include <wlan_mlo_t2lm.h>
35*5113495bSYour Name 
36*5113495bSYour Name /* MAX MLO dev support */
37*5113495bSYour Name #ifndef WLAN_UMAC_MLO_MAX_VDEVS
38*5113495bSYour Name #define WLAN_UMAC_MLO_MAX_VDEVS 2
39*5113495bSYour Name #endif
40*5113495bSYour Name 
41*5113495bSYour Name #if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_MLO_MULTI_CHIP)
42*5113495bSYour Name /* Max bridge vdevs supported */
43*5113495bSYour Name #define WLAN_UMAC_MLO_MAX_BRIDGE_VDEVS 2
44*5113495bSYour Name /* Max number of PSOC taking part in topology decision at a time*/
45*5113495bSYour Name #define WLAN_UMAC_MLO_MAX_PSOC_TOPOLOGY 3
46*5113495bSYour Name #endif
47*5113495bSYour Name 
48*5113495bSYour Name #include <wlan_mlo_epcs.h>
49*5113495bSYour Name 
50*5113495bSYour Name /* MAX instances of ML devices */
51*5113495bSYour Name #ifndef WLAN_UMAC_MLO_MAX_DEV
52*5113495bSYour Name #define WLAN_UMAC_MLO_MAX_DEV 2
53*5113495bSYour Name #endif
54*5113495bSYour Name 
55*5113495bSYour Name /* MAX MLO Assoc Links per MLD */
56*5113495bSYour Name #ifndef WLAN_UMAC_MLO_ASSOC_MAX_SUPPORTED_LINKS
57*5113495bSYour Name #ifdef SAP_MULTI_LINK_EMULATION
58*5113495bSYour Name #define WLAN_UMAC_MLO_ASSOC_MAX_SUPPORTED_LINKS 2
59*5113495bSYour Name #else
60*5113495bSYour Name #define WLAN_UMAC_MLO_ASSOC_MAX_SUPPORTED_LINKS 1
61*5113495bSYour Name #endif
62*5113495bSYour Name #endif
63*5113495bSYour Name 
64*5113495bSYour Name 
65*5113495bSYour Name /* Default Initialization value for Max Recommended Simultaneous Links */
66*5113495bSYour Name #ifndef WLAN_UMAC_MLO_RECOM_MAX_SIMULT_LINKS_DEFAULT
67*5113495bSYour Name #define WLAN_UMAC_MLO_RECOM_MAX_SIMULT_LINKS_DEFAULT 2
68*5113495bSYour Name #endif
69*5113495bSYour Name 
70*5113495bSYour Name /* Max PEER support */
71*5113495bSYour Name #define MAX_MLO_PEER 512
72*5113495bSYour Name 
73*5113495bSYour Name struct mlo_mlme_ext_ops;
74*5113495bSYour Name struct mlo_osif_ext_ops;
75*5113495bSYour Name struct vdev_mlme_obj;
76*5113495bSYour Name struct wlan_t2lm_context;
77*5113495bSYour Name struct mlo_link_switch_context;
78*5113495bSYour Name struct wlan_mlo_link_switch_req;
79*5113495bSYour Name 
80*5113495bSYour Name /* Max LINK PEER support */
81*5113495bSYour Name #define MAX_MLO_LINK_PEERS WLAN_UMAC_MLO_MAX_VDEVS
82*5113495bSYour Name 
83*5113495bSYour Name /* MAX MLO peer_id supported by FW is 128 */
84*5113495bSYour Name #define MAX_MLO_PEER_ID 128
85*5113495bSYour Name #define MLO_INVALID_PEER_ID 0xFFFF
86*5113495bSYour Name 
87*5113495bSYour Name /* IE nomenclature */
88*5113495bSYour Name #define ID_POS 0
89*5113495bSYour Name #define TAG_LEN_POS 1
90*5113495bSYour Name #define IDEXT_POS 2
91*5113495bSYour Name #define MIN_IE_LEN 2
92*5113495bSYour Name #define MULTI_LINK_CTRL_1 3
93*5113495bSYour Name #define MULTI_LINK_CTRL_2 4
94*5113495bSYour Name #define STA_CTRL_1 2
95*5113495bSYour Name #define STA_CTRL_2 3
96*5113495bSYour Name #define STA_PROFILE_SUB_ELEM_ID 0
97*5113495bSYour Name #define PER_STA_PROF_MAC_ADDR_START 4
98*5113495bSYour Name 
99*5113495bSYour Name /* MLO link id max value */
100*5113495bSYour Name #define MAX_MLO_LINK_ID 15
101*5113495bSYour Name 
102*5113495bSYour Name #ifdef WLAN_MLO_MULTI_CHIP
103*5113495bSYour Name 
104*5113495bSYour Name #ifndef WLAN_MAX_MLO_GROUPS
105*5113495bSYour Name #define WLAN_MAX_MLO_GROUPS 2
106*5113495bSYour Name #endif
107*5113495bSYour Name 
108*5113495bSYour Name /**
109*5113495bSYour Name  * enum MLO_LINK_STATE - MLO link state enums
110*5113495bSYour Name  * @MLO_LINK_SETUP_INIT: MLO link SETUP exchange not yet done
111*5113495bSYour Name  * @MLO_LINK_SETUP_DONE: MLO link SETUP exchange started
112*5113495bSYour Name  * @MLO_LINK_READY: MLO link SETUP done and READY sent
113*5113495bSYour Name  * @MLO_LINK_TEARDOWN: MLO teardown done.
114*5113495bSYour Name  * @MLO_LINK_UNINITIALIZED: MLO link in blank state
115*5113495bSYour Name  */
116*5113495bSYour Name enum MLO_LINK_STATE {
117*5113495bSYour Name 	MLO_LINK_SETUP_INIT,
118*5113495bSYour Name 	MLO_LINK_SETUP_DONE,
119*5113495bSYour Name 	MLO_LINK_READY,
120*5113495bSYour Name 	MLO_LINK_TEARDOWN,
121*5113495bSYour Name 	MLO_LINK_UNINITIALIZED,
122*5113495bSYour Name };
123*5113495bSYour Name 
124*5113495bSYour Name /**
125*5113495bSYour Name  * enum MLO_SOC_LIST - MLO SOC LIST
126*5113495bSYour Name  * @WLAN_MLO_GROUP_DEFAULT_SOC_LIST:  All MLO SoCs that are part of this MLO
127*5113495bSYour Name  *                                    group, (inclusive of both setup sequence
128*5113495bSYour Name  *                                    completed, not yet completed)
129*5113495bSYour Name  * @WLAN_MLO_GROUP_CURRENT_SOC_LIST:  Current MLO SoCs that are probed for which
130*5113495bSYour Name  *                                    the setup sequence has been completed
131*5113495bSYour Name  */
132*5113495bSYour Name enum MLO_SOC_LIST {
133*5113495bSYour Name 	WLAN_MLO_GROUP_DEFAULT_SOC_LIST,
134*5113495bSYour Name 	WLAN_MLO_GROUP_CURRENT_SOC_LIST,
135*5113495bSYour Name };
136*5113495bSYour Name 
137*5113495bSYour Name /*
138*5113495bSYour Name  * Maximum number of MLO LINKS across the system,
139*5113495bSYour Name  * this is not the MLO links within and AP-MLD.
140*5113495bSYour Name  */
141*5113495bSYour Name 
142*5113495bSYour Name #define MAX_MLO_LINKS 6
143*5113495bSYour Name #define MAX_MLO_CHIPS 5
144*5113495bSYour Name #define MAX_ADJ_CHIPS 2
145*5113495bSYour Name 
146*5113495bSYour Name /* MLO Bridge link */
147*5113495bSYour Name #define MLO_NUM_CHIPS_FOR_BRIDGE_LINK 4
148*5113495bSYour Name #define MLO_MAX_BRIDGE_LINKS_PER_MLD 2
149*5113495bSYour Name #define MLO_MAX_BRIDGE_LINKS_PER_RADIO 8
150*5113495bSYour Name 
151*5113495bSYour Name /**
152*5113495bSYour Name  * struct mlo_chip_info: MLO chip info per link
153*5113495bSYour Name  * @info_valid: If the info here is valid or not
154*5113495bSYour Name  * @chip_id: Chip ID as assigned by platform
155*5113495bSYour Name  * @adj_chip_ids: Chip IDs of Adjacent chips
156*5113495bSYour Name  */
157*5113495bSYour Name struct mlo_chip_info {
158*5113495bSYour Name 	uint8_t info_valid;
159*5113495bSYour Name 	uint8_t chip_id[MAX_MLO_CHIPS];
160*5113495bSYour Name 	uint8_t adj_chip_ids[MAX_MLO_CHIPS][MAX_ADJ_CHIPS];
161*5113495bSYour Name };
162*5113495bSYour Name 
163*5113495bSYour Name #define START_STOP_INPROGRESS_BIT 0
164*5113495bSYour Name 
165*5113495bSYour Name /**
166*5113495bSYour Name  * struct mlo_setup_info: MLO setup status per link
167*5113495bSYour Name  * @ml_grp_id: Unique id for ML grouping of Pdevs/links
168*5113495bSYour Name  * @tot_socs: Total number of soc participating in ML group
169*5113495bSYour Name  * @num_soc: Number of soc ready or probed
170*5113495bSYour Name  * @tot_links: Total links in ML group
171*5113495bSYour Name  * @num_links: Number of links probed in ML group
172*5113495bSYour Name  * @pdev_list: current pdev pointers belonging to this group
173*5113495bSYour Name  * @curr_soc_list: current psoc pointers belonging to this group
174*5113495bSYour Name  * @soc_list: Actual psoc pointers part of this group
175*5113495bSYour Name  * @soc_id_list: list of soc ids part of this mlo group
176*5113495bSYour Name  * @state: MLO link state
177*5113495bSYour Name  * @valid_link_bitmap: valid MLO link bitmap
178*5113495bSYour Name  * @trigger_umac_reset: teardown require umac reset, for mode1 SSR
179*5113495bSYour Name  * @state_lock: lock to protect access to link state
180*5113495bSYour Name  * @event: event for teardown completion
181*5113495bSYour Name  * @start_stop_inprogress: MLO group start/stop in progress
182*5113495bSYour Name  * @dp_handle: pointer to DP ML context
183*5113495bSYour Name  * @chip_info: chip specific info of the soc
184*5113495bSYour Name  * @tsf_sync_enabled: MLO TSF sync is enabled at FW or not
185*5113495bSYour Name  * @wsi_stats_info_support: WSI stats support at FW or not
186*5113495bSYour Name  */
187*5113495bSYour Name struct mlo_setup_info {
188*5113495bSYour Name 	uint8_t ml_grp_id;
189*5113495bSYour Name 	uint8_t tot_socs;
190*5113495bSYour Name 	uint8_t num_soc;
191*5113495bSYour Name 	uint8_t tot_links;
192*5113495bSYour Name 	uint8_t num_links;
193*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev_list[MAX_MLO_LINKS];
194*5113495bSYour Name 	struct wlan_objmgr_psoc *curr_soc_list[MAX_MLO_CHIPS];
195*5113495bSYour Name 	struct wlan_objmgr_psoc *soc_list[MAX_MLO_CHIPS];
196*5113495bSYour Name 	uint8_t soc_id_list[MAX_MLO_CHIPS];
197*5113495bSYour Name 	enum MLO_LINK_STATE state[MAX_MLO_LINKS];
198*5113495bSYour Name 	uint16_t valid_link_bitmap;
199*5113495bSYour Name 	bool trigger_umac_reset;
200*5113495bSYour Name 	qdf_spinlock_t state_lock;
201*5113495bSYour Name 	qdf_event_t event;
202*5113495bSYour Name 	unsigned long start_stop_inprogress;
203*5113495bSYour Name 	struct cdp_mlo_ctxt *dp_handle;
204*5113495bSYour Name 	struct mlo_chip_info chip_info;
205*5113495bSYour Name 	bool tsf_sync_enabled;
206*5113495bSYour Name 	uint8_t wsi_stats_info_support;
207*5113495bSYour Name };
208*5113495bSYour Name 
209*5113495bSYour Name /**
210*5113495bSYour Name  * struct mlo_state_params: MLO state params for pdev iteration
211*5113495bSYour Name  * @link_state_fail: Flag to check when pdev not in expected state
212*5113495bSYour Name  * @check_state: State on against which pdev is to be expected
213*5113495bSYour Name  * @grp_id: Id of the required MLO Group
214*5113495bSYour Name  */
215*5113495bSYour Name struct mlo_state_params {
216*5113495bSYour Name 	bool link_state_fail;
217*5113495bSYour Name 	enum MLO_LINK_STATE check_state;
218*5113495bSYour Name 	uint8_t grp_id;
219*5113495bSYour Name };
220*5113495bSYour Name 
221*5113495bSYour Name #endif
222*5113495bSYour Name 
223*5113495bSYour Name /**
224*5113495bSYour Name  * enum wlan_mlo_link_switch_notify_reason - Enum for link switch notifier
225*5113495bSYour Name  *                                           callback trigger reason.
226*5113495bSYour Name  * @MLO_LINK_SWITCH_NOTIFY_REASON_PRE_START_PRE_SER: Prior to start of
227*5113495bSYour Name  *                                                   link switch and prior to
228*5113495bSYour Name  *                                                   serializing link switch.
229*5113495bSYour Name  * @MLO_LINK_SWITCH_NOTIFY_REASON_PRE_START_POST_SER: Prior to link switch start
230*5113495bSYour Name  *                                                    but link switch is
231*5113495bSYour Name  *                                                    serialized
232*5113495bSYour Name  * @MLO_LINK_SWITCH_NOTIFY_REASON_STOP_FAILURE: Link switch failure notify
233*5113495bSYour Name  * @MLO_LINK_SWITCH_NOTIFY_REASON_STOP_SUCCESS: Link switch success notify
234*5113495bSYour Name  */
235*5113495bSYour Name enum wlan_mlo_link_switch_notify_reason {
236*5113495bSYour Name 	MLO_LINK_SWITCH_NOTIFY_REASON_PRE_START_PRE_SER,
237*5113495bSYour Name 	MLO_LINK_SWITCH_NOTIFY_REASON_PRE_START_POST_SER,
238*5113495bSYour Name 	MLO_LINK_SWITCH_NOTIFY_REASON_STOP_FAILURE,
239*5113495bSYour Name 	MLO_LINK_SWITCH_NOTIFY_REASON_STOP_SUCCESS,
240*5113495bSYour Name };
241*5113495bSYour Name 
242*5113495bSYour Name typedef QDF_STATUS
243*5113495bSYour Name (*mlo_mgr_link_switch_notifier_cb)(struct wlan_objmgr_vdev *vdev,
244*5113495bSYour Name 				   struct wlan_mlo_link_switch_req *lswitch_req,
245*5113495bSYour Name 				   enum wlan_mlo_link_switch_notify_reason notify_reason);
246*5113495bSYour Name 
247*5113495bSYour Name #ifdef WLAN_FEATURE_11BE_MLO_ADV_FEATURE
248*5113495bSYour Name /*
249*5113495bSYour Name  * struct wlan_mlo_link_switch_notifier - Link switch notifier callbacks
250*5113495bSYour Name  * @in_use: Set to true on successful notifier callback registration
251*5113495bSYour Name  * @cb: Callback to notify link switch start
252*5113495bSYour Name  */
253*5113495bSYour Name struct wlan_mlo_link_switch_notifier {
254*5113495bSYour Name 	bool in_use;
255*5113495bSYour Name 	mlo_mgr_link_switch_notifier_cb cb;
256*5113495bSYour Name };
257*5113495bSYour Name 
258*5113495bSYour Name /**
259*5113495bSYour Name  * mlo_mgr_register_link_switch_notifier() - API to register link switch
260*5113495bSYour Name  * start notifier callback
261*5113495bSYour Name  * @comp_id: Component requesting notification on link switch start
262*5113495bSYour Name  * @cb: Callback to register.
263*5113495bSYour Name  *
264*5113495bSYour Name  * The @cb will be triggered on start of link switch with params of the
265*5113495bSYour Name  * link switch.
266*5113495bSYour Name  *
267*5113495bSYour Name  * Return: QDF_STATUS
268*5113495bSYour Name  */
269*5113495bSYour Name QDF_STATUS
270*5113495bSYour Name mlo_mgr_register_link_switch_notifier(enum wlan_umac_comp_id comp_id,
271*5113495bSYour Name 				      mlo_mgr_link_switch_notifier_cb cb);
272*5113495bSYour Name 
273*5113495bSYour Name /**
274*5113495bSYour Name  * mlo_mgr_unregister_link_switch_notifier() - API to unregister link switch
275*5113495bSYour Name  * notifier callback.
276*5113495bSYour Name  * @comp_id: Component to deregister.
277*5113495bSYour Name  *
278*5113495bSYour Name  * The API will cleanup the notification callback registered for link switch.
279*5113495bSYour Name  *
280*5113495bSYour Name  * Return: QDF_STATUS
281*5113495bSYour Name  */
282*5113495bSYour Name QDF_STATUS
283*5113495bSYour Name mlo_mgr_unregister_link_switch_notifier(enum wlan_umac_comp_id comp_id);
284*5113495bSYour Name #else
285*5113495bSYour Name static inline QDF_STATUS
mlo_mgr_register_link_switch_notifier(enum wlan_umac_comp_id comp_id,mlo_mgr_link_switch_notifier_cb cb)286*5113495bSYour Name mlo_mgr_register_link_switch_notifier(enum wlan_umac_comp_id comp_id,
287*5113495bSYour Name 				      mlo_mgr_link_switch_notifier_cb cb)
288*5113495bSYour Name {
289*5113495bSYour Name 	return QDF_STATUS_E_NOSUPPORT;
290*5113495bSYour Name }
291*5113495bSYour Name 
292*5113495bSYour Name static inline QDF_STATUS
mlo_mgr_unregister_link_switch_notifier(enum wlan_umac_comp_id comp_id)293*5113495bSYour Name mlo_mgr_unregister_link_switch_notifier(enum wlan_umac_comp_id comp_id)
294*5113495bSYour Name {
295*5113495bSYour Name 	return QDF_STATUS_E_NOSUPPORT;
296*5113495bSYour Name }
297*5113495bSYour Name #endif /* WLAN_FEATURE_11BE_MLO_ADV_FEATURE */
298*5113495bSYour Name 
299*5113495bSYour Name /*
300*5113495bSYour Name  * struct mlo_wsi_link_stats - MLO ingress/egress counters of PSOC
301*5113495bSYour Name  * @ingress_cnt:  Ingress counter
302*5113495bSYour Name  * @egress_cnt:  Egress counter
303*5113495bSYour Name  * @send_wmi_cmd: To indicate whether WMI command to be sent or not
304*5113495bSYour Name  */
305*5113495bSYour Name struct mlo_wsi_link_stats {
306*5113495bSYour Name 	uint32_t ingress_cnt;
307*5113495bSYour Name 	uint32_t egress_cnt;
308*5113495bSYour Name 	bool  send_wmi_cmd;
309*5113495bSYour Name };
310*5113495bSYour Name 
311*5113495bSYour Name /*
312*5113495bSYour Name  * struct mlo_wsi_psoc_grp - MLO WSI PSOC group
313*5113495bSYour Name  * @psoc_order:  PSOC list in WSI loop order
314*5113495bSYour Name  * @num_psoc: num psoc in the group
315*5113495bSYour Name  */
316*5113495bSYour Name struct mlo_wsi_psoc_grp {
317*5113495bSYour Name 	uint32_t psoc_order[WLAN_OBJMGR_MAX_DEVICES];
318*5113495bSYour Name 	uint32_t num_psoc;
319*5113495bSYour Name };
320*5113495bSYour Name 
321*5113495bSYour Name #define MLO_WSI_MAX_MLO_GRPS 2
322*5113495bSYour Name #define MLO_WSI_PSOC_ID_MAX 0xFF
323*5113495bSYour Name 
324*5113495bSYour Name /*
325*5113495bSYour Name  * struct mlo_wsi_info - MLO ingress/egress link context per-PSOC
326*5113495bSYour Name  * @mlo_psoc_grp: PSOC IDs for different MLO groups
327*5113495bSYour Name  * @num_psoc: Total num psoc
328*5113495bSYour Name  * @link_stats: Ingress and Egress counts for PSOCs
329*5113495bSYour Name  * @block_wmi_cmd: Blocks WMI command
330*5113495bSYour Name  */
331*5113495bSYour Name struct mlo_wsi_info {
332*5113495bSYour Name 	struct mlo_wsi_psoc_grp mlo_psoc_grp[MLO_WSI_MAX_MLO_GRPS];
333*5113495bSYour Name 	uint32_t num_psoc;
334*5113495bSYour Name 	struct mlo_wsi_link_stats link_stats[WLAN_OBJMGR_MAX_DEVICES];
335*5113495bSYour Name 	uint8_t block_wmi_cmd;
336*5113495bSYour Name };
337*5113495bSYour Name 
338*5113495bSYour Name /**
339*5113495bSYour Name  * struct mlo_mgr_context - MLO manager context
340*5113495bSYour Name  * @ml_dev_list_lock: ML DEV list lock
341*5113495bSYour Name  * @aid_lock: AID global lock
342*5113495bSYour Name  * @ml_peerid_lock: ML peer ID global lock
343*5113495bSYour Name  * @ml_dev_list: Array of MLO device context
344*5113495bSYour Name  * @mlo_peer_id_bmap: bitmap to allocate MLO Peer ID
345*5113495bSYour Name  * @max_mlo_peer_id: Max MLO Peer ID
346*5113495bSYour Name  * @last_mlo_peer_id: Previously allocated ML peer ID
347*5113495bSYour Name  * @setup_info: Pointer to MLO setup_info of all groups
348*5113495bSYour Name  * @total_grp: Total number of MLO groups
349*5113495bSYour Name  * @mlme_ops: MLO MLME callback function pointers
350*5113495bSYour Name  * @osif_ops: MLO to OSIF callback function pointers
351*5113495bSYour Name  * @msgq_ctx: Context switch mgr
352*5113495bSYour Name  * @mlo_is_force_primary_umac: Force Primary UMAC enable
353*5113495bSYour Name  * @mlo_forced_primary_umac_id: Force Primary UMAC ID
354*5113495bSYour Name  * @force_non_assoc_prim_umac: Force non-assoc link to be primary umac
355*5113495bSYour Name  * @lswitch_notifier: Link switch notifier callbacks
356*5113495bSYour Name  * @wsi_info: WSI stats info
357*5113495bSYour Name  * @disable_eml: Disable Enhanced Multi Link features(eMLSR and eMLMR).
358*5113495bSYour Name  */
359*5113495bSYour Name struct mlo_mgr_context {
360*5113495bSYour Name #ifdef WLAN_MLO_USE_SPINLOCK
361*5113495bSYour Name 	qdf_spinlock_t ml_dev_list_lock;
362*5113495bSYour Name 	qdf_spinlock_t aid_lock;
363*5113495bSYour Name 	qdf_spinlock_t ml_peerid_lock;
364*5113495bSYour Name #else
365*5113495bSYour Name 	qdf_mutex_t ml_dev_list_lock;
366*5113495bSYour Name 	qdf_mutex_t aid_lock;
367*5113495bSYour Name 	qdf_mutex_t ml_peerid_lock;
368*5113495bSYour Name #endif
369*5113495bSYour Name 	qdf_list_t ml_dev_list;
370*5113495bSYour Name 	qdf_bitmap(mlo_peer_id_bmap, MAX_MLO_PEER_ID);
371*5113495bSYour Name 	uint16_t max_mlo_peer_id;
372*5113495bSYour Name 	uint16_t last_mlo_peer_id;
373*5113495bSYour Name #ifdef WLAN_MLO_MULTI_CHIP
374*5113495bSYour Name 	struct mlo_setup_info *setup_info;
375*5113495bSYour Name 	uint8_t total_grp;
376*5113495bSYour Name #endif
377*5113495bSYour Name 	struct mlo_mlme_ext_ops *mlme_ops;
378*5113495bSYour Name #ifdef WLAN_FEATURE_11BE_MLO_ADV_FEATURE
379*5113495bSYour Name 	struct mlo_osif_ext_ops *osif_ops;
380*5113495bSYour Name #endif
381*5113495bSYour Name 	struct ctxt_switch_mgr *msgq_ctx;
382*5113495bSYour Name 	bool mlo_is_force_primary_umac;
383*5113495bSYour Name 	uint8_t mlo_forced_primary_umac_id;
384*5113495bSYour Name 	bool force_non_assoc_prim_umac;
385*5113495bSYour Name #ifdef WLAN_FEATURE_11BE_MLO_ADV_FEATURE
386*5113495bSYour Name 	struct wlan_mlo_link_switch_notifier lswitch_notifier[WLAN_UMAC_COMP_ID_MAX];
387*5113495bSYour Name #endif /* WLAN_FEATURE_11BE_MLO_ADV_FEATURE */
388*5113495bSYour Name 	struct mlo_wsi_info *wsi_info;
389*5113495bSYour Name 	bool disable_eml;
390*5113495bSYour Name };
391*5113495bSYour Name 
392*5113495bSYour Name /**
393*5113495bSYour Name  * struct wlan_ml_vdev_aid_mgr - ML AID manager
394*5113495bSYour Name  * @aid_bitmap: AID bitmap array
395*5113495bSYour Name  * @start_aid: start of AID index
396*5113495bSYour Name  * @max_aid: Max allowed AID
397*5113495bSYour Name  * @aid_mgr:  Array of link vdev aid mgr
398*5113495bSYour Name  */
399*5113495bSYour Name struct wlan_ml_vdev_aid_mgr {
400*5113495bSYour Name 	qdf_bitmap(aid_bitmap, WLAN_UMAC_MAX_AID);
401*5113495bSYour Name 	uint16_t start_aid;
402*5113495bSYour Name 	uint16_t max_aid;
403*5113495bSYour Name 	struct wlan_vdev_aid_mgr *aid_mgr[WLAN_UMAC_MLO_MAX_VDEVS];
404*5113495bSYour Name };
405*5113495bSYour Name 
406*5113495bSYour Name /**
407*5113495bSYour Name  * struct wlan_mlo_key_mgmt - MLO key management
408*5113495bSYour Name  * @keys_saved: keys saved bool
409*5113495bSYour Name  * @link_id: link id
410*5113495bSYour Name  */
411*5113495bSYour Name struct wlan_mlo_key_mgmt {
412*5113495bSYour Name 	bool keys_saved;
413*5113495bSYour Name 	uint8_t link_id;
414*5113495bSYour Name };
415*5113495bSYour Name 
416*5113495bSYour Name /**
417*5113495bSYour Name  * struct mlo_link_bss_params - link bss param
418*5113495bSYour Name  * @link_id: link id
419*5113495bSYour Name  * @ap_mld_mac: mld mac address
420*5113495bSYour Name  * @chan: channel
421*5113495bSYour Name  */
422*5113495bSYour Name struct mlo_link_bss_params {
423*5113495bSYour Name 	int8_t link_id;
424*5113495bSYour Name 	int8_t ap_mld_mac[QDF_MAC_ADDR_SIZE];
425*5113495bSYour Name 	struct wlan_channel *chan;
426*5113495bSYour Name };
427*5113495bSYour Name 
428*5113495bSYour Name #ifdef WLAN_FEATURE_11BE_MLO
429*5113495bSYour Name 
430*5113495bSYour Name /**
431*5113495bSYour Name  * enum mlo_link_info_event_status - link info event status
432*5113495bSYour Name  * @WLAN_LINK_INFO_EVENT_SUCCESS: success
433*5113495bSYour Name  * @WLAN_LINK_INFO_EVENT_REJECT_FAILURE: reject due to common failure reason
434*5113495bSYour Name  * @WLAN_LINK_INFO_EVENT_REJECT_VDEV_NOT_UP: reject as vdev is not up
435*5113495bSYour Name  * @WLAN_LINK_INFO_EVENT_REJECT_ROAMING_IN_PROGRESS: reject as roaming
436*5113495bSYour Name  *						     is in progress
437*5113495bSYour Name  * @WLAN_LINK_INFO_EVENT_REJECT_NON_MLO_CONNECTION: reject as it's not
438*5113495bSYour Name  *						    MLO connection
439*5113495bSYour Name  */
440*5113495bSYour Name enum mlo_link_info_event_status {
441*5113495bSYour Name 	WLAN_LINK_INFO_EVENT_SUCCESS,
442*5113495bSYour Name 	WLAN_LINK_INFO_EVENT_REJECT_FAILURE,
443*5113495bSYour Name 	WLAN_LINK_INFO_EVENT_REJECT_VDEV_NOT_UP,
444*5113495bSYour Name 	WLAN_LINK_INFO_EVENT_REJECT_ROAMING_IN_PROGRESS,
445*5113495bSYour Name 	WLAN_LINK_INFO_EVENT_REJECT_NON_MLO_CONNECTION,
446*5113495bSYour Name };
447*5113495bSYour Name 
448*5113495bSYour Name /**
449*5113495bSYour Name  * struct mlo_link_state_cmd_params - MLO link state params
450*5113495bSYour Name  * @vdev_id: Vdev id
451*5113495bSYour Name  * @mld_mac: mld mac address
452*5113495bSYour Name  */
453*5113495bSYour Name struct mlo_link_state_cmd_params {
454*5113495bSYour Name 	uint8_t vdev_id;
455*5113495bSYour Name 	uint8_t mld_mac[QDF_MAC_ADDR_SIZE];
456*5113495bSYour Name };
457*5113495bSYour Name 
458*5113495bSYour Name /**
459*5113495bSYour Name  * struct ml_link_info - ml link information
460*5113495bSYour Name  * @vdev_id: vdev id for this link
461*5113495bSYour Name  * @link_id: link id defined as in 802.11 BE spec.
462*5113495bSYour Name  * @link_status: inactive 0, active 1
463*5113495bSYour Name  * @reserved: reserved bits
464*5113495bSYour Name  * @chan_freq: Channel frequency in MHz
465*5113495bSYour Name  */
466*5113495bSYour Name struct ml_link_info {
467*5113495bSYour Name 	uint32_t vdev_id:8,
468*5113495bSYour Name 		 link_id:8,
469*5113495bSYour Name 		 link_status:2,
470*5113495bSYour Name 		 reserved:14;
471*5113495bSYour Name 	uint32_t chan_freq;
472*5113495bSYour Name };
473*5113495bSYour Name 
474*5113495bSYour Name /**
475*5113495bSYour Name  * struct ml_link_state_info_event - ML link state info response
476*5113495bSYour Name  * @status: to indicate the status for ml link info
477*5113495bSYour Name  * @hw_mode_index: current hardware mode index
478*5113495bSYour Name  * @link_info: link information
479*5113495bSYour Name  * @num_mlo_vdev_link_info: number of mlo vdev link info
480*5113495bSYour Name  * @vdev_id: vdev_id
481*5113495bSYour Name  * @mldaddr: mld addr
482*5113495bSYour Name  */
483*5113495bSYour Name struct ml_link_state_info_event {
484*5113495bSYour Name 	uint32_t status;
485*5113495bSYour Name 	uint32_t hw_mode_index;
486*5113495bSYour Name 	struct ml_link_info link_info[WLAN_MAX_ML_BSS_LINKS];
487*5113495bSYour Name 	uint16_t num_mlo_vdev_link_info;
488*5113495bSYour Name 	uint8_t vdev_id;
489*5113495bSYour Name 	struct qdf_mac_addr mldaddr;
490*5113495bSYour Name };
491*5113495bSYour Name 
492*5113495bSYour Name /**
493*5113495bSYour Name  * struct ml_link_state_cmd_info - ml link state command info
494*5113495bSYour Name  * @request_cookie: request cookie
495*5113495bSYour Name  * @ml_link_state_resp_cb: callback function to handle response
496*5113495bSYour Name  * @ml_link_state_req_context: request context
497*5113495bSYour Name  */
498*5113495bSYour Name struct ml_link_state_cmd_info {
499*5113495bSYour Name 	void *request_cookie;
500*5113495bSYour Name 	void (*ml_link_state_resp_cb)(struct ml_link_state_info_event *ev,
501*5113495bSYour Name 				      void *cookie);
502*5113495bSYour Name 	void *ml_link_state_req_context;
503*5113495bSYour Name };
504*5113495bSYour Name #endif
505*5113495bSYour Name /**
506*5113495bSYour Name  * struct mlo_sta_csa_params - CSA request parameters in mlo mgr
507*5113495bSYour Name  * @csa_param: csa parameters
508*5113495bSYour Name  * @link_id: the link index of AP which triggers CSA
509*5113495bSYour Name  * @mlo_csa_synced: Before vdev is up, csa information is only saved but not
510*5113495bSYour Name  *                  handled, and this value is false. Once vdev is up, the saved
511*5113495bSYour Name  *                  csa information is handled, and this value is changed to
512*5113495bSYour Name  *                  true. Note this value will be true if the vdev is doing
513*5113495bSYour Name  *                  restart.
514*5113495bSYour Name  * @csa_offload_event_recvd: True if WMI_CSA_HANDLING_EVENTID is already
515*5113495bSYour Name  *                           received. False if this is the first
516*5113495bSYour Name  *                           WMI_CSA_HANDLING_EVENTID.
517*5113495bSYour Name  * @valid_csa_param: True once csa_param is filled.
518*5113495bSYour Name  */
519*5113495bSYour Name struct mlo_sta_csa_params {
520*5113495bSYour Name 	struct csa_offload_params csa_param;
521*5113495bSYour Name 	uint8_t link_id;
522*5113495bSYour Name 	bool mlo_csa_synced;
523*5113495bSYour Name 	bool csa_offload_event_recvd;
524*5113495bSYour Name 	bool valid_csa_param;
525*5113495bSYour Name };
526*5113495bSYour Name 
527*5113495bSYour Name /**
528*5113495bSYour Name  * struct mlo_sta_cu_params - critical update parameters in mlo mgr
529*5113495bSYour Name  * @vdev_id: vdev id
530*5113495bSYour Name  * @bpcc: bss parameter change count
531*5113495bSYour Name  * @initialized: flag about the parameter is valid or not
532*5113495bSYour Name  */
533*5113495bSYour Name struct mlo_sta_cu_params {
534*5113495bSYour Name 	uint8_t vdev_id;
535*5113495bSYour Name 	uint8_t bpcc;
536*5113495bSYour Name 	bool initialized;
537*5113495bSYour Name };
538*5113495bSYour Name 
539*5113495bSYour Name /**
540*5113495bSYour Name  * struct mlo_sta_quiet_status - MLO sta quiet status
541*5113495bSYour Name  * @link_id: link id
542*5113495bSYour Name  * @quiet_status: true if corresponding ap in quiet status
543*5113495bSYour Name  * @valid_status: true if mlo_sta_quiet_status is filled
544*5113495bSYour Name  */
545*5113495bSYour Name struct mlo_sta_quiet_status {
546*5113495bSYour Name 	uint8_t link_id;
547*5113495bSYour Name 	bool quiet_status;
548*5113495bSYour Name 	bool valid_status;
549*5113495bSYour Name };
550*5113495bSYour Name 
551*5113495bSYour Name /**
552*5113495bSYour Name  * enum mlo_link_force_mode: MLO link force modes
553*5113495bSYour Name  * @MLO_LINK_FORCE_MODE_ACTIVE:
554*5113495bSYour Name  *  Force specific links active
555*5113495bSYour Name  * @MLO_LINK_FORCE_MODE_INACTIVE:
556*5113495bSYour Name  *  Force specific links inactive
557*5113495bSYour Name  * @MLO_LINK_FORCE_MODE_ACTIVE_NUM:
558*5113495bSYour Name  *  Force active a number of links, firmware to decide which links to inactive
559*5113495bSYour Name  * @MLO_LINK_FORCE_MODE_INACTIVE_NUM:
560*5113495bSYour Name  *  Force inactive a number of links, firmware to decide which links to inactive
561*5113495bSYour Name  * @MLO_LINK_FORCE_MODE_NO_FORCE:
562*5113495bSYour Name  *  Cancel the force operation of specific links, allow firmware to decide
563*5113495bSYour Name  * @MLO_LINK_FORCE_MODE_ACTIVE_INACTIVE: Force specific links active and
564*5113495bSYour Name  *  force specific links inactive
565*5113495bSYour Name  */
566*5113495bSYour Name enum mlo_link_force_mode {
567*5113495bSYour Name 	MLO_LINK_FORCE_MODE_ACTIVE       = 1,
568*5113495bSYour Name 	MLO_LINK_FORCE_MODE_INACTIVE     = 2,
569*5113495bSYour Name 	MLO_LINK_FORCE_MODE_ACTIVE_NUM   = 3,
570*5113495bSYour Name 	MLO_LINK_FORCE_MODE_INACTIVE_NUM = 4,
571*5113495bSYour Name 	MLO_LINK_FORCE_MODE_NO_FORCE     = 5,
572*5113495bSYour Name 	MLO_LINK_FORCE_MODE_ACTIVE_INACTIVE = 6,
573*5113495bSYour Name };
574*5113495bSYour Name 
575*5113495bSYour Name /**
576*5113495bSYour Name  * enum mlo_link_force_reason: MLO link force reasons
577*5113495bSYour Name  * @MLO_LINK_FORCE_REASON_CONNECT:
578*5113495bSYour Name  *  Set force specific links because of new connection
579*5113495bSYour Name  * @MLO_LINK_FORCE_REASON_DISCONNECT:
580*5113495bSYour Name  *  Set force specific links because of new dis-connection
581*5113495bSYour Name  * @MLO_LINK_FORCE_REASON_LINK_REMOVAL:
582*5113495bSYour Name  *  Set force specific links because of AP side link removal
583*5113495bSYour Name  * @MLO_LINK_FORCE_REASON_TDLS:
584*5113495bSYour Name  *  Set force specific links because of TDLS operation
585*5113495bSYour Name  */
586*5113495bSYour Name enum mlo_link_force_reason {
587*5113495bSYour Name 	MLO_LINK_FORCE_REASON_CONNECT    = 1,
588*5113495bSYour Name 	MLO_LINK_FORCE_REASON_DISCONNECT = 2,
589*5113495bSYour Name 	MLO_LINK_FORCE_REASON_LINK_REMOVAL = 3,
590*5113495bSYour Name 	MLO_LINK_FORCE_REASON_TDLS = 4,
591*5113495bSYour Name };
592*5113495bSYour Name 
593*5113495bSYour Name /**
594*5113495bSYour Name  * enum set_link_source - set link source
595*5113495bSYour Name  * @SET_LINK_FROM_CONCURRENCY: concurrent connection request
596*5113495bSYour Name  * @SET_LINK_FROM_VENDOR_CMD: vendor command request
597*5113495bSYour Name  * @SET_LINK_FROM_TDLS: tdls command request
598*5113495bSYour Name  * @SET_LINK_SOURCE_MAX: max num of source
599*5113495bSYour Name  */
600*5113495bSYour Name enum set_link_source {
601*5113495bSYour Name 	SET_LINK_FROM_CONCURRENCY = 0,
602*5113495bSYour Name 	SET_LINK_FROM_VENDOR_CMD = 1,
603*5113495bSYour Name 	SET_LINK_FROM_TDLS = 2,
604*5113495bSYour Name 	SET_LINK_SOURCE_MAX,
605*5113495bSYour Name };
606*5113495bSYour Name 
607*5113495bSYour Name /**
608*5113495bSYour Name  * struct set_link_req - set link request
609*5113495bSYour Name  * @mode: set link mode
610*5113495bSYour Name  * @reason: reason of set link
611*5113495bSYour Name  * @force_active_bitmap: force active link bitmap
612*5113495bSYour Name  * @force_inactive_bitmap: force inactive link bitmap
613*5113495bSYour Name  * @force_active_num: force active link num
614*5113495bSYour Name  * @force_active_num_bitmap: force active num link bitmap
615*5113495bSYour Name  * @force_inactive_num: force inactive link num
616*5113495bSYour Name  * @force_inactive_num_bitmap: force inactive num link bitmap
617*5113495bSYour Name  */
618*5113495bSYour Name struct set_link_req {
619*5113495bSYour Name 	enum mlo_link_force_mode mode;
620*5113495bSYour Name 	enum mlo_link_force_reason reason;
621*5113495bSYour Name 	uint16_t force_active_bitmap;
622*5113495bSYour Name 	uint16_t force_inactive_bitmap;
623*5113495bSYour Name 	uint8_t force_active_num;
624*5113495bSYour Name 	uint16_t force_active_num_bitmap;
625*5113495bSYour Name 	uint8_t force_inactive_num;
626*5113495bSYour Name 	uint16_t force_inactive_num_bitmap;
627*5113495bSYour Name };
628*5113495bSYour Name 
629*5113495bSYour Name /**
630*5113495bSYour Name  * struct ml_link_force_state - link force state.
631*5113495bSYour Name  * @force_active_bitmap: force active link bitmap
632*5113495bSYour Name  * @force_inactive_bitmap: force inactive link bitmap
633*5113495bSYour Name  * @force_active_num: force active link num
634*5113495bSYour Name  * @force_active_num_bitmap: force active num link bitmap
635*5113495bSYour Name  * @force_inactive_num: force inactive link num
636*5113495bSYour Name  * @force_inactive_num_bitmap: force inactive num link bitmap
637*5113495bSYour Name  * @curr_dynamic_inactive_bitmap: dynamic inactive link bitmap
638*5113495bSYour Name  * @curr_active_bitmap: current active link bitmap
639*5113495bSYour Name  * @curr_inactive_bitmap: current inactive link bitmap
640*5113495bSYour Name  */
641*5113495bSYour Name struct ml_link_force_state {
642*5113495bSYour Name 	uint16_t force_active_bitmap;
643*5113495bSYour Name 	uint16_t force_inactive_bitmap;
644*5113495bSYour Name 	uint8_t force_active_num;
645*5113495bSYour Name 	uint16_t force_active_num_bitmap;
646*5113495bSYour Name 	uint8_t force_inactive_num;
647*5113495bSYour Name 	uint16_t force_inactive_num_bitmap;
648*5113495bSYour Name 	uint16_t curr_dynamic_inactive_bitmap;
649*5113495bSYour Name 	uint16_t curr_active_bitmap;
650*5113495bSYour Name 	uint16_t curr_inactive_bitmap;
651*5113495bSYour Name };
652*5113495bSYour Name 
653*5113495bSYour Name /**
654*5113495bSYour Name  * struct wlan_link_force_context - link force ctx.
655*5113495bSYour Name  * @force_state: current force active/inactive states which
656*5113495bSYour Name  * have been sent to target
657*5113495bSYour Name  * @reqs: request of set link
658*5113495bSYour Name  */
659*5113495bSYour Name struct wlan_link_force_context {
660*5113495bSYour Name 	struct ml_link_force_state force_state;
661*5113495bSYour Name 	struct set_link_req reqs[SET_LINK_SOURCE_MAX];
662*5113495bSYour Name };
663*5113495bSYour Name 
664*5113495bSYour Name #if defined(UMAC_SUPPORT_MLNAWDS) || defined(MESH_MODE_SUPPORT)
665*5113495bSYour Name /**
666*5113495bSYour Name  * struct mlnawds_config - MLO NAWDS configuration
667*5113495bSYour Name  * @caps: Bandwidth & NSS capabilities to be configured on NAWDS peer
668*5113495bSYour Name  * @puncture_bitmap: puncture bitmap to be configured on NAWDS peer
669*5113495bSYour Name  * @mac: MAC address of the NAWDS peer to which the caps & puncture bitmap is
670*5113495bSYour Name  * to be configured.
671*5113495bSYour Name  */
672*5113495bSYour Name struct mlnawds_config {
673*5113495bSYour Name 	uint64_t caps;
674*5113495bSYour Name 	uint16_t puncture_bitmap;
675*5113495bSYour Name 	uint8_t  mac[QDF_MAC_ADDR_SIZE];
676*5113495bSYour Name };
677*5113495bSYour Name #endif
678*5113495bSYour Name 
679*5113495bSYour Name /* AP removed link flag bit position for link_status_flags in
680*5113495bSYour Name  * struct mlo_link_info
681*5113495bSYour Name  */
682*5113495bSYour Name #define LS_F_AP_REMOVAL_BIT 0
683*5113495bSYour Name 
684*5113495bSYour Name /**
685*5113495bSYour Name  * struct mlo_link_info - ML link info
686*5113495bSYour Name  * @link_addr: link mac address
687*5113495bSYour Name  * @link_id: link index
688*5113495bSYour Name  * @is_bridge : Bridge peer or not
689*5113495bSYour Name  * @chan_freq: Operating channel frequency
690*5113495bSYour Name  * @nawds_config: peer's NAWDS configurarion
691*5113495bSYour Name  * @vdev_id: VDEV ID
692*5113495bSYour Name  * @mesh_config: peer's MESH configurarion
693*5113495bSYour Name  * @link_status_flags: Current status of link
694*5113495bSYour Name  * @ap_link_addr: Associated link BSSID
695*5113495bSYour Name  * @link_chan_info: Associated link channel info
696*5113495bSYour Name  * @is_link_active: link state
697*5113495bSYour Name  */
698*5113495bSYour Name struct mlo_link_info {
699*5113495bSYour Name 	struct qdf_mac_addr link_addr;
700*5113495bSYour Name 	uint8_t link_id;
701*5113495bSYour Name 	bool is_bridge;
702*5113495bSYour Name 	uint16_t chan_freq;
703*5113495bSYour Name #ifdef UMAC_SUPPORT_MLNAWDS
704*5113495bSYour Name 	struct mlnawds_config nawds_config;
705*5113495bSYour Name #endif
706*5113495bSYour Name 	uint8_t vdev_id;
707*5113495bSYour Name #ifdef MESH_MODE_SUPPORT
708*5113495bSYour Name 	struct mlnawds_config mesh_config;
709*5113495bSYour Name #endif
710*5113495bSYour Name #ifdef WLAN_FEATURE_11BE_MLO_ADV_FEATURE
711*5113495bSYour Name 	unsigned long link_status_flags;
712*5113495bSYour Name 	struct qdf_mac_addr ap_link_addr;
713*5113495bSYour Name 	struct wlan_channel *link_chan_info;
714*5113495bSYour Name #endif
715*5113495bSYour Name 	bool is_link_active;
716*5113495bSYour Name };
717*5113495bSYour Name 
718*5113495bSYour Name /**
719*5113495bSYour Name  * struct mlo_nstr_info - MLO NSTR capability info
720*5113495bSYour Name  * @link_id: Lind Id
721*5113495bSYour Name  * @nstr_lp_present: Flag for NSTR link pair presence
722*5113495bSYour Name  * @nstr_bmp_size: NSTR Bitmap Size
723*5113495bSYour Name  * @nstr_lp_bitmap: NSTR link pair bitmap of link_id
724*5113495bSYour Name  */
725*5113495bSYour Name struct mlo_nstr_info {
726*5113495bSYour Name 	uint8_t link_id;
727*5113495bSYour Name 	bool nstr_lp_present;
728*5113495bSYour Name 	uint8_t nstr_bmp_size;
729*5113495bSYour Name 	uint16_t nstr_lp_bitmap;
730*5113495bSYour Name };
731*5113495bSYour Name 
732*5113495bSYour Name #ifndef WLAN_MAX_ML_BSS_LINKS
733*5113495bSYour Name #define WLAN_MAX_ML_BSS_LINKS WLAN_UMAC_MLO_MAX_VDEVS
734*5113495bSYour Name #endif
735*5113495bSYour Name 
736*5113495bSYour Name /**
737*5113495bSYour Name  * struct mlo_partner_info - mlo partner link info
738*5113495bSYour Name  * @num_partner_links: no. of partner links
739*5113495bSYour Name  * @partner_link_info: per partner link info
740*5113495bSYour Name  * @t2lm_enable_val: enum wlan_t2lm_enable
741*5113495bSYour Name  * @nstr_info: NSTR Capability info
742*5113495bSYour Name  * @num_nstr_info_links: No. of links for which NSTR info is present
743*5113495bSYour Name  */
744*5113495bSYour Name struct mlo_partner_info {
745*5113495bSYour Name 	uint8_t num_partner_links;
746*5113495bSYour Name 	struct mlo_link_info partner_link_info[WLAN_MAX_ML_BSS_LINKS];
747*5113495bSYour Name #ifdef WLAN_FEATURE_11BE
748*5113495bSYour Name 	enum wlan_t2lm_enable t2lm_enable_val;
749*5113495bSYour Name 	struct mlo_nstr_info nstr_info[WLAN_UMAC_MLO_MAX_VDEVS];
750*5113495bSYour Name 	uint8_t num_nstr_info_links;
751*5113495bSYour Name #endif
752*5113495bSYour Name };
753*5113495bSYour Name 
754*5113495bSYour Name #ifdef WLAN_FEATURE_11BE_MLO
755*5113495bSYour Name /**
756*5113495bSYour Name  * struct emlsr_capability - EMLSR capabilities info
757*5113495bSYour Name  * @emlsr_supp: EMLSR support is present or not.
758*5113495bSYour Name  * @trans_timeout: transition timeout
759*5113495bSYour Name  */
760*5113495bSYour Name struct emlsr_capability {
761*5113495bSYour Name 	bool emlsr_supp;
762*5113495bSYour Name 	uint8_t trans_timeout;
763*5113495bSYour Name };
764*5113495bSYour Name #endif
765*5113495bSYour Name 
766*5113495bSYour Name /**
767*5113495bSYour Name  * struct wlan_mlo_sta_assoc_pending_list - MLO sta assoc pending list entry
768*5113495bSYour Name  * @peer_list: MLO peer list
769*5113495bSYour Name  * @list_lock: lock to access members of structure
770*5113495bSYour Name  */
771*5113495bSYour Name struct wlan_mlo_sta_assoc_pending_list {
772*5113495bSYour Name 	qdf_list_t peer_list;
773*5113495bSYour Name 	qdf_spinlock_t list_lock;
774*5113495bSYour Name };
775*5113495bSYour Name 
776*5113495bSYour Name /**
777*5113495bSYour Name  * struct wlan_mlo_sta - MLO sta additional info
778*5113495bSYour Name  * @wlan_connect_req_links: list of vdevs selected for connection with the MLAP
779*5113495bSYour Name  * @wlan_connected_links: list of vdevs associated with this MLO connection
780*5113495bSYour Name  * @key_mgmt:
781*5113495bSYour Name  * @connect_req: connect params
782*5113495bSYour Name  * @copied_conn_req: original connect req
783*5113495bSYour Name  * @copied_conn_req_lock: lock for the original connect request
784*5113495bSYour Name  * @assoc_rsp: Raw assoc response frame
785*5113495bSYour Name  * @mlo_quiet_status:
786*5113495bSYour Name  * @mlo_csa_param: CSA request parameters for mlo sta
787*5113495bSYour Name  * @mlo_cu_param: critical update parameters for mlo sta
788*5113495bSYour Name  * @disconn_req: disconnect req params
789*5113495bSYour Name  * @copied_reassoc_rsp: Reassoc response copied from assoc link roam handling
790*5113495bSYour Name  *                      to re-use while link connect in case of deferred/need
791*5113495bSYour Name  *                      basis link connect (e.g. MLO OWE roaming).
792*5113495bSYour Name  * @ml_link_state: ml link state command info param
793*5113495bSYour Name  * @copied_t2lm_ie_assoc_rsp: copy of t2lm ie received in assoc response
794*5113495bSYour Name  * @ml_partner_info: mlo partner link info
795*5113495bSYour Name  * @emlsr_cap: EMLSR capabilities info
796*5113495bSYour Name  * @link_force_ctx: set link force mode context
797*5113495bSYour Name  * @ml_link_control_mode: link control mode configured via user space
798*5113495bSYour Name  * @ml_chan_switch_in_progress: Flag to track CSA at MLD level
799*5113495bSYour Name  */
800*5113495bSYour Name struct wlan_mlo_sta {
801*5113495bSYour Name 	qdf_bitmap(wlan_connect_req_links, WLAN_UMAC_MLO_MAX_VDEVS);
802*5113495bSYour Name 	qdf_bitmap(wlan_connected_links, WLAN_UMAC_MLO_MAX_VDEVS);
803*5113495bSYour Name 	struct wlan_mlo_key_mgmt key_mgmt[WLAN_MAX_ML_BSS_LINKS];
804*5113495bSYour Name 	struct wlan_cm_connect_req *connect_req;
805*5113495bSYour Name 	struct wlan_cm_connect_req *copied_conn_req;
806*5113495bSYour Name #ifdef WLAN_MLO_USE_SPINLOCK
807*5113495bSYour Name 	qdf_spinlock_t copied_conn_req_lock;
808*5113495bSYour Name #else
809*5113495bSYour Name 	qdf_mutex_t copied_conn_req_lock;
810*5113495bSYour Name #endif
811*5113495bSYour Name 	struct element_info assoc_rsp;
812*5113495bSYour Name 	struct mlo_sta_quiet_status mlo_quiet_status[WLAN_UMAC_MLO_MAX_VDEVS];
813*5113495bSYour Name 	struct mlo_sta_csa_params mlo_csa_param[WLAN_UMAC_MLO_MAX_VDEVS];
814*5113495bSYour Name 	struct mlo_sta_cu_params mlo_cu_param[WLAN_UMAC_MLO_MAX_VDEVS];
815*5113495bSYour Name 	struct wlan_cm_disconnect_req *disconn_req;
816*5113495bSYour Name #ifdef WLAN_FEATURE_ROAM_OFFLOAD
817*5113495bSYour Name 	struct wlan_cm_connect_resp *copied_reassoc_rsp;
818*5113495bSYour Name #endif
819*5113495bSYour Name #ifdef WLAN_FEATURE_11BE_MLO
820*5113495bSYour Name 	struct ml_link_state_cmd_info ml_link_state;
821*5113495bSYour Name 	struct wlan_t2lm_context copied_t2lm_ie_assoc_rsp;
822*5113495bSYour Name 	struct mlo_partner_info ml_partner_info;
823*5113495bSYour Name 	struct emlsr_capability emlsr_cap;
824*5113495bSYour Name #endif
825*5113495bSYour Name #ifdef WLAN_FEATURE_11BE_MLO_ADV_FEATURE
826*5113495bSYour Name 	struct wlan_link_force_context link_force_ctx;
827*5113495bSYour Name #endif
828*5113495bSYour Name 	uint8_t ml_link_control_mode;
829*5113495bSYour Name 	bool ml_chan_switch_in_progress;
830*5113495bSYour Name };
831*5113495bSYour Name 
832*5113495bSYour Name /**
833*5113495bSYour Name  * struct wlan_mlo_ap - MLO AP related info
834*5113495bSYour Name  * @num_ml_vdevs: number of vdevs to form MLD
835*5113495bSYour Name  * @ml_aid_mgr: ML AID mgr
836*5113495bSYour Name  * @mlo_ap_lock: lock to sync VDEV SM event
837*5113495bSYour Name  * @mlo_vdev_quiet_bmap: Bitmap of vdevs for which quiet ie needs to enabled
838*5113495bSYour Name  * @mlo_vdev_up_bmap: Bitmap of vdevs for which sync complete can be dispatched
839*5113495bSYour Name  * @assoc_list: MLO sta assoc pending list entry (for FT-over-DS)
840*5113495bSYour Name  */
841*5113495bSYour Name struct wlan_mlo_ap {
842*5113495bSYour Name 	uint8_t num_ml_vdevs;
843*5113495bSYour Name 	struct wlan_ml_vdev_aid_mgr *ml_aid_mgr;
844*5113495bSYour Name #ifdef WLAN_MLO_USE_SPINLOCK
845*5113495bSYour Name 	qdf_spinlock_t mlo_ap_lock;
846*5113495bSYour Name #else
847*5113495bSYour Name 	qdf_mutex_t mlo_ap_lock;
848*5113495bSYour Name #endif
849*5113495bSYour Name 	qdf_bitmap(mlo_vdev_quiet_bmap, WLAN_UMAC_MLO_MAX_VDEVS);
850*5113495bSYour Name 	qdf_bitmap(mlo_vdev_up_bmap, WLAN_UMAC_MLO_MAX_VDEVS);
851*5113495bSYour Name 	struct wlan_mlo_sta_assoc_pending_list assoc_list;
852*5113495bSYour Name };
853*5113495bSYour Name 
854*5113495bSYour Name /**
855*5113495bSYour Name  * struct wlan_mlo_peer_list - MLO peer list entry
856*5113495bSYour Name  * @peer_hash: MLO peer hash code
857*5113495bSYour Name  * @peer_list_lock: lock to access members of structure
858*5113495bSYour Name  */
859*5113495bSYour Name struct wlan_mlo_peer_list {
860*5113495bSYour Name 	qdf_list_t peer_hash[WLAN_PEER_HASHSIZE];
861*5113495bSYour Name #ifdef WLAN_MLO_USE_SPINLOCK
862*5113495bSYour Name 	qdf_spinlock_t peer_list_lock;
863*5113495bSYour Name #else
864*5113495bSYour Name 	qdf_mutex_t peer_list_lock;
865*5113495bSYour Name #endif
866*5113495bSYour Name };
867*5113495bSYour Name 
868*5113495bSYour Name /**
869*5113495bSYour Name  * struct mlo_vdev_link_mac_info - VDEV to link address map
870*5113495bSYour Name  * @vdev_id: Vdev Id with which this link mac address is associated:
871*5113495bSYour Name  * @link_mac_addr: link specific mac address
872*5113495bSYour Name  */
873*5113495bSYour Name struct mlo_vdev_link_mac_info {
874*5113495bSYour Name 	uint8_t vdev_id;
875*5113495bSYour Name 	struct qdf_mac_addr link_mac_addr;
876*5113495bSYour Name };
877*5113495bSYour Name 
878*5113495bSYour Name /**
879*5113495bSYour Name  * struct wlan_mlo_link_mac_update: VDEV to link MAC address list
880*5113495bSYour Name  * @num_mac_update: Number of mac address
881*5113495bSYour Name  * @link_mac_info: Each VDEV to link mac address mapping
882*5113495bSYour Name  */
883*5113495bSYour Name struct wlan_mlo_link_mac_update {
884*5113495bSYour Name 	int num_mac_update;
885*5113495bSYour Name 	struct mlo_vdev_link_mac_info link_mac_info[3];
886*5113495bSYour Name };
887*5113495bSYour Name 
888*5113495bSYour Name /**
889*5113495bSYour Name  * struct wlan_mlo_dev_context - MLO device context
890*5113495bSYour Name  * @node: QDF list node member
891*5113495bSYour Name  * @mld_id: MLD id
892*5113495bSYour Name  * @mld_addr: MLO device MAC address
893*5113495bSYour Name  * @wlan_vdev_list: list of vdevs associated with this MLO connection
894*5113495bSYour Name  * @wlan_bridge_vdev_list: list of bridge vdevs associated with this MLO
895*5113495bSYour Name  * @wlan_bridge_vdev_count: number of elements in the bridge vdev list
896*5113495bSYour Name  * @bridge_sta_ctx: bridge sta context
897*5113495bSYour Name  * @wlan_vdev_count: number of elements in the vdev list
898*5113495bSYour Name  * @mlo_peer_list: list peers in this MLO connection
899*5113495bSYour Name  * @wlan_max_mlo_peer_count: peer count across the links of specific MLO
900*5113495bSYour Name  * @mlo_dev_lock: lock to access struct
901*5113495bSYour Name  * @tsf_recalculation_lock: Lock to protect TSF (re)calculation
902*5113495bSYour Name  * @ref_cnt: reference count
903*5113495bSYour Name  * @ref_id_dbg: Reference count debug information
904*5113495bSYour Name  * @sta_ctx: MLO STA related information
905*5113495bSYour Name  * @ap_ctx: AP related information
906*5113495bSYour Name  * @t2lm_ctx: T2LM related information
907*5113495bSYour Name  * @epcs_ctx: EPCS related information
908*5113495bSYour Name  * @ptqm_migrate_timer: timer for ptqm migration
909*5113495bSYour Name  * @mlo_peer_id_bmap: mlo_peer_id bitmap for ptqm migration
910*5113495bSYour Name  * @link_ctx: link related information
911*5113495bSYour Name  * @mlo_max_recom_simult_links: Max Recommended Simultaneous Links
912*5113495bSYour Name  */
913*5113495bSYour Name struct wlan_mlo_dev_context {
914*5113495bSYour Name 	qdf_list_node_t node;
915*5113495bSYour Name 	uint8_t mld_id;
916*5113495bSYour Name 	struct qdf_mac_addr mld_addr;
917*5113495bSYour Name 	struct wlan_objmgr_vdev *wlan_vdev_list[WLAN_UMAC_MLO_MAX_VDEVS];
918*5113495bSYour Name #if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_MLO_MULTI_CHIP)
919*5113495bSYour Name 	struct wlan_objmgr_vdev *wlan_bridge_vdev_list[WLAN_UMAC_MLO_MAX_BRIDGE_VDEVS];
920*5113495bSYour Name 	struct wlan_mlo_bridge_sta *bridge_sta_ctx;
921*5113495bSYour Name #endif
922*5113495bSYour Name 	uint16_t wlan_vdev_count;
923*5113495bSYour Name 	uint16_t wlan_bridge_vdev_count;
924*5113495bSYour Name 	struct wlan_mlo_peer_list mlo_peer_list;
925*5113495bSYour Name 	uint16_t wlan_max_mlo_peer_count;
926*5113495bSYour Name #ifdef WLAN_MLO_USE_SPINLOCK
927*5113495bSYour Name 	qdf_spinlock_t mlo_dev_lock;
928*5113495bSYour Name 	qdf_spinlock_t tsf_recalculation_lock;
929*5113495bSYour Name #else
930*5113495bSYour Name 	qdf_mutex_t mlo_dev_lock;
931*5113495bSYour Name 	qdf_mutex_t tsf_recalculation_lock;
932*5113495bSYour Name #endif
933*5113495bSYour Name 	qdf_atomic_t ref_cnt;
934*5113495bSYour Name 	qdf_atomic_t ref_id_dbg[WLAN_REF_ID_MAX];
935*5113495bSYour Name 	struct wlan_mlo_sta *sta_ctx;
936*5113495bSYour Name 	struct wlan_mlo_ap *ap_ctx;
937*5113495bSYour Name 	struct wlan_t2lm_context t2lm_ctx;
938*5113495bSYour Name 	struct wlan_epcs_context epcs_ctx;
939*5113495bSYour Name #ifdef QCA_SUPPORT_PRIMARY_LINK_MIGRATE
940*5113495bSYour Name 	qdf_timer_t ptqm_migrate_timer;
941*5113495bSYour Name 	qdf_bitmap(mlo_peer_id_bmap, MAX_MLO_PEER_ID);
942*5113495bSYour Name #endif
943*5113495bSYour Name 	struct mlo_link_switch_context *link_ctx;
944*5113495bSYour Name 	uint8_t mlo_max_recom_simult_links;
945*5113495bSYour Name };
946*5113495bSYour Name 
947*5113495bSYour Name /**
948*5113495bSYour Name  * struct wlan_mlo_link_peer_entry - Link peer entry
949*5113495bSYour Name  * @link_peer: Object manager peer
950*5113495bSYour Name  * @link_addr: MAC address of link peer
951*5113495bSYour Name  * @link_ix: Link index
952*5113495bSYour Name  * @is_primary: sets true if the peer is primary UMAC’s peer
953*5113495bSYour Name  * @hw_link_id: HW Link id of peer
954*5113495bSYour Name  * @assoc_rsp_buf: Assoc resp buffer
955*5113495bSYour Name  * @peer_assoc_sent: flag to indicate peer assoc sent to FW
956*5113495bSYour Name  */
957*5113495bSYour Name struct wlan_mlo_link_peer_entry {
958*5113495bSYour Name 	struct wlan_objmgr_peer *link_peer;
959*5113495bSYour Name 	struct qdf_mac_addr link_addr;
960*5113495bSYour Name 	uint8_t link_ix;
961*5113495bSYour Name 	bool is_primary;
962*5113495bSYour Name 	uint8_t hw_link_id;
963*5113495bSYour Name 	qdf_nbuf_t assoc_rsp_buf;
964*5113495bSYour Name 	bool peer_assoc_sent;
965*5113495bSYour Name };
966*5113495bSYour Name 
967*5113495bSYour Name /**
968*5113495bSYour Name  * enum mlo_peer_state - MLO peer state
969*5113495bSYour Name  * @ML_PEER_CREATED:     Initial state
970*5113495bSYour Name  * @ML_PEER_ASSOC_DONE:  ASSOC sent on assoc link
971*5113495bSYour Name  * @ML_PEER_DISCONN_INITIATED: Disconnect initiated on one of the links
972*5113495bSYour Name  */
973*5113495bSYour Name enum mlo_peer_state {
974*5113495bSYour Name 	ML_PEER_CREATED,
975*5113495bSYour Name 	ML_PEER_ASSOC_DONE,
976*5113495bSYour Name 	ML_PEER_DISCONN_INITIATED,
977*5113495bSYour Name };
978*5113495bSYour Name 
979*5113495bSYour Name /**
980*5113495bSYour Name  * struct mlpeer_auth_params - Deferred Auth params
981*5113495bSYour Name  * @vdev_id:  VDEV ID
982*5113495bSYour Name  * @psoc_id:  PSOC ID
983*5113495bSYour Name  * @link_addr: MAC address
984*5113495bSYour Name  * @mldaddr: MLD MAC address
985*5113495bSYour Name  * @algo:  Auth algorithm
986*5113495bSYour Name  * @seq: Auth sequence number
987*5113495bSYour Name  * @status_code: Auth status
988*5113495bSYour Name  * @challenge: Auth Challenge
989*5113495bSYour Name  * @challenge_length: Auth Challenge length
990*5113495bSYour Name  * @wbuf:  Auth wbuf
991*5113495bSYour Name  * @rs: Rx stats
992*5113495bSYour Name  */
993*5113495bSYour Name struct mlpeer_auth_params {
994*5113495bSYour Name 	uint8_t vdev_id;
995*5113495bSYour Name 	uint8_t psoc_id;
996*5113495bSYour Name 	struct qdf_mac_addr link_addr;
997*5113495bSYour Name 	struct qdf_mac_addr mldaddr;
998*5113495bSYour Name 	uint16_t algo;
999*5113495bSYour Name 	uint16_t seq;
1000*5113495bSYour Name 	uint16_t status_code;
1001*5113495bSYour Name 	uint8_t *challenge;
1002*5113495bSYour Name 	uint8_t challenge_length;
1003*5113495bSYour Name 	qdf_nbuf_t wbuf;
1004*5113495bSYour Name 	void *rs;
1005*5113495bSYour Name };
1006*5113495bSYour Name 
1007*5113495bSYour Name /**
1008*5113495bSYour Name  * struct wlan_mlo_eml_cap - EML capabilities of MLD
1009*5113495bSYour Name  * @emlsr_supp: eMLSR Support
1010*5113495bSYour Name  * @emlsr_pad_delay: eMLSR Padding Delay
1011*5113495bSYour Name  * @emlsr_trans_delay: eMLSR transition delay
1012*5113495bSYour Name  * @emlmr_supp: eMLMR Support
1013*5113495bSYour Name  * @emlmr_delay: eMLMR Delay
1014*5113495bSYour Name  * @trans_timeout: Transition Timeout
1015*5113495bSYour Name  * @reserved: Reserved
1016*5113495bSYour Name  */
1017*5113495bSYour Name struct wlan_mlo_eml_cap {
1018*5113495bSYour Name 	uint16_t emlsr_supp:1,
1019*5113495bSYour Name 		 emlsr_pad_delay:3,
1020*5113495bSYour Name 		 emlsr_trans_delay:3,
1021*5113495bSYour Name 		 emlmr_supp:1,
1022*5113495bSYour Name 		 emlmr_delay:3,
1023*5113495bSYour Name 		 trans_timeout:4,
1024*5113495bSYour Name 		 reserved:1;
1025*5113495bSYour Name };
1026*5113495bSYour Name 
1027*5113495bSYour Name /**
1028*5113495bSYour Name  * struct wlan_mlo_msd_cap - MSD capabilities of MLD
1029*5113495bSYour Name  * @medium_sync_duration: Medium Sync Duration
1030*5113495bSYour Name  * @medium_sync_ofdm_ed_thresh: MSD threshold value
1031*5113495bSYour Name  * @medium_sync_max_txop_num: Max number of TXOP
1032*5113495bSYour Name  */
1033*5113495bSYour Name struct wlan_mlo_msd_cap {
1034*5113495bSYour Name 	uint16_t medium_sync_duration:8,
1035*5113495bSYour Name 		 medium_sync_ofdm_ed_thresh:4,
1036*5113495bSYour Name 		 medium_sync_max_txop_num:4;
1037*5113495bSYour Name };
1038*5113495bSYour Name 
1039*5113495bSYour Name /**
1040*5113495bSYour Name  * struct wlan_mlo_mld_cap - MLD capabilities of MLD
1041*5113495bSYour Name  * @max_simult_link: Maximum number of simultaneous links
1042*5113495bSYour Name  * @srs_support: SRS support
1043*5113495bSYour Name  * @tid2link_neg_support: TID to Link Negotiation Support
1044*5113495bSYour Name  * @str_freq_sep: Frequency separation suggested by STR non-AP MLD
1045*5113495bSYour Name  *                OR Type of AP-MLD
1046*5113495bSYour Name  * @aar_support: AAR Support
1047*5113495bSYour Name  * @reserved: Reserved
1048*5113495bSYour Name  */
1049*5113495bSYour Name struct wlan_mlo_mld_cap {
1050*5113495bSYour Name 	uint16_t max_simult_link:4,
1051*5113495bSYour Name 		 srs_support:1,
1052*5113495bSYour Name 		 tid2link_neg_support:2,
1053*5113495bSYour Name 		 str_freq_sep:5,
1054*5113495bSYour Name 		 aar_support:1,
1055*5113495bSYour Name 		 reserved:3;
1056*5113495bSYour Name };
1057*5113495bSYour Name 
1058*5113495bSYour Name /**
1059*5113495bSYour Name  * struct wlan_mlo_peer_context - MLO peer context
1060*5113495bSYour Name  *
1061*5113495bSYour Name  * @peer_node:     peer list node for ml_dev qdf list
1062*5113495bSYour Name  * @peer_list: list of peers on the MLO link
1063*5113495bSYour Name  * @link_peer_cnt: Number of link peers attached
1064*5113495bSYour Name  * @max_links: Max links for this ML peer
1065*5113495bSYour Name  * @link_asresp_cnt: Number of reassoc resp generated
1066*5113495bSYour Name  * @mlo_peer_id: unique ID for the peer
1067*5113495bSYour Name  * @peer_mld_addr: MAC address of MLD link
1068*5113495bSYour Name  * @mlo_ie: MLO IE struct
1069*5113495bSYour Name  * @mlo_peer_lock: lock to access peer structure
1070*5113495bSYour Name  * @assoc_id: Assoc ID derived by MLO manager
1071*5113495bSYour Name  * @primary_umac_psoc_id:
1072*5113495bSYour Name  * @ref_cnt: Reference counter to avoid use after free
1073*5113495bSYour Name  * @ml_dev: MLO dev context
1074*5113495bSYour Name  * @mlpeer_state: MLO peer state
1075*5113495bSYour Name  * @avg_link_rssi: avg RSSI of ML peer
1076*5113495bSYour Name  * @is_nawds_ml_peer: flag to indicate if ml_peer is NAWDS configured
1077*5113495bSYour Name  * @nawds_config: eack link peer's NAWDS configuration
1078*5113495bSYour Name  * @pending_auth: Holds pending auth request
1079*5113495bSYour Name  * @t2lm_policy: TID-to-link mapping information
1080*5113495bSYour Name  * @epcs_info: EPCS information
1081*5113495bSYour Name  * @msd_cap_present: Medium Sync Capability present bit
1082*5113495bSYour Name  * @mlpeer_emlcap: EML capability information for ML peer
1083*5113495bSYour Name  * @mlpeer_msdcap: Medium Sync Delay capability information for ML peer
1084*5113495bSYour Name  * @is_mesh_ml_peer: flag to indicate if ml_peer is MESH configured
1085*5113495bSYour Name  * @mesh_config: eack link peer's MESH configuration
1086*5113495bSYour Name  * @mlpeer_mldcap: MLD Capability information for ML peer
1087*5113495bSYour Name  * @mlpeer_nstrinfo: NSTR Capability info
1088*5113495bSYour Name  * @migrate_primary_umac_psoc_id: primary umac psoc id selected for umac
1089*5113495bSYour Name  * migration
1090*5113495bSYour Name  * @primary_umac_migration_in_progress: flag to indicate primary umac migration
1091*5113495bSYour Name  * in progress
1092*5113495bSYour Name  */
1093*5113495bSYour Name struct wlan_mlo_peer_context {
1094*5113495bSYour Name 	qdf_list_node_t peer_node;
1095*5113495bSYour Name 	struct wlan_mlo_link_peer_entry peer_list[MAX_MLO_LINK_PEERS];
1096*5113495bSYour Name 	uint8_t link_peer_cnt;
1097*5113495bSYour Name 	uint8_t max_links;
1098*5113495bSYour Name 	uint8_t link_asresp_cnt;
1099*5113495bSYour Name 	uint32_t mlo_peer_id;
1100*5113495bSYour Name 	struct qdf_mac_addr peer_mld_addr;
1101*5113495bSYour Name 	uint8_t *mlo_ie;
1102*5113495bSYour Name #ifdef WLAN_MLO_USE_SPINLOCK
1103*5113495bSYour Name 	qdf_spinlock_t mlo_peer_lock;
1104*5113495bSYour Name #else
1105*5113495bSYour Name 	qdf_mutex_t mlo_peer_lock;
1106*5113495bSYour Name #endif
1107*5113495bSYour Name 	uint16_t assoc_id;
1108*5113495bSYour Name 	uint8_t primary_umac_psoc_id;
1109*5113495bSYour Name 	qdf_atomic_t ref_cnt;
1110*5113495bSYour Name 	struct wlan_mlo_dev_context *ml_dev;
1111*5113495bSYour Name 	enum mlo_peer_state mlpeer_state;
1112*5113495bSYour Name 	int8_t avg_link_rssi;
1113*5113495bSYour Name #ifdef UMAC_SUPPORT_MLNAWDS
1114*5113495bSYour Name 	bool is_nawds_ml_peer;
1115*5113495bSYour Name 	struct mlnawds_config nawds_config[MAX_MLO_LINK_PEERS];
1116*5113495bSYour Name #endif
1117*5113495bSYour Name #ifdef UMAC_MLO_AUTH_DEFER
1118*5113495bSYour Name 	struct mlpeer_auth_params *pending_auth[MAX_MLO_LINK_PEERS];
1119*5113495bSYour Name #endif
1120*5113495bSYour Name #ifdef WLAN_FEATURE_11BE
1121*5113495bSYour Name 	struct wlan_mlo_peer_t2lm_policy t2lm_policy;
1122*5113495bSYour Name 	struct wlan_mlo_peer_epcs_info epcs_info;
1123*5113495bSYour Name #endif
1124*5113495bSYour Name 	bool msd_cap_present;
1125*5113495bSYour Name 	struct wlan_mlo_eml_cap mlpeer_emlcap;
1126*5113495bSYour Name 	struct wlan_mlo_msd_cap mlpeer_msdcap;
1127*5113495bSYour Name #ifdef MESH_MODE_SUPPORT
1128*5113495bSYour Name 	bool is_mesh_ml_peer;
1129*5113495bSYour Name 	struct mlnawds_config mesh_config[MAX_MLO_LINK_PEERS];
1130*5113495bSYour Name #endif
1131*5113495bSYour Name 	struct wlan_mlo_mld_cap mlpeer_mldcap;
1132*5113495bSYour Name 	struct mlo_nstr_info mlpeer_nstrinfo[WLAN_UMAC_MLO_MAX_VDEVS];
1133*5113495bSYour Name 	uint8_t migrate_primary_umac_psoc_id;
1134*5113495bSYour Name 	bool primary_umac_migration_in_progress;
1135*5113495bSYour Name };
1136*5113495bSYour Name 
1137*5113495bSYour Name /**
1138*5113495bSYour Name  * struct mlo_probereq_info - mlo probe req link info
1139*5113495bSYour Name  * @mlid: MLID requested in the probe req
1140*5113495bSYour Name  * @num_links: no. of link info in probe req
1141*5113495bSYour Name  * @link_id: target link id of APs
1142*5113495bSYour Name  * @is_mld_id_valid: Indicates if mld_id is valid for a given request
1143*5113495bSYour Name  * @skip_mbssid: Skip mbssid IE
1144*5113495bSYour Name  */
1145*5113495bSYour Name struct mlo_probereq_info {
1146*5113495bSYour Name 	uint8_t mlid;
1147*5113495bSYour Name 	uint8_t num_links;
1148*5113495bSYour Name 	uint8_t link_id[WLAN_UMAC_MLO_MAX_VDEVS];
1149*5113495bSYour Name 	bool is_mld_id_valid;
1150*5113495bSYour Name 	bool skip_mbssid;
1151*5113495bSYour Name };
1152*5113495bSYour Name 
1153*5113495bSYour Name /**
1154*5113495bSYour Name  * struct ml_rv_partner_link_info: Partner link information of an ML reconfig IE
1155*5113495bSYour Name  * @link_id: Link id advertised by the AP
1156*5113495bSYour Name  * @link_mac_addr: Link mac address
1157*5113495bSYour Name  * @is_ap_removal_timer_p: AP removal timer is present or not
1158*5113495bSYour Name  * @ap_removal_timer: number of TBTTs of the AP removal timer
1159*5113495bSYour Name  */
1160*5113495bSYour Name struct ml_rv_partner_link_info {
1161*5113495bSYour Name 	uint8_t link_id;
1162*5113495bSYour Name 	struct qdf_mac_addr link_mac_addr;
1163*5113495bSYour Name 	uint8_t is_ap_removal_timer_p;
1164*5113495bSYour Name 	uint16_t ap_removal_timer;
1165*5113495bSYour Name };
1166*5113495bSYour Name 
1167*5113495bSYour Name /**
1168*5113495bSYour Name  * struct ml_rv_info: Reconfig Multi link information of a 11be beacon
1169*5113495bSYour Name  * @mld_mac_addr: MLD mac address
1170*5113495bSYour Name  * @num_links: Number of links supported by ML AP
1171*5113495bSYour Name  * @link_info: Array containing partner links information
1172*5113495bSYour Name  */
1173*5113495bSYour Name struct ml_rv_info {
1174*5113495bSYour Name 	struct qdf_mac_addr mld_mac_addr;
1175*5113495bSYour Name 	uint8_t num_links;
1176*5113495bSYour Name 	struct ml_rv_partner_link_info link_info[WLAN_UMAC_MLO_MAX_VDEVS];
1177*5113495bSYour Name };
1178*5113495bSYour Name 
1179*5113495bSYour Name /**
1180*5113495bSYour Name  * struct mlo_tgt_link_info - ML target link info
1181*5113495bSYour Name  * @vdev_id: link peer vdev id
1182*5113495bSYour Name  * @hw_mld_link_id: HW link id
1183*5113495bSYour Name  * @mlo_enabled: indicate is MLO enabled
1184*5113495bSYour Name  * @mlo_assoc_link: indicate is the link used to initialize the association
1185*5113495bSYour Name  *                  of mlo connection
1186*5113495bSYour Name  * @mlo_primary_umac: indicate is the link on primary UMAC, WIN only flag
1187*5113495bSYour Name  * @mlo_logical_link_index_valid: indicate if the logial link index in is valid
1188*5113495bSYour Name  * @mlo_peer_id_valid: indicate if the mlo peer id is valid
1189*5113495bSYour Name  * @mlo_force_link_inactive: force the peer inactive
1190*5113495bSYour Name  * @emlsr_support: indicate if eMLSR supported
1191*5113495bSYour Name  * @emlmr_support: indicate if eMLMR supported
1192*5113495bSYour Name  * @msd_cap_support: indicate if MSD supported
1193*5113495bSYour Name  * @mlo_bridge_peer: indicate if it is bridge peer
1194*5113495bSYour Name  * @unused: spare bits
1195*5113495bSYour Name  * @logical_link_index: Unique index for links of the mlo. Starts with Zero
1196*5113495bSYour Name  */
1197*5113495bSYour Name struct mlo_tgt_link_info {
1198*5113495bSYour Name 	uint8_t vdev_id;
1199*5113495bSYour Name 	uint8_t hw_mld_link_id;
1200*5113495bSYour Name 	uint32_t mlo_enabled:1,
1201*5113495bSYour Name 		 mlo_assoc_link:1,
1202*5113495bSYour Name 		 mlo_primary_umac:1,
1203*5113495bSYour Name 		 mlo_logical_link_index_valid:1,
1204*5113495bSYour Name 		 mlo_peer_id_valid:1,
1205*5113495bSYour Name 		 mlo_force_link_inactive:1,
1206*5113495bSYour Name 		 emlsr_support:1,
1207*5113495bSYour Name 		 emlmr_support:1,
1208*5113495bSYour Name 		 msd_cap_support:1,
1209*5113495bSYour Name 		 mlo_bridge_peer:1,
1210*5113495bSYour Name 		 unused:22;
1211*5113495bSYour Name 	uint32_t logical_link_index;
1212*5113495bSYour Name 
1213*5113495bSYour Name };
1214*5113495bSYour Name 
1215*5113495bSYour Name /**
1216*5113495bSYour Name  * struct mlo_tgt_partner_info - mlo target partner link info
1217*5113495bSYour Name  * @num_partner_links: no. of partner links
1218*5113495bSYour Name  * @link_info: per partner link info
1219*5113495bSYour Name  */
1220*5113495bSYour Name struct mlo_tgt_partner_info {
1221*5113495bSYour Name 	uint8_t num_partner_links;
1222*5113495bSYour Name 	struct mlo_tgt_link_info link_info[WLAN_UMAC_MLO_MAX_VDEVS];
1223*5113495bSYour Name };
1224*5113495bSYour Name 
1225*5113495bSYour Name /**
1226*5113495bSYour Name  * struct wlan_mlo_bridge_sta - MLO bridge sta context
1227*5113495bSYour Name  * @bridge_partners: mlo_partner_info of partners of a bridge
1228*5113495bSYour Name  * @bridge_ml_links: mlo_tgt_partner_info of partners of bridge
1229*5113495bSYour Name  * @bridge_umac_id: umac id for bridge
1230*5113495bSYour Name  * @bridge_link_id: link id used by bridge vdev
1231*5113495bSYour Name  * @is_force_central_primary: Flag to tell if bridge should be primary umac
1232*5113495bSYour Name  * @bridge_vap_exists: If there is bridge vap
1233*5113495bSYour Name  * @bridge_node_auth: Is bridge node auth done
1234*5113495bSYour Name  * @bss_mld_addr: MLD address of the BSS
1235*5113495bSYour Name  */
1236*5113495bSYour Name struct wlan_mlo_bridge_sta {
1237*5113495bSYour Name 	struct mlo_partner_info bridge_partners;
1238*5113495bSYour Name 	struct mlo_tgt_partner_info bridge_ml_links;
1239*5113495bSYour Name 	uint8_t bridge_umac_id;
1240*5113495bSYour Name 	uint8_t bridge_link_id;
1241*5113495bSYour Name 	bool is_force_central_primary;
1242*5113495bSYour Name 	bool bridge_vap_exists;
1243*5113495bSYour Name 	bool bridge_node_auth;
1244*5113495bSYour Name 	struct qdf_mac_addr bss_mld_addr;
1245*5113495bSYour Name };
1246*5113495bSYour Name 
1247*5113495bSYour Name /**
1248*5113495bSYour Name  * struct mlo_mlme_ext_ops - MLME callback functions
1249*5113495bSYour Name  * @mlo_mlme_ext_validate_conn_req: Callback to validate connect request
1250*5113495bSYour Name  * @mlo_mlme_ext_create_link_vdev: Callback to create link vdev for ML STA
1251*5113495bSYour Name  * @mlo_mlme_ext_peer_create: Callback to create link peer
1252*5113495bSYour Name  * @mlo_mlme_ext_bridge_peer_create: Callback to create bridge peer
1253*5113495bSYour Name  * @mlo_mlme_ext_peer_assoc: Callback to initiate peer assoc
1254*5113495bSYour Name  * @mlo_mlme_ext_peer_assoc_fail: Callback to notify peer assoc failure
1255*5113495bSYour Name  * @mlo_mlme_ext_peer_delete: Callback to initiate link peer delete
1256*5113495bSYour Name  * @mlo_mlme_ext_assoc_resp: Callback to initiate assoc resp
1257*5113495bSYour Name  * @mlo_mlme_get_link_assoc_req: Callback to get link assoc req buffer
1258*5113495bSYour Name  * @mlo_mlme_ext_deauth: Callback to initiate deauth
1259*5113495bSYour Name  * @mlo_mlme_ext_clone_security_param: Callback to clone mlo security params
1260*5113495bSYour Name  * @mlo_mlme_ext_peer_process_auth: Callback to process pending auth
1261*5113495bSYour Name  * @mlo_mlme_ext_handle_sta_csa_param: Callback to handle sta csa param
1262*5113495bSYour Name  * @mlo_mlme_ext_sta_op_class:
1263*5113495bSYour Name  * @mlo_mlme_ext_peer_reassoc: Callback to process reassoc
1264*5113495bSYour Name  */
1265*5113495bSYour Name struct mlo_mlme_ext_ops {
1266*5113495bSYour Name 	QDF_STATUS (*mlo_mlme_ext_validate_conn_req)(
1267*5113495bSYour Name 		    struct vdev_mlme_obj *vdev_mlme, void *ext_data);
1268*5113495bSYour Name 	QDF_STATUS (*mlo_mlme_ext_create_link_vdev)(
1269*5113495bSYour Name 		    struct vdev_mlme_obj *vdev_mlme, void *ext_data);
1270*5113495bSYour Name 	QDF_STATUS (*mlo_mlme_ext_peer_create)(struct wlan_objmgr_vdev *vdev,
1271*5113495bSYour Name 					struct wlan_mlo_peer_context *ml_peer,
1272*5113495bSYour Name 					struct qdf_mac_addr *addr,
1273*5113495bSYour Name 					qdf_nbuf_t frm_buf);
1274*5113495bSYour Name 	QDF_STATUS (*mlo_mlme_ext_bridge_peer_create)(struct wlan_objmgr_vdev *vdev,
1275*5113495bSYour Name 					struct wlan_mlo_peer_context *ml_peer,
1276*5113495bSYour Name 					struct qdf_mac_addr *addr,
1277*5113495bSYour Name 					qdf_nbuf_t frm_buf);
1278*5113495bSYour Name 	void (*mlo_mlme_ext_peer_assoc)(struct wlan_objmgr_peer *peer);
1279*5113495bSYour Name 	void (*mlo_mlme_ext_peer_assoc_fail)(struct wlan_objmgr_peer *peer);
1280*5113495bSYour Name 	void (*mlo_mlme_ext_peer_delete)(struct wlan_objmgr_peer *peer);
1281*5113495bSYour Name 	void (*mlo_mlme_ext_assoc_resp)(struct wlan_objmgr_peer *peer);
1282*5113495bSYour Name 	qdf_nbuf_t (*mlo_mlme_get_link_assoc_req)(struct wlan_objmgr_peer *peer,
1283*5113495bSYour Name 						  uint8_t link_ix);
1284*5113495bSYour Name 	void (*mlo_mlme_ext_deauth)(struct wlan_objmgr_peer *peer,
1285*5113495bSYour Name 				    uint8_t is_disassoc);
1286*5113495bSYour Name 	QDF_STATUS (*mlo_mlme_ext_clone_security_param)(
1287*5113495bSYour Name 		    struct vdev_mlme_obj *vdev_mlme,
1288*5113495bSYour Name 		    struct wlan_cm_connect_req *req);
1289*5113495bSYour Name #ifdef UMAC_MLO_AUTH_DEFER
1290*5113495bSYour Name 	void (*mlo_mlme_ext_peer_process_auth)(
1291*5113495bSYour Name 	      struct mlpeer_auth_params *auth_param);
1292*5113495bSYour Name #endif
1293*5113495bSYour Name 	void (*mlo_mlme_ext_handle_sta_csa_param)(
1294*5113495bSYour Name 				struct wlan_objmgr_vdev *vdev,
1295*5113495bSYour Name 				struct csa_offload_params *csa_param);
1296*5113495bSYour Name 	QDF_STATUS (*mlo_mlme_ext_sta_op_class)(
1297*5113495bSYour Name 			struct vdev_mlme_obj *vdev_mlme,
1298*5113495bSYour Name 			uint8_t *ml_ie);
1299*5113495bSYour Name 	QDF_STATUS (*mlo_mlme_ext_peer_reassoc)(struct wlan_objmgr_vdev *vdev,
1300*5113495bSYour Name 					struct wlan_mlo_peer_context *ml_peer,
1301*5113495bSYour Name 					struct qdf_mac_addr *addr,
1302*5113495bSYour Name 					qdf_nbuf_t frm_buf);
1303*5113495bSYour Name };
1304*5113495bSYour Name 
1305*5113495bSYour Name /*
1306*5113495bSYour Name  * struct mlo_osif_ext_ops - MLO manager to OSIF callback functions
1307*5113495bSYour Name  * @mlo_mgr_osif_update_bss_info: Callback to update each link connection info.
1308*5113495bSYour Name  * @mlo_mgr_osif_update_mac_addr: Callback to notify MAC addr update complete
1309*5113495bSYour Name  *                                from old link id to new link id for the vdev.
1310*5113495bSYour Name  * @mlo_mgr_osif_link_switch_notification: Notify OSIF on start of link switch
1311*5113495bSYour Name  */
1312*5113495bSYour Name struct mlo_osif_ext_ops {
1313*5113495bSYour Name 	QDF_STATUS
1314*5113495bSYour Name 	(*mlo_mgr_osif_update_bss_info)(struct qdf_mac_addr *self_mac,
1315*5113495bSYour Name 					struct qdf_mac_addr *bssid,
1316*5113495bSYour Name 					int32_t link_id);
1317*5113495bSYour Name 
1318*5113495bSYour Name 	QDF_STATUS (*mlo_mgr_osif_update_mac_addr)(int32_t ieee_old_link_id,
1319*5113495bSYour Name 						   int32_t ieee_new_link_id,
1320*5113495bSYour Name 						   uint8_t vdev_id);
1321*5113495bSYour Name 
1322*5113495bSYour Name 	QDF_STATUS
1323*5113495bSYour Name 	(*mlo_mgr_osif_link_switch_notification)(struct wlan_objmgr_vdev *vdev,
1324*5113495bSYour Name 						 uint8_t non_trans_vdev_id);
1325*5113495bSYour Name };
1326*5113495bSYour Name 
1327*5113495bSYour Name /* maximum size of vdev bitmap array for MLO link set active command */
1328*5113495bSYour Name #define MLO_VDEV_BITMAP_SZ 2
1329*5113495bSYour Name 
1330*5113495bSYour Name /* maximum size of link number param array for MLO link set active command */
1331*5113495bSYour Name #define MLO_LINK_NUM_SZ 2
1332*5113495bSYour Name 
1333*5113495bSYour Name /**
1334*5113495bSYour Name  * struct mlo_link_set_active_resp: MLO link set active response structure
1335*5113495bSYour Name  * @status: Return status, 0 for success, non-zero otherwise
1336*5113495bSYour Name  * @evt_handled: response event is handled
1337*5113495bSYour Name  * @active_sz: size of current active vdev bitmap array
1338*5113495bSYour Name  * @active: current active vdev bitmap array
1339*5113495bSYour Name  * @inactive_sz: size of current inactive vdev bitmap array
1340*5113495bSYour Name  * @inactive: current inactive vdev bitmap array
1341*5113495bSYour Name  * @use_ieee_link_id: link id is valid in active_linkid_bitmap or
1342*5113495bSYour Name  *	inactive_linkid_bitmap
1343*5113495bSYour Name  * @ap_mld_mac_addr: AP MLD mac address
1344*5113495bSYour Name  * @active_linkid_bitmap: current forced active link id bitmap
1345*5113495bSYour Name  * @inactive_linkid_bitmap: current forced inactive link id bitmap
1346*5113495bSYour Name  * @curr_inactive_linkid_bitmap: current inactive link id bitmap
1347*5113495bSYour Name  * @curr_active_linkid_bitmap: current active link id bitmap
1348*5113495bSYour Name  */
1349*5113495bSYour Name struct mlo_link_set_active_resp {
1350*5113495bSYour Name 	uint32_t status;
1351*5113495bSYour Name 	bool evt_handled;
1352*5113495bSYour Name 	uint32_t active_sz;
1353*5113495bSYour Name 	uint32_t active[MLO_VDEV_BITMAP_SZ];
1354*5113495bSYour Name 	uint32_t inactive_sz;
1355*5113495bSYour Name 	uint32_t inactive[MLO_VDEV_BITMAP_SZ];
1356*5113495bSYour Name 	bool use_ieee_link_id;
1357*5113495bSYour Name 	struct qdf_mac_addr  ap_mld_mac_addr;
1358*5113495bSYour Name 	uint32_t active_linkid_bitmap;
1359*5113495bSYour Name 	uint32_t inactive_linkid_bitmap;
1360*5113495bSYour Name 	uint32_t curr_inactive_linkid_bitmap;
1361*5113495bSYour Name 	uint32_t curr_active_linkid_bitmap;
1362*5113495bSYour Name };
1363*5113495bSYour Name 
1364*5113495bSYour Name /**
1365*5113495bSYour Name  * struct mlo_link_num_param: MLO link set active number params
1366*5113495bSYour Name  * @num_of_link: number of links to active/inactive
1367*5113495bSYour Name  * @vdev_type: type of vdev
1368*5113495bSYour Name  * @vdev_subtype: subtype of vdev
1369*5113495bSYour Name  * @home_freq: home frequency of the link
1370*5113495bSYour Name  */
1371*5113495bSYour Name struct mlo_link_num_param {
1372*5113495bSYour Name 	uint32_t num_of_link;
1373*5113495bSYour Name 	uint32_t vdev_type;
1374*5113495bSYour Name 	uint32_t vdev_subtype;
1375*5113495bSYour Name 	uint32_t home_freq;
1376*5113495bSYour Name };
1377*5113495bSYour Name 
1378*5113495bSYour Name /*
1379*5113495bSYour Name  * struct mlo_control_flags: This structure is used for setting
1380*5113495bSYour Name  * wmi_mlo_control_flags.
1381*5113495bSYour Name  * @overwrite_force_active_bitmap: indicate overwrite all earlier force_active
1382*5113495bSYour Name  * bitmaps
1383*5113495bSYour Name  * @overwrite_force_inactive_bitmap: indicate overwrite all earlier
1384*5113495bSYour Name  * force_inactive bitmaps
1385*5113495bSYour Name  * @dynamic_force_link_num: indicate fw to use force link number instead of
1386*5113495bSYour Name  * force link bitmaps
1387*5113495bSYour Name  * @post_re_evaluate: run link state check again after command response event
1388*5113495bSYour Name  * handled
1389*5113495bSYour Name  */
1390*5113495bSYour Name struct mlo_control_flags {
1391*5113495bSYour Name 	bool overwrite_force_active_bitmap;
1392*5113495bSYour Name 	bool overwrite_force_inactive_bitmap;
1393*5113495bSYour Name 	bool dynamic_force_link_num;
1394*5113495bSYour Name 	bool post_re_evaluate;
1395*5113495bSYour Name };
1396*5113495bSYour Name 
1397*5113495bSYour Name /* struct ml_link_force_cmd - force command for links
1398*5113495bSYour Name  * @ap_mld_mac_addr: AP mld mac address
1399*5113495bSYour Name  * @ieee_link_id_bitmap: link id bitmap
1400*5113495bSYour Name  * valid for WMI_MLO_LINK_FORCE_ACTIVE, WMI_MLO_LINK_FORCE_INACTIVE,
1401*5113495bSYour Name  * WMI_MLO_LINK_NO_FORCE, WMI_MLO_LINK_FORCE_ACTIVE_LINK_NUM,
1402*5113495bSYour Name  * WMI_MLO_LINK_FORCE_INACTIVE_LINK_NUM.
1403*5113495bSYour Name  * @ieee_link_id_bitmap2: link id bitmap, only valid for
1404*5113495bSYour Name  * WMI_MLO_LINK_FORCE_ACTIVE_INACTIVE carry the inactive linkid bitmap
1405*5113495bSYour Name  * @link_num: link num
1406*5113495bSYour Name  * only valid on WMI_MLO_LINK_FORCE_ACTIVE_LINK_NUM or
1407*5113495bSYour Name  * WMI_MLO_LINK_FORCE_INACTIVE_LINK_NUM
1408*5113495bSYour Name  */
1409*5113495bSYour Name struct ml_link_force_cmd {
1410*5113495bSYour Name 	struct qdf_mac_addr ap_mld_mac_addr;
1411*5113495bSYour Name 	uint16_t ieee_link_id_bitmap;
1412*5113495bSYour Name 	uint16_t ieee_link_id_bitmap2;
1413*5113495bSYour Name 	uint8_t link_num;
1414*5113495bSYour Name };
1415*5113495bSYour Name 
1416*5113495bSYour Name /**
1417*5113495bSYour Name  * struct mlo_link_set_active_param: MLO link set active params
1418*5113495bSYour Name  * @force_mode: operation to take (enum mlo_link_force_mode)
1419*5113495bSYour Name  * @reason: reason for the operation (enum mlo_link_force_reason)
1420*5113495bSYour Name  * @num_link_entry: number of the valid entries for link_num
1421*5113495bSYour Name  * @num_vdev_bitmap: number of the valid entries for vdev_bitmap
1422*5113495bSYour Name  * @num_inactive_vdev_bitmap: number of the valid entries for
1423*5113495bSYour Name  *  inactive_vdev_bitmap
1424*5113495bSYour Name  * @link_num: link number param array
1425*5113495bSYour Name  *  It's present only when force_mode is MLO_LINK_FORCE_MODE_ACTIVE_NUM or
1426*5113495bSYour Name  *  MLO_LINK_FORCE_MODE_INACTIVE_NUM
1427*5113495bSYour Name  * @vdev_bitmap: active/inactive vdev bitmap array
1428*5113495bSYour Name  *  It will be present when force_mode is MLO_LINK_FORCE_MODE_ACTIVE,
1429*5113495bSYour Name  *  MLO_LINK_FORCE_MODE_INACTIVE, MLO_LINK_FORCE_MODE_NO_FORCE,
1430*5113495bSYour Name  *  MLO_LINK_FORCE_MODE_ACTIVE_NUM or MLO_LINK_FORCE_MODE_INACTIVE_NUM,
1431*5113495bSYour Name  *  and MLO_LINK_FORCE_MODE_ACTIVE_INACTIVE.
1432*5113495bSYour Name  *  For MLO_LINK_FORCE_MODE_ACTIVE_INACTIVE, it includes the active vdev
1433*5113495bSYour Name  *  bitmaps
1434*5113495bSYour Name  * @inactive_vdev_bitmap: inactive vdev bitmap array
1435*5113495bSYour Name  *  It will be present when force_mode is MLO_LINK_FORCE_MODE_ACTIVE_INACTIVE,
1436*5113495bSYour Name  *  it includes the inactive vdev bitmaps
1437*5113495bSYour Name  * @control_flags: This structure is used for setting wmi_mlo_control_flags.
1438*5113495bSYour Name  * @use_ieee_link_id: send link id bitmap to target.
1439*5113495bSYour Name  *  If this value is true, the "force_cmd" field should be provided and
1440*5113495bSYour Name  *  that will be sent to target
1441*5113495bSYour Name  * @force_cmd: force command which includes link id bitmap
1442*5113495bSYour Name  */
1443*5113495bSYour Name struct mlo_link_set_active_param {
1444*5113495bSYour Name 	uint32_t force_mode;
1445*5113495bSYour Name 	uint32_t reason;
1446*5113495bSYour Name 	uint32_t num_link_entry;
1447*5113495bSYour Name 	uint32_t num_vdev_bitmap;
1448*5113495bSYour Name 	uint32_t num_inactive_vdev_bitmap;
1449*5113495bSYour Name 	struct mlo_link_num_param link_num[MLO_LINK_NUM_SZ];
1450*5113495bSYour Name 	uint32_t vdev_bitmap[MLO_VDEV_BITMAP_SZ];
1451*5113495bSYour Name 	uint32_t inactive_vdev_bitmap[MLO_VDEV_BITMAP_SZ];
1452*5113495bSYour Name 	struct mlo_control_flags control_flags;
1453*5113495bSYour Name 	bool use_ieee_link_id;
1454*5113495bSYour Name 	struct ml_link_force_cmd force_cmd;
1455*5113495bSYour Name };
1456*5113495bSYour Name 
1457*5113495bSYour Name /**
1458*5113495bSYour Name  * struct mlo_link_set_active_ctx - Context for MLO link set active request
1459*5113495bSYour Name  * @vdev: pointer to vdev on which the request issued
1460*5113495bSYour Name  * @set_mlo_link_cb: callback function for MLO link set active request
1461*5113495bSYour Name  * @validate_set_mlo_link_cb: callback to validate set link request
1462*5113495bSYour Name  * @cb_arg: callback context
1463*5113495bSYour Name  */
1464*5113495bSYour Name struct mlo_link_set_active_ctx {
1465*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev;
1466*5113495bSYour Name 	void (*set_mlo_link_cb)(struct wlan_objmgr_vdev *vdev, void *arg,
1467*5113495bSYour Name 				struct mlo_link_set_active_resp *evt);
1468*5113495bSYour Name 	QDF_STATUS (*validate_set_mlo_link_cb)(
1469*5113495bSYour Name 			struct wlan_objmgr_psoc *psoc,
1470*5113495bSYour Name 			struct mlo_link_set_active_param *param);
1471*5113495bSYour Name 	void *cb_arg;
1472*5113495bSYour Name };
1473*5113495bSYour Name 
1474*5113495bSYour Name /**
1475*5113495bSYour Name  * struct mlo_link_set_active_req - MLO link set active request
1476*5113495bSYour Name  * @ctx: context for MLO link set active request
1477*5113495bSYour Name  * @param: MLO link set active params
1478*5113495bSYour Name  */
1479*5113495bSYour Name struct mlo_link_set_active_req {
1480*5113495bSYour Name 	struct mlo_link_set_active_ctx ctx;
1481*5113495bSYour Name 	struct mlo_link_set_active_param param;
1482*5113495bSYour Name };
1483*5113495bSYour Name 
1484*5113495bSYour Name /**
1485*5113495bSYour Name  * enum mlo_chip_recovery_type - MLO chip recovery types
1486*5113495bSYour Name  * @MLO_RECOVERY_MODE_0: CRASH_PARTNER_CHIPS & recover all chips
1487*5113495bSYour Name  * @MLO_RECOVERY_MODE_1: Crash & recover asserted chip alone
1488*5113495bSYour Name  * @MLO_RECOVERY_MODE_MAX: Max limit for recovery types
1489*5113495bSYour Name  */
1490*5113495bSYour Name enum mlo_chip_recovery_type {
1491*5113495bSYour Name 	MLO_RECOVERY_MODE_0 = 1,
1492*5113495bSYour Name 	MLO_RECOVERY_MODE_1 = 2,
1493*5113495bSYour Name 
1494*5113495bSYour Name 	/* Add new types above */
1495*5113495bSYour Name 	MLO_RECOVERY_MODE_MAX = 0xf
1496*5113495bSYour Name };
1497*5113495bSYour Name 
1498*5113495bSYour Name /**
1499*5113495bSYour Name  * enum wlan_t2lm_status - Target status codes in event of t2lm
1500*5113495bSYour Name  * @WLAN_MAP_SWITCH_TIMER_TSF: Mapping switch time value in TSF to be included
1501*5113495bSYour Name  * in probe response frames
1502*5113495bSYour Name  * @WLAN_MAP_SWITCH_TIMER_EXPIRED: Indication that the new proposed T2LM has
1503*5113495bSYour Name  * been applied, Update the required data structures and other modules.
1504*5113495bSYour Name  * @WLAN_EXPECTED_DUR_EXPIRED: Indication that the proposed T2LM ineffective
1505*5113495bSYour Name  * after this duration and all TIDs fall back to default mode.
1506*5113495bSYour Name  */
1507*5113495bSYour Name enum wlan_t2lm_status {
1508*5113495bSYour Name 	WLAN_MAP_SWITCH_TIMER_TSF,
1509*5113495bSYour Name 	WLAN_MAP_SWITCH_TIMER_EXPIRED,
1510*5113495bSYour Name 	WLAN_EXPECTED_DUR_EXPIRED,
1511*5113495bSYour Name };
1512*5113495bSYour Name 
1513*5113495bSYour Name /**
1514*5113495bSYour Name  * struct mlo_vdev_host_tid_to_link_map_resp - TID-to-link mapping response
1515*5113495bSYour Name  * @vdev_id: Vdev id
1516*5113495bSYour Name  * @status: Target status for t2lm ie info
1517*5113495bSYour Name  * @mapping_switch_tsf: Mapping switch time in tsf for probe response frames
1518*5113495bSYour Name  */
1519*5113495bSYour Name struct mlo_vdev_host_tid_to_link_map_resp {
1520*5113495bSYour Name 	uint8_t vdev_id;
1521*5113495bSYour Name 	enum wlan_t2lm_status status;
1522*5113495bSYour Name 	uint32_t mapping_switch_tsf;
1523*5113495bSYour Name };
1524*5113495bSYour Name 
1525*5113495bSYour Name /**
1526*5113495bSYour Name  * struct mlo_link_removal_cmd_params - MLO link removal command parameters
1527*5113495bSYour Name  * @vdev_id: vdev ID of the link to be removed
1528*5113495bSYour Name  * @reconfig_ml_ie: Entire ML reconfiguration element
1529*5113495bSYour Name  * @reconfig_ml_ie_size: size of the field @reconfig_ml_ie
1530*5113495bSYour Name  */
1531*5113495bSYour Name struct mlo_link_removal_cmd_params {
1532*5113495bSYour Name 	uint8_t vdev_id;
1533*5113495bSYour Name 	uint8_t *reconfig_ml_ie;
1534*5113495bSYour Name 	uint32_t reconfig_ml_ie_size;
1535*5113495bSYour Name };
1536*5113495bSYour Name 
1537*5113495bSYour Name /**
1538*5113495bSYour Name  * struct mlo_link_removal_tbtt_info - MLO link removal TBTT info. This
1539*5113495bSYour Name  * information will be in correspondence with an outgoing beacon instance.
1540*5113495bSYour Name  * @tbtt_count: AP removal timer TBTT count in the reported beacon
1541*5113495bSYour Name  * @qtimer_reading: Q-timer reading when the reported beacon is sent out
1542*5113495bSYour Name  * @tsf: TSF of the reported beacon
1543*5113495bSYour Name  */
1544*5113495bSYour Name struct mlo_link_removal_tbtt_info {
1545*5113495bSYour Name 	uint32_t tbtt_count;
1546*5113495bSYour Name 	uint64_t qtimer_reading;
1547*5113495bSYour Name 	uint64_t tsf;
1548*5113495bSYour Name };
1549*5113495bSYour Name 
1550*5113495bSYour Name /**
1551*5113495bSYour Name  * struct mlo_link_removal_evt_params - MLO link removal event parameters
1552*5113495bSYour Name  * @vdev_id: vdev ID of the link undergoing removal
1553*5113495bSYour Name  * @tbtt_info: TBTT information of the link undergoing removal
1554*5113495bSYour Name  */
1555*5113495bSYour Name struct mlo_link_removal_evt_params {
1556*5113495bSYour Name 	uint8_t vdev_id;
1557*5113495bSYour Name 	struct mlo_link_removal_tbtt_info tbtt_info;
1558*5113495bSYour Name };
1559*5113495bSYour Name 
1560*5113495bSYour Name /**
1561*5113495bSYour Name  * struct mgmt_rx_mlo_link_removal_info - Information, sent in MGMT Rx event, of
1562*5113495bSYour Name  * a link undergoing removal from its MLD
1563*5113495bSYour Name  * @vdev_id: Vdev ID of the link undergoing removal
1564*5113495bSYour Name  * @hw_link_id: HW link ID of the link undergoing removal
1565*5113495bSYour Name  * @tbtt_count: AP removal timer TBTT count of the link undergoing removal
1566*5113495bSYour Name  */
1567*5113495bSYour Name struct mgmt_rx_mlo_link_removal_info {
1568*5113495bSYour Name 	uint8_t vdev_id;
1569*5113495bSYour Name 	uint8_t hw_link_id;
1570*5113495bSYour Name 	uint16_t tbtt_count;
1571*5113495bSYour Name };
1572*5113495bSYour Name 
1573*5113495bSYour Name /**
1574*5113495bSYour Name  * struct mlo_link_disable_request_evt_params - MLO link disable
1575*5113495bSYour Name  * request params
1576*5113495bSYour Name  * @mld_addr: disable mld address
1577*5113495bSYour Name  * @link_id_bitmap: Disable Link id bitmap
1578*5113495bSYour Name  */
1579*5113495bSYour Name struct mlo_link_disable_request_evt_params {
1580*5113495bSYour Name 	struct qdf_mac_addr mld_addr;
1581*5113495bSYour Name 	uint32_t link_id_bitmap;
1582*5113495bSYour Name };
1583*5113495bSYour Name 
1584*5113495bSYour Name #define MAX_LINK_SWITCH_TLV 5
1585*5113495bSYour Name /**
1586*5113495bSYour Name  * struct mlo_link_switch_params - Structure to hold link State switch
1587*5113495bSYour Name  * related parameters
1588*5113495bSYour Name  * @mld_addr: MLD address
1589*5113495bSYour Name  * @active_link_bitmap: Bitmap of ieee link id for active links
1590*5113495bSYour Name  * @prev_link_bitmap: Bitmap of ieee link id for previous active links
1591*5113495bSYour Name  * @fw_timestamp: Firmware timestamp in milliseconds
1592*5113495bSYour Name  * @reason_code: Reason code for the switch
1593*5113495bSYour Name  */
1594*5113495bSYour Name struct mlo_link_switch_params {
1595*5113495bSYour Name 	struct qdf_mac_addr mld_addr;
1596*5113495bSYour Name 	uint32_t active_link_bitmap;
1597*5113495bSYour Name 	uint32_t prev_link_bitmap;
1598*5113495bSYour Name 	uint32_t fw_timestamp;
1599*5113495bSYour Name 	uint32_t reason_code;
1600*5113495bSYour Name };
1601*5113495bSYour Name 
1602*5113495bSYour Name /**
1603*5113495bSYour Name  * struct mlo_link_switch_state_info  - Structure to hold the link switch
1604*5113495bSYour Name  * related parameters corresponding to all the TLV received in link state switch
1605*5113495bSYour Name  * event.
1606*5113495bSYour Name  * @num_params: Number of the link switch parameters
1607*5113495bSYour Name  * @link_switch_param: Link switch parameters
1608*5113495bSYour Name  */
1609*5113495bSYour Name struct mlo_link_switch_state_info {
1610*5113495bSYour Name 	uint8_t num_params;
1611*5113495bSYour Name 	struct mlo_link_switch_params link_switch_param[MAX_LINK_SWITCH_TLV];
1612*5113495bSYour Name };
1613*5113495bSYour Name 
1614*5113495bSYour Name #ifdef QCA_SUPPORT_PRIMARY_LINK_MIGRATE
1615*5113495bSYour Name /**
1616*5113495bSYour Name  * struct peer_ptqm_migrate_entry - peer ptqm migrate entry
1617*5113495bSYour Name  * @ml_peer_id: ML peer id
1618*5113495bSYour Name  * @hw_link_id: HW link id
1619*5113495bSYour Name  */
1620*5113495bSYour Name struct peer_ptqm_migrate_entry {
1621*5113495bSYour Name 	uint16_t ml_peer_id;
1622*5113495bSYour Name 	uint16_t hw_link_id;
1623*5113495bSYour Name };
1624*5113495bSYour Name 
1625*5113495bSYour Name /**
1626*5113495bSYour Name  * struct peer_ptqm_migrate_params - peer ptqm migrate request parameter
1627*5113495bSYour Name  * @vdev_id: vdev id
1628*5113495bSYour Name  * @num_peers: peer count
1629*5113495bSYour Name  * @num_peers_failed: number of peers for which wmi cmd is failed.
1630*5113495bSYour Name  * This value is expected to be used only in case failure is returned by WMI
1631*5113495bSYour Name  * @peer_list: list of peers to be migrated
1632*5113495bSYour Name  */
1633*5113495bSYour Name struct peer_ptqm_migrate_params {
1634*5113495bSYour Name 	uint8_t vdev_id;
1635*5113495bSYour Name 	uint16_t num_peers;
1636*5113495bSYour Name 	uint16_t num_peers_failed;
1637*5113495bSYour Name 	struct peer_ptqm_migrate_entry *peer_list;
1638*5113495bSYour Name };
1639*5113495bSYour Name 
1640*5113495bSYour Name /**
1641*5113495bSYour Name  * struct peer_ptqm_migrate_list_entry - peer ptqm migrate list
1642*5113495bSYour Name  * @node: QDF list node member
1643*5113495bSYour Name  * @peer: objmgr peer object
1644*5113495bSYour Name  * @mlo_peer_id: mlo peer id
1645*5113495bSYour Name  * @new_hw_link_id: hw link id of new primary
1646*5113495bSYour Name  */
1647*5113495bSYour Name struct peer_ptqm_migrate_list_entry {
1648*5113495bSYour Name 	qdf_list_node_t node;
1649*5113495bSYour Name 	struct wlan_objmgr_peer *peer;
1650*5113495bSYour Name 	uint32_t mlo_peer_id;
1651*5113495bSYour Name 	uint8_t new_hw_link_id;
1652*5113495bSYour Name };
1653*5113495bSYour Name 
1654*5113495bSYour Name /**
1655*5113495bSYour Name  * struct peer_migrate_ptqm_multi_entries - multi ptqm migrate peer entry params
1656*5113495bSYour Name  * @num_entries: Number of entries in the peer_list list
1657*5113495bSYour Name  * @peer_list: List to hold the peer entries to be migrated
1658*5113495bSYour Name  *
1659*5113495bSYour Name  */
1660*5113495bSYour Name struct peer_migrate_ptqm_multi_entries {
1661*5113495bSYour Name 	uint16_t num_entries;
1662*5113495bSYour Name 	qdf_list_t peer_list;
1663*5113495bSYour Name };
1664*5113495bSYour Name 
1665*5113495bSYour Name enum primary_link_peer_migration_evenr_status {
1666*5113495bSYour Name 	PRIMARY_LINK_PEER_MIGRATION_SUCCESS,
1667*5113495bSYour Name 	PRIMARY_LINK_PEER_MIGRATION_IN_PROGRESS,
1668*5113495bSYour Name 	PRIMARY_LINK_PEER_MIGRATION_DELETE_IN_PROGRESS,
1669*5113495bSYour Name 	PRIMARY_LINK_PEER_MIGRATION_DELETED,
1670*5113495bSYour Name 	PRIMARY_LINK_PEER_MIGRATION_TX_PIPES_FAILED,
1671*5113495bSYour Name 	PRIMARY_LINK_PEER_MIGRATION_RX_PIPES_FAILED,
1672*5113495bSYour Name 
1673*5113495bSYour Name 	/* Add any new status above this line */
1674*5113495bSYour Name 	PRIMARY_LINK_PEER_MIGRATION_FAIL = 255,
1675*5113495bSYour Name };
1676*5113495bSYour Name 
1677*5113495bSYour Name /**
1678*5113495bSYour Name  * struct peer_ptqm_migrate_event_params - peer ptqm migrate event parameter
1679*5113495bSYour Name  * @vdev_id: vdev id
1680*5113495bSYour Name  * @num_peers: peer count
1681*5113495bSYour Name  */
1682*5113495bSYour Name struct peer_ptqm_migrate_event_params {
1683*5113495bSYour Name 	uint8_t vdev_id;
1684*5113495bSYour Name 	uint16_t num_peers;
1685*5113495bSYour Name };
1686*5113495bSYour Name 
1687*5113495bSYour Name /**
1688*5113495bSYour Name  * struct peer_entry_ptqm_migrate_event_params - peer entry ptqm migrate
1689*5113495bSYour Name  * event parameter
1690*5113495bSYour Name  * @ml_peer_id: ML peer id
1691*5113495bSYour Name  * @status: migration status
1692*5113495bSYour Name  */
1693*5113495bSYour Name struct peer_entry_ptqm_migrate_event_params {
1694*5113495bSYour Name 	uint16_t ml_peer_id;
1695*5113495bSYour Name 	enum primary_link_peer_migration_evenr_status status;
1696*5113495bSYour Name };
1697*5113495bSYour Name #endif /* QCA_SUPPORT_PRIMARY_LINK_MIGRATE */
1698*5113495bSYour Name 
1699*5113495bSYour Name /**
1700*5113495bSYour Name  * struct wlan_mlo_sta_entry - MLO sta entry
1701*5113495bSYour Name  * @mac_node: QDF list mac_node member
1702*5113495bSYour Name  * @peer_mld_addr: MLO peer MAC address
1703*5113495bSYour Name  */
1704*5113495bSYour Name 
1705*5113495bSYour Name struct wlan_mlo_sta_entry {
1706*5113495bSYour Name 	qdf_list_node_t mac_node;
1707*5113495bSYour Name 	struct qdf_mac_addr peer_mld_addr;
1708*5113495bSYour Name };
1709*5113495bSYour Name 
1710*5113495bSYour Name #endif
1711