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