Staging: rt3070: remove unused MiniportDataMMRequest()
[firefly-linux-kernel-4.4.55.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
3566 VOID RTMPSendNullFrame(
3567         IN  PRTMP_ADAPTER   pAd,
3568         IN  UCHAR           TxRate,
3569         IN      BOOLEAN                 bQosNull);
3570
3571 VOID RTMPSendDisassociationFrame(
3572         IN      PRTMP_ADAPTER   pAd);
3573
3574 VOID RTMPSendRTSFrame(
3575         IN  PRTMP_ADAPTER   pAd,
3576         IN  PUCHAR          pDA,
3577         IN      unsigned int    NextMpduSize,
3578         IN  UCHAR           TxRate,
3579         IN  UCHAR           RTSRate,
3580         IN  USHORT          AckDuration,
3581         IN  UCHAR           QueIdx,
3582         IN  UCHAR                       FrameGap);
3583
3584 PQUEUE_HEADER   RTMPCheckTxSwQueue(
3585         IN  PRTMP_ADAPTER   pAd,
3586         OUT UCHAR           *QueIdx);
3587
3588 VOID RTMPReportMicError(
3589         IN  PRTMP_ADAPTER   pAd,
3590         IN  PCIPHER_KEY     pWpaKey);
3591
3592 VOID    WpaMicFailureReportFrame(
3593         IN  PRTMP_ADAPTER    pAd,
3594         IN  MLME_QUEUE_ELEM *Elem);
3595
3596 VOID    WpaDisassocApAndBlockAssoc(
3597     IN  PVOID SystemSpecific1,
3598     IN  PVOID FunctionContext,
3599     IN  PVOID SystemSpecific2,
3600     IN  PVOID SystemSpecific3);
3601
3602 NDIS_STATUS RTMPCloneNdisPacket(
3603         IN  PRTMP_ADAPTER   pAd,
3604         IN      BOOLEAN    pInsAMSDUHdr,
3605         IN  PNDIS_PACKET    pInPacket,
3606         OUT PNDIS_PACKET   *ppOutPacket);
3607
3608 NDIS_STATUS RTMPAllocateNdisPacket(
3609         IN  PRTMP_ADAPTER   pAd,
3610         IN  PNDIS_PACKET    *pPacket,
3611         IN  PUCHAR          pHeader,
3612         IN  UINT            HeaderLen,
3613         IN  PUCHAR          pData,
3614         IN  UINT            DataLen);
3615
3616 VOID RTMPFreeNdisPacket(
3617         IN  PRTMP_ADAPTER   pAd,
3618         IN  PNDIS_PACKET    pPacket);
3619
3620 BOOLEAN RTMPFreeTXDUponTxDmaDone(
3621         IN PRTMP_ADAPTER    pAd,
3622         IN UCHAR            QueIdx);
3623
3624 BOOLEAN RTMPCheckDHCPFrame(
3625         IN      PRTMP_ADAPTER   pAd,
3626         IN      PNDIS_PACKET    pPacket);
3627
3628
3629 BOOLEAN RTMPCheckEtherType(
3630         IN      PRTMP_ADAPTER   pAd,
3631         IN      PNDIS_PACKET    pPacket);
3632
3633
3634 //
3635 // Private routines in rtmp_wep.c
3636 //
3637 VOID RTMPInitWepEngine(
3638         IN  PRTMP_ADAPTER   pAd,
3639         IN  PUCHAR          pKey,
3640         IN  UCHAR           KeyId,
3641         IN  UCHAR           KeyLen,
3642         IN  PUCHAR          pDest);
3643
3644 VOID RTMPEncryptData(
3645         IN  PRTMP_ADAPTER   pAd,
3646         IN  PUCHAR          pSrc,
3647         IN  PUCHAR          pDest,
3648         IN  UINT            Len);
3649
3650 BOOLEAN RTMPSoftDecryptWEP(
3651         IN PRTMP_ADAPTER        pAd,
3652         IN PUCHAR                       pData,
3653         IN ULONG                        DataByteCnt,
3654         IN PCIPHER_KEY          pGroupKey);
3655
3656 VOID RTMPSetICV(
3657         IN  PRTMP_ADAPTER   pAd,
3658         IN  PUCHAR          pDest);
3659
3660 VOID ARCFOUR_INIT(
3661         IN  PARCFOURCONTEXT Ctx,
3662         IN  PUCHAR          pKey,
3663         IN  UINT            KeyLen);
3664
3665 UCHAR   ARCFOUR_BYTE(
3666         IN  PARCFOURCONTEXT     Ctx);
3667
3668 VOID ARCFOUR_DECRYPT(
3669         IN  PARCFOURCONTEXT Ctx,
3670         IN  PUCHAR          pDest,
3671         IN  PUCHAR          pSrc,
3672         IN  UINT            Len);
3673
3674 VOID ARCFOUR_ENCRYPT(
3675         IN  PARCFOURCONTEXT Ctx,
3676         IN  PUCHAR          pDest,
3677         IN  PUCHAR          pSrc,
3678         IN  UINT            Len);
3679
3680 VOID WPAARCFOUR_ENCRYPT(
3681         IN  PARCFOURCONTEXT Ctx,
3682         IN  PUCHAR          pDest,
3683         IN  PUCHAR          pSrc,
3684         IN  UINT            Len);
3685
3686 UINT RTMP_CALC_FCS32(
3687         IN  UINT   Fcs,
3688         IN  PUCHAR  Cp,
3689         IN  INT     Len);
3690
3691 //
3692 // MLME routines
3693 //
3694
3695 // Asic/RF/BBP related functions
3696
3697 VOID AsicAdjustTxPower(
3698         IN PRTMP_ADAPTER pAd);
3699
3700 VOID    AsicUpdateProtect(
3701         IN              PRTMP_ADAPTER   pAd,
3702         IN              USHORT                  OperaionMode,
3703         IN              UCHAR                   SetMask,
3704         IN              BOOLEAN                 bDisableBGProtect,
3705         IN              BOOLEAN                 bNonGFExist);
3706
3707 VOID AsicSwitchChannel(
3708         IN  PRTMP_ADAPTER   pAd,
3709         IN      UCHAR                   Channel,
3710         IN      BOOLEAN                 bScan);
3711
3712 VOID AsicLockChannel(
3713         IN PRTMP_ADAPTER pAd,
3714         IN UCHAR Channel) ;
3715
3716 VOID AsicAntennaSelect(
3717         IN  PRTMP_ADAPTER   pAd,
3718         IN  UCHAR           Channel);
3719
3720 VOID AsicAntennaSetting(
3721         IN      PRTMP_ADAPTER   pAd,
3722         IN      ABGBAND_STATE   BandState);
3723
3724 VOID AsicRfTuningExec(
3725         IN PVOID SystemSpecific1,
3726         IN PVOID FunctionContext,
3727         IN PVOID SystemSpecific2,
3728         IN PVOID SystemSpecific3);
3729
3730 VOID AsicSleepThenAutoWakeup(
3731         IN  PRTMP_ADAPTER   pAd,
3732         IN  USHORT TbttNumToNextWakeUp);
3733
3734 VOID AsicForceSleep(
3735         IN PRTMP_ADAPTER pAd);
3736
3737 VOID AsicForceWakeup(
3738         IN PRTMP_ADAPTER pAd,
3739 #ifdef RT2860
3740         IN UCHAR         Level);
3741 #endif
3742 #ifdef RT2870
3743         IN BOOLEAN    bFromTx);
3744 #endif
3745
3746 VOID AsicSetBssid(
3747         IN  PRTMP_ADAPTER   pAd,
3748         IN  PUCHAR pBssid);
3749
3750 VOID AsicSetMcastWC(
3751         IN PRTMP_ADAPTER pAd);
3752
3753 VOID AsicDelWcidTab(
3754         IN PRTMP_ADAPTER pAd,
3755         IN UCHAR        Wcid);
3756
3757 VOID AsicEnableRDG(
3758         IN PRTMP_ADAPTER pAd);
3759
3760 VOID AsicDisableRDG(
3761         IN PRTMP_ADAPTER pAd);
3762
3763 VOID AsicDisableSync(
3764         IN  PRTMP_ADAPTER   pAd);
3765
3766 VOID AsicEnableBssSync(
3767         IN  PRTMP_ADAPTER   pAd);
3768
3769 VOID AsicEnableIbssSync(
3770         IN  PRTMP_ADAPTER   pAd);
3771
3772 VOID AsicSetEdcaParm(
3773         IN PRTMP_ADAPTER pAd,
3774         IN PEDCA_PARM    pEdcaParm);
3775
3776 VOID AsicSetSlotTime(
3777         IN PRTMP_ADAPTER pAd,
3778         IN BOOLEAN bUseShortSlotTime);
3779
3780 VOID AsicAddSharedKeyEntry(
3781         IN PRTMP_ADAPTER pAd,
3782         IN UCHAR         BssIndex,
3783         IN UCHAR         KeyIdx,
3784         IN UCHAR         CipherAlg,
3785         IN PUCHAR        pKey,
3786         IN PUCHAR        pTxMic,
3787         IN PUCHAR        pRxMic);
3788
3789 VOID AsicRemoveSharedKeyEntry(
3790         IN PRTMP_ADAPTER pAd,
3791         IN UCHAR         BssIndex,
3792         IN UCHAR         KeyIdx);
3793
3794 VOID AsicUpdateWCIDAttribute(
3795         IN PRTMP_ADAPTER pAd,
3796         IN USHORT               WCID,
3797         IN UCHAR                BssIndex,
3798         IN UCHAR        CipherAlg,
3799         IN BOOLEAN              bUsePairewiseKeyTable);
3800
3801 VOID AsicUpdateWCIDIVEIV(
3802         IN PRTMP_ADAPTER pAd,
3803         IN USHORT               WCID,
3804         IN ULONG        uIV,
3805         IN ULONG        uEIV);
3806
3807 VOID AsicUpdateRxWCIDTable(
3808         IN PRTMP_ADAPTER pAd,
3809         IN USHORT               WCID,
3810         IN PUCHAR        pAddr);
3811
3812 VOID AsicAddKeyEntry(
3813         IN PRTMP_ADAPTER pAd,
3814         IN USHORT               WCID,
3815         IN UCHAR                BssIndex,
3816         IN UCHAR                KeyIdx,
3817         IN PCIPHER_KEY  pCipherKey,
3818         IN BOOLEAN              bUsePairewiseKeyTable,
3819         IN BOOLEAN              bTxKey);
3820
3821 VOID AsicAddPairwiseKeyEntry(
3822         IN PRTMP_ADAPTER pAd,
3823         IN PUCHAR        pAddr,
3824         IN UCHAR                WCID,
3825         IN CIPHER_KEY            *pCipherKey);
3826
3827 VOID AsicRemovePairwiseKeyEntry(
3828         IN PRTMP_ADAPTER  pAd,
3829         IN UCHAR                 BssIdx,
3830         IN UCHAR                 Wcid);
3831
3832 BOOLEAN AsicSendCommandToMcu(
3833         IN PRTMP_ADAPTER pAd,
3834         IN UCHAR         Command,
3835         IN UCHAR         Token,
3836         IN UCHAR         Arg0,
3837         IN UCHAR         Arg1);
3838 #ifdef RT2860
3839 BOOLEAN AsicCheckCommanOk(
3840         IN PRTMP_ADAPTER pAd,
3841         IN UCHAR                 Command);
3842 #endif
3843 VOID MacAddrRandomBssid(
3844         IN  PRTMP_ADAPTER   pAd,
3845         OUT PUCHAR pAddr);
3846
3847 VOID MgtMacHeaderInit(
3848         IN  PRTMP_ADAPTER     pAd,
3849         IN OUT PHEADER_802_11 pHdr80211,
3850         IN UCHAR SubType,
3851         IN UCHAR ToDs,
3852         IN PUCHAR pDA,
3853         IN PUCHAR pBssid);
3854
3855 VOID MlmeRadioOff(
3856         IN PRTMP_ADAPTER pAd);
3857
3858 VOID MlmeRadioOn(
3859         IN PRTMP_ADAPTER pAd);
3860
3861
3862 VOID BssTableInit(
3863         IN BSS_TABLE *Tab);
3864
3865 VOID BATableInit(
3866         IN PRTMP_ADAPTER pAd,
3867     IN BA_TABLE *Tab);
3868
3869 ULONG BssTableSearch(
3870         IN BSS_TABLE *Tab,
3871         IN PUCHAR pBssid,
3872         IN UCHAR Channel);
3873
3874 ULONG BssSsidTableSearch(
3875         IN BSS_TABLE *Tab,
3876         IN PUCHAR    pBssid,
3877         IN PUCHAR    pSsid,
3878         IN UCHAR     SsidLen,
3879         IN UCHAR     Channel);
3880
3881 ULONG BssTableSearchWithSSID(
3882         IN BSS_TABLE *Tab,
3883         IN PUCHAR    Bssid,
3884         IN PUCHAR    pSsid,
3885         IN UCHAR     SsidLen,
3886         IN UCHAR     Channel);
3887
3888 VOID BssTableDeleteEntry(
3889         IN OUT  PBSS_TABLE pTab,
3890         IN      PUCHAR pBssid,
3891         IN      UCHAR Channel);
3892
3893 VOID BATableDeleteORIEntry(
3894         IN OUT  PRTMP_ADAPTER pAd,
3895         IN              BA_ORI_ENTRY    *pBAORIEntry);
3896
3897 VOID  BssEntrySet(
3898         IN  PRTMP_ADAPTER   pAd,
3899         OUT PBSS_ENTRY pBss,
3900         IN PUCHAR pBssid,
3901         IN CHAR Ssid[],
3902         IN UCHAR SsidLen,
3903         IN UCHAR BssType,
3904         IN USHORT BeaconPeriod,
3905         IN PCF_PARM CfParm,
3906         IN USHORT AtimWin,
3907         IN USHORT CapabilityInfo,
3908         IN UCHAR SupRate[],
3909         IN UCHAR SupRateLen,
3910         IN UCHAR ExtRate[],
3911         IN UCHAR ExtRateLen,
3912         IN HT_CAPABILITY_IE *pHtCapability,
3913         IN ADD_HT_INFO_IE *pAddHtInfo,  // AP might use this additional ht info IE
3914         IN UCHAR                        HtCapabilityLen,
3915         IN UCHAR                        AddHtInfoLen,
3916         IN UCHAR                        NewExtChanOffset,
3917         IN UCHAR Channel,
3918         IN CHAR Rssi,
3919         IN LARGE_INTEGER TimeStamp,
3920         IN UCHAR CkipFlag,
3921         IN PEDCA_PARM pEdcaParm,
3922         IN PQOS_CAPABILITY_PARM pQosCapability,
3923         IN PQBSS_LOAD_PARM pQbssLoad,
3924         IN USHORT LengthVIE,
3925         IN PNDIS_802_11_VARIABLE_IEs pVIE);
3926
3927 ULONG  BssTableSetEntry(
3928         IN  PRTMP_ADAPTER   pAd,
3929         OUT PBSS_TABLE pTab,
3930         IN PUCHAR pBssid,
3931         IN CHAR Ssid[],
3932         IN UCHAR SsidLen,
3933         IN UCHAR BssType,
3934         IN USHORT BeaconPeriod,
3935         IN CF_PARM *CfParm,
3936         IN USHORT AtimWin,
3937         IN USHORT CapabilityInfo,
3938         IN UCHAR SupRate[],
3939         IN UCHAR SupRateLen,
3940         IN UCHAR ExtRate[],
3941         IN UCHAR ExtRateLen,
3942         IN HT_CAPABILITY_IE *pHtCapability,
3943         IN ADD_HT_INFO_IE *pAddHtInfo,  // AP might use this additional ht info IE
3944         IN UCHAR                        HtCapabilityLen,
3945         IN UCHAR                        AddHtInfoLen,
3946         IN UCHAR                        NewExtChanOffset,
3947         IN UCHAR Channel,
3948         IN CHAR Rssi,
3949         IN LARGE_INTEGER TimeStamp,
3950         IN UCHAR CkipFlag,
3951         IN PEDCA_PARM pEdcaParm,
3952         IN PQOS_CAPABILITY_PARM pQosCapability,
3953         IN PQBSS_LOAD_PARM pQbssLoad,
3954         IN USHORT LengthVIE,
3955         IN PNDIS_802_11_VARIABLE_IEs pVIE);
3956
3957 VOID BATableInsertEntry(
3958     IN  PRTMP_ADAPTER   pAd,
3959         IN USHORT Aid,
3960     IN USHORT           TimeOutValue,
3961         IN USHORT               StartingSeq,
3962     IN UCHAR TID,
3963         IN UCHAR BAWinSize,
3964         IN UCHAR OriginatorStatus,
3965     IN BOOLEAN IsRecipient);
3966
3967 VOID BssTableSsidSort(
3968         IN  PRTMP_ADAPTER   pAd,
3969         OUT BSS_TABLE *OutTab,
3970         IN  CHAR Ssid[],
3971         IN  UCHAR SsidLen);
3972
3973 VOID  BssTableSortByRssi(
3974         IN OUT BSS_TABLE *OutTab);
3975
3976 VOID BssCipherParse(
3977         IN OUT  PBSS_ENTRY  pBss);
3978
3979 NDIS_STATUS  MlmeQueueInit(
3980         IN MLME_QUEUE *Queue);
3981
3982 VOID  MlmeQueueDestroy(
3983         IN MLME_QUEUE *Queue);
3984
3985 BOOLEAN MlmeEnqueue(
3986         IN PRTMP_ADAPTER pAd,
3987         IN ULONG Machine,
3988         IN ULONG MsgType,
3989         IN ULONG MsgLen,
3990         IN VOID *Msg);
3991
3992 BOOLEAN MlmeEnqueueForRecv(
3993         IN  PRTMP_ADAPTER   pAd,
3994         IN ULONG Wcid,
3995         IN ULONG TimeStampHigh,
3996         IN ULONG TimeStampLow,
3997         IN UCHAR Rssi0,
3998         IN UCHAR Rssi1,
3999         IN UCHAR Rssi2,
4000         IN ULONG MsgLen,
4001         IN PVOID Msg,
4002         IN UCHAR Signal);
4003
4004
4005 BOOLEAN MlmeDequeue(
4006         IN MLME_QUEUE *Queue,
4007         OUT MLME_QUEUE_ELEM **Elem);
4008
4009 VOID    MlmeRestartStateMachine(
4010         IN  PRTMP_ADAPTER   pAd);
4011
4012 BOOLEAN  MlmeQueueEmpty(
4013         IN MLME_QUEUE *Queue);
4014
4015 BOOLEAN  MlmeQueueFull(
4016         IN MLME_QUEUE *Queue);
4017
4018 BOOLEAN  MsgTypeSubst(
4019         IN PRTMP_ADAPTER pAd,
4020         IN PFRAME_802_11 pFrame,
4021         OUT INT *Machine,
4022         OUT INT *MsgType);
4023
4024 VOID StateMachineInit(
4025         IN STATE_MACHINE *Sm,
4026         IN STATE_MACHINE_FUNC Trans[],
4027         IN ULONG StNr,
4028         IN ULONG MsgNr,
4029         IN STATE_MACHINE_FUNC DefFunc,
4030         IN ULONG InitState,
4031         IN ULONG Base);
4032
4033 VOID StateMachineSetAction(
4034         IN STATE_MACHINE *S,
4035         IN ULONG St,
4036         ULONG Msg,
4037         IN STATE_MACHINE_FUNC F);
4038
4039 VOID StateMachinePerformAction(
4040         IN  PRTMP_ADAPTER   pAd,
4041         IN STATE_MACHINE *S,
4042         IN MLME_QUEUE_ELEM *Elem);
4043
4044 VOID Drop(
4045         IN  PRTMP_ADAPTER   pAd,
4046         IN MLME_QUEUE_ELEM *Elem);
4047
4048 VOID AssocStateMachineInit(
4049         IN  PRTMP_ADAPTER   pAd,
4050         IN  STATE_MACHINE *Sm,
4051         OUT STATE_MACHINE_FUNC Trans[]);
4052
4053 VOID ReassocTimeout(
4054         IN PVOID SystemSpecific1,
4055         IN PVOID FunctionContext,
4056         IN PVOID SystemSpecific2,
4057         IN PVOID SystemSpecific3);
4058
4059 VOID AssocTimeout(
4060         IN PVOID SystemSpecific1,
4061         IN PVOID FunctionContext,
4062         IN PVOID SystemSpecific2,
4063         IN PVOID SystemSpecific3);
4064
4065 VOID DisassocTimeout(
4066         IN PVOID SystemSpecific1,
4067         IN PVOID FunctionContext,
4068         IN PVOID SystemSpecific2,
4069         IN PVOID SystemSpecific3);
4070
4071 //----------------------------------------------
4072 VOID MlmeAssocReqAction(
4073         IN  PRTMP_ADAPTER   pAd,
4074         IN  MLME_QUEUE_ELEM *Elem);
4075
4076 VOID MlmeReassocReqAction(
4077         IN  PRTMP_ADAPTER   pAd,
4078         IN  MLME_QUEUE_ELEM *Elem);
4079
4080 VOID MlmeDisassocReqAction(
4081         IN  PRTMP_ADAPTER   pAd,
4082         IN  MLME_QUEUE_ELEM *Elem);
4083
4084 VOID PeerAssocRspAction(
4085         IN  PRTMP_ADAPTER   pAd,
4086         IN  MLME_QUEUE_ELEM *Elem);
4087
4088 VOID PeerReassocRspAction(
4089         IN  PRTMP_ADAPTER   pAd,
4090         IN  MLME_QUEUE_ELEM *Elem);
4091
4092 VOID PeerDisassocAction(
4093         IN  PRTMP_ADAPTER   pAd,
4094         IN  MLME_QUEUE_ELEM *Elem);
4095
4096 VOID DisassocTimeoutAction(
4097         IN  PRTMP_ADAPTER   pAd,
4098         IN  MLME_QUEUE_ELEM *Elem);
4099
4100 VOID AssocTimeoutAction(
4101         IN  PRTMP_ADAPTER   pAd,
4102         IN  MLME_QUEUE_ELEM *Elem);
4103
4104 VOID  ReassocTimeoutAction(
4105         IN  PRTMP_ADAPTER   pAd,
4106         IN  MLME_QUEUE_ELEM *Elem);
4107
4108 VOID  Cls3errAction(
4109         IN  PRTMP_ADAPTER   pAd,
4110         IN  PUCHAR pAddr);
4111
4112 VOID SwitchBetweenWepAndCkip(
4113         IN PRTMP_ADAPTER pAd);
4114
4115 VOID  InvalidStateWhenAssoc(
4116         IN  PRTMP_ADAPTER   pAd,
4117         IN  MLME_QUEUE_ELEM *Elem);
4118
4119 VOID  InvalidStateWhenReassoc(
4120         IN  PRTMP_ADAPTER   pAd,
4121         IN  MLME_QUEUE_ELEM *Elem);
4122
4123 VOID InvalidStateWhenDisassociate(
4124         IN  PRTMP_ADAPTER pAd,
4125         IN  MLME_QUEUE_ELEM *Elem);
4126
4127 #ifdef RT2870
4128 VOID MlmeCntlConfirm(
4129         IN PRTMP_ADAPTER pAd,
4130         IN ULONG MsgType,
4131         IN USHORT Msg);
4132 #endif // RT2870 //
4133
4134 VOID  ComposePsPoll(
4135         IN  PRTMP_ADAPTER   pAd);
4136
4137 VOID  ComposeNullFrame(
4138         IN  PRTMP_ADAPTER pAd);
4139
4140 VOID  AssocPostProc(
4141         IN  PRTMP_ADAPTER   pAd,
4142         IN  PUCHAR pAddr2,
4143         IN  USHORT CapabilityInfo,
4144         IN  USHORT Aid,
4145         IN  UCHAR SupRate[],
4146         IN  UCHAR SupRateLen,
4147         IN  UCHAR ExtRate[],
4148         IN  UCHAR ExtRateLen,
4149         IN PEDCA_PARM pEdcaParm,
4150         IN HT_CAPABILITY_IE             *pHtCapability,
4151         IN  UCHAR HtCapabilityLen,
4152         IN ADD_HT_INFO_IE               *pAddHtInfo);
4153
4154 VOID AuthStateMachineInit(
4155         IN  PRTMP_ADAPTER   pAd,
4156         IN PSTATE_MACHINE sm,
4157         OUT STATE_MACHINE_FUNC Trans[]);
4158
4159 VOID AuthTimeout(
4160         IN PVOID SystemSpecific1,
4161         IN PVOID FunctionContext,
4162         IN PVOID SystemSpecific2,
4163         IN PVOID SystemSpecific3);
4164
4165 VOID MlmeAuthReqAction(
4166         IN  PRTMP_ADAPTER   pAd,
4167         IN  MLME_QUEUE_ELEM *Elem);
4168
4169 VOID PeerAuthRspAtSeq2Action(
4170         IN  PRTMP_ADAPTER   pAd,
4171         IN  MLME_QUEUE_ELEM *Elem);
4172
4173 VOID PeerAuthRspAtSeq4Action(
4174         IN  PRTMP_ADAPTER   pAd,
4175         IN  MLME_QUEUE_ELEM *Elem);
4176
4177 VOID AuthTimeoutAction(
4178         IN  PRTMP_ADAPTER   pAd,
4179         IN  MLME_QUEUE_ELEM *Elem);
4180
4181 VOID Cls2errAction(
4182         IN  PRTMP_ADAPTER   pAd,
4183         IN  PUCHAR pAddr);
4184
4185 VOID MlmeDeauthReqAction(
4186         IN  PRTMP_ADAPTER   pAd,
4187         IN  MLME_QUEUE_ELEM *Elem);
4188
4189 VOID InvalidStateWhenAuth(
4190         IN  PRTMP_ADAPTER   pAd,
4191         IN  MLME_QUEUE_ELEM *Elem);
4192
4193 //=============================================
4194
4195 VOID AuthRspStateMachineInit(
4196         IN  PRTMP_ADAPTER   pAd,
4197         IN  PSTATE_MACHINE Sm,
4198         IN  STATE_MACHINE_FUNC Trans[]);
4199
4200 VOID PeerDeauthAction(
4201         IN PRTMP_ADAPTER pAd,
4202         IN MLME_QUEUE_ELEM *Elem);
4203
4204 VOID PeerAuthSimpleRspGenAndSend(
4205         IN  PRTMP_ADAPTER   pAd,
4206         IN  PHEADER_802_11  pHdr80211,
4207         IN  USHORT Alg,
4208         IN  USHORT Seq,
4209         IN  USHORT Reason,
4210         IN  USHORT Status);
4211
4212 //
4213 // Private routines in dls.c
4214 //
4215
4216 //========================================
4217
4218 VOID SyncStateMachineInit(
4219         IN  PRTMP_ADAPTER   pAd,
4220         IN  STATE_MACHINE *Sm,
4221         OUT STATE_MACHINE_FUNC Trans[]);
4222
4223 VOID BeaconTimeout(
4224         IN PVOID SystemSpecific1,
4225         IN PVOID FunctionContext,
4226         IN PVOID SystemSpecific2,
4227         IN PVOID SystemSpecific3);
4228
4229 VOID ScanTimeout(
4230         IN PVOID SystemSpecific1,
4231         IN PVOID FunctionContext,
4232         IN PVOID SystemSpecific2,
4233         IN PVOID SystemSpecific3);
4234
4235 VOID InvalidStateWhenScan(
4236         IN  PRTMP_ADAPTER   pAd,
4237         IN  MLME_QUEUE_ELEM *Elem);
4238
4239 VOID InvalidStateWhenJoin(
4240         IN  PRTMP_ADAPTER   pAd,
4241         IN  MLME_QUEUE_ELEM *Elem);
4242
4243 VOID InvalidStateWhenStart(
4244         IN  PRTMP_ADAPTER   pAd,
4245         IN  MLME_QUEUE_ELEM *Elem);
4246
4247 VOID EnqueueProbeRequest(
4248         IN PRTMP_ADAPTER pAd);
4249
4250 BOOLEAN ScanRunning(
4251                 IN PRTMP_ADAPTER pAd);
4252 //=========================================
4253
4254 VOID MlmeCntlInit(
4255         IN  PRTMP_ADAPTER   pAd,
4256         IN  STATE_MACHINE *S,
4257         OUT STATE_MACHINE_FUNC Trans[]);
4258
4259 VOID MlmeCntlMachinePerformAction(
4260         IN  PRTMP_ADAPTER   pAd,
4261         IN  STATE_MACHINE *S,
4262         IN  MLME_QUEUE_ELEM *Elem);
4263
4264 VOID CntlIdleProc(
4265         IN  PRTMP_ADAPTER   pAd,
4266         IN  MLME_QUEUE_ELEM *Elem);
4267
4268 VOID CntlOidScanProc(
4269         IN  PRTMP_ADAPTER pAd,
4270         IN  MLME_QUEUE_ELEM *Elem);
4271
4272 VOID CntlOidSsidProc(
4273         IN  PRTMP_ADAPTER   pAd,
4274         IN  MLME_QUEUE_ELEM * Elem);
4275
4276 VOID CntlOidRTBssidProc(
4277         IN  PRTMP_ADAPTER   pAd,
4278         IN  MLME_QUEUE_ELEM * Elem);
4279
4280 VOID CntlMlmeRoamingProc(
4281         IN  PRTMP_ADAPTER   pAd,
4282         IN  MLME_QUEUE_ELEM * Elem);
4283
4284 VOID CntlWaitDisassocProc(
4285         IN  PRTMP_ADAPTER   pAd,
4286         IN  MLME_QUEUE_ELEM *Elem);
4287
4288 VOID CntlWaitJoinProc(
4289         IN  PRTMP_ADAPTER   pAd,
4290         IN  MLME_QUEUE_ELEM *Elem);
4291
4292 VOID CntlWaitReassocProc(
4293         IN  PRTMP_ADAPTER   pAd,
4294         IN  MLME_QUEUE_ELEM *Elem);
4295
4296 VOID CntlWaitStartProc(
4297         IN  PRTMP_ADAPTER   pAd,
4298         IN  MLME_QUEUE_ELEM *Elem);
4299
4300 VOID CntlWaitAuthProc(
4301         IN  PRTMP_ADAPTER   pAd,
4302         IN  MLME_QUEUE_ELEM *Elem);
4303
4304 VOID CntlWaitAuthProc2(
4305         IN  PRTMP_ADAPTER pAd,
4306         IN  MLME_QUEUE_ELEM *Elem);
4307
4308 VOID CntlWaitAssocProc(
4309         IN  PRTMP_ADAPTER   pAd,
4310         IN  MLME_QUEUE_ELEM *Elem);
4311
4312 VOID LinkUp(
4313         IN  PRTMP_ADAPTER   pAd,
4314         IN  UCHAR BssType);
4315
4316 VOID LinkDown(
4317         IN  PRTMP_ADAPTER   pAd,
4318         IN  BOOLEAN         IsReqFromAP);
4319
4320 VOID IterateOnBssTab(
4321         IN  PRTMP_ADAPTER   pAd);
4322
4323 VOID IterateOnBssTab2(
4324         IN  PRTMP_ADAPTER   pAd);;
4325
4326 VOID JoinParmFill(
4327         IN  PRTMP_ADAPTER   pAd,
4328         IN  OUT MLME_JOIN_REQ_STRUCT *JoinReq,
4329         IN  ULONG BssIdx);
4330
4331 VOID AssocParmFill(
4332         IN  PRTMP_ADAPTER   pAd,
4333         IN OUT MLME_ASSOC_REQ_STRUCT *AssocReq,
4334         IN  PUCHAR pAddr,
4335         IN  USHORT CapabilityInfo,
4336         IN  ULONG Timeout,
4337         IN  USHORT ListenIntv);
4338
4339 VOID ScanParmFill(
4340         IN  PRTMP_ADAPTER   pAd,
4341         IN  OUT MLME_SCAN_REQ_STRUCT *ScanReq,
4342         IN  CHAR Ssid[],
4343         IN  UCHAR SsidLen,
4344         IN  UCHAR BssType,
4345         IN  UCHAR ScanType);
4346
4347 VOID DisassocParmFill(
4348         IN  PRTMP_ADAPTER   pAd,
4349         IN  OUT MLME_DISASSOC_REQ_STRUCT *DisassocReq,
4350         IN  PUCHAR pAddr,
4351         IN  USHORT Reason);
4352
4353 VOID StartParmFill(
4354         IN  PRTMP_ADAPTER   pAd,
4355         IN  OUT MLME_START_REQ_STRUCT *StartReq,
4356         IN  CHAR Ssid[],
4357         IN  UCHAR SsidLen);
4358
4359 VOID AuthParmFill(
4360         IN  PRTMP_ADAPTER   pAd,
4361         IN  OUT MLME_AUTH_REQ_STRUCT *AuthReq,
4362         IN  PUCHAR pAddr,
4363         IN  USHORT Alg);
4364
4365 VOID EnqueuePsPoll(
4366         IN  PRTMP_ADAPTER   pAd);
4367
4368 VOID EnqueueBeaconFrame(
4369         IN  PRTMP_ADAPTER   pAd);
4370
4371 VOID MlmeJoinReqAction(
4372         IN  PRTMP_ADAPTER   pAd,
4373         IN  MLME_QUEUE_ELEM *Elem);
4374
4375 VOID MlmeScanReqAction(
4376         IN  PRTMP_ADAPTER   pAd,
4377         IN  MLME_QUEUE_ELEM *Elem);
4378
4379 VOID MlmeStartReqAction(
4380         IN  PRTMP_ADAPTER   pAd,
4381         IN  MLME_QUEUE_ELEM *Elem);
4382
4383 VOID ScanTimeoutAction(
4384         IN  PRTMP_ADAPTER   pAd,
4385         IN  MLME_QUEUE_ELEM *Elem);
4386
4387 VOID BeaconTimeoutAtJoinAction(
4388         IN  PRTMP_ADAPTER   pAd,
4389         IN  MLME_QUEUE_ELEM *Elem);
4390
4391 VOID PeerBeaconAtScanAction(
4392         IN  PRTMP_ADAPTER   pAd,
4393         IN  MLME_QUEUE_ELEM *Elem);
4394
4395 VOID PeerBeaconAtJoinAction(
4396         IN  PRTMP_ADAPTER   pAd,
4397         IN  MLME_QUEUE_ELEM *Elem);
4398
4399 VOID PeerBeacon(
4400         IN  PRTMP_ADAPTER   pAd,
4401         IN  MLME_QUEUE_ELEM *Elem);
4402
4403 VOID PeerProbeReqAction(
4404         IN  PRTMP_ADAPTER pAd,
4405         IN  MLME_QUEUE_ELEM *Elem);
4406
4407 VOID ScanNextChannel(
4408         IN  PRTMP_ADAPTER   pAd);
4409
4410 ULONG MakeIbssBeacon(
4411         IN  PRTMP_ADAPTER   pAd);
4412
4413 VOID CCXAdjacentAPReport(
4414         IN  PRTMP_ADAPTER   pAd);
4415
4416 BOOLEAN MlmeScanReqSanity(
4417         IN  PRTMP_ADAPTER   pAd,
4418         IN  VOID *Msg,
4419         IN  ULONG MsgLen,
4420         OUT UCHAR *BssType,
4421         OUT CHAR ssid[],
4422         OUT UCHAR *SsidLen,
4423         OUT UCHAR *ScanType);
4424
4425 BOOLEAN PeerBeaconAndProbeRspSanity(
4426         IN  PRTMP_ADAPTER   pAd,
4427         IN  VOID *Msg,
4428         IN  ULONG MsgLen,
4429         IN  UCHAR MsgChannel,
4430         OUT PUCHAR pAddr2,
4431         OUT PUCHAR pBssid,
4432         OUT CHAR Ssid[],
4433         OUT UCHAR *pSsidLen,
4434         OUT UCHAR *pBssType,
4435         OUT USHORT *pBeaconPeriod,
4436         OUT UCHAR *pChannel,
4437         OUT UCHAR *pNewChannel,
4438         OUT LARGE_INTEGER *pTimestamp,
4439         OUT CF_PARM *pCfParm,
4440         OUT USHORT *pAtimWin,
4441         OUT USHORT *pCapabilityInfo,
4442         OUT UCHAR *pErp,
4443         OUT UCHAR *pDtimCount,
4444         OUT UCHAR *pDtimPeriod,
4445         OUT UCHAR *pBcastFlag,
4446         OUT UCHAR *pMessageToMe,
4447         OUT UCHAR SupRate[],
4448         OUT UCHAR *pSupRateLen,
4449         OUT UCHAR ExtRate[],
4450         OUT UCHAR *pExtRateLen,
4451         OUT     UCHAR *pCkipFlag,
4452         OUT     UCHAR *pAironetCellPowerLimit,
4453         OUT PEDCA_PARM       pEdcaParm,
4454         OUT PQBSS_LOAD_PARM  pQbssLoad,
4455         OUT PQOS_CAPABILITY_PARM pQosCapability,
4456         OUT ULONG *pRalinkIe,
4457         OUT UCHAR                *pHtCapabilityLen,
4458         OUT UCHAR                *pPreNHtCapabilityLen,
4459         OUT HT_CAPABILITY_IE *pHtCapability,
4460         OUT UCHAR                *AddHtInfoLen,
4461         OUT ADD_HT_INFO_IE *AddHtInfo,
4462         OUT UCHAR *NewExtChannel,
4463         OUT USHORT *LengthVIE,
4464         OUT PNDIS_802_11_VARIABLE_IEs pVIE);
4465
4466 BOOLEAN PeerAddBAReqActionSanity(
4467     IN PRTMP_ADAPTER pAd,
4468     IN VOID *pMsg,
4469     IN ULONG MsgLen,
4470         OUT PUCHAR pAddr2);
4471
4472 BOOLEAN PeerAddBARspActionSanity(
4473     IN PRTMP_ADAPTER pAd,
4474     IN VOID *pMsg,
4475     IN ULONG MsgLen);
4476
4477 BOOLEAN PeerDelBAActionSanity(
4478     IN PRTMP_ADAPTER pAd,
4479     IN UCHAR Wcid,
4480     IN VOID *pMsg,
4481     IN ULONG MsgLen);
4482
4483 BOOLEAN MlmeAssocReqSanity(
4484         IN  PRTMP_ADAPTER   pAd,
4485         IN  VOID *Msg,
4486         IN  ULONG MsgLen,
4487         OUT PUCHAR pApAddr,
4488         OUT USHORT *CapabilityInfo,
4489         OUT ULONG *Timeout,
4490         OUT USHORT *ListenIntv);
4491
4492 BOOLEAN MlmeAuthReqSanity(
4493         IN  PRTMP_ADAPTER   pAd,
4494         IN  VOID *Msg,
4495         IN  ULONG MsgLen,
4496         OUT PUCHAR pAddr,
4497         OUT ULONG *Timeout,
4498         OUT USHORT *Alg);
4499
4500 BOOLEAN MlmeStartReqSanity(
4501         IN  PRTMP_ADAPTER   pAd,
4502         IN  VOID *Msg,
4503         IN  ULONG MsgLen,
4504         OUT CHAR Ssid[],
4505         OUT UCHAR *Ssidlen);
4506
4507 BOOLEAN PeerAuthSanity(
4508         IN  PRTMP_ADAPTER   pAd,
4509         IN  VOID *Msg,
4510         IN  ULONG MsgLen,
4511         OUT PUCHAR pAddr,
4512         OUT USHORT *Alg,
4513         OUT USHORT *Seq,
4514         OUT USHORT *Status,
4515         OUT CHAR ChlgText[]);
4516
4517 BOOLEAN PeerAssocRspSanity(
4518         IN  PRTMP_ADAPTER   pAd,
4519     IN VOID *pMsg,
4520         IN  ULONG MsgLen,
4521         OUT PUCHAR pAddr2,
4522         OUT USHORT *pCapabilityInfo,
4523         OUT USHORT *pStatus,
4524         OUT USHORT *pAid,
4525         OUT UCHAR SupRate[],
4526         OUT UCHAR *pSupRateLen,
4527         OUT UCHAR ExtRate[],
4528         OUT UCHAR *pExtRateLen,
4529     OUT HT_CAPABILITY_IE                *pHtCapability,
4530     OUT ADD_HT_INFO_IE          *pAddHtInfo,    // AP might use this additional ht info IE
4531     OUT UCHAR                   *pHtCapabilityLen,
4532     OUT UCHAR                   *pAddHtInfoLen,
4533     OUT UCHAR                   *pNewExtChannelOffset,
4534         OUT PEDCA_PARM pEdcaParm,
4535         OUT UCHAR *pCkipFlag);
4536
4537 BOOLEAN PeerDisassocSanity(
4538         IN  PRTMP_ADAPTER   pAd,
4539         IN  VOID *Msg,
4540         IN  ULONG MsgLen,
4541         OUT PUCHAR pAddr2,
4542         OUT USHORT *Reason);
4543
4544 BOOLEAN PeerDeauthSanity(
4545         IN  PRTMP_ADAPTER   pAd,
4546         IN  VOID *Msg,
4547         IN  ULONG MsgLen,
4548         OUT PUCHAR pAddr2,
4549         OUT USHORT *Reason);
4550
4551 BOOLEAN PeerProbeReqSanity(
4552         IN  PRTMP_ADAPTER   pAd,
4553         IN  VOID *Msg,
4554         IN  ULONG MsgLen,
4555         OUT PUCHAR pAddr2,
4556         OUT CHAR Ssid[],
4557         OUT UCHAR *pSsidLen);
4558
4559 BOOLEAN GetTimBit(
4560         IN  CHAR *Ptr,
4561         IN  USHORT Aid,
4562         OUT UCHAR *TimLen,
4563         OUT UCHAR *BcastFlag,
4564         OUT UCHAR *DtimCount,
4565         OUT UCHAR *DtimPeriod,
4566         OUT UCHAR *MessageToMe);
4567
4568 UCHAR ChannelSanity(
4569         IN PRTMP_ADAPTER pAd,
4570         IN UCHAR channel);
4571
4572 NDIS_802_11_NETWORK_TYPE NetworkTypeInUseSanity(
4573         IN PBSS_ENTRY pBss);
4574
4575 BOOLEAN MlmeDelBAReqSanity(
4576     IN PRTMP_ADAPTER pAd,
4577     IN VOID *Msg,
4578     IN ULONG MsgLen);
4579
4580 BOOLEAN MlmeAddBAReqSanity(
4581     IN PRTMP_ADAPTER pAd,
4582     IN VOID *Msg,
4583     IN ULONG MsgLen,
4584     OUT PUCHAR pAddr2);
4585
4586 ULONG MakeOutgoingFrame(
4587         OUT CHAR *Buffer,
4588         OUT ULONG *Length, ...);
4589
4590 VOID  LfsrInit(
4591         IN  PRTMP_ADAPTER   pAd,
4592         IN  ULONG Seed);
4593
4594 UCHAR RandomByte(
4595         IN  PRTMP_ADAPTER   pAd);
4596
4597 VOID AsicUpdateAutoFallBackTable(
4598         IN      PRTMP_ADAPTER   pAd,
4599         IN      PUCHAR                  pTxRate);
4600
4601 VOID  MlmePeriodicExec(
4602         IN PVOID SystemSpecific1,
4603         IN PVOID FunctionContext,
4604         IN PVOID SystemSpecific2,
4605         IN PVOID SystemSpecific3);
4606
4607 VOID LinkDownExec(
4608         IN PVOID SystemSpecific1,
4609         IN PVOID FunctionContext,
4610         IN PVOID SystemSpecific2,
4611         IN PVOID SystemSpecific3);
4612
4613 VOID STAMlmePeriodicExec(
4614         PRTMP_ADAPTER pAd);
4615
4616 VOID MlmeAutoScan(
4617         IN PRTMP_ADAPTER pAd);
4618
4619 VOID MlmeAutoReconnectLastSSID(
4620         IN PRTMP_ADAPTER pAd);
4621
4622 BOOLEAN MlmeValidateSSID(
4623         IN PUCHAR pSsid,
4624         IN UCHAR  SsidLen);
4625
4626 VOID MlmeCheckForRoaming(
4627         IN PRTMP_ADAPTER pAd,
4628         IN ULONG    Now32);
4629
4630 VOID MlmeCheckForFastRoaming(
4631         IN  PRTMP_ADAPTER   pAd,
4632         IN  ULONG           Now);
4633
4634 VOID MlmeDynamicTxRateSwitching(
4635         IN PRTMP_ADAPTER pAd);
4636
4637 VOID MlmeSetTxRate(
4638         IN PRTMP_ADAPTER                pAd,
4639         IN PMAC_TABLE_ENTRY             pEntry,
4640         IN PRTMP_TX_RATE_SWITCH pTxRate);
4641
4642 VOID MlmeSelectTxRateTable(
4643         IN PRTMP_ADAPTER                pAd,
4644         IN PMAC_TABLE_ENTRY             pEntry,
4645         IN PUCHAR                               *ppTable,
4646         IN PUCHAR                               pTableSize,
4647         IN PUCHAR                               pInitTxRateIdx);
4648
4649 VOID MlmeCalculateChannelQuality(
4650         IN PRTMP_ADAPTER pAd,
4651         IN ULONG Now);
4652
4653 VOID MlmeCheckPsmChange(
4654         IN PRTMP_ADAPTER pAd,
4655         IN ULONG    Now32);
4656
4657 VOID MlmeSetPsmBit(
4658         IN PRTMP_ADAPTER pAd,
4659         IN USHORT psm);
4660
4661 VOID MlmeSetTxPreamble(
4662         IN PRTMP_ADAPTER pAd,
4663         IN USHORT TxPreamble);
4664
4665 VOID UpdateBasicRateBitmap(
4666         IN      PRTMP_ADAPTER   pAd);
4667
4668 VOID MlmeUpdateTxRates(
4669         IN PRTMP_ADAPTER        pAd,
4670         IN      BOOLEAN                 bLinkUp,
4671         IN      UCHAR                   apidx);
4672
4673 VOID MlmeUpdateHtTxRates(
4674         IN PRTMP_ADAPTER                pAd,
4675         IN      UCHAR                           apidx);
4676
4677 VOID    RTMPCheckRates(
4678         IN      PRTMP_ADAPTER   pAd,
4679         IN OUT  UCHAR           SupRate[],
4680         IN OUT  UCHAR           *SupRateLen);
4681
4682 BOOLEAN RTMPCheckChannel(
4683         IN PRTMP_ADAPTER pAd,
4684         IN UCHAR                CentralChannel,
4685         IN UCHAR                Channel);
4686
4687 BOOLEAN         RTMPCheckHt(
4688         IN              PRTMP_ADAPTER   pAd,
4689         IN              UCHAR   Wcid,
4690         IN OUT  HT_CAPABILITY_IE                        *pHtCapability,
4691         IN OUT  ADD_HT_INFO_IE                  *pAddHtInfo);
4692
4693 VOID StaQuickResponeForRateUpExec(
4694         IN PVOID SystemSpecific1,
4695         IN PVOID FunctionContext,
4696         IN PVOID SystemSpecific2,
4697         IN PVOID SystemSpecific3);
4698
4699 VOID RTMPUpdateMlmeRate(
4700         IN PRTMP_ADAPTER        pAd);
4701
4702 CHAR RTMPMaxRssi(
4703         IN PRTMP_ADAPTER        pAd,
4704         IN CHAR                         Rssi0,
4705         IN CHAR                         Rssi1,
4706         IN CHAR                         Rssi2);
4707
4708 VOID AsicSetRxAnt(
4709         IN PRTMP_ADAPTER        pAd,
4710         IN UCHAR                        Ant);
4711
4712 VOID AsicEvaluateRxAnt(
4713         IN PRTMP_ADAPTER        pAd);
4714
4715 VOID AsicRxAntEvalTimeout(
4716         IN PVOID SystemSpecific1,
4717         IN PVOID FunctionContext,
4718         IN PVOID SystemSpecific2,
4719         IN PVOID SystemSpecific3);
4720
4721 VOID APSDPeriodicExec(
4722         IN PVOID SystemSpecific1,
4723         IN PVOID FunctionContext,
4724         IN PVOID SystemSpecific2,
4725         IN PVOID SystemSpecific3);
4726
4727 BOOLEAN RTMPCheckEntryEnableAutoRateSwitch(
4728         IN PRTMP_ADAPTER    pAd,
4729         IN PMAC_TABLE_ENTRY     pEntry);
4730
4731 UCHAR RTMPStaFixedTxMode(
4732         IN PRTMP_ADAPTER    pAd,
4733         IN PMAC_TABLE_ENTRY     pEntry);
4734
4735 VOID RTMPUpdateLegacyTxSetting(
4736                 UCHAR                           fixed_tx_mode,
4737                 PMAC_TABLE_ENTRY        pEntry);
4738
4739 BOOLEAN RTMPAutoRateSwitchCheck(
4740         IN PRTMP_ADAPTER    pAd);
4741
4742 NDIS_STATUS MlmeInit(
4743         IN  PRTMP_ADAPTER   pAd);
4744
4745 VOID MlmeHandler(
4746         IN  PRTMP_ADAPTER   pAd);
4747
4748 VOID MlmeHalt(
4749         IN  PRTMP_ADAPTER   pAd);
4750
4751 VOID MlmeResetRalinkCounters(
4752         IN  PRTMP_ADAPTER   pAd);
4753
4754 VOID BuildChannelList(
4755         IN PRTMP_ADAPTER pAd);
4756
4757 UCHAR FirstChannel(
4758         IN  PRTMP_ADAPTER   pAd);
4759
4760 UCHAR NextChannel(
4761         IN  PRTMP_ADAPTER   pAd,
4762         IN  UCHAR channel);
4763
4764 VOID ChangeToCellPowerLimit(
4765         IN PRTMP_ADAPTER pAd,
4766         IN UCHAR         AironetCellPowerLimit);
4767
4768 USHORT RTMP_EEPROM_READ16(
4769         IN  PRTMP_ADAPTER   pAd,
4770         IN  USHORT Offset);
4771
4772 VOID RTMP_EEPROM_WRITE16(
4773         IN  PRTMP_ADAPTER   pAd,
4774         IN  USHORT Offset,
4775         IN  USHORT Data);
4776
4777 //
4778 // Prototypes of function definition in rtmp_tkip.c
4779 //
4780 VOID    RTMPInitTkipEngine(
4781         IN  PRTMP_ADAPTER   pAd,
4782         IN  PUCHAR          pTKey,
4783         IN  UCHAR           KeyId,
4784         IN  PUCHAR          pTA,
4785         IN  PUCHAR          pMICKey,
4786         IN  PUCHAR          pTSC,
4787         OUT PULONG          pIV16,
4788         OUT PULONG          pIV32);
4789
4790 VOID    RTMPInitMICEngine(
4791         IN  PRTMP_ADAPTER   pAd,
4792         IN  PUCHAR          pKey,
4793         IN  PUCHAR          pDA,
4794         IN  PUCHAR          pSA,
4795         IN  UCHAR           UserPriority,
4796         IN  PUCHAR          pMICKey);
4797
4798 BOOLEAN RTMPTkipCompareMICValue(
4799         IN  PRTMP_ADAPTER   pAd,
4800         IN  PUCHAR          pSrc,
4801         IN  PUCHAR          pDA,
4802         IN  PUCHAR          pSA,
4803         IN  PUCHAR          pMICKey,
4804         IN      UCHAR                   UserPriority,
4805         IN  UINT            Len);
4806
4807 VOID    RTMPCalculateMICValue(
4808         IN  PRTMP_ADAPTER   pAd,
4809         IN  PNDIS_PACKET    pPacket,
4810         IN  PUCHAR          pEncap,
4811         IN  PCIPHER_KEY     pKey,
4812         IN      UCHAR                   apidx);
4813
4814 BOOLEAN RTMPTkipCompareMICValueWithLLC(
4815         IN  PRTMP_ADAPTER   pAd,
4816         IN  PUCHAR          pLLC,
4817         IN  PUCHAR          pSrc,
4818         IN  PUCHAR          pDA,
4819         IN  PUCHAR          pSA,
4820         IN  PUCHAR          pMICKey,
4821         IN  UINT            Len);
4822
4823 VOID    RTMPTkipAppendByte(
4824         IN  PTKIP_KEY_INFO  pTkip,
4825         IN  UCHAR           uChar);
4826
4827 VOID    RTMPTkipAppend(
4828         IN  PTKIP_KEY_INFO  pTkip,
4829         IN  PUCHAR          pSrc,
4830         IN  UINT            nBytes);
4831
4832 VOID    RTMPTkipGetMIC(
4833         IN  PTKIP_KEY_INFO  pTkip);
4834
4835 BOOLEAN RTMPSoftDecryptTKIP(
4836         IN PRTMP_ADAPTER pAd,
4837         IN PUCHAR       pData,
4838         IN ULONG        DataByteCnt,
4839         IN UCHAR    UserPriority,
4840         IN PCIPHER_KEY  pWpaKey);
4841
4842 BOOLEAN RTMPSoftDecryptAES(
4843         IN PRTMP_ADAPTER pAd,
4844         IN PUCHAR       pData,
4845         IN ULONG        DataByteCnt,
4846         IN PCIPHER_KEY  pWpaKey);
4847
4848 //
4849 // Prototypes of function definition in cmm_info.c
4850 //
4851 NDIS_STATUS RTMPWPARemoveKeyProc(
4852         IN  PRTMP_ADAPTER   pAd,
4853         IN  PVOID           pBuf);
4854
4855 VOID    RTMPWPARemoveAllKeys(
4856         IN  PRTMP_ADAPTER   pAd);
4857
4858 BOOLEAN RTMPCheckStrPrintAble(
4859     IN  CHAR *pInPutStr,
4860     IN  UCHAR strLen);
4861
4862 VOID    RTMPSetPhyMode(
4863         IN  PRTMP_ADAPTER   pAd,
4864         IN  ULONG phymode);
4865
4866 VOID    RTMPUpdateHTIE(
4867         IN      RT_HT_CAPABILITY        *pRtHt,
4868         IN              UCHAR                           *pMcsSet,
4869         OUT             HT_CAPABILITY_IE *pHtCapability,
4870         OUT             ADD_HT_INFO_IE          *pAddHtInfo);
4871
4872 VOID    RTMPAddWcidAttributeEntry(
4873         IN      PRTMP_ADAPTER   pAd,
4874         IN      UCHAR                   BssIdx,
4875         IN      UCHAR                   KeyIdx,
4876         IN      UCHAR                   CipherAlg,
4877         IN      MAC_TABLE_ENTRY *pEntry);
4878
4879 CHAR *GetEncryptType(
4880         CHAR enc);
4881
4882 CHAR *GetAuthMode(
4883         CHAR auth);
4884
4885 VOID RTMPIoctlGetSiteSurvey(
4886         IN      PRTMP_ADAPTER   pAdapter,
4887         IN      struct iwreq    *wrq);
4888
4889 VOID RTMPIoctlGetMacTable(
4890         IN PRTMP_ADAPTER pAd,
4891         IN struct iwreq *wrq);
4892
4893 VOID    RTMPAddBSSIDCipher(
4894     IN  PRTMP_ADAPTER   pAd,
4895         IN      UCHAR   Aid,
4896     IN  PNDIS_802_11_KEY    pKey,
4897     IN  UCHAR   CipherAlg);
4898
4899 VOID    RTMPSetHT(
4900         IN      PRTMP_ADAPTER   pAd,
4901         IN      OID_SET_HT_PHYMODE *pHTPhyMode);
4902
4903 VOID    RTMPSetIndividualHT(
4904         IN      PRTMP_ADAPTER           pAd,
4905         IN      UCHAR                           apidx);
4906
4907 VOID RTMPSendWirelessEvent(
4908         IN      PRTMP_ADAPTER   pAd,
4909         IN      USHORT                  Event_flag,
4910         IN      PUCHAR                  pAddr,
4911         IN  UCHAR                       BssIdx,
4912         IN      CHAR                    Rssi);
4913
4914 //
4915 // prototype in wpa.c
4916 //
4917 BOOLEAN WpaMsgTypeSubst(
4918         IN  UCHAR   EAPType,
4919         OUT INT         *MsgType);
4920
4921 VOID WpaPskStateMachineInit(
4922         IN  PRTMP_ADAPTER       pAd,
4923         IN  STATE_MACHINE       *S,
4924         OUT STATE_MACHINE_FUNC Trans[]);
4925
4926 VOID WpaEAPOLKeyAction(
4927         IN  PRTMP_ADAPTER   pAd,
4928         IN  MLME_QUEUE_ELEM *Elem);
4929
4930 VOID    WpaPairMsg1Action(
4931         IN  PRTMP_ADAPTER   pAd,
4932         IN  MLME_QUEUE_ELEM *Elem);
4933
4934 VOID    WpaPairMsg3Action(
4935         IN  PRTMP_ADAPTER   pAd,
4936         IN  MLME_QUEUE_ELEM *Elem);
4937
4938 VOID    WpaGroupMsg1Action(
4939         IN  PRTMP_ADAPTER   pAd,
4940         IN  MLME_QUEUE_ELEM *Elem);
4941
4942 VOID    WpaMacHeaderInit(
4943         IN      PRTMP_ADAPTER   pAd,
4944         IN OUT  PHEADER_802_11  pHdr80211,
4945         IN      UCHAR           wep,
4946         IN      PUCHAR          pAddr1);
4947
4948 VOID    Wpa2PairMsg1Action(
4949     IN  PRTMP_ADAPTER   pAd,
4950     IN  MLME_QUEUE_ELEM *Elem);
4951
4952 VOID    Wpa2PairMsg3Action(
4953     IN  PRTMP_ADAPTER   pAd,
4954     IN  MLME_QUEUE_ELEM *Elem);
4955
4956 BOOLEAN ParseKeyData(
4957     IN  PRTMP_ADAPTER   pAd,
4958     IN  PUCHAR          pKeyData,
4959     IN  UCHAR           KeyDataLen,
4960         IN      UCHAR                   bPairewise);
4961
4962 VOID    RTMPToWirelessSta(
4963         IN  PRTMP_ADAPTER   pAd,
4964         IN  PUCHAR          pHeader802_3,
4965     IN  UINT            HdrLen,
4966         IN  PUCHAR          pData,
4967     IN  UINT            DataLen,
4968     IN  BOOLEAN                 is4wayFrame);
4969
4970 VOID    HMAC_SHA1(
4971         IN  UCHAR   *text,
4972         IN  UINT    text_len,
4973         IN  UCHAR   *key,
4974         IN  UINT    key_len,
4975         IN  UCHAR   *digest);
4976
4977 VOID    PRF(
4978         IN  UCHAR   *key,
4979         IN  INT     key_len,
4980         IN  UCHAR   *prefix,
4981         IN  INT     prefix_len,
4982         IN  UCHAR   *data,
4983         IN  INT     data_len,
4984         OUT UCHAR   *output,
4985         IN  INT     len);
4986
4987 VOID    CCKMPRF(
4988         IN  UCHAR   *key,
4989         IN  INT     key_len,
4990         IN  UCHAR   *data,
4991         IN  INT     data_len,
4992         OUT UCHAR   *output,
4993         IN  INT     len);
4994
4995 VOID WpaCountPTK(
4996         IN  PRTMP_ADAPTER   pAd,
4997         IN  UCHAR   *PMK,
4998         IN  UCHAR   *ANonce,
4999         IN  UCHAR   *AA,
5000         IN  UCHAR   *SNonce,
5001         IN  UCHAR   *SA,
5002         OUT UCHAR   *output,
5003         IN  UINT    len);
5004
5005 VOID    GenRandom(
5006         IN  PRTMP_ADAPTER   pAd,
5007         IN      UCHAR                   *macAddr,
5008         OUT     UCHAR                   *random);
5009
5010 //
5011 // prototype in aironet.c
5012 //
5013 VOID    AironetStateMachineInit(
5014         IN  PRTMP_ADAPTER       pAd,
5015         IN  STATE_MACHINE       *S,
5016         OUT STATE_MACHINE_FUNC  Trans[]);
5017
5018 VOID    AironetMsgAction(
5019         IN  PRTMP_ADAPTER   pAd,
5020         IN  MLME_QUEUE_ELEM *Elem);
5021
5022 VOID    AironetRequestAction(
5023         IN  PRTMP_ADAPTER   pAd,
5024         IN  MLME_QUEUE_ELEM *Elem);
5025
5026 VOID    ChannelLoadRequestAction(
5027         IN  PRTMP_ADAPTER   pAd,
5028         IN  UCHAR           Index);
5029
5030 VOID    NoiseHistRequestAction(
5031         IN  PRTMP_ADAPTER   pAd,
5032         IN  UCHAR           Index);
5033
5034 VOID    BeaconRequestAction(
5035         IN  PRTMP_ADAPTER   pAd,
5036         IN  UCHAR           Index);
5037
5038 VOID    AironetReportAction(
5039         IN  PRTMP_ADAPTER   pAd,
5040         IN  MLME_QUEUE_ELEM *Elem);
5041
5042 VOID    ChannelLoadReportAction(
5043         IN  PRTMP_ADAPTER   pAd,
5044         IN  UCHAR           Index);
5045
5046 VOID    NoiseHistReportAction(
5047         IN  PRTMP_ADAPTER   pAd,
5048         IN  UCHAR           Index);
5049
5050 VOID    AironetFinalReportAction(
5051         IN  PRTMP_ADAPTER   pAd);
5052
5053 VOID    BeaconReportAction(
5054         IN  PRTMP_ADAPTER   pAd,
5055         IN  UCHAR           Index);
5056
5057 VOID    AironetAddBeaconReport(
5058         IN  PRTMP_ADAPTER       pAd,
5059         IN  ULONG               Index,
5060         IN  PMLME_QUEUE_ELEM    pElem);
5061
5062 VOID    AironetCreateBeaconReportFromBssTable(
5063         IN  PRTMP_ADAPTER       pAd);
5064
5065 CHAR    ConvertToRssi(
5066         IN PRTMP_ADAPTER  pAd,
5067         IN CHAR                         Rssi,
5068         IN UCHAR    RssiNumber);
5069
5070 //
5071 // function prototype in cmm_wpa.c
5072 //
5073 BOOLEAN RTMPCheckWPAframe(
5074         IN PRTMP_ADAPTER pAd,
5075         IN PMAC_TABLE_ENTRY     pEntry,
5076         IN PUCHAR                       pData,
5077         IN ULONG                        DataByteCount,
5078         IN UCHAR                        FromWhichBSSID);
5079
5080 VOID AES_GTK_KEY_UNWRAP(
5081         IN  UCHAR   *key,
5082         OUT UCHAR   *plaintext,
5083         IN      UCHAR   c_len,
5084         IN  UCHAR   *ciphertext);
5085
5086 VOID RTMPMakeRSNIE(
5087         IN  PRTMP_ADAPTER   pAd,
5088         IN  UINT            AuthMode,
5089         IN  UINT            WepStatus,
5090         IN      UCHAR                   apidx);
5091
5092 //
5093 // function prototype in ap_wpa.c
5094 //
5095
5096 VOID HandleCounterMeasure(
5097         IN PRTMP_ADAPTER pAd,
5098         IN MAC_TABLE_ENTRY  *pEntry);
5099
5100 /* timeout -- ms */
5101 VOID RTMP_SetPeriodicTimer(
5102         IN      NDIS_MINIPORT_TIMER *pTimer,
5103         IN      unsigned long timeout);
5104
5105 VOID RTMP_OS_Init_Timer(
5106         IN      PRTMP_ADAPTER pAd,
5107         IN      NDIS_MINIPORT_TIMER *pTimer,
5108         IN      TIMER_FUNCTION function,
5109         IN      PVOID data);
5110
5111 VOID RTMP_OS_Add_Timer(
5112         IN      NDIS_MINIPORT_TIMER     *pTimer,
5113         IN      unsigned long timeout);
5114
5115 VOID RTMP_OS_Mod_Timer(
5116         IN      NDIS_MINIPORT_TIMER     *pTimer,
5117         IN      unsigned long timeout);
5118
5119
5120 VOID RTMP_OS_Del_Timer(
5121         IN      NDIS_MINIPORT_TIMER     *pTimer,
5122         OUT     BOOLEAN                          *pCancelled);
5123
5124
5125 VOID RTMP_OS_Release_Packet(
5126         IN      PRTMP_ADAPTER pAd,
5127         IN      PQUEUE_ENTRY  pEntry);
5128
5129 VOID RTMPusecDelay(
5130         IN      ULONG   usec);
5131
5132 NDIS_STATUS os_alloc_mem(
5133         IN      PRTMP_ADAPTER pAd,
5134         OUT     PUCHAR *mem,
5135         IN      ULONG  size);
5136
5137 NDIS_STATUS os_free_mem(
5138         IN      PRTMP_ADAPTER pAd,
5139         IN      PUCHAR mem);
5140
5141
5142 void RTMP_AllocateSharedMemory(
5143         IN      PRTMP_ADAPTER pAd,
5144         IN      ULONG   Length,
5145         IN      BOOLEAN Cached,
5146         OUT     PVOID   *VirtualAddress,
5147         OUT     PNDIS_PHYSICAL_ADDRESS PhysicalAddress);
5148
5149 VOID RTMPFreeTxRxRingMemory(
5150     IN  PRTMP_ADAPTER   pAd);
5151
5152 NDIS_STATUS AdapterBlockAllocateMemory(
5153         IN PVOID        handle,
5154         OUT     PVOID   *ppAd);
5155
5156 void RTMP_AllocateTxDescMemory(
5157         IN      PRTMP_ADAPTER pAd,
5158         IN      UINT    Index,
5159         IN      ULONG   Length,
5160         IN      BOOLEAN Cached,
5161         OUT     PVOID   *VirtualAddress,
5162         OUT     PNDIS_PHYSICAL_ADDRESS PhysicalAddress);
5163
5164 void RTMP_AllocateFirstTxBuffer(
5165         IN      PRTMP_ADAPTER pAd,
5166         IN      UINT    Index,
5167         IN      ULONG   Length,
5168         IN      BOOLEAN Cached,
5169         OUT     PVOID   *VirtualAddress,
5170         OUT     PNDIS_PHYSICAL_ADDRESS PhysicalAddress);
5171
5172 void RTMP_AllocateMgmtDescMemory(
5173         IN      PRTMP_ADAPTER pAd,
5174         IN      ULONG   Length,
5175         IN      BOOLEAN Cached,
5176         OUT     PVOID   *VirtualAddress,
5177         OUT     PNDIS_PHYSICAL_ADDRESS PhysicalAddress);
5178
5179 void RTMP_AllocateRxDescMemory(
5180         IN      PRTMP_ADAPTER pAd,
5181         IN      ULONG   Length,
5182         IN      BOOLEAN Cached,
5183         OUT     PVOID   *VirtualAddress,
5184         OUT     PNDIS_PHYSICAL_ADDRESS PhysicalAddress);
5185
5186 PNDIS_PACKET RTMP_AllocateRxPacketBuffer(
5187         IN      PRTMP_ADAPTER pAd,
5188         IN      ULONG   Length,
5189         IN      BOOLEAN Cached,
5190         OUT     PVOID   *VirtualAddress,
5191         OUT     PNDIS_PHYSICAL_ADDRESS PhysicalAddress);
5192
5193 PNDIS_PACKET RTMP_AllocateTxPacketBuffer(
5194         IN      PRTMP_ADAPTER pAd,
5195         IN      ULONG   Length,
5196         IN      BOOLEAN Cached,
5197         OUT     PVOID   *VirtualAddress);
5198
5199 PNDIS_PACKET RTMP_AllocateFragPacketBuffer(
5200         IN      PRTMP_ADAPTER pAd,
5201         IN      ULONG   Length);
5202
5203 void RTMP_QueryPacketInfo(
5204         IN  PNDIS_PACKET pPacket,
5205         OUT PACKET_INFO  *pPacketInfo,
5206         OUT PUCHAR               *pSrcBufVA,
5207         OUT     UINT             *pSrcBufLen);
5208
5209 void RTMP_QueryNextPacketInfo(
5210         IN  PNDIS_PACKET *ppPacket,
5211         OUT PACKET_INFO  *pPacketInfo,
5212         OUT PUCHAR               *pSrcBufVA,
5213         OUT     UINT             *pSrcBufLen);
5214
5215
5216 BOOLEAN RTMP_FillTxBlkInfo(
5217         IN RTMP_ADAPTER *pAd,
5218         IN TX_BLK *pTxBlk);
5219
5220
5221 PRTMP_SCATTER_GATHER_LIST
5222 rt_get_sg_list_from_packet(PNDIS_PACKET pPacket, RTMP_SCATTER_GATHER_LIST *sg);
5223
5224
5225  void announce_802_3_packet(
5226         IN      PRTMP_ADAPTER   pAd,
5227         IN      PNDIS_PACKET    pPacket);
5228
5229
5230 UINT BA_Reorder_AMSDU_Annnounce(
5231         IN      PRTMP_ADAPTER   pAd,
5232         IN      PNDIS_PACKET    pPacket);
5233
5234 PNET_DEV get_netdev_from_bssid(
5235         IN      PRTMP_ADAPTER   pAd,
5236         IN      UCHAR                   FromWhichBSSID);
5237
5238
5239 PNDIS_PACKET duplicate_pkt(
5240         IN      PRTMP_ADAPTER   pAd,
5241         IN      PUCHAR                  pHeader802_3,
5242     IN  UINT            HdrLen,
5243         IN      PUCHAR                  pData,
5244         IN      ULONG                   DataSize,
5245         IN      UCHAR                   FromWhichBSSID);
5246
5247
5248 PNDIS_PACKET duplicate_pkt_with_TKIP_MIC(
5249         IN      PRTMP_ADAPTER   pAd,
5250         IN      PNDIS_PACKET    pOldPkt);
5251
5252 void ba_flush_reordering_timeout_mpdus(
5253         IN PRTMP_ADAPTER        pAd,
5254         IN PBA_REC_ENTRY        pBAEntry,
5255         IN ULONG                        Now32);
5256
5257
5258 VOID BAOriSessionSetUp(
5259                         IN PRTMP_ADAPTER    pAd,
5260                         IN MAC_TABLE_ENTRY      *pEntry,
5261                         IN UCHAR                        TID,
5262                         IN USHORT                       TimeOut,
5263                         IN ULONG                        DelayTime,
5264                         IN BOOLEAN              isForced);
5265
5266 VOID BASessionTearDownALL(
5267         IN OUT  PRTMP_ADAPTER pAd,
5268         IN              UCHAR Wcid);
5269
5270 BOOLEAN OS_Need_Clone_Packet(void);
5271
5272
5273 VOID build_tx_packet(
5274         IN      PRTMP_ADAPTER   pAd,
5275         IN      PNDIS_PACKET    pPacket,
5276         IN      PUCHAR  pFrame,
5277         IN      ULONG   FrameLen);
5278
5279
5280 VOID BAOriSessionTearDown(
5281         IN OUT  PRTMP_ADAPTER   pAd,
5282         IN              UCHAR                   Wcid,
5283         IN              UCHAR                   TID,
5284         IN              BOOLEAN                 bPassive,
5285         IN              BOOLEAN                 bForceSend);
5286
5287 VOID BARecSessionTearDown(
5288         IN OUT  PRTMP_ADAPTER   pAd,
5289         IN              UCHAR                   Wcid,
5290         IN              UCHAR                   TID,
5291         IN              BOOLEAN                 bPassive);
5292
5293 BOOLEAN ba_reordering_resource_init(PRTMP_ADAPTER pAd, int num);
5294 void ba_reordering_resource_release(PRTMP_ADAPTER pAd);
5295
5296 BOOLEAN rtstrmactohex(
5297         IN char *s1,
5298         IN char *s2);
5299
5300 BOOLEAN rtstrcasecmp(
5301         IN char *s1,
5302         IN char *s2);
5303
5304 char *rtstrstruncasecmp(
5305         IN char *s1,
5306         IN char *s2);
5307
5308 char    *rtstrstr(
5309         IN      const char * s1,
5310         IN      const char * s2);
5311
5312 char *rstrtok(
5313         IN char * s,
5314         IN const char * ct);
5315
5316 int rtinet_aton(
5317         const char *cp,
5318         unsigned int *addr);
5319
5320 ////////// common ioctl functions //////////
5321 INT Set_DriverVersion_Proc(
5322         IN      PRTMP_ADAPTER   pAd,
5323         IN      PUCHAR                  arg);
5324
5325 INT Set_CountryRegion_Proc(
5326         IN      PRTMP_ADAPTER   pAd,
5327         IN      PUCHAR                  arg);
5328
5329 INT Set_CountryRegionABand_Proc(
5330         IN      PRTMP_ADAPTER   pAd,
5331         IN      PUCHAR                  arg);
5332
5333 INT Set_WirelessMode_Proc(
5334         IN      PRTMP_ADAPTER   pAd,
5335         IN      PUCHAR                  arg);
5336
5337 INT Set_Channel_Proc(
5338         IN      PRTMP_ADAPTER   pAd,
5339         IN      PUCHAR                  arg);
5340
5341 INT     Set_ShortSlot_Proc(
5342         IN      PRTMP_ADAPTER   pAd,
5343         IN      PUCHAR                  arg);
5344
5345 INT     Set_TxPower_Proc(
5346         IN      PRTMP_ADAPTER   pAd,
5347         IN      PUCHAR                  arg);
5348
5349 INT Set_BGProtection_Proc(
5350         IN  PRTMP_ADAPTER               pAd,
5351         IN  PUCHAR                      arg);
5352
5353 INT Set_TxPreamble_Proc(
5354         IN  PRTMP_ADAPTER               pAd,
5355         IN  PUCHAR                      arg);
5356
5357 INT Set_RTSThreshold_Proc(
5358         IN  PRTMP_ADAPTER               pAd,
5359         IN  PUCHAR                      arg);
5360
5361 INT Set_FragThreshold_Proc(
5362         IN  PRTMP_ADAPTER               pAd,
5363         IN  PUCHAR                      arg);
5364
5365 INT Set_TxBurst_Proc(
5366         IN  PRTMP_ADAPTER               pAd,
5367         IN  PUCHAR                      arg);
5368
5369 #ifdef AGGREGATION_SUPPORT
5370 INT     Set_PktAggregate_Proc(
5371         IN  PRTMP_ADAPTER               pAd,
5372         IN  PUCHAR                      arg);
5373 #endif
5374
5375 INT     Set_IEEE80211H_Proc(
5376         IN      PRTMP_ADAPTER   pAd,
5377         IN      PUCHAR                  arg);
5378
5379 #ifdef DBG
5380 INT     Set_Debug_Proc(
5381         IN      PRTMP_ADAPTER   pAd,
5382         IN      PUCHAR                  arg);
5383 #endif
5384
5385 INT     Show_DescInfo_Proc(
5386         IN      PRTMP_ADAPTER   pAd,
5387         IN      PUCHAR                  arg);
5388
5389 INT     Set_ResetStatCounter_Proc(
5390         IN      PRTMP_ADAPTER   pAd,
5391         IN      PUCHAR                  arg);
5392
5393 INT     Set_BASetup_Proc(
5394         IN      PRTMP_ADAPTER   pAd,
5395         IN      PUCHAR                  arg);
5396
5397 INT     Set_BADecline_Proc(
5398         IN      PRTMP_ADAPTER   pAd,
5399         IN      PUCHAR                  arg);
5400
5401 INT     Set_BAOriTearDown_Proc(
5402         IN      PRTMP_ADAPTER   pAd,
5403         IN      PUCHAR                  arg);
5404
5405 INT     Set_BARecTearDown_Proc(
5406         IN      PRTMP_ADAPTER   pAd,
5407         IN      PUCHAR                  arg);
5408
5409 INT     Set_HtBw_Proc(
5410         IN      PRTMP_ADAPTER   pAd,
5411         IN      PUCHAR                  arg);
5412
5413 INT     Set_HtMcs_Proc(
5414         IN      PRTMP_ADAPTER   pAd,
5415         IN      PUCHAR                  arg);
5416
5417 INT     Set_HtGi_Proc(
5418         IN      PRTMP_ADAPTER   pAd,
5419         IN      PUCHAR                  arg);
5420
5421 INT     Set_HtOpMode_Proc(
5422         IN      PRTMP_ADAPTER   pAd,
5423         IN      PUCHAR                  arg);
5424
5425 INT     Set_HtStbc_Proc(
5426         IN      PRTMP_ADAPTER   pAd,
5427         IN      PUCHAR                  arg);
5428
5429 INT     Set_HtHtc_Proc(
5430         IN      PRTMP_ADAPTER   pAd,
5431         IN      PUCHAR                  arg);
5432
5433 INT     Set_HtExtcha_Proc(
5434         IN      PRTMP_ADAPTER   pAd,
5435         IN      PUCHAR                  arg);
5436
5437 INT     Set_HtMpduDensity_Proc(
5438         IN      PRTMP_ADAPTER   pAd,
5439         IN      PUCHAR                  arg);
5440
5441 INT     Set_HtBaWinSize_Proc(
5442         IN      PRTMP_ADAPTER   pAd,
5443         IN      PUCHAR                  arg);
5444
5445 INT     Set_HtRdg_Proc(
5446         IN      PRTMP_ADAPTER   pAd,
5447         IN      PUCHAR                  arg);
5448
5449 INT     Set_HtLinkAdapt_Proc(
5450         IN      PRTMP_ADAPTER   pAd,
5451         IN      PUCHAR                  arg);
5452
5453 INT     Set_HtAmsdu_Proc(
5454         IN      PRTMP_ADAPTER   pAd,
5455         IN      PUCHAR                  arg);
5456
5457 INT     Set_HtAutoBa_Proc(
5458         IN      PRTMP_ADAPTER   pAd,
5459         IN      PUCHAR                  arg);
5460
5461 INT     Set_HtProtect_Proc(
5462         IN      PRTMP_ADAPTER   pAd,
5463         IN      PUCHAR                  arg);
5464
5465 INT     Set_HtMimoPs_Proc(
5466         IN      PRTMP_ADAPTER   pAd,
5467         IN      PUCHAR                  arg);
5468
5469
5470 INT     Set_ForceShortGI_Proc(
5471         IN      PRTMP_ADAPTER   pAd,
5472         IN      PUCHAR                  arg);
5473
5474 INT     Set_ForceGF_Proc(
5475         IN      PRTMP_ADAPTER   pAd,
5476         IN      PUCHAR                  arg);
5477
5478 INT     SetCommonHT(
5479         IN      PRTMP_ADAPTER   pAd);
5480
5481 INT     Set_SendPSMPAction_Proc(
5482         IN      PRTMP_ADAPTER   pAd,
5483         IN      PUCHAR                  arg);
5484
5485 INT     Set_HtMIMOPSmode_Proc(
5486         IN      PRTMP_ADAPTER   pAd,
5487         IN      PUCHAR                  arg);
5488
5489
5490 INT     Set_HtTxBASize_Proc(
5491         IN      PRTMP_ADAPTER   pAd,
5492         IN      PUCHAR                  arg);
5493
5494 INT         WpaCheckEapCode(
5495         IN  PRTMP_ADAPTER       pAd,
5496         IN  PUCHAR                              pFrame,
5497         IN  USHORT                              FrameLen,
5498         IN  USHORT                              OffSet);
5499
5500 VOID    WpaSendMicFailureToWpaSupplicant(
5501     IN  PRTMP_ADAPTER       pAd,
5502     IN  BOOLEAN             bUnicast);
5503
5504 int wext_notify_event_assoc(
5505         IN  RTMP_ADAPTER *pAd);
5506
5507 BOOLEAN STARxDoneInterruptHandle(
5508         IN      PRTMP_ADAPTER   pAd,
5509         IN      BOOLEAN                 argc);
5510
5511 // AMPDU packet indication
5512 VOID Indicate_AMPDU_Packet(
5513         IN      PRTMP_ADAPTER   pAd,
5514         IN      RX_BLK                  *pRxBlk,
5515         IN      UCHAR                   FromWhichBSSID);
5516
5517 // AMSDU packet indication
5518 VOID Indicate_AMSDU_Packet(
5519         IN      PRTMP_ADAPTER   pAd,
5520         IN      RX_BLK                  *pRxBlk,
5521         IN      UCHAR                   FromWhichBSSID);
5522
5523 // Normal legacy Rx packet indication
5524 VOID Indicate_Legacy_Packet(
5525         IN      PRTMP_ADAPTER   pAd,
5526         IN      RX_BLK                  *pRxBlk,
5527         IN      UCHAR                   FromWhichBSSID);
5528
5529 VOID Indicate_EAPOL_Packet(
5530         IN      PRTMP_ADAPTER   pAd,
5531         IN      RX_BLK                  *pRxBlk,
5532         IN      UCHAR                   FromWhichBSSID);
5533
5534 void  update_os_packet_info(
5535         IN      PRTMP_ADAPTER   pAd,
5536         IN      RX_BLK                  *pRxBlk,
5537         IN      UCHAR                   FromWhichBSSID);
5538
5539 void wlan_802_11_to_802_3_packet(
5540         IN      PRTMP_ADAPTER   pAd,
5541         IN      RX_BLK                  *pRxBlk,
5542         IN      PUCHAR                  pHeader802_3,
5543         IN  UCHAR                       FromWhichBSSID);
5544
5545 UINT deaggregate_AMSDU_announce(
5546         IN      PRTMP_ADAPTER   pAd,
5547         PNDIS_PACKET            pPacket,
5548         IN      PUCHAR                  pData,
5549         IN      ULONG                   DataSize);
5550
5551 // remove LLC and get 802_3 Header
5552 #define  RTMP_802_11_REMOVE_LLC_AND_CONVERT_TO_802_3(_pRxBlk, _pHeader802_3)    \
5553 {                                                                                                                                                               \
5554         PUCHAR _pRemovedLLCSNAP = NULL, _pDA, _pSA;                                 \
5555                                                                                                                                                                 \
5556         if (RX_BLK_TEST_FLAG(_pRxBlk, fRX_MESH))                                    \
5557         {                                                                           \
5558                 _pDA = _pRxBlk->pHeader->Addr3;                                         \
5559                 _pSA = (PUCHAR)_pRxBlk->pHeader + sizeof(HEADER_802_11);                \
5560         }                                                                           \
5561         else                                                                        \
5562         {                                                                           \
5563                 if (RX_BLK_TEST_FLAG(_pRxBlk, fRX_INFRA))                               \
5564                 {                                                                       \
5565                         _pDA = _pRxBlk->pHeader->Addr1;                                     \
5566                 if (RX_BLK_TEST_FLAG(_pRxBlk, fRX_DLS))                                                                 \
5567                         _pSA = _pRxBlk->pHeader->Addr2;                                                                         \
5568                 else                                                                                                                                    \
5569                         _pSA = _pRxBlk->pHeader->Addr3;                                     \
5570                 }                                                                       \
5571                 else                                                                    \
5572                 {                                                                       \
5573                         _pDA = _pRxBlk->pHeader->Addr1;                                     \
5574                         _pSA = _pRxBlk->pHeader->Addr2;                                     \
5575                 }                                                                       \
5576         }                                                                           \
5577                                                                                                                                                                 \
5578         CONVERT_TO_802_3(_pHeader802_3, _pDA, _pSA, _pRxBlk->pData,                             \
5579                 _pRxBlk->DataSize, _pRemovedLLCSNAP);                                   \
5580 }
5581
5582 VOID Sta_Announce_or_Forward_802_3_Packet(
5583         IN      PRTMP_ADAPTER   pAd,
5584         IN      PNDIS_PACKET    pPacket,
5585         IN      UCHAR                   FromWhichBSSID);
5586
5587 #define ANNOUNCE_OR_FORWARD_802_3_PACKET(_pAd, _pPacket, _FromWhichBSS)\
5588                         Sta_Announce_or_Forward_802_3_Packet(_pAd, _pPacket, _FromWhichBSS);
5589                         //announce_802_3_packet(_pAd, _pPacket);
5590
5591 PNDIS_PACKET DuplicatePacket(
5592         IN      PRTMP_ADAPTER   pAd,
5593         IN      PNDIS_PACKET    pPacket,
5594         IN      UCHAR                   FromWhichBSSID);
5595
5596
5597 PNDIS_PACKET ClonePacket(
5598         IN      PRTMP_ADAPTER   pAd,
5599         IN      PNDIS_PACKET    pPacket,
5600         IN      PUCHAR                  pData,
5601         IN      ULONG                   DataSize);
5602
5603
5604 // Normal, AMPDU or AMSDU
5605 VOID CmmRxnonRalinkFrameIndicate(
5606         IN      PRTMP_ADAPTER   pAd,
5607         IN      RX_BLK                  *pRxBlk,
5608         IN      UCHAR                   FromWhichBSSID);
5609
5610 VOID CmmRxRalinkFrameIndicate(
5611         IN      PRTMP_ADAPTER   pAd,
5612         IN      MAC_TABLE_ENTRY *pEntry,
5613         IN      RX_BLK                  *pRxBlk,
5614         IN      UCHAR                   FromWhichBSSID);
5615
5616 VOID Update_Rssi_Sample(
5617         IN PRTMP_ADAPTER        pAd,
5618         IN RSSI_SAMPLE          *pRssi,
5619         IN PRXWI_STRUC          pRxWI);
5620
5621 PNDIS_PACKET RTMPDeFragmentDataFrame(
5622         IN      PRTMP_ADAPTER   pAd,
5623         IN      RX_BLK                  *pRxBlk);
5624
5625 ////////////////////////////////////////
5626 enum {
5627         DIDmsg_lnxind_wlansniffrm               = 0x00000044,
5628         DIDmsg_lnxind_wlansniffrm_hosttime      = 0x00010044,
5629         DIDmsg_lnxind_wlansniffrm_mactime       = 0x00020044,
5630         DIDmsg_lnxind_wlansniffrm_channel       = 0x00030044,
5631         DIDmsg_lnxind_wlansniffrm_rssi          = 0x00040044,
5632         DIDmsg_lnxind_wlansniffrm_sq            = 0x00050044,
5633         DIDmsg_lnxind_wlansniffrm_signal        = 0x00060044,
5634         DIDmsg_lnxind_wlansniffrm_noise         = 0x00070044,
5635         DIDmsg_lnxind_wlansniffrm_rate          = 0x00080044,
5636         DIDmsg_lnxind_wlansniffrm_istx          = 0x00090044,
5637         DIDmsg_lnxind_wlansniffrm_frmlen        = 0x000A0044
5638 };
5639 enum {
5640         P80211ENUM_msgitem_status_no_value      = 0x00
5641 };
5642 enum {
5643         P80211ENUM_truth_false                  = 0x00,
5644         P80211ENUM_truth_true                   = 0x01
5645 };
5646
5647 /* Definition from madwifi */
5648 typedef struct {
5649         UINT32 did;
5650         UINT16 status;
5651         UINT16 len;
5652         UINT32 data;
5653 } p80211item_uint32_t;
5654
5655 typedef struct {
5656         UINT32 msgcode;
5657         UINT32 msglen;
5658 #define WLAN_DEVNAMELEN_MAX 16
5659         UINT8 devname[WLAN_DEVNAMELEN_MAX];
5660         p80211item_uint32_t hosttime;
5661         p80211item_uint32_t mactime;
5662         p80211item_uint32_t channel;
5663         p80211item_uint32_t rssi;
5664         p80211item_uint32_t sq;
5665         p80211item_uint32_t signal;
5666         p80211item_uint32_t noise;
5667         p80211item_uint32_t rate;
5668         p80211item_uint32_t istx;
5669         p80211item_uint32_t frmlen;
5670 } wlan_ng_prism2_header;
5671
5672 /* The radio capture header precedes the 802.11 header. */
5673 typedef struct PACKED _ieee80211_radiotap_header {
5674     UINT8       it_version;     /* Version 0. Only increases
5675                                  * for drastic changes,
5676                                  * introduction of compatible
5677                                  * new fields does not count.
5678                                  */
5679     UINT8       it_pad;
5680     UINT16     it_len;         /* length of the whole
5681                                  * header in bytes, including
5682                                  * it_version, it_pad,
5683                                  * it_len, and data fields.
5684                                  */
5685     UINT32   it_present;        /* A bitmap telling which
5686                                          * fields are present. Set bit 31
5687                                          * (0x80000000) to extend the
5688                                          * bitmap by another 32 bits.
5689                                          * Additional extensions are made
5690                                          * by setting bit 31.
5691                                          */
5692 }ieee80211_radiotap_header ;
5693
5694 enum ieee80211_radiotap_type {
5695     IEEE80211_RADIOTAP_TSFT = 0,
5696     IEEE80211_RADIOTAP_FLAGS = 1,
5697     IEEE80211_RADIOTAP_RATE = 2,
5698     IEEE80211_RADIOTAP_CHANNEL = 3,
5699     IEEE80211_RADIOTAP_FHSS = 4,
5700     IEEE80211_RADIOTAP_DBM_ANTSIGNAL = 5,
5701     IEEE80211_RADIOTAP_DBM_ANTNOISE = 6,
5702     IEEE80211_RADIOTAP_LOCK_QUALITY = 7,
5703     IEEE80211_RADIOTAP_TX_ATTENUATION = 8,
5704     IEEE80211_RADIOTAP_DB_TX_ATTENUATION = 9,
5705     IEEE80211_RADIOTAP_DBM_TX_POWER = 10,
5706     IEEE80211_RADIOTAP_ANTENNA = 11,
5707     IEEE80211_RADIOTAP_DB_ANTSIGNAL = 12,
5708     IEEE80211_RADIOTAP_DB_ANTNOISE = 13
5709 };
5710
5711 #define WLAN_RADIOTAP_PRESENT (                 \
5712         (1 << IEEE80211_RADIOTAP_TSFT)  |       \
5713         (1 << IEEE80211_RADIOTAP_FLAGS) |       \
5714         (1 << IEEE80211_RADIOTAP_RATE)  |       \
5715          0)
5716
5717 typedef struct _wlan_radiotap_header {
5718         ieee80211_radiotap_header wt_ihdr;
5719         INT64 wt_tsft;
5720         UINT8 wt_flags;
5721         UINT8 wt_rate;
5722 } wlan_radiotap_header;
5723 /* Definition from madwifi */
5724
5725 void send_monitor_packets(
5726         IN      PRTMP_ADAPTER   pAd,
5727         IN      RX_BLK                  *pRxBlk);
5728
5729 // This function will be called when query /proc
5730 struct iw_statistics *rt28xx_get_wireless_stats(
5731     IN struct net_device *net_dev);
5732
5733 VOID    RTMPSetDesiredRates(
5734     IN  PRTMP_ADAPTER   pAdapter,
5735     IN  LONG            Rates);
5736
5737 INT     Set_FixedTxMode_Proc(
5738         IN      PRTMP_ADAPTER   pAd,
5739         IN      PUCHAR                  arg);
5740
5741 static inline char* GetPhyMode(
5742         int Mode)
5743 {
5744         switch(Mode)
5745         {
5746                 case MODE_CCK:
5747                         return "CCK";
5748
5749                 case MODE_OFDM:
5750                         return "OFDM";
5751                 case MODE_HTMIX:
5752                         return "HTMIX";
5753
5754                 case MODE_HTGREENFIELD:
5755                         return "GREEN";
5756                 default:
5757                         return "N/A";
5758         }
5759 }
5760
5761
5762 static inline char* GetBW(
5763         int BW)
5764 {
5765         switch(BW)
5766         {
5767                 case BW_10:
5768                         return "10M";
5769
5770                 case BW_20:
5771                         return "20M";
5772                 case BW_40:
5773                         return "40M";
5774                 default:
5775                         return "N/A";
5776         }
5777 }
5778
5779
5780 VOID RT28xxThreadTerminate(
5781         IN RTMP_ADAPTER *pAd);
5782
5783 BOOLEAN RT28XXChipsetCheck(
5784         IN void *_dev_p);
5785
5786 BOOLEAN RT28XXNetDevInit(
5787         IN void                                 *_dev_p,
5788         IN struct  net_device   *net_dev,
5789         IN RTMP_ADAPTER                 *pAd);
5790
5791 BOOLEAN RT28XXProbePostConfig(
5792         IN void                                 *_dev_p,
5793         IN RTMP_ADAPTER                 *pAd,
5794         IN INT32                                argc);
5795
5796 VOID RT28XXDMADisable(
5797         IN RTMP_ADAPTER                 *pAd);
5798
5799 VOID RT28XXDMAEnable(
5800         IN RTMP_ADAPTER                 *pAd);
5801
5802 VOID RT28xx_UpdateBeaconToAsic(
5803         IN RTMP_ADAPTER * pAd,
5804         IN INT apidx,
5805         IN ULONG BeaconLen,
5806         IN ULONG UpdatePos);
5807
5808 INT rt28xx_sta_ioctl(
5809         IN      struct net_device       *net_dev,
5810         IN      OUT     struct ifreq    *rq,
5811         IN      INT                     cmd);
5812
5813 ////////////////////////////////////////
5814 PNDIS_PACKET GetPacketFromRxRing(
5815         IN              PRTMP_ADAPTER   pAd,
5816         OUT             PRT28XX_RXD_STRUC       pSaveRxD,
5817         OUT             BOOLEAN                 *pbReschedule,
5818         IN OUT  UINT32                  *pRxPending);
5819
5820
5821 void kill_thread_task(PRTMP_ADAPTER pAd);
5822
5823 void tbtt_tasklet(unsigned long data);
5824
5825 #ifdef RT2860
5826 //
5827 // Function Prototype in cmm_data_2860.c
5828 //
5829 USHORT RtmpPCI_WriteTxResource(
5830         IN      PRTMP_ADAPTER   pAd,
5831         IN      TX_BLK                  *pTxBlk,
5832         IN      BOOLEAN                 bIsLast,
5833         OUT     USHORT                  *FreeNumber);
5834
5835 USHORT RtmpPCI_WriteSingleTxResource(
5836         IN      PRTMP_ADAPTER   pAd,
5837         IN      TX_BLK                  *pTxBlk,
5838         IN      BOOLEAN                 bIsLast,
5839         OUT     USHORT                  *FreeNumber);
5840
5841 USHORT RtmpPCI_WriteMultiTxResource(
5842         IN      PRTMP_ADAPTER   pAd,
5843         IN      TX_BLK                  *pTxBlk,
5844         IN      UCHAR                   frameNum,
5845         OUT     USHORT                  *FreeNumber);
5846
5847 USHORT  RtmpPCI_WriteFragTxResource(
5848         IN      PRTMP_ADAPTER   pAd,
5849         IN      TX_BLK                  *pTxBlk,
5850         IN      UCHAR                   fragNum,
5851         OUT     USHORT                  *FreeNumber);
5852
5853 USHORT RtmpPCI_WriteSubTxResource(
5854         IN      PRTMP_ADAPTER   pAd,
5855         IN      TX_BLK                  *pTxBlk,
5856         IN      BOOLEAN                 bIsLast,
5857         OUT     USHORT                  *FreeNumber);
5858
5859 VOID RtmpPCI_FinalWriteTxResource(
5860         IN      PRTMP_ADAPTER   pAd,
5861         IN      TX_BLK                  *pTxBlk,
5862         IN      USHORT                  totalMPDUSize,
5863         IN      USHORT                  FirstTxIdx);
5864
5865 VOID RtmpPCIDataLastTxIdx(
5866         IN      PRTMP_ADAPTER   pAd,
5867         IN      UCHAR                   QueIdx,
5868         IN      USHORT                  LastTxIdx);
5869
5870 VOID RtmpPCIDataKickOut(
5871         IN      PRTMP_ADAPTER   pAd,
5872         IN      TX_BLK                  *pTxBlk,
5873         IN      UCHAR                   QueIdx);
5874
5875
5876 int RtmpPCIMgmtKickOut(
5877         IN RTMP_ADAPTER         *pAd,
5878         IN UCHAR                        QueIdx,
5879         IN PNDIS_PACKET         pPacket,
5880         IN PUCHAR                       pSrcBufVA,
5881         IN UINT                         SrcBufLen);
5882
5883
5884 NDIS_STATUS RTMPCheckRxError(
5885         IN  PRTMP_ADAPTER   pAd,
5886         IN  PHEADER_802_11  pHeader,
5887         IN      PRXWI_STRUC     pRxWI,
5888         IN  PRT28XX_RXD_STRUC      pRxD);
5889
5890 VOID RTMPInitPCIeLinkCtrlValue(
5891         IN      PRTMP_ADAPTER   pAd);
5892
5893 VOID RTMPFindHostPCIDev(
5894     IN  PRTMP_ADAPTER   pAd);
5895
5896 VOID RTMPPCIeLinkCtrlValueRestore(
5897         IN      PRTMP_ADAPTER   pAd,
5898         IN   UCHAR              Level);
5899
5900 VOID RTMPPCIeLinkCtrlSetting(
5901         IN      PRTMP_ADAPTER   pAd,
5902         IN      USHORT          Max);
5903
5904 VOID RT28xxPciAsicRadioOff(
5905         IN PRTMP_ADAPTER    pAd,
5906         IN UCHAR            Level,
5907         IN USHORT           TbttNumToNextWakeUp);
5908
5909 BOOLEAN RT28xxPciAsicRadioOn(
5910         IN PRTMP_ADAPTER pAd,
5911         IN UCHAR     Level);
5912
5913 VOID RT28xxPciStaAsicForceWakeup(
5914         IN PRTMP_ADAPTER pAd,
5915         IN UCHAR         Level);
5916
5917 VOID RT28xxPciStaAsicSleepThenAutoWakeup(
5918         IN PRTMP_ADAPTER pAd,
5919         IN USHORT TbttNumToNextWakeUp);
5920
5921 VOID PsPollWakeExec(
5922         IN PVOID SystemSpecific1,
5923         IN PVOID FunctionContext,
5924         IN PVOID SystemSpecific2,
5925         IN PVOID SystemSpecific3);
5926
5927 VOID  RadioOnExec(
5928         IN PVOID SystemSpecific1,
5929         IN PVOID FunctionContext,
5930         IN PVOID SystemSpecific2,
5931         IN PVOID SystemSpecific3);
5932
5933 VOID RT28xxPciMlmeRadioOn(
5934         IN PRTMP_ADAPTER pAd);
5935
5936 VOID RT28xxPciMlmeRadioOFF(
5937         IN PRTMP_ADAPTER pAd);
5938 #endif /* RT2860 */
5939
5940 VOID AsicTurnOffRFClk(
5941         IN PRTMP_ADAPTER    pAd,
5942         IN      UCHAR           Channel);
5943
5944 VOID AsicTurnOnRFClk(
5945         IN PRTMP_ADAPTER        pAd,
5946         IN      UCHAR                   Channel);
5947
5948 NTSTATUS RT30xxWriteRFRegister(
5949         IN      PRTMP_ADAPTER   pAd,
5950         IN      UCHAR                   RegID,
5951         IN      UCHAR                   Value);
5952
5953 NTSTATUS RT30xxReadRFRegister(
5954         IN      PRTMP_ADAPTER   pAd,
5955         IN      UCHAR                   RegID,
5956         IN      PUCHAR                  pValue);
5957
5958 UCHAR eFuseReadRegisters(
5959         IN      PRTMP_ADAPTER   pAd,
5960         IN      USHORT Offset,
5961         IN      USHORT Length,
5962         OUT     USHORT* pData);
5963
5964 VOID eFuseReadPhysical(
5965         IN      PRTMP_ADAPTER   pAd,
5966         IN      PUSHORT lpInBuffer,
5967         IN      ULONG nInBufferSize,
5968         OUT     PUSHORT lpOutBuffer,
5969         IN      ULONG nOutBufferSize
5970 );
5971
5972 NTSTATUS eFuseRead(
5973         IN      PRTMP_ADAPTER   pAd,
5974         IN      USHORT                  Offset,
5975         OUT     PUCHAR                  pData,
5976         IN      USHORT                  Length);
5977
5978 VOID eFusePhysicalWriteRegisters(
5979         IN      PRTMP_ADAPTER   pAd,
5980         IN      USHORT Offset,
5981         IN      USHORT Length,
5982         OUT     USHORT* pData);
5983
5984 NTSTATUS eFuseWriteRegisters(
5985         IN      PRTMP_ADAPTER   pAd,
5986         IN      USHORT Offset,
5987         IN      USHORT Length,
5988         IN      USHORT* pData);
5989
5990 VOID eFuseWritePhysical(
5991         IN      PRTMP_ADAPTER   pAd,
5992         PUSHORT lpInBuffer,
5993         ULONG nInBufferSize,
5994         PUCHAR lpOutBuffer,
5995         ULONG nOutBufferSize
5996 );
5997
5998 NTSTATUS eFuseWrite(
5999         IN      PRTMP_ADAPTER   pAd,
6000         IN      USHORT                  Offset,
6001         IN      PUCHAR                  pData,
6002         IN      USHORT                  length);
6003
6004 INT set_eFuseGetFreeBlockCount_Proc(
6005         IN      PRTMP_ADAPTER   pAd,
6006         IN      PUCHAR                  arg);
6007
6008 INT set_eFusedump_Proc(
6009         IN      PRTMP_ADAPTER   pAd,
6010         IN      PUCHAR                  arg);
6011
6012 INT set_eFuseLoadFromBin_Proc(
6013         IN      PRTMP_ADAPTER   pAd,
6014         IN      PUCHAR                  arg);
6015
6016 NTSTATUS eFuseWriteRegistersFromBin(
6017         IN      PRTMP_ADAPTER   pAd,
6018         IN      USHORT Offset,
6019         IN      USHORT Length,
6020         IN      USHORT* pData);
6021
6022 VOID eFusePhysicalReadRegisters(
6023         IN      PRTMP_ADAPTER   pAd,
6024         IN      USHORT Offset,
6025         IN      USHORT Length,
6026         OUT     USHORT* pData);
6027
6028 VOID RT30xxLoadRFNormalModeSetup(
6029         IN PRTMP_ADAPTER        pAd);
6030
6031 VOID RT30xxLoadRFSleepModeSetup(
6032         IN PRTMP_ADAPTER        pAd);
6033
6034 VOID RT30xxReverseRFSleepModeSetup(
6035         IN PRTMP_ADAPTER        pAd);
6036
6037 #ifdef RT2870
6038 //
6039 // Function Prototype in rtusb_bulk.c
6040 //
6041 VOID    RTUSBInitTxDesc(
6042         IN      PRTMP_ADAPTER   pAd,
6043         IN      PTX_CONTEXT             pTxContext,
6044         IN      UCHAR                   BulkOutPipeId,
6045         IN      usb_complete_t  Func);
6046
6047 VOID    RTUSBInitHTTxDesc(
6048         IN      PRTMP_ADAPTER   pAd,
6049         IN      PHT_TX_CONTEXT  pTxContext,
6050         IN      UCHAR                   BulkOutPipeId,
6051         IN      ULONG                   BulkOutSize,
6052         IN      usb_complete_t  Func);
6053
6054 VOID RTUSBCleanUpDataBulkOutQueue(
6055         IN      PRTMP_ADAPTER   pAd);
6056
6057 VOID RTUSBCancelPendingBulkOutIRP(
6058         IN      PRTMP_ADAPTER   pAd);
6059
6060 VOID RTUSBBulkOutDataPacket(
6061         IN      PRTMP_ADAPTER   pAd,
6062         IN      UCHAR                   BulkOutPipeId,
6063         IN      UCHAR                   Index);
6064
6065 VOID RTUSBBulkOutNullFrame(
6066         IN      PRTMP_ADAPTER   pAd);
6067
6068 VOID RTUSBBulkOutRTSFrame(
6069         IN      PRTMP_ADAPTER   pAd);
6070
6071 VOID RTUSBCancelPendingBulkInIRP(
6072         IN      PRTMP_ADAPTER   pAd);
6073
6074 VOID RTUSBCancelPendingIRPs(
6075         IN      PRTMP_ADAPTER   pAd);
6076
6077 VOID RTUSBBulkOutMLMEPacket(
6078         IN      PRTMP_ADAPTER   pAd,
6079         IN      UCHAR                   Index);
6080
6081 VOID RTUSBBulkOutPsPoll(
6082         IN      PRTMP_ADAPTER   pAd);
6083
6084 VOID RTUSBCleanUpMLMEBulkOutQueue(
6085         IN      PRTMP_ADAPTER   pAd);
6086
6087 VOID RTUSBKickBulkOut(
6088         IN      PRTMP_ADAPTER pAd);
6089
6090 VOID    RTUSBBulkReceive(
6091         IN      PRTMP_ADAPTER   pAd);
6092
6093 VOID DoBulkIn(
6094         IN RTMP_ADAPTER *pAd);
6095
6096 VOID RTUSBInitRxDesc(
6097         IN      PRTMP_ADAPTER   pAd,
6098         IN  PRX_CONTEXT         pRxContext);
6099
6100 //
6101 // Function Prototype in rtusb_io.c
6102 //
6103 NTSTATUS RTUSBMultiRead(
6104         IN      PRTMP_ADAPTER   pAd,
6105         IN      USHORT                  Offset,
6106         OUT     PUCHAR                  pData,
6107         IN      USHORT                  length);
6108
6109 NTSTATUS RTUSBMultiWrite(
6110         IN      PRTMP_ADAPTER   pAd,
6111         IN      USHORT                  Offset,
6112         IN      PUCHAR                  pData,
6113         IN      USHORT                  length);
6114
6115 NTSTATUS RTUSBMultiWrite_OneByte(
6116         IN      PRTMP_ADAPTER   pAd,
6117         IN      USHORT                  Offset,
6118         IN      PUCHAR                  pData);
6119
6120 NTSTATUS RTUSBReadBBPRegister(
6121         IN      PRTMP_ADAPTER   pAd,
6122         IN      UCHAR                   Id,
6123         IN      PUCHAR                  pValue);
6124
6125 NTSTATUS RTUSBWriteBBPRegister(
6126         IN      PRTMP_ADAPTER   pAd,
6127         IN      UCHAR                   Id,
6128         IN      UCHAR                   Value);
6129
6130 NTSTATUS RTUSBWriteRFRegister(
6131         IN      PRTMP_ADAPTER   pAd,
6132         IN      UINT32                  Value);
6133
6134 NTSTATUS RTUSB_VendorRequest(
6135         IN      PRTMP_ADAPTER   pAd,
6136         IN      UINT32                  TransferFlags,
6137         IN      UCHAR                   ReservedBits,
6138         IN      UCHAR                   Request,
6139         IN      USHORT                  Value,
6140         IN      USHORT                  Index,
6141         IN      PVOID                   TransferBuffer,
6142         IN      UINT32                  TransferBufferLength);
6143
6144 NTSTATUS RTUSBReadEEPROM(
6145         IN      PRTMP_ADAPTER   pAd,
6146         IN      USHORT                  Offset,
6147         OUT     PUCHAR                  pData,
6148         IN      USHORT                  length);
6149
6150 NTSTATUS RTUSBWriteEEPROM(
6151         IN      PRTMP_ADAPTER   pAd,
6152         IN      USHORT                  Offset,
6153         IN      PUCHAR                  pData,
6154         IN      USHORT                  length);
6155
6156 VOID RTUSBPutToSleep(
6157         IN      PRTMP_ADAPTER   pAd);
6158
6159 NTSTATUS RTUSBWakeUp(
6160         IN      PRTMP_ADAPTER   pAd);
6161
6162 VOID RTUSBInitializeCmdQ(
6163         IN      PCmdQ   cmdq);
6164
6165 NDIS_STATUS     RTUSBEnqueueCmdFromNdis(
6166         IN      PRTMP_ADAPTER   pAd,
6167         IN      NDIS_OID                Oid,
6168         IN      BOOLEAN                 SetInformation,
6169         IN      PVOID                   pInformationBuffer,
6170         IN      UINT32                  InformationBufferLength);
6171
6172 NDIS_STATUS RTUSBEnqueueInternalCmd(
6173         IN      PRTMP_ADAPTER   pAd,
6174         IN NDIS_OID                     Oid,
6175         IN PVOID                        pInformationBuffer,
6176         IN UINT32                       InformationBufferLength);
6177
6178 VOID RTUSBDequeueCmd(
6179         IN      PCmdQ           cmdq,
6180         OUT     PCmdQElmt       *pcmdqelmt);
6181
6182 INT RTUSBCmdThread(
6183         IN OUT PVOID Context);
6184
6185 INT TimerQThread(
6186         IN OUT PVOID Context);
6187
6188 RT2870_TIMER_ENTRY *RT2870_TimerQ_Insert(
6189         IN RTMP_ADAPTER *pAd,
6190         IN RALINK_TIMER_STRUCT *pTimer);
6191
6192 BOOLEAN RT2870_TimerQ_Remove(
6193         IN RTMP_ADAPTER *pAd,
6194         IN RALINK_TIMER_STRUCT *pTimer);
6195
6196 void RT2870_TimerQ_Exit(
6197         IN RTMP_ADAPTER *pAd);
6198
6199 void RT2870_TimerQ_Init(
6200         IN RTMP_ADAPTER *pAd);
6201
6202 VOID RT2870_BssBeaconExit(
6203         IN RTMP_ADAPTER *pAd);
6204
6205 VOID RT2870_BssBeaconStop(
6206         IN RTMP_ADAPTER *pAd);
6207
6208 VOID RT2870_BssBeaconStart(
6209         IN RTMP_ADAPTER * pAd);
6210
6211 VOID RT2870_BssBeaconInit(
6212         IN RTMP_ADAPTER *pAd);
6213
6214 VOID RT2870_WatchDog(
6215         IN RTMP_ADAPTER *pAd);
6216
6217 NTSTATUS RTUSBWriteMACRegister(
6218         IN      PRTMP_ADAPTER   pAd,
6219         IN      USHORT                  Offset,
6220         IN      UINT32                  Value);
6221
6222 NTSTATUS RTUSBReadMACRegister(
6223         IN      PRTMP_ADAPTER   pAd,
6224         IN      USHORT                  Offset,
6225         OUT     PUINT32                 pValue);
6226
6227 NTSTATUS RTUSBSingleWrite(
6228         IN      RTMP_ADAPTER    *pAd,
6229         IN      USHORT                  Offset,
6230         IN      USHORT                  Value);
6231
6232 NTSTATUS RTUSBFirmwareRun(
6233         IN      PRTMP_ADAPTER   pAd);
6234
6235 NTSTATUS RTUSBFirmwareWrite(
6236         IN PRTMP_ADAPTER pAd,
6237         IN PUCHAR               pFwImage,
6238         IN ULONG                FwLen);
6239
6240 NTSTATUS        RTUSBFirmwareOpmode(
6241         IN      PRTMP_ADAPTER   pAd,
6242         OUT     PUINT32                 pValue);
6243
6244 NTSTATUS        RTUSBVenderReset(
6245         IN      PRTMP_ADAPTER   pAd);
6246
6247 VOID CMDHandler(
6248     IN PRTMP_ADAPTER pAd);
6249
6250
6251 NDIS_STATUS      CreateThreads(
6252         IN      struct net_device *net_dev );
6253
6254
6255 VOID MacTableInitialize(
6256         IN  PRTMP_ADAPTER   pAd);
6257
6258 VOID MlmeSetPsm(
6259         IN PRTMP_ADAPTER pAd,
6260         IN USHORT psm);
6261
6262 NDIS_STATUS RTMPWPAAddKeyProc(
6263         IN  PRTMP_ADAPTER   pAd,
6264         IN  PVOID           pBuf);
6265
6266 VOID AsicRxAntEvalAction(
6267         IN PRTMP_ADAPTER pAd);
6268
6269 NDIS_STATUS     RTMPCheckRxError(
6270         IN      PRTMP_ADAPTER   pAd,
6271         IN      PHEADER_802_11  pHeader,
6272         IN      PRXWI_STRUC     pRxWI,
6273         IN      PRT28XX_RXD_STRUC       pRxINFO);
6274
6275 INT MlmeThread(
6276         IN PVOID Context);
6277
6278 //
6279 // Function Prototype in rtusb_data.c
6280 //
6281 NDIS_STATUS     RTUSBFreeDescriptorRequest(
6282         IN      PRTMP_ADAPTER   pAd,
6283         IN      UCHAR                   BulkOutPipeId,
6284         IN      UINT32                  NumberRequired);
6285
6286
6287 BOOLEAN RTUSBNeedQueueBackForAgg(
6288         IN RTMP_ADAPTER *pAd,
6289         IN UCHAR                BulkOutPipeId);
6290
6291
6292 VOID RTMPWriteTxInfo(
6293         IN      PRTMP_ADAPTER   pAd,
6294         IN      PTXINFO_STRUC   pTxInfo,
6295         IN        USHORT                USBDMApktLen,
6296         IN        BOOLEAN               bWiv,
6297         IN        UCHAR                 QueueSel,
6298         IN        UCHAR                 NextValid,
6299         IN        UCHAR                 TxBurst);
6300
6301 //
6302 // Function Prototype in cmm_data_2870.c
6303 //
6304 USHORT RtmpUSB_WriteSubTxResource(
6305         IN      PRTMP_ADAPTER   pAd,
6306         IN      TX_BLK                  *pTxBlk,
6307         IN      BOOLEAN                 bIsLast,
6308         OUT     USHORT                  *FreeNumber);
6309
6310 USHORT RtmpUSB_WriteSingleTxResource(
6311         IN      PRTMP_ADAPTER   pAd,
6312         IN      TX_BLK                  *pTxBlk,
6313         IN      BOOLEAN                 bIsLast,
6314         OUT     USHORT                  *FreeNumber);
6315
6316 USHORT  RtmpUSB_WriteFragTxResource(
6317         IN      PRTMP_ADAPTER   pAd,
6318         IN      TX_BLK                  *pTxBlk,
6319         IN      UCHAR                   fragNum,
6320         OUT     USHORT                  *FreeNumber);
6321
6322 USHORT RtmpUSB_WriteMultiTxResource(
6323         IN      PRTMP_ADAPTER   pAd,
6324         IN      TX_BLK                  *pTxBlk,
6325         IN      UCHAR                   frameNum,
6326         OUT     USHORT                  *FreeNumber);
6327
6328 VOID RtmpUSB_FinalWriteTxResource(
6329         IN      PRTMP_ADAPTER   pAd,
6330         IN      TX_BLK                  *pTxBlk,
6331         IN      USHORT                  totalMPDUSize,
6332 #ifdef RT2860
6333         IN      USHORT                  FirstTxIdx);
6334 #endif
6335         IN      USHORT                  TxIdx);
6336
6337 VOID RtmpUSBDataLastTxIdx(
6338         IN      PRTMP_ADAPTER   pAd,
6339         IN      UCHAR                   QueIdx,
6340         IN      USHORT                  TxIdx);
6341
6342 VOID RtmpUSBDataKickOut(
6343         IN      PRTMP_ADAPTER   pAd,
6344         IN      TX_BLK                  *pTxBlk,
6345         IN      UCHAR                   QueIdx);
6346
6347
6348 int RtmpUSBMgmtKickOut(
6349         IN RTMP_ADAPTER         *pAd,
6350         IN UCHAR                        QueIdx,
6351         IN PNDIS_PACKET         pPacket,
6352         IN PUCHAR                       pSrcBufVA,
6353         IN UINT                         SrcBufLen);
6354
6355 VOID RtmpUSBNullFrameKickOut(
6356         IN RTMP_ADAPTER *pAd,
6357         IN UCHAR                QueIdx,
6358         IN UCHAR                *pNullFrame,
6359         IN UINT32               frameLen);
6360
6361 VOID RT28xxUsbStaAsicForceWakeup(
6362         IN PRTMP_ADAPTER pAd,
6363         IN BOOLEAN       bFromTx);
6364
6365 VOID RT28xxUsbStaAsicSleepThenAutoWakeup(
6366         IN PRTMP_ADAPTER pAd,
6367         IN USHORT TbttNumToNextWakeUp);
6368
6369 VOID RT28xxUsbMlmeRadioOn(
6370         IN PRTMP_ADAPTER pAd);
6371
6372 VOID RT28xxUsbMlmeRadioOFF(
6373         IN PRTMP_ADAPTER pAd);
6374 #endif // RT2870 //
6375
6376 INT RTMPShowCfgValue(
6377         IN      PRTMP_ADAPTER   pAd,
6378         IN      PUCHAR                  pName,
6379         IN      PUCHAR                  pBuf);
6380
6381 PCHAR   RTMPGetRalinkAuthModeStr(
6382     IN  NDIS_802_11_AUTHENTICATION_MODE authMode);
6383
6384 PCHAR   RTMPGetRalinkEncryModeStr(
6385     IN  USHORT encryMode);
6386
6387 VOID AsicStaBbpTuning(
6388         IN PRTMP_ADAPTER pAd);
6389
6390 #ifdef RT2860
6391 VOID AsicResetFromDMABusy(
6392         IN PRTMP_ADAPTER pAd);
6393
6394 VOID AsicResetBBP(
6395         IN PRTMP_ADAPTER pAd);
6396
6397 VOID AsicResetMAC(
6398         IN PRTMP_ADAPTER pAd);
6399
6400 VOID AsicResetPBF(
6401         IN PRTMP_ADAPTER pAd);
6402 #endif
6403 #ifdef RT2870
6404 BOOLEAN StaAddMacTableEntry(
6405         IN  PRTMP_ADAPTER               pAd,
6406         IN  PMAC_TABLE_ENTRY    pEntry,
6407         IN  UCHAR                               MaxSupportedRateIn500Kbps,
6408         IN  HT_CAPABILITY_IE    *pHtCapability,
6409         IN  UCHAR                               HtCapabilityLen,
6410         IN  USHORT                      CapabilityInfo);
6411 #endif
6412
6413 void RTMP_IndicateMediaState(
6414         IN      PRTMP_ADAPTER   pAd);
6415
6416 VOID ReSyncBeaconTime(
6417         IN  PRTMP_ADAPTER   pAd);
6418
6419 VOID RTMPSetAGCInitValue(
6420         IN PRTMP_ADAPTER        pAd,
6421         IN UCHAR                        BandWidth);
6422
6423 int rt28xx_close(IN PNET_DEV dev);
6424 int rt28xx_open(IN PNET_DEV dev);
6425
6426 __inline INT VIRTUAL_IF_UP(PRTMP_ADAPTER pAd)
6427 {
6428         if (VIRTUAL_IF_NUM(pAd) == 0)
6429         {
6430                 if (rt28xx_open(pAd->net_dev) != 0)
6431                         return -1;
6432         }
6433         else
6434         {
6435         }
6436         VIRTUAL_IF_INC(pAd);
6437         return 0;
6438 }
6439
6440 __inline VOID VIRTUAL_IF_DOWN(PRTMP_ADAPTER pAd)
6441 {
6442         VIRTUAL_IF_DEC(pAd);
6443         if (VIRTUAL_IF_NUM(pAd) == 0)
6444                 rt28xx_close(pAd->net_dev);
6445         return;
6446 }
6447
6448
6449 #endif  // __RTMP_H__
6450