331ebeb4924f798f7ccb72ef5bccbff1d8fbf6a4
[pandora-kernel.git] / drivers / staging / rt2870 / rtmp.h
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     rtmp.h
29
30     Abstract:
31     Miniport generic portion header file
32
33     Revision History:
34     Who         When          What
35     --------    ----------    ----------------------------------------------
36     Paul Lin    2002-08-01    created
37     James Tan   2002-09-06    modified (Revise NTCRegTable)
38     John Chang  2004-09-06    modified for RT2600
39 */
40 #ifndef __RTMP_H__
41 #define __RTMP_H__
42
43 #include "link_list.h"
44 #include "spectrum_def.h"
45
46 #include "aironet.h"
47
48 //#define DBG           1
49
50 //#define DBG_DIAGNOSE          1
51
52 #if defined(CONFIG_AP_SUPPORT)
53 #define IF_DEV_CONFIG_OPMODE_ON_AP(_pAd)        if(_pAd->OpMode == OPMODE_AP)
54 #define IF_DEV_CONFIG_OPMODE_ON_STA(_pAd)       if(_pAd->OpMode == OPMODE_STA)
55 #else
56 #define IF_DEV_CONFIG_OPMODE_ON_AP(_pAd)
57 #define IF_DEV_CONFIG_OPMODE_ON_STA(_pAd)
58 #endif
59
60 #define VIRTUAL_IF_INC(__pAd) ((__pAd)->VirtualIfCnt++)
61 #define VIRTUAL_IF_DEC(__pAd) ((__pAd)->VirtualIfCnt--)
62 #define VIRTUAL_IF_NUM(__pAd) ((__pAd)->VirtualIfCnt)
63
64 #ifdef RT2870
65 ////////////////////////////////////////////////////////////////////////////
66 // The TX_BUFFER structure forms the transmitted USB packet to the device
67 ////////////////////////////////////////////////////////////////////////////
68 typedef struct __TX_BUFFER{
69         union   {
70                 UCHAR                   WirelessPacket[TX_BUFFER_NORMSIZE];
71                 HEADER_802_11   NullFrame;
72                 PSPOLL_FRAME    PsPollPacket;
73                 RTS_FRAME               RTSFrame;
74         }field;
75         UCHAR                   Aggregation[4];  //Buffer for save Aggregation size.
76 } TX_BUFFER, *PTX_BUFFER;
77
78 typedef struct __HTTX_BUFFER{
79         union   {
80                 UCHAR                   WirelessPacket[MAX_TXBULK_SIZE];
81                 HEADER_802_11   NullFrame;
82                 PSPOLL_FRAME    PsPollPacket;
83                 RTS_FRAME               RTSFrame;
84         }field;
85         UCHAR                   Aggregation[4];  //Buffer for save Aggregation size.
86 } HTTX_BUFFER, *PHTTX_BUFFER;
87
88
89 // used to track driver-generated write irps
90 typedef struct _TX_CONTEXT
91 {
92         PVOID                   pAd;            //Initialized in MiniportInitialize
93         PURB                    pUrb;                   //Initialized in MiniportInitialize
94         PIRP                    pIrp;                   //used to cancel pending bulk out.
95                                                                         //Initialized in MiniportInitialize
96         PTX_BUFFER              TransferBuffer; //Initialized in MiniportInitialize
97         ULONG                   BulkOutSize;
98         UCHAR                   BulkOutPipeId;
99         UCHAR                   SelfIdx;
100         BOOLEAN                 InUse;
101         BOOLEAN                 bWaitingBulkOut; // at least one packet is in this TxContext, ready for making IRP anytime.
102         BOOLEAN                 bFullForBulkOut; // all tx buffer are full , so waiting for tx bulkout.
103         BOOLEAN                 IRPPending;
104         BOOLEAN                 LastOne;
105         BOOLEAN                 bAggregatible;
106         UCHAR                   Header_802_3[LENGTH_802_3];
107         UCHAR                   Rsv[2];
108         ULONG                   DataOffset;
109         UINT                    TxRate;
110         dma_addr_t              data_dma;               // urb dma on linux
111
112 }       TX_CONTEXT, *PTX_CONTEXT, **PPTX_CONTEXT;
113
114
115 // used to track driver-generated write irps
116 typedef struct _HT_TX_CONTEXT
117 {
118         PVOID                   pAd;            //Initialized in MiniportInitialize
119         PURB                    pUrb;                   //Initialized in MiniportInitialize
120         PIRP                    pIrp;                   //used to cancel pending bulk out.
121                                                                         //Initialized in MiniportInitialize
122         PHTTX_BUFFER    TransferBuffer; //Initialized in MiniportInitialize
123         ULONG                   BulkOutSize;    // Indicate the total bulk-out size in bytes in one bulk-transmission
124         UCHAR                   BulkOutPipeId;
125         BOOLEAN                 IRPPending;
126         BOOLEAN                 LastOne;
127         BOOLEAN                 bCurWriting;
128         BOOLEAN                 bRingEmpty;
129         BOOLEAN                 bCopySavePad;
130         UCHAR                   SavedPad[8];
131         UCHAR                   Header_802_3[LENGTH_802_3];
132         ULONG                   CurWritePosition;               // Indicate the buffer offset which packet will be inserted start from.
133         ULONG                   CurWriteRealPos;                // Indicate the buffer offset which packet now are writing to.
134         ULONG                   NextBulkOutPosition;    // Indicate the buffer start offset of a bulk-transmission
135         ULONG                   ENextBulkOutPosition;   // Indicate the buffer end offset of a bulk-transmission
136         UINT                    TxRate;
137         dma_addr_t              data_dma;               // urb dma on linux
138 }       HT_TX_CONTEXT, *PHT_TX_CONTEXT, **PPHT_TX_CONTEXT;
139
140
141 //
142 // Structure to keep track of receive packets and buffers to indicate
143 // receive data to the protocol.
144 //
145 typedef struct _RX_CONTEXT
146 {
147         PUCHAR                          TransferBuffer;
148         PVOID                           pAd;
149         PIRP                            pIrp;//used to cancel pending bulk in.
150         PURB                            pUrb;
151         //These 2 Boolean shouldn't both be 1 at the same time.
152         ULONG                           BulkInOffset;   // number of packets waiting for reordering .
153 //      BOOLEAN                         ReorderInUse;   // At least one packet in this buffer are in reordering buffer and wait for receive indication
154         BOOLEAN                         bRxHandling;    // Notify this packet is being process now.
155         BOOLEAN                         InUse;                  // USB Hardware Occupied. Wait for USB HW to put packet.
156         BOOLEAN                         Readable;               // Receive Complete back. OK for driver to indicate receiving packet.
157         BOOLEAN                         IRPPending;             // TODO: To be removed
158         atomic_t                        IrpLock;
159         NDIS_SPIN_LOCK          RxContextLock;
160         dma_addr_t                      data_dma;               // urb dma on linux
161 }       RX_CONTEXT, *PRX_CONTEXT;
162 #endif // RT2870 //
163
164
165 //
166 //  NDIS Version definitions
167 //
168 #ifdef  NDIS50_MINIPORT
169 #define RTMP_NDIS_MAJOR_VERSION     5
170 #define RTMP_NDIS_MINOR_VERSION     0
171 #endif
172
173 #ifdef  NDIS51_MINIPORT
174 #define RTMP_NDIS_MAJOR_VERSION     5
175 #define RTMP_NDIS_MINOR_VERSION     1
176 #endif
177
178 extern  char    NIC_VENDOR_DESC[];
179 extern  int     NIC_VENDOR_DESC_LEN;
180
181 extern  unsigned char   SNAP_AIRONET[];
182 extern  unsigned char   CipherSuiteCiscoCCKM[];
183 extern  unsigned char   CipherSuiteCiscoCCKMLen;
184 extern  unsigned char   CipherSuiteCiscoCCKM24[];
185 extern  unsigned char   CipherSuiteCiscoCCKM24Len;
186 extern  unsigned char   CipherSuiteCCXTkip[];
187 extern  unsigned char   CipherSuiteCCXTkipLen;
188 extern  unsigned char   CISCO_OUI[];
189 extern  UCHAR   BaSizeArray[4];
190
191 extern UCHAR BROADCAST_ADDR[MAC_ADDR_LEN];
192 extern UCHAR MULTICAST_ADDR[MAC_ADDR_LEN];
193 extern UCHAR ZERO_MAC_ADDR[MAC_ADDR_LEN];
194 extern ULONG BIT32[32];
195 extern UCHAR BIT8[8];
196 extern char* CipherName[];
197 extern char* MCSToMbps[];
198 extern UCHAR     RxwiMCSToOfdmRate[12];
199 extern UCHAR SNAP_802_1H[6];
200 extern UCHAR SNAP_BRIDGE_TUNNEL[6];
201 extern UCHAR SNAP_AIRONET[8];
202 extern UCHAR CKIP_LLC_SNAP[8];
203 extern UCHAR EAPOL_LLC_SNAP[8];
204 extern UCHAR EAPOL[2];
205 extern UCHAR IPX[2];
206 extern UCHAR APPLE_TALK[2];
207 extern UCHAR RateIdToPlcpSignal[12]; // see IEEE802.11a-1999 p.14
208 extern UCHAR     OfdmRateToRxwiMCS[];
209 extern UCHAR OfdmSignalToRateId[16] ;
210 extern UCHAR default_cwmin[4];
211 extern UCHAR default_cwmax[4];
212 extern UCHAR default_sta_aifsn[4];
213 extern UCHAR MapUserPriorityToAccessCategory[8];
214
215 extern USHORT RateUpPER[];
216 extern USHORT RateDownPER[];
217 extern UCHAR  Phy11BNextRateDownward[];
218 extern UCHAR  Phy11BNextRateUpward[];
219 extern UCHAR  Phy11BGNextRateDownward[];
220 extern UCHAR  Phy11BGNextRateUpward[];
221 extern UCHAR  Phy11ANextRateDownward[];
222 extern UCHAR  Phy11ANextRateUpward[];
223 extern CHAR   RssiSafeLevelForTxRate[];
224 extern UCHAR  RateIdToMbps[];
225 extern USHORT RateIdTo500Kbps[];
226
227 extern UCHAR  CipherSuiteWpaNoneTkip[];
228 extern UCHAR  CipherSuiteWpaNoneTkipLen;
229
230 extern UCHAR  CipherSuiteWpaNoneAes[];
231 extern UCHAR  CipherSuiteWpaNoneAesLen;
232
233 extern UCHAR  SsidIe;
234 extern UCHAR  SupRateIe;
235 extern UCHAR  ExtRateIe;
236
237 #ifdef DOT11_N_SUPPORT
238 extern UCHAR  HtCapIe;
239 extern UCHAR  AddHtInfoIe;
240 extern UCHAR  NewExtChanIe;
241 #endif // DOT11_N_SUPPORT //
242
243 extern UCHAR  ErpIe;
244 extern UCHAR  DsIe;
245 extern UCHAR  TimIe;
246 extern UCHAR  WpaIe;
247 extern UCHAR  Wpa2Ie;
248 extern UCHAR  IbssIe;
249 extern UCHAR  Ccx2Ie;
250
251 extern UCHAR  WPA_OUI[];
252 extern UCHAR  RSN_OUI[];
253 extern UCHAR  WME_INFO_ELEM[];
254 extern UCHAR  WME_PARM_ELEM[];
255 extern UCHAR  Ccx2QosInfo[];
256 extern UCHAR  Ccx2IeInfo[];
257 extern UCHAR  RALINK_OUI[];
258 extern UCHAR  PowerConstraintIE[];
259
260
261 extern UCHAR  RateSwitchTable[];
262 extern UCHAR  RateSwitchTable11B[];
263 extern UCHAR  RateSwitchTable11G[];
264 extern UCHAR  RateSwitchTable11BG[];
265
266 #ifdef DOT11_N_SUPPORT
267 extern UCHAR  RateSwitchTable11BGN1S[];
268 extern UCHAR  RateSwitchTable11BGN2S[];
269 extern UCHAR  RateSwitchTable11BGN2SForABand[];
270 extern UCHAR  RateSwitchTable11N1S[];
271 extern UCHAR  RateSwitchTable11N2S[];
272 extern UCHAR  RateSwitchTable11N2SForABand[];
273
274 extern UCHAR  PRE_N_HT_OUI[];
275 #endif // DOT11_N_SUPPORT //
276
277 #define MAXSEQ          (0xFFF)
278
279 #ifdef DOT11_N_SUPPORT
280 struct reordering_mpdu
281 {
282         struct reordering_mpdu  *next;
283         PNDIS_PACKET                    pPacket;                /* coverted to 802.3 frame */
284         int                                             Sequence;               /* sequence number of MPDU */
285         BOOLEAN                                 bAMSDU;
286 };
287
288 struct reordering_list
289 {
290         struct reordering_mpdu *next;
291         int     qlen;
292 };
293
294 struct reordering_mpdu_pool
295 {
296         PVOID                                   mem;
297         NDIS_SPIN_LOCK                  lock;
298         struct reordering_list  freelist;
299 };
300 #endif // DOT11_N_SUPPORT //
301
302 typedef struct  _RSSI_SAMPLE {
303         CHAR                    LastRssi0;             // last received RSSI
304         CHAR                    LastRssi1;             // last received RSSI
305         CHAR                    LastRssi2;             // last received RSSI
306         CHAR                    AvgRssi0;
307         CHAR                    AvgRssi1;
308         CHAR                    AvgRssi2;
309         SHORT                   AvgRssi0X8;
310         SHORT                   AvgRssi1X8;
311         SHORT                   AvgRssi2X8;
312 } RSSI_SAMPLE;
313
314 //
315 //  Queue structure and macros
316 //
317 typedef struct  _QUEUE_ENTRY    {
318         struct _QUEUE_ENTRY     *Next;
319 }   QUEUE_ENTRY, *PQUEUE_ENTRY;
320
321 // Queue structure
322 typedef struct  _QUEUE_HEADER   {
323         PQUEUE_ENTRY    Head;
324         PQUEUE_ENTRY    Tail;
325         ULONG           Number;
326 }   QUEUE_HEADER, *PQUEUE_HEADER;
327
328 #define InitializeQueueHeader(QueueHeader)              \
329 {                                                       \
330         (QueueHeader)->Head = (QueueHeader)->Tail = NULL;   \
331         (QueueHeader)->Number = 0;                          \
332 }
333
334 #define RemoveHeadQueue(QueueHeader)                \
335 (QueueHeader)->Head;                                \
336 {                                                   \
337         PQUEUE_ENTRY pNext;                             \
338         if ((QueueHeader)->Head != NULL)                                \
339         {                                                                                               \
340                 pNext = (QueueHeader)->Head->Next;          \
341                 (QueueHeader)->Head = pNext;                \
342                 if (pNext == NULL)                          \
343                         (QueueHeader)->Tail = NULL;             \
344                 (QueueHeader)->Number--;                    \
345         }                                                                                               \
346 }
347
348 #define InsertHeadQueue(QueueHeader, QueueEntry)            \
349 {                                                           \
350                 ((PQUEUE_ENTRY)QueueEntry)->Next = (QueueHeader)->Head; \
351                 (QueueHeader)->Head = (PQUEUE_ENTRY)(QueueEntry);       \
352                 if ((QueueHeader)->Tail == NULL)                        \
353                         (QueueHeader)->Tail = (PQUEUE_ENTRY)(QueueEntry);   \
354                 (QueueHeader)->Number++;                                \
355 }
356
357 #define InsertTailQueue(QueueHeader, QueueEntry)                \
358 {                                                               \
359         ((PQUEUE_ENTRY)QueueEntry)->Next = NULL;                    \
360         if ((QueueHeader)->Tail)                                    \
361                 (QueueHeader)->Tail->Next = (PQUEUE_ENTRY)(QueueEntry); \
362         else                                                        \
363                 (QueueHeader)->Head = (PQUEUE_ENTRY)(QueueEntry);       \
364         (QueueHeader)->Tail = (PQUEUE_ENTRY)(QueueEntry);           \
365         (QueueHeader)->Number++;                                    \
366 }
367
368 //
369 //  Macros for flag and ref count operations
370 //
371 #define RTMP_SET_FLAG(_M, _F)       ((_M)->Flags |= (_F))
372 #define RTMP_CLEAR_FLAG(_M, _F)     ((_M)->Flags &= ~(_F))
373 #define RTMP_CLEAR_FLAGS(_M)        ((_M)->Flags = 0)
374 #define RTMP_TEST_FLAG(_M, _F)      (((_M)->Flags & (_F)) != 0)
375 #define RTMP_TEST_FLAGS(_M, _F)     (((_M)->Flags & (_F)) == (_F))
376
377 #define OPSTATUS_SET_FLAG(_pAd, _F)     ((_pAd)->CommonCfg.OpStatusFlags |= (_F))
378 #define OPSTATUS_CLEAR_FLAG(_pAd, _F)   ((_pAd)->CommonCfg.OpStatusFlags &= ~(_F))
379 #define OPSTATUS_TEST_FLAG(_pAd, _F)    (((_pAd)->CommonCfg.OpStatusFlags & (_F)) != 0)
380
381 #define CLIENT_STATUS_SET_FLAG(_pEntry,_F)      ((_pEntry)->ClientStatusFlags |= (_F))
382 #define CLIENT_STATUS_CLEAR_FLAG(_pEntry,_F)    ((_pEntry)->ClientStatusFlags &= ~(_F))
383 #define CLIENT_STATUS_TEST_FLAG(_pEntry,_F)     (((_pEntry)->ClientStatusFlags & (_F)) != 0)
384
385 #define RX_FILTER_SET_FLAG(_pAd, _F)    ((_pAd)->CommonCfg.PacketFilter |= (_F))
386 #define RX_FILTER_CLEAR_FLAG(_pAd, _F)  ((_pAd)->CommonCfg.PacketFilter &= ~(_F))
387 #define RX_FILTER_TEST_FLAG(_pAd, _F)   (((_pAd)->CommonCfg.PacketFilter & (_F)) != 0)
388
389 #define STA_NO_SECURITY_ON(_p)          (_p->StaCfg.WepStatus == Ndis802_11EncryptionDisabled)
390 #define STA_WEP_ON(_p)                  (_p->StaCfg.WepStatus == Ndis802_11Encryption1Enabled)
391 #define STA_TKIP_ON(_p)                 (_p->StaCfg.WepStatus == Ndis802_11Encryption2Enabled)
392 #define STA_AES_ON(_p)                  (_p->StaCfg.WepStatus == Ndis802_11Encryption3Enabled)
393
394 #define STA_TGN_WIFI_ON(_p)             (_p->StaCfg.bTGnWifiTest == TRUE)
395
396 #define CKIP_KP_ON(_p)                          ((((_p)->StaCfg.CkipFlag) & 0x10) && ((_p)->StaCfg.bCkipCmicOn == TRUE))
397 #define CKIP_CMIC_ON(_p)                        ((((_p)->StaCfg.CkipFlag) & 0x08) && ((_p)->StaCfg.bCkipCmicOn == TRUE))
398
399
400 #define INC_RING_INDEX(_idx, _RingSize)    \
401 {                                          \
402     (_idx) = (_idx+1) % (_RingSize);       \
403 }
404
405 #define IS_RT3070(_pAd)                         (((_pAd)->MACVersion & 0xffff0000) == 0x30700000)
406
407 #define RING_PACKET_INIT(_TxRing, _idx)    \
408 {                                          \
409     _TxRing->Cell[_idx].pNdisPacket = NULL;                              \
410     _TxRing->Cell[_idx].pNextNdisPacket = NULL;                              \
411 }
412
413 #define TXDT_INIT(_TxD)    \
414 {                                          \
415         NdisZeroMemory(_TxD, TXD_SIZE); \
416         _TxD->DMADONE = 1;                              \
417 }
418
419 //Set last data segment
420 #define RING_SET_LASTDS(_TxD, _IsSD0)    \
421 {                                          \
422     if (_IsSD0) {_TxD->LastSec0 = 1;}     \
423     else {_TxD->LastSec1 = 1;}     \
424 }
425
426 // Increase TxTsc value for next transmission
427 // TODO:
428 // When i==6, means TSC has done one full cycle, do re-keying stuff follow specs
429 // Should send a special event microsoft defined to request re-key
430 #define INC_TX_TSC(_tsc)                                \
431 {                                                       \
432     int i=0;                                            \
433     while (++_tsc[i] == 0x0)                            \
434     {                                                   \
435         i++;                                            \
436         if (i == 6)                                     \
437             break;                                      \
438     }                                                   \
439 }
440
441 #ifdef DOT11_N_SUPPORT
442 // StaActive.SupportedHtPhy.MCSSet is copied from AP beacon.  Don't need to update here.
443 #define COPY_HTSETTINGS_FROM_MLME_AUX_TO_ACTIVE_CFG(_pAd)                                 \
444 {                                                                                       \
445         _pAd->StaActive.SupportedHtPhy.ChannelWidth = _pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth;      \
446         _pAd->StaActive.SupportedHtPhy.MimoPs = _pAd->MlmeAux.HtCapability.HtCapInfo.MimoPs;      \
447         _pAd->StaActive.SupportedHtPhy.GF = _pAd->MlmeAux.HtCapability.HtCapInfo.GF;      \
448         _pAd->StaActive.SupportedHtPhy.ShortGIfor20 = _pAd->MlmeAux.HtCapability.HtCapInfo.ShortGIfor20;      \
449         _pAd->StaActive.SupportedHtPhy.ShortGIfor40 = _pAd->MlmeAux.HtCapability.HtCapInfo.ShortGIfor40;      \
450         _pAd->StaActive.SupportedHtPhy.TxSTBC = _pAd->MlmeAux.HtCapability.HtCapInfo.TxSTBC;      \
451         _pAd->StaActive.SupportedHtPhy.RxSTBC = _pAd->MlmeAux.HtCapability.HtCapInfo.RxSTBC;      \
452         _pAd->StaActive.SupportedHtPhy.ExtChanOffset = _pAd->MlmeAux.AddHtInfo.AddHtInfo.ExtChanOffset;      \
453         _pAd->StaActive.SupportedHtPhy.RecomWidth = _pAd->MlmeAux.AddHtInfo.AddHtInfo.RecomWidth;      \
454         _pAd->StaActive.SupportedHtPhy.OperaionMode = _pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode;      \
455         _pAd->StaActive.SupportedHtPhy.NonGfPresent = _pAd->MlmeAux.AddHtInfo.AddHtInfo2.NonGfPresent;      \
456         NdisMoveMemory((_pAd)->MacTab.Content[BSSID_WCID].HTCapability.MCSSet, (_pAd)->StaActive.SupportedPhyInfo.MCSSet, sizeof(UCHAR) * 16);\
457 }
458
459 #define COPY_AP_HTSETTINGS_FROM_BEACON(_pAd, _pHtCapability)                                 \
460 {                                                                                       \
461         _pAd->MacTab.Content[BSSID_WCID].AMsduSize = (UCHAR)(_pHtCapability->HtCapInfo.AMsduSize);      \
462         _pAd->MacTab.Content[BSSID_WCID].MmpsMode= (UCHAR)(_pHtCapability->HtCapInfo.MimoPs);   \
463         _pAd->MacTab.Content[BSSID_WCID].MaxRAmpduFactor = (UCHAR)(_pHtCapability->HtCapParm.MaxRAmpduFactor);  \
464 }
465 #endif // DOT11_N_SUPPORT //
466
467 //
468 // BBP & RF are using indirect access. Before write any value into it.
469 // We have to make sure there is no outstanding command pending via checking busy bit.
470 //
471 #define MAX_BUSY_COUNT  100         // Number of retry before failing access BBP & RF indirect register
472 //
473
474 #ifdef RT2870
475 #define RTMP_RF_IO_WRITE32(_A, _V)                 RTUSBWriteRFRegister(_A, _V)
476 #define RTMP_BBP_IO_READ8_BY_REG_ID(_A, _I, _pV)   RTUSBReadBBPRegister(_A, _I, _pV)
477 #define RTMP_BBP_IO_WRITE8_BY_REG_ID(_A, _I, _V)   RTUSBWriteBBPRegister(_A, _I, _V)
478
479 #define BBP_IO_WRITE8_BY_REG_ID(_A, _I, _V)                     RTUSBWriteBBPRegister(_A, _I, _V)
480 #define BBP_IO_READ8_BY_REG_ID(_A, _I, _pV)             RTUSBReadBBPRegister(_A, _I, _pV)
481 #endif // RT2870 //
482
483 #define     MAP_CHANNEL_ID_TO_KHZ(ch, khz)  {               \
484                 switch (ch)                                 \
485                 {                                           \
486                     case 1:     khz = 2412000;   break;     \
487                     case 2:     khz = 2417000;   break;     \
488                     case 3:     khz = 2422000;   break;     \
489                     case 4:     khz = 2427000;   break;     \
490                     case 5:     khz = 2432000;   break;     \
491                     case 6:     khz = 2437000;   break;     \
492                     case 7:     khz = 2442000;   break;     \
493                     case 8:     khz = 2447000;   break;     \
494                     case 9:     khz = 2452000;   break;     \
495                     case 10:    khz = 2457000;   break;     \
496                     case 11:    khz = 2462000;   break;     \
497                     case 12:    khz = 2467000;   break;     \
498                     case 13:    khz = 2472000;   break;     \
499                     case 14:    khz = 2484000;   break;     \
500                     case 36:  /* UNII */  khz = 5180000;   break;     \
501                     case 40:  /* UNII */  khz = 5200000;   break;     \
502                     case 44:  /* UNII */  khz = 5220000;   break;     \
503                     case 48:  /* UNII */  khz = 5240000;   break;     \
504                     case 52:  /* UNII */  khz = 5260000;   break;     \
505                     case 56:  /* UNII */  khz = 5280000;   break;     \
506                     case 60:  /* UNII */  khz = 5300000;   break;     \
507                     case 64:  /* UNII */  khz = 5320000;   break;     \
508                     case 149: /* UNII */  khz = 5745000;   break;     \
509                     case 153: /* UNII */  khz = 5765000;   break;     \
510                     case 157: /* UNII */  khz = 5785000;   break;     \
511                     case 161: /* UNII */  khz = 5805000;   break;     \
512                     case 165: /* UNII */  khz = 5825000;   break;     \
513                     case 100: /* HiperLAN2 */  khz = 5500000;   break;     \
514                     case 104: /* HiperLAN2 */  khz = 5520000;   break;     \
515                     case 108: /* HiperLAN2 */  khz = 5540000;   break;     \
516                     case 112: /* HiperLAN2 */  khz = 5560000;   break;     \
517                     case 116: /* HiperLAN2 */  khz = 5580000;   break;     \
518                     case 120: /* HiperLAN2 */  khz = 5600000;   break;     \
519                     case 124: /* HiperLAN2 */  khz = 5620000;   break;     \
520                     case 128: /* HiperLAN2 */  khz = 5640000;   break;     \
521                     case 132: /* HiperLAN2 */  khz = 5660000;   break;     \
522                     case 136: /* HiperLAN2 */  khz = 5680000;   break;     \
523                     case 140: /* HiperLAN2 */  khz = 5700000;   break;     \
524                     case 34:  /* Japan MMAC */   khz = 5170000;   break;   \
525                     case 38:  /* Japan MMAC */   khz = 5190000;   break;   \
526                     case 42:  /* Japan MMAC */   khz = 5210000;   break;   \
527                     case 46:  /* Japan MMAC */   khz = 5230000;   break;   \
528                     case 184: /* Japan */   khz = 4920000;   break;   \
529                     case 188: /* Japan */   khz = 4940000;   break;   \
530                     case 192: /* Japan */   khz = 4960000;   break;   \
531                     case 196: /* Japan */   khz = 4980000;   break;   \
532                     case 208: /* Japan, means J08 */   khz = 5040000;   break;   \
533                     case 212: /* Japan, means J12 */   khz = 5060000;   break;   \
534                     case 216: /* Japan, means J16 */   khz = 5080000;   break;   \
535                     default:    khz = 2412000;   break;     \
536                 }                                           \
537             }
538
539 #define     MAP_KHZ_TO_CHANNEL_ID(khz, ch)  {               \
540                 switch (khz)                                \
541                 {                                           \
542                     case 2412000:    ch = 1;     break;     \
543                     case 2417000:    ch = 2;     break;     \
544                     case 2422000:    ch = 3;     break;     \
545                     case 2427000:    ch = 4;     break;     \
546                     case 2432000:    ch = 5;     break;     \
547                     case 2437000:    ch = 6;     break;     \
548                     case 2442000:    ch = 7;     break;     \
549                     case 2447000:    ch = 8;     break;     \
550                     case 2452000:    ch = 9;     break;     \
551                     case 2457000:    ch = 10;    break;     \
552                     case 2462000:    ch = 11;    break;     \
553                     case 2467000:    ch = 12;    break;     \
554                     case 2472000:    ch = 13;    break;     \
555                     case 2484000:    ch = 14;    break;     \
556                     case 5180000:    ch = 36;  /* UNII */  break;     \
557                     case 5200000:    ch = 40;  /* UNII */  break;     \
558                     case 5220000:    ch = 44;  /* UNII */  break;     \
559                     case 5240000:    ch = 48;  /* UNII */  break;     \
560                     case 5260000:    ch = 52;  /* UNII */  break;     \
561                     case 5280000:    ch = 56;  /* UNII */  break;     \
562                     case 5300000:    ch = 60;  /* UNII */  break;     \
563                     case 5320000:    ch = 64;  /* UNII */  break;     \
564                     case 5745000:    ch = 149; /* UNII */  break;     \
565                     case 5765000:    ch = 153; /* UNII */  break;     \
566                     case 5785000:    ch = 157; /* UNII */  break;     \
567                     case 5805000:    ch = 161; /* UNII */  break;     \
568                     case 5825000:    ch = 165; /* UNII */  break;     \
569                     case 5500000:    ch = 100; /* HiperLAN2 */  break;     \
570                     case 5520000:    ch = 104; /* HiperLAN2 */  break;     \
571                     case 5540000:    ch = 108; /* HiperLAN2 */  break;     \
572                     case 5560000:    ch = 112; /* HiperLAN2 */  break;     \
573                     case 5580000:    ch = 116; /* HiperLAN2 */  break;     \
574                     case 5600000:    ch = 120; /* HiperLAN2 */  break;     \
575                     case 5620000:    ch = 124; /* HiperLAN2 */  break;     \
576                     case 5640000:    ch = 128; /* HiperLAN2 */  break;     \
577                     case 5660000:    ch = 132; /* HiperLAN2 */  break;     \
578                     case 5680000:    ch = 136; /* HiperLAN2 */  break;     \
579                     case 5700000:    ch = 140; /* HiperLAN2 */  break;     \
580                     case 5170000:    ch = 34;  /* Japan MMAC */   break;   \
581                     case 5190000:    ch = 38;  /* Japan MMAC */   break;   \
582                     case 5210000:    ch = 42;  /* Japan MMAC */   break;   \
583                     case 5230000:    ch = 46;  /* Japan MMAC */   break;   \
584                     case 4920000:    ch = 184; /* Japan */  break;   \
585                     case 4940000:    ch = 188; /* Japan */  break;   \
586                     case 4960000:    ch = 192; /* Japan */  break;   \
587                     case 4980000:    ch = 196; /* Japan */  break;   \
588                     case 5040000:    ch = 208; /* Japan, means J08 */  break;   \
589                     case 5060000:    ch = 212; /* Japan, means J12 */  break;   \
590                     case 5080000:    ch = 216; /* Japan, means J16 */  break;   \
591                     default:         ch = 1;     break;     \
592                 }                                           \
593             }
594
595 //
596 // Common fragment list structure -  Identical to the scatter gather frag list structure
597 //
598 //#define RTMP_SCATTER_GATHER_ELEMENT         SCATTER_GATHER_ELEMENT
599 //#define PRTMP_SCATTER_GATHER_ELEMENT        PSCATTER_GATHER_ELEMENT
600 #define NIC_MAX_PHYS_BUF_COUNT              8
601
602 typedef struct _RTMP_SCATTER_GATHER_ELEMENT {
603     PVOID               Address;
604     ULONG               Length;
605     PULONG              Reserved;
606 } RTMP_SCATTER_GATHER_ELEMENT, *PRTMP_SCATTER_GATHER_ELEMENT;
607
608
609 typedef struct _RTMP_SCATTER_GATHER_LIST {
610     ULONG  NumberOfElements;
611     PULONG Reserved;
612     RTMP_SCATTER_GATHER_ELEMENT Elements[NIC_MAX_PHYS_BUF_COUNT];
613 } RTMP_SCATTER_GATHER_LIST, *PRTMP_SCATTER_GATHER_LIST;
614
615 //
616 //  Some utility macros
617 //
618 #ifndef min
619 #define min(_a, _b)     (((_a) < (_b)) ? (_a) : (_b))
620 #endif
621
622 #ifndef max
623 #define max(_a, _b)     (((_a) > (_b)) ? (_a) : (_b))
624 #endif
625
626 #define GET_LNA_GAIN(_pAd)      ((_pAd->LatchRfRegs.Channel <= 14) ? (_pAd->BLNAGain) : ((_pAd->LatchRfRegs.Channel <= 64) ? (_pAd->ALNAGain0) : ((_pAd->LatchRfRegs.Channel <= 128) ? (_pAd->ALNAGain1) : (_pAd->ALNAGain2))))
627
628 #define INC_COUNTER64(Val)          (Val.QuadPart++)
629
630 #define INFRA_ON(_p)                (OPSTATUS_TEST_FLAG(_p, fOP_STATUS_INFRA_ON))
631 #define ADHOC_ON(_p)                (OPSTATUS_TEST_FLAG(_p, fOP_STATUS_ADHOC_ON))
632 #define MONITOR_ON(_p)              (((_p)->StaCfg.BssType) == BSS_MONITOR)
633 #define IDLE_ON(_p)                 (!INFRA_ON(_p) && !ADHOC_ON(_p))
634
635 // Check LEAP & CCKM flags
636 #define LEAP_ON(_p)                 (((_p)->StaCfg.LeapAuthMode) == CISCO_AuthModeLEAP)
637 #define LEAP_CCKM_ON(_p)            ((((_p)->StaCfg.LeapAuthMode) == CISCO_AuthModeLEAP) && ((_p)->StaCfg.LeapAuthInfo.CCKM == TRUE))
638
639 // if orginal Ethernet frame contains no LLC/SNAP, then an extra LLC/SNAP encap is required
640 #define EXTRA_LLCSNAP_ENCAP_FROM_PKT_START(_pBufVA, _pExtraLlcSnapEncap)                \
641 {                                                                                                                               \
642         if (((*(_pBufVA + 12) << 8) + *(_pBufVA + 13)) > 1500)          \
643         {                                                                                                                       \
644                 _pExtraLlcSnapEncap = SNAP_802_1H;                                              \
645                 if (NdisEqualMemory(IPX, _pBufVA + 12, 2) ||                    \
646                         NdisEqualMemory(APPLE_TALK, _pBufVA + 12, 2))           \
647                 {                                                                                                               \
648                         _pExtraLlcSnapEncap = SNAP_BRIDGE_TUNNEL;                       \
649                 }                                                                                                               \
650         }                                                                                                                       \
651         else                                                                                                            \
652         {                                                                                                                       \
653                 _pExtraLlcSnapEncap = NULL;                                                             \
654         }                                                                                                                       \
655 }
656
657 // New Define for new Tx Path.
658 #define EXTRA_LLCSNAP_ENCAP_FROM_PKT_OFFSET(_pBufVA, _pExtraLlcSnapEncap)       \
659 {                                                                                                                               \
660         if (((*(_pBufVA) << 8) + *(_pBufVA + 1)) > 1500)                        \
661         {                                                                                                                       \
662                 _pExtraLlcSnapEncap = SNAP_802_1H;                                              \
663                 if (NdisEqualMemory(IPX, _pBufVA, 2) ||                                 \
664                         NdisEqualMemory(APPLE_TALK, _pBufVA, 2))                        \
665                 {                                                                                                               \
666                         _pExtraLlcSnapEncap = SNAP_BRIDGE_TUNNEL;                       \
667                 }                                                                                                               \
668         }                                                                                                                       \
669         else                                                                                                            \
670         {                                                                                                                       \
671                 _pExtraLlcSnapEncap = NULL;                                                             \
672         }                                                                                                                       \
673 }
674
675
676 #define MAKE_802_3_HEADER(_p, _pMac1, _pMac2, _pType)                   \
677 {                                                                       \
678     NdisMoveMemory(_p, _pMac1, MAC_ADDR_LEN);                           \
679     NdisMoveMemory((_p + MAC_ADDR_LEN), _pMac2, MAC_ADDR_LEN);          \
680     NdisMoveMemory((_p + MAC_ADDR_LEN * 2), _pType, LENGTH_802_3_TYPE); \
681 }
682
683 // if pData has no LLC/SNAP (neither RFC1042 nor Bridge tunnel), keep it that way.
684 // else if the received frame is LLC/SNAP-encaped IPX or APPLETALK, preserve the LLC/SNAP field
685 // else remove the LLC/SNAP field from the result Ethernet frame
686 // Patch for WHQL only, which did not turn on Netbios but use IPX within its payload
687 // Note:
688 //     _pData & _DataSize may be altered (remove 8-byte LLC/SNAP) by this MACRO
689 //     _pRemovedLLCSNAP: pointer to removed LLC/SNAP; NULL is not removed
690 #define CONVERT_TO_802_3(_p8023hdr, _pDA, _pSA, _pData, _DataSize, _pRemovedLLCSNAP)      \
691 {                                                                       \
692     char LLC_Len[2];                                                    \
693                                                                         \
694     _pRemovedLLCSNAP = NULL;                                            \
695     if (NdisEqualMemory(SNAP_802_1H, _pData, 6)  ||                     \
696         NdisEqualMemory(SNAP_BRIDGE_TUNNEL, _pData, 6))                 \
697     {                                                                   \
698         PUCHAR pProto = _pData + 6;                                     \
699                                                                         \
700         if ((NdisEqualMemory(IPX, pProto, 2) || NdisEqualMemory(APPLE_TALK, pProto, 2)) &&  \
701             NdisEqualMemory(SNAP_802_1H, _pData, 6))                    \
702         {                                                               \
703             LLC_Len[0] = (UCHAR)(_DataSize / 256);                      \
704             LLC_Len[1] = (UCHAR)(_DataSize % 256);                      \
705             MAKE_802_3_HEADER(_p8023hdr, _pDA, _pSA, LLC_Len);          \
706         }                                                               \
707         else                                                            \
708         {                                                               \
709             MAKE_802_3_HEADER(_p8023hdr, _pDA, _pSA, pProto);           \
710             _pRemovedLLCSNAP = _pData;                                  \
711             _DataSize -= LENGTH_802_1_H;                                \
712             _pData += LENGTH_802_1_H;                                   \
713         }                                                               \
714     }                                                                   \
715     else                                                                \
716     {                                                                   \
717         LLC_Len[0] = (UCHAR)(_DataSize / 256);                          \
718         LLC_Len[1] = (UCHAR)(_DataSize % 256);                          \
719         MAKE_802_3_HEADER(_p8023hdr, _pDA, _pSA, LLC_Len);              \
720     }                                                                   \
721 }
722
723 #define SWITCH_AB( _pAA, _pBB)    \
724 {                                                                           \
725     PVOID pCC;                                                          \
726     pCC = _pBB;                                                 \
727     _pBB = _pAA;                                                 \
728     _pAA = pCC;                                                 \
729 }
730
731 // Enqueue this frame to MLME engine
732 // We need to enqueue the whole frame because MLME need to pass data type
733 // information from 802.11 header
734 #ifdef RT2870
735 #define REPORT_MGMT_FRAME_TO_MLME(_pAd, Wcid, _pFrame, _FrameSize, _Rssi0, _Rssi1, _Rssi2, _PlcpSignal)        \
736 {                                                                                       \
737     UINT32 High32TSF=0, Low32TSF=0;                                                          \
738     MlmeEnqueueForRecv(_pAd, Wcid, High32TSF, Low32TSF, (UCHAR)_Rssi0, (UCHAR)_Rssi1,(UCHAR)_Rssi2,_FrameSize, _pFrame, (UCHAR)_PlcpSignal);   \
739 }
740 #endif // RT2870 //
741
742 #define NDIS_QUERY_BUFFER(_NdisBuf, _ppVA, _pBufLen)                    \
743     NdisQueryBuffer(_NdisBuf, _ppVA, _pBufLen)
744
745 #define MAC_ADDR_EQUAL(pAddr1,pAddr2)           RTMPEqualMemory((PVOID)(pAddr1), (PVOID)(pAddr2), MAC_ADDR_LEN)
746 #define SSID_EQUAL(ssid1, len1, ssid2, len2)    ((len1==len2) && (RTMPEqualMemory(ssid1, ssid2, len1)))
747
748 //
749 // Check if it is Japan W53(ch52,56,60,64) channel.
750 //
751 #define JapanChannelCheck(channel)  ((channel == 52) || (channel == 56) || (channel == 60) || (channel == 64))
752
753 #define STA_PORT_SECURED(_pAd) \
754 { \
755         _pAd->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED; \
756         NdisAcquireSpinLock(&_pAd->MacTabLock); \
757         _pAd->MacTab.Content[BSSID_WCID].PortSecured = _pAd->StaCfg.PortSecured; \
758         NdisReleaseSpinLock(&_pAd->MacTabLock); \
759 }
760
761 //
762 // Register set pair for initialzation register set definition
763 //
764 typedef struct  _RTMP_REG_PAIR
765 {
766         ULONG   Register;
767         ULONG   Value;
768 } RTMP_REG_PAIR, *PRTMP_REG_PAIR;
769
770 typedef struct  _REG_PAIR
771 {
772         UCHAR   Register;
773         UCHAR   Value;
774 } REG_PAIR, *PREG_PAIR;
775
776 //
777 // Register set pair for initialzation register set definition
778 //
779 typedef struct  _RTMP_RF_REGS
780 {
781         UCHAR   Channel;
782         ULONG   R1;
783         ULONG   R2;
784         ULONG   R3;
785         ULONG   R4;
786 } RTMP_RF_REGS, *PRTMP_RF_REGS;
787
788 typedef struct _FREQUENCY_ITEM {
789         UCHAR   Channel;
790         UCHAR   N;
791         UCHAR   R;
792         UCHAR   K;
793 } FREQUENCY_ITEM, *PFREQUENCY_ITEM;
794
795 //
796 //  Data buffer for DMA operation, the buffer must be contiguous physical memory
797 //  Both DMA to / from CPU use the same structure.
798 //
799 typedef struct  _RTMP_DMABUF
800 {
801         ULONG                   AllocSize;
802         PVOID                   AllocVa;            // TxBuf virtual address
803         NDIS_PHYSICAL_ADDRESS   AllocPa;            // TxBuf physical address
804 } RTMP_DMABUF, *PRTMP_DMABUF;
805
806
807 typedef union   _HEADER_802_11_SEQ{
808     struct {
809         USHORT                  Frag:4;
810         USHORT                  Sequence:12;
811     }   field;
812     USHORT           value;
813 }       HEADER_802_11_SEQ, *PHEADER_802_11_SEQ;
814
815 //
816 //  Data buffer for DMA operation, the buffer must be contiguous physical memory
817 //  Both DMA to / from CPU use the same structure.
818 //
819 typedef struct  _RTMP_REORDERBUF
820 {
821         BOOLEAN                 IsFull;
822         PVOID                   AllocVa;            // TxBuf virtual address
823         UCHAR                   Header802_3[14];
824         HEADER_802_11_SEQ                       Sequence;       //support compressed bitmap BA, so no consider fragment in BA
825         UCHAR           DataOffset;
826         USHORT          Datasize;
827         ULONG                   AllocSize;
828 #ifdef RT2870
829         PUCHAR                                  AllocPa;
830 #endif // RT2870 //
831 }   RTMP_REORDERBUF, *PRTMP_REORDERBUF;
832
833 //
834 // Control block (Descriptor) for all ring descriptor DMA operation, buffer must be
835 // contiguous physical memory. NDIS_PACKET stored the binding Rx packet descriptor
836 // which won't be released, driver has to wait until upper layer return the packet
837 // before giveing up this rx ring descriptor to ASIC. NDIS_BUFFER is assocaited pair
838 // to describe the packet buffer. For Tx, NDIS_PACKET stored the tx packet descriptor
839 // which driver should ACK upper layer when the tx is physically done or failed.
840 //
841 typedef struct _RTMP_DMACB
842 {
843         ULONG                   AllocSize;          // Control block size
844         PVOID                   AllocVa;            // Control block virtual address
845         NDIS_PHYSICAL_ADDRESS   AllocPa;            // Control block physical address
846         PNDIS_PACKET pNdisPacket;
847         PNDIS_PACKET pNextNdisPacket;
848
849         RTMP_DMABUF             DmaBuf;             // Associated DMA buffer structure
850 } RTMP_DMACB, *PRTMP_DMACB;
851
852 typedef struct _RTMP_TX_BUF
853 {
854         PQUEUE_ENTRY    Next;
855         UCHAR           Index;
856         ULONG                   AllocSize;          // Control block size
857         PVOID                   AllocVa;            // Control block virtual address
858         NDIS_PHYSICAL_ADDRESS   AllocPa;            // Control block physical address
859 } RTMP_TXBUF, *PRTMP_TXBUF;
860
861 typedef struct _RTMP_RX_BUF
862 {
863         BOOLEAN           InUse;
864         ULONG                   ByBaRecIndex;
865         RTMP_REORDERBUF MAP_RXBuf[MAX_RX_REORDERBUF];
866 } RTMP_RXBUF, *PRTMP_RXBUF;
867 typedef struct _RTMP_TX_RING
868 {
869         RTMP_DMACB  Cell[TX_RING_SIZE];
870         UINT32          TxCpuIdx;
871         UINT32          TxDmaIdx;
872         UINT32          TxSwFreeIdx;    // software next free tx index
873 } RTMP_TX_RING, *PRTMP_TX_RING;
874
875 typedef struct _RTMP_RX_RING
876 {
877         RTMP_DMACB  Cell[RX_RING_SIZE];
878         UINT32          RxCpuIdx;
879         UINT32          RxDmaIdx;
880         INT32           RxSwReadIdx;    // software next read index
881 } RTMP_RX_RING, *PRTMP_RX_RING;
882
883 typedef struct _RTMP_MGMT_RING
884 {
885         RTMP_DMACB  Cell[MGMT_RING_SIZE];
886         UINT32          TxCpuIdx;
887         UINT32          TxDmaIdx;
888         UINT32          TxSwFreeIdx; // software next free tx index
889 } RTMP_MGMT_RING, *PRTMP_MGMT_RING;
890
891 //
892 //  Statistic counter structure
893 //
894 typedef struct _COUNTER_802_3
895 {
896         // General Stats
897         ULONG       GoodTransmits;
898         ULONG       GoodReceives;
899         ULONG       TxErrors;
900         ULONG       RxErrors;
901         ULONG       RxNoBuffer;
902
903         // Ethernet Stats
904         ULONG       RcvAlignmentErrors;
905         ULONG       OneCollision;
906         ULONG       MoreCollisions;
907
908 } COUNTER_802_3, *PCOUNTER_802_3;
909
910 typedef struct _COUNTER_802_11 {
911         ULONG           Length;
912         LARGE_INTEGER   LastTransmittedFragmentCount;
913         LARGE_INTEGER   TransmittedFragmentCount;
914         LARGE_INTEGER   MulticastTransmittedFrameCount;
915         LARGE_INTEGER   FailedCount;
916         LARGE_INTEGER   RetryCount;
917         LARGE_INTEGER   MultipleRetryCount;
918         LARGE_INTEGER   RTSSuccessCount;
919         LARGE_INTEGER   RTSFailureCount;
920         LARGE_INTEGER   ACKFailureCount;
921         LARGE_INTEGER   FrameDuplicateCount;
922         LARGE_INTEGER   ReceivedFragmentCount;
923         LARGE_INTEGER   MulticastReceivedFrameCount;
924         LARGE_INTEGER   FCSErrorCount;
925 } COUNTER_802_11, *PCOUNTER_802_11;
926
927 typedef struct _COUNTER_RALINK {
928         ULONG           TransmittedByteCount;   // both successful and failure, used to calculate TX throughput
929         ULONG           ReceivedByteCount;      // both CRC okay and CRC error, used to calculate RX throughput
930         ULONG           BeenDisassociatedCount;
931         ULONG           BadCQIAutoRecoveryCount;
932         ULONG           PoorCQIRoamingCount;
933         ULONG           MgmtRingFullCount;
934         ULONG           RxCountSinceLastNULL;
935         ULONG           RxCount;
936         ULONG           RxRingErrCount;
937         ULONG           KickTxCount;
938         ULONG           TxRingErrCount;
939         LARGE_INTEGER   RealFcsErrCount;
940         ULONG           PendingNdisPacketCount;
941
942         ULONG           OneSecOsTxCount[NUM_OF_TX_RING];
943         ULONG           OneSecDmaDoneCount[NUM_OF_TX_RING];
944         UINT32          OneSecTxDoneCount;
945         ULONG           OneSecRxCount;
946         UINT32          OneSecTxAggregationCount;
947         UINT32          OneSecRxAggregationCount;
948
949         UINT32                  OneSecFrameDuplicateCount;
950
951 #ifdef RT2870
952         ULONG           OneSecTransmittedByteCount;   // both successful and failure, used to calculate TX throughput
953 #endif // RT2870 //
954
955         UINT32          OneSecTxNoRetryOkCount;
956         UINT32          OneSecTxRetryOkCount;
957         UINT32          OneSecTxFailCount;
958         UINT32          OneSecFalseCCACnt;      // CCA error count, for debug purpose, might move to global counter
959         UINT32          OneSecRxOkCnt;          // RX without error
960         UINT32          OneSecRxOkDataCnt;      // unicast-to-me DATA frame count
961         UINT32          OneSecRxFcsErrCnt;      // CRC error
962         UINT32          OneSecBeaconSentCnt;
963         UINT32          LastOneSecTotalTxCount; // OneSecTxNoRetryOkCount + OneSecTxRetryOkCount + OneSecTxFailCount
964         UINT32          LastOneSecRxOkDataCnt;  // OneSecRxOkDataCnt
965         ULONG           DuplicateRcv;
966         ULONG           TxAggCount;
967         ULONG           TxNonAggCount;
968         ULONG           TxAgg1MPDUCount;
969         ULONG           TxAgg2MPDUCount;
970         ULONG           TxAgg3MPDUCount;
971         ULONG           TxAgg4MPDUCount;
972         ULONG           TxAgg5MPDUCount;
973         ULONG           TxAgg6MPDUCount;
974         ULONG           TxAgg7MPDUCount;
975         ULONG           TxAgg8MPDUCount;
976         ULONG           TxAgg9MPDUCount;
977         ULONG           TxAgg10MPDUCount;
978         ULONG           TxAgg11MPDUCount;
979         ULONG           TxAgg12MPDUCount;
980         ULONG           TxAgg13MPDUCount;
981         ULONG           TxAgg14MPDUCount;
982         ULONG           TxAgg15MPDUCount;
983         ULONG           TxAgg16MPDUCount;
984
985         LARGE_INTEGER       TransmittedOctetsInAMSDU;
986         LARGE_INTEGER       TransmittedAMSDUCount;
987         LARGE_INTEGER       ReceivedOctesInAMSDUCount;
988         LARGE_INTEGER       ReceivedAMSDUCount;
989         LARGE_INTEGER       TransmittedAMPDUCount;
990         LARGE_INTEGER       TransmittedMPDUsInAMPDUCount;
991         LARGE_INTEGER       TransmittedOctetsInAMPDUCount;
992         LARGE_INTEGER       MPDUInReceivedAMPDUCount;
993 } COUNTER_RALINK, *PCOUNTER_RALINK;
994
995 typedef struct _PID_COUNTER {
996         ULONG           TxAckRequiredCount;      // CRC error
997         ULONG           TxAggreCount;
998         ULONG           TxSuccessCount; // OneSecTxNoRetryOkCount + OneSecTxRetryOkCount + OneSecTxFailCount
999         ULONG           LastSuccessRate;
1000 } PID_COUNTER, *PPID_COUNTER;
1001
1002 typedef struct _COUNTER_DRS {
1003         // to record the each TX rate's quality. 0 is best, the bigger the worse.
1004         USHORT          TxQuality[MAX_STEP_OF_TX_RATE_SWITCH];
1005         UCHAR           PER[MAX_STEP_OF_TX_RATE_SWITCH];
1006         UCHAR           TxRateUpPenalty;      // extra # of second penalty due to last unstable condition
1007         ULONG           CurrTxRateStableTime; // # of second in current TX rate
1008         BOOLEAN         fNoisyEnvironment;
1009         BOOLEAN         fLastSecAccordingRSSI;
1010         UCHAR           LastSecTxRateChangeAction; // 0: no change, 1:rate UP, 2:rate down
1011         UCHAR                   LastTimeTxRateChangeAction; //Keep last time value of LastSecTxRateChangeAction
1012         ULONG                   LastTxOkCount;
1013 } COUNTER_DRS, *PCOUNTER_DRS;
1014
1015 //
1016 //  Arcfour Structure Added by PaulWu
1017 //
1018 typedef struct  _ARCFOUR
1019 {
1020         UINT            X;
1021         UINT            Y;
1022         UCHAR           STATE[256];
1023 } ARCFOURCONTEXT, *PARCFOURCONTEXT;
1024
1025 // MIMO Tx parameter, ShortGI, MCS, STBC, etc.  these are fields in TXWI too. just copy to TXWI.
1026 typedef struct  _RECEIVE_SETTING {
1027         USHORT          NumOfRX:2;                 // MIMO. WE HAVE 3R
1028         USHORT          Mode:2; //channel bandwidth 20MHz or 40 MHz
1029         USHORT          ShortGI:1;
1030         USHORT          STBC:2; //SPACE
1031         USHORT          rsv:3;
1032         USHORT          OFDM:1;
1033         USHORT          MIMO:1;
1034  } RECEIVE_SETTING, *PRECEIVE_SETTING;
1035
1036 // Shared key data structure
1037 typedef struct  _WEP_KEY {
1038         UCHAR   KeyLen;                     // Key length for each key, 0: entry is invalid
1039         UCHAR   Key[MAX_LEN_OF_KEY];        // right now we implement 4 keys, 128 bits max
1040 } WEP_KEY, *PWEP_KEY;
1041
1042 typedef struct _CIPHER_KEY {
1043         UCHAR   Key[16];            // right now we implement 4 keys, 128 bits max
1044         UCHAR   RxMic[8];                       // make alignment
1045         UCHAR   TxMic[8];
1046         UCHAR   TxTsc[6];           // 48bit TSC value
1047         UCHAR   RxTsc[6];           // 48bit TSC value
1048         UCHAR   CipherAlg;          // 0-none, 1:WEP64, 2:WEP128, 3:TKIP, 4:AES, 5:CKIP64, 6:CKIP128
1049         UCHAR   KeyLen;
1050         UCHAR   BssId[6];
1051             // Key length for each key, 0: entry is invalid
1052         UCHAR   Type;               // Indicate Pairwise/Group when reporting MIC error
1053 } CIPHER_KEY, *PCIPHER_KEY;
1054
1055 typedef struct _BBP_TUNING_STRUCT {
1056         BOOLEAN     Enable;
1057         UCHAR       FalseCcaCountUpperBound;  // 100 per sec
1058         UCHAR       FalseCcaCountLowerBound;  // 10 per sec
1059         UCHAR       R17LowerBound;            // specified in E2PROM
1060         UCHAR       R17UpperBound;            // 0x68 according to David Tung
1061         UCHAR       CurrentR17Value;
1062 } BBP_TUNING, *PBBP_TUNING;
1063
1064 typedef struct _SOFT_RX_ANT_DIVERSITY_STRUCT {
1065         UCHAR     EvaluatePeriod;                // 0:not evalute status, 1: evaluate status, 2: switching status
1066         UCHAR     Pair1PrimaryRxAnt;     // 0:Ant-E1, 1:Ant-E2
1067         UCHAR     Pair1SecondaryRxAnt;   // 0:Ant-E1, 1:Ant-E2
1068         UCHAR     Pair2PrimaryRxAnt;     // 0:Ant-E3, 1:Ant-E4
1069         UCHAR     Pair2SecondaryRxAnt;   // 0:Ant-E3, 1:Ant-E4
1070         SHORT     Pair1AvgRssi[2];       // AvgRssi[0]:E1, AvgRssi[1]:E2
1071         SHORT     Pair2AvgRssi[2];       // AvgRssi[0]:E3, AvgRssi[1]:E4
1072         SHORT     Pair1LastAvgRssi;      //
1073         SHORT     Pair2LastAvgRssi;      //
1074         ULONG     RcvPktNumWhenEvaluate;
1075         BOOLEAN   FirstPktArrivedWhenEvaluate;
1076         RALINK_TIMER_STRUCT    RxAntDiversityTimer;
1077 } SOFT_RX_ANT_DIVERSITY, *PSOFT_RX_ANT_DIVERSITY;
1078
1079 typedef struct _LEAP_AUTH_INFO {
1080         BOOLEAN         Enabled;        //Ture: Enable LEAP Authentication
1081         BOOLEAN         CCKM;           //Ture: Use Fast Reauthentication with CCKM
1082         UCHAR           Reserve[2];
1083         UCHAR           UserName[256];  //LEAP, User name
1084         ULONG           UserNameLen;
1085         UCHAR           Password[256];  //LEAP, User Password
1086         ULONG           PasswordLen;
1087 } LEAP_AUTH_INFO, *PLEAP_AUTH_INFO;
1088
1089 typedef struct {
1090         UCHAR        Addr[MAC_ADDR_LEN];
1091         UCHAR        ErrorCode[2];  //00 01-Invalid authentication type
1092                                                                 //00 02-Authentication timeout
1093                                                                 //00 03-Challenge from AP failed
1094                                                                 //00 04-Challenge to AP failed
1095         BOOLEAN      Reported;
1096 } ROGUEAP_ENTRY, *PROGUEAP_ENTRY;
1097
1098 typedef struct {
1099         UCHAR               RogueApNr;
1100         ROGUEAP_ENTRY       RogueApEntry[MAX_LEN_OF_BSS_TABLE];
1101 } ROGUEAP_TABLE, *PROGUEAP_TABLE;
1102
1103 typedef struct {
1104         BOOLEAN     Enable;
1105         UCHAR       Delta;
1106         BOOLEAN     PlusSign;
1107 } CCK_TX_POWER_CALIBRATE, *PCCK_TX_POWER_CALIBRATE;
1108
1109 //
1110 // Receive Tuple Cache Format
1111 //
1112 typedef struct  _TUPLE_CACHE    {
1113         BOOLEAN         Valid;
1114         UCHAR           MacAddress[MAC_ADDR_LEN];
1115         USHORT          Sequence;
1116         USHORT          Frag;
1117 } TUPLE_CACHE, *PTUPLE_CACHE;
1118
1119 //
1120 // Fragment Frame structure
1121 //
1122 typedef struct  _FRAGMENT_FRAME {
1123         PNDIS_PACKET    pFragPacket;
1124         ULONG       RxSize;
1125         USHORT      Sequence;
1126         USHORT      LastFrag;
1127         ULONG       Flags;          // Some extra frame information. bit 0: LLC presented
1128 } FRAGMENT_FRAME, *PFRAGMENT_FRAME;
1129
1130
1131 //
1132 // Packet information for NdisQueryPacket
1133 //
1134 typedef struct  _PACKET_INFO    {
1135         UINT            PhysicalBufferCount;    // Physical breaks of buffer descripor chained
1136         UINT            BufferCount ;           // Number of Buffer descriptor chained
1137         UINT            TotalPacketLength ;     // Self explained
1138         PNDIS_BUFFER    pFirstBuffer;           // Pointer to first buffer descriptor
1139 } PACKET_INFO, *PPACKET_INFO;
1140
1141 //
1142 // Tkip Key structure which RC4 key & MIC calculation
1143 //
1144 typedef struct  _TKIP_KEY_INFO  {
1145         UINT        nBytesInM;  // # bytes in M for MICKEY
1146         ULONG       IV16;
1147         ULONG       IV32;
1148         ULONG       K0;         // for MICKEY Low
1149         ULONG       K1;         // for MICKEY Hig
1150         ULONG       L;          // Current state for MICKEY
1151         ULONG       R;          // Current state for MICKEY
1152         ULONG       M;          // Message accumulator for MICKEY
1153         UCHAR       RC4KEY[16];
1154         UCHAR       MIC[8];
1155 } TKIP_KEY_INFO, *PTKIP_KEY_INFO;
1156
1157 //
1158 // Private / Misc data, counters for driver internal use
1159 //
1160 typedef struct  __PRIVATE_STRUC {
1161         UINT       SystemResetCnt;         // System reset counter
1162         UINT       TxRingFullCnt;          // Tx ring full occurrance number
1163         UINT       PhyRxErrCnt;            // PHY Rx error count, for debug purpose, might move to global counter
1164         // Variables for WEP encryption / decryption in rtmp_wep.c
1165         UINT       FCSCRC32;
1166         ARCFOURCONTEXT  WEPCONTEXT;
1167         // Tkip stuff
1168         TKIP_KEY_INFO   Tx;
1169         TKIP_KEY_INFO   Rx;
1170 } PRIVATE_STRUC, *PPRIVATE_STRUC;
1171
1172 // structure to tune BBP R66 (BBP TUNING)
1173 typedef struct _BBP_R66_TUNING {
1174         BOOLEAN     bEnable;
1175         USHORT      FalseCcaLowerThreshold;  // default 100
1176         USHORT      FalseCcaUpperThreshold;  // default 512
1177         UCHAR       R66Delta;
1178         UCHAR       R66CurrentValue;
1179         BOOLEAN         R66LowerUpperSelect; //Before LinkUp, Used LowerBound or UpperBound as R66 value.
1180 } BBP_R66_TUNING, *PBBP_R66_TUNING;
1181
1182 // structure to store channel TX power
1183 typedef struct _CHANNEL_TX_POWER {
1184         USHORT     RemainingTimeForUse;         //unit: sec
1185         UCHAR      Channel;
1186         CHAR       Power;
1187         CHAR       Power2;
1188         UCHAR      MaxTxPwr;
1189         UCHAR      DfsReq;
1190 } CHANNEL_TX_POWER, *PCHANNEL_TX_POWER;
1191
1192 // structure to store 802.11j channel TX power
1193 typedef struct _CHANNEL_11J_TX_POWER {
1194         UCHAR      Channel;
1195         UCHAR      BW;  // BW_10 or BW_20
1196         CHAR       Power;
1197         CHAR       Power2;
1198         USHORT     RemainingTimeForUse;         //unit: sec
1199 } CHANNEL_11J_TX_POWER, *PCHANNEL_11J_TX_POWER;
1200
1201 typedef enum _ABGBAND_STATE_ {
1202         UNKNOWN_BAND,
1203         BG_BAND,
1204         A_BAND,
1205 } ABGBAND_STATE;
1206
1207 typedef struct _MLME_STRUCT {
1208         // STA state machines
1209         STATE_MACHINE           CntlMachine;
1210         STATE_MACHINE           AssocMachine;
1211         STATE_MACHINE           AuthMachine;
1212         STATE_MACHINE           AuthRspMachine;
1213         STATE_MACHINE           SyncMachine;
1214         STATE_MACHINE           WpaPskMachine;
1215         STATE_MACHINE           LeapMachine;
1216         STATE_MACHINE           AironetMachine;
1217         STATE_MACHINE_FUNC      AssocFunc[ASSOC_FUNC_SIZE];
1218         STATE_MACHINE_FUNC      AuthFunc[AUTH_FUNC_SIZE];
1219         STATE_MACHINE_FUNC      AuthRspFunc[AUTH_RSP_FUNC_SIZE];
1220         STATE_MACHINE_FUNC      SyncFunc[SYNC_FUNC_SIZE];
1221         STATE_MACHINE_FUNC      WpaPskFunc[WPA_PSK_FUNC_SIZE];
1222         STATE_MACHINE_FUNC      AironetFunc[AIRONET_FUNC_SIZE];
1223         STATE_MACHINE_FUNC      ActFunc[ACT_FUNC_SIZE];
1224         // Action
1225         STATE_MACHINE           ActMachine;
1226
1227         ULONG                   ChannelQuality;  // 0..100, Channel Quality Indication for Roaming
1228         ULONG                   Now32;           // latch the value of NdisGetSystemUpTime()
1229         ULONG                   LastSendNULLpsmTime;
1230
1231         BOOLEAN                 bRunning;
1232         NDIS_SPIN_LOCK          TaskLock;
1233         MLME_QUEUE              Queue;
1234
1235         UINT                    ShiftReg;
1236
1237         RALINK_TIMER_STRUCT     PeriodicTimer;
1238         RALINK_TIMER_STRUCT     APSDPeriodicTimer;
1239         RALINK_TIMER_STRUCT     LinkDownTimer;
1240         RALINK_TIMER_STRUCT     LinkUpTimer;
1241         ULONG                   PeriodicRound;
1242         ULONG                   OneSecPeriodicRound;
1243
1244         UCHAR                                   RealRxPath;
1245         BOOLEAN                                 bLowThroughput;
1246         BOOLEAN                                 bEnableAutoAntennaCheck;
1247         RALINK_TIMER_STRUCT             RxAntEvalTimer;
1248
1249 #ifdef RT2870
1250         UCHAR CaliBW40RfR24;
1251         UCHAR CaliBW20RfR24;
1252 #endif // RT2870 //
1253
1254 } MLME_STRUCT, *PMLME_STRUCT;
1255
1256 // structure for radar detection and channel switch
1257 typedef struct _RADAR_DETECT_STRUCT {
1258     //BOOLEAN           IEEE80211H;                     // 0: disable, 1: enable IEEE802.11h
1259         UCHAR           CSCount;                        //Channel switch counter
1260         UCHAR           CSPeriod;                       //Channel switch period (beacon count)
1261         UCHAR           RDCount;                        //Radar detection counter
1262         UCHAR           RDMode;                         //Radar Detection mode
1263         UCHAR           RDDurRegion;            //Radar detection duration region
1264         UCHAR           BBPR16;
1265         UCHAR           BBPR17;
1266         UCHAR           BBPR18;
1267         UCHAR           BBPR21;
1268         UCHAR           BBPR22;
1269         UCHAR           BBPR64;
1270         ULONG           InServiceMonitorCount; // unit: sec
1271         UINT8           DfsSessionTime;
1272         BOOLEAN         bFastDfs;
1273         UINT8           ChMovingTime;
1274         UINT8           LongPulseRadarTh;
1275 } RADAR_DETECT_STRUCT, *PRADAR_DETECT_STRUCT;
1276
1277 typedef enum _REC_BLOCKACK_STATUS
1278 {
1279     Recipient_NONE=0,
1280         Recipient_USED,
1281         Recipient_HandleRes,
1282     Recipient_Accept
1283 } REC_BLOCKACK_STATUS, *PREC_BLOCKACK_STATUS;
1284
1285 typedef enum _ORI_BLOCKACK_STATUS
1286 {
1287     Originator_NONE=0,
1288         Originator_USED,
1289     Originator_WaitRes,
1290     Originator_Done
1291 } ORI_BLOCKACK_STATUS, *PORI_BLOCKACK_STATUS;
1292
1293 #ifdef DOT11_N_SUPPORT
1294 typedef struct _BA_ORI_ENTRY{
1295         UCHAR   Wcid;
1296         UCHAR   TID;
1297         UCHAR   BAWinSize;
1298         UCHAR   Token;
1299 // Sequence is to fill every outgoing QoS DATA frame's sequence field in 802.11 header.
1300         USHORT  Sequence;
1301         USHORT  TimeOutValue;
1302         ORI_BLOCKACK_STATUS  ORI_BA_Status;
1303         RALINK_TIMER_STRUCT ORIBATimer;
1304         PVOID   pAdapter;
1305 } BA_ORI_ENTRY, *PBA_ORI_ENTRY;
1306
1307 typedef struct _BA_REC_ENTRY {
1308         UCHAR   Wcid;
1309         UCHAR   TID;
1310         UCHAR   BAWinSize;      // 7.3.1.14. each buffer is capable of holding a max AMSDU or MSDU.
1311         //UCHAR NumOfRxPkt;
1312         //UCHAR    Curindidx; // the head in the RX reordering buffer
1313         USHORT          LastIndSeq;
1314 //      USHORT          LastIndSeqAtTimer;
1315         USHORT          TimeOutValue;
1316         RALINK_TIMER_STRUCT RECBATimer;
1317         ULONG           LastIndSeqAtTimer;
1318         ULONG           nDropPacket;
1319         ULONG           rcvSeq;
1320         REC_BLOCKACK_STATUS  REC_BA_Status;
1321 //      UCHAR   RxBufIdxUsed;
1322         // corresponding virtual address for RX reordering packet storage.
1323         //RTMP_REORDERDMABUF MAP_RXBuf[MAX_RX_REORDERBUF];
1324         NDIS_SPIN_LOCK          RxReRingLock;                 // Rx Ring spinlock
1325 //      struct _BA_REC_ENTRY *pNext;
1326         PVOID   pAdapter;
1327         struct reordering_list  list;
1328 } BA_REC_ENTRY, *PBA_REC_ENTRY;
1329
1330
1331 typedef struct {
1332         ULONG           numAsRecipient;         // I am recipient of numAsRecipient clients. These client are in the BARecEntry[]
1333         ULONG           numAsOriginator;        // I am originator of   numAsOriginator clients. These clients are in the BAOriEntry[]
1334         BA_ORI_ENTRY       BAOriEntry[MAX_LEN_OF_BA_ORI_TABLE];
1335         BA_REC_ENTRY       BARecEntry[MAX_LEN_OF_BA_REC_TABLE];
1336 } BA_TABLE, *PBA_TABLE;
1337
1338 //For QureyBATableOID use;
1339 typedef struct  PACKED _OID_BA_REC_ENTRY{
1340         UCHAR   MACAddr[MAC_ADDR_LEN];
1341         UCHAR   BaBitmap;   // if (BaBitmap&(1<<TID)), this session with{MACAddr, TID}exists, so read BufSize[TID] for BufferSize
1342         UCHAR   rsv;
1343         UCHAR   BufSize[8];
1344         REC_BLOCKACK_STATUS     REC_BA_Status[8];
1345 } OID_BA_REC_ENTRY, *POID_BA_REC_ENTRY;
1346
1347 //For QureyBATableOID use;
1348 typedef struct  PACKED _OID_BA_ORI_ENTRY{
1349         UCHAR   MACAddr[MAC_ADDR_LEN];
1350         UCHAR   BaBitmap;  // if (BaBitmap&(1<<TID)), this session with{MACAddr, TID}exists, so read BufSize[TID] for BufferSize, read ORI_BA_Status[TID] for status
1351         UCHAR   rsv;
1352         UCHAR   BufSize[8];
1353         ORI_BLOCKACK_STATUS  ORI_BA_Status[8];
1354 } OID_BA_ORI_ENTRY, *POID_BA_ORI_ENTRY;
1355
1356 typedef struct _QUERYBA_TABLE{
1357         OID_BA_ORI_ENTRY       BAOriEntry[32];
1358         OID_BA_REC_ENTRY       BARecEntry[32];
1359         UCHAR   OriNum;// Number of below BAOriEntry
1360         UCHAR   RecNum;// Number of below BARecEntry
1361 } QUERYBA_TABLE, *PQUERYBA_TABLE;
1362
1363 typedef union   _BACAP_STRUC    {
1364         struct  {
1365                 UINT32          RxBAWinLimit:8;
1366                 UINT32          TxBAWinLimit:8;
1367                 UINT32          AutoBA:1;       // automatically BA
1368                 UINT32          Policy:2;       // 0: DELAY_BA 1:IMMED_BA  (//BA Policy subfiled value in ADDBA frame)   2:BA-not use
1369                 UINT32          MpduDensity:3;
1370                 UINT32          AmsduEnable:1;  //Enable AMSDU transmisstion
1371                 UINT32          AmsduSize:1;    // 0:3839, 1:7935 bytes. UINT  MSDUSizeToBytes[]        = { 3839, 7935};
1372                 UINT32          MMPSmode:2;     // MIMO power save more, 0:static, 1:dynamic, 2:rsv, 3:mimo enable
1373                 UINT32          bHtAdhoc:1;                     // adhoc can use ht rate.
1374                 UINT32          b2040CoexistScanSup:1;          //As Sta, support do 2040 coexistence scan for AP. As Ap, support monitor trigger event to check if can use BW 40MHz.
1375                 UINT32          :4;
1376         }       field;
1377         UINT32                  word;
1378 } BACAP_STRUC, *PBACAP_STRUC;
1379 #endif // DOT11_N_SUPPORT //
1380
1381 //This structure is for all 802.11n card InterOptibilityTest action. Reset all Num every n second.  (Details see MLMEPeriodic)
1382 typedef struct  _IOT_STRUC      {
1383         UCHAR                   Threshold[2];
1384         UCHAR                   ReorderTimeOutNum[MAX_LEN_OF_BA_REC_TABLE];     // compare with threshold[0]
1385         UCHAR                   RefreshNum[MAX_LEN_OF_BA_REC_TABLE];    // compare with threshold[1]
1386         ULONG                   OneSecInWindowCount;
1387         ULONG                   OneSecFrameDuplicateCount;
1388         ULONG                   OneSecOutWindowCount;
1389         UCHAR                   DelOriAct;
1390         UCHAR                   DelRecAct;
1391         UCHAR                   RTSShortProt;
1392         UCHAR                   RTSLongProt;
1393         BOOLEAN                 bRTSLongProtOn;
1394         BOOLEAN                 bLastAtheros;
1395     BOOLEAN                     bCurrentAtheros;
1396     BOOLEAN         bNowAtherosBurstOn;
1397         BOOLEAN                 bNextDisableRxBA;
1398     BOOLEAN                     bToggle;
1399 } IOT_STRUC, *PIOT_STRUC;
1400
1401 // This is the registry setting for 802.11n transmit setting.  Used in advanced page.
1402 typedef union _REG_TRANSMIT_SETTING {
1403  struct {
1404          //UINT32  PhyMode:4;
1405          //UINT32  MCS:7;                 // MCS
1406                  UINT32  rsv0:10;
1407                  UINT32  TxBF:1;
1408          UINT32  BW:1; //channel bandwidth 20MHz or 40 MHz
1409          UINT32  ShortGI:1;
1410          UINT32  STBC:1; //SPACE
1411          UINT32  TRANSNO:2;
1412          UINT32  HTMODE:1;
1413          UINT32  EXTCHA:2;
1414          UINT32  rsv:13;
1415     } field;
1416  UINT32   word;
1417 } REG_TRANSMIT_SETTING, *PREG_TRANSMIT_SETTING;
1418
1419 typedef union  _DESIRED_TRANSMIT_SETTING {
1420         struct  {
1421                         USHORT          MCS:7;                  // MCS
1422                         USHORT          PhyMode:4;
1423                         USHORT          FixedTxMode:2;                  // If MCS isn't AUTO, fix rate in CCK, OFDM or HT mode.
1424                         USHORT          rsv:3;
1425         }       field;
1426         USHORT          word;
1427  } DESIRED_TRANSMIT_SETTING, *PDESIRED_TRANSMIT_SETTING;
1428
1429 typedef struct {
1430         BOOLEAN         IsRecipient;
1431         UCHAR   MACAddr[MAC_ADDR_LEN];
1432         UCHAR   TID;
1433         UCHAR   nMSDU;
1434         USHORT   TimeOut;
1435         BOOLEAN bAllTid;  // If True, delete all TID for BA sessions with this MACaddr.
1436 } OID_ADD_BA_ENTRY, *POID_ADD_BA_ENTRY;
1437
1438 //
1439 // Multiple SSID structure
1440 //
1441 #define WLAN_MAX_NUM_OF_TIM                     ((MAX_LEN_OF_MAC_TABLE >> 3) + 1) /* /8 + 1 */
1442 #define WLAN_CT_TIM_BCMC_OFFSET         0 /* unit: 32B */
1443
1444 /* clear bcmc TIM bit */
1445 #define WLAN_MR_TIM_BCMC_CLEAR(apidx) \
1446         pAd->ApCfg.MBSSID[apidx].TimBitmaps[WLAN_CT_TIM_BCMC_OFFSET] &= ~BIT8[0];
1447
1448 /* set bcmc TIM bit */
1449 #define WLAN_MR_TIM_BCMC_SET(apidx) \
1450         pAd->ApCfg.MBSSID[apidx].TimBitmaps[WLAN_CT_TIM_BCMC_OFFSET] |= BIT8[0];
1451
1452 /* clear a station PS TIM bit */
1453 #define WLAN_MR_TIM_BIT_CLEAR(ad_p, apidx, wcid) \
1454         {       UCHAR tim_offset = wcid >> 3; \
1455                 UCHAR bit_offset = wcid & 0x7; \
1456                 ad_p->ApCfg.MBSSID[apidx].TimBitmaps[tim_offset] &= (~BIT8[bit_offset]); }
1457
1458 /* set a station PS TIM bit */
1459 #define WLAN_MR_TIM_BIT_SET(ad_p, apidx, wcid) \
1460         {       UCHAR tim_offset = wcid >> 3; \
1461                 UCHAR bit_offset = wcid & 0x7; \
1462                 ad_p->ApCfg.MBSSID[apidx].TimBitmaps[tim_offset] |= BIT8[bit_offset]; }
1463
1464 #ifdef RT2870
1465 #define BEACON_BITMAP_MASK              0xff
1466 typedef struct _BEACON_SYNC_STRUCT_
1467 {
1468         UCHAR                           BeaconBuf[HW_BEACON_MAX_COUNT][HW_BEACON_OFFSET];
1469         UCHAR                                   BeaconTxWI[HW_BEACON_MAX_COUNT][TXWI_SIZE];
1470         ULONG                                   TimIELocationInBeacon[HW_BEACON_MAX_COUNT];
1471         ULONG                                   CapabilityInfoLocationInBeacon[HW_BEACON_MAX_COUNT];
1472         BOOLEAN                                 EnableBeacon;           // trigger to enable beacon transmission.
1473         UCHAR                                   BeaconBitMap;           // NOTE: If the MAX_MBSSID_NUM is larger than 8, this parameter need to change.
1474         UCHAR                                   DtimBitOn;                      // NOTE: If the MAX_MBSSID_NUM is larger than 8, this parameter need to change.
1475 }BEACON_SYNC_STRUCT;
1476 #endif // RT2870 //
1477
1478 typedef struct _MULTISSID_STRUCT {
1479         UCHAR                                                           Bssid[MAC_ADDR_LEN];
1480     UCHAR                               SsidLen;
1481     CHAR                                Ssid[MAX_LEN_OF_SSID];
1482     USHORT                              CapabilityInfo;
1483
1484     PNET_DEV                                    MSSIDDev;
1485
1486         NDIS_802_11_AUTHENTICATION_MODE     AuthMode;
1487         NDIS_802_11_WEP_STATUS              WepStatus;
1488         NDIS_802_11_WEP_STATUS                          GroupKeyWepStatus;
1489         WPA_MIX_PAIR_CIPHER                                     WpaMixPairCipher;
1490
1491         ULONG                                                           TxCount;
1492         ULONG                                                           RxCount;
1493         ULONG                                                           ReceivedByteCount;
1494         ULONG                                                           TransmittedByteCount;
1495         ULONG                                                           RxErrorCount;
1496         ULONG                                                           RxDropCount;
1497
1498         HTTRANSMIT_SETTING                                      HTPhyMode, MaxHTPhyMode, MinHTPhyMode;// For transmit phy setting in TXWI.
1499         RT_HT_PHY_INFO                                          DesiredHtPhyInfo;
1500         DESIRED_TRANSMIT_SETTING                DesiredTransmitSetting; // Desired transmit setting. this is for reading registry setting only. not useful.
1501         BOOLEAN                                                         bAutoTxRateSwitch;
1502
1503         //CIPHER_KEY                          SharedKey[SHARE_KEY_NUM]; // ref pAd->SharedKey[BSS][4]
1504         UCHAR                               DefaultKeyId;
1505
1506         UCHAR                                                           TxRate;       // RATE_1, RATE_2, RATE_5_5, RATE_11, ...
1507         UCHAR                                                           DesiredRates[MAX_LEN_OF_SUPPORTED_RATES];// OID_802_11_DESIRED_RATES
1508         UCHAR                                                           DesiredRatesIndex;
1509         UCHAR                                                           MaxTxRate;            // RATE_1, RATE_2, RATE_5_5, RATE_11
1510
1511 //      ULONG                                                   TimBitmap;      // bit0 for broadcast, 1 for AID1, 2 for AID2, ...so on
1512 //    ULONG                                             TimBitmap2;     // b0 for AID32, b1 for AID33, ... and so on
1513         UCHAR                                                           TimBitmaps[WLAN_MAX_NUM_OF_TIM];
1514
1515     // WPA
1516     UCHAR                               GMK[32];
1517     UCHAR                               PMK[32];
1518         UCHAR                                                           GTK[32];
1519     BOOLEAN                             IEEE8021X;
1520     BOOLEAN                             PreAuth;
1521     UCHAR                               GNonce[32];
1522     UCHAR                               PortSecured;
1523     NDIS_802_11_PRIVACY_FILTER          PrivacyFilter;
1524     UCHAR                               BANClass3Data;
1525     ULONG                               IsolateInterStaTraffic;
1526
1527     UCHAR                               RSNIE_Len[2];
1528     UCHAR                               RSN_IE[2][MAX_LEN_OF_RSNIE];
1529
1530
1531     UCHAR                                       TimIELocationInBeacon;
1532     UCHAR                                       CapabilityInfoLocationInBeacon;
1533     // outgoing BEACON frame buffer and corresponding TXWI
1534         // PTXWI_STRUC                           BeaconTxWI; //
1535     CHAR                                BeaconBuf[MAX_BEACON_SIZE]; // NOTE: BeaconBuf should be 4-byte aligned
1536
1537     BOOLEAN                             bHideSsid;
1538         UINT16                                                          StationKeepAliveTime; // unit: second
1539
1540     USHORT                              VLAN_VID;
1541     USHORT                              VLAN_Priority;
1542
1543     RT_802_11_ACL                                               AccessControlList;
1544
1545         // EDCA Qos
1546     BOOLEAN                                                             bWmmCapable;    // 0:disable WMM, 1:enable WMM
1547     BOOLEAN                                                             bDLSCapable;    // 0:disable DLS, 1:enable DLS
1548
1549         UCHAR                                                   DlsPTK[64];             // Due to windows dirver count on meetinghouse to handle 4-way shake
1550
1551         // For 802.1x daemon setting per BSS
1552         UCHAR                                                           radius_srv_num;
1553         RADIUS_SRV_INFO                                         radius_srv_info[MAX_RADIUS_SRV_NUM];
1554
1555 #ifdef RTL865X_SOC
1556         unsigned int                                            mylinkid;
1557 #endif
1558
1559
1560         UINT32                                  RcvdConflictSsidCount;
1561         UINT32                                  RcvdSpoofedAssocRespCount;
1562         UINT32                                  RcvdSpoofedReassocRespCount;
1563         UINT32                                  RcvdSpoofedProbeRespCount;
1564         UINT32                                  RcvdSpoofedBeaconCount;
1565         UINT32                                  RcvdSpoofedDisassocCount;
1566         UINT32                                  RcvdSpoofedAuthCount;
1567         UINT32                                  RcvdSpoofedDeauthCount;
1568         UINT32                                  RcvdSpoofedUnknownMgmtCount;
1569         UINT32                                  RcvdReplayAttackCount;
1570
1571         CHAR                                    RssiOfRcvdConflictSsid;
1572         CHAR                                    RssiOfRcvdSpoofedAssocResp;
1573         CHAR                                    RssiOfRcvdSpoofedReassocResp;
1574         CHAR                                    RssiOfRcvdSpoofedProbeResp;
1575         CHAR                                    RssiOfRcvdSpoofedBeacon;
1576         CHAR                                    RssiOfRcvdSpoofedDisassoc;
1577         CHAR                                    RssiOfRcvdSpoofedAuth;
1578         CHAR                                    RssiOfRcvdSpoofedDeauth;
1579         CHAR                                    RssiOfRcvdSpoofedUnknownMgmt;
1580         CHAR                                    RssiOfRcvdReplayAttack;
1581
1582         BOOLEAN                                 bBcnSntReq;
1583         UCHAR                                   BcnBufIdx;
1584 } MULTISSID_STRUCT, *PMULTISSID_STRUCT;
1585
1586 // configuration common to OPMODE_AP as well as OPMODE_STA
1587 typedef struct _COMMON_CONFIG {
1588
1589         BOOLEAN         bCountryFlag;
1590         UCHAR           CountryCode[3];
1591         UCHAR           Geography;
1592         UCHAR       CountryRegion;      // Enum of country region, 0:FCC, 1:IC, 2:ETSI, 3:SPAIN, 4:France, 5:MKK, 6:MKK1, 7:Israel
1593         UCHAR       CountryRegionForABand;      // Enum of country region for A band
1594         UCHAR       PhyMode;            // PHY_11A, PHY_11B, PHY_11BG_MIXED, PHY_ABG_MIXED
1595         USHORT      Dsifs;              // in units of usec
1596         ULONG       PacketFilter;       // Packet filter for receiving
1597
1598         CHAR        Ssid[MAX_LEN_OF_SSID]; // NOT NULL-terminated
1599         UCHAR       SsidLen;               // the actual ssid length in used
1600         UCHAR       LastSsidLen;               // the actual ssid length in used
1601         CHAR        LastSsid[MAX_LEN_OF_SSID]; // NOT NULL-terminated
1602         UCHAR           LastBssid[MAC_ADDR_LEN];
1603
1604         UCHAR       Bssid[MAC_ADDR_LEN];
1605         USHORT      BeaconPeriod;
1606         UCHAR       Channel;
1607         UCHAR       CentralChannel;     // Central Channel when using 40MHz is indicating. not real channel.
1608
1609 #if 0   // move to STA_ADMIN_CONFIG
1610         UCHAR       DefaultKeyId;
1611
1612         NDIS_802_11_PRIVACY_FILTER          PrivacyFilter;  // PrivacyFilter enum for 802.1X
1613         NDIS_802_11_AUTHENTICATION_MODE     AuthMode;       // This should match to whatever microsoft defined
1614         NDIS_802_11_WEP_STATUS              WepStatus;
1615         NDIS_802_11_WEP_STATUS                          OrigWepStatus;  // Original wep status set from OID
1616
1617         // Add to support different cipher suite for WPA2/WPA mode
1618         NDIS_802_11_ENCRYPTION_STATUS           GroupCipher;            // Multicast cipher suite
1619         NDIS_802_11_ENCRYPTION_STATUS           PairCipher;                     // Unicast cipher suite
1620         BOOLEAN                                                         bMixCipher;                     // Indicate current Pair & Group use different cipher suites
1621         USHORT                                                          RsnCapability;
1622
1623         NDIS_802_11_WEP_STATUS              GroupKeyWepStatus;
1624 #endif
1625
1626         UCHAR       SupRate[MAX_LEN_OF_SUPPORTED_RATES];
1627         UCHAR       SupRateLen;
1628         UCHAR       ExtRate[MAX_LEN_OF_SUPPORTED_RATES];
1629         UCHAR       ExtRateLen;
1630         UCHAR       DesireRate[MAX_LEN_OF_SUPPORTED_RATES];      // OID_802_11_DESIRED_RATES
1631         UCHAR       MaxDesiredRate;
1632         UCHAR       ExpectedACKRate[MAX_LEN_OF_SUPPORTED_RATES];
1633
1634         ULONG       BasicRateBitmap;        // backup basic ratebitmap
1635
1636         BOOLEAN         bAPSDCapable;
1637         BOOLEAN         bInServicePeriod;
1638         BOOLEAN         bAPSDAC_BE;
1639         BOOLEAN         bAPSDAC_BK;
1640         BOOLEAN         bAPSDAC_VI;
1641         BOOLEAN         bAPSDAC_VO;
1642         BOOLEAN         bNeedSendTriggerFrame;
1643         BOOLEAN         bAPSDForcePowerSave;    // Force power save mode, should only use in APSD-STAUT
1644         ULONG           TriggerTimerCount;
1645         UCHAR           MaxSPLength;
1646         UCHAR           BBPCurrentBW;   // BW_10,       BW_20, BW_40
1647         // move to MULTISSID_STRUCT for MBSS
1648         //HTTRANSMIT_SETTING    HTPhyMode, MaxHTPhyMode, MinHTPhyMode;// For transmit phy setting in TXWI.
1649         REG_TRANSMIT_SETTING        RegTransmitSetting; //registry transmit setting. this is for reading registry setting only. not useful.
1650         //UCHAR       FixedTxMode;              // Fixed Tx Mode (CCK, OFDM), for HT fixed tx mode (GF, MIX) , refer to RegTransmitSetting.field.HTMode
1651         UCHAR       TxRate;                 // Same value to fill in TXD. TxRate is 6-bit
1652         UCHAR       MaxTxRate;              // RATE_1, RATE_2, RATE_5_5, RATE_11
1653         UCHAR       TxRateIndex;            // Tx rate index in RateSwitchTable
1654         UCHAR       TxRateTableSize;        // Valid Tx rate table size in RateSwitchTable
1655         //BOOLEAN               bAutoTxRateSwitch;
1656         UCHAR       MinTxRate;              // RATE_1, RATE_2, RATE_5_5, RATE_11
1657         UCHAR       RtsRate;                // RATE_xxx
1658         HTTRANSMIT_SETTING      MlmeTransmit;   // MGMT frame PHY rate setting when operatin at Ht rate.
1659         UCHAR       MlmeRate;               // RATE_xxx, used to send MLME frames
1660         UCHAR       BasicMlmeRate;          // Default Rate for sending MLME frames
1661
1662         USHORT      RtsThreshold;           // in unit of BYTE
1663         USHORT      FragmentThreshold;      // in unit of BYTE
1664
1665         UCHAR       TxPower;                // in unit of mW
1666         ULONG       TxPowerPercentage;      // 0~100 %
1667         ULONG       TxPowerDefault;         // keep for TxPowerPercentage
1668
1669 #ifdef DOT11_N_SUPPORT
1670         BACAP_STRUC        BACapability; //   NO USE = 0XFF  ;  IMMED_BA =1  ;  DELAY_BA=0
1671         BACAP_STRUC        REGBACapability; //   NO USE = 0XFF  ;  IMMED_BA =1  ;  DELAY_BA=0
1672 #endif // DOT11_N_SUPPORT //
1673         IOT_STRUC               IOTestParm;     // 802.11n InterOpbility Test Parameter;
1674         ULONG       TxPreamble;             // Rt802_11PreambleLong, Rt802_11PreambleShort, Rt802_11PreambleAuto
1675         BOOLEAN     bUseZeroToDisableFragment;     // Microsoft use 0 as disable
1676         ULONG       UseBGProtection;        // 0: auto, 1: always use, 2: always not use
1677         BOOLEAN     bUseShortSlotTime;      // 0: disable, 1 - use short slot (9us)
1678         BOOLEAN     bEnableTxBurst;         // 1: enble TX PACKET BURST, 0: disable TX PACKET BURST
1679         BOOLEAN     bAggregationCapable;      // 1: enable TX aggregation when the peer supports it
1680         BOOLEAN     bPiggyBackCapable;          // 1: enable TX piggy-back according MAC's version
1681         BOOLEAN     bIEEE80211H;                        // 1: enable IEEE802.11h spec.
1682         ULONG           DisableOLBCDetect;              // 0: enable OLBC detect; 1 disable OLBC detect
1683
1684 #ifdef DOT11_N_SUPPORT
1685         BOOLEAN                         bRdg;
1686 #endif // DOT11_N_SUPPORT //
1687         BOOLEAN             bWmmCapable;        // 0:disable WMM, 1:enable WMM
1688         QOS_CAPABILITY_PARM APQosCapability;    // QOS capability of the current associated AP
1689         EDCA_PARM           APEdcaParm;         // EDCA parameters of the current associated AP
1690         QBSS_LOAD_PARM      APQbssLoad;         // QBSS load of the current associated AP
1691         UCHAR               AckPolicy[4];       // ACK policy of the specified AC. see ACK_xxx
1692         BOOLEAN                         bDLSCapable;            // 0:disable DLS, 1:enable DLS
1693         // a bitmap of BOOLEAN flags. each bit represent an operation status of a particular
1694         // BOOLEAN control, either ON or OFF. These flags should always be accessed via
1695         // OPSTATUS_TEST_FLAG(), OPSTATUS_SET_FLAG(), OP_STATUS_CLEAR_FLAG() macros.
1696         // see fOP_STATUS_xxx in RTMP_DEF.C for detail bit definition
1697         ULONG               OpStatusFlags;
1698
1699         BOOLEAN                         NdisRadioStateOff; //For HCT 12.0, set this flag to TRUE instead of called MlmeRadioOff.
1700         ABGBAND_STATE           BandState;              // For setting BBP used on B/G or A mode.
1701
1702         // IEEE802.11H--DFS.
1703         RADAR_DETECT_STRUCT     RadarDetect;
1704
1705 #ifdef DOT11_N_SUPPORT
1706         // HT
1707         UCHAR                   BASize;         // USer desired BAWindowSize. Should not exceed our max capability
1708         //RT_HT_CAPABILITY      SupportedHtPhy;
1709         RT_HT_CAPABILITY        DesiredHtPhy;
1710         HT_CAPABILITY_IE                HtCapability;
1711         ADD_HT_INFO_IE          AddHTInfo;      // Useful as AP.
1712         //This IE is used with channel switch announcement element when changing to a new 40MHz.
1713         //This IE is included in channel switch ammouncement frames 7.4.1.5, beacons, probe Rsp.
1714         NEW_EXT_CHAN_IE NewExtChanOffset;       //7.3.2.20A, 1 if extension channel is above the control channel, 3 if below, 0 if not present
1715
1716     BOOLEAN                 bHTProtect;
1717     BOOLEAN                 bMIMOPSEnable;
1718     BOOLEAN                                     bBADecline;
1719         BOOLEAN                                 bDisableReordering;
1720         BOOLEAN                                 bForty_Mhz_Intolerant;
1721         BOOLEAN                                 bExtChannelSwitchAnnouncement;
1722         BOOLEAN                                 bRcvBSSWidthTriggerEvents;
1723         ULONG                                   LastRcvBSSWidthTriggerEventsTime;
1724
1725         UCHAR                                   TxBASize;
1726 #endif // DOT11_N_SUPPORT //
1727
1728         // Enable wireless event
1729         BOOLEAN                         bWirelessEvent;
1730         BOOLEAN                         bWiFiTest;                              // Enable this parameter for WiFi test
1731
1732         // Tx & Rx Stream number selection
1733         UCHAR                           TxStream;
1734         UCHAR                           RxStream;
1735
1736         // transmit phy mode, trasmit rate for Multicast.
1737 #ifdef MCAST_RATE_SPECIFIC
1738         UCHAR                           McastTransmitMcs;
1739         UCHAR                           McastTransmitPhyMode;
1740 #endif // MCAST_RATE_SPECIFIC //
1741
1742         BOOLEAN                 bHardwareRadio;     // Hardware controlled Radio enabled
1743
1744 #ifdef RT2870
1745         BOOLEAN                 bMultipleIRP;       // Multiple Bulk IN flag
1746         UCHAR                   NumOfBulkInIRP;     // if bMultipleIRP == TRUE, NumOfBulkInIRP will be 4 otherwise be 1
1747         RT_HT_CAPABILITY        SupportedHtPhy;
1748         ULONG                           MaxPktOneTxBulk;
1749         UCHAR                           TxBulkFactor;
1750         UCHAR                           RxBulkFactor;
1751
1752         BEACON_SYNC_STRUCT      *pBeaconSync;
1753         RALINK_TIMER_STRUCT     BeaconUpdateTimer;
1754         UINT32                          BeaconAdjust;
1755         UINT32                          BeaconFactor;
1756         UINT32                          BeaconRemain;
1757 #endif // RT2870 //
1758
1759
1760         NDIS_SPIN_LOCK                  MeasureReqTabLock;
1761         PMEASURE_REQ_TAB                pMeasureReqTab;
1762
1763         NDIS_SPIN_LOCK                  TpcReqTabLock;
1764         PTPC_REQ_TAB                    pTpcReqTab;
1765
1766         // transmit phy mode, trasmit rate for Multicast.
1767 #ifdef MCAST_RATE_SPECIFIC
1768         HTTRANSMIT_SETTING              MCastPhyMode;
1769 #endif // MCAST_RATE_SPECIFIC //
1770 } COMMON_CONFIG, *PCOMMON_CONFIG;
1771
1772 /* Modified by Wu Xi-Kun 4/21/2006 */
1773 // STA configuration and status
1774 typedef struct _STA_ADMIN_CONFIG {
1775         // GROUP 1 -
1776         //   User configuration loaded from Registry, E2PROM or OID_xxx. These settings describe
1777         //   the user intended configuration, but not necessary fully equal to the final
1778         //   settings in ACTIVE BSS after negotiation/compromize with the BSS holder (either
1779         //   AP or IBSS holder).
1780         //   Once initialized, user configuration can only be changed via OID_xxx
1781         UCHAR       BssType;              // BSS_INFRA or BSS_ADHOC
1782         USHORT      AtimWin;          // used when starting a new IBSS
1783
1784         // GROUP 2 -
1785         //   User configuration loaded from Registry, E2PROM or OID_xxx. These settings describe
1786         //   the user intended configuration, and should be always applied to the final
1787         //   settings in ACTIVE BSS without compromising with the BSS holder.
1788         //   Once initialized, user configuration can only be changed via OID_xxx
1789         UCHAR       RssiTrigger;
1790         UCHAR       RssiTriggerMode;      // RSSI_TRIGGERED_UPON_BELOW_THRESHOLD or RSSI_TRIGGERED_UPON_EXCCEED_THRESHOLD
1791         USHORT      DefaultListenCount;   // default listen count;
1792         ULONG       WindowsPowerMode;           // Power mode for AC power
1793         ULONG       WindowsBatteryPowerMode;    // Power mode for battery if exists
1794         BOOLEAN     bWindowsACCAMEnable;        // Enable CAM power mode when AC on
1795         BOOLEAN     bAutoReconnect;         // Set to TRUE when setting OID_802_11_SSID with no matching BSSID
1796         ULONG       WindowsPowerProfile;    // Windows power profile, for NDIS5.1 PnP
1797
1798         // MIB:ieee802dot11.dot11smt(1).dot11StationConfigTable(1)
1799         USHORT      Psm;                  // power management mode   (PWR_ACTIVE|PWR_SAVE)
1800         USHORT      DisassocReason;
1801         UCHAR       DisassocSta[MAC_ADDR_LEN];
1802         USHORT      DeauthReason;
1803         UCHAR       DeauthSta[MAC_ADDR_LEN];
1804         USHORT      AuthFailReason;
1805         UCHAR       AuthFailSta[MAC_ADDR_LEN];
1806
1807         NDIS_802_11_PRIVACY_FILTER          PrivacyFilter;  // PrivacyFilter enum for 802.1X
1808         NDIS_802_11_AUTHENTICATION_MODE     AuthMode;       // This should match to whatever microsoft defined
1809         NDIS_802_11_WEP_STATUS              WepStatus;
1810         NDIS_802_11_WEP_STATUS                          OrigWepStatus;  // Original wep status set from OID
1811
1812         // Add to support different cipher suite for WPA2/WPA mode
1813         NDIS_802_11_ENCRYPTION_STATUS           GroupCipher;            // Multicast cipher suite
1814         NDIS_802_11_ENCRYPTION_STATUS           PairCipher;                     // Unicast cipher suite
1815         BOOLEAN                                                         bMixCipher;                     // Indicate current Pair & Group use different cipher suites
1816         USHORT                                                          RsnCapability;
1817
1818         NDIS_802_11_WEP_STATUS              GroupKeyWepStatus;
1819
1820         UCHAR           PMK[32];                // WPA PSK mode PMK
1821         UCHAR       PTK[64];                // WPA PSK mode PTK
1822         UCHAR           GTK[32];                                // GTK from authenticator
1823         BSSID_INFO      SavedPMK[PMKID_NO];
1824         UINT            SavedPMKNum;                    // Saved PMKID number
1825
1826         UCHAR           DefaultKeyId;
1827
1828
1829         // WPA 802.1x port control, WPA_802_1X_PORT_SECURED, WPA_802_1X_PORT_NOT_SECURED
1830         UCHAR       PortSecured;
1831
1832         // For WPA countermeasures
1833         ULONG       LastMicErrorTime;   // record last MIC error time
1834         ULONG       MicErrCnt;          // Should be 0, 1, 2, then reset to zero (after disassoiciation).
1835         BOOLEAN     bBlockAssoc;        // Block associate attempt for 60 seconds after counter measure occurred.
1836         // For WPA-PSK supplicant state
1837         WPA_STATE   WpaState;           // Default is SS_NOTUSE and handled by microsoft 802.1x
1838         UCHAR       ReplayCounter[8];
1839         UCHAR       ANonce[32];         // ANonce for WPA-PSK from aurhenticator
1840         UCHAR       SNonce[32];         // SNonce for WPA-PSK
1841
1842         UCHAR       LastSNR0;             // last received BEACON's SNR
1843         UCHAR       LastSNR1;            // last received BEACON's SNR for 2nd  antenna
1844         RSSI_SAMPLE RssiSample;
1845         ULONG       NumOfAvgRssiSample;
1846
1847         ULONG       LastBeaconRxTime;     // OS's timestamp of the last BEACON RX time
1848         ULONG       Last11bBeaconRxTime;  // OS's timestamp of the last 11B BEACON RX time
1849         ULONG           Last11gBeaconRxTime;    // OS's timestamp of the last 11G BEACON RX time
1850         ULONG           Last20NBeaconRxTime;    // OS's timestamp of the last 20MHz N BEACON RX time
1851
1852         ULONG       LastScanTime;       // Record last scan time for issue BSSID_SCAN_LIST
1853         ULONG       ScanCnt;            // Scan counts since most recent SSID, BSSID, SCAN OID request
1854         BOOLEAN     bSwRadio;           // Software controlled Radio On/Off, TRUE: On
1855         BOOLEAN     bHwRadio;           // Hardware controlled Radio On/Off, TRUE: On
1856         BOOLEAN     bRadio;             // Radio state, And of Sw & Hw radio state
1857         BOOLEAN     bHardwareRadio;     // Hardware controlled Radio enabled
1858         BOOLEAN     bShowHiddenSSID;    // Show all known SSID in SSID list get operation
1859
1860
1861         // New for WPA, windows want us to to keep association information and
1862         // Fixed IEs from last association response
1863         NDIS_802_11_ASSOCIATION_INFORMATION     AssocInfo;
1864         USHORT       ReqVarIELen;                // Length of next VIE include EID & Length
1865         UCHAR       ReqVarIEs[MAX_VIE_LEN];             // The content saved here should be little-endian format.
1866         USHORT       ResVarIELen;                // Length of next VIE include EID & Length
1867         UCHAR       ResVarIEs[MAX_VIE_LEN];
1868
1869         UCHAR       RSNIE_Len;
1870         UCHAR       RSN_IE[MAX_LEN_OF_RSNIE];   // The content saved here should be little-endian format.
1871
1872         // New variables used for CCX 1.0
1873         BOOLEAN             bCkipOn;
1874         BOOLEAN             bCkipCmicOn;
1875         UCHAR               CkipFlag;
1876         UCHAR               GIV[3];  //for CCX iv
1877         UCHAR               RxSEQ[4];
1878         UCHAR               TxSEQ[4];
1879         UCHAR               CKIPMIC[4];
1880         UCHAR               LeapAuthMode;
1881         LEAP_AUTH_INFO      LeapAuthInfo;
1882         UCHAR               HashPwd[16];
1883         UCHAR               NetworkChallenge[8];
1884         UCHAR               NetworkChallengeResponse[24];
1885         UCHAR               PeerChallenge[8];
1886
1887         UCHAR               PeerChallengeResponse[24];
1888         UCHAR               SessionKey[16]; //Network session keys (NSK)
1889         RALINK_TIMER_STRUCT LeapAuthTimer;
1890         ROGUEAP_TABLE       RogueApTab;   //Cisco CCX1 Rogue AP Detection
1891
1892         // New control flags for CCX
1893         CCX_CONTROL         CCXControl;                 // Master administration state
1894         BOOLEAN             CCXEnable;                  // Actual CCX state
1895         UCHAR               CCXScanChannel;             // Selected channel for CCX beacon request
1896         USHORT              CCXScanTime;                // Time out to wait for beacon and probe response
1897         UCHAR               CCXReqType;                 // Current processing CCX request type
1898         BSS_TABLE           CCXBssTab;                  // BSS Table
1899         UCHAR               FrameReportBuf[2048];       // Buffer for creating frame report
1900         USHORT              FrameReportLen;             // Current Frame report length
1901         ULONG               CLBusyBytes;                // Save the total bytes received durning channel load scan time
1902         USHORT              RPIDensity[8];              // Array for RPI density collection
1903         // Start address of each BSS table within FrameReportBuf
1904         // It's important to update the RxPower of the corresponding Bss
1905         USHORT              BssReportOffset[MAX_LEN_OF_BSS_TABLE];
1906         USHORT              BeaconToken;                // Token for beacon report
1907         ULONG               LastBssIndex;               // Most current reported Bss index
1908         RM_REQUEST_ACTION   MeasurementRequest[16];     // Saved measurement request
1909         UCHAR               RMReqCnt;                   // Number of measurement request saved.
1910         UCHAR               CurrentRMReqIdx;            // Number of measurement request saved.
1911         BOOLEAN             ParallelReq;                // Parallel measurement, only one request performed,
1912                                                                                                         // It must be the same channel with maximum duration
1913         USHORT              ParallelDuration;           // Maximum duration for parallel measurement
1914         UCHAR               ParallelChannel;            // Only one channel with parallel measurement
1915         USHORT              IAPPToken;                  // IAPP dialog token
1916         UCHAR               CCXQosECWMin;               // Cisco QOS ECWMin for AC 0
1917         UCHAR               CCXQosECWMax;               // Cisco QOS ECWMax for AC 0
1918         // Hack for channel load and noise histogram parameters
1919         UCHAR               NHFactor;                   // Parameter for Noise histogram
1920         UCHAR               CLFactor;                   // Parameter for channel load
1921
1922         UCHAR               KRK[16];        //Key Refresh Key.
1923         UCHAR               BTK[32];        //Base Transient Key
1924         BOOLEAN             CCKMLinkUpFlag;
1925         ULONG               CCKMRN;    //(Re)Association request number.
1926         LARGE_INTEGER       CCKMBeaconAtJoinTimeStamp;  //TSF timer for Re-assocaite to the new AP
1927         UCHAR               AironetCellPowerLimit;      //in dBm
1928         UCHAR               AironetIPAddress[4];        //eg. 192.168.1.1
1929         BOOLEAN             CCXAdjacentAPReportFlag;    //flag for determining report Assoc Lost time
1930         CHAR                CCXAdjacentAPSsid[MAX_LEN_OF_SSID]; //Adjacent AP's SSID report
1931         UCHAR               CCXAdjacentAPSsidLen;               // the actual ssid length in used
1932         UCHAR               CCXAdjacentAPBssid[MAC_ADDR_LEN];         //Adjacent AP's BSSID report
1933         USHORT              CCXAdjacentAPChannel;
1934         ULONG               CCXAdjacentAPLinkDownTime;  //for Spec S32.
1935
1936         RALINK_TIMER_STRUCT     StaQuickResponeForRateUpTimer;
1937         BOOLEAN                         StaQuickResponeForRateUpTimerRunning;
1938
1939         UCHAR                   DtimCount;      // 0.. DtimPeriod-1
1940         UCHAR                   DtimPeriod;     // default = 3
1941
1942         ////////////////////////////////////////////////////////////////////////////////////////
1943         // This is only for WHQL test.
1944         BOOLEAN                         WhqlTest;
1945         ////////////////////////////////////////////////////////////////////////////////////////
1946
1947     RALINK_TIMER_STRUCT WpaDisassocAndBlockAssocTimer;
1948     // Fast Roaming
1949         BOOLEAN                 bFastRoaming;       // 0:disable fast roaming, 1:enable fast roaming
1950         CHAR                    dBmToRoam;          // the condition to roam when receiving Rssi less than this value. It's negative value.
1951
1952 #ifdef WPA_SUPPLICANT_SUPPORT
1953     BOOLEAN             IEEE8021X;
1954     BOOLEAN             IEEE8021x_required_keys;
1955     CIPHER_KEY          DesireSharedKey[4];     // Record user desired WEP keys
1956     UCHAR               DesireSharedKeyId;
1957
1958     // 0: driver ignores wpa_supplicant
1959     // 1: wpa_supplicant initiates scanning and AP selection
1960     // 2: driver takes care of scanning, AP selection, and IEEE 802.11 association parameters
1961     UCHAR               WpaSupplicantUP;
1962         UCHAR                           WpaSupplicantScanCount;
1963 #endif // WPA_SUPPLICANT_SUPPORT //
1964
1965     CHAR                dev_name[16];
1966     USHORT              OriDevType;
1967
1968     BOOLEAN             bTGnWifiTest;
1969         BOOLEAN                     bScanReqIsFromWebUI;
1970
1971         HTTRANSMIT_SETTING                              HTPhyMode, MaxHTPhyMode, MinHTPhyMode;// For transmit phy setting in TXWI.
1972         DESIRED_TRANSMIT_SETTING        DesiredTransmitSetting;
1973         RT_HT_PHY_INFO                                  DesiredHtPhyInfo;
1974         BOOLEAN                                                 bAutoTxRateSwitch;
1975 } STA_ADMIN_CONFIG, *PSTA_ADMIN_CONFIG;
1976
1977 // This data structure keep the current active BSS/IBSS's configuration that this STA
1978 // had agreed upon joining the network. Which means these parameters are usually decided
1979 // by the BSS/IBSS creator instead of user configuration. Data in this data structurre
1980 // is valid only when either ADHOC_ON(pAd) or INFRA_ON(pAd) is TRUE.
1981 // Normally, after SCAN or failed roaming attempts, we need to recover back to
1982 // the current active settings.
1983 typedef struct _STA_ACTIVE_CONFIG {
1984         USHORT      Aid;
1985         USHORT      AtimWin;                // in kusec; IBSS parameter set element
1986         USHORT      CapabilityInfo;
1987         USHORT      CfpMaxDuration;
1988         USHORT      CfpPeriod;
1989
1990         // Copy supported rate from desired AP's beacon. We are trying to match
1991         // AP's supported and extended rate settings.
1992         UCHAR       SupRate[MAX_LEN_OF_SUPPORTED_RATES];
1993         UCHAR       ExtRate[MAX_LEN_OF_SUPPORTED_RATES];
1994         UCHAR       SupRateLen;
1995         UCHAR       ExtRateLen;
1996         // Copy supported ht from desired AP's beacon. We are trying to match
1997         RT_HT_PHY_INFO          SupportedPhyInfo;
1998         RT_HT_CAPABILITY        SupportedHtPhy;
1999 } STA_ACTIVE_CONFIG, *PSTA_ACTIVE_CONFIG;
2000
2001 #ifdef RT2870
2002 // for USB interface, avoid in interrupt when write key
2003 typedef struct   RT_ADD_PAIRWISE_KEY_ENTRY {
2004         NDIS_802_11_MAC_ADDRESS         MacAddr;
2005         USHORT                          MacTabMatchWCID;        // ASIC
2006         CIPHER_KEY                      CipherKey;
2007 } RT_ADD_PAIRWISE_KEY_ENTRY,*PRT_ADD_PAIRWISE_KEY_ENTRY;
2008 #endif // RT2870 //
2009
2010 // ----------- start of AP --------------------------
2011 // AUTH-RSP State Machine Aux data structure
2012 typedef struct _AP_MLME_AUX {
2013         UCHAR               Addr[MAC_ADDR_LEN];
2014         USHORT              Alg;
2015         CHAR                Challenge[CIPHER_TEXT_LEN];
2016 } AP_MLME_AUX, *PAP_MLME_AUX;
2017
2018 // structure to define WPA Group Key Rekey Interval
2019 typedef struct PACKED _RT_802_11_WPA_REKEY {
2020         ULONG ReKeyMethod;          // mechanism for rekeying: 0:disable, 1: time-based, 2: packet-based
2021         ULONG ReKeyInterval;        // time-based: seconds, packet-based: kilo-packets
2022 } RT_WPA_REKEY,*PRT_WPA_REKEY, RT_802_11_WPA_REKEY, *PRT_802_11_WPA_REKEY;
2023
2024 typedef struct _MAC_TABLE_ENTRY {
2025         //Choose 1 from ValidAsWDS and ValidAsCLI  to validize.
2026         BOOLEAN         ValidAsCLI;             // Sta mode, set this TRUE after Linkup,too.
2027         BOOLEAN         ValidAsWDS;     // This is WDS Entry. only for AP mode.
2028         BOOLEAN         ValidAsApCli;   //This is a AP-Client entry, only for AP mode which enable AP-Client functions.
2029         BOOLEAN         ValidAsMesh;
2030         BOOLEAN         ValidAsDls;     // This is DLS Entry. only for STA mode.
2031         BOOLEAN         isCached;
2032         BOOLEAN         bIAmBadAtheros; // Flag if this is Atheros chip that has IOT problem.  We need to turn on RTS/CTS protection.
2033
2034         UCHAR           EnqueueEapolStartTimerRunning;  // Enqueue EAPoL-Start for triggering EAP SM
2035         //jan for wpa
2036         // record which entry revoke MIC Failure , if it leaves the BSS itself, AP won't update aMICFailTime MIB
2037         UCHAR           CMTimerRunning;
2038         UCHAR           apidx;                  // MBSS number
2039         UCHAR           RSNIE_Len;
2040         UCHAR           RSN_IE[MAX_LEN_OF_RSNIE];
2041         UCHAR           ANonce[LEN_KEY_DESC_NONCE];
2042         UCHAR           R_Counter[LEN_KEY_DESC_REPLAY];
2043         UCHAR           PTK[64];
2044         UCHAR           ReTryCounter;
2045         RALINK_TIMER_STRUCT                 RetryTimer;
2046         RALINK_TIMER_STRUCT                                     EnqueueStartForPSKTimer;        // A timer which enqueue EAPoL-Start for triggering PSK SM
2047         NDIS_802_11_AUTHENTICATION_MODE     AuthMode;   // This should match to whatever microsoft defined
2048         NDIS_802_11_WEP_STATUS              WepStatus;
2049         AP_WPA_STATE    WpaState;
2050         GTK_STATE       GTKState;
2051         USHORT          PortSecured;
2052         NDIS_802_11_PRIVACY_FILTER  PrivacyFilter;      // PrivacyFilter enum for 802.1X
2053         CIPHER_KEY      PairwiseKey;
2054         PVOID           pAd;
2055     INT                         PMKID_CacheIdx;
2056     UCHAR                       PMKID[LEN_PMKID];
2057
2058
2059         UCHAR           Addr[MAC_ADDR_LEN];
2060         UCHAR           PsMode;
2061         SST             Sst;
2062         AUTH_STATE      AuthState; // for SHARED KEY authentication state machine used only
2063         BOOLEAN                 IsReassocSta;   // Indicate whether this is a reassociation procedure
2064         USHORT          Aid;
2065         USHORT          CapabilityInfo;
2066         UCHAR           LastRssi;
2067         ULONG           NoDataIdleCount;
2068         UINT16                  StationKeepAliveCount; // unit: second
2069         ULONG           PsQIdleCount;
2070         QUEUE_HEADER    PsQueue;
2071
2072         UINT32                  StaConnectTime;         // the live time of this station since associated with AP
2073
2074
2075 #ifdef DOT11_N_SUPPORT
2076         BOOLEAN                 bSendBAR;
2077         USHORT                  NoBADataCountDown;
2078
2079         UINT32                  CachedBuf[16];          // UINT (4 bytes) for alignment
2080         UINT                    TxBFCount; // 3*3
2081 #endif // DOT11_N_SUPPORT //
2082         UINT                    FIFOCount;
2083         UINT                    DebugFIFOCount;
2084         UINT                    DebugTxCount;
2085     BOOLEAN                     bDlsInit;
2086
2087
2088 //====================================================
2089 //WDS entry needs these
2090 // rt2860 add this. if ValidAsWDS==TRUE, MatchWDSTabIdx is the index in WdsTab.MacTab
2091         UINT                    MatchWDSTabIdx;
2092         UCHAR           MaxSupportedRate;
2093         UCHAR           CurrTxRate;
2094         UCHAR           CurrTxRateIndex;
2095         // to record the each TX rate's quality. 0 is best, the bigger the worse.
2096         USHORT          TxQuality[MAX_STEP_OF_TX_RATE_SWITCH];
2097 //      USHORT          OneSecTxOkCount;
2098         UINT32                  OneSecTxNoRetryOkCount;
2099         UINT32          OneSecTxRetryOkCount;
2100         UINT32          OneSecTxFailCount;
2101         UINT32                  ContinueTxFailCnt;
2102         UINT32          CurrTxRateStableTime; // # of second in current TX rate
2103         UCHAR           TxRateUpPenalty;      // extra # of second penalty due to last unstable condition
2104 //====================================================
2105
2106         BOOLEAN         fNoisyEnvironment;
2107         BOOLEAN                 fLastSecAccordingRSSI;
2108         UCHAR           LastSecTxRateChangeAction; // 0: no change, 1:rate UP, 2:rate down
2109         CHAR                    LastTimeTxRateChangeAction; //Keep last time value of LastSecTxRateChangeAction
2110         ULONG                   LastTxOkCount;
2111         UCHAR           PER[MAX_STEP_OF_TX_RATE_SWITCH];
2112
2113         // a bitmap of BOOLEAN flags. each bit represent an operation status of a particular
2114         // BOOLEAN control, either ON or OFF. These flags should always be accessed via
2115         // CLIENT_STATUS_TEST_FLAG(), CLIENT_STATUS_SET_FLAG(), CLIENT_STATUS_CLEAR_FLAG() macros.
2116         // see fOP_STATUS_xxx in RTMP_DEF.C for detail bit definition. fCLIENT_STATUS_AMSDU_INUSED
2117         ULONG           ClientStatusFlags;
2118
2119         // TODO: Shall we move that to DOT11_N_SUPPORT???
2120         HTTRANSMIT_SETTING      HTPhyMode, MaxHTPhyMode, MinHTPhyMode;// For transmit phy setting in TXWI.
2121
2122 #ifdef DOT11_N_SUPPORT
2123         // HT EWC MIMO-N used parameters
2124         USHORT          RXBAbitmap;     // fill to on-chip  RXWI_BA_BITMASK in 8.1.3RX attribute entry format
2125         USHORT          TXBAbitmap;     // This bitmap as originator, only keep in software used to mark AMPDU bit in TXWI
2126         USHORT          TXAutoBAbitmap;
2127         USHORT          BADeclineBitmap;
2128         USHORT          BARecWcidArray[NUM_OF_TID];     // The mapping wcid of recipient session. if RXBAbitmap bit is masked
2129         USHORT          BAOriWcidArray[NUM_OF_TID]; // The mapping wcid of originator session. if TXBAbitmap bit is masked
2130         USHORT          BAOriSequence[NUM_OF_TID]; // The mapping wcid of originator session. if TXBAbitmap bit is masked
2131
2132         // 802.11n features.
2133         UCHAR           MpduDensity;
2134         UCHAR           MaxRAmpduFactor;
2135         UCHAR           AMsduSize;
2136         UCHAR           MmpsMode;       // MIMO power save more.
2137
2138         HT_CAPABILITY_IE                HTCapability;
2139 #endif // DOT11_N_SUPPORT //
2140
2141         BOOLEAN         bAutoTxRateSwitch;
2142
2143         UCHAR       RateLen;
2144         struct _MAC_TABLE_ENTRY *pNext;
2145     USHORT      TxSeq[NUM_OF_TID];
2146         USHORT          NonQosDataSeq;
2147
2148         RSSI_SAMPLE     RssiSample;
2149
2150         UINT32                  TXMCSExpected[16];
2151         UINT32                  TXMCSSuccessful[16];
2152         UINT32                  TXMCSFailed[16];
2153         UINT32                  TXMCSAutoFallBack[16][16];
2154
2155         ULONG                   LastBeaconRxTime;
2156 } MAC_TABLE_ENTRY, *PMAC_TABLE_ENTRY;
2157
2158 typedef struct _MAC_TABLE {
2159         USHORT                  Size;
2160         MAC_TABLE_ENTRY *Hash[HASH_TABLE_SIZE];
2161         MAC_TABLE_ENTRY Content[MAX_LEN_OF_MAC_TABLE];
2162         QUEUE_HEADER    McastPsQueue;
2163         ULONG           PsQIdleCount;
2164         BOOLEAN         fAnyStationInPsm;
2165         BOOLEAN         fAnyStationBadAtheros;  // Check if any Station is atheros 802.11n Chip.  We need to use RTS/CTS with Atheros 802,.11n chip.
2166         BOOLEAN                 fAnyTxOPForceDisable;   // Check if it is necessary to disable BE TxOP
2167         BOOLEAN                 fAllStationAsRalink;    // Check if all stations are ralink-chipset
2168 #ifdef DOT11_N_SUPPORT
2169         BOOLEAN         fAnyStationIsLegacy;    // Check if I use legacy rate to transmit to my BSS Station/
2170         BOOLEAN         fAnyStationNonGF;               // Check if any Station can't support GF.
2171         BOOLEAN         fAnyStation20Only;              // Check if any Station can't support GF.
2172         BOOLEAN                 fAnyStationMIMOPSDynamic; // Check if any Station is MIMO Dynamic
2173         BOOLEAN         fAnyBASession;   // Check if there is BA session.  Force turn on RTS/CTS
2174 #endif // DOT11_N_SUPPORT //
2175 } MAC_TABLE, *PMAC_TABLE;
2176
2177 #ifdef DOT11_N_SUPPORT
2178 #define IS_HT_STA(_pMacEntry)   \
2179         (_pMacEntry->MaxHTPhyMode.field.MODE >= MODE_HTMIX)
2180
2181 #define IS_HT_RATE(_pMacEntry)  \
2182         (_pMacEntry->HTPhyMode.field.MODE >= MODE_HTMIX)
2183
2184 #define PEER_IS_HT_RATE(_pMacEntry)     \
2185         (_pMacEntry->HTPhyMode.field.MODE >= MODE_HTMIX)
2186 #endif // DOT11_N_SUPPORT //
2187
2188 typedef struct _WDS_ENTRY {
2189         BOOLEAN         Valid;
2190         UCHAR           Addr[MAC_ADDR_LEN];
2191         ULONG           NoDataIdleCount;
2192         struct _WDS_ENTRY *pNext;
2193 } WDS_ENTRY, *PWDS_ENTRY;
2194
2195 typedef struct  _WDS_TABLE_ENTRY {
2196         USHORT                  Size;
2197         UCHAR           WdsAddr[MAC_ADDR_LEN];
2198         WDS_ENTRY       *Hash[HASH_TABLE_SIZE];
2199         WDS_ENTRY       Content[MAX_LEN_OF_MAC_TABLE];
2200         UCHAR           MaxSupportedRate;
2201         UCHAR           CurrTxRate;
2202         USHORT          TxQuality[MAX_LEN_OF_SUPPORTED_RATES];
2203         USHORT          OneSecTxOkCount;
2204         USHORT          OneSecTxRetryOkCount;
2205         USHORT          OneSecTxFailCount;
2206         ULONG           CurrTxRateStableTime; // # of second in current TX rate
2207         UCHAR           TxRateUpPenalty;      // extra # of second penalty due to last unstable condition
2208 } WDS_TABLE_ENTRY, *PWDS_TABLE_ENTRY;
2209
2210 typedef struct _RT_802_11_WDS_ENTRY {
2211         PNET_DEV                        dev;
2212         UCHAR                           Valid;
2213         UCHAR                           PhyMode;
2214         UCHAR                           PeerWdsAddr[MAC_ADDR_LEN];
2215         UCHAR                           MacTabMatchWCID;        // ASIC
2216         NDIS_802_11_WEP_STATUS  WepStatus;
2217         UCHAR                                   KeyIdx;
2218         CIPHER_KEY              WdsKey;
2219         HTTRANSMIT_SETTING                              HTPhyMode, MaxHTPhyMode, MinHTPhyMode;
2220         RT_HT_PHY_INFO                                  DesiredHtPhyInfo;
2221         BOOLEAN                                                 bAutoTxRateSwitch;
2222         DESIRED_TRANSMIT_SETTING        DesiredTransmitSetting; // Desired transmit setting.
2223 } RT_802_11_WDS_ENTRY, *PRT_802_11_WDS_ENTRY;
2224
2225 typedef struct _WDS_TABLE {
2226         UCHAR               Mode;
2227         ULONG               Size;
2228         RT_802_11_WDS_ENTRY     WdsEntry[MAX_WDS_ENTRY];
2229 } WDS_TABLE, *PWDS_TABLE;
2230
2231 typedef struct _APCLI_STRUCT {
2232         PNET_DEV                                dev;
2233 #ifdef RTL865X_SOC
2234         unsigned int            mylinkid;
2235 #endif
2236         BOOLEAN                 Enable; // Set it as 1 if the apcli interface was configured to "1"  or by iwpriv cmd "ApCliEnable"
2237         BOOLEAN                 Valid;  // Set it as 1 if the apcli interface associated success to remote AP.
2238         UCHAR                                   MacTabWCID;     //WCID value, which point to the entry of ASIC Mac table.
2239         UCHAR                   SsidLen;
2240         CHAR                    Ssid[MAX_LEN_OF_SSID];
2241
2242         UCHAR                   CfgSsidLen;
2243         CHAR                    CfgSsid[MAX_LEN_OF_SSID];
2244         UCHAR                   CfgApCliBssid[ETH_LENGTH_OF_ADDRESS];
2245         UCHAR                   CurrentAddress[ETH_LENGTH_OF_ADDRESS];
2246
2247         ULONG                   ApCliRcvBeaconTime;
2248
2249         ULONG                   CtrlCurrState;
2250         ULONG                   SyncCurrState;
2251         ULONG                   AuthCurrState;
2252         ULONG                   AssocCurrState;
2253         ULONG                                   WpaPskCurrState;
2254
2255         USHORT                  AuthReqCnt;
2256         USHORT                  AssocReqCnt;
2257
2258         ULONG                   ClientStatusFlags;
2259         UCHAR                   MpduDensity;
2260
2261         NDIS_802_11_AUTHENTICATION_MODE     AuthMode;   // This should match to whatever microsoft defined
2262         NDIS_802_11_WEP_STATUS              WepStatus;
2263
2264         // Add to support different cipher suite for WPA2/WPA mode
2265         NDIS_802_11_ENCRYPTION_STATUS           GroupCipher;            // Multicast cipher suite
2266         NDIS_802_11_ENCRYPTION_STATUS           PairCipher;                     // Unicast cipher suite
2267         BOOLEAN                                                         bMixCipher;                     // Indicate current Pair & Group use different cipher suites
2268         USHORT                                                          RsnCapability;
2269
2270         UCHAR           PSK[100];                               // reserve PSK key material
2271         UCHAR       PSKLen;
2272         UCHAR       PMK[32];                // WPA PSK mode PMK
2273         //UCHAR       PTK[64];                // WPA PSK mode PTK
2274         UCHAR           GTK[32];                                // GTK from authenticator
2275
2276         //CIPHER_KEY            PairwiseKey;
2277         CIPHER_KEY      SharedKey[SHARE_KEY_NUM];
2278         UCHAR           DefaultKeyId;
2279
2280         // WPA 802.1x port control, WPA_802_1X_PORT_SECURED, WPA_802_1X_PORT_NOT_SECURED
2281         //UCHAR       PortSecured;
2282
2283         // store RSN_IE built by driver
2284         UCHAR           RSN_IE[MAX_LEN_OF_RSNIE];  // The content saved here should be convert to little-endian format.
2285         UCHAR           RSNIE_Len;
2286
2287         // For WPA countermeasures
2288         ULONG       LastMicErrorTime;   // record last MIC error time
2289         //ULONG       MicErrCnt;          // Should be 0, 1, 2, then reset to zero (after disassoiciation).
2290         BOOLEAN                 bBlockAssoc; // Block associate attempt for 60 seconds after counter measure occurred.
2291
2292         // For WPA-PSK supplicant state
2293         //WPA_STATE     WpaState;           // Default is SS_NOTUSE
2294         //UCHAR         ReplayCounter[8];
2295         //UCHAR         ANonce[32];         // ANonce for WPA-PSK from authenticator
2296         UCHAR           SNonce[32];         // SNonce for WPA-PSK
2297         UCHAR                   GNonce[32];                     // GNonce for WPA-PSK from authenticator
2298
2299         HTTRANSMIT_SETTING                              HTPhyMode, MaxHTPhyMode, MinHTPhyMode;
2300         RT_HT_PHY_INFO                                  DesiredHtPhyInfo;
2301         BOOLEAN                                                 bAutoTxRateSwitch;
2302         DESIRED_TRANSMIT_SETTING        DesiredTransmitSetting; // Desired transmit setting.
2303 } APCLI_STRUCT, *PAPCLI_STRUCT;
2304
2305 // ----------- end of AP ----------------------------
2306
2307 struct wificonf
2308 {
2309         BOOLEAN bShortGI;
2310         BOOLEAN bGreenField;
2311 };
2312
2313
2314
2315 typedef struct _INF_PCI_CONFIG
2316 {
2317         PUCHAR                  CSRBaseAddress;     // PCI MMIO Base Address, all access will use
2318 }INF_PCI_CONFIG;
2319
2320 typedef struct _INF_USB_CONFIG
2321 {
2322         UINT                BulkInEpAddr;               // bulk-in endpoint address
2323         UINT                BulkOutEpAddr[6];   // bulk-out endpoint address
2324
2325 }INF_USB_CONFIG;
2326
2327 #ifdef IKANOS_VX_1X0
2328         typedef void (*IkanosWlanTxCbFuncP)(void *, void *);
2329
2330         struct IKANOS_TX_INFO
2331         {
2332                 struct net_device *netdev;
2333                 IkanosWlanTxCbFuncP *fp;
2334         };
2335 #endif // IKANOS_VX_1X0 //
2336
2337 #ifdef DBG_DIAGNOSE
2338 #define DIAGNOSE_TIME   10   // 10 sec
2339 typedef struct _RtmpDiagStrcut_
2340 {       // Diagnosis Related element
2341         unsigned char           inited;
2342         unsigned char   qIdx;
2343         unsigned char   ArrayStartIdx;
2344         unsigned char           ArrayCurIdx;
2345         // Tx Related Count
2346         USHORT                  TxDataCnt[DIAGNOSE_TIME];
2347         USHORT                  TxFailCnt[DIAGNOSE_TIME];
2348 //      USHORT                  TxDescCnt[DIAGNOSE_TIME][16];           // TxDesc queue length in scale of 0~14, >=15
2349         USHORT                  TxDescCnt[DIAGNOSE_TIME][24]; // 3*3    // TxDesc queue length in scale of 0~14, >=15
2350 //      USHORT                  TxMcsCnt[DIAGNOSE_TIME][16];                    // TxDate MCS Count in range from 0 to 15, step in 1.
2351         USHORT                  TxMcsCnt[DIAGNOSE_TIME][24]; // 3*3
2352         USHORT                  TxSWQueCnt[DIAGNOSE_TIME][9];           // TxSwQueue length in scale of 0, 1, 2, 3, 4, 5, 6, 7, >=8
2353
2354         USHORT                  TxAggCnt[DIAGNOSE_TIME];
2355         USHORT                  TxNonAggCnt[DIAGNOSE_TIME];
2356 //      USHORT                  TxAMPDUCnt[DIAGNOSE_TIME][16];          // 10 sec, TxDMA APMDU Aggregation count in range from 0 to 15, in setp of 1.
2357         USHORT                  TxAMPDUCnt[DIAGNOSE_TIME][24]; // 3*3 // 10 sec, TxDMA APMDU Aggregation count in range from 0 to 15, in setp of 1.
2358         USHORT                  TxRalinkCnt[DIAGNOSE_TIME];                     // TxRalink Aggregation Count in 1 sec scale.
2359         USHORT                  TxAMSDUCnt[DIAGNOSE_TIME];                      // TxAMSUD Aggregation Count in 1 sec scale.
2360
2361         // Rx Related Count
2362         USHORT                  RxDataCnt[DIAGNOSE_TIME];                       // Rx Total Data count.
2363         USHORT                  RxCrcErrCnt[DIAGNOSE_TIME];
2364 //      USHORT                  RxMcsCnt[DIAGNOSE_TIME][16];            // Rx MCS Count in range from 0 to 15, step in 1.
2365         USHORT                  RxMcsCnt[DIAGNOSE_TIME][24]; // 3*3
2366 }RtmpDiagStruct;
2367 #endif // DBG_DIAGNOSE //
2368
2369
2370 //
2371 //  The miniport adapter structure
2372 //
2373 typedef struct _RTMP_ADAPTER
2374 {
2375         PVOID                                   OS_Cookie;      // save specific structure relative to OS
2376         PNET_DEV                                net_dev;
2377         ULONG                                   VirtualIfCnt;
2378
2379
2380
2381         NDIS_SPIN_LOCK          irq_lock;
2382         UCHAR                   irq_disabled;
2383
2384 #ifdef RT2870
2385 /*****************************************************************************************/
2386 /*      USB related parameters                                                           */
2387 /*****************************************************************************************/
2388         struct usb_config_descriptor            *config;
2389         UINT                                                            BulkInEpAddr;           // bulk-in endpoint address
2390         UINT                                                            BulkOutEpAddr[6];       // bulk-out endpoint address
2391
2392         UINT                                                            NumberOfPipes;
2393         USHORT                                                          BulkOutMaxPacketSize;
2394         USHORT                                                          BulkInMaxPacketSize;
2395
2396         //======Control Flags
2397         LONG                            PendingIoCount;
2398         ULONG                                           BulkFlags;
2399         BOOLEAN                     bUsbTxBulkAggre;    // Flags for bulk out data priority
2400
2401
2402         //======Timer Thread
2403         RT2870_TIMER_QUEUE              TimerQ;
2404         NDIS_SPIN_LOCK                  TimerQLock;
2405
2406
2407         //======Cmd Thread
2408         CmdQ                                    CmdQ;
2409         NDIS_SPIN_LOCK                  CmdQLock;                               // CmdQLock spinlock
2410
2411         BOOLEAN                                 TimerFunc_kill;
2412         BOOLEAN                                 mlme_kill;
2413
2414
2415         //======Semaphores (event)
2416         struct semaphore                        mlme_semaphore;                 /* to sleep thread on   */
2417         struct semaphore                        RTUSBCmd_semaphore;             /* to sleep thread on   */
2418         struct semaphore                        RTUSBTimer_semaphore;
2419
2420         struct completion                       TimerQComplete;
2421         struct completion                       mlmeComplete;
2422         struct completion                       CmdQComplete;
2423         wait_queue_head_t                       *wait;
2424 #endif // RT2870 //
2425
2426
2427 /*****************************************************************************************/
2428         /*      Both PCI/USB related parameters                                                  */
2429 /*****************************************************************************************/
2430
2431
2432 /*****************************************************************************************/
2433 /*      Tx related parameters                                                           */
2434 /*****************************************************************************************/
2435         BOOLEAN                 DeQueueRunning[NUM_OF_TX_RING];  // for ensuring RTUSBDeQueuePacket get call once
2436         NDIS_SPIN_LOCK          DeQueueLock[NUM_OF_TX_RING];
2437
2438 #ifdef RT2870
2439         // Data related context and AC specified, 4 AC supported
2440         NDIS_SPIN_LOCK                  BulkOutLock[6];                 // BulkOut spinlock for 4 ACs
2441         NDIS_SPIN_LOCK                  MLMEBulkOutLock;        // MLME BulkOut lock
2442
2443         HT_TX_CONTEXT                   TxContext[NUM_OF_TX_RING];
2444         NDIS_SPIN_LOCK                  TxContextQueueLock[NUM_OF_TX_RING];             // TxContextQueue spinlock
2445
2446         // 4 sets of Bulk Out index and pending flag
2447         UCHAR                                   NextBulkOutIndex[4];    // only used for 4 EDCA bulkout pipe
2448
2449         BOOLEAN                                 BulkOutPending[6];      // used for total 6 bulkout pipe
2450         UCHAR                                   bulkResetPipeid;
2451         BOOLEAN                                 MgmtBulkPending;
2452         ULONG                                   bulkResetReq[6];
2453 #endif // RT2870 //
2454
2455         // resource for software backlog queues
2456         QUEUE_HEADER            TxSwQueue[NUM_OF_TX_RING];  // 4 AC + 1 HCCA
2457         NDIS_SPIN_LOCK          TxSwQueueLock[NUM_OF_TX_RING];  // TxSwQueue spinlock
2458
2459         RTMP_DMABUF             MgmtDescRing;                   // Shared memory for MGMT descriptors
2460         RTMP_MGMT_RING          MgmtRing;
2461         NDIS_SPIN_LOCK          MgmtRingLock;                   // Prio Ring spinlock
2462
2463
2464 /*****************************************************************************************/
2465 /*      Rx related parameters                                                           */
2466 /*****************************************************************************************/
2467
2468
2469 #ifdef RT2870
2470         RX_CONTEXT                              RxContext[RX_RING_SIZE];  // 1 for redundant multiple IRP bulk in.
2471         NDIS_SPIN_LOCK                  BulkInLock;                             // BulkIn spinlock for 4 ACs
2472         UCHAR                                   PendingRx;                              // The Maxima pending Rx value should be        RX_RING_SIZE.
2473         UCHAR                                   NextRxBulkInIndex;              // Indicate the current RxContext Index which hold by Host controller.
2474         UCHAR                                   NextRxBulkInReadIndex;  // Indicate the current RxContext Index which driver can read & process it.
2475         ULONG                                   NextRxBulkInPosition;   // Want to contatenate 2 URB buffer while 1st is bulkin failed URB. This Position is 1st URB TransferLength.
2476         ULONG                                   TransferBufferLength;   // current length of the packet buffer
2477         ULONG                                   ReadPosition;                   // current read position in a packet buffer
2478 #endif // RT2870 //
2479
2480
2481 /*****************************************************************************************/
2482 /*      ASIC related parameters                                                          */
2483 /*****************************************************************************************/
2484         UINT32                  MACVersion;             // MAC version. Record rt2860C(0x28600100) or rt2860D (0x28600101)..
2485
2486         // ---------------------------
2487         // E2PROM
2488         // ---------------------------
2489         ULONG                   EepromVersion;          // byte 0: version, byte 1: revision, byte 2~3: unused
2490         UCHAR                   EEPROMAddressNum;       // 93c46=6  93c66=8
2491         USHORT                  EEPROMDefaultValue[NUM_EEPROM_BBP_PARMS];
2492         ULONG                   FirmwareVersion;        // byte 0: Minor version, byte 1: Major version, otherwise unused.
2493
2494         // ---------------------------
2495         // BBP Control
2496         // ---------------------------
2497         UCHAR                   BbpWriteLatch[140];     // record last BBP register value written via BBP_IO_WRITE/BBP_IO_WRITE_VY_REG_ID
2498         UCHAR                   BbpRssiToDbmDelta;
2499         BBP_R66_TUNING          BbpTuning;
2500
2501         // ----------------------------
2502         // RFIC control
2503         // ----------------------------
2504         UCHAR                   RfIcType;       // RFIC_xxx
2505         ULONG                   RfFreqOffset;   // Frequency offset for channel switching
2506         RTMP_RF_REGS            LatchRfRegs;    // latch th latest RF programming value since RF IC doesn't support READ
2507
2508         EEPROM_ANTENNA_STRUC    Antenna;                            // Since ANtenna definition is different for a & g. We need to save it for future reference.
2509         EEPROM_NIC_CONFIG2_STRUC    NicConfig2;
2510
2511         // This soft Rx Antenna Diversity mechanism is used only when user set
2512         // RX Antenna = DIVERSITY ON
2513         SOFT_RX_ANT_DIVERSITY   RxAnt;
2514
2515         UCHAR                   RFProgSeq;
2516         CHANNEL_TX_POWER        TxPower[MAX_NUM_OF_CHANNELS];       // Store Tx power value for all channels.
2517         CHANNEL_TX_POWER        ChannelList[MAX_NUM_OF_CHANNELS];   // list all supported channels for site survey
2518         CHANNEL_11J_TX_POWER    TxPower11J[MAX_NUM_OF_11JCHANNELS];       // 802.11j channel and bw
2519         CHANNEL_11J_TX_POWER    ChannelList11J[MAX_NUM_OF_11JCHANNELS];   // list all supported channels for site survey
2520
2521         UCHAR                   ChannelListNum;                     // number of channel in ChannelList[]
2522         UCHAR                                   Bbp94;
2523         BOOLEAN                                 BbpForCCK;
2524         ULONG           Tx20MPwrCfgABand[5];
2525         ULONG           Tx20MPwrCfgGBand[5];
2526         ULONG           Tx40MPwrCfgABand[5];
2527         ULONG           Tx40MPwrCfgGBand[5];
2528
2529         BOOLEAN     bAutoTxAgcA;                // Enable driver auto Tx Agc control
2530         UCHAR       TssiRefA;                                   // Store Tssi reference value as 25 temperature.
2531         UCHAR       TssiPlusBoundaryA[5];               // Tssi boundary for increase Tx power to compensate.
2532         UCHAR       TssiMinusBoundaryA[5];              // Tssi boundary for decrease Tx power to compensate.
2533         UCHAR       TxAgcStepA;                                 // Store Tx TSSI delta increment / decrement value
2534         CHAR            TxAgcCompensateA;                       // Store the compensation (TxAgcStep * (idx-1))
2535
2536         BOOLEAN     bAutoTxAgcG;                // Enable driver auto Tx Agc control
2537         UCHAR       TssiRefG;                                   // Store Tssi reference value as 25 temperature.
2538         UCHAR       TssiPlusBoundaryG[5];               // Tssi boundary for increase Tx power to compensate.
2539         UCHAR       TssiMinusBoundaryG[5];              // Tssi boundary for decrease Tx power to compensate.
2540         UCHAR       TxAgcStepG;                                 // Store Tx TSSI delta increment / decrement value
2541         CHAR            TxAgcCompensateG;                       // Store the compensation (TxAgcStep * (idx-1))
2542
2543         //+++For RT2870, the parameteres is start from BGRssiOffset1 ~ BGRssiOffset3
2544         CHAR            BGRssiOffset0;                          // Store B/G RSSI#0 Offset value on EEPROM 0x46h
2545         CHAR            BGRssiOffset1;                          // Store B/G RSSI#1 Offset value
2546         CHAR            BGRssiOffset2;                          // Store B/G RSSI#2 Offset value
2547         //---
2548
2549         //+++For RT2870, the parameteres is start from ARssiOffset1 ~ ARssiOffset3
2550         CHAR            ARssiOffset0;                           // Store A RSSI#0 Offset value on EEPROM 0x4Ah
2551         CHAR            ARssiOffset1;                           // Store A RSSI#1 Offset value
2552         CHAR            ARssiOffset2;                           // Store A RSSI#2 Offset value
2553         //---
2554
2555         CHAR            BLNAGain;                                       // Store B/G external LNA#0 value on EEPROM 0x44h
2556         CHAR            ALNAGain0;                                      // Store A external LNA#0 value for ch36~64
2557         CHAR            ALNAGain1;                                      // Store A external LNA#1 value for ch100~128
2558         CHAR            ALNAGain2;                                      // Store A external LNA#2 value for ch132~165
2559
2560         // ----------------------------
2561         // LED control
2562         // ----------------------------
2563         MCU_LEDCS_STRUC         LedCntl;
2564         USHORT                          Led1;   // read from EEPROM 0x3c
2565         USHORT                          Led2;   // EEPROM 0x3e
2566         USHORT                          Led3;   // EEPROM 0x40
2567         UCHAR                           LedIndicatorStregth;
2568         UCHAR                           RssiSingalstrengthOffet;
2569     BOOLEAN                             bLedOnScanning;
2570         UCHAR                           LedStatus;
2571
2572 /*****************************************************************************************/
2573 /*      802.11 related parameters                                                        */
2574 /*****************************************************************************************/
2575         // outgoing BEACON frame buffer and corresponding TXD
2576         TXWI_STRUC                      BeaconTxWI;
2577         PUCHAR                                          BeaconBuf;
2578         USHORT                                          BeaconOffset[HW_BEACON_MAX_COUNT];
2579
2580         // pre-build PS-POLL and NULL frame upon link up. for efficiency purpose.
2581         PSPOLL_FRAME                    PsPollFrame;
2582         HEADER_802_11                   NullFrame;
2583
2584 #ifdef RT2870
2585         TX_CONTEXT                              BeaconContext[BEACON_RING_SIZE];
2586         TX_CONTEXT                              NullContext;
2587         TX_CONTEXT                              PsPollContext;
2588         TX_CONTEXT                              RTSContext;
2589 #endif // RT2870 //
2590
2591
2592
2593 //=========AP===========
2594
2595
2596 //=======STA===========
2597 /* Modified by Wu Xi-Kun 4/21/2006 */
2598         // -----------------------------------------------
2599         // STA specific configuration & operation status
2600         // used only when pAd->OpMode == OPMODE_STA
2601         // -----------------------------------------------
2602         STA_ADMIN_CONFIG        StaCfg;           // user desired settings
2603         STA_ACTIVE_CONFIG       StaActive;         // valid only when ADHOC_ON(pAd) || INFRA_ON(pAd)
2604         CHAR                    nickname[IW_ESSID_MAX_SIZE+1]; // nickname, only used in the iwconfig i/f
2605         NDIS_MEDIA_STATE        PreMediaState;
2606
2607 //=======Common===========
2608         // OP mode: either AP or STA
2609         UCHAR                   OpMode;                     // OPMODE_STA, OPMODE_AP
2610
2611         NDIS_MEDIA_STATE        IndicateMediaState;                     // Base on Indication state, default is NdisMediaStateDisConnected
2612
2613
2614         // configuration: read from Registry & E2PROM
2615         BOOLEAN                 bLocalAdminMAC;             // Use user changed MAC
2616         UCHAR                   PermanentAddress[MAC_ADDR_LEN];    // Factory default MAC address
2617         UCHAR                   CurrentAddress[MAC_ADDR_LEN];      // User changed MAC address
2618
2619         // ------------------------------------------------------
2620         // common configuration to both OPMODE_STA and OPMODE_AP
2621         // ------------------------------------------------------
2622         COMMON_CONFIG           CommonCfg;
2623         MLME_STRUCT             Mlme;
2624
2625         // AP needs those vaiables for site survey feature.
2626         MLME_AUX                MlmeAux;           // temporary settings used during MLME state machine
2627         BSS_TABLE               ScanTab;           // store the latest SCAN result
2628
2629         //About MacTab, the sta driver will use #0 and #1 for multicast and AP.
2630         MAC_TABLE                 MacTab;     // ASIC on-chip WCID entry table.  At TX, ASIC always use key according to this on-chip table.
2631         NDIS_SPIN_LOCK          MacTabLock;
2632
2633 #ifdef DOT11_N_SUPPORT
2634         BA_TABLE                        BATable;
2635 #endif // DOT11_N_SUPPORT //
2636         NDIS_SPIN_LOCK          BATabLock;
2637         RALINK_TIMER_STRUCT RECBATimer;
2638
2639         // encryption/decryption KEY tables
2640         CIPHER_KEY              SharedKey[MAX_MBSSID_NUM][4]; // STA always use SharedKey[BSS0][0..3]
2641
2642                 // RX re-assembly buffer for fragmentation
2643         FRAGMENT_FRAME          FragFrame;                  // Frame storage for fragment frame
2644
2645         // various Counters
2646         COUNTER_802_3           Counters8023;               // 802.3 counters
2647         COUNTER_802_11          WlanCounters;               // 802.11 MIB counters
2648         COUNTER_RALINK          RalinkCounters;             // Ralink propriety counters
2649         COUNTER_DRS             DrsCounters;                // counters for Dynamic TX Rate Switching
2650         PRIVATE_STRUC           PrivateInfo;                // Private information & counters
2651
2652         // flags, see fRTMP_ADAPTER_xxx flags
2653         ULONG                   Flags;                      // Represent current device status
2654
2655         // current TX sequence #
2656         USHORT                  Sequence;
2657
2658         // Control disconnect / connect event generation
2659         //+++Didn't used anymore
2660         ULONG                   LinkDownTime;
2661         //---
2662         ULONG                   LastRxRate;
2663         ULONG                   LastTxRate;
2664         //+++Used only for Station
2665         BOOLEAN                 bConfigChanged;         // Config Change flag for the same SSID setting
2666         //---
2667
2668         ULONG                   ExtraInfo;              // Extra information for displaying status
2669         ULONG                   SystemErrorBitmap;      // b0: E2PROM version error
2670
2671         //+++Didn't used anymore
2672         ULONG                   MacIcVersion;           // MAC/BBP serial interface issue solved after ver.D
2673         //---
2674
2675         // ---------------------------
2676         // System event log
2677         // ---------------------------
2678         RT_802_11_EVENT_TABLE   EventTab;
2679
2680
2681         BOOLEAN         HTCEnable;
2682
2683         /*****************************************************************************************/
2684         /*      Statistic related parameters                                                     */
2685         /*****************************************************************************************/
2686 #ifdef RT2870
2687         ULONG                                           BulkOutDataOneSecCount;
2688         ULONG                                           BulkInDataOneSecCount;
2689         ULONG                                           BulkLastOneSecCount; // BulkOutDataOneSecCount + BulkInDataOneSecCount
2690         ULONG                                           watchDogRxCnt;
2691         ULONG                                           watchDogRxOverFlowCnt;
2692         ULONG                                           watchDogTxPendingCnt[NUM_OF_TX_RING];
2693 #endif // RT2870 //
2694
2695         BOOLEAN                                         bUpdateBcnCntDone;
2696         ULONG                                           watchDogMacDeadlock;    // prevent MAC/BBP into deadlock condition
2697         // ----------------------------
2698         // DEBUG paramerts
2699         // ----------------------------
2700         //ULONG         DebugSetting[4];
2701         BOOLEAN         bBanAllBaSetup;
2702         BOOLEAN         bPromiscuous;
2703
2704         // ----------------------------
2705         // rt2860c emulation-use Parameters
2706         // ----------------------------
2707         ULONG           rtsaccu[30];
2708         ULONG           ctsaccu[30];
2709         ULONG           cfendaccu[30];
2710         ULONG           bacontent[16];
2711         ULONG           rxint[RX_RING_SIZE+1];
2712         UCHAR           rcvba[60];
2713         BOOLEAN         bLinkAdapt;
2714         BOOLEAN         bForcePrintTX;
2715         BOOLEAN         bForcePrintRX;
2716         BOOLEAN         bDisablescanning;               //defined in RT2870 USB
2717         BOOLEAN         bStaFifoTest;
2718         BOOLEAN         bProtectionTest;
2719         BOOLEAN         bHCCATest;
2720         BOOLEAN         bGenOneHCCA;
2721         BOOLEAN         bBroadComHT;
2722         //+++Following add from RT2870 USB.
2723         ULONG           BulkOutReq;
2724         ULONG           BulkOutComplete;
2725         ULONG           BulkOutCompleteOther;
2726         ULONG           BulkOutCompleteCancel;  // seems not use now?
2727         ULONG           BulkInReq;
2728         ULONG           BulkInComplete;
2729         ULONG           BulkInCompleteFail;
2730         //---
2731
2732     struct wificonf                     WIFItestbed;
2733
2734 #ifdef DOT11_N_SUPPORT
2735         struct reordering_mpdu_pool mpdu_blk_pool;
2736 #endif // DOT11_N_SUPPORT //
2737
2738         ULONG                                   OneSecondnonBEpackets;          // record non BE packets per second
2739
2740 #if WIRELESS_EXT >= 12
2741     struct iw_statistics    iw_stats;
2742 #endif
2743
2744         struct net_device_stats stats;
2745
2746         ULONG                                   TbttTickCount;
2747 #ifdef PCI_MSI_SUPPORT
2748         BOOLEAN                                 HaveMsi;
2749 #endif // PCI_MSI_SUPPORT //
2750
2751
2752         UCHAR                                   is_on;
2753
2754 #define TIME_BASE                       (1000000/OS_HZ)
2755 #define TIME_ONE_SECOND         (1000000/TIME_BASE)
2756         UCHAR                                   flg_be_adjust;
2757         ULONG                                   be_adjust_last_time;
2758
2759
2760 #ifdef IKANOS_VX_1X0
2761         struct IKANOS_TX_INFO   IkanosTxInfo;
2762         struct IKANOS_TX_INFO   IkanosRxInfo[MAX_MBSSID_NUM + MAX_WDS_ENTRY + MAX_APCLI_NUM + MAX_MESH_NUM];
2763 #endif // IKANOS_VX_1X0 //
2764
2765
2766 #ifdef DBG_DIAGNOSE
2767         RtmpDiagStruct  DiagStruct;
2768 #endif // DBG_DIAGNOSE //
2769
2770
2771         UINT8                                   PM_FlgSuspend;
2772 } RTMP_ADAPTER, *PRTMP_ADAPTER;
2773
2774 //
2775 // Cisco IAPP format
2776 //
2777 typedef struct  _CISCO_IAPP_CONTENT_
2778 {
2779         USHORT     Length;        //IAPP Length
2780         UCHAR      MessageType;      //IAPP type
2781         UCHAR      FunctionCode;     //IAPP function type
2782         UCHAR      DestinaionMAC[MAC_ADDR_LEN];
2783         UCHAR      SourceMAC[MAC_ADDR_LEN];
2784         USHORT     Tag;           //Tag(element IE) - Adjacent AP report
2785         USHORT     TagLength;     //Length of element not including 4 byte header
2786         UCHAR      OUI[4];           //0x00, 0x40, 0x96, 0x00
2787         UCHAR      PreviousAP[MAC_ADDR_LEN];       //MAC Address of access point
2788         USHORT     Channel;
2789         USHORT     SsidLen;
2790         UCHAR      Ssid[MAX_LEN_OF_SSID];
2791         USHORT     Seconds;          //Seconds that the client has been disassociated.
2792 } CISCO_IAPP_CONTENT, *PCISCO_IAPP_CONTENT;
2793
2794 #define DELAYINTMASK            0x0003fffb
2795 #define INTMASK                         0x0003fffb
2796 #define IndMask                         0x0003fffc
2797 #define RxINT                           0x00000005      // Delayed Rx or indivi rx
2798 #define TxDataInt                       0x000000fa      // Delayed Tx or indivi tx
2799 #define TxMgmtInt                       0x00000102      // Delayed Tx or indivi tx
2800 #define TxCoherent                      0x00020000      // tx coherent
2801 #define RxCoherent                      0x00010000      // rx coherent
2802 #define McuCommand                      0x00000200      // mcu
2803 #define PreTBTTInt                      0x00001000      // Pre-TBTT interrupt
2804 #define TBTTInt                         0x00000800              // TBTT interrupt
2805 #define GPTimeOutInt                    0x00008000              // GPtimeout interrupt
2806 #define AutoWakeupInt           0x00004000              // AutoWakeupInt interrupt
2807 #define FifoStaFullInt                  0x00002000      //  fifo statistics full interrupt
2808
2809
2810 typedef struct _RX_BLK_
2811 {
2812 //      RXD_STRUC               RxD; // sample
2813         RT28XX_RXD_STRUC        RxD;
2814         PRXWI_STRUC                     pRxWI;
2815         PHEADER_802_11          pHeader;
2816         PNDIS_PACKET            pRxPacket;
2817         UCHAR                           *pData;
2818         USHORT                          DataSize;
2819         USHORT                          Flags;
2820         UCHAR                           UserPriority;   // for calculate TKIP MIC using
2821 } RX_BLK;
2822
2823
2824 #define RX_BLK_SET_FLAG(_pRxBlk, _flag)         (_pRxBlk->Flags |= _flag)
2825 #define RX_BLK_TEST_FLAG(_pRxBlk, _flag)        (_pRxBlk->Flags & _flag)
2826 #define RX_BLK_CLEAR_FLAG(_pRxBlk, _flag)       (_pRxBlk->Flags &= ~(_flag))
2827
2828
2829 #define fRX_WDS                 0x0001
2830 #define fRX_AMSDU       0x0002
2831 #define fRX_ARALINK     0x0004
2832 #define fRX_HTC         0x0008
2833 #define fRX_PAD         0x0010
2834 #define fRX_AMPDU       0x0020
2835 #define fRX_QOS                 0x0040
2836 #define fRX_INFRA               0x0080
2837 #define fRX_EAP                 0x0100
2838 #define fRX_MESH                0x0200
2839 #define fRX_APCLI               0x0400
2840 #define fRX_DLS                 0x0800
2841 #define fRX_WPI                 0x1000
2842
2843 #define LENGTH_AMSDU_SUBFRAMEHEAD       14
2844 #define LENGTH_ARALINK_SUBFRAMEHEAD     14
2845 #define LENGTH_ARALINK_HEADER_FIELD      2
2846
2847 #define TX_UNKOWN_FRAME                 0x00
2848 #define TX_MCAST_FRAME                  0x01
2849 #define TX_LEGACY_FRAME                 0x02
2850 #define TX_AMPDU_FRAME                  0x04
2851 #define TX_AMSDU_FRAME                  0x08
2852 #define TX_RALINK_FRAME                 0x10
2853 #define TX_FRAG_FRAME                   0x20
2854
2855
2856 //      Currently the sizeof(TX_BLK) is 148 bytes.
2857 typedef struct _TX_BLK_
2858 {
2859         UCHAR                           QueIdx;
2860         UCHAR                           TxFrameType;                            // Indicate the Transmission type of the all frames in one batch
2861         UCHAR                           TotalFrameNum;                          // Total frame number want to send-out in one batch
2862         USHORT                          TotalFragNum;                           // Total frame fragments required in one batch
2863         USHORT                          TotalFrameLen;                          // Total length of all frames want to send-out in one batch
2864
2865         QUEUE_HEADER            TxPacketList;
2866         MAC_TABLE_ENTRY         *pMacEntry;                                     // NULL: packet with 802.11 RA field is multicast/broadcast address
2867         HTTRANSMIT_SETTING      *pTransmit;
2868
2869         // Following structure used for the characteristics of a specific packet.
2870         PNDIS_PACKET            pPacket;
2871         PUCHAR                          pSrcBufHeader;                          // Reference to the head of sk_buff->data
2872         PUCHAR                          pSrcBufData;                            // Reference to the sk_buff->data, will changed depends on hanlding progresss
2873         UINT                            SrcBufLen;                                      // Length of packet payload which not including Layer 2 header
2874         PUCHAR                          pExtraLlcSnapEncap;                     // NULL means no extra LLC/SNAP is required
2875         UCHAR                           HeaderBuf[80];                          // TempBuffer for TX_INFO + TX_WI + 802.11 Header + padding + AMSDU SubHeader + LLC/SNAP
2876         UCHAR                           MpduHeaderLen;                          // 802.11 header length NOT including the padding
2877         UCHAR                           HdrPadLen;                                      // recording Header Padding Length;
2878         UCHAR                           apidx;                                          // The interface associated to this packet
2879         UCHAR                           Wcid;                                           // The MAC entry associated to this packet
2880         UCHAR                           UserPriority;                           // priority class of packet
2881         UCHAR                           FrameGap;                                       // what kind of IFS this packet use
2882         UCHAR                           MpduReqNum;                                     // number of fragments of this frame
2883         UCHAR                           TxRate;                                         // TODO: Obsoleted? Should change to MCS?
2884         UCHAR                           CipherAlg;                                      // cipher alogrithm
2885         PCIPHER_KEY                     pKey;
2886
2887
2888
2889         USHORT                          Flags;                                          //See following definitions for detail.
2890
2891         //YOU SHOULD NOT TOUCH IT! Following parameters are used for hardware-depended layer.
2892         ULONG                           Priv;                                           // Hardware specific value saved in here.
2893 } TX_BLK, *PTX_BLK;
2894
2895
2896 #define fTX_bRtsRequired                0x0001  // Indicate if need send RTS frame for protection. Not used in RT2860/RT2870.
2897 #define fTX_bAckRequired        0x0002  // the packet need ack response
2898 #define fTX_bPiggyBack                  0x0004  // Legacy device use Piggback or not
2899 #define fTX_bHTRate             0x0008  // allow to use HT rate
2900 //#define fTX_bForceLowRate       0x0010        // force to use Low Rate
2901 #define fTX_bForceNonQoS        0x0010  // force to transmit frame without WMM-QoS in HT mode
2902 #define fTX_bAllowFrag          0x0020  // allow to fragment the packet, A-MPDU, A-MSDU, A-Ralink is not allowed to fragment
2903 #define fTX_bMoreData                   0x0040  // there are more data packets in PowerSave Queue
2904 #define fTX_bWMM                                0x0080  // QOS Data
2905
2906 #define fTX_bClearEAPFrame              0x0100
2907
2908 #define TX_BLK_ASSIGN_FLAG(_pTxBlk, _flag, value)       \
2909                 do {                                                                            \
2910                         if (value)                                                              \
2911                                 (_pTxBlk->Flags |= _flag)                       \
2912                         else                                                                    \
2913                                 (_pTxBlk->Flags &= ~(_flag))            \
2914                 }while(0)
2915
2916 #define TX_BLK_SET_FLAG(_pTxBlk, _flag)         (_pTxBlk->Flags |= _flag)
2917 #define TX_BLK_TEST_FLAG(_pTxBlk, _flag)        (((_pTxBlk->Flags & _flag) == _flag) ? 1 : 0)
2918 #define TX_BLK_CLEAR_FLAG(_pTxBlk, _flag)       (_pTxBlk->Flags &= ~(_flag))
2919
2920
2921
2922
2923
2924 //------------------------------------------------------------------------------------------
2925
2926 static inline VOID ConvertMulticastIP2MAC(
2927         IN PUCHAR pIpAddr,
2928         IN PUCHAR *ppMacAddr,
2929         IN UINT16 ProtoType)
2930 {
2931         if (pIpAddr == NULL)
2932                 return;
2933
2934         if (ppMacAddr == NULL || *ppMacAddr == NULL)
2935                 return;
2936
2937         switch (ProtoType)
2938         {
2939                 case ETH_P_IPV6:
2940 //                      memset(*ppMacAddr, 0, ETH_LENGTH_OF_ADDRESS);
2941                         *(*ppMacAddr) = 0x33;
2942                         *(*ppMacAddr + 1) = 0x33;
2943                         *(*ppMacAddr + 2) = pIpAddr[12];
2944                         *(*ppMacAddr + 3) = pIpAddr[13];
2945                         *(*ppMacAddr + 4) = pIpAddr[14];
2946                         *(*ppMacAddr + 5) = pIpAddr[15];
2947                         break;
2948
2949                 case ETH_P_IP:
2950                 default:
2951 //                      memset(*ppMacAddr, 0, ETH_LENGTH_OF_ADDRESS);
2952                         *(*ppMacAddr) = 0x01;
2953                         *(*ppMacAddr + 1) = 0x00;
2954                         *(*ppMacAddr + 2) = 0x5e;
2955                         *(*ppMacAddr + 3) = pIpAddr[1] & 0x7f;
2956                         *(*ppMacAddr + 4) = pIpAddr[2];
2957                         *(*ppMacAddr + 5) = pIpAddr[3];
2958                         break;
2959         }
2960
2961         return;
2962 }
2963
2964 BOOLEAN RTMPCheckForHang(
2965         IN  NDIS_HANDLE MiniportAdapterContext
2966         );
2967
2968 VOID  RTMPHalt(
2969         IN  NDIS_HANDLE MiniportAdapterContext
2970         );
2971
2972 //
2973 //  Private routines in rtmp_init.c
2974 //
2975 NDIS_STATUS RTMPAllocAdapterBlock(
2976         IN PVOID                        handle,
2977         OUT PRTMP_ADAPTER   *ppAdapter
2978         );
2979
2980 NDIS_STATUS RTMPAllocTxRxRingMemory(
2981         IN  PRTMP_ADAPTER   pAd
2982         );
2983
2984 NDIS_STATUS RTMPFindAdapter(
2985         IN  PRTMP_ADAPTER   pAd,
2986         IN  NDIS_HANDLE     WrapperConfigurationContext
2987         );
2988
2989 NDIS_STATUS     RTMPReadParametersHook(
2990         IN      PRTMP_ADAPTER pAd
2991         );
2992
2993 VOID RTMPFreeAdapter(
2994         IN  PRTMP_ADAPTER   pAd
2995         );
2996
2997 NDIS_STATUS NICReadRegParameters(
2998         IN  PRTMP_ADAPTER       pAd,
2999         IN  NDIS_HANDLE         WrapperConfigurationContext
3000         );
3001
3002 #ifdef RT2870
3003 VOID NICInitRT30xxRFRegisters(
3004         IN PRTMP_ADAPTER pAd);
3005 #endif // RT2870 //
3006
3007 VOID NICReadEEPROMParameters(
3008         IN  PRTMP_ADAPTER       pAd,
3009         IN      PUCHAR                          mac_addr);
3010
3011 VOID NICInitAsicFromEEPROM(
3012         IN  PRTMP_ADAPTER       pAd);
3013
3014 VOID NICInitTxRxRingAndBacklogQueue(
3015         IN  PRTMP_ADAPTER   pAd);
3016
3017 NDIS_STATUS NICInitializeAdapter(
3018         IN  PRTMP_ADAPTER   pAd,
3019         IN   BOOLEAN    bHardReset);
3020
3021 NDIS_STATUS NICInitializeAsic(
3022         IN  PRTMP_ADAPTER   pAd,
3023         IN  BOOLEAN             bHardReset);
3024
3025 VOID NICIssueReset(
3026         IN  PRTMP_ADAPTER   pAd);
3027
3028 VOID RTMPRingCleanUp(
3029         IN  PRTMP_ADAPTER   pAd,
3030         IN  UCHAR           RingType);
3031
3032 VOID RxTest(
3033         IN  PRTMP_ADAPTER   pAd);
3034
3035 NDIS_STATUS DbgSendPacket(
3036         IN  PRTMP_ADAPTER   pAd,
3037         IN  PNDIS_PACKET    pPacket);
3038
3039 VOID UserCfgInit(
3040         IN  PRTMP_ADAPTER   pAd);
3041
3042 VOID NICResetFromError(
3043         IN  PRTMP_ADAPTER   pAd);
3044
3045 VOID NICEraseFirmware(
3046         IN PRTMP_ADAPTER pAd);
3047
3048 NDIS_STATUS NICLoadFirmware(
3049         IN  PRTMP_ADAPTER   pAd);
3050
3051 NDIS_STATUS NICLoadRateSwitchingParams(
3052         IN PRTMP_ADAPTER pAd);
3053
3054 BOOLEAN NICCheckForHang(
3055         IN  PRTMP_ADAPTER   pAd);
3056
3057 VOID NICUpdateFifoStaCounters(
3058         IN PRTMP_ADAPTER pAd);
3059
3060 VOID NICUpdateRawCounters(
3061         IN  PRTMP_ADAPTER   pAd);
3062
3063 #if 0
3064 ULONG RTMPEqualMemory(
3065         IN  PVOID   pSrc1,
3066         IN  PVOID   pSrc2,
3067         IN  ULONG   Length);
3068 #endif
3069
3070 ULONG   RTMPNotAllZero(
3071         IN      PVOID   pSrc1,
3072         IN      ULONG   Length);
3073
3074 VOID RTMPZeroMemory(
3075         IN  PVOID   pSrc,
3076         IN  ULONG   Length);
3077
3078 ULONG RTMPCompareMemory(
3079         IN  PVOID   pSrc1,
3080         IN  PVOID   pSrc2,
3081         IN  ULONG   Length);
3082
3083 VOID RTMPMoveMemory(
3084         OUT PVOID   pDest,
3085         IN  PVOID   pSrc,
3086         IN  ULONG   Length);
3087
3088 VOID AtoH(
3089         char    *src,
3090         UCHAR   *dest,
3091         int             destlen);
3092
3093 UCHAR BtoH(
3094         char ch);
3095
3096 VOID RTMPPatchMacBbpBug(
3097         IN  PRTMP_ADAPTER   pAd);
3098
3099 VOID RTMPPatchCardBus(
3100         IN      PRTMP_ADAPTER   pAdapter);
3101
3102 VOID RTMPPatchRalinkCardBus(
3103         IN      PRTMP_ADAPTER   pAdapter,
3104         IN      ULONG                   Bus);
3105
3106 ULONG RTMPReadCBConfig(
3107         IN      ULONG   Bus,
3108         IN      ULONG   Slot,
3109         IN      ULONG   Func,
3110         IN      ULONG   Offset);
3111
3112 VOID RTMPWriteCBConfig(
3113         IN      ULONG   Bus,
3114         IN      ULONG   Slot,
3115         IN      ULONG   Func,
3116         IN      ULONG   Offset,
3117         IN      ULONG   Value);
3118
3119 VOID RTMPInitTimer(
3120         IN  PRTMP_ADAPTER           pAd,
3121         IN  PRALINK_TIMER_STRUCT    pTimer,
3122         IN  PVOID                   pTimerFunc,
3123         IN      PVOID                                   pData,
3124         IN  BOOLEAN                 Repeat);
3125
3126 VOID RTMPSetTimer(
3127         IN  PRALINK_TIMER_STRUCT    pTimer,
3128         IN  ULONG                   Value);
3129
3130
3131 VOID RTMPModTimer(
3132         IN      PRALINK_TIMER_STRUCT    pTimer,
3133         IN      ULONG                                   Value);
3134
3135 VOID RTMPCancelTimer(
3136         IN  PRALINK_TIMER_STRUCT    pTimer,
3137         OUT BOOLEAN                 *pCancelled);
3138
3139 VOID RTMPSetLED(
3140         IN PRTMP_ADAPTER        pAd,
3141         IN UCHAR                        Status);
3142
3143 VOID RTMPSetSignalLED(
3144         IN PRTMP_ADAPTER        pAd,
3145         IN NDIS_802_11_RSSI Dbm);
3146
3147 VOID RTMPEnableRxTx(
3148         IN PRTMP_ADAPTER        pAd);
3149
3150 //
3151 // prototype in action.c
3152 //
3153 VOID ActionStateMachineInit(
3154     IN  PRTMP_ADAPTER   pAd,
3155     IN  STATE_MACHINE *S,
3156     OUT STATE_MACHINE_FUNC Trans[]);
3157
3158 VOID MlmeADDBAAction(
3159     IN PRTMP_ADAPTER pAd,
3160     IN MLME_QUEUE_ELEM *Elem);
3161
3162 VOID MlmeDELBAAction(
3163     IN PRTMP_ADAPTER pAd,
3164     IN MLME_QUEUE_ELEM *Elem);
3165
3166 VOID MlmeDLSAction(
3167     IN PRTMP_ADAPTER pAd,
3168     IN MLME_QUEUE_ELEM *Elem);
3169
3170 VOID MlmeInvalidAction(
3171     IN PRTMP_ADAPTER pAd,
3172     IN MLME_QUEUE_ELEM *Elem);
3173
3174 VOID MlmeQOSAction(
3175     IN PRTMP_ADAPTER pAd,
3176     IN MLME_QUEUE_ELEM *Elem);
3177
3178 #ifdef DOT11_N_SUPPORT
3179 VOID PeerAddBAReqAction(
3180         IN PRTMP_ADAPTER pAd,
3181         IN MLME_QUEUE_ELEM *Elem);
3182
3183 VOID PeerAddBARspAction(
3184         IN PRTMP_ADAPTER pAd,
3185         IN MLME_QUEUE_ELEM *Elem);
3186
3187 VOID PeerDelBAAction(
3188         IN PRTMP_ADAPTER pAd,
3189         IN MLME_QUEUE_ELEM *Elem);
3190
3191 VOID PeerBAAction(
3192     IN PRTMP_ADAPTER pAd,
3193     IN MLME_QUEUE_ELEM *Elem);
3194 #endif // DOT11_N_SUPPORT //
3195
3196 VOID SendPSMPAction(
3197         IN PRTMP_ADAPTER        pAd,
3198         IN UCHAR                        Wcid,
3199         IN UCHAR                        Psmp);
3200
3201 VOID PeerRMAction(
3202         IN PRTMP_ADAPTER pAd,
3203         IN MLME_QUEUE_ELEM *Elem);
3204
3205 VOID PeerPublicAction(
3206         IN PRTMP_ADAPTER pAd,
3207         IN MLME_QUEUE_ELEM *Elem);
3208
3209 VOID StaPublicAction(
3210         IN PRTMP_ADAPTER pAd,
3211         IN UCHAR Bss2040Coexist);
3212
3213 VOID PeerBSSTranAction(
3214         IN PRTMP_ADAPTER pAd,
3215         IN MLME_QUEUE_ELEM *Elem);
3216
3217 #ifdef DOT11_N_SUPPORT
3218 VOID PeerHTAction(
3219         IN PRTMP_ADAPTER pAd,
3220         IN MLME_QUEUE_ELEM *Elem);
3221 #endif // DOT11_N_SUPPORT //
3222
3223 VOID PeerQOSAction(
3224     IN PRTMP_ADAPTER pAd,
3225     IN MLME_QUEUE_ELEM *Elem);
3226
3227 #ifdef DOT11_N_SUPPORT
3228 VOID RECBATimerTimeout(
3229     IN PVOID SystemSpecific1,
3230     IN PVOID FunctionContext,
3231     IN PVOID SystemSpecific2,
3232     IN PVOID SystemSpecific3);
3233
3234 VOID ORIBATimerTimeout(
3235         IN      PRTMP_ADAPTER   pAd);
3236
3237 VOID SendRefreshBAR(
3238         IN      PRTMP_ADAPTER   pAd,
3239         IN      MAC_TABLE_ENTRY *pEntry);
3240 #endif // DOT11_N_SUPPORT //
3241
3242 VOID ActHeaderInit(
3243     IN  PRTMP_ADAPTER   pAd,
3244     IN OUT PHEADER_802_11 pHdr80211,
3245     IN PUCHAR Addr1,
3246     IN PUCHAR Addr2,
3247     IN PUCHAR Addr3);
3248
3249 VOID BarHeaderInit(
3250         IN      PRTMP_ADAPTER   pAd,
3251         IN OUT PFRAME_BAR pCntlBar,
3252         IN PUCHAR pDA,
3253         IN PUCHAR pSA);
3254
3255 VOID InsertActField(
3256         IN PRTMP_ADAPTER pAd,
3257         OUT PUCHAR pFrameBuf,
3258         OUT PULONG pFrameLen,
3259         IN UINT8 Category,
3260         IN UINT8 ActCode);
3261
3262 BOOLEAN QosBADataParse(
3263         IN PRTMP_ADAPTER        pAd,
3264         IN BOOLEAN bAMSDU,
3265         IN PUCHAR p8023Header,
3266         IN UCHAR        WCID,
3267         IN UCHAR        TID,
3268         IN USHORT Sequence,
3269         IN UCHAR DataOffset,
3270         IN USHORT Datasize,
3271         IN UINT   CurRxIndex);
3272
3273 #ifdef DOT11_N_SUPPORT
3274 BOOLEAN CntlEnqueueForRecv(
3275     IN  PRTMP_ADAPTER   pAd,
3276         IN ULONG Wcid,
3277     IN ULONG MsgLen,
3278         IN PFRAME_BA_REQ pMsg);
3279
3280 VOID BaAutoManSwitch(
3281         IN      PRTMP_ADAPTER   pAd);
3282 #endif // DOT11_N_SUPPORT //
3283
3284 VOID HTIOTCheck(
3285         IN      PRTMP_ADAPTER   pAd,
3286         IN    UCHAR     BatRecIdx);
3287
3288 //
3289 // Private routines in rtmp_data.c
3290 //
3291 BOOLEAN RTMPHandleRxDoneInterrupt(
3292         IN  PRTMP_ADAPTER   pAd);
3293
3294 VOID RTMPHandleTxDoneInterrupt(
3295         IN  PRTMP_ADAPTER   pAd);
3296
3297 BOOLEAN RTMPHandleTxRingDmaDoneInterrupt(
3298         IN  PRTMP_ADAPTER   pAd,
3299         IN  INT_SOURCE_CSR_STRUC TxRingBitmap);
3300
3301 VOID RTMPHandleMgmtRingDmaDoneInterrupt(
3302         IN  PRTMP_ADAPTER   pAd);
3303
3304 VOID RTMPHandleTBTTInterrupt(
3305         IN  PRTMP_ADAPTER   pAd);
3306
3307 VOID RTMPHandlePreTBTTInterrupt(
3308         IN  PRTMP_ADAPTER   pAd);
3309
3310 void RTMPHandleTwakeupInterrupt(
3311         IN PRTMP_ADAPTER pAd);
3312
3313 VOID    RTMPHandleRxCoherentInterrupt(
3314         IN      PRTMP_ADAPTER   pAd);
3315
3316 BOOLEAN TxFrameIsAggregatible(
3317         IN  PRTMP_ADAPTER   pAd,
3318         IN  PUCHAR          pPrevAddr1,
3319         IN  PUCHAR          p8023hdr);
3320
3321 BOOLEAN PeerIsAggreOn(
3322     IN  PRTMP_ADAPTER   pAd,
3323     IN  ULONG          TxRate,
3324     IN  PMAC_TABLE_ENTRY pMacEntry);
3325
3326 #if 0   // It's not be used
3327 HTTRANSMIT_SETTING  *GetTxMode(
3328         IN      PRTMP_ADAPTER   pAd,
3329         IN      TX_BLK                  *pTxBlk);
3330 #endif
3331
3332 NDIS_STATUS Sniff2BytesFromNdisBuffer(
3333         IN  PNDIS_BUFFER    pFirstBuffer,
3334         IN  UCHAR           DesiredOffset,
3335         OUT PUCHAR          pByte0,
3336         OUT PUCHAR          pByte1);
3337
3338 NDIS_STATUS STASendPacket(
3339         IN  PRTMP_ADAPTER   pAd,
3340         IN  PNDIS_PACKET    pPacket);
3341
3342 VOID STASendPackets(
3343         IN  NDIS_HANDLE     MiniportAdapterContext,
3344         IN  PPNDIS_PACKET   ppPacketArray,
3345         IN  UINT            NumberOfPackets);
3346
3347 VOID RTMPDeQueuePacket(
3348         IN  PRTMP_ADAPTER   pAd,
3349         IN      BOOLEAN                 bIntContext,
3350         IN  UCHAR                       QueIdx,
3351         IN      UCHAR                   Max_Tx_Packets);
3352
3353 NDIS_STATUS     RTMPHardTransmit(
3354         IN PRTMP_ADAPTER        pAd,
3355         IN PNDIS_PACKET         pPacket,
3356         IN  UCHAR                       QueIdx,
3357         OUT     PULONG                  pFreeTXDLeft);
3358
3359 NDIS_STATUS     STAHardTransmit(
3360         IN PRTMP_ADAPTER        pAd,
3361         IN TX_BLK                       *pTxBlk,
3362         IN  UCHAR                       QueIdx);
3363
3364 VOID STARxEAPOLFrameIndicate(
3365         IN      PRTMP_ADAPTER   pAd,
3366         IN      MAC_TABLE_ENTRY *pEntry,
3367         IN      RX_BLK                  *pRxBlk,
3368         IN      UCHAR                   FromWhichBSSID);
3369
3370 NDIS_STATUS RTMPFreeTXDRequest(
3371         IN  PRTMP_ADAPTER   pAd,
3372         IN  UCHAR           RingType,
3373         IN  UCHAR           NumberRequired,
3374         IN      PUCHAR          FreeNumberIs);
3375
3376 NDIS_STATUS MlmeHardTransmit(
3377         IN  PRTMP_ADAPTER   pAd,
3378         IN  UCHAR       QueIdx,
3379         IN  PNDIS_PACKET    pPacket);
3380
3381 NDIS_STATUS MlmeHardTransmitMgmtRing(
3382         IN  PRTMP_ADAPTER   pAd,
3383         IN  UCHAR       QueIdx,
3384         IN  PNDIS_PACKET    pPacket);
3385
3386 NDIS_STATUS MlmeHardTransmitTxRing(
3387         IN  PRTMP_ADAPTER   pAd,
3388         IN  UCHAR       QueIdx,
3389         IN  PNDIS_PACKET    pPacket);
3390
3391 USHORT  RTMPCalcDuration(
3392         IN  PRTMP_ADAPTER   pAd,
3393         IN  UCHAR           Rate,
3394         IN  ULONG           Size);
3395
3396 VOID RTMPWriteTxWI(
3397         IN      PRTMP_ADAPTER   pAd,
3398         IN      PTXWI_STRUC             pTxWI,
3399         IN  BOOLEAN             FRAG,
3400         IN  BOOLEAN             CFACK,
3401         IN  BOOLEAN             InsTimestamp,
3402         IN      BOOLEAN                 AMPDU,
3403         IN      BOOLEAN                 Ack,
3404         IN      BOOLEAN                 NSeq,           // HW new a sequence.
3405         IN      UCHAR                   BASize,
3406         IN      UCHAR                   WCID,
3407         IN      ULONG                   Length,
3408         IN  UCHAR               PID,
3409         IN      UCHAR                   TID,
3410         IN      UCHAR                   TxRate,
3411         IN      UCHAR                   Txopmode,
3412         IN      BOOLEAN                 CfAck,
3413         IN      HTTRANSMIT_SETTING      *pTransmit);
3414
3415
3416 VOID RTMPWriteTxWI_Data(
3417         IN      PRTMP_ADAPTER           pAd,
3418         IN      OUT PTXWI_STRUC         pTxWI,
3419         IN      TX_BLK                          *pTxBlk);
3420
3421
3422 VOID RTMPWriteTxWI_Cache(
3423         IN      PRTMP_ADAPTER           pAd,
3424         IN      OUT PTXWI_STRUC         pTxWI,
3425         IN      TX_BLK                          *pTxBlk);
3426
3427 VOID RTMPWriteTxDescriptor(
3428         IN      PRTMP_ADAPTER   pAd,
3429         IN      PTXD_STRUC              pTxD,
3430         IN      BOOLEAN                 bWIV,
3431         IN      UCHAR                   QSEL);
3432
3433 VOID RTMPSuspendMsduTransmission(
3434         IN  PRTMP_ADAPTER   pAd);
3435
3436 VOID RTMPResumeMsduTransmission(
3437         IN  PRTMP_ADAPTER   pAd);
3438
3439 NDIS_STATUS MiniportMMRequest(
3440         IN  PRTMP_ADAPTER   pAd,
3441         IN      UCHAR                   QueIdx,
3442         IN      PUCHAR                  pData,
3443         IN  UINT            Length);
3444
3445 NDIS_STATUS MiniportDataMMRequest(
3446          IN  PRTMP_ADAPTER   pAd,
3447          IN  UCHAR           QueIdx,
3448          IN  PUCHAR          pData,
3449          IN  UINT            Length);
3450
3451 VOID RTMPSendNullFrame(
3452         IN  PRTMP_ADAPTER   pAd,
3453         IN  UCHAR           TxRate,
3454         IN      BOOLEAN                 bQosNull);
3455
3456 VOID RTMPSendDisassociationFrame(
3457         IN      PRTMP_ADAPTER   pAd);
3458
3459 VOID RTMPSendRTSFrame(
3460         IN  PRTMP_ADAPTER   pAd,
3461         IN  PUCHAR          pDA,
3462         IN      unsigned int    NextMpduSize,
3463         IN  UCHAR           TxRate,
3464         IN  UCHAR           RTSRate,
3465         IN  USHORT          AckDuration,
3466         IN  UCHAR           QueIdx,
3467         IN  UCHAR                       FrameGap);
3468
3469
3470 NDIS_STATUS RTMPApplyPacketFilter(
3471         IN  PRTMP_ADAPTER   pAd,
3472         IN  PRT28XX_RXD_STRUC      pRxD,
3473         IN  PHEADER_802_11  pHeader);
3474
3475 PQUEUE_HEADER   RTMPCheckTxSwQueue(
3476         IN  PRTMP_ADAPTER   pAd,
3477         OUT UCHAR           *QueIdx);
3478
3479 VOID RTMPReportMicError(
3480         IN  PRTMP_ADAPTER   pAd,
3481         IN  PCIPHER_KEY     pWpaKey);
3482
3483 VOID    WpaMicFailureReportFrame(
3484         IN  PRTMP_ADAPTER    pAd,
3485         IN  MLME_QUEUE_ELEM *Elem);
3486
3487 VOID    WpaDisassocApAndBlockAssoc(
3488     IN  PVOID SystemSpecific1,
3489     IN  PVOID FunctionContext,
3490     IN  PVOID SystemSpecific2,
3491     IN  PVOID SystemSpecific3);
3492
3493 NDIS_STATUS RTMPCloneNdisPacket(
3494         IN  PRTMP_ADAPTER   pAd,
3495         IN      BOOLEAN    pInsAMSDUHdr,
3496         IN  PNDIS_PACKET    pInPacket,
3497         OUT PNDIS_PACKET   *ppOutPacket);
3498
3499 NDIS_STATUS RTMPAllocateNdisPacket(
3500         IN  PRTMP_ADAPTER   pAd,
3501         IN  PNDIS_PACKET    *pPacket,
3502         IN  PUCHAR          pHeader,
3503         IN  UINT            HeaderLen,
3504         IN  PUCHAR          pData,
3505         IN  UINT            DataLen);
3506
3507 VOID RTMPFreeNdisPacket(
3508         IN  PRTMP_ADAPTER   pAd,
3509         IN  PNDIS_PACKET    pPacket);
3510
3511 BOOLEAN RTMPFreeTXDUponTxDmaDone(
3512         IN PRTMP_ADAPTER    pAd,
3513         IN UCHAR            QueIdx);
3514
3515 BOOLEAN RTMPCheckDHCPFrame(
3516         IN      PRTMP_ADAPTER   pAd,
3517         IN      PNDIS_PACKET    pPacket);
3518
3519
3520 BOOLEAN RTMPCheckEtherType(
3521         IN      PRTMP_ADAPTER   pAd,
3522         IN      PNDIS_PACKET    pPacket);
3523
3524
3525 VOID RTMPCckBbpTuning(
3526         IN      PRTMP_ADAPTER   pAd,
3527         IN      UINT                    TxRate);
3528
3529 //
3530 // Private routines in rtmp_wep.c
3531 //
3532 VOID RTMPInitWepEngine(
3533         IN  PRTMP_ADAPTER   pAd,
3534         IN  PUCHAR          pKey,
3535         IN  UCHAR           KeyId,
3536         IN  UCHAR           KeyLen,
3537         IN  PUCHAR          pDest);
3538
3539 VOID RTMPEncryptData(
3540         IN  PRTMP_ADAPTER   pAd,
3541         IN  PUCHAR          pSrc,
3542         IN  PUCHAR          pDest,
3543         IN  UINT            Len);
3544
3545 BOOLEAN RTMPDecryptData(
3546         IN      PRTMP_ADAPTER   pAdapter,
3547         IN      PUCHAR                  pSrc,
3548         IN      UINT                    Len,
3549         IN      UINT                    idx);
3550
3551 BOOLEAN RTMPSoftDecryptWEP(
3552         IN PRTMP_ADAPTER        pAd,
3553         IN PUCHAR                       pData,
3554         IN ULONG                        DataByteCnt,
3555         IN PCIPHER_KEY          pGroupKey);
3556
3557 VOID RTMPSetICV(
3558         IN  PRTMP_ADAPTER   pAd,
3559         IN  PUCHAR          pDest);
3560
3561 VOID ARCFOUR_INIT(
3562         IN  PARCFOURCONTEXT Ctx,
3563         IN  PUCHAR          pKey,
3564         IN  UINT            KeyLen);
3565
3566 UCHAR   ARCFOUR_BYTE(
3567         IN  PARCFOURCONTEXT     Ctx);
3568
3569 VOID ARCFOUR_DECRYPT(
3570         IN  PARCFOURCONTEXT Ctx,
3571         IN  PUCHAR          pDest,
3572         IN  PUCHAR          pSrc,
3573         IN  UINT            Len);
3574
3575 VOID ARCFOUR_ENCRYPT(
3576         IN  PARCFOURCONTEXT Ctx,
3577         IN  PUCHAR          pDest,
3578         IN  PUCHAR          pSrc,
3579         IN  UINT            Len);
3580
3581 VOID WPAARCFOUR_ENCRYPT(
3582         IN  PARCFOURCONTEXT Ctx,
3583         IN  PUCHAR          pDest,
3584         IN  PUCHAR          pSrc,
3585         IN  UINT            Len);
3586
3587 UINT RTMP_CALC_FCS32(
3588         IN  UINT   Fcs,
3589         IN  PUCHAR  Cp,
3590         IN  INT     Len);
3591
3592 //
3593 // MLME routines
3594 //
3595
3596 // Asic/RF/BBP related functions
3597
3598 VOID AsicAdjustTxPower(
3599         IN PRTMP_ADAPTER pAd);
3600
3601 VOID    AsicUpdateProtect(
3602         IN              PRTMP_ADAPTER   pAd,
3603         IN              USHORT                  OperaionMode,
3604         IN              UCHAR                   SetMask,
3605         IN              BOOLEAN                 bDisableBGProtect,
3606         IN              BOOLEAN                 bNonGFExist);
3607
3608 VOID AsicSwitchChannel(
3609         IN  PRTMP_ADAPTER   pAd,
3610         IN      UCHAR                   Channel,
3611         IN      BOOLEAN                 bScan);
3612
3613 VOID AsicLockChannel(
3614         IN PRTMP_ADAPTER pAd,
3615         IN UCHAR Channel) ;
3616
3617 VOID AsicAntennaSelect(
3618         IN  PRTMP_ADAPTER   pAd,
3619         IN  UCHAR           Channel);
3620
3621 VOID AsicAntennaSetting(
3622         IN      PRTMP_ADAPTER   pAd,
3623         IN      ABGBAND_STATE   BandState);
3624
3625 VOID AsicRfTuningExec(
3626         IN PVOID SystemSpecific1,
3627         IN PVOID FunctionContext,
3628         IN PVOID SystemSpecific2,
3629         IN PVOID SystemSpecific3);
3630
3631 VOID AsicSleepThenAutoWakeup(
3632         IN  PRTMP_ADAPTER   pAd,
3633         IN  USHORT TbttNumToNextWakeUp);
3634
3635 VOID AsicForceSleep(
3636         IN PRTMP_ADAPTER pAd);
3637
3638 VOID AsicForceWakeup(
3639         IN PRTMP_ADAPTER pAd,
3640         IN BOOLEAN    bFromTx);
3641
3642 VOID AsicSetBssid(
3643         IN  PRTMP_ADAPTER   pAd,
3644         IN  PUCHAR pBssid);
3645
3646 VOID AsicSetMcastWC(
3647         IN PRTMP_ADAPTER pAd);
3648
3649 #if 0   // removed by AlbertY
3650 VOID AsicSetBssidWC(
3651         IN PRTMP_ADAPTER pAd,
3652         IN PUCHAR pBssid);
3653 #endif
3654
3655 VOID AsicDelWcidTab(
3656         IN PRTMP_ADAPTER pAd,
3657         IN UCHAR        Wcid);
3658
3659 VOID AsicEnableRDG(
3660         IN PRTMP_ADAPTER pAd);
3661
3662 VOID AsicDisableRDG(
3663         IN PRTMP_ADAPTER pAd);
3664
3665 VOID AsicDisableSync(
3666         IN  PRTMP_ADAPTER   pAd);
3667
3668 VOID AsicEnableBssSync(
3669         IN  PRTMP_ADAPTER   pAd);
3670
3671 VOID AsicEnableIbssSync(
3672         IN  PRTMP_ADAPTER   pAd);
3673
3674 VOID AsicSetEdcaParm(
3675         IN PRTMP_ADAPTER pAd,
3676         IN PEDCA_PARM    pEdcaParm);
3677
3678 VOID AsicSetSlotTime(
3679         IN PRTMP_ADAPTER pAd,
3680         IN BOOLEAN bUseShortSlotTime);
3681
3682 #if 0
3683 VOID AsicAddWcidCipherEntry(
3684         IN PRTMP_ADAPTER pAd,
3685         IN UCHAR                 WCID,
3686         IN UCHAR                 BssIndex,
3687         IN UCHAR                 KeyTable,
3688         IN UCHAR                 CipherAlg,
3689         IN PUCHAR                pAddr,
3690         IN CIPHER_KEY            *pCipherKey);
3691 #endif
3692
3693 VOID AsicAddSharedKeyEntry(
3694         IN PRTMP_ADAPTER pAd,
3695         IN UCHAR         BssIndex,
3696         IN UCHAR         KeyIdx,
3697         IN UCHAR         CipherAlg,
3698         IN PUCHAR        pKey,
3699         IN PUCHAR        pTxMic,
3700         IN PUCHAR        pRxMic);
3701
3702 VOID AsicRemoveSharedKeyEntry(
3703         IN PRTMP_ADAPTER pAd,
3704         IN UCHAR         BssIndex,
3705         IN UCHAR         KeyIdx);
3706
3707 VOID AsicUpdateWCIDAttribute(
3708         IN PRTMP_ADAPTER pAd,
3709         IN USHORT               WCID,
3710         IN UCHAR                BssIndex,
3711         IN UCHAR        CipherAlg,
3712         IN BOOLEAN              bUsePairewiseKeyTable);
3713
3714 VOID AsicUpdateWCIDIVEIV(
3715         IN PRTMP_ADAPTER pAd,
3716         IN USHORT               WCID,
3717         IN ULONG        uIV,
3718         IN ULONG        uEIV);
3719
3720 VOID AsicUpdateRxWCIDTable(
3721         IN PRTMP_ADAPTER pAd,
3722         IN USHORT               WCID,
3723         IN PUCHAR        pAddr);
3724
3725 VOID AsicAddKeyEntry(
3726         IN PRTMP_ADAPTER pAd,
3727         IN USHORT               WCID,
3728         IN UCHAR                BssIndex,
3729         IN UCHAR                KeyIdx,
3730         IN PCIPHER_KEY  pCipherKey,
3731         IN BOOLEAN              bUsePairewiseKeyTable,
3732         IN BOOLEAN              bTxKey);
3733
3734 VOID AsicAddPairwiseKeyEntry(
3735         IN PRTMP_ADAPTER pAd,
3736         IN PUCHAR        pAddr,
3737         IN UCHAR                WCID,
3738         IN CIPHER_KEY            *pCipherKey);
3739
3740 VOID AsicRemovePairwiseKeyEntry(
3741         IN PRTMP_ADAPTER  pAd,
3742         IN UCHAR                 BssIdx,
3743         IN UCHAR                 Wcid);
3744
3745 BOOLEAN AsicSendCommandToMcu(
3746         IN PRTMP_ADAPTER pAd,
3747         IN UCHAR         Command,
3748         IN UCHAR         Token,
3749         IN UCHAR         Arg0,
3750         IN UCHAR         Arg1);
3751
3752
3753 VOID MacAddrRandomBssid(
3754         IN  PRTMP_ADAPTER   pAd,
3755         OUT PUCHAR pAddr);
3756
3757 VOID MgtMacHeaderInit(
3758         IN  PRTMP_ADAPTER     pAd,
3759         IN OUT PHEADER_802_11 pHdr80211,
3760         IN UCHAR SubType,
3761         IN UCHAR ToDs,
3762         IN PUCHAR pDA,
3763         IN PUCHAR pBssid);
3764
3765 VOID MlmeRadioOff(
3766         IN PRTMP_ADAPTER pAd);
3767
3768 VOID MlmeRadioOn(
3769         IN PRTMP_ADAPTER pAd);
3770
3771
3772 VOID BssTableInit(
3773         IN BSS_TABLE *Tab);
3774
3775 #ifdef DOT11_N_SUPPORT
3776 VOID BATableInit(
3777         IN PRTMP_ADAPTER pAd,
3778     IN BA_TABLE *Tab);
3779 #endif // DOT11_N_SUPPORT //
3780
3781 ULONG BssTableSearch(
3782         IN BSS_TABLE *Tab,
3783         IN PUCHAR pBssid,
3784         IN UCHAR Channel);
3785
3786 ULONG BssSsidTableSearch(
3787         IN BSS_TABLE *Tab,
3788         IN PUCHAR    pBssid,
3789         IN PUCHAR    pSsid,
3790         IN UCHAR     SsidLen,
3791         IN UCHAR     Channel);
3792
3793 ULONG BssTableSearchWithSSID(
3794         IN BSS_TABLE *Tab,
3795         IN PUCHAR    Bssid,
3796         IN PUCHAR    pSsid,
3797         IN UCHAR     SsidLen,
3798         IN UCHAR     Channel);
3799
3800 VOID BssTableDeleteEntry(
3801         IN OUT  PBSS_TABLE pTab,
3802         IN      PUCHAR pBssid,
3803         IN      UCHAR Channel);
3804
3805 #ifdef DOT11_N_SUPPORT
3806 VOID BATableDeleteORIEntry(
3807         IN OUT  PRTMP_ADAPTER pAd,
3808         IN              BA_ORI_ENTRY    *pBAORIEntry);
3809
3810 VOID BATableDeleteRECEntry(
3811         IN OUT  PRTMP_ADAPTER pAd,
3812         IN              BA_REC_ENTRY    *pBARECEntry);
3813
3814 VOID BATableTearORIEntry(
3815         IN OUT  PRTMP_ADAPTER pAd,
3816         IN              UCHAR TID,
3817         IN              UCHAR Wcid,
3818         IN              BOOLEAN bForceDelete,
3819         IN              BOOLEAN ALL);
3820
3821 VOID BATableTearRECEntry(
3822         IN OUT  PRTMP_ADAPTER pAd,
3823         IN              UCHAR TID,
3824         IN              UCHAR WCID,
3825         IN              BOOLEAN ALL);
3826 #endif // DOT11_N_SUPPORT //
3827
3828 VOID  BssEntrySet(
3829         IN  PRTMP_ADAPTER   pAd,
3830         OUT PBSS_ENTRY pBss,
3831         IN PUCHAR pBssid,
3832         IN CHAR Ssid[],
3833         IN UCHAR SsidLen,
3834         IN UCHAR BssType,
3835         IN USHORT BeaconPeriod,
3836         IN PCF_PARM CfParm,
3837         IN USHORT AtimWin,
3838         IN USHORT CapabilityInfo,
3839         IN UCHAR SupRate[],
3840         IN UCHAR SupRateLen,
3841         IN UCHAR ExtRate[],
3842         IN UCHAR ExtRateLen,
3843         IN HT_CAPABILITY_IE *pHtCapability,
3844         IN ADD_HT_INFO_IE *pAddHtInfo,  // AP might use this additional ht info IE
3845         IN UCHAR                        HtCapabilityLen,
3846         IN UCHAR                        AddHtInfoLen,
3847         IN UCHAR                        NewExtChanOffset,
3848         IN UCHAR Channel,
3849         IN CHAR Rssi,
3850         IN LARGE_INTEGER TimeStamp,
3851         IN UCHAR CkipFlag,
3852         IN PEDCA_PARM pEdcaParm,
3853         IN PQOS_CAPABILITY_PARM pQosCapability,
3854         IN PQBSS_LOAD_PARM pQbssLoad,
3855         IN USHORT LengthVIE,
3856         IN PNDIS_802_11_VARIABLE_IEs pVIE);
3857
3858 ULONG  BssTableSetEntry(
3859         IN  PRTMP_ADAPTER   pAd,
3860         OUT PBSS_TABLE pTab,
3861         IN PUCHAR pBssid,
3862         IN CHAR Ssid[],
3863         IN UCHAR SsidLen,
3864         IN UCHAR BssType,
3865         IN USHORT BeaconPeriod,
3866         IN CF_PARM *CfParm,
3867         IN USHORT AtimWin,
3868         IN USHORT CapabilityInfo,
3869         IN UCHAR SupRate[],
3870         IN UCHAR SupRateLen,
3871         IN UCHAR ExtRate[],
3872         IN UCHAR ExtRateLen,
3873         IN HT_CAPABILITY_IE *pHtCapability,
3874         IN ADD_HT_INFO_IE *pAddHtInfo,  // AP might use this additional ht info IE
3875         IN UCHAR                        HtCapabilityLen,
3876         IN UCHAR                        AddHtInfoLen,
3877         IN UCHAR                        NewExtChanOffset,
3878         IN UCHAR Channel,
3879         IN CHAR Rssi,
3880         IN LARGE_INTEGER TimeStamp,
3881         IN UCHAR CkipFlag,
3882         IN PEDCA_PARM pEdcaParm,
3883         IN PQOS_CAPABILITY_PARM pQosCapability,
3884         IN PQBSS_LOAD_PARM pQbssLoad,
3885         IN USHORT LengthVIE,
3886         IN PNDIS_802_11_VARIABLE_IEs pVIE);
3887
3888 #ifdef DOT11_N_SUPPORT
3889 VOID BATableInsertEntry(
3890     IN  PRTMP_ADAPTER   pAd,
3891         IN USHORT Aid,
3892     IN USHORT           TimeOutValue,
3893         IN USHORT               StartingSeq,
3894     IN UCHAR TID,
3895         IN UCHAR BAWinSize,
3896         IN UCHAR OriginatorStatus,
3897     IN BOOLEAN IsRecipient);
3898 #endif // DOT11_N_SUPPORT //
3899
3900 VOID BssTableSsidSort(
3901         IN  PRTMP_ADAPTER   pAd,
3902         OUT BSS_TABLE *OutTab,
3903         IN  CHAR Ssid[],
3904         IN  UCHAR SsidLen);
3905
3906 VOID  BssTableSortByRssi(
3907         IN OUT BSS_TABLE *OutTab);
3908
3909 VOID BssCipherParse(
3910         IN OUT  PBSS_ENTRY  pBss);
3911
3912 NDIS_STATUS  MlmeQueueInit(
3913         IN MLME_QUEUE *Queue);
3914
3915 VOID  MlmeQueueDestroy(
3916         IN MLME_QUEUE *Queue);
3917
3918 BOOLEAN MlmeEnqueue(
3919         IN PRTMP_ADAPTER pAd,
3920         IN ULONG Machine,
3921         IN ULONG MsgType,
3922         IN ULONG MsgLen,
3923         IN VOID *Msg);
3924
3925 BOOLEAN MlmeEnqueueForRecv(
3926         IN  PRTMP_ADAPTER   pAd,
3927         IN ULONG Wcid,
3928         IN ULONG TimeStampHigh,
3929         IN ULONG TimeStampLow,
3930         IN UCHAR Rssi0,
3931         IN UCHAR Rssi1,
3932         IN UCHAR Rssi2,
3933         IN ULONG MsgLen,
3934         IN PVOID Msg,
3935         IN UCHAR Signal);
3936
3937
3938 BOOLEAN MlmeDequeue(
3939         IN MLME_QUEUE *Queue,
3940         OUT MLME_QUEUE_ELEM **Elem);
3941
3942 VOID    MlmeRestartStateMachine(
3943         IN  PRTMP_ADAPTER   pAd);
3944
3945 BOOLEAN  MlmeQueueEmpty(
3946         IN MLME_QUEUE *Queue);
3947
3948 BOOLEAN  MlmeQueueFull(
3949         IN MLME_QUEUE *Queue);
3950
3951 BOOLEAN  MsgTypeSubst(
3952         IN PRTMP_ADAPTER pAd,
3953         IN PFRAME_802_11 pFrame,
3954         OUT INT *Machine,
3955         OUT INT *MsgType);
3956
3957 VOID StateMachineInit(
3958         IN STATE_MACHINE *Sm,
3959         IN STATE_MACHINE_FUNC Trans[],
3960         IN ULONG StNr,
3961         IN ULONG MsgNr,
3962         IN STATE_MACHINE_FUNC DefFunc,
3963         IN ULONG InitState,
3964         IN ULONG Base);
3965
3966 VOID StateMachineSetAction(
3967         IN STATE_MACHINE *S,
3968         IN ULONG St,
3969         ULONG Msg,
3970         IN STATE_MACHINE_FUNC F);
3971
3972 VOID StateMachinePerformAction(
3973         IN  PRTMP_ADAPTER   pAd,
3974         IN STATE_MACHINE *S,
3975         IN MLME_QUEUE_ELEM *Elem);
3976
3977 VOID Drop(
3978         IN  PRTMP_ADAPTER   pAd,
3979         IN MLME_QUEUE_ELEM *Elem);
3980
3981 VOID AssocStateMachineInit(
3982         IN  PRTMP_ADAPTER   pAd,
3983         IN  STATE_MACHINE *Sm,
3984         OUT STATE_MACHINE_FUNC Trans[]);
3985
3986 VOID ReassocTimeout(
3987         IN PVOID SystemSpecific1,
3988         IN PVOID FunctionContext,
3989         IN PVOID SystemSpecific2,
3990         IN PVOID SystemSpecific3);
3991
3992 VOID AssocTimeout(
3993         IN PVOID SystemSpecific1,
3994         IN PVOID FunctionContext,
3995         IN PVOID SystemSpecific2,
3996         IN PVOID SystemSpecific3);
3997
3998 VOID DisassocTimeout(
3999         IN PVOID SystemSpecific1,
4000         IN PVOID FunctionContext,
4001         IN PVOID SystemSpecific2,
4002         IN PVOID SystemSpecific3);
4003
4004 //----------------------------------------------
4005 VOID MlmeDisassocReqAction(
4006         IN  PRTMP_ADAPTER   pAd,
4007         IN  MLME_QUEUE_ELEM *Elem);
4008
4009 VOID MlmeAssocReqAction(
4010         IN  PRTMP_ADAPTER   pAd,
4011         IN  MLME_QUEUE_ELEM *Elem);
4012
4013 VOID MlmeReassocReqAction(
4014         IN  PRTMP_ADAPTER   pAd,
4015         IN  MLME_QUEUE_ELEM *Elem);
4016
4017 VOID MlmeDisassocReqAction(
4018         IN  PRTMP_ADAPTER   pAd,
4019         IN  MLME_QUEUE_ELEM *Elem);
4020
4021 VOID PeerAssocRspAction(
4022         IN  PRTMP_ADAPTER   pAd,
4023         IN  MLME_QUEUE_ELEM *Elem);
4024
4025 VOID PeerReassocRspAction(
4026         IN  PRTMP_ADAPTER   pAd,
4027         IN  MLME_QUEUE_ELEM *Elem);
4028
4029 VOID PeerDisassocAction(
4030         IN  PRTMP_ADAPTER   pAd,
4031         IN  MLME_QUEUE_ELEM *Elem);
4032
4033 VOID DisassocTimeoutAction(
4034         IN  PRTMP_ADAPTER   pAd,
4035         IN  MLME_QUEUE_ELEM *Elem);
4036
4037 VOID AssocTimeoutAction(
4038         IN  PRTMP_ADAPTER   pAd,
4039         IN  MLME_QUEUE_ELEM *Elem);
4040
4041 VOID  ReassocTimeoutAction(
4042         IN  PRTMP_ADAPTER   pAd,
4043         IN  MLME_QUEUE_ELEM *Elem);
4044
4045 VOID  Cls3errAction(
4046         IN  PRTMP_ADAPTER   pAd,
4047         IN  PUCHAR pAddr);
4048
4049 VOID SwitchBetweenWepAndCkip(
4050         IN PRTMP_ADAPTER pAd);
4051
4052 VOID  InvalidStateWhenAssoc(
4053         IN  PRTMP_ADAPTER   pAd,
4054         IN  MLME_QUEUE_ELEM *Elem);
4055
4056 VOID  InvalidStateWhenReassoc(
4057         IN  PRTMP_ADAPTER   pAd,
4058         IN  MLME_QUEUE_ELEM *Elem);
4059
4060 VOID InvalidStateWhenDisassociate(
4061         IN  PRTMP_ADAPTER pAd,
4062         IN  MLME_QUEUE_ELEM *Elem);
4063
4064 #ifdef RT2870
4065 VOID MlmeCntlConfirm(
4066         IN PRTMP_ADAPTER pAd,
4067         IN ULONG MsgType,
4068         IN USHORT Msg);
4069 #endif // RT2870 //
4070
4071 VOID  ComposePsPoll(
4072         IN  PRTMP_ADAPTER   pAd);
4073
4074 VOID  ComposeNullFrame(
4075         IN  PRTMP_ADAPTER pAd);
4076
4077 VOID  AssocPostProc(
4078         IN  PRTMP_ADAPTER   pAd,
4079         IN  PUCHAR pAddr2,
4080         IN  USHORT CapabilityInfo,
4081         IN  USHORT Aid,
4082         IN  UCHAR SupRate[],
4083         IN  UCHAR SupRateLen,
4084         IN  UCHAR ExtRate[],
4085         IN  UCHAR ExtRateLen,
4086         IN PEDCA_PARM pEdcaParm,
4087         IN HT_CAPABILITY_IE             *pHtCapability,
4088         IN  UCHAR HtCapabilityLen,
4089         IN ADD_HT_INFO_IE               *pAddHtInfo);
4090
4091 VOID AuthStateMachineInit(
4092         IN  PRTMP_ADAPTER   pAd,
4093         IN PSTATE_MACHINE sm,
4094         OUT STATE_MACHINE_FUNC Trans[]);
4095
4096 VOID AuthTimeout(
4097         IN PVOID SystemSpecific1,
4098         IN PVOID FunctionContext,
4099         IN PVOID SystemSpecific2,
4100         IN PVOID SystemSpecific3);
4101
4102 VOID MlmeAuthReqAction(
4103         IN  PRTMP_ADAPTER   pAd,
4104         IN  MLME_QUEUE_ELEM *Elem);
4105
4106 VOID PeerAuthRspAtSeq2Action(
4107         IN  PRTMP_ADAPTER   pAd,
4108         IN  MLME_QUEUE_ELEM *Elem);
4109
4110 VOID PeerAuthRspAtSeq4Action(
4111         IN  PRTMP_ADAPTER   pAd,
4112         IN  MLME_QUEUE_ELEM *Elem);
4113
4114 VOID AuthTimeoutAction(
4115         IN  PRTMP_ADAPTER   pAd,
4116         IN  MLME_QUEUE_ELEM *Elem);
4117
4118 VOID Cls2errAction(
4119         IN  PRTMP_ADAPTER   pAd,
4120         IN  PUCHAR pAddr);
4121
4122 VOID MlmeDeauthReqAction(
4123         IN  PRTMP_ADAPTER   pAd,
4124         IN  MLME_QUEUE_ELEM *Elem);
4125
4126 VOID InvalidStateWhenAuth(
4127         IN  PRTMP_ADAPTER   pAd,
4128         IN  MLME_QUEUE_ELEM *Elem);
4129
4130 //=============================================
4131
4132 VOID AuthRspStateMachineInit(
4133         IN  PRTMP_ADAPTER   pAd,
4134         IN  PSTATE_MACHINE Sm,
4135         IN  STATE_MACHINE_FUNC Trans[]);
4136
4137 VOID PeerDeauthAction(
4138         IN PRTMP_ADAPTER pAd,
4139         IN MLME_QUEUE_ELEM *Elem);
4140
4141 VOID PeerAuthSimpleRspGenAndSend(
4142         IN  PRTMP_ADAPTER   pAd,
4143         IN  PHEADER_802_11  pHdr80211,
4144         IN  USHORT Alg,
4145         IN  USHORT Seq,
4146         IN  USHORT Reason,
4147         IN  USHORT Status);
4148
4149 //
4150 // Private routines in dls.c
4151 //
4152
4153 //========================================
4154
4155 VOID SyncStateMachineInit(
4156         IN  PRTMP_ADAPTER   pAd,
4157         IN  STATE_MACHINE *Sm,
4158         OUT STATE_MACHINE_FUNC Trans[]);
4159
4160 VOID BeaconTimeout(
4161         IN PVOID SystemSpecific1,
4162         IN PVOID FunctionContext,
4163         IN PVOID SystemSpecific2,
4164         IN PVOID SystemSpecific3);
4165
4166 VOID ScanTimeout(
4167         IN PVOID SystemSpecific1,
4168         IN PVOID FunctionContext,
4169         IN PVOID SystemSpecific2,
4170         IN PVOID SystemSpecific3);
4171
4172 VOID MlmeScanReqAction(
4173         IN  PRTMP_ADAPTER   pAd,
4174         IN  MLME_QUEUE_ELEM *Elem);
4175
4176 VOID InvalidStateWhenScan(
4177         IN  PRTMP_ADAPTER   pAd,
4178         IN  MLME_QUEUE_ELEM *Elem);
4179
4180 VOID InvalidStateWhenJoin(
4181         IN  PRTMP_ADAPTER   pAd,
4182         IN  MLME_QUEUE_ELEM *Elem);
4183
4184 VOID InvalidStateWhenStart(
4185         IN  PRTMP_ADAPTER   pAd,
4186         IN  MLME_QUEUE_ELEM *Elem);
4187
4188 VOID PeerBeacon(
4189         IN  PRTMP_ADAPTER   pAd,
4190         IN  MLME_QUEUE_ELEM *Elem);
4191
4192 VOID EnqueueProbeRequest(
4193         IN PRTMP_ADAPTER pAd);
4194
4195 BOOLEAN ScanRunning(
4196                 IN PRTMP_ADAPTER pAd);
4197 //=========================================
4198
4199 VOID MlmeCntlInit(
4200         IN  PRTMP_ADAPTER   pAd,
4201         IN  STATE_MACHINE *S,
4202         OUT STATE_MACHINE_FUNC Trans[]);
4203
4204 VOID MlmeCntlMachinePerformAction(
4205         IN  PRTMP_ADAPTER   pAd,
4206         IN  STATE_MACHINE *S,
4207         IN  MLME_QUEUE_ELEM *Elem);
4208
4209 VOID CntlIdleProc(
4210         IN  PRTMP_ADAPTER   pAd,
4211         IN  MLME_QUEUE_ELEM *Elem);
4212
4213 VOID CntlOidScanProc(
4214         IN  PRTMP_ADAPTER pAd,
4215         IN  MLME_QUEUE_ELEM *Elem);
4216
4217 VOID CntlOidSsidProc(
4218         IN  PRTMP_ADAPTER   pAd,
4219         IN  MLME_QUEUE_ELEM * Elem);
4220
4221 VOID CntlOidRTBssidProc(
4222         IN  PRTMP_ADAPTER   pAd,
4223         IN  MLME_QUEUE_ELEM * Elem);
4224
4225 VOID CntlMlmeRoamingProc(
4226         IN  PRTMP_ADAPTER   pAd,
4227         IN  MLME_QUEUE_ELEM * Elem);
4228
4229 VOID CntlWaitDisassocProc(
4230         IN  PRTMP_ADAPTER   pAd,
4231         IN  MLME_QUEUE_ELEM *Elem);
4232
4233 VOID CntlWaitJoinProc(
4234         IN  PRTMP_ADAPTER   pAd,
4235         IN  MLME_QUEUE_ELEM *Elem);
4236
4237 VOID CntlWaitReassocProc(
4238         IN  PRTMP_ADAPTER   pAd,
4239         IN  MLME_QUEUE_ELEM *Elem);
4240
4241 VOID CntlWaitStartProc(
4242         IN  PRTMP_ADAPTER   pAd,
4243         IN  MLME_QUEUE_ELEM *Elem);
4244
4245 VOID CntlWaitAuthProc(
4246         IN  PRTMP_ADAPTER   pAd,
4247         IN  MLME_QUEUE_ELEM *Elem);
4248
4249 VOID CntlWaitAuthProc2(
4250         IN  PRTMP_ADAPTER pAd,
4251         IN  MLME_QUEUE_ELEM *Elem);
4252
4253 VOID CntlWaitAssocProc(
4254         IN  PRTMP_ADAPTER   pAd,
4255         IN  MLME_QUEUE_ELEM *Elem);
4256
4257 VOID LinkUp(
4258         IN  PRTMP_ADAPTER   pAd,
4259         IN  UCHAR BssType);
4260
4261 VOID LinkDown(
4262         IN  PRTMP_ADAPTER   pAd,
4263         IN  BOOLEAN         IsReqFromAP);
4264
4265 VOID IterateOnBssTab(
4266         IN  PRTMP_ADAPTER   pAd);
4267
4268 VOID IterateOnBssTab2(
4269         IN  PRTMP_ADAPTER   pAd);;
4270
4271 VOID JoinParmFill(
4272         IN  PRTMP_ADAPTER   pAd,
4273         IN  OUT MLME_JOIN_REQ_STRUCT *JoinReq,
4274         IN  ULONG BssIdx);
4275
4276 VOID AssocParmFill(
4277         IN  PRTMP_ADAPTER   pAd,
4278         IN OUT MLME_ASSOC_REQ_STRUCT *AssocReq,
4279         IN  PUCHAR pAddr,
4280         IN  USHORT CapabilityInfo,
4281         IN  ULONG Timeout,
4282         IN  USHORT ListenIntv);
4283
4284 VOID ScanParmFill(
4285         IN  PRTMP_ADAPTER   pAd,
4286         IN  OUT MLME_SCAN_REQ_STRUCT *ScanReq,
4287         IN  CHAR Ssid[],
4288         IN  UCHAR SsidLen,
4289         IN  UCHAR BssType,
4290         IN  UCHAR ScanType);
4291
4292 VOID DisassocParmFill(
4293         IN  PRTMP_ADAPTER   pAd,
4294         IN  OUT MLME_DISASSOC_REQ_STRUCT *DisassocReq,
4295         IN  PUCHAR pAddr,
4296         IN  USHORT Reason);
4297
4298 VOID StartParmFill(
4299         IN  PRTMP_ADAPTER   pAd,
4300         IN  OUT MLME_START_REQ_STRUCT *StartReq,
4301         IN  CHAR Ssid[],
4302         IN  UCHAR SsidLen);
4303
4304 VOID AuthParmFill(
4305         IN  PRTMP_ADAPTER   pAd,
4306         IN  OUT MLME_AUTH_REQ_STRUCT *AuthReq,
4307         IN  PUCHAR pAddr,
4308         IN  USHORT Alg);
4309
4310 VOID EnqueuePsPoll(
4311         IN  PRTMP_ADAPTER   pAd);
4312
4313 VOID EnqueueBeaconFrame(
4314         IN  PRTMP_ADAPTER   pAd);
4315
4316 VOID MlmeJoinReqAction(
4317         IN  PRTMP_ADAPTER   pAd,
4318         IN  MLME_QUEUE_ELEM *Elem);
4319
4320 VOID MlmeScanReqAction(
4321         IN  PRTMP_ADAPTER   pAd,
4322         IN  MLME_QUEUE_ELEM *Elem);
4323
4324 VOID MlmeStartReqAction(
4325         IN  PRTMP_ADAPTER   pAd,
4326         IN  MLME_QUEUE_ELEM *Elem);
4327
4328 VOID ScanTimeoutAction(
4329         IN  PRTMP_ADAPTER   pAd,
4330         IN  MLME_QUEUE_ELEM *Elem);
4331
4332 VOID BeaconTimeoutAtJoinAction(
4333         IN  PRTMP_ADAPTER   pAd,
4334         IN  MLME_QUEUE_ELEM *Elem);
4335
4336 VOID PeerBeaconAtScanAction(
4337         IN  PRTMP_ADAPTER   pAd,
4338         IN  MLME_QUEUE_ELEM *Elem);
4339
4340 VOID PeerBeaconAtJoinAction(
4341         IN  PRTMP_ADAPTER   pAd,
4342         IN  MLME_QUEUE_ELEM *Elem);
4343
4344 VOID PeerBeacon(
4345         IN  PRTMP_ADAPTER   pAd,
4346         IN  MLME_QUEUE_ELEM *Elem);
4347
4348 VOID PeerProbeReqAction(
4349         IN  PRTMP_ADAPTER pAd,
4350         IN  MLME_QUEUE_ELEM *Elem);
4351
4352 VOID ScanNextChannel(
4353         IN  PRTMP_ADAPTER   pAd);
4354
4355 ULONG MakeIbssBeacon(
4356         IN  PRTMP_ADAPTER   pAd);
4357
4358 VOID CCXAdjacentAPReport(
4359         IN  PRTMP_ADAPTER   pAd);
4360
4361 BOOLEAN MlmeScanReqSanity(
4362         IN  PRTMP_ADAPTER   pAd,
4363         IN  VOID *Msg,
4364         IN  ULONG MsgLen,
4365         OUT UCHAR *BssType,
4366         OUT CHAR ssid[],
4367         OUT UCHAR *SsidLen,
4368         OUT UCHAR *ScanType);
4369
4370 BOOLEAN PeerBeaconAndProbeRspSanity(
4371         IN  PRTMP_ADAPTER   pAd,
4372         IN  VOID *Msg,
4373         IN  ULONG MsgLen,
4374         IN  UCHAR MsgChannel,
4375         OUT PUCHAR pAddr2,
4376         OUT PUCHAR pBssid,
4377         OUT CHAR Ssid[],
4378         OUT UCHAR *pSsidLen,
4379         OUT UCHAR *pBssType,
4380         OUT USHORT *pBeaconPeriod,
4381         OUT UCHAR *pChannel,
4382         OUT UCHAR *pNewChannel,
4383         OUT LARGE_INTEGER *pTimestamp,
4384         OUT CF_PARM *pCfParm,
4385         OUT USHORT *pAtimWin,
4386         OUT USHORT *pCapabilityInfo,
4387         OUT UCHAR *pErp,
4388         OUT UCHAR *pDtimCount,
4389         OUT UCHAR *pDtimPeriod,
4390         OUT UCHAR *pBcastFlag,
4391         OUT UCHAR *pMessageToMe,
4392         OUT UCHAR SupRate[],
4393         OUT UCHAR *pSupRateLen,
4394         OUT UCHAR ExtRate[],
4395         OUT UCHAR *pExtRateLen,
4396         OUT     UCHAR *pCkipFlag,
4397         OUT     UCHAR *pAironetCellPowerLimit,
4398         OUT PEDCA_PARM       pEdcaParm,
4399         OUT PQBSS_LOAD_PARM  pQbssLoad,
4400         OUT PQOS_CAPABILITY_PARM pQosCapability,
4401         OUT ULONG *pRalinkIe,
4402         OUT UCHAR                *pHtCapabilityLen,
4403         OUT UCHAR                *pPreNHtCapabilityLen,
4404         OUT HT_CAPABILITY_IE *pHtCapability,
4405         OUT UCHAR                *AddHtInfoLen,
4406         OUT ADD_HT_INFO_IE *AddHtInfo,
4407         OUT UCHAR *NewExtChannel,
4408         OUT USHORT *LengthVIE,
4409         OUT PNDIS_802_11_VARIABLE_IEs pVIE);
4410
4411 BOOLEAN PeerAddBAReqActionSanity(
4412     IN PRTMP_ADAPTER pAd,
4413     IN VOID *pMsg,
4414     IN ULONG MsgLen,
4415         OUT PUCHAR pAddr2);
4416
4417 BOOLEAN PeerAddBARspActionSanity(
4418     IN PRTMP_ADAPTER pAd,
4419     IN VOID *pMsg,
4420     IN ULONG MsgLen);
4421
4422 BOOLEAN PeerDelBAActionSanity(
4423     IN PRTMP_ADAPTER pAd,
4424     IN UCHAR Wcid,
4425     IN VOID *pMsg,
4426     IN ULONG MsgLen);
4427
4428 BOOLEAN MlmeAssocReqSanity(
4429         IN  PRTMP_ADAPTER   pAd,
4430         IN  VOID *Msg,
4431         IN  ULONG MsgLen,
4432         OUT PUCHAR pApAddr,
4433         OUT USHORT *CapabilityInfo,
4434         OUT ULONG *Timeout,
4435         OUT USHORT *ListenIntv);
4436
4437 BOOLEAN MlmeAuthReqSanity(
4438         IN  PRTMP_ADAPTER   pAd,
4439         IN  VOID *Msg,
4440         IN  ULONG MsgLen,
4441         OUT PUCHAR pAddr,
4442         OUT ULONG *Timeout,
4443         OUT USHORT *Alg);
4444
4445 BOOLEAN MlmeStartReqSanity(
4446         IN  PRTMP_ADAPTER   pAd,
4447         IN  VOID *Msg,
4448         IN  ULONG MsgLen,
4449         OUT CHAR Ssid[],
4450         OUT UCHAR *Ssidlen);
4451
4452 BOOLEAN PeerAuthSanity(
4453         IN  PRTMP_ADAPTER   pAd,
4454         IN  VOID *Msg,
4455         IN  ULONG MsgLen,
4456         OUT PUCHAR pAddr,
4457         OUT USHORT *Alg,
4458         OUT USHORT *Seq,
4459         OUT USHORT *Status,
4460         OUT CHAR ChlgText[]);
4461
4462 BOOLEAN PeerAssocRspSanity(
4463         IN  PRTMP_ADAPTER   pAd,
4464     IN VOID *pMsg,
4465         IN  ULONG MsgLen,
4466         OUT PUCHAR pAddr2,
4467         OUT USHORT *pCapabilityInfo,
4468         OUT USHORT *pStatus,
4469         OUT USHORT *pAid,
4470         OUT UCHAR SupRate[],
4471         OUT UCHAR *pSupRateLen,
4472         OUT UCHAR ExtRate[],
4473         OUT UCHAR *pExtRateLen,
4474     OUT HT_CAPABILITY_IE                *pHtCapability,
4475     OUT ADD_HT_INFO_IE          *pAddHtInfo,    // AP might use this additional ht info IE
4476     OUT UCHAR                   *pHtCapabilityLen,
4477     OUT UCHAR                   *pAddHtInfoLen,
4478     OUT UCHAR                   *pNewExtChannelOffset,
4479         OUT PEDCA_PARM pEdcaParm,
4480         OUT UCHAR *pCkipFlag);
4481
4482 BOOLEAN PeerDisassocSanity(
4483         IN  PRTMP_ADAPTER   pAd,
4484         IN  VOID *Msg,
4485         IN  ULONG MsgLen,
4486         OUT PUCHAR pAddr2,
4487         OUT USHORT *Reason);
4488
4489 BOOLEAN PeerWpaMessageSanity(
4490     IN  PRTMP_ADAPTER           pAd,
4491     IN  PEAPOL_PACKET           pMsg,
4492     IN  ULONG                           MsgLen,
4493     IN  UCHAR                           MsgType,
4494     IN  MAC_TABLE_ENTRY         *pEntry);
4495
4496 BOOLEAN PeerDeauthSanity(
4497         IN  PRTMP_ADAPTER   pAd,
4498         IN  VOID *Msg,
4499         IN  ULONG MsgLen,
4500         OUT PUCHAR pAddr2,
4501         OUT USHORT *Reason);
4502
4503 BOOLEAN PeerProbeReqSanity(
4504         IN  PRTMP_ADAPTER   pAd,
4505         IN  VOID *Msg,
4506         IN  ULONG MsgLen,
4507         OUT PUCHAR pAddr2,
4508         OUT CHAR Ssid[],
4509         OUT UCHAR *pSsidLen);
4510
4511 BOOLEAN GetTimBit(
4512         IN  CHAR *Ptr,
4513         IN  USHORT Aid,
4514         OUT UCHAR *TimLen,
4515         OUT UCHAR *BcastFlag,
4516         OUT UCHAR *DtimCount,
4517         OUT UCHAR *DtimPeriod,
4518         OUT UCHAR *MessageToMe);
4519
4520 UCHAR ChannelSanity(
4521         IN PRTMP_ADAPTER pAd,
4522         IN UCHAR channel);
4523
4524 NDIS_802_11_NETWORK_TYPE NetworkTypeInUseSanity(
4525         IN PBSS_ENTRY pBss);
4526
4527 #if 0   // It's omitted
4528 NDIS_STATUS     RTMPWepKeySanity(
4529         IN      PRTMP_ADAPTER   pAdapter,
4530         IN      PVOID                   pBuf);
4531 #endif
4532
4533 BOOLEAN MlmeDelBAReqSanity(
4534     IN PRTMP_ADAPTER pAd,
4535     IN VOID *Msg,
4536     IN ULONG MsgLen);
4537
4538 BOOLEAN MlmeAddBAReqSanity(
4539     IN PRTMP_ADAPTER pAd,
4540     IN VOID *Msg,
4541     IN ULONG MsgLen,
4542     OUT PUCHAR pAddr2);
4543
4544 ULONG MakeOutgoingFrame(
4545         OUT CHAR *Buffer,
4546         OUT ULONG *Length, ...);
4547
4548 VOID  LfsrInit(
4549         IN  PRTMP_ADAPTER   pAd,
4550         IN  ULONG Seed);
4551
4552 UCHAR RandomByte(
4553         IN  PRTMP_ADAPTER   pAd);
4554
4555 VOID AsicUpdateAutoFallBackTable(
4556         IN      PRTMP_ADAPTER   pAd,
4557         IN      PUCHAR                  pTxRate);
4558
4559 VOID  MlmePeriodicExec(
4560         IN PVOID SystemSpecific1,
4561         IN PVOID FunctionContext,
4562         IN PVOID SystemSpecific2,
4563         IN PVOID SystemSpecific3);
4564
4565 VOID LinkDownExec(
4566         IN PVOID SystemSpecific1,
4567         IN PVOID FunctionContext,
4568         IN PVOID SystemSpecific2,
4569         IN PVOID SystemSpecific3);
4570
4571 VOID LinkUpExec(
4572         IN PVOID SystemSpecific1,
4573         IN PVOID FunctionContext,
4574         IN PVOID SystemSpecific2,
4575         IN PVOID SystemSpecific3);
4576
4577 VOID STAMlmePeriodicExec(
4578         PRTMP_ADAPTER pAd);
4579
4580 VOID MlmeAutoScan(
4581         IN PRTMP_ADAPTER pAd);
4582
4583 VOID MlmeAutoReconnectLastSSID(
4584         IN PRTMP_ADAPTER pAd);
4585
4586 BOOLEAN MlmeValidateSSID(
4587         IN PUCHAR pSsid,
4588         IN UCHAR  SsidLen);
4589
4590 VOID MlmeCheckForRoaming(
4591         IN PRTMP_ADAPTER pAd,
4592         IN ULONG    Now32);
4593
4594 VOID MlmeCheckForFastRoaming(
4595         IN  PRTMP_ADAPTER   pAd,
4596         IN  ULONG           Now);
4597
4598 VOID MlmeDynamicTxRateSwitching(
4599         IN PRTMP_ADAPTER pAd);
4600
4601 VOID MlmeSetTxRate(
4602         IN PRTMP_ADAPTER                pAd,
4603         IN PMAC_TABLE_ENTRY             pEntry,
4604         IN PRTMP_TX_RATE_SWITCH pTxRate);
4605
4606 VOID MlmeSelectTxRateTable(
4607         IN PRTMP_ADAPTER                pAd,
4608         IN PMAC_TABLE_ENTRY             pEntry,
4609         IN PUCHAR                               *ppTable,
4610         IN PUCHAR                               pTableSize,
4611         IN PUCHAR                               pInitTxRateIdx);
4612
4613 VOID MlmeCalculateChannelQuality(
4614         IN PRTMP_ADAPTER pAd,
4615         IN ULONG Now);
4616
4617 VOID MlmeCheckPsmChange(
4618         IN PRTMP_ADAPTER pAd,
4619         IN ULONG    Now32);
4620
4621 VOID MlmeSetPsmBit(
4622         IN PRTMP_ADAPTER pAd,
4623         IN USHORT psm);
4624
4625 VOID MlmeSetTxPreamble(
4626         IN PRTMP_ADAPTER pAd,
4627         IN USHORT TxPreamble);
4628
4629 VOID UpdateBasicRateBitmap(
4630         IN      PRTMP_ADAPTER   pAd);
4631
4632 VOID MlmeUpdateTxRates(
4633         IN PRTMP_ADAPTER        pAd,
4634         IN      BOOLEAN                 bLinkUp,
4635         IN      UCHAR                   apidx);
4636
4637 #ifdef DOT11_N_SUPPORT
4638 VOID MlmeUpdateHtTxRates(
4639         IN PRTMP_ADAPTER                pAd,
4640         IN      UCHAR                           apidx);
4641 #endif // DOT11_N_SUPPORT //
4642
4643 VOID    RTMPCheckRates(
4644         IN      PRTMP_ADAPTER   pAd,
4645         IN OUT  UCHAR           SupRate[],
4646         IN OUT  UCHAR           *SupRateLen);
4647
4648 BOOLEAN RTMPCheckChannel(
4649         IN PRTMP_ADAPTER pAd,
4650         IN UCHAR                CentralChannel,
4651         IN UCHAR                Channel);
4652
4653 BOOLEAN         RTMPCheckHt(
4654         IN              PRTMP_ADAPTER   pAd,
4655         IN              UCHAR   Wcid,
4656         IN OUT  HT_CAPABILITY_IE                        *pHtCapability,
4657         IN OUT  ADD_HT_INFO_IE                  *pAddHtInfo);
4658
4659 VOID StaQuickResponeForRateUpExec(
4660         IN PVOID SystemSpecific1,
4661         IN PVOID FunctionContext,
4662         IN PVOID SystemSpecific2,
4663         IN PVOID SystemSpecific3);
4664
4665 VOID AsicBbpTuning1(
4666         IN PRTMP_ADAPTER pAd);
4667
4668 VOID AsicBbpTuning2(
4669         IN PRTMP_ADAPTER pAd);
4670
4671 VOID RTMPUpdateMlmeRate(
4672         IN PRTMP_ADAPTER        pAd);
4673
4674 CHAR RTMPMaxRssi(
4675         IN PRTMP_ADAPTER        pAd,
4676         IN CHAR                         Rssi0,
4677         IN CHAR                         Rssi1,
4678         IN CHAR                         Rssi2);
4679
4680 VOID AsicEvaluateRxAnt(
4681         IN PRTMP_ADAPTER        pAd);
4682
4683 VOID AsicRxAntEvalTimeout(
4684         IN PVOID SystemSpecific1,
4685         IN PVOID FunctionContext,
4686         IN PVOID SystemSpecific2,
4687         IN PVOID SystemSpecific3);
4688
4689 VOID APSDPeriodicExec(
4690         IN PVOID SystemSpecific1,
4691         IN PVOID FunctionContext,
4692         IN PVOID SystemSpecific2,
4693         IN PVOID SystemSpecific3);
4694
4695 BOOLEAN RTMPCheckEntryEnableAutoRateSwitch(
4696         IN PRTMP_ADAPTER    pAd,
4697         IN PMAC_TABLE_ENTRY     pEntry);
4698
4699 UCHAR RTMPStaFixedTxMode(
4700         IN PRTMP_ADAPTER    pAd,
4701         IN PMAC_TABLE_ENTRY     pEntry);
4702
4703 VOID RTMPUpdateLegacyTxSetting(
4704                 UCHAR                           fixed_tx_mode,
4705                 PMAC_TABLE_ENTRY        pEntry);
4706
4707 BOOLEAN RTMPAutoRateSwitchCheck(
4708         IN PRTMP_ADAPTER    pAd);
4709
4710 NDIS_STATUS MlmeInit(
4711         IN  PRTMP_ADAPTER   pAd);
4712
4713 VOID MlmeHandler(
4714         IN  PRTMP_ADAPTER   pAd);
4715
4716 VOID MlmeHalt(
4717         IN  PRTMP_ADAPTER   pAd);
4718
4719 VOID MlmeResetRalinkCounters(
4720         IN  PRTMP_ADAPTER   pAd);
4721
4722 VOID BuildChannelList(
4723         IN PRTMP_ADAPTER pAd);
4724
4725 UCHAR FirstChannel(
4726         IN  PRTMP_ADAPTER   pAd);
4727
4728 UCHAR NextChannel(
4729         IN  PRTMP_ADAPTER   pAd,
4730         IN  UCHAR channel);
4731
4732 VOID ChangeToCellPowerLimit(
4733         IN PRTMP_ADAPTER pAd,
4734         IN UCHAR         AironetCellPowerLimit);
4735
4736 VOID RaiseClock(
4737         IN  PRTMP_ADAPTER   pAd,
4738         IN  UINT32 *x);
4739
4740 VOID LowerClock(
4741         IN  PRTMP_ADAPTER   pAd,
4742         IN  UINT32 *x);
4743
4744 USHORT ShiftInBits(
4745         IN  PRTMP_ADAPTER   pAd);
4746
4747 VOID ShiftOutBits(
4748         IN  PRTMP_ADAPTER   pAd,
4749         IN  USHORT data,
4750         IN  USHORT count);
4751
4752 VOID EEpromCleanup(
4753         IN  PRTMP_ADAPTER   pAd);
4754
4755 VOID EWDS(
4756         IN  PRTMP_ADAPTER   pAd);
4757
4758 VOID EWEN(
4759         IN  PRTMP_ADAPTER   pAd);
4760
4761 USHORT RTMP_EEPROM_READ16(
4762         IN  PRTMP_ADAPTER   pAd,
4763         IN  USHORT Offset);
4764
4765 VOID RTMP_EEPROM_WRITE16(
4766         IN  PRTMP_ADAPTER   pAd,
4767         IN  USHORT Offset,
4768         IN  USHORT Data);
4769
4770 //
4771 // Prototypes of function definition in rtmp_tkip.c
4772 //
4773 VOID    RTMPInitTkipEngine(
4774         IN  PRTMP_ADAPTER   pAd,
4775         IN  PUCHAR          pTKey,
4776         IN  UCHAR           KeyId,
4777         IN  PUCHAR          pTA,
4778         IN  PUCHAR          pMICKey,
4779         IN  PUCHAR          pTSC,
4780         OUT PULONG          pIV16,
4781         OUT PULONG          pIV32);
4782
4783 VOID    RTMPInitMICEngine(
4784         IN  PRTMP_ADAPTER   pAd,
4785         IN  PUCHAR          pKey,
4786         IN  PUCHAR          pDA,
4787         IN  PUCHAR          pSA,
4788         IN  UCHAR           UserPriority,
4789         IN  PUCHAR          pMICKey);
4790
4791 BOOLEAN RTMPTkipCompareMICValue(
4792         IN  PRTMP_ADAPTER   pAd,
4793         IN  PUCHAR          pSrc,
4794         IN  PUCHAR          pDA,
4795         IN  PUCHAR          pSA,
4796         IN  PUCHAR          pMICKey,
4797         IN      UCHAR                   UserPriority,
4798         IN  UINT            Len);
4799
4800 VOID    RTMPCalculateMICValue(
4801         IN  PRTMP_ADAPTER   pAd,
4802         IN  PNDIS_PACKET    pPacket,
4803         IN  PUCHAR          pEncap,
4804         IN  PCIPHER_KEY     pKey,
4805         IN      UCHAR                   apidx);
4806
4807 BOOLEAN RTMPTkipCompareMICValueWithLLC(
4808         IN  PRTMP_ADAPTER   pAd,
4809         IN  PUCHAR          pLLC,
4810         IN  PUCHAR          pSrc,
4811         IN  PUCHAR          pDA,
4812         IN  PUCHAR          pSA,
4813         IN  PUCHAR          pMICKey,
4814         IN  UINT            Len);
4815
4816 VOID    RTMPTkipAppendByte(
4817         IN  PTKIP_KEY_INFO  pTkip,
4818         IN  UCHAR           uChar);
4819
4820 VOID    RTMPTkipAppend(
4821         IN  PTKIP_KEY_INFO  pTkip,
4822         IN  PUCHAR          pSrc,
4823         IN  UINT            nBytes);
4824
4825 VOID    RTMPTkipGetMIC(
4826         IN  PTKIP_KEY_INFO  pTkip);
4827
4828 BOOLEAN RTMPSoftDecryptTKIP(
4829         IN PRTMP_ADAPTER pAd,
4830         IN PUCHAR       pData,
4831         IN ULONG        DataByteCnt,
4832         IN UCHAR    UserPriority,
4833         IN PCIPHER_KEY  pWpaKey);
4834
4835 BOOLEAN RTMPSoftDecryptAES(
4836         IN PRTMP_ADAPTER pAd,
4837         IN PUCHAR       pData,
4838         IN ULONG        DataByteCnt,
4839         IN PCIPHER_KEY  pWpaKey);
4840
4841 #if 0   // removed by AlbertY
4842 NDIS_STATUS RTMPWPAAddKeyProc(
4843         IN  PRTMP_ADAPTER   pAd,
4844         IN  PVOID           pBuf);
4845 #endif
4846
4847 //
4848 // Prototypes of function definition in cmm_info.c
4849 //
4850 NDIS_STATUS RTMPWPARemoveKeyProc(
4851         IN  PRTMP_ADAPTER   pAd,
4852         IN  PVOID           pBuf);
4853
4854 VOID    RTMPWPARemoveAllKeys(
4855         IN  PRTMP_ADAPTER   pAd);
4856
4857 BOOLEAN RTMPCheckStrPrintAble(
4858     IN  CHAR *pInPutStr,
4859     IN  UCHAR strLen);
4860
4861 VOID    RTMPSetPhyMode(
4862         IN  PRTMP_ADAPTER   pAd,
4863         IN  ULONG phymode);
4864
4865 VOID    RTMPUpdateHTIE(
4866         IN      RT_HT_CAPABILITY        *pRtHt,
4867         IN              UCHAR                           *pMcsSet,
4868         OUT             HT_CAPABILITY_IE *pHtCapability,
4869         OUT             ADD_HT_INFO_IE          *pAddHtInfo);
4870
4871 VOID    RTMPAddWcidAttributeEntry(
4872         IN      PRTMP_ADAPTER   pAd,
4873         IN      UCHAR                   BssIdx,
4874         IN      UCHAR                   KeyIdx,
4875         IN      UCHAR                   CipherAlg,
4876         IN      MAC_TABLE_ENTRY *pEntry);
4877
4878 CHAR *GetEncryptType(
4879         CHAR enc);
4880
4881 CHAR *GetAuthMode(
4882         CHAR auth);
4883
4884 VOID RTMPIoctlGetSiteSurvey(
4885         IN      PRTMP_ADAPTER   pAdapter,
4886         IN      struct iwreq    *wrq);
4887
4888 VOID RTMPIoctlGetMacTable(
4889         IN PRTMP_ADAPTER pAd,
4890         IN struct iwreq *wrq);
4891
4892 VOID RTMPIndicateWPA2Status(
4893         IN  PRTMP_ADAPTER  pAdapter);
4894
4895 VOID    RTMPOPModeSwitching(
4896         IN      PRTMP_ADAPTER   pAd);
4897
4898 VOID    RTMPAddBSSIDCipher(
4899     IN  PRTMP_ADAPTER   pAd,
4900         IN      UCHAR   Aid,
4901     IN  PNDIS_802_11_KEY    pKey,
4902     IN  UCHAR   CipherAlg);
4903
4904 #ifdef DOT11_N_SUPPORT
4905 VOID    RTMPSetHT(
4906         IN      PRTMP_ADAPTER   pAd,
4907         IN      OID_SET_HT_PHYMODE *pHTPhyMode);
4908
4909 VOID    RTMPSetIndividualHT(
4910         IN      PRTMP_ADAPTER           pAd,
4911         IN      UCHAR                           apidx);
4912 #endif // DOT11_N_SUPPORT //
4913
4914 VOID RTMPSendWirelessEvent(
4915         IN      PRTMP_ADAPTER   pAd,
4916         IN      USHORT                  Event_flag,
4917         IN      PUCHAR                  pAddr,
4918         IN  UCHAR                       BssIdx,
4919         IN      CHAR                    Rssi);
4920
4921 VOID    NICUpdateCntlCounters(
4922         IN      PRTMP_ADAPTER   pAd,
4923         IN      PHEADER_802_11  pHeader,
4924         IN    UCHAR                     SubType,
4925         IN      PRXWI_STRUC     pRxWI);
4926 //
4927 // prototype in wpa.c
4928 //
4929 BOOLEAN WpaMsgTypeSubst(
4930         IN  UCHAR   EAPType,
4931         OUT INT         *MsgType);
4932
4933 VOID WpaPskStateMachineInit(
4934         IN  PRTMP_ADAPTER       pAd,
4935         IN  STATE_MACHINE       *S,
4936         OUT STATE_MACHINE_FUNC Trans[]);
4937
4938 VOID WpaEAPOLKeyAction(
4939         IN  PRTMP_ADAPTER   pAd,
4940         IN  MLME_QUEUE_ELEM *Elem);
4941
4942 VOID    WpaPairMsg1Action(
4943         IN  PRTMP_ADAPTER   pAd,
4944         IN  MLME_QUEUE_ELEM *Elem);
4945
4946 VOID    WpaPairMsg3Action(
4947         IN  PRTMP_ADAPTER   pAd,
4948         IN  MLME_QUEUE_ELEM *Elem);
4949
4950 VOID    WpaGroupMsg1Action(
4951         IN  PRTMP_ADAPTER   pAd,
4952         IN  MLME_QUEUE_ELEM *Elem);
4953
4954 VOID    WpaMacHeaderInit(
4955         IN      PRTMP_ADAPTER   pAd,
4956         IN OUT  PHEADER_802_11  pHdr80211,
4957         IN      UCHAR           wep,
4958         IN      PUCHAR          pAddr1);
4959
4960 VOID    Wpa2PairMsg1Action(
4961     IN  PRTMP_ADAPTER   pAd,
4962     IN  MLME_QUEUE_ELEM *Elem);
4963
4964 VOID    Wpa2PairMsg3Action(
4965     IN  PRTMP_ADAPTER   pAd,
4966     IN  MLME_QUEUE_ELEM *Elem);
4967
4968 BOOLEAN ParseKeyData(
4969     IN  PRTMP_ADAPTER   pAd,
4970     IN  PUCHAR          pKeyData,
4971     IN  UCHAR           KeyDataLen,
4972         IN      UCHAR                   bPairewise);
4973
4974 VOID    RTMPToWirelessSta(
4975         IN  PRTMP_ADAPTER   pAd,
4976         IN  PUCHAR          pHeader802_3,
4977     IN  UINT            HdrLen,
4978         IN  PUCHAR          pData,
4979     IN  UINT            DataLen,
4980     IN  BOOLEAN                 is4wayFrame);
4981
4982 VOID    HMAC_SHA1(
4983         IN  UCHAR   *text,
4984         IN  UINT    text_len,
4985         IN  UCHAR   *key,
4986         IN  UINT    key_len,
4987         IN  UCHAR   *digest);
4988
4989 VOID    PRF(
4990         IN  UCHAR   *key,
4991         IN  INT     key_len,
4992         IN  UCHAR   *prefix,
4993         IN  INT     prefix_len,
4994         IN  UCHAR   *data,
4995         IN  INT     data_len,
4996         OUT UCHAR   *output,
4997         IN  INT     len);
4998
4999 VOID    CCKMPRF(
5000         IN  UCHAR   *key,
5001         IN  INT     key_len,
5002         IN  UCHAR   *data,
5003         IN  INT     data_len,
5004         OUT UCHAR   *output,
5005         IN  INT     len);
5006
5007 VOID WpaCountPTK(
5008         IN  PRTMP_ADAPTER   pAd,
5009         IN  UCHAR   *PMK,
5010         IN  UCHAR   *ANonce,
5011         IN  UCHAR   *AA,
5012         IN  UCHAR   *SNonce,
5013         IN  UCHAR   *SA,
5014         OUT UCHAR   *output,
5015         IN  UINT    len);
5016
5017 VOID    GenRandom(
5018         IN  PRTMP_ADAPTER   pAd,
5019         IN      UCHAR                   *macAddr,
5020         OUT     UCHAR                   *random);
5021
5022 //
5023 // prototype in aironet.c
5024 //
5025 VOID    AironetStateMachineInit(
5026         IN  PRTMP_ADAPTER       pAd,
5027         IN  STATE_MACHINE       *S,
5028         OUT STATE_MACHINE_FUNC  Trans[]);
5029
5030 VOID    AironetMsgAction(
5031         IN  PRTMP_ADAPTER   pAd,
5032         IN  MLME_QUEUE_ELEM *Elem);
5033
5034 VOID    AironetRequestAction(
5035         IN  PRTMP_ADAPTER   pAd,
5036         IN  MLME_QUEUE_ELEM *Elem);
5037
5038 VOID    ChannelLoadRequestAction(
5039         IN  PRTMP_ADAPTER   pAd,
5040         IN  UCHAR           Index);
5041
5042 VOID    NoiseHistRequestAction(
5043         IN  PRTMP_ADAPTER   pAd,
5044         IN  UCHAR           Index);
5045
5046 VOID    BeaconRequestAction(
5047         IN  PRTMP_ADAPTER   pAd,
5048         IN  UCHAR           Index);
5049
5050 VOID    AironetReportAction(
5051         IN  PRTMP_ADAPTER   pAd,
5052         IN  MLME_QUEUE_ELEM *Elem);
5053
5054 VOID    ChannelLoadReportAction(
5055         IN  PRTMP_ADAPTER   pAd,
5056         IN  UCHAR           Index);
5057
5058 VOID    NoiseHistReportAction(
5059         IN  PRTMP_ADAPTER   pAd,
5060         IN  UCHAR           Index);
5061
5062 VOID    AironetFinalReportAction(
5063         IN  PRTMP_ADAPTER   pAd);
5064
5065 VOID    BeaconReportAction(
5066         IN  PRTMP_ADAPTER   pAd,
5067         IN  UCHAR           Index);
5068
5069 VOID    AironetAddBeaconReport(
5070         IN  PRTMP_ADAPTER       pAd,
5071         IN  ULONG               Index,
5072         IN  PMLME_QUEUE_ELEM    pElem);
5073
5074 VOID    AironetCreateBeaconReportFromBssTable(
5075         IN  PRTMP_ADAPTER       pAd);
5076
5077 VOID    DBGPRINT_TX_RING(
5078         IN PRTMP_ADAPTER  pAd,
5079         IN UCHAR          QueIdx);
5080
5081 VOID DBGPRINT_RX_RING(
5082         IN PRTMP_ADAPTER  pAd);
5083
5084 CHAR    ConvertToRssi(
5085         IN PRTMP_ADAPTER  pAd,
5086         IN CHAR                         Rssi,
5087         IN UCHAR    RssiNumber);
5088
5089 VOID APAsicEvaluateRxAnt(
5090         IN PRTMP_ADAPTER        pAd);
5091
5092
5093 VOID APAsicRxAntEvalTimeout(
5094         IN PRTMP_ADAPTER        pAd);
5095
5096 //
5097 // function prototype in cmm_wpa.c
5098 //
5099 BOOLEAN RTMPCheckWPAframe(
5100         IN PRTMP_ADAPTER pAd,
5101         IN PMAC_TABLE_ENTRY     pEntry,
5102         IN PUCHAR                       pData,
5103         IN ULONG                        DataByteCount,
5104         IN UCHAR                        FromWhichBSSID);
5105
5106 VOID AES_GTK_KEY_UNWRAP(
5107         IN  UCHAR   *key,
5108         OUT UCHAR   *plaintext,
5109         IN      UCHAR   c_len,
5110         IN  UCHAR   *ciphertext);
5111
5112 BOOLEAN RTMPCheckRSNIE(
5113         IN  PRTMP_ADAPTER   pAd,
5114         IN  PUCHAR          pData,
5115         IN  UCHAR           DataLen,
5116         IN  MAC_TABLE_ENTRY *pEntry,
5117         OUT     UCHAR                   *Offset);
5118
5119 BOOLEAN RTMPParseEapolKeyData(
5120         IN  PRTMP_ADAPTER   pAd,
5121         IN  PUCHAR          pKeyData,
5122         IN  UCHAR           KeyDataLen,
5123         IN      UCHAR                   GroupKeyIndex,
5124         IN      UCHAR                   MsgType,
5125         IN      BOOLEAN                 bWPA2,
5126         IN  MAC_TABLE_ENTRY *pEntry);
5127
5128 VOID    ConstructEapolMsg(
5129         IN      PRTMP_ADAPTER           pAd,
5130     IN  UCHAR                           PeerAuthMode,
5131     IN  UCHAR                           PeerWepStatus,
5132     IN  UCHAR                           MyGroupKeyWepStatus,
5133     IN  UCHAR                           MsgType,
5134     IN  UCHAR                           DefaultKeyIdx,
5135     IN  UCHAR                           *ReplayCounter,
5136         IN      UCHAR                           *KeyNonce,
5137         IN      UCHAR                           *TxRSC,
5138         IN      UCHAR                           *PTK,
5139         IN      UCHAR                           *GTK,
5140         IN      UCHAR                           *RSNIE,
5141         IN      UCHAR                           RSNIE_Len,
5142     OUT PEAPOL_PACKET       pMsg);
5143
5144 VOID    CalculateMIC(
5145         IN      PRTMP_ADAPTER   pAd,
5146         IN      UCHAR                   PeerWepStatus,
5147         IN      UCHAR                   *PTK,
5148         OUT PEAPOL_PACKET   pMsg);
5149
5150 NDIS_STATUS     RTMPSoftDecryptBroadCastData(
5151         IN      PRTMP_ADAPTER                                   pAd,
5152         IN      RX_BLK                                                  *pRxBlk,
5153         IN  NDIS_802_11_ENCRYPTION_STATUS       GroupCipher,
5154         IN  PCIPHER_KEY                                         pShard_key);
5155
5156 VOID    ConstructEapolKeyData(
5157         IN      PRTMP_ADAPTER   pAd,
5158         IN      UCHAR                   PeerAuthMode,
5159         IN      UCHAR                   PeerWepStatus,
5160         IN      UCHAR                   GroupKeyWepStatus,
5161         IN      UCHAR                   MsgType,
5162         IN      UCHAR                   DefaultKeyIdx,
5163         IN      BOOLEAN                 bWPA2Capable,
5164         IN      UCHAR                   *PTK,
5165         IN      UCHAR                   *GTK,
5166         IN      UCHAR                   *RSNIE,
5167         IN      UCHAR                   RSNIE_LEN,
5168         OUT PEAPOL_PACKET   pMsg);
5169
5170 VOID RTMPMakeRSNIE(
5171         IN  PRTMP_ADAPTER   pAd,
5172         IN  UINT            AuthMode,
5173         IN  UINT            WepStatus,
5174         IN      UCHAR                   apidx);
5175
5176 //
5177 // function prototype in ap_wpa.c
5178 //
5179
5180 BOOLEAN APWpaMsgTypeSubst(
5181         IN UCHAR    EAPType,
5182         OUT INT *MsgType) ;
5183
5184 MAC_TABLE_ENTRY *PACInquiry(
5185         IN  PRTMP_ADAPTER   pAd,
5186         IN  ULONG           Wcid);
5187
5188 BOOLEAN RTMPCheckMcast(
5189         IN PRTMP_ADAPTER pAd,
5190         IN PEID_STRUCT      eid_ptr,
5191         IN MAC_TABLE_ENTRY  *pEntry);
5192
5193 BOOLEAN RTMPCheckUcast(
5194         IN PRTMP_ADAPTER pAd,
5195         IN PEID_STRUCT      eid_ptr,
5196         IN MAC_TABLE_ENTRY  *pEntry);
5197
5198 BOOLEAN RTMPCheckAUTH(
5199         IN PRTMP_ADAPTER pAd,
5200         IN PEID_STRUCT      eid_ptr,
5201         IN MAC_TABLE_ENTRY  *pEntry);
5202
5203 VOID WPAStart4WayHS(
5204         IN  PRTMP_ADAPTER   pAd,
5205         IN  MAC_TABLE_ENTRY *pEntry,
5206         IN      ULONG                   TimeInterval);
5207
5208 VOID WPAStart2WayGroupHS(
5209         IN  PRTMP_ADAPTER   pAd,
5210         IN  MAC_TABLE_ENTRY *pEntry);
5211
5212 VOID APWpaEAPPacketAction(
5213         IN PRTMP_ADAPTER pAd,
5214         IN MLME_QUEUE_ELEM *Elem);
5215
5216 VOID APWpaEAPOLStartAction(
5217         IN PRTMP_ADAPTER pAd,
5218         IN MLME_QUEUE_ELEM *Elem);
5219
5220 VOID APWpaEAPOLLogoffAction(
5221         IN PRTMP_ADAPTER pAd,
5222         IN MLME_QUEUE_ELEM *Elem);
5223
5224 VOID APWpaEAPOLKeyAction(
5225         IN PRTMP_ADAPTER pAd,
5226         IN MLME_QUEUE_ELEM *Elem);
5227
5228 VOID APWpaEAPOLASFAlertAction(
5229         IN  PRTMP_ADAPTER    pAd,
5230         IN  MLME_QUEUE_ELEM  *Elem);
5231
5232 VOID HandleCounterMeasure(
5233         IN PRTMP_ADAPTER pAd,
5234         IN MAC_TABLE_ENTRY  *pEntry);
5235
5236 VOID PeerPairMsg2Action(
5237         IN PRTMP_ADAPTER pAd,
5238         IN MAC_TABLE_ENTRY  *pEntry,
5239         IN MLME_QUEUE_ELEM *Elem);
5240
5241 VOID PeerPairMsg4Action(
5242         IN PRTMP_ADAPTER pAd,
5243         IN MAC_TABLE_ENTRY  *pEntry,
5244         IN MLME_QUEUE_ELEM *Elem);
5245
5246 VOID CMTimerExec(
5247         IN PVOID SystemSpecific1,
5248         IN PVOID FunctionContext,
5249         IN PVOID SystemSpecific2,
5250         IN PVOID SystemSpecific3);
5251
5252 VOID WPARetryExec(
5253         IN PVOID SystemSpecific1,
5254         IN PVOID FunctionContext,
5255         IN PVOID SystemSpecific2,
5256         IN PVOID SystemSpecific3);
5257
5258 VOID EnqueueStartForPSKExec(
5259     IN PVOID SystemSpecific1,
5260     IN PVOID FunctionContext,
5261     IN PVOID SystemSpecific2,
5262     IN PVOID SystemSpecific3);
5263
5264 VOID RTMPHandleSTAKey(
5265     IN PRTMP_ADAPTER    pAdapter,
5266     IN MAC_TABLE_ENTRY  *pEntry,
5267     IN MLME_QUEUE_ELEM  *Elem);
5268
5269 #if 0 // merge into PeerPairMsg4Action
5270 VOID Wpa1PeerPairMsg4Action(
5271         IN PRTMP_ADAPTER pAd,
5272         IN MAC_TABLE_ENTRY  *pEntry,
5273         IN MLME_QUEUE_ELEM *Elem);
5274
5275 VOID Wpa2PeerPairMsg4Action(
5276         IN  PRTMP_ADAPTER    pAd,
5277         IN  PMAC_TABLE_ENTRY pEntry,
5278         IN  MLME_QUEUE_ELEM  *Elem);
5279 #endif // 0 //
5280
5281 VOID PeerGroupMsg2Action(
5282         IN  PRTMP_ADAPTER    pAd,
5283         IN  PMAC_TABLE_ENTRY pEntry,
5284         IN  VOID             *Msg,
5285         IN  UINT             MsgLen);
5286
5287 #if 0   // replaced by WPAStart2WayGroupHS
5288 NDIS_STATUS APWpaHardTransmit(
5289         IN  PRTMP_ADAPTER    pAd,
5290         IN  PMAC_TABLE_ENTRY pEntry);
5291 #endif // 0 //
5292
5293 VOID PairDisAssocAction(
5294         IN  PRTMP_ADAPTER    pAd,
5295         IN  PMAC_TABLE_ENTRY pEntry,
5296         IN  USHORT           Reason);
5297
5298 VOID MlmeDeAuthAction(
5299         IN  PRTMP_ADAPTER    pAd,
5300         IN  PMAC_TABLE_ENTRY pEntry,
5301         IN  USHORT           Reason);
5302
5303 VOID GREKEYPeriodicExec(
5304         IN  PVOID   SystemSpecific1,
5305         IN  PVOID   FunctionContext,
5306         IN  PVOID   SystemSpecific2,
5307         IN  PVOID   SystemSpecific3);
5308
5309 VOID CountGTK(
5310         IN  UCHAR   *PMK,
5311         IN  UCHAR   *GNonce,
5312         IN  UCHAR   *AA,
5313         OUT UCHAR   *output,
5314         IN  UINT    len);
5315
5316 VOID    GetSmall(
5317         IN  PVOID   pSrc1,
5318         IN  PVOID   pSrc2,
5319         OUT PUCHAR  out,
5320         IN  ULONG   Length);
5321
5322 VOID    GetLarge(
5323         IN  PVOID   pSrc1,
5324         IN  PVOID   pSrc2,
5325         OUT PUCHAR  out,
5326         IN  ULONG   Length);
5327
5328 VOID APGenRandom(
5329         IN PRTMP_ADAPTER pAd,
5330         OUT UCHAR       *random);
5331
5332 VOID AES_GTK_KEY_WRAP(
5333         IN UCHAR *key,
5334         IN UCHAR *plaintext,
5335         IN UCHAR p_len,
5336         OUT UCHAR *ciphertext);
5337
5338 VOID    WpaSend(
5339     IN  PRTMP_ADAPTER   pAdapter,
5340     IN  PUCHAR          pPacket,
5341     IN  ULONG           Len);
5342
5343 VOID    APToWirelessSta(
5344         IN  PRTMP_ADAPTER   pAd,
5345         IN  MAC_TABLE_ENTRY *pEntry,
5346         IN  PUCHAR          pHeader802_3,
5347         IN  UINT            HdrLen,
5348         IN  PUCHAR          pData,
5349         IN  UINT            DataLen,
5350     IN  BOOLEAN                 bClearFrame);
5351
5352 VOID RTMPAddPMKIDCache(
5353         IN  PRTMP_ADAPTER               pAd,
5354         IN      INT                                             apidx,
5355         IN      PUCHAR                          pAddr,
5356         IN      UCHAR                                   *PMKID,
5357         IN      UCHAR                                   *PMK);
5358
5359 INT RTMPSearchPMKIDCache(
5360         IN  PRTMP_ADAPTER   pAd,
5361         IN      INT                             apidx,
5362         IN      PUCHAR          pAddr);
5363
5364 VOID RTMPDeletePMKIDCache(
5365         IN  PRTMP_ADAPTER   pAd,
5366         IN      INT                             apidx,
5367         IN  INT                         idx);
5368
5369 VOID RTMPMaintainPMKIDCache(
5370         IN  PRTMP_ADAPTER   pAd);
5371
5372 VOID    RTMPSendTriggerFrame(
5373         IN      PRTMP_ADAPTER   pAd,
5374         IN      PVOID                   pBuffer,
5375         IN      ULONG                   Length,
5376         IN  UCHAR           TxRate,
5377         IN      BOOLEAN                 bQosNull);
5378
5379
5380 //typedef void (*TIMER_FUNCTION)(unsigned long);
5381
5382
5383 /* timeout -- ms */
5384 VOID RTMP_SetPeriodicTimer(
5385         IN      NDIS_MINIPORT_TIMER *pTimer,
5386         IN      unsigned long timeout);
5387
5388 VOID RTMP_OS_Init_Timer(
5389         IN      PRTMP_ADAPTER pAd,
5390         IN      NDIS_MINIPORT_TIMER *pTimer,
5391         IN      TIMER_FUNCTION function,
5392         IN      PVOID data);
5393
5394 VOID RTMP_OS_Add_Timer(
5395         IN      NDIS_MINIPORT_TIMER     *pTimer,
5396         IN      unsigned long timeout);
5397
5398 VOID RTMP_OS_Mod_Timer(
5399         IN      NDIS_MINIPORT_TIMER     *pTimer,
5400         IN      unsigned long timeout);
5401
5402
5403 VOID RTMP_OS_Del_Timer(
5404         IN      NDIS_MINIPORT_TIMER     *pTimer,
5405         OUT     BOOLEAN                          *pCancelled);
5406
5407
5408 VOID RTMP_OS_Release_Packet(
5409         IN      PRTMP_ADAPTER pAd,
5410         IN      PQUEUE_ENTRY  pEntry);
5411
5412 VOID RTMPusecDelay(
5413         IN      ULONG   usec);
5414
5415 NDIS_STATUS os_alloc_mem(
5416         IN      PRTMP_ADAPTER pAd,
5417         OUT     PUCHAR *mem,
5418         IN      ULONG  size);
5419
5420 NDIS_STATUS os_free_mem(
5421         IN      PRTMP_ADAPTER pAd,
5422         IN      PUCHAR mem);
5423
5424
5425 void RTMP_AllocateSharedMemory(
5426         IN      PRTMP_ADAPTER pAd,
5427         IN      ULONG   Length,
5428         IN      BOOLEAN Cached,
5429         OUT     PVOID   *VirtualAddress,
5430         OUT     PNDIS_PHYSICAL_ADDRESS PhysicalAddress);
5431
5432 VOID RTMPFreeTxRxRingMemory(
5433     IN  PRTMP_ADAPTER   pAd);
5434
5435 NDIS_STATUS AdapterBlockAllocateMemory(
5436         IN PVOID        handle,
5437         OUT     PVOID   *ppAd);
5438
5439 void RTMP_AllocateTxDescMemory(
5440         IN      PRTMP_ADAPTER pAd,
5441         IN      UINT    Index,
5442         IN      ULONG   Length,
5443         IN      BOOLEAN Cached,
5444         OUT     PVOID   *VirtualAddress,
5445         OUT     PNDIS_PHYSICAL_ADDRESS PhysicalAddress);
5446
5447 void RTMP_AllocateFirstTxBuffer(
5448         IN      PRTMP_ADAPTER pAd,
5449         IN      UINT    Index,
5450         IN      ULONG   Length,
5451         IN      BOOLEAN Cached,
5452         OUT     PVOID   *VirtualAddress,
5453         OUT     PNDIS_PHYSICAL_ADDRESS PhysicalAddress);
5454
5455 void RTMP_AllocateMgmtDescMemory(
5456         IN      PRTMP_ADAPTER pAd,
5457         IN      ULONG   Length,
5458         IN      BOOLEAN Cached,
5459         OUT     PVOID   *VirtualAddress,
5460         OUT     PNDIS_PHYSICAL_ADDRESS PhysicalAddress);
5461
5462 void RTMP_AllocateRxDescMemory(
5463         IN      PRTMP_ADAPTER pAd,
5464         IN      ULONG   Length,
5465         IN      BOOLEAN Cached,
5466         OUT     PVOID   *VirtualAddress,
5467         OUT     PNDIS_PHYSICAL_ADDRESS PhysicalAddress);
5468
5469 PNDIS_PACKET RTMP_AllocateRxPacketBuffer(
5470         IN      PRTMP_ADAPTER pAd,
5471         IN      ULONG   Length,
5472         IN      BOOLEAN Cached,
5473         OUT     PVOID   *VirtualAddress,
5474         OUT     PNDIS_PHYSICAL_ADDRESS PhysicalAddress);
5475
5476 PNDIS_PACKET RTMP_AllocateTxPacketBuffer(
5477         IN      PRTMP_ADAPTER pAd,
5478         IN      ULONG   Length,
5479         IN      BOOLEAN Cached,
5480         OUT     PVOID   *VirtualAddress);
5481
5482 PNDIS_PACKET RTMP_AllocateFragPacketBuffer(
5483         IN      PRTMP_ADAPTER pAd,
5484         IN      ULONG   Length);
5485
5486 void RTMP_QueryPacketInfo(
5487         IN  PNDIS_PACKET pPacket,
5488         OUT PACKET_INFO  *pPacketInfo,
5489         OUT PUCHAR               *pSrcBufVA,
5490         OUT     UINT             *pSrcBufLen);
5491
5492 void RTMP_QueryNextPacketInfo(
5493         IN  PNDIS_PACKET *ppPacket,
5494         OUT PACKET_INFO  *pPacketInfo,
5495         OUT PUCHAR               *pSrcBufVA,
5496         OUT     UINT             *pSrcBufLen);
5497
5498
5499 BOOLEAN RTMP_FillTxBlkInfo(
5500         IN RTMP_ADAPTER *pAd,
5501         IN TX_BLK *pTxBlk);
5502
5503
5504 PRTMP_SCATTER_GATHER_LIST
5505 rt_get_sg_list_from_packet(PNDIS_PACKET pPacket, RTMP_SCATTER_GATHER_LIST *sg);
5506
5507
5508  void announce_802_3_packet(
5509         IN      PRTMP_ADAPTER   pAd,
5510         IN      PNDIS_PACKET    pPacket);
5511
5512
5513 UINT BA_Reorder_AMSDU_Annnounce(
5514         IN      PRTMP_ADAPTER   pAd,
5515         IN      PNDIS_PACKET    pPacket);
5516
5517
5518 UINT Handle_AMSDU_Packet(
5519         IN      PRTMP_ADAPTER   pAd,
5520         IN      PUCHAR                  pData,
5521         IN      ULONG                   DataSize,
5522         IN  UCHAR                       FromWhichBSSID);
5523
5524
5525 void convert_802_11_to_802_3_packet(
5526         IN      PRTMP_ADAPTER   pAd,
5527         IN      PNDIS_PACKET    pPacket,
5528         IN      PUCHAR                  p8023hdr,
5529         IN      PUCHAR                  pData,
5530         IN      ULONG                   DataSize,
5531         IN  UCHAR                       FromWhichBSSID);
5532
5533
5534 PNET_DEV get_netdev_from_bssid(
5535         IN      PRTMP_ADAPTER   pAd,
5536         IN      UCHAR                   FromWhichBSSID);
5537
5538
5539 PNDIS_PACKET duplicate_pkt(
5540         IN      PRTMP_ADAPTER   pAd,
5541         IN      PUCHAR                  pHeader802_3,
5542     IN  UINT            HdrLen,
5543         IN      PUCHAR                  pData,
5544         IN      ULONG                   DataSize,
5545         IN      UCHAR                   FromWhichBSSID);
5546
5547
5548 PNDIS_PACKET duplicate_pkt_with_TKIP_MIC(
5549         IN      PRTMP_ADAPTER   pAd,
5550         IN      PNDIS_PACKET    pOldPkt);
5551
5552 PNDIS_PACKET duplicate_pkt_with_VLAN(
5553         IN      PRTMP_ADAPTER   pAd,
5554         IN      PUCHAR                  pHeader802_3,
5555     IN  UINT            HdrLen,
5556         IN      PUCHAR                  pData,
5557         IN      ULONG                   DataSize,
5558         IN      UCHAR                   FromWhichBSSID);
5559
5560 PNDIS_PACKET duplicate_pkt_with_WPI(
5561         IN      PRTMP_ADAPTER   pAd,
5562         IN      PNDIS_PACKET    pPacket,
5563         IN      UINT32                  ext_head_len,
5564         IN      UINT32                  ext_tail_len);
5565
5566 UCHAR VLAN_8023_Header_Copy(
5567         IN      PRTMP_ADAPTER   pAd,
5568         IN      PUCHAR                  pHeader802_3,
5569         IN      UINT            HdrLen,
5570         OUT PUCHAR                      pData,
5571         IN      UCHAR                   FromWhichBSSID);
5572
5573 #ifdef DOT11_N_SUPPORT
5574 void ba_flush_reordering_timeout_mpdus(
5575         IN PRTMP_ADAPTER        pAd,
5576         IN PBA_REC_ENTRY        pBAEntry,
5577         IN ULONG                        Now32);
5578
5579
5580 VOID BAOriSessionSetUp(
5581                         IN PRTMP_ADAPTER    pAd,
5582                         IN MAC_TABLE_ENTRY      *pEntry,
5583                         IN UCHAR                        TID,
5584                         IN USHORT                       TimeOut,
5585                         IN ULONG                        DelayTime,
5586                         IN BOOLEAN              isForced);
5587
5588 VOID BASessionTearDownALL(
5589         IN OUT  PRTMP_ADAPTER pAd,
5590         IN              UCHAR Wcid);
5591 #endif // DOT11_N_SUPPORT //
5592
5593 BOOLEAN OS_Need_Clone_Packet(void);
5594
5595
5596 VOID build_tx_packet(
5597         IN      PRTMP_ADAPTER   pAd,
5598         IN      PNDIS_PACKET    pPacket,
5599         IN      PUCHAR  pFrame,
5600         IN      ULONG   FrameLen);
5601
5602
5603 VOID BAOriSessionTearDown(
5604         IN OUT  PRTMP_ADAPTER   pAd,
5605         IN              UCHAR                   Wcid,
5606         IN              UCHAR                   TID,
5607         IN              BOOLEAN                 bPassive,
5608         IN              BOOLEAN                 bForceSend);
5609
5610 VOID BARecSessionTearDown(
5611         IN OUT  PRTMP_ADAPTER   pAd,
5612         IN              UCHAR                   Wcid,
5613         IN              UCHAR                   TID,
5614         IN              BOOLEAN                 bPassive);
5615
5616 BOOLEAN ba_reordering_resource_init(PRTMP_ADAPTER pAd, int num);
5617 void ba_reordering_resource_release(PRTMP_ADAPTER pAd);
5618
5619 ULONG AutoChBssInsertEntry(
5620         IN PRTMP_ADAPTER pAd,
5621         IN PUCHAR pBssid,
5622         IN CHAR Ssid[],
5623         IN UCHAR SsidLen,
5624         IN UCHAR ChannelNo,
5625         IN CHAR Rssi);
5626
5627 void AutoChBssTableInit(
5628         IN PRTMP_ADAPTER pAd);
5629
5630 void ChannelInfoInit(
5631         IN PRTMP_ADAPTER pAd);
5632
5633 void AutoChBssTableDestroy(
5634         IN PRTMP_ADAPTER pAd);
5635
5636 void ChannelInfoDestroy(
5637         IN PRTMP_ADAPTER pAd);
5638
5639 UCHAR New_ApAutoSelectChannel(
5640         IN PRTMP_ADAPTER pAd);
5641
5642 BOOLEAN rtstrmactohex(
5643         IN char *s1,
5644         IN char *s2);
5645
5646 BOOLEAN rtstrcasecmp(
5647         IN char *s1,
5648         IN char *s2);
5649
5650 char *rtstrstruncasecmp(
5651         IN char *s1,
5652         IN char *s2);
5653
5654 char    *rtstrstr(
5655         IN      const char * s1,
5656         IN      const char * s2);
5657
5658 char *rstrtok(
5659         IN char * s,
5660         IN const char * ct);
5661
5662 int rtinet_aton(
5663         const char *cp,
5664         unsigned int *addr);
5665
5666 ////////// common ioctl functions //////////
5667 INT Set_DriverVersion_Proc(
5668         IN      PRTMP_ADAPTER   pAd,
5669         IN      PUCHAR                  arg);
5670
5671 INT Set_CountryRegion_Proc(
5672         IN      PRTMP_ADAPTER   pAd,
5673         IN      PUCHAR                  arg);
5674
5675 INT Set_CountryRegionABand_Proc(
5676         IN      PRTMP_ADAPTER   pAd,
5677         IN      PUCHAR                  arg);
5678
5679 INT Set_WirelessMode_Proc(
5680         IN      PRTMP_ADAPTER   pAd,
5681         IN      PUCHAR                  arg);
5682
5683 INT Set_Channel_Proc(
5684         IN      PRTMP_ADAPTER   pAd,
5685         IN      PUCHAR                  arg);
5686
5687 INT     Set_ShortSlot_Proc(
5688         IN      PRTMP_ADAPTER   pAd,
5689         IN      PUCHAR                  arg);
5690
5691 INT     Set_TxPower_Proc(
5692         IN      PRTMP_ADAPTER   pAd,
5693         IN      PUCHAR                  arg);
5694
5695 INT Set_BGProtection_Proc(
5696         IN  PRTMP_ADAPTER               pAd,
5697         IN  PUCHAR                      arg);
5698
5699 INT Set_TxPreamble_Proc(
5700         IN  PRTMP_ADAPTER               pAd,
5701         IN  PUCHAR                      arg);
5702
5703 INT Set_RTSThreshold_Proc(
5704         IN  PRTMP_ADAPTER               pAd,
5705         IN  PUCHAR                      arg);
5706
5707 INT Set_FragThreshold_Proc(
5708         IN  PRTMP_ADAPTER               pAd,
5709         IN  PUCHAR                      arg);
5710
5711 INT Set_TxBurst_Proc(
5712         IN  PRTMP_ADAPTER               pAd,
5713         IN  PUCHAR                      arg);
5714
5715 #ifdef AGGREGATION_SUPPORT
5716 INT     Set_PktAggregate_Proc(
5717         IN  PRTMP_ADAPTER               pAd,
5718         IN  PUCHAR                      arg);
5719 #endif
5720
5721 INT     Set_IEEE80211H_Proc(
5722         IN      PRTMP_ADAPTER   pAd,
5723         IN      PUCHAR                  arg);
5724
5725 #ifdef DBG
5726 INT     Set_Debug_Proc(
5727         IN      PRTMP_ADAPTER   pAd,
5728         IN      PUCHAR                  arg);
5729 #endif
5730
5731 INT     Show_DescInfo_Proc(
5732         IN      PRTMP_ADAPTER   pAd,
5733         IN      PUCHAR                  arg);
5734
5735 INT     Set_ResetStatCounter_Proc(
5736         IN      PRTMP_ADAPTER   pAd,
5737         IN      PUCHAR                  arg);
5738
5739 #ifdef DOT11_N_SUPPORT
5740 INT     Set_BASetup_Proc(
5741         IN      PRTMP_ADAPTER   pAd,
5742         IN      PUCHAR                  arg);
5743
5744 INT     Set_BADecline_Proc(
5745         IN      PRTMP_ADAPTER   pAd,
5746         IN      PUCHAR                  arg);
5747
5748 INT     Set_BAOriTearDown_Proc(
5749         IN      PRTMP_ADAPTER   pAd,
5750         IN      PUCHAR                  arg);
5751
5752 INT     Set_BARecTearDown_Proc(
5753         IN      PRTMP_ADAPTER   pAd,
5754         IN      PUCHAR                  arg);
5755
5756 INT     Set_HtBw_Proc(
5757         IN      PRTMP_ADAPTER   pAd,
5758         IN      PUCHAR                  arg);
5759
5760 INT     Set_HtMcs_Proc(
5761         IN      PRTMP_ADAPTER   pAd,
5762         IN      PUCHAR                  arg);
5763
5764 INT     Set_HtGi_Proc(
5765         IN      PRTMP_ADAPTER   pAd,
5766         IN      PUCHAR                  arg);
5767
5768 INT     Set_HtOpMode_Proc(
5769         IN      PRTMP_ADAPTER   pAd,
5770         IN      PUCHAR                  arg);
5771
5772 INT     Set_HtStbc_Proc(
5773         IN      PRTMP_ADAPTER   pAd,
5774         IN      PUCHAR                  arg);
5775
5776 INT     Set_HtHtc_Proc(
5777         IN      PRTMP_ADAPTER   pAd,
5778         IN      PUCHAR                  arg);
5779
5780 INT     Set_HtExtcha_Proc(
5781         IN      PRTMP_ADAPTER   pAd,
5782         IN      PUCHAR                  arg);
5783
5784 INT     Set_HtMpduDensity_Proc(
5785         IN      PRTMP_ADAPTER   pAd,
5786         IN      PUCHAR                  arg);
5787
5788 INT     Set_HtBaWinSize_Proc(
5789         IN      PRTMP_ADAPTER   pAd,
5790         IN      PUCHAR                  arg);
5791
5792 INT     Set_HtRdg_Proc(
5793         IN      PRTMP_ADAPTER   pAd,
5794         IN      PUCHAR                  arg);
5795
5796 INT     Set_HtLinkAdapt_Proc(
5797         IN      PRTMP_ADAPTER   pAd,
5798         IN      PUCHAR                  arg);
5799
5800 INT     Set_HtAmsdu_Proc(
5801         IN      PRTMP_ADAPTER   pAd,
5802         IN      PUCHAR                  arg);
5803
5804 INT     Set_HtAutoBa_Proc(
5805         IN      PRTMP_ADAPTER   pAd,
5806         IN      PUCHAR                  arg);
5807
5808 INT     Set_HtProtect_Proc(
5809         IN      PRTMP_ADAPTER   pAd,
5810         IN      PUCHAR                  arg);
5811
5812 INT     Set_HtMimoPs_Proc(
5813         IN      PRTMP_ADAPTER   pAd,
5814         IN      PUCHAR                  arg);
5815
5816
5817 INT     Set_ForceShortGI_Proc(
5818         IN      PRTMP_ADAPTER   pAd,
5819         IN      PUCHAR                  arg);
5820
5821 INT     Set_ForceGF_Proc(
5822         IN      PRTMP_ADAPTER   pAd,
5823         IN      PUCHAR                  arg);
5824
5825 INT     SetCommonHT(
5826         IN      PRTMP_ADAPTER   pAd);
5827
5828 INT     Set_SendPSMPAction_Proc(
5829         IN      PRTMP_ADAPTER   pAd,
5830         IN      PUCHAR                  arg);
5831
5832 INT     Set_HtMIMOPSmode_Proc(
5833         IN      PRTMP_ADAPTER   pAd,
5834         IN      PUCHAR                  arg);
5835
5836
5837 INT     Set_HtTxBASize_Proc(
5838         IN      PRTMP_ADAPTER   pAd,
5839         IN      PUCHAR                  arg);
5840 #endif // DOT11_N_SUPPORT //
5841
5842 //Dls , kathy
5843 VOID RTMPSendDLSTearDownFrame(
5844         IN      PRTMP_ADAPTER   pAd,
5845         IN      PUCHAR                  pDA);
5846
5847 #ifdef DOT11_N_SUPPORT
5848 //Block ACK
5849 VOID QueryBATABLE(
5850         IN  PRTMP_ADAPTER pAd,
5851         OUT PQUERYBA_TABLE pBAT);
5852 #endif // DOT11_N_SUPPORT //
5853
5854 #ifdef WPA_SUPPLICANT_SUPPORT
5855 INT         WpaCheckEapCode(
5856         IN  PRTMP_ADAPTER       pAd,
5857         IN  PUCHAR                              pFrame,
5858         IN  USHORT                              FrameLen,
5859         IN  USHORT                              OffSet);
5860
5861 VOID    WpaSendMicFailureToWpaSupplicant(
5862     IN  PRTMP_ADAPTER       pAd,
5863     IN  BOOLEAN             bUnicast);
5864
5865 VOID    SendAssocIEsToWpaSupplicant(
5866     IN  PRTMP_ADAPTER       pAd);
5867 #endif // WPA_SUPPLICANT_SUPPORT //
5868
5869 int wext_notify_event_assoc(
5870         IN  RTMP_ADAPTER *pAd);
5871
5872 #ifdef DOT11_N_SUPPORT
5873 VOID Handle_BSS_Width_Trigger_Events(
5874         IN PRTMP_ADAPTER pAd);
5875
5876 void build_ext_channel_switch_ie(
5877         IN PRTMP_ADAPTER pAd,
5878         IN HT_EXT_CHANNEL_SWITCH_ANNOUNCEMENT_IE *pIE);
5879 #endif // DOT11_N_SUPPORT //
5880
5881
5882 BOOLEAN APRxDoneInterruptHandle(
5883         IN      PRTMP_ADAPTER   pAd);
5884
5885 BOOLEAN STARxDoneInterruptHandle(
5886         IN      PRTMP_ADAPTER   pAd,
5887         IN      BOOLEAN                 argc);
5888
5889 #ifdef DOT11_N_SUPPORT
5890 // AMPDU packet indication
5891 VOID Indicate_AMPDU_Packet(
5892         IN      PRTMP_ADAPTER   pAd,
5893         IN      RX_BLK                  *pRxBlk,
5894         IN      UCHAR                   FromWhichBSSID);
5895
5896 // AMSDU packet indication
5897 VOID Indicate_AMSDU_Packet(
5898         IN      PRTMP_ADAPTER   pAd,
5899         IN      RX_BLK                  *pRxBlk,
5900         IN      UCHAR                   FromWhichBSSID);
5901 #endif // DOT11_N_SUPPORT //
5902
5903 // Normal legacy Rx packet indication
5904 VOID Indicate_Legacy_Packet(
5905         IN      PRTMP_ADAPTER   pAd,
5906         IN      RX_BLK                  *pRxBlk,
5907         IN      UCHAR                   FromWhichBSSID);
5908
5909 VOID Indicate_EAPOL_Packet(
5910         IN      PRTMP_ADAPTER   pAd,
5911         IN      RX_BLK                  *pRxBlk,
5912         IN      UCHAR                   FromWhichBSSID);
5913
5914 void  update_os_packet_info(
5915         IN      PRTMP_ADAPTER   pAd,
5916         IN      RX_BLK                  *pRxBlk,
5917         IN      UCHAR                   FromWhichBSSID);
5918
5919 void wlan_802_11_to_802_3_packet(
5920         IN      PRTMP_ADAPTER   pAd,
5921         IN      RX_BLK                  *pRxBlk,
5922         IN      PUCHAR                  pHeader802_3,
5923         IN  UCHAR                       FromWhichBSSID);
5924
5925 UINT deaggregate_AMSDU_announce(
5926         IN      PRTMP_ADAPTER   pAd,
5927         PNDIS_PACKET            pPacket,
5928         IN      PUCHAR                  pData,
5929         IN      ULONG                   DataSize);
5930
5931 // remove LLC and get 802_3 Header
5932 #define  RTMP_802_11_REMOVE_LLC_AND_CONVERT_TO_802_3(_pRxBlk, _pHeader802_3)    \
5933 {                                                                                                                                                               \
5934         PUCHAR _pRemovedLLCSNAP = NULL, _pDA, _pSA;                                 \
5935                                                                                                                                                                 \
5936         if (RX_BLK_TEST_FLAG(_pRxBlk, fRX_MESH))                                    \
5937         {                                                                           \
5938                 _pDA = _pRxBlk->pHeader->Addr3;                                         \
5939                 _pSA = (PUCHAR)_pRxBlk->pHeader + sizeof(HEADER_802_11);                \
5940         }                                                                           \
5941         else                                                                        \
5942         {                                                                           \
5943                 if (RX_BLK_TEST_FLAG(_pRxBlk, fRX_INFRA))                               \
5944                 {                                                                       \
5945                         _pDA = _pRxBlk->pHeader->Addr1;                                     \
5946                 if (RX_BLK_TEST_FLAG(_pRxBlk, fRX_DLS))                                                                 \
5947                         _pSA = _pRxBlk->pHeader->Addr2;                                                                         \
5948                 else                                                                                                                                    \
5949                         _pSA = _pRxBlk->pHeader->Addr3;                                     \
5950                 }                                                                       \
5951                 else                                                                    \
5952                 {                                                                       \
5953                         _pDA = _pRxBlk->pHeader->Addr1;                                     \
5954                         _pSA = _pRxBlk->pHeader->Addr2;                                     \
5955                 }                                                                       \
5956         }                                                                           \
5957                                                                                                                                                                 \
5958         CONVERT_TO_802_3(_pHeader802_3, _pDA, _pSA, _pRxBlk->pData,                             \
5959                 _pRxBlk->DataSize, _pRemovedLLCSNAP);                                   \
5960 }
5961
5962 BOOLEAN APFowardWirelessStaToWirelessSta(
5963         IN      PRTMP_ADAPTER   pAd,
5964         IN      PNDIS_PACKET    pPacket,
5965         IN      ULONG                   FromWhichBSSID);
5966
5967 VOID Announce_or_Forward_802_3_Packet(
5968         IN      PRTMP_ADAPTER   pAd,
5969         IN      PNDIS_PACKET    pPacket,
5970         IN      UCHAR                   FromWhichBSSID);
5971
5972 VOID Sta_Announce_or_Forward_802_3_Packet(
5973         IN      PRTMP_ADAPTER   pAd,
5974         IN      PNDIS_PACKET    pPacket,
5975         IN      UCHAR                   FromWhichBSSID);
5976
5977 #define ANNOUNCE_OR_FORWARD_802_3_PACKET(_pAd, _pPacket, _FromWhichBSS)\
5978                         Sta_Announce_or_Forward_802_3_Packet(_pAd, _pPacket, _FromWhichBSS);
5979                         //announce_802_3_packet(_pAd, _pPacket);
5980
5981 PNDIS_PACKET DuplicatePacket(
5982         IN      PRTMP_ADAPTER   pAd,
5983         IN      PNDIS_PACKET    pPacket,
5984         IN      UCHAR                   FromWhichBSSID);
5985
5986
5987 PNDIS_PACKET ClonePacket(
5988         IN      PRTMP_ADAPTER   pAd,
5989         IN      PNDIS_PACKET    pPacket,
5990         IN      PUCHAR                  pData,
5991         IN      ULONG                   DataSize);
5992
5993
5994 // Normal, AMPDU or AMSDU
5995 VOID CmmRxnonRalinkFrameIndicate(
5996         IN      PRTMP_ADAPTER   pAd,
5997         IN      RX_BLK                  *pRxBlk,
5998         IN      UCHAR                   FromWhichBSSID);
5999
6000 VOID CmmRxRalinkFrameIndicate(
6001         IN      PRTMP_ADAPTER   pAd,
6002         IN      MAC_TABLE_ENTRY *pEntry,
6003         IN      RX_BLK                  *pRxBlk,
6004         IN      UCHAR                   FromWhichBSSID);
6005
6006 VOID Update_Rssi_Sample(
6007         IN PRTMP_ADAPTER        pAd,
6008         IN RSSI_SAMPLE          *pRssi,
6009         IN PRXWI_STRUC          pRxWI);
6010
6011 PNDIS_PACKET GetPacketFromRxRing(
6012         IN              PRTMP_ADAPTER   pAd,
6013         OUT             PRT28XX_RXD_STRUC               pSaveRxD,
6014         OUT             BOOLEAN                 *pbReschedule,
6015         IN OUT  UINT32                  *pRxPending);
6016
6017 PNDIS_PACKET RTMPDeFragmentDataFrame(
6018         IN      PRTMP_ADAPTER   pAd,
6019         IN      RX_BLK                  *pRxBlk);
6020
6021 ////////////////////////////////////////
6022 enum {
6023         DIDmsg_lnxind_wlansniffrm               = 0x00000044,
6024         DIDmsg_lnxind_wlansniffrm_hosttime      = 0x00010044,
6025         DIDmsg_lnxind_wlansniffrm_mactime       = 0x00020044,
6026         DIDmsg_lnxind_wlansniffrm_channel       = 0x00030044,
6027         DIDmsg_lnxind_wlansniffrm_rssi          = 0x00040044,
6028         DIDmsg_lnxind_wlansniffrm_sq            = 0x00050044,
6029         DIDmsg_lnxind_wlansniffrm_signal        = 0x00060044,
6030         DIDmsg_lnxind_wlansniffrm_noise         = 0x00070044,
6031         DIDmsg_lnxind_wlansniffrm_rate          = 0x00080044,
6032         DIDmsg_lnxind_wlansniffrm_istx          = 0x00090044,
6033         DIDmsg_lnxind_wlansniffrm_frmlen        = 0x000A0044
6034 };
6035 enum {
6036         P80211ENUM_msgitem_status_no_value      = 0x00
6037 };
6038 enum {
6039         P80211ENUM_truth_false                  = 0x00,
6040         P80211ENUM_truth_true                   = 0x01
6041 };
6042
6043 /* Definition from madwifi */
6044 typedef struct {
6045         UINT32 did;
6046         UINT16 status;
6047         UINT16 len;
6048         UINT32 data;
6049 } p80211item_uint32_t;
6050
6051 typedef struct {
6052         UINT32 msgcode;
6053         UINT32 msglen;
6054 #define WLAN_DEVNAMELEN_MAX 16
6055         UINT8 devname[WLAN_DEVNAMELEN_MAX];
6056         p80211item_uint32_t hosttime;
6057         p80211item_uint32_t mactime;
6058         p80211item_uint32_t channel;
6059         p80211item_uint32_t rssi;
6060         p80211item_uint32_t sq;
6061         p80211item_uint32_t signal;
6062         p80211item_uint32_t noise;
6063         p80211item_uint32_t rate;
6064         p80211item_uint32_t istx;
6065         p80211item_uint32_t frmlen;
6066 } wlan_ng_prism2_header;
6067
6068 /* The radio capture header precedes the 802.11 header. */
6069 typedef struct PACKED _ieee80211_radiotap_header {
6070     UINT8       it_version;     /* Version 0. Only increases
6071                                  * for drastic changes,
6072                                  * introduction of compatible
6073                                  * new fields does not count.
6074                                  */
6075     UINT8       it_pad;
6076     UINT16     it_len;         /* length of the whole
6077                                  * header in bytes, including
6078                                  * it_version, it_pad,
6079                                  * it_len, and data fields.
6080                                  */
6081     UINT32   it_present;        /* A bitmap telling which
6082                                          * fields are present. Set bit 31
6083                                          * (0x80000000) to extend the
6084                                          * bitmap by another 32 bits.
6085                                          * Additional extensions are made
6086                                          * by setting bit 31.
6087                                          */
6088 }ieee80211_radiotap_header ;
6089
6090 enum ieee80211_radiotap_type {
6091     IEEE80211_RADIOTAP_TSFT = 0,
6092     IEEE80211_RADIOTAP_FLAGS = 1,
6093     IEEE80211_RADIOTAP_RATE = 2,
6094     IEEE80211_RADIOTAP_CHANNEL = 3,
6095     IEEE80211_RADIOTAP_FHSS = 4,
6096     IEEE80211_RADIOTAP_DBM_ANTSIGNAL = 5,
6097     IEEE80211_RADIOTAP_DBM_ANTNOISE = 6,
6098     IEEE80211_RADIOTAP_LOCK_QUALITY = 7,
6099     IEEE80211_RADIOTAP_TX_ATTENUATION = 8,
6100     IEEE80211_RADIOTAP_DB_TX_ATTENUATION = 9,
6101     IEEE80211_RADIOTAP_DBM_TX_POWER = 10,
6102     IEEE80211_RADIOTAP_ANTENNA = 11,
6103     IEEE80211_RADIOTAP_DB_ANTSIGNAL = 12,
6104     IEEE80211_RADIOTAP_DB_ANTNOISE = 13
6105 };
6106
6107 #define WLAN_RADIOTAP_PRESENT (                 \
6108         (1 << IEEE80211_RADIOTAP_TSFT)  |       \
6109         (1 << IEEE80211_RADIOTAP_FLAGS) |       \
6110         (1 << IEEE80211_RADIOTAP_RATE)  |       \
6111          0)
6112
6113 typedef struct _wlan_radiotap_header {
6114         ieee80211_radiotap_header wt_ihdr;
6115         INT64 wt_tsft;
6116         UINT8 wt_flags;
6117         UINT8 wt_rate;
6118 } wlan_radiotap_header;
6119 /* Definition from madwifi */
6120
6121 void send_monitor_packets(
6122         IN      PRTMP_ADAPTER   pAd,
6123         IN      RX_BLK                  *pRxBlk);
6124
6125 #if WIRELESS_EXT >= 12
6126 // This function will be called when query /proc
6127 struct iw_statistics *rt28xx_get_wireless_stats(
6128     IN struct net_device *net_dev);
6129 #endif
6130
6131 VOID    RTMPSetDesiredRates(
6132     IN  PRTMP_ADAPTER   pAdapter,
6133     IN  LONG            Rates);
6134
6135 INT     Set_FixedTxMode_Proc(
6136         IN      PRTMP_ADAPTER   pAd,
6137         IN      PUCHAR                  arg);
6138
6139 static inline char* GetPhyMode(
6140         int Mode)
6141 {
6142         switch(Mode)
6143         {
6144                 case MODE_CCK:
6145                         return "CCK";
6146
6147                 case MODE_OFDM:
6148                         return "OFDM";
6149 #ifdef DOT11_N_SUPPORT
6150                 case MODE_HTMIX:
6151                         return "HTMIX";
6152
6153                 case MODE_HTGREENFIELD:
6154                         return "GREEN";
6155 #endif // DOT11_N_SUPPORT //
6156                 default:
6157                         return "N/A";
6158         }
6159 }
6160
6161
6162 static inline char* GetBW(
6163         int BW)
6164 {
6165         switch(BW)
6166         {
6167                 case BW_10:
6168                         return "10M";
6169
6170                 case BW_20:
6171                         return "20M";
6172 #ifdef DOT11_N_SUPPORT
6173                 case BW_40:
6174                         return "40M";
6175 #endif // DOT11_N_SUPPORT //
6176                 default:
6177                         return "N/A";
6178         }
6179 }
6180
6181
6182 VOID RT28xxThreadTerminate(
6183         IN RTMP_ADAPTER *pAd);
6184
6185 BOOLEAN RT28XXChipsetCheck(
6186         IN void *_dev_p);
6187
6188 BOOLEAN RT28XXNetDevInit(
6189         IN void                                 *_dev_p,
6190         IN struct  net_device   *net_dev,
6191         IN RTMP_ADAPTER                 *pAd);
6192
6193 BOOLEAN RT28XXProbePostConfig(
6194         IN void                                 *_dev_p,
6195         IN RTMP_ADAPTER                 *pAd,
6196         IN INT32                                argc);
6197
6198 VOID RT28XXDMADisable(
6199         IN RTMP_ADAPTER                 *pAd);
6200
6201 VOID RT28XXDMAEnable(
6202         IN RTMP_ADAPTER                 *pAd);
6203
6204 VOID RT28xx_UpdateBeaconToAsic(
6205         IN RTMP_ADAPTER * pAd,
6206         IN INT apidx,
6207         IN ULONG BeaconLen,
6208         IN ULONG UpdatePos);
6209
6210 INT rt28xx_ioctl(
6211         IN      struct net_device       *net_dev,
6212         IN      OUT     struct ifreq    *rq,
6213         IN      INT                     cmd);
6214
6215 INT rt28xx_sta_ioctl(
6216         IN      struct net_device       *net_dev,
6217         IN      OUT     struct ifreq    *rq,
6218         IN      INT                     cmd);
6219
6220 BOOLEAN RT28XXSecurityKeyAdd(
6221         IN              PRTMP_ADAPTER           pAd,
6222         IN              ULONG                           apidx,
6223         IN              ULONG                           KeyIdx,
6224         IN              MAC_TABLE_ENTRY         *pEntry);
6225
6226 ////////////////////////////////////////
6227 PNDIS_PACKET GetPacketFromRxRing(
6228         IN              PRTMP_ADAPTER   pAd,
6229         OUT             PRT28XX_RXD_STRUC       pSaveRxD,
6230         OUT             BOOLEAN                 *pbReschedule,
6231         IN OUT  UINT32                  *pRxPending);
6232
6233
6234 void kill_thread_task(PRTMP_ADAPTER pAd);
6235
6236 void tbtt_tasklet(unsigned long data);
6237
6238
6239 VOID AsicTurnOffRFClk(
6240         IN PRTMP_ADAPTER    pAd,
6241         IN      UCHAR           Channel);
6242
6243 VOID AsicTurnOnRFClk(
6244         IN PRTMP_ADAPTER        pAd,
6245         IN      UCHAR                   Channel);
6246
6247 #ifdef RT2870
6248 //
6249 // Function Prototype in rtusb_bulk.c
6250 //
6251 VOID    RTUSBInitTxDesc(
6252         IN      PRTMP_ADAPTER   pAd,
6253         IN      PTX_CONTEXT             pTxContext,
6254         IN      UCHAR                   BulkOutPipeId,
6255         IN      usb_complete_t  Func);
6256
6257 VOID    RTUSBInitHTTxDesc(
6258         IN      PRTMP_ADAPTER   pAd,
6259         IN      PHT_TX_CONTEXT  pTxContext,
6260         IN      UCHAR                   BulkOutPipeId,
6261         IN      ULONG                   BulkOutSize,
6262         IN      usb_complete_t  Func);
6263
6264 VOID    RTUSBInitRxDesc(
6265         IN      PRTMP_ADAPTER   pAd,
6266         IN      PRX_CONTEXT             pRxContext);
6267
6268 VOID RTUSBCleanUpDataBulkOutQueue(
6269         IN      PRTMP_ADAPTER   pAd);
6270
6271 VOID RTUSBCancelPendingBulkOutIRP(
6272         IN      PRTMP_ADAPTER   pAd);
6273
6274 VOID RTUSBBulkOutDataPacket(
6275         IN      PRTMP_ADAPTER   pAd,
6276         IN      UCHAR                   BulkOutPipeId,
6277         IN      UCHAR                   Index);
6278
6279 VOID RTUSBBulkOutNullFrame(
6280         IN      PRTMP_ADAPTER   pAd);
6281
6282 VOID RTUSBBulkOutRTSFrame(
6283         IN      PRTMP_ADAPTER   pAd);
6284
6285 VOID RTUSBCancelPendingBulkInIRP(
6286         IN      PRTMP_ADAPTER   pAd);
6287
6288 VOID RTUSBCancelPendingIRPs(
6289         IN      PRTMP_ADAPTER   pAd);
6290
6291 VOID RTUSBBulkOutMLMEPacket(
6292         IN      PRTMP_ADAPTER   pAd,
6293         IN      UCHAR                   Index);
6294
6295 VOID RTUSBBulkOutPsPoll(
6296         IN      PRTMP_ADAPTER   pAd);
6297
6298 VOID RTUSBCleanUpMLMEBulkOutQueue(
6299         IN      PRTMP_ADAPTER   pAd);
6300
6301 VOID RTUSBKickBulkOut(
6302         IN      PRTMP_ADAPTER pAd);
6303
6304 VOID    RTUSBBulkReceive(
6305         IN      PRTMP_ADAPTER   pAd);
6306
6307 VOID DoBulkIn(
6308         IN RTMP_ADAPTER *pAd);
6309
6310 VOID RTUSBInitRxDesc(
6311         IN      PRTMP_ADAPTER   pAd,
6312         IN  PRX_CONTEXT         pRxContext);
6313
6314 VOID RTUSBBulkRxHandle(
6315         IN unsigned long data);
6316
6317 //
6318 // Function Prototype in rtusb_io.c
6319 //
6320 NTSTATUS RTUSBMultiRead(
6321         IN      PRTMP_ADAPTER   pAd,
6322         IN      USHORT                  Offset,
6323         OUT     PUCHAR                  pData,
6324         IN      USHORT                  length);
6325
6326 NTSTATUS RTUSBMultiWrite(
6327         IN      PRTMP_ADAPTER   pAd,
6328         IN      USHORT                  Offset,
6329         IN      PUCHAR                  pData,
6330         IN      USHORT                  length);
6331
6332 NTSTATUS RTUSBMultiWrite_OneByte(
6333         IN      PRTMP_ADAPTER   pAd,
6334         IN      USHORT                  Offset,
6335         IN      PUCHAR                  pData);
6336
6337 NTSTATUS RTUSBReadBBPRegister(
6338         IN      PRTMP_ADAPTER   pAd,
6339         IN      UCHAR                   Id,
6340         IN      PUCHAR                  pValue);
6341
6342 NTSTATUS RTUSBWriteBBPRegister(
6343         IN      PRTMP_ADAPTER   pAd,
6344         IN      UCHAR                   Id,
6345         IN      UCHAR                   Value);
6346
6347 NTSTATUS RTUSBWriteRFRegister(
6348         IN      PRTMP_ADAPTER   pAd,
6349         IN      UINT32                  Value);
6350
6351 NTSTATUS        RT30xxWriteRFRegister(
6352         IN      PRTMP_ADAPTER   pAd,
6353         IN      UCHAR                   RegID,
6354         IN      UCHAR                   Value);
6355
6356 NTSTATUS        RT30xxReadRFRegister(
6357         IN      PRTMP_ADAPTER   pAd,
6358         IN      UCHAR                   RegID,
6359         IN      PUCHAR                  pValue);
6360
6361 NTSTATUS RTUSB_VendorRequest(
6362         IN      PRTMP_ADAPTER   pAd,
6363         IN      UINT32                  TransferFlags,
6364         IN      UCHAR                   ReservedBits,
6365         IN      UCHAR                   Request,
6366         IN      USHORT                  Value,
6367         IN      USHORT                  Index,
6368         IN      PVOID                   TransferBuffer,
6369         IN      UINT32                  TransferBufferLength);
6370
6371 NTSTATUS RTUSBReadEEPROM(
6372         IN      PRTMP_ADAPTER   pAd,
6373         IN      USHORT                  Offset,
6374         OUT     PUCHAR                  pData,
6375         IN      USHORT                  length);
6376
6377 NTSTATUS RTUSBWriteEEPROM(
6378         IN      PRTMP_ADAPTER   pAd,
6379         IN      USHORT                  Offset,
6380         IN      PUCHAR                  pData,
6381         IN      USHORT                  length);
6382
6383 VOID RTUSBPutToSleep(
6384         IN      PRTMP_ADAPTER   pAd);
6385
6386 NTSTATUS RTUSBWakeUp(
6387         IN      PRTMP_ADAPTER   pAd);
6388
6389 VOID RTUSBInitializeCmdQ(
6390         IN      PCmdQ   cmdq);
6391
6392 NDIS_STATUS     RTUSBEnqueueCmdFromNdis(
6393         IN      PRTMP_ADAPTER   pAd,
6394         IN      NDIS_OID                Oid,
6395         IN      BOOLEAN                 SetInformation,
6396         IN      PVOID                   pInformationBuffer,
6397         IN      UINT32                  InformationBufferLength);
6398
6399 NDIS_STATUS RTUSBEnqueueInternalCmd(
6400         IN      PRTMP_ADAPTER   pAd,
6401         IN NDIS_OID                     Oid,
6402         IN PVOID                        pInformationBuffer,
6403         IN UINT32                       InformationBufferLength);
6404
6405 VOID RTUSBDequeueCmd(
6406         IN      PCmdQ           cmdq,
6407         OUT     PCmdQElmt       *pcmdqelmt);
6408
6409 INT RTUSBCmdThread(
6410         IN OUT PVOID Context);
6411
6412 INT TimerQThread(
6413         IN OUT PVOID Context);
6414
6415 RT2870_TIMER_ENTRY *RT2870_TimerQ_Insert(
6416         IN RTMP_ADAPTER *pAd,
6417         IN RALINK_TIMER_STRUCT *pTimer);
6418
6419 BOOLEAN RT2870_TimerQ_Remove(
6420         IN RTMP_ADAPTER *pAd,
6421         IN RALINK_TIMER_STRUCT *pTimer);
6422
6423 void RT2870_TimerQ_Exit(
6424         IN RTMP_ADAPTER *pAd);
6425
6426 void RT2870_TimerQ_Init(
6427         IN RTMP_ADAPTER *pAd);
6428
6429 VOID RT2870_BssBeaconExit(
6430         IN RTMP_ADAPTER *pAd);
6431
6432 VOID RT2870_BssBeaconStop(
6433         IN RTMP_ADAPTER *pAd);
6434
6435 VOID RT2870_BssBeaconStart(
6436         IN RTMP_ADAPTER * pAd);
6437
6438 VOID RT2870_BssBeaconInit(
6439         IN RTMP_ADAPTER *pAd);
6440
6441 VOID RT2870_WatchDog(
6442         IN RTMP_ADAPTER *pAd);
6443
6444 NTSTATUS RTUSBWriteMACRegister(
6445         IN      PRTMP_ADAPTER   pAd,
6446         IN      USHORT                  Offset,
6447         IN      UINT32                  Value);
6448
6449 NTSTATUS RTUSBReadMACRegister(
6450         IN      PRTMP_ADAPTER   pAd,
6451         IN      USHORT                  Offset,
6452         OUT     PUINT32                 pValue);
6453
6454 NTSTATUS RTUSBSingleWrite(
6455         IN      RTMP_ADAPTER    *pAd,
6456         IN      USHORT                  Offset,
6457         IN      USHORT                  Value);
6458
6459 NTSTATUS RTUSBFirmwareRun(
6460         IN      PRTMP_ADAPTER   pAd);
6461
6462 NTSTATUS RTUSBFirmwareWrite(
6463         IN PRTMP_ADAPTER pAd,
6464         IN PUCHAR               pFwImage,
6465         IN ULONG                FwLen);
6466
6467 NTSTATUS        RTUSBFirmwareOpmode(
6468         IN      PRTMP_ADAPTER   pAd,
6469         OUT     PUINT32                 pValue);
6470
6471 NTSTATUS        RTUSBVenderReset(
6472         IN      PRTMP_ADAPTER   pAd);
6473
6474 NDIS_STATUS RTUSBSetHardWareRegister(
6475         IN      PRTMP_ADAPTER   pAdapter,
6476         IN      PVOID                   pBuf);
6477
6478 NDIS_STATUS RTUSBQueryHardWareRegister(
6479         IN      PRTMP_ADAPTER   pAdapter,
6480         IN      PVOID                   pBuf);
6481
6482 VOID CMDHandler(
6483     IN PRTMP_ADAPTER pAd);
6484
6485
6486 NDIS_STATUS      CreateThreads(
6487         IN      struct net_device *net_dev );
6488
6489
6490 VOID MacTableInitialize(
6491         IN  PRTMP_ADAPTER   pAd);
6492
6493 VOID MlmeSetPsm(
6494         IN PRTMP_ADAPTER pAd,
6495         IN USHORT psm);
6496
6497 NDIS_STATUS RTMPWPAAddKeyProc(
6498         IN  PRTMP_ADAPTER   pAd,
6499         IN  PVOID           pBuf);
6500
6501 VOID AsicRxAntEvalAction(
6502         IN PRTMP_ADAPTER pAd);
6503
6504 #if 0 // Mark because not used in RT28xx.
6505 NTSTATUS RTUSBRxPacket(
6506         IN      PRTMP_ADAPTER  pAd,
6507         IN    BOOLEAN          bBulkReceive);
6508
6509 VOID RTUSBDequeueMLMEPacket(
6510         IN      PRTMP_ADAPTER   pAd);
6511
6512 VOID RTUSBCleanUpMLMEWaitQueue(
6513         IN      PRTMP_ADAPTER   pAd);
6514 #endif
6515
6516 void append_pkt(
6517         IN      PRTMP_ADAPTER   pAd,
6518         IN      PUCHAR                  pHeader802_3,
6519     IN  UINT            HdrLen,
6520         IN      PUCHAR                  pData,
6521         IN      ULONG                   DataSize,
6522         OUT  PNDIS_PACKET       *ppPacket);
6523
6524 UINT deaggregate_AMSDU_announce(
6525         IN      PRTMP_ADAPTER   pAd,
6526         PNDIS_PACKET            pPacket,
6527         IN      PUCHAR                  pData,
6528         IN      ULONG                   DataSize);
6529
6530 NDIS_STATUS     RTMPCheckRxError(
6531         IN      PRTMP_ADAPTER   pAd,
6532         IN      PHEADER_802_11  pHeader,
6533         IN      PRXWI_STRUC     pRxWI,
6534         IN      PRT28XX_RXD_STRUC       pRxINFO);
6535
6536
6537 VOID RTUSBMlmeHardTransmit(
6538         IN      PRTMP_ADAPTER   pAd,
6539         IN      PMGMT_STRUC             pMgmt);
6540
6541 INT MlmeThread(
6542         IN PVOID Context);
6543
6544 #if 0
6545 VOID    RTUSBResumeMsduTransmission(
6546         IN      PRTMP_ADAPTER   pAd);
6547
6548 VOID    RTUSBSuspendMsduTransmission(
6549         IN      PRTMP_ADAPTER   pAd);
6550 #endif
6551
6552 //
6553 // Function Prototype in rtusb_data.c
6554 //
6555 NDIS_STATUS     RTUSBFreeDescriptorRequest(
6556         IN      PRTMP_ADAPTER   pAd,
6557         IN      UCHAR                   BulkOutPipeId,
6558         IN      UINT32                  NumberRequired);
6559
6560
6561 BOOLEAN RTUSBNeedQueueBackForAgg(
6562         IN RTMP_ADAPTER *pAd,
6563         IN UCHAR                BulkOutPipeId);
6564
6565
6566 VOID RTMPWriteTxInfo(
6567         IN      PRTMP_ADAPTER   pAd,
6568         IN      PTXINFO_STRUC   pTxInfo,
6569         IN        USHORT                USBDMApktLen,
6570         IN        BOOLEAN               bWiv,
6571         IN        UCHAR                 QueueSel,
6572         IN        UCHAR                 NextValid,
6573         IN        UCHAR                 TxBurst);
6574
6575 //
6576 // Function Prototype in cmm_data_2870.c
6577 //
6578 USHORT RtmpUSB_WriteSubTxResource(
6579         IN      PRTMP_ADAPTER   pAd,
6580         IN      TX_BLK                  *pTxBlk,
6581         IN      BOOLEAN                 bIsLast,
6582         OUT     USHORT                  *FreeNumber);
6583
6584 USHORT RtmpUSB_WriteSingleTxResource(
6585         IN      PRTMP_ADAPTER   pAd,
6586         IN      TX_BLK                  *pTxBlk,
6587         IN      BOOLEAN                 bIsLast,
6588         OUT     USHORT                  *FreeNumber);
6589
6590 USHORT  RtmpUSB_WriteFragTxResource(
6591         IN      PRTMP_ADAPTER   pAd,
6592         IN      TX_BLK                  *pTxBlk,
6593         IN      UCHAR                   fragNum,
6594         OUT     USHORT                  *FreeNumber);
6595
6596 USHORT RtmpUSB_WriteMultiTxResource(
6597         IN      PRTMP_ADAPTER   pAd,
6598         IN      TX_BLK                  *pTxBlk,
6599         IN      UCHAR                   frameNum,
6600         OUT     USHORT                  *FreeNumber);
6601
6602 VOID RtmpUSB_FinalWriteTxResource(
6603         IN      PRTMP_ADAPTER   pAd,
6604         IN      TX_BLK                  *pTxBlk,
6605         IN      USHORT                  totalMPDUSize,
6606         IN      USHORT                  TxIdx);
6607
6608 VOID RtmpUSBDataLastTxIdx(
6609         IN      PRTMP_ADAPTER   pAd,
6610         IN      UCHAR                   QueIdx,
6611         IN      USHORT                  TxIdx);
6612
6613 VOID RtmpUSBDataKickOut(
6614         IN      PRTMP_ADAPTER   pAd,
6615         IN      TX_BLK                  *pTxBlk,
6616         IN      UCHAR                   QueIdx);
6617
6618
6619 int RtmpUSBMgmtKickOut(
6620         IN RTMP_ADAPTER         *pAd,
6621         IN UCHAR                        QueIdx,
6622         IN PNDIS_PACKET         pPacket,
6623         IN PUCHAR                       pSrcBufVA,
6624         IN UINT                         SrcBufLen);
6625
6626 VOID RtmpUSBNullFrameKickOut(
6627         IN RTMP_ADAPTER *pAd,
6628         IN UCHAR                QueIdx,
6629         IN UCHAR                *pNullFrame,
6630         IN UINT32               frameLen);
6631
6632 VOID RT28xxUsbStaAsicForceWakeup(
6633         IN PRTMP_ADAPTER pAd,
6634         IN BOOLEAN       bFromTx);
6635
6636 VOID RT28xxUsbStaAsicSleepThenAutoWakeup(
6637         IN PRTMP_ADAPTER pAd,
6638         IN USHORT TbttNumToNextWakeUp);
6639
6640 VOID RT28xxUsbMlmeRadioOn(
6641         IN PRTMP_ADAPTER pAd);
6642
6643 VOID RT28xxUsbMlmeRadioOFF(
6644         IN PRTMP_ADAPTER pAd);
6645 #endif // RT2870 //
6646
6647 ////////////////////////////////////////
6648
6649 VOID QBSS_LoadInit(
6650         IN              RTMP_ADAPTER    *pAd);
6651
6652 UINT32 QBSS_LoadElementAppend(
6653         IN              RTMP_ADAPTER    *pAd,
6654         OUT             UINT8                   *buf_p);
6655
6656 VOID QBSS_LoadUpdate(
6657         IN              RTMP_ADAPTER    *pAd);
6658
6659 ///////////////////////////////////////
6660 INT RTMPShowCfgValue(
6661         IN      PRTMP_ADAPTER   pAd,
6662         IN      PUCHAR                  pName,
6663         IN      PUCHAR                  pBuf);
6664
6665 PCHAR   RTMPGetRalinkAuthModeStr(
6666     IN  NDIS_802_11_AUTHENTICATION_MODE authMode);
6667
6668 PCHAR   RTMPGetRalinkEncryModeStr(
6669     IN  USHORT encryMode);
6670 //////////////////////////////////////
6671
6672 VOID AsicStaBbpTuning(
6673         IN PRTMP_ADAPTER pAd);
6674
6675 BOOLEAN StaAddMacTableEntry(
6676         IN  PRTMP_ADAPTER               pAd,
6677         IN  PMAC_TABLE_ENTRY    pEntry,
6678         IN  UCHAR                               MaxSupportedRateIn500Kbps,
6679         IN  HT_CAPABILITY_IE    *pHtCapability,
6680         IN  UCHAR                               HtCapabilityLen,
6681         IN  USHORT                      CapabilityInfo);
6682
6683 void RTMP_IndicateMediaState(
6684         IN      PRTMP_ADAPTER   pAd);
6685
6686 VOID ReSyncBeaconTime(
6687         IN  PRTMP_ADAPTER   pAd);
6688
6689 VOID RTMPSetAGCInitValue(
6690         IN PRTMP_ADAPTER        pAd,
6691         IN UCHAR                        BandWidth);
6692
6693 int rt28xx_close(IN PNET_DEV dev);
6694 int rt28xx_open(IN PNET_DEV dev);
6695
6696 __inline INT VIRTUAL_IF_UP(PRTMP_ADAPTER pAd)
6697 {
6698 extern VOID MeshMakeBeacon(IN PRTMP_ADAPTER pAd, IN UCHAR idx);
6699 extern VOID MeshUpdateBeaconFrame(IN PRTMP_ADAPTER pAd, IN UCHAR idx);
6700
6701         if (VIRTUAL_IF_NUM(pAd) == 0)
6702         {
6703                 if (rt28xx_open(pAd->net_dev) != 0)
6704                         return -1;
6705         }
6706         else
6707         {
6708         }
6709         VIRTUAL_IF_INC(pAd);
6710         return 0;
6711 }
6712
6713 __inline VOID VIRTUAL_IF_DOWN(PRTMP_ADAPTER pAd)
6714 {
6715         VIRTUAL_IF_DEC(pAd);
6716         if (VIRTUAL_IF_NUM(pAd) == 0)
6717                 rt28xx_close(pAd->net_dev);
6718         return;
6719 }
6720
6721
6722 #endif  // __RTMP_H__
6723