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    Justin P. Mattock   11/07/2010      Fix some typos
  40*/
  41#ifndef __RTMP_H__
  42#define __RTMP_H__
  43
  44#include "spectrum_def.h"
  45#include "rtmp_dot11.h"
  46#include "rtmp_chip.h"
  47
  48struct rt_rtmp_adapter;
  49
  50/*#define DBG           1 */
  51
  52/*#define DBG_DIAGNOSE          1 */
  53
  54/*+++Add by shiang for merge MiniportMMRequest() and MiniportDataMMRequest() into one function */
  55#define MAX_DATAMM_RETRY        3
  56#define MGMT_USE_QUEUE_FLAG     0x80
  57/*---Add by shiang for merge MiniportMMRequest() and MiniportDataMMRequest() into one function */
  58
  59#define MAXSEQ          (0xFFF)
  60
  61extern unsigned char SNAP_AIRONET[];
  62extern unsigned char CISCO_OUI[];
  63extern u8 BaSizeArray[4];
  64
  65extern u8 BROADCAST_ADDR[MAC_ADDR_LEN];
  66extern u8 ZERO_MAC_ADDR[MAC_ADDR_LEN];
  67extern unsigned long BIT32[32];
  68extern u8 BIT8[8];
  69extern char *CipherName[];
  70extern char *MCSToMbps[];
  71extern u8 RxwiMCSToOfdmRate[12];
  72extern u8 SNAP_802_1H[6];
  73extern u8 SNAP_BRIDGE_TUNNEL[6];
  74extern u8 SNAP_AIRONET[8];
  75extern u8 CKIP_LLC_SNAP[8];
  76extern u8 EAPOL_LLC_SNAP[8];
  77extern u8 EAPOL[2];
  78extern u8 IPX[2];
  79extern u8 APPLE_TALK[2];
  80extern u8 RateIdToPlcpSignal[12];       /* see IEEE802.11a-1999 p.14 */
  81extern u8 OfdmRateToRxwiMCS[];
  82extern u8 OfdmSignalToRateId[16];
  83extern u8 default_cwmin[4];
  84extern u8 default_cwmax[4];
  85extern u8 default_sta_aifsn[4];
  86extern u8 MapUserPriorityToAccessCategory[8];
  87
  88extern u16 RateUpPER[];
  89extern u16 RateDownPER[];
  90extern u8 Phy11BNextRateDownward[];
  91extern u8 Phy11BNextRateUpward[];
  92extern u8 Phy11BGNextRateDownward[];
  93extern u8 Phy11BGNextRateUpward[];
  94extern u8 Phy11ANextRateDownward[];
  95extern u8 Phy11ANextRateUpward[];
  96extern char RssiSafeLevelForTxRate[];
  97extern u8 RateIdToMbps[];
  98extern u16 RateIdTo500Kbps[];
  99
 100extern u8 CipherSuiteWpaNoneTkip[];
 101extern u8 CipherSuiteWpaNoneTkipLen;
 102
 103extern u8 CipherSuiteWpaNoneAes[];
 104extern u8 CipherSuiteWpaNoneAesLen;
 105
 106extern u8 SsidIe;
 107extern u8 SupRateIe;
 108extern u8 ExtRateIe;
 109
 110extern u8 HtCapIe;
 111extern u8 AddHtInfoIe;
 112extern u8 NewExtChanIe;
 113
 114extern u8 ErpIe;
 115extern u8 DsIe;
 116extern u8 TimIe;
 117extern u8 WpaIe;
 118extern u8 Wpa2Ie;
 119extern u8 IbssIe;
 120extern u8 Ccx2Ie;
 121extern u8 WapiIe;
 122
 123extern u8 WPA_OUI[];
 124extern u8 RSN_OUI[];
 125extern u8 WAPI_OUI[];
 126extern u8 WME_INFO_ELEM[];
 127extern u8 WME_PARM_ELEM[];
 128extern u8 Ccx2QosInfo[];
 129extern u8 Ccx2IeInfo[];
 130extern u8 RALINK_OUI[];
 131extern u8 PowerConstraintIE[];
 132
 133extern u8 RateSwitchTable[];
 134extern u8 RateSwitchTable11B[];
 135extern u8 RateSwitchTable11G[];
 136extern u8 RateSwitchTable11BG[];
 137
 138extern u8 RateSwitchTable11BGN1S[];
 139extern u8 RateSwitchTable11BGN2S[];
 140extern u8 RateSwitchTable11BGN2SForABand[];
 141extern u8 RateSwitchTable11N1S[];
 142extern u8 RateSwitchTable11N2S[];
 143extern u8 RateSwitchTable11N2SForABand[];
 144
 145extern u8 PRE_N_HT_OUI[];
 146
 147struct rt_rssi_sample {
 148        char LastRssi0;         /* last received RSSI */
 149        char LastRssi1;         /* last received RSSI */
 150        char LastRssi2;         /* last received RSSI */
 151        char AvgRssi0;
 152        char AvgRssi1;
 153        char AvgRssi2;
 154        short AvgRssi0X8;
 155        short AvgRssi1X8;
 156        short AvgRssi2X8;
 157};
 158
 159/* */
 160/*  Queue structure and macros */
 161/* */
 162struct rt_queue_entry;
 163
 164struct rt_queue_entry {
 165        struct rt_queue_entry *Next;
 166};
 167
 168/* Queue structure */
 169struct rt_queue_header {
 170        struct rt_queue_entry *Head;
 171        struct rt_queue_entry *Tail;
 172        unsigned long Number;
 173};
 174
 175#define InitializeQueueHeader(QueueHeader)              \
 176{                                                       \
 177        (QueueHeader)->Head = (QueueHeader)->Tail = NULL;   \
 178        (QueueHeader)->Number = 0;                          \
 179}
 180
 181#define RemoveHeadQueue(QueueHeader)                \
 182(QueueHeader)->Head;                                \
 183{                                                   \
 184        struct rt_queue_entry *pNext;                             \
 185        if ((QueueHeader)->Head != NULL) {                              \
 186                pNext = (QueueHeader)->Head->Next;          \
 187                (QueueHeader)->Head->Next = NULL;               \
 188                (QueueHeader)->Head = pNext;                \
 189                if (pNext == NULL)                          \
 190                        (QueueHeader)->Tail = NULL;             \
 191                (QueueHeader)->Number--;                    \
 192        }                                                                                               \
 193}
 194
 195#define InsertHeadQueue(QueueHeader, QueueEntry)            \
 196{                                                           \
 197                ((struct rt_queue_entry *)QueueEntry)->Next = (QueueHeader)->Head; \
 198                (QueueHeader)->Head = (struct rt_queue_entry *)(QueueEntry);       \
 199                if ((QueueHeader)->Tail == NULL)                        \
 200                        (QueueHeader)->Tail = (struct rt_queue_entry *)(QueueEntry);   \
 201                (QueueHeader)->Number++;                                \
 202}
 203
 204#define InsertTailQueue(QueueHeader, QueueEntry)                \
 205{                                                               \
 206        ((struct rt_queue_entry *)QueueEntry)->Next = NULL;                    \
 207        if ((QueueHeader)->Tail)                                    \
 208                (QueueHeader)->Tail->Next = (struct rt_queue_entry *)(QueueEntry); \
 209        else                                                        \
 210                (QueueHeader)->Head = (struct rt_queue_entry *)(QueueEntry);       \
 211        (QueueHeader)->Tail = (struct rt_queue_entry *)(QueueEntry);           \
 212        (QueueHeader)->Number++;                                    \
 213}
 214
 215#define InsertTailQueueAc(pAd, pEntry, QueueHeader, QueueEntry)                 \
 216{                                                                                                                                               \
 217        ((struct rt_queue_entry *)QueueEntry)->Next = NULL;                                                     \
 218        if ((QueueHeader)->Tail)                                                                                        \
 219                (QueueHeader)->Tail->Next = (struct rt_queue_entry *)(QueueEntry);                      \
 220        else                                                                                                                            \
 221                (QueueHeader)->Head = (struct rt_queue_entry *)(QueueEntry);                            \
 222        (QueueHeader)->Tail = (struct rt_queue_entry *)(QueueEntry);                                    \
 223        (QueueHeader)->Number++;                                                                                        \
 224}
 225
 226/* */
 227/*  Macros for flag and ref count operations */
 228/* */
 229#define RTMP_SET_FLAG(_M, _F)       ((_M)->Flags |= (_F))
 230#define RTMP_CLEAR_FLAG(_M, _F)     ((_M)->Flags &= ~(_F))
 231#define RTMP_CLEAR_FLAGS(_M)        ((_M)->Flags = 0)
 232#define RTMP_TEST_FLAG(_M, _F)      (((_M)->Flags & (_F)) != 0)
 233#define RTMP_TEST_FLAGS(_M, _F)     (((_M)->Flags & (_F)) == (_F))
 234/* Macro for power save flag. */
 235#define RTMP_SET_PSFLAG(_M, _F)       ((_M)->PSFlags |= (_F))
 236#define RTMP_CLEAR_PSFLAG(_M, _F)     ((_M)->PSFlags &= ~(_F))
 237#define RTMP_CLEAR_PSFLAGS(_M)        ((_M)->PSFlags = 0)
 238#define RTMP_TEST_PSFLAG(_M, _F)      (((_M)->PSFlags & (_F)) != 0)
 239#define RTMP_TEST_PSFLAGS(_M, _F)     (((_M)->PSFlags & (_F)) == (_F))
 240
 241#define OPSTATUS_SET_FLAG(_pAd, _F)     ((_pAd)->CommonCfg.OpStatusFlags |= (_F))
 242#define OPSTATUS_CLEAR_FLAG(_pAd, _F)   ((_pAd)->CommonCfg.OpStatusFlags &= ~(_F))
 243#define OPSTATUS_TEST_FLAG(_pAd, _F)    (((_pAd)->CommonCfg.OpStatusFlags & (_F)) != 0)
 244
 245#define CLIENT_STATUS_SET_FLAG(_pEntry, _F)      ((_pEntry)->ClientStatusFlags |= (_F))
 246#define CLIENT_STATUS_CLEAR_FLAG(_pEntry, _F)    ((_pEntry)->ClientStatusFlags &= ~(_F))
 247#define CLIENT_STATUS_TEST_FLAG(_pEntry, _F)     (((_pEntry)->ClientStatusFlags & (_F)) != 0)
 248
 249#define RX_FILTER_SET_FLAG(_pAd, _F)    ((_pAd)->CommonCfg.PacketFilter |= (_F))
 250#define RX_FILTER_CLEAR_FLAG(_pAd, _F)  ((_pAd)->CommonCfg.PacketFilter &= ~(_F))
 251#define RX_FILTER_TEST_FLAG(_pAd, _F)   (((_pAd)->CommonCfg.PacketFilter & (_F)) != 0)
 252
 253#define STA_NO_SECURITY_ON(_p)          (_p->StaCfg.WepStatus == Ndis802_11EncryptionDisabled)
 254#define STA_WEP_ON(_p)                  (_p->StaCfg.WepStatus == Ndis802_11Encryption1Enabled)
 255#define STA_TKIP_ON(_p)                 (_p->StaCfg.WepStatus == Ndis802_11Encryption2Enabled)
 256#define STA_AES_ON(_p)                  (_p->StaCfg.WepStatus == Ndis802_11Encryption3Enabled)
 257
 258#define STA_TGN_WIFI_ON(_p)             (_p->StaCfg.bTGnWifiTest == TRUE)
 259
 260#define CKIP_KP_ON(_p)                          ((((_p)->StaCfg.CkipFlag) & 0x10) && ((_p)->StaCfg.bCkipCmicOn == TRUE))
 261#define CKIP_CMIC_ON(_p)                        ((((_p)->StaCfg.CkipFlag) & 0x08) && ((_p)->StaCfg.bCkipCmicOn == TRUE))
 262
 263#define INC_RING_INDEX(_idx, _RingSize)    \
 264{                                          \
 265    (_idx) = (_idx+1) % (_RingSize);       \
 266}
 267
 268/* StaActive.SupportedHtPhy.MCSSet is copied from AP beacon.  Don't need to update here. */
 269#define COPY_HTSETTINGS_FROM_MLME_AUX_TO_ACTIVE_CFG(_pAd)                                 \
 270{                                                                                       \
 271        _pAd->StaActive.SupportedHtPhy.ChannelWidth = _pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth;      \
 272        _pAd->StaActive.SupportedHtPhy.MimoPs = _pAd->MlmeAux.HtCapability.HtCapInfo.MimoPs;      \
 273        _pAd->StaActive.SupportedHtPhy.GF = _pAd->MlmeAux.HtCapability.HtCapInfo.GF;      \
 274        _pAd->StaActive.SupportedHtPhy.ShortGIfor20 = _pAd->MlmeAux.HtCapability.HtCapInfo.ShortGIfor20;      \
 275        _pAd->StaActive.SupportedHtPhy.ShortGIfor40 = _pAd->MlmeAux.HtCapability.HtCapInfo.ShortGIfor40;      \
 276        _pAd->StaActive.SupportedHtPhy.TxSTBC = _pAd->MlmeAux.HtCapability.HtCapInfo.TxSTBC;      \
 277        _pAd->StaActive.SupportedHtPhy.RxSTBC = _pAd->MlmeAux.HtCapability.HtCapInfo.RxSTBC;      \
 278        _pAd->StaActive.SupportedHtPhy.ExtChanOffset = _pAd->MlmeAux.AddHtInfo.AddHtInfo.ExtChanOffset;      \
 279        _pAd->StaActive.SupportedHtPhy.RecomWidth = _pAd->MlmeAux.AddHtInfo.AddHtInfo.RecomWidth;      \
 280        _pAd->StaActive.SupportedHtPhy.OperaionMode = _pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode;      \
 281        _pAd->StaActive.SupportedHtPhy.NonGfPresent = _pAd->MlmeAux.AddHtInfo.AddHtInfo2.NonGfPresent;      \
 282        NdisMoveMemory((_pAd)->MacTab.Content[BSSID_WCID].HTCapability.MCSSet, (_pAd)->StaActive.SupportedPhyInfo.MCSSet, sizeof(u8) * 16);\
 283}
 284
 285#define COPY_AP_HTSETTINGS_FROM_BEACON(_pAd, _pHtCapability)                                 \
 286{                                                                                       \
 287        _pAd->MacTab.Content[BSSID_WCID].AMsduSize = (u8)(_pHtCapability->HtCapInfo.AMsduSize); \
 288        _pAd->MacTab.Content[BSSID_WCID].MmpsMode = (u8)(_pHtCapability->HtCapInfo.MimoPs);     \
 289        _pAd->MacTab.Content[BSSID_WCID].MaxRAmpduFactor = (u8)(_pHtCapability->HtCapParm.MaxRAmpduFactor);     \
 290}
 291
 292/* */
 293/* MACRO for 32-bit PCI register read / write */
 294/* */
 295/* Usage : RTMP_IO_READ32( */
 296/*              struct rt_rtmp_adapter *pAd, */
 297/*              unsigned long Register_Offset, */
 298/*              unsigned long * pValue) */
 299/* */
 300/*         RTMP_IO_WRITE32( */
 301/*              struct rt_rtmp_adapter *pAd, */
 302/*              unsigned long Register_Offset, */
 303/*              unsigned long Value) */
 304/* */
 305
 306/* */
 307/* Common fragment list structure -  Identical to the scatter gather frag list structure */
 308/* */
 309/*#define struct rt_rtmp_sg_element         SCATTER_GATHER_ELEMENT */
 310/*#define struct rt_rtmp_sg_element *PSCATTER_GATHER_ELEMENT */
 311#define NIC_MAX_PHYS_BUF_COUNT              8
 312
 313struct rt_rtmp_sg_element {
 314        void *Address;
 315        unsigned long Length;
 316        unsigned long *Reserved;
 317};
 318
 319struct rt_rtmp_sg_list {
 320        unsigned long NumberOfElements;
 321        unsigned long *Reserved;
 322        struct rt_rtmp_sg_element Elements[NIC_MAX_PHYS_BUF_COUNT];
 323};
 324
 325/* */
 326/*  Some utility macros */
 327/* */
 328#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))))
 329
 330#define INC_COUNTER64(Val)          (Val.QuadPart++)
 331
 332#define INFRA_ON(_p)                (OPSTATUS_TEST_FLAG(_p, fOP_STATUS_INFRA_ON))
 333#define ADHOC_ON(_p)                (OPSTATUS_TEST_FLAG(_p, fOP_STATUS_ADHOC_ON))
 334#define MONITOR_ON(_p)              (((_p)->StaCfg.BssType) == BSS_MONITOR)
 335#define IDLE_ON(_p)                 (!INFRA_ON(_p) && !ADHOC_ON(_p))
 336
 337/* Check LEAP & CCKM flags */
 338#define LEAP_ON(_p)                 (((_p)->StaCfg.LeapAuthMode) == CISCO_AuthModeLEAP)
 339#define LEAP_CCKM_ON(_p)            ((((_p)->StaCfg.LeapAuthMode) == CISCO_AuthModeLEAP) && ((_p)->StaCfg.LeapAuthInfo.CCKM == TRUE))
 340
 341/* if original Ethernet frame contains no LLC/SNAP, then an extra LLC/SNAP encap is required */
 342#define EXTRA_LLCSNAP_ENCAP_FROM_PKT_START(_pBufVA, _pExtraLlcSnapEncap)                \
 343{                                                                                                                               \
 344        if (((*(_pBufVA + 12) << 8) + *(_pBufVA + 13)) > 1500) {        \
 345                _pExtraLlcSnapEncap = SNAP_802_1H;                                              \
 346                if (NdisEqualMemory(IPX, _pBufVA + 12, 2) ||                    \
 347                        NdisEqualMemory(APPLE_TALK, _pBufVA + 12, 2)) { \
 348                        _pExtraLlcSnapEncap = SNAP_BRIDGE_TUNNEL;                       \
 349                }                                                                                                               \
 350        }                                                                                                                       \
 351        else {                          \
 352                _pExtraLlcSnapEncap = NULL;                                                             \
 353        }                                                                                                                       \
 354}
 355
 356/* New Define for new Tx Path. */
 357#define EXTRA_LLCSNAP_ENCAP_FROM_PKT_OFFSET(_pBufVA, _pExtraLlcSnapEncap)       \
 358{                                                                                                                               \
 359        if (((*(_pBufVA) << 8) + *(_pBufVA + 1)) > 1500) {              \
 360                _pExtraLlcSnapEncap = SNAP_802_1H;                                              \
 361                if (NdisEqualMemory(IPX, _pBufVA, 2) ||                                 \
 362                        NdisEqualMemory(APPLE_TALK, _pBufVA, 2)) {              \
 363                        _pExtraLlcSnapEncap = SNAP_BRIDGE_TUNNEL;                       \
 364                }                                                                                                               \
 365        }                                                                                                                       \
 366        else {          \
 367                _pExtraLlcSnapEncap = NULL;                                                             \
 368        }                                                                                                                       \
 369}
 370
 371#define MAKE_802_3_HEADER(_p, _pMac1, _pMac2, _pType)                   \
 372{                                                                       \
 373    NdisMoveMemory(_p, _pMac1, MAC_ADDR_LEN);                           \
 374    NdisMoveMemory((_p + MAC_ADDR_LEN), _pMac2, MAC_ADDR_LEN);          \
 375    NdisMoveMemory((_p + MAC_ADDR_LEN * 2), _pType, LENGTH_802_3_TYPE); \
 376}
 377
 378/* if pData has no LLC/SNAP (neither RFC1042 nor Bridge tunnel), keep it that way. */
 379/* else if the received frame is LLC/SNAP-encaped IPX or APPLETALK, preserve the LLC/SNAP field */
 380/* else remove the LLC/SNAP field from the result Ethernet frame */
 381/* Patch for WHQL only, which did not turn on Netbios but use IPX within its payload */
 382/* Note: */
 383/*     _pData & _DataSize may be altered (remove 8-byte LLC/SNAP) by this MACRO */
 384/*     _pRemovedLLCSNAP: pointer to removed LLC/SNAP; NULL is not removed */
 385#define CONVERT_TO_802_3(_p8023hdr, _pDA, _pSA, _pData, _DataSize, _pRemovedLLCSNAP)      \
 386{                                                                       \
 387    char LLC_Len[2];                                                    \
 388                                                                        \
 389    _pRemovedLLCSNAP = NULL;                                            \
 390    if (NdisEqualMemory(SNAP_802_1H, _pData, 6)  ||                     \
 391        NdisEqualMemory(SNAP_BRIDGE_TUNNEL, _pData, 6)) {               \
 392        u8 *pProto = _pData + 6;                                        \
 393                                                                        \
 394        if ((NdisEqualMemory(IPX, pProto, 2) || NdisEqualMemory(APPLE_TALK, pProto, 2)) &&  \
 395                NdisEqualMemory(SNAP_802_1H, _pData, 6))        {       \
 396                LLC_Len[0] = (u8)(_DataSize / 256);                     \
 397                LLC_Len[1] = (u8)(_DataSize % 256);                     \
 398                MAKE_802_3_HEADER(_p8023hdr, _pDA, _pSA, LLC_Len);      \
 399        }                                                               \
 400        else    {                                                       \
 401                MAKE_802_3_HEADER(_p8023hdr, _pDA, _pSA, pProto);       \
 402                _pRemovedLLCSNAP = _pData;                              \
 403                _DataSize -= LENGTH_802_1_H;                            \
 404                _pData += LENGTH_802_1_H;                               \
 405        }                                                               \
 406    }                                                                   \
 407        else    {                                                       \
 408        LLC_Len[0] = (u8)(_DataSize / 256);                             \
 409        LLC_Len[1] = (u8)(_DataSize % 256);                             \
 410        MAKE_802_3_HEADER(_p8023hdr, _pDA, _pSA, LLC_Len);              \
 411    }                                                                   \
 412}
 413
 414/* Enqueue this frame to MLME engine */
 415/* We need to enqueue the whole frame because MLME need to pass data type */
 416/* information from 802.11 header */
 417#ifdef RTMP_MAC_PCI
 418#define REPORT_MGMT_FRAME_TO_MLME(_pAd, Wcid, _pFrame, _FrameSize, _Rssi0, _Rssi1, _Rssi2, _PlcpSignal)        \
 419{                                                                                       \
 420    u32 High32TSF, Low32TSF;                                                          \
 421    RTMP_IO_READ32(_pAd, TSF_TIMER_DW1, &High32TSF);                                       \
 422    RTMP_IO_READ32(_pAd, TSF_TIMER_DW0, &Low32TSF);                                        \
 423    MlmeEnqueueForRecv(_pAd, Wcid, High32TSF, Low32TSF, (u8)_Rssi0, (u8)_Rssi1, (u8)_Rssi2, _FrameSize, _pFrame, (u8)_PlcpSignal);   \
 424}
 425#endif /* RTMP_MAC_PCI // */
 426#ifdef RTMP_MAC_USB
 427#define REPORT_MGMT_FRAME_TO_MLME(_pAd, Wcid, _pFrame, _FrameSize, _Rssi0, _Rssi1, _Rssi2, _PlcpSignal)        \
 428{                                                                                       \
 429    u32 High32TSF = 0, Low32TSF = 0;                                                          \
 430    MlmeEnqueueForRecv(_pAd, Wcid, High32TSF, Low32TSF, (u8)_Rssi0, (u8)_Rssi1, (u8)_Rssi2, _FrameSize, _pFrame, (u8)_PlcpSignal);   \
 431}
 432#endif /* RTMP_MAC_USB // */
 433
 434#define MAC_ADDR_EQUAL(pAddr1, pAddr2)           RTMPEqualMemory((void *)(pAddr1), (void *)(pAddr2), MAC_ADDR_LEN)
 435#define SSID_EQUAL(ssid1, len1, ssid2, len2)    ((len1 == len2) && (RTMPEqualMemory(ssid1, ssid2, len1)))
 436
 437/* */
 438/* Check if it is Japan W53(ch52,56,60,64) channel. */
 439/* */
 440#define JapanChannelCheck(channel)  ((channel == 52) || (channel == 56) || (channel == 60) || (channel == 64))
 441
 442#define STA_EXTRA_SETTING(_pAd)
 443
 444#define STA_PORT_SECURED(_pAd) \
 445{ \
 446        BOOLEAN Cancelled; \
 447        (_pAd)->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED; \
 448        NdisAcquireSpinLock(&((_pAd)->MacTabLock)); \
 449        (_pAd)->MacTab.Content[BSSID_WCID].PortSecured = (_pAd)->StaCfg.PortSecured; \
 450        (_pAd)->MacTab.Content[BSSID_WCID].PrivacyFilter = Ndis802_11PrivFilterAcceptAll;\
 451        NdisReleaseSpinLock(&(_pAd)->MacTabLock); \
 452        RTMPCancelTimer(&((_pAd)->Mlme.LinkDownTimer), &Cancelled);\
 453        STA_EXTRA_SETTING(_pAd); \
 454}
 455
 456/* */
 457/*  Data buffer for DMA operation, the buffer must be contiguous physical memory */
 458/*  Both DMA to / from CPU use the same structure. */
 459/* */
 460struct rt_rtmp_dmabuf {
 461        unsigned long AllocSize;
 462        void *AllocVa;          /* TxBuf virtual address */
 463        dma_addr_t AllocPa;     /* TxBuf physical address */
 464};
 465
 466/* */
 467/* Control block (Descriptor) for all ring descriptor DMA operation, buffer must be */
 468/* contiguous physical memory. char stored the binding Rx packet descriptor */
 469/* which won't be released, driver has to wait until upper layer return the packet */
 470/* before giving up this rx ring descriptor to ASIC. NDIS_BUFFER is associated pair */
 471/* to describe the packet buffer. For Tx, char stored the tx packet descriptor */
 472/* which driver should ACK upper layer when the tx is physically done or failed. */
 473/* */
 474struct rt_rtmp_dmacb {
 475        unsigned long AllocSize;        /* Control block size */
 476        void *AllocVa;          /* Control block virtual address */
 477        dma_addr_t AllocPa;     /* Control block physical address */
 478        void *pNdisPacket;
 479        void *pNextNdisPacket;
 480
 481        struct rt_rtmp_dmabuf DmaBuf;   /* Associated DMA buffer structure */
 482};
 483
 484struct rt_rtmp_tx_ring {
 485        struct rt_rtmp_dmacb Cell[TX_RING_SIZE];
 486        u32 TxCpuIdx;
 487        u32 TxDmaIdx;
 488        u32 TxSwFreeIdx;        /* software next free tx index */
 489};
 490
 491struct rt_rtmp_rx_ring {
 492        struct rt_rtmp_dmacb Cell[RX_RING_SIZE];
 493        u32 RxCpuIdx;
 494        u32 RxDmaIdx;
 495        int RxSwReadIdx;        /* software next read index */
 496};
 497
 498struct rt_rtmp_mgmt_ring {
 499        struct rt_rtmp_dmacb Cell[MGMT_RING_SIZE];
 500        u32 TxCpuIdx;
 501        u32 TxDmaIdx;
 502        u32 TxSwFreeIdx;        /* software next free tx index */
 503};
 504
 505/* */
 506/*  Statistic counter structure */
 507/* */
 508struct rt_counter_802_3 {
 509        /* General Stats */
 510        unsigned long GoodTransmits;
 511        unsigned long GoodReceives;
 512        unsigned long TxErrors;
 513        unsigned long RxErrors;
 514        unsigned long RxNoBuffer;
 515
 516        /* Ethernet Stats */
 517        unsigned long RcvAlignmentErrors;
 518        unsigned long OneCollision;
 519        unsigned long MoreCollisions;
 520
 521};
 522
 523struct rt_counter_802_11 {
 524        unsigned long Length;
 525        LARGE_INTEGER LastTransmittedFragmentCount;
 526        LARGE_INTEGER TransmittedFragmentCount;
 527        LARGE_INTEGER MulticastTransmittedFrameCount;
 528        LARGE_INTEGER FailedCount;
 529        LARGE_INTEGER RetryCount;
 530        LARGE_INTEGER MultipleRetryCount;
 531        LARGE_INTEGER RTSSuccessCount;
 532        LARGE_INTEGER RTSFailureCount;
 533        LARGE_INTEGER ACKFailureCount;
 534        LARGE_INTEGER FrameDuplicateCount;
 535        LARGE_INTEGER ReceivedFragmentCount;
 536        LARGE_INTEGER MulticastReceivedFrameCount;
 537        LARGE_INTEGER FCSErrorCount;
 538};
 539
 540struct rt_counter_ralink {
 541        unsigned long TransmittedByteCount;     /* both successful and failure, used to calculate TX throughput */
 542        unsigned long ReceivedByteCount;        /* both CRC okay and CRC error, used to calculate RX throughput */
 543        unsigned long BeenDisassociatedCount;
 544        unsigned long BadCQIAutoRecoveryCount;
 545        unsigned long PoorCQIRoamingCount;
 546        unsigned long MgmtRingFullCount;
 547        unsigned long RxCountSinceLastNULL;
 548        unsigned long RxCount;
 549        unsigned long RxRingErrCount;
 550        unsigned long KickTxCount;
 551        unsigned long TxRingErrCount;
 552        LARGE_INTEGER RealFcsErrCount;
 553        unsigned long PendingNdisPacketCount;
 554
 555        unsigned long OneSecOsTxCount[NUM_OF_TX_RING];
 556        unsigned long OneSecDmaDoneCount[NUM_OF_TX_RING];
 557        u32 OneSecTxDoneCount;
 558        unsigned long OneSecRxCount;
 559        u32 OneSecTxAggregationCount;
 560        u32 OneSecRxAggregationCount;
 561        u32 OneSecReceivedByteCount;
 562        u32 OneSecFrameDuplicateCount;
 563
 564        u32 OneSecTransmittedByteCount; /* both successful and failure, used to calculate TX throughput */
 565        u32 OneSecTxNoRetryOkCount;
 566        u32 OneSecTxRetryOkCount;
 567        u32 OneSecTxFailCount;
 568        u32 OneSecFalseCCACnt;  /* CCA error count, for debug purpose, might move to global counter */
 569        u32 OneSecRxOkCnt;      /* RX without error */
 570        u32 OneSecRxOkDataCnt;  /* unicast-to-me DATA frame count */
 571        u32 OneSecRxFcsErrCnt;  /* CRC error */
 572        u32 OneSecBeaconSentCnt;
 573        u32 LastOneSecTotalTxCount;     /* OneSecTxNoRetryOkCount + OneSecTxRetryOkCount + OneSecTxFailCount */
 574        u32 LastOneSecRxOkDataCnt;      /* OneSecRxOkDataCnt */
 575        unsigned long DuplicateRcv;
 576        unsigned long TxAggCount;
 577        unsigned long TxNonAggCount;
 578        unsigned long TxAgg1MPDUCount;
 579        unsigned long TxAgg2MPDUCount;
 580        unsigned long TxAgg3MPDUCount;
 581        unsigned long TxAgg4MPDUCount;
 582        unsigned long TxAgg5MPDUCount;
 583        unsigned long TxAgg6MPDUCount;
 584        unsigned long TxAgg7MPDUCount;
 585        unsigned long TxAgg8MPDUCount;
 586        unsigned long TxAgg9MPDUCount;
 587        unsigned long TxAgg10MPDUCount;
 588        unsigned long TxAgg11MPDUCount;
 589        unsigned long TxAgg12MPDUCount;
 590        unsigned long TxAgg13MPDUCount;
 591        unsigned long TxAgg14MPDUCount;
 592        unsigned long TxAgg15MPDUCount;
 593        unsigned long TxAgg16MPDUCount;
 594
 595        LARGE_INTEGER TransmittedOctetsInAMSDU;
 596        LARGE_INTEGER TransmittedAMSDUCount;
 597        LARGE_INTEGER ReceivedOctesInAMSDUCount;
 598        LARGE_INTEGER ReceivedAMSDUCount;
 599        LARGE_INTEGER TransmittedAMPDUCount;
 600        LARGE_INTEGER TransmittedMPDUsInAMPDUCount;
 601        LARGE_INTEGER TransmittedOctetsInAMPDUCount;
 602        LARGE_INTEGER MPDUInReceivedAMPDUCount;
 603};
 604
 605struct rt_counter_drs {
 606        /* record each TX rate's quality. 0 is best, the bigger the worse. */
 607        u16 TxQuality[MAX_STEP_OF_TX_RATE_SWITCH];
 608        u8 PER[MAX_STEP_OF_TX_RATE_SWITCH];
 609        u8 TxRateUpPenalty;     /* extra # of second penalty due to last unstable condition */
 610        unsigned long CurrTxRateStableTime;     /* # of second in current TX rate */
 611        BOOLEAN fNoisyEnvironment;
 612        BOOLEAN fLastSecAccordingRSSI;
 613        u8 LastSecTxRateChangeAction;   /* 0: no change, 1:rate UP, 2:rate down */
 614        u8 LastTimeTxRateChangeAction;  /*Keep last time value of LastSecTxRateChangeAction */
 615        unsigned long LastTxOkCount;
 616};
 617
 618/***************************************************************************
 619  *     security key related data structure
 620  **************************************************************************/
 621struct rt_cipher_key {
 622        u8 Key[16];             /* right now we implement 4 keys, 128 bits max */
 623        u8 RxMic[8];            /* make alignment */
 624        u8 TxMic[8];
 625        u8 TxTsc[6];            /* 48bit TSC value */
 626        u8 RxTsc[6];            /* 48bit TSC value */
 627        u8 CipherAlg;   /* 0-none, 1:WEP64, 2:WEP128, 3:TKIP, 4:AES, 5:CKIP64, 6:CKIP128 */
 628        u8 KeyLen;
 629        u8 BssId[6];
 630        /* Key length for each key, 0: entry is invalid */
 631        u8 Type;                /* Indicate Pairwise/Group when reporting MIC error */
 632};
 633
 634/* structure to define WPA Group Key Rekey Interval */
 635struct PACKED rt_802_11_wpa_rekey {
 636        unsigned long ReKeyMethod;      /* mechanism for rekeying: 0:disable, 1: time-based, 2: packet-based */
 637        unsigned long ReKeyInterval;    /* time-based: seconds, packet-based: kilo-packets */
 638};
 639
 640#ifdef RTMP_MAC_USB
 641/***************************************************************************
 642  *     RTUSB I/O related data structure
 643  **************************************************************************/
 644struct rt_set_asic_wcid {
 645        unsigned long WCID;             /* mechanism for rekeying: 0:disable, 1: time-based, 2: packet-based */
 646        unsigned long SetTid;           /* time-based: seconds, packet-based: kilo-packets */
 647        unsigned long DeleteTid;        /* time-based: seconds, packet-based: kilo-packets */
 648        u8 Addr[MAC_ADDR_LEN];  /* avoid in interrupt when write key */
 649};
 650
 651struct rt_set_asic_wcid_attri {
 652        unsigned long WCID;             /* mechanism for rekeying: 0:disable, 1: time-based, 2: packet-based */
 653        unsigned long Cipher;           /* ASIC Cipher definition */
 654        u8 Addr[ETH_LENGTH_OF_ADDRESS];
 655};
 656
 657/* for USB interface, avoid in interrupt when write key */
 658struct rt_add_pairwise_key_entry {
 659        u8 MacAddr[6];
 660        u16 MacTabMatchWCID;    /* ASIC */
 661        struct rt_cipher_key CipherKey;
 662};
 663
 664/* Cipher suite type for mixed mode group cipher, P802.11i-2004 */
 665typedef enum _RT_802_11_CIPHER_SUITE_TYPE {
 666        Cipher_Type_NONE,
 667        Cipher_Type_WEP40,
 668        Cipher_Type_TKIP,
 669        Cipher_Type_RSVD,
 670        Cipher_Type_CCMP,
 671        Cipher_Type_WEP104
 672} RT_802_11_CIPHER_SUITE_TYPE, *PRT_802_11_CIPHER_SUITE_TYPE;
 673#endif /* RTMP_MAC_USB // */
 674
 675struct rt_rogueap_entry {
 676        u8 Addr[MAC_ADDR_LEN];
 677        u8 ErrorCode[2];        /*00 01-Invalid authentication type */
 678        /*00 02-Authentication timeout */
 679        /*00 03-Challenge from AP failed */
 680        /*00 04-Challenge to AP failed */
 681        BOOLEAN Reported;
 682};
 683
 684struct rt_rogueap_table {
 685        u8 RogueApNr;
 686        struct rt_rogueap_entry RogueApEntry[MAX_LEN_OF_BSS_TABLE];
 687};
 688
 689/* */
 690/* Cisco IAPP format */
 691/* */
 692struct rt_cisco_iapp_content {
 693        u16 Length;             /*IAPP Length */
 694        u8 MessageType; /*IAPP type */
 695        u8 FunctionCode;        /*IAPP function type */
 696        u8 DestinaionMAC[MAC_ADDR_LEN];
 697        u8 SourceMAC[MAC_ADDR_LEN];
 698        u16 Tag;                /*Tag(element IE) - Adjacent AP report */
 699        u16 TagLength;  /*Length of element not including 4 byte header */
 700        u8 OUI[4];              /*0x00, 0x40, 0x96, 0x00 */
 701        u8 PreviousAP[MAC_ADDR_LEN];    /*MAC Address of access point */
 702        u16 Channel;
 703        u16 SsidLen;
 704        u8 Ssid[MAX_LEN_OF_SSID];
 705        u16 Seconds;            /*Seconds that the client has been disassociated. */
 706};
 707
 708/*
 709  *     Fragment Frame structure
 710  */
 711struct rt_fragment_frame {
 712        void *pFragPacket;
 713        unsigned long RxSize;
 714        u16 Sequence;
 715        u16 LastFrag;
 716        unsigned long Flags;            /* Some extra frame information. bit 0: LLC presented */
 717};
 718
 719/* */
 720/* Packet information for NdisQueryPacket */
 721/* */
 722struct rt_packet_info {
 723        u32 PhysicalBufferCount;        /* Physical breaks of buffer descriptor chained */
 724        u32 BufferCount;        /* Number of Buffer descriptor chained */
 725        u32 TotalPacketLength;  /* Self explained */
 726        char *pFirstBuffer;     /* Pointer to first buffer descriptor */
 727};
 728
 729/* */
 730/*  Arcfour Structure Added by PaulWu */
 731/* */
 732struct rt_arcfourcontext {
 733        u32 X;
 734        u32 Y;
 735        u8 STATE[256];
 736};
 737
 738/* */
 739/* Tkip Key structure which RC4 key & MIC calculation */
 740/* */
 741struct rt_tkip_key_info {
 742        u32 nBytesInM;          /* # bytes in M for MICKEY */
 743        unsigned long IV16;
 744        unsigned long IV32;
 745        unsigned long K0;               /* for MICKEY Low */
 746        unsigned long K1;               /* for MICKEY Hig */
 747        unsigned long L;                /* Current state for MICKEY */
 748        unsigned long R;                /* Current state for MICKEY */
 749        unsigned long M;                /* Message accumulator for MICKEY */
 750        u8 RC4KEY[16];
 751        u8 MIC[8];
 752};
 753
 754/* */
 755/* Private / Misc data, counters for driver internal use */
 756/* */
 757struct rt_private {
 758        u32 SystemResetCnt;     /* System reset counter */
 759        u32 TxRingFullCnt;      /* Tx ring full occurrance number */
 760        u32 PhyRxErrCnt;        /* PHY Rx error count, for debug purpose, might move to global counter */
 761        /* Variables for WEP encryption / decryption in rtmp_wep.c */
 762        u32 FCSCRC32;
 763        struct rt_arcfourcontext WEPCONTEXT;
 764        /* Tkip stuff */
 765        struct rt_tkip_key_info Tx;
 766        struct rt_tkip_key_info Rx;
 767};
 768
 769/***************************************************************************
 770  *     Channel and BBP related data structures
 771  **************************************************************************/
 772/* structure to tune BBP R66 (BBP TUNING) */
 773struct rt_bbp_r66_tuning {
 774        BOOLEAN bEnable;
 775        u16 FalseCcaLowerThreshold;     /* default 100 */
 776        u16 FalseCcaUpperThreshold;     /* default 512 */
 777        u8 R66Delta;
 778        u8 R66CurrentValue;
 779        BOOLEAN R66LowerUpperSelect;    /*Before LinkUp, Used LowerBound or UpperBound as R66 value. */
 780};
 781
 782/* structure to store channel TX power */
 783struct rt_channel_tx_power {
 784        u16 RemainingTimeForUse;        /*unit: sec */
 785        u8 Channel;
 786        char Power;
 787        char Power2;
 788        u8 MaxTxPwr;
 789        u8 DfsReq;
 790};
 791
 792/* structure to store 802.11j channel TX power */
 793struct rt_channel_11j_tx_power {
 794        u8 Channel;
 795        u8 BW;          /* BW_10 or BW_20 */
 796        char Power;
 797        char Power2;
 798        u16 RemainingTimeForUse;        /*unit: sec */
 799};
 800
 801struct rt_soft_rx_ant_diversity {
 802        u8 EvaluatePeriod;      /* 0:not evalute status, 1: evaluate status, 2: switching status */
 803        u8 EvaluateStableCnt;
 804        u8 Pair1PrimaryRxAnt;   /* 0:Ant-E1, 1:Ant-E2 */
 805        u8 Pair1SecondaryRxAnt; /* 0:Ant-E1, 1:Ant-E2 */
 806        u8 Pair2PrimaryRxAnt;   /* 0:Ant-E3, 1:Ant-E4 */
 807        u8 Pair2SecondaryRxAnt; /* 0:Ant-E3, 1:Ant-E4 */
 808        short Pair1AvgRssi[2];  /* AvgRssi[0]:E1, AvgRssi[1]:E2 */
 809        short Pair2AvgRssi[2];  /* AvgRssi[0]:E3, AvgRssi[1]:E4 */
 810        short Pair1LastAvgRssi; /* */
 811        short Pair2LastAvgRssi; /* */
 812        unsigned long RcvPktNumWhenEvaluate;
 813        BOOLEAN FirstPktArrivedWhenEvaluate;
 814        struct rt_ralink_timer RxAntDiversityTimer;
 815};
 816
 817/***************************************************************************
 818  *     structure for radar detection and channel switch
 819  **************************************************************************/
 820struct rt_radar_detect {
 821        /*BOOLEAN           IEEE80211H;                     // 0: disable, 1: enable IEEE802.11h */
 822        u8 CSCount;             /*Channel switch counter */
 823        u8 CSPeriod;            /*Channel switch period (beacon count) */
 824        u8 RDCount;             /*Radar detection counter */
 825        u8 RDMode;              /*Radar Detection mode */
 826        u8 RDDurRegion; /*Radar detection duration region */
 827        u8 BBPR16;
 828        u8 BBPR17;
 829        u8 BBPR18;
 830        u8 BBPR21;
 831        u8 BBPR22;
 832        u8 BBPR64;
 833        unsigned long InServiceMonitorCount;    /* unit: sec */
 834        u8 DfsSessionTime;
 835        BOOLEAN bFastDfs;
 836        u8 ChMovingTime;
 837        u8 LongPulseRadarTh;
 838};
 839
 840typedef enum _ABGBAND_STATE_ {
 841        UNKNOWN_BAND,
 842        BG_BAND,
 843        A_BAND,
 844} ABGBAND_STATE;
 845
 846#ifdef RTMP_MAC_PCI
 847/* Power save method control */
 848typedef union _PS_CONTROL {
 849        struct {
 850                unsigned long EnablePSinIdle:1; /* Enable radio off when not connected to AP. radio on only when sitesurvey, */
 851                unsigned long EnableNewPS:1;    /* Enable new  Chip power save function . New method can only be applied in chip version after 2872. and PCIe. */
 852                unsigned long rt30xxPowerMode:2;        /* Power Level Mode for rt30xx chip */
 853                unsigned long rt30xxFollowHostASPM:1;   /* Card Follows Host's setting for rt30xx chip. */
 854                unsigned long rt30xxForceASPMTest:1;    /* Force enable L1 for rt30xx chip. This has higher priority than rt30xxFollowHostASPM Mode. */
 855                unsigned long rsv:26;   /* Radio Measurement Enable */
 856        } field;
 857        unsigned long word;
 858} PS_CONTROL, *PPS_CONTROL;
 859#endif /* RTMP_MAC_PCI // */
 860
 861/***************************************************************************
 862  *     structure for MLME state machine
 863  **************************************************************************/
 864struct rt_mlme {
 865        /* STA state machines */
 866        struct rt_state_machine CntlMachine;
 867        struct rt_state_machine AssocMachine;
 868        struct rt_state_machine AuthMachine;
 869        struct rt_state_machine AuthRspMachine;
 870        struct rt_state_machine SyncMachine;
 871        struct rt_state_machine WpaPskMachine;
 872        struct rt_state_machine LeapMachine;
 873        STATE_MACHINE_FUNC AssocFunc[ASSOC_FUNC_SIZE];
 874        STATE_MACHINE_FUNC AuthFunc[AUTH_FUNC_SIZE];
 875        STATE_MACHINE_FUNC AuthRspFunc[AUTH_RSP_FUNC_SIZE];
 876        STATE_MACHINE_FUNC SyncFunc[SYNC_FUNC_SIZE];
 877        STATE_MACHINE_FUNC ActFunc[ACT_FUNC_SIZE];
 878        /* Action */
 879        struct rt_state_machine ActMachine;
 880
 881        /* common WPA state machine */
 882        struct rt_state_machine WpaMachine;
 883        STATE_MACHINE_FUNC WpaFunc[WPA_FUNC_SIZE];
 884
 885        unsigned long ChannelQuality;   /* 0..100, Channel Quality Indication for Roaming */
 886        unsigned long Now32;            /* latch the value of NdisGetSystemUpTime() */
 887        unsigned long LastSendNULLpsmTime;
 888
 889        BOOLEAN bRunning;
 890        spinlock_t TaskLock;
 891        struct rt_mlme_queue Queue;
 892
 893        u32 ShiftReg;
 894
 895        struct rt_ralink_timer PeriodicTimer;
 896        struct rt_ralink_timer APSDPeriodicTimer;
 897        struct rt_ralink_timer LinkDownTimer;
 898        struct rt_ralink_timer LinkUpTimer;
 899#ifdef RTMP_MAC_PCI
 900        u8 bPsPollTimerRunning;
 901        struct rt_ralink_timer PsPollTimer;
 902        struct rt_ralink_timer RadioOnOffTimer;
 903#endif                          /* RTMP_MAC_PCI // */
 904        unsigned long PeriodicRound;
 905        unsigned long OneSecPeriodicRound;
 906
 907        u8 RealRxPath;
 908        BOOLEAN bLowThroughput;
 909        BOOLEAN bEnableAutoAntennaCheck;
 910        struct rt_ralink_timer RxAntEvalTimer;
 911
 912#ifdef RT30xx
 913        u8 CaliBW40RfR24;
 914        u8 CaliBW20RfR24;
 915#endif                          /* RT30xx // */
 916
 917#ifdef RTMP_MAC_USB
 918        struct rt_ralink_timer AutoWakeupTimer;
 919        BOOLEAN AutoWakeupTimerRunning;
 920#endif                          /* RTMP_MAC_USB // */
 921};
 922
 923/***************************************************************************
 924  *     802.11 N related data structures
 925  **************************************************************************/
 926struct reordering_mpdu {
 927        struct reordering_mpdu *next;
 928        void *pPacket;  /* coverted to 802.3 frame */
 929        int Sequence;           /* sequence number of MPDU */
 930        BOOLEAN bAMSDU;
 931};
 932
 933struct reordering_list {
 934        struct reordering_mpdu *next;
 935        int qlen;
 936};
 937
 938struct reordering_mpdu_pool {
 939        void *mem;
 940        spinlock_t lock;
 941        struct reordering_list freelist;
 942};
 943
 944typedef enum _REC_BLOCKACK_STATUS {
 945        Recipient_NONE = 0,
 946        Recipient_USED,
 947        Recipient_HandleRes,
 948        Recipient_Accept
 949} REC_BLOCKACK_STATUS, *PREC_BLOCKACK_STATUS;
 950
 951typedef enum _ORI_BLOCKACK_STATUS {
 952        Originator_NONE = 0,
 953        Originator_USED,
 954        Originator_WaitRes,
 955        Originator_Done
 956} ORI_BLOCKACK_STATUS, *PORI_BLOCKACK_STATUS;
 957
 958struct rt_ba_ori_entry {
 959        u8 Wcid;
 960        u8 TID;
 961        u8 BAWinSize;
 962        u8 Token;
 963/* Sequence is to fill every outgoing QoS DATA frame's sequence field in 802.11 header. */
 964        u16 Sequence;
 965        u16 TimeOutValue;
 966        ORI_BLOCKACK_STATUS ORI_BA_Status;
 967        struct rt_ralink_timer ORIBATimer;
 968        void *pAdapter;
 969};
 970
 971struct rt_ba_rec_entry {
 972        u8 Wcid;
 973        u8 TID;
 974        u8 BAWinSize;   /* 7.3.1.14. each buffer is capable of holding a max AMSDU or MSDU. */
 975        /*u8 NumOfRxPkt; */
 976        /*u8    Curindidx; // the head in the RX reordering buffer */
 977        u16 LastIndSeq;
 978/*      u16          LastIndSeqAtTimer; */
 979        u16 TimeOutValue;
 980        struct rt_ralink_timer RECBATimer;
 981        unsigned long LastIndSeqAtTimer;
 982        unsigned long nDropPacket;
 983        unsigned long rcvSeq;
 984        REC_BLOCKACK_STATUS REC_BA_Status;
 985/*      u8   RxBufIdxUsed; */
 986        /* corresponding virtual address for RX reordering packet storage. */
 987        /*RTMP_REORDERDMABUF MAP_RXBuf[MAX_RX_REORDERBUF]; */
 988        spinlock_t RxReRingLock;        /* Rx Ring spinlock */
 989/*      struct _BA_REC_ENTRY *pNext; */
 990        void *pAdapter;
 991        struct reordering_list list;
 992};
 993
 994struct rt_ba_table {
 995        unsigned long numAsRecipient;   /* I am recipient of numAsRecipient clients. These client are in the BARecEntry[] */
 996        unsigned long numAsOriginator;  /* I am originator of   numAsOriginator clients. These clients are in the BAOriEntry[] */
 997        unsigned long numDoneOriginator;        /* count Done Originator sessions */
 998        struct rt_ba_ori_entry BAOriEntry[MAX_LEN_OF_BA_ORI_TABLE];
 999        struct rt_ba_rec_entry BARecEntry[MAX_LEN_OF_BA_REC_TABLE];
1000};
1001
1002/*For QureyBATableOID use; */
1003struct PACKED rt_oid_ba_rec_entry {
1004        u8 MACAddr[MAC_ADDR_LEN];
1005        u8 BaBitmap;            /* if (BaBitmap&(1<<TID)), this session with{MACAddr, TID}exists, so read BufSize[TID] for BufferSize */
1006        u8 rsv;
1007        u8 BufSize[8];
1008        REC_BLOCKACK_STATUS REC_BA_Status[8];
1009};
1010
1011/*For QureyBATableOID use; */
1012struct PACKED rt_oid_ba_ori_entry {
1013        u8 MACAddr[MAC_ADDR_LEN];
1014        u8 BaBitmap;            /* if (BaBitmap&(1<<TID)), this session with{MACAddr, TID}exists, so read BufSize[TID] for BufferSize, read ORI_BA_Status[TID] for status */
1015        u8 rsv;
1016        u8 BufSize[8];
1017        ORI_BLOCKACK_STATUS ORI_BA_Status[8];
1018};
1019
1020struct rt_queryba_table {
1021        struct rt_oid_ba_ori_entry BAOriEntry[32];
1022        struct rt_oid_ba_rec_entry BARecEntry[32];
1023        u8 OriNum;              /* Number of below BAOriEntry */
1024        u8 RecNum;              /* Number of below BARecEntry */
1025};
1026
1027typedef union _BACAP_STRUC {
1028        struct {
1029                u32 RxBAWinLimit:8;
1030                u32 TxBAWinLimit:8;
1031                u32 AutoBA:1;   /* automatically BA */
1032                u32 Policy:2;   /* 0: DELAY_BA 1:IMMED_BA  (//BA Policy subfiled value in ADDBA frame)   2:BA-not use */
1033                u32 MpduDensity:3;
1034                u32 AmsduEnable:1;      /*Enable AMSDU transmisstion */
1035                u32 AmsduSize:1;        /* 0:3839, 1:7935 bytes. u32  MSDUSizeToBytes[]        = { 3839, 7935}; */
1036                u32 MMPSmode:2; /* MIMO power save more, 0:static, 1:dynamic, 2:rsv, 3:mimo enable */
1037                u32 bHtAdhoc:1; /* adhoc can use ht rate. */
1038                u32 b2040CoexistScanSup:1;      /*As Sta, support do 2040 coexistence scan for AP. As Ap, support monitor trigger event to check if can use BW 40MHz. */
1039                u32: 4;
1040        } field;
1041        u32 word;
1042} BACAP_STRUC, *PBACAP_STRUC;
1043
1044struct rt_oid_add_ba_entry {
1045        BOOLEAN IsRecipient;
1046        u8 MACAddr[MAC_ADDR_LEN];
1047        u8 TID;
1048        u8 nMSDU;
1049        u16 TimeOut;
1050        BOOLEAN bAllTid;        /* If True, delete all TID for BA sessions with this MACaddr. */
1051};
1052
1053#define IS_HT_STA(_pMacEntry)   \
1054        (_pMacEntry->MaxHTPhyMode.field.MODE >= MODE_HTMIX)
1055
1056#define IS_HT_RATE(_pMacEntry)  \
1057        (_pMacEntry->HTPhyMode.field.MODE >= MODE_HTMIX)
1058
1059#define PEER_IS_HT_RATE(_pMacEntry)     \
1060        (_pMacEntry->HTPhyMode.field.MODE >= MODE_HTMIX)
1061
1062/*This structure is for all 802.11n card InterOptibilityTest action. Reset all Num every n second.  (Details see MLMEPeriodic) */
1063struct rt_iot {
1064        u8 Threshold[2];
1065        u8 ReorderTimeOutNum[MAX_LEN_OF_BA_REC_TABLE];  /* compare with threshold[0] */
1066        u8 RefreshNum[MAX_LEN_OF_BA_REC_TABLE]; /* compare with threshold[1] */
1067        unsigned long OneSecInWindowCount;
1068        unsigned long OneSecFrameDuplicateCount;
1069        unsigned long OneSecOutWindowCount;
1070        u8 DelOriAct;
1071        u8 DelRecAct;
1072        u8 RTSShortProt;
1073        u8 RTSLongProt;
1074        BOOLEAN bRTSLongProtOn;
1075        BOOLEAN bLastAtheros;
1076        BOOLEAN bCurrentAtheros;
1077        BOOLEAN bNowAtherosBurstOn;
1078        BOOLEAN bNextDisableRxBA;
1079        BOOLEAN bToggle;
1080};
1081
1082/* This is the registry setting for 802.11n transmit setting.  Used in advanced page. */
1083typedef union _REG_TRANSMIT_SETTING {
1084        struct {
1085                /*u32  PhyMode:4; */
1086                /*u32  MCS:7;                 // MCS */
1087                u32 rsv0:10;
1088                u32 TxBF:1;
1089                u32 BW:1;       /*channel bandwidth 20MHz or 40 MHz */
1090                u32 ShortGI:1;
1091                u32 STBC:1;     /*SPACE */
1092                u32 TRANSNO:2;
1093                u32 HTMODE:1;
1094                u32 EXTCHA:2;
1095                u32 rsv:13;
1096        } field;
1097        u32 word;
1098} REG_TRANSMIT_SETTING, *PREG_TRANSMIT_SETTING;
1099
1100typedef union _DESIRED_TRANSMIT_SETTING {
1101        struct {
1102                u16 MCS:7;      /* MCS */
1103                u16 PhyMode:4;
1104                u16 FixedTxMode:2;      /* If MCS isn't AUTO, fix rate in CCK, OFDM or HT mode. */
1105                u16 rsv:3;
1106        } field;
1107        u16 word;
1108} DESIRED_TRANSMIT_SETTING, *PDESIRED_TRANSMIT_SETTING;
1109
1110#ifdef RTMP_MAC_USB
1111/***************************************************************************
1112  *     USB-based chip Beacon related data structures
1113  **************************************************************************/
1114#define BEACON_BITMAP_MASK              0xff
1115struct rt_beacon_sync {
1116        u8 BeaconBuf[HW_BEACON_MAX_COUNT][HW_BEACON_OFFSET];
1117        u8 BeaconTxWI[HW_BEACON_MAX_COUNT][TXWI_SIZE];
1118        unsigned long TimIELocationInBeacon[HW_BEACON_MAX_COUNT];
1119        unsigned long CapabilityInfoLocationInBeacon[HW_BEACON_MAX_COUNT];
1120        BOOLEAN EnableBeacon;   /* trigger to enable beacon transmission. */
1121        u8 BeaconBitMap;        /* NOTE: If the MAX_MBSSID_NUM is larger than 8, this parameter needs to change. */
1122        u8 DtimBitOn;   /* NOTE: If the MAX_MBSSID_NUM is larger than 8, this parameter needs to change. */
1123};
1124#endif /* RTMP_MAC_USB // */
1125
1126/***************************************************************************
1127  *     Multiple SSID related data structures
1128  **************************************************************************/
1129#define WLAN_MAX_NUM_OF_TIM                     ((MAX_LEN_OF_MAC_TABLE >> 3) + 1)       /* /8 + 1 */
1130#define WLAN_CT_TIM_BCMC_OFFSET         0       /* unit: 32B */
1131
1132/* clear bcmc TIM bit */
1133#define WLAN_MR_TIM_BCMC_CLEAR(apidx) \
1134        pAd->ApCfg.MBSSID[apidx].TimBitmaps[WLAN_CT_TIM_BCMC_OFFSET] &= ~BIT8[0];
1135
1136/* set bcmc TIM bit */
1137#define WLAN_MR_TIM_BCMC_SET(apidx) \
1138        pAd->ApCfg.MBSSID[apidx].TimBitmaps[WLAN_CT_TIM_BCMC_OFFSET] |= BIT8[0];
1139
1140/* clear a station PS TIM bit */
1141#define WLAN_MR_TIM_BIT_CLEAR(ad_p, apidx, wcid) \
1142        {       u8 tim_offset = wcid >> 3; \
1143                u8 bit_offset = wcid & 0x7; \
1144                ad_p->ApCfg.MBSSID[apidx].TimBitmaps[tim_offset] &= (~BIT8[bit_offset]); }
1145
1146/* set a station PS TIM bit */
1147#define WLAN_MR_TIM_BIT_SET(ad_p, apidx, wcid) \
1148        {       u8 tim_offset = wcid >> 3; \
1149                u8 bit_offset = wcid & 0x7; \
1150                ad_p->ApCfg.MBSSID[apidx].TimBitmaps[tim_offset] |= BIT8[bit_offset]; }
1151
1152/* configuration common to OPMODE_AP as well as OPMODE_STA */
1153struct rt_common_config {
1154
1155        BOOLEAN bCountryFlag;
1156        u8 CountryCode[3];
1157        u8 Geography;
1158        u8 CountryRegion;       /* Enum of country region, 0:FCC, 1:IC, 2:ETSI, 3:SPAIN, 4:France, 5:MKK, 6:MKK1, 7:Israel */
1159        u8 CountryRegionForABand;       /* Enum of country region for A band */
1160        u8 PhyMode;             /* PHY_11A, PHY_11B, PHY_11BG_MIXED, PHY_ABG_MIXED */
1161        u16 Dsifs;              /* in units of usec */
1162        unsigned long PacketFilter;     /* Packet filter for receiving */
1163        u8 RegulatoryClass;
1164
1165        char Ssid[MAX_LEN_OF_SSID];     /* NOT NULL-terminated */
1166        u8 SsidLen;             /* the actual ssid length in used */
1167        u8 LastSsidLen; /* the actual ssid length in used */
1168        char LastSsid[MAX_LEN_OF_SSID]; /* NOT NULL-terminated */
1169        u8 LastBssid[MAC_ADDR_LEN];
1170
1171        u8 Bssid[MAC_ADDR_LEN];
1172        u16 BeaconPeriod;
1173        u8 Channel;
1174        u8 CentralChannel;      /* Central Channel when using 40MHz is indicating. not real channel. */
1175
1176        u8 SupRate[MAX_LEN_OF_SUPPORTED_RATES];
1177        u8 SupRateLen;
1178        u8 ExtRate[MAX_LEN_OF_SUPPORTED_RATES];
1179        u8 ExtRateLen;
1180        u8 DesireRate[MAX_LEN_OF_SUPPORTED_RATES];      /* OID_802_11_DESIRED_RATES */
1181        u8 MaxDesiredRate;
1182        u8 ExpectedACKRate[MAX_LEN_OF_SUPPORTED_RATES];
1183
1184        unsigned long BasicRateBitmap;  /* backup basic ratebitmap */
1185
1186        BOOLEAN bAPSDCapable;
1187        BOOLEAN bInServicePeriod;
1188        BOOLEAN bAPSDAC_BE;
1189        BOOLEAN bAPSDAC_BK;
1190        BOOLEAN bAPSDAC_VI;
1191        BOOLEAN bAPSDAC_VO;
1192
1193        /* because TSPEC can modify the APSD flag, we need to keep the APSD flag
1194           requested in association stage from the station;
1195           we need to recover the APSD flag after the TSPEC is deleted. */
1196        BOOLEAN bACMAPSDBackup[4];      /* for delivery-enabled & trigger-enabled both */
1197        BOOLEAN bACMAPSDTr[4];  /* no use */
1198
1199        BOOLEAN bNeedSendTriggerFrame;
1200        BOOLEAN bAPSDForcePowerSave;    /* Force power save mode, should only use in APSD-STAUT */
1201        unsigned long TriggerTimerCount;
1202        u8 MaxSPLength;
1203        u8 BBPCurrentBW;        /* BW_10,       BW_20, BW_40 */
1204        /* move to MULTISSID_STRUCT for MBSS */
1205        /*HTTRANSMIT_SETTING    HTPhyMode, MaxHTPhyMode, MinHTPhyMode;// For transmit phy setting in TXWI. */
1206        REG_TRANSMIT_SETTING RegTransmitSetting;        /*registry transmit setting. this is for reading registry setting only. not useful. */
1207        /*u8       FixedTxMode;              // Fixed Tx Mode (CCK, OFDM), for HT fixed tx mode (GF, MIX) , refer to RegTransmitSetting.field.HTMode */
1208        u8 TxRate;              /* Same value to fill in TXD. TxRate is 6-bit */
1209        u8 MaxTxRate;   /* RATE_1, RATE_2, RATE_5_5, RATE_11 */
1210        u8 TxRateIndex; /* Tx rate index in RateSwitchTable */
1211        u8 TxRateTableSize;     /* Valid Tx rate table size in RateSwitchTable */
1212        /*BOOLEAN               bAutoTxRateSwitch; */
1213        u8 MinTxRate;   /* RATE_1, RATE_2, RATE_5_5, RATE_11 */
1214        u8 RtsRate;             /* RATE_xxx */
1215        HTTRANSMIT_SETTING MlmeTransmit;        /* MGMT frame PHY rate setting when operation at Ht rate. */
1216        u8 MlmeRate;            /* RATE_xxx, used to send MLME frames */
1217        u8 BasicMlmeRate;       /* Default Rate for sending MLME frames */
1218
1219        u16 RtsThreshold;       /* in unit of BYTE */
1220        u16 FragmentThreshold;  /* in unit of BYTE */
1221
1222        u8 TxPower;             /* in unit of mW */
1223        unsigned long TxPowerPercentage;        /* 0~100 % */
1224        unsigned long TxPowerDefault;   /* keep for TxPowerPercentage */
1225        u8 PwrConstraint;
1226
1227        BACAP_STRUC BACapability;       /*   NO USE = 0XFF  ;  IMMED_BA =1  ;  DELAY_BA=0 */
1228        BACAP_STRUC REGBACapability;    /*   NO USE = 0XFF  ;  IMMED_BA =1  ;  DELAY_BA=0 */
1229
1230        struct rt_iot IOTestParm;       /* 802.11n InterOpbility Test Parameter; */
1231        unsigned long TxPreamble;       /* Rt802_11PreambleLong, Rt802_11PreambleShort, Rt802_11PreambleAuto */
1232        BOOLEAN bUseZeroToDisableFragment;      /* Microsoft use 0 as disable */
1233        unsigned long UseBGProtection;  /* 0: auto, 1: always use, 2: always not use */
1234        BOOLEAN bUseShortSlotTime;      /* 0: disable, 1 - use short slot (9us) */
1235        BOOLEAN bEnableTxBurst; /* 1: enble TX PACKET BURST (when BA is established or AP is not a legacy WMM AP), 0: disable TX PACKET BURST */
1236        BOOLEAN bAggregationCapable;    /* 1: enable TX aggregation when the peer supports it */
1237        BOOLEAN bPiggyBackCapable;      /* 1: enable TX piggy-back according MAC's version */
1238        BOOLEAN bIEEE80211H;    /* 1: enable IEEE802.11h spec. */
1239        unsigned long DisableOLBCDetect;        /* 0: enable OLBC detect; 1 disable OLBC detect */
1240
1241        BOOLEAN bRdg;
1242
1243        BOOLEAN bWmmCapable;    /* 0:disable WMM, 1:enable WMM */
1244        struct rt_qos_capability_parm APQosCapability;  /* QOS capability of the current associated AP */
1245        struct rt_edca_parm APEdcaParm; /* EDCA parameters of the current associated AP */
1246        struct rt_qbss_load_parm APQbssLoad;    /* QBSS load of the current associated AP */
1247        u8 AckPolicy[4];        /* ACK policy of the specified AC. see ACK_xxx */
1248        BOOLEAN bDLSCapable;    /* 0:disable DLS, 1:enable DLS */
1249        /* a bitmap of BOOLEAN flags. each bit represent an operation status of a particular */
1250        /* BOOLEAN control, either ON or OFF. These flags should always be accessed via */
1251        /* OPSTATUS_TEST_FLAG(), OPSTATUS_SET_FLAG(), OP_STATUS_CLEAR_FLAG() macros. */
1252        /* see fOP_STATUS_xxx in RTMP_DEF.C for detail bit definition */
1253        unsigned long OpStatusFlags;
1254
1255        BOOLEAN NdisRadioStateOff;      /*For HCT 12.0, set this flag to TRUE instead of called MlmeRadioOff. */
1256        ABGBAND_STATE BandState;        /* For setting BBP used on B/G or A mode. */
1257
1258        /* IEEE802.11H--DFS. */
1259        struct rt_radar_detect RadarDetect;
1260
1261        /* HT */
1262        u8 BASize;              /* USer desired BAWindowSize. Should not exceed our max capability */
1263        /*struct rt_ht_capability      SupportedHtPhy; */
1264        struct rt_ht_capability DesiredHtPhy;
1265        struct rt_ht_capability_ie HtCapability;
1266        struct rt_add_ht_info_ie AddHTInfo;     /* Useful as AP. */
1267        /*This IE is used with channel switch announcement element when changing to a new 40MHz. */
1268        /*This IE is included in channel switch announcement frames 7.4.1.5, beacons, probe Rsp. */
1269        struct rt_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 */
1270
1271        BOOLEAN bHTProtect;
1272        BOOLEAN bMIMOPSEnable;
1273        BOOLEAN bBADecline;
1274/*2008/11/05: KH add to support Antenna power-saving of AP<-- */
1275        BOOLEAN bGreenAPEnable;
1276/*2008/11/05: KH add to support Antenna power-saving of AP--> */
1277        BOOLEAN bDisableReordering;
1278        BOOLEAN bForty_Mhz_Intolerant;
1279        BOOLEAN bExtChannelSwitchAnnouncement;
1280        BOOLEAN bRcvBSSWidthTriggerEvents;
1281        unsigned long LastRcvBSSWidthTriggerEventsTime;
1282
1283        u8 TxBASize;
1284
1285        /* Enable wireless event */
1286        BOOLEAN bWirelessEvent;
1287        BOOLEAN bWiFiTest;      /* Enable this parameter for WiFi test */
1288
1289        /* Tx & Rx Stream number selection */
1290        u8 TxStream;
1291        u8 RxStream;
1292
1293        BOOLEAN bHardwareRadio; /* Hardware controlled Radio enabled */
1294
1295#ifdef RTMP_MAC_USB
1296        BOOLEAN bMultipleIRP;   /* Multiple Bulk IN flag */
1297        u8 NumOfBulkInIRP;      /* if bMultipleIRP == TRUE, NumOfBulkInIRP will be 4 otherwise be 1 */
1298        struct rt_ht_capability SupportedHtPhy;
1299        unsigned long MaxPktOneTxBulk;
1300        u8 TxBulkFactor;
1301        u8 RxBulkFactor;
1302
1303        BOOLEAN IsUpdateBeacon;
1304        struct rt_beacon_sync *pBeaconSync;
1305        struct rt_ralink_timer BeaconUpdateTimer;
1306        u32 BeaconAdjust;
1307        u32 BeaconFactor;
1308        u32 BeaconRemain;
1309#endif                          /* RTMP_MAC_USB // */
1310
1311        spinlock_t MeasureReqTabLock;
1312        struct rt_measure_req_tab *pMeasureReqTab;
1313
1314        spinlock_t TpcReqTabLock;
1315        struct rt_tpc_req_tab *pTpcReqTab;
1316
1317        BOOLEAN PSPXlink;       /* 0: Disable. 1: Enable */
1318
1319#if defined(RT305x) || defined(RT30xx)
1320        /* request by Gary, for High Power issue */
1321        u8 HighPowerPatchDisabled;
1322#endif
1323
1324        BOOLEAN HT_DisallowTKIP;        /* Restrict the encryption type in 11n HT mode */
1325};
1326
1327/* Modified by Wu Xi-Kun 4/21/2006 */
1328/* STA configuration and status */
1329struct rt_sta_admin_config {
1330        /* GROUP 1 - */
1331        /*   User configuration loaded from Registry, E2PROM or OID_xxx. These settings describe */
1332        /*   the user intended configuration, but not necessary fully equal to the final */
1333        /*   settings in ACTIVE BSS after negotiation/compromise with the BSS holder (either */
1334        /*   AP or IBSS holder). */
1335        /*   Once initialized, user configuration can only be changed via OID_xxx */
1336        u8 BssType;             /* BSS_INFRA or BSS_ADHOC */
1337        u16 AtimWin;            /* used when starting a new IBSS */
1338
1339        /* GROUP 2 - */
1340        /*   User configuration loaded from Registry, E2PROM or OID_xxx. These settings describe */
1341        /*   the user intended configuration, and should be always applied to the final */
1342        /*   settings in ACTIVE BSS without compromising with the BSS holder. */
1343        /*   Once initialized, user configuration can only be changed via OID_xxx */
1344        u8 RssiTrigger;
1345        u8 RssiTriggerMode;     /* RSSI_TRIGGERED_UPON_BELOW_THRESHOLD or RSSI_TRIGGERED_UPON_EXCCEED_THRESHOLD */
1346        u16 DefaultListenCount; /* default listen count; */
1347        unsigned long WindowsPowerMode; /* Power mode for AC power */
1348        unsigned long WindowsBatteryPowerMode;  /* Power mode for battery if exists */
1349        BOOLEAN bWindowsACCAMEnable;    /* Enable CAM power mode when AC on */
1350        BOOLEAN bAutoReconnect; /* Set to TRUE when setting OID_802_11_SSID with no matching BSSID */
1351        unsigned long WindowsPowerProfile;      /* Windows power profile, for NDIS5.1 PnP */
1352
1353        /* MIB:ieee802dot11.dot11smt(1).dot11StationConfigTable(1) */
1354        u16 Psm;                /* power management mode   (PWR_ACTIVE|PWR_SAVE) */
1355        u16 DisassocReason;
1356        u8 DisassocSta[MAC_ADDR_LEN];
1357        u16 DeauthReason;
1358        u8 DeauthSta[MAC_ADDR_LEN];
1359        u16 AuthFailReason;
1360        u8 AuthFailSta[MAC_ADDR_LEN];
1361
1362        NDIS_802_11_PRIVACY_FILTER PrivacyFilter;       /* PrivacyFilter enum for 802.1X */
1363        NDIS_802_11_AUTHENTICATION_MODE AuthMode;       /* This should match to whatever microsoft defined */
1364        NDIS_802_11_WEP_STATUS WepStatus;
1365        NDIS_802_11_WEP_STATUS OrigWepStatus;   /* Original wep status set from OID */
1366
1367        /* Add to support different cipher suite for WPA2/WPA mode */
1368        NDIS_802_11_ENCRYPTION_STATUS GroupCipher;      /* Multicast cipher suite */
1369        NDIS_802_11_ENCRYPTION_STATUS PairCipher;       /* Unicast cipher suite */
1370        BOOLEAN bMixCipher;     /* Indicate current Pair & Group use different cipher suites */
1371        u16 RsnCapability;
1372
1373        NDIS_802_11_WEP_STATUS GroupKeyWepStatus;
1374
1375        u8 WpaPassPhrase[64];   /* WPA PSK pass phrase */
1376        u32 WpaPassPhraseLen;   /* the length of WPA PSK pass phrase */
1377        u8 PMK[32];             /* WPA PSK mode PMK */
1378        u8 PTK[64];             /* WPA PSK mode PTK */
1379        u8 GTK[32];             /* GTK from authenticator */
1380        struct rt_bssid_info SavedPMK[PMKID_NO];
1381        u32 SavedPMKNum;        /* Saved PMKID number */
1382
1383        u8 DefaultKeyId;
1384
1385        /* WPA 802.1x port control, WPA_802_1X_PORT_SECURED, WPA_802_1X_PORT_NOT_SECURED */
1386        u8 PortSecured;
1387
1388        /* For WPA countermeasures */
1389        unsigned long LastMicErrorTime; /* record last MIC error time */
1390        unsigned long MicErrCnt;        /* Should be 0, 1, 2, then reset to zero (after disassociation). */
1391        BOOLEAN bBlockAssoc;    /* Block associate attempt for 60 seconds after counter measure occurred. */
1392        /* For WPA-PSK supplicant state */
1393        WPA_STATE WpaState;     /* Default is SS_NOTUSE and handled by microsoft 802.1x */
1394        u8 ReplayCounter[8];
1395        u8 ANonce[32];  /* ANonce for WPA-PSK from auhenticator */
1396        u8 SNonce[32];  /* SNonce for WPA-PSK */
1397
1398        u8 LastSNR0;            /* last received BEACON's SNR */
1399        u8 LastSNR1;            /* last received BEACON's SNR for 2nd  antenna */
1400        struct rt_rssi_sample RssiSample;
1401        unsigned long NumOfAvgRssiSample;
1402
1403        unsigned long LastBeaconRxTime; /* OS's timestamp of the last BEACON RX time */
1404        unsigned long Last11bBeaconRxTime;      /* OS's timestamp of the last 11B BEACON RX time */
1405        unsigned long Last11gBeaconRxTime;      /* OS's timestamp of the last 11G BEACON RX time */
1406        unsigned long Last20NBeaconRxTime;      /* OS's timestamp of the last 20MHz N BEACON RX time */
1407
1408        unsigned long LastScanTime;     /* Record last scan time for issue BSSID_SCAN_LIST */
1409        unsigned long ScanCnt;          /* Scan counts since most recent SSID, BSSID, SCAN OID request */
1410        BOOLEAN bSwRadio;       /* Software controlled Radio On/Off, TRUE: On */
1411        BOOLEAN bHwRadio;       /* Hardware controlled Radio On/Off, TRUE: On */
1412        BOOLEAN bRadio;         /* Radio state, And of Sw & Hw radio state */
1413        BOOLEAN bHardwareRadio; /* Hardware controlled Radio enabled */
1414        BOOLEAN bShowHiddenSSID;        /* Show all known SSID in SSID list get operation */
1415
1416        /* New for WPA, windows want us to keep association information and */
1417        /* Fixed IEs from last association response */
1418        struct rt_ndis_802_11_association_information AssocInfo;
1419        u16 ReqVarIELen;        /* Length of next VIE include EID & Length */
1420        u8 ReqVarIEs[MAX_VIE_LEN];      /* The content saved here should be little-endian format. */
1421        u16 ResVarIELen;        /* Length of next VIE include EID & Length */
1422        u8 ResVarIEs[MAX_VIE_LEN];
1423
1424        u8 RSNIE_Len;
1425        u8 RSN_IE[MAX_LEN_OF_RSNIE];    /* The content saved here should be little-endian format. */
1426
1427        unsigned long CLBusyBytes;      /* Save the total bytes received during channel load scan time */
1428        u16 RPIDensity[8];      /* Array for RPI density collection */
1429
1430        u8 RMReqCnt;            /* Number of measurement request saved. */
1431        u8 CurrentRMReqIdx;     /* Number of measurement request saved. */
1432        BOOLEAN ParallelReq;    /* Parallel measurement, only one request performed, */
1433        /* It must be the same channel with maximum duration */
1434        u16 ParallelDuration;   /* Maximum duration for parallel measurement */
1435        u8 ParallelChannel;     /* Only one channel with parallel measurement */
1436        u16 IAPPToken;  /* IAPP dialog token */
1437        /* Hack for channel load and noise histogram parameters */
1438        u8 NHFactor;            /* Parameter for Noise histogram */
1439        u8 CLFactor;            /* Parameter for channel load */
1440
1441        struct rt_ralink_timer StaQuickResponeForRateUpTimer;
1442        BOOLEAN StaQuickResponeForRateUpTimerRunning;
1443
1444        u8 DtimCount;   /* 0.. DtimPeriod-1 */
1445        u8 DtimPeriod;  /* default = 3 */
1446
1447        /*////////////////////////////////////////////////////////////////////////////////////// */
1448        /* This is only for WHQL test. */
1449        BOOLEAN WhqlTest;
1450        /*////////////////////////////////////////////////////////////////////////////////////// */
1451
1452        struct rt_ralink_timer WpaDisassocAndBlockAssocTimer;
1453        /* Fast Roaming */
1454        BOOLEAN bAutoRoaming;   /* 0:disable auto roaming by RSSI, 1:enable auto roaming by RSSI */
1455        char dBmToRoam;         /* the condition to roam when receiving Rssi less than this value. It's negative value. */
1456
1457        BOOLEAN IEEE8021X;
1458        BOOLEAN IEEE8021x_required_keys;
1459        struct rt_cipher_key DesireSharedKey[4];        /* Record user desired WEP keys */
1460        u8 DesireSharedKeyId;
1461
1462        /* 0: driver ignores wpa_supplicant */
1463        /* 1: wpa_supplicant initiates scanning and AP selection */
1464        /* 2: driver takes care of scanning, AP selection, and IEEE 802.11 association parameters */
1465        u8 WpaSupplicantUP;
1466        u8 WpaSupplicantScanCount;
1467        BOOLEAN bRSN_IE_FromWpaSupplicant;
1468
1469        char dev_name[16];
1470        u16 OriDevType;
1471
1472        BOOLEAN bTGnWifiTest;
1473        BOOLEAN bScanReqIsFromWebUI;
1474
1475        HTTRANSMIT_SETTING HTPhyMode, MaxHTPhyMode, MinHTPhyMode;       /* For transmit phy setting in TXWI. */
1476        DESIRED_TRANSMIT_SETTING DesiredTransmitSetting;
1477        struct rt_ht_phy_info DesiredHtPhyInfo;
1478        BOOLEAN bAutoTxRateSwitch;
1479
1480#ifdef RTMP_MAC_PCI
1481        u8 BBPR3;
1482        /* PS Control has 2 meanings for advanced power save function. */
1483        /* 1. EnablePSinIdle : When no connection, always radio off except need to do site survey. */
1484        /* 2. EnableNewPS  : will save more current in sleep or radio off mode. */
1485        PS_CONTROL PSControl;
1486#endif                          /* RTMP_MAC_PCI // */
1487
1488        BOOLEAN bAutoConnectByBssid;
1489        unsigned long BeaconLostTime;   /* seconds */
1490        BOOLEAN bForceTxBurst;  /* 1: force enble TX PACKET BURST, 0: disable */
1491};
1492
1493/* This data structure keeps the current active BSS/IBSS's configuration that this STA */
1494/* had agreed upon joining the network. Which means these parameters are usually decided */
1495/* by the BSS/IBSS creator instead of user configuration. Data in this data structure */
1496/* is valid only when either ADHOC_ON(pAd) or INFRA_ON(pAd) is TRUE. */
1497/* Normally, after SCAN or failed roaming attempts, we need to recover back to */
1498/* the current active settings. */
1499struct rt_sta_active_config {
1500        u16 Aid;
1501        u16 AtimWin;            /* in kusec; IBSS parameter set element */
1502        u16 CapabilityInfo;
1503        u16 CfpMaxDuration;
1504        u16 CfpPeriod;
1505
1506        /* Copy supported rate from desired AP's beacon. We are trying to match */
1507        /* AP's supported and extended rate settings. */
1508        u8 SupRate[MAX_LEN_OF_SUPPORTED_RATES];
1509        u8 ExtRate[MAX_LEN_OF_SUPPORTED_RATES];
1510        u8 SupRateLen;
1511        u8 ExtRateLen;
1512        /* Copy supported ht from desired AP's beacon. We are trying to match */
1513        struct rt_ht_phy_info SupportedPhyInfo;
1514        struct rt_ht_capability SupportedHtPhy;
1515};
1516
1517struct rt_mac_table_entry;
1518
1519struct rt_mac_table_entry {
1520        /*Choose 1 from ValidAsWDS and ValidAsCLI  to validize. */
1521        BOOLEAN ValidAsCLI;     /* Sta mode, set this TRUE after Linkup,too. */
1522        BOOLEAN ValidAsWDS;     /* This is WDS Entry. only for AP mode. */
1523        BOOLEAN ValidAsApCli;   /* This is a AP-Client entry, only for AP mode which enable AP-Client functions. */
1524        BOOLEAN ValidAsMesh;
1525        BOOLEAN ValidAsDls;     /* This is DLS Entry. only for STA mode. */
1526        BOOLEAN isCached;
1527        BOOLEAN bIAmBadAtheros; /* Flag if this is Atheros chip that has IOT problem.  We need to turn on RTS/CTS protection. */
1528
1529        u8 EnqueueEapolStartTimerRunning;       /* Enqueue EAPoL-Start for triggering EAP SM */
1530        /*jan for wpa */
1531        /* record which entry revoke MIC Failure, if it leaves the BSS itself, AP won't update aMICFailTime MIB */
1532        u8 CMTimerRunning;
1533        u8 apidx;               /* MBSS number */
1534        u8 RSNIE_Len;
1535        u8 RSN_IE[MAX_LEN_OF_RSNIE];
1536        u8 ANonce[LEN_KEY_DESC_NONCE];
1537        u8 SNonce[LEN_KEY_DESC_NONCE];
1538        u8 R_Counter[LEN_KEY_DESC_REPLAY];
1539        u8 PTK[64];
1540        u8 ReTryCounter;
1541        struct rt_ralink_timer RetryTimer;
1542        struct rt_ralink_timer EnqueueStartForPSKTimer; /* A timer which enqueue EAPoL-Start for triggering PSK SM */
1543        NDIS_802_11_AUTHENTICATION_MODE AuthMode;       /* This should match to whatever microsoft defined */
1544        NDIS_802_11_WEP_STATUS WepStatus;
1545        NDIS_802_11_WEP_STATUS GroupKeyWepStatus;
1546        AP_WPA_STATE WpaState;
1547        GTK_STATE GTKState;
1548        u16 PortSecured;
1549        NDIS_802_11_PRIVACY_FILTER PrivacyFilter;       /* PrivacyFilter enum for 802.1X */
1550        struct rt_cipher_key PairwiseKey;
1551        void *pAd;
1552        int PMKID_CacheIdx;
1553        u8 PMKID[LEN_PMKID];
1554
1555        u8 Addr[MAC_ADDR_LEN];
1556        u8 PsMode;
1557        SST Sst;
1558        AUTH_STATE AuthState;   /* for SHARED KEY authentication state machine used only */
1559        BOOLEAN IsReassocSta;   /* Indicate whether this is a reassociation procedure */
1560        u16 Aid;
1561        u16 CapabilityInfo;
1562        u8 LastRssi;
1563        unsigned long NoDataIdleCount;
1564        u16 StationKeepAliveCount;      /* unit: second */
1565        unsigned long PsQIdleCount;
1566        struct rt_queue_header PsQueue;
1567
1568        u32 StaConnectTime;     /* the live time of this station since associated with AP */
1569
1570        BOOLEAN bSendBAR;
1571        u16 NoBADataCountDown;
1572
1573        u32 CachedBuf[16];      /* u32 (4 bytes) for alignment */
1574        u32 TxBFCount;          /* 3*3 */
1575        u32 FIFOCount;
1576        u32 DebugFIFOCount;
1577        u32 DebugTxCount;
1578        BOOLEAN bDlsInit;
1579
1580/*==================================================== */
1581/*WDS entry needs these */
1582/* if ValidAsWDS==TRUE, MatchWDSTabIdx is the index in WdsTab.MacTab */
1583        u32 MatchWDSTabIdx;
1584        u8 MaxSupportedRate;
1585        u8 CurrTxRate;
1586        u8 CurrTxRateIndex;
1587        /* to record the each TX rate's quality. 0 is best, the bigger the worse. */
1588        u16 TxQuality[MAX_STEP_OF_TX_RATE_SWITCH];
1589/*      u16          OneSecTxOkCount; */
1590        u32 OneSecTxNoRetryOkCount;
1591        u32 OneSecTxRetryOkCount;
1592        u32 OneSecTxFailCount;
1593        u32 ContinueTxFailCnt;
1594        u32 CurrTxRateStableTime;       /* # of second in current TX rate */
1595        u8 TxRateUpPenalty;     /* extra # of second penalty due to last unstable condition */
1596/*==================================================== */
1597
1598        BOOLEAN fNoisyEnvironment;
1599        BOOLEAN fLastSecAccordingRSSI;
1600        u8 LastSecTxRateChangeAction;   /* 0: no change, 1:rate UP, 2:rate down */
1601        char LastTimeTxRateChangeAction;        /*Keep last time value of LastSecTxRateChangeAction */
1602        unsigned long LastTxOkCount;
1603        u8 PER[MAX_STEP_OF_TX_RATE_SWITCH];
1604
1605        /* a bitmap of BOOLEAN flags. each bit represent an operation status of a particular */
1606        /* BOOLEAN control, either ON or OFF. These flags should always be accessed via */
1607        /* CLIENT_STATUS_TEST_FLAG(), CLIENT_STATUS_SET_FLAG(), CLIENT_STATUS_CLEAR_FLAG() macros. */
1608        /* see fOP_STATUS_xxx in RTMP_DEF.C for detail bit definition. fCLIENT_STATUS_AMSDU_INUSED */
1609        unsigned long ClientStatusFlags;
1610
1611        HTTRANSMIT_SETTING HTPhyMode, MaxHTPhyMode, MinHTPhyMode;       /* For transmit phy setting in TXWI. */
1612
1613        /* HT EWC MIMO-N used parameters */
1614        u16 RXBAbitmap; /* fill to on-chip  RXWI_BA_BITMASK in 8.1.3RX attribute entry format */
1615        u16 TXBAbitmap; /* This bitmap as originator, only keep in software used to mark AMPDU bit in TXWI */
1616        u16 TXAutoBAbitmap;
1617        u16 BADeclineBitmap;
1618        u16 BARecWcidArray[NUM_OF_TID]; /* The mapping wcid of recipient session. if RXBAbitmap bit is masked */
1619        u16 BAOriWcidArray[NUM_OF_TID]; /* The mapping wcid of originator session. if TXBAbitmap bit is masked */
1620        u16 BAOriSequence[NUM_OF_TID];  /* The mapping wcid of originator session. if TXBAbitmap bit is masked */
1621
1622        /* 802.11n features. */
1623        u8 MpduDensity;
1624        u8 MaxRAmpduFactor;
1625        u8 AMsduSize;
1626        u8 MmpsMode;            /* MIMO power save more. */
1627
1628        struct rt_ht_capability_ie HTCapability;
1629
1630        BOOLEAN bAutoTxRateSwitch;
1631
1632        u8 RateLen;
1633        struct rt_mac_table_entry *pNext;
1634        u16 TxSeq[NUM_OF_TID];
1635        u16 NonQosDataSeq;
1636
1637        struct rt_rssi_sample RssiSample;
1638
1639        u32 TXMCSExpected[16];
1640        u32 TXMCSSuccessful[16];
1641        u32 TXMCSFailed[16];
1642        u32 TXMCSAutoFallBack[16][16];
1643
1644        unsigned long LastBeaconRxTime;
1645
1646        unsigned long AssocDeadLine;
1647};
1648
1649struct rt_mac_table {
1650        u16 Size;
1651        struct rt_mac_table_entry *Hash[HASH_TABLE_SIZE];
1652        struct rt_mac_table_entry Content[MAX_LEN_OF_MAC_TABLE];
1653        struct rt_queue_header McastPsQueue;
1654        unsigned long PsQIdleCount;
1655        BOOLEAN fAnyStationInPsm;
1656        BOOLEAN fAnyStationBadAtheros;  /* Check if any Station is atheros 802.11n Chip.  We need to use RTS/CTS with Atheros 802,.11n chip. */
1657        BOOLEAN fAnyTxOPForceDisable;   /* Check if it is necessary to disable BE TxOP */
1658        BOOLEAN fAllStationAsRalink;    /* Check if all stations are ralink-chipset */
1659        BOOLEAN fAnyStationIsLegacy;    /* Check if I use legacy rate to transmit to my BSS Station/ */
1660        BOOLEAN fAnyStationNonGF;       /* Check if any Station can't support GF. */
1661        BOOLEAN fAnyStation20Only;      /* Check if any Station can't support GF. */
1662        BOOLEAN fAnyStationMIMOPSDynamic;       /* Check if any Station is MIMO Dynamic */
1663        BOOLEAN fAnyBASession;  /* Check if there is BA session.  Force turn on RTS/CTS */
1664/*2008/10/28: KH add to support Antenna power-saving of AP<-- */
1665/*2008/10/28: KH add to support Antenna power-saving of AP--> */
1666};
1667
1668struct wificonf {
1669        BOOLEAN bShortGI;
1670        BOOLEAN bGreenField;
1671};
1672
1673struct rt_rtmp_dev_info {
1674        u8 chipName[16];
1675        RTMP_INF_TYPE infType;
1676};
1677
1678struct rt_rtmp_chip_op {
1679        /*  Calibration access related callback functions */
1680        int (*eeinit) (struct rt_rtmp_adapter *pAd);    /* int (*eeinit)(struct rt_rtmp_adapter *pAd); */
1681        int (*eeread) (struct rt_rtmp_adapter *pAd, u16 offset, u16 *pValue);   /* int (*eeread)(struct rt_rtmp_adapter *pAd, int offset, u16 *pValue); */
1682
1683        /* MCU related callback functions */
1684        int (*loadFirmware) (struct rt_rtmp_adapter *pAd);      /* int (*loadFirmware)(struct rt_rtmp_adapter *pAd); */
1685        int (*eraseFirmware) (struct rt_rtmp_adapter *pAd);     /* int (*eraseFirmware)(struct rt_rtmp_adapter *pAd); */
1686        int (*sendCommandToMcu) (struct rt_rtmp_adapter *pAd, u8 cmd, u8 token, u8 arg0, u8 arg1);;     /* int (*sendCommandToMcu)(struct rt_rtmp_adapter *pAd, u8 cmd, u8 token, u8 arg0, u8 arg1); */
1687
1688        /* RF access related callback functions */
1689        struct rt_reg_pair *pRFRegTable;
1690        void (*AsicRfInit) (struct rt_rtmp_adapter *pAd);
1691        void (*AsicRfTurnOn) (struct rt_rtmp_adapter *pAd);
1692        void (*AsicRfTurnOff) (struct rt_rtmp_adapter *pAd);
1693        void (*AsicReverseRfFromSleepMode) (struct rt_rtmp_adapter *pAd);
1694        void (*AsicHaltAction) (struct rt_rtmp_adapter *pAd);
1695};
1696
1697/* */
1698/*  The miniport adapter structure */
1699/* */
1700struct rt_rtmp_adapter {
1701        void *OS_Cookie;        /* save specific structure relative to OS */
1702        struct net_device *net_dev;
1703        unsigned long VirtualIfCnt;
1704        const struct firmware *firmware;
1705
1706        struct rt_rtmp_chip_op chipOps;
1707        u16 ThisTbttNumToNextWakeUp;
1708
1709#ifdef RTMP_MAC_PCI
1710/*****************************************************************************************/
1711/*      PCI related parameters                                                                                                                            */
1712/*****************************************************************************************/
1713        u8 *CSRBaseAddress;     /* PCI MMIO Base Address, all access will use */
1714        unsigned int irq_num;
1715
1716        u16 LnkCtrlBitMask;
1717        u16 RLnkCtrlConfiguration;
1718        u16 RLnkCtrlOffset;
1719        u16 HostLnkCtrlConfiguration;
1720        u16 HostLnkCtrlOffset;
1721        u16 PCIePowerSaveLevel;
1722        unsigned long Rt3xxHostLinkCtrl;        /* USed for 3090F chip */
1723        unsigned long Rt3xxRalinkLinkCtrl;      /* USed for 3090F chip */
1724        u16 DeviceID;   /* Read from PCI config */
1725        unsigned long AccessBBPFailCount;
1726        BOOLEAN bPCIclkOff;     /* flag that indicates if the PICE power status in Configuration Space.. */
1727        BOOLEAN bPCIclkOffDisableTx;    /* */
1728
1729        BOOLEAN brt30xxBanMcuCmd;       /*when = 0xff means all commands are ok to set . */
1730        BOOLEAN b3090ESpecialChip;      /*3090E special chip that write EEPROM 0x24=0x9280. */
1731        unsigned long CheckDmaBusyCount;        /* Check Interrupt Status Register Count. */
1732
1733        u32 int_enable_reg;
1734        u32 int_disable_mask;
1735        u32 int_pending;
1736
1737        struct rt_rtmp_dmabuf TxBufSpace[NUM_OF_TX_RING];       /* Shared memory of all 1st pre-allocated TxBuf associated with each TXD */
1738        struct rt_rtmp_dmabuf RxDescRing;       /* Shared memory for RX descriptors */
1739        struct rt_rtmp_dmabuf TxDescRing[NUM_OF_TX_RING];       /* Shared memory for Tx descriptors */
1740        struct rt_rtmp_tx_ring TxRing[NUM_OF_TX_RING];  /* AC0~4 + HCCA */
1741#endif                          /* RTMP_MAC_PCI // */
1742
1743        spinlock_t irq_lock;
1744        u8 irq_disabled;
1745
1746#ifdef RTMP_MAC_USB
1747/*****************************************************************************************/
1748/*      USB related parameters                                                           */
1749/*****************************************************************************************/
1750        struct usb_config_descriptor *config;
1751        u32 BulkInEpAddr;       /* bulk-in endpoint address */
1752        u32 BulkOutEpAddr[6];   /* bulk-out endpoint address */
1753
1754        u32 NumberOfPipes;
1755        u16 BulkOutMaxPacketSize;
1756        u16 BulkInMaxPacketSize;
1757
1758        /*======Control Flags */
1759        long PendingIoCount;
1760        unsigned long BulkFlags;
1761        BOOLEAN bUsbTxBulkAggre;        /* Flags for bulk out data priority */
1762
1763        /*======Cmd Thread */
1764        struct rt_cmdq CmdQ;
1765        spinlock_t CmdQLock;    /* CmdQLock spinlock */
1766        struct rt_rtmp_os_task cmdQTask;
1767
1768        /*======Semaphores (event) */
1769        struct semaphore UsbVendorReq_semaphore;
1770        void *UsbVendorReqBuf;
1771        wait_queue_head_t *wait;
1772#endif                          /* RTMP_MAC_USB // */
1773
1774/*****************************************************************************************/
1775/*      RBUS related parameters                                                                                                                           */
1776/*****************************************************************************************/
1777
1778/*****************************************************************************************/
1779/*      Both PCI/USB related parameters                                                                                                           */
1780/*****************************************************************************************/
1781        /*struct rt_rtmp_dev_info                 chipInfo; */
1782        RTMP_INF_TYPE infType;
1783
1784/*****************************************************************************************/
1785/*      Driver Mgmt related parameters                                                                                                            */
1786/*****************************************************************************************/
1787        struct rt_rtmp_os_task mlmeTask;
1788#ifdef RTMP_TIMER_TASK_SUPPORT
1789        /* If you want use timer task to handle the timer related jobs, enable this. */
1790        struct rt_rtmp_timer_task_queue TimerQ;
1791        spinlock_t TimerQLock;
1792        struct rt_rtmp_os_task timerTask;
1793#endif                          /* RTMP_TIMER_TASK_SUPPORT // */
1794
1795/*****************************************************************************************/
1796/*      Tx related parameters                                                           */
1797/*****************************************************************************************/
1798        BOOLEAN DeQueueRunning[NUM_OF_TX_RING]; /* for ensuring RTUSBDeQueuePacket get call once */
1799        spinlock_t DeQueueLock[NUM_OF_TX_RING];
1800
1801#ifdef RTMP_MAC_USB
1802        /* Data related context and AC specified, 4 AC supported */
1803        spinlock_t BulkOutLock[6];      /* BulkOut spinlock for 4 ACs */
1804        spinlock_t MLMEBulkOutLock;     /* MLME BulkOut lock */
1805
1806        struct rt_ht_tx_context TxContext[NUM_OF_TX_RING];
1807        spinlock_t TxContextQueueLock[NUM_OF_TX_RING];  /* TxContextQueue spinlock */
1808
1809        /* 4 sets of Bulk Out index and pending flag */
1810        u8 NextBulkOutIndex[4]; /* only used for 4 EDCA bulkout pipe */
1811
1812        BOOLEAN BulkOutPending[6];      /* used for total 6 bulkout pipe */
1813        u8 bulkResetPipeid;
1814        BOOLEAN MgmtBulkPending;
1815        unsigned long bulkResetReq[6];
1816#endif                          /* RTMP_MAC_USB // */
1817
1818        /* resource for software backlog queues */
1819        struct rt_queue_header TxSwQueue[NUM_OF_TX_RING];       /* 4 AC + 1 HCCA */
1820        spinlock_t TxSwQueueLock[NUM_OF_TX_RING];       /* TxSwQueue spinlock */
1821
1822        struct rt_rtmp_dmabuf MgmtDescRing;     /* Shared memory for MGMT descriptors */
1823        struct rt_rtmp_mgmt_ring MgmtRing;
1824        spinlock_t MgmtRingLock;        /* Prio Ring spinlock */
1825
1826/*****************************************************************************************/
1827/*      Rx related parameters                                                           */
1828/*****************************************************************************************/
1829
1830#ifdef RTMP_MAC_PCI
1831        struct rt_rtmp_rx_ring RxRing;
1832        spinlock_t RxRingLock;  /* Rx Ring spinlock */
1833#ifdef RT3090
1834        spinlock_t McuCmdLock;  /*MCU Command Queue spinlock */
1835#endif                          /* RT3090 // */
1836#endif                          /* RTMP_MAC_PCI // */
1837#ifdef RTMP_MAC_USB
1838        struct rt_rx_context RxContext[RX_RING_SIZE];   /* 1 for redundant multiple IRP bulk in. */
1839        spinlock_t BulkInLock;  /* BulkIn spinlock for 4 ACs */
1840        u8 PendingRx;   /* The Maximum pending Rx value should be       RX_RING_SIZE. */
1841        u8 NextRxBulkInIndex;   /* Indicate the current RxContext Index which hold by Host controller. */
1842        u8 NextRxBulkInReadIndex;       /* Indicate the current RxContext Index which driver can read & process it. */
1843        unsigned long NextRxBulkInPosition;     /* Want to contatenate 2 URB buffer while 1st is bulkin failed URB. This Position is 1st URB TransferLength. */
1844        unsigned long TransferBufferLength;     /* current length of the packet buffer */
1845        unsigned long ReadPosition;     /* current read position in a packet buffer */
1846#endif                          /* RTMP_MAC_USB // */
1847
1848/*****************************************************************************************/
1849/*      ASIC related parameters                                                          */
1850/*****************************************************************************************/
1851        u32 MACVersion; /* MAC version. Record rt2860C(0x28600100) or rt2860D (0x28600101).. */
1852
1853        /* --------------------------- */
1854        /* E2PROM */
1855        /* --------------------------- */
1856        unsigned long EepromVersion;    /* byte 0: version, byte 1: revision, byte 2~3: unused */
1857        unsigned long FirmwareVersion;  /* byte 0: Minor version, byte 1: Major version, otherwise unused. */
1858        u16 EEPROMDefaultValue[NUM_EEPROM_BBP_PARMS];
1859        u8 EEPROMAddressNum;    /* 93c46=6  93c66=8 */
1860        BOOLEAN EepromAccess;
1861        u8 EFuseTag;
1862
1863        /* --------------------------- */
1864        /* BBP Control */
1865        /* --------------------------- */
1866        u8 BbpWriteLatch[140];  /* record last BBP register value written via BBP_IO_WRITE/BBP_IO_WRITE_VY_REG_ID */
1867        char BbpRssiToDbmDelta; /* change from u8 to char for high power */
1868        struct rt_bbp_r66_tuning BbpTuning;
1869
1870        /* ---------------------------- */
1871        /* RFIC control */
1872        /* ---------------------------- */
1873        u8 RfIcType;            /* RFIC_xxx */
1874        unsigned long RfFreqOffset;     /* Frequency offset for channel switching */
1875        struct rt_rtmp_rf_regs LatchRfRegs;     /* latch the latest RF programming value since RF IC doesn't support READ */
1876
1877        EEPROM_ANTENNA_STRUC Antenna;   /* Since Antenna definition is different for a & g. We need to save it for future reference. */
1878        EEPROM_NIC_CONFIG2_STRUC NicConfig2;
1879
1880        /* This soft Rx Antenna Diversity mechanism is used only when user set */
1881        /* RX Antenna = DIVERSITY ON */
1882        struct rt_soft_rx_ant_diversity RxAnt;
1883
1884        u8 RFProgSeq;
1885        struct rt_channel_tx_power TxPower[MAX_NUM_OF_CHANNELS];        /* Store Tx power value for all channels. */
1886        struct rt_channel_tx_power ChannelList[MAX_NUM_OF_CHANNELS];    /* list all supported channels for site survey */
1887        struct rt_channel_11j_tx_power TxPower11J[MAX_NUM_OF_11JCHANNELS];      /* 802.11j channel and bw */
1888        struct rt_channel_11j_tx_power ChannelList11J[MAX_NUM_OF_11JCHANNELS];  /* list all supported channels for site survey */
1889
1890        u8 ChannelListNum;      /* number of channel in ChannelList[] */
1891        u8 Bbp94;
1892        BOOLEAN BbpForCCK;
1893        unsigned long Tx20MPwrCfgABand[5];
1894        unsigned long Tx20MPwrCfgGBand[5];
1895        unsigned long Tx40MPwrCfgABand[5];
1896        unsigned long Tx40MPwrCfgGBand[5];
1897
1898        BOOLEAN bAutoTxAgcA;    /* Enable driver auto Tx Agc control */
1899        u8 TssiRefA;            /* Store Tssi reference value as 25 temperature. */
1900        u8 TssiPlusBoundaryA[5];        /* Tssi boundary for increase Tx power to compensate. */
1901        u8 TssiMinusBoundaryA[5];       /* Tssi boundary for decrease Tx power to compensate. */
1902        u8 TxAgcStepA;  /* Store Tx TSSI delta increment / decrement value */
1903        char TxAgcCompensateA;  /* Store the compensation (TxAgcStep * (idx-1)) */
1904
1905        BOOLEAN bAutoTxAgcG;    /* Enable driver auto Tx Agc control */
1906        u8 TssiRefG;            /* Store Tssi reference value as 25 temperature. */
1907        u8 TssiPlusBoundaryG[5];        /* Tssi boundary for increase Tx power to compensate. */
1908        u8 TssiMinusBoundaryG[5];       /* Tssi boundary for decrease Tx power to compensate. */
1909        u8 TxAgcStepG;  /* Store Tx TSSI delta increment / decrement value */
1910        char TxAgcCompensateG;  /* Store the compensation (TxAgcStep * (idx-1)) */
1911
1912        char BGRssiOffset0;     /* Store B/G RSSI#0 Offset value on EEPROM 0x46h */
1913        char BGRssiOffset1;     /* Store B/G RSSI#1 Offset value */
1914        char BGRssiOffset2;     /* Store B/G RSSI#2 Offset value */
1915
1916        char ARssiOffset0;      /* Store A RSSI#0 Offset value on EEPROM 0x4Ah */
1917        char ARssiOffset1;      /* Store A RSSI#1 Offset value */
1918        char ARssiOffset2;      /* Store A RSSI#2 Offset value */
1919
1920        char BLNAGain;          /* Store B/G external LNA#0 value on EEPROM 0x44h */
1921        char ALNAGain0;         /* Store A external LNA#0 value for ch36~64 */
1922        char ALNAGain1;         /* Store A external LNA#1 value for ch100~128 */
1923        char ALNAGain2;         /* Store A external LNA#2 value for ch132~165 */
1924#ifdef RT30xx
1925        /* for 3572 */
1926        u8 Bbp25;
1927        u8 Bbp26;
1928
1929        u8 TxMixerGain24G;      /* Tx mixer gain value from EEPROM to improve Tx EVM / Tx DAC, 2.4G */
1930        u8 TxMixerGain5G;
1931#endif                          /* RT30xx // */
1932        /* ---------------------------- */
1933        /* LED control */
1934        /* ---------------------------- */
1935        MCU_LEDCS_STRUC LedCntl;
1936        u16 Led1;               /* read from EEPROM 0x3c */
1937        u16 Led2;               /* EEPROM 0x3e */
1938        u16 Led3;               /* EEPROM 0x40 */
1939        u8 LedIndicatorStrength;
1940        u8 RssiSingalstrengthOffet;
1941        BOOLEAN bLedOnScanning;
1942        u8 LedStatus;
1943
1944/*****************************************************************************************/
1945/*      802.11 related parameters                                                        */
1946/*****************************************************************************************/
1947        /* outgoing BEACON frame buffer and corresponding TXD */
1948        struct rt_txwi BeaconTxWI;
1949        u8 *BeaconBuf;
1950        u16 BeaconOffset[HW_BEACON_MAX_COUNT];
1951
1952        /* pre-build PS-POLL and NULL frame upon link up. for efficiency purpose. */
1953        struct rt_pspoll_frame PsPollFrame;
1954        struct rt_header_802_11 NullFrame;
1955
1956#ifdef RTMP_MAC_USB
1957        struct rt_tx_context BeaconContext[BEACON_RING_SIZE];
1958        struct rt_tx_context NullContext;
1959        struct rt_tx_context PsPollContext;
1960        struct rt_tx_context RTSContext;
1961#endif                          /* RTMP_MAC_USB // */
1962
1963/*=========AP=========== */
1964
1965/*=======STA=========== */
1966        /* ----------------------------------------------- */
1967        /* STA specific configuration & operation status */
1968        /* used only when pAd->OpMode == OPMODE_STA */
1969        /* ----------------------------------------------- */
1970        struct rt_sta_admin_config StaCfg;      /* user desired settings */
1971        struct rt_sta_active_config StaActive;  /* valid only when ADHOC_ON(pAd) || INFRA_ON(pAd) */
1972        char nickname[IW_ESSID_MAX_SIZE + 1];   /* nickname, only used in the iwconfig i/f */
1973        int PreMediaState;
1974
1975/*=======Common=========== */
1976        /* OP mode: either AP or STA */
1977        u8 OpMode;              /* OPMODE_STA, OPMODE_AP */
1978
1979        int IndicateMediaState; /* Base on Indication state, default is NdisMediaStateDisConnected */
1980
1981        /* MAT related parameters */
1982
1983        /* configuration: read from Registry & E2PROM */
1984        BOOLEAN bLocalAdminMAC; /* Use user changed MAC */
1985        u8 PermanentAddress[MAC_ADDR_LEN];      /* Factory default MAC address */
1986        u8 CurrentAddress[MAC_ADDR_LEN];        /* User changed MAC address */
1987
1988        /* ------------------------------------------------------ */
1989        /* common configuration to both OPMODE_STA and OPMODE_AP */
1990        /* ------------------------------------------------------ */
1991        struct rt_common_config CommonCfg;
1992        struct rt_mlme Mlme;
1993
1994        /* AP needs those variables for site survey feature. */
1995        struct rt_mlme_aux MlmeAux;     /* temporary settings used during MLME state machine */
1996        struct rt_bss_table ScanTab;    /* store the latest SCAN result */
1997
1998        /*About MacTab, the sta driver will use #0 and #1 for multicast and AP. */
1999        struct rt_mac_table MacTab;     /* ASIC on-chip WCID entry table.  At TX, ASIC always use key according to this on-chip table. */
2000        spinlock_t MacTabLock;
2001
2002        struct rt_ba_table BATable;
2003
2004        spinlock_t BATabLock;
2005        struct rt_ralink_timer RECBATimer;
2006
2007        /* encryption/decryption KEY tables */
2008        struct rt_cipher_key SharedKey[MAX_MBSSID_NUM][4];      /* STA always use SharedKey[BSS0][0..3] */
2009
2010        /* RX re-assembly buffer for fragmentation */
2011        struct rt_fragment_frame FragFrame;     /* Frame storage for fragment frame */
2012
2013        /* various Counters */
2014        struct rt_counter_802_3 Counters8023;   /* 802.3 counters */
2015        struct rt_counter_802_11 WlanCounters;  /* 802.11 MIB counters */
2016        struct rt_counter_ralink RalinkCounters;        /* Ralink proprietary counters */
2017        struct rt_counter_drs DrsCounters;      /* counters for Dynamic TX Rate Switching */
2018        struct rt_private PrivateInfo;  /* Private information & counters */
2019
2020        /* flags, see fRTMP_ADAPTER_xxx flags */
2021        unsigned long Flags;            /* Represent current device status */
2022        unsigned long PSFlags;          /* Power Save operation flag. */
2023
2024        /* current TX sequence # */
2025        u16 Sequence;
2026
2027        /* Control disconnect / connect event generation */
2028        /*+++Not used anymore */
2029        unsigned long LinkDownTime;
2030        /*--- */
2031        unsigned long LastRxRate;
2032        unsigned long LastTxRate;
2033        /*+++Used only for Station */
2034        BOOLEAN bConfigChanged; /* Config Change flag for the same SSID setting */
2035        /*--- */
2036
2037        unsigned long ExtraInfo;        /* Extra information for displaying status */
2038        unsigned long SystemErrorBitmap;        /* b0: E2PROM version error */
2039
2040        /*+++Not used anymore */
2041        unsigned long MacIcVersion;     /* MAC/BBP serial interface issue solved after ver.D */
2042        /*--- */
2043
2044        /* --------------------------- */
2045        /* System event log */
2046        /* --------------------------- */
2047        struct rt_802_11_event_table EventTab;
2048
2049        BOOLEAN HTCEnable;
2050
2051        /*****************************************************************************************/
2052        /*      Statistic related parameters                                                     */
2053        /*****************************************************************************************/
2054#ifdef RTMP_MAC_USB
2055        unsigned long BulkOutDataOneSecCount;
2056        unsigned long BulkInDataOneSecCount;
2057        unsigned long BulkLastOneSecCount;      /* BulkOutDataOneSecCount + BulkInDataOneSecCount */
2058        unsigned long watchDogRxCnt;
2059        unsigned long watchDogRxOverFlowCnt;
2060        unsigned long watchDogTxPendingCnt[NUM_OF_TX_RING];
2061        int TransferedLength[NUM_OF_TX_RING];
2062#endif                          /* RTMP_MAC_USB // */
2063
2064        BOOLEAN bUpdateBcnCntDone;
2065        unsigned long watchDogMacDeadlock;      /* prevent MAC/BBP into deadlock condition */
2066        /* ---------------------------- */
2067        /* DEBUG paramerts */
2068        /* ---------------------------- */
2069        /*unsigned long         DebugSetting[4]; */
2070        BOOLEAN bBanAllBaSetup;
2071        BOOLEAN bPromiscuous;
2072
2073        /* ---------------------------- */
2074        /* rt2860c emulation-use Parameters */
2075        /* ---------------------------- */
2076        /*unsigned long         rtsaccu[30]; */
2077        /*unsigned long         ctsaccu[30]; */
2078        /*unsigned long         cfendaccu[30]; */
2079        /*unsigned long         bacontent[16]; */
2080        /*unsigned long         rxint[RX_RING_SIZE+1]; */
2081        /*u8         rcvba[60]; */
2082        BOOLEAN bLinkAdapt;
2083        BOOLEAN bForcePrintTX;
2084        BOOLEAN bForcePrintRX;
2085        /*BOOLEAN               bDisablescanning;               //defined in RT2870 USB */
2086        BOOLEAN bStaFifoTest;
2087        BOOLEAN bProtectionTest;
2088        BOOLEAN bBroadComHT;
2089        /*+++Following add from RT2870 USB. */
2090        unsigned long BulkOutReq;
2091        unsigned long BulkOutComplete;
2092        unsigned long BulkOutCompleteOther;
2093        unsigned long BulkOutCompleteCancel;    /* seems not used now? */
2094        unsigned long BulkInReq;
2095        unsigned long BulkInComplete;
2096        unsigned long BulkInCompleteFail;
2097        /*--- */
2098
2099        struct wificonf WIFItestbed;
2100
2101        struct reordering_mpdu_pool mpdu_blk_pool;
2102
2103        unsigned long OneSecondnonBEpackets;    /* record non BE packets per second */
2104
2105#ifdef LINUX
2106        struct iw_statistics iw_stats;
2107
2108        struct net_device_stats stats;
2109#endif                          /* LINUX // */
2110
2111        unsigned long TbttTickCount;
2112#ifdef PCI_MSI_SUPPORT
2113        BOOLEAN HaveMsi;
2114#endif                          /* PCI_MSI_SUPPORT // */
2115
2116        u8 is_on;
2117
2118#define TIME_BASE                       (1000000/OS_HZ)
2119#define TIME_ONE_SECOND         (1000000/TIME_BASE)
2120        u8 flg_be_adjust;
2121        unsigned long be_adjust_last_time;
2122
2123        u8 FlgCtsEnabled;
2124        u8 PM_FlgSuspend;
2125
2126#ifdef RT30xx
2127#ifdef RTMP_EFUSE_SUPPORT
2128        BOOLEAN bUseEfuse;
2129        u8 EEPROMImage[1024];
2130#endif                          /* RTMP_EFUSE_SUPPORT // */
2131#endif                          /* RT30xx // */
2132};
2133
2134#define DELAYINTMASK            0x0003fffb
2135#define INTMASK                         0x0003fffb
2136#define IndMask                         0x0003fffc
2137#define RxINT                           0x00000005      /* Delayed Rx or indivi rx */
2138#define TxDataInt                       0x000000fa      /* Delayed Tx or indivi tx */
2139#define TxMgmtInt                       0x00000102      /* Delayed Tx or indivi tx */
2140#define TxCoherent                      0x00020000      /* tx coherent */
2141#define RxCoherent                      0x00010000      /* rx coherent */
2142#define McuCommand                      0x00000200      /* mcu */
2143#define PreTBTTInt                      0x00001000      /* Pre-TBTT interrupt */
2144#define TBTTInt                         0x00000800      /* TBTT interrupt */
2145#define GPTimeOutInt                    0x00008000      /* GPtimeout interrupt */
2146#define AutoWakeupInt           0x00004000      /* AutoWakeupInt interrupt */
2147#define FifoStaFullInt                  0x00002000      /*  fifo statistics full interrupt */
2148
2149/***************************************************************************
2150  *     Rx Path software control block related data structures
2151  **************************************************************************/
2152struct rt_rx_blk {
2153        RT28XX_RXD_STRUC RxD;
2154        struct rt_rxwi *pRxWI;
2155        struct rt_header_802_11 *pHeader;
2156        void *pRxPacket;
2157        u8 *pData;
2158        u16 DataSize;
2159        u16 Flags;
2160        u8 UserPriority;        /* for calculate TKIP MIC using */
2161};
2162
2163#define RX_BLK_SET_FLAG(_pRxBlk, _flag)         (_pRxBlk->Flags |= _flag)
2164#define RX_BLK_TEST_FLAG(_pRxBlk, _flag)        (_pRxBlk->Flags & _flag)
2165#define RX_BLK_CLEAR_FLAG(_pRxBlk, _flag)       (_pRxBlk->Flags &= ~(_flag))
2166
2167#define fRX_WDS                 0x0001
2168#define fRX_AMSDU       0x0002
2169#define fRX_ARALINK     0x0004
2170#define fRX_HTC         0x0008
2171#define fRX_PAD         0x0010
2172#define fRX_AMPDU       0x0020
2173#define fRX_QOS                 0x0040
2174#define fRX_INFRA               0x0080
2175#define fRX_EAP                 0x0100
2176#define fRX_MESH                0x0200
2177#define fRX_APCLI               0x0400
2178#define fRX_DLS                 0x0800
2179#define fRX_WPI                 0x1000
2180
2181#define LENGTH_AMSDU_SUBFRAMEHEAD       14
2182#define LENGTH_ARALINK_SUBFRAMEHEAD     14
2183#define LENGTH_ARALINK_HEADER_FIELD      2
2184
2185/***************************************************************************
2186  *     Tx Path software control block related data structures
2187  **************************************************************************/
2188#define TX_UNKOWN_FRAME                 0x00
2189#define TX_MCAST_FRAME                  0x01
2190#define TX_LEGACY_FRAME                 0x02
2191#define TX_AMPDU_FRAME                  0x04
2192#define TX_AMSDU_FRAME                  0x08
2193#define TX_RALINK_FRAME                 0x10
2194#define TX_FRAG_FRAME                   0x20
2195
2196/*      Currently the sizeof(struct rt_tx_blk) is 148 bytes. */
2197struct rt_tx_blk {
2198        u8 QueIdx;
2199        u8 TxFrameType; /* Indicate the Transmission type of the all frames in one batch */
2200        u8 TotalFrameNum;       /* Total frame number that wants to send-out in one batch */
2201        u16 TotalFragNum;       /* Total frame fragments required in one batch */
2202        u16 TotalFrameLen;      /* Total length of all frames that wants to send-out in one batch */
2203
2204        struct rt_queue_header TxPacketList;
2205        struct rt_mac_table_entry *pMacEntry;   /* NULL: packet with 802.11 RA field is multicast/broadcast address */
2206        HTTRANSMIT_SETTING *pTransmit;
2207
2208        /* Following structure used for the characteristics of a specific packet. */
2209        void *pPacket;
2210        u8 *pSrcBufHeader;      /* Reference to the head of sk_buff->data */
2211        u8 *pSrcBufData;        /* Reference to the sk_buff->data, will change depending on the handling progresss */
2212        u32 SrcBufLen;          /* Length of packet payload which not including Layer 2 header */
2213        u8 *pExtraLlcSnapEncap; /* NULL means no extra LLC/SNAP is required */
2214        u8 HeaderBuf[128];      /* TempBuffer for TX_INFO + TX_WI + 802.11 Header + padding + AMSDU SubHeader + LLC/SNAP */
2215        /*RT2870 2.1.0.0 uses only 80 bytes */
2216        /*RT3070 2.1.1.0 uses only 96 bytes */
2217        /*RT3090 2.1.0.0 uses only 96 bytes */
2218        u8 MpduHeaderLen;       /* 802.11 header length NOT including the padding */
2219        u8 HdrPadLen;   /* recording Header Padding Length; */
2220        u8 apidx;               /* The interface associated to this packet */
2221        u8 Wcid;                /* The MAC entry associated to this packet */
2222        u8 UserPriority;        /* priority class of packet */
2223        u8 FrameGap;            /* what kind of IFS does this packet use */
2224        u8 MpduReqNum;  /* number of fragments of this frame */
2225        u8 TxRate;              /* TODO: Obsoleted? Should change to MCS? */
2226        u8 CipherAlg;   /* cipher alogrithm */
2227        struct rt_cipher_key *pKey;
2228
2229        u16 Flags;              /*See following definitions for detail. */
2230
2231        /*YOU SHOULD NOT TOUCH IT! Following parameters are used for hardware-depended layer. */
2232        unsigned long Priv;             /* Hardware specific value saved in here. */
2233};
2234
2235#define fTX_bRtsRequired        0x0001  /* Indicate if need send RTS frame for protection. Not used in RT2860/RT2870. */
2236#define fTX_bAckRequired        0x0002  /* the packet need ack response */
2237#define fTX_bPiggyBack          0x0004  /* Legacy device use Piggback or not */
2238#define fTX_bHTRate             0x0008  /* allow to use HT rate */
2239#define fTX_bForceNonQoS        0x0010  /* force to transmit frame without WMM-QoS in HT mode */
2240#define fTX_bAllowFrag          0x0020  /* allow to fragment the packet, A-MPDU, A-MSDU, A-Ralink is not allowed to fragment */
2241#define fTX_bMoreData           0x0040  /* there are more data packets in PowerSave Queue */
2242#define fTX_bWMM                0x0080  /* QOS Data */
2243#define fTX_bClearEAPFrame      0x0100
2244
2245#define TX_BLK_SET_FLAG(_pTxBlk, _flag)         (_pTxBlk->Flags |= _flag)
2246#define TX_BLK_TEST_FLAG(_pTxBlk, _flag)        (((_pTxBlk->Flags & _flag) == _flag) ? 1 : 0)
2247#define TX_BLK_CLEAR_FLAG(_pTxBlk, _flag)       (_pTxBlk->Flags &= ~(_flag))
2248
2249/***************************************************************************
2250  *     Other static inline function definitions
2251  **************************************************************************/
2252static inline void ConvertMulticastIP2MAC(u8 *pIpAddr,
2253                                          u8 **ppMacAddr,
2254                                          u16 ProtoType)
2255{
2256        if (pIpAddr == NULL)
2257                return;
2258
2259        if (ppMacAddr == NULL || *ppMacAddr == NULL)
2260                return;
2261
2262        switch (ProtoType) {
2263        case ETH_P_IPV6:
2264/*                      memset(*ppMacAddr, 0, ETH_LENGTH_OF_ADDRESS); */
2265                *(*ppMacAddr) = 0x33;
2266                *(*ppMacAddr + 1) = 0x33;
2267                *(*ppMacAddr + 2) = pIpAddr[12];
2268                *(*ppMacAddr + 3) = pIpAddr[13];
2269                *(*ppMacAddr + 4) = pIpAddr[14];
2270                *(*ppMacAddr + 5) = pIpAddr[15];
2271                break;
2272
2273        case ETH_P_IP:
2274        default:
2275/*                      memset(*ppMacAddr, 0, ETH_LENGTH_OF_ADDRESS); */
2276                *(*ppMacAddr) = 0x01;
2277                *(*ppMacAddr + 1) = 0x00;
2278                *(*ppMacAddr + 2) = 0x5e;
2279                *(*ppMacAddr + 3) = pIpAddr[1] & 0x7f;
2280                *(*ppMacAddr + 4) = pIpAddr[2];
2281                *(*ppMacAddr + 5) = pIpAddr[3];
2282                break;
2283        }
2284
2285        return;
2286}
2287
2288char *GetPhyMode(int Mode);
2289char *GetBW(int BW);
2290
2291/* */
2292/*  Private routines in rtmp_init.c */
2293/* */
2294int RTMPAllocAdapterBlock(void *handle,
2295                                  struct rt_rtmp_adapter **ppAdapter);
2296
2297int RTMPAllocTxRxRingMemory(struct rt_rtmp_adapter *pAd);
2298
2299void RTMPFreeAdapter(struct rt_rtmp_adapter *pAd);
2300
2301int NICReadRegParameters(struct rt_rtmp_adapter *pAd,
2302                                 void *WrapperConfigurationContext);
2303
2304#ifdef RTMP_RF_RW_SUPPORT
2305void NICInitRFRegisters(struct rt_rtmp_adapter *pAd);
2306
2307void RtmpChipOpsRFHook(struct rt_rtmp_adapter *pAd);
2308
2309int RT30xxWriteRFRegister(struct rt_rtmp_adapter *pAd,
2310                                  u8 regID, u8 value);
2311
2312int RT30xxReadRFRegister(struct rt_rtmp_adapter *pAd,
2313                                 u8 regID, u8 *pValue);
2314#endif /* RTMP_RF_RW_SUPPORT // */
2315
2316void NICReadEEPROMParameters(struct rt_rtmp_adapter *pAd, u8 *mac_addr);
2317
2318void NICInitAsicFromEEPROM(struct rt_rtmp_adapter *pAd);
2319
2320int NICInitializeAdapter(struct rt_rtmp_adapter *pAd, IN BOOLEAN bHardReset);
2321
2322int NICInitializeAsic(struct rt_rtmp_adapter *pAd, IN BOOLEAN bHardReset);
2323
2324void NICIssueReset(struct rt_rtmp_adapter *pAd);
2325
2326void RTMPRingCleanUp(struct rt_rtmp_adapter *pAd, u8 RingType);
2327
2328void UserCfgInit(struct rt_rtmp_adapter *pAd);
2329
2330void NICResetFromError(struct rt_rtmp_adapter *pAd);
2331
2332int NICLoadFirmware(struct rt_rtmp_adapter *pAd);
2333
2334void NICEraseFirmware(struct rt_rtmp_adapter *pAd);
2335
2336int NICLoadRateSwitchingParams(struct rt_rtmp_adapter *pAd);
2337
2338BOOLEAN NICCheckForHang(struct rt_rtmp_adapter *pAd);
2339
2340void NICUpdateFifoStaCounters(struct rt_rtmp_adapter *pAd);
2341
2342void NICUpdateRawCounters(struct rt_rtmp_adapter *pAd);
2343
2344void RTMPZeroMemory(void *pSrc, unsigned long Length);
2345
2346unsigned long RTMPCompareMemory(void *pSrc1, void *pSrc2, unsigned long Length);
2347
2348void RTMPMoveMemory(void *pDest, void *pSrc, unsigned long Length);
2349
2350void AtoH(char *src, u8 *dest, int destlen);
2351
2352void RTMPPatchMacBbpBug(struct rt_rtmp_adapter *pAd);
2353
2354void RTMPInitTimer(struct rt_rtmp_adapter *pAd,
2355                   struct rt_ralink_timer *pTimer,
2356                   void *pTimerFunc, void *pData, IN BOOLEAN Repeat);
2357
2358void RTMPSetTimer(struct rt_ralink_timer *pTimer, unsigned long Value);
2359
2360void RTMPModTimer(struct rt_ralink_timer *pTimer, unsigned long Value);
2361
2362void RTMPCancelTimer(struct rt_ralink_timer *pTimer, OUT BOOLEAN * pCancelled);
2363
2364void RTMPSetLED(struct rt_rtmp_adapter *pAd, u8 Status);
2365
2366void RTMPSetSignalLED(struct rt_rtmp_adapter *pAd, IN NDIS_802_11_RSSI Dbm);
2367
2368void RTMPEnableRxTx(struct rt_rtmp_adapter *pAd);
2369
2370/* */
2371/* prototype in action.c */
2372/* */
2373void ActionStateMachineInit(struct rt_rtmp_adapter *pAd,
2374                            struct rt_state_machine *S,
2375                            OUT STATE_MACHINE_FUNC Trans[]);
2376
2377void MlmeADDBAAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2378
2379void MlmeDELBAAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2380
2381void MlmeDLSAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2382
2383void MlmeInvalidAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2384
2385void MlmeQOSAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2386
2387void PeerAddBAReqAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2388
2389void PeerAddBARspAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2390
2391void PeerDelBAAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2392
2393void PeerBAAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2394
2395void SendPSMPAction(struct rt_rtmp_adapter *pAd, u8 Wcid, u8 Psmp);
2396
2397void PeerRMAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2398
2399void PeerPublicAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2400
2401void PeerHTAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2402
2403void PeerQOSAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2404
2405void RECBATimerTimeout(void *SystemSpecific1,
2406                       void *FunctionContext,
2407                       void *SystemSpecific2, void *SystemSpecific3);
2408
2409void ORIBATimerTimeout(struct rt_rtmp_adapter *pAd);
2410
2411void SendRefreshBAR(struct rt_rtmp_adapter *pAd, struct rt_mac_table_entry *pEntry);
2412
2413void ActHeaderInit(struct rt_rtmp_adapter *pAd,
2414                   struct rt_header_802_11 *pHdr80211,
2415                   u8 *Addr1, u8 *Addr2, u8 *Addr3);
2416
2417void BarHeaderInit(struct rt_rtmp_adapter *pAd,
2418                   struct rt_frame_bar *pCntlBar, u8 *pDA, u8 *pSA);
2419
2420void InsertActField(struct rt_rtmp_adapter *pAd,
2421                    u8 *pFrameBuf,
2422                    unsigned long *pFrameLen, u8 Category, u8 ActCode);
2423
2424BOOLEAN CntlEnqueueForRecv(struct rt_rtmp_adapter *pAd,
2425                           unsigned long Wcid,
2426                           unsigned long MsgLen, struct rt_frame_ba_req *pMsg);
2427
2428/* */
2429/* Private routines in rtmp_data.c */
2430/* */
2431BOOLEAN RTMPHandleRxDoneInterrupt(struct rt_rtmp_adapter *pAd);
2432
2433BOOLEAN RTMPHandleTxRingDmaDoneInterrupt(struct rt_rtmp_adapter *pAd,
2434                                         INT_SOURCE_CSR_STRUC TxRingBitmap);
2435
2436void RTMPHandleMgmtRingDmaDoneInterrupt(struct rt_rtmp_adapter *pAd);
2437
2438void RTMPHandleTBTTInterrupt(struct rt_rtmp_adapter *pAd);
2439
2440void RTMPHandlePreTBTTInterrupt(struct rt_rtmp_adapter *pAd);
2441
2442void RTMPHandleTwakeupInterrupt(struct rt_rtmp_adapter *pAd);
2443
2444void RTMPHandleRxCoherentInterrupt(struct rt_rtmp_adapter *pAd);
2445
2446BOOLEAN TxFrameIsAggregatible(struct rt_rtmp_adapter *pAd,
2447                              u8 *pPrevAddr1, u8 *p8023hdr);
2448
2449BOOLEAN PeerIsAggreOn(struct rt_rtmp_adapter *pAd,
2450                      unsigned long TxRate, struct rt_mac_table_entry *pMacEntry);
2451
2452int Sniff2BytesFromNdisBuffer(char *pFirstBuffer,
2453                                      u8 DesiredOffset,
2454                                      u8 *pByte0, u8 *pByte1);
2455
2456int STASendPacket(struct rt_rtmp_adapter *pAd, void *pPacket);
2457
2458void STASendPackets(void *MiniportAdapterContext,
2459                    void **ppPacketArray, u32 NumberOfPackets);
2460
2461void RTMPDeQueuePacket(struct rt_rtmp_adapter *pAd,
2462                       IN BOOLEAN bIntContext,
2463                       u8 QueIdx, u8 Max_Tx_Packets);
2464
2465int RTMPHardTransmit(struct rt_rtmp_adapter *pAd,
2466                             void *pPacket,
2467                             u8 QueIdx, unsigned long *pFreeTXDLeft);
2468
2469int STAHardTransmit(struct rt_rtmp_adapter *pAd,
2470                            struct rt_tx_blk *pTxBlk, u8 QueIdx);
2471
2472void STARxEAPOLFrameIndicate(struct rt_rtmp_adapter *pAd,
2473                             struct rt_mac_table_entry *pEntry,
2474                             struct rt_rx_blk *pRxBlk, u8 FromWhichBSSID);
2475
2476int RTMPFreeTXDRequest(struct rt_rtmp_adapter *pAd,
2477                               u8 RingType,
2478                               u8 NumberRequired, u8 *FreeNumberIs);
2479
2480int MlmeHardTransmit(struct rt_rtmp_adapter *pAd,
2481                             u8 QueIdx, void *pPacket);
2482
2483int MlmeHardTransmitMgmtRing(struct rt_rtmp_adapter *pAd,
2484                                     u8 QueIdx, void *pPacket);
2485
2486#ifdef RTMP_MAC_PCI
2487int MlmeHardTransmitTxRing(struct rt_rtmp_adapter *pAd,
2488                                   u8 QueIdx, void *pPacket);
2489
2490int MlmeDataHardTransmit(struct rt_rtmp_adapter *pAd,
2491                                 u8 QueIdx, void *pPacket);
2492
2493void RTMPWriteTxDescriptor(struct rt_rtmp_adapter *pAd,
2494                           struct rt_txd *pTxD, IN BOOLEAN bWIV, u8 QSEL);
2495#endif /* RTMP_MAC_PCI // */
2496
2497u16 RTMPCalcDuration(struct rt_rtmp_adapter *pAd, u8 Rate, unsigned long Size);
2498
2499void RTMPWriteTxWI(struct rt_rtmp_adapter *pAd, struct rt_txwi * pTxWI, IN BOOLEAN FRAG, IN BOOLEAN CFACK, IN BOOLEAN InsTimestamp, IN BOOLEAN AMPDU, IN BOOLEAN Ack, IN BOOLEAN NSeq,  /* HW new a sequence. */
2500                   u8 BASize,
2501                   u8 WCID,
2502                   unsigned long Length,
2503                   u8 PID,
2504                   u8 TID,
2505                   u8 TxRate,
2506                   u8 Txopmode,
2507                   IN BOOLEAN CfAck, IN HTTRANSMIT_SETTING *pTransmit);
2508
2509void RTMPWriteTxWI_Data(struct rt_rtmp_adapter *pAd,
2510                        struct rt_txwi *pTxWI, struct rt_tx_blk *pTxBlk);
2511
2512void RTMPWriteTxWI_Cache(struct rt_rtmp_adapter *pAd,
2513                         struct rt_txwi *pTxWI, struct rt_tx_blk *pTxBlk);
2514
2515void RTMPSuspendMsduTransmission(struct rt_rtmp_adapter *pAd);
2516
2517void RTMPResumeMsduTransmission(struct rt_rtmp_adapter *pAd);
2518
2519int MiniportMMRequest(struct rt_rtmp_adapter *pAd,
2520                              u8 QueIdx, u8 *pData, u32 Length);
2521
2522/*+++mark by shiang, now this function merge to MiniportMMRequest() */
2523/*---mark by shiang, now this function merge to MiniportMMRequest() */
2524
2525void RTMPSendNullFrame(struct rt_rtmp_adapter *pAd,
2526                       u8 TxRate, IN BOOLEAN bQosNull);
2527
2528void RTMPSendDisassociationFrame(struct rt_rtmp_adapter *pAd);
2529
2530void RTMPSendRTSFrame(struct rt_rtmp_adapter *pAd,
2531                      u8 *pDA,
2532                      IN unsigned int NextMpduSize,
2533                      u8 TxRate,
2534                      u8 RTSRate,
2535                      u16 AckDuration,
2536                      u8 QueIdx, u8 FrameGap);
2537
2538struct rt_queue_header *RTMPCheckTxSwQueue(struct rt_rtmp_adapter *pAd, u8 * QueIdx);
2539
2540void RTMPReportMicError(struct rt_rtmp_adapter *pAd, struct rt_cipher_key *pWpaKey);
2541
2542void WpaMicFailureReportFrame(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2543
2544void WpaDisassocApAndBlockAssoc(void *SystemSpecific1,
2545                                void *FunctionContext,
2546                                void *SystemSpecific2,
2547                                void *SystemSpecific3);
2548
2549void WpaStaPairwiseKeySetting(struct rt_rtmp_adapter *pAd);
2550
2551void WpaStaGroupKeySetting(struct rt_rtmp_adapter *pAd);
2552
2553int RTMPCloneNdisPacket(struct rt_rtmp_adapter *pAd,
2554                                IN BOOLEAN pInsAMSDUHdr,
2555                                void *pInPacket,
2556                                void **ppOutPacket);
2557
2558int RTMPAllocateNdisPacket(struct rt_rtmp_adapter *pAd,
2559                                   void **pPacket,
2560                                   u8 *pHeader,
2561                                   u32 HeaderLen,
2562                                   u8 *pData, u32 DataLen);
2563
2564void RTMPFreeNdisPacket(struct rt_rtmp_adapter *pAd, void *pPacket);
2565
2566BOOLEAN RTMPFreeTXDUponTxDmaDone(struct rt_rtmp_adapter *pAd, u8 QueIdx);
2567
2568BOOLEAN RTMPCheckDHCPFrame(struct rt_rtmp_adapter *pAd, void *pPacket);
2569
2570BOOLEAN RTMPCheckEtherType(struct rt_rtmp_adapter *pAd, void *pPacket);
2571
2572/* */
2573/* Private routines in rtmp_wep.c */
2574/* */
2575void RTMPInitWepEngine(struct rt_rtmp_adapter *pAd,
2576                       u8 *pKey,
2577                       u8 KeyId, u8 KeyLen, u8 *pDest);
2578
2579void RTMPEncryptData(struct rt_rtmp_adapter *pAd,
2580                     u8 *pSrc, u8 *pDest, u32 Len);
2581
2582BOOLEAN RTMPSoftDecryptWEP(struct rt_rtmp_adapter *pAd,
2583                           u8 *pData,
2584                           unsigned long DataByteCnt, struct rt_cipher_key *pGroupKey);
2585
2586void RTMPSetICV(struct rt_rtmp_adapter *pAd, u8 *pDest);
2587
2588void ARCFOUR_INIT(struct rt_arcfourcontext *Ctx, u8 *pKey, u32 KeyLen);
2589
2590u8 ARCFOUR_BYTE(struct rt_arcfourcontext *Ctx);
2591
2592void ARCFOUR_DECRYPT(struct rt_arcfourcontext *Ctx,
2593                     u8 *pDest, u8 *pSrc, u32 Len);
2594
2595void ARCFOUR_ENCRYPT(struct rt_arcfourcontext *Ctx,
2596                     u8 *pDest, u8 *pSrc, u32 Len);
2597
2598void WPAARCFOUR_ENCRYPT(struct rt_arcfourcontext *Ctx,
2599                        u8 *pDest, u8 *pSrc, u32 Len);
2600
2601u32 RTMP_CALC_FCS32(u32 Fcs, u8 *Cp, int Len);
2602
2603/* */
2604/* MLME routines */
2605/* */
2606
2607/* Asic/RF/BBP related functions */
2608
2609void AsicAdjustTxPower(struct rt_rtmp_adapter *pAd);
2610
2611void AsicUpdateProtect(struct rt_rtmp_adapter *pAd,
2612                       u16 OperaionMode,
2613                       u8 SetMask,
2614                       IN BOOLEAN bDisableBGProtect, IN BOOLEAN bNonGFExist);
2615
2616void AsicSwitchChannel(struct rt_rtmp_adapter *pAd,
2617                       u8 Channel, IN BOOLEAN bScan);
2618
2619void AsicLockChannel(struct rt_rtmp_adapter *pAd, u8 Channel);
2620
2621void AsicRfTuningExec(void *SystemSpecific1,
2622                      void *FunctionContext,
2623                      void *SystemSpecific2, void *SystemSpecific3);
2624
2625void AsicResetBBPAgent(struct rt_rtmp_adapter *pAd);
2626
2627void AsicSleepThenAutoWakeup(struct rt_rtmp_adapter *pAd,
2628                             u16 TbttNumToNextWakeUp);
2629
2630void AsicForceSleep(struct rt_rtmp_adapter *pAd);
2631
2632void AsicForceWakeup(struct rt_rtmp_adapter *pAd, IN BOOLEAN bFromTx);
2633
2634void AsicSetBssid(struct rt_rtmp_adapter *pAd, u8 *pBssid);
2635
2636void AsicSetMcastWC(struct rt_rtmp_adapter *pAd);
2637
2638void AsicDelWcidTab(struct rt_rtmp_adapter *pAd, u8 Wcid);
2639
2640void AsicEnableRDG(struct rt_rtmp_adapter *pAd);
2641
2642void AsicDisableRDG(struct rt_rtmp_adapter *pAd);
2643
2644void AsicDisableSync(struct rt_rtmp_adapter *pAd);
2645
2646void AsicEnableBssSync(struct rt_rtmp_adapter *pAd);
2647
2648void AsicEnableIbssSync(struct rt_rtmp_adapter *pAd);
2649
2650void AsicSetEdcaParm(struct rt_rtmp_adapter *pAd, struct rt_edca_parm *pEdcaParm);
2651
2652void AsicSetSlotTime(struct rt_rtmp_adapter *pAd, IN BOOLEAN bUseShortSlotTime);
2653
2654void AsicAddSharedKeyEntry(struct rt_rtmp_adapter *pAd,
2655                           u8 BssIndex,
2656                           u8 KeyIdx,
2657                           u8 CipherAlg,
2658                           u8 *pKey, u8 *pTxMic, u8 *pRxMic);
2659
2660void AsicRemoveSharedKeyEntry(struct rt_rtmp_adapter *pAd,
2661                              u8 BssIndex, u8 KeyIdx);
2662
2663void AsicUpdateWCIDAttribute(struct rt_rtmp_adapter *pAd,
2664                             u16 WCID,
2665                             u8 BssIndex,
2666                             u8 CipherAlg,
2667                             IN BOOLEAN bUsePairewiseKeyTable);
2668
2669void AsicUpdateWCIDIVEIV(struct rt_rtmp_adapter *pAd,
2670                         u16 WCID, unsigned long uIV, unsigned long uEIV);
2671
2672void AsicUpdateRxWCIDTable(struct rt_rtmp_adapter *pAd,
2673                           u16 WCID, u8 *pAddr);
2674
2675void AsicAddKeyEntry(struct rt_rtmp_adapter *pAd,
2676                     u16 WCID,
2677                     u8 BssIndex,
2678                     u8 KeyIdx,
2679                     struct rt_cipher_key *pCipherKey,
2680                     IN BOOLEAN bUsePairewiseKeyTable, IN BOOLEAN bTxKey);
2681
2682void AsicAddPairwiseKeyEntry(struct rt_rtmp_adapter *pAd,
2683                             u8 *pAddr,
2684                             u8 WCID, struct rt_cipher_key *pCipherKey);
2685
2686void AsicRemovePairwiseKeyEntry(struct rt_rtmp_adapter *pAd,
2687                                u8 BssIdx, u8 Wcid);
2688
2689BOOLEAN AsicSendCommandToMcu(struct rt_rtmp_adapter *pAd,
2690                             u8 Command,
2691                             u8 Token, u8 Arg0, u8 Arg1);
2692
2693#ifdef RTMP_MAC_PCI
2694BOOLEAN AsicCheckCommanOk(struct rt_rtmp_adapter *pAd, u8 Command);
2695#endif /* RTMP_MAC_PCI // */
2696
2697void MacAddrRandomBssid(struct rt_rtmp_adapter *pAd, u8 *pAddr);
2698
2699void MgtMacHeaderInit(struct rt_rtmp_adapter *pAd,
2700                      struct rt_header_802_11 *pHdr80211,
2701                      u8 SubType,
2702                      u8 ToDs, u8 *pDA, u8 *pBssid);
2703
2704void MlmeRadioOff(struct rt_rtmp_adapter *pAd);
2705
2706void MlmeRadioOn(struct rt_rtmp_adapter *pAd);
2707
2708void BssTableInit(struct rt_bss_table *Tab);
2709
2710void BATableInit(struct rt_rtmp_adapter *pAd, struct rt_ba_table *Tab);
2711
2712unsigned long BssTableSearch(struct rt_bss_table *Tab, u8 *pBssid, u8 Channel);
2713
2714unsigned long BssSsidTableSearch(struct rt_bss_table *Tab,
2715                         u8 *pBssid,
2716                         u8 *pSsid, u8 SsidLen, u8 Channel);
2717
2718unsigned long BssTableSearchWithSSID(struct rt_bss_table *Tab,
2719                             u8 *Bssid,
2720                             u8 *pSsid,
2721                             u8 SsidLen, u8 Channel);
2722
2723unsigned long BssSsidTableSearchBySSID(struct rt_bss_table *Tab,
2724                               u8 *pSsid, u8 SsidLen);
2725
2726void BssTableDeleteEntry(struct rt_bss_table *pTab,
2727                         u8 *pBssid, u8 Channel);
2728
2729void BATableDeleteORIEntry(struct rt_rtmp_adapter *pAd,
2730                           struct rt_ba_ori_entry *pBAORIEntry);
2731
2732void BssEntrySet(struct rt_rtmp_adapter *pAd, struct rt_bss_entry *pBss, u8 *pBssid, char Ssid[], u8 SsidLen, u8 BssType, u16 BeaconPeriod, struct rt_cf_parm * CfParm, u16 AtimWin, u16 CapabilityInfo, u8 SupRate[], u8 SupRateLen, u8 ExtRate[], u8 ExtRateLen, struct rt_ht_capability_ie * pHtCapability, struct rt_add_ht_info_ie * pAddHtInfo,   /* AP might use this additional ht info IE */
2733                 u8 HtCapabilityLen,
2734                 u8 AddHtInfoLen,
2735                 u8 NewExtChanOffset,
2736                 u8 Channel,
2737                 char Rssi,
2738                 IN LARGE_INTEGER TimeStamp,
2739                 u8 CkipFlag,
2740                 struct rt_edca_parm *pEdcaParm,
2741                 struct rt_qos_capability_parm *pQosCapability,
2742                 struct rt_qbss_load_parm *pQbssLoad,
2743                 u16 LengthVIE, struct rt_ndis_802_11_variable_ies *pVIE);
2744
2745unsigned long BssTableSetEntry(struct rt_rtmp_adapter *pAd, struct rt_bss_table *pTab, u8 *pBssid, char Ssid[], u8 SsidLen, u8 BssType, u16 BeaconPeriod, struct rt_cf_parm * CfParm, u16 AtimWin, u16 CapabilityInfo, u8 SupRate[], u8 SupRateLen, u8 ExtRate[], u8 ExtRateLen, struct rt_ht_capability_ie * pHtCapability, struct rt_add_ht_info_ie * pAddHtInfo,     /* AP might use this additional ht info IE */
2746                       u8 HtCapabilityLen,
2747                       u8 AddHtInfoLen,
2748                       u8 NewExtChanOffset,
2749                       u8 Channel,
2750                       char Rssi,
2751                       IN LARGE_INTEGER TimeStamp,
2752                       u8 CkipFlag,
2753                       struct rt_edca_parm *pEdcaParm,
2754                       struct rt_qos_capability_parm *pQosCapability,
2755                       struct rt_qbss_load_parm *pQbssLoad,
2756                       u16 LengthVIE, struct rt_ndis_802_11_variable_ies *pVIE);
2757
2758void BATableInsertEntry(struct rt_rtmp_adapter *pAd,
2759                        u16 Aid,
2760                        u16 TimeOutValue,
2761                        u16 StartingSeq,
2762                        u8 TID,
2763                        u8 BAWinSize,
2764                        u8 OriginatorStatus, IN BOOLEAN IsRecipient);
2765
2766void BssTableSsidSort(struct rt_rtmp_adapter *pAd,
2767                      struct rt_bss_table *OutTab, char Ssid[], u8 SsidLen);
2768
2769void BssTableSortByRssi(struct rt_bss_table *OutTab);
2770
2771void BssCipherParse(struct rt_bss_entry *pBss);
2772
2773int MlmeQueueInit(struct rt_mlme_queue *Queue);
2774
2775void MlmeQueueDestroy(struct rt_mlme_queue *Queue);
2776
2777BOOLEAN MlmeEnqueue(struct rt_rtmp_adapter *pAd,
2778                    unsigned long Machine,
2779                    unsigned long MsgType, unsigned long MsgLen, void *Msg);
2780
2781BOOLEAN MlmeEnqueueForRecv(struct rt_rtmp_adapter *pAd,
2782                           unsigned long Wcid,
2783                           unsigned long TimeStampHigh,
2784                           unsigned long TimeStampLow,
2785                           u8 Rssi0,
2786                           u8 Rssi1,
2787                           u8 Rssi2,
2788                           unsigned long MsgLen, void *Msg, u8 Signal);
2789
2790BOOLEAN MlmeDequeue(struct rt_mlme_queue *Queue, struct rt_mlme_queue_elem **Elem);
2791
2792void MlmeRestartStateMachine(struct rt_rtmp_adapter *pAd);
2793
2794BOOLEAN MlmeQueueEmpty(struct rt_mlme_queue *Queue);
2795
2796BOOLEAN MlmeQueueFull(struct rt_mlme_queue *Queue);
2797
2798BOOLEAN MsgTypeSubst(struct rt_rtmp_adapter *pAd,
2799                     struct rt_frame_802_11 *pFrame,
2800                     int *Machine, int *MsgType);
2801
2802void StateMachineInit(struct rt_state_machine *Sm,
2803                      IN STATE_MACHINE_FUNC Trans[],
2804                      unsigned long StNr,
2805                      unsigned long MsgNr,
2806                      IN STATE_MACHINE_FUNC DefFunc,
2807                      unsigned long InitState, unsigned long Base);
2808
2809void StateMachineSetAction(struct rt_state_machine *S,
2810                           unsigned long St, unsigned long Msg, IN STATE_MACHINE_FUNC F);
2811
2812void StateMachinePerformAction(struct rt_rtmp_adapter *pAd,
2813                               struct rt_state_machine *S, struct rt_mlme_queue_elem *Elem);
2814
2815void Drop(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2816
2817void AssocStateMachineInit(struct rt_rtmp_adapter *pAd,
2818                           struct rt_state_machine *Sm,
2819                           OUT STATE_MACHINE_FUNC Trans[]);
2820
2821void ReassocTimeout(void *SystemSpecific1,
2822                    void *FunctionContext,
2823                    void *SystemSpecific2, void *SystemSpecific3);
2824
2825void AssocTimeout(void *SystemSpecific1,
2826                  void *FunctionContext,
2827                  void *SystemSpecific2, void *SystemSpecific3);
2828
2829void DisassocTimeout(void *SystemSpecific1,
2830                     void *FunctionContext,
2831                     void *SystemSpecific2, void *SystemSpecific3);
2832
2833/*---------------------------------------------- */
2834void MlmeAssocReqAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2835
2836void MlmeReassocReqAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2837
2838void MlmeDisassocReqAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2839
2840void PeerAssocRspAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2841
2842void PeerReassocRspAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2843
2844void PeerDisassocAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2845
2846void DisassocTimeoutAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2847
2848void AssocTimeoutAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2849
2850void ReassocTimeoutAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2851
2852void Cls3errAction(struct rt_rtmp_adapter *pAd, u8 *pAddr);
2853
2854void InvalidStateWhenAssoc(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2855
2856void InvalidStateWhenReassoc(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2857
2858void InvalidStateWhenDisassociate(struct rt_rtmp_adapter *pAd,
2859                                  struct rt_mlme_queue_elem *Elem);
2860
2861#ifdef RTMP_MAC_USB
2862void MlmeCntlConfirm(struct rt_rtmp_adapter *pAd, unsigned long MsgType, u16 Msg);
2863#endif /* RTMP_MAC_USB // */
2864
2865void ComposePsPoll(struct rt_rtmp_adapter *pAd);
2866
2867void ComposeNullFrame(struct rt_rtmp_adapter *pAd);
2868
2869void AssocPostProc(struct rt_rtmp_adapter *pAd,
2870                   u8 *pAddr2,
2871                   u16 CapabilityInfo,
2872                   u16 Aid,
2873                   u8 SupRate[],
2874                   u8 SupRateLen,
2875                   u8 ExtRate[],
2876                   u8 ExtRateLen,
2877                   struct rt_edca_parm *pEdcaParm,
2878                   struct rt_ht_capability_ie *pHtCapability,
2879                   u8 HtCapabilityLen, struct rt_add_ht_info_ie *pAddHtInfo);
2880
2881void AuthStateMachineInit(struct rt_rtmp_adapter *pAd,
2882                          struct rt_state_machine *sm, OUT STATE_MACHINE_FUNC Trans[]);
2883
2884void AuthTimeout(void *SystemSpecific1,
2885                 void *FunctionContext,
2886                 void *SystemSpecific2, void *SystemSpecific3);
2887
2888void MlmeAuthReqAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2889
2890void PeerAuthRspAtSeq2Action(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2891
2892void PeerAuthRspAtSeq4Action(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2893
2894void AuthTimeoutAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2895
2896void Cls2errAction(struct rt_rtmp_adapter *pAd, u8 *pAddr);
2897
2898void MlmeDeauthReqAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2899
2900void InvalidStateWhenAuth(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2901
2902/*============================================= */
2903
2904void AuthRspStateMachineInit(struct rt_rtmp_adapter *pAd,
2905                             struct rt_state_machine *Sm,
2906                             IN STATE_MACHINE_FUNC Trans[]);
2907
2908void PeerDeauthAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2909
2910void PeerAuthSimpleRspGenAndSend(struct rt_rtmp_adapter *pAd,
2911                                 struct rt_header_802_11 *pHdr80211,
2912                                 u16 Alg,
2913                                 u16 Seq,
2914                                 u16 Reason, u16 Status);
2915
2916/* */
2917/* Private routines in dls.c */
2918/* */
2919
2920/*======================================== */
2921
2922void SyncStateMachineInit(struct rt_rtmp_adapter *pAd,
2923                          struct rt_state_machine *Sm,
2924                          OUT STATE_MACHINE_FUNC Trans[]);
2925
2926void BeaconTimeout(void *SystemSpecific1,
2927                   void *FunctionContext,
2928                   void *SystemSpecific2, void *SystemSpecific3);
2929
2930void ScanTimeout(void *SystemSpecific1,
2931                 void *FunctionContext,
2932                 void *SystemSpecific2, void *SystemSpecific3);
2933
2934void InvalidStateWhenScan(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2935
2936void InvalidStateWhenJoin(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2937
2938void InvalidStateWhenStart(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2939
2940void EnqueueProbeRequest(struct rt_rtmp_adapter *pAd);
2941
2942BOOLEAN ScanRunning(struct rt_rtmp_adapter *pAd);
2943/*========================================= */
2944
2945void MlmeCntlInit(struct rt_rtmp_adapter *pAd,
2946                  struct rt_state_machine *S, OUT STATE_MACHINE_FUNC Trans[]);
2947
2948void MlmeCntlMachinePerformAction(struct rt_rtmp_adapter *pAd,
2949                                  struct rt_state_machine *S,
2950                                  struct rt_mlme_queue_elem *Elem);
2951
2952void CntlIdleProc(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2953
2954void CntlOidScanProc(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2955
2956void CntlOidSsidProc(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2957
2958void CntlOidRTBssidProc(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2959
2960void CntlMlmeRoamingProc(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2961
2962void CntlWaitDisassocProc(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2963
2964void CntlWaitJoinProc(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2965
2966void CntlWaitReassocProc(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2967
2968void CntlWaitStartProc(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2969
2970void CntlWaitAuthProc(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2971
2972void CntlWaitAuthProc2(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2973
2974void CntlWaitAssocProc(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
2975
2976void LinkUp(struct rt_rtmp_adapter *pAd, u8 BssType);
2977
2978void LinkDown(struct rt_rtmp_adapter *pAd, IN BOOLEAN IsReqFromAP);
2979
2980void IterateOnBssTab(struct rt_rtmp_adapter *pAd);
2981
2982void IterateOnBssTab2(struct rt_rtmp_adapter *pAd);
2983
2984void JoinParmFill(struct rt_rtmp_adapter *pAd,
2985                  struct rt_mlme_join_req *JoinReq, unsigned long BssIdx);
2986
2987void AssocParmFill(struct rt_rtmp_adapter *pAd,
2988                   struct rt_mlme_assoc_req *AssocReq,
2989                   u8 *pAddr,
2990                   u16 CapabilityInfo,
2991                   unsigned long Timeout, u16 ListenIntv);
2992
2993void ScanParmFill(struct rt_rtmp_adapter *pAd,
2994                  struct rt_mlme_scan_req *ScanReq,
2995                  char Ssid[],
2996                  u8 SsidLen, u8 BssType, u8 ScanType);
2997
2998void DisassocParmFill(struct rt_rtmp_adapter *pAd,
2999                      struct rt_mlme_disassoc_req *DisassocReq,
3000                      u8 *pAddr, u16 Reason);
3001
3002void StartParmFill(struct rt_rtmp_adapter *pAd,
3003                   struct rt_mlme_start_req *StartReq,
3004                   char Ssid[], u8 SsidLen);
3005
3006void AuthParmFill(struct rt_rtmp_adapter *pAd,
3007                  struct rt_mlme_auth_req *AuthReq,
3008                  u8 *pAddr, u16 Alg);
3009
3010void EnqueuePsPoll(struct rt_rtmp_adapter *pAd);
3011
3012void EnqueueBeaconFrame(struct rt_rtmp_adapter *pAd);
3013
3014void MlmeJoinReqAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
3015
3016void MlmeScanReqAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
3017
3018void MlmeStartReqAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
3019
3020void ScanTimeoutAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
3021
3022void BeaconTimeoutAtJoinAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
3023
3024void PeerBeaconAtScanAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
3025
3026void PeerBeaconAtJoinAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
3027
3028void PeerBeacon(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
3029
3030void PeerProbeReqAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
3031
3032void ScanNextChannel(struct rt_rtmp_adapter *pAd);
3033
3034unsigned long MakeIbssBeacon(struct rt_rtmp_adapter *pAd);
3035
3036BOOLEAN MlmeScanReqSanity(struct rt_rtmp_adapter *pAd,
3037                          void *Msg,
3038                          unsigned long MsgLen,
3039                          u8 *BssType,
3040                          char ssid[],
3041                          u8 *SsidLen, u8 *ScanType);
3042
3043BOOLEAN PeerBeaconAndProbeRspSanity(struct rt_rtmp_adapter *pAd,
3044                                    void *Msg,
3045                                    unsigned long MsgLen,
3046                                    u8 MsgChannel,
3047                                    u8 *pAddr2,
3048                                    u8 *pBssid,
3049                                    char Ssid[],
3050                                    u8 *pSsidLen,
3051                                    u8 *pBssType,
3052                                    u16 *pBeaconPeriod,
3053                                    u8 *pChannel,
3054                                    u8 *pNewChannel,
3055                                    OUT LARGE_INTEGER *pTimestamp,
3056                                    struct rt_cf_parm *pCfParm,
3057                                    u16 *pAtimWin,
3058                                    u16 *pCapabilityInfo,
3059                                    u8 *pErp,
3060                                    u8 *pDtimCount,
3061                                    u8 *pDtimPeriod,
3062                                    u8 *pBcastFlag,
3063                                    u8 *pMessageToMe,
3064                                    u8 SupRate[],
3065                                    u8 *pSupRateLen,
3066                                    u8 ExtRate[],
3067                                    u8 *pExtRateLen,
3068                                    u8 *pCkipFlag,
3069                                    u8 *pAironetCellPowerLimit,
3070                                    struct rt_edca_parm *pEdcaParm,
3071                                    struct rt_qbss_load_parm *pQbssLoad,
3072                                    struct rt_qos_capability_parm *pQosCapability,
3073                                    unsigned long *pRalinkIe,
3074                                    u8 *pHtCapabilityLen,
3075                                    u8 *pPreNHtCapabilityLen,
3076                                    struct rt_ht_capability_ie *pHtCapability,
3077                                    u8 *AddHtInfoLen,
3078                                    struct rt_add_ht_info_ie *AddHtInfo,
3079                                    u8 *NewExtChannel,
3080                                    u16 *LengthVIE,
3081                                    struct rt_ndis_802_11_variable_ies *pVIE);
3082
3083BOOLEAN PeerAddBAReqActionSanity(struct rt_rtmp_adapter *pAd,
3084                                 void *pMsg,
3085                                 unsigned long MsgLen, u8 *pAddr2);
3086
3087BOOLEAN PeerAddBARspActionSanity(struct rt_rtmp_adapter *pAd,
3088                                 void *pMsg, unsigned long MsgLen);
3089
3090BOOLEAN PeerDelBAActionSanity(struct rt_rtmp_adapter *pAd,
3091                              u8 Wcid, void *pMsg, unsigned long MsgLen);
3092
3093BOOLEAN MlmeAssocReqSanity(struct rt_rtmp_adapter *pAd,
3094                           void *Msg,
3095                           unsigned long MsgLen,
3096                           u8 *pApAddr,
3097                           u16 *CapabilityInfo,
3098                           unsigned long *Timeout, u16 *ListenIntv);
3099
3100BOOLEAN MlmeAuthReqSanity(struct rt_rtmp_adapter *pAd,
3101                          void *Msg,
3102                          unsigned long MsgLen,
3103                          u8 *pAddr,
3104                          unsigned long *Timeout, u16 *Alg);
3105
3106BOOLEAN MlmeStartReqSanity(struct rt_rtmp_adapter *pAd,
3107                           void *Msg,
3108                           unsigned long MsgLen,
3109                           char Ssid[], u8 *Ssidlen);
3110
3111BOOLEAN PeerAuthSanity(struct rt_rtmp_adapter *pAd,
3112                       void *Msg,
3113                       unsigned long MsgLen,
3114                       u8 *pAddr,
3115                       u16 *Alg,
3116                       u16 *Seq,
3117                       u16 *Status, char ChlgText[]);
3118
3119BOOLEAN PeerAssocRspSanity(struct rt_rtmp_adapter *pAd, void *pMsg, unsigned long MsgLen, u8 *pAddr2, u16 *pCapabilityInfo, u16 *pStatus, u16 *pAid, u8 SupRate[], u8 *pSupRateLen, u8 ExtRate[], u8 *pExtRateLen, struct rt_ht_capability_ie *pHtCapability, struct rt_add_ht_info_ie *pAddHtInfo,     /* AP might use this additional ht info IE */
3120                           u8 *pHtCapabilityLen,
3121                           u8 *pAddHtInfoLen,
3122                           u8 *pNewExtChannelOffset,
3123                           struct rt_edca_parm *pEdcaParm, u8 *pCkipFlag);
3124
3125BOOLEAN PeerDisassocSanity(struct rt_rtmp_adapter *pAd,
3126                           void *Msg,
3127                           unsigned long MsgLen,
3128                           u8 *pAddr2, u16 *Reason);
3129
3130BOOLEAN PeerWpaMessageSanity(struct rt_rtmp_adapter *pAd,
3131                             struct rt_eapol_packet *pMsg,
3132                             unsigned long MsgLen,
3133                             u8 MsgType, struct rt_mac_table_entry *pEntry);
3134
3135BOOLEAN PeerDeauthSanity(struct rt_rtmp_adapter *pAd,
3136                         void *Msg,
3137                         unsigned long MsgLen,
3138                         u8 *pAddr2, u16 *Reason);
3139
3140BOOLEAN PeerProbeReqSanity(struct rt_rtmp_adapter *pAd,
3141                           void *Msg,
3142                           unsigned long MsgLen,
3143                           u8 *pAddr2,
3144                           char Ssid[], u8 *pSsidLen);
3145
3146BOOLEAN GetTimBit(char *Ptr,
3147                  u16 Aid,
3148                  u8 *TimLen,
3149                  u8 *BcastFlag,
3150                  u8 *DtimCount,
3151                  u8 *DtimPeriod, u8 *MessageToMe);
3152
3153u8 ChannelSanity(struct rt_rtmp_adapter *pAd, u8 channel);
3154
3155NDIS_802_11_NETWORK_TYPE NetworkTypeInUseSanity(struct rt_bss_entry *pBss);
3156
3157BOOLEAN MlmeDelBAReqSanity(struct rt_rtmp_adapter *pAd,
3158                           void *Msg, unsigned long MsgLen);
3159
3160BOOLEAN MlmeAddBAReqSanity(struct rt_rtmp_adapter *pAd,
3161                           void *Msg, unsigned long MsgLen, u8 *pAddr2);
3162
3163unsigned long MakeOutgoingFrame(u8 *Buffer, unsigned long *Length, ...);
3164
3165void LfsrInit(struct rt_rtmp_adapter *pAd, unsigned long Seed);
3166
3167u8 RandomByte(struct rt_rtmp_adapter *pAd);
3168
3169void AsicUpdateAutoFallBackTable(struct rt_rtmp_adapter *pAd, u8 *pTxRate);
3170
3171void MlmePeriodicExec(void *SystemSpecific1,
3172                      void *FunctionContext,
3173                      void *SystemSpecific2, void *SystemSpecific3);
3174
3175void LinkDownExec(void *SystemSpecific1,
3176                  void *FunctionContext,
3177                  void *SystemSpecific2, void *SystemSpecific3);
3178
3179void STAMlmePeriodicExec(struct rt_rtmp_adapter *pAd);
3180
3181void MlmeAutoScan(struct rt_rtmp_adapter *pAd);
3182
3183void MlmeAutoReconnectLastSSID(struct rt_rtmp_adapter *pAd);
3184
3185BOOLEAN MlmeValidateSSID(u8 *pSsid, u8 SsidLen);
3186
3187void MlmeCheckForRoaming(struct rt_rtmp_adapter *pAd, unsigned long Now32);
3188
3189BOOLEAN MlmeCheckForFastRoaming(struct rt_rtmp_adapter *pAd);
3190
3191void MlmeDynamicTxRateSwitching(struct rt_rtmp_adapter *pAd);
3192
3193void MlmeSetTxRate(struct rt_rtmp_adapter *pAd,
3194                   struct rt_mac_table_entry *pEntry, struct rt_rtmp_tx_rate_switch * pTxRate);
3195
3196void MlmeSelectTxRateTable(struct rt_rtmp_adapter *pAd,
3197                           struct rt_mac_table_entry *pEntry,
3198                           u8 **ppTable,
3199                           u8 *pTableSize, u8 *pInitTxRateIdx);
3200
3201void MlmeCalculateChannelQuality(struct rt_rtmp_adapter *pAd,
3202                                 struct rt_mac_table_entry *pMacEntry, unsigned long Now);
3203
3204void MlmeCheckPsmChange(struct rt_rtmp_adapter *pAd, unsigned long Now32);
3205
3206void MlmeSetPsmBit(struct rt_rtmp_adapter *pAd, u16 psm);
3207
3208void MlmeSetTxPreamble(struct rt_rtmp_adapter *pAd, u16 TxPreamble);
3209
3210void UpdateBasicRateBitmap(struct rt_rtmp_adapter *pAd);
3211
3212void MlmeUpdateTxRates(struct rt_rtmp_adapter *pAd,
3213                       IN BOOLEAN bLinkUp, u8 apidx);
3214
3215void MlmeUpdateHtTxRates(struct rt_rtmp_adapter *pAd, u8 apidx);
3216
3217void RTMPCheckRates(struct rt_rtmp_adapter *pAd,
3218                    IN u8 SupRate[], IN u8 *SupRateLen);
3219
3220BOOLEAN RTMPCheckChannel(struct rt_rtmp_adapter *pAd,
3221                         u8 CentralChannel, u8 Channel);
3222
3223BOOLEAN RTMPCheckHt(struct rt_rtmp_adapter *pAd,
3224                    u8 Wcid,
3225                    struct rt_ht_capability_ie *pHtCapability,
3226                    struct rt_add_ht_info_ie *pAddHtInfo);
3227
3228void StaQuickResponeForRateUpExec(void *SystemSpecific1,
3229                                  void *FunctionContext,
3230                                  void *SystemSpecific2,
3231                                  void *SystemSpecific3);
3232
3233void RTMPUpdateMlmeRate(struct rt_rtmp_adapter *pAd);
3234
3235char RTMPMaxRssi(struct rt_rtmp_adapter *pAd,
3236                 char Rssi0, char Rssi1, char Rssi2);
3237
3238#ifdef RT30xx
3239void AsicSetRxAnt(struct rt_rtmp_adapter *pAd, u8 Ant);
3240
3241void RTMPFilterCalibration(struct rt_rtmp_adapter *pAd);
3242
3243#ifdef RTMP_EFUSE_SUPPORT
3244/*2008/09/11:KH add to support efuse<-- */
3245int set_eFuseGetFreeBlockCount_Proc(struct rt_rtmp_adapter *pAd, char *arg);
3246
3247int set_eFusedump_Proc(struct rt_rtmp_adapter *pAd, char *arg);
3248
3249void eFusePhysicalReadRegisters(struct rt_rtmp_adapter *pAd,
3250                                u16 Offset,
3251                                u16 Length, u16 *pData);
3252
3253int RtmpEfuseSupportCheck(struct rt_rtmp_adapter *pAd);
3254
3255void eFuseGetFreeBlockCount(struct rt_rtmp_adapter *pAd, u32 *EfuseFreeBlock);
3256
3257int eFuse_init(struct rt_rtmp_adapter *pAd);
3258/*2008/09/11:KH add to support efuse--> */
3259#endif /* RTMP_EFUSE_SUPPORT // */
3260
3261/* add by johnli, RF power sequence setup */
3262void RT30xxLoadRFNormalModeSetup(struct rt_rtmp_adapter *pAd);
3263
3264void RT30xxLoadRFSleepModeSetup(struct rt_rtmp_adapter *pAd);
3265
3266void RT30xxReverseRFSleepModeSetup(struct rt_rtmp_adapter *pAd);
3267/* end johnli */
3268
3269#ifdef RT3070
3270void NICInitRT3070RFRegisters(struct rt_rtmp_adapter *pAd);
3271#endif /* RT3070 // */
3272#ifdef RT3090
3273void NICInitRT3090RFRegisters(struct rt_rtmp_adapter *pAd);
3274#endif /* RT3090 // */
3275
3276void RT30xxHaltAction(struct rt_rtmp_adapter *pAd);
3277
3278void RT30xxSetRxAnt(struct rt_rtmp_adapter *pAd, u8 Ant);
3279#endif /* RT30xx // */
3280
3281void AsicEvaluateRxAnt(struct rt_rtmp_adapter *pAd);
3282
3283void AsicRxAntEvalTimeout(void *SystemSpecific1,
3284                          void *FunctionContext,
3285                          void *SystemSpecific2, void *SystemSpecific3);
3286
3287void APSDPeriodicExec(void *SystemSpecific1,
3288                      void *FunctionContext,
3289                      void *SystemSpecific2, void *SystemSpecific3);
3290
3291BOOLEAN RTMPCheckEntryEnableAutoRateSwitch(struct rt_rtmp_adapter *pAd,
3292                                           struct rt_mac_table_entry *pEntry);
3293
3294u8 RTMPStaFixedTxMode(struct rt_rtmp_adapter *pAd, struct rt_mac_table_entry *pEntry);
3295
3296void RTMPUpdateLegacyTxSetting(u8 fixed_tx_mode, struct rt_mac_table_entry *pEntry);
3297
3298BOOLEAN RTMPAutoRateSwitchCheck(struct rt_rtmp_adapter *pAd);
3299
3300int MlmeInit(struct rt_rtmp_adapter *pAd);
3301
3302void MlmeHandler(struct rt_rtmp_adapter *pAd);
3303
3304void MlmeHalt(struct rt_rtmp_adapter *pAd);
3305
3306void MlmeResetRalinkCounters(struct rt_rtmp_adapter *pAd);
3307
3308void BuildChannelList(struct rt_rtmp_adapter *pAd);
3309
3310u8 FirstChannel(struct rt_rtmp_adapter *pAd);
3311
3312u8 NextChannel(struct rt_rtmp_adapter *pAd, u8 channel);
3313
3314void ChangeToCellPowerLimit(struct rt_rtmp_adapter *pAd,
3315                            u8 AironetCellPowerLimit);
3316
3317/* */
3318/* Prototypes of function definition in rtmp_tkip.c */
3319/* */
3320void RTMPInitTkipEngine(struct rt_rtmp_adapter *pAd,
3321                        u8 *pTKey,
3322                        u8 KeyId,
3323                        u8 *pTA,
3324                        u8 *pMICKey,
3325                        u8 *pTSC, unsigned long *pIV16, unsigned long *pIV32);
3326
3327void RTMPInitMICEngine(struct rt_rtmp_adapter *pAd,
3328                       u8 *pKey,
3329                       u8 *pDA,
3330                       u8 *pSA, u8 UserPriority, u8 *pMICKey);
3331
3332BOOLEAN RTMPTkipCompareMICValue(struct rt_rtmp_adapter *pAd,
3333                                u8 *pSrc,
3334                                u8 *pDA,
3335                                u8 *pSA,
3336                                u8 *pMICKey,
3337                                u8 UserPriority, u32 Len);
3338
3339void RTMPCalculateMICValue(struct rt_rtmp_adapter *pAd,
3340                           void *pPacket,
3341                           u8 *pEncap,
3342                           struct rt_cipher_key *pKey, u8 apidx);
3343
3344void RTMPTkipAppendByte(struct rt_tkip_key_info *pTkip, u8 uChar);
3345
3346void RTMPTkipAppend(struct rt_tkip_key_info *pTkip, u8 *pSrc, u32 nBytes);
3347
3348void RTMPTkipGetMIC(struct rt_tkip_key_info *pTkip);
3349
3350BOOLEAN RTMPSoftDecryptTKIP(struct rt_rtmp_adapter *pAd,
3351                            u8 *pData,
3352                            unsigned long DataByteCnt,
3353                            u8 UserPriority, struct rt_cipher_key *pWpaKey);
3354
3355BOOLEAN RTMPSoftDecryptAES(struct rt_rtmp_adapter *pAd,
3356                           u8 *pData,
3357                           unsigned long DataByteCnt, struct rt_cipher_key *pWpaKey);
3358
3359/* */
3360/* Prototypes of function definition in cmm_info.c */
3361/* */
3362int RT_CfgSetCountryRegion(struct rt_rtmp_adapter *pAd, char *arg, int band);
3363
3364int RT_CfgSetWirelessMode(struct rt_rtmp_adapter *pAd, char *arg);
3365
3366int RT_CfgSetShortSlot(struct rt_rtmp_adapter *pAd, char *arg);
3367
3368int RT_CfgSetWepKey(struct rt_rtmp_adapter *pAd,
3369                    char *keyString,
3370                    struct rt_cipher_key *pSharedKey, int keyIdx);
3371
3372int RT_CfgSetWPAPSKKey(struct rt_rtmp_adapter *pAd,
3373                       char *keyString,
3374                       u8 *pHashStr,
3375                       int hashStrLen, u8 *pPMKBuf);
3376
3377/* */
3378/* Prototypes of function definition in cmm_info.c */
3379/* */
3380void RTMPWPARemoveAllKeys(struct rt_rtmp_adapter *pAd);
3381
3382void RTMPSetPhyMode(struct rt_rtmp_adapter *pAd, unsigned long phymode);
3383
3384void RTMPUpdateHTIE(struct rt_ht_capability *pRtHt,
3385                    u8 *pMcsSet,
3386                    struct rt_ht_capability_ie *pHtCapability,
3387                    struct rt_add_ht_info_ie *pAddHtInfo);
3388
3389void RTMPAddWcidAttributeEntry(struct rt_rtmp_adapter *pAd,
3390                               u8 BssIdx,
3391                               u8 KeyIdx,
3392                               u8 CipherAlg, struct rt_mac_table_entry *pEntry);
3393
3394char *GetEncryptType(char enc);
3395
3396char *GetAuthMode(char auth);
3397
3398void RTMPSetHT(struct rt_rtmp_adapter *pAd, struct rt_oid_set_ht_phymode *pHTPhyMode);
3399
3400void RTMPSetIndividualHT(struct rt_rtmp_adapter *pAd, u8 apidx);
3401
3402void RTMPSendWirelessEvent(struct rt_rtmp_adapter *pAd,
3403                           u16 Event_flag,
3404                           u8 *pAddr, u8 BssIdx, char Rssi);
3405
3406char ConvertToRssi(struct rt_rtmp_adapter *pAd, char Rssi, u8 RssiNumber);
3407
3408/*===================================
3409        Function prototype in cmm_wpa.c
3410  =================================== */
3411void RTMPToWirelessSta(struct rt_rtmp_adapter *pAd,
3412                       struct rt_mac_table_entry *pEntry,
3413                       u8 *pHeader802_3,
3414                       u32 HdrLen,
3415                       u8 *pData,
3416                       u32 DataLen, IN BOOLEAN bClearFrame);
3417
3418void WpaDerivePTK(struct rt_rtmp_adapter *pAd,
3419                  u8 *PMK,
3420                  u8 *ANonce,
3421                  u8 *AA,
3422                  u8 *SNonce,
3423                  u8 *SA, u8 *output, u32 len);
3424
3425void GenRandom(struct rt_rtmp_adapter *pAd, u8 *macAddr, u8 *random);
3426
3427BOOLEAN RTMPCheckWPAframe(struct rt_rtmp_adapter *pAd,
3428                          struct rt_mac_table_entry *pEntry,
3429                          u8 *pData,
3430                          unsigned long DataByteCount, u8 FromWhichBSSID);
3431
3432void AES_GTK_KEY_UNWRAP(u8 *key,
3433                        u8 *plaintext,
3434                        u32 c_len, u8 *ciphertext);
3435
3436BOOLEAN RTMPParseEapolKeyData(struct rt_rtmp_adapter *pAd,
3437                              u8 *pKeyData,
3438                              u8 KeyDataLen,
3439                              u8 GroupKeyIndex,
3440                              u8 MsgType,
3441                              IN BOOLEAN bWPA2, struct rt_mac_table_entry *pEntry);
3442
3443void ConstructEapolMsg(struct rt_mac_table_entry *pEntry,
3444                       u8 GroupKeyWepStatus,
3445                       u8 MsgType,
3446                       u8 DefaultKeyIdx,
3447                       u8 *KeyNonce,
3448                       u8 *TxRSC,
3449                       u8 *GTK,
3450                       u8 *RSNIE,
3451                       u8 RSNIE_Len, struct rt_eapol_packet *pMsg);
3452
3453int RTMPSoftDecryptBroadCastData(struct rt_rtmp_adapter *pAd,
3454                                         struct rt_rx_blk *pRxBlk,
3455                                         IN NDIS_802_11_ENCRYPTION_STATUS
3456                                         GroupCipher,
3457                                         struct rt_cipher_key *pShard_key);
3458
3459void RTMPMakeRSNIE(struct rt_rtmp_adapter *pAd,
3460                   u32 AuthMode, u32 WepStatus, u8 apidx);
3461
3462/* */
3463/* function prototype in ap_wpa.c */
3464/* */
3465void RTMPGetTxTscFromAsic(struct rt_rtmp_adapter *pAd,
3466                          u8 apidx, u8 *pTxTsc);
3467
3468void APInstallPairwiseKey(struct rt_rtmp_adapter *pAd, struct rt_mac_table_entry *pEntry);
3469
3470u32 APValidateRSNIE(struct rt_rtmp_adapter *pAd,
3471                     struct rt_mac_table_entry *pEntry,
3472                     u8 *pRsnIe, u8 rsnie_len);
3473
3474void HandleCounterMeasure(struct rt_rtmp_adapter *pAd, struct rt_mac_table_entry *pEntry);
3475
3476void WPAStart4WayHS(struct rt_rtmp_adapter *pAd,
3477                    struct rt_mac_table_entry *pEntry, unsigned long TimeInterval);
3478
3479void WPAStart2WayGroupHS(struct rt_rtmp_adapter *pAd, struct rt_mac_table_entry *pEntry);
3480
3481void PeerPairMsg1Action(struct rt_rtmp_adapter *pAd,
3482                        struct rt_mac_table_entry *pEntry, struct rt_mlme_queue_elem *Elem);
3483
3484void PeerPairMsg2Action(struct rt_rtmp_adapter *pAd,
3485                        struct rt_mac_table_entry *pEntry, struct rt_mlme_queue_elem *Elem);
3486
3487void PeerPairMsg3Action(struct rt_rtmp_adapter *pAd,
3488                        struct rt_mac_table_entry *pEntry, struct rt_mlme_queue_elem *Elem);
3489
3490void PeerPairMsg4Action(struct rt_rtmp_adapter *pAd,
3491                        struct rt_mac_table_entry *pEntry, struct rt_mlme_queue_elem *Elem);
3492
3493void PeerGroupMsg1Action(struct rt_rtmp_adapter *pAd,
3494                         struct rt_mac_table_entry *pEntry, struct rt_mlme_queue_elem *Elem);
3495
3496void PeerGroupMsg2Action(struct rt_rtmp_adapter *pAd,
3497                         struct rt_mac_table_entry *pEntry,
3498                         void *Msg, u32 MsgLen);
3499
3500void WpaDeriveGTK(u8 *PMK,
3501                  u8 *GNonce,
3502                  u8 *AA, u8 *output, u32 len);
3503
3504void AES_GTK_KEY_WRAP(u8 *key,
3505                      u8 *plaintext,
3506                      u32 p_len, u8 *ciphertext);
3507
3508/*typedef void (*TIMER_FUNCTION)(unsigned long); */
3509
3510/* timeout -- ms */
3511void RTMP_SetPeriodicTimer(struct timer_list *pTimer,
3512                           IN unsigned long timeout);
3513
3514void RTMP_OS_Init_Timer(struct rt_rtmp_adapter *pAd,
3515                        struct timer_list *pTimer,
3516                        IN TIMER_FUNCTION function, void *data);
3517
3518void RTMP_OS_Add_Timer(struct timer_list *pTimer,
3519                       IN unsigned long timeout);
3520
3521void RTMP_OS_Mod_Timer(struct timer_list *pTimer,
3522                       IN unsigned long timeout);
3523
3524void RTMP_OS_Del_Timer(struct timer_list *pTimer,
3525                       OUT BOOLEAN *pCancelled);
3526
3527void RTMP_OS_Release_Packet(struct rt_rtmp_adapter *pAd, struct rt_queue_entry *pEntry);
3528
3529void RTMPusecDelay(unsigned long usec);
3530
3531int os_alloc_mem(struct rt_rtmp_adapter *pAd,
3532                         u8 **mem, unsigned long size);
3533
3534int os_free_mem(struct rt_rtmp_adapter *pAd, void *mem);
3535
3536void RTMP_AllocateSharedMemory(struct rt_rtmp_adapter *pAd,
3537                               unsigned long Length,
3538                               IN BOOLEAN Cached,
3539                               void **VirtualAddress,
3540                               dma_addr_t *PhysicalAddress);
3541
3542void RTMPFreeTxRxRingMemory(struct rt_rtmp_adapter *pAd);
3543
3544int AdapterBlockAllocateMemory(void *handle, void **ppAd);
3545
3546void RTMP_AllocateTxDescMemory(struct rt_rtmp_adapter *pAd,
3547                               u32 Index,
3548                               unsigned long Length,
3549                               IN BOOLEAN Cached,
3550                               void **VirtualAddress,
3551                               dma_addr_t *PhysicalAddress);
3552
3553void RTMP_AllocateFirstTxBuffer(struct rt_rtmp_adapter *pAd,
3554                                u32 Index,
3555                                unsigned long Length,
3556                                IN BOOLEAN Cached,
3557                                void **VirtualAddress,
3558                                dma_addr_t *PhysicalAddress);
3559
3560void RTMP_FreeFirstTxBuffer(struct rt_rtmp_adapter *pAd,
3561                            unsigned long Length,
3562                            IN BOOLEAN Cached,
3563                            void *VirtualAddress,
3564                            dma_addr_t PhysicalAddress);
3565
3566void RTMP_AllocateMgmtDescMemory(struct rt_rtmp_adapter *pAd,
3567                                 unsigned long Length,
3568                                 IN BOOLEAN Cached,
3569                                 void **VirtualAddress,
3570                                 dma_addr_t *PhysicalAddress);
3571
3572void RTMP_AllocateRxDescMemory(struct rt_rtmp_adapter *pAd,
3573                               unsigned long Length,
3574                               IN BOOLEAN Cached,
3575                               void **VirtualAddress,
3576                               dma_addr_t *PhysicalAddress);
3577
3578void RTMP_FreeDescMemory(struct rt_rtmp_adapter *pAd,
3579                         unsigned long Length,
3580                         void *VirtualAddress,
3581                         dma_addr_t PhysicalAddress);
3582
3583void *RtmpOSNetPktAlloc(struct rt_rtmp_adapter *pAd, IN int size);
3584
3585void *RTMP_AllocateRxPacketBuffer(struct rt_rtmp_adapter *pAd,
3586                                         unsigned long Length,
3587                                         IN BOOLEAN Cached,
3588                                         void **VirtualAddress,
3589                                         OUT dma_addr_t *PhysicalAddress);
3590
3591void *RTMP_AllocateTxPacketBuffer(struct rt_rtmp_adapter *pAd,
3592                                         unsigned long Length,
3593                                         IN BOOLEAN Cached,
3594                                         void **VirtualAddress);
3595
3596void *RTMP_AllocateFragPacketBuffer(struct rt_rtmp_adapter *pAd,
3597                                           unsigned long Length);
3598
3599void RTMP_QueryPacketInfo(void *pPacket,
3600                          struct rt_packet_info *pPacketInfo,
3601                          u8 **pSrcBufVA, u32 *pSrcBufLen);
3602
3603void RTMP_QueryNextPacketInfo(void **ppPacket,
3604                              struct rt_packet_info *pPacketInfo,
3605                              u8 **pSrcBufVA, u32 *pSrcBufLen);
3606
3607BOOLEAN RTMP_FillTxBlkInfo(struct rt_rtmp_adapter *pAd, struct rt_tx_blk *pTxBlk);
3608
3609struct rt_rtmp_sg_list *rt_get_sg_list_from_packet(void *pPacket,
3610                                                struct rt_rtmp_sg_list *sg);
3611
3612void announce_802_3_packet(struct rt_rtmp_adapter *pAd, void *pPacket);
3613
3614u32 BA_Reorder_AMSDU_Annnounce(struct rt_rtmp_adapter *pAd, void *pPacket);
3615
3616struct net_device *get_netdev_from_bssid(struct rt_rtmp_adapter *pAd, u8 FromWhichBSSID);
3617
3618void *duplicate_pkt(struct rt_rtmp_adapter *pAd,
3619                           u8 *pHeader802_3,
3620                           u32 HdrLen,
3621                           u8 *pData,
3622                           unsigned long DataSize, u8 FromWhichBSSID);
3623
3624void *duplicate_pkt_with_TKIP_MIC(struct rt_rtmp_adapter *pAd,
3625                                         void *pOldPkt);
3626
3627void ba_flush_reordering_timeout_mpdus(struct rt_rtmp_adapter *pAd,
3628                                       struct rt_ba_rec_entry *pBAEntry,
3629                                       unsigned long Now32);
3630
3631void BAOriSessionSetUp(struct rt_rtmp_adapter *pAd,
3632                       struct rt_mac_table_entry *pEntry,
3633                       u8 TID,
3634                       u16 TimeOut,
3635                       unsigned long DelayTime, IN BOOLEAN isForced);
3636
3637void BASessionTearDownALL(struct rt_rtmp_adapter *pAd, u8 Wcid);
3638
3639BOOLEAN OS_Need_Clone_Packet(void);
3640
3641void build_tx_packet(struct rt_rtmp_adapter *pAd,
3642                     void *pPacket,
3643                     u8 *pFrame, unsigned long FrameLen);
3644
3645void BAOriSessionTearDown(struct rt_rtmp_adapter *pAd,
3646                          u8 Wcid,
3647                          u8 TID,
3648                          IN BOOLEAN bPassive, IN BOOLEAN bForceSend);
3649
3650void BARecSessionTearDown(struct rt_rtmp_adapter *pAd,
3651                          u8 Wcid, u8 TID, IN BOOLEAN bPassive);
3652
3653BOOLEAN ba_reordering_resource_init(struct rt_rtmp_adapter *pAd, int num);
3654void ba_reordering_resource_release(struct rt_rtmp_adapter *pAd);
3655
3656char *rstrtok(char *s, IN const char *ct);
3657
3658/*//////// common ioctl functions ////////// */
3659int SetCommonHT(struct rt_rtmp_adapter *pAd);
3660
3661int WpaCheckEapCode(struct rt_rtmp_adapter *pAd,
3662                    u8 *pFrame, u16 FrameLen, u16 OffSet);
3663
3664void WpaSendMicFailureToWpaSupplicant(struct rt_rtmp_adapter *pAd,
3665                                      IN BOOLEAN bUnicast);
3666
3667int wext_notify_event_assoc(struct rt_rtmp_adapter *pAd);
3668
3669BOOLEAN STARxDoneInterruptHandle(struct rt_rtmp_adapter *pAd, IN BOOLEAN argc);
3670
3671/* AMPDU packet indication */
3672void Indicate_AMPDU_Packet(struct rt_rtmp_adapter *pAd,
3673                           struct rt_rx_blk *pRxBlk, u8 FromWhichBSSID);
3674
3675/* AMSDU packet indication */
3676void Indicate_AMSDU_Packet(struct rt_rtmp_adapter *pAd,
3677                           struct rt_rx_blk *pRxBlk, u8 FromWhichBSSID);
3678
3679/* Normal legacy Rx packet indication */
3680void Indicate_Legacy_Packet(struct rt_rtmp_adapter *pAd,
3681                            struct rt_rx_blk *pRxBlk, u8 FromWhichBSSID);
3682
3683void Indicate_EAPOL_Packet(struct rt_rtmp_adapter *pAd,
3684                           struct rt_rx_blk *pRxBlk, u8 FromWhichBSSID);
3685
3686void update_os_packet_info(struct rt_rtmp_adapter *pAd,
3687                           struct rt_rx_blk *pRxBlk, u8 FromWhichBSSID);
3688
3689void wlan_802_11_to_802_3_packet(struct rt_rtmp_adapter *pAd,
3690                                 struct rt_rx_blk *pRxBlk,
3691                                 u8 *pHeader802_3,
3692                                 u8 FromWhichBSSID);
3693
3694/* remove LLC and get 802_3 Header */
3695#define  RTMP_802_11_REMOVE_LLC_AND_CONVERT_TO_802_3(_pRxBlk, _pHeader802_3)    \
3696{                                                                                                                                                               \
3697        u8 *_pRemovedLLCSNAP = NULL, *_pDA, *_pSA;                                 \
3698                                                                                                                                                                \
3699        if (RX_BLK_TEST_FLAG(_pRxBlk, fRX_MESH))        {            \
3700                _pDA = _pRxBlk->pHeader->Addr3;                                         \
3701                _pSA = (u8 *)_pRxBlk->pHeader + sizeof(struct rt_header_802_11);                \
3702        }                                                                           \
3703        else    {\
3704                if (RX_BLK_TEST_FLAG(_pRxBlk, fRX_INFRA))       {\
3705                        _pDA = _pRxBlk->pHeader->Addr1;                                     \
3706                if (RX_BLK_TEST_FLAG(_pRxBlk, fRX_DLS))                                                                 \
3707                        _pSA = _pRxBlk->pHeader->Addr2;                                                                         \
3708                else                                                                                                                                    \
3709                        _pSA = _pRxBlk->pHeader->Addr3;                                     \
3710                }                                                                       \
3711                else    {       \
3712                        _pDA = _pRxBlk->pHeader->Addr1;                                     \
3713                        _pSA = _pRxBlk->pHeader->Addr2;                                     \
3714                }                                                                       \
3715        }                                                                           \
3716                                                                                                                                                                \
3717        CONVERT_TO_802_3(_pHeader802_3, _pDA, _pSA, _pRxBlk->pData,                             \
3718                _pRxBlk->DataSize, _pRemovedLLCSNAP);                                   \
3719}
3720
3721void Sta_Announce_or_Forward_802_3_Packet(struct rt_rtmp_adapter *pAd,
3722                                          void *pPacket,
3723                                          u8 FromWhichBSSID);
3724
3725#define ANNOUNCE_OR_FORWARD_802_3_PACKET(_pAd, _pPacket, _FromWhichBSS)\
3726                        Sta_Announce_or_Forward_802_3_Packet(_pAd, _pPacket, _FromWhichBSS);
3727                        /*announce_802_3_packet(_pAd, _pPacket); */
3728
3729void *DuplicatePacket(struct rt_rtmp_adapter *pAd,
3730                             void *pPacket, u8 FromWhichBSSID);
3731
3732void *ClonePacket(struct rt_rtmp_adapter *pAd,
3733                         void *pPacket,
3734                         u8 *pData, unsigned long DataSize);
3735
3736/* Normal, AMPDU or AMSDU */
3737void CmmRxnonRalinkFrameIndicate(struct rt_rtmp_adapter *pAd,
3738                                 struct rt_rx_blk *pRxBlk, u8 FromWhichBSSID);
3739
3740void CmmRxRalinkFrameIndicate(struct rt_rtmp_adapter *pAd,
3741                              struct rt_mac_table_entry *pEntry,
3742                              struct rt_rx_blk *pRxBlk, u8 FromWhichBSSID);
3743
3744void Update_Rssi_Sample(struct rt_rtmp_adapter *pAd,
3745                        struct rt_rssi_sample *pRssi, struct rt_rxwi * pRxWI);
3746
3747void *GetPacketFromRxRing(struct rt_rtmp_adapter *pAd,
3748                                 OUT PRT28XX_RXD_STRUC pSaveRxD,
3749                                 OUT BOOLEAN *pbReschedule,
3750                                 IN u32 *pRxPending);
3751
3752void *RTMPDeFragmentDataFrame(struct rt_rtmp_adapter *pAd, struct rt_rx_blk *pRxBlk);
3753
3754enum {
3755        DIDmsg_lnxind_wlansniffrm = 0x00000044,
3756        DIDmsg_lnxind_wlansniffrm_hosttime = 0x00010044,
3757        DIDmsg_lnxind_wlansniffrm_mactime = 0x00020044,
3758        DIDmsg_lnxind_wlansniffrm_channel = 0x00030044,
3759        DIDmsg_lnxind_wlansniffrm_rssi = 0x00040044,
3760        DIDmsg_lnxind_wlansniffrm_sq = 0x00050044,
3761        DIDmsg_lnxind_wlansniffrm_signal = 0x00060044,
3762        DIDmsg_lnxind_wlansniffrm_noise = 0x00070044,
3763        DIDmsg_lnxind_wlansniffrm_rate = 0x00080044,
3764        DIDmsg_lnxind_wlansniffrm_istx = 0x00090044,
3765        DIDmsg_lnxind_wlansniffrm_frmlen = 0x000A0044
3766};
3767enum {
3768        P80211ENUM_msgitem_status_no_value = 0x00
3769};
3770enum {
3771        P80211ENUM_truth_false = 0x00,
3772        P80211ENUM_truth_true = 0x01
3773};
3774
3775/* Definition from madwifi */
3776struct rt_p80211item_uint32 {
3777        u32 did;
3778        u16 status;
3779        u16 len;
3780        u32 data;
3781};
3782
3783struct rt_wlan_ng_prism2_header {
3784        u32 msgcode;
3785        u32 msglen;
3786#define WLAN_DEVNAMELEN_MAX 16
3787        u8 devname[WLAN_DEVNAMELEN_MAX];
3788        struct rt_p80211item_uint32 hosttime;
3789        struct rt_p80211item_uint32 mactime;
3790        struct rt_p80211item_uint32 channel;
3791        struct rt_p80211item_uint32 rssi;
3792        struct rt_p80211item_uint32 sq;
3793        struct rt_p80211item_uint32 signal;
3794        struct rt_p80211item_uint32 noise;
3795        struct rt_p80211item_uint32 rate;
3796        struct rt_p80211item_uint32 istx;
3797        struct rt_p80211item_uint32 frmlen;
3798};
3799
3800/* The radio capture header precedes the 802.11 header. */
3801struct PACKED rt_ieee80211_radiotap_header {
3802        u8 it_version;  /* Version 0. Only increases
3803                                 * for drastic changes,
3804                                 * introduction of compatible
3805                                 * new fields does not count.
3806                                 */
3807        u8 it_pad;
3808        u16 it_len;             /* length of the whole
3809                                 * header in bytes, including
3810                                 * it_version, it_pad,
3811                                 * it_len, and data fields.
3812                                 */
3813        u32 it_present; /* A bitmap telling which
3814                                 * fields are present. Set bit 31
3815                                 * (0x80000000) to extend the
3816                                 * bitmap by another 32 bits.
3817                                 * Additional extensions are made
3818                                 * by setting bit 31.
3819                                 */
3820};
3821
3822enum ieee80211_radiotap_type {
3823        IEEE80211_RADIOTAP_TSFT = 0,
3824        IEEE80211_RADIOTAP_FLAGS = 1,
3825        IEEE80211_RADIOTAP_RATE = 2,
3826        IEEE80211_RADIOTAP_CHANNEL = 3,
3827        IEEE80211_RADIOTAP_FHSS = 4,
3828        IEEE80211_RADIOTAP_DBM_ANTSIGNAL = 5,
3829        IEEE80211_RADIOTAP_DBM_ANTNOISE = 6,
3830        IEEE80211_RADIOTAP_LOCK_QUALITY = 7,
3831        IEEE80211_RADIOTAP_TX_ATTENUATION = 8,
3832        IEEE80211_RADIOTAP_DB_TX_ATTENUATION = 9,
3833        IEEE80211_RADIOTAP_DBM_TX_POWER = 10,
3834        IEEE80211_RADIOTAP_ANTENNA = 11,
3835        IEEE80211_RADIOTAP_DB_ANTSIGNAL = 12,
3836        IEEE80211_RADIOTAP_DB_ANTNOISE = 13
3837};
3838
3839#define WLAN_RADIOTAP_PRESENT (                 \
3840        (1 << IEEE80211_RADIOTAP_TSFT)  |       \
3841        (1 << IEEE80211_RADIOTAP_FLAGS) |       \
3842        (1 << IEEE80211_RADIOTAP_RATE)  |       \
3843         0)
3844
3845struct rt_wlan_radiotap_header {
3846        struct rt_ieee80211_radiotap_header wt_ihdr;
3847        long long wt_tsft;
3848        u8 wt_flags;
3849        u8 wt_rate;
3850};
3851/* Definition from madwifi */
3852
3853void send_monitor_packets(struct rt_rtmp_adapter *pAd, struct rt_rx_blk *pRxBlk);
3854
3855void RTMPSetDesiredRates(struct rt_rtmp_adapter *pAdapter, long Rates);
3856
3857int Set_FixedTxMode_Proc(struct rt_rtmp_adapter *pAd, char *arg);
3858
3859BOOLEAN RT28XXChipsetCheck(IN void *_dev_p);
3860
3861void RT28XXDMADisable(struct rt_rtmp_adapter *pAd);
3862
3863void RT28XXDMAEnable(struct rt_rtmp_adapter *pAd);
3864
3865void RT28xx_UpdateBeaconToAsic(struct rt_rtmp_adapter *pAd,
3866                               int apidx,
3867                               unsigned long BeaconLen, unsigned long UpdatePos);
3868
3869int rt28xx_init(struct rt_rtmp_adapter *pAd,
3870                char *pDefaultMac, char *pHostName);
3871
3872int RtmpNetTaskInit(struct rt_rtmp_adapter *pAd);
3873
3874void RtmpNetTaskExit(struct rt_rtmp_adapter *pAd);
3875
3876int RtmpMgmtTaskInit(struct rt_rtmp_adapter *pAd);
3877
3878void RtmpMgmtTaskExit(struct rt_rtmp_adapter *pAd);
3879
3880void tbtt_tasklet(unsigned long data);
3881
3882struct net_device *RtmpPhyNetDevInit(struct rt_rtmp_adapter *pAd,
3883                           struct rt_rtmp_os_netdev_op_hook *pNetHook);
3884
3885BOOLEAN RtmpPhyNetDevExit(struct rt_rtmp_adapter *pAd, struct net_device *net_dev);
3886
3887int RtmpRaDevCtrlInit(struct rt_rtmp_adapter *pAd, IN RTMP_INF_TYPE infType);
3888
3889BOOLEAN RtmpRaDevCtrlExit(struct rt_rtmp_adapter *pAd);
3890
3891#ifdef RTMP_MAC_PCI
3892/* */
3893/* Function Prototype in cmm_data_pci.c */
3894/* */
3895u16 RtmpPCI_WriteTxResource(struct rt_rtmp_adapter *pAd,
3896                               struct rt_tx_blk *pTxBlk,
3897                               IN BOOLEAN bIsLast, u16 *FreeNumber);
3898
3899u16 RtmpPCI_WriteSingleTxResource(struct rt_rtmp_adapter *pAd,
3900                                     struct rt_tx_blk *pTxBlk,
3901                                     IN BOOLEAN bIsLast,
3902                                     u16 *FreeNumber);
3903
3904u16 RtmpPCI_WriteMultiTxResource(struct rt_rtmp_adapter *pAd,
3905                                    struct rt_tx_blk *pTxBlk,
3906                                    u8 frameNum, u16 *FreeNumber);
3907
3908u16 RtmpPCI_WriteFragTxResource(struct rt_rtmp_adapter *pAd,
3909                                   struct rt_tx_blk *pTxBlk,
3910                                   u8 fragNum, u16 *FreeNumber);
3911
3912u16 RtmpPCI_WriteSubTxResource(struct rt_rtmp_adapter *pAd,
3913                                  struct rt_tx_blk *pTxBlk,
3914                                  IN BOOLEAN bIsLast, u16 *FreeNumber);
3915
3916void RtmpPCI_FinalWriteTxResource(struct rt_rtmp_adapter *pAd,
3917                                  struct rt_tx_blk *pTxBlk,
3918                                  u16 totalMPDUSize,
3919                                  u16 FirstTxIdx);
3920
3921void RtmpPCIDataLastTxIdx(struct rt_rtmp_adapter *pAd,
3922                          u8 QueIdx, u16 LastTxIdx);
3923
3924void RtmpPCIDataKickOut(struct rt_rtmp_adapter *pAd,
3925                        struct rt_tx_blk *pTxBlk, u8 QueIdx);
3926
3927int RtmpPCIMgmtKickOut(struct rt_rtmp_adapter *pAd,
3928                       u8 QueIdx,
3929                       void *pPacket,
3930                       u8 *pSrcBufVA, u32 SrcBufLen);
3931
3932int RTMPCheckRxError(struct rt_rtmp_adapter *pAd,
3933                             struct rt_header_802_11 *pHeader,
3934                             struct rt_rxwi *pRxWI, IN PRT28XX_RXD_STRUC pRxD);
3935
3936BOOLEAN RT28xxPciAsicRadioOff(struct rt_rtmp_adapter *pAd,
3937                              u8 Level, u16 TbttNumToNextWakeUp);
3938
3939BOOLEAN RT28xxPciAsicRadioOn(struct rt_rtmp_adapter *pAd, u8 Level);
3940
3941void RTMPInitPCIeLinkCtrlValue(struct rt_rtmp_adapter *pAd);
3942
3943void RTMPFindHostPCIDev(struct rt_rtmp_adapter *pAd);
3944
3945void RTMPPCIeLinkCtrlValueRestore(struct rt_rtmp_adapter *pAd, u8 Level);
3946
3947void RTMPPCIeLinkCtrlSetting(struct rt_rtmp_adapter *pAd, u16 Max);
3948
3949void RTMPrt3xSetPCIePowerLinkCtrl(struct rt_rtmp_adapter *pAd);
3950
3951void PsPollWakeExec(void *SystemSpecific1,
3952                    void *FunctionContext,
3953                    void *SystemSpecific2, void *SystemSpecific3);
3954
3955void RadioOnExec(void *SystemSpecific1,
3956                 void *FunctionContext,
3957                 void *SystemSpecific2, void *SystemSpecific3);
3958
3959void RT28xxPciStaAsicForceWakeup(struct rt_rtmp_adapter *pAd, IN BOOLEAN bFromTx);
3960
3961void RT28xxPciStaAsicSleepThenAutoWakeup(struct rt_rtmp_adapter *pAd,
3962                                         u16 TbttNumToNextWakeUp);
3963
3964void RT28xxPciMlmeRadioOn(struct rt_rtmp_adapter *pAd);
3965
3966void RT28xxPciMlmeRadioOFF(struct rt_rtmp_adapter *pAd);
3967#endif /* RTMP_MAC_PCI // */
3968
3969#ifdef RTMP_MAC_USB
3970/* */
3971/* Function Prototype in rtusb_bulk.c */
3972/* */
3973void RTUSBInitTxDesc(struct rt_rtmp_adapter *pAd,
3974                     struct rt_tx_context *pTxContext,
3975                     u8 BulkOutPipeId, IN usb_complete_t Func);
3976
3977void RTUSBInitHTTxDesc(struct rt_rtmp_adapter *pAd,
3978                       struct rt_ht_tx_context *pTxContext,
3979                       u8 BulkOutPipeId,
3980                       unsigned long BulkOutSize, IN usb_complete_t Func);
3981
3982void RTUSBInitRxDesc(struct rt_rtmp_adapter *pAd, struct rt_rx_context *pRxContext);
3983
3984void RTUSBCleanUpDataBulkOutQueue(struct rt_rtmp_adapter *pAd);
3985
3986void RTUSBCancelPendingBulkOutIRP(struct rt_rtmp_adapter *pAd);
3987
3988void RTUSBBulkOutDataPacket(struct rt_rtmp_adapter *pAd,
3989                            u8 BulkOutPipeId, u8 Index);
3990
3991void RTUSBBulkOutNullFrame(struct rt_rtmp_adapter *pAd);
3992
3993void RTUSBBulkOutRTSFrame(struct rt_rtmp_adapter *pAd);
3994
3995void RTUSBCancelPendingBulkInIRP(struct rt_rtmp_adapter *pAd);
3996
3997void RTUSBCancelPendingIRPs(struct rt_rtmp_adapter *pAd);
3998
3999void RTUSBBulkOutMLMEPacket(struct rt_rtmp_adapter *pAd, u8 Index);
4000
4001void RTUSBBulkOutPsPoll(struct rt_rtmp_adapter *pAd);
4002
4003void RTUSBCleanUpMLMEBulkOutQueue(struct rt_rtmp_adapter *pAd);
4004
4005void RTUSBKickBulkOut(struct rt_rtmp_adapter *pAd);
4006
4007void RTUSBBulkReceive(struct rt_rtmp_adapter *pAd);
4008
4009void DoBulkIn(struct rt_rtmp_adapter *pAd);
4010
4011void RTUSBInitRxDesc(struct rt_rtmp_adapter *pAd, struct rt_rx_context *pRxContext);
4012
4013void RTUSBBulkRxHandle(IN unsigned long data);
4014
4015/* */
4016/* Function Prototype in rtusb_io.c */
4017/* */
4018int RTUSBMultiRead(struct rt_rtmp_adapter *pAd,
4019                        u16 Offset, u8 *pData, u16 length);
4020
4021int RTUSBMultiWrite(struct rt_rtmp_adapter *pAd,
4022                    u16 Offset, const u8 *pData, u16 length);
4023
4024int RTUSBMultiWrite_OneByte(struct rt_rtmp_adapter *pAd,
4025                            u16 Offset, const u8 *pData);
4026
4027int RTUSBReadBBPRegister(struct rt_rtmp_adapter *pAd,
4028                              u8 Id, u8 *pValue);
4029
4030int RTUSBWriteBBPRegister(struct rt_rtmp_adapter *pAd,
4031                               u8 Id, u8 Value);
4032
4033int RTUSBWriteRFRegister(struct rt_rtmp_adapter *pAd, u32 Value);
4034
4035int RTUSB_VendorRequest(struct rt_rtmp_adapter *pAd,
4036                             u32 TransferFlags,
4037                             u8 ReservedBits,
4038                             u8 Request,
4039                             u16 Value,
4040                             u16 Index,
4041                             void *TransferBuffer,
4042                             u32 TransferBufferLength);
4043
4044int RTUSBReadEEPROM(struct rt_rtmp_adapter *pAd,
4045                         u16 Offset, u8 *pData, u16 length);
4046
4047int RTUSBWriteEEPROM(struct rt_rtmp_adapter *pAd,
4048                          u16 Offset, u8 *pData, u16 length);
4049
4050void RTUSBPutToSleep(struct rt_rtmp_adapter *pAd);
4051
4052int RTUSBWakeUp(struct rt_rtmp_adapter *pAd);
4053
4054void RTUSBInitializeCmdQ(struct rt_cmdq *cmdq);
4055
4056int RTUSBEnqueueCmdFromNdis(struct rt_rtmp_adapter *pAd,
4057                                    IN NDIS_OID Oid,
4058                                    IN BOOLEAN SetInformation,
4059                                    void *pInformationBuffer,
4060                                    u32 InformationBufferLength);
4061
4062int RTUSBEnqueueInternalCmd(struct rt_rtmp_adapter *pAd,
4063                                    IN NDIS_OID Oid,
4064                                    void *pInformationBuffer,
4065                                    u32 InformationBufferLength);
4066
4067void RTUSBDequeueCmd(struct rt_cmdq *cmdq, struct rt_cmdqelmt * * pcmdqelmt);
4068
4069int RTUSBCmdThread(IN void *Context);
4070
4071void RTUSBBssBeaconExit(struct rt_rtmp_adapter *pAd);
4072
4073void RTUSBBssBeaconStop(struct rt_rtmp_adapter *pAd);
4074
4075void RTUSBBssBeaconStart(struct rt_rtmp_adapter *pAd);
4076
4077void RTUSBBssBeaconInit(struct rt_rtmp_adapter *pAd);
4078
4079void RTUSBWatchDog(struct rt_rtmp_adapter *pAd);
4080
4081int RTUSBWriteMACRegister(struct rt_rtmp_adapter *pAd,
4082                               u16 Offset, u32 Value);
4083
4084int RTUSBReadMACRegister(struct rt_rtmp_adapter *pAd,
4085                              u16 Offset, u32 *pValue);
4086
4087int RTUSBSingleWrite(struct rt_rtmp_adapter *pAd,
4088                          u16 Offset, u16 Value);
4089
4090int RTUSBFirmwareWrite(struct rt_rtmp_adapter *pAd,
4091                       const u8 *pFwImage, unsigned long FwLen);
4092
4093int RTUSBVenderReset(struct rt_rtmp_adapter *pAd);
4094
4095int RTUSBSetHardWareRegister(struct rt_rtmp_adapter *pAdapter, void *pBuf);
4096
4097int RTUSBQueryHardWareRegister(struct rt_rtmp_adapter *pAdapter,
4098                                       void *pBuf);
4099
4100void CMDHandler(struct rt_rtmp_adapter *pAd);
4101
4102int RTUSBWriteHWMACAddress(struct rt_rtmp_adapter *pAdapter);
4103
4104void MacTableInitialize(struct rt_rtmp_adapter *pAd);
4105
4106void MlmeSetPsm(struct rt_rtmp_adapter *pAd, u16 psm);
4107
4108int RTMPWPAAddKeyProc(struct rt_rtmp_adapter *pAd, void *pBuf);
4109
4110void AsicRxAntEvalAction(struct rt_rtmp_adapter *pAd);
4111
4112void append_pkt(struct rt_rtmp_adapter *pAd,
4113                u8 *pHeader802_3,
4114                u32 HdrLen,
4115                u8 *pData,
4116                unsigned long DataSize, void **ppPacket);
4117
4118u32 deaggregate_AMSDU_announce(struct rt_rtmp_adapter *pAd,
4119                                void *pPacket,
4120                                u8 *pData, unsigned long DataSize);
4121
4122int RTMPCheckRxError(struct rt_rtmp_adapter *pAd,
4123                             struct rt_header_802_11 *pHeader,
4124                             struct rt_rxwi *pRxWI,
4125                             IN PRT28XX_RXD_STRUC pRxINFO);
4126
4127void RTUSBMlmeHardTransmit(struct rt_rtmp_adapter *pAd, struct rt_mgmt *pMgmt);
4128
4129int MlmeThread(void *Context);
4130
4131/* */
4132/* Function Prototype in rtusb_data.c */
4133/* */
4134int RTUSBFreeDescriptorRequest(struct rt_rtmp_adapter *pAd,
4135                                       u8 BulkOutPipeId,
4136                                       u32 NumberRequired);
4137
4138BOOLEAN RTUSBNeedQueueBackForAgg(struct rt_rtmp_adapter *pAd, u8 BulkOutPipeId);
4139
4140void RTMPWriteTxInfo(struct rt_rtmp_adapter *pAd,
4141                     struct rt_txinfo *pTxInfo,
4142                     u16 USBDMApktLen,
4143                     IN BOOLEAN bWiv,
4144                     u8 QueueSel, u8 NextValid, u8 TxBurst);
4145
4146/* */
4147/* Function Prototype in cmm_data_usb.c */
4148/* */
4149u16 RtmpUSB_WriteSubTxResource(struct rt_rtmp_adapter *pAd,
4150                                  struct rt_tx_blk *pTxBlk,
4151                                  IN BOOLEAN bIsLast, u16 *FreeNumber);
4152
4153u16 RtmpUSB_WriteSingleTxResource(struct rt_rtmp_adapter *pAd,
4154                                     struct rt_tx_blk *pTxBlk,
4155                                     IN BOOLEAN bIsLast,
4156                                     u16 *FreeNumber);
4157
4158u16 RtmpUSB_WriteFragTxResource(struct rt_rtmp_adapter *pAd,
4159                                   struct rt_tx_blk *pTxBlk,
4160                                   u8 fragNum, u16 *FreeNumber);
4161
4162u16 RtmpUSB_WriteMultiTxResource(struct rt_rtmp_adapter *pAd,
4163                                    struct rt_tx_blk *pTxBlk,
4164                                    u8 frameNum, u16 *FreeNumber);
4165
4166void RtmpUSB_FinalWriteTxResource(struct rt_rtmp_adapter *pAd,
4167                                  struct rt_tx_blk *pTxBlk,
4168                                  u16 totalMPDUSize, u16 TxIdx);
4169
4170void RtmpUSBDataLastTxIdx(struct rt_rtmp_adapter *pAd,
4171                          u8 QueIdx, u16 TxIdx);
4172
4173void RtmpUSBDataKickOut(struct rt_rtmp_adapter *pAd,
4174                        struct rt_tx_blk *pTxBlk, u8 QueIdx);
4175
4176int RtmpUSBMgmtKickOut(struct rt_rtmp_adapter *pAd,
4177                       u8 QueIdx,
4178                       void *pPacket,
4179                       u8 *pSrcBufVA, u32 SrcBufLen);
4180
4181void RtmpUSBNullFrameKickOut(struct rt_rtmp_adapter *pAd,
4182                             u8 QueIdx,
4183                             u8 *pNullFrame, u32 frameLen);
4184
4185void RtmpUsbStaAsicForceWakeupTimeout(void *SystemSpecific1,
4186                                      void *FunctionContext,
4187                                      void *SystemSpecific2,
4188                                      void *SystemSpecific3);
4189
4190void RT28xxUsbStaAsicForceWakeup(struct rt_rtmp_adapter *pAd, IN BOOLEAN bFromTx);
4191
4192void RT28xxUsbStaAsicSleepThenAutoWakeup(struct rt_rtmp_adapter *pAd,
4193                                         u16 TbttNumToNextWakeUp);
4194
4195void RT28xxUsbMlmeRadioOn(struct rt_rtmp_adapter *pAd);
4196
4197void RT28xxUsbMlmeRadioOFF(struct rt_rtmp_adapter *pAd);
4198#endif /* RTMP_MAC_USB // */
4199
4200void AsicTurnOffRFClk(struct rt_rtmp_adapter *pAd, u8 Channel);
4201
4202void AsicTurnOnRFClk(struct rt_rtmp_adapter *pAd, u8 Channel);
4203
4204#ifdef RTMP_TIMER_TASK_SUPPORT
4205int RtmpTimerQThread(IN void *Context);
4206
4207struct rt_rtmp_timer_task_entry *RtmpTimerQInsert(struct rt_rtmp_adapter *pAd,
4208                                        struct rt_ralink_timer *pTimer);
4209
4210BOOLEAN RtmpTimerQRemove(struct rt_rtmp_adapter *pAd,
4211                         struct rt_ralink_timer *pTimer);
4212
4213void RtmpTimerQExit(struct rt_rtmp_adapter *pAd);
4214
4215void RtmpTimerQInit(struct rt_rtmp_adapter *pAd);
4216#endif /* RTMP_TIMER_TASK_SUPPORT // */
4217
4218void AsicStaBbpTuning(struct rt_rtmp_adapter *pAd);
4219
4220BOOLEAN StaAddMacTableEntry(struct rt_rtmp_adapter *pAd,
4221                            struct rt_mac_table_entry *pEntry,
4222                            u8 MaxSupportedRateIn500Kbps,
4223                            struct rt_ht_capability_ie *pHtCapability,
4224                            u8 HtCapabilityLen,
4225                            struct rt_add_ht_info_ie *pAddHtInfo,
4226                            u8 AddHtInfoLen, u16 CapabilityInfo);
4227
4228BOOLEAN AUTH_ReqSend(struct rt_rtmp_adapter *pAd,
4229                     struct rt_mlme_queue_elem *pElem,
4230                     struct rt_ralink_timer *pAuthTimer,
4231                     char *pSMName,
4232                     u16 SeqNo,
4233                     u8 *pNewElement, unsigned long ElementLen);
4234
4235void RTMP_IndicateMediaState(struct rt_rtmp_adapter *pAd);
4236
4237void ReSyncBeaconTime(struct rt_rtmp_adapter *pAd);
4238
4239void RTMPSetAGCInitValue(struct rt_rtmp_adapter *pAd, u8 BandWidth);
4240
4241int rt28xx_close(struct net_device *dev);
4242int rt28xx_open(struct net_device *dev);
4243
4244#define VIRTUAL_IF_INC(__pAd) ((__pAd)->VirtualIfCnt++)
4245#define VIRTUAL_IF_DEC(__pAd) ((__pAd)->VirtualIfCnt--)
4246#define VIRTUAL_IF_NUM(__pAd) ((__pAd)->VirtualIfCnt)
4247
4248#ifdef LINUX
4249__inline int VIRTUAL_IF_UP(struct rt_rtmp_adapter *pAd)
4250{
4251        if (VIRTUAL_IF_NUM(pAd) == 0) {
4252                if (rt28xx_open(pAd->net_dev) != 0) {
4253                        DBGPRINT(RT_DEBUG_TRACE,
4254                                 ("rt28xx_open return fail!\n"));
4255                        return -1;
4256                }
4257        } else {
4258        }
4259        VIRTUAL_IF_INC(pAd);
4260        return 0;
4261}
4262
4263__inline void VIRTUAL_IF_DOWN(struct rt_rtmp_adapter *pAd)
4264{
4265        VIRTUAL_IF_DEC(pAd);
4266        if (VIRTUAL_IF_NUM(pAd) == 0)
4267                rt28xx_close(pAd->net_dev);
4268        return;
4269}
4270#endif /* LINUX // */
4271
4272/*
4273        OS Related funciton prototype definitions.
4274        TODO: Maybe we need to move these function prototypes to other proper place.
4275*/
4276int RtmpOSWrielessEventSend(struct rt_rtmp_adapter *pAd,
4277                            u32 eventType,
4278                            int flags,
4279                            u8 *pSrcMac,
4280                            u8 *pData, u32 dataLen);
4281
4282int RtmpOSNetDevAddrSet(struct net_device *pNetDev, u8 *pMacAddr);
4283
4284int RtmpOSNetDevAttach(struct net_device *pNetDev,
4285                       struct rt_rtmp_os_netdev_op_hook *pDevOpHook);
4286
4287void RtmpOSNetDevClose(struct net_device *pNetDev);
4288
4289void RtmpOSNetDevDetach(struct net_device *pNetDev);
4290
4291int RtmpOSNetDevAlloc(struct net_device **pNewNetDev, u32 privDataSize);
4292
4293void RtmpOSNetDevFree(struct net_device *pNetDev);
4294
4295struct net_device *RtmpOSNetDevGetByName(struct net_device *pNetDev, char *pDevName);
4296
4297void RtmpOSNetDeviceRefPut(struct net_device *pNetDev);
4298
4299struct net_device *RtmpOSNetDevCreate(struct rt_rtmp_adapter *pAd,
4300                            int devType,
4301                            int devNum,
4302                            int privMemSize, char *pNamePrefix);
4303
4304/*
4305        Task operation related function prototypes
4306*/
4307void RtmpOSTaskCustomize(struct rt_rtmp_os_task *pTask);
4308
4309int RtmpOSTaskNotifyToExit(struct rt_rtmp_os_task *pTask);
4310
4311int RtmpOSTaskKill(struct rt_rtmp_os_task *pTask);
4312
4313int RtmpOSTaskInit(struct rt_rtmp_os_task *pTask,
4314                           char *pTaskName, void * pPriv);
4315
4316int RtmpOSTaskAttach(struct rt_rtmp_os_task *pTask,
4317                             IN int (*fn) (void *), IN void *arg);
4318
4319/*
4320        File operation related function prototypes
4321*/
4322struct file *RtmpOSFileOpen(IN char *pPath, IN int flag, IN int mode);
4323
4324int RtmpOSFileClose(struct file *osfd);
4325
4326void RtmpOSFileSeek(struct file *osfd, IN int offset);
4327
4328int RtmpOSFileRead(struct file *osfd, IN char *pDataPtr, IN int readLen);
4329
4330int RtmpOSFileWrite(struct file *osfd, IN char *pDataPtr, IN int writeLen);
4331
4332#endif /* __RTMP_H__ */
4333