]> Pileus Git - ~andy/linux/blob - drivers/staging/rt3070/rtmp.h
face5c308d30187b582b1e1ca291b327d3d49954
[~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
1938 #ifdef SINGLE_SKU
1939         UINT16                                  DefineMaxTxPwr;
1940 #endif // SINGLE_SKU //
1941
1942
1943 } COMMON_CONFIG, *PCOMMON_CONFIG;
1944
1945
1946 #ifdef CONFIG_STA_SUPPORT
1947 /* Modified by Wu Xi-Kun 4/21/2006 */
1948 // STA configuration and status
1949 typedef struct _STA_ADMIN_CONFIG {
1950         // GROUP 1 -
1951         //   User configuration loaded from Registry, E2PROM or OID_xxx. These settings describe
1952         //   the user intended configuration, but not necessary fully equal to the final
1953         //   settings in ACTIVE BSS after negotiation/compromize with the BSS holder (either
1954         //   AP or IBSS holder).
1955         //   Once initialized, user configuration can only be changed via OID_xxx
1956         UCHAR       BssType;              // BSS_INFRA or BSS_ADHOC
1957         USHORT      AtimWin;          // used when starting a new IBSS
1958
1959         // GROUP 2 -
1960         //   User configuration loaded from Registry, E2PROM or OID_xxx. These settings describe
1961         //   the user intended configuration, and should be always applied to the final
1962         //   settings in ACTIVE BSS without compromising with the BSS holder.
1963         //   Once initialized, user configuration can only be changed via OID_xxx
1964         UCHAR       RssiTrigger;
1965         UCHAR       RssiTriggerMode;      // RSSI_TRIGGERED_UPON_BELOW_THRESHOLD or RSSI_TRIGGERED_UPON_EXCCEED_THRESHOLD
1966         USHORT      DefaultListenCount;   // default listen count;
1967         ULONG       WindowsPowerMode;           // Power mode for AC power
1968         ULONG       WindowsBatteryPowerMode;    // Power mode for battery if exists
1969         BOOLEAN     bWindowsACCAMEnable;        // Enable CAM power mode when AC on
1970         BOOLEAN     bAutoReconnect;         // Set to TRUE when setting OID_802_11_SSID with no matching BSSID
1971         ULONG       WindowsPowerProfile;    // Windows power profile, for NDIS5.1 PnP
1972
1973         // MIB:ieee802dot11.dot11smt(1).dot11StationConfigTable(1)
1974         USHORT      Psm;                  // power management mode   (PWR_ACTIVE|PWR_SAVE)
1975         USHORT      DisassocReason;
1976         UCHAR       DisassocSta[MAC_ADDR_LEN];
1977         USHORT      DeauthReason;
1978         UCHAR       DeauthSta[MAC_ADDR_LEN];
1979         USHORT      AuthFailReason;
1980         UCHAR       AuthFailSta[MAC_ADDR_LEN];
1981
1982         NDIS_802_11_PRIVACY_FILTER          PrivacyFilter;  // PrivacyFilter enum for 802.1X
1983         NDIS_802_11_AUTHENTICATION_MODE     AuthMode;       // This should match to whatever microsoft defined
1984         NDIS_802_11_WEP_STATUS              WepStatus;
1985         NDIS_802_11_WEP_STATUS                          OrigWepStatus;  // Original wep status set from OID
1986
1987         // Add to support different cipher suite for WPA2/WPA mode
1988         NDIS_802_11_ENCRYPTION_STATUS           GroupCipher;            // Multicast cipher suite
1989         NDIS_802_11_ENCRYPTION_STATUS           PairCipher;                     // Unicast cipher suite
1990         BOOLEAN                                                         bMixCipher;                     // Indicate current Pair & Group use different cipher suites
1991         USHORT                                                          RsnCapability;
1992
1993         NDIS_802_11_WEP_STATUS              GroupKeyWepStatus;
1994
1995         UCHAR           PMK[32];                // WPA PSK mode PMK
1996         UCHAR       PTK[64];                // WPA PSK mode PTK
1997         UCHAR           GTK[32];                                // GTK from authenticator
1998         BSSID_INFO      SavedPMK[PMKID_NO];
1999         UINT            SavedPMKNum;                    // Saved PMKID number
2000
2001         UCHAR           DefaultKeyId;
2002
2003
2004         // WPA 802.1x port control, WPA_802_1X_PORT_SECURED, WPA_802_1X_PORT_NOT_SECURED
2005         UCHAR       PortSecured;
2006
2007         // For WPA countermeasures
2008         ULONG       LastMicErrorTime;   // record last MIC error time
2009         ULONG       MicErrCnt;          // Should be 0, 1, 2, then reset to zero (after disassoiciation).
2010         BOOLEAN     bBlockAssoc;        // Block associate attempt for 60 seconds after counter measure occurred.
2011         // For WPA-PSK supplicant state
2012         WPA_STATE   WpaState;           // Default is SS_NOTUSE and handled by microsoft 802.1x
2013         UCHAR       ReplayCounter[8];
2014         UCHAR       ANonce[32];         // ANonce for WPA-PSK from aurhenticator
2015         UCHAR       SNonce[32];         // SNonce for WPA-PSK
2016
2017         UCHAR       LastSNR0;             // last received BEACON's SNR
2018         UCHAR       LastSNR1;            // last received BEACON's SNR for 2nd  antenna
2019         RSSI_SAMPLE RssiSample;
2020         ULONG       NumOfAvgRssiSample;
2021
2022         ULONG       LastBeaconRxTime;     // OS's timestamp of the last BEACON RX time
2023         ULONG       Last11bBeaconRxTime;  // OS's timestamp of the last 11B BEACON RX time
2024         ULONG           Last11gBeaconRxTime;    // OS's timestamp of the last 11G BEACON RX time
2025         ULONG           Last20NBeaconRxTime;    // OS's timestamp of the last 20MHz N BEACON RX time
2026
2027         ULONG       LastScanTime;       // Record last scan time for issue BSSID_SCAN_LIST
2028         ULONG       ScanCnt;            // Scan counts since most recent SSID, BSSID, SCAN OID request
2029         BOOLEAN     bSwRadio;           // Software controlled Radio On/Off, TRUE: On
2030         BOOLEAN     bHwRadio;           // Hardware controlled Radio On/Off, TRUE: On
2031         BOOLEAN     bRadio;             // Radio state, And of Sw & Hw radio state
2032         BOOLEAN     bHardwareRadio;     // Hardware controlled Radio enabled
2033         BOOLEAN     bShowHiddenSSID;    // Show all known SSID in SSID list get operation
2034
2035     //BOOLEAN           AdhocBOnlyJoined;       // Indicate Adhoc B Join.
2036     //BOOLEAN           AdhocBGJoined;          // Indicate Adhoc B/G Join.
2037     //BOOLEAN           Adhoc20NJoined;         // Indicate Adhoc 20MHz N Join.
2038
2039         // New for WPA, windows want us to to keep association information and
2040         // Fixed IEs from last association response
2041         NDIS_802_11_ASSOCIATION_INFORMATION     AssocInfo;
2042         USHORT       ReqVarIELen;                // Length of next VIE include EID & Length
2043         UCHAR       ReqVarIEs[MAX_VIE_LEN];             // The content saved here should be little-endian format.
2044         USHORT       ResVarIELen;                // Length of next VIE include EID & Length
2045         UCHAR       ResVarIEs[MAX_VIE_LEN];
2046
2047         UCHAR       RSNIE_Len;
2048         UCHAR       RSN_IE[MAX_LEN_OF_RSNIE];   // The content saved here should be little-endian format.
2049
2050         // New variables used for CCX 1.0
2051         BOOLEAN             bCkipOn;
2052         BOOLEAN             bCkipCmicOn;
2053         UCHAR               CkipFlag;
2054         UCHAR               GIV[3];  //for CCX iv
2055         UCHAR               RxSEQ[4];
2056         UCHAR               TxSEQ[4];
2057         UCHAR               CKIPMIC[4];
2058         UCHAR               LeapAuthMode;
2059         LEAP_AUTH_INFO      LeapAuthInfo;
2060         UCHAR               HashPwd[16];
2061         UCHAR               NetworkChallenge[8];
2062         UCHAR               NetworkChallengeResponse[24];
2063         UCHAR               PeerChallenge[8];
2064
2065         UCHAR               PeerChallengeResponse[24];
2066         UCHAR               SessionKey[16]; //Network session keys (NSK)
2067         RALINK_TIMER_STRUCT LeapAuthTimer;
2068         ROGUEAP_TABLE       RogueApTab;   //Cisco CCX1 Rogue AP Detection
2069
2070         // New control flags for CCX
2071         CCX_CONTROL         CCXControl;                 // Master administration state
2072         BOOLEAN             CCXEnable;                  // Actual CCX state
2073         UCHAR               CCXScanChannel;             // Selected channel for CCX beacon request
2074         USHORT              CCXScanTime;                // Time out to wait for beacon and probe response
2075         UCHAR               CCXReqType;                 // Current processing CCX request type
2076         BSS_TABLE           CCXBssTab;                  // BSS Table
2077         UCHAR               FrameReportBuf[2048];       // Buffer for creating frame report
2078         USHORT              FrameReportLen;             // Current Frame report length
2079         ULONG               CLBusyBytes;                // Save the total bytes received durning channel load scan time
2080         USHORT              RPIDensity[8];              // Array for RPI density collection
2081         // Start address of each BSS table within FrameReportBuf
2082         // It's important to update the RxPower of the corresponding Bss
2083         USHORT              BssReportOffset[MAX_LEN_OF_BSS_TABLE];
2084         USHORT              BeaconToken;                // Token for beacon report
2085         ULONG               LastBssIndex;               // Most current reported Bss index
2086         RM_REQUEST_ACTION   MeasurementRequest[16];     // Saved measurement request
2087         UCHAR               RMReqCnt;                   // Number of measurement request saved.
2088         UCHAR               CurrentRMReqIdx;            // Number of measurement request saved.
2089         BOOLEAN             ParallelReq;                // Parallel measurement, only one request performed,
2090                                                                                                         // It must be the same channel with maximum duration
2091         USHORT              ParallelDuration;           // Maximum duration for parallel measurement
2092         UCHAR               ParallelChannel;            // Only one channel with parallel measurement
2093         USHORT              IAPPToken;                  // IAPP dialog token
2094         UCHAR               CCXQosECWMin;               // Cisco QOS ECWMin for AC 0
2095         UCHAR               CCXQosECWMax;               // Cisco QOS ECWMax for AC 0
2096         // Hack for channel load and noise histogram parameters
2097         UCHAR               NHFactor;                   // Parameter for Noise histogram
2098         UCHAR               CLFactor;                   // Parameter for channel load
2099
2100         UCHAR               KRK[16];        //Key Refresh Key.
2101         UCHAR               BTK[32];        //Base Transient Key
2102         BOOLEAN             CCKMLinkUpFlag;
2103         ULONG               CCKMRN;    //(Re)Association request number.
2104         LARGE_INTEGER       CCKMBeaconAtJoinTimeStamp;  //TSF timer for Re-assocaite to the new AP
2105         UCHAR               AironetCellPowerLimit;      //in dBm
2106         UCHAR               AironetIPAddress[4];        //eg. 192.168.1.1
2107         BOOLEAN             CCXAdjacentAPReportFlag;    //flag for determining report Assoc Lost time
2108         CHAR                CCXAdjacentAPSsid[MAX_LEN_OF_SSID]; //Adjacent AP's SSID report
2109         UCHAR               CCXAdjacentAPSsidLen;               // the actual ssid length in used
2110         UCHAR               CCXAdjacentAPBssid[MAC_ADDR_LEN];         //Adjacent AP's BSSID report
2111         USHORT              CCXAdjacentAPChannel;
2112         ULONG               CCXAdjacentAPLinkDownTime;  //for Spec S32.
2113
2114         RALINK_TIMER_STRUCT     StaQuickResponeForRateUpTimer;
2115         BOOLEAN                         StaQuickResponeForRateUpTimerRunning;
2116
2117         UCHAR                   DtimCount;      // 0.. DtimPeriod-1
2118         UCHAR                   DtimPeriod;     // default = 3
2119
2120         ////////////////////////////////////////////////////////////////////////////////////////
2121         // This is only for WHQL test.
2122         BOOLEAN                         WhqlTest;
2123         ////////////////////////////////////////////////////////////////////////////////////////
2124
2125     RALINK_TIMER_STRUCT WpaDisassocAndBlockAssocTimer;
2126     // Fast Roaming
2127         BOOLEAN                 bFastRoaming;       // 0:disable fast roaming, 1:enable fast roaming
2128         CHAR                    dBmToRoam;          // the condition to roam when receiving Rssi less than this value. It's negative value.
2129
2130 #ifdef WPA_SUPPLICANT_SUPPORT
2131     BOOLEAN             IEEE8021X;
2132     BOOLEAN             IEEE8021x_required_keys;
2133     CIPHER_KEY          DesireSharedKey[4];     // Record user desired WEP keys
2134     UCHAR               DesireSharedKeyId;
2135
2136     // 0: driver ignores wpa_supplicant
2137     // 1: wpa_supplicant initiates scanning and AP selection
2138     // 2: driver takes care of scanning, AP selection, and IEEE 802.11 association parameters
2139     UCHAR               WpaSupplicantUP;
2140         UCHAR                           WpaSupplicantScanCount;
2141 #endif // WPA_SUPPLICANT_SUPPORT //
2142
2143     CHAR                dev_name[16];
2144     USHORT              OriDevType;
2145
2146     BOOLEAN             bTGnWifiTest;
2147         BOOLEAN                     bScanReqIsFromWebUI;
2148
2149         HTTRANSMIT_SETTING                              HTPhyMode, MaxHTPhyMode, MinHTPhyMode;// For transmit phy setting in TXWI.
2150         DESIRED_TRANSMIT_SETTING        DesiredTransmitSetting;
2151         RT_HT_PHY_INFO                                  DesiredHtPhyInfo;
2152         BOOLEAN                                                 bAutoTxRateSwitch;
2153 } STA_ADMIN_CONFIG, *PSTA_ADMIN_CONFIG;
2154
2155 // This data structure keep the current active BSS/IBSS's configuration that this STA
2156 // had agreed upon joining the network. Which means these parameters are usually decided
2157 // by the BSS/IBSS creator instead of user configuration. Data in this data structurre
2158 // is valid only when either ADHOC_ON(pAd) or INFRA_ON(pAd) is TRUE.
2159 // Normally, after SCAN or failed roaming attempts, we need to recover back to
2160 // the current active settings.
2161 typedef struct _STA_ACTIVE_CONFIG {
2162         USHORT      Aid;
2163         USHORT      AtimWin;                // in kusec; IBSS parameter set element
2164         USHORT      CapabilityInfo;
2165         USHORT      CfpMaxDuration;
2166         USHORT      CfpPeriod;
2167
2168         // Copy supported rate from desired AP's beacon. We are trying to match
2169         // AP's supported and extended rate settings.
2170         UCHAR       SupRate[MAX_LEN_OF_SUPPORTED_RATES];
2171         UCHAR       ExtRate[MAX_LEN_OF_SUPPORTED_RATES];
2172         UCHAR       SupRateLen;
2173         UCHAR       ExtRateLen;
2174         // Copy supported ht from desired AP's beacon. We are trying to match
2175         RT_HT_PHY_INFO          SupportedPhyInfo;
2176         RT_HT_CAPABILITY        SupportedHtPhy;
2177 } STA_ACTIVE_CONFIG, *PSTA_ACTIVE_CONFIG;
2178 #endif // CONFIG_STA_SUPPORT //
2179
2180 #ifdef RT2870
2181 typedef struct   RT_ADD_PAIRWISE_KEY_ENTRY {
2182         NDIS_802_11_MAC_ADDRESS         MacAddr;
2183         USHORT                          MacTabMatchWCID;        // ASIC
2184         CIPHER_KEY      CipherKey;
2185 } RT_ADD_PAIRWISE_KEY_ENTRY,*PRT_ADD_PAIRWISE_KEY_ENTRY;
2186 #endif // RT2870 //
2187
2188 // ----------- start of AP --------------------------
2189 // AUTH-RSP State Machine Aux data structure
2190 typedef struct _AP_MLME_AUX {
2191         UCHAR               Addr[MAC_ADDR_LEN];
2192         USHORT              Alg;
2193         CHAR                Challenge[CIPHER_TEXT_LEN];
2194 } AP_MLME_AUX, *PAP_MLME_AUX;
2195
2196 // structure to define WPA Group Key Rekey Interval
2197 typedef struct PACKED _RT_802_11_WPA_REKEY {
2198         ULONG ReKeyMethod;          // mechanism for rekeying: 0:disable, 1: time-based, 2: packet-based
2199         ULONG ReKeyInterval;        // time-based: seconds, packet-based: kilo-packets
2200 } RT_WPA_REKEY,*PRT_WPA_REKEY, RT_802_11_WPA_REKEY, *PRT_802_11_WPA_REKEY;
2201
2202 typedef struct _MAC_TABLE_ENTRY {
2203         //Choose 1 from ValidAsWDS and ValidAsCLI  to validize.
2204         BOOLEAN         ValidAsCLI;             // Sta mode, set this TRUE after Linkup,too.
2205         BOOLEAN         ValidAsWDS;     // This is WDS Entry. only for AP mode.
2206         BOOLEAN         ValidAsApCli;   //This is a AP-Client entry, only for AP mode which enable AP-Client functions.
2207         BOOLEAN         ValidAsMesh;
2208         BOOLEAN         ValidAsDls;     // This is DLS Entry. only for STA mode.
2209         BOOLEAN         isCached;
2210         BOOLEAN         bIAmBadAtheros;
2211
2212         UCHAR           EnqueueEapolStartTimerRunning;  // Enqueue EAPoL-Start for triggering EAP SM
2213         //jan for wpa
2214         // record which entry revoke MIC Failure , if it leaves the BSS itself, AP won't update aMICFailTime MIB
2215         UCHAR           CMTimerRunning;
2216         UCHAR           apidx;                  // MBSS number
2217         UCHAR           RSNIE_Len;
2218         UCHAR           RSN_IE[MAX_LEN_OF_RSNIE];
2219         UCHAR           ANonce[LEN_KEY_DESC_NONCE];
2220         UCHAR           R_Counter[LEN_KEY_DESC_REPLAY];
2221         UCHAR           PTK[64];
2222         UCHAR           ReTryCounter;
2223         RALINK_TIMER_STRUCT                 RetryTimer;
2224         RALINK_TIMER_STRUCT                                     EnqueueStartForPSKTimer;        // A timer which enqueue EAPoL-Start for triggering PSK SM
2225         NDIS_802_11_AUTHENTICATION_MODE     AuthMode;   // This should match to whatever microsoft defined
2226         NDIS_802_11_WEP_STATUS              WepStatus;
2227         AP_WPA_STATE    WpaState;
2228         GTK_STATE       GTKState;
2229         USHORT          PortSecured;
2230         NDIS_802_11_PRIVACY_FILTER  PrivacyFilter;      // PrivacyFilter enum for 802.1X
2231         CIPHER_KEY      PairwiseKey;
2232         PVOID           pAd;
2233     INT                         PMKID_CacheIdx;
2234     UCHAR                       PMKID[LEN_PMKID];
2235
2236
2237         UCHAR           Addr[MAC_ADDR_LEN];
2238         UCHAR           PsMode;
2239         SST             Sst;
2240         AUTH_STATE      AuthState; // for SHARED KEY authentication state machine used only
2241         BOOLEAN                 IsReassocSta;   // Indicate whether this is a reassociation procedure
2242         USHORT          Aid;
2243         USHORT          CapabilityInfo;
2244         UCHAR           LastRssi;
2245         ULONG           NoDataIdleCount;
2246         UINT16                  StationKeepAliveCount; // unit: second
2247         ULONG           PsQIdleCount;
2248         QUEUE_HEADER    PsQueue;
2249
2250         UINT32                  StaConnectTime;         // the live time of this station since associated with AP
2251
2252
2253 #ifdef DOT11_N_SUPPORT
2254         BOOLEAN                 bSendBAR;
2255         USHORT                  NoBADataCountDown;
2256
2257         UINT32                  CachedBuf[16];          // UINT (4 bytes) for alignment
2258         UINT                    TxBFCount; // 3*3
2259 #endif // DOT11_N_SUPPORT //
2260         UINT                    FIFOCount;
2261         UINT                    DebugFIFOCount;
2262         UINT                    DebugTxCount;
2263     BOOLEAN                     bDlsInit;
2264
2265
2266 //====================================================
2267 //WDS entry needs these
2268 // rt2860 add this. if ValidAsWDS==TRUE, MatchWDSTabIdx is the index in WdsTab.MacTab
2269         UINT                    MatchWDSTabIdx;
2270         UCHAR           MaxSupportedRate;
2271         UCHAR           CurrTxRate;
2272         UCHAR           CurrTxRateIndex;
2273         // to record the each TX rate's quality. 0 is best, the bigger the worse.
2274         USHORT          TxQuality[MAX_STEP_OF_TX_RATE_SWITCH];
2275 //      USHORT          OneSecTxOkCount;
2276         UINT32                  OneSecTxNoRetryOkCount;
2277         UINT32          OneSecTxRetryOkCount;
2278         UINT32          OneSecTxFailCount;
2279         UINT32                  ContinueTxFailCnt;
2280         UINT32          CurrTxRateStableTime; // # of second in current TX rate
2281         UCHAR           TxRateUpPenalty;      // extra # of second penalty due to last unstable condition
2282 //====================================================
2283
2284         BOOLEAN         fNoisyEnvironment;
2285         BOOLEAN                 fLastSecAccordingRSSI;
2286         UCHAR           LastSecTxRateChangeAction; // 0: no change, 1:rate UP, 2:rate down
2287         CHAR                    LastTimeTxRateChangeAction; //Keep last time value of LastSecTxRateChangeAction
2288         ULONG                   LastTxOkCount;
2289         UCHAR           PER[MAX_STEP_OF_TX_RATE_SWITCH];
2290
2291         // a bitmap of BOOLEAN flags. each bit represent an operation status of a particular
2292         // BOOLEAN control, either ON or OFF. These flags should always be accessed via
2293         // CLIENT_STATUS_TEST_FLAG(), CLIENT_STATUS_SET_FLAG(), CLIENT_STATUS_CLEAR_FLAG() macros.
2294         // see fOP_STATUS_xxx in RTMP_DEF.C for detail bit definition. fCLIENT_STATUS_AMSDU_INUSED
2295         ULONG           ClientStatusFlags;
2296
2297         // TODO: Shall we move that to DOT11_N_SUPPORT???
2298         HTTRANSMIT_SETTING      HTPhyMode, MaxHTPhyMode, MinHTPhyMode;// For transmit phy setting in TXWI.
2299
2300 #ifdef DOT11_N_SUPPORT
2301         // HT EWC MIMO-N used parameters
2302         USHORT          RXBAbitmap;     // fill to on-chip  RXWI_BA_BITMASK in 8.1.3RX attribute entry format
2303         USHORT          TXBAbitmap;     // This bitmap as originator, only keep in software used to mark AMPDU bit in TXWI
2304         USHORT          TXAutoBAbitmap;
2305         USHORT          BADeclineBitmap;
2306         USHORT          BARecWcidArray[NUM_OF_TID];     // The mapping wcid of recipient session. if RXBAbitmap bit is masked
2307         USHORT          BAOriWcidArray[NUM_OF_TID]; // The mapping wcid of originator session. if TXBAbitmap bit is masked
2308         USHORT          BAOriSequence[NUM_OF_TID]; // The mapping wcid of originator session. if TXBAbitmap bit is masked
2309
2310         // 802.11n features.
2311         UCHAR           MpduDensity;
2312         UCHAR           MaxRAmpduFactor;
2313         UCHAR           AMsduSize;
2314         UCHAR           MmpsMode;       // MIMO power save more.
2315
2316         HT_CAPABILITY_IE                HTCapability;
2317
2318 #ifdef DOT11N_DRAFT3
2319         UCHAR           BSS2040CoexistenceMgmtSupport;
2320 #endif // DOT11N_DRAFT3 //
2321 #endif // DOT11_N_SUPPORT //
2322
2323         BOOLEAN         bAutoTxRateSwitch;
2324
2325         UCHAR       RateLen;
2326         struct _MAC_TABLE_ENTRY *pNext;
2327     USHORT      TxSeq[NUM_OF_TID];
2328         USHORT          NonQosDataSeq;
2329
2330         RSSI_SAMPLE     RssiSample;
2331
2332         UINT32                  TXMCSExpected[16];
2333         UINT32                  TXMCSSuccessful[16];
2334         UINT32                  TXMCSFailed[16];
2335         UINT32                  TXMCSAutoFallBack[16][16];
2336
2337 #ifdef CONFIG_STA_SUPPORT
2338         ULONG                   LastBeaconRxTime;
2339 #endif // CONFIG_STA_SUPPORT //
2340 } MAC_TABLE_ENTRY, *PMAC_TABLE_ENTRY;
2341
2342 typedef struct _MAC_TABLE {
2343         USHORT                  Size;
2344         MAC_TABLE_ENTRY *Hash[HASH_TABLE_SIZE];
2345         MAC_TABLE_ENTRY Content[MAX_LEN_OF_MAC_TABLE];
2346         QUEUE_HEADER    McastPsQueue;
2347         ULONG           PsQIdleCount;
2348         BOOLEAN         fAnyStationInPsm;
2349         BOOLEAN         fAnyStationBadAtheros;  // Check if any Station is atheros 802.11n Chip.  We need to use RTS/CTS with Atheros 802,.11n chip.
2350         BOOLEAN                 fAnyTxOPForceDisable;   // Check if it is necessary to disable BE TxOP
2351         BOOLEAN                 fAllStationAsRalink;    // Check if all stations are ralink-chipset
2352 #ifdef DOT11_N_SUPPORT
2353         BOOLEAN         fAnyStationIsLegacy;    // Check if I use legacy rate to transmit to my BSS Station/
2354         BOOLEAN         fAnyStationNonGF;               // Check if any Station can't support GF.
2355         BOOLEAN         fAnyStation20Only;              // Check if any Station can't support GF.
2356         BOOLEAN                 fAnyStationMIMOPSDynamic; // Check if any Station is MIMO Dynamic
2357         BOOLEAN         fAnyBASession;   // Check if there is BA session.  Force turn on RTS/CTS
2358 #endif // DOT11_N_SUPPORT //
2359 } MAC_TABLE, *PMAC_TABLE;
2360
2361 #ifdef DOT11_N_SUPPORT
2362 #define IS_HT_STA(_pMacEntry)   \
2363         (_pMacEntry->MaxHTPhyMode.field.MODE >= MODE_HTMIX)
2364
2365 #define IS_HT_RATE(_pMacEntry)  \
2366         (_pMacEntry->HTPhyMode.field.MODE >= MODE_HTMIX)
2367
2368 #define PEER_IS_HT_RATE(_pMacEntry)     \
2369         (_pMacEntry->HTPhyMode.field.MODE >= MODE_HTMIX)
2370 #endif // DOT11_N_SUPPORT //
2371
2372 typedef struct _WDS_ENTRY {
2373         BOOLEAN         Valid;
2374         UCHAR           Addr[MAC_ADDR_LEN];
2375         ULONG           NoDataIdleCount;
2376         struct _WDS_ENTRY *pNext;
2377 } WDS_ENTRY, *PWDS_ENTRY;
2378
2379 typedef struct  _WDS_TABLE_ENTRY {
2380         USHORT                  Size;
2381         UCHAR           WdsAddr[MAC_ADDR_LEN];
2382         WDS_ENTRY       *Hash[HASH_TABLE_SIZE];
2383         WDS_ENTRY       Content[MAX_LEN_OF_MAC_TABLE];
2384         UCHAR           MaxSupportedRate;
2385         UCHAR           CurrTxRate;
2386         USHORT          TxQuality[MAX_LEN_OF_SUPPORTED_RATES];
2387         USHORT          OneSecTxOkCount;
2388         USHORT          OneSecTxRetryOkCount;
2389         USHORT          OneSecTxFailCount;
2390         ULONG           CurrTxRateStableTime; // # of second in current TX rate
2391         UCHAR           TxRateUpPenalty;      // extra # of second penalty due to last unstable condition
2392 } WDS_TABLE_ENTRY, *PWDS_TABLE_ENTRY;
2393
2394 typedef struct _RT_802_11_WDS_ENTRY {
2395         PNET_DEV                        dev;
2396         UCHAR                           Valid;
2397         UCHAR                           PhyMode;
2398         UCHAR                           PeerWdsAddr[MAC_ADDR_LEN];
2399         UCHAR                           MacTabMatchWCID;        // ASIC
2400         NDIS_802_11_WEP_STATUS  WepStatus;
2401         UCHAR                                   KeyIdx;
2402         CIPHER_KEY              WdsKey;
2403         HTTRANSMIT_SETTING                              HTPhyMode, MaxHTPhyMode, MinHTPhyMode;
2404         RT_HT_PHY_INFO                                  DesiredHtPhyInfo;
2405         BOOLEAN                                                 bAutoTxRateSwitch;
2406         DESIRED_TRANSMIT_SETTING        DesiredTransmitSetting; // Desired transmit setting.
2407 } RT_802_11_WDS_ENTRY, *PRT_802_11_WDS_ENTRY;
2408
2409 typedef struct _WDS_TABLE {
2410         UCHAR               Mode;
2411         ULONG               Size;
2412         RT_802_11_WDS_ENTRY     WdsEntry[MAX_WDS_ENTRY];
2413 } WDS_TABLE, *PWDS_TABLE;
2414
2415 typedef struct _APCLI_STRUCT {
2416         PNET_DEV                                dev;
2417 #ifdef RTL865X_SOC
2418         unsigned int            mylinkid;
2419 #endif
2420         BOOLEAN                 Enable; // Set it as 1 if the apcli interface was configured to "1"  or by iwpriv cmd "ApCliEnable"
2421         BOOLEAN                 Valid;  // Set it as 1 if the apcli interface associated success to remote AP.
2422         UCHAR                                   MacTabWCID;     //WCID value, which point to the entry of ASIC Mac table.
2423         UCHAR                   SsidLen;
2424         CHAR                    Ssid[MAX_LEN_OF_SSID];
2425
2426         UCHAR                   CfgSsidLen;
2427         CHAR                    CfgSsid[MAX_LEN_OF_SSID];
2428         UCHAR                   CfgApCliBssid[ETH_LENGTH_OF_ADDRESS];
2429         UCHAR                   CurrentAddress[ETH_LENGTH_OF_ADDRESS];
2430
2431         ULONG                   ApCliRcvBeaconTime;
2432
2433         ULONG                   CtrlCurrState;
2434         ULONG                   SyncCurrState;
2435         ULONG                   AuthCurrState;
2436         ULONG                   AssocCurrState;
2437         ULONG                                   WpaPskCurrState;
2438
2439         USHORT                  AuthReqCnt;
2440         USHORT                  AssocReqCnt;
2441
2442         ULONG                   ClientStatusFlags;
2443         UCHAR                   MpduDensity;
2444
2445         NDIS_802_11_AUTHENTICATION_MODE     AuthMode;   // This should match to whatever microsoft defined
2446         NDIS_802_11_WEP_STATUS              WepStatus;
2447
2448         // Add to support different cipher suite for WPA2/WPA mode
2449         NDIS_802_11_ENCRYPTION_STATUS           GroupCipher;            // Multicast cipher suite
2450         NDIS_802_11_ENCRYPTION_STATUS           PairCipher;                     // Unicast cipher suite
2451         BOOLEAN                                                         bMixCipher;                     // Indicate current Pair & Group use different cipher suites
2452         USHORT                                                          RsnCapability;
2453
2454         UCHAR           PSK[100];                               // reserve PSK key material
2455         UCHAR       PSKLen;
2456         UCHAR       PMK[32];                // WPA PSK mode PMK
2457         //UCHAR       PTK[64];                // WPA PSK mode PTK
2458         UCHAR           GTK[32];                                // GTK from authenticator
2459
2460         //CIPHER_KEY            PairwiseKey;
2461         CIPHER_KEY      SharedKey[SHARE_KEY_NUM];
2462         UCHAR           DefaultKeyId;
2463
2464         // WPA 802.1x port control, WPA_802_1X_PORT_SECURED, WPA_802_1X_PORT_NOT_SECURED
2465         //UCHAR       PortSecured;
2466
2467         // store RSN_IE built by driver
2468         UCHAR           RSN_IE[MAX_LEN_OF_RSNIE];  // The content saved here should be convert to little-endian format.
2469         UCHAR           RSNIE_Len;
2470
2471         // For WPA countermeasures
2472         ULONG       LastMicErrorTime;   // record last MIC error time
2473         //ULONG       MicErrCnt;          // Should be 0, 1, 2, then reset to zero (after disassoiciation).
2474         BOOLEAN                 bBlockAssoc; // Block associate attempt for 60 seconds after counter measure occurred.
2475
2476         // For WPA-PSK supplicant state
2477         //WPA_STATE     WpaState;           // Default is SS_NOTUSE
2478         //UCHAR         ReplayCounter[8];
2479         //UCHAR         ANonce[32];         // ANonce for WPA-PSK from authenticator
2480         UCHAR           SNonce[32];         // SNonce for WPA-PSK
2481         UCHAR                   GNonce[32];                     // GNonce for WPA-PSK from authenticator
2482
2483         HTTRANSMIT_SETTING                              HTPhyMode, MaxHTPhyMode, MinHTPhyMode;
2484         RT_HT_PHY_INFO                                  DesiredHtPhyInfo;
2485         BOOLEAN                                                 bAutoTxRateSwitch;
2486         DESIRED_TRANSMIT_SETTING        DesiredTransmitSetting; // Desired transmit setting.
2487 } APCLI_STRUCT, *PAPCLI_STRUCT;
2488
2489 // ----------- end of AP ----------------------------
2490
2491 struct wificonf
2492 {
2493         BOOLEAN bShortGI;
2494         BOOLEAN bGreenField;
2495 };
2496
2497
2498
2499
2500 typedef struct _INF_PCI_CONFIG
2501 {
2502         PUCHAR                  CSRBaseAddress;     // PCI MMIO Base Address, all access will use
2503 }INF_PCI_CONFIG;
2504
2505 typedef struct _INF_USB_CONFIG
2506 {
2507         UINT                BulkInEpAddr;               // bulk-in endpoint address
2508         UINT                BulkOutEpAddr[6];   // bulk-out endpoint address
2509
2510 }INF_USB_CONFIG;
2511
2512 #ifdef IKANOS_VX_1X0
2513         typedef void (*IkanosWlanTxCbFuncP)(void *, void *);
2514
2515         struct IKANOS_TX_INFO
2516         {
2517                 struct net_device *netdev;
2518                 IkanosWlanTxCbFuncP *fp;
2519         };
2520 #endif // IKANOS_VX_1X0 //
2521
2522 #ifdef DBG_DIAGNOSE
2523 #define DIAGNOSE_TIME   10   // 10 sec
2524 typedef struct _RtmpDiagStrcut_
2525 {       // Diagnosis Related element
2526         unsigned char           inited;
2527         unsigned char   qIdx;
2528         unsigned char   ArrayStartIdx;
2529         unsigned char           ArrayCurIdx;
2530         // Tx Related Count
2531         USHORT                  TxDataCnt[DIAGNOSE_TIME];
2532         USHORT                  TxFailCnt[DIAGNOSE_TIME];
2533 //      USHORT                  TxDescCnt[DIAGNOSE_TIME][16];           // TxDesc queue length in scale of 0~14, >=15
2534         USHORT                  TxDescCnt[DIAGNOSE_TIME][24]; // 3*3    // TxDesc queue length in scale of 0~14, >=15
2535 //      USHORT                  TxMcsCnt[DIAGNOSE_TIME][16];                    // TxDate MCS Count in range from 0 to 15, step in 1.
2536         USHORT                  TxMcsCnt[DIAGNOSE_TIME][24]; // 3*3
2537         USHORT                  TxSWQueCnt[DIAGNOSE_TIME][9];           // TxSwQueue length in scale of 0, 1, 2, 3, 4, 5, 6, 7, >=8
2538
2539         USHORT                  TxAggCnt[DIAGNOSE_TIME];
2540         USHORT                  TxNonAggCnt[DIAGNOSE_TIME];
2541 //      USHORT                  TxAMPDUCnt[DIAGNOSE_TIME][16];          // 10 sec, TxDMA APMDU Aggregation count in range from 0 to 15, in setp of 1.
2542         USHORT                  TxAMPDUCnt[DIAGNOSE_TIME][24]; // 3*3 // 10 sec, TxDMA APMDU Aggregation count in range from 0 to 15, in setp of 1.
2543         USHORT                  TxRalinkCnt[DIAGNOSE_TIME];                     // TxRalink Aggregation Count in 1 sec scale.
2544         USHORT                  TxAMSDUCnt[DIAGNOSE_TIME];                      // TxAMSUD Aggregation Count in 1 sec scale.
2545
2546         // Rx Related Count
2547         USHORT                  RxDataCnt[DIAGNOSE_TIME];                       // Rx Total Data count.
2548         USHORT                  RxCrcErrCnt[DIAGNOSE_TIME];
2549 //      USHORT                  RxMcsCnt[DIAGNOSE_TIME][16];            // Rx MCS Count in range from 0 to 15, step in 1.
2550         USHORT                  RxMcsCnt[DIAGNOSE_TIME][24]; // 3*3
2551 }RtmpDiagStruct;
2552 #endif // DBG_DIAGNOSE //
2553
2554
2555 //
2556 //  The miniport adapter structure
2557 //
2558 typedef struct _RTMP_ADAPTER
2559 {
2560         PVOID                                   OS_Cookie;      // save specific structure relative to OS
2561         PNET_DEV                                net_dev;
2562         ULONG                                   VirtualIfCnt;
2563
2564
2565
2566         NDIS_SPIN_LOCK          irq_lock;
2567         UCHAR                   irq_disabled;
2568
2569 #ifdef RT2870
2570 /*****************************************************************************************/
2571 /*      USB related parameters                                                           */
2572 /*****************************************************************************************/
2573         struct usb_config_descriptor            *config;
2574         UINT                                                            BulkInEpAddr;           // bulk-in endpoint address
2575         UINT                                                            BulkOutEpAddr[6];       // bulk-out endpoint address
2576
2577         UINT                                                            NumberOfPipes;
2578         USHORT                                                          BulkOutMaxPacketSize;
2579         USHORT                                                          BulkInMaxPacketSize;
2580
2581         //======Control Flags
2582         LONG                            PendingIoCount;
2583         ULONG                                           BulkFlags;
2584         BOOLEAN                     bUsbTxBulkAggre;    // Flags for bulk out data priority
2585
2586
2587         //======Timer Thread
2588         RT2870_TIMER_QUEUE              TimerQ;
2589         NDIS_SPIN_LOCK                  TimerQLock;
2590
2591
2592         //======Cmd Thread
2593         CmdQ                                    CmdQ;
2594         NDIS_SPIN_LOCK                  CmdQLock;                               // CmdQLock spinlock
2595
2596         BOOLEAN                                 TimerFunc_kill;
2597         BOOLEAN                                 mlme_kill;
2598
2599
2600         //======Semaphores (event)
2601         struct semaphore                        mlme_semaphore;                 /* to sleep thread on   */
2602         struct semaphore                        RTUSBCmd_semaphore;             /* to sleep thread on   */
2603         struct semaphore                        RTUSBTimer_semaphore;
2604 #ifdef INF_AMAZON_SE
2605         struct semaphore                        UsbVendorReq_semaphore;
2606         PVOID                                           UsbVendorReqBuf;
2607 #endif // INF_AMAZON_SE //
2608         struct completion                       TimerQComplete;
2609         struct completion                       mlmeComplete;
2610         struct completion                       CmdQComplete;
2611         wait_queue_head_t                       *wait;
2612 #endif // RT2870 //
2613
2614
2615 /*****************************************************************************************/
2616         /*      Both PCI/USB related parameters                                                  */
2617 /*****************************************************************************************/
2618
2619
2620 /*****************************************************************************************/
2621 /*      Tx related parameters                                                           */
2622 /*****************************************************************************************/
2623         BOOLEAN                 DeQueueRunning[NUM_OF_TX_RING];  // for ensuring RTUSBDeQueuePacket get call once
2624         NDIS_SPIN_LOCK          DeQueueLock[NUM_OF_TX_RING];
2625
2626 #ifdef RT2870
2627         // Data related context and AC specified, 4 AC supported
2628         NDIS_SPIN_LOCK                  BulkOutLock[6];                 // BulkOut spinlock for 4 ACs
2629         NDIS_SPIN_LOCK                  MLMEBulkOutLock;        // MLME BulkOut lock
2630
2631         HT_TX_CONTEXT                   TxContext[NUM_OF_TX_RING];
2632         NDIS_SPIN_LOCK                  TxContextQueueLock[NUM_OF_TX_RING];             // TxContextQueue spinlock
2633
2634         // 4 sets of Bulk Out index and pending flag
2635         UCHAR                                   NextBulkOutIndex[4];    // only used for 4 EDCA bulkout pipe
2636
2637         BOOLEAN                                 BulkOutPending[6];      // used for total 6 bulkout pipe
2638         UCHAR                                   bulkResetPipeid;
2639         BOOLEAN                                 MgmtBulkPending;
2640         ULONG                                   bulkResetReq[6];
2641 #endif // RT2870 //
2642
2643         // resource for software backlog queues
2644         QUEUE_HEADER            TxSwQueue[NUM_OF_TX_RING];  // 4 AC + 1 HCCA
2645         NDIS_SPIN_LOCK          TxSwQueueLock[NUM_OF_TX_RING];  // TxSwQueue spinlock
2646
2647         RTMP_DMABUF             MgmtDescRing;                   // Shared memory for MGMT descriptors
2648         RTMP_MGMT_RING          MgmtRing;
2649         NDIS_SPIN_LOCK          MgmtRingLock;                   // Prio Ring spinlock
2650
2651
2652 /*****************************************************************************************/
2653 /*      Rx related parameters                                                           */
2654 /*****************************************************************************************/
2655
2656
2657 #ifdef RT2870
2658         RX_CONTEXT                              RxContext[RX_RING_SIZE];  // 1 for redundant multiple IRP bulk in.
2659         NDIS_SPIN_LOCK                  BulkInLock;                             // BulkIn spinlock for 4 ACs
2660         UCHAR                                   PendingRx;                              // The Maxima pending Rx value should be        RX_RING_SIZE.
2661         UCHAR                                   NextRxBulkInIndex;              // Indicate the current RxContext Index which hold by Host controller.
2662         UCHAR                                   NextRxBulkInReadIndex;  // Indicate the current RxContext Index which driver can read & process it.
2663         ULONG                                   NextRxBulkInPosition;   // Want to contatenate 2 URB buffer while 1st is bulkin failed URB. This Position is 1st URB TransferLength.
2664         ULONG                                   TransferBufferLength;   // current length of the packet buffer
2665         ULONG                                   ReadPosition;                   // current read position in a packet buffer
2666 #endif // RT2870 //
2667
2668
2669 /*****************************************************************************************/
2670 /*      ASIC related parameters                                                          */
2671 /*****************************************************************************************/
2672         UINT32                  MACVersion;             // MAC version. Record rt2860C(0x28600100) or rt2860D (0x28600101)..
2673
2674         // ---------------------------
2675         // E2PROM
2676         // ---------------------------
2677         ULONG                   EepromVersion;          // byte 0: version, byte 1: revision, byte 2~3: unused
2678         UCHAR                   EEPROMAddressNum;       // 93c46=6  93c66=8
2679         USHORT                  EEPROMDefaultValue[NUM_EEPROM_BBP_PARMS];
2680         BOOLEAN                 EepromAccess;
2681         UCHAR                   EFuseTag;
2682         ULONG                   FirmwareVersion;        // byte 0: Minor version, byte 1: Major version, otherwise unused.
2683
2684         // ---------------------------
2685         // BBP Control
2686         // ---------------------------
2687         UCHAR                   BbpWriteLatch[140];     // record last BBP register value written via BBP_IO_WRITE/BBP_IO_WRITE_VY_REG_ID
2688         UCHAR                   BbpRssiToDbmDelta;
2689         BBP_R66_TUNING          BbpTuning;
2690
2691         // ----------------------------
2692         // RFIC control
2693         // ----------------------------
2694         UCHAR                   RfIcType;       // RFIC_xxx
2695         ULONG                   RfFreqOffset;   // Frequency offset for channel switching
2696         RTMP_RF_REGS            LatchRfRegs;    // latch th latest RF programming value since RF IC doesn't support READ
2697
2698         EEPROM_ANTENNA_STRUC    Antenna;                            // Since ANtenna definition is different for a & g. We need to save it for future reference.
2699         EEPROM_NIC_CONFIG2_STRUC    NicConfig2;
2700
2701         // This soft Rx Antenna Diversity mechanism is used only when user set
2702         // RX Antenna = DIVERSITY ON
2703         SOFT_RX_ANT_DIVERSITY   RxAnt;
2704
2705         UCHAR                   RFProgSeq;
2706         CHANNEL_TX_POWER        TxPower[MAX_NUM_OF_CHANNELS];       // Store Tx power value for all channels.
2707         CHANNEL_TX_POWER        ChannelList[MAX_NUM_OF_CHANNELS];   // list all supported channels for site survey
2708         CHANNEL_11J_TX_POWER    TxPower11J[MAX_NUM_OF_11JCHANNELS];       // 802.11j channel and bw
2709         CHANNEL_11J_TX_POWER    ChannelList11J[MAX_NUM_OF_11JCHANNELS];   // list all supported channels for site survey
2710
2711         UCHAR                   ChannelListNum;                     // number of channel in ChannelList[]
2712         UCHAR                                   Bbp94;
2713         BOOLEAN                                 BbpForCCK;
2714         ULONG           Tx20MPwrCfgABand[5];
2715         ULONG           Tx20MPwrCfgGBand[5];
2716         ULONG           Tx40MPwrCfgABand[5];
2717         ULONG           Tx40MPwrCfgGBand[5];
2718
2719         BOOLEAN     bAutoTxAgcA;                // Enable driver auto Tx Agc control
2720         UCHAR       TssiRefA;                                   // Store Tssi reference value as 25 temperature.
2721         UCHAR       TssiPlusBoundaryA[5];               // Tssi boundary for increase Tx power to compensate.
2722         UCHAR       TssiMinusBoundaryA[5];              // Tssi boundary for decrease Tx power to compensate.
2723         UCHAR       TxAgcStepA;                                 // Store Tx TSSI delta increment / decrement value
2724         CHAR            TxAgcCompensateA;                       // Store the compensation (TxAgcStep * (idx-1))
2725
2726         BOOLEAN     bAutoTxAgcG;                // Enable driver auto Tx Agc control
2727         UCHAR       TssiRefG;                                   // Store Tssi reference value as 25 temperature.
2728         UCHAR       TssiPlusBoundaryG[5];               // Tssi boundary for increase Tx power to compensate.
2729         UCHAR       TssiMinusBoundaryG[5];              // Tssi boundary for decrease Tx power to compensate.
2730         UCHAR       TxAgcStepG;                                 // Store Tx TSSI delta increment / decrement value
2731         CHAR            TxAgcCompensateG;                       // Store the compensation (TxAgcStep * (idx-1))
2732
2733         //+++For RT2870, the parameteres is start from BGRssiOffset1 ~ BGRssiOffset3
2734         CHAR            BGRssiOffset0;                          // Store B/G RSSI#0 Offset value on EEPROM 0x46h
2735         CHAR            BGRssiOffset1;                          // Store B/G RSSI#1 Offset value
2736         CHAR            BGRssiOffset2;                          // Store B/G RSSI#2 Offset value
2737         //---
2738
2739         //+++For RT2870, the parameteres is start from ARssiOffset1 ~ ARssiOffset3
2740         CHAR            ARssiOffset0;                           // Store A RSSI#0 Offset value on EEPROM 0x4Ah
2741         CHAR            ARssiOffset1;                           // Store A RSSI#1 Offset value
2742         CHAR            ARssiOffset2;                           // Store A RSSI#2 Offset value
2743         //---
2744
2745         CHAR            BLNAGain;                                       // Store B/G external LNA#0 value on EEPROM 0x44h
2746         CHAR            ALNAGain0;                                      // Store A external LNA#0 value for ch36~64
2747         CHAR            ALNAGain1;                                      // Store A external LNA#1 value for ch100~128
2748         CHAR            ALNAGain2;                                      // Store A external LNA#2 value for ch132~165
2749
2750         // ----------------------------
2751         // LED control
2752         // ----------------------------
2753         MCU_LEDCS_STRUC         LedCntl;
2754         USHORT                          Led1;   // read from EEPROM 0x3c
2755         USHORT                          Led2;   // EEPROM 0x3e
2756         USHORT                          Led3;   // EEPROM 0x40
2757         UCHAR                           LedIndicatorStregth;
2758         UCHAR                           RssiSingalstrengthOffet;
2759     BOOLEAN                             bLedOnScanning;
2760         UCHAR                           LedStatus;
2761
2762 /*****************************************************************************************/
2763 /*      802.11 related parameters                                                        */
2764 /*****************************************************************************************/
2765         // outgoing BEACON frame buffer and corresponding TXD
2766         TXWI_STRUC                      BeaconTxWI;
2767         PUCHAR                                          BeaconBuf;
2768         USHORT                                          BeaconOffset[HW_BEACON_MAX_COUNT];
2769
2770         // pre-build PS-POLL and NULL frame upon link up. for efficiency purpose.
2771         PSPOLL_FRAME                    PsPollFrame;
2772         HEADER_802_11                   NullFrame;
2773
2774 #ifdef RT2870
2775         TX_CONTEXT                              BeaconContext[BEACON_RING_SIZE];
2776         TX_CONTEXT                              NullContext;
2777         TX_CONTEXT                              PsPollContext;
2778         TX_CONTEXT                              RTSContext;
2779 #endif // RT2870 //
2780
2781
2782
2783 //=========AP===========
2784
2785
2786 //=======STA===========
2787 #ifdef CONFIG_STA_SUPPORT
2788 /* Modified by Wu Xi-Kun 4/21/2006 */
2789         // -----------------------------------------------
2790         // STA specific configuration & operation status
2791         // used only when pAd->OpMode == OPMODE_STA
2792         // -----------------------------------------------
2793         STA_ADMIN_CONFIG        StaCfg;           // user desired settings
2794         STA_ACTIVE_CONFIG       StaActive;         // valid only when ADHOC_ON(pAd) || INFRA_ON(pAd)
2795         CHAR                    nickname[IW_ESSID_MAX_SIZE+1]; // nickname, only used in the iwconfig i/f
2796         NDIS_MEDIA_STATE        PreMediaState;
2797 #endif // CONFIG_STA_SUPPORT //
2798
2799 //=======Common===========
2800         // OP mode: either AP or STA
2801         UCHAR                   OpMode;                     // OPMODE_STA, OPMODE_AP
2802
2803         NDIS_MEDIA_STATE        IndicateMediaState;                     // Base on Indication state, default is NdisMediaStateDisConnected
2804
2805
2806         // MAT related parameters
2807
2808         // configuration: read from Registry & E2PROM
2809         BOOLEAN                 bLocalAdminMAC;             // Use user changed MAC
2810         UCHAR                   PermanentAddress[MAC_ADDR_LEN];    // Factory default MAC address
2811         UCHAR                   CurrentAddress[MAC_ADDR_LEN];      // User changed MAC address
2812
2813         // ------------------------------------------------------
2814         // common configuration to both OPMODE_STA and OPMODE_AP
2815         // ------------------------------------------------------
2816         COMMON_CONFIG           CommonCfg;
2817         MLME_STRUCT             Mlme;
2818
2819         // AP needs those vaiables for site survey feature.
2820         MLME_AUX                MlmeAux;           // temporary settings used during MLME state machine
2821         BSS_TABLE               ScanTab;           // store the latest SCAN result
2822
2823         //About MacTab, the sta driver will use #0 and #1 for multicast and AP.
2824         MAC_TABLE                 MacTab;     // ASIC on-chip WCID entry table.  At TX, ASIC always use key according to this on-chip table.
2825         NDIS_SPIN_LOCK          MacTabLock;
2826
2827 #ifdef DOT11_N_SUPPORT
2828         BA_TABLE                        BATable;
2829 #endif // DOT11_N_SUPPORT //
2830         NDIS_SPIN_LOCK          BATabLock;
2831         RALINK_TIMER_STRUCT RECBATimer;
2832
2833         // encryption/decryption KEY tables
2834         CIPHER_KEY              SharedKey[MAX_MBSSID_NUM][4]; // STA always use SharedKey[BSS0][0..3]
2835
2836                 // RX re-assembly buffer for fragmentation
2837         FRAGMENT_FRAME          FragFrame;                  // Frame storage for fragment frame
2838
2839         // various Counters
2840         COUNTER_802_3           Counters8023;               // 802.3 counters
2841         COUNTER_802_11          WlanCounters;               // 802.11 MIB counters
2842         COUNTER_RALINK          RalinkCounters;             // Ralink propriety counters
2843         COUNTER_DRS             DrsCounters;                // counters for Dynamic TX Rate Switching
2844         PRIVATE_STRUC           PrivateInfo;                // Private information & counters
2845
2846         // flags, see fRTMP_ADAPTER_xxx flags
2847         ULONG                   Flags;                      // Represent current device status
2848
2849         // current TX sequence #
2850         USHORT                  Sequence;
2851
2852         // Control disconnect / connect event generation
2853         //+++Didn't used anymore
2854         ULONG                   LinkDownTime;
2855         //---
2856         ULONG                   LastRxRate;
2857         ULONG                   LastTxRate;
2858         //+++Used only for Station
2859         BOOLEAN                 bConfigChanged;         // Config Change flag for the same SSID setting
2860         //---
2861
2862         ULONG                   ExtraInfo;              // Extra information for displaying status
2863         ULONG                   SystemErrorBitmap;      // b0: E2PROM version error
2864
2865         //+++Didn't used anymore
2866         ULONG                   MacIcVersion;           // MAC/BBP serial interface issue solved after ver.D
2867         //---
2868
2869         // ---------------------------
2870         // System event log
2871         // ---------------------------
2872         RT_802_11_EVENT_TABLE   EventTab;
2873
2874
2875         BOOLEAN         HTCEnable;
2876
2877         /*****************************************************************************************/
2878         /*      Statistic related parameters                                                     */
2879         /*****************************************************************************************/
2880 #ifdef RT2870
2881         ULONG                                           BulkOutDataOneSecCount;
2882         ULONG                                           BulkInDataOneSecCount;
2883         ULONG                                           BulkLastOneSecCount; // BulkOutDataOneSecCount + BulkInDataOneSecCount
2884         ULONG                                           watchDogRxCnt;
2885         ULONG                                           watchDogRxOverFlowCnt;
2886         ULONG                                           watchDogTxPendingCnt[NUM_OF_TX_RING];
2887 #endif // RT2870 //
2888
2889         BOOLEAN                                         bUpdateBcnCntDone;
2890         ULONG                                           watchDogMacDeadlock;    // prevent MAC/BBP into deadlock condition
2891         // ----------------------------
2892         // DEBUG paramerts
2893         // ----------------------------
2894         //ULONG         DebugSetting[4];
2895         BOOLEAN         bBanAllBaSetup;
2896         BOOLEAN         bPromiscuous;
2897
2898         // ----------------------------
2899         // rt2860c emulation-use Parameters
2900         // ----------------------------
2901         ULONG           rtsaccu[30];
2902         ULONG           ctsaccu[30];
2903         ULONG           cfendaccu[30];
2904         ULONG           bacontent[16];
2905         ULONG           rxint[RX_RING_SIZE+1];
2906         UCHAR           rcvba[60];
2907         BOOLEAN         bLinkAdapt;
2908         BOOLEAN         bForcePrintTX;
2909         BOOLEAN         bForcePrintRX;
2910         BOOLEAN         bDisablescanning;               //defined in RT2870 USB
2911         BOOLEAN         bStaFifoTest;
2912         BOOLEAN         bProtectionTest;
2913         BOOLEAN         bHCCATest;
2914         BOOLEAN         bGenOneHCCA;
2915         BOOLEAN         bBroadComHT;
2916         //+++Following add from RT2870 USB.
2917         ULONG           BulkOutReq;
2918         ULONG           BulkOutComplete;
2919         ULONG           BulkOutCompleteOther;
2920         ULONG           BulkOutCompleteCancel;  // seems not use now?
2921         ULONG           BulkInReq;
2922         ULONG           BulkInComplete;
2923         ULONG           BulkInCompleteFail;
2924         //---
2925
2926     struct wificonf                     WIFItestbed;
2927
2928 #ifdef DOT11_N_SUPPORT
2929         struct reordering_mpdu_pool mpdu_blk_pool;
2930 #endif // DOT11_N_SUPPORT //
2931
2932         ULONG                                   OneSecondnonBEpackets;          // record non BE packets per second
2933
2934 #if WIRELESS_EXT >= 12
2935     struct iw_statistics    iw_stats;
2936 #endif
2937
2938         struct net_device_stats stats;
2939
2940         ULONG                                   TbttTickCount;
2941 #ifdef PCI_MSI_SUPPORT
2942         BOOLEAN                                 HaveMsi;
2943 #endif // PCI_MSI_SUPPORT //
2944
2945
2946         UCHAR                                   is_on;
2947
2948 #define TIME_BASE                       (1000000/OS_HZ)
2949 #define TIME_ONE_SECOND         (1000000/TIME_BASE)
2950         UCHAR                                   flg_be_adjust;
2951         ULONG                                   be_adjust_last_time;
2952
2953 #ifdef IKANOS_VX_1X0
2954         struct IKANOS_TX_INFO   IkanosTxInfo;
2955         struct IKANOS_TX_INFO   IkanosRxInfo[MAX_MBSSID_NUM + MAX_WDS_ENTRY + MAX_APCLI_NUM + MAX_MESH_NUM];
2956 #endif // IKANOS_VX_1X0 //
2957
2958
2959 #ifdef DBG_DIAGNOSE
2960         RtmpDiagStruct  DiagStruct;
2961 #endif // DBG_DIAGNOSE //
2962
2963
2964         UINT8                                   PM_FlgSuspend;
2965
2966 #ifdef RT30xx
2967 //======efuse
2968         BOOLEAN         bUseEfuse;
2969         BOOLEAN         bEEPROMFile;
2970 #endif // RT30xx //
2971
2972 } RTMP_ADAPTER, *PRTMP_ADAPTER;
2973
2974 //
2975 // Cisco IAPP format
2976 //
2977 typedef struct  _CISCO_IAPP_CONTENT_
2978 {
2979         USHORT     Length;        //IAPP Length
2980         UCHAR      MessageType;      //IAPP type
2981         UCHAR      FunctionCode;     //IAPP function type
2982         UCHAR      DestinaionMAC[MAC_ADDR_LEN];
2983         UCHAR      SourceMAC[MAC_ADDR_LEN];
2984         USHORT     Tag;           //Tag(element IE) - Adjacent AP report
2985         USHORT     TagLength;     //Length of element not including 4 byte header
2986         UCHAR      OUI[4];           //0x00, 0x40, 0x96, 0x00
2987         UCHAR      PreviousAP[MAC_ADDR_LEN];       //MAC Address of access point
2988         USHORT     Channel;
2989         USHORT     SsidLen;
2990         UCHAR      Ssid[MAX_LEN_OF_SSID];
2991         USHORT     Seconds;          //Seconds that the client has been disassociated.
2992 } CISCO_IAPP_CONTENT, *PCISCO_IAPP_CONTENT;
2993
2994 #define DELAYINTMASK            0x0003fffb
2995 #define INTMASK                         0x0003fffb
2996 #define IndMask                         0x0003fffc
2997 #define RxINT                           0x00000005      // Delayed Rx or indivi rx
2998 #define TxDataInt                       0x000000fa      // Delayed Tx or indivi tx
2999 #define TxMgmtInt                       0x00000102      // Delayed Tx or indivi tx
3000 #define TxCoherent                      0x00020000      // tx coherent
3001 #define RxCoherent                      0x00010000      // rx coherent
3002 #define McuCommand                      0x00000200      // mcu
3003 #define PreTBTTInt                      0x00001000      // Pre-TBTT interrupt
3004 #define TBTTInt                         0x00000800              // TBTT interrupt
3005 #define GPTimeOutInt                    0x00008000              // GPtimeout interrupt
3006 #define AutoWakeupInt           0x00004000              // AutoWakeupInt interrupt
3007 #define FifoStaFullInt                  0x00002000      //  fifo statistics full interrupt
3008
3009
3010 typedef struct _RX_BLK_
3011 {
3012 //      RXD_STRUC               RxD; // sample
3013         RT28XX_RXD_STRUC        RxD;
3014         PRXWI_STRUC                     pRxWI;
3015         PHEADER_802_11          pHeader;
3016         PNDIS_PACKET            pRxPacket;
3017         UCHAR                           *pData;
3018         USHORT                          DataSize;
3019         USHORT                          Flags;
3020         UCHAR                           UserPriority;   // for calculate TKIP MIC using
3021 } RX_BLK;
3022
3023
3024 #define RX_BLK_SET_FLAG(_pRxBlk, _flag)         (_pRxBlk->Flags |= _flag)
3025 #define RX_BLK_TEST_FLAG(_pRxBlk, _flag)        (_pRxBlk->Flags & _flag)
3026 #define RX_BLK_CLEAR_FLAG(_pRxBlk, _flag)       (_pRxBlk->Flags &= ~(_flag))
3027
3028
3029 #define fRX_WDS                 0x0001
3030 #define fRX_AMSDU       0x0002
3031 #define fRX_ARALINK     0x0004
3032 #define fRX_HTC         0x0008
3033 #define fRX_PAD         0x0010
3034 #define fRX_AMPDU       0x0020
3035 #define fRX_QOS                 0x0040
3036 #define fRX_INFRA               0x0080
3037 #define fRX_EAP                 0x0100
3038 #define fRX_MESH                0x0200
3039 #define fRX_APCLI               0x0400
3040 #define fRX_DLS                 0x0800
3041 #define fRX_WPI                 0x1000
3042
3043 #define LENGTH_AMSDU_SUBFRAMEHEAD       14
3044 #define LENGTH_ARALINK_SUBFRAMEHEAD     14
3045 #define LENGTH_ARALINK_HEADER_FIELD      2
3046
3047 #define TX_UNKOWN_FRAME                 0x00
3048 #define TX_MCAST_FRAME                  0x01
3049 #define TX_LEGACY_FRAME                 0x02
3050 #define TX_AMPDU_FRAME                  0x04
3051 #define TX_AMSDU_FRAME                  0x08
3052 #define TX_RALINK_FRAME                 0x10
3053 #define TX_FRAG_FRAME                   0x20
3054
3055
3056 //      Currently the sizeof(TX_BLK) is 148 bytes.
3057 typedef struct _TX_BLK_
3058 {
3059         UCHAR                           QueIdx;
3060         UCHAR                           TxFrameType;                            // Indicate the Transmission type of the all frames in one batch
3061         UCHAR                           TotalFrameNum;                          // Total frame number want to send-out in one batch
3062         USHORT                          TotalFragNum;                           // Total frame fragments required in one batch
3063         USHORT                          TotalFrameLen;                          // Total length of all frames want to send-out in one batch
3064
3065         QUEUE_HEADER            TxPacketList;
3066         MAC_TABLE_ENTRY         *pMacEntry;                                     // NULL: packet with 802.11 RA field is multicast/broadcast address
3067         HTTRANSMIT_SETTING      *pTransmit;
3068
3069         // Following structure used for the characteristics of a specific packet.
3070         PNDIS_PACKET            pPacket;
3071         PUCHAR                          pSrcBufHeader;                          // Reference to the head of sk_buff->data
3072         PUCHAR                          pSrcBufData;                            // Reference to the sk_buff->data, will changed depends on hanlding progresss
3073         UINT                            SrcBufLen;                                      // Length of packet payload which not including Layer 2 header
3074         PUCHAR                          pExtraLlcSnapEncap;                     // NULL means no extra LLC/SNAP is required
3075         UCHAR                           HeaderBuf[80];                          // TempBuffer for TX_INFO + TX_WI + 802.11 Header + padding + AMSDU SubHeader + LLC/SNAP
3076         UCHAR                           MpduHeaderLen;                          // 802.11 header length NOT including the padding
3077         UCHAR                           HdrPadLen;                                      // recording Header Padding Length;
3078         UCHAR                           apidx;                                          // The interface associated to this packet
3079         UCHAR                           Wcid;                                           // The MAC entry associated to this packet
3080         UCHAR                           UserPriority;                           // priority class of packet
3081         UCHAR                           FrameGap;                                       // what kind of IFS this packet use
3082         UCHAR                           MpduReqNum;                                     // number of fragments of this frame
3083         UCHAR                           TxRate;                                         // TODO: Obsoleted? Should change to MCS?
3084         UCHAR                           CipherAlg;                                      // cipher alogrithm
3085         PCIPHER_KEY                     pKey;
3086
3087
3088
3089         USHORT                          Flags;                                          //See following definitions for detail.
3090
3091         //YOU SHOULD NOT TOUCH IT! Following parameters are used for hardware-depended layer.
3092         ULONG                           Priv;                                           // Hardware specific value saved in here.
3093 } TX_BLK, *PTX_BLK;
3094
3095
3096 #define fTX_bRtsRequired                0x0001  // Indicate if need send RTS frame for protection. Not used in RT2860/RT2870.
3097 #define fTX_bAckRequired        0x0002  // the packet need ack response
3098 #define fTX_bPiggyBack                  0x0004  // Legacy device use Piggback or not
3099 #define fTX_bHTRate             0x0008  // allow to use HT rate
3100 //#define fTX_bForceLowRate       0x0010        // force to use Low Rate
3101 #define fTX_bForceNonQoS        0x0010  // force to transmit frame without WMM-QoS in HT mode
3102 #define fTX_bAllowFrag          0x0020  // allow to fragment the packet, A-MPDU, A-MSDU, A-Ralink is not allowed to fragment
3103 #define fTX_bMoreData                   0x0040  // there are more data packets in PowerSave Queue
3104 #define fTX_bWMM                                0x0080  // QOS Data
3105
3106 #define fTX_bClearEAPFrame              0x0100
3107
3108
3109 #ifdef CONFIG_STA_SUPPORT
3110 #endif // CONFIG_STA_SUPPORT //
3111
3112
3113
3114 #define TX_BLK_ASSIGN_FLAG(_pTxBlk, _flag, value)       \
3115                 do {                                                                            \
3116                         if (value)                                                              \
3117                                 (_pTxBlk->Flags |= _flag)                       \
3118                         else                                                                    \
3119                                 (_pTxBlk->Flags &= ~(_flag))            \
3120                 }while(0)
3121
3122 #define TX_BLK_SET_FLAG(_pTxBlk, _flag)         (_pTxBlk->Flags |= _flag)
3123 #define TX_BLK_TEST_FLAG(_pTxBlk, _flag)        (((_pTxBlk->Flags & _flag) == _flag) ? 1 : 0)
3124 #define TX_BLK_CLEAR_FLAG(_pTxBlk, _flag)       (_pTxBlk->Flags &= ~(_flag))
3125
3126
3127
3128
3129
3130 //------------------------------------------------------------------------------------------
3131
3132
3133
3134 #ifdef RT_BIG_ENDIAN
3135 static inline VOID      WriteBackToDescriptor(
3136         IN  PUCHAR                      Dest,
3137         IN      PUCHAR                  Src,
3138     IN  BOOLEAN                 DoEncrypt,
3139         IN  ULONG           DescriptorType)
3140 {
3141         UINT32 *p1, *p2;
3142
3143         p1 = ((UINT32 *)Dest);
3144         p2 = ((UINT32 *)Src);
3145
3146         *p1 = *p2;
3147         *(p1+2) = *(p2+2);
3148         *(p1+3) = *(p2+3);
3149         *(p1+1) = *(p2+1); // Word 1; this must be written back last
3150 }
3151
3152 /*
3153         ========================================================================
3154
3155         Routine Description:
3156                 Endian conversion of Tx/Rx descriptor .
3157
3158         Arguments:
3159                 pAd     Pointer to our adapter
3160                 pData                   Pointer to Tx/Rx descriptor
3161                 DescriptorType  Direction of the frame
3162
3163         Return Value:
3164                 None
3165
3166         Note:
3167                 Call this function when read or update descriptor
3168         ========================================================================
3169 */
3170 static inline VOID      RTMPWIEndianChange(
3171         IN      PUCHAR                  pData,
3172         IN      ULONG                   DescriptorType)
3173 {
3174         int size;
3175         int i;
3176
3177         size = ((DescriptorType == TYPE_TXWI) ? TXWI_SIZE : RXWI_SIZE);
3178
3179         if(DescriptorType == TYPE_TXWI)
3180         {
3181                 *((UINT32 *)(pData)) = SWAP32(*((UINT32 *)(pData)));            // Byte 0~3
3182                 *((UINT32 *)(pData + 4)) = SWAP32(*((UINT32 *)(pData+4)));      // Byte 4~7
3183         }
3184         else
3185         {
3186                 for(i=0; i < size/4 ; i++)
3187                         *(((UINT32 *)pData) +i) = SWAP32(*(((UINT32 *)pData)+i));
3188         }
3189 }
3190
3191 /*
3192         ========================================================================
3193
3194         Routine Description:
3195                 Endian conversion of Tx/Rx descriptor .
3196
3197         Arguments:
3198                 pAd     Pointer to our adapter
3199                 pData                   Pointer to Tx/Rx descriptor
3200                 DescriptorType  Direction of the frame
3201
3202         Return Value:
3203                 None
3204
3205         Note:
3206                 Call this function when read or update descriptor
3207         ========================================================================
3208 */
3209
3210 #ifdef RT2870
3211 static inline VOID      RTMPDescriptorEndianChange(
3212         IN      PUCHAR                  pData,
3213         IN      ULONG                   DescriptorType)
3214 {
3215         *((UINT32 *)(pData)) = SWAP32(*((UINT32 *)(pData)));
3216 }
3217 #endif // RT2870 //
3218 /*
3219         ========================================================================
3220
3221         Routine Description:
3222                 Endian conversion of all kinds of 802.11 frames .
3223
3224         Arguments:
3225                 pAd     Pointer to our adapter
3226                 pData                   Pointer to the 802.11 frame structure
3227                 Dir                     Direction of the frame
3228                 FromRxDoneInt   Caller is from RxDone interrupt
3229
3230         Return Value:
3231                 None
3232
3233         Note:
3234                 Call this function when read or update buffer data
3235         ========================================================================
3236 */
3237 static inline VOID      RTMPFrameEndianChange(
3238         IN      PRTMP_ADAPTER   pAd,
3239         IN      PUCHAR                  pData,
3240         IN      ULONG                   Dir,
3241         IN      BOOLEAN                 FromRxDoneInt)
3242 {
3243         PHEADER_802_11 pFrame;
3244         PUCHAR  pMacHdr;
3245
3246         // swab 16 bit fields - Frame Control field
3247         if(Dir == DIR_READ)
3248         {
3249                 *(USHORT *)pData = SWAP16(*(USHORT *)pData);
3250         }
3251
3252         pFrame = (PHEADER_802_11) pData;
3253         pMacHdr = (PUCHAR) pFrame;
3254
3255         // swab 16 bit fields - Duration/ID field
3256         *(USHORT *)(pMacHdr + 2) = SWAP16(*(USHORT *)(pMacHdr + 2));
3257
3258         // swab 16 bit fields - Sequence Control field
3259         *(USHORT *)(pMacHdr + 22) = SWAP16(*(USHORT *)(pMacHdr + 22));
3260
3261         if(pFrame->FC.Type == BTYPE_MGMT)
3262         {
3263                 switch(pFrame->FC.SubType)
3264                 {
3265                         case SUBTYPE_ASSOC_REQ:
3266                         case SUBTYPE_REASSOC_REQ:
3267                                 // swab 16 bit fields - CapabilityInfo field
3268                                 pMacHdr += sizeof(HEADER_802_11);
3269                                 *(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr);
3270
3271                                 // swab 16 bit fields - Listen Interval field
3272                                 pMacHdr += 2;
3273                                 *(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr);
3274                                 break;
3275
3276                         case SUBTYPE_ASSOC_RSP:
3277                         case SUBTYPE_REASSOC_RSP:
3278                                 // swab 16 bit fields - CapabilityInfo field
3279                                 pMacHdr += sizeof(HEADER_802_11);
3280                                 *(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr);
3281
3282                                 // swab 16 bit fields - Status Code field
3283                                 pMacHdr += 2;
3284                                 *(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr);
3285
3286                                 // swab 16 bit fields - AID field
3287                                 pMacHdr += 2;
3288                                 *(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr);
3289                                 break;
3290
3291                         case SUBTYPE_AUTH:
3292                                 // If from APHandleRxDoneInterrupt routine, it is still a encrypt format.
3293                                 // The convertion is delayed to RTMPHandleDecryptionDoneInterrupt.
3294                                 if(!FromRxDoneInt && pFrame->FC.Wep == 1)
3295                                         break;
3296                                 else
3297                                 {
3298                                         // swab 16 bit fields - Auth Alg No. field
3299                                         pMacHdr += sizeof(HEADER_802_11);
3300                                         *(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr);
3301
3302                                         // swab 16 bit fields - Auth Seq No. field
3303                                         pMacHdr += 2;
3304                                         *(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr);
3305
3306                                         // swab 16 bit fields - Status Code field
3307                                         pMacHdr += 2;
3308                                         *(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr);
3309                                 }
3310                                 break;
3311
3312                         case SUBTYPE_BEACON:
3313                         case SUBTYPE_PROBE_RSP:
3314                                 // swab 16 bit fields - BeaconInterval field
3315                                 pMacHdr += (sizeof(HEADER_802_11) + TIMESTAMP_LEN);
3316                                 *(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr);
3317
3318                                 // swab 16 bit fields - CapabilityInfo field
3319                                 pMacHdr += sizeof(USHORT);
3320                                 *(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr);
3321                                 break;
3322
3323                         case SUBTYPE_DEAUTH:
3324                         case SUBTYPE_DISASSOC:
3325                                 // swab 16 bit fields - Reason code field
3326                                 pMacHdr += sizeof(HEADER_802_11);
3327                                 *(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr);
3328                                 break;
3329                 }
3330         }
3331         else if( pFrame->FC.Type == BTYPE_DATA )
3332         {
3333         }
3334         else if(pFrame->FC.Type == BTYPE_CNTL)
3335         {
3336                 switch(pFrame->FC.SubType)
3337                 {
3338                         case SUBTYPE_BLOCK_ACK_REQ:
3339                                 {
3340                                         PFRAME_BA_REQ pBAReq = (PFRAME_BA_REQ)pFrame;
3341                                         *(USHORT *)(&pBAReq->BARControl) = SWAP16(*(USHORT *)(&pBAReq->BARControl));
3342                                         pBAReq->BAStartingSeq.word = SWAP16(pBAReq->BAStartingSeq.word);
3343                                 }
3344                                 break;
3345                         case SUBTYPE_BLOCK_ACK:
3346                                 // For Block Ack packet, the HT_CONTROL field is in the same offset with Addr3
3347                                 *(UINT32 *)(&pFrame->Addr3[0]) = SWAP32(*(UINT32 *)(&pFrame->Addr3[0]));
3348                                 break;
3349
3350                         case SUBTYPE_ACK:
3351                                 //For ACK packet, the HT_CONTROL field is in the same offset with Addr2
3352                                 *(UINT32 *)(&pFrame->Addr2[0])= SWAP32(*(UINT32 *)(&pFrame->Addr2[0]));
3353                                 break;
3354                 }
3355         }
3356         else
3357         {
3358                 DBGPRINT(RT_DEBUG_ERROR,("Invalid Frame Type!!!\n"));
3359         }
3360
3361         // swab 16 bit fields - Frame Control
3362         if(Dir == DIR_WRITE)
3363         {
3364                 *(USHORT *)pData = SWAP16(*(USHORT *)pData);
3365         }
3366 }
3367 #endif // RT_BIG_ENDIAN //
3368
3369
3370 static inline VOID ConvertMulticastIP2MAC(
3371         IN PUCHAR pIpAddr,
3372         IN PUCHAR *ppMacAddr,
3373         IN UINT16 ProtoType)
3374 {
3375         if (pIpAddr == NULL)
3376                 return;
3377
3378         if (ppMacAddr == NULL || *ppMacAddr == NULL)
3379                 return;
3380
3381         switch (ProtoType)
3382         {
3383                 case ETH_P_IPV6:
3384 //                      memset(*ppMacAddr, 0, ETH_LENGTH_OF_ADDRESS);
3385                         *(*ppMacAddr) = 0x33;
3386                         *(*ppMacAddr + 1) = 0x33;
3387                         *(*ppMacAddr + 2) = pIpAddr[12];
3388                         *(*ppMacAddr + 3) = pIpAddr[13];
3389                         *(*ppMacAddr + 4) = pIpAddr[14];
3390                         *(*ppMacAddr + 5) = pIpAddr[15];
3391                         break;
3392
3393                 case ETH_P_IP:
3394                 default:
3395 //                      memset(*ppMacAddr, 0, ETH_LENGTH_OF_ADDRESS);
3396                         *(*ppMacAddr) = 0x01;
3397                         *(*ppMacAddr + 1) = 0x00;
3398                         *(*ppMacAddr + 2) = 0x5e;
3399                         *(*ppMacAddr + 3) = pIpAddr[1] & 0x7f;
3400                         *(*ppMacAddr + 4) = pIpAddr[2];
3401                         *(*ppMacAddr + 5) = pIpAddr[3];
3402                         break;
3403         }
3404
3405         return;
3406 }
3407
3408 BOOLEAN RTMPCheckForHang(
3409         IN  NDIS_HANDLE MiniportAdapterContext
3410         );
3411
3412 VOID  RTMPHalt(
3413         IN  NDIS_HANDLE MiniportAdapterContext
3414         );
3415
3416 //
3417 //  Private routines in rtmp_init.c
3418 //
3419 NDIS_STATUS RTMPAllocAdapterBlock(
3420         IN PVOID                        handle,
3421         OUT PRTMP_ADAPTER   *ppAdapter
3422         );
3423
3424 NDIS_STATUS RTMPAllocTxRxRingMemory(
3425         IN  PRTMP_ADAPTER   pAd
3426         );
3427
3428 NDIS_STATUS RTMPFindAdapter(
3429         IN  PRTMP_ADAPTER   pAd,
3430         IN  NDIS_HANDLE     WrapperConfigurationContext
3431         );
3432
3433 NDIS_STATUS     RTMPReadParametersHook(
3434         IN      PRTMP_ADAPTER pAd
3435         );
3436
3437 VOID RTMPFreeAdapter(
3438         IN  PRTMP_ADAPTER   pAd
3439         );
3440
3441 NDIS_STATUS NICReadRegParameters(
3442         IN  PRTMP_ADAPTER       pAd,
3443         IN  NDIS_HANDLE         WrapperConfigurationContext
3444         );
3445
3446 #ifdef RT30xx
3447 VOID NICInitRT30xxRFRegisters(
3448         IN PRTMP_ADAPTER pAd);
3449 #endif // RT30xx //
3450
3451 VOID NICReadEEPROMParameters(
3452         IN  PRTMP_ADAPTER       pAd,
3453         IN      PUCHAR                          mac_addr);
3454
3455 VOID NICInitAsicFromEEPROM(
3456         IN  PRTMP_ADAPTER       pAd);
3457
3458 VOID NICInitTxRxRingAndBacklogQueue(
3459         IN  PRTMP_ADAPTER   pAd);
3460
3461 NDIS_STATUS NICInitializeAdapter(
3462         IN  PRTMP_ADAPTER   pAd,
3463         IN   BOOLEAN    bHardReset);
3464
3465 NDIS_STATUS NICInitializeAsic(
3466         IN  PRTMP_ADAPTER   pAd,
3467         IN  BOOLEAN             bHardReset);
3468
3469 VOID NICIssueReset(
3470         IN  PRTMP_ADAPTER   pAd);
3471
3472 VOID RTMPRingCleanUp(
3473         IN  PRTMP_ADAPTER   pAd,
3474         IN  UCHAR           RingType);
3475
3476 VOID RxTest(
3477         IN  PRTMP_ADAPTER   pAd);
3478
3479 NDIS_STATUS DbgSendPacket(
3480         IN  PRTMP_ADAPTER   pAd,
3481         IN  PNDIS_PACKET    pPacket);
3482
3483 VOID UserCfgInit(
3484         IN  PRTMP_ADAPTER   pAd);
3485
3486 VOID NICResetFromError(
3487         IN  PRTMP_ADAPTER   pAd);
3488
3489 VOID NICEraseFirmware(
3490         IN PRTMP_ADAPTER pAd);
3491
3492 NDIS_STATUS NICLoadFirmware(
3493         IN  PRTMP_ADAPTER   pAd);
3494
3495 NDIS_STATUS NICLoadRateSwitchingParams(
3496         IN PRTMP_ADAPTER pAd);
3497
3498 BOOLEAN NICCheckForHang(
3499         IN  PRTMP_ADAPTER   pAd);
3500
3501 VOID NICUpdateFifoStaCounters(
3502         IN PRTMP_ADAPTER pAd);
3503
3504 VOID NICUpdateRawCounters(
3505         IN  PRTMP_ADAPTER   pAd);
3506
3507 ULONG   RTMPNotAllZero(
3508         IN      PVOID   pSrc1,
3509         IN      ULONG   Length);
3510
3511 VOID RTMPZeroMemory(
3512         IN  PVOID   pSrc,
3513         IN  ULONG   Length);
3514
3515 ULONG RTMPCompareMemory(
3516         IN  PVOID   pSrc1,
3517         IN  PVOID   pSrc2,
3518         IN  ULONG   Length);
3519
3520 VOID RTMPMoveMemory(
3521         OUT PVOID   pDest,
3522         IN  PVOID   pSrc,
3523         IN  ULONG   Length);
3524
3525 VOID AtoH(
3526         char    *src,
3527         UCHAR   *dest,
3528         int             destlen);
3529
3530 UCHAR BtoH(
3531         char ch);
3532
3533 VOID RTMPPatchMacBbpBug(
3534         IN  PRTMP_ADAPTER   pAd);
3535
3536 VOID RTMPPatchCardBus(
3537         IN      PRTMP_ADAPTER   pAdapter);
3538
3539 VOID RTMPPatchRalinkCardBus(
3540         IN      PRTMP_ADAPTER   pAdapter,
3541         IN      ULONG                   Bus);
3542
3543 ULONG RTMPReadCBConfig(
3544         IN      ULONG   Bus,
3545         IN      ULONG   Slot,
3546         IN      ULONG   Func,
3547         IN      ULONG   Offset);
3548
3549 VOID RTMPWriteCBConfig(
3550         IN      ULONG   Bus,
3551         IN      ULONG   Slot,
3552         IN      ULONG   Func,
3553         IN      ULONG   Offset,
3554         IN      ULONG   Value);
3555
3556 VOID RTMPInitTimer(
3557         IN  PRTMP_ADAPTER           pAd,
3558         IN  PRALINK_TIMER_STRUCT    pTimer,
3559         IN  PVOID                   pTimerFunc,
3560         IN      PVOID                                   pData,
3561         IN  BOOLEAN                 Repeat);
3562
3563 VOID RTMPSetTimer(
3564         IN  PRALINK_TIMER_STRUCT    pTimer,
3565         IN  ULONG                   Value);
3566
3567
3568 VOID RTMPModTimer(
3569         IN      PRALINK_TIMER_STRUCT    pTimer,
3570         IN      ULONG                                   Value);
3571
3572 VOID RTMPCancelTimer(
3573         IN  PRALINK_TIMER_STRUCT    pTimer,
3574         OUT BOOLEAN                 *pCancelled);
3575
3576 VOID RTMPSetLED(
3577         IN PRTMP_ADAPTER        pAd,
3578         IN UCHAR                        Status);
3579
3580 VOID RTMPSetSignalLED(
3581         IN PRTMP_ADAPTER        pAd,
3582         IN NDIS_802_11_RSSI Dbm);
3583
3584 VOID RTMPEnableRxTx(
3585         IN PRTMP_ADAPTER        pAd);
3586
3587 //
3588 // prototype in action.c
3589 //
3590 VOID ActionStateMachineInit(
3591     IN  PRTMP_ADAPTER   pAd,
3592     IN  STATE_MACHINE *S,
3593     OUT STATE_MACHINE_FUNC Trans[]);
3594
3595 VOID MlmeADDBAAction(
3596     IN PRTMP_ADAPTER pAd,
3597     IN MLME_QUEUE_ELEM *Elem);
3598
3599 VOID MlmeDELBAAction(
3600     IN PRTMP_ADAPTER pAd,
3601     IN MLME_QUEUE_ELEM *Elem);
3602
3603 VOID MlmeDLSAction(
3604     IN PRTMP_ADAPTER pAd,
3605     IN MLME_QUEUE_ELEM *Elem);
3606
3607 VOID MlmeInvalidAction(
3608     IN PRTMP_ADAPTER pAd,
3609     IN MLME_QUEUE_ELEM *Elem);
3610
3611 VOID MlmeQOSAction(
3612     IN PRTMP_ADAPTER pAd,
3613     IN MLME_QUEUE_ELEM *Elem);
3614
3615 #ifdef DOT11_N_SUPPORT
3616 VOID PeerAddBAReqAction(
3617         IN PRTMP_ADAPTER pAd,
3618         IN MLME_QUEUE_ELEM *Elem);
3619
3620 VOID PeerAddBARspAction(
3621         IN PRTMP_ADAPTER pAd,
3622         IN MLME_QUEUE_ELEM *Elem);
3623
3624 VOID PeerDelBAAction(
3625         IN PRTMP_ADAPTER pAd,
3626         IN MLME_QUEUE_ELEM *Elem);
3627
3628 VOID PeerBAAction(
3629     IN PRTMP_ADAPTER pAd,
3630     IN MLME_QUEUE_ELEM *Elem);
3631 #endif // DOT11_N_SUPPORT //
3632
3633 VOID SendPSMPAction(
3634         IN PRTMP_ADAPTER        pAd,
3635         IN UCHAR                        Wcid,
3636         IN UCHAR                        Psmp);
3637
3638
3639 #ifdef DOT11N_DRAFT3
3640 VOID SendBSS2040CoexistMgmtAction(
3641         IN      PRTMP_ADAPTER   pAd,
3642         IN      UCHAR   Wcid,
3643         IN      UCHAR   apidx,
3644         IN      UCHAR   InfoReq);
3645
3646 VOID SendNotifyBWActionFrame(
3647         IN PRTMP_ADAPTER pAd,
3648         IN UCHAR  Wcid,
3649         IN UCHAR apidx);
3650
3651 BOOLEAN ChannelSwitchSanityCheck(
3652         IN      PRTMP_ADAPTER   pAd,
3653         IN    UCHAR  Wcid,
3654         IN    UCHAR  NewChannel,
3655         IN    UCHAR  Secondary);
3656
3657 VOID ChannelSwitchAction(
3658         IN      PRTMP_ADAPTER   pAd,
3659         IN    UCHAR  Wcid,
3660         IN    UCHAR  Channel,
3661         IN    UCHAR  Secondary);
3662
3663 ULONG BuildIntolerantChannelRep(
3664         IN      PRTMP_ADAPTER   pAd,
3665         IN    PUCHAR  pDest);
3666
3667 VOID Update2040CoexistFrameAndNotify(
3668         IN      PRTMP_ADAPTER   pAd,
3669         IN    UCHAR  Wcid,
3670         IN      BOOLEAN bAddIntolerantCha);
3671
3672 VOID Send2040CoexistAction(
3673         IN      PRTMP_ADAPTER   pAd,
3674         IN    UCHAR  Wcid,
3675         IN      BOOLEAN bAddIntolerantCha);
3676 #endif // DOT11N_DRAFT3 //
3677
3678 VOID PeerRMAction(
3679         IN PRTMP_ADAPTER pAd,
3680         IN MLME_QUEUE_ELEM *Elem);
3681
3682 VOID PeerPublicAction(
3683         IN PRTMP_ADAPTER pAd,
3684         IN MLME_QUEUE_ELEM *Elem);
3685
3686 #ifdef CONFIG_STA_SUPPORT
3687 VOID StaPublicAction(
3688         IN PRTMP_ADAPTER pAd,
3689         IN UCHAR Bss2040Coexist);
3690 #endif // CONFIG_STA_SUPPORT //
3691
3692
3693 VOID PeerBSSTranAction(
3694         IN PRTMP_ADAPTER pAd,
3695         IN MLME_QUEUE_ELEM *Elem);
3696
3697 #ifdef DOT11_N_SUPPORT
3698 VOID PeerHTAction(
3699         IN PRTMP_ADAPTER pAd,
3700         IN MLME_QUEUE_ELEM *Elem);
3701 #endif // DOT11_N_SUPPORT //
3702
3703 VOID PeerQOSAction(
3704     IN PRTMP_ADAPTER pAd,
3705     IN MLME_QUEUE_ELEM *Elem);
3706
3707 #ifdef DOT11_N_SUPPORT
3708 VOID RECBATimerTimeout(
3709     IN PVOID SystemSpecific1,
3710     IN PVOID FunctionContext,
3711     IN PVOID SystemSpecific2,
3712     IN PVOID SystemSpecific3);
3713
3714 VOID ORIBATimerTimeout(
3715         IN      PRTMP_ADAPTER   pAd);
3716
3717 VOID SendRefreshBAR(
3718         IN      PRTMP_ADAPTER   pAd,
3719         IN      MAC_TABLE_ENTRY *pEntry);
3720 #endif // DOT11_N_SUPPORT //
3721
3722 VOID ActHeaderInit(
3723     IN  PRTMP_ADAPTER   pAd,
3724     IN OUT PHEADER_802_11 pHdr80211,
3725     IN PUCHAR Addr1,
3726     IN PUCHAR Addr2,
3727     IN PUCHAR Addr3);
3728
3729 VOID BarHeaderInit(
3730         IN      PRTMP_ADAPTER   pAd,
3731         IN OUT PFRAME_BAR pCntlBar,
3732         IN PUCHAR pDA,
3733         IN PUCHAR pSA);
3734
3735 VOID InsertActField(
3736         IN PRTMP_ADAPTER pAd,
3737         OUT PUCHAR pFrameBuf,
3738         OUT PULONG pFrameLen,
3739         IN UINT8 Category,
3740         IN UINT8 ActCode);
3741
3742 BOOLEAN QosBADataParse(
3743         IN PRTMP_ADAPTER        pAd,
3744         IN BOOLEAN bAMSDU,
3745         IN PUCHAR p8023Header,
3746         IN UCHAR        WCID,
3747         IN UCHAR        TID,
3748         IN USHORT Sequence,
3749         IN UCHAR DataOffset,
3750         IN USHORT Datasize,
3751         IN UINT   CurRxIndex);
3752
3753 #ifdef DOT11_N_SUPPORT
3754 BOOLEAN CntlEnqueueForRecv(
3755     IN  PRTMP_ADAPTER   pAd,
3756         IN ULONG Wcid,
3757     IN ULONG MsgLen,
3758         IN PFRAME_BA_REQ pMsg);
3759
3760 VOID BaAutoManSwitch(
3761         IN      PRTMP_ADAPTER   pAd);
3762 #endif // DOT11_N_SUPPORT //
3763
3764 VOID HTIOTCheck(
3765         IN      PRTMP_ADAPTER   pAd,
3766         IN    UCHAR     BatRecIdx);
3767
3768 //
3769 // Private routines in rtmp_data.c
3770 //
3771 BOOLEAN RTMPHandleRxDoneInterrupt(
3772         IN  PRTMP_ADAPTER   pAd);
3773
3774 VOID RTMPHandleTxDoneInterrupt(
3775         IN  PRTMP_ADAPTER   pAd);
3776
3777 BOOLEAN RTMPHandleTxRingDmaDoneInterrupt(
3778         IN  PRTMP_ADAPTER   pAd,
3779         IN  INT_SOURCE_CSR_STRUC TxRingBitmap);
3780
3781 VOID RTMPHandleMgmtRingDmaDoneInterrupt(
3782         IN  PRTMP_ADAPTER   pAd);
3783
3784 VOID RTMPHandleTBTTInterrupt(
3785         IN  PRTMP_ADAPTER   pAd);
3786
3787 VOID RTMPHandlePreTBTTInterrupt(
3788         IN  PRTMP_ADAPTER   pAd);
3789
3790 void RTMPHandleTwakeupInterrupt(
3791         IN PRTMP_ADAPTER pAd);
3792
3793 VOID    RTMPHandleRxCoherentInterrupt(
3794         IN      PRTMP_ADAPTER   pAd);
3795
3796 BOOLEAN TxFrameIsAggregatible(
3797         IN  PRTMP_ADAPTER   pAd,
3798         IN  PUCHAR          pPrevAddr1,
3799         IN  PUCHAR          p8023hdr);
3800
3801 BOOLEAN PeerIsAggreOn(
3802     IN  PRTMP_ADAPTER   pAd,
3803     IN  ULONG          TxRate,
3804     IN  PMAC_TABLE_ENTRY pMacEntry);
3805
3806 NDIS_STATUS Sniff2BytesFromNdisBuffer(
3807         IN  PNDIS_BUFFER    pFirstBuffer,
3808         IN  UCHAR           DesiredOffset,
3809         OUT PUCHAR          pByte0,
3810         OUT PUCHAR          pByte1);
3811
3812 NDIS_STATUS STASendPacket(
3813         IN  PRTMP_ADAPTER   pAd,
3814         IN  PNDIS_PACKET    pPacket);
3815
3816 VOID STASendPackets(
3817         IN  NDIS_HANDLE     MiniportAdapterContext,
3818         IN  PPNDIS_PACKET   ppPacketArray,
3819         IN  UINT            NumberOfPackets);
3820
3821 VOID RTMPDeQueuePacket(
3822         IN  PRTMP_ADAPTER   pAd,
3823         IN      BOOLEAN                 bIntContext,
3824         IN  UCHAR                       QueIdx,
3825         IN      UCHAR                   Max_Tx_Packets);
3826
3827 NDIS_STATUS     RTMPHardTransmit(
3828         IN PRTMP_ADAPTER        pAd,
3829         IN PNDIS_PACKET         pPacket,
3830         IN  UCHAR                       QueIdx,
3831         OUT     PULONG                  pFreeTXDLeft);
3832
3833 NDIS_STATUS     STAHardTransmit(
3834         IN PRTMP_ADAPTER        pAd,
3835         IN TX_BLK                       *pTxBlk,
3836         IN  UCHAR                       QueIdx);
3837
3838 VOID STARxEAPOLFrameIndicate(
3839         IN      PRTMP_ADAPTER   pAd,
3840         IN      MAC_TABLE_ENTRY *pEntry,
3841         IN      RX_BLK                  *pRxBlk,
3842         IN      UCHAR                   FromWhichBSSID);
3843
3844 NDIS_STATUS RTMPFreeTXDRequest(
3845         IN  PRTMP_ADAPTER   pAd,
3846         IN  UCHAR           RingType,
3847         IN  UCHAR           NumberRequired,
3848         IN      PUCHAR          FreeNumberIs);
3849
3850 NDIS_STATUS MlmeHardTransmit(
3851         IN  PRTMP_ADAPTER   pAd,
3852         IN  UCHAR       QueIdx,
3853         IN  PNDIS_PACKET    pPacket);
3854
3855 NDIS_STATUS MlmeHardTransmitMgmtRing(
3856         IN  PRTMP_ADAPTER   pAd,
3857         IN  UCHAR       QueIdx,
3858         IN  PNDIS_PACKET    pPacket);
3859
3860 NDIS_STATUS MlmeHardTransmitTxRing(
3861         IN  PRTMP_ADAPTER   pAd,
3862         IN  UCHAR       QueIdx,
3863         IN  PNDIS_PACKET    pPacket);
3864
3865 USHORT  RTMPCalcDuration(
3866         IN  PRTMP_ADAPTER   pAd,
3867         IN  UCHAR           Rate,
3868         IN  ULONG           Size);
3869
3870 VOID RTMPWriteTxWI(
3871         IN      PRTMP_ADAPTER   pAd,
3872         IN      PTXWI_STRUC             pTxWI,
3873         IN  BOOLEAN             FRAG,
3874         IN  BOOLEAN             CFACK,
3875         IN  BOOLEAN             InsTimestamp,
3876         IN      BOOLEAN                 AMPDU,
3877         IN      BOOLEAN                 Ack,
3878         IN      BOOLEAN                 NSeq,           // HW new a sequence.
3879         IN      UCHAR                   BASize,
3880         IN      UCHAR                   WCID,
3881         IN      ULONG                   Length,
3882         IN  UCHAR               PID,
3883         IN      UCHAR                   TID,
3884         IN      UCHAR                   TxRate,
3885         IN      UCHAR                   Txopmode,
3886         IN      BOOLEAN                 CfAck,
3887         IN      HTTRANSMIT_SETTING      *pTransmit);
3888
3889
3890 VOID RTMPWriteTxWI_Data(
3891         IN      PRTMP_ADAPTER           pAd,
3892         IN      OUT PTXWI_STRUC         pTxWI,
3893         IN      TX_BLK                          *pTxBlk);
3894
3895
3896 VOID RTMPWriteTxWI_Cache(
3897         IN      PRTMP_ADAPTER           pAd,
3898         IN      OUT PTXWI_STRUC         pTxWI,
3899         IN      TX_BLK                          *pTxBlk);
3900
3901 VOID RTMPWriteTxDescriptor(
3902         IN      PRTMP_ADAPTER   pAd,
3903         IN      PTXD_STRUC              pTxD,
3904         IN      BOOLEAN                 bWIV,
3905         IN      UCHAR                   QSEL);
3906
3907 VOID RTMPSuspendMsduTransmission(
3908         IN  PRTMP_ADAPTER   pAd);
3909
3910 VOID RTMPResumeMsduTransmission(
3911         IN  PRTMP_ADAPTER   pAd);
3912
3913 NDIS_STATUS MiniportMMRequest(
3914         IN  PRTMP_ADAPTER   pAd,
3915         IN      UCHAR                   QueIdx,
3916         IN      PUCHAR                  pData,
3917         IN  UINT            Length);
3918
3919 NDIS_STATUS MiniportDataMMRequest(
3920          IN  PRTMP_ADAPTER   pAd,
3921          IN  UCHAR           QueIdx,
3922          IN  PUCHAR          pData,
3923          IN  UINT            Length);
3924
3925 VOID RTMPSendNullFrame(
3926         IN  PRTMP_ADAPTER   pAd,
3927         IN  UCHAR           TxRate,
3928         IN      BOOLEAN                 bQosNull);
3929
3930 VOID RTMPSendDisassociationFrame(
3931         IN      PRTMP_ADAPTER   pAd);
3932
3933 VOID RTMPSendRTSFrame(
3934         IN  PRTMP_ADAPTER   pAd,
3935         IN  PUCHAR          pDA,
3936         IN      unsigned int    NextMpduSize,
3937         IN  UCHAR           TxRate,
3938         IN  UCHAR           RTSRate,
3939         IN  USHORT          AckDuration,
3940         IN  UCHAR           QueIdx,
3941         IN  UCHAR                       FrameGap);
3942
3943
3944 NDIS_STATUS RTMPApplyPacketFilter(
3945         IN  PRTMP_ADAPTER   pAd,
3946         IN  PRT28XX_RXD_STRUC      pRxD,
3947         IN  PHEADER_802_11  pHeader);
3948
3949 PQUEUE_HEADER   RTMPCheckTxSwQueue(
3950         IN  PRTMP_ADAPTER   pAd,
3951         OUT UCHAR           *QueIdx);
3952
3953 #ifdef CONFIG_STA_SUPPORT
3954 VOID RTMPReportMicError(
3955         IN  PRTMP_ADAPTER   pAd,
3956         IN  PCIPHER_KEY     pWpaKey);
3957
3958 VOID    WpaMicFailureReportFrame(
3959         IN  PRTMP_ADAPTER    pAd,
3960         IN  MLME_QUEUE_ELEM *Elem);
3961
3962 VOID    WpaDisassocApAndBlockAssoc(
3963     IN  PVOID SystemSpecific1,
3964     IN  PVOID FunctionContext,
3965     IN  PVOID SystemSpecific2,
3966     IN  PVOID SystemSpecific3);
3967 #endif // CONFIG_STA_SUPPORT //
3968
3969 NDIS_STATUS RTMPCloneNdisPacket(
3970         IN  PRTMP_ADAPTER   pAd,
3971         IN      BOOLEAN    pInsAMSDUHdr,
3972         IN  PNDIS_PACKET    pInPacket,
3973         OUT PNDIS_PACKET   *ppOutPacket);
3974
3975 NDIS_STATUS RTMPAllocateNdisPacket(
3976         IN  PRTMP_ADAPTER   pAd,
3977         IN  PNDIS_PACKET    *pPacket,
3978         IN  PUCHAR          pHeader,
3979         IN  UINT            HeaderLen,
3980         IN  PUCHAR          pData,
3981         IN  UINT            DataLen);
3982
3983 VOID RTMPFreeNdisPacket(
3984         IN  PRTMP_ADAPTER   pAd,
3985         IN  PNDIS_PACKET    pPacket);
3986
3987 BOOLEAN RTMPFreeTXDUponTxDmaDone(
3988         IN PRTMP_ADAPTER    pAd,
3989         IN UCHAR            QueIdx);
3990
3991 BOOLEAN RTMPCheckDHCPFrame(
3992         IN      PRTMP_ADAPTER   pAd,
3993         IN      PNDIS_PACKET    pPacket);
3994
3995
3996 BOOLEAN RTMPCheckEtherType(
3997         IN      PRTMP_ADAPTER   pAd,
3998         IN      PNDIS_PACKET    pPacket);
3999
4000
4001 VOID RTMPCckBbpTuning(
4002         IN      PRTMP_ADAPTER   pAd,
4003         IN      UINT                    TxRate);
4004
4005 //
4006 // Private routines in rtmp_wep.c
4007 //
4008 VOID RTMPInitWepEngine(
4009         IN  PRTMP_ADAPTER   pAd,
4010         IN  PUCHAR          pKey,
4011         IN  UCHAR           KeyId,
4012         IN  UCHAR           KeyLen,
4013         IN  PUCHAR          pDest);
4014
4015 VOID RTMPEncryptData(
4016         IN  PRTMP_ADAPTER   pAd,
4017         IN  PUCHAR          pSrc,
4018         IN  PUCHAR          pDest,
4019         IN  UINT            Len);
4020
4021 BOOLEAN RTMPDecryptData(
4022         IN      PRTMP_ADAPTER   pAdapter,
4023         IN      PUCHAR                  pSrc,
4024         IN      UINT                    Len,
4025         IN      UINT                    idx);
4026
4027 BOOLEAN RTMPSoftDecryptWEP(
4028         IN PRTMP_ADAPTER        pAd,
4029         IN PUCHAR                       pData,
4030         IN ULONG                        DataByteCnt,
4031         IN PCIPHER_KEY          pGroupKey);
4032
4033 VOID RTMPSetICV(
4034         IN  PRTMP_ADAPTER   pAd,
4035         IN  PUCHAR          pDest);
4036
4037 VOID ARCFOUR_INIT(
4038         IN  PARCFOURCONTEXT Ctx,
4039         IN  PUCHAR          pKey,
4040         IN  UINT            KeyLen);
4041
4042 UCHAR   ARCFOUR_BYTE(
4043         IN  PARCFOURCONTEXT     Ctx);
4044
4045 VOID ARCFOUR_DECRYPT(
4046         IN  PARCFOURCONTEXT Ctx,
4047         IN  PUCHAR          pDest,
4048         IN  PUCHAR          pSrc,
4049         IN  UINT            Len);
4050
4051 VOID ARCFOUR_ENCRYPT(
4052         IN  PARCFOURCONTEXT Ctx,
4053         IN  PUCHAR          pDest,
4054         IN  PUCHAR          pSrc,
4055         IN  UINT            Len);
4056
4057 VOID WPAARCFOUR_ENCRYPT(
4058         IN  PARCFOURCONTEXT Ctx,
4059         IN  PUCHAR          pDest,
4060         IN  PUCHAR          pSrc,
4061         IN  UINT            Len);
4062
4063 UINT RTMP_CALC_FCS32(
4064         IN  UINT   Fcs,
4065         IN  PUCHAR  Cp,
4066         IN  INT     Len);
4067
4068 //
4069 // MLME routines
4070 //
4071
4072 // Asic/RF/BBP related functions
4073
4074 VOID AsicAdjustTxPower(
4075         IN PRTMP_ADAPTER pAd);
4076
4077 VOID    AsicUpdateProtect(
4078         IN              PRTMP_ADAPTER   pAd,
4079         IN              USHORT                  OperaionMode,
4080         IN              UCHAR                   SetMask,
4081         IN              BOOLEAN                 bDisableBGProtect,
4082         IN              BOOLEAN                 bNonGFExist);
4083
4084 VOID AsicSwitchChannel(
4085         IN  PRTMP_ADAPTER   pAd,
4086         IN      UCHAR                   Channel,
4087         IN      BOOLEAN                 bScan);
4088
4089 VOID AsicLockChannel(
4090         IN PRTMP_ADAPTER pAd,
4091         IN UCHAR Channel) ;
4092
4093 VOID AsicAntennaSelect(
4094         IN  PRTMP_ADAPTER   pAd,
4095         IN  UCHAR           Channel);
4096
4097 VOID AsicAntennaSetting(
4098         IN      PRTMP_ADAPTER   pAd,
4099         IN      ABGBAND_STATE   BandState);
4100
4101 VOID AsicRfTuningExec(
4102         IN PVOID SystemSpecific1,
4103         IN PVOID FunctionContext,
4104         IN PVOID SystemSpecific2,
4105         IN PVOID SystemSpecific3);
4106
4107 #ifdef CONFIG_STA_SUPPORT
4108 VOID AsicSleepThenAutoWakeup(
4109         IN  PRTMP_ADAPTER   pAd,
4110         IN  USHORT TbttNumToNextWakeUp);
4111
4112 VOID AsicForceSleep(
4113         IN PRTMP_ADAPTER pAd);
4114
4115 VOID AsicForceWakeup(
4116         IN PRTMP_ADAPTER pAd,
4117         IN BOOLEAN    bFromTx);
4118 #endif // CONFIG_STA_SUPPORT //
4119
4120 VOID AsicSetBssid(
4121         IN  PRTMP_ADAPTER   pAd,
4122         IN  PUCHAR pBssid);
4123
4124 VOID AsicSetMcastWC(
4125         IN PRTMP_ADAPTER pAd);
4126
4127 VOID AsicDelWcidTab(
4128         IN PRTMP_ADAPTER pAd,
4129         IN UCHAR        Wcid);
4130
4131 VOID AsicEnableRDG(
4132         IN PRTMP_ADAPTER pAd);
4133
4134 VOID AsicDisableRDG(
4135         IN PRTMP_ADAPTER pAd);
4136
4137 VOID AsicDisableSync(
4138         IN  PRTMP_ADAPTER   pAd);
4139
4140 VOID AsicEnableBssSync(
4141         IN  PRTMP_ADAPTER   pAd);
4142
4143 VOID AsicEnableIbssSync(
4144         IN  PRTMP_ADAPTER   pAd);
4145
4146 VOID AsicSetEdcaParm(
4147         IN PRTMP_ADAPTER pAd,
4148         IN PEDCA_PARM    pEdcaParm);
4149
4150 VOID AsicSetSlotTime(
4151         IN PRTMP_ADAPTER pAd,
4152         IN BOOLEAN bUseShortSlotTime);
4153
4154 VOID AsicAddSharedKeyEntry(
4155         IN PRTMP_ADAPTER pAd,
4156         IN UCHAR         BssIndex,
4157         IN UCHAR         KeyIdx,
4158         IN UCHAR         CipherAlg,
4159         IN PUCHAR        pKey,
4160         IN PUCHAR        pTxMic,
4161         IN PUCHAR        pRxMic);
4162
4163 VOID AsicRemoveSharedKeyEntry(
4164         IN PRTMP_ADAPTER pAd,
4165         IN UCHAR         BssIndex,
4166         IN UCHAR         KeyIdx);
4167
4168 VOID AsicUpdateWCIDAttribute(
4169         IN PRTMP_ADAPTER pAd,
4170         IN USHORT               WCID,
4171         IN UCHAR                BssIndex,
4172         IN UCHAR        CipherAlg,
4173         IN BOOLEAN              bUsePairewiseKeyTable);
4174
4175 VOID AsicUpdateWCIDIVEIV(
4176         IN PRTMP_ADAPTER pAd,
4177         IN USHORT               WCID,
4178         IN ULONG        uIV,
4179         IN ULONG        uEIV);
4180
4181 VOID AsicUpdateRxWCIDTable(
4182         IN PRTMP_ADAPTER pAd,
4183         IN USHORT               WCID,
4184         IN PUCHAR        pAddr);
4185
4186 VOID AsicAddKeyEntry(
4187         IN PRTMP_ADAPTER pAd,
4188         IN USHORT               WCID,
4189         IN UCHAR                BssIndex,
4190         IN UCHAR                KeyIdx,
4191         IN PCIPHER_KEY  pCipherKey,
4192         IN BOOLEAN              bUsePairewiseKeyTable,
4193         IN BOOLEAN              bTxKey);
4194
4195 VOID AsicAddPairwiseKeyEntry(
4196         IN PRTMP_ADAPTER pAd,
4197         IN PUCHAR        pAddr,
4198         IN UCHAR                WCID,
4199         IN CIPHER_KEY            *pCipherKey);
4200
4201 VOID AsicRemovePairwiseKeyEntry(
4202         IN PRTMP_ADAPTER  pAd,
4203         IN UCHAR                 BssIdx,
4204         IN UCHAR                 Wcid);
4205
4206 BOOLEAN AsicSendCommandToMcu(
4207         IN PRTMP_ADAPTER pAd,
4208         IN UCHAR         Command,
4209         IN UCHAR         Token,
4210         IN UCHAR         Arg0,
4211         IN UCHAR         Arg1);
4212
4213
4214 VOID MacAddrRandomBssid(
4215         IN  PRTMP_ADAPTER   pAd,
4216         OUT PUCHAR pAddr);
4217
4218 VOID MgtMacHeaderInit(
4219         IN  PRTMP_ADAPTER     pAd,
4220         IN OUT PHEADER_802_11 pHdr80211,
4221         IN UCHAR SubType,
4222         IN UCHAR ToDs,
4223         IN PUCHAR pDA,
4224         IN PUCHAR pBssid);
4225
4226 VOID MlmeRadioOff(
4227         IN PRTMP_ADAPTER pAd);
4228
4229 VOID MlmeRadioOn(
4230         IN PRTMP_ADAPTER pAd);
4231
4232
4233 VOID BssTableInit(
4234         IN BSS_TABLE *Tab);
4235
4236 #ifdef DOT11_N_SUPPORT
4237 VOID BATableInit(
4238         IN PRTMP_ADAPTER pAd,
4239     IN BA_TABLE *Tab);
4240 #endif // DOT11_N_SUPPORT //
4241
4242 ULONG BssTableSearch(
4243         IN BSS_TABLE *Tab,
4244         IN PUCHAR pBssid,
4245         IN UCHAR Channel);
4246
4247 ULONG BssSsidTableSearch(
4248         IN BSS_TABLE *Tab,
4249         IN PUCHAR    pBssid,
4250         IN PUCHAR    pSsid,
4251         IN UCHAR     SsidLen,
4252         IN UCHAR     Channel);
4253
4254 ULONG BssTableSearchWithSSID(
4255         IN BSS_TABLE *Tab,
4256         IN PUCHAR    Bssid,
4257         IN PUCHAR    pSsid,
4258         IN UCHAR     SsidLen,
4259         IN UCHAR     Channel);
4260
4261 VOID BssTableDeleteEntry(
4262         IN OUT  PBSS_TABLE pTab,
4263         IN      PUCHAR pBssid,
4264         IN      UCHAR Channel);
4265
4266 #ifdef DOT11_N_SUPPORT
4267 VOID BATableDeleteORIEntry(
4268         IN OUT  PRTMP_ADAPTER pAd,
4269         IN              BA_ORI_ENTRY    *pBAORIEntry);
4270
4271 VOID BATableDeleteRECEntry(
4272         IN OUT  PRTMP_ADAPTER pAd,
4273         IN              BA_REC_ENTRY    *pBARECEntry);
4274
4275 VOID BATableTearORIEntry(
4276         IN OUT  PRTMP_ADAPTER pAd,
4277         IN              UCHAR TID,
4278         IN              UCHAR Wcid,
4279         IN              BOOLEAN bForceDelete,
4280         IN              BOOLEAN ALL);
4281
4282 VOID BATableTearRECEntry(
4283         IN OUT  PRTMP_ADAPTER pAd,
4284         IN              UCHAR TID,
4285         IN              UCHAR WCID,
4286         IN              BOOLEAN ALL);
4287 #endif // DOT11_N_SUPPORT //
4288
4289 VOID  BssEntrySet(
4290         IN  PRTMP_ADAPTER   pAd,
4291         OUT PBSS_ENTRY pBss,
4292         IN PUCHAR pBssid,
4293         IN CHAR Ssid[],
4294         IN UCHAR SsidLen,
4295         IN UCHAR BssType,
4296         IN USHORT BeaconPeriod,
4297         IN PCF_PARM CfParm,
4298         IN USHORT AtimWin,
4299         IN USHORT CapabilityInfo,
4300         IN UCHAR SupRate[],
4301         IN UCHAR SupRateLen,
4302         IN UCHAR ExtRate[],
4303         IN UCHAR ExtRateLen,
4304         IN HT_CAPABILITY_IE *pHtCapability,
4305         IN ADD_HT_INFO_IE *pAddHtInfo,  // AP might use this additional ht info IE
4306         IN UCHAR                        HtCapabilityLen,
4307         IN UCHAR                        AddHtInfoLen,
4308         IN UCHAR                        NewExtChanOffset,
4309         IN UCHAR Channel,
4310         IN CHAR Rssi,
4311         IN LARGE_INTEGER TimeStamp,
4312         IN UCHAR CkipFlag,
4313         IN PEDCA_PARM pEdcaParm,
4314         IN PQOS_CAPABILITY_PARM pQosCapability,
4315         IN PQBSS_LOAD_PARM pQbssLoad,
4316         IN USHORT LengthVIE,
4317         IN PNDIS_802_11_VARIABLE_IEs pVIE);
4318
4319 ULONG  BssTableSetEntry(
4320         IN  PRTMP_ADAPTER   pAd,
4321         OUT PBSS_TABLE pTab,
4322         IN PUCHAR pBssid,
4323         IN CHAR Ssid[],
4324         IN UCHAR SsidLen,
4325         IN UCHAR BssType,
4326         IN USHORT BeaconPeriod,
4327         IN CF_PARM *CfParm,
4328         IN USHORT AtimWin,
4329         IN USHORT CapabilityInfo,
4330         IN UCHAR SupRate[],
4331         IN UCHAR SupRateLen,
4332         IN UCHAR ExtRate[],
4333         IN UCHAR ExtRateLen,
4334         IN HT_CAPABILITY_IE *pHtCapability,
4335         IN ADD_HT_INFO_IE *pAddHtInfo,  // AP might use this additional ht info IE
4336         IN UCHAR                        HtCapabilityLen,
4337         IN UCHAR                        AddHtInfoLen,
4338         IN UCHAR                        NewExtChanOffset,
4339         IN UCHAR Channel,
4340         IN CHAR Rssi,
4341         IN LARGE_INTEGER TimeStamp,
4342         IN UCHAR CkipFlag,
4343         IN PEDCA_PARM pEdcaParm,
4344         IN PQOS_CAPABILITY_PARM pQosCapability,
4345         IN PQBSS_LOAD_PARM pQbssLoad,
4346         IN USHORT LengthVIE,
4347         IN PNDIS_802_11_VARIABLE_IEs pVIE);
4348
4349 #ifdef DOT11_N_SUPPORT
4350 VOID BATableInsertEntry(
4351     IN  PRTMP_ADAPTER   pAd,
4352         IN USHORT Aid,
4353     IN USHORT           TimeOutValue,
4354         IN USHORT               StartingSeq,
4355     IN UCHAR TID,
4356         IN UCHAR BAWinSize,
4357         IN UCHAR OriginatorStatus,
4358     IN BOOLEAN IsRecipient);
4359
4360 #ifdef DOT11N_DRAFT3
4361 VOID Bss2040CoexistTimeOut(
4362         IN PVOID SystemSpecific1,
4363         IN PVOID FunctionContext,
4364         IN PVOID SystemSpecific2,
4365         IN PVOID SystemSpecific3);
4366
4367
4368 VOID  TriEventInit(
4369         IN      PRTMP_ADAPTER   pAd);
4370
4371 ULONG TriEventTableSetEntry(
4372         IN      PRTMP_ADAPTER   pAd,
4373         OUT TRIGGER_EVENT_TAB *Tab,
4374         IN PUCHAR pBssid,
4375         IN HT_CAPABILITY_IE *pHtCapability,
4376         IN UCHAR                        HtCapabilityLen,
4377         IN UCHAR                        RegClass,
4378         IN UCHAR ChannelNo);
4379
4380 VOID TriEventCounterMaintenance(
4381         IN      PRTMP_ADAPTER   pAd);
4382 #endif // DOT11N_DRAFT3 //
4383 #endif // DOT11_N_SUPPORT //
4384
4385 VOID BssTableSsidSort(
4386         IN  PRTMP_ADAPTER   pAd,
4387         OUT BSS_TABLE *OutTab,
4388         IN  CHAR Ssid[],
4389         IN  UCHAR SsidLen);
4390
4391 VOID  BssTableSortByRssi(
4392         IN OUT BSS_TABLE *OutTab);
4393
4394 VOID BssCipherParse(
4395         IN OUT  PBSS_ENTRY  pBss);
4396
4397 NDIS_STATUS  MlmeQueueInit(
4398         IN MLME_QUEUE *Queue);
4399
4400 VOID  MlmeQueueDestroy(
4401         IN MLME_QUEUE *Queue);
4402
4403 BOOLEAN MlmeEnqueue(
4404         IN PRTMP_ADAPTER pAd,
4405         IN ULONG Machine,
4406         IN ULONG MsgType,
4407         IN ULONG MsgLen,
4408         IN VOID *Msg);
4409
4410 BOOLEAN MlmeEnqueueForRecv(
4411         IN  PRTMP_ADAPTER   pAd,
4412         IN ULONG Wcid,
4413         IN ULONG TimeStampHigh,
4414         IN ULONG TimeStampLow,
4415         IN UCHAR Rssi0,
4416         IN UCHAR Rssi1,
4417         IN UCHAR Rssi2,
4418         IN ULONG MsgLen,
4419         IN PVOID Msg,
4420         IN UCHAR Signal);
4421
4422
4423 BOOLEAN MlmeDequeue(
4424         IN MLME_QUEUE *Queue,
4425         OUT MLME_QUEUE_ELEM **Elem);
4426
4427 VOID    MlmeRestartStateMachine(
4428         IN  PRTMP_ADAPTER   pAd);
4429
4430 BOOLEAN  MlmeQueueEmpty(
4431         IN MLME_QUEUE *Queue);
4432
4433 BOOLEAN  MlmeQueueFull(
4434         IN MLME_QUEUE *Queue);
4435
4436 BOOLEAN  MsgTypeSubst(
4437         IN PRTMP_ADAPTER pAd,
4438         IN PFRAME_802_11 pFrame,
4439         OUT INT *Machine,
4440         OUT INT *MsgType);
4441
4442 VOID StateMachineInit(
4443         IN STATE_MACHINE *Sm,
4444         IN STATE_MACHINE_FUNC Trans[],
4445         IN ULONG StNr,
4446         IN ULONG MsgNr,
4447         IN STATE_MACHINE_FUNC DefFunc,
4448         IN ULONG InitState,
4449         IN ULONG Base);
4450
4451 VOID StateMachineSetAction(
4452         IN STATE_MACHINE *S,
4453         IN ULONG St,
4454         ULONG Msg,
4455         IN STATE_MACHINE_FUNC F);
4456
4457 VOID StateMachinePerformAction(
4458         IN  PRTMP_ADAPTER   pAd,
4459         IN STATE_MACHINE *S,
4460         IN MLME_QUEUE_ELEM *Elem);
4461
4462 VOID Drop(
4463         IN  PRTMP_ADAPTER   pAd,
4464         IN MLME_QUEUE_ELEM *Elem);
4465
4466 VOID AssocStateMachineInit(
4467         IN  PRTMP_ADAPTER   pAd,
4468         IN  STATE_MACHINE *Sm,
4469         OUT STATE_MACHINE_FUNC Trans[]);
4470
4471 VOID ReassocTimeout(
4472         IN PVOID SystemSpecific1,
4473         IN PVOID FunctionContext,
4474         IN PVOID SystemSpecific2,
4475         IN PVOID SystemSpecific3);
4476
4477 VOID AssocTimeout(
4478         IN PVOID SystemSpecific1,
4479         IN PVOID FunctionContext,
4480         IN PVOID SystemSpecific2,
4481         IN PVOID SystemSpecific3);
4482
4483 VOID DisassocTimeout(
4484         IN PVOID SystemSpecific1,
4485         IN PVOID FunctionContext,
4486         IN PVOID SystemSpecific2,
4487         IN PVOID SystemSpecific3);
4488
4489 //----------------------------------------------
4490 VOID MlmeDisassocReqAction(
4491         IN  PRTMP_ADAPTER   pAd,
4492         IN  MLME_QUEUE_ELEM *Elem);
4493
4494 VOID MlmeAssocReqAction(
4495         IN  PRTMP_ADAPTER   pAd,
4496         IN  MLME_QUEUE_ELEM *Elem);
4497
4498 VOID MlmeReassocReqAction(
4499         IN  PRTMP_ADAPTER   pAd,
4500         IN  MLME_QUEUE_ELEM *Elem);
4501
4502 VOID MlmeDisassocReqAction(
4503         IN  PRTMP_ADAPTER   pAd,
4504         IN  MLME_QUEUE_ELEM *Elem);
4505
4506 VOID PeerAssocRspAction(
4507         IN  PRTMP_ADAPTER   pAd,
4508         IN  MLME_QUEUE_ELEM *Elem);
4509
4510 VOID PeerReassocRspAction(
4511         IN  PRTMP_ADAPTER   pAd,
4512         IN  MLME_QUEUE_ELEM *Elem);
4513
4514 VOID PeerDisassocAction(
4515         IN  PRTMP_ADAPTER   pAd,
4516         IN  MLME_QUEUE_ELEM *Elem);
4517
4518 VOID DisassocTimeoutAction(
4519         IN  PRTMP_ADAPTER   pAd,
4520         IN  MLME_QUEUE_ELEM *Elem);
4521
4522 VOID AssocTimeoutAction(
4523         IN  PRTMP_ADAPTER   pAd,
4524         IN  MLME_QUEUE_ELEM *Elem);
4525
4526 VOID  ReassocTimeoutAction(
4527         IN  PRTMP_ADAPTER   pAd,
4528         IN  MLME_QUEUE_ELEM *Elem);
4529
4530 VOID  Cls3errAction(
4531         IN  PRTMP_ADAPTER   pAd,
4532         IN  PUCHAR pAddr);
4533
4534 VOID SwitchBetweenWepAndCkip(
4535         IN PRTMP_ADAPTER pAd);
4536
4537 VOID  InvalidStateWhenAssoc(
4538         IN  PRTMP_ADAPTER   pAd,
4539         IN  MLME_QUEUE_ELEM *Elem);
4540
4541 VOID  InvalidStateWhenReassoc(
4542         IN  PRTMP_ADAPTER   pAd,
4543         IN  MLME_QUEUE_ELEM *Elem);
4544
4545 VOID InvalidStateWhenDisassociate(
4546         IN  PRTMP_ADAPTER pAd,
4547         IN  MLME_QUEUE_ELEM *Elem);
4548
4549 #ifdef RT2870
4550 VOID MlmeCntlConfirm(
4551         IN PRTMP_ADAPTER pAd,
4552         IN ULONG MsgType,
4553         IN USHORT Msg);
4554 #endif // RT2870 //
4555
4556 VOID  ComposePsPoll(
4557         IN  PRTMP_ADAPTER   pAd);
4558
4559 VOID  ComposeNullFrame(
4560         IN  PRTMP_ADAPTER pAd);
4561
4562 VOID  AssocPostProc(
4563         IN  PRTMP_ADAPTER   pAd,
4564         IN  PUCHAR pAddr2,
4565         IN  USHORT CapabilityInfo,
4566         IN  USHORT Aid,
4567         IN  UCHAR SupRate[],
4568         IN  UCHAR SupRateLen,
4569         IN  UCHAR ExtRate[],
4570         IN  UCHAR ExtRateLen,
4571         IN PEDCA_PARM pEdcaParm,
4572         IN HT_CAPABILITY_IE             *pHtCapability,
4573         IN  UCHAR HtCapabilityLen,
4574         IN ADD_HT_INFO_IE               *pAddHtInfo);
4575
4576 VOID AuthStateMachineInit(
4577         IN  PRTMP_ADAPTER   pAd,
4578         IN PSTATE_MACHINE sm,
4579         OUT STATE_MACHINE_FUNC Trans[]);
4580
4581 VOID AuthTimeout(
4582         IN PVOID SystemSpecific1,
4583         IN PVOID FunctionContext,
4584         IN PVOID SystemSpecific2,
4585         IN PVOID SystemSpecific3);
4586
4587 VOID MlmeAuthReqAction(
4588         IN  PRTMP_ADAPTER   pAd,
4589         IN  MLME_QUEUE_ELEM *Elem);
4590
4591 VOID PeerAuthRspAtSeq2Action(
4592         IN  PRTMP_ADAPTER   pAd,
4593         IN  MLME_QUEUE_ELEM *Elem);
4594
4595 VOID PeerAuthRspAtSeq4Action(
4596         IN  PRTMP_ADAPTER   pAd,
4597         IN  MLME_QUEUE_ELEM *Elem);
4598
4599 VOID AuthTimeoutAction(
4600         IN  PRTMP_ADAPTER   pAd,
4601         IN  MLME_QUEUE_ELEM *Elem);
4602
4603 VOID Cls2errAction(
4604         IN  PRTMP_ADAPTER   pAd,
4605         IN  PUCHAR pAddr);
4606
4607 VOID MlmeDeauthReqAction(
4608         IN  PRTMP_ADAPTER   pAd,
4609         IN  MLME_QUEUE_ELEM *Elem);
4610
4611 VOID InvalidStateWhenAuth(
4612         IN  PRTMP_ADAPTER   pAd,
4613         IN  MLME_QUEUE_ELEM *Elem);
4614
4615 //=============================================
4616
4617 VOID AuthRspStateMachineInit(
4618         IN  PRTMP_ADAPTER   pAd,
4619         IN  PSTATE_MACHINE Sm,
4620         IN  STATE_MACHINE_FUNC Trans[]);
4621
4622 VOID PeerDeauthAction(
4623         IN PRTMP_ADAPTER pAd,
4624         IN MLME_QUEUE_ELEM *Elem);
4625
4626 VOID PeerAuthSimpleRspGenAndSend(
4627         IN  PRTMP_ADAPTER   pAd,
4628         IN  PHEADER_802_11  pHdr80211,
4629         IN  USHORT Alg,
4630         IN  USHORT Seq,
4631         IN  USHORT Reason,
4632         IN  USHORT Status);
4633
4634 //
4635 // Private routines in dls.c
4636 //
4637
4638 //========================================
4639
4640 VOID SyncStateMachineInit(
4641         IN  PRTMP_ADAPTER   pAd,
4642         IN  STATE_MACHINE *Sm,
4643         OUT STATE_MACHINE_FUNC Trans[]);
4644
4645 VOID BeaconTimeout(
4646         IN PVOID SystemSpecific1,
4647         IN PVOID FunctionContext,
4648         IN PVOID SystemSpecific2,
4649         IN PVOID SystemSpecific3);
4650
4651 VOID ScanTimeout(
4652         IN PVOID SystemSpecific1,
4653         IN PVOID FunctionContext,
4654         IN PVOID SystemSpecific2,
4655         IN PVOID SystemSpecific3);
4656
4657 VOID MlmeScanReqAction(
4658         IN  PRTMP_ADAPTER   pAd,
4659         IN  MLME_QUEUE_ELEM *Elem);
4660
4661 VOID InvalidStateWhenScan(
4662         IN  PRTMP_ADAPTER   pAd,
4663         IN  MLME_QUEUE_ELEM *Elem);
4664
4665 VOID InvalidStateWhenJoin(
4666         IN  PRTMP_ADAPTER   pAd,
4667         IN  MLME_QUEUE_ELEM *Elem);
4668
4669 VOID InvalidStateWhenStart(
4670         IN  PRTMP_ADAPTER   pAd,
4671         IN  MLME_QUEUE_ELEM *Elem);
4672
4673 VOID PeerBeacon(
4674         IN  PRTMP_ADAPTER   pAd,
4675         IN  MLME_QUEUE_ELEM *Elem);
4676
4677 VOID EnqueueProbeRequest(
4678         IN PRTMP_ADAPTER pAd);
4679
4680 BOOLEAN ScanRunning(
4681                 IN PRTMP_ADAPTER pAd);
4682 //=========================================
4683
4684 VOID MlmeCntlInit(
4685         IN  PRTMP_ADAPTER   pAd,
4686         IN  STATE_MACHINE *S,
4687         OUT STATE_MACHINE_FUNC Trans[]);
4688
4689 VOID MlmeCntlMachinePerformAction(
4690         IN  PRTMP_ADAPTER   pAd,
4691         IN  STATE_MACHINE *S,
4692         IN  MLME_QUEUE_ELEM *Elem);
4693
4694 VOID CntlIdleProc(
4695         IN  PRTMP_ADAPTER   pAd,
4696         IN  MLME_QUEUE_ELEM *Elem);
4697
4698 VOID CntlOidScanProc(
4699         IN  PRTMP_ADAPTER pAd,
4700         IN  MLME_QUEUE_ELEM *Elem);
4701
4702 VOID CntlOidSsidProc(
4703         IN  PRTMP_ADAPTER   pAd,
4704         IN  MLME_QUEUE_ELEM * Elem);
4705
4706 VOID CntlOidRTBssidProc(
4707         IN  PRTMP_ADAPTER   pAd,
4708         IN  MLME_QUEUE_ELEM * Elem);
4709
4710 VOID CntlMlmeRoamingProc(
4711         IN  PRTMP_ADAPTER   pAd,
4712         IN  MLME_QUEUE_ELEM * Elem);
4713
4714 VOID CntlWaitDisassocProc(
4715         IN  PRTMP_ADAPTER   pAd,
4716         IN  MLME_QUEUE_ELEM *Elem);
4717
4718 VOID CntlWaitJoinProc(
4719         IN  PRTMP_ADAPTER   pAd,
4720         IN  MLME_QUEUE_ELEM *Elem);
4721
4722 VOID CntlWaitReassocProc(
4723         IN  PRTMP_ADAPTER   pAd,
4724         IN  MLME_QUEUE_ELEM *Elem);
4725
4726 VOID CntlWaitStartProc(
4727         IN  PRTMP_ADAPTER   pAd,
4728         IN  MLME_QUEUE_ELEM *Elem);
4729
4730 VOID CntlWaitAuthProc(
4731         IN  PRTMP_ADAPTER   pAd,
4732         IN  MLME_QUEUE_ELEM *Elem);
4733
4734 VOID CntlWaitAuthProc2(
4735         IN  PRTMP_ADAPTER pAd,
4736         IN  MLME_QUEUE_ELEM *Elem);
4737
4738 VOID CntlWaitAssocProc(
4739         IN  PRTMP_ADAPTER   pAd,
4740         IN  MLME_QUEUE_ELEM *Elem);
4741
4742 VOID LinkUp(
4743         IN  PRTMP_ADAPTER   pAd,
4744         IN  UCHAR BssType);
4745
4746 VOID LinkDown(
4747         IN  PRTMP_ADAPTER   pAd,
4748         IN  BOOLEAN         IsReqFromAP);
4749
4750 VOID IterateOnBssTab(
4751         IN  PRTMP_ADAPTER   pAd);
4752
4753 VOID IterateOnBssTab2(
4754         IN  PRTMP_ADAPTER   pAd);;
4755
4756 VOID JoinParmFill(
4757         IN  PRTMP_ADAPTER   pAd,
4758         IN  OUT MLME_JOIN_REQ_STRUCT *JoinReq,
4759         IN  ULONG BssIdx);
4760
4761 VOID AssocParmFill(
4762         IN  PRTMP_ADAPTER   pAd,
4763         IN OUT MLME_ASSOC_REQ_STRUCT *AssocReq,
4764         IN  PUCHAR pAddr,
4765         IN  USHORT CapabilityInfo,
4766         IN  ULONG Timeout,
4767         IN  USHORT ListenIntv);
4768
4769 VOID ScanParmFill(
4770         IN  PRTMP_ADAPTER   pAd,
4771         IN  OUT MLME_SCAN_REQ_STRUCT *ScanReq,
4772         IN  CHAR Ssid[],
4773         IN  UCHAR SsidLen,
4774         IN  UCHAR BssType,
4775         IN  UCHAR ScanType);
4776
4777 VOID DisassocParmFill(
4778         IN  PRTMP_ADAPTER   pAd,
4779         IN  OUT MLME_DISASSOC_REQ_STRUCT *DisassocReq,
4780         IN  PUCHAR pAddr,
4781         IN  USHORT Reason);
4782
4783 VOID StartParmFill(
4784         IN  PRTMP_ADAPTER   pAd,
4785         IN  OUT MLME_START_REQ_STRUCT *StartReq,
4786         IN  CHAR Ssid[],
4787         IN  UCHAR SsidLen);
4788
4789 VOID AuthParmFill(
4790         IN  PRTMP_ADAPTER   pAd,
4791         IN  OUT MLME_AUTH_REQ_STRUCT *AuthReq,
4792         IN  PUCHAR pAddr,
4793         IN  USHORT Alg);
4794
4795 VOID EnqueuePsPoll(
4796         IN  PRTMP_ADAPTER   pAd);
4797
4798 VOID EnqueueBeaconFrame(
4799         IN  PRTMP_ADAPTER   pAd);
4800
4801 VOID MlmeJoinReqAction(
4802         IN  PRTMP_ADAPTER   pAd,
4803         IN  MLME_QUEUE_ELEM *Elem);
4804
4805 VOID MlmeScanReqAction(
4806         IN  PRTMP_ADAPTER   pAd,
4807         IN  MLME_QUEUE_ELEM *Elem);
4808
4809 VOID MlmeStartReqAction(
4810         IN  PRTMP_ADAPTER   pAd,
4811         IN  MLME_QUEUE_ELEM *Elem);
4812
4813 VOID ScanTimeoutAction(
4814         IN  PRTMP_ADAPTER   pAd,
4815         IN  MLME_QUEUE_ELEM *Elem);
4816
4817 VOID BeaconTimeoutAtJoinAction(
4818         IN  PRTMP_ADAPTER   pAd,
4819         IN  MLME_QUEUE_ELEM *Elem);
4820
4821 VOID PeerBeaconAtScanAction(
4822         IN  PRTMP_ADAPTER   pAd,
4823         IN  MLME_QUEUE_ELEM *Elem);
4824
4825 VOID PeerBeaconAtJoinAction(
4826         IN  PRTMP_ADAPTER   pAd,
4827         IN  MLME_QUEUE_ELEM *Elem);
4828
4829 VOID PeerBeacon(
4830         IN  PRTMP_ADAPTER   pAd,
4831         IN  MLME_QUEUE_ELEM *Elem);
4832
4833 VOID PeerProbeReqAction(
4834         IN  PRTMP_ADAPTER pAd,
4835         IN  MLME_QUEUE_ELEM *Elem);
4836
4837 VOID ScanNextChannel(
4838         IN  PRTMP_ADAPTER   pAd);
4839
4840 ULONG MakeIbssBeacon(
4841         IN  PRTMP_ADAPTER   pAd);
4842
4843 VOID CCXAdjacentAPReport(
4844         IN  PRTMP_ADAPTER   pAd);
4845
4846 BOOLEAN MlmeScanReqSanity(
4847         IN  PRTMP_ADAPTER   pAd,
4848         IN  VOID *Msg,
4849         IN  ULONG MsgLen,
4850         OUT UCHAR *BssType,
4851         OUT CHAR ssid[],
4852         OUT UCHAR *SsidLen,
4853         OUT UCHAR *ScanType);
4854
4855 BOOLEAN PeerBeaconAndProbeRspSanity(
4856         IN  PRTMP_ADAPTER   pAd,
4857         IN  VOID *Msg,
4858         IN  ULONG MsgLen,
4859         IN  UCHAR MsgChannel,
4860         OUT PUCHAR pAddr2,
4861         OUT PUCHAR pBssid,
4862         OUT CHAR Ssid[],
4863         OUT UCHAR *pSsidLen,
4864         OUT UCHAR *pBssType,
4865         OUT USHORT *pBeaconPeriod,
4866         OUT UCHAR *pChannel,
4867         OUT UCHAR *pNewChannel,
4868         OUT LARGE_INTEGER *pTimestamp,
4869         OUT CF_PARM *pCfParm,
4870         OUT USHORT *pAtimWin,
4871         OUT USHORT *pCapabilityInfo,
4872         OUT UCHAR *pErp,
4873         OUT UCHAR *pDtimCount,
4874         OUT UCHAR *pDtimPeriod,
4875         OUT UCHAR *pBcastFlag,
4876         OUT UCHAR *pMessageToMe,
4877         OUT UCHAR SupRate[],
4878         OUT UCHAR *pSupRateLen,
4879         OUT UCHAR ExtRate[],
4880         OUT UCHAR *pExtRateLen,
4881         OUT     UCHAR *pCkipFlag,
4882         OUT     UCHAR *pAironetCellPowerLimit,
4883         OUT PEDCA_PARM       pEdcaParm,
4884         OUT PQBSS_LOAD_PARM  pQbssLoad,
4885         OUT PQOS_CAPABILITY_PARM pQosCapability,
4886         OUT ULONG *pRalinkIe,
4887         OUT UCHAR                *pHtCapabilityLen,
4888 #ifdef CONFIG_STA_SUPPORT
4889         OUT UCHAR                *pPreNHtCapabilityLen,
4890 #endif // CONFIG_STA_SUPPORT //
4891         OUT HT_CAPABILITY_IE *pHtCapability,
4892         OUT UCHAR                *AddHtInfoLen,
4893         OUT ADD_HT_INFO_IE *AddHtInfo,
4894         OUT UCHAR *NewExtChannel,
4895         OUT USHORT *LengthVIE,
4896         OUT PNDIS_802_11_VARIABLE_IEs pVIE);
4897
4898 BOOLEAN PeerAddBAReqActionSanity(
4899     IN PRTMP_ADAPTER pAd,
4900     IN VOID *pMsg,
4901     IN ULONG MsgLen,
4902         OUT PUCHAR pAddr2);
4903
4904 BOOLEAN PeerAddBARspActionSanity(
4905     IN PRTMP_ADAPTER pAd,
4906     IN VOID *pMsg,
4907     IN ULONG MsgLen);
4908
4909 BOOLEAN PeerDelBAActionSanity(
4910     IN PRTMP_ADAPTER pAd,
4911     IN UCHAR Wcid,
4912     IN VOID *pMsg,
4913     IN ULONG MsgLen);
4914
4915 BOOLEAN MlmeAssocReqSanity(
4916         IN  PRTMP_ADAPTER   pAd,
4917         IN  VOID *Msg,
4918         IN  ULONG MsgLen,
4919         OUT PUCHAR pApAddr,
4920         OUT USHORT *CapabilityInfo,
4921         OUT ULONG *Timeout,
4922         OUT USHORT *ListenIntv);
4923
4924 BOOLEAN MlmeAuthReqSanity(
4925         IN  PRTMP_ADAPTER   pAd,
4926         IN  VOID *Msg,
4927         IN  ULONG MsgLen,
4928         OUT PUCHAR pAddr,
4929         OUT ULONG *Timeout,
4930         OUT USHORT *Alg);
4931
4932 BOOLEAN MlmeStartReqSanity(
4933         IN  PRTMP_ADAPTER   pAd,
4934         IN  VOID *Msg,
4935         IN  ULONG MsgLen,
4936         OUT CHAR Ssid[],
4937         OUT UCHAR *Ssidlen);
4938
4939 BOOLEAN PeerAuthSanity(
4940         IN  PRTMP_ADAPTER   pAd,
4941         IN  VOID *Msg,
4942         IN  ULONG MsgLen,
4943         OUT PUCHAR pAddr,
4944         OUT USHORT *Alg,
4945         OUT USHORT *Seq,
4946         OUT USHORT *Status,
4947         OUT CHAR ChlgText[]);
4948
4949 BOOLEAN PeerAssocRspSanity(
4950         IN  PRTMP_ADAPTER   pAd,
4951     IN VOID *pMsg,
4952         IN  ULONG MsgLen,
4953         OUT PUCHAR pAddr2,
4954         OUT USHORT *pCapabilityInfo,
4955         OUT USHORT *pStatus,
4956         OUT USHORT *pAid,
4957         OUT UCHAR SupRate[],
4958         OUT UCHAR *pSupRateLen,
4959         OUT UCHAR ExtRate[],
4960         OUT UCHAR *pExtRateLen,
4961     OUT HT_CAPABILITY_IE                *pHtCapability,
4962     OUT ADD_HT_INFO_IE          *pAddHtInfo,    // AP might use this additional ht info IE
4963     OUT UCHAR                   *pHtCapabilityLen,
4964     OUT UCHAR                   *pAddHtInfoLen,
4965     OUT UCHAR                   *pNewExtChannelOffset,
4966         OUT PEDCA_PARM pEdcaParm,
4967         OUT UCHAR *pCkipFlag);
4968
4969 BOOLEAN PeerDisassocSanity(
4970         IN  PRTMP_ADAPTER   pAd,
4971         IN  VOID *Msg,
4972         IN  ULONG MsgLen,
4973         OUT PUCHAR pAddr2,
4974         OUT USHORT *Reason);
4975
4976 BOOLEAN PeerWpaMessageSanity(
4977     IN  PRTMP_ADAPTER           pAd,
4978     IN  PEAPOL_PACKET           pMsg,
4979     IN  ULONG                           MsgLen,
4980     IN  UCHAR                           MsgType,
4981     IN  MAC_TABLE_ENTRY         *pEntry);
4982
4983 BOOLEAN PeerDeauthSanity(
4984         IN  PRTMP_ADAPTER   pAd,
4985         IN  VOID *Msg,
4986         IN  ULONG MsgLen,
4987         OUT PUCHAR pAddr2,
4988         OUT USHORT *Reason);
4989
4990 BOOLEAN PeerProbeReqSanity(
4991         IN  PRTMP_ADAPTER   pAd,
4992         IN  VOID *Msg,
4993         IN  ULONG MsgLen,
4994         OUT PUCHAR pAddr2,
4995         OUT CHAR Ssid[],
4996         OUT UCHAR *pSsidLen);
4997
4998 BOOLEAN GetTimBit(
4999         IN  CHAR *Ptr,
5000         IN  USHORT Aid,
5001         OUT UCHAR *TimLen,
5002         OUT UCHAR *BcastFlag,
5003         OUT UCHAR *DtimCount,
5004         OUT UCHAR *DtimPeriod,
5005         OUT UCHAR *MessageToMe);
5006
5007 UCHAR ChannelSanity(
5008         IN PRTMP_ADAPTER pAd,
5009         IN UCHAR channel);
5010
5011 NDIS_802_11_NETWORK_TYPE NetworkTypeInUseSanity(
5012         IN PBSS_ENTRY pBss);
5013
5014 BOOLEAN MlmeDelBAReqSanity(
5015     IN PRTMP_ADAPTER pAd,
5016     IN VOID *Msg,
5017     IN ULONG MsgLen);
5018
5019 BOOLEAN MlmeAddBAReqSanity(
5020     IN PRTMP_ADAPTER pAd,
5021     IN VOID *Msg,
5022     IN ULONG MsgLen,
5023     OUT PUCHAR pAddr2);
5024
5025 ULONG MakeOutgoingFrame(
5026         OUT CHAR *Buffer,
5027         OUT ULONG *Length, ...);
5028
5029 VOID  LfsrInit(
5030         IN  PRTMP_ADAPTER   pAd,
5031         IN  ULONG Seed);
5032
5033 UCHAR RandomByte(
5034         IN  PRTMP_ADAPTER   pAd);
5035
5036 VOID AsicUpdateAutoFallBackTable(
5037         IN      PRTMP_ADAPTER   pAd,
5038         IN      PUCHAR                  pTxRate);
5039
5040 VOID  MlmePeriodicExec(
5041         IN PVOID SystemSpecific1,
5042         IN PVOID FunctionContext,
5043         IN PVOID SystemSpecific2,
5044         IN PVOID SystemSpecific3);
5045
5046 VOID LinkDownExec(
5047         IN PVOID SystemSpecific1,
5048         IN PVOID FunctionContext,
5049         IN PVOID SystemSpecific2,
5050         IN PVOID SystemSpecific3);
5051
5052 VOID LinkUpExec(
5053         IN PVOID SystemSpecific1,
5054         IN PVOID FunctionContext,
5055         IN PVOID SystemSpecific2,
5056         IN PVOID SystemSpecific3);
5057
5058 VOID STAMlmePeriodicExec(
5059         PRTMP_ADAPTER pAd);
5060
5061 VOID MlmeAutoScan(
5062         IN PRTMP_ADAPTER pAd);
5063
5064 VOID MlmeAutoReconnectLastSSID(
5065         IN PRTMP_ADAPTER pAd);
5066
5067 BOOLEAN MlmeValidateSSID(
5068         IN PUCHAR pSsid,
5069         IN UCHAR  SsidLen);
5070
5071 VOID MlmeCheckForRoaming(
5072         IN PRTMP_ADAPTER pAd,
5073         IN ULONG    Now32);
5074
5075 VOID MlmeCheckForFastRoaming(
5076         IN  PRTMP_ADAPTER   pAd,
5077         IN  ULONG           Now);
5078
5079 VOID MlmeDynamicTxRateSwitching(
5080         IN PRTMP_ADAPTER pAd);
5081
5082 VOID MlmeSetTxRate(
5083         IN PRTMP_ADAPTER                pAd,
5084         IN PMAC_TABLE_ENTRY             pEntry,
5085         IN PRTMP_TX_RATE_SWITCH pTxRate);
5086
5087 VOID MlmeSelectTxRateTable(
5088         IN PRTMP_ADAPTER                pAd,
5089         IN PMAC_TABLE_ENTRY             pEntry,
5090         IN PUCHAR                               *ppTable,
5091         IN PUCHAR                               pTableSize,
5092         IN PUCHAR                               pInitTxRateIdx);
5093
5094 VOID MlmeCalculateChannelQuality(
5095         IN PRTMP_ADAPTER pAd,
5096         IN ULONG Now);
5097
5098 VOID MlmeCheckPsmChange(
5099         IN PRTMP_ADAPTER pAd,
5100         IN ULONG    Now32);
5101
5102 VOID MlmeSetPsmBit(
5103         IN PRTMP_ADAPTER pAd,
5104         IN USHORT psm);
5105
5106 VOID MlmeSetTxPreamble(
5107         IN PRTMP_ADAPTER pAd,
5108         IN USHORT TxPreamble);
5109
5110 VOID UpdateBasicRateBitmap(
5111         IN      PRTMP_ADAPTER   pAd);
5112
5113 VOID MlmeUpdateTxRates(
5114         IN PRTMP_ADAPTER        pAd,
5115         IN      BOOLEAN                 bLinkUp,
5116         IN      UCHAR                   apidx);
5117
5118 #ifdef DOT11_N_SUPPORT
5119 VOID MlmeUpdateHtTxRates(
5120         IN PRTMP_ADAPTER                pAd,
5121         IN      UCHAR                           apidx);
5122 #endif // DOT11_N_SUPPORT //
5123
5124 VOID    RTMPCheckRates(
5125         IN      PRTMP_ADAPTER   pAd,
5126         IN OUT  UCHAR           SupRate[],
5127         IN OUT  UCHAR           *SupRateLen);
5128
5129 #ifdef CONFIG_STA_SUPPORT
5130 BOOLEAN RTMPCheckChannel(
5131         IN PRTMP_ADAPTER pAd,
5132         IN UCHAR                CentralChannel,
5133         IN UCHAR                Channel);
5134 #endif // CONFIG_STA_SUPPORT //
5135
5136 BOOLEAN         RTMPCheckHt(
5137         IN              PRTMP_ADAPTER   pAd,
5138         IN              UCHAR   Wcid,
5139         IN OUT  HT_CAPABILITY_IE                        *pHtCapability,
5140         IN OUT  ADD_HT_INFO_IE                  *pAddHtInfo);
5141
5142 VOID StaQuickResponeForRateUpExec(
5143         IN PVOID SystemSpecific1,
5144         IN PVOID FunctionContext,
5145         IN PVOID SystemSpecific2,
5146         IN PVOID SystemSpecific3);
5147
5148 VOID AsicBbpTuning1(
5149         IN PRTMP_ADAPTER pAd);
5150
5151 VOID AsicBbpTuning2(
5152         IN PRTMP_ADAPTER pAd);
5153
5154 VOID RTMPUpdateMlmeRate(
5155         IN PRTMP_ADAPTER        pAd);
5156
5157 CHAR RTMPMaxRssi(
5158         IN PRTMP_ADAPTER        pAd,
5159         IN CHAR                         Rssi0,
5160         IN CHAR                         Rssi1,
5161         IN CHAR                         Rssi2);
5162
5163 VOID AsicSetRxAnt(
5164         IN PRTMP_ADAPTER        pAd,
5165         IN UCHAR                        Ant);
5166
5167 VOID AsicEvaluateRxAnt(
5168         IN PRTMP_ADAPTER        pAd);
5169
5170 VOID AsicRxAntEvalTimeout(
5171         IN PVOID SystemSpecific1,
5172         IN PVOID FunctionContext,
5173         IN PVOID SystemSpecific2,
5174         IN PVOID SystemSpecific3);
5175
5176 VOID APSDPeriodicExec(
5177         IN PVOID SystemSpecific1,
5178         IN PVOID FunctionContext,
5179         IN PVOID SystemSpecific2,
5180         IN PVOID SystemSpecific3);
5181
5182 BOOLEAN RTMPCheckEntryEnableAutoRateSwitch(
5183         IN PRTMP_ADAPTER    pAd,
5184         IN PMAC_TABLE_ENTRY     pEntry);
5185
5186 UCHAR RTMPStaFixedTxMode(
5187         IN PRTMP_ADAPTER    pAd,
5188         IN PMAC_TABLE_ENTRY     pEntry);
5189
5190 VOID RTMPUpdateLegacyTxSetting(
5191                 UCHAR                           fixed_tx_mode,
5192                 PMAC_TABLE_ENTRY        pEntry);
5193
5194 BOOLEAN RTMPAutoRateSwitchCheck(
5195         IN PRTMP_ADAPTER    pAd);
5196
5197 NDIS_STATUS MlmeInit(
5198         IN  PRTMP_ADAPTER   pAd);
5199
5200 VOID MlmeHandler(
5201         IN  PRTMP_ADAPTER   pAd);
5202
5203 VOID MlmeHalt(
5204         IN  PRTMP_ADAPTER   pAd);
5205
5206 VOID MlmeResetRalinkCounters(
5207         IN  PRTMP_ADAPTER   pAd);
5208
5209 VOID BuildChannelList(
5210         IN PRTMP_ADAPTER pAd);
5211
5212 UCHAR FirstChannel(
5213         IN  PRTMP_ADAPTER   pAd);
5214
5215 UCHAR NextChannel(
5216         IN  PRTMP_ADAPTER   pAd,
5217         IN  UCHAR channel);
5218
5219 VOID ChangeToCellPowerLimit(
5220         IN PRTMP_ADAPTER pAd,
5221         IN UCHAR         AironetCellPowerLimit);
5222
5223 VOID RaiseClock(
5224         IN  PRTMP_ADAPTER   pAd,
5225         IN  UINT32 *x);
5226
5227 VOID LowerClock(
5228         IN  PRTMP_ADAPTER   pAd,
5229         IN  UINT32 *x);
5230
5231 USHORT ShiftInBits(
5232         IN  PRTMP_ADAPTER   pAd);
5233
5234 VOID ShiftOutBits(
5235         IN  PRTMP_ADAPTER   pAd,
5236         IN  USHORT data,
5237         IN  USHORT count);
5238
5239 VOID EEpromCleanup(
5240         IN  PRTMP_ADAPTER   pAd);
5241
5242 VOID EWDS(
5243         IN  PRTMP_ADAPTER   pAd);
5244
5245 VOID EWEN(
5246         IN  PRTMP_ADAPTER   pAd);
5247
5248 USHORT RTMP_EEPROM_READ16(
5249         IN  PRTMP_ADAPTER   pAd,
5250         IN  USHORT Offset);
5251
5252 VOID RTMP_EEPROM_WRITE16(
5253         IN  PRTMP_ADAPTER   pAd,
5254         IN  USHORT Offset,
5255         IN  USHORT Data);
5256
5257 //
5258 // Prototypes of function definition in rtmp_tkip.c
5259 //
5260 VOID    RTMPInitTkipEngine(
5261         IN  PRTMP_ADAPTER   pAd,
5262         IN  PUCHAR          pTKey,
5263         IN  UCHAR           KeyId,
5264         IN  PUCHAR          pTA,
5265         IN  PUCHAR          pMICKey,
5266         IN  PUCHAR          pTSC,
5267         OUT PULONG          pIV16,
5268         OUT PULONG          pIV32);
5269
5270 VOID    RTMPInitMICEngine(
5271         IN  PRTMP_ADAPTER   pAd,
5272         IN  PUCHAR          pKey,
5273         IN  PUCHAR          pDA,
5274         IN  PUCHAR          pSA,
5275         IN  UCHAR           UserPriority,
5276         IN  PUCHAR          pMICKey);
5277
5278 BOOLEAN RTMPTkipCompareMICValue(
5279         IN  PRTMP_ADAPTER   pAd,
5280         IN  PUCHAR          pSrc,
5281         IN  PUCHAR          pDA,
5282         IN  PUCHAR          pSA,
5283         IN  PUCHAR          pMICKey,
5284         IN      UCHAR                   UserPriority,
5285         IN  UINT            Len);
5286
5287 VOID    RTMPCalculateMICValue(
5288         IN  PRTMP_ADAPTER   pAd,
5289         IN  PNDIS_PACKET    pPacket,
5290         IN  PUCHAR          pEncap,
5291         IN  PCIPHER_KEY     pKey,
5292         IN      UCHAR                   apidx);
5293
5294 BOOLEAN RTMPTkipCompareMICValueWithLLC(
5295         IN  PRTMP_ADAPTER   pAd,
5296         IN  PUCHAR          pLLC,
5297         IN  PUCHAR          pSrc,
5298         IN  PUCHAR          pDA,
5299         IN  PUCHAR          pSA,
5300         IN  PUCHAR          pMICKey,
5301         IN  UINT            Len);
5302
5303 VOID    RTMPTkipAppendByte(
5304         IN  PTKIP_KEY_INFO  pTkip,
5305         IN  UCHAR           uChar);
5306
5307 VOID    RTMPTkipAppend(
5308         IN  PTKIP_KEY_INFO  pTkip,
5309         IN  PUCHAR          pSrc,
5310         IN  UINT            nBytes);
5311
5312 VOID    RTMPTkipGetMIC(
5313         IN  PTKIP_KEY_INFO  pTkip);
5314
5315 BOOLEAN RTMPSoftDecryptTKIP(
5316         IN PRTMP_ADAPTER pAd,
5317         IN PUCHAR       pData,
5318         IN ULONG        DataByteCnt,
5319         IN UCHAR    UserPriority,
5320         IN PCIPHER_KEY  pWpaKey);
5321
5322 BOOLEAN RTMPSoftDecryptAES(
5323         IN PRTMP_ADAPTER pAd,
5324         IN PUCHAR       pData,
5325         IN ULONG        DataByteCnt,
5326         IN PCIPHER_KEY  pWpaKey);
5327
5328 //
5329 // Prototypes of function definition in cmm_info.c
5330 //
5331 NDIS_STATUS RTMPWPARemoveKeyProc(
5332         IN  PRTMP_ADAPTER   pAd,
5333         IN  PVOID           pBuf);
5334
5335 VOID    RTMPWPARemoveAllKeys(
5336         IN  PRTMP_ADAPTER   pAd);
5337
5338 BOOLEAN RTMPCheckStrPrintAble(
5339     IN  CHAR *pInPutStr,
5340     IN  UCHAR strLen);
5341
5342 VOID    RTMPSetPhyMode(
5343         IN  PRTMP_ADAPTER   pAd,
5344         IN  ULONG phymode);
5345
5346 VOID    RTMPUpdateHTIE(
5347         IN      RT_HT_CAPABILITY        *pRtHt,
5348         IN              UCHAR                           *pMcsSet,
5349         OUT             HT_CAPABILITY_IE *pHtCapability,
5350         OUT             ADD_HT_INFO_IE          *pAddHtInfo);
5351
5352 VOID    RTMPAddWcidAttributeEntry(
5353         IN      PRTMP_ADAPTER   pAd,
5354         IN      UCHAR                   BssIdx,
5355         IN      UCHAR                   KeyIdx,
5356         IN      UCHAR                   CipherAlg,
5357         IN      MAC_TABLE_ENTRY *pEntry);
5358
5359 CHAR *GetEncryptType(
5360         CHAR enc);
5361
5362 CHAR *GetAuthMode(
5363         CHAR auth);
5364
5365 VOID RTMPIoctlGetSiteSurvey(
5366         IN      PRTMP_ADAPTER   pAdapter,
5367         IN      struct iwreq    *wrq);
5368
5369 VOID RTMPIoctlGetMacTable(
5370         IN PRTMP_ADAPTER pAd,
5371         IN struct iwreq *wrq);
5372
5373 VOID RTMPIndicateWPA2Status(
5374         IN  PRTMP_ADAPTER  pAdapter);
5375
5376 VOID    RTMPOPModeSwitching(
5377         IN      PRTMP_ADAPTER   pAd);
5378
5379 #ifdef CONFIG_STA_SUPPORT
5380 VOID    RTMPAddBSSIDCipher(
5381     IN  PRTMP_ADAPTER   pAd,
5382         IN      UCHAR   Aid,
5383     IN  PNDIS_802_11_KEY    pKey,
5384     IN  UCHAR   CipherAlg);
5385 #endif // CONFIG_STA_SUPPORT //
5386
5387 #ifdef DOT11_N_SUPPORT
5388 VOID    RTMPSetHT(
5389         IN      PRTMP_ADAPTER   pAd,
5390         IN      OID_SET_HT_PHYMODE *pHTPhyMode);
5391
5392 VOID    RTMPSetIndividualHT(
5393         IN      PRTMP_ADAPTER           pAd,
5394         IN      UCHAR                           apidx);
5395 #endif // DOT11_N_SUPPORT //
5396
5397 VOID RTMPSendWirelessEvent(
5398         IN      PRTMP_ADAPTER   pAd,
5399         IN      USHORT                  Event_flag,
5400         IN      PUCHAR                  pAddr,
5401         IN  UCHAR                       BssIdx,
5402         IN      CHAR                    Rssi);
5403
5404 VOID    NICUpdateCntlCounters(
5405         IN      PRTMP_ADAPTER   pAd,
5406         IN      PHEADER_802_11  pHeader,
5407         IN    UCHAR                     SubType,
5408         IN      PRXWI_STRUC     pRxWI);
5409 //
5410 // prototype in wpa.c
5411 //
5412 BOOLEAN WpaMsgTypeSubst(
5413         IN  UCHAR   EAPType,
5414         OUT INT         *MsgType);
5415
5416 VOID WpaPskStateMachineInit(
5417         IN  PRTMP_ADAPTER       pAd,
5418         IN  STATE_MACHINE       *S,
5419         OUT STATE_MACHINE_FUNC Trans[]);
5420
5421 VOID WpaEAPOLKeyAction(
5422         IN  PRTMP_ADAPTER   pAd,
5423         IN  MLME_QUEUE_ELEM *Elem);
5424
5425 VOID    WpaPairMsg1Action(
5426         IN  PRTMP_ADAPTER   pAd,
5427         IN  MLME_QUEUE_ELEM *Elem);
5428
5429 VOID    WpaPairMsg3Action(
5430         IN  PRTMP_ADAPTER   pAd,
5431         IN  MLME_QUEUE_ELEM *Elem);
5432
5433 VOID    WpaGroupMsg1Action(
5434         IN  PRTMP_ADAPTER   pAd,
5435         IN  MLME_QUEUE_ELEM *Elem);
5436
5437 VOID    WpaMacHeaderInit(
5438         IN      PRTMP_ADAPTER   pAd,
5439         IN OUT  PHEADER_802_11  pHdr80211,
5440         IN      UCHAR           wep,
5441         IN      PUCHAR          pAddr1);
5442
5443 VOID    Wpa2PairMsg1Action(
5444     IN  PRTMP_ADAPTER   pAd,
5445     IN  MLME_QUEUE_ELEM *Elem);
5446
5447 VOID    Wpa2PairMsg3Action(
5448     IN  PRTMP_ADAPTER   pAd,
5449     IN  MLME_QUEUE_ELEM *Elem);
5450
5451 BOOLEAN ParseKeyData(
5452     IN  PRTMP_ADAPTER   pAd,
5453     IN  PUCHAR          pKeyData,
5454     IN  UCHAR           KeyDataLen,
5455         IN      UCHAR                   bPairewise);
5456
5457 VOID    RTMPToWirelessSta(
5458         IN  PRTMP_ADAPTER   pAd,
5459         IN  PUCHAR          pHeader802_3,
5460     IN  UINT            HdrLen,
5461         IN  PUCHAR          pData,
5462     IN  UINT            DataLen,
5463     IN  BOOLEAN                 is4wayFrame);
5464
5465 VOID    HMAC_SHA1(
5466         IN  UCHAR   *text,
5467         IN  UINT    text_len,
5468         IN  UCHAR   *key,
5469         IN  UINT    key_len,
5470         IN  UCHAR   *digest);
5471
5472 VOID    PRF(
5473         IN  UCHAR   *key,
5474         IN  INT     key_len,
5475         IN  UCHAR   *prefix,
5476         IN  INT     prefix_len,
5477         IN  UCHAR   *data,
5478         IN  INT     data_len,
5479         OUT UCHAR   *output,
5480         IN  INT     len);
5481
5482 VOID    CCKMPRF(
5483         IN  UCHAR   *key,
5484         IN  INT     key_len,
5485         IN  UCHAR   *data,
5486         IN  INT     data_len,
5487         OUT UCHAR   *output,
5488         IN  INT     len);
5489
5490 VOID WpaCountPTK(
5491         IN  PRTMP_ADAPTER   pAd,
5492         IN  UCHAR   *PMK,
5493         IN  UCHAR   *ANonce,
5494         IN  UCHAR   *AA,
5495         IN  UCHAR   *SNonce,
5496         IN  UCHAR   *SA,
5497         OUT UCHAR   *output,
5498         IN  UINT    len);
5499
5500 VOID    GenRandom(
5501         IN  PRTMP_ADAPTER   pAd,
5502         IN      UCHAR                   *macAddr,
5503         OUT     UCHAR                   *random);
5504
5505 //
5506 // prototype in aironet.c
5507 //
5508 VOID    AironetStateMachineInit(
5509         IN  PRTMP_ADAPTER       pAd,
5510         IN  STATE_MACHINE       *S,
5511         OUT STATE_MACHINE_FUNC  Trans[]);
5512
5513 VOID    AironetMsgAction(
5514         IN  PRTMP_ADAPTER   pAd,
5515         IN  MLME_QUEUE_ELEM *Elem);
5516
5517 VOID    AironetRequestAction(
5518         IN  PRTMP_ADAPTER   pAd,
5519         IN  MLME_QUEUE_ELEM *Elem);
5520
5521 VOID    ChannelLoadRequestAction(
5522         IN  PRTMP_ADAPTER   pAd,
5523         IN  UCHAR           Index);
5524
5525 VOID    NoiseHistRequestAction(
5526         IN  PRTMP_ADAPTER   pAd,
5527         IN  UCHAR           Index);
5528
5529 VOID    BeaconRequestAction(
5530         IN  PRTMP_ADAPTER   pAd,
5531         IN  UCHAR           Index);
5532
5533 VOID    AironetReportAction(
5534         IN  PRTMP_ADAPTER   pAd,
5535         IN  MLME_QUEUE_ELEM *Elem);
5536
5537 VOID    ChannelLoadReportAction(
5538         IN  PRTMP_ADAPTER   pAd,
5539         IN  UCHAR           Index);
5540
5541 VOID    NoiseHistReportAction(
5542         IN  PRTMP_ADAPTER   pAd,
5543         IN  UCHAR           Index);
5544
5545 VOID    AironetFinalReportAction(
5546         IN  PRTMP_ADAPTER   pAd);
5547
5548 VOID    BeaconReportAction(
5549         IN  PRTMP_ADAPTER   pAd,
5550         IN  UCHAR           Index);
5551
5552 VOID    AironetAddBeaconReport(
5553         IN  PRTMP_ADAPTER       pAd,
5554         IN  ULONG               Index,
5555         IN  PMLME_QUEUE_ELEM    pElem);
5556
5557 VOID    AironetCreateBeaconReportFromBssTable(
5558         IN  PRTMP_ADAPTER       pAd);
5559
5560 VOID    DBGPRINT_TX_RING(
5561         IN PRTMP_ADAPTER  pAd,
5562         IN UCHAR          QueIdx);
5563
5564 VOID DBGPRINT_RX_RING(
5565         IN PRTMP_ADAPTER  pAd);
5566
5567 CHAR    ConvertToRssi(
5568         IN PRTMP_ADAPTER  pAd,
5569         IN CHAR                         Rssi,
5570         IN UCHAR    RssiNumber);
5571
5572
5573 #ifdef DOT11N_DRAFT3
5574 VOID BuildEffectedChannelList(
5575         IN PRTMP_ADAPTER pAd);
5576 #endif // DOT11N_DRAFT3 //
5577
5578
5579 VOID APAsicEvaluateRxAnt(
5580         IN PRTMP_ADAPTER        pAd);
5581
5582
5583 VOID APAsicRxAntEvalTimeout(
5584         IN PRTMP_ADAPTER        pAd);
5585
5586 //
5587 // function prototype in cmm_wpa.c
5588 //
5589 BOOLEAN RTMPCheckWPAframe(
5590         IN PRTMP_ADAPTER pAd,
5591         IN PMAC_TABLE_ENTRY     pEntry,
5592         IN PUCHAR                       pData,
5593         IN ULONG                        DataByteCount,
5594         IN UCHAR                        FromWhichBSSID);
5595
5596 VOID AES_GTK_KEY_UNWRAP(
5597         IN  UCHAR   *key,
5598         OUT UCHAR   *plaintext,
5599         IN      UCHAR   c_len,
5600         IN  UCHAR   *ciphertext);
5601
5602 BOOLEAN RTMPCheckRSNIE(
5603         IN  PRTMP_ADAPTER   pAd,
5604         IN  PUCHAR          pData,
5605         IN  UCHAR           DataLen,
5606         IN  MAC_TABLE_ENTRY *pEntry,
5607         OUT     UCHAR                   *Offset);
5608
5609 BOOLEAN RTMPParseEapolKeyData(
5610         IN  PRTMP_ADAPTER   pAd,
5611         IN  PUCHAR          pKeyData,
5612         IN  UCHAR           KeyDataLen,
5613         IN      UCHAR                   GroupKeyIndex,
5614         IN      UCHAR                   MsgType,
5615         IN      BOOLEAN                 bWPA2,
5616         IN  MAC_TABLE_ENTRY *pEntry);
5617
5618 VOID    ConstructEapolMsg(
5619         IN      PRTMP_ADAPTER           pAd,
5620     IN  UCHAR                           PeerAuthMode,
5621     IN  UCHAR                           PeerWepStatus,
5622     IN  UCHAR                           MyGroupKeyWepStatus,
5623     IN  UCHAR                           MsgType,
5624     IN  UCHAR                           DefaultKeyIdx,
5625     IN  UCHAR                           *ReplayCounter,
5626         IN      UCHAR                           *KeyNonce,
5627         IN      UCHAR                           *TxRSC,
5628         IN      UCHAR                           *PTK,
5629         IN      UCHAR                           *GTK,
5630         IN      UCHAR                           *RSNIE,
5631         IN      UCHAR                           RSNIE_Len,
5632     OUT PEAPOL_PACKET       pMsg);
5633
5634 VOID    CalculateMIC(
5635         IN      PRTMP_ADAPTER   pAd,
5636         IN      UCHAR                   PeerWepStatus,
5637         IN      UCHAR                   *PTK,
5638         OUT PEAPOL_PACKET   pMsg);
5639
5640 NDIS_STATUS     RTMPSoftDecryptBroadCastData(
5641         IN      PRTMP_ADAPTER                                   pAd,
5642         IN      RX_BLK                                                  *pRxBlk,
5643         IN  NDIS_802_11_ENCRYPTION_STATUS       GroupCipher,
5644         IN  PCIPHER_KEY                                         pShard_key);
5645
5646 VOID    ConstructEapolKeyData(
5647         IN      PRTMP_ADAPTER   pAd,
5648         IN      UCHAR                   PeerAuthMode,
5649         IN      UCHAR                   PeerWepStatus,
5650         IN      UCHAR                   GroupKeyWepStatus,
5651         IN      UCHAR                   MsgType,
5652         IN      UCHAR                   DefaultKeyIdx,
5653         IN      BOOLEAN                 bWPA2Capable,
5654         IN      UCHAR                   *PTK,
5655         IN      UCHAR                   *GTK,
5656         IN      UCHAR                   *RSNIE,
5657         IN      UCHAR                   RSNIE_LEN,
5658         OUT PEAPOL_PACKET   pMsg);
5659
5660 VOID RTMPMakeRSNIE(
5661         IN  PRTMP_ADAPTER   pAd,
5662         IN  UINT            AuthMode,
5663         IN  UINT            WepStatus,
5664         IN      UCHAR                   apidx);
5665
5666 //
5667 // function prototype in ap_wpa.c
5668 //
5669
5670 BOOLEAN APWpaMsgTypeSubst(
5671         IN UCHAR    EAPType,
5672         OUT INT *MsgType) ;
5673
5674 MAC_TABLE_ENTRY *PACInquiry(
5675         IN  PRTMP_ADAPTER   pAd,
5676         IN  ULONG           Wcid);
5677
5678 BOOLEAN RTMPCheckMcast(
5679         IN PRTMP_ADAPTER pAd,
5680         IN PEID_STRUCT      eid_ptr,
5681         IN MAC_TABLE_ENTRY  *pEntry);
5682
5683 BOOLEAN RTMPCheckUcast(
5684         IN PRTMP_ADAPTER pAd,
5685         IN PEID_STRUCT      eid_ptr,
5686         IN MAC_TABLE_ENTRY  *pEntry);
5687
5688 BOOLEAN RTMPCheckAUTH(
5689         IN PRTMP_ADAPTER pAd,
5690         IN PEID_STRUCT      eid_ptr,
5691         IN MAC_TABLE_ENTRY  *pEntry);
5692
5693 VOID WPAStart4WayHS(
5694         IN  PRTMP_ADAPTER   pAd,
5695         IN  MAC_TABLE_ENTRY *pEntry,
5696         IN      ULONG                   TimeInterval);
5697
5698 VOID WPAStart2WayGroupHS(
5699         IN  PRTMP_ADAPTER   pAd,
5700         IN  MAC_TABLE_ENTRY *pEntry);
5701
5702 VOID APWpaEAPPacketAction(
5703         IN PRTMP_ADAPTER pAd,
5704         IN MLME_QUEUE_ELEM *Elem);
5705
5706 VOID APWpaEAPOLStartAction(
5707         IN PRTMP_ADAPTER pAd,
5708         IN MLME_QUEUE_ELEM *Elem);
5709
5710 VOID APWpaEAPOLLogoffAction(
5711         IN PRTMP_ADAPTER pAd,
5712         IN MLME_QUEUE_ELEM *Elem);
5713
5714 VOID APWpaEAPOLKeyAction(
5715         IN PRTMP_ADAPTER pAd,
5716         IN MLME_QUEUE_ELEM *Elem);
5717
5718 VOID APWpaEAPOLASFAlertAction(
5719         IN  PRTMP_ADAPTER    pAd,
5720         IN  MLME_QUEUE_ELEM  *Elem);
5721
5722 VOID HandleCounterMeasure(
5723         IN PRTMP_ADAPTER pAd,
5724         IN MAC_TABLE_ENTRY  *pEntry);
5725
5726 VOID PeerPairMsg2Action(
5727         IN PRTMP_ADAPTER pAd,
5728         IN MAC_TABLE_ENTRY  *pEntry,
5729         IN MLME_QUEUE_ELEM *Elem);
5730
5731 VOID PeerPairMsg4Action(
5732         IN PRTMP_ADAPTER pAd,
5733         IN MAC_TABLE_ENTRY  *pEntry,
5734         IN MLME_QUEUE_ELEM *Elem);
5735
5736 VOID CMTimerExec(
5737         IN PVOID SystemSpecific1,
5738         IN PVOID FunctionContext,
5739         IN PVOID SystemSpecific2,
5740         IN PVOID SystemSpecific3);
5741
5742 VOID WPARetryExec(
5743         IN PVOID SystemSpecific1,
5744         IN PVOID FunctionContext,
5745         IN PVOID SystemSpecific2,
5746         IN PVOID SystemSpecific3);
5747
5748 VOID EnqueueStartForPSKExec(
5749     IN PVOID SystemSpecific1,
5750     IN PVOID FunctionContext,
5751     IN PVOID SystemSpecific2,
5752     IN PVOID SystemSpecific3);
5753
5754 VOID RTMPHandleSTAKey(
5755     IN PRTMP_ADAPTER    pAdapter,
5756     IN MAC_TABLE_ENTRY  *pEntry,
5757     IN MLME_QUEUE_ELEM  *Elem);
5758
5759 VOID PeerGroupMsg2Action(
5760         IN  PRTMP_ADAPTER    pAd,
5761         IN  PMAC_TABLE_ENTRY pEntry,
5762         IN  VOID             *Msg,
5763         IN  UINT             MsgLen);
5764
5765 VOID PairDisAssocAction(
5766         IN  PRTMP_ADAPTER    pAd,
5767         IN  PMAC_TABLE_ENTRY pEntry,
5768         IN  USHORT           Reason);
5769
5770 VOID MlmeDeAuthAction(
5771         IN  PRTMP_ADAPTER    pAd,
5772         IN  PMAC_TABLE_ENTRY pEntry,
5773         IN  USHORT           Reason);
5774
5775 VOID GREKEYPeriodicExec(
5776         IN  PVOID   SystemSpecific1,
5777         IN  PVOID   FunctionContext,
5778         IN  PVOID   SystemSpecific2,
5779         IN  PVOID   SystemSpecific3);
5780
5781 VOID CountGTK(
5782         IN  UCHAR   *PMK,
5783         IN  UCHAR   *GNonce,
5784         IN  UCHAR   *AA,
5785         OUT UCHAR   *output,
5786         IN  UINT    len);
5787
5788 VOID    GetSmall(
5789         IN  PVOID   pSrc1,
5790         IN  PVOID   pSrc2,
5791         OUT PUCHAR  out,
5792         IN  ULONG   Length);
5793
5794 VOID    GetLarge(
5795         IN  PVOID   pSrc1,
5796         IN  PVOID   pSrc2,
5797         OUT PUCHAR  out,
5798         IN  ULONG   Length);
5799
5800 VOID APGenRandom(
5801         IN PRTMP_ADAPTER pAd,
5802         OUT UCHAR       *random);
5803
5804 VOID AES_GTK_KEY_WRAP(
5805         IN UCHAR *key,
5806         IN UCHAR *plaintext,
5807         IN UCHAR p_len,
5808         OUT UCHAR *ciphertext);
5809
5810 VOID    WpaSend(
5811     IN  PRTMP_ADAPTER   pAdapter,
5812     IN  PUCHAR          pPacket,
5813     IN  ULONG           Len);
5814
5815 VOID    APToWirelessSta(
5816         IN  PRTMP_ADAPTER   pAd,
5817         IN  MAC_TABLE_ENTRY *pEntry,
5818         IN  PUCHAR          pHeader802_3,
5819         IN  UINT            HdrLen,
5820         IN  PUCHAR          pData,
5821         IN  UINT            DataLen,
5822     IN  BOOLEAN                 bClearFrame);
5823
5824 VOID RTMPAddPMKIDCache(
5825         IN  PRTMP_ADAPTER               pAd,
5826         IN      INT                                             apidx,
5827         IN      PUCHAR                          pAddr,
5828         IN      UCHAR                                   *PMKID,
5829         IN      UCHAR                                   *PMK);
5830
5831 INT RTMPSearchPMKIDCache(
5832         IN  PRTMP_ADAPTER   pAd,
5833         IN      INT                             apidx,
5834         IN      PUCHAR          pAddr);
5835
5836 VOID RTMPDeletePMKIDCache(
5837         IN  PRTMP_ADAPTER   pAd,
5838         IN      INT                             apidx,
5839         IN  INT                         idx);
5840
5841 VOID RTMPMaintainPMKIDCache(
5842         IN  PRTMP_ADAPTER   pAd);
5843
5844 VOID    RTMPSendTriggerFrame(
5845         IN      PRTMP_ADAPTER   pAd,
5846         IN      PVOID                   pBuffer,
5847         IN      ULONG                   Length,
5848         IN  UCHAR           TxRate,
5849         IN      BOOLEAN                 bQosNull);
5850
5851 #ifdef RT30xx
5852 VOID RTMPFilterCalibration(
5853         IN PRTMP_ADAPTER pAd);
5854 #endif // RT30xx //
5855
5856
5857 //typedef void (*TIMER_FUNCTION)(unsigned long);
5858
5859
5860 /* timeout -- ms */
5861 VOID RTMP_SetPeriodicTimer(
5862         IN      NDIS_MINIPORT_TIMER *pTimer,
5863         IN      unsigned long timeout);
5864
5865 VOID RTMP_OS_Init_Timer(
5866         IN      PRTMP_ADAPTER pAd,
5867         IN      NDIS_MINIPORT_TIMER *pTimer,
5868         IN      TIMER_FUNCTION function,
5869         IN      PVOID data);
5870
5871 VOID RTMP_OS_Add_Timer(
5872         IN      NDIS_MINIPORT_TIMER     *pTimer,
5873         IN      unsigned long timeout);
5874
5875 VOID RTMP_OS_Mod_Timer(
5876         IN      NDIS_MINIPORT_TIMER     *pTimer,
5877         IN      unsigned long timeout);
5878
5879
5880 VOID RTMP_OS_Del_Timer(
5881         IN      NDIS_MINIPORT_TIMER     *pTimer,
5882         OUT     BOOLEAN                          *pCancelled);
5883
5884
5885 VOID RTMP_OS_Release_Packet(
5886         IN      PRTMP_ADAPTER pAd,
5887         IN      PQUEUE_ENTRY  pEntry);
5888
5889 VOID RTMPusecDelay(
5890         IN      ULONG   usec);
5891
5892 NDIS_STATUS os_alloc_mem(
5893         IN      PRTMP_ADAPTER pAd,
5894         OUT     PUCHAR *mem,
5895         IN      ULONG  size);
5896
5897 NDIS_STATUS os_free_mem(
5898         IN      PRTMP_ADAPTER pAd,
5899         IN      PUCHAR mem);
5900
5901
5902 void RTMP_AllocateSharedMemory(
5903         IN      PRTMP_ADAPTER pAd,
5904         IN      ULONG   Length,
5905         IN      BOOLEAN Cached,
5906         OUT     PVOID   *VirtualAddress,
5907         OUT     PNDIS_PHYSICAL_ADDRESS PhysicalAddress);
5908
5909 VOID RTMPFreeTxRxRingMemory(
5910     IN  PRTMP_ADAPTER   pAd);
5911
5912 NDIS_STATUS AdapterBlockAllocateMemory(
5913         IN PVOID        handle,
5914         OUT     PVOID   *ppAd);
5915
5916 void RTMP_AllocateTxDescMemory(
5917         IN      PRTMP_ADAPTER pAd,
5918         IN      UINT    Index,
5919         IN      ULONG   Length,
5920         IN      BOOLEAN Cached,
5921         OUT     PVOID   *VirtualAddress,
5922         OUT     PNDIS_PHYSICAL_ADDRESS PhysicalAddress);
5923
5924 void RTMP_AllocateFirstTxBuffer(
5925         IN      PRTMP_ADAPTER pAd,
5926         IN      UINT    Index,
5927         IN      ULONG   Length,
5928         IN      BOOLEAN Cached,
5929         OUT     PVOID   *VirtualAddress,
5930         OUT     PNDIS_PHYSICAL_ADDRESS PhysicalAddress);
5931
5932 void RTMP_AllocateMgmtDescMemory(
5933         IN      PRTMP_ADAPTER pAd,
5934         IN      ULONG   Length,
5935         IN      BOOLEAN Cached,
5936         OUT     PVOID   *VirtualAddress,
5937         OUT     PNDIS_PHYSICAL_ADDRESS PhysicalAddress);
5938
5939 void RTMP_AllocateRxDescMemory(
5940         IN      PRTMP_ADAPTER pAd,
5941         IN      ULONG   Length,
5942         IN      BOOLEAN Cached,
5943         OUT     PVOID   *VirtualAddress,
5944         OUT     PNDIS_PHYSICAL_ADDRESS PhysicalAddress);
5945
5946 PNDIS_PACKET RTMP_AllocateRxPacketBuffer(
5947         IN      PRTMP_ADAPTER pAd,
5948         IN      ULONG   Length,
5949         IN      BOOLEAN Cached,
5950         OUT     PVOID   *VirtualAddress,
5951         OUT     PNDIS_PHYSICAL_ADDRESS PhysicalAddress);
5952
5953 PNDIS_PACKET RTMP_AllocateTxPacketBuffer(
5954         IN      PRTMP_ADAPTER pAd,
5955         IN      ULONG   Length,
5956         IN      BOOLEAN Cached,
5957         OUT     PVOID   *VirtualAddress);
5958
5959 PNDIS_PACKET RTMP_AllocateFragPacketBuffer(
5960         IN      PRTMP_ADAPTER pAd,
5961         IN      ULONG   Length);
5962
5963 void RTMP_QueryPacketInfo(
5964         IN  PNDIS_PACKET pPacket,
5965         OUT PACKET_INFO  *pPacketInfo,
5966         OUT PUCHAR               *pSrcBufVA,
5967         OUT     UINT             *pSrcBufLen);
5968
5969 void RTMP_QueryNextPacketInfo(
5970         IN  PNDIS_PACKET *ppPacket,
5971         OUT PACKET_INFO  *pPacketInfo,
5972         OUT PUCHAR               *pSrcBufVA,
5973         OUT     UINT             *pSrcBufLen);
5974
5975
5976 BOOLEAN RTMP_FillTxBlkInfo(
5977         IN RTMP_ADAPTER *pAd,
5978         IN TX_BLK *pTxBlk);
5979
5980
5981 PRTMP_SCATTER_GATHER_LIST
5982 rt_get_sg_list_from_packet(PNDIS_PACKET pPacket, RTMP_SCATTER_GATHER_LIST *sg);
5983
5984
5985  void announce_802_3_packet(
5986         IN      PRTMP_ADAPTER   pAd,
5987         IN      PNDIS_PACKET    pPacket);
5988
5989
5990 UINT BA_Reorder_AMSDU_Annnounce(
5991         IN      PRTMP_ADAPTER   pAd,
5992         IN      PNDIS_PACKET    pPacket);
5993
5994
5995 UINT Handle_AMSDU_Packet(
5996         IN      PRTMP_ADAPTER   pAd,
5997         IN      PUCHAR                  pData,
5998         IN      ULONG                   DataSize,
5999         IN  UCHAR                       FromWhichBSSID);
6000
6001
6002 void convert_802_11_to_802_3_packet(
6003         IN      PRTMP_ADAPTER   pAd,
6004         IN      PNDIS_PACKET    pPacket,
6005         IN      PUCHAR                  p8023hdr,
6006         IN      PUCHAR                  pData,
6007         IN      ULONG                   DataSize,
6008         IN  UCHAR                       FromWhichBSSID);
6009
6010
6011 PNET_DEV get_netdev_from_bssid(
6012         IN      PRTMP_ADAPTER   pAd,
6013         IN      UCHAR                   FromWhichBSSID);
6014
6015
6016 PNDIS_PACKET duplicate_pkt(
6017         IN      PRTMP_ADAPTER   pAd,
6018         IN      PUCHAR                  pHeader802_3,
6019     IN  UINT            HdrLen,
6020         IN      PUCHAR                  pData,
6021         IN      ULONG                   DataSize,
6022         IN      UCHAR                   FromWhichBSSID);
6023
6024
6025 PNDIS_PACKET duplicate_pkt_with_TKIP_MIC(
6026         IN      PRTMP_ADAPTER   pAd,
6027         IN      PNDIS_PACKET    pOldPkt);
6028
6029 PNDIS_PACKET duplicate_pkt_with_VLAN(
6030         IN      PRTMP_ADAPTER   pAd,
6031         IN      PUCHAR                  pHeader802_3,
6032     IN  UINT            HdrLen,
6033         IN      PUCHAR                  pData,
6034         IN      ULONG                   DataSize,
6035         IN      UCHAR                   FromWhichBSSID);
6036
6037 PNDIS_PACKET duplicate_pkt_with_WPI(
6038         IN      PRTMP_ADAPTER   pAd,
6039         IN      PNDIS_PACKET    pPacket,
6040         IN      UINT32                  ext_head_len,
6041         IN      UINT32                  ext_tail_len);
6042
6043 UCHAR VLAN_8023_Header_Copy(
6044         IN      PRTMP_ADAPTER   pAd,
6045         IN      PUCHAR                  pHeader802_3,
6046         IN      UINT            HdrLen,
6047         OUT PUCHAR                      pData,
6048         IN      UCHAR                   FromWhichBSSID);
6049
6050 #ifdef DOT11_N_SUPPORT
6051 void ba_flush_reordering_timeout_mpdus(
6052         IN PRTMP_ADAPTER        pAd,
6053         IN PBA_REC_ENTRY        pBAEntry,
6054         IN ULONG                        Now32);
6055
6056
6057 VOID BAOriSessionSetUp(
6058                         IN PRTMP_ADAPTER    pAd,
6059                         IN MAC_TABLE_ENTRY      *pEntry,
6060                         IN UCHAR                        TID,
6061                         IN USHORT                       TimeOut,
6062                         IN ULONG                        DelayTime,
6063                         IN BOOLEAN              isForced);
6064
6065 VOID BASessionTearDownALL(
6066         IN OUT  PRTMP_ADAPTER pAd,
6067         IN              UCHAR Wcid);
6068 #endif // DOT11_N_SUPPORT //
6069
6070 BOOLEAN OS_Need_Clone_Packet(void);
6071
6072
6073 VOID build_tx_packet(
6074         IN      PRTMP_ADAPTER   pAd,
6075         IN      PNDIS_PACKET    pPacket,
6076         IN      PUCHAR  pFrame,
6077         IN      ULONG   FrameLen);
6078
6079
6080 VOID BAOriSessionTearDown(
6081         IN OUT  PRTMP_ADAPTER   pAd,
6082         IN              UCHAR                   Wcid,
6083         IN              UCHAR                   TID,
6084         IN              BOOLEAN                 bPassive,
6085         IN              BOOLEAN                 bForceSend);
6086
6087 VOID BARecSessionTearDown(
6088         IN OUT  PRTMP_ADAPTER   pAd,
6089         IN              UCHAR                   Wcid,
6090         IN              UCHAR                   TID,
6091         IN              BOOLEAN                 bPassive);
6092
6093 BOOLEAN ba_reordering_resource_init(PRTMP_ADAPTER pAd, int num);
6094 void ba_reordering_resource_release(PRTMP_ADAPTER pAd);
6095
6096 ULONG AutoChBssInsertEntry(
6097         IN PRTMP_ADAPTER pAd,
6098         IN PUCHAR pBssid,
6099         IN CHAR Ssid[],
6100         IN UCHAR SsidLen,
6101         IN UCHAR ChannelNo,
6102         IN CHAR Rssi);
6103
6104 void AutoChBssTableInit(
6105         IN PRTMP_ADAPTER pAd);
6106
6107 void ChannelInfoInit(
6108         IN PRTMP_ADAPTER pAd);
6109
6110 void AutoChBssTableDestroy(
6111         IN PRTMP_ADAPTER pAd);
6112
6113 void ChannelInfoDestroy(
6114         IN PRTMP_ADAPTER pAd);
6115
6116 UCHAR New_ApAutoSelectChannel(
6117         IN PRTMP_ADAPTER pAd);
6118
6119 BOOLEAN rtstrmactohex(
6120         IN char *s1,
6121         IN char *s2);
6122
6123 BOOLEAN rtstrcasecmp(
6124         IN char *s1,
6125         IN char *s2);
6126
6127 char *rtstrstruncasecmp(
6128         IN char *s1,
6129         IN char *s2);
6130
6131 char    *rtstrstr(
6132         IN      const char * s1,
6133         IN      const char * s2);
6134
6135 char *rstrtok(
6136         IN char * s,
6137         IN const char * ct);
6138
6139 int rtinet_aton(
6140         const char *cp,
6141         unsigned int *addr);
6142
6143 ////////// common ioctl functions //////////
6144 INT Set_DriverVersion_Proc(
6145         IN      PRTMP_ADAPTER   pAd,
6146         IN      PUCHAR                  arg);
6147
6148 INT Set_CountryRegion_Proc(
6149         IN      PRTMP_ADAPTER   pAd,
6150         IN      PUCHAR                  arg);
6151
6152 INT Set_CountryRegionABand_Proc(
6153         IN      PRTMP_ADAPTER   pAd,
6154         IN      PUCHAR                  arg);
6155
6156 INT Set_WirelessMode_Proc(
6157         IN      PRTMP_ADAPTER   pAd,
6158         IN      PUCHAR                  arg);
6159
6160 INT Set_Channel_Proc(
6161         IN      PRTMP_ADAPTER   pAd,
6162         IN      PUCHAR                  arg);
6163
6164 INT     Set_ShortSlot_Proc(
6165         IN      PRTMP_ADAPTER   pAd,
6166         IN      PUCHAR                  arg);
6167
6168 INT     Set_TxPower_Proc(
6169         IN      PRTMP_ADAPTER   pAd,
6170         IN      PUCHAR                  arg);
6171
6172 INT Set_BGProtection_Proc(
6173         IN  PRTMP_ADAPTER               pAd,
6174         IN  PUCHAR                      arg);
6175
6176 INT Set_TxPreamble_Proc(
6177         IN  PRTMP_ADAPTER               pAd,
6178         IN  PUCHAR                      arg);
6179
6180 INT Set_RTSThreshold_Proc(
6181         IN  PRTMP_ADAPTER               pAd,
6182         IN  PUCHAR                      arg);
6183
6184 INT Set_FragThreshold_Proc(
6185         IN  PRTMP_ADAPTER               pAd,
6186         IN  PUCHAR                      arg);
6187
6188 INT Set_TxBurst_Proc(
6189         IN  PRTMP_ADAPTER               pAd,
6190         IN  PUCHAR                      arg);
6191
6192 #ifdef AGGREGATION_SUPPORT
6193 INT     Set_PktAggregate_Proc(
6194         IN  PRTMP_ADAPTER               pAd,
6195         IN  PUCHAR                      arg);
6196 #endif
6197
6198 INT     Set_IEEE80211H_Proc(
6199         IN      PRTMP_ADAPTER   pAd,
6200         IN      PUCHAR                  arg);
6201
6202 #ifdef DBG
6203 INT     Set_Debug_Proc(
6204         IN      PRTMP_ADAPTER   pAd,
6205         IN      PUCHAR                  arg);
6206 #endif
6207
6208 INT     Show_DescInfo_Proc(
6209         IN      PRTMP_ADAPTER   pAd,
6210         IN      PUCHAR                  arg);
6211
6212 INT     Set_ResetStatCounter_Proc(
6213         IN      PRTMP_ADAPTER   pAd,
6214         IN      PUCHAR                  arg);
6215
6216 #ifdef DOT11_N_SUPPORT
6217 INT     Set_BASetup_Proc(
6218         IN      PRTMP_ADAPTER   pAd,
6219         IN      PUCHAR                  arg);
6220
6221 INT     Set_BADecline_Proc(
6222         IN      PRTMP_ADAPTER   pAd,
6223         IN      PUCHAR                  arg);
6224
6225 INT     Set_BAOriTearDown_Proc(
6226         IN      PRTMP_ADAPTER   pAd,
6227         IN      PUCHAR                  arg);
6228
6229 INT     Set_BARecTearDown_Proc(
6230         IN      PRTMP_ADAPTER   pAd,
6231         IN      PUCHAR                  arg);
6232
6233 INT     Set_HtBw_Proc(
6234         IN      PRTMP_ADAPTER   pAd,
6235         IN      PUCHAR                  arg);
6236
6237 INT     Set_HtMcs_Proc(
6238         IN      PRTMP_ADAPTER   pAd,
6239         IN      PUCHAR                  arg);
6240
6241 INT     Set_HtGi_Proc(
6242         IN      PRTMP_ADAPTER   pAd,
6243         IN      PUCHAR                  arg);
6244
6245 INT     Set_HtOpMode_Proc(
6246         IN      PRTMP_ADAPTER   pAd,
6247         IN      PUCHAR                  arg);
6248
6249 INT     Set_HtStbc_Proc(
6250         IN      PRTMP_ADAPTER   pAd,
6251         IN      PUCHAR                  arg);
6252
6253 INT     Set_HtHtc_Proc(
6254         IN      PRTMP_ADAPTER   pAd,
6255         IN      PUCHAR                  arg);
6256
6257 INT     Set_HtExtcha_Proc(
6258         IN      PRTMP_ADAPTER   pAd,
6259         IN      PUCHAR                  arg);
6260
6261 INT     Set_HtMpduDensity_Proc(
6262         IN      PRTMP_ADAPTER   pAd,
6263         IN      PUCHAR                  arg);
6264
6265 INT     Set_HtBaWinSize_Proc(
6266         IN      PRTMP_ADAPTER   pAd,
6267         IN      PUCHAR                  arg);
6268
6269 INT     Set_HtRdg_Proc(
6270         IN      PRTMP_ADAPTER   pAd,
6271         IN      PUCHAR                  arg);
6272
6273 INT     Set_HtLinkAdapt_Proc(
6274         IN      PRTMP_ADAPTER   pAd,
6275         IN      PUCHAR                  arg);
6276
6277 INT     Set_HtAmsdu_Proc(
6278         IN      PRTMP_ADAPTER   pAd,
6279         IN      PUCHAR                  arg);
6280
6281 INT     Set_HtAutoBa_Proc(
6282         IN      PRTMP_ADAPTER   pAd,
6283         IN      PUCHAR                  arg);
6284
6285 INT     Set_HtProtect_Proc(
6286         IN      PRTMP_ADAPTER   pAd,
6287         IN      PUCHAR                  arg);
6288
6289 INT     Set_HtMimoPs_Proc(
6290         IN      PRTMP_ADAPTER   pAd,
6291         IN      PUCHAR                  arg);
6292
6293
6294 INT     Set_ForceShortGI_Proc(
6295         IN      PRTMP_ADAPTER   pAd,
6296         IN      PUCHAR                  arg);
6297
6298 INT     Set_ForceGF_Proc(
6299         IN      PRTMP_ADAPTER   pAd,
6300         IN      PUCHAR                  arg);
6301
6302 INT     SetCommonHT(
6303         IN      PRTMP_ADAPTER   pAd);
6304
6305 INT     Set_SendPSMPAction_Proc(
6306         IN      PRTMP_ADAPTER   pAd,
6307         IN      PUCHAR                  arg);
6308
6309 INT     Set_HtMIMOPSmode_Proc(
6310         IN      PRTMP_ADAPTER   pAd,
6311         IN      PUCHAR                  arg);
6312
6313
6314 INT     Set_HtTxBASize_Proc(
6315         IN      PRTMP_ADAPTER   pAd,
6316         IN      PUCHAR                  arg);
6317 #endif // DOT11_N_SUPPORT //
6318
6319
6320
6321 #ifdef CONFIG_STA_SUPPORT
6322 //Dls , kathy
6323 VOID RTMPSendDLSTearDownFrame(
6324         IN      PRTMP_ADAPTER   pAd,
6325         IN      PUCHAR                  pDA);
6326
6327 #ifdef DOT11_N_SUPPORT
6328 //Block ACK
6329 VOID QueryBATABLE(
6330         IN  PRTMP_ADAPTER pAd,
6331         OUT PQUERYBA_TABLE pBAT);
6332 #endif // DOT11_N_SUPPORT //
6333
6334 #ifdef WPA_SUPPLICANT_SUPPORT
6335 INT         WpaCheckEapCode(
6336         IN  PRTMP_ADAPTER       pAd,
6337         IN  PUCHAR                              pFrame,
6338         IN  USHORT                              FrameLen,
6339         IN  USHORT                              OffSet);
6340
6341 VOID    WpaSendMicFailureToWpaSupplicant(
6342     IN  PRTMP_ADAPTER       pAd,
6343     IN  BOOLEAN             bUnicast);
6344
6345 VOID    SendAssocIEsToWpaSupplicant(
6346     IN  PRTMP_ADAPTER       pAd);
6347 #endif // WPA_SUPPLICANT_SUPPORT //
6348
6349 #ifdef NATIVE_WPA_SUPPLICANT_SUPPORT
6350 int wext_notify_event_assoc(
6351         IN  RTMP_ADAPTER *pAd);
6352 #endif // NATIVE_WPA_SUPPLICANT_SUPPORT //
6353
6354 #endif // CONFIG_STA_SUPPORT //
6355
6356
6357
6358 #ifdef DOT11_N_SUPPORT
6359 VOID Handle_BSS_Width_Trigger_Events(
6360         IN PRTMP_ADAPTER pAd);
6361
6362 void build_ext_channel_switch_ie(
6363         IN PRTMP_ADAPTER pAd,
6364         IN HT_EXT_CHANNEL_SWITCH_ANNOUNCEMENT_IE *pIE);
6365 #endif // DOT11_N_SUPPORT //
6366
6367
6368 BOOLEAN APRxDoneInterruptHandle(
6369         IN      PRTMP_ADAPTER   pAd);
6370
6371 BOOLEAN STARxDoneInterruptHandle(
6372         IN      PRTMP_ADAPTER   pAd,
6373         IN      BOOLEAN                 argc);
6374
6375 #ifdef DOT11_N_SUPPORT
6376 // AMPDU packet indication
6377 VOID Indicate_AMPDU_Packet(
6378         IN      PRTMP_ADAPTER   pAd,
6379         IN      RX_BLK                  *pRxBlk,
6380         IN      UCHAR                   FromWhichBSSID);
6381
6382 // AMSDU packet indication
6383 VOID Indicate_AMSDU_Packet(
6384         IN      PRTMP_ADAPTER   pAd,
6385         IN      RX_BLK                  *pRxBlk,
6386         IN      UCHAR                   FromWhichBSSID);
6387 #endif // DOT11_N_SUPPORT //
6388
6389 // Normal legacy Rx packet indication
6390 VOID Indicate_Legacy_Packet(
6391         IN      PRTMP_ADAPTER   pAd,
6392         IN      RX_BLK                  *pRxBlk,
6393         IN      UCHAR                   FromWhichBSSID);
6394
6395 VOID Indicate_EAPOL_Packet(
6396         IN      PRTMP_ADAPTER   pAd,
6397         IN      RX_BLK                  *pRxBlk,
6398         IN      UCHAR                   FromWhichBSSID);
6399
6400 void  update_os_packet_info(
6401         IN      PRTMP_ADAPTER   pAd,
6402         IN      RX_BLK                  *pRxBlk,
6403         IN      UCHAR                   FromWhichBSSID);
6404
6405 void wlan_802_11_to_802_3_packet(
6406         IN      PRTMP_ADAPTER   pAd,
6407         IN      RX_BLK                  *pRxBlk,
6408         IN      PUCHAR                  pHeader802_3,
6409         IN  UCHAR                       FromWhichBSSID);
6410
6411 UINT deaggregate_AMSDU_announce(
6412         IN      PRTMP_ADAPTER   pAd,
6413         PNDIS_PACKET            pPacket,
6414         IN      PUCHAR                  pData,
6415         IN      ULONG                   DataSize);
6416
6417
6418 #ifdef CONFIG_STA_SUPPORT
6419 // remove LLC and get 802_3 Header
6420 #define  RTMP_802_11_REMOVE_LLC_AND_CONVERT_TO_802_3(_pRxBlk, _pHeader802_3)    \
6421 {                                                                                                                                                               \
6422         PUCHAR _pRemovedLLCSNAP = NULL, _pDA, _pSA;                                 \
6423                                                                                                                                                                 \
6424         if (RX_BLK_TEST_FLAG(_pRxBlk, fRX_MESH))                                    \
6425         {                                                                           \
6426                 _pDA = _pRxBlk->pHeader->Addr3;                                         \
6427                 _pSA = (PUCHAR)_pRxBlk->pHeader + sizeof(HEADER_802_11);                \
6428         }                                                                           \
6429         else                                                                        \
6430         {                                                                           \
6431                 if (RX_BLK_TEST_FLAG(_pRxBlk, fRX_INFRA))                               \
6432                 {                                                                       \
6433                         _pDA = _pRxBlk->pHeader->Addr1;                                     \
6434                 if (RX_BLK_TEST_FLAG(_pRxBlk, fRX_DLS))                                                                 \
6435                         _pSA = _pRxBlk->pHeader->Addr2;                                                                         \
6436                 else                                                                                                                                    \
6437                         _pSA = _pRxBlk->pHeader->Addr3;                                     \
6438                 }                                                                       \
6439                 else                                                                    \
6440                 {                                                                       \
6441                         _pDA = _pRxBlk->pHeader->Addr1;                                     \
6442                         _pSA = _pRxBlk->pHeader->Addr2;                                     \
6443                 }                                                                       \
6444         }                                                                           \
6445                                                                                                                                                                 \
6446         CONVERT_TO_802_3(_pHeader802_3, _pDA, _pSA, _pRxBlk->pData,                             \
6447                 _pRxBlk->DataSize, _pRemovedLLCSNAP);                                   \
6448 }
6449 #endif // CONFIG_STA_SUPPORT //
6450
6451
6452 BOOLEAN APFowardWirelessStaToWirelessSta(
6453         IN      PRTMP_ADAPTER   pAd,
6454         IN      PNDIS_PACKET    pPacket,
6455         IN      ULONG                   FromWhichBSSID);
6456
6457 VOID Announce_or_Forward_802_3_Packet(
6458         IN      PRTMP_ADAPTER   pAd,
6459         IN      PNDIS_PACKET    pPacket,
6460         IN      UCHAR                   FromWhichBSSID);
6461
6462 VOID Sta_Announce_or_Forward_802_3_Packet(
6463         IN      PRTMP_ADAPTER   pAd,
6464         IN      PNDIS_PACKET    pPacket,
6465         IN      UCHAR                   FromWhichBSSID);
6466
6467
6468 #ifdef CONFIG_STA_SUPPORT
6469 #define ANNOUNCE_OR_FORWARD_802_3_PACKET(_pAd, _pPacket, _FromWhichBSS)\
6470                         Sta_Announce_or_Forward_802_3_Packet(_pAd, _pPacket, _FromWhichBSS);
6471                         //announce_802_3_packet(_pAd, _pPacket);
6472 #endif // CONFIG_STA_SUPPORT //
6473
6474
6475 PNDIS_PACKET DuplicatePacket(
6476         IN      PRTMP_ADAPTER   pAd,
6477         IN      PNDIS_PACKET    pPacket,
6478         IN      UCHAR                   FromWhichBSSID);
6479
6480
6481 PNDIS_PACKET ClonePacket(
6482         IN      PRTMP_ADAPTER   pAd,
6483         IN      PNDIS_PACKET    pPacket,
6484         IN      PUCHAR                  pData,
6485         IN      ULONG                   DataSize);
6486
6487
6488 // Normal, AMPDU or AMSDU
6489 VOID CmmRxnonRalinkFrameIndicate(
6490         IN      PRTMP_ADAPTER   pAd,
6491         IN      RX_BLK                  *pRxBlk,
6492         IN      UCHAR                   FromWhichBSSID);
6493
6494 VOID CmmRxRalinkFrameIndicate(
6495         IN      PRTMP_ADAPTER   pAd,
6496         IN      MAC_TABLE_ENTRY *pEntry,
6497         IN      RX_BLK                  *pRxBlk,
6498         IN      UCHAR                   FromWhichBSSID);
6499
6500 VOID Update_Rssi_Sample(
6501         IN PRTMP_ADAPTER        pAd,
6502         IN RSSI_SAMPLE          *pRssi,
6503         IN PRXWI_STRUC          pRxWI);
6504
6505 PNDIS_PACKET GetPacketFromRxRing(
6506         IN              PRTMP_ADAPTER   pAd,
6507         OUT             PRT28XX_RXD_STRUC               pSaveRxD,
6508         OUT             BOOLEAN                 *pbReschedule,
6509         IN OUT  UINT32                  *pRxPending);
6510
6511 PNDIS_PACKET RTMPDeFragmentDataFrame(
6512         IN      PRTMP_ADAPTER   pAd,
6513         IN      RX_BLK                  *pRxBlk);
6514
6515 ////////////////////////////////////////
6516
6517 #ifdef CONFIG_STA_SUPPORT
6518 enum {
6519         DIDmsg_lnxind_wlansniffrm               = 0x00000044,
6520         DIDmsg_lnxind_wlansniffrm_hosttime      = 0x00010044,
6521         DIDmsg_lnxind_wlansniffrm_mactime       = 0x00020044,
6522         DIDmsg_lnxind_wlansniffrm_channel       = 0x00030044,
6523         DIDmsg_lnxind_wlansniffrm_rssi          = 0x00040044,
6524         DIDmsg_lnxind_wlansniffrm_sq            = 0x00050044,
6525         DIDmsg_lnxind_wlansniffrm_signal        = 0x00060044,
6526         DIDmsg_lnxind_wlansniffrm_noise         = 0x00070044,
6527         DIDmsg_lnxind_wlansniffrm_rate          = 0x00080044,
6528         DIDmsg_lnxind_wlansniffrm_istx          = 0x00090044,
6529         DIDmsg_lnxind_wlansniffrm_frmlen        = 0x000A0044
6530 };
6531 enum {
6532         P80211ENUM_msgitem_status_no_value      = 0x00
6533 };
6534 enum {
6535         P80211ENUM_truth_false                  = 0x00,
6536         P80211ENUM_truth_true                   = 0x01
6537 };
6538
6539 /* Definition from madwifi */
6540 typedef struct {
6541         UINT32 did;
6542         UINT16 status;
6543         UINT16 len;
6544         UINT32 data;
6545 } p80211item_uint32_t;
6546
6547 typedef struct {
6548         UINT32 msgcode;
6549         UINT32 msglen;
6550 #define WLAN_DEVNAMELEN_MAX 16
6551         UINT8 devname[WLAN_DEVNAMELEN_MAX];
6552         p80211item_uint32_t hosttime;
6553         p80211item_uint32_t mactime;
6554         p80211item_uint32_t channel;
6555         p80211item_uint32_t rssi;
6556         p80211item_uint32_t sq;
6557         p80211item_uint32_t signal;
6558         p80211item_uint32_t noise;
6559         p80211item_uint32_t rate;
6560         p80211item_uint32_t istx;
6561         p80211item_uint32_t frmlen;
6562 } wlan_ng_prism2_header;
6563
6564 /* The radio capture header precedes the 802.11 header. */
6565 typedef struct PACKED _ieee80211_radiotap_header {
6566     UINT8       it_version;     /* Version 0. Only increases
6567                                  * for drastic changes,
6568                                  * introduction of compatible
6569                                  * new fields does not count.
6570                                  */
6571     UINT8       it_pad;
6572     UINT16     it_len;         /* length of the whole
6573                                  * header in bytes, including
6574                                  * it_version, it_pad,
6575                                  * it_len, and data fields.
6576                                  */
6577     UINT32   it_present;        /* A bitmap telling which
6578                                          * fields are present. Set bit 31
6579                                          * (0x80000000) to extend the
6580                                          * bitmap by another 32 bits.
6581                                          * Additional extensions are made
6582                                          * by setting bit 31.
6583                                          */
6584 }ieee80211_radiotap_header ;
6585
6586 enum ieee80211_radiotap_type {
6587     IEEE80211_RADIOTAP_TSFT = 0,
6588     IEEE80211_RADIOTAP_FLAGS = 1,
6589     IEEE80211_RADIOTAP_RATE = 2,
6590     IEEE80211_RADIOTAP_CHANNEL = 3,
6591     IEEE80211_RADIOTAP_FHSS = 4,
6592     IEEE80211_RADIOTAP_DBM_ANTSIGNAL = 5,
6593     IEEE80211_RADIOTAP_DBM_ANTNOISE = 6,
6594     IEEE80211_RADIOTAP_LOCK_QUALITY = 7,
6595     IEEE80211_RADIOTAP_TX_ATTENUATION = 8,
6596     IEEE80211_RADIOTAP_DB_TX_ATTENUATION = 9,
6597     IEEE80211_RADIOTAP_DBM_TX_POWER = 10,
6598     IEEE80211_RADIOTAP_ANTENNA = 11,
6599     IEEE80211_RADIOTAP_DB_ANTSIGNAL = 12,
6600     IEEE80211_RADIOTAP_DB_ANTNOISE = 13
6601 };
6602
6603 #define WLAN_RADIOTAP_PRESENT (                 \
6604         (1 << IEEE80211_RADIOTAP_TSFT)  |       \
6605         (1 << IEEE80211_RADIOTAP_FLAGS) |       \
6606         (1 << IEEE80211_RADIOTAP_RATE)  |       \
6607          0)
6608
6609 typedef struct _wlan_radiotap_header {
6610         ieee80211_radiotap_header wt_ihdr;
6611         INT64 wt_tsft;
6612         UINT8 wt_flags;
6613         UINT8 wt_rate;
6614 } wlan_radiotap_header;
6615 /* Definition from madwifi */
6616
6617 void send_monitor_packets(
6618         IN      PRTMP_ADAPTER   pAd,
6619         IN      RX_BLK                  *pRxBlk);
6620
6621 #if WIRELESS_EXT >= 12
6622 // This function will be called when query /proc
6623 struct iw_statistics *rt28xx_get_wireless_stats(
6624     IN struct net_device *net_dev);
6625 #endif
6626
6627 VOID    RTMPSetDesiredRates(
6628     IN  PRTMP_ADAPTER   pAdapter,
6629     IN  LONG            Rates);
6630 #endif // CONFIG_STA_SUPPORT //
6631
6632 INT     Set_FixedTxMode_Proc(
6633         IN      PRTMP_ADAPTER   pAd,
6634         IN      PUCHAR                  arg);
6635
6636 static inline char* GetPhyMode(
6637         int Mode)
6638 {
6639         switch(Mode)
6640         {
6641                 case MODE_CCK:
6642                         return "CCK";
6643
6644                 case MODE_OFDM:
6645                         return "OFDM";
6646 #ifdef DOT11_N_SUPPORT
6647                 case MODE_HTMIX:
6648                         return "HTMIX";
6649
6650                 case MODE_HTGREENFIELD:
6651                         return "GREEN";
6652 #endif // DOT11_N_SUPPORT //
6653                 default:
6654                         return "N/A";
6655         }
6656 }
6657
6658
6659 static inline char* GetBW(
6660         int BW)
6661 {
6662         switch(BW)
6663         {
6664                 case BW_10:
6665                         return "10M";
6666
6667                 case BW_20:
6668                         return "20M";
6669 #ifdef DOT11_N_SUPPORT
6670                 case BW_40:
6671                         return "40M";
6672 #endif // DOT11_N_SUPPORT //
6673                 default:
6674                         return "N/A";
6675         }
6676 }
6677
6678
6679 VOID RT28xxThreadTerminate(
6680         IN RTMP_ADAPTER *pAd);
6681
6682 BOOLEAN RT28XXChipsetCheck(
6683         IN void *_dev_p);
6684
6685 BOOLEAN RT28XXNetDevInit(
6686         IN void                                 *_dev_p,
6687         IN struct  net_device   *net_dev,
6688         IN RTMP_ADAPTER                 *pAd);
6689
6690 BOOLEAN RT28XXProbePostConfig(
6691         IN void                                 *_dev_p,
6692         IN RTMP_ADAPTER                 *pAd,
6693         IN INT32                                argc);
6694
6695 VOID RT28XXDMADisable(
6696         IN RTMP_ADAPTER                 *pAd);
6697
6698 VOID RT28XXDMAEnable(
6699         IN RTMP_ADAPTER                 *pAd);
6700
6701 VOID RT28xx_UpdateBeaconToAsic(
6702         IN RTMP_ADAPTER * pAd,
6703         IN INT apidx,
6704         IN ULONG BeaconLen,
6705         IN ULONG UpdatePos);
6706
6707 INT rt28xx_ioctl(
6708         IN      struct net_device       *net_dev,
6709         IN      OUT     struct ifreq    *rq,
6710         IN      INT                     cmd);
6711
6712
6713 #ifdef CONFIG_STA_SUPPORT
6714 INT rt28xx_sta_ioctl(
6715         IN      struct net_device       *net_dev,
6716         IN      OUT     struct ifreq    *rq,
6717         IN      INT                     cmd);
6718 #endif // CONFIG_STA_SUPPORT //
6719
6720 BOOLEAN RT28XXSecurityKeyAdd(
6721         IN              PRTMP_ADAPTER           pAd,
6722         IN              ULONG                           apidx,
6723         IN              ULONG                           KeyIdx,
6724         IN              MAC_TABLE_ENTRY         *pEntry);
6725
6726 ////////////////////////////////////////
6727 PNDIS_PACKET GetPacketFromRxRing(
6728         IN              PRTMP_ADAPTER   pAd,
6729         OUT             PRT28XX_RXD_STRUC       pSaveRxD,
6730         OUT             BOOLEAN                 *pbReschedule,
6731         IN OUT  UINT32                  *pRxPending);
6732
6733
6734 void kill_thread_task(PRTMP_ADAPTER pAd);
6735
6736 void tbtt_tasklet(unsigned long data);
6737
6738
6739 VOID AsicTurnOffRFClk(
6740         IN PRTMP_ADAPTER    pAd,
6741         IN      UCHAR           Channel);
6742
6743 VOID AsicTurnOnRFClk(
6744         IN PRTMP_ADAPTER        pAd,
6745         IN      UCHAR                   Channel);
6746
6747 #ifdef RT30xx
6748 NTSTATUS RT30xxWriteRFRegister(
6749         IN      PRTMP_ADAPTER   pAd,
6750         IN      UCHAR                   RegID,
6751         IN      UCHAR                   Value);
6752
6753 NTSTATUS RT30xxReadRFRegister(
6754         IN      PRTMP_ADAPTER   pAd,
6755         IN      UCHAR                   RegID,
6756         IN      PUCHAR                  pValue);
6757
6758 //2008/09/11:KH add to support efuse<--
6759 UCHAR eFuseReadRegisters(
6760         IN      PRTMP_ADAPTER   pAd,
6761         IN      USHORT Offset,
6762         IN      USHORT Length,
6763         OUT     USHORT* pData);
6764
6765 VOID eFuseReadPhysical(
6766         IN      PRTMP_ADAPTER   pAd,
6767         IN      PUSHORT lpInBuffer,
6768         IN      ULONG nInBufferSize,
6769         OUT     PUSHORT lpOutBuffer,
6770         IN      ULONG nOutBufferSize
6771 );
6772
6773 NTSTATUS eFuseRead(
6774         IN      PRTMP_ADAPTER   pAd,
6775         IN      USHORT                  Offset,
6776         OUT     PUCHAR                  pData,
6777         IN      USHORT                  Length);
6778
6779 VOID eFusePhysicalWriteRegisters(
6780         IN      PRTMP_ADAPTER   pAd,
6781         IN      USHORT Offset,
6782         IN      USHORT Length,
6783         OUT     USHORT* pData);
6784
6785 NTSTATUS eFuseWriteRegisters(
6786         IN      PRTMP_ADAPTER   pAd,
6787         IN      USHORT Offset,
6788         IN      USHORT Length,
6789         IN      USHORT* pData);
6790
6791 VOID eFuseWritePhysical(
6792         IN      PRTMP_ADAPTER   pAd,
6793         PUSHORT lpInBuffer,
6794         ULONG nInBufferSize,
6795         PUCHAR lpOutBuffer,
6796         ULONG nOutBufferSize
6797 );
6798
6799 NTSTATUS eFuseWrite(
6800         IN      PRTMP_ADAPTER   pAd,
6801         IN      USHORT                  Offset,
6802         IN      PUCHAR                  pData,
6803         IN      USHORT                  length);
6804
6805 INT set_eFuseGetFreeBlockCount_Proc(
6806         IN      PRTMP_ADAPTER   pAd,
6807         IN      PUCHAR                  arg);
6808
6809 INT set_eFusedump_Proc(
6810         IN      PRTMP_ADAPTER   pAd,
6811         IN      PUCHAR                  arg);
6812
6813 INT set_eFuseLoadFromBin_Proc(
6814         IN      PRTMP_ADAPTER   pAd,
6815         IN      PUCHAR                  arg);
6816
6817 NTSTATUS eFuseWriteRegistersFromBin(
6818         IN      PRTMP_ADAPTER   pAd,
6819         IN      USHORT Offset,
6820         IN      USHORT Length,
6821         IN      USHORT* pData);
6822
6823 VOID eFusePhysicalReadRegisters(
6824         IN      PRTMP_ADAPTER   pAd,
6825         IN      USHORT Offset,
6826         IN      USHORT Length,
6827         OUT     USHORT* pData);
6828
6829 NDIS_STATUS NICLoadEEPROM(
6830         IN PRTMP_ADAPTER pAd);
6831
6832 BOOLEAN bNeedLoadEEPROM(
6833         IN      PRTMP_ADAPTER   pAd);
6834 //2008/09/11:KH add to support efuse-->
6835 #endif // RT30xx //
6836
6837 #ifdef RT30xx
6838 // add by johnli, RF power sequence setup
6839 VOID RT30xxLoadRFNormalModeSetup(
6840         IN PRTMP_ADAPTER        pAd);
6841
6842 VOID RT30xxLoadRFSleepModeSetup(
6843         IN PRTMP_ADAPTER        pAd);
6844
6845 VOID RT30xxReverseRFSleepModeSetup(
6846         IN PRTMP_ADAPTER        pAd);
6847 // end johnli
6848 #endif // RT30xx //
6849
6850 #ifdef RT2870
6851 //
6852 // Function Prototype in rtusb_bulk.c
6853 //
6854 VOID    RTUSBInitTxDesc(
6855         IN      PRTMP_ADAPTER   pAd,
6856         IN      PTX_CONTEXT             pTxContext,
6857         IN      UCHAR                   BulkOutPipeId,
6858         IN      usb_complete_t  Func);
6859
6860 VOID    RTUSBInitHTTxDesc(
6861         IN      PRTMP_ADAPTER   pAd,
6862         IN      PHT_TX_CONTEXT  pTxContext,
6863         IN      UCHAR                   BulkOutPipeId,
6864         IN      ULONG                   BulkOutSize,
6865         IN      usb_complete_t  Func);
6866
6867 VOID    RTUSBInitRxDesc(
6868         IN      PRTMP_ADAPTER   pAd,
6869         IN      PRX_CONTEXT             pRxContext);
6870
6871 VOID RTUSBCleanUpDataBulkOutQueue(
6872         IN      PRTMP_ADAPTER   pAd);
6873
6874 VOID RTUSBCancelPendingBulkOutIRP(
6875         IN      PRTMP_ADAPTER   pAd);
6876
6877 VOID RTUSBBulkOutDataPacket(
6878         IN      PRTMP_ADAPTER   pAd,
6879         IN      UCHAR                   BulkOutPipeId,
6880         IN      UCHAR                   Index);
6881
6882 VOID RTUSBBulkOutNullFrame(
6883         IN      PRTMP_ADAPTER   pAd);
6884
6885 VOID RTUSBBulkOutRTSFrame(
6886         IN      PRTMP_ADAPTER   pAd);
6887
6888 VOID RTUSBCancelPendingBulkInIRP(
6889         IN      PRTMP_ADAPTER   pAd);
6890
6891 VOID RTUSBCancelPendingIRPs(
6892         IN      PRTMP_ADAPTER   pAd);
6893
6894 VOID RTUSBBulkOutMLMEPacket(
6895         IN      PRTMP_ADAPTER   pAd,
6896         IN      UCHAR                   Index);
6897
6898 VOID RTUSBBulkOutPsPoll(
6899         IN      PRTMP_ADAPTER   pAd);
6900
6901 VOID RTUSBCleanUpMLMEBulkOutQueue(
6902         IN      PRTMP_ADAPTER   pAd);
6903
6904 VOID RTUSBKickBulkOut(
6905         IN      PRTMP_ADAPTER pAd);
6906
6907 VOID    RTUSBBulkReceive(
6908         IN      PRTMP_ADAPTER   pAd);
6909
6910 VOID DoBulkIn(
6911         IN RTMP_ADAPTER *pAd);
6912
6913 VOID RTUSBInitRxDesc(
6914         IN      PRTMP_ADAPTER   pAd,
6915         IN  PRX_CONTEXT         pRxContext);
6916
6917 VOID RTUSBBulkRxHandle(
6918         IN unsigned long data);
6919
6920 //
6921 // Function Prototype in rtusb_io.c
6922 //
6923 NTSTATUS RTUSBMultiRead(
6924         IN      PRTMP_ADAPTER   pAd,
6925         IN      USHORT                  Offset,
6926         OUT     PUCHAR                  pData,
6927         IN      USHORT                  length);
6928
6929 NTSTATUS RTUSBMultiWrite(
6930         IN      PRTMP_ADAPTER   pAd,
6931         IN      USHORT                  Offset,
6932         IN      PUCHAR                  pData,
6933         IN      USHORT                  length);
6934
6935 NTSTATUS RTUSBMultiWrite_OneByte(
6936         IN      PRTMP_ADAPTER   pAd,
6937         IN      USHORT                  Offset,
6938         IN      PUCHAR                  pData);
6939
6940 NTSTATUS RTUSBReadBBPRegister(
6941         IN      PRTMP_ADAPTER   pAd,
6942         IN      UCHAR                   Id,
6943         IN      PUCHAR                  pValue);
6944
6945 NTSTATUS RTUSBWriteBBPRegister(
6946         IN      PRTMP_ADAPTER   pAd,
6947         IN      UCHAR                   Id,
6948         IN      UCHAR                   Value);
6949
6950 NTSTATUS RTUSBWriteRFRegister(
6951         IN      PRTMP_ADAPTER   pAd,
6952         IN      UINT32                  Value);
6953
6954 NTSTATUS RTUSB_VendorRequest(
6955         IN      PRTMP_ADAPTER   pAd,
6956         IN      UINT32                  TransferFlags,
6957         IN      UCHAR                   ReservedBits,
6958         IN      UCHAR                   Request,
6959         IN      USHORT                  Value,
6960         IN      USHORT                  Index,
6961         IN      PVOID                   TransferBuffer,
6962         IN      UINT32                  TransferBufferLength);
6963
6964 NTSTATUS RTUSBReadEEPROM(
6965         IN      PRTMP_ADAPTER   pAd,
6966         IN      USHORT                  Offset,
6967         OUT     PUCHAR                  pData,
6968         IN      USHORT                  length);
6969
6970 NTSTATUS RTUSBWriteEEPROM(
6971         IN      PRTMP_ADAPTER   pAd,
6972         IN      USHORT                  Offset,
6973         IN      PUCHAR                  pData,
6974         IN      USHORT                  length);
6975
6976 VOID RTUSBPutToSleep(
6977         IN      PRTMP_ADAPTER   pAd);
6978
6979 NTSTATUS RTUSBWakeUp(
6980         IN      PRTMP_ADAPTER   pAd);
6981
6982 VOID RTUSBInitializeCmdQ(
6983         IN      PCmdQ   cmdq);
6984
6985 NDIS_STATUS     RTUSBEnqueueCmdFromNdis(
6986         IN      PRTMP_ADAPTER   pAd,
6987         IN      NDIS_OID                Oid,
6988         IN      BOOLEAN                 SetInformation,
6989         IN      PVOID                   pInformationBuffer,
6990         IN      UINT32                  InformationBufferLength);
6991
6992 NDIS_STATUS RTUSBEnqueueInternalCmd(
6993         IN      PRTMP_ADAPTER   pAd,
6994         IN NDIS_OID                     Oid,
6995         IN PVOID                        pInformationBuffer,
6996         IN UINT32                       InformationBufferLength);
6997
6998 VOID RTUSBDequeueCmd(
6999         IN      PCmdQ           cmdq,
7000         OUT     PCmdQElmt       *pcmdqelmt);
7001
7002 INT RTUSBCmdThread(
7003         IN OUT PVOID Context);
7004
7005 INT TimerQThread(
7006         IN OUT PVOID Context);
7007
7008 RT2870_TIMER_ENTRY *RT2870_TimerQ_Insert(
7009         IN RTMP_ADAPTER *pAd,
7010         IN RALINK_TIMER_STRUCT *pTimer);
7011
7012 BOOLEAN RT2870_TimerQ_Remove(
7013         IN RTMP_ADAPTER *pAd,
7014         IN RALINK_TIMER_STRUCT *pTimer);
7015
7016 void RT2870_TimerQ_Exit(
7017         IN RTMP_ADAPTER *pAd);
7018
7019 void RT2870_TimerQ_Init(
7020         IN RTMP_ADAPTER *pAd);
7021
7022 VOID RT2870_BssBeaconExit(
7023         IN RTMP_ADAPTER *pAd);
7024
7025 VOID RT2870_BssBeaconStop(
7026         IN RTMP_ADAPTER *pAd);
7027
7028 VOID RT2870_BssBeaconStart(
7029         IN RTMP_ADAPTER * pAd);
7030
7031 VOID RT2870_BssBeaconInit(
7032         IN RTMP_ADAPTER *pAd);
7033
7034 VOID RT2870_WatchDog(
7035         IN RTMP_ADAPTER *pAd);
7036
7037 NTSTATUS RTUSBWriteMACRegister(
7038         IN      PRTMP_ADAPTER   pAd,
7039         IN      USHORT                  Offset,
7040         IN      UINT32                  Value);
7041
7042 NTSTATUS RTUSBReadMACRegister(
7043         IN      PRTMP_ADAPTER   pAd,
7044         IN      USHORT                  Offset,
7045         OUT     PUINT32                 pValue);
7046
7047 NTSTATUS RTUSBSingleWrite(
7048         IN      RTMP_ADAPTER    *pAd,
7049         IN      USHORT                  Offset,
7050         IN      USHORT                  Value);
7051
7052 NTSTATUS RTUSBFirmwareRun(
7053         IN      PRTMP_ADAPTER   pAd);
7054
7055 NTSTATUS RTUSBFirmwareWrite(
7056         IN PRTMP_ADAPTER pAd,
7057         IN PUCHAR               pFwImage,
7058         IN ULONG                FwLen);
7059
7060 NTSTATUS        RTUSBFirmwareOpmode(
7061         IN      PRTMP_ADAPTER   pAd,
7062         OUT     PUINT32                 pValue);
7063
7064 NTSTATUS        RTUSBVenderReset(
7065         IN      PRTMP_ADAPTER   pAd);
7066
7067 NDIS_STATUS RTUSBSetHardWareRegister(
7068         IN      PRTMP_ADAPTER   pAdapter,
7069         IN      PVOID                   pBuf);
7070
7071 NDIS_STATUS RTUSBQueryHardWareRegister(
7072         IN      PRTMP_ADAPTER   pAdapter,
7073         IN      PVOID                   pBuf);
7074
7075 VOID CMDHandler(
7076     IN PRTMP_ADAPTER pAd);
7077
7078
7079 NDIS_STATUS      CreateThreads(
7080         IN      struct net_device *net_dev );
7081
7082
7083 VOID MacTableInitialize(
7084         IN  PRTMP_ADAPTER   pAd);
7085
7086 VOID MlmeSetPsm(
7087         IN PRTMP_ADAPTER pAd,
7088         IN USHORT psm);
7089
7090 NDIS_STATUS RTMPWPAAddKeyProc(
7091         IN  PRTMP_ADAPTER   pAd,
7092         IN  PVOID           pBuf);
7093
7094 VOID AsicRxAntEvalAction(
7095         IN PRTMP_ADAPTER pAd);
7096
7097 void append_pkt(
7098         IN      PRTMP_ADAPTER   pAd,
7099         IN      PUCHAR                  pHeader802_3,
7100     IN  UINT            HdrLen,
7101         IN      PUCHAR                  pData,
7102         IN      ULONG                   DataSize,
7103         OUT  PNDIS_PACKET       *ppPacket);
7104
7105 UINT deaggregate_AMSDU_announce(
7106         IN      PRTMP_ADAPTER   pAd,
7107         PNDIS_PACKET            pPacket,
7108         IN      PUCHAR                  pData,
7109         IN      ULONG                   DataSize);
7110
7111 NDIS_STATUS     RTMPCheckRxError(
7112         IN      PRTMP_ADAPTER   pAd,
7113         IN      PHEADER_802_11  pHeader,
7114         IN      PRXWI_STRUC     pRxWI,
7115         IN      PRT28XX_RXD_STRUC       pRxINFO);
7116
7117
7118 VOID RTUSBMlmeHardTransmit(
7119         IN      PRTMP_ADAPTER   pAd,
7120         IN      PMGMT_STRUC             pMgmt);
7121
7122 INT MlmeThread(
7123         IN PVOID Context);
7124
7125 //
7126 // Function Prototype in rtusb_data.c
7127 //
7128 NDIS_STATUS     RTUSBFreeDescriptorRequest(
7129         IN      PRTMP_ADAPTER   pAd,
7130         IN      UCHAR                   BulkOutPipeId,
7131         IN      UINT32                  NumberRequired);
7132
7133
7134 BOOLEAN RTUSBNeedQueueBackForAgg(
7135         IN RTMP_ADAPTER *pAd,
7136         IN UCHAR                BulkOutPipeId);
7137
7138
7139 VOID RTMPWriteTxInfo(
7140         IN      PRTMP_ADAPTER   pAd,
7141         IN      PTXINFO_STRUC   pTxInfo,
7142         IN        USHORT                USBDMApktLen,
7143         IN        BOOLEAN               bWiv,
7144         IN        UCHAR                 QueueSel,
7145         IN        UCHAR                 NextValid,
7146         IN        UCHAR                 TxBurst);
7147
7148 //
7149 // Function Prototype in cmm_data_2870.c
7150 //
7151 USHORT RtmpUSB_WriteSubTxResource(
7152         IN      PRTMP_ADAPTER   pAd,
7153         IN      TX_BLK                  *pTxBlk,
7154         IN      BOOLEAN                 bIsLast,
7155         OUT     USHORT                  *FreeNumber);
7156
7157 USHORT RtmpUSB_WriteSingleTxResource(
7158         IN      PRTMP_ADAPTER   pAd,
7159         IN      TX_BLK                  *pTxBlk,
7160         IN      BOOLEAN                 bIsLast,
7161         OUT     USHORT                  *FreeNumber);
7162
7163 USHORT  RtmpUSB_WriteFragTxResource(
7164         IN      PRTMP_ADAPTER   pAd,
7165         IN      TX_BLK                  *pTxBlk,
7166         IN      UCHAR                   fragNum,
7167         OUT     USHORT                  *FreeNumber);
7168
7169 USHORT RtmpUSB_WriteMultiTxResource(
7170         IN      PRTMP_ADAPTER   pAd,
7171         IN      TX_BLK                  *pTxBlk,
7172         IN      UCHAR                   frameNum,
7173         OUT     USHORT                  *FreeNumber);
7174
7175 VOID RtmpUSB_FinalWriteTxResource(
7176         IN      PRTMP_ADAPTER   pAd,
7177         IN      TX_BLK                  *pTxBlk,
7178         IN      USHORT                  totalMPDUSize,
7179         IN      USHORT                  TxIdx);
7180
7181 VOID RtmpUSBDataLastTxIdx(
7182         IN      PRTMP_ADAPTER   pAd,
7183         IN      UCHAR                   QueIdx,
7184         IN      USHORT                  TxIdx);
7185
7186 VOID RtmpUSBDataKickOut(
7187         IN      PRTMP_ADAPTER   pAd,
7188         IN      TX_BLK                  *pTxBlk,
7189         IN      UCHAR                   QueIdx);
7190
7191
7192 int RtmpUSBMgmtKickOut(
7193         IN RTMP_ADAPTER         *pAd,
7194         IN UCHAR                        QueIdx,
7195         IN PNDIS_PACKET         pPacket,
7196         IN PUCHAR                       pSrcBufVA,
7197         IN UINT                         SrcBufLen);
7198
7199 VOID RtmpUSBNullFrameKickOut(
7200         IN RTMP_ADAPTER *pAd,
7201         IN UCHAR                QueIdx,
7202         IN UCHAR                *pNullFrame,
7203         IN UINT32               frameLen);
7204
7205 VOID RT28xxUsbStaAsicForceWakeup(
7206         IN PRTMP_ADAPTER pAd,
7207         IN BOOLEAN       bFromTx);
7208
7209 VOID RT28xxUsbStaAsicSleepThenAutoWakeup(
7210         IN PRTMP_ADAPTER pAd,
7211         IN USHORT TbttNumToNextWakeUp);
7212
7213 VOID RT28xxUsbMlmeRadioOn(
7214         IN PRTMP_ADAPTER pAd);
7215
7216 VOID RT28xxUsbMlmeRadioOFF(
7217         IN PRTMP_ADAPTER pAd);
7218 #endif // RT2870 //
7219
7220 ////////////////////////////////////////
7221
7222 VOID QBSS_LoadInit(
7223         IN              RTMP_ADAPTER    *pAd);
7224
7225 UINT32 QBSS_LoadElementAppend(
7226         IN              RTMP_ADAPTER    *pAd,
7227         OUT             UINT8                   *buf_p);
7228
7229 VOID QBSS_LoadUpdate(
7230         IN              RTMP_ADAPTER    *pAd);
7231
7232 ///////////////////////////////////////
7233 INT RTMPShowCfgValue(
7234         IN      PRTMP_ADAPTER   pAd,
7235         IN      PUCHAR                  pName,
7236         IN      PUCHAR                  pBuf);
7237
7238 PCHAR   RTMPGetRalinkAuthModeStr(
7239     IN  NDIS_802_11_AUTHENTICATION_MODE authMode);
7240
7241 PCHAR   RTMPGetRalinkEncryModeStr(
7242     IN  USHORT encryMode);
7243 //////////////////////////////////////
7244
7245 #ifdef CONFIG_STA_SUPPORT
7246 VOID AsicStaBbpTuning(
7247         IN PRTMP_ADAPTER pAd);
7248
7249 BOOLEAN StaAddMacTableEntry(
7250         IN  PRTMP_ADAPTER               pAd,
7251         IN  PMAC_TABLE_ENTRY    pEntry,
7252         IN  UCHAR                               MaxSupportedRateIn500Kbps,
7253         IN  HT_CAPABILITY_IE    *pHtCapability,
7254         IN  UCHAR                               HtCapabilityLen,
7255         IN  USHORT                      CapabilityInfo);
7256 #endif // CONFIG_STA_SUPPORT //
7257
7258 void RTMP_IndicateMediaState(
7259         IN      PRTMP_ADAPTER   pAd);
7260
7261 VOID ReSyncBeaconTime(
7262         IN  PRTMP_ADAPTER   pAd);
7263
7264 VOID RTMPSetAGCInitValue(
7265         IN PRTMP_ADAPTER        pAd,
7266         IN UCHAR                        BandWidth);
7267
7268 int rt28xx_close(IN PNET_DEV dev);
7269 int rt28xx_open(IN PNET_DEV dev);
7270
7271 __inline INT VIRTUAL_IF_UP(PRTMP_ADAPTER pAd)
7272 {
7273 extern VOID MeshMakeBeacon(IN PRTMP_ADAPTER pAd, IN UCHAR idx);
7274 extern VOID MeshUpdateBeaconFrame(IN PRTMP_ADAPTER pAd, IN UCHAR idx);
7275
7276         if (VIRTUAL_IF_NUM(pAd) == 0)
7277         {
7278                 if (rt28xx_open(pAd->net_dev) != 0)
7279                         return -1;
7280         }
7281         else
7282         {
7283         }
7284         VIRTUAL_IF_INC(pAd);
7285         return 0;
7286 }
7287
7288 __inline VOID VIRTUAL_IF_DOWN(PRTMP_ADAPTER pAd)
7289 {
7290         VIRTUAL_IF_DEC(pAd);
7291         if (VIRTUAL_IF_NUM(pAd) == 0)
7292                 rt28xx_close(pAd->net_dev);
7293         return;
7294 }
7295
7296
7297 #endif  // __RTMP_H__
7298