• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/components/opensource/linux/linux-2.6.36/drivers/staging/rt2860/chip/
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