• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
28 #ifndef __RT2870_H__
29 #define __RT2870_H__
30 
31 //usb header files
32 #include <linux/usb.h>
33 
34 /* rtmp_def.h */
35 //
36 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
37 #define BULKAGGRE_ZISE          100
38 #define RT28XX_DRVDATA_SET(_a)                                             usb_set_intfdata(_a, pAd);
39 #define RT28XX_PUT_DEVICE                                                  usb_put_dev
40 #define RTUSB_ALLOC_URB(iso)                                               usb_alloc_urb(iso, GFP_ATOMIC)
41 #define RTUSB_SUBMIT_URB(pUrb)                                             usb_submit_urb(pUrb, GFP_ATOMIC)
42 #define	RTUSB_URB_ALLOC_BUFFER(pUsb_Dev, BufSize, pDma_addr)               usb_buffer_alloc(pUsb_Dev, BufSize, GFP_ATOMIC, pDma_addr)
43 #define	RTUSB_URB_FREE_BUFFER(pUsb_Dev, BufSize, pTransferBuf, Dma_addr)   usb_buffer_free(pUsb_Dev, BufSize, pTransferBuf, Dma_addr)
44 #else
45 #define BULKAGGRE_ZISE          60
46 #define RT28XX_DRVDATA_SET(_a)
47 #define RT28XX_PUT_DEVICE(dev_p)
48 #define RTUSB_ALLOC_URB(iso)                                               usb_alloc_urb(iso)
49 #define RTUSB_SUBMIT_URB(pUrb)                                             usb_submit_urb(pUrb)
50 #define RTUSB_URB_ALLOC_BUFFER(pUsb_Dev, BufSize, pDma_addr)               kmalloc(BufSize, GFP_ATOMIC)
51 #define	RTUSB_URB_FREE_BUFFER(pUsb_Dev, BufSize, pTransferBuf, Dma_addr)   kfree(pTransferBuf)
52 #endif
53 
54 #define RXBULKAGGRE_ZISE        12
55 #define MAX_TXBULK_LIMIT        (LOCAL_TXBUF_SIZE*(BULKAGGRE_ZISE-1))
56 #define MAX_TXBULK_SIZE         (LOCAL_TXBUF_SIZE*BULKAGGRE_ZISE)
57 #define MAX_RXBULK_SIZE         (LOCAL_TXBUF_SIZE*RXBULKAGGRE_ZISE)
58 #define MAX_MLME_HANDLER_MEMORY 20
59 #define	RETRY_LIMIT             10
60 #define BUFFER_SIZE				2400	//2048
61 #define	TX_RING					0xa
62 #define	PRIO_RING				0xc
63 
64 
65 // Flags for Bulkflags control for bulk out data
66 //
67 #define	fRTUSB_BULK_OUT_DATA_NULL				0x00000001
68 #define fRTUSB_BULK_OUT_RTS						0x00000002
69 #define	fRTUSB_BULK_OUT_MLME					0x00000004
70 
71 #define	fRTUSB_BULK_OUT_DATA_NORMAL				0x00010000
72 #define	fRTUSB_BULK_OUT_DATA_NORMAL_2			0x00020000
73 #define	fRTUSB_BULK_OUT_DATA_NORMAL_3			0x00040000
74 #define	fRTUSB_BULK_OUT_DATA_NORMAL_4			0x00080000
75 
76 #define	fRTUSB_BULK_OUT_PSPOLL					0x00000020
77 #define	fRTUSB_BULK_OUT_DATA_FRAG				0x00000040
78 #define	fRTUSB_BULK_OUT_DATA_FRAG_2				0x00000080
79 #define	fRTUSB_BULK_OUT_DATA_FRAG_3				0x00000100
80 #define	fRTUSB_BULK_OUT_DATA_FRAG_4				0x00000200
81 
82 #ifdef RALINK_ATE
83 #define	fRTUSB_BULK_OUT_DATA_ATE				0x00100000
84 #endif // RALINK_ATE //
85 
86 #define RT2870_USB_DEVICES	\
87 {	\
88 	{USB_DEVICE(0x148F,0x2770)}, /* Ralink */		\
89 	{USB_DEVICE(0x148F,0x2870)}, /* Ralink */		\
90 	{USB_DEVICE(0x148F,0x3070)}, /* Ralink */		\
91 	{USB_DEVICE(0x0B05,0x1731)}, /* Asus */			\
92 	{USB_DEVICE(0x0B05,0x1732)}, /* Asus */			\
93 	{USB_DEVICE(0x0B05,0x1742)}, /* Asus */			\
94 	{USB_DEVICE(0x0DF6,0x0017)}, /* Sitecom */		\
95 	{USB_DEVICE(0x0DF6,0x002B)}, /* Sitecom */		\
96 	{USB_DEVICE(0x0DF6,0x002C)}, /* Sitecom */		\
97 	{USB_DEVICE(0x0DF6,0x002D)}, /* Sitecom */		\
98 	{USB_DEVICE(0x14B2,0x3C06)}, /* Conceptronic */		\
99 	{USB_DEVICE(0x14B2,0x3C28)}, /* Conceptronic */		\
100 	{USB_DEVICE(0x2019,0xED06)}, /* Planex Communications, Inc. */		\
101 	{USB_DEVICE(0x2019,0xAB25)}, /* Planex Communications, Inc. RT3070 */		\
102 	{USB_DEVICE(0x07D1,0x3C09)}, /* D-Link */		\
103 	{USB_DEVICE(0x07D1,0x3C11)}, /* D-Link */		\
104 	{USB_DEVICE(0x14B2,0x3C07)}, /* AL */			\
105 	{USB_DEVICE(0x14B2,0x3C12)}, /* AL */           \
106 	{USB_DEVICE(0x050D,0x8053)}, /* Belkin */		\
107 	{USB_DEVICE(0x14B2,0x3C23)}, /* Airlink */		\
108 	{USB_DEVICE(0x14B2,0x3C27)}, /* Airlink */		\
109 	{USB_DEVICE(0x07AA,0x002F)}, /* Corega */		\
110 	{USB_DEVICE(0x07AA,0x003C)}, /* Corega */		\
111 	{USB_DEVICE(0x07AA,0x003F)}, /* Corega */		\
112 	{USB_DEVICE(0x18C5,0x0012)}, /* Corega */		\
113 	{USB_DEVICE(0x1044,0x800B)}, /* Gigabyte */		\
114 	{USB_DEVICE(0x15A9,0x0006)}, /* Sparklan */		\
115 	{USB_DEVICE(0x083A,0xB522)}, /* SMC */			\
116 	{USB_DEVICE(0x083A,0xA618)}, /* SMC */			\
117 	{USB_DEVICE(0x083A,0x7522)}, /* Arcadyan */		\
118 	{USB_DEVICE(0x0CDE,0x0022)}, /* ZCOM */			\
119 	{USB_DEVICE(0x0586,0x3416)}, /* Zyxel */		\
120 	{USB_DEVICE(0x0CDE,0x0025)}, /* Zyxel */		\
121 	{USB_DEVICE(0x1740,0x9701)}, /* EnGenius */		\
122 	{USB_DEVICE(0x1740,0x9702)}, /* EnGenius */		\
123 	{USB_DEVICE(0x0471,0x200f)}, /* Philips */		\
124 	{USB_DEVICE(0x14B2,0x3C25)}, /* Draytek */		\
125 	{USB_DEVICE(0x13D3,0x3247)}, /* AzureWave */	\
126 	{USB_DEVICE(0x083A,0x6618)}, /* Accton */		\
127 	{USB_DEVICE(0x15c5,0x0008)}, /* Amit */			\
128 	{USB_DEVICE(0x0E66,0x0001)}, /* Hawking */		\
129 	{USB_DEVICE(0x0E66,0x0003)}, /* Hawking */		\
130 	{USB_DEVICE(0x129B,0x1828)}, /* Siemens */		\
131 	{USB_DEVICE(0x157E,0x300E)},	/* U-Media */	\
132 	{USB_DEVICE(0x050d,0x805c)},					\
133 	{USB_DEVICE(0x1482,0x3C09)}, /* Abocom*/		\
134 	{USB_DEVICE(0x14B2,0x3C09)}, /* Alpha */		\
135 	{USB_DEVICE(0x04E8,0x2018)}, /* samsung */  	\
136 	{USB_DEVICE(0x07B8,0x3070)}, /* AboCom */		\
137 	{USB_DEVICE(0x07B8,0x3071)}, /* AboCom */		\
138 	{USB_DEVICE(0x07B8,0x2870)}, /* AboCom */		\
139 	{USB_DEVICE(0x07B8,0x2770)}, /* AboCom */		\
140 	{USB_DEVICE(0x7392,0x7711)}, /* Edimax */		\
141 	{USB_DEVICE(0x5A57,0x0280)}, /* Zinwell */		\
142 	{USB_DEVICE(0x5A57,0x0282)}, /* Zinwell */		\
143 	{USB_DEVICE(0x0789,0x0162)}, /* Logitec */		\
144 	{USB_DEVICE(0x0789,0x0163)}, /* Logitec */		\
145 	{USB_DEVICE(0x0789,0x0164)}, /* Logitec */		\
146 	{ }/* Terminating entry */                      \
147 }
148 
149 #define	FREE_HTTX_RING(_p, _b, _t)			\
150 {										\
151 	if ((_t)->ENextBulkOutPosition == (_t)->CurWritePosition)				\
152 	{																	\
153 		(_t)->bRingEmpty = TRUE;			\
154 	}																	\
155 	/*NdisInterlockedDecrement(&(_p)->TxCount); */\
156 }
157 
158 //
159 // RXINFO appends at the end of each rx packet.
160 //
161 #ifdef RT_BIG_ENDIAN
162 typedef	struct	PACKED _RXINFO_STRUC {
163 	UINT32		PlcpSignal:12;
164 	UINT32		LastAMSDU:1;
165 	UINT32		CipherAlg:1;
166 	UINT32		PlcpRssil:1;
167 	UINT32		Decrypted:1;
168 	UINT32		AMPDU:1;		// To be moved
169 	UINT32		L2PAD:1;
170 	UINT32		RSSI:1;
171 	UINT32		HTC:1;
172 	UINT32		AMSDU:1;		// rx with 802.3 header, not 802.11 header.
173 	UINT32		CipherErr:2;        // 0: decryption okay, 1:ICV error, 2:MIC error, 3:KEY not valid
174 	UINT32		Crc:1;              // 1: CRC error
175 	UINT32		MyBss:1;  	// 1: this frame belongs to the same BSSID
176 	UINT32		Bcast:1;            // 1: this is a broadcast frame
177 	UINT32		Mcast:1;            // 1: this is a multicast frame
178 	UINT32		U2M:1;              // 1: this RX frame is unicast to me
179 	UINT32		FRAG:1;
180 	UINT32		NULLDATA:1;
181 	UINT32		DATA:1;
182 	UINT32		BA:1;
183 }	RXINFO_STRUC, *PRXINFO_STRUC, RT28XX_RXD_STRUC, *PRT28XX_RXD_STRUC;
184 #else
185 typedef	struct	PACKED _RXINFO_STRUC {
186 	UINT32		BA:1;
187 	UINT32		DATA:1;
188 	UINT32		NULLDATA:1;
189 	UINT32		FRAG:1;
190 	UINT32		U2M:1;              // 1: this RX frame is unicast to me
191 	UINT32		Mcast:1;            // 1: this is a multicast frame
192 	UINT32		Bcast:1;            // 1: this is a broadcast frame
193 	UINT32		MyBss:1;  	// 1: this frame belongs to the same BSSID
194 	UINT32		Crc:1;              // 1: CRC error
195 	UINT32		CipherErr:2;        // 0: decryption okay, 1:ICV error, 2:MIC error, 3:KEY not valid
196 	UINT32		AMSDU:1;		// rx with 802.3 header, not 802.11 header.
197 	UINT32		HTC:1;
198 	UINT32		RSSI:1;
199 	UINT32		L2PAD:1;
200 	UINT32		AMPDU:1;		// To be moved
201 	UINT32		Decrypted:1;
202 	UINT32		PlcpRssil:1;
203 	UINT32		CipherAlg:1;
204 	UINT32		LastAMSDU:1;
205 	UINT32		PlcpSignal:12;
206 }	RXINFO_STRUC, *PRXINFO_STRUC, RT28XX_RXD_STRUC, *PRT28XX_RXD_STRUC;
207 #endif
208 
209 
210 //
211 // TXINFO
212 //
213 #ifdef RT_BIG_ENDIAN
214 typedef	struct	_TXINFO_STRUC {
215 	// Word	0
216 	UINT32		USBDMATxburst:1;//used ONLY in USB bulk Aggre. Force USB DMA transmit frame from current selected endpoint
217 	UINT32		USBDMANextVLD:1;	//used ONLY in USB bulk Aggregation, NextValid
218 	UINT32		rsv2:2;  // Software use.
219 	UINT32		SwUseLastRound:1; // Software use.
220 	UINT32		QSEL:2;	// select on-chip FIFO ID for 2nd-stage output scheduler.0:MGMT, 1:HCCA 2:EDCA
221 	UINT32		WIV:1;	// Wireless Info Valid. 1 if Driver already fill WI,  o if DMA needs to copy WI to correctposition
222 	UINT32		rsv:8;
223 	UINT32		USBDMATxPktLen:16;	//used ONLY in USB bulk Aggregation,  Total byte counts of all sub-frame.
224 }	TXINFO_STRUC, *PTXINFO_STRUC;
225 #else
226 typedef	struct	_TXINFO_STRUC {
227 	// Word	0
228 	UINT32		USBDMATxPktLen:16;	//used ONLY in USB bulk Aggregation,  Total byte counts of all sub-frame.
229 	UINT32		rsv:8;
230 	UINT32		WIV:1;	// Wireless Info Valid. 1 if Driver already fill WI,  o if DMA needs to copy WI to correctposition
231 	UINT32		QSEL:2;	// select on-chip FIFO ID for 2nd-stage output scheduler.0:MGMT, 1:HCCA 2:EDCA
232 	UINT32		SwUseLastRound:1; // Software use.
233 	UINT32		rsv2:2;  // Software use.
234 	UINT32		USBDMANextVLD:1;	//used ONLY in USB bulk Aggregation, NextValid
235 	UINT32		USBDMATxburst:1;//used ONLY in USB bulk Aggre. Force USB DMA transmit frame from current selected endpoint
236 }	TXINFO_STRUC, *PTXINFO_STRUC;
237 #endif
238 
239 #define TXINFO_SIZE				4
240 #define RXINFO_SIZE				4
241 #define TXPADDING_SIZE			11
242 
243 //
244 // Management ring buffer format
245 //
246 typedef	struct	_MGMT_STRUC	{
247 	BOOLEAN		Valid;
248 	PUCHAR		pBuffer;
249 	ULONG		Length;
250 }	MGMT_STRUC, *PMGMT_STRUC;
251 
252 
253 /* ----------------- EEPROM Related MACRO ----------------- */
254 #define RT28xx_EEPROM_READ16(pAd, offset, var)					\
255 	do {														\
256 		RTUSBReadEEPROM(pAd, offset, (PUCHAR)&(var), 2);		\
257 		var = le2cpu16(var);									\
258 	}while(0)
259 
260 #define RT28xx_EEPROM_WRITE16(pAd, offset, var)					\
261 	do{															\
262 		USHORT _tmpVar;											\
263 		_tmpVar = cpu2le16(var);								\
264 		RTUSBWriteEEPROM(pAd, offset, (PUCHAR)&(_tmpVar), 2);	\
265 	}while(0)
266 
267 /* ----------------- TASK/THREAD Related MACRO ----------------- */
268 #define RT28XX_TASK_THREAD_INIT(pAd, Status)		\
269 	Status = CreateThreads(net_dev);
270 
271 
272 /* ----------------- Frimware Related MACRO ----------------- */
273 #if 0
274 #define RT28XX_FIRMUD_INIT(pAd)		\
275 	{	UINT32	MacReg;				\
276 		RTUSBReadMACRegister(pAd, MAC_CSR0, &MacReg); }
277 
278 #define RT28XX_FIRMUD_END(pAd)	\
279 	RTUSBWriteMACRegister(pAd, 0x7014, 0xffffffff);	\
280 	RTUSBWriteMACRegister(pAd, 0x701c, 0xffffffff);	\
281 	RTUSBFirmwareRun(pAd);
282 #else
283 #define RT28XX_WRITE_FIRMWARE(_pAd, _pFwImage, _FwLen)		\
284 	RTUSBFirmwareWrite(_pAd, _pFwImage, _FwLen)
285 #endif
286 
287 /* ----------------- TX Related MACRO ----------------- */
288 #define RT28XX_START_DEQUEUE(pAd, QueIdx, irqFlags)				\
289 			{													\
290 				RTMP_IRQ_LOCK(&pAd->DeQueueLock[QueIdx], irqFlags);		\
291 				if (pAd->DeQueueRunning[QueIdx])						\
292 				{														\
293 					RTMP_IRQ_UNLOCK(&pAd->DeQueueLock[QueIdx], irqFlags);\
294 					printk("DeQueueRunning[%d]= TRUE!\n", QueIdx);		\
295 					continue;											\
296 				}														\
297 				else													\
298 				{														\
299 					pAd->DeQueueRunning[QueIdx] = TRUE;					\
300 					RTMP_IRQ_UNLOCK(&pAd->DeQueueLock[QueIdx], irqFlags);\
301 				}														\
302 			}
303 #define RT28XX_STOP_DEQUEUE(pAd, QueIdx, irqFlags)						\
304 			do{															\
305 				RTMP_IRQ_LOCK(&pAd->DeQueueLock[QueIdx], irqFlags);		\
306 				pAd->DeQueueRunning[QueIdx] = FALSE;					\
307 				RTMP_IRQ_UNLOCK(&pAd->DeQueueLock[QueIdx], irqFlags);	\
308 			}while(0)
309 
310 
311 #define	RT28XX_HAS_ENOUGH_FREE_DESC(pAd, pTxBlk, freeNum, pPacket) \
312 		(RTUSBFreeDescriptorRequest(pAd, pTxBlk->QueIdx, (pTxBlk->TotalFrameLen + GET_OS_PKT_LEN(pPacket))) == NDIS_STATUS_SUCCESS)
313 
314 #define RT28XX_RELEASE_DESC_RESOURCE(pAd, QueIdx)			\
315 		do{}while(0)
316 
317 #define NEED_QUEUE_BACK_FOR_AGG(_pAd, _QueIdx, _freeNum, _TxFrameType) 		\
318 		((_TxFrameType == TX_RALINK_FRAME) && (RTUSBNeedQueueBackForAgg(_pAd, _QueIdx)))
319 
320 
321 
322 #define fRTMP_ADAPTER_NEED_STOP_TX		\
323 		(fRTMP_ADAPTER_NIC_NOT_EXIST | fRTMP_ADAPTER_HALT_IN_PROGRESS |	\
324 		 fRTMP_ADAPTER_RESET_IN_PROGRESS | fRTMP_ADAPTER_BULKOUT_RESET | \
325 		 fRTMP_ADAPTER_RADIO_OFF | fRTMP_ADAPTER_REMOVE_IN_PROGRESS)
326 
327 
328 #define HAL_WriteSubTxResource(pAd, pTxBlk, bIsLast, pFreeNumber)	\
329 			RtmpUSB_WriteSubTxResource(pAd, pTxBlk, bIsLast, pFreeNumber)
330 
331 #define HAL_WriteTxResource(pAd, pTxBlk,bIsLast, pFreeNumber)	\
332 			RtmpUSB_WriteSingleTxResource(pAd, pTxBlk,bIsLast, pFreeNumber)
333 
334 #define HAL_WriteFragTxResource(pAd, pTxBlk, fragNum, pFreeNumber) \
335 			RtmpUSB_WriteFragTxResource(pAd, pTxBlk, fragNum, pFreeNumber)
336 
337 #define HAL_WriteMultiTxResource(pAd, pTxBlk,frameNum, pFreeNumber)	\
338 			RtmpUSB_WriteMultiTxResource(pAd, pTxBlk,frameNum, pFreeNumber)
339 
340 #define HAL_FinalWriteTxResource(pAd, pTxBlk, totalMPDUSize, TxIdx)	\
341 			RtmpUSB_FinalWriteTxResource(pAd, pTxBlk, totalMPDUSize, TxIdx)
342 
343 #define HAL_LastTxIdx(pAd, QueIdx,TxIdx) \
344 			/*RtmpUSBDataLastTxIdx(pAd, QueIdx,TxIdx)*/
345 
346 #define HAL_KickOutTx(pAd, pTxBlk, QueIdx)	\
347 			RtmpUSBDataKickOut(pAd, pTxBlk, QueIdx)
348 
349 
350 #define HAL_KickOutMgmtTx(pAd, QueIdx, pPacket, pSrcBufVA, SrcBufLen)	\
351 			RtmpUSBMgmtKickOut(pAd, QueIdx, pPacket, pSrcBufVA, SrcBufLen)
352 
353 #define HAL_KickOutNullFrameTx(_pAd, _QueIdx, _pNullFrame, _frameLen)	\
354 			RtmpUSBNullFrameKickOut(_pAd, _QueIdx, _pNullFrame, _frameLen)
355 
356 #define RTMP_PKT_TAIL_PADDING 	11 // 3(max 4 byte padding) + 4 (last packet padding) + 4 (MaxBulkOutsize align padding)
357 
358 extern UCHAR EpToQueue[6];
359 
360 
361 #ifdef RT2870
362 #define GET_TXRING_FREENO(_pAd, _QueIdx) 	(_QueIdx) //(_pAd->TxRing[_QueIdx].TxSwFreeIdx)
363 #define GET_MGMTRING_FREENO(_pAd) 			(_pAd->MgmtRing.TxSwFreeIdx)
364 #endif // RT2870 //
365 
366 
367 /* ----------------- RX Related MACRO ----------------- */
368 //#define RT28XX_RX_ERROR_CHECK				RTMPCheckRxWI
369 
370 #if 0
371 #define RT28XX_RCV_INIT(pAd)					\
372 	pAd->TransferBufferLength = 0;				\
373 	pAd->ReadPosition = 0;						\
374 	pAd->pCurrRxContext = NULL;
375 #endif
376 
377 #define RT28XX_RV_ALL_BUF_END(bBulkReceive)		\
378 	/* We return STATUS_MORE_PROCESSING_REQUIRED so that the completion */	\
379 	/* routine (IofCompleteRequest) will stop working on the irp. */		\
380 	if (bBulkReceive == TRUE)	RTUSBBulkReceive(pAd);
381 
382 
383 /* ----------------- ASIC Related MACRO ----------------- */
384 #if 0
385 #define RT28XX_DMA_WRITE_INIT(GloCfg)			\
386 	{	GloCfg.field.EnTXWriteBackDDONE = 1;	\
387 		GloCfg.field.EnableRxDMA = 1;			\
388 		GloCfg.field.EnableTxDMA = 1; }
389 
390 #define RT28XX_DMA_POST_WRITE(_pAd)				\
391 	do{	USB_DMA_CFG_STRUC	UsbCfg;				\
392 		UsbCfg.word = 0;						\
393 		/* for last packet, PBF might use more than limited, so minus 2 to prevent from error */ \
394 		UsbCfg.field.RxBulkAggLmt = (MAX_RXBULK_SIZE /1024)-3;	\
395 		UsbCfg.field.phyclear = 0;								\
396 		/* usb version is 1.1,do not use bulk in aggregation */	\
397 		if (_pAd->BulkInMaxPacketSize == 512)					\
398 			UsbCfg.field.RxBulkAggEn = 1;						\
399 		UsbCfg.field.RxBulkEn = 1;								\
400 		UsbCfg.field.TxBulkEn = 1;								\
401 		UsbCfg.field.RxBulkAggTOut = 0x80; /* 2006-10-18 */		\
402 		RTUSBWriteMACRegister(_pAd, USB_DMA_CFG, UsbCfg.word); 	\
403 	}while(0)
404 #endif
405 
406 // reset MAC of a station entry to 0xFFFFFFFFFFFF
407 #define RT28XX_STA_ENTRY_MAC_RESET(pAd, Wcid)					\
408 	{	RT_SET_ASIC_WCID	SetAsicWcid;						\
409 		SetAsicWcid.WCID = Wcid;								\
410 		SetAsicWcid.SetTid = 0xffffffff;						\
411 		SetAsicWcid.DeleteTid = 0xffffffff;						\
412 		RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_SET_ASIC_WCID, 	\
413 				&SetAsicWcid, sizeof(RT_SET_ASIC_WCID));	}
414 
415 // add this entry into ASIC RX WCID search table
416 #define RT28XX_STA_ENTRY_ADD(pAd, pEntry)							\
417 	RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_SET_CLIENT_MAC_ENTRY, 	\
418 							pEntry, sizeof(MAC_TABLE_ENTRY));
419 
420 // remove Pair-wise key material from ASIC
421 // yet implement
422 #define RT28XX_STA_ENTRY_KEY_DEL(pAd, BssIdx, Wcid)
423 
424 // add Client security information into ASIC WCID table and IVEIV table
425 #define RT28XX_STA_SECURITY_INFO_ADD(pAd, apidx, KeyID, pEntry)						\
426 	{	RT28XX_STA_ENTRY_MAC_RESET(pAd, pEntry->Aid);								\
427 		if (pEntry->Aid >= 1) {														\
428 			RT_SET_ASIC_WCID_ATTRI	SetAsicWcidAttri;								\
429 			SetAsicWcidAttri.WCID = pEntry->Aid;									\
430 			if ((pEntry->AuthMode <= Ndis802_11AuthModeAutoSwitch) &&				\
431 				(pEntry->WepStatus == Ndis802_11Encryption1Enabled))				\
432 			{																		\
433 				SetAsicWcidAttri.Cipher = pAd->SharedKey[apidx][KeyID].CipherAlg;	\
434 			}																		\
435 			else if (pEntry->AuthMode == Ndis802_11AuthModeWPANone)					\
436 			{																		\
437 				SetAsicWcidAttri.Cipher = pAd->SharedKey[apidx][KeyID].CipherAlg;	\
438 			}																		\
439 			else SetAsicWcidAttri.Cipher = 0;										\
440             DBGPRINT(RT_DEBUG_TRACE, ("aid cipher = %ld\n",SetAsicWcidAttri.Cipher));       \
441 			RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_SET_ASIC_WCID_CIPHER, 			\
442 							&SetAsicWcidAttri, sizeof(RT_SET_ASIC_WCID_ATTRI)); } }
443 
444 // Insert the BA bitmap to ASIC for the Wcid entry
445 #define RT28XX_ADD_BA_SESSION_TO_ASIC(_pAd, _Aid, _TID)					\
446 		do{																\
447 			RT_SET_ASIC_WCID	SetAsicWcid;							\
448 			SetAsicWcid.WCID = (_Aid);									\
449 			SetAsicWcid.SetTid = (0x10000<<(_TID));						\
450 			SetAsicWcid.DeleteTid = 0xffffffff;							\
451 			RTUSBEnqueueInternalCmd((_pAd), CMDTHREAD_SET_ASIC_WCID, &SetAsicWcid, sizeof(RT_SET_ASIC_WCID));	\
452 		}while(0)
453 
454 // Remove the BA bitmap from ASIC for the Wcid entry
455 #define RT28XX_DEL_BA_SESSION_FROM_ASIC(_pAd, _Wcid, _TID)				\
456 		do{																\
457 			RT_SET_ASIC_WCID	SetAsicWcid;							\
458 			SetAsicWcid.WCID = (_Wcid);									\
459 			SetAsicWcid.SetTid = (0xffffffff);							\
460 			SetAsicWcid.DeleteTid = (0x10000<<(_TID) );					\
461 			RTUSBEnqueueInternalCmd((_pAd), CMDTHREAD_SET_ASIC_WCID, &SetAsicWcid, sizeof(RT_SET_ASIC_WCID));	\
462 		}while(0)
463 
464 
465 /* ----------------- PCI/USB Related MACRO ----------------- */
466 #define RT28XX_HANDLE_DEV_ASSIGN(handle, dev_p)			\
467 	((POS_COOKIE)handle)->pUsb_Dev = dev_p;
468 
469 // no use
470 #define RT28XX_UNMAP()
471 #define RT28XX_IRQ_REQUEST(net_dev)
472 #define RT28XX_IRQ_RELEASE(net_dev)
473 #define RT28XX_IRQ_INIT(pAd)
474 #define RT28XX_IRQ_ENABLE(pAd)
475 
476 
477 /* ----------------- MLME Related MACRO ----------------- */
478 #define RT28XX_MLME_HANDLER(pAd)			RTUSBMlmeUp(pAd)
479 
480 #define RT28XX_MLME_PRE_SANITY_CHECK(pAd)								\
481 	{	if ((pAd->CommonCfg.bHardwareRadio == TRUE) && 					\
482 			(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) &&		\
483 			(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS))) {	\
484 			RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_CHECK_GPIO, NULL, 0); } }
485 
486 #define RT28XX_MLME_STA_QUICK_RSP_WAKE_UP(pAd)	\
487 	{	RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_QKERIODIC_EXECUT, NULL, 0);	\
488 		RTUSBMlmeUp(pAd); }
489 
490 #define RT28XX_MLME_RESET_STATE_MACHINE(pAd)	\
491 		        MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_RESET_CONF, 0, NULL);	\
492 		        RTUSBMlmeUp(pAd);
493 
494 #define RT28XX_HANDLE_COUNTER_MEASURE(_pAd, _pEntry)		\
495 	{	RTUSBEnqueueInternalCmd(_pAd, CMDTHREAD_802_11_COUNTER_MEASURE, _pEntry, sizeof(MAC_TABLE_ENTRY));	\
496 		RTUSBMlmeUp(_pAd);									\
497 	}
498 
499 
500 /* ----------------- Power Save Related MACRO ----------------- */
501 #define RT28XX_PS_POLL_ENQUEUE(pAd)						\
502 	{	RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_PSPOLL);	\
503 		RTUSBKickBulkOut(pAd); }
504 
505 #define RT28xx_CHIP_NAME            "RT2870"
506 #define USB_CYC_CFG                 0x02a4
507 #define STATUS_SUCCESS				0x00
508 #define STATUS_UNSUCCESSFUL 		0x01
509 #define NT_SUCCESS(status)			(((status) > 0) ? (1):(0))
510 #define InterlockedIncrement 	 	atomic_inc
511 #define NdisInterlockedIncrement 	atomic_inc
512 #define InterlockedDecrement		atomic_dec
513 #define NdisInterlockedDecrement 	atomic_dec
514 #define InterlockedExchange			atomic_set
515 //#define NdisMSendComplete			RTMP_SendComplete
516 #define NdisMCancelTimer			RTMPCancelTimer
517 #define NdisAllocMemory(_ptr, _size, _flag)	\
518 									do{_ptr = kmalloc((_size),(_flag));}while(0)
519 #define NdisFreeMemory(a, b, c) 	kfree((a))
520 #define NdisMSleep					RTMPusecDelay		/* unit: microsecond */
521 
522 
523 #define USBD_TRANSFER_DIRECTION_OUT		0
524 #define USBD_TRANSFER_DIRECTION_IN		0
525 #define USBD_SHORT_TRANSFER_OK			0
526 #define PURB			purbb_t
527 
528 #define RTUSB_FREE_URB(pUrb)	usb_free_urb(pUrb)
529 
530 //#undef MlmeAllocateMemory
531 //#undef MlmeFreeMemory
532 
533 typedef int				NTSTATUS;
534 typedef struct usb_device	* PUSB_DEV;
535 
536 /* MACRO for linux usb */
537 typedef struct urb *purbb_t;
538 typedef struct usb_ctrlrequest devctrlrequest;
539 #define PIRP		PVOID
540 #define PMDL		PVOID
541 #define NDIS_OID	UINT
542 #ifndef USB_ST_NOERROR
543 #define USB_ST_NOERROR     0
544 #endif
545 
546 // vendor-specific control operations
547 #define CONTROL_TIMEOUT_JIFFIES ( (100 * HZ) / 1000)
548 #define UNLINK_TIMEOUT_MS		3
549 
550 /* unlink urb	*/
551 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,7)
552 #define RTUSB_UNLINK_URB(pUrb)		usb_kill_urb(pUrb)
553 #else
554 #define RTUSB_UNLINK_URB(pUrb)		usb_unlink_urb(pUrb)
555 #endif
556 
557 // Prototypes of completion funuc.
558 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
559 #define RTUSBBulkOutDataPacketComplete(purb, pt_regs)    RTUSBBulkOutDataPacketComplete(purb)
560 #define RTUSBBulkOutMLMEPacketComplete(pUrb, pt_regs)    RTUSBBulkOutMLMEPacketComplete(pUrb)
561 #define RTUSBBulkOutNullFrameComplete(pUrb, pt_regs)     RTUSBBulkOutNullFrameComplete(pUrb)
562 #define RTUSBBulkOutRTSFrameComplete(pUrb, pt_regs)      RTUSBBulkOutRTSFrameComplete(pUrb)
563 #define RTUSBBulkOutPsPollComplete(pUrb, pt_regs)        RTUSBBulkOutPsPollComplete(pUrb)
564 #define RTUSBBulkRxComplete(pUrb, pt_regs)               RTUSBBulkRxComplete(pUrb)
565 #endif
566 
567 
568 VOID RTUSBBulkOutDataPacketComplete(purbb_t purb, struct pt_regs *pt_regs);
569 VOID RTUSBBulkOutMLMEPacketComplete(purbb_t pUrb, struct pt_regs *pt_regs);
570 VOID RTUSBBulkOutNullFrameComplete(purbb_t pUrb, struct pt_regs *pt_regs);
571 VOID RTUSBBulkOutRTSFrameComplete(purbb_t pUrb, struct pt_regs *pt_regs);
572 VOID RTUSBBulkOutPsPollComplete(purbb_t pUrb, struct pt_regs *pt_regs);
573 VOID RTUSBBulkRxComplete(purbb_t pUrb, struct pt_regs *pt_regs);
574 
575 
576 #define RTUSBMlmeUp(pAd)	        \
577 {								    \
578 	POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;	\
579 	CHECK_PID_LEGALITY(pObj->MLMEThr_pid)		    \
580         up(&(pAd->mlme_semaphore)); \
581 }
582 
583 #define RTUSBCMDUp(pAd)	                \
584 {									    \
585 	POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;	\
586 	CHECK_PID_LEGALITY(pObj->RTUSBCmdThr_pid)	    \
587 	    up(&(pAd->RTUSBCmd_semaphore)); \
588 }
589 
590 
RTMPAllocateMemory(OUT PVOID * ptr,IN size_t size)591 static inline NDIS_STATUS RTMPAllocateMemory(
592 	OUT PVOID *ptr,
593 	IN size_t size)
594 {
595 	*ptr = kmalloc(size, GFP_ATOMIC);
596 	if(*ptr)
597 		return NDIS_STATUS_SUCCESS;
598 	else
599 		return NDIS_STATUS_RESOURCES;
600 }
601 
602 /* rtmp.h */
603 #define	BEACON_RING_SIZE                2
604 #define DEVICE_VENDOR_REQUEST_OUT       0x40
605 #define DEVICE_VENDOR_REQUEST_IN        0xc0
606 #define INTERFACE_VENDOR_REQUEST_OUT    0x41
607 #define INTERFACE_VENDOR_REQUEST_IN     0xc1
608 #define MGMTPIPEIDX						0	// EP6 is highest priority
609 
610 #define BULKOUT_MGMT_RESET_FLAG				0x80
611 
612 #define RTUSB_SET_BULK_FLAG(_M, _F)				((_M)->BulkFlags |= (_F))
613 #define RTUSB_CLEAR_BULK_FLAG(_M, _F)			((_M)->BulkFlags &= ~(_F))
614 #define RTUSB_TEST_BULK_FLAG(_M, _F)			(((_M)->BulkFlags & (_F)) != 0)
615 
616 #define EnqueueCmd(cmdq, cmdqelmt)		\
617 {										\
618 	if (cmdq->size == 0)				\
619 		cmdq->head = cmdqelmt;			\
620 	else								\
621 		cmdq->tail->next = cmdqelmt;	\
622 	cmdq->tail = cmdqelmt;				\
623 	cmdqelmt->next = NULL;				\
624 	cmdq->size++;						\
625 }
626 
627 typedef struct   _RT_SET_ASIC_WCID {
628 	ULONG WCID;          // mechanism for rekeying: 0:disable, 1: time-based, 2: packet-based
629 	ULONG SetTid;        // time-based: seconds, packet-based: kilo-packets
630 	ULONG DeleteTid;        // time-based: seconds, packet-based: kilo-packets
631 	UCHAR Addr[MAC_ADDR_LEN];	// avoid in interrupt when write key
632 } RT_SET_ASIC_WCID,*PRT_SET_ASIC_WCID;
633 
634 typedef struct   _RT_SET_ASIC_WCID_ATTRI {
635 	ULONG	WCID;          // mechanism for rekeying: 0:disable, 1: time-based, 2: packet-based
636 	ULONG	Cipher;        // ASIC Cipher definition
637 	UCHAR	Addr[ETH_LENGTH_OF_ADDRESS];
638 } RT_SET_ASIC_WCID_ATTRI,*PRT_SET_ASIC_WCID_ATTRI;
639 
640 typedef struct _MLME_MEMORY_STRUCT {
641 	PVOID                           AllocVa;    //Pointer to the base virtual address of the allocated memory
642 	struct _MLME_MEMORY_STRUCT      *Next;      //Pointer to the next virtual address of the allocated memory
643 }   MLME_MEMORY_STRUCT, *PMLME_MEMORY_STRUCT;
644 
645 typedef struct  _MLME_MEMORY_HANDLER {
646 	BOOLEAN                 MemRunning;         //The flag of the Mlme memory handler's status
647 	UINT                    MemoryCount;        //Total nonpaged system-space memory not size
648 	UINT                    InUseCount;         //Nonpaged system-space memory in used counts
649 	UINT                    UnUseCount;         //Nonpaged system-space memory available counts
650 	INT                    PendingCount;       //Nonpaged system-space memory for free counts
651 	PMLME_MEMORY_STRUCT     pInUseHead;         //Pointer to the first nonpaed memory not used
652 	PMLME_MEMORY_STRUCT     pInUseTail;         //Pointer to the last nonpaged memory not used
653 	PMLME_MEMORY_STRUCT     pUnUseHead;         //Pointer to the first nonpaged memory in used
654 	PMLME_MEMORY_STRUCT     pUnUseTail;         //Pointer to the last nonpaged memory in used
655 	PULONG                  MemFreePending[MAX_MLME_HANDLER_MEMORY];   //an array to keep pending free-memory's pointer (32bits)
656 }   MLME_MEMORY_HANDLER, *PMLME_MEMORY_HANDLER;
657 
658 typedef	struct _CmdQElmt	{
659 	UINT				command;
660 	PVOID				buffer;
661 	ULONG				bufferlength;
662 	BOOLEAN				CmdFromNdis;
663 	BOOLEAN				SetOperation;
664 	struct _CmdQElmt	*next;
665 }	CmdQElmt, *PCmdQElmt;
666 
667 typedef	struct	_CmdQ	{
668 	UINT		size;
669 	CmdQElmt	*head;
670 	CmdQElmt	*tail;
671 	UINT32		CmdQState;
672 }CmdQ, *PCmdQ;
673 
674 //
675 // For WPA SUPPLICANT: WIRELESS EXT support wireless events: v14 or newer
676 //
677 #if WIRELESS_EXT >= 14
678 //#define WPA_SUPPLICANT_SUPPORT  1
679 #endif
680 
681 /* oid.h */
682 // Cipher suite type for mixed mode group cipher, P802.11i-2004
683 typedef enum _RT_802_11_CIPHER_SUITE_TYPE {
684 	Cipher_Type_NONE,
685 	Cipher_Type_WEP40,
686 	Cipher_Type_TKIP,
687 	Cipher_Type_RSVD,
688 	Cipher_Type_CCMP,
689 	Cipher_Type_WEP104
690 } RT_802_11_CIPHER_SUITE_TYPE, *PRT_802_11_CIPHER_SUITE_TYPE;
691 
692 //CMDTHREAD_MULTI_READ_MAC
693 //CMDTHREAD_MULTI_WRITE_MAC
694 //CMDTHREAD_VENDOR_EEPROM_READ
695 //CMDTHREAD_VENDOR_EEPROM_WRITE
696 typedef	struct	_CMDHandler_TLV	{
697 	USHORT		Offset;
698 	USHORT		Length;
699 	UCHAR		DataFirst;
700 }	CMDHandler_TLV, *PCMDHandler_TLV;
701 
702 // New for MeetingHouse Api support
703 #define CMDTHREAD_VENDOR_RESET                      0x0D730101	// cmd
704 #define CMDTHREAD_VENDOR_UNPLUG                     0x0D730102	// cmd
705 #define CMDTHREAD_VENDOR_SWITCH_FUNCTION            0x0D730103	// cmd
706 #define CMDTHREAD_MULTI_WRITE_MAC                   0x0D730107	// cmd
707 #define CMDTHREAD_MULTI_READ_MAC                    0x0D730108	// cmd
708 #define CMDTHREAD_VENDOR_EEPROM_WRITE               0x0D73010A	// cmd
709 #define CMDTHREAD_VENDOR_EEPROM_READ                0x0D73010B	// cmd
710 #define CMDTHREAD_VENDOR_ENTER_TESTMODE             0x0D73010C	// cmd
711 #define CMDTHREAD_VENDOR_EXIT_TESTMODE              0x0D73010D	// cmd
712 #define CMDTHREAD_VENDOR_WRITE_BBP                  0x0D730119	// cmd
713 #define CMDTHREAD_VENDOR_READ_BBP                   0x0D730118	// cmd
714 #define CMDTHREAD_VENDOR_WRITE_RF                   0x0D73011A	// cmd
715 #define CMDTHREAD_VENDOR_FLIP_IQ                    0x0D73011D	// cmd
716 #define CMDTHREAD_RESET_BULK_OUT                    0x0D730210	// cmd
717 #define CMDTHREAD_RESET_BULK_IN                     0x0D730211	// cmd
718 #define CMDTHREAD_SET_PSM_BIT_SAVE                  0x0D730212	// cmd
719 #define CMDTHREAD_SET_RADIO                         0x0D730214	// cmd
720 #define CMDTHREAD_UPDATE_TX_RATE                    0x0D730216	// cmd
721 #define CMDTHREAD_802_11_ADD_KEY_WEP                0x0D730218	// cmd
722 #define CMDTHREAD_RESET_FROM_ERROR                  0x0D73021A	// cmd
723 #define CMDTHREAD_LINK_DOWN                         0x0D73021B	// cmd
724 #define CMDTHREAD_RESET_FROM_NDIS                   0x0D73021C	// cmd
725 #define CMDTHREAD_CHECK_GPIO                        0x0D730215	// cmd
726 #define CMDTHREAD_FORCE_WAKE_UP                     0x0D730222	// cmd
727 #define CMDTHREAD_SET_BW                            0x0D730225	// cmd
728 #define CMDTHREAD_SET_ASIC_WCID                     0x0D730226	// cmd
729 #define CMDTHREAD_SET_ASIC_WCID_CIPHER              0x0D730227	// cmd
730 #define CMDTHREAD_QKERIODIC_EXECUT                  0x0D73023D	// cmd
731 #define RT_CMD_SET_KEY_TABLE                        0x0D730228  // cmd
732 #define RT_CMD_SET_RX_WCID_TABLE                    0x0D730229  // cmd
733 #define CMDTHREAD_SET_CLIENT_MAC_ENTRY              0x0D73023E	// cmd
734 #define CMDTHREAD_802_11_QUERY_HARDWARE_REGISTER    0x0D710105	// cmd
735 #define CMDTHREAD_802_11_SET_PHY_MODE               0x0D79010C	// cmd
736 #define CMDTHREAD_802_11_SET_STA_CONFIG             0x0D790111	// cmd
737 #define CMDTHREAD_802_11_SET_PREAMBLE               0x0D790101	// cmd
738 #define CMDTHREAD_802_11_COUNTER_MEASURE			0x0D790102	// cmd
739 
740 
741 #define WPA1AKMBIT	    0x01
742 #define WPA2AKMBIT	    0x02
743 #define WPA1PSKAKMBIT   0x04
744 #define WPA2PSKAKMBIT   0x08
745 #define TKIPBIT         0x01
746 #define CCMPBIT         0x02
747 
748 
749 #define RT28XX_STA_FORCE_WAKEUP(pAd, bFromTx) \
750     RT28xxUsbStaAsicForceWakeup(pAd, bFromTx);
751 
752 #define RT28XX_STA_SLEEP_THEN_AUTO_WAKEUP(pAd, TbttNumToNextWakeUp) \
753     RT28xxUsbStaAsicSleepThenAutoWakeup(pAd, TbttNumToNextWakeUp);
754 
755 #define RT28XX_MLME_RADIO_ON(pAd) \
756     RT28xxUsbMlmeRadioOn(pAd);
757 
758 #define RT28XX_MLME_RADIO_OFF(pAd) \
759     RT28xxUsbMlmeRadioOFF(pAd);
760 
761 #endif //__RT2870_H__
762