xref: /OK3568_Linux_fs/kernel/drivers/net/wireless/marvell/mwifiex/wmm.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * NXP Wireless LAN device driver: WMM
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Copyright 2011-2020 NXP
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  * This software file (the "File") is distributed by NXP
7*4882a593Smuzhiyun  * under the terms of the GNU General Public License Version 2, June 1991
8*4882a593Smuzhiyun  * (the "License").  You may use, redistribute and/or modify this File in
9*4882a593Smuzhiyun  * accordance with the terms and conditions of the License, a copy of which
10*4882a593Smuzhiyun  * is available by writing to the Free Software Foundation, Inc.,
11*4882a593Smuzhiyun  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA or on the
12*4882a593Smuzhiyun  * worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
13*4882a593Smuzhiyun  *
14*4882a593Smuzhiyun  * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
15*4882a593Smuzhiyun  * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
16*4882a593Smuzhiyun  * ARE EXPRESSLY DISCLAIMED.  The License provides additional details about
17*4882a593Smuzhiyun  * this warranty disclaimer.
18*4882a593Smuzhiyun  */
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #ifndef _MWIFIEX_WMM_H_
21*4882a593Smuzhiyun #define _MWIFIEX_WMM_H_
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun enum ieee_types_wmm_aciaifsn_bitmasks {
24*4882a593Smuzhiyun 	MWIFIEX_AIFSN = (BIT(0) | BIT(1) | BIT(2) | BIT(3)),
25*4882a593Smuzhiyun 	MWIFIEX_ACM = BIT(4),
26*4882a593Smuzhiyun 	MWIFIEX_ACI = (BIT(5) | BIT(6)),
27*4882a593Smuzhiyun };
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun enum ieee_types_wmm_ecw_bitmasks {
30*4882a593Smuzhiyun 	MWIFIEX_ECW_MIN = (BIT(0) | BIT(1) | BIT(2) | BIT(3)),
31*4882a593Smuzhiyun 	MWIFIEX_ECW_MAX = (BIT(4) | BIT(5) | BIT(6) | BIT(7)),
32*4882a593Smuzhiyun };
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun extern const u16 mwifiex_1d_to_wmm_queue[];
35*4882a593Smuzhiyun extern const u8 tos_to_tid_inv[];
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun /*
38*4882a593Smuzhiyun  * This function retrieves the TID of the given RA list.
39*4882a593Smuzhiyun  */
40*4882a593Smuzhiyun static inline int
mwifiex_get_tid(struct mwifiex_ra_list_tbl * ptr)41*4882a593Smuzhiyun mwifiex_get_tid(struct mwifiex_ra_list_tbl *ptr)
42*4882a593Smuzhiyun {
43*4882a593Smuzhiyun 	struct sk_buff *skb;
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun 	if (skb_queue_empty(&ptr->skb_head))
46*4882a593Smuzhiyun 		return 0;
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun 	skb = skb_peek(&ptr->skb_head);
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun 	return skb->priority;
51*4882a593Smuzhiyun }
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun /*
54*4882a593Smuzhiyun  * This function gets the length of a list.
55*4882a593Smuzhiyun  */
56*4882a593Smuzhiyun static inline int
mwifiex_wmm_list_len(struct list_head * head)57*4882a593Smuzhiyun mwifiex_wmm_list_len(struct list_head *head)
58*4882a593Smuzhiyun {
59*4882a593Smuzhiyun 	struct list_head *pos;
60*4882a593Smuzhiyun 	int count = 0;
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun 	list_for_each(pos, head)
63*4882a593Smuzhiyun 		++count;
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun 	return count;
66*4882a593Smuzhiyun }
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun /*
69*4882a593Smuzhiyun  * This function checks if a RA list is empty or not.
70*4882a593Smuzhiyun  */
71*4882a593Smuzhiyun static inline u8
mwifiex_wmm_is_ra_list_empty(struct list_head * ra_list_hhead)72*4882a593Smuzhiyun mwifiex_wmm_is_ra_list_empty(struct list_head *ra_list_hhead)
73*4882a593Smuzhiyun {
74*4882a593Smuzhiyun 	struct mwifiex_ra_list_tbl *ra_list;
75*4882a593Smuzhiyun 	int is_list_empty;
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun 	list_for_each_entry(ra_list, ra_list_hhead, list) {
78*4882a593Smuzhiyun 		is_list_empty = skb_queue_empty(&ra_list->skb_head);
79*4882a593Smuzhiyun 		if (!is_list_empty)
80*4882a593Smuzhiyun 			return false;
81*4882a593Smuzhiyun 	}
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun 	return true;
84*4882a593Smuzhiyun }
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun void mwifiex_wmm_add_buf_txqueue(struct mwifiex_private *priv,
87*4882a593Smuzhiyun 				 struct sk_buff *skb);
88*4882a593Smuzhiyun void mwifiex_wmm_add_buf_bypass_txqueue(struct mwifiex_private *priv,
89*4882a593Smuzhiyun 					struct sk_buff *skb);
90*4882a593Smuzhiyun void mwifiex_ralist_add(struct mwifiex_private *priv, const u8 *ra);
91*4882a593Smuzhiyun void mwifiex_rotate_priolists(struct mwifiex_private *priv,
92*4882a593Smuzhiyun 			      struct mwifiex_ra_list_tbl *ra, int tid);
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun int mwifiex_wmm_lists_empty(struct mwifiex_adapter *adapter);
95*4882a593Smuzhiyun int mwifiex_bypass_txlist_empty(struct mwifiex_adapter *adapter);
96*4882a593Smuzhiyun void mwifiex_wmm_process_tx(struct mwifiex_adapter *adapter);
97*4882a593Smuzhiyun void mwifiex_process_bypass_tx(struct mwifiex_adapter *adapter);
98*4882a593Smuzhiyun int mwifiex_is_ralist_valid(struct mwifiex_private *priv,
99*4882a593Smuzhiyun 			    struct mwifiex_ra_list_tbl *ra_list, int tid);
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun u8 mwifiex_wmm_compute_drv_pkt_delay(struct mwifiex_private *priv,
102*4882a593Smuzhiyun 				     const struct sk_buff *skb);
103*4882a593Smuzhiyun void mwifiex_wmm_init(struct mwifiex_adapter *adapter);
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun u32 mwifiex_wmm_process_association_req(struct mwifiex_private *priv,
106*4882a593Smuzhiyun 					u8 **assoc_buf,
107*4882a593Smuzhiyun 					struct ieee_types_wmm_parameter *wmmie,
108*4882a593Smuzhiyun 					struct ieee80211_ht_cap *htcap);
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun void mwifiex_wmm_setup_queue_priorities(struct mwifiex_private *priv,
111*4882a593Smuzhiyun 					struct ieee_types_wmm_parameter *wmm_ie);
112*4882a593Smuzhiyun void mwifiex_wmm_setup_ac_downgrade(struct mwifiex_private *priv);
113*4882a593Smuzhiyun int mwifiex_ret_wmm_get_status(struct mwifiex_private *priv,
114*4882a593Smuzhiyun 			       const struct host_cmd_ds_command *resp);
115*4882a593Smuzhiyun struct mwifiex_ra_list_tbl *
116*4882a593Smuzhiyun mwifiex_wmm_get_queue_raptr(struct mwifiex_private *priv, u8 tid,
117*4882a593Smuzhiyun 			    const u8 *ra_addr);
118*4882a593Smuzhiyun u8 mwifiex_wmm_downgrade_tid(struct mwifiex_private *priv, u32 tid);
119*4882a593Smuzhiyun void mwifiex_update_ralist_tx_pause(struct mwifiex_private *priv, u8 *mac,
120*4882a593Smuzhiyun 				    u8 tx_pause);
121*4882a593Smuzhiyun void mwifiex_update_ralist_tx_pause_in_tdls_cs(struct mwifiex_private *priv,
122*4882a593Smuzhiyun 					       u8 *mac, u8 tx_pause);
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun struct mwifiex_ra_list_tbl *mwifiex_wmm_get_ralist_node(struct mwifiex_private
125*4882a593Smuzhiyun 					*priv, u8 tid, const u8 *ra_addr);
126*4882a593Smuzhiyun #endif /* !_MWIFIEX_WMM_H_ */
127