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