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