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