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