xref: /wlan-driver/qca-wifi-host-cmn/umac/mlo_mgr/inc/wlan_mlo_epcs.h (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
3*5113495bSYour Name  *
4*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for any
5*5113495bSYour Name  * purpose with or without fee is hereby granted, provided that the above
6*5113495bSYour Name  * copyright notice and this permission notice appear in all copies.
7*5113495bSYour Name  *
8*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9*5113495bSYour Name  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10*5113495bSYour Name  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11*5113495bSYour Name  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12*5113495bSYour Name  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13*5113495bSYour Name  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14*5113495bSYour Name  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15*5113495bSYour Name  */
16*5113495bSYour Name 
17*5113495bSYour Name /**
18*5113495bSYour Name  * DOC: contains EPCS APIs
19*5113495bSYour Name  */
20*5113495bSYour Name 
21*5113495bSYour Name #ifndef _WLAN_MLO_EPCS_H_
22*5113495bSYour Name #define _WLAN_MLO_EPCS_H_
23*5113495bSYour Name 
24*5113495bSYour Name #include <wlan_cmn_ieee80211.h>
25*5113495bSYour Name #include <wlan_mlo_mgr_public_structs.h>
26*5113495bSYour Name #ifdef WMI_AP_SUPPORT
27*5113495bSYour Name #include <wlan_cmn.h>
28*5113495bSYour Name #endif
29*5113495bSYour Name 
30*5113495bSYour Name struct wlan_mlo_peer_context;
31*5113495bSYour Name 
32*5113495bSYour Name /**
33*5113495bSYour Name  * enum wlan_epcs_category - epcs category
34*5113495bSYour Name  *
35*5113495bSYour Name  * @WLAN_EPCS_CATEGORY_NONE: none
36*5113495bSYour Name  * @WLAN_EPCS_CATEGORY_REQUEST: EPCS request
37*5113495bSYour Name  * @WLAN_EPCS_CATEGORY_RESPONSE: EPCS response
38*5113495bSYour Name  * @WLAN_EPCS_CATEGORY_TEARDOWN: EPCS teardown
39*5113495bSYour Name  * @WLAN_EPCS_CATEGORY_INVALID: Invalid
40*5113495bSYour Name  */
41*5113495bSYour Name enum wlan_epcs_category {
42*5113495bSYour Name 	WLAN_EPCS_CATEGORY_NONE = 0,
43*5113495bSYour Name 	WLAN_EPCS_CATEGORY_REQUEST = 3,
44*5113495bSYour Name 	WLAN_EPCS_CATEGORY_RESPONSE = 4,
45*5113495bSYour Name 	WLAN_EPCS_CATEGORY_TEARDOWN = 5,
46*5113495bSYour Name 	WLAN_EPCS_CATEGORY_INVALID,
47*5113495bSYour Name };
48*5113495bSYour Name 
49*5113495bSYour Name /**
50*5113495bSYour Name  * struct ml_pa_partner_link_info - Priority Access ML partner information
51*5113495bSYour Name  * @link_id: Link ID
52*5113495bSYour Name  * @edca_ie_present: EDCA IE present
53*5113495bSYour Name  * @muedca_ie_present: MU EDCA IE present
54*5113495bSYour Name  * @ven_wme_ie_present: WME IE present
55*5113495bSYour Name  * @edca: EDCA IE
56*5113495bSYour Name  * @muedca: MU EDCA IE
57*5113495bSYour Name  * @ven_wme_ie_bytes: WME IE
58*5113495bSYour Name  */
59*5113495bSYour Name struct ml_pa_partner_link_info {
60*5113495bSYour Name 	uint8_t link_id;
61*5113495bSYour Name 	uint8_t edca_ie_present:1,
62*5113495bSYour Name 		muedca_ie_present:1,
63*5113495bSYour Name 		ven_wme_ie_present:1;
64*5113495bSYour Name 	union {
65*5113495bSYour Name 		struct edca_ie edca;
66*5113495bSYour Name 		uint8_t ven_wme_ie_bytes[WLAN_VENDOR_WME_IE_LEN + 2];
67*5113495bSYour Name 	};
68*5113495bSYour Name 	struct muedca_ie muedca;
69*5113495bSYour Name };
70*5113495bSYour Name 
71*5113495bSYour Name /**
72*5113495bSYour Name  * struct ml_pa_info - priority access ML info
73*5113495bSYour Name  * @mld_mac_addr: MLD mac address
74*5113495bSYour Name  * @num_links: Number of Links
75*5113495bSYour Name  * @link_info: Partner link information
76*5113495bSYour Name  */
77*5113495bSYour Name struct ml_pa_info {
78*5113495bSYour Name 	struct qdf_mac_addr mld_mac_addr;
79*5113495bSYour Name 	uint8_t num_links;
80*5113495bSYour Name 	struct ml_pa_partner_link_info link_info[WLAN_UMAC_MLO_MAX_VDEVS];
81*5113495bSYour Name };
82*5113495bSYour Name 
83*5113495bSYour Name /**
84*5113495bSYour Name  * struct wlan_epcs_info - EPCS information of frame
85*5113495bSYour Name  * @cat: frame category
86*5113495bSYour Name  * @dialog_token: dialog token
87*5113495bSYour Name  * @status: status
88*5113495bSYour Name  * @pa_info: Priority access ML info
89*5113495bSYour Name  */
90*5113495bSYour Name struct wlan_epcs_info {
91*5113495bSYour Name 	enum wlan_epcs_category cat;
92*5113495bSYour Name 	uint8_t dialog_token;
93*5113495bSYour Name 	uint16_t status;
94*5113495bSYour Name 	struct ml_pa_info pa_info;
95*5113495bSYour Name };
96*5113495bSYour Name 
97*5113495bSYour Name /**
98*5113495bSYour Name  * enum peer_epcs_state - epcs stat of peer
99*5113495bSYour Name  * @EPCS_DOWN: EPCS state down
100*5113495bSYour Name  * @EPCS_ENABLE: EPCS state enabled
101*5113495bSYour Name  */
102*5113495bSYour Name enum peer_epcs_state {
103*5113495bSYour Name 	EPCS_DOWN,
104*5113495bSYour Name 	EPCS_ENABLE
105*5113495bSYour Name };
106*5113495bSYour Name 
107*5113495bSYour Name /**
108*5113495bSYour Name  * struct wlan_mlo_peer_epcs_info - Peer EPCS information
109*5113495bSYour Name  * @epcs_dev_peer_lock: epcs dev peer lock
110*5113495bSYour Name  * @state: EPCS state of peer
111*5113495bSYour Name  * @self_gen_dialog_token: selfgenerated dialog token
112*5113495bSYour Name  */
113*5113495bSYour Name struct wlan_mlo_peer_epcs_info {
114*5113495bSYour Name #ifdef WLAN_MLO_USE_SPINLOCK
115*5113495bSYour Name 	qdf_spinlock_t epcs_dev_peer_lock;
116*5113495bSYour Name #else
117*5113495bSYour Name 	qdf_mutex_t epcs_dev_peer_lock;
118*5113495bSYour Name #endif
119*5113495bSYour Name 	enum peer_epcs_state state;
120*5113495bSYour Name 	uint8_t self_gen_dialog_token;
121*5113495bSYour Name };
122*5113495bSYour Name 
123*5113495bSYour Name #define EPCS_MAX_AUTHORIZE_MAC_ADDR 32
124*5113495bSYour Name /**
125*5113495bSYour Name  * struct epcs_peer_authorize_info - EPCS authorized mac addresses
126*5113495bSYour Name  * @valid: valid index if set t0 true
127*5113495bSYour Name  * @peer_mld_mac: mld mac address
128*5113495bSYour Name  */
129*5113495bSYour Name struct epcs_peer_authorize_info {
130*5113495bSYour Name 	bool valid;
131*5113495bSYour Name 	uint8_t peer_mld_mac[QDF_MAC_ADDR_SIZE];
132*5113495bSYour Name };
133*5113495bSYour Name 
134*5113495bSYour Name /**
135*5113495bSYour Name  * struct wlan_epcs_context - EPCS context if MLD
136*5113495bSYour Name  * @epcs_dev_lock: epcs dev context lock
137*5113495bSYour Name  * @authorize_info: Array of Authorization info containing peer mac address
138*5113495bSYour Name  */
139*5113495bSYour Name struct wlan_epcs_context {
140*5113495bSYour Name #ifdef WLAN_MLO_USE_SPINLOCK
141*5113495bSYour Name 	qdf_spinlock_t epcs_dev_lock;
142*5113495bSYour Name #else
143*5113495bSYour Name 	qdf_mutex_t epcs_dev_lock;
144*5113495bSYour Name #endif
145*5113495bSYour Name 	struct epcs_peer_authorize_info
146*5113495bSYour Name 			authorize_info[EPCS_MAX_AUTHORIZE_MAC_ADDR];
147*5113495bSYour Name };
148*5113495bSYour Name 
149*5113495bSYour Name /**
150*5113495bSYour Name  * struct epcs_frm - EPCS action frame format
151*5113495bSYour Name  * @category: category
152*5113495bSYour Name  * @protected_eht_action: Protected EHT Action
153*5113495bSYour Name  * @dialog_token: Dialog Token
154*5113495bSYour Name  * @status_code: Status Code
155*5113495bSYour Name  * @req: Request frame
156*5113495bSYour Name  * @resp: Response frame
157*5113495bSYour Name  * @bytes: Priority Access Multi-Link element bytes
158*5113495bSYour Name  */
159*5113495bSYour Name struct epcs_frm {
160*5113495bSYour Name 	uint8_t category;
161*5113495bSYour Name 	uint8_t protected_eht_action;
162*5113495bSYour Name 	uint8_t dialog_token;
163*5113495bSYour Name 	union {
164*5113495bSYour Name 		struct {
165*5113495bSYour Name 			uint8_t bytes[0];
166*5113495bSYour Name 		} req;
167*5113495bSYour Name 		struct {
168*5113495bSYour Name 			uint8_t status_code[2];
169*5113495bSYour Name 			uint8_t bytes[0];
170*5113495bSYour Name 		} resp;
171*5113495bSYour Name 	};
172*5113495bSYour Name };
173*5113495bSYour Name 
174*5113495bSYour Name /* MIN EPCS request frame length */
175*5113495bSYour Name #define EPCS_REQ_MIN_LENGTH 3
176*5113495bSYour Name 
177*5113495bSYour Name /* MIN EPCS response frame length */
178*5113495bSYour Name #define EPCS_RESP_MIN_LENGTH 5
179*5113495bSYour Name 
180*5113495bSYour Name #define epcs_alert(format, args...) \
181*5113495bSYour Name 		QDF_TRACE_FATAL(QDF_MODULE_ID_EPCS, format, ## args)
182*5113495bSYour Name 
183*5113495bSYour Name #define epcs_err(format, args...) \
184*5113495bSYour Name 		QDF_TRACE_ERROR(QDF_MODULE_ID_EPCS, format, ## args)
185*5113495bSYour Name 
186*5113495bSYour Name #define epcs_warn(format, args...) \
187*5113495bSYour Name 		QDF_TRACE_WARN(QDF_MODULE_ID_EPCS, format, ## args)
188*5113495bSYour Name 
189*5113495bSYour Name #define epcs_info(format, args...) \
190*5113495bSYour Name 		QDF_TRACE_INFO(QDF_MODULE_ID_EPCS, format, ## args)
191*5113495bSYour Name 
192*5113495bSYour Name #define epcs_debug(format, args...) \
193*5113495bSYour Name 		QDF_TRACE_DEBUG(QDF_MODULE_ID_EPCS, format, ## args)
194*5113495bSYour Name 
195*5113495bSYour Name #define epcs_rl_debug(format, args...) \
196*5113495bSYour Name 		QDF_TRACE_DEBUG_RL(QDF_MODULE_ID_EPCS, format, ## args)
197*5113495bSYour Name 
198*5113495bSYour Name #ifdef WLAN_MLO_USE_SPINLOCK
199*5113495bSYour Name /**
200*5113495bSYour Name  * epcs_dev_lock_create - Create EPCS device mutex/spinlock
201*5113495bSYour Name  * @epcs_ctx: EPCS context
202*5113495bSYour Name  *
203*5113495bSYour Name  * Creates mutex/spinlock
204*5113495bSYour Name  *
205*5113495bSYour Name  * Return: void
206*5113495bSYour Name  */
207*5113495bSYour Name static inline void
epcs_dev_lock_create(struct wlan_epcs_context * epcs_ctx)208*5113495bSYour Name epcs_dev_lock_create(struct wlan_epcs_context *epcs_ctx)
209*5113495bSYour Name {
210*5113495bSYour Name 	qdf_spinlock_create(&epcs_ctx->epcs_dev_lock);
211*5113495bSYour Name }
212*5113495bSYour Name 
213*5113495bSYour Name /**
214*5113495bSYour Name  * epcs_dev_lock_destroy - Destroy EPCS mutex/spinlock
215*5113495bSYour Name  * @epcs_ctx: EPCS context
216*5113495bSYour Name  *
217*5113495bSYour Name  * Destroy mutex/spinlock
218*5113495bSYour Name  *
219*5113495bSYour Name  * Return: void
220*5113495bSYour Name  */
221*5113495bSYour Name static inline void
epcs_dev_lock_destroy(struct wlan_epcs_context * epcs_ctx)222*5113495bSYour Name epcs_dev_lock_destroy(struct wlan_epcs_context *epcs_ctx)
223*5113495bSYour Name {
224*5113495bSYour Name 	qdf_spinlock_destroy(&epcs_ctx->epcs_dev_lock);
225*5113495bSYour Name }
226*5113495bSYour Name 
227*5113495bSYour Name /**
228*5113495bSYour Name  * epcs_dev_lock_acquire - acquire EPCS mutex/spinlock
229*5113495bSYour Name  * @epcs_ctx: EPCS context
230*5113495bSYour Name  *
231*5113495bSYour Name  * acquire mutex/spinlock
232*5113495bSYour Name  *
233*5113495bSYour Name  * return: void
234*5113495bSYour Name  */
235*5113495bSYour Name static inline
epcs_dev_lock_acquire(struct wlan_epcs_context * epcs_ctx)236*5113495bSYour Name void epcs_dev_lock_acquire(struct wlan_epcs_context *epcs_ctx)
237*5113495bSYour Name {
238*5113495bSYour Name 	qdf_spin_lock_bh(&epcs_ctx->epcs_dev_lock);
239*5113495bSYour Name }
240*5113495bSYour Name 
241*5113495bSYour Name /**
242*5113495bSYour Name  * epcs_dev_lock_release - release EPCS dev mutex/spinlock
243*5113495bSYour Name  * @epcs_ctx: EPCS context
244*5113495bSYour Name  *
245*5113495bSYour Name  * release mutex/spinlock
246*5113495bSYour Name  *
247*5113495bSYour Name  * return: void
248*5113495bSYour Name  */
249*5113495bSYour Name static inline
epcs_dev_lock_release(struct wlan_epcs_context * epcs_ctx)250*5113495bSYour Name void epcs_dev_lock_release(struct wlan_epcs_context *epcs_ctx)
251*5113495bSYour Name {
252*5113495bSYour Name 	qdf_spin_unlock_bh(&epcs_ctx->epcs_dev_lock);
253*5113495bSYour Name }
254*5113495bSYour Name #else /* WLAN_MLO_USE_SPINLOCK */
255*5113495bSYour Name static inline
epcs_dev_lock_create(struct wlan_epcs_context * epcs_ctx)256*5113495bSYour Name void epcs_dev_lock_create(struct wlan_epcs_context *epcs_ctx)
257*5113495bSYour Name {
258*5113495bSYour Name 	qdf_mutex_create(&epcs_ctx->epcs_dev_lock);
259*5113495bSYour Name }
260*5113495bSYour Name 
261*5113495bSYour Name static inline
epcs_dev_lock_destroy(struct wlan_epcs_context * epcs_ctx)262*5113495bSYour Name void epcs_dev_lock_destroy(struct wlan_epcs_context *epcs_ctx)
263*5113495bSYour Name {
264*5113495bSYour Name 	qdf_mutex_destroy(&epcs_ctx->epcs_dev_lock);
265*5113495bSYour Name }
266*5113495bSYour Name 
epcs_dev_lock_acquire(struct wlan_epcs_context * epcs_ctx)267*5113495bSYour Name static inline void epcs_dev_lock_acquire(struct wlan_epcs_context *epcs_ctx)
268*5113495bSYour Name {
269*5113495bSYour Name 	qdf_mutex_acquire(&epcs_ctx->epcs_dev_lock);
270*5113495bSYour Name }
271*5113495bSYour Name 
epcs_dev_lock_release(struct wlan_epcs_context * epcs_ctx)272*5113495bSYour Name static inline void epcs_dev_lock_release(struct wlan_epcs_context *epcs_ctx)
273*5113495bSYour Name {
274*5113495bSYour Name 	qdf_mutex_release(&epcs_ctx->epcs_dev_lock);
275*5113495bSYour Name }
276*5113495bSYour Name #endif
277*5113495bSYour Name 
278*5113495bSYour Name #ifdef WLAN_MLO_USE_SPINLOCK
279*5113495bSYour Name /**
280*5113495bSYour Name  * epcs_dev_peer_lock_create - Create EPCS device mutex/spinlock
281*5113495bSYour Name  * @epcs_info: EPCS info
282*5113495bSYour Name  *
283*5113495bSYour Name  * Creates mutex/spinlock
284*5113495bSYour Name  *
285*5113495bSYour Name  * Return: void
286*5113495bSYour Name  */
287*5113495bSYour Name static inline
epcs_dev_peer_lock_create(struct wlan_mlo_peer_epcs_info * epcs_info)288*5113495bSYour Name void epcs_dev_peer_lock_create(struct wlan_mlo_peer_epcs_info *epcs_info)
289*5113495bSYour Name {
290*5113495bSYour Name 	qdf_spinlock_create(&epcs_info->epcs_dev_peer_lock);
291*5113495bSYour Name }
292*5113495bSYour Name 
293*5113495bSYour Name /**
294*5113495bSYour Name  * epcs_dev_peer_lock_destroy - Destroy EPCS mutex/spinlock
295*5113495bSYour Name  * @epcs_info: EPCS info
296*5113495bSYour Name  *
297*5113495bSYour Name  * Destroy mutex/spinlock
298*5113495bSYour Name  *
299*5113495bSYour Name  * Return: void
300*5113495bSYour Name  */
301*5113495bSYour Name static inline
epcs_dev_peer_lock_destroy(struct wlan_mlo_peer_epcs_info * epcs_info)302*5113495bSYour Name void epcs_dev_peer_lock_destroy(struct wlan_mlo_peer_epcs_info *epcs_info)
303*5113495bSYour Name {
304*5113495bSYour Name 	qdf_spinlock_destroy(&epcs_info->epcs_dev_peer_lock);
305*5113495bSYour Name }
306*5113495bSYour Name 
307*5113495bSYour Name /**
308*5113495bSYour Name  * epcs_dev_peer_lock_acquire - acquire EPCS mutex/spinlock
309*5113495bSYour Name  * @epcs_info: EPCS info
310*5113495bSYour Name  *
311*5113495bSYour Name  * acquire mutex/spinlock
312*5113495bSYour Name  *
313*5113495bSYour Name  * return: void
314*5113495bSYour Name  */
315*5113495bSYour Name static inline
epcs_dev_peer_lock_acquire(struct wlan_mlo_peer_epcs_info * epcs_info)316*5113495bSYour Name void epcs_dev_peer_lock_acquire(struct wlan_mlo_peer_epcs_info *epcs_info)
317*5113495bSYour Name {
318*5113495bSYour Name 	qdf_spin_lock_bh(&epcs_info->epcs_dev_peer_lock);
319*5113495bSYour Name }
320*5113495bSYour Name 
321*5113495bSYour Name /**
322*5113495bSYour Name  * epcs_dev_peer_lock_release - release EPCS dev mutex/spinlock
323*5113495bSYour Name  * @epcs_info: EPCS info
324*5113495bSYour Name  *
325*5113495bSYour Name  * release mutex/spinlock
326*5113495bSYour Name  *
327*5113495bSYour Name  * return: void
328*5113495bSYour Name  */
329*5113495bSYour Name static inline
epcs_dev_peer_lock_release(struct wlan_mlo_peer_epcs_info * epcs_info)330*5113495bSYour Name void epcs_dev_peer_lock_release(struct wlan_mlo_peer_epcs_info *epcs_info)
331*5113495bSYour Name {
332*5113495bSYour Name 	qdf_spin_unlock_bh(&epcs_info->epcs_dev_peer_lock);
333*5113495bSYour Name }
334*5113495bSYour Name #else /* WLAN_MLO_USE_SPINLOCK */
335*5113495bSYour Name static inline
epcs_dev_peer_lock_create(struct wlan_mlo_peer_epcs_info * epcs_info)336*5113495bSYour Name void epcs_dev_peer_lock_create(struct wlan_mlo_peer_epcs_info *epcs_info)
337*5113495bSYour Name {
338*5113495bSYour Name 	qdf_mutex_create(&epcs_info->epcs_dev_peer_lock);
339*5113495bSYour Name }
340*5113495bSYour Name 
341*5113495bSYour Name static inline
epcs_dev_peer_lock_destroy(struct wlan_mlo_peer_epcs_info * epcs_info)342*5113495bSYour Name void epcs_dev_peer_lock_destroy(struct wlan_mlo_peer_epcs_info *epcs_info)
343*5113495bSYour Name {
344*5113495bSYour Name 	qdf_mutex_destroy(&epcs_info->epcs_dev_peer_lock);
345*5113495bSYour Name }
346*5113495bSYour Name 
347*5113495bSYour Name static inline
epcs_dev_peer_lock_acquire(struct wlan_mlo_peer_epcs_info * epcs_info)348*5113495bSYour Name void epcs_dev_peer_lock_acquire(struct wlan_mlo_peer_epcs_info *epcs_info)
349*5113495bSYour Name {
350*5113495bSYour Name 	qdf_mutex_acquire(&epcs_info->epcs_dev_peer_lock);
351*5113495bSYour Name }
352*5113495bSYour Name 
353*5113495bSYour Name static inline
epcs_dev_peer_lock_release(struct wlan_mlo_peer_epcs_info * epcs_info)354*5113495bSYour Name void epcs_dev_peer_lock_release(struct wlan_mlo_peer_epcs_info *epcs_info)
355*5113495bSYour Name {
356*5113495bSYour Name 	qdf_mutex_release(&epcs_info->epcs_dev_peer_lock);
357*5113495bSYour Name }
358*5113495bSYour Name #endif
359*5113495bSYour Name 
360*5113495bSYour Name /**
361*5113495bSYour Name  * wlan_mlo_add_epcs_action_frame() - API to add EPCS action frame
362*5113495bSYour Name  * @frm: Pointer to a frame to add EPCS information
363*5113495bSYour Name  * @args: EPCS action frame related info
364*5113495bSYour Name  * @buf: Pointer to EPCS IE values
365*5113495bSYour Name  *
366*5113495bSYour Name  * Return: Pointer to the updated frame buffer
367*5113495bSYour Name  */
368*5113495bSYour Name uint8_t *wlan_mlo_add_epcs_action_frame(uint8_t *frm,
369*5113495bSYour Name 					struct wlan_action_frame_args *args,
370*5113495bSYour Name 					uint8_t *buf);
371*5113495bSYour Name 
372*5113495bSYour Name /**
373*5113495bSYour Name  * wlan_mlo_parse_epcs_action_frame() - API to parse EPCS action frame
374*5113495bSYour Name  * @epcs: Pointer to EPCS information
375*5113495bSYour Name  * @action_frm: EPCS action frame
376*5113495bSYour Name  * @frm_len: frame length
377*5113495bSYour Name  *
378*5113495bSYour Name  * Return: QDF_STATUS
379*5113495bSYour Name  */
380*5113495bSYour Name QDF_STATUS
381*5113495bSYour Name wlan_mlo_parse_epcs_action_frame(struct wlan_epcs_info *epcs,
382*5113495bSYour Name 				 struct wlan_action_frame *action_frm,
383*5113495bSYour Name 				 uint32_t frm_len);
384*5113495bSYour Name 
385*5113495bSYour Name /**
386*5113495bSYour Name  * wlan_mlo_peer_rcv_cmd() - API to process EPCS command
387*5113495bSYour Name  * @ml_peer: Pointer to ML peer received
388*5113495bSYour Name  * @epcs: Pointer to EPCS information
389*5113495bSYour Name  * @updparam: pointer to fill update parameters
390*5113495bSYour Name  *
391*5113495bSYour Name  * Return: QDF_STATUS
392*5113495bSYour Name  */
393*5113495bSYour Name QDF_STATUS
394*5113495bSYour Name wlan_mlo_peer_rcv_cmd(struct wlan_mlo_peer_context *ml_peer,
395*5113495bSYour Name 		      struct wlan_epcs_info *epcs,
396*5113495bSYour Name 		      bool *updparam);
397*5113495bSYour Name 
398*5113495bSYour Name /**
399*5113495bSYour Name  * wlan_mlo_peer_rcv_action_frame() - API to process EPCS frame receive event
400*5113495bSYour Name  * @ml_peer: Pointer to ML peer received
401*5113495bSYour Name  * @epcs: Pointer to EPCS information
402*5113495bSYour Name  * @respond: pointer to fill response required or not
403*5113495bSYour Name  * @updparam: pointer to fill update parameters
404*5113495bSYour Name  *
405*5113495bSYour Name  * Return: QDF_STATUS
406*5113495bSYour Name  */
407*5113495bSYour Name QDF_STATUS
408*5113495bSYour Name wlan_mlo_peer_rcv_action_frame(struct wlan_mlo_peer_context *ml_peer,
409*5113495bSYour Name 			       struct wlan_epcs_info *epcs,
410*5113495bSYour Name 			       bool *respond,
411*5113495bSYour Name 			       bool *updparam);
412*5113495bSYour Name 
413*5113495bSYour Name /**
414*5113495bSYour Name  * wlan_mlo_update_authorize_epcs_mac_addr() - API to authorize mac addr
415*5113495bSYour Name  * @vdev: pointer to vdev
416*5113495bSYour Name  * @peer_mld_mac: mld mac address
417*5113495bSYour Name  *
418*5113495bSYour Name  * Return: QDF_STATUS
419*5113495bSYour Name  */
420*5113495bSYour Name QDF_STATUS
421*5113495bSYour Name wlan_mlo_update_authorize_epcs_mac_addr(struct wlan_objmgr_vdev *vdev,
422*5113495bSYour Name 					uint8_t *peer_mld_mac);
423*5113495bSYour Name 
424*5113495bSYour Name /**
425*5113495bSYour Name  * wlan_mlo_update_deauthorize_epcs_mac_addr() - API to deauthorize mac addr
426*5113495bSYour Name  * @vdev: pointer to vdev
427*5113495bSYour Name  * @peer_mld_mac: mld mac address
428*5113495bSYour Name  *
429*5113495bSYour Name  * Return: QDF_STATUS
430*5113495bSYour Name  */
431*5113495bSYour Name QDF_STATUS
432*5113495bSYour Name wlan_mlo_update_deauthorize_epcs_mac_addr(struct wlan_objmgr_vdev *vdev,
433*5113495bSYour Name 					  uint8_t *peer_mld_mac);
434*5113495bSYour Name #endif /* _WLAN_MLO_EPCS_H_ */
435