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