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