xref: /OK3568_Linux_fs/kernel/drivers/net/wireless/nxp/mlan/mlan_11n.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /** @file mlan_11n.h
2*4882a593Smuzhiyun  *
3*4882a593Smuzhiyun  *  @brief Interface for the 802.11n mlan_11n module implemented in mlan_11n.c
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  *  Driver interface functions and type declarations for the 11n module
6*4882a593Smuzhiyun  *    implemented in mlan_11n.c.
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  *
9*4882a593Smuzhiyun  *  Copyright 2008-2021 NXP
10*4882a593Smuzhiyun  *
11*4882a593Smuzhiyun  *  This software file (the File) is distributed by NXP
12*4882a593Smuzhiyun  *  under the terms of the GNU General Public License Version 2, June 1991
13*4882a593Smuzhiyun  *  (the License).  You may use, redistribute and/or modify the File in
14*4882a593Smuzhiyun  *  accordance with the terms and conditions of the License, a copy of which
15*4882a593Smuzhiyun  *  is available by writing to the Free Software Foundation, Inc.,
16*4882a593Smuzhiyun  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA or on the
17*4882a593Smuzhiyun  *  worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
18*4882a593Smuzhiyun  *
19*4882a593Smuzhiyun  *  THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
20*4882a593Smuzhiyun  *  IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
21*4882a593Smuzhiyun  *  ARE EXPRESSLY DISCLAIMED.  The License provides additional details about
22*4882a593Smuzhiyun  *  this warranty disclaimer.
23*4882a593Smuzhiyun  *
24*4882a593Smuzhiyun  */
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun /********************************************************
27*4882a593Smuzhiyun Change log:
28*4882a593Smuzhiyun     12/01/2008: initial version
29*4882a593Smuzhiyun ********************************************************/
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun #ifndef _MLAN_11N_H_
32*4882a593Smuzhiyun #define _MLAN_11N_H_
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun #include "mlan_11n_aggr.h"
35*4882a593Smuzhiyun #include "mlan_11n_rxreorder.h"
36*4882a593Smuzhiyun #include "mlan_wmm.h"
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun /** Print the 802.11n device capability */
39*4882a593Smuzhiyun void wlan_show_dot11ndevcap(pmlan_adapter pmadapter, t_u32 cap);
40*4882a593Smuzhiyun /** Print the 802.11n device MCS */
41*4882a593Smuzhiyun void wlan_show_devmcssupport(pmlan_adapter pmadapter, t_u8 support);
42*4882a593Smuzhiyun /** Handle the command response of a delete block ack request */
43*4882a593Smuzhiyun mlan_status wlan_ret_11n_delba(mlan_private *priv, HostCmd_DS_COMMAND *resp);
44*4882a593Smuzhiyun /** Handle the command response of an add block ack request */
45*4882a593Smuzhiyun mlan_status wlan_ret_11n_addba_req(mlan_private *priv,
46*4882a593Smuzhiyun 				   HostCmd_DS_COMMAND *resp);
47*4882a593Smuzhiyun /** Handle the command response of 11ncfg command */
48*4882a593Smuzhiyun mlan_status wlan_ret_11n_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
49*4882a593Smuzhiyun 			     mlan_ioctl_req *pioctl_buf);
50*4882a593Smuzhiyun /** Prepare 11ncfg command */
51*4882a593Smuzhiyun mlan_status wlan_cmd_11n_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
52*4882a593Smuzhiyun 			     t_u16 cmd_action, t_void *pdata_buf);
53*4882a593Smuzhiyun /** Prepare reject addba requst command */
54*4882a593Smuzhiyun mlan_status wlan_cmd_reject_addba_req(pmlan_private pmpriv,
55*4882a593Smuzhiyun 				      HostCmd_DS_COMMAND *cmd, t_u16 cmd_action,
56*4882a593Smuzhiyun 				      t_void *pdata_buf);
57*4882a593Smuzhiyun /** Handle the command response of rejecting addba request */
58*4882a593Smuzhiyun mlan_status wlan_ret_reject_addba_req(pmlan_private pmpriv,
59*4882a593Smuzhiyun 				      HostCmd_DS_COMMAND *resp,
60*4882a593Smuzhiyun 				      mlan_ioctl_req *pioctl_buf);
61*4882a593Smuzhiyun /** Prepare TX BF configuration command */
62*4882a593Smuzhiyun mlan_status wlan_cmd_tx_bf_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
63*4882a593Smuzhiyun 			       t_u16 cmd_action, t_void *pdata_buf);
64*4882a593Smuzhiyun /** Handle the command response TX BF configuration */
65*4882a593Smuzhiyun mlan_status wlan_ret_tx_bf_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
66*4882a593Smuzhiyun 			       mlan_ioctl_req *pioctl_buf);
67*4882a593Smuzhiyun #ifdef STA_SUPPORT
68*4882a593Smuzhiyun t_u8 wlan_11n_bandconfig_allowed(mlan_private *pmpriv, t_u16 bss_band);
69*4882a593Smuzhiyun /** Append the 802_11N tlv */
70*4882a593Smuzhiyun int wlan_cmd_append_11n_tlv(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc,
71*4882a593Smuzhiyun 			    t_u8 **ppbuffer);
72*4882a593Smuzhiyun /** wlan fill HT cap tlv */
73*4882a593Smuzhiyun void wlan_fill_ht_cap_tlv(mlan_private *priv, MrvlIETypes_HTCap_t *pht_cap,
74*4882a593Smuzhiyun 			  t_u16 band, t_u8 fill);
75*4882a593Smuzhiyun /** wlan fill HT cap IE */
76*4882a593Smuzhiyun void wlan_fill_ht_cap_ie(mlan_private *priv, IEEEtypes_HTCap_t *pht_cap,
77*4882a593Smuzhiyun 			 t_u16 bands);
78*4882a593Smuzhiyun #endif /* STA_SUPPORT */
79*4882a593Smuzhiyun /** Miscellaneous configuration handler */
80*4882a593Smuzhiyun mlan_status wlan_11n_cfg_ioctl(pmlan_adapter pmadapter,
81*4882a593Smuzhiyun 			       pmlan_ioctl_req pioctl_req);
82*4882a593Smuzhiyun /** Delete Tx BA stream table entry */
83*4882a593Smuzhiyun void wlan_11n_delete_txbastream_tbl_entry(mlan_private *priv,
84*4882a593Smuzhiyun 					  TxBAStreamTbl *ptx_tbl);
85*4882a593Smuzhiyun /** Delete all Tx BA stream table entries */
86*4882a593Smuzhiyun void wlan_11n_deleteall_txbastream_tbl(mlan_private *priv);
87*4882a593Smuzhiyun /** Get Tx BA stream table */
88*4882a593Smuzhiyun TxBAStreamTbl *wlan_11n_get_txbastream_tbl(mlan_private *priv, int tid,
89*4882a593Smuzhiyun 					   t_u8 *ra, int lock);
90*4882a593Smuzhiyun /** Create Tx BA stream table */
91*4882a593Smuzhiyun void wlan_11n_create_txbastream_tbl(mlan_private *priv, t_u8 *ra, int tid,
92*4882a593Smuzhiyun 				    baStatus_e ba_status);
93*4882a593Smuzhiyun /** Send ADD BA request */
94*4882a593Smuzhiyun int wlan_send_addba(mlan_private *priv, int tid, t_u8 *peer_mac);
95*4882a593Smuzhiyun /** Send DEL BA request */
96*4882a593Smuzhiyun int wlan_send_delba(mlan_private *priv, pmlan_ioctl_req pioctl_req, int tid,
97*4882a593Smuzhiyun 		    t_u8 *peer_mac, int initiator);
98*4882a593Smuzhiyun /** This function handles the command response of delete a block ack request*/
99*4882a593Smuzhiyun void wlan_11n_delete_bastream(mlan_private *priv, t_u8 *del_ba);
100*4882a593Smuzhiyun /** get rx reorder table */
101*4882a593Smuzhiyun int wlan_get_rxreorder_tbl(mlan_private *priv, rx_reorder_tbl *buf);
102*4882a593Smuzhiyun /** get tx ba stream table */
103*4882a593Smuzhiyun int wlan_get_txbastream_tbl(mlan_private *priv, tx_ba_stream_tbl *buf);
104*4882a593Smuzhiyun /** send delba */
105*4882a593Smuzhiyun void wlan_11n_delba(mlan_private *priv, int tid);
106*4882a593Smuzhiyun /** update amdpdu tx win size */
107*4882a593Smuzhiyun void wlan_update_ampdu_txwinsize(pmlan_adapter pmadapter);
108*4882a593Smuzhiyun /** Minimum number of AMSDU */
109*4882a593Smuzhiyun #define MIN_NUM_AMSDU 2
110*4882a593Smuzhiyun /** AMSDU Aggr control cmd resp */
111*4882a593Smuzhiyun mlan_status wlan_ret_amsdu_aggr_ctrl(pmlan_private pmpriv,
112*4882a593Smuzhiyun 				     HostCmd_DS_COMMAND *resp,
113*4882a593Smuzhiyun 				     mlan_ioctl_req *pioctl_buf);
114*4882a593Smuzhiyun void wlan_set_tx_pause_flag(mlan_private *priv, t_u8 flag);
115*4882a593Smuzhiyun /** reconfigure tx buf size */
116*4882a593Smuzhiyun mlan_status wlan_cmd_recfg_tx_buf(mlan_private *priv, HostCmd_DS_COMMAND *cmd,
117*4882a593Smuzhiyun 				  int cmd_action, void *pdata_buf);
118*4882a593Smuzhiyun /** AMSDU aggr control cmd */
119*4882a593Smuzhiyun mlan_status wlan_cmd_amsdu_aggr_ctrl(mlan_private *priv,
120*4882a593Smuzhiyun 				     HostCmd_DS_COMMAND *cmd, int cmd_action,
121*4882a593Smuzhiyun 				     void *pdata_buf);
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun t_u8 wlan_validate_chan_offset(mlan_private *pmpriv, t_u16 band, t_u32 chan,
124*4882a593Smuzhiyun 			       t_u8 chan_bw);
125*4882a593Smuzhiyun /** get channel offset */
126*4882a593Smuzhiyun t_u8 wlan_get_second_channel_offset(mlan_private *priv, int chan);
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun void wlan_update_11n_cap(mlan_private *pmpriv);
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun /** clean up txbastream_tbl */
131*4882a593Smuzhiyun void wlan_11n_cleanup_txbastream_tbl(mlan_private *priv, t_u8 *ra);
132*4882a593Smuzhiyun /**
133*4882a593Smuzhiyun  *  @brief This function checks whether a station has 11N enabled or not
134*4882a593Smuzhiyun  *
135*4882a593Smuzhiyun  *  @param priv     A pointer to mlan_private
136*4882a593Smuzhiyun  *  @param mac      station mac address
137*4882a593Smuzhiyun  *  @return         MTRUE or MFALSE
138*4882a593Smuzhiyun  */
is_station_11n_enabled(mlan_private * priv,t_u8 * mac)139*4882a593Smuzhiyun static INLINE t_u8 is_station_11n_enabled(mlan_private *priv, t_u8 *mac)
140*4882a593Smuzhiyun {
141*4882a593Smuzhiyun 	sta_node *sta_ptr = MNULL;
142*4882a593Smuzhiyun 	sta_ptr = wlan_get_station_entry(priv, mac);
143*4882a593Smuzhiyun 	if (sta_ptr)
144*4882a593Smuzhiyun 		return (sta_ptr->is_11n_enabled) ? MTRUE : MFALSE;
145*4882a593Smuzhiyun 	return MFALSE;
146*4882a593Smuzhiyun }
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun /**
149*4882a593Smuzhiyun  *  @brief This function get station max amsdu size
150*4882a593Smuzhiyun  *
151*4882a593Smuzhiyun  *  @param priv     A pointer to mlan_private
152*4882a593Smuzhiyun  *  @param mac      station mac address
153*4882a593Smuzhiyun  *  @return         max amsdu size statio supported
154*4882a593Smuzhiyun  */
get_station_max_amsdu_size(mlan_private * priv,t_u8 * mac)155*4882a593Smuzhiyun static INLINE t_u16 get_station_max_amsdu_size(mlan_private *priv, t_u8 *mac)
156*4882a593Smuzhiyun {
157*4882a593Smuzhiyun 	sta_node *sta_ptr = MNULL;
158*4882a593Smuzhiyun 	sta_ptr = wlan_get_station_entry(priv, mac);
159*4882a593Smuzhiyun 	if (sta_ptr)
160*4882a593Smuzhiyun 		return sta_ptr->max_amsdu;
161*4882a593Smuzhiyun 	return 0;
162*4882a593Smuzhiyun }
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun /**
165*4882a593Smuzhiyun  *  @brief This function checks whether a station allows AMPDU or not
166*4882a593Smuzhiyun  *
167*4882a593Smuzhiyun  *  @param priv     A pointer to mlan_private
168*4882a593Smuzhiyun  *  @param ptr      A pointer to RA list table
169*4882a593Smuzhiyun  *  @param tid      TID value for ptr
170*4882a593Smuzhiyun  *  @return         MTRUE or MFALSE
171*4882a593Smuzhiyun  */
is_station_ampdu_allowed(mlan_private * priv,raListTbl * ptr,int tid)172*4882a593Smuzhiyun static INLINE t_u8 is_station_ampdu_allowed(mlan_private *priv, raListTbl *ptr,
173*4882a593Smuzhiyun 					    int tid)
174*4882a593Smuzhiyun {
175*4882a593Smuzhiyun 	sta_node *sta_ptr = MNULL;
176*4882a593Smuzhiyun 	sta_ptr = wlan_get_station_entry(priv, ptr->ra);
177*4882a593Smuzhiyun 	if (sta_ptr) {
178*4882a593Smuzhiyun 		if (GET_BSS_ROLE(priv) == MLAN_BSS_ROLE_UAP) {
179*4882a593Smuzhiyun 			if (priv->sec_info.wapi_enabled &&
180*4882a593Smuzhiyun 			    !sta_ptr->wapi_key_on)
181*4882a593Smuzhiyun 				return MFALSE;
182*4882a593Smuzhiyun 		}
183*4882a593Smuzhiyun 		return (sta_ptr->ampdu_sta[tid] != BA_STREAM_NOT_ALLOWED) ?
184*4882a593Smuzhiyun 			       MTRUE :
185*4882a593Smuzhiyun 			       MFALSE;
186*4882a593Smuzhiyun 	}
187*4882a593Smuzhiyun 	return MFALSE;
188*4882a593Smuzhiyun }
189*4882a593Smuzhiyun 
190*4882a593Smuzhiyun /**
191*4882a593Smuzhiyun  *  @brief This function disable station ampdu for specific tid
192*4882a593Smuzhiyun  *
193*4882a593Smuzhiyun  *  @param priv     A pointer to mlan_private
194*4882a593Smuzhiyun  *  @param tid     tid index
195*4882a593Smuzhiyun  *  @param ra      station mac address
196*4882a593Smuzhiyun  *  @return        N/A
197*4882a593Smuzhiyun  */
disable_station_ampdu(mlan_private * priv,t_u8 tid,t_u8 * ra)198*4882a593Smuzhiyun static INLINE void disable_station_ampdu(mlan_private *priv, t_u8 tid, t_u8 *ra)
199*4882a593Smuzhiyun {
200*4882a593Smuzhiyun 	sta_node *sta_ptr = MNULL;
201*4882a593Smuzhiyun 	sta_ptr = wlan_get_station_entry(priv, ra);
202*4882a593Smuzhiyun 	if (sta_ptr)
203*4882a593Smuzhiyun 		sta_ptr->ampdu_sta[tid] = BA_STREAM_NOT_ALLOWED;
204*4882a593Smuzhiyun 	return;
205*4882a593Smuzhiyun }
206*4882a593Smuzhiyun 
207*4882a593Smuzhiyun /**
208*4882a593Smuzhiyun  *  @brief This function reset station ampdu for specific id to user setting.
209*4882a593Smuzhiyun  *
210*4882a593Smuzhiyun  *  @param priv     A pointer to mlan_private
211*4882a593Smuzhiyun  *  @param tid     tid index
212*4882a593Smuzhiyun  *  @param ra      station mac address
213*4882a593Smuzhiyun  *  @return        N/A
214*4882a593Smuzhiyun  */
reset_station_ampdu(mlan_private * priv,t_u8 tid,t_u8 * ra)215*4882a593Smuzhiyun static INLINE void reset_station_ampdu(mlan_private *priv, t_u8 tid, t_u8 *ra)
216*4882a593Smuzhiyun {
217*4882a593Smuzhiyun 	sta_node *sta_ptr = MNULL;
218*4882a593Smuzhiyun 	sta_ptr = wlan_get_station_entry(priv, ra);
219*4882a593Smuzhiyun 	if (sta_ptr)
220*4882a593Smuzhiyun 		sta_ptr->ampdu_sta[tid] = priv->aggr_prio_tbl[tid].ampdu_user;
221*4882a593Smuzhiyun 	return;
222*4882a593Smuzhiyun }
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun #define IS_BG_RATE (priv->bitmap_rates[0] || priv->bitmap_rates[1])
225*4882a593Smuzhiyun /**
226*4882a593Smuzhiyun  *  @brief This function checks whether AMPDU is allowed or not
227*4882a593Smuzhiyun  *
228*4882a593Smuzhiyun  *  @param priv     A pointer to mlan_private
229*4882a593Smuzhiyun  *  @param ptr      A pointer to RA list table
230*4882a593Smuzhiyun  *  @param tid      TID value for ptr
231*4882a593Smuzhiyun  *
232*4882a593Smuzhiyun  *  @return         MTRUE or MFALSE
233*4882a593Smuzhiyun  */
wlan_is_ampdu_allowed(mlan_private * priv,raListTbl * ptr,int tid)234*4882a593Smuzhiyun static INLINE t_u8 wlan_is_ampdu_allowed(mlan_private *priv, raListTbl *ptr,
235*4882a593Smuzhiyun 					 int tid)
236*4882a593Smuzhiyun {
237*4882a593Smuzhiyun 	if (ptr->is_tdls_link)
238*4882a593Smuzhiyun 		return is_station_ampdu_allowed(priv, ptr, tid);
239*4882a593Smuzhiyun 	if (priv->adapter->tdls_status != TDLS_NOT_SETUP && !priv->txaggrctrl)
240*4882a593Smuzhiyun 		return MFALSE;
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun 	if ((!priv->is_data_rate_auto) && IS_BG_RATE)
243*4882a593Smuzhiyun 		return MFALSE;
244*4882a593Smuzhiyun #ifdef UAP_SUPPORT
245*4882a593Smuzhiyun 	if (GET_BSS_ROLE(priv) == MLAN_BSS_ROLE_UAP)
246*4882a593Smuzhiyun 		return is_station_ampdu_allowed(priv, ptr, tid);
247*4882a593Smuzhiyun #endif /* UAP_SUPPORT */
248*4882a593Smuzhiyun 	if (priv->sec_info.wapi_enabled && !priv->sec_info.wapi_key_on)
249*4882a593Smuzhiyun 		return MFALSE;
250*4882a593Smuzhiyun 	return (priv->aggr_prio_tbl[tid].ampdu_ap != BA_STREAM_NOT_ALLOWED) ?
251*4882a593Smuzhiyun 		       MTRUE :
252*4882a593Smuzhiyun 		       MFALSE;
253*4882a593Smuzhiyun }
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun #define BA_RSSI_HIGH_THRESHOLD -70
256*4882a593Smuzhiyun 
wlan_update_station_del_ba_count(mlan_private * priv,raListTbl * ptr)257*4882a593Smuzhiyun static INLINE void wlan_update_station_del_ba_count(mlan_private *priv,
258*4882a593Smuzhiyun 						    raListTbl *ptr)
259*4882a593Smuzhiyun {
260*4882a593Smuzhiyun 	sta_node *sta_ptr = MNULL;
261*4882a593Smuzhiyun 	t_s8 rssi;
262*4882a593Smuzhiyun 	sta_ptr = wlan_get_station_entry(priv, ptr->ra);
263*4882a593Smuzhiyun 	if (sta_ptr) {
264*4882a593Smuzhiyun 		rssi = sta_ptr->snr - sta_ptr->nf;
265*4882a593Smuzhiyun 		if (rssi > BA_RSSI_HIGH_THRESHOLD)
266*4882a593Smuzhiyun 			ptr->del_ba_count = 0;
267*4882a593Smuzhiyun 	}
268*4882a593Smuzhiyun 	return;
269*4882a593Smuzhiyun }
270*4882a593Smuzhiyun 
wlan_update_del_ba_count(mlan_private * priv,raListTbl * ptr)271*4882a593Smuzhiyun static INLINE void wlan_update_del_ba_count(mlan_private *priv, raListTbl *ptr)
272*4882a593Smuzhiyun {
273*4882a593Smuzhiyun 	t_s8 rssi;
274*4882a593Smuzhiyun 	if (ptr->is_tdls_link)
275*4882a593Smuzhiyun 		return wlan_update_station_del_ba_count(priv, ptr);
276*4882a593Smuzhiyun 	rssi = priv->snr - priv->nf;
277*4882a593Smuzhiyun 	if (rssi > BA_RSSI_HIGH_THRESHOLD)
278*4882a593Smuzhiyun 		ptr->del_ba_count = 0;
279*4882a593Smuzhiyun }
280*4882a593Smuzhiyun 
281*4882a593Smuzhiyun /**
282*4882a593Smuzhiyun  *  @brief This function checks whether AMSDU is allowed or not
283*4882a593Smuzhiyun  *
284*4882a593Smuzhiyun  *  @param priv     A pointer to mlan_private
285*4882a593Smuzhiyun  *  @param ptr      A pointer to RA list table
286*4882a593Smuzhiyun  *  @param tid      TID value for ptr
287*4882a593Smuzhiyun  *
288*4882a593Smuzhiyun  *  @return         MTRUE or MFALSE
289*4882a593Smuzhiyun  */
wlan_is_amsdu_allowed(mlan_private * priv,raListTbl * ptr,int tid)290*4882a593Smuzhiyun static INLINE t_u8 wlan_is_amsdu_allowed(mlan_private *priv, raListTbl *ptr,
291*4882a593Smuzhiyun 					 int tid)
292*4882a593Smuzhiyun {
293*4882a593Smuzhiyun #ifdef UAP_SUPPORT
294*4882a593Smuzhiyun 	sta_node *sta_ptr = MNULL;
295*4882a593Smuzhiyun #endif
296*4882a593Smuzhiyun 	if (priv->amsdu_disable)
297*4882a593Smuzhiyun 		return MFALSE;
298*4882a593Smuzhiyun #ifdef UAP_SUPPORT
299*4882a593Smuzhiyun 	if (GET_BSS_ROLE(priv) == MLAN_BSS_ROLE_UAP) {
300*4882a593Smuzhiyun 		sta_ptr = wlan_get_station_entry(priv, ptr->ra);
301*4882a593Smuzhiyun 		if (sta_ptr) {
302*4882a593Smuzhiyun 			if (priv->sec_info.wapi_enabled &&
303*4882a593Smuzhiyun 			    !sta_ptr->wapi_key_on)
304*4882a593Smuzhiyun 				return MFALSE;
305*4882a593Smuzhiyun 		}
306*4882a593Smuzhiyun 	}
307*4882a593Smuzhiyun #endif /* UAP_SUPPORT */
308*4882a593Smuzhiyun 	if (ptr->is_tdls_link)
309*4882a593Smuzhiyun 		return (priv->aggr_prio_tbl[tid].amsdu !=
310*4882a593Smuzhiyun 			BA_STREAM_NOT_ALLOWED) ?
311*4882a593Smuzhiyun 			       MTRUE :
312*4882a593Smuzhiyun 			       MFALSE;
313*4882a593Smuzhiyun #define TXRATE_BITMAP_INDEX_MCS0_7 2
314*4882a593Smuzhiyun 	return ((priv->aggr_prio_tbl[tid].amsdu != BA_STREAM_NOT_ALLOWED) &&
315*4882a593Smuzhiyun 		((priv->is_data_rate_auto) ||
316*4882a593Smuzhiyun 		 !(((priv->bitmap_rates[TXRATE_BITMAP_INDEX_MCS0_7]) & 0x03) ||
317*4882a593Smuzhiyun 		   IS_BG_RATE))) ?
318*4882a593Smuzhiyun 		       MTRUE :
319*4882a593Smuzhiyun 		       MFALSE;
320*4882a593Smuzhiyun }
321*4882a593Smuzhiyun 
322*4882a593Smuzhiyun /**
323*4882a593Smuzhiyun  *  @brief This function checks whether a BA stream is available or not
324*4882a593Smuzhiyun  *
325*4882a593Smuzhiyun  *  @param priv     A pointer to mlan_private
326*4882a593Smuzhiyun  *
327*4882a593Smuzhiyun  *  @return         MTRUE or MFALSE
328*4882a593Smuzhiyun  */
wlan_is_bastream_avail(mlan_private * priv)329*4882a593Smuzhiyun static INLINE t_u8 wlan_is_bastream_avail(mlan_private *priv)
330*4882a593Smuzhiyun {
331*4882a593Smuzhiyun 	mlan_private *pmpriv = MNULL;
332*4882a593Smuzhiyun 	t_u8 i = 0;
333*4882a593Smuzhiyun 	t_u32 bastream_num = 0;
334*4882a593Smuzhiyun 	t_u32 bastream_max = 0;
335*4882a593Smuzhiyun 	for (i = 0; i < priv->adapter->priv_num; i++) {
336*4882a593Smuzhiyun 		pmpriv = priv->adapter->priv[i];
337*4882a593Smuzhiyun 		if (pmpriv)
338*4882a593Smuzhiyun 			bastream_num += wlan_wmm_list_len(
339*4882a593Smuzhiyun 				(pmlan_list_head)&pmpriv->tx_ba_stream_tbl_ptr);
340*4882a593Smuzhiyun 	}
341*4882a593Smuzhiyun 	bastream_max = ISSUPP_GETTXBASTREAM(priv->adapter->hw_dot_11n_dev_cap);
342*4882a593Smuzhiyun 	if (bastream_max == 0)
343*4882a593Smuzhiyun 		bastream_max = MLAN_MAX_TX_BASTREAM_DEFAULT;
344*4882a593Smuzhiyun 	return (bastream_num < bastream_max) ? MTRUE : MFALSE;
345*4882a593Smuzhiyun }
346*4882a593Smuzhiyun 
347*4882a593Smuzhiyun /**
348*4882a593Smuzhiyun  *  @brief This function finds the stream to delete
349*4882a593Smuzhiyun  *
350*4882a593Smuzhiyun  *  @param priv     A pointer to mlan_private
351*4882a593Smuzhiyun  *  @param ptr      A pointer to RA list table
352*4882a593Smuzhiyun  *  @param ptr_tid  TID value of ptr
353*4882a593Smuzhiyun  *  @param ptid     A pointer to TID of stream to delete, if return MTRUE
354*4882a593Smuzhiyun  *  @param ra       RA of stream to delete, if return MTRUE
355*4882a593Smuzhiyun  *
356*4882a593Smuzhiyun  *  @return         MTRUE or MFALSE
357*4882a593Smuzhiyun  */
wlan_find_stream_to_delete(mlan_private * priv,raListTbl * ptr,int ptr_tid,int * ptid,t_u8 * ra)358*4882a593Smuzhiyun static INLINE t_u8 wlan_find_stream_to_delete(mlan_private *priv,
359*4882a593Smuzhiyun 					      raListTbl *ptr, int ptr_tid,
360*4882a593Smuzhiyun 					      int *ptid, t_u8 *ra)
361*4882a593Smuzhiyun {
362*4882a593Smuzhiyun 	int tid;
363*4882a593Smuzhiyun 	t_u8 ret = MFALSE;
364*4882a593Smuzhiyun 	TxBAStreamTbl *ptx_tbl;
365*4882a593Smuzhiyun 
366*4882a593Smuzhiyun 	ENTER();
367*4882a593Smuzhiyun 
368*4882a593Smuzhiyun 	ptx_tbl = (TxBAStreamTbl *)util_peek_list(priv->adapter->pmoal_handle,
369*4882a593Smuzhiyun 						  &priv->tx_ba_stream_tbl_ptr,
370*4882a593Smuzhiyun 						  MNULL, MNULL);
371*4882a593Smuzhiyun 	if (!ptx_tbl) {
372*4882a593Smuzhiyun 		LEAVE();
373*4882a593Smuzhiyun 		return ret;
374*4882a593Smuzhiyun 	}
375*4882a593Smuzhiyun 
376*4882a593Smuzhiyun 	tid = priv->aggr_prio_tbl[ptr_tid].ampdu_user;
377*4882a593Smuzhiyun 
378*4882a593Smuzhiyun 	while (ptx_tbl != (TxBAStreamTbl *)&priv->tx_ba_stream_tbl_ptr) {
379*4882a593Smuzhiyun 		if (tid > priv->aggr_prio_tbl[ptx_tbl->tid].ampdu_user) {
380*4882a593Smuzhiyun 			tid = priv->aggr_prio_tbl[ptx_tbl->tid].ampdu_user;
381*4882a593Smuzhiyun 			*ptid = ptx_tbl->tid;
382*4882a593Smuzhiyun 			memcpy_ext(priv->adapter, ra, ptx_tbl->ra,
383*4882a593Smuzhiyun 				   MLAN_MAC_ADDR_LENGTH, MLAN_MAC_ADDR_LENGTH);
384*4882a593Smuzhiyun 			ret = MTRUE;
385*4882a593Smuzhiyun 		}
386*4882a593Smuzhiyun 
387*4882a593Smuzhiyun 		ptx_tbl = ptx_tbl->pnext;
388*4882a593Smuzhiyun 	}
389*4882a593Smuzhiyun 	LEAVE();
390*4882a593Smuzhiyun 	return ret;
391*4882a593Smuzhiyun }
392*4882a593Smuzhiyun 
393*4882a593Smuzhiyun /**
394*4882a593Smuzhiyun  *  @brief This function checks whether 11n is supported
395*4882a593Smuzhiyun  *
396*4882a593Smuzhiyun  *  @param priv     A pointer to mlan_private
397*4882a593Smuzhiyun  *  @param ra       Address of the receiver STA
398*4882a593Smuzhiyun  *
399*4882a593Smuzhiyun  *  @return         MTRUE or MFALSE
400*4882a593Smuzhiyun  */
wlan_is_11n_enabled(mlan_private * priv,t_u8 * ra)401*4882a593Smuzhiyun static INLINE int wlan_is_11n_enabled(mlan_private *priv, t_u8 *ra)
402*4882a593Smuzhiyun {
403*4882a593Smuzhiyun 	int ret = MFALSE;
404*4882a593Smuzhiyun 	ENTER();
405*4882a593Smuzhiyun #ifdef UAP_SUPPORT
406*4882a593Smuzhiyun 	if (GET_BSS_ROLE(priv) == MLAN_BSS_ROLE_UAP) {
407*4882a593Smuzhiyun 		if ((!(ra[0] & 0x01)) && (priv->is_11n_enabled))
408*4882a593Smuzhiyun 			ret = is_station_11n_enabled(priv, ra);
409*4882a593Smuzhiyun 	}
410*4882a593Smuzhiyun #endif /* UAP_SUPPORT */
411*4882a593Smuzhiyun 	LEAVE();
412*4882a593Smuzhiyun 	return ret;
413*4882a593Smuzhiyun }
414*4882a593Smuzhiyun #endif /* !_MLAN_11N_H_ */
415