1*5113495bSYour Name /*
2*5113495bSYour Name * Copyright (c) 2011-2012,2016-2020 The Linux Foundation. All rights reserved.
3*5113495bSYour Name * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name *
5*5113495bSYour Name * Permission to use, copy, modify, and/or distribute this software for
6*5113495bSYour Name * any purpose with or without fee is hereby granted, provided that the
7*5113495bSYour Name * above copyright notice and this permission notice appear in all
8*5113495bSYour Name * copies.
9*5113495bSYour Name *
10*5113495bSYour Name * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11*5113495bSYour Name * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12*5113495bSYour Name * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13*5113495bSYour Name * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14*5113495bSYour Name * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15*5113495bSYour Name * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16*5113495bSYour Name * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*5113495bSYour Name * PERFORMANCE OF THIS SOFTWARE.
18*5113495bSYour Name */
19*5113495bSYour Name
20*5113495bSYour Name #ifndef _WLAN_HDD_WMM_H
21*5113495bSYour Name #define _WLAN_HDD_WMM_H
22*5113495bSYour Name
23*5113495bSYour Name /**
24*5113495bSYour Name * DOC: HDD WMM
25*5113495bSYour Name *
26*5113495bSYour Name * This module (wlan_hdd_wmm.h interface + wlan_hdd_wmm.c implementation)
27*5113495bSYour Name * houses all the logic for WMM in HDD.
28*5113495bSYour Name *
29*5113495bSYour Name * On the control path, it has the logic to setup QoS, modify QoS and delete
30*5113495bSYour Name * QoS (QoS here refers to a TSPEC). The setup QoS comes in two flavors: an
31*5113495bSYour Name * explicit application invoked and an internal HDD invoked. The implicit QoS
32*5113495bSYour Name * is for applications that do NOT call the custom QCT WLAN OIDs for QoS but
33*5113495bSYour Name * which DO mark their traffic for priortization. It also has logic to start,
34*5113495bSYour Name * update and stop the U-APSD trigger frame generation. It also has logic to
35*5113495bSYour Name * read WMM related config parameters from the registry.
36*5113495bSYour Name *
37*5113495bSYour Name * On the data path, it has the logic to figure out the WMM AC of an egress
38*5113495bSYour Name * packet and when to signal TL to serve a particular AC queue. It also has the
39*5113495bSYour Name * logic to retrieve a packet based on WMM priority in response to a fetch from
40*5113495bSYour Name * TL.
41*5113495bSYour Name *
42*5113495bSYour Name * The remaining functions are utility functions for information hiding.
43*5113495bSYour Name */
44*5113495bSYour Name
45*5113495bSYour Name /* Include files */
46*5113495bSYour Name #include <linux/workqueue.h>
47*5113495bSYour Name #include <linux/list.h>
48*5113495bSYour Name #include <wlan_hdd_main.h>
49*5113495bSYour Name #include <wlan_hdd_wext.h>
50*5113495bSYour Name #include <sme_qos_api.h>
51*5113495bSYour Name #include <qca_vendor.h>
52*5113495bSYour Name
53*5113495bSYour Name /*Maximum number of ACs */
54*5113495bSYour Name #define WLAN_MAX_AC 4
55*5113495bSYour Name
56*5113495bSYour Name
57*5113495bSYour Name /* Preprocessor Definitions and Constants */
58*5113495bSYour Name
59*5113495bSYour Name /* #define HDD_WMM_DEBUG 1 */
60*5113495bSYour Name
61*5113495bSYour Name #define HDD_WMM_CTX_MAGIC 0x574d4d58 /* "WMMX" */
62*5113495bSYour Name
63*5113495bSYour Name #define HDD_WMM_HANDLE_IMPLICIT 0xFFFFFFFF
64*5113495bSYour Name
65*5113495bSYour Name #define HDD_WLAN_INVALID_STA_ID 0xFF
66*5113495bSYour Name
67*5113495bSYour Name /* Type Declarations */
68*5113495bSYour Name
69*5113495bSYour Name /**
70*5113495bSYour Name * enum hdd_wmm_user_mode - WMM modes of operation
71*5113495bSYour Name *
72*5113495bSYour Name * @HDD_WMM_USER_MODE_AUTO: STA can associate with any AP, & HDD looks at
73*5113495bSYour Name * the SME notification after association to find out if associated
74*5113495bSYour Name * with QAP and acts accordingly
75*5113495bSYour Name * @HDD_WMM_USER_MODE_QBSS_ONLY: SME will add the extra logic to make sure
76*5113495bSYour Name * STA associates with a QAP only
77*5113495bSYour Name * @HDD_WMM_USER_MODE_NO_QOS: Join any AP, but uapsd is disabled
78*5113495bSYour Name */
79*5113495bSYour Name enum hdd_wmm_user_mode {
80*5113495bSYour Name HDD_WMM_USER_MODE_AUTO = 0,
81*5113495bSYour Name HDD_WMM_USER_MODE_QBSS_ONLY = 1,
82*5113495bSYour Name HDD_WMM_USER_MODE_NO_QOS = 2,
83*5113495bSYour Name };
84*5113495bSYour Name
85*5113495bSYour Name /* UAPSD Mask bits */
86*5113495bSYour Name /* (Bit0:VO; Bit1:VI; Bit2:BK; Bit3:BE all other bits are ignored) */
87*5113495bSYour Name #define HDD_AC_VO 0x1
88*5113495bSYour Name #define HDD_AC_VI 0x2
89*5113495bSYour Name #define HDD_AC_BK 0x4
90*5113495bSYour Name #define HDD_AC_BE 0x8
91*5113495bSYour Name
92*5113495bSYour Name /**
93*5113495bSYour Name * enum hdd_wmm_linuxac: AC/Queue Index values for Linux Qdisc to
94*5113495bSYour Name * operate on different traffic.
95*5113495bSYour Name * @HDD_LINUX_AC_VO: voice priority
96*5113495bSYour Name * @HDD_LINUX_AC_VI: video priority
97*5113495bSYour Name * @HDD_LINUX_AC_BE: best effort priority
98*5113495bSYour Name * @HDD_LINUX_AC_BK: background priority
99*5113495bSYour Name * @HDD_LINUX_AC_HI_PRIO: unclassified high priority
100*5113495bSYour Name */
101*5113495bSYour Name enum hdd_wmm_linuxac {
102*5113495bSYour Name HDD_LINUX_AC_VO = 0,
103*5113495bSYour Name HDD_LINUX_AC_VI = 1,
104*5113495bSYour Name HDD_LINUX_AC_BE = 2,
105*5113495bSYour Name HDD_LINUX_AC_BK = 3,
106*5113495bSYour Name HDD_LINUX_AC_HI_PRIO = 4,
107*5113495bSYour Name };
108*5113495bSYour Name
109*5113495bSYour Name /**
110*5113495bSYour Name * struct hdd_wmm_qos_context - HDD WMM QoS Context
111*5113495bSYour Name *
112*5113495bSYour Name * This structure holds the context for a single flow which has either
113*5113495bSYour Name * been configured explicitly from userspace or implicitly via the
114*5113495bSYour Name * Implicit QoS feature.
115*5113495bSYour Name *
116*5113495bSYour Name * @node: list node which can be used to put the context into a list
117*5113495bSYour Name * of contexts
118*5113495bSYour Name * @handle: identifier which uniquely identifies this context to userspace
119*5113495bSYour Name * @flow_id: identifier which uniquely identifies this flow to SME
120*5113495bSYour Name * @adapter: adapter upon which this flow was configured
121*5113495bSYour Name * @ac_type: access category for this flow
122*5113495bSYour Name * @status: the status of the last operation performed on this flow by SME
123*5113495bSYour Name * @implicit_qos_work: work structure used for deferring implicit QoS work
124*5113495bSYour Name * from softirq context to thread context
125*5113495bSYour Name * @magic: magic number used to verify that this is a valid context when
126*5113495bSYour Name * referenced anonymously
127*5113495bSYour Name * @is_inactivity_timer_running: true if inactivity timer is running
128*5113495bSYour Name * @ts_id: identifier which gets used at time of DEL request
129*5113495bSYour Name */
130*5113495bSYour Name struct hdd_wmm_qos_context {
131*5113495bSYour Name struct list_head node;
132*5113495bSYour Name uint32_t handle;
133*5113495bSYour Name uint32_t flow_id;
134*5113495bSYour Name struct hdd_adapter *adapter;
135*5113495bSYour Name sme_ac_enum_type ac_type;
136*5113495bSYour Name hdd_wlan_wmm_status_e status;
137*5113495bSYour Name struct work_struct implicit_qos_work;
138*5113495bSYour Name uint32_t magic;
139*5113495bSYour Name bool is_inactivity_timer_running;
140*5113495bSYour Name uint8_t ts_id;
141*5113495bSYour Name };
142*5113495bSYour Name
143*5113495bSYour Name /**
144*5113495bSYour Name * struct hdd_wmm_ac_status - WMM related per-AC state & status info
145*5113495bSYour Name * @is_access_required: does the AP require access to this AC?
146*5113495bSYour Name * @is_access_needed: does the worker thread need to acquire access to
147*5113495bSYour Name * this AC?
148*5113495bSYour Name * @is_access_pending: is implicit QoS negotiation currently taking place?
149*5113495bSYour Name * @has_access_failed: has implicit QoS negotiation already failed?
150*5113495bSYour Name * @was_access_granted: has implicit QoS negotiation already succeeded?
151*5113495bSYour Name * @is_access_allowed: is access to this AC allowed, either because we
152*5113495bSYour Name * are not doing WMM, we are not doing implicit QoS, implicit QoS has
153*5113495bSYour Name * completed, or explicit QoS has completed?
154*5113495bSYour Name * @is_tspec_valid: is the tspec valid?
155*5113495bSYour Name * @is_uapsd_info_valid: are the UAPSD-related fields valid?
156*5113495bSYour Name * @tspec: current (possibly aggregate) Tspec for this AC
157*5113495bSYour Name * @is_uapsd_enabled: is UAPSD enabled on this AC?
158*5113495bSYour Name * @uapsd_service_interval: service interval for this AC
159*5113495bSYour Name * @uapsd_suspension_interval: suspension interval for this AC
160*5113495bSYour Name * @uapsd_direction: direction for this AC
161*5113495bSYour Name * @inactivity_time: inactivity time for this AC
162*5113495bSYour Name * @last_traffic_count: TX counter used for inactivity detection
163*5113495bSYour Name * @inactivity_timer: timer used for inactivity detection
164*5113495bSYour Name */
165*5113495bSYour Name struct hdd_wmm_ac_status {
166*5113495bSYour Name bool is_access_required;
167*5113495bSYour Name bool is_access_needed;
168*5113495bSYour Name bool is_access_pending;
169*5113495bSYour Name bool has_access_failed;
170*5113495bSYour Name bool was_access_granted;
171*5113495bSYour Name bool is_access_allowed;
172*5113495bSYour Name bool is_tspec_valid;
173*5113495bSYour Name bool is_uapsd_info_valid;
174*5113495bSYour Name struct sme_qos_wmmtspecinfo tspec;
175*5113495bSYour Name bool is_uapsd_enabled;
176*5113495bSYour Name uint32_t uapsd_service_interval;
177*5113495bSYour Name uint32_t uapsd_suspension_interval;
178*5113495bSYour Name enum sme_qos_wmm_dir_type uapsd_direction;
179*5113495bSYour Name
180*5113495bSYour Name #ifdef FEATURE_WLAN_ESE
181*5113495bSYour Name uint32_t inactivity_time;
182*5113495bSYour Name uint32_t last_traffic_count;
183*5113495bSYour Name qdf_mc_timer_t inactivity_timer;
184*5113495bSYour Name #endif
185*5113495bSYour Name };
186*5113495bSYour Name
187*5113495bSYour Name /**
188*5113495bSYour Name * struct hdd_wmm_status - WMM status maintained per-adapter
189*5113495bSYour Name * @context_list: list of WMM contexts active on the adapter
190*5113495bSYour Name * @mutex: mutex used for exclusive access to this adapter's WMM status
191*5113495bSYour Name * @ac_status: per-AC WMM status
192*5113495bSYour Name * @qap: is this connected to a QoS-enabled AP?
193*5113495bSYour Name * @qos_connection: is this a QoS connection?
194*5113495bSYour Name */
195*5113495bSYour Name struct hdd_wmm_status {
196*5113495bSYour Name struct list_head context_list;
197*5113495bSYour Name struct mutex mutex;
198*5113495bSYour Name struct hdd_wmm_ac_status ac_status[WLAN_MAX_AC];
199*5113495bSYour Name bool qap;
200*5113495bSYour Name bool qos_connection;
201*5113495bSYour Name };
202*5113495bSYour Name
203*5113495bSYour Name extern const uint8_t hdd_qdisc_ac_to_tl_ac[];
204*5113495bSYour Name extern const uint8_t hdd_wmm_up_to_ac_map[];
205*5113495bSYour Name extern const uint8_t hdd_linux_up_to_ac_map[];
206*5113495bSYour Name
207*5113495bSYour Name /**
208*5113495bSYour Name * hdd_wmmps_helper() - Function to set uapsd psb dynamically
209*5113495bSYour Name *
210*5113495bSYour Name * @adapter: [in] pointer to adapter structure
211*5113495bSYour Name * @ptr: [in] pointer to command buffer
212*5113495bSYour Name *
213*5113495bSYour Name * Return: Zero on success, appropriate error on failure.
214*5113495bSYour Name */
215*5113495bSYour Name int hdd_wmmps_helper(struct hdd_adapter *adapter, uint8_t *ptr);
216*5113495bSYour Name
217*5113495bSYour Name /**
218*5113495bSYour Name * hdd_send_dscp_up_map_to_fw() - send dscp to up map to FW
219*5113495bSYour Name * @adapter : [in] pointer to Adapter context
220*5113495bSYour Name *
221*5113495bSYour Name * This function will send the WMM DSCP configuration of an
222*5113495bSYour Name * adapter to FW.
223*5113495bSYour Name *
224*5113495bSYour Name * Return: QDF_STATUS enumeration
225*5113495bSYour Name */
226*5113495bSYour Name QDF_STATUS hdd_send_dscp_up_map_to_fw(struct hdd_adapter *adapter);
227*5113495bSYour Name
228*5113495bSYour Name /**
229*5113495bSYour Name * hdd_wmm_dscp_initial_state() - initialize the WMM DSCP configuration
230*5113495bSYour Name * @adapter : [in] pointer to Adapter context
231*5113495bSYour Name *
232*5113495bSYour Name * This function will initialize the WMM DSCP configuration of an
233*5113495bSYour Name * adapter to an initial state. The configuration can later be
234*5113495bSYour Name * overwritten via application APIs or via QoS Map sent OTA.
235*5113495bSYour Name *
236*5113495bSYour Name * Return: QDF_STATUS enumeration
237*5113495bSYour Name */
238*5113495bSYour Name QDF_STATUS hdd_wmm_dscp_initial_state(struct hdd_adapter *adapter);
239*5113495bSYour Name
240*5113495bSYour Name /**
241*5113495bSYour Name * hdd_wmm_adapter_init() - initialize the WMM configuration of an adapter
242*5113495bSYour Name * @adapter: [in] pointer to Adapter context
243*5113495bSYour Name *
244*5113495bSYour Name * This function will initialize the WMM configuration and status of an
245*5113495bSYour Name * adapter to an initial state. The configuration can later be
246*5113495bSYour Name * overwritten via application APIs
247*5113495bSYour Name *
248*5113495bSYour Name * Return: QDF_STATUS enumeration
249*5113495bSYour Name */
250*5113495bSYour Name QDF_STATUS hdd_wmm_adapter_init(struct hdd_adapter *adapter);
251*5113495bSYour Name
252*5113495bSYour Name /**
253*5113495bSYour Name * hdd_wmm_adapter_close() - WMM close function
254*5113495bSYour Name * @adapter: [in] pointer to adapter context
255*5113495bSYour Name *
256*5113495bSYour Name * Function which will perform any necessary work to to clean up the
257*5113495bSYour Name * WMM functionality prior to the kernel module unload.
258*5113495bSYour Name *
259*5113495bSYour Name * Return: QDF_STATUS enumeration
260*5113495bSYour Name */
261*5113495bSYour Name QDF_STATUS hdd_wmm_adapter_close(struct hdd_adapter *adapter);
262*5113495bSYour Name
263*5113495bSYour Name /**
264*5113495bSYour Name * hdd_select_queue() - Return queue to be used.
265*5113495bSYour Name * @dev: Pointer to the WLAN device.
266*5113495bSYour Name * @skb: Pointer to OS packet (sk_buff).
267*5113495bSYour Name * @sb_dev: Pointer to subordinate device (unused)
268*5113495bSYour Name *
269*5113495bSYour Name * This function is registered with the Linux OS for network
270*5113495bSYour Name * core to decide which queue to use for the skb.
271*5113495bSYour Name *
272*5113495bSYour Name * Return: Qdisc queue index.
273*5113495bSYour Name */
274*5113495bSYour Name #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 4, 0))
275*5113495bSYour Name uint16_t hdd_select_queue(struct net_device *dev, struct sk_buff *skb,
276*5113495bSYour Name struct net_device *sb_dev);
277*5113495bSYour Name #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0))
278*5113495bSYour Name uint16_t hdd_select_queue(struct net_device *dev, struct sk_buff *skb,
279*5113495bSYour Name struct net_device *sb_dev,
280*5113495bSYour Name select_queue_fallback_t fallback);
281*5113495bSYour Name #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0))
282*5113495bSYour Name uint16_t hdd_select_queue(struct net_device *dev, struct sk_buff *skb,
283*5113495bSYour Name void *accel_priv, select_queue_fallback_t fallback);
284*5113495bSYour Name #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 13, 0))
285*5113495bSYour Name uint16_t hdd_select_queue(struct net_device *dev, struct sk_buff *skb,
286*5113495bSYour Name void *accel_priv);
287*5113495bSYour Name #else
288*5113495bSYour Name uint16_t hdd_select_queue(struct net_device *dev, struct sk_buff *skb);
289*5113495bSYour Name #endif
290*5113495bSYour Name
291*5113495bSYour Name /**
292*5113495bSYour Name * hdd_wmm_select_queue() - Function which will classify the packet
293*5113495bSYour Name * according to linux qdisc expectation.
294*5113495bSYour Name *
295*5113495bSYour Name * @dev: [in] pointer to net_device structure
296*5113495bSYour Name * @skb: [in] pointer to os packet
297*5113495bSYour Name *
298*5113495bSYour Name * Return: Qdisc queue index
299*5113495bSYour Name */
300*5113495bSYour Name uint16_t hdd_wmm_select_queue(struct net_device *dev,
301*5113495bSYour Name struct sk_buff *skb);
302*5113495bSYour Name
303*5113495bSYour Name /**
304*5113495bSYour Name * hdd_wmm_acquire_access_required() - Function which will determine
305*5113495bSYour Name * acquire admittance for a WMM AC is required or not based on psb configuration
306*5113495bSYour Name * done in framework
307*5113495bSYour Name *
308*5113495bSYour Name * @adapter: [in] pointer to adapter structure
309*5113495bSYour Name * @ac_type: [in] WMM AC type of OS packet
310*5113495bSYour Name *
311*5113495bSYour Name * Return: void
312*5113495bSYour Name */
313*5113495bSYour Name void hdd_wmm_acquire_access_required(struct hdd_adapter *adapter,
314*5113495bSYour Name sme_ac_enum_type ac_type);
315*5113495bSYour Name
316*5113495bSYour Name /**
317*5113495bSYour Name * hdd_wmm_acquire_access() - Function which will attempt to acquire
318*5113495bSYour Name * admittance for a WMM AC
319*5113495bSYour Name *
320*5113495bSYour Name * @adapter: [in] pointer to adapter context
321*5113495bSYour Name * @ac_type: [in] WMM AC type of OS packet
322*5113495bSYour Name * @granted: [out] pointer to bool flag when indicates if access
323*5113495bSYour Name * has been granted or not
324*5113495bSYour Name *
325*5113495bSYour Name * Return: QDF_STATUS enumeration
326*5113495bSYour Name */
327*5113495bSYour Name QDF_STATUS hdd_wmm_acquire_access(struct hdd_adapter *adapter,
328*5113495bSYour Name sme_ac_enum_type ac_type, bool *granted);
329*5113495bSYour Name
330*5113495bSYour Name /**
331*5113495bSYour Name * hdd_wmm_assoc() - Function which will handle the housekeeping
332*5113495bSYour Name * required by WMM when association takes place
333*5113495bSYour Name *
334*5113495bSYour Name * @adapter: pointer to adapter context
335*5113495bSYour Name * @is_reassoc: is this reassoc scenario
336*5113495bSYour Name * @uapsd_mask : Negotiated uapsd msk
337*5113495bSYour Name *
338*5113495bSYour Name * Return: QDF_STATUS enumeration
339*5113495bSYour Name */
340*5113495bSYour Name QDF_STATUS hdd_wmm_assoc(struct hdd_adapter *adapter,
341*5113495bSYour Name bool is_reassoc, uint8_t uapsd_mask);
342*5113495bSYour Name
343*5113495bSYour Name /**
344*5113495bSYour Name * hdd_wmm_connect() - Function which will handle the housekeeping
345*5113495bSYour Name * required by WMM when a connection is established
346*5113495bSYour Name *
347*5113495bSYour Name * @adapter : [in] pointer to adapter context
348*5113495bSYour Name * @roam_info: [in] pointer to roam information
349*5113495bSYour Name * @bss_type : [in] type of BSS
350*5113495bSYour Name *
351*5113495bSYour Name * Return: QDF_STATUS enumeration
352*5113495bSYour Name */
353*5113495bSYour Name QDF_STATUS hdd_wmm_connect(struct hdd_adapter *adapter,
354*5113495bSYour Name struct csr_roam_info *roam_info,
355*5113495bSYour Name eCsrRoamBssType bss_type);
356*5113495bSYour Name
357*5113495bSYour Name /**
358*5113495bSYour Name * hdd_wmm_is_active() - Function which will determine if WMM is
359*5113495bSYour Name * active on the current connection
360*5113495bSYour Name *
361*5113495bSYour Name * @adapter: [in] pointer to adapter context
362*5113495bSYour Name *
363*5113495bSYour Name * Return: true if WMM is enabled, false if WMM is not enabled
364*5113495bSYour Name */
365*5113495bSYour Name bool hdd_wmm_is_active(struct hdd_adapter *adapter);
366*5113495bSYour Name
367*5113495bSYour Name /**
368*5113495bSYour Name * hdd_wmm_is_acm_allowed() - Function which will determine if WMM is
369*5113495bSYour Name * active on the current connection
370*5113495bSYour Name *
371*5113495bSYour Name * @vdev_id: vdev id
372*5113495bSYour Name *
373*5113495bSYour Name * Return: true if WMM is enabled, false if WMM is not enabled
374*5113495bSYour Name */
375*5113495bSYour Name bool hdd_wmm_is_acm_allowed(uint8_t vdev_id);
376*5113495bSYour Name
377*5113495bSYour Name
378*5113495bSYour Name /**
379*5113495bSYour Name * hdd_wmm_addts() - Function which will add a traffic spec at the
380*5113495bSYour Name * request of an application
381*5113495bSYour Name *
382*5113495bSYour Name * @adapter : [in] pointer to adapter context
383*5113495bSYour Name * @handle : [in] handle to uniquely identify a TS
384*5113495bSYour Name * @tspec : [in] pointer to the traffic spec
385*5113495bSYour Name *
386*5113495bSYour Name * Return: HDD_WLAN_WMM_STATUS_*
387*5113495bSYour Name */
388*5113495bSYour Name hdd_wlan_wmm_status_e hdd_wmm_addts(struct hdd_adapter *adapter,
389*5113495bSYour Name uint32_t handle,
390*5113495bSYour Name struct sme_qos_wmmtspecinfo *tspec);
391*5113495bSYour Name
392*5113495bSYour Name /**
393*5113495bSYour Name * hdd_wmm_delts() - Function which will delete a traffic spec at the
394*5113495bSYour Name * request of an application
395*5113495bSYour Name *
396*5113495bSYour Name * @adapter: [in] pointer to adapter context
397*5113495bSYour Name * @handle: [in] handle to uniquely identify a TS
398*5113495bSYour Name *
399*5113495bSYour Name * Return: HDD_WLAN_WMM_STATUS_*
400*5113495bSYour Name */
401*5113495bSYour Name hdd_wlan_wmm_status_e hdd_wmm_delts(struct hdd_adapter *adapter,
402*5113495bSYour Name uint32_t handle);
403*5113495bSYour Name
404*5113495bSYour Name /**
405*5113495bSYour Name * hdd_wmm_checkts() - Function which will return the status of a traffic
406*5113495bSYour Name * spec at the request of an application
407*5113495bSYour Name *
408*5113495bSYour Name * @adapter: [in] pointer to adapter context
409*5113495bSYour Name * @handle: [in] handle to uniquely identify a TS
410*5113495bSYour Name *
411*5113495bSYour Name * Return: HDD_WLAN_WMM_STATUS_*
412*5113495bSYour Name */
413*5113495bSYour Name hdd_wlan_wmm_status_e hdd_wmm_checkts(struct hdd_adapter *adapter,
414*5113495bSYour Name uint32_t handle);
415*5113495bSYour Name /**
416*5113495bSYour Name * hdd_wmm_adapter_clear() - Function which will clear the WMM status
417*5113495bSYour Name * for all the ACs
418*5113495bSYour Name *
419*5113495bSYour Name * @adapter: [in] pointer to Adapter context
420*5113495bSYour Name *
421*5113495bSYour Name * Return: QDF_STATUS enumeration
422*5113495bSYour Name */
423*5113495bSYour Name QDF_STATUS hdd_wmm_adapter_clear(struct hdd_adapter *adapter);
424*5113495bSYour Name
425*5113495bSYour Name void wlan_hdd_process_peer_unauthorised_pause(struct hdd_adapter *adapter);
426*5113495bSYour Name
427*5113495bSYour Name extern const struct nla_policy
428*5113495bSYour Name config_tspec_policy[QCA_WLAN_VENDOR_ATTR_CONFIG_TSPEC_MAX + 1];
429*5113495bSYour Name
430*5113495bSYour Name /**
431*5113495bSYour Name * wlan_hdd_cfg80211_config_tspec() - config tpsec
432*5113495bSYour Name * @wiphy: pointer to wireless wiphy structure.
433*5113495bSYour Name * @wdev: pointer to wireless_dev structure.
434*5113495bSYour Name * @data: pointer to config tspec command parameters.
435*5113495bSYour Name * @data_len: the length in byte of config tspec command parameters.
436*5113495bSYour Name *
437*5113495bSYour Name * Return: An error code or 0 on success.
438*5113495bSYour Name */
439*5113495bSYour Name int wlan_hdd_cfg80211_config_tspec(struct wiphy *wiphy,
440*5113495bSYour Name struct wireless_dev *wdev,
441*5113495bSYour Name const void *data, int data_len);
442*5113495bSYour Name #ifdef QCA_SUPPORT_TX_MIN_RATES_FOR_SPECIAL_FRAMES
443*5113495bSYour Name /**
444*5113495bSYour Name * hdd_wmm_classify_pkt_cb() - Call back to identify critical packets
445*5113495bSYour Name * @adapter: adapter for which callback is called
446*5113495bSYour Name * @nbuf: skb for which callback is called
447*5113495bSYour Name *
448*5113495bSYour Name * Callback used by intrabss forwarding path to identify critical packets.
449*5113495bSYour Name * QDF_NBUF_CB_TX_EXTRA_IS_CRITICAL is marked 1 for such packets.
450*5113495bSYour Name * The function also populates sb->priority for these packets.
451*5113495bSYour Name * skb->priority is used as TID for these frames during TX.
452*5113495bSYour Name *
453*5113495bSYour Name * Return: None
454*5113495bSYour Name */
455*5113495bSYour Name void hdd_wmm_classify_pkt_cb(void *adapter,
456*5113495bSYour Name qdf_nbuf_t nbuf);
457*5113495bSYour Name #else
458*5113495bSYour Name static inline
hdd_wmm_classify_pkt_cb(void * adapter,qdf_nbuf_t nbuf)459*5113495bSYour Name void hdd_wmm_classify_pkt_cb(void *adapter,
460*5113495bSYour Name qdf_nbuf_t nbuf)
461*5113495bSYour Name {
462*5113495bSYour Name }
463*5113495bSYour Name #endif
464*5113495bSYour Name
465*5113495bSYour Name #define FEATURE_WMM_COMMANDS \
466*5113495bSYour Name { \
467*5113495bSYour Name .info.vendor_id = QCA_NL80211_VENDOR_ID, \
468*5113495bSYour Name .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_CONFIG_TSPEC, \
469*5113495bSYour Name .flags = WIPHY_VENDOR_CMD_NEED_WDEV | \
470*5113495bSYour Name WIPHY_VENDOR_CMD_NEED_NETDEV | \
471*5113495bSYour Name WIPHY_VENDOR_CMD_NEED_RUNNING, \
472*5113495bSYour Name .doit = wlan_hdd_cfg80211_config_tspec, \
473*5113495bSYour Name vendor_command_policy(config_tspec_policy, \
474*5113495bSYour Name QCA_WLAN_VENDOR_ATTR_CONFIG_TSPEC_MAX) \
475*5113495bSYour Name },
476*5113495bSYour Name
477*5113495bSYour Name #endif /* #ifndef _WLAN_HDD_WMM_H */
478