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