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