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