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 *************************************************************************
35 -------- ---------- ----------------------------------------------
38 #include "../rt_config.h"
40 typedef struct _RADAR_DURATION_TABLE
43 ULONG RadarSignalDuration;
45 } RADAR_DURATION_TABLE, *PRADAR_DURATION_TABLE;
49 UCHAR RdIdleTimeTable[MAX_RD_REGION][4] =
51 {9, 250, 250, 250}, // CE
52 #ifdef DFS_FCC_BW40_FIX
53 {1, 250, 250, 250}, // FCC
55 {4, 250, 250, 250}, // FCC
57 {4, 250, 250, 250}, // JAP
58 {15, 250, 250, 250}, // JAP_W53
59 {4, 250, 250, 250} // JAP_W56
63 ========================================================================
66 Bbp Radar detection routine
69 pAd Pointer to our adapter
73 ========================================================================
75 VOID BbpRadarDetectionStart(
80 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, 114, 0x02);
81 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, 121, 0x20);
82 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, 122, 0x00);
83 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, 123, 0x08/*0x80*/);
84 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, 124, 0x28);
85 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, 125, 0xff);
87 #ifdef MERGE_ARCH_TEAM
88 if ((pAd->CommonCfg.RadarDetect.RDDurRegion == JAP) || (pAd->CommonCfg.RadarDetect.RDDurRegion == JAP_W53) || (pAd->CommonCfg.RadarDetect.RDDurRegion == JAP_W56))
90 pAd->CommonCfg.RadarDetect.RDDurRegion = JAP;
91 pAd->CommonCfg.RadarDetect.RDDurRegion = JapRadarType(pAd);
92 if (pAd->CommonCfg.RadarDetect.RDDurRegion == JAP_W56)
94 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
96 else if (pAd->CommonCfg.RadarDetect.RDDurRegion == JAP_W53)
98 pAd->CommonCfg.RadarDetect.DfsSessionTime = 15;
101 #endif // MERGE_ARCH_TEAM //
103 RadarPeriod = ((UINT)RdIdleTimeTable[pAd->CommonCfg.RadarDetect.RDDurRegion][0] + (UINT)pAd->CommonCfg.RadarDetect.DfsSessionTime) < 250 ?
104 (RdIdleTimeTable[pAd->CommonCfg.RadarDetect.RDDurRegion][0] + pAd->CommonCfg.RadarDetect.DfsSessionTime) : 250;
106 #ifdef MERGE_ARCH_TEAM
109 #else // Original RT28xx source code.
110 RTMP_IO_WRITE8(pAd, 0x7020, 0x1d);
111 RTMP_IO_WRITE8(pAd, 0x7021, 0x40);
112 #endif // MERGE_ARCH_TEAM //
114 RadarDetectionStart(pAd, 0, RadarPeriod);
119 ========================================================================
122 Bbp Radar detection routine
125 pAd Pointer to our adapter
129 ========================================================================
131 VOID BbpRadarDetectionStop(
132 IN PRTMP_ADAPTER pAd)
134 RTMP_IO_WRITE8(pAd, 0x7020, 0x1d);
135 RTMP_IO_WRITE8(pAd, 0x7021, 0x60);
137 RadarDetectionStop(pAd);
142 ========================================================================
145 Radar detection routine
148 pAd Pointer to our adapter
152 ========================================================================
154 VOID RadarDetectionStart(
155 IN PRTMP_ADAPTER pAd,
156 IN BOOLEAN CTSProtect,
159 UINT8 DfsActiveTime = (pAd->CommonCfg.RadarDetect.DfsSessionTime & 0x1f);
160 UINT8 CtsProtect = (CTSProtect == 1) ? 0x02 : 0x01; // CTS protect.
164 switch(pAd->CommonCfg.RadarDetect.RDDurRegion)
174 RDDurRegion = JapRadarType(pAd);
175 if (RDDurRegion == JAP_W56)
193 // send start-RD with CTS protection command to MCU
194 // highbyte [7] reserve
195 // highbyte [6:5] 0x: stop Carrier/Radar detection
196 // highbyte [10]: Start Carrier/Radar detection without CTS protection, 11: Start Carrier/Radar detection with CTS protection
197 // highbyte [4:0] Radar/carrier detection duration. In 1ms.
199 // lowbyte [7:0] Radar/carrier detection period, in 1ms.
200 AsicSendCommandToMcu(pAd, 0x60, 0xff, CTSPeriod, DfsActiveTime | (CtsProtect << 5));
201 //AsicSendCommandToMcu(pAd, 0x63, 0xff, 10, 0);
207 ========================================================================
210 Radar detection routine
213 pAd Pointer to our adapter
216 TRUE Found radar signal
217 FALSE Not found radar signal
219 ========================================================================
221 VOID RadarDetectionStop(
222 IN PRTMP_ADAPTER pAd)
224 DBGPRINT(RT_DEBUG_TRACE,("RadarDetectionStop.\n"));
225 AsicSendCommandToMcu(pAd, 0x60, 0xff, 0x00, 0x00); // send start-RD with CTS protection command to MCU
231 ========================================================================
234 Radar channel check routine
237 pAd Pointer to our adapter
240 TRUE need to do radar detect
241 FALSE need not to do radar detect
243 ========================================================================
245 BOOLEAN RadarChannelCheck(
246 IN PRTMP_ADAPTER pAd,
250 BOOLEAN result = FALSE;
252 for (i=0; i<pAd->ChannelListNum; i++)
254 if (Ch == pAd->ChannelList[i].Channel)
256 result = pAd->ChannelList[i].DfsReq;
265 IN PRTMP_ADAPTER pAd)
268 const UCHAR Channel[15]={52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140};
270 if (pAd->CommonCfg.RadarDetect.RDDurRegion != JAP)
272 return pAd->CommonCfg.RadarDetect.RDDurRegion;
277 if (pAd->CommonCfg.Channel == Channel[i])
292 ULONG RTMPBbpReadRadarDuration(
293 IN PRTMP_ADAPTER pAd)
298 BBP_IO_READ8_BY_REG_ID(pAd, BBP_R115, &byteValue);
303 case 1: // radar signal detected by pulse mode.
304 case 2: // radar signal detected by width mode.
305 result = RTMPReadRadarDuration(pAd);
308 case 0: // No radar signal.
318 ULONG RTMPReadRadarDuration(
319 IN PRTMP_ADAPTER pAd)
327 VOID RTMPCleanRadarDuration(
328 IN PRTMP_ADAPTER pAd)
334 ========================================================================
336 Radar wave detection. The API should be invoke each second.
339 pAd - Adapter pointer
344 ========================================================================
346 VOID ApRadarDetectPeriodic(
347 IN PRTMP_ADAPTER pAd)
351 pAd->CommonCfg.RadarDetect.InServiceMonitorCount++;
353 for (i=0; i<pAd->ChannelListNum; i++)
355 if (pAd->ChannelList[i].RemainingTimeForUse > 0)
357 pAd->ChannelList[i].RemainingTimeForUse --;
358 if ((pAd->Mlme.PeriodicRound%5) == 0)
360 DBGPRINT(RT_DEBUG_TRACE, ("RadarDetectPeriodic - ch=%d, RemainingTimeForUse=%d\n", pAd->ChannelList[i].Channel, pAd->ChannelList[i].RemainingTimeForUse));
366 if ((pAd->CommonCfg.Channel > 14)
367 && (pAd->CommonCfg.bIEEE80211H == 1)
368 && RadarChannelCheck(pAd, pAd->CommonCfg.Channel))
370 RadarDetectPeriodic(pAd);
376 // Periodic Radar detection, switch channel will occur in RTMPHandleTBTTInterrupt()
377 // Before switch channel, driver needs doing channel switch announcement.
378 VOID RadarDetectPeriodic(
379 IN PRTMP_ADAPTER pAd)
381 // need to check channel availability, after switch channel
382 if (pAd->CommonCfg.RadarDetect.RDMode != RD_SILENCE_MODE)
385 // channel availability check time is 60sec, use 65 for assurance
386 if (pAd->CommonCfg.RadarDetect.RDCount++ > pAd->CommonCfg.RadarDetect.ChMovingTime)
388 DBGPRINT(RT_DEBUG_TRACE, ("Not found radar signal, start send beacon and radar detection in service monitor\n\n"));
389 BbpRadarDetectionStop(pAd);
390 AsicEnableBssSync(pAd);
391 pAd->CommonCfg.RadarDetect.RDMode = RD_NORMAL_MODE;
402 ==========================================================================
404 change channel moving time for DFS testing.
407 pAdapter Pointer to our adapter
408 wrq Pointer to the ioctl argument
415 1.) iwpriv ra0 set ChMovTime=[value]
416 ==========================================================================
418 INT Set_ChMovingTime_Proc(
419 IN PRTMP_ADAPTER pAd,
424 Value = (UINT8) simple_strtol(arg, 0, 10);
426 pAd->CommonCfg.RadarDetect.ChMovingTime = Value;
428 DBGPRINT(RT_DEBUG_TRACE, ("%s:: %d\n", __func__,
429 pAd->CommonCfg.RadarDetect.ChMovingTime));
434 INT Set_LongPulseRadarTh_Proc(
435 IN PRTMP_ADAPTER pAd,
440 Value = (UINT8) simple_strtol(arg, 0, 10) > 10 ? 10 : simple_strtol(arg, 0, 10);
442 pAd->CommonCfg.RadarDetect.LongPulseRadarTh = Value;
444 DBGPRINT(RT_DEBUG_TRACE, ("%s:: %d\n", __func__,
445 pAd->CommonCfg.RadarDetect.LongPulseRadarTh));