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