]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blob - drivers/staging/rt2860/chip/mac_pci.h
b0aa0d37a61e56caa92484f9b919d8f18b597bb0
[mirror_ubuntu-zesty-kernel.git] / drivers / staging / rt2860 / chip / mac_pci.h
1 /*
2 *************************************************************************
3 * Ralink Tech Inc.
4 * 5F., No.36, Taiyuan St., Jhubei City,
5 * Hsinchu County 302,
6 * Taiwan, R.O.C.
7 *
8 * (c) Copyright 2002-2007, Ralink Technology, Inc.
9 *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 * This program is distributed in the hope that it will be useful, *
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
18 * GNU General Public License for more details. *
19 * *
20 * You should have received a copy of the GNU General Public License *
21 * along with this program; if not, write to the *
22 * Free Software Foundation, Inc., *
23 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
24 * *
25 *************************************************************************
26
27 Module Name:
28 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 //
72 typedef struct PACKED _TXD_STRUC {
73 // Word 0
74 UINT32 SDPtr0;
75 // Word 1
76 UINT32 SDLen1:14;
77 UINT32 LastSec1:1;
78 UINT32 Burst:1;
79 UINT32 SDLen0:14;
80 UINT32 LastSec0:1;
81 UINT32 DMADONE:1;
82 //Word2
83 UINT32 SDPtr1;
84 //Word3
85 UINT32 rsv2:24;
86 UINT32 WIV:1; // Wireless Info Valid. 1 if Driver already fill WI, o if DMA needs to copy WI to correctposition
87 UINT32 QSEL:2; // select on-chip FIFO ID for 2nd-stage output scheduler.0:MGMT, 1:HCCA 2:EDCA
88 UINT32 rsv:2;
89 UINT32 TCO:1; //
90 UINT32 UCO:1; //
91 UINT32 ICO:1; //
92 } TXD_STRUC, *PTXD_STRUC;
93
94 //
95 // Rx descriptor format, Rx Ring
96 //
97 typedef struct PACKED _RXD_STRUC {
98 // Word 0
99 UINT32 SDP0;
100 // Word 1
101 UINT32 SDL1:14;
102 UINT32 Rsv:2;
103 UINT32 SDL0:14;
104 UINT32 LS0:1;
105 UINT32 DDONE:1;
106 // Word 2
107 UINT32 SDP1;
108 // Word 3
109 UINT32 BA:1;
110 UINT32 DATA:1;
111 UINT32 NULLDATA:1;
112 UINT32 FRAG:1;
113 UINT32 U2M:1; // 1: this RX frame is unicast to me
114 UINT32 Mcast:1; // 1: this is a multicast frame
115 UINT32 Bcast:1; // 1: this is a broadcast frame
116 UINT32 MyBss:1; // 1: this frame belongs to the same BSSID
117 UINT32 Crc:1; // 1: CRC error
118 UINT32 CipherErr:2; // 0: decryption okay, 1:ICV error, 2:MIC error, 3:KEY not valid
119 UINT32 AMSDU:1; // rx with 802.3 header, not 802.11 header.
120 UINT32 HTC:1;
121 UINT32 RSSI:1;
122 UINT32 L2PAD:1;
123 UINT32 AMPDU:1;
124 UINT32 Decrypted:1; // this frame is being decrypted.
125 UINT32 PlcpSignal:1; // To be moved
126 UINT32 PlcpRssil:1; // To be moved
127 UINT32 Rsv1:13;
128 } RXD_STRUC, *PRXD_STRUC, RT28XX_RXD_STRUC, *PRT28XX_RXD_STRUC;
129
130 typedef union _TX_ATTENUATION_CTRL_STRUC {
131 struct {
132 ULONG RF_ISOLATION_ENABLE:1;
133 ULONG Reserve2:7;
134 ULONG PCIE_PHY_TX_ATTEN_VALUE:3;
135 ULONG PCIE_PHY_TX_ATTEN_EN:1;
136 ULONG Reserve1:20;
137 } field;
138
139 ULONG 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 ULONG _i, _firm; \
152 RTMP_IO_WRITE32(_pAd, PBF_SYS_CTRL, 0x10000); \
153 \
154 for(_i=0; _i<_FwLen; _i+=4) \
155 { \
156 _firm = _pFwImage[_i] + \
157 (_pFwImage[_i+3] << 24) + \
158 (_pFwImage[_i+2] << 16) + \
159 (_pFwImage[_i+1] << 8); \
160 RTMP_IO_WRITE32(_pAd, FIRMWARE_IMAGE_BASE + _i, _firm); \
161 } \
162 RTMP_IO_WRITE32(_pAd, PBF_SYS_CTRL, 0x00000); \
163 RTMP_IO_WRITE32(_pAd, PBF_SYS_CTRL, 0x00001); \
164 \
165 /* initialize BBP R/W access agent */ \
166 RTMP_IO_WRITE32(_pAd, H2M_BBP_AGENT, 0); \
167 RTMP_IO_WRITE32(_pAd, H2M_MAILBOX_CSR, 0); \
168 }while(0)
169
170 /* ----------------- TX Related MACRO ----------------- */
171 #define RTMP_START_DEQUEUE(pAd, QueIdx, irqFlags) do{}while(0)
172 #define RTMP_STOP_DEQUEUE(pAd, QueIdx, irqFlags) do{}while(0)
173
174 #define RTMP_HAS_ENOUGH_FREE_DESC(pAd, pTxBlk, freeNum, pPacket) \
175 ((freeNum) >= (ULONG)(pTxBlk->TotalFragNum + RTMP_GET_PACKET_FRAGMENTS(pPacket) + 3)) /* rough estimate we will use 3 more descriptor. */
176 #define RTMP_RELEASE_DESC_RESOURCE(pAd, QueIdx) \
177 do{}while(0)
178
179 #define NEED_QUEUE_BACK_FOR_AGG(pAd, QueIdx, freeNum, _TxFrameType) \
180 (((freeNum != (TX_RING_SIZE-1)) && (pAd->TxSwQueue[QueIdx].Number == 0)) || (freeNum<3))
181 //(((freeNum) != (TX_RING_SIZE-1)) && (pAd->TxSwQueue[QueIdx].Number == 1 /*0*/))
182
183 #define HAL_KickOutMgmtTx(_pAd, _QueIdx, _pPacket, _pSrcBufVA, _SrcBufLen) \
184 RtmpPCIMgmtKickOut(_pAd, _QueIdx, _pPacket, _pSrcBufVA, _SrcBufLen)
185
186 #define HAL_WriteSubTxResource(pAd, pTxBlk, bIsLast, pFreeNumber) \
187 /* RtmpPCI_WriteSubTxResource(pAd, pTxBlk, bIsLast, pFreeNumber) */
188
189 #define HAL_WriteTxResource(pAd, pTxBlk,bIsLast, pFreeNumber) \
190 RtmpPCI_WriteSingleTxResource(pAd, pTxBlk, bIsLast, pFreeNumber)
191
192 #define HAL_WriteFragTxResource(pAd, pTxBlk, fragNum, pFreeNumber) \
193 RtmpPCI_WriteFragTxResource(pAd, pTxBlk, fragNum, pFreeNumber)
194
195 #define HAL_WriteMultiTxResource(pAd, pTxBlk,frameNum, pFreeNumber) \
196 RtmpPCI_WriteMultiTxResource(pAd, pTxBlk, frameNum, pFreeNumber)
197
198 #define HAL_FinalWriteTxResource(_pAd, _pTxBlk, _TotalMPDUSize, _FirstTxIdx) \
199 RtmpPCI_FinalWriteTxResource(_pAd, _pTxBlk, _TotalMPDUSize, _FirstTxIdx)
200
201 #define HAL_LastTxIdx(_pAd, _QueIdx,_LastTxIdx) \
202 /*RtmpPCIDataLastTxIdx(_pAd, _QueIdx,_LastTxIdx) */
203
204 #define HAL_KickOutTx(_pAd, _pTxBlk, _QueIdx) \
205 RTMP_IO_WRITE32((_pAd), TX_CTX_IDX0+((_QueIdx)*0x10), (_pAd)->TxRing[(_QueIdx)].TxCpuIdx)
206 /* RtmpPCIDataKickOut(_pAd, _pTxBlk, _QueIdx)*/
207
208 #define HAL_KickOutNullFrameTx(_pAd, _QueIdx, _pNullFrame, _frameLen) \
209 MiniportMMRequest(_pAd, _QueIdx, _pNullFrame, _frameLen)
210
211 #define GET_TXRING_FREENO(_pAd, _QueIdx) \
212 (_pAd->TxRing[_QueIdx].TxSwFreeIdx > _pAd->TxRing[_QueIdx].TxCpuIdx) ? \
213 (_pAd->TxRing[_QueIdx].TxSwFreeIdx - _pAd->TxRing[_QueIdx].TxCpuIdx - 1) \
214 : \
215 (_pAd->TxRing[_QueIdx].TxSwFreeIdx + TX_RING_SIZE - _pAd->TxRing[_QueIdx].TxCpuIdx - 1);
216
217 #define GET_MGMTRING_FREENO(_pAd) \
218 (_pAd->MgmtRing.TxSwFreeIdx > _pAd->MgmtRing.TxCpuIdx) ? \
219 (_pAd->MgmtRing.TxSwFreeIdx - _pAd->MgmtRing.TxCpuIdx - 1) \
220 : \
221 (_pAd->MgmtRing.TxSwFreeIdx + MGMT_RING_SIZE - _pAd->MgmtRing.TxCpuIdx - 1);
222
223 /* ----------------- RX Related MACRO ----------------- */
224
225 /* ----------------- ASIC Related MACRO ----------------- */
226 // reset MAC of a station entry to 0x000000000000
227 #define RTMP_STA_ENTRY_MAC_RESET(pAd, Wcid) \
228 AsicDelWcidTab(pAd, Wcid);
229
230 // add this entry into ASIC RX WCID search table
231 #define RTMP_STA_ENTRY_ADD(pAd, pEntry) \
232 AsicUpdateRxWCIDTable(pAd, pEntry->Aid, pEntry->Addr);
233
234 // add by johnli, fix "in_interrupt" error when call "MacTableDeleteEntry" in Rx tasklet
235 // Set MAC register value according operation mode
236 #define RTMP_UPDATE_PROTECT(pAd) \
237 AsicUpdateProtect(pAd, 0, (ALLN_SETPROTECT), TRUE, 0);
238 // end johnli
239
240 // remove Pair-wise key material from ASIC
241 #define RTMP_STA_ENTRY_KEY_DEL(pAd, BssIdx, Wcid) \
242 AsicRemovePairwiseKeyEntry(pAd, BssIdx, (UCHAR)Wcid);
243
244 // add Client security information into ASIC WCID table and IVEIV table
245 #define RTMP_STA_SECURITY_INFO_ADD(pAd, apidx, KeyID, pEntry) \
246 RTMPAddWcidAttributeEntry(pAd, apidx, KeyID, \
247 pAd->SharedKey[apidx][KeyID].CipherAlg, pEntry);
248
249 #define RTMP_SECURITY_KEY_ADD(pAd, apidx, KeyID, pEntry) \
250 { /* update pairwise key information to ASIC Shared Key Table */ \
251 AsicAddSharedKeyEntry(pAd, apidx, KeyID, \
252 pAd->SharedKey[apidx][KeyID].CipherAlg, \
253 pAd->SharedKey[apidx][KeyID].Key, \
254 pAd->SharedKey[apidx][KeyID].TxMic, \
255 pAd->SharedKey[apidx][KeyID].RxMic); \
256 /* update ASIC WCID attribute table and IVEIV table */ \
257 RTMPAddWcidAttributeEntry(pAd, apidx, KeyID, \
258 pAd->SharedKey[apidx][KeyID].CipherAlg, \
259 pEntry); }
260
261 // Insert the BA bitmap to ASIC for the Wcid entry
262 #define RTMP_ADD_BA_SESSION_TO_ASIC(_pAd, _Aid, _TID) \
263 do{ \
264 UINT32 _Value = 0, _Offset; \
265 _Offset = MAC_WCID_BASE + (_Aid) * HW_WCID_ENTRY_SIZE + 4; \
266 RTMP_IO_READ32((_pAd), _Offset, &_Value);\
267 _Value |= (0x10000<<(_TID)); \
268 RTMP_IO_WRITE32((_pAd), _Offset, _Value);\
269 }while(0)
270
271 // Remove the BA bitmap from ASIC for the Wcid entry
272 // bitmap field starts at 0x10000 in ASIC WCID table
273 #define RTMP_DEL_BA_SESSION_FROM_ASIC(_pAd, _Wcid, _TID) \
274 do{ \
275 UINT32 _Value = 0, _Offset; \
276 _Offset = MAC_WCID_BASE + (_Wcid) * HW_WCID_ENTRY_SIZE + 4; \
277 RTMP_IO_READ32((_pAd), _Offset, &_Value); \
278 _Value &= (~(0x10000 << (_TID))); \
279 RTMP_IO_WRITE32((_pAd), _Offset, _Value); \
280 }while(0)
281
282 /* ----------------- Interface Related MACRO ----------------- */
283
284 //
285 // Enable & Disable NIC interrupt via writing interrupt mask register
286 // Since it use ADAPTER structure, it have to be put after structure definition.
287 //
288 #define RTMP_ASIC_INTERRUPT_DISABLE(_pAd) \
289 do{ \
290 RTMP_IO_WRITE32((_pAd), INT_MASK_CSR, 0x0); /* 0: disable */ \
291 RTMP_CLEAR_FLAG((_pAd), fRTMP_ADAPTER_INTERRUPT_ACTIVE); \
292 }while(0)
293
294 #define RTMP_ASIC_INTERRUPT_ENABLE(_pAd)\
295 do{ \
296 RTMP_IO_WRITE32((_pAd), INT_MASK_CSR, (_pAd)->int_enable_reg /*DELAYINTMASK*/); /* 1:enable */ \
297 RTMP_SET_FLAG((_pAd), fRTMP_ADAPTER_INTERRUPT_ACTIVE); \
298 }while(0)
299
300 #define RTMP_IRQ_INIT(pAd) \
301 { pAd->int_enable_reg = ((DELAYINTMASK) | \
302 (RxINT|TxDataInt|TxMgmtInt)) & ~(0x03); \
303 pAd->int_disable_mask = 0; \
304 pAd->int_pending = 0; }
305
306 #define RTMP_IRQ_ENABLE(pAd) \
307 { /* clear garbage ints */ \
308 RTMP_IO_WRITE32(pAd, INT_SOURCE_CSR, 0xffffffff);\
309 RTMP_ASIC_INTERRUPT_ENABLE(pAd); }
310
311 /* ----------------- MLME Related MACRO ----------------- */
312 #define RTMP_MLME_HANDLER(pAd) MlmeHandler(pAd)
313
314 #define RTMP_MLME_PRE_SANITY_CHECK(pAd)
315
316 #define RTMP_MLME_STA_QUICK_RSP_WAKE_UP(pAd) \
317 RTMPSetTimer(&pAd->StaCfg.StaQuickResponeForRateUpTimer, 100);
318
319 #define RTMP_MLME_RESET_STATE_MACHINE(pAd) \
320 MlmeRestartStateMachine(pAd)
321
322 #define RTMP_HANDLE_COUNTER_MEASURE(_pAd, _pEntry)\
323 HandleCounterMeasure(_pAd, _pEntry)
324
325 /* ----------------- Power Save Related MACRO ----------------- */
326 #define RTMP_PS_POLL_ENQUEUE(pAd) EnqueuePsPoll(pAd)
327
328 // For RTMPPCIePowerLinkCtrlRestore () function
329 #define RESTORE_HALT 1
330 #define RESTORE_WAKEUP 2
331 #define RESTORE_CLOSE 3
332
333 #define PowerSafeCID 1
334 #define PowerRadioOffCID 2
335 #define PowerWakeCID 3
336 #define CID0MASK 0x000000ff
337 #define CID1MASK 0x0000ff00
338 #define CID2MASK 0x00ff0000
339 #define CID3MASK 0xff000000
340
341 #define RTMP_STA_FORCE_WAKEUP(pAd, bFromTx) \
342 RT28xxPciStaAsicForceWakeup(pAd, bFromTx);
343
344 #define RTMP_STA_SLEEP_THEN_AUTO_WAKEUP(pAd, TbttNumToNextWakeUp) \
345 RT28xxPciStaAsicSleepThenAutoWakeup(pAd, TbttNumToNextWakeUp);
346
347 #define RTMP_SET_PSM_BIT(_pAd, _val) \
348 MlmeSetPsmBit(_pAd, _val);
349
350 #define RTMP_MLME_RADIO_ON(pAd) \
351 RT28xxPciMlmeRadioOn(pAd);
352
353 #define RTMP_MLME_RADIO_OFF(pAd) \
354 RT28xxPciMlmeRadioOFF(pAd);
355
356 #endif //__MAC_PCI_H__ //