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