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 mac_pci.h 29 30 Abstract: 31 32 Revision History: 33 Who When What 34 --------- ---------- ---------------------------------------------- 35 */ 36 37#ifndef __MAC_PCI_H__ 38#define __MAC_PCI_H__ 39 40#include "../rtmp_type.h" 41#include "rtmp_mac.h" 42#include "rtmp_phy.h" 43#include "../rtmp_iface.h" 44#include "../rtmp_dot11.h" 45 46/* */ 47/* Device ID & Vendor ID related definitions, */ 48/* NOTE: you should not add the new VendorID/DeviceID here unless you not sure it belongs to what chip. */ 49/* */ 50#define NIC_PCI_VENDOR_ID 0x1814 51#define PCIBUS_INTEL_VENDOR 0x8086 52 53#if !defined(PCI_CAP_ID_EXP) 54#define PCI_CAP_ID_EXP 0x10 55#endif 56#if !defined(PCI_EXP_LNKCTL) 57#define PCI_EXP_LNKCTL 0x10 58#endif 59#if !defined(PCI_CLASS_BRIDGE_PCI) 60#define PCI_CLASS_BRIDGE_PCI 0x0604 61#endif 62 63#define TXINFO_SIZE 0 64#define RTMP_PKT_TAIL_PADDING 0 65#define fRTMP_ADAPTER_NEED_STOP_TX 0 66 67#define AUX_CTRL 0x10c 68 69/* */ 70/* TX descriptor format, Tx ring, Mgmt Ring */ 71/* */ 72struct PACKED rt_txd { 73 /* Word 0 */ 74 u32 SDPtr0; 75 /* Word 1 */ 76 u32 SDLen1:14; 77 u32 LastSec1:1; 78 u32 Burst:1; 79 u32 SDLen0:14; 80 u32 LastSec0:1; 81 u32 DMADONE:1; 82 /*Word2 */ 83 u32 SDPtr1; 84 /*Word3 */ 85 u32 rsv2:24; 86 u32 WIV:1; /* Wireless Info Valid. 1 if Driver already fill WI, o if DMA needs to copy WI to correctposition */ 87 u32 QSEL:2; /* select on-chip FIFO ID for 2nd-stage output scheduler.0:MGMT, 1:HCCA 2:EDCA */ 88 u32 rsv:2; 89 u32 TCO:1; /* */ 90 u32 UCO:1; /* */ 91 u32 ICO:1; /* */ 92}; 93 94/* */ 95/* Rx descriptor format, Rx Ring */ 96/* */ 97typedef struct PACKED rt_rxd { 98 /* Word 0 */ 99 u32 SDP0; 100 /* Word 1 */ 101 u32 SDL1:14; 102 u32 Rsv:2; 103 u32 SDL0:14; 104 u32 LS0:1; 105 u32 DDONE:1; 106 /* Word 2 */ 107 u32 SDP1; 108 /* Word 3 */ 109 u32 BA:1; 110 u32 DATA:1; 111 u32 NULLDATA:1; 112 u32 FRAG:1; 113 u32 U2M:1; /* 1: this RX frame is unicast to me */ 114 u32 Mcast:1; /* 1: this is a multicast frame */ 115 u32 Bcast:1; /* 1: this is a broadcast frame */ 116 u32 MyBss:1; /* 1: this frame belongs to the same BSSID */ 117 u32 Crc:1; /* 1: CRC error */ 118 u32 CipherErr:2; /* 0: decryption okay, 1:ICV error, 2:MIC error, 3:KEY not valid */ 119 u32 AMSDU:1; /* rx with 802.3 header, not 802.11 header. */ 120 u32 HTC:1; 121 u32 RSSI:1; 122 u32 L2PAD:1; 123 u32 AMPDU:1; 124 u32 Decrypted:1; /* this frame is being decrypted. */ 125 u32 PlcpSignal:1; /* To be moved */ 126 u32 PlcpRssil:1; /* To be moved */ 127 u32 Rsv1:13; 128} RT28XX_RXD_STRUC, *PRT28XX_RXD_STRUC; 129 130typedef union _TX_ATTENUATION_CTRL_STRUC { 131 struct { 132 unsigned long RF_ISOLATION_ENABLE:1; 133 unsigned long Reserve2:7; 134 unsigned long PCIE_PHY_TX_ATTEN_VALUE:3; 135 unsigned long PCIE_PHY_TX_ATTEN_EN:1; 136 unsigned long Reserve1:20; 137 } field; 138 139 unsigned long word; 140} TX_ATTENUATION_CTRL_STRUC, *PTX_ATTENUATION_CTRL_STRUC; 141 142/* ----------------- EEPROM Related MACRO ----------------- */ 143 144/* 8051 firmware image for RT2860 - base address = 0x4000 */ 145#define FIRMWARE_IMAGE_BASE 0x2000 146#define MAX_FIRMWARE_IMAGE_SIZE 0x2000 /* 8kbyte */ 147 148/* ----------------- Frimware Related MACRO ----------------- */ 149#define RTMP_WRITE_FIRMWARE(_pAd, _pFwImage, _FwLen) \ 150 do { \ 151 unsigned long _i, _firm; \ 152 RTMP_IO_WRITE32(_pAd, PBF_SYS_CTRL, 0x10000); \ 153 \ 154 for (_i = 0; _i < _FwLen; _i += 4) { \ 155 _firm = _pFwImage[_i] + \ 156 (_pFwImage[_i+3] << 24) + \ 157 (_pFwImage[_i+2] << 16) + \ 158 (_pFwImage[_i+1] << 8); \ 159 RTMP_IO_WRITE32(_pAd, FIRMWARE_IMAGE_BASE + _i, _firm); \ 160 } \ 161 RTMP_IO_WRITE32(_pAd, PBF_SYS_CTRL, 0x00000); \ 162 RTMP_IO_WRITE32(_pAd, PBF_SYS_CTRL, 0x00001); \ 163 \ 164 /* initialize BBP R/W access agent */ \ 165 RTMP_IO_WRITE32(_pAd, H2M_BBP_AGENT, 0); \ 166 RTMP_IO_WRITE32(_pAd, H2M_MAILBOX_CSR, 0); \ 167 } while (0) 168 169/* ----------------- TX Related MACRO ----------------- */ 170#define RTMP_START_DEQUEUE(pAd, QueIdx, irqFlags) do {} while (0) 171#define RTMP_STOP_DEQUEUE(pAd, QueIdx, irqFlags) do {} while (0) 172 173#define RTMP_HAS_ENOUGH_FREE_DESC(pAd, pTxBlk, freeNum, pPacket) \ 174 ((freeNum) >= (unsigned long)(pTxBlk->TotalFragNum + RTMP_GET_PACKET_FRAGMENTS(pPacket) + 3)) /* rough estimate we will use 3 more descriptor. */ 175#define RTMP_RELEASE_DESC_RESOURCE(pAd, QueIdx) do {} while (0) 176 177#define NEED_QUEUE_BACK_FOR_AGG(pAd, QueIdx, freeNum, _TxFrameType) \ 178 (((freeNum != (TX_RING_SIZE-1)) && \ 179 (pAd->TxSwQueue[QueIdx].Number == 0)) || (freeNum < 3)) 180 181#define HAL_KickOutMgmtTx(_pAd, _QueIdx, _pPacket, _pSrcBufVA, _SrcBufLen) \ 182 RtmpPCIMgmtKickOut(_pAd, _QueIdx, _pPacket, _pSrcBufVA, _SrcBufLen) 183 184#define HAL_WriteSubTxResource(pAd, pTxBlk, bIsLast, pFreeNumber) \ 185 /* RtmpPCI_WriteSubTxResource(pAd, pTxBlk, bIsLast, pFreeNumber) */ 186 187#define HAL_WriteTxResource(pAd, pTxBlk, bIsLast, pFreeNumber) \ 188 RtmpPCI_WriteSingleTxResource(pAd, pTxBlk, bIsLast, pFreeNumber) 189 190#define HAL_WriteFragTxResource(pAd, pTxBlk, fragNum, pFreeNumber) \ 191 RtmpPCI_WriteFragTxResource(pAd, pTxBlk, fragNum, pFreeNumber) 192 193#define HAL_WriteMultiTxResource(pAd, pTxBlk, frameNum, pFreeNumber) \ 194 RtmpPCI_WriteMultiTxResource(pAd, pTxBlk, frameNum, pFreeNumber) 195 196#define HAL_FinalWriteTxResource(_pAd, _pTxBlk, _TotalMPDUSize, _FirstTxIdx) \ 197 RtmpPCI_FinalWriteTxResource(_pAd, _pTxBlk, _TotalMPDUSize, _FirstTxIdx) 198 199#define HAL_LastTxIdx(_pAd, _QueIdx, _LastTxIdx) \ 200 /*RtmpPCIDataLastTxIdx(_pAd, _QueIdx,_LastTxIdx) */ 201 202#define HAL_KickOutTx(_pAd, _pTxBlk, _QueIdx) \ 203 RTMP_IO_WRITE32((_pAd), TX_CTX_IDX0+((_QueIdx)*0x10), (_pAd)->TxRing[(_QueIdx)].TxCpuIdx) 204/* RtmpPCIDataKickOut(_pAd, _pTxBlk, _QueIdx)*/ 205 206#define HAL_KickOutNullFrameTx(_pAd, _QueIdx, _pNullFrame, _frameLen) \ 207 MiniportMMRequest(_pAd, _QueIdx, _pNullFrame, _frameLen) 208 209#define GET_TXRING_FREENO(_pAd, _QueIdx) \ 210 (_pAd->TxRing[_QueIdx].TxSwFreeIdx > _pAd->TxRing[_QueIdx].TxCpuIdx) ? \ 211 (_pAd->TxRing[_QueIdx].TxSwFreeIdx - _pAd->TxRing[_QueIdx].TxCpuIdx - 1) \ 212 : \ 213 (_pAd->TxRing[_QueIdx].TxSwFreeIdx + TX_RING_SIZE - _pAd->TxRing[_QueIdx].TxCpuIdx - 1); 214 215#define GET_MGMTRING_FREENO(_pAd) \ 216 (_pAd->MgmtRing.TxSwFreeIdx > _pAd->MgmtRing.TxCpuIdx) ? \ 217 (_pAd->MgmtRing.TxSwFreeIdx - _pAd->MgmtRing.TxCpuIdx - 1) \ 218 : \ 219 (_pAd->MgmtRing.TxSwFreeIdx + MGMT_RING_SIZE - _pAd->MgmtRing.TxCpuIdx - 1); 220 221/* ----------------- RX Related MACRO ----------------- */ 222 223/* ----------------- ASIC Related MACRO ----------------- */ 224/* reset MAC of a station entry to 0x000000000000 */ 225#define RTMP_STA_ENTRY_MAC_RESET(pAd, Wcid) \ 226 AsicDelWcidTab(pAd, Wcid); 227 228/* add this entry into ASIC RX WCID search table */ 229#define RTMP_STA_ENTRY_ADD(pAd, pEntry) \ 230 AsicUpdateRxWCIDTable(pAd, pEntry->Aid, pEntry->Addr); 231 232/* add by johnli, fix "in_interrupt" error when call "MacTableDeleteEntry" in Rx tasklet */ 233/* Set MAC register value according operation mode */ 234#define RTMP_UPDATE_PROTECT(pAd) \ 235 AsicUpdateProtect(pAd, 0, (ALLN_SETPROTECT), TRUE, 0); 236/* end johnli */ 237 238/* remove Pair-wise key material from ASIC */ 239#define RTMP_STA_ENTRY_KEY_DEL(pAd, BssIdx, Wcid) \ 240 AsicRemovePairwiseKeyEntry(pAd, BssIdx, (u8)Wcid); 241 242/* add Client security information into ASIC WCID table and IVEIV table */ 243#define RTMP_STA_SECURITY_INFO_ADD(pAd, apidx, KeyID, pEntry) \ 244 RTMPAddWcidAttributeEntry(pAd, apidx, KeyID, \ 245 pAd->SharedKey[apidx][KeyID].CipherAlg, pEntry); 246 247#define RTMP_SECURITY_KEY_ADD(pAd, apidx, KeyID, pEntry) \ 248 { /* update pairwise key information to ASIC Shared Key Table */ \ 249 AsicAddSharedKeyEntry(pAd, apidx, KeyID, \ 250 pAd->SharedKey[apidx][KeyID].CipherAlg, \ 251 pAd->SharedKey[apidx][KeyID].Key, \ 252 pAd->SharedKey[apidx][KeyID].TxMic, \ 253 pAd->SharedKey[apidx][KeyID].RxMic); \ 254 /* update ASIC WCID attribute table and IVEIV table */ \ 255 RTMPAddWcidAttributeEntry(pAd, apidx, KeyID, \ 256 pAd->SharedKey[apidx][KeyID].CipherAlg, \ 257 pEntry); } 258 259/* Insert the BA bitmap to ASIC for the Wcid entry */ 260#define RTMP_ADD_BA_SESSION_TO_ASIC(_pAd, _Aid, _TID) \ 261 do { \ 262 u32 _Value = 0, _Offset; \ 263 _Offset = MAC_WCID_BASE + (_Aid) * HW_WCID_ENTRY_SIZE + 4; \ 264 RTMP_IO_READ32((_pAd), _Offset, &_Value);\ 265 _Value |= (0x10000<<(_TID)); \ 266 RTMP_IO_WRITE32((_pAd), _Offset, _Value);\ 267 } while (0) 268 269/* Remove the BA bitmap from ASIC for the Wcid entry */ 270/* bitmap field starts at 0x10000 in ASIC WCID table */ 271#define RTMP_DEL_BA_SESSION_FROM_ASIC(_pAd, _Wcid, _TID) \ 272 do { \ 273 u32 _Value = 0, _Offset; \ 274 _Offset = MAC_WCID_BASE + (_Wcid) * HW_WCID_ENTRY_SIZE + 4; \ 275 RTMP_IO_READ32((_pAd), _Offset, &_Value); \ 276 _Value &= (~(0x10000 << (_TID))); \ 277 RTMP_IO_WRITE32((_pAd), _Offset, _Value); \ 278 } while (0) 279 280/* ----------------- Interface Related MACRO ----------------- */ 281 282/* */ 283/* Enable & Disable NIC interrupt via writing interrupt mask register */ 284/* Since it use ADAPTER structure, it have to be put after structure definition. */ 285/* */ 286#define RTMP_ASIC_INTERRUPT_DISABLE(_pAd) \ 287 do { \ 288 RTMP_IO_WRITE32((_pAd), INT_MASK_CSR, 0x0); /* 0: disable */ \ 289 RTMP_CLEAR_FLAG((_pAd), fRTMP_ADAPTER_INTERRUPT_ACTIVE); \ 290 } while (0) 291 292#define RTMP_ASIC_INTERRUPT_ENABLE(_pAd)\ 293 do { \ 294 RTMP_IO_WRITE32((_pAd), INT_MASK_CSR, (_pAd)->int_enable_reg /*DELAYINTMASK*/); /* 1:enable */ \ 295 RTMP_SET_FLAG((_pAd), fRTMP_ADAPTER_INTERRUPT_ACTIVE); \ 296 } while (0) 297 298#define RTMP_IRQ_INIT(pAd) \ 299 { pAd->int_enable_reg = ((DELAYINTMASK) | \ 300 (RxINT|TxDataInt|TxMgmtInt)) & ~(0x03); \ 301 pAd->int_disable_mask = 0; \ 302 pAd->int_pending = 0; } 303 304#define RTMP_IRQ_ENABLE(pAd) \ 305 { /* clear garbage ints */ \ 306 RTMP_IO_WRITE32(pAd, INT_SOURCE_CSR, 0xffffffff);\ 307 RTMP_ASIC_INTERRUPT_ENABLE(pAd); } 308 309/* ----------------- MLME Related MACRO ----------------- */ 310#define RTMP_MLME_HANDLER(pAd) MlmeHandler(pAd) 311 312#define RTMP_MLME_PRE_SANITY_CHECK(pAd) 313 314#define RTMP_MLME_STA_QUICK_RSP_WAKE_UP(pAd) \ 315 RTMPSetTimer(&pAd->StaCfg.StaQuickResponeForRateUpTimer, 100); 316 317#define RTMP_MLME_RESET_STATE_MACHINE(pAd) \ 318 MlmeRestartStateMachine(pAd) 319 320#define RTMP_HANDLE_COUNTER_MEASURE(_pAd, _pEntry)\ 321 HandleCounterMeasure(_pAd, _pEntry) 322 323/* ----------------- Power Save Related MACRO ----------------- */ 324#define RTMP_PS_POLL_ENQUEUE(pAd) EnqueuePsPoll(pAd) 325 326/* For RTMPPCIePowerLinkCtrlRestore () function */ 327#define RESTORE_HALT 1 328#define RESTORE_WAKEUP 2 329#define RESTORE_CLOSE 3 330 331#define PowerSafeCID 1 332#define PowerRadioOffCID 2 333#define PowerWakeCID 3 334#define CID0MASK 0x000000ff 335#define CID1MASK 0x0000ff00 336#define CID2MASK 0x00ff0000 337#define CID3MASK 0xff000000 338 339#define RTMP_STA_FORCE_WAKEUP(pAd, bFromTx) \ 340 RT28xxPciStaAsicForceWakeup(pAd, bFromTx); 341 342#define RTMP_STA_SLEEP_THEN_AUTO_WAKEUP(pAd, TbttNumToNextWakeUp) \ 343 RT28xxPciStaAsicSleepThenAutoWakeup(pAd, TbttNumToNextWakeUp); 344 345#define RTMP_SET_PSM_BIT(_pAd, _val) \ 346 MlmeSetPsmBit(_pAd, _val); 347 348#define RTMP_MLME_RADIO_ON(pAd) \ 349 RT28xxPciMlmeRadioOn(pAd); 350 351#define RTMP_MLME_RADIO_OFF(pAd) \ 352 RT28xxPciMlmeRadioOFF(pAd); 353 354#endif /*__MAC_PCI_H__ // */ 355