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