Merge branch 'staging-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh...
[pandora-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     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__ // */