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