xref: /wlan-driver/qcacld-3.0/core/hdd/inc/wlan_hdd_wmm.h (revision 5113495b16420b49004c444715d2daae2066e7dc)
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