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