2 *************************************************************************
4 * 5F., No.36, Taiyuan St., Jhubei City,
8 * (c) Copyright 2002-2007, Ralink Technology, Inc.
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. *
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. *
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. *
25 *************************************************************************
31 Ralink Wireless driver RF related functions
35 -------- ---------- ----------------------------------------------
38 #include "../rt_config.h"
40 #ifdef RTMP_RF_RW_SUPPORT
42 ========================================================================
44 Routine Description: Write RT30xx RF register through MAC
54 ========================================================================
56 NDIS_STATUS
RT30xxWriteRFRegister(IN PRTMP_ADAPTER pAd
,
57 IN UCHAR regID
, IN UCHAR value
)
59 RF_CSR_CFG_STRUC rfcsr
;
63 RTMP_IO_READ32(pAd
, RF_CSR_CFG
, &rfcsr
.word
);
65 if (!rfcsr
.field
.RF_CSR_KICK
)
69 while ((i
< RETRY_LIMIT
)
70 && (!RTMP_TEST_FLAG(pAd
, fRTMP_ADAPTER_NIC_NOT_EXIST
)));
72 if ((i
== RETRY_LIMIT
)
73 || (RTMP_TEST_FLAG(pAd
, fRTMP_ADAPTER_NIC_NOT_EXIST
))) {
74 DBGPRINT_RAW(RT_DEBUG_ERROR
,
75 ("Retry count exhausted or device removed!!!\n"));
76 return STATUS_UNSUCCESSFUL
;
79 rfcsr
.field
.RF_CSR_WR
= 1;
80 rfcsr
.field
.RF_CSR_KICK
= 1;
81 rfcsr
.field
.TESTCSR_RFACC_REGNUM
= regID
;
82 rfcsr
.field
.RF_CSR_DATA
= value
;
84 RTMP_IO_WRITE32(pAd
, RF_CSR_CFG
, rfcsr
.word
);
86 return NDIS_STATUS_SUCCESS
;
90 ========================================================================
92 Routine Description: Read RT30xx RF register through MAC
102 ========================================================================
104 NDIS_STATUS
RT30xxReadRFRegister(IN PRTMP_ADAPTER pAd
,
105 IN UCHAR regID
, IN PUCHAR pValue
)
107 RF_CSR_CFG_STRUC rfcsr
;
110 for (i
= 0; i
< MAX_BUSY_COUNT
; i
++) {
111 RTMP_IO_READ32(pAd
, RF_CSR_CFG
, &rfcsr
.word
);
113 if (rfcsr
.field
.RF_CSR_KICK
== BUSY
) {
117 rfcsr
.field
.RF_CSR_WR
= 0;
118 rfcsr
.field
.RF_CSR_KICK
= 1;
119 rfcsr
.field
.TESTCSR_RFACC_REGNUM
= regID
;
120 RTMP_IO_WRITE32(pAd
, RF_CSR_CFG
, rfcsr
.word
);
121 for (k
= 0; k
< MAX_BUSY_COUNT
; k
++) {
122 RTMP_IO_READ32(pAd
, RF_CSR_CFG
, &rfcsr
.word
);
124 if (rfcsr
.field
.RF_CSR_KICK
== IDLE
)
127 if ((rfcsr
.field
.RF_CSR_KICK
== IDLE
) &&
128 (rfcsr
.field
.TESTCSR_RFACC_REGNUM
== regID
)) {
129 *pValue
= (UCHAR
) rfcsr
.field
.RF_CSR_DATA
;
133 if (rfcsr
.field
.RF_CSR_KICK
== BUSY
) {
134 DBGPRINT_ERR(("RF read R%d=0x%x fail, i[%d], k[%d]\n", regID
,
136 return STATUS_UNSUCCESSFUL
;
139 return STATUS_SUCCESS
;
142 VOID
NICInitRFRegisters(IN RTMP_ADAPTER
* pAd
)
144 if (pAd
->chipOps
.AsicRfInit
)
145 pAd
->chipOps
.AsicRfInit(pAd
);
148 VOID
RtmpChipOpsRFHook(IN RTMP_ADAPTER
* pAd
)
150 RTMP_CHIP_OP
*pChipOps
= &pAd
->chipOps
;
152 pChipOps
->pRFRegTable
= NULL
;
153 pChipOps
->AsicRfInit
= NULL
;
154 pChipOps
->AsicRfTurnOn
= NULL
;
155 pChipOps
->AsicRfTurnOff
= NULL
;
156 pChipOps
->AsicReverseRfFromSleepMode
= NULL
;
157 pChipOps
->AsicHaltAction
= NULL
;
158 /* We depends on RfICType and MACVersion to assign the corresponding operation callbacks. */
161 if (IS_RT30xx(pAd
)) {
162 pChipOps
->pRFRegTable
= RT30xx_RFRegTable
;
163 pChipOps
->AsicHaltAction
= RT30xxHaltAction
;
165 if ((IS_RT3070(pAd
) || IS_RT3071(pAd
))
166 && (pAd
->infType
== RTMP_DEV_INF_USB
)) {
167 pChipOps
->AsicRfInit
= NICInitRT3070RFRegisters
;
168 if (IS_RT3071(pAd
)) {
169 pChipOps
->AsicRfTurnOff
=
170 RT30xxLoadRFSleepModeSetup
;
171 pChipOps
->AsicReverseRfFromSleepMode
=
172 RT30xxReverseRFSleepModeSetup
;
175 #endif /* RT3070 // */
177 if (IS_RT3090(pAd
) && (pAd
->infType
== RTMP_DEV_INF_PCI
)) {
178 pChipOps
->AsicRfTurnOff
= RT30xxLoadRFSleepModeSetup
;
179 pChipOps
->AsicRfInit
= NICInitRT3090RFRegisters
;
180 pChipOps
->AsicReverseRfFromSleepMode
=
181 RT30xxReverseRFSleepModeSetup
;
183 #endif /* RT3090 // */
185 #endif /* RT30xx // */
188 #endif /* RTMP_RF_RW_SUPPORT // */