]> bbs.cooldavid.org Git - net-next-2.6.git/blame - drivers/staging/rt2860/sta/assoc.c
Staging: rt28x0: remove typedefs (part one)
[net-next-2.6.git] / drivers / staging / rt2860 / sta / assoc.c
CommitLineData
91980990
GKH
1/*
2 *************************************************************************
3 * Ralink Tech Inc.
4 * 5F., No.36, Taiyuan St., Jhubei City,
5 * Hsinchu County 302,
6 * Taiwan, R.O.C.
7 *
8 * (c) Copyright 2002-2007, Ralink Technology, Inc.
9 *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 * This program is distributed in the hope that it will be useful, *
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
18 * GNU General Public License for more details. *
19 * *
20 * You should have received a copy of the GNU General Public License *
21 * along with this program; if not, write to the *
22 * Free Software Foundation, Inc., *
23 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
24 * *
25 *************************************************************************
26
27 Module Name:
28 assoc.c
29
30 Abstract:
31
32 Revision History:
33 Who When What
34 -------- ---------- ----------------------------------------------
35 John 2004-9-3 porting from RT2500
36*/
37#include "../rt_config.h"
38
51126deb 39u8 CipherWpaTemplate[] = {
8281958b
BZ
40 0xdd, /* WPA IE */
41 0x16, /* Length */
42 0x00, 0x50, 0xf2, 0x01, /* oui */
43 0x01, 0x00, /* Version */
44 0x00, 0x50, 0xf2, 0x02, /* Multicast */
45 0x01, 0x00, /* Number of unicast */
46 0x00, 0x50, 0xf2, 0x02, /* unicast */
47 0x01, 0x00, /* number of authentication method */
48 0x00, 0x50, 0xf2, 0x01 /* authentication */
0f65bec1
BZ
49};
50
51126deb 51u8 CipherWpa2Template[] = {
8281958b
BZ
52 0x30, /* RSN IE */
53 0x14, /* Length */
54 0x01, 0x00, /* Version */
55 0x00, 0x0f, 0xac, 0x02, /* group cipher, TKIP */
56 0x01, 0x00, /* number of pairwise */
57 0x00, 0x0f, 0xac, 0x02, /* unicast */
58 0x01, 0x00, /* number of authentication method */
59 0x00, 0x0f, 0xac, 0x02, /* authentication */
60 0x00, 0x00, /* RSN capability */
0f65bec1
BZ
61};
62
51126deb 63u8 Ccx2IeInfo[] = { 0x00, 0x40, 0x96, 0x03, 0x02 };
91980990
GKH
64
65/*
66 ==========================================================================
67 Description:
68 association state machine init, including state transition and timer init
69 Parameters:
70 S - pointer to the association state machine
71
72 IRQL = PASSIVE_LEVEL
73
74 ==========================================================================
75 */
51126deb 76void AssocStateMachineInit(IN PRTMP_ADAPTER pAd,
0f65bec1 77 IN STATE_MACHINE * S, OUT STATE_MACHINE_FUNC Trans[])
91980990 78{
0f65bec1
BZ
79 StateMachineInit(S, Trans, MAX_ASSOC_STATE, MAX_ASSOC_MSG,
80 (STATE_MACHINE_FUNC) Drop, ASSOC_IDLE,
81 ASSOC_MACHINE_BASE);
91980990 82
8281958b 83 /* first column */
0f65bec1
BZ
84 StateMachineSetAction(S, ASSOC_IDLE, MT2_MLME_ASSOC_REQ,
85 (STATE_MACHINE_FUNC) MlmeAssocReqAction);
86 StateMachineSetAction(S, ASSOC_IDLE, MT2_MLME_REASSOC_REQ,
87 (STATE_MACHINE_FUNC) MlmeReassocReqAction);
88 StateMachineSetAction(S, ASSOC_IDLE, MT2_MLME_DISASSOC_REQ,
89 (STATE_MACHINE_FUNC) MlmeDisassocReqAction);
90 StateMachineSetAction(S, ASSOC_IDLE, MT2_PEER_DISASSOC_REQ,
91 (STATE_MACHINE_FUNC) PeerDisassocAction);
91980990 92
8281958b 93 /* second column */
0f65bec1
BZ
94 StateMachineSetAction(S, ASSOC_WAIT_RSP, MT2_MLME_ASSOC_REQ,
95 (STATE_MACHINE_FUNC) InvalidStateWhenAssoc);
96 StateMachineSetAction(S, ASSOC_WAIT_RSP, MT2_MLME_REASSOC_REQ,
97 (STATE_MACHINE_FUNC) InvalidStateWhenReassoc);
98 StateMachineSetAction(S, ASSOC_WAIT_RSP, MT2_MLME_DISASSOC_REQ,
99 (STATE_MACHINE_FUNC)
100 InvalidStateWhenDisassociate);
101 StateMachineSetAction(S, ASSOC_WAIT_RSP, MT2_PEER_DISASSOC_REQ,
102 (STATE_MACHINE_FUNC) PeerDisassocAction);
103 StateMachineSetAction(S, ASSOC_WAIT_RSP, MT2_PEER_ASSOC_RSP,
104 (STATE_MACHINE_FUNC) PeerAssocRspAction);
8281958b
BZ
105 /* */
106 /* Patch 3Com AP MOde:3CRWE454G72 */
107 /* We send Assoc request frame to this AP, it always send Reassoc Rsp not Associate Rsp. */
108 /* */
0f65bec1
BZ
109 StateMachineSetAction(S, ASSOC_WAIT_RSP, MT2_PEER_REASSOC_RSP,
110 (STATE_MACHINE_FUNC) PeerAssocRspAction);
111 StateMachineSetAction(S, ASSOC_WAIT_RSP, MT2_ASSOC_TIMEOUT,
112 (STATE_MACHINE_FUNC) AssocTimeoutAction);
91980990 113
8281958b 114 /* third column */
0f65bec1
BZ
115 StateMachineSetAction(S, REASSOC_WAIT_RSP, MT2_MLME_ASSOC_REQ,
116 (STATE_MACHINE_FUNC) InvalidStateWhenAssoc);
117 StateMachineSetAction(S, REASSOC_WAIT_RSP, MT2_MLME_REASSOC_REQ,
118 (STATE_MACHINE_FUNC) InvalidStateWhenReassoc);
119 StateMachineSetAction(S, REASSOC_WAIT_RSP, MT2_MLME_DISASSOC_REQ,
120 (STATE_MACHINE_FUNC)
121 InvalidStateWhenDisassociate);
122 StateMachineSetAction(S, REASSOC_WAIT_RSP, MT2_PEER_DISASSOC_REQ,
123 (STATE_MACHINE_FUNC) PeerDisassocAction);
124 StateMachineSetAction(S, REASSOC_WAIT_RSP, MT2_PEER_REASSOC_RSP,
125 (STATE_MACHINE_FUNC) PeerReassocRspAction);
8281958b
BZ
126 /* */
127 /* Patch, AP doesn't send Reassociate Rsp frame to Station. */
128 /* */
0f65bec1
BZ
129 StateMachineSetAction(S, REASSOC_WAIT_RSP, MT2_PEER_ASSOC_RSP,
130 (STATE_MACHINE_FUNC) PeerReassocRspAction);
131 StateMachineSetAction(S, REASSOC_WAIT_RSP, MT2_REASSOC_TIMEOUT,
132 (STATE_MACHINE_FUNC) ReassocTimeoutAction);
91980990 133
8281958b 134 /* fourth column */
0f65bec1
BZ
135 StateMachineSetAction(S, DISASSOC_WAIT_RSP, MT2_MLME_ASSOC_REQ,
136 (STATE_MACHINE_FUNC) InvalidStateWhenAssoc);
137 StateMachineSetAction(S, DISASSOC_WAIT_RSP, MT2_MLME_REASSOC_REQ,
138 (STATE_MACHINE_FUNC) InvalidStateWhenReassoc);
139 StateMachineSetAction(S, DISASSOC_WAIT_RSP, MT2_MLME_DISASSOC_REQ,
140 (STATE_MACHINE_FUNC)
141 InvalidStateWhenDisassociate);
142 StateMachineSetAction(S, DISASSOC_WAIT_RSP, MT2_PEER_DISASSOC_REQ,
143 (STATE_MACHINE_FUNC) PeerDisassocAction);
144 StateMachineSetAction(S, DISASSOC_WAIT_RSP, MT2_DISASSOC_TIMEOUT,
145 (STATE_MACHINE_FUNC) DisassocTimeoutAction);
91980990 146
8281958b 147 /* initialize the timer */
0f65bec1
BZ
148 RTMPInitTimer(pAd, &pAd->MlmeAux.AssocTimer,
149 GET_TIMER_FUNCTION(AssocTimeout), pAd, FALSE);
150 RTMPInitTimer(pAd, &pAd->MlmeAux.ReassocTimer,
151 GET_TIMER_FUNCTION(ReassocTimeout), pAd, FALSE);
152 RTMPInitTimer(pAd, &pAd->MlmeAux.DisassocTimer,
153 GET_TIMER_FUNCTION(DisassocTimeout), pAd, FALSE);
91980990
GKH
154}
155
156/*
157 ==========================================================================
158 Description:
159 Association timeout procedure. After association timeout, this function
160 will be called and it will put a message into the MLME queue
161 Parameters:
162 Standard timer parameters
163
164 IRQL = DISPATCH_LEVEL
165
166 ==========================================================================
167 */
51126deb
BZ
168void AssocTimeout(void *SystemSpecific1,
169 void *FunctionContext,
170 void *SystemSpecific2, void *SystemSpecific3)
91980990 171{
0f65bec1 172 RTMP_ADAPTER *pAd = (RTMP_ADAPTER *) FunctionContext;
91980990 173
8281958b
BZ
174 /* Do nothing if the driver is starting halt state. */
175 /* This might happen when timer already been fired before cancel timer with mlmehalt */
0f65bec1
BZ
176 if (RTMP_TEST_FLAG
177 (pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST))
91980990
GKH
178 return;
179
180 MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_ASSOC_TIMEOUT, 0, NULL);
ca97b838 181 RTMP_MLME_HANDLER(pAd);
91980990
GKH
182}
183
184/*
185 ==========================================================================
186 Description:
187 Reassociation timeout procedure. After reassociation timeout, this
188 function will be called and put a message into the MLME queue
189 Parameters:
190 Standard timer parameters
191
192 IRQL = DISPATCH_LEVEL
193
194 ==========================================================================
195 */
51126deb
BZ
196void ReassocTimeout(void *SystemSpecific1,
197 void *FunctionContext,
198 void *SystemSpecific2, void *SystemSpecific3)
91980990 199{
0f65bec1 200 RTMP_ADAPTER *pAd = (RTMP_ADAPTER *) FunctionContext;
91980990 201
8281958b
BZ
202 /* Do nothing if the driver is starting halt state. */
203 /* This might happen when timer already been fired before cancel timer with mlmehalt */
0f65bec1
BZ
204 if (RTMP_TEST_FLAG
205 (pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST))
91980990
GKH
206 return;
207
208 MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_REASSOC_TIMEOUT, 0, NULL);
ca97b838 209 RTMP_MLME_HANDLER(pAd);
91980990
GKH
210}
211
212/*
213 ==========================================================================
214 Description:
215 Disassociation timeout procedure. After disassociation timeout, this
216 function will be called and put a message into the MLME queue
217 Parameters:
218 Standard timer parameters
219
220 IRQL = DISPATCH_LEVEL
221
222 ==========================================================================
223 */
51126deb
BZ
224void DisassocTimeout(void *SystemSpecific1,
225 void *FunctionContext,
226 void *SystemSpecific2, void *SystemSpecific3)
91980990 227{
0f65bec1 228 RTMP_ADAPTER *pAd = (RTMP_ADAPTER *) FunctionContext;
91980990 229
8281958b
BZ
230 /* Do nothing if the driver is starting halt state. */
231 /* This might happen when timer already been fired before cancel timer with mlmehalt */
0f65bec1
BZ
232 if (RTMP_TEST_FLAG
233 (pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST))
91980990
GKH
234 return;
235
236 MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_DISASSOC_TIMEOUT, 0, NULL);
ca97b838 237 RTMP_MLME_HANDLER(pAd);
91980990
GKH
238}
239
240/*
241 ==========================================================================
242 Description:
243 mlme assoc req handling procedure
244 Parameters:
245 Adapter - Adapter pointer
246 Elem - MLME Queue Element
247 Pre:
248 the station has been authenticated and the following information is stored in the config
249 -# SSID
250 -# supported rates and their length
251 -# listen interval (Adapter->StaCfg.default_listen_count)
252 -# Transmit power (Adapter->StaCfg.tx_power)
253 Post :
254 -# An association request frame is generated and sent to the air
255 -# Association timer starts
256 -# Association state -> ASSOC_WAIT_RSP
257
258 IRQL = DISPATCH_LEVEL
259
260 ==========================================================================
261 */
51126deb 262void MlmeAssocReqAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
91980990 263{
51126deb 264 u8 ApAddr[6];
0f65bec1 265 HEADER_802_11 AssocHdr;
51126deb 266 u8 WmeIe[9] =
0f65bec1
BZ
267 { IE_VENDOR_SPECIFIC, 0x07, 0x00, 0x50, 0xf2, 0x02, 0x00, 0x01,
268 0x00 };
51126deb
BZ
269 u16 ListenIntv;
270 unsigned long Timeout;
271 u16 CapabilityInfo;
0f65bec1 272 BOOLEAN TimerCancelled;
51126deb
BZ
273 u8 *pOutBuffer = NULL;
274 int NStatus;
275 unsigned long FrameLen = 0;
276 unsigned long tmp;
277 u16 VarIesOffset;
278 u16 Status;
91980990 279
8281958b 280 /* Block all authentication request durning WPA block period */
0f65bec1
BZ
281 if (pAd->StaCfg.bBlockAssoc == TRUE) {
282 DBGPRINT(RT_DEBUG_TRACE,
283 ("ASSOC - Block Assoc request durning WPA block period!\n"));
91980990
GKH
284 pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;
285 Status = MLME_STATE_MACHINE_REJECT;
0f65bec1
BZ
286 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_ASSOC_CONF, 2,
287 &Status);
91980990 288 }
8281958b 289 /* check sanity first */
0f65bec1
BZ
290 else if (MlmeAssocReqSanity
291 (pAd, Elem->Msg, Elem->MsgLen, ApAddr, &CapabilityInfo,
292 &Timeout, &ListenIntv)) {
91980990
GKH
293 RTMPCancelTimer(&pAd->MlmeAux.AssocTimer, &TimerCancelled);
294 COPY_MAC_ADDR(pAd->MlmeAux.Bssid, ApAddr);
295
8281958b 296 /* Get an unused nonpaged memory */
91980990 297 NStatus = MlmeAllocateMemory(pAd, &pOutBuffer);
0f65bec1
BZ
298 if (NStatus != NDIS_STATUS_SUCCESS) {
299 DBGPRINT(RT_DEBUG_TRACE,
300 ("ASSOC - MlmeAssocReqAction() allocate memory failed \n"));
91980990
GKH
301 pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;
302 Status = MLME_FAIL_NO_RESOURCE;
0f65bec1
BZ
303 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE,
304 MT2_ASSOC_CONF, 2, &Status);
91980990
GKH
305 return;
306 }
8281958b 307 /* Add by James 03/06/27 */
0f65bec1
BZ
308 pAd->StaCfg.AssocInfo.Length =
309 sizeof(NDIS_802_11_ASSOCIATION_INFORMATION);
8281958b 310 /* Association don't need to report MAC address */
91980990 311 pAd->StaCfg.AssocInfo.AvailableRequestFixedIEs =
0f65bec1
BZ
312 NDIS_802_11_AI_REQFI_CAPABILITIES |
313 NDIS_802_11_AI_REQFI_LISTENINTERVAL;
314 pAd->StaCfg.AssocInfo.RequestFixedIEs.Capabilities =
315 CapabilityInfo;
316 pAd->StaCfg.AssocInfo.RequestFixedIEs.ListenInterval =
317 ListenIntv;
8281958b
BZ
318 /* Only reassociate need this */
319 /*COPY_MAC_ADDR(pAd->StaCfg.AssocInfo.RequestFixedIEs.CurrentAPAddress, ApAddr); */
0f65bec1
BZ
320 pAd->StaCfg.AssocInfo.OffsetRequestIEs =
321 sizeof(NDIS_802_11_ASSOCIATION_INFORMATION);
91980990 322
0f65bec1 323 NdisZeroMemory(pAd->StaCfg.ReqVarIEs, MAX_VIE_LEN);
8281958b 324 /* First add SSID */
91980990 325 VarIesOffset = 0;
0f65bec1
BZ
326 NdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset, &SsidIe,
327 1);
91980990 328 VarIesOffset += 1;
0f65bec1
BZ
329 NdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset,
330 &pAd->MlmeAux.SsidLen, 1);
91980990 331 VarIesOffset += 1;
0f65bec1
BZ
332 NdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset,
333 pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen);
91980990
GKH
334 VarIesOffset += pAd->MlmeAux.SsidLen;
335
8281958b 336 /* Second add Supported rates */
0f65bec1
BZ
337 NdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset, &SupRateIe,
338 1);
91980990 339 VarIesOffset += 1;
0f65bec1
BZ
340 NdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset,
341 &pAd->MlmeAux.SupRateLen, 1);
91980990 342 VarIesOffset += 1;
0f65bec1
BZ
343 NdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset,
344 pAd->MlmeAux.SupRate, pAd->MlmeAux.SupRateLen);
91980990 345 VarIesOffset += pAd->MlmeAux.SupRateLen;
8281958b 346 /* End Add by James */
91980990 347
0f65bec1
BZ
348 if ((pAd->CommonCfg.Channel > 14) &&
349 (pAd->CommonCfg.bIEEE80211H == TRUE))
350 CapabilityInfo |= 0x0100;
91980990
GKH
351
352 DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - Send ASSOC request...\n"));
0f65bec1
BZ
353 MgtMacHeaderInit(pAd, &AssocHdr, SUBTYPE_ASSOC_REQ, 0, ApAddr,
354 ApAddr);
91980990 355
8281958b 356 /* Build basic frame first */
0f65bec1
BZ
357 MakeOutgoingFrame(pOutBuffer, &FrameLen,
358 sizeof(HEADER_802_11), &AssocHdr,
359 2, &CapabilityInfo,
360 2, &ListenIntv,
361 1, &SsidIe,
362 1, &pAd->MlmeAux.SsidLen,
363 pAd->MlmeAux.SsidLen, pAd->MlmeAux.Ssid,
364 1, &SupRateIe,
365 1, &pAd->MlmeAux.SupRateLen,
366 pAd->MlmeAux.SupRateLen, pAd->MlmeAux.SupRate,
367 END_OF_ARGS);
368
369 if (pAd->MlmeAux.ExtRateLen != 0) {
370 MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp,
371 1, &ExtRateIe,
372 1, &pAd->MlmeAux.ExtRateLen,
373 pAd->MlmeAux.ExtRateLen,
374 pAd->MlmeAux.ExtRate, END_OF_ARGS);
91980990
GKH
375 FrameLen += tmp;
376 }
8281958b 377 /* HT */
0f65bec1
BZ
378 if ((pAd->MlmeAux.HtCapabilityLen > 0)
379 && (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)) {
51126deb
BZ
380 unsigned long TmpLen;
381 u8 HtLen;
382 u8 BROADCOM[4] = { 0x0, 0x90, 0x4c, 0x33 };
0f65bec1 383 if (pAd->StaActive.SupportedPhyInfo.bPreNHt == TRUE) {
91980990 384 HtLen = SIZE_HT_CAP_IE + 4;
0f65bec1
BZ
385 MakeOutgoingFrame(pOutBuffer + FrameLen,
386 &TmpLen, 1, &WpaIe, 1, &HtLen,
387 4, &BROADCOM[0],
388 pAd->MlmeAux.HtCapabilityLen,
389 &pAd->MlmeAux.HtCapability,
390 END_OF_ARGS);
391 } else {
392 MakeOutgoingFrame(pOutBuffer + FrameLen,
393 &TmpLen, 1, &HtCapIe, 1,
394 &pAd->MlmeAux.HtCapabilityLen,
395 pAd->MlmeAux.HtCapabilityLen,
396 &pAd->MlmeAux.HtCapability,
397 END_OF_ARGS);
91980990
GKH
398 }
399 FrameLen += TmpLen;
400 }
8281958b
BZ
401 /* add Ralink proprietary IE to inform AP this STA is going to use AGGREGATION or PIGGY-BACK+AGGREGATION */
402 /* Case I: (Aggregation + Piggy-Back) */
403 /* 1. user enable aggregation, AND */
404 /* 2. Mac support piggy-back */
405 /* 3. AP annouces it's PIGGY-BACK+AGGREGATION-capable in BEACON */
406 /* Case II: (Aggregation) */
407 /* 1. user enable aggregation, AND */
408 /* 2. AP annouces it's AGGREGATION-capable in BEACON */
0f65bec1
BZ
409 if (pAd->CommonCfg.bAggregationCapable) {
410 if ((pAd->CommonCfg.bPiggyBackCapable)
411 && ((pAd->MlmeAux.APRalinkIe & 0x00000003) == 3)) {
51126deb
BZ
412 unsigned long TmpLen;
413 u8 RalinkIe[9] =
0f65bec1
BZ
414 { IE_VENDOR_SPECIFIC, 7, 0x00, 0x0c, 0x43,
415 0x03, 0x00, 0x00, 0x00 };
416 MakeOutgoingFrame(pOutBuffer + FrameLen,
417 &TmpLen, 9, RalinkIe,
418 END_OF_ARGS);
91980990 419 FrameLen += TmpLen;
0f65bec1 420 } else if (pAd->MlmeAux.APRalinkIe & 0x00000001) {
51126deb
BZ
421 unsigned long TmpLen;
422 u8 RalinkIe[9] =
0f65bec1
BZ
423 { IE_VENDOR_SPECIFIC, 7, 0x00, 0x0c, 0x43,
424 0x01, 0x00, 0x00, 0x00 };
425 MakeOutgoingFrame(pOutBuffer + FrameLen,
426 &TmpLen, 9, RalinkIe,
427 END_OF_ARGS);
91980990
GKH
428 FrameLen += TmpLen;
429 }
0f65bec1 430 } else {
51126deb
BZ
431 unsigned long TmpLen;
432 u8 RalinkIe[9] =
0f65bec1
BZ
433 { IE_VENDOR_SPECIFIC, 7, 0x00, 0x0c, 0x43, 0x06,
434 0x00, 0x00, 0x00 };
435 MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 9,
436 RalinkIe, END_OF_ARGS);
91980990
GKH
437 FrameLen += TmpLen;
438 }
439
0f65bec1
BZ
440 if (pAd->MlmeAux.APEdcaParm.bValid) {
441 if (pAd->CommonCfg.bAPSDCapable
442 && pAd->MlmeAux.APEdcaParm.bAPSDCapable) {
91980990
GKH
443 QBSS_STA_INFO_PARM QosInfo;
444
0f65bec1
BZ
445 NdisZeroMemory(&QosInfo,
446 sizeof(QBSS_STA_INFO_PARM));
91980990
GKH
447 QosInfo.UAPSD_AC_BE = pAd->CommonCfg.bAPSDAC_BE;
448 QosInfo.UAPSD_AC_BK = pAd->CommonCfg.bAPSDAC_BK;
449 QosInfo.UAPSD_AC_VI = pAd->CommonCfg.bAPSDAC_VI;
450 QosInfo.UAPSD_AC_VO = pAd->CommonCfg.bAPSDAC_VO;
0f65bec1
BZ
451 QosInfo.MaxSPLength =
452 pAd->CommonCfg.MaxSPLength;
51126deb 453 WmeIe[8] |= *(u8 *)& QosInfo;
0f65bec1 454 } else {
8281958b
BZ
455