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