Staging: rt3070: remove dead DOT11N_DRAFT3 code
[linux-2.6] / drivers / staging / rt3070 / common / action.c
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         action.c
29
30     Abstract:
31     Handle association related requests either from WSTA or from local MLME
32
33     Revision History:
34     Who         When          What
35     --------    ----------    ----------------------------------------------
36         Jan Lee         2006            created for rt2860
37  */
38
39 #include "../rt_config.h"
40 #include "../action.h"
41
42
43 static VOID ReservedAction(
44         IN PRTMP_ADAPTER pAd,
45         IN MLME_QUEUE_ELEM *Elem);
46
47 /*
48     ==========================================================================
49     Description:
50         association state machine init, including state transition and timer init
51     Parameters:
52         S - pointer to the association state machine
53     Note:
54         The state machine looks like the following
55
56                                     ASSOC_IDLE
57         MT2_MLME_DISASSOC_REQ    mlme_disassoc_req_action
58         MT2_PEER_DISASSOC_REQ    peer_disassoc_action
59         MT2_PEER_ASSOC_REQ       drop
60         MT2_PEER_REASSOC_REQ     drop
61         MT2_CLS3ERR              cls3err_action
62     ==========================================================================
63  */
64 VOID ActionStateMachineInit(
65     IN  PRTMP_ADAPTER   pAd,
66     IN  STATE_MACHINE *S,
67     OUT STATE_MACHINE_FUNC Trans[])
68 {
69         StateMachineInit(S, (STATE_MACHINE_FUNC *)Trans, MAX_ACT_STATE, MAX_ACT_MSG, (STATE_MACHINE_FUNC)Drop, ACT_IDLE, ACT_MACHINE_BASE);
70
71         StateMachineSetAction(S, ACT_IDLE, MT2_PEER_SPECTRUM_CATE, (STATE_MACHINE_FUNC)PeerSpectrumAction);
72         StateMachineSetAction(S, ACT_IDLE, MT2_PEER_QOS_CATE, (STATE_MACHINE_FUNC)PeerQOSAction);
73
74         StateMachineSetAction(S, ACT_IDLE, MT2_PEER_DLS_CATE, (STATE_MACHINE_FUNC)ReservedAction);
75
76 #ifdef DOT11_N_SUPPORT
77         StateMachineSetAction(S, ACT_IDLE, MT2_PEER_BA_CATE, (STATE_MACHINE_FUNC)PeerBAAction);
78         StateMachineSetAction(S, ACT_IDLE, MT2_PEER_HT_CATE, (STATE_MACHINE_FUNC)PeerHTAction);
79         StateMachineSetAction(S, ACT_IDLE, MT2_MLME_ADD_BA_CATE, (STATE_MACHINE_FUNC)MlmeADDBAAction);
80         StateMachineSetAction(S, ACT_IDLE, MT2_MLME_ORI_DELBA_CATE, (STATE_MACHINE_FUNC)MlmeDELBAAction);
81         StateMachineSetAction(S, ACT_IDLE, MT2_MLME_REC_DELBA_CATE, (STATE_MACHINE_FUNC)MlmeDELBAAction);
82 #endif // DOT11_N_SUPPORT //
83
84         StateMachineSetAction(S, ACT_IDLE, MT2_PEER_PUBLIC_CATE, (STATE_MACHINE_FUNC)PeerPublicAction);
85         StateMachineSetAction(S, ACT_IDLE, MT2_PEER_RM_CATE, (STATE_MACHINE_FUNC)PeerRMAction);
86
87         StateMachineSetAction(S, ACT_IDLE, MT2_MLME_QOS_CATE, (STATE_MACHINE_FUNC)MlmeQOSAction);
88         StateMachineSetAction(S, ACT_IDLE, MT2_MLME_DLS_CATE, (STATE_MACHINE_FUNC)MlmeDLSAction);
89         StateMachineSetAction(S, ACT_IDLE, MT2_ACT_INVALID, (STATE_MACHINE_FUNC)MlmeInvalidAction);
90 }
91
92 #ifdef DOT11_N_SUPPORT
93 VOID MlmeADDBAAction(
94     IN PRTMP_ADAPTER pAd,
95     IN MLME_QUEUE_ELEM *Elem)
96
97 {
98         MLME_ADDBA_REQ_STRUCT *pInfo;
99         UCHAR           Addr[6];
100         PUCHAR         pOutBuffer = NULL;
101         NDIS_STATUS     NStatus;
102         ULONG           Idx;
103         FRAME_ADDBA_REQ  Frame;
104         ULONG           FrameLen;
105         BA_ORI_ENTRY                    *pBAEntry = NULL;
106
107         pInfo = (MLME_ADDBA_REQ_STRUCT *)Elem->Msg;
108         NdisZeroMemory(&Frame, sizeof(FRAME_ADDBA_REQ));
109
110         if(MlmeAddBAReqSanity(pAd, Elem->Msg, Elem->MsgLen, Addr))
111         {
112                 NStatus = MlmeAllocateMemory(pAd, &pOutBuffer);  //Get an unused nonpaged memory
113                 if(NStatus != NDIS_STATUS_SUCCESS)
114                 {
115                         DBGPRINT(RT_DEBUG_TRACE,("BA - MlmeADDBAAction() allocate memory failed \n"));
116                         return;
117                 }
118                 // 1. find entry
119                 Idx = pAd->MacTab.Content[pInfo->Wcid].BAOriWcidArray[pInfo->TID];
120                 if (Idx == 0)
121                 {
122                         MlmeFreeMemory(pAd, pOutBuffer);
123                         DBGPRINT(RT_DEBUG_ERROR,("BA - MlmeADDBAAction() can't find BAOriEntry \n"));
124                         return;
125                 }
126                 else
127                 {
128                         pBAEntry =&pAd->BATable.BAOriEntry[Idx];
129                 }
130
131 #ifdef CONFIG_STA_SUPPORT
132                 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
133                 {
134                         if (ADHOC_ON(pAd))
135                                 ActHeaderInit(pAd, &Frame.Hdr, pInfo->pAddr, pAd->CurrentAddress, pAd->CommonCfg.Bssid);
136                         else
137                                 ActHeaderInit(pAd, &Frame.Hdr, pAd->CommonCfg.Bssid, pAd->CurrentAddress, pInfo->pAddr);
138
139                 }
140 #endif // CONFIG_STA_SUPPORT //
141
142                 Frame.Category = CATEGORY_BA;
143                 Frame.Action = ADDBA_REQ;
144                 Frame.BaParm.AMSDUSupported = 0;
145                 Frame.BaParm.BAPolicy = IMMED_BA;
146                 Frame.BaParm.TID = pInfo->TID;
147                 Frame.BaParm.BufSize = pInfo->BaBufSize;
148                 Frame.Token = pInfo->Token;
149                 Frame.TimeOutValue = pInfo->TimeOutValue;
150                 Frame.BaStartSeq.field.FragNum = 0;
151                 Frame.BaStartSeq.field.StartSeq = pAd->MacTab.Content[pInfo->Wcid].TxSeq[pInfo->TID];
152
153                 *(USHORT *)(&Frame.BaParm) = cpu2le16(*(USHORT *)(&Frame.BaParm));
154                 Frame.TimeOutValue = cpu2le16(Frame.TimeOutValue);
155                 Frame.BaStartSeq.word = cpu2le16(Frame.BaStartSeq.word);
156
157                 MakeOutgoingFrame(pOutBuffer,              &FrameLen,
158                               sizeof(FRAME_ADDBA_REQ), &Frame,
159                               END_OF_ARGS);
160                 MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);
161                 //MiniportDataMMRequest(pAd, MapUserPriorityToAccessCategory[pInfo->TID], pOutBuffer, FrameLen);
162                 MlmeFreeMemory(pAd, pOutBuffer);
163
164                 DBGPRINT(RT_DEBUG_TRACE, ("BA - Send ADDBA request. StartSeq = %x,  FrameLen = %ld. BufSize = %d\n", Frame.BaStartSeq.field.StartSeq, FrameLen, Frame.BaParm.BufSize));
165     }
166 }
167
168 /*
169     ==========================================================================
170     Description:
171         send DELBA and delete BaEntry if any
172     Parametrs:
173         Elem - MLME message MLME_DELBA_REQ_STRUCT
174
175         IRQL = DISPATCH_LEVEL
176
177     ==========================================================================
178  */
179 VOID MlmeDELBAAction(
180     IN PRTMP_ADAPTER pAd,
181     IN MLME_QUEUE_ELEM *Elem)
182 {
183         MLME_DELBA_REQ_STRUCT *pInfo;
184         PUCHAR         pOutBuffer = NULL;
185         PUCHAR             pOutBuffer2 = NULL;
186         NDIS_STATUS     NStatus;
187         ULONG           Idx;
188         FRAME_DELBA_REQ  Frame;
189         ULONG           FrameLen;
190         FRAME_BAR       FrameBar;
191
192         pInfo = (MLME_DELBA_REQ_STRUCT *)Elem->Msg;
193         // must send back DELBA
194         NdisZeroMemory(&Frame, sizeof(FRAME_DELBA_REQ));
195         DBGPRINT(RT_DEBUG_TRACE, ("==> MlmeDELBAAction(), Initiator(%d) \n", pInfo->Initiator));
196
197         if(MlmeDelBAReqSanity(pAd, Elem->Msg, Elem->MsgLen))
198         {
199                 NStatus = MlmeAllocateMemory(pAd, &pOutBuffer);  //Get an unused nonpaged memory
200                 if(NStatus != NDIS_STATUS_SUCCESS)
201                 {
202                         DBGPRINT(RT_DEBUG_ERROR,("BA - MlmeDELBAAction() allocate memory failed 1. \n"));
203                         return;
204                 }
205
206                 NStatus = MlmeAllocateMemory(pAd, &pOutBuffer2);  //Get an unused nonpaged memory
207                 if(NStatus != NDIS_STATUS_SUCCESS)
208                 {
209                         MlmeFreeMemory(pAd, pOutBuffer);
210                         DBGPRINT(RT_DEBUG_ERROR, ("BA - MlmeDELBAAction() allocate memory failed 2. \n"));
211                         return;
212                 }
213
214                 // SEND BAR (Send BAR to refresh peer reordering buffer.)
215                 Idx = pAd->MacTab.Content[pInfo->Wcid].BAOriWcidArray[pInfo->TID];
216
217 #ifdef CONFIG_STA_SUPPORT
218                 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
219                         BarHeaderInit(pAd, &FrameBar, pAd->MacTab.Content[pInfo->Wcid].Addr, pAd->CurrentAddress);
220 #endif // CONFIG_STA_SUPPORT //
221
222                 FrameBar.StartingSeq.field.FragNum = 0; // make sure sequence not clear in DEL funciton.
223                 FrameBar.StartingSeq.field.StartSeq = pAd->MacTab.Content[pInfo->Wcid].TxSeq[pInfo->TID]; // make sure sequence not clear in DEL funciton.
224                 FrameBar.BarControl.TID = pInfo->TID; // make sure sequence not clear in DEL funciton.
225                 FrameBar.BarControl.ACKPolicy = IMMED_BA; // make sure sequence not clear in DEL funciton.
226                 FrameBar.BarControl.Compressed = 1; // make sure sequence not clear in DEL funciton.
227                 FrameBar.BarControl.MTID = 0; // make sure sequence not clear in DEL funciton.
228
229                 MakeOutgoingFrame(pOutBuffer2,                          &FrameLen,
230                                           sizeof(FRAME_BAR),      &FrameBar,
231                                           END_OF_ARGS);
232                 MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer2, FrameLen);
233                 MlmeFreeMemory(pAd, pOutBuffer2);
234                 DBGPRINT(RT_DEBUG_TRACE,("BA - MlmeDELBAAction() . Send BAR to refresh peer reordering buffer \n"));
235
236                 // SEND DELBA FRAME
237                 FrameLen = 0;
238 #ifdef CONFIG_STA_SUPPORT
239                 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
240                 {
241                         if (ADHOC_ON(pAd))
242                                 ActHeaderInit(pAd, &Frame.Hdr, pAd->MacTab.Content[pInfo->Wcid].Addr, pAd->CurrentAddress, pAd->CommonCfg.Bssid);
243                         else
244                                 ActHeaderInit(pAd, &Frame.Hdr,  pAd->CommonCfg.Bssid, pAd->CurrentAddress, pAd->MacTab.Content[pInfo->Wcid].Addr);
245                 }
246 #endif // CONFIG_STA_SUPPORT //
247                 Frame.Category = CATEGORY_BA;
248                 Frame.Action = DELBA;
249                 Frame.DelbaParm.Initiator = pInfo->Initiator;
250                 Frame.DelbaParm.TID = pInfo->TID;
251                 Frame.ReasonCode = 39; // Time Out
252                 *(USHORT *)(&Frame.DelbaParm) = cpu2le16(*(USHORT *)(&Frame.DelbaParm));
253                 Frame.ReasonCode = cpu2le16(Frame.ReasonCode);
254
255                 MakeOutgoingFrame(pOutBuffer,               &FrameLen,
256                               sizeof(FRAME_DELBA_REQ),    &Frame,
257                               END_OF_ARGS);
258                 MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);
259                 MlmeFreeMemory(pAd, pOutBuffer);
260                 DBGPRINT(RT_DEBUG_TRACE, ("BA - MlmeDELBAAction() . 3 DELBA sent. Initiator(%d)\n", pInfo->Initiator));
261         }
262 }
263 #endif // DOT11_N_SUPPORT //
264
265 VOID MlmeQOSAction(
266     IN PRTMP_ADAPTER pAd,
267     IN MLME_QUEUE_ELEM *Elem)
268 {
269 }
270
271 VOID MlmeDLSAction(
272     IN PRTMP_ADAPTER pAd,
273     IN MLME_QUEUE_ELEM *Elem)
274 {
275 }
276
277 VOID MlmeInvalidAction(
278     IN PRTMP_ADAPTER pAd,
279     IN MLME_QUEUE_ELEM *Elem)
280 {
281         //PUCHAR                   pOutBuffer = NULL;
282         //Return the receiving frame except the MSB of category filed set to 1.  7.3.1.11
283 }
284
285 VOID PeerQOSAction(
286         IN PRTMP_ADAPTER pAd,
287         IN MLME_QUEUE_ELEM *Elem)
288 {
289 }
290
291 #ifdef DOT11_N_SUPPORT
292 VOID PeerBAAction(
293         IN PRTMP_ADAPTER pAd,
294         IN MLME_QUEUE_ELEM *Elem)
295 {
296         UCHAR   Action = Elem->Msg[LENGTH_802_11+1];
297
298         switch(Action)
299         {
300                 case ADDBA_REQ:
301                         PeerAddBAReqAction(pAd,Elem);
302                         break;
303                 case ADDBA_RESP:
304                         PeerAddBARspAction(pAd,Elem);
305                         break;
306                 case DELBA:
307                         PeerDelBAAction(pAd,Elem);
308                         break;
309         }
310 }
311 #endif // DOT11_N_SUPPORT //
312
313 VOID PeerPublicAction(
314         IN PRTMP_ADAPTER pAd,
315         IN MLME_QUEUE_ELEM *Elem)
316 {
317         if (Elem->Wcid >= MAX_LEN_OF_MAC_TABLE)
318                 return;
319 }
320
321
322 static VOID ReservedAction(
323         IN PRTMP_ADAPTER pAd,
324         IN MLME_QUEUE_ELEM *Elem)
325 {
326         UCHAR Category;
327
328         if (Elem->MsgLen <= LENGTH_802_11)
329         {
330                 return;
331         }
332
333         Category = Elem->Msg[LENGTH_802_11];
334         DBGPRINT(RT_DEBUG_TRACE,("Rcv reserved category(%d) Action Frame\n", Category));
335         hex_dump("Reserved Action Frame", &Elem->Msg[0], Elem->MsgLen);
336 }
337
338 VOID PeerRMAction(
339         IN PRTMP_ADAPTER pAd,
340         IN MLME_QUEUE_ELEM *Elem)
341
342 {
343         return;
344 }
345
346 #ifdef DOT11_N_SUPPORT
347 static VOID respond_ht_information_exchange_action(
348         IN PRTMP_ADAPTER pAd,
349         IN MLME_QUEUE_ELEM *Elem)
350 {
351         PUCHAR                  pOutBuffer = NULL;
352         NDIS_STATUS             NStatus;
353         ULONG                   FrameLen;
354         FRAME_HT_INFO   HTINFOframe, *pFrame;
355         UCHAR                   *pAddr;
356
357
358         // 2. Always send back ADDBA Response
359         NStatus = MlmeAllocateMemory(pAd, &pOutBuffer);  //Get an unused nonpaged memory
360
361         if (NStatus != NDIS_STATUS_SUCCESS)
362         {
363                 DBGPRINT(RT_DEBUG_TRACE,("ACTION - respond_ht_information_exchange_action() allocate memory failed \n"));
364                 return;
365         }
366
367         // get RA
368         pFrame = (FRAME_HT_INFO *) &Elem->Msg[0];
369         pAddr = pFrame->Hdr.Addr2;
370
371         NdisZeroMemory(&HTINFOframe, sizeof(FRAME_HT_INFO));
372         // 2-1. Prepare ADDBA Response frame.
373 #ifdef CONFIG_STA_SUPPORT
374         IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
375         {
376                 if (ADHOC_ON(pAd))
377                         ActHeaderInit(pAd, &HTINFOframe.Hdr, pAddr, pAd->CurrentAddress, pAd->CommonCfg.Bssid);
378                 else
379                         ActHeaderInit(pAd, &HTINFOframe.Hdr, pAd->CommonCfg.Bssid, pAd->CurrentAddress, pAddr);
380         }
381 #endif // CONFIG_STA_SUPPORT //
382
383         HTINFOframe.Category = CATEGORY_HT;
384         HTINFOframe.Action = HT_INFO_EXCHANGE;
385         HTINFOframe.HT_Info.Request = 0;
386         HTINFOframe.HT_Info.Forty_MHz_Intolerant = pAd->CommonCfg.HtCapability.HtCapInfo.Forty_Mhz_Intolerant;
387         HTINFOframe.HT_Info.STA_Channel_Width    = pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth;
388
389         MakeOutgoingFrame(pOutBuffer,                                   &FrameLen,
390                                           sizeof(FRAME_HT_INFO),        &HTINFOframe,
391                                           END_OF_ARGS);
392
393         MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);
394         MlmeFreeMemory(pAd, pOutBuffer);
395 }
396
397 VOID PeerHTAction(
398         IN PRTMP_ADAPTER pAd,
399         IN MLME_QUEUE_ELEM *Elem)
400 {
401         UCHAR   Action = Elem->Msg[LENGTH_802_11+1];
402
403         if (Elem->Wcid >= MAX_LEN_OF_MAC_TABLE)
404                 return;
405
406         switch(Action)
407         {
408                 case NOTIFY_BW_ACTION:
409                         DBGPRINT(RT_DEBUG_TRACE,("ACTION - HT Notify Channel bandwidth action----> \n"));
410 #ifdef CONFIG_STA_SUPPORT
411                         if(pAd->StaActive.SupportedPhyInfo.bHtEnable == FALSE)
412                         {
413                                 // Note, this is to patch DIR-1353 AP. When the AP set to Wep, it will use legacy mode. But AP still keeps
414                                 // sending BW_Notify Action frame, and cause us to linkup and linkdown.
415                                 // In legacy mode, don't need to parse HT action frame.
416                                 DBGPRINT(RT_DEBUG_TRACE,("ACTION -Ignore HT Notify Channel BW when link as legacy mode. BW = %d---> \n",
417                                                                 Elem->Msg[LENGTH_802_11+2] ));
418                                 break;
419                         }
420 #endif // CONFIG_STA_SUPPORT //
421
422                         if (Elem->Msg[LENGTH_802_11+2] == 0)    // 7.4.8.2. if value is 1, keep the same as supported channel bandwidth.
423                                 pAd->MacTab.Content[Elem->Wcid].HTPhyMode.field.BW = 0;
424
425                         break;
426
427                 case SMPS_ACTION:
428                         // 7.3.1.25
429                         DBGPRINT(RT_DEBUG_TRACE,("ACTION - SMPS action----> \n"));
430                         if (((Elem->Msg[LENGTH_802_11+2]&0x1) == 0))
431                         {
432                                 pAd->MacTab.Content[Elem->Wcid].MmpsMode = MMPS_ENABLE;
433                         }
434                         else if (((Elem->Msg[LENGTH_802_11+2]&0x2) == 0))
435                         {
436                                 pAd->MacTab.Content[Elem->Wcid].MmpsMode = MMPS_STATIC;
437                         }
438                         else
439                         {
440                                 pAd->MacTab.Content[Elem->Wcid].MmpsMode = MMPS_DYNAMIC;
441                         }
442
443                         DBGPRINT(RT_DEBUG_TRACE,("Aid(%d) MIMO PS = %d\n", Elem->Wcid, pAd->MacTab.Content[Elem->Wcid].MmpsMode));
444                         // rt2860c : add something for smps change.
445                         break;
446
447                 case SETPCO_ACTION:
448                         break;
449
450                 case MIMO_CHA_MEASURE_ACTION:
451                         break;
452
453                 case HT_INFO_EXCHANGE:
454                         {
455                                 HT_INFORMATION_OCTET    *pHT_info;
456
457                                 pHT_info = (HT_INFORMATION_OCTET *) &Elem->Msg[LENGTH_802_11+2];
458                                 // 7.4.8.10
459                                 DBGPRINT(RT_DEBUG_TRACE,("ACTION - HT Information Exchange action----> \n"));
460                                 if (pHT_info->Request)
461                                 {
462                                         respond_ht_information_exchange_action(pAd, Elem);
463                                 }
464                         }
465                         break;
466         }
467 }
468
469
470 /*
471         ==========================================================================
472         Description:
473                 Retry sending ADDBA Reqest.
474
475         IRQL = DISPATCH_LEVEL
476
477         Parametrs:
478         p8023Header: if this is already 802.3 format, p8023Header is NULL
479
480         Return  : TRUE if put into rx reordering buffer, shouldn't indicaterxhere.
481                                 FALSE , then continue indicaterx at this moment.
482         ==========================================================================
483  */
484 VOID ORIBATimerTimeout(
485         IN      PRTMP_ADAPTER   pAd)
486 {
487         MAC_TABLE_ENTRY *pEntry;
488         INT                     i, total;
489 //      FRAME_BAR                       FrameBar;
490 //      ULONG                   FrameLen;
491 //      NDIS_STATUS     NStatus;
492 //      PUCHAR                  pOutBuffer = NULL;
493 //      USHORT                  Sequence;
494         UCHAR                   TID;
495
496         total = pAd->MacTab.Size * NUM_OF_TID;
497
498         for (i = 1; ((i <MAX_LEN_OF_BA_ORI_TABLE) && (total > 0)) ; i++)
499         {
500                 if  (pAd->BATable.BAOriEntry[i].ORI_BA_Status == Originator_Done)
501                 {
502                         pEntry = &pAd->MacTab.Content[pAd->BATable.BAOriEntry[i].Wcid];
503                         TID = pAd->BATable.BAOriEntry[i].TID;
504
505                         ASSERT(pAd->BATable.BAOriEntry[i].Wcid < MAX_LEN_OF_MAC_TABLE);
506                 }
507                 total --;
508         }
509 }
510
511
512 VOID SendRefreshBAR(
513         IN      PRTMP_ADAPTER   pAd,
514         IN      MAC_TABLE_ENTRY *pEntry)
515 {
516         FRAME_BAR               FrameBar;
517         ULONG                   FrameLen;
518         NDIS_STATUS     NStatus;
519         PUCHAR                  pOutBuffer = NULL;
520         USHORT                  Sequence;
521         UCHAR                   i, TID;
522         USHORT                  idx;
523         BA_ORI_ENTRY    *pBAEntry;
524
525         for (i = 0; i <NUM_OF_TID; i++)
526         {
527                 idx = pEntry->BAOriWcidArray[i];
528                 if (idx == 0)
529                 {
530                         continue;
531                 }
532                 pBAEntry = &pAd->BATable.BAOriEntry[idx];
533
534                 if  (pBAEntry->ORI_BA_Status == Originator_Done)
535                 {
536                         TID = pBAEntry->TID;
537
538                         ASSERT(pBAEntry->Wcid < MAX_LEN_OF_MAC_TABLE);
539
540                         NStatus = MlmeAllocateMemory(pAd, &pOutBuffer);  //Get an unused nonpaged memory
541                         if(NStatus != NDIS_STATUS_SUCCESS)
542                         {
543                                 DBGPRINT(RT_DEBUG_ERROR,("BA - MlmeADDBAAction() allocate memory failed \n"));
544                                 return;
545                         }
546
547                         Sequence = pEntry->TxSeq[TID];
548
549
550 #ifdef CONFIG_STA_SUPPORT
551                         IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
552                                 BarHeaderInit(pAd, &FrameBar, pEntry->Addr, pAd->CurrentAddress);
553 #endif // CONFIG_STA_SUPPORT //
554
555                         FrameBar.StartingSeq.field.FragNum = 0; // make sure sequence not clear in DEL function.
556                         FrameBar.StartingSeq.field.StartSeq = Sequence; // make sure sequence not clear in DEL funciton.
557                         FrameBar.BarControl.TID = TID; // make sure sequence not clear in DEL funciton.
558
559                         MakeOutgoingFrame(pOutBuffer,                           &FrameLen,
560                                                           sizeof(FRAME_BAR),      &FrameBar,
561                                                           END_OF_ARGS);
562                         //if (!(CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_RALINK_CHIPSET)))
563                         if (1)  // Now we always send BAR.
564                         {
565                                 //MiniportMMRequestUnlock(pAd, 0, pOutBuffer, FrameLen);
566                                 MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);
567                                 //MiniportDataMMRequest(pAd, MapUserPriorityToAccessCategory[TID], pOutBuffer, FrameLen);
568                         }
569                         MlmeFreeMemory(pAd, pOutBuffer);
570                 }
571         }
572 }
573 #endif // DOT11_N_SUPPORT //
574
575 VOID ActHeaderInit(
576     IN  PRTMP_ADAPTER   pAd,
577     IN OUT PHEADER_802_11 pHdr80211,
578     IN PUCHAR Addr1,
579     IN PUCHAR Addr2,
580     IN PUCHAR Addr3)
581 {
582     NdisZeroMemory(pHdr80211, sizeof(HEADER_802_11));
583     pHdr80211->FC.Type = BTYPE_MGMT;
584     pHdr80211->FC.SubType = SUBTYPE_ACTION;
585
586     COPY_MAC_ADDR(pHdr80211->Addr1, Addr1);
587         COPY_MAC_ADDR(pHdr80211->Addr2, Addr2);
588     COPY_MAC_ADDR(pHdr80211->Addr3, Addr3);
589 }
590
591 VOID BarHeaderInit(
592         IN      PRTMP_ADAPTER   pAd,
593         IN OUT PFRAME_BAR pCntlBar,
594         IN PUCHAR pDA,
595         IN PUCHAR pSA)
596 {
597 //      USHORT  Duration;
598
599         NdisZeroMemory(pCntlBar, sizeof(FRAME_BAR));
600         pCntlBar->FC.Type = BTYPE_CNTL;
601         pCntlBar->FC.SubType = SUBTYPE_BLOCK_ACK_REQ;
602         pCntlBar->BarControl.MTID = 0;
603         pCntlBar->BarControl.Compressed = 1;
604         pCntlBar->BarControl.ACKPolicy = 0;
605
606
607         pCntlBar->Duration = 16 + RTMPCalcDuration(pAd, RATE_1, sizeof(FRAME_BA));
608
609         COPY_MAC_ADDR(pCntlBar->Addr1, pDA);
610         COPY_MAC_ADDR(pCntlBar->Addr2, pSA);
611 }
612
613
614 /*
615         ==========================================================================
616         Description:
617                 Insert Category and action code into the action frame.
618
619         Parametrs:
620                 1. frame buffer pointer.
621                 2. frame length.
622                 3. category code of the frame.
623                 4. action code of the frame.
624
625         Return  : None.
626         ==========================================================================
627  */
628 VOID InsertActField(
629         IN PRTMP_ADAPTER pAd,
630         OUT PUCHAR pFrameBuf,
631         OUT PULONG pFrameLen,
632         IN UINT8 Category,
633         IN UINT8 ActCode)
634 {
635         ULONG TempLen;
636
637         MakeOutgoingFrame(      pFrameBuf,              &TempLen,
638                                                 1,                              &Category,
639                                                 1,                              &ActCode,
640                                                 END_OF_ARGS);
641
642         *pFrameLen = *pFrameLen + TempLen;
643
644         return;
645 }