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