⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dfs.c

📁 ralink最新rt3070 usb wifi 无线网卡驱动程序
💻 C
字号:
/* ************************************************************************* * Ralink Tech Inc. * 5F., No.36, Taiyuan St., Jhubei City, * Hsinchu County 302, * Taiwan, R.O.C. * * (c) Copyright 2002-2007, Ralink Technology, Inc. * * This program is free software; you can redistribute it and/or modify  *  * it under the terms of the GNU General Public License as published by  *  * the Free Software Foundation; either version 2 of the License, or     *  * (at your option) any later version.                                   *  *                                                                       *  * This program is distributed in the hope that it will be useful,       *  * but WITHOUT ANY WARRANTY; without even the implied warranty of        *  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *  * GNU General Public License for more details.                          *  *                                                                       *  * You should have received a copy of the GNU General Public License     *  * along with this program; if not, write to the                         *  * Free Software Foundation, Inc.,                                       *  * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *  *                                                                       *  *************************************************************************    Module Name:    ap_dfs.c    Abstract:    Support DFS function.    Revision History:    Who       When            What    --------  ----------      ----------------------------------------------    Fonchi    03-12-2007      created*/#include "rt_config.h"typedef struct _RADAR_DURATION_TABLE{	ULONG RDDurRegion;	ULONG RadarSignalDuration;	ULONG Tolerance;} RADAR_DURATION_TABLE, *PRADAR_DURATION_TABLE;static UCHAR RdIdleTimeTable[MAX_RD_REGION][4] ={	{9, 250, 250, 250},		// CE	{4, 250, 250, 250},		// FCC	{4, 250, 250, 250},		// JAP	{15, 250, 250, 250},	// JAP_W53	{4, 250, 250, 250}		// JAP_W56};/*	========================================================================	Routine Description:		Bbp Radar detection routine	Arguments:		pAd 	Pointer to our adapter	Return Value:	========================================================================*/VOID BbpRadarDetectionStart(	IN PRTMP_ADAPTER pAd){	UINT8 RadarPeriod;	RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, 114, 0x02);	RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, 121, 0x20);	RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, 122, 0x00);	RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, 123, 0x08/*0x80*/);	RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, 124, 0x28);	RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, 125, 0xff);	RadarPeriod = ((UINT)RdIdleTimeTable[pAd->CommonCfg.RadarDetect.RDDurRegion][0] + (UINT)pAd->CommonCfg.RadarDetect.DfsSessionTime) < 250 ?			(RdIdleTimeTable[pAd->CommonCfg.RadarDetect.RDDurRegion][0] + pAd->CommonCfg.RadarDetect.DfsSessionTime) : 250;	RTMP_IO_WRITE8(pAd, 0x7020, 0x1d);	RTMP_IO_WRITE8(pAd, 0x7021, 0x40);	RadarDetectionStart(pAd, 0, RadarPeriod);	return;}/*	========================================================================	Routine Description:		Bbp Radar detection routine	Arguments:		pAd 	Pointer to our adapter	Return Value:	========================================================================*/VOID BbpRadarDetectionStop(	IN PRTMP_ADAPTER pAd){	RTMP_IO_WRITE8(pAd, 0x7020, 0x1d);	RTMP_IO_WRITE8(pAd, 0x7021, 0x60);	RadarDetectionStop(pAd);	return;}/*	========================================================================	Routine Description:		Radar detection routine	Arguments:		pAd 	Pointer to our adapter	Return Value:	========================================================================*/VOID RadarDetectionStart(	IN PRTMP_ADAPTER pAd,	IN BOOLEAN CTSProtect,	IN UINT8 CTSPeriod){	UINT8 DfsActiveTime = (pAd->CommonCfg.RadarDetect.DfsSessionTime & 0x1f);	UINT8 CtsProtect = (CTSProtect == 1) ? 0x02 : 0x01; // CTS protect.	if (CTSProtect != 0)	{		switch(pAd->CommonCfg.RadarDetect.RDDurRegion)		{		case FCC:		case JAP_W56:			CtsProtect = 0x03;			break;		case CE:		case JAP_W53:		default:			CtsProtect = 0x02;			break;		}	}	else		CtsProtect = 0x01;		// send start-RD with CTS protection command to MCU	// highbyte [7]		reserve	// highbyte [6:5]	0x: stop Carrier/Radar detection	// highbyte [10]:	Start Carrier/Radar detection without CTS protection, 11: Start Carrier/Radar detection with CTS protection	// highbyte [4:0]	Radar/carrier detection duration. In 1ms.	// lowbyte [7:0]	Radar/carrier detection period, in 1ms.	AsicSendCommandToMcu(pAd, 0x60, 0xff, CTSPeriod, DfsActiveTime | (CtsProtect << 5));	//AsicSendCommandToMcu(pAd, 0x63, 0xff, 10, 0);	return;}/*	========================================================================	Routine Description:		Radar detection routine	Arguments:		pAd 	Pointer to our adapter	Return Value:		TRUE	Found radar signal		FALSE	Not found radar signal	========================================================================*/VOID RadarDetectionStop(	IN PRTMP_ADAPTER	pAd){	DBGPRINT(RT_DEBUG_TRACE,("RadarDetectionStop.\n"));	AsicSendCommandToMcu(pAd, 0x60, 0xff, 0x00, 0x00);	// send start-RD with CTS protection command to MCU	return;}/*	========================================================================	Routine Description:		Radar channel check routine	Arguments:		pAd 	Pointer to our adapter	Return Value:		TRUE	need to do radar detect		FALSE	need not to do radar detect	========================================================================*/BOOLEAN RadarChannelCheck(	IN PRTMP_ADAPTER	pAd,	IN UCHAR			Ch){#if 1	INT		i;	BOOLEAN result = FALSE;	for (i=0; i<pAd->ChannelListNum; i++)	{		if (Ch == pAd->ChannelList[i].Channel)		{			result = pAd->ChannelList[i].DfsReq;			break;		}	}	return result;#else	INT		i;	UCHAR	Channel[15]={52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140};	for (i=0; i<15; i++)	{		if (Ch == Channel[i])		{			break;		}	}	if (i != 15)		return TRUE;	else		return FALSE;#endif}ULONG JapRadarType(	IN PRTMP_ADAPTER pAd){	ULONG		i;	const UCHAR	Channel[15]={52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140};	if (pAd->CommonCfg.RadarDetect.RDDurRegion != JAP)	{		return pAd->CommonCfg.RadarDetect.RDDurRegion;	}	for (i=0; i<15; i++)	{		if (pAd->CommonCfg.Channel == Channel[i])		{			break;		}	}	if (i < 4)		return JAP_W53;	else if (i < 15)		return JAP_W56;	else		return JAP; // W52}ULONG RTMPBbpReadRadarDuration(	IN PRTMP_ADAPTER	pAd){	UINT8 byteValue = 0;	ULONG result;	BBP_IO_READ8_BY_REG_ID(pAd, BBP_R115, &byteValue);	result = 0;	switch (byteValue)	{	case 1: // radar signal detected by pulse mode.	case 2: // radar signal detected by width mode.		result = RTMPReadRadarDuration(pAd);		break;	case 0: // No radar signal.	default:		result = 0;		break;	}	return result;}ULONG RTMPReadRadarDuration(	IN PRTMP_ADAPTER	pAd){	ULONG result = 0;#ifdef DFS_SUPPORT	UINT8 duration1 = 0, duration2 = 0, duration3 = 0;	BBP_IO_READ8_BY_REG_ID(pAd, BBP_R116, &duration1);	BBP_IO_READ8_BY_REG_ID(pAd, BBP_R117, &duration2);	BBP_IO_READ8_BY_REG_ID(pAd, BBP_R118, &duration3);	result = (duration1 << 16) + (duration2 << 8) + duration3;#endif // DFS_SUPPORT //	return result;}VOID RTMPCleanRadarDuration(	IN PRTMP_ADAPTER	pAd){	return;}/*    ========================================================================    Routine Description:        Radar wave detection. The API should be invoke each second.            Arguments:        pAd         - Adapter pointer            Return Value:        None            ========================================================================*/VOID ApRadarDetectPeriodic(	IN PRTMP_ADAPTER pAd){	INT	i;	pAd->CommonCfg.RadarDetect.InServiceMonitorCount++;	for (i=0; i<pAd->ChannelListNum; i++)	{		if (pAd->ChannelList[i].RemainingTimeForUse > 0)		{			pAd->ChannelList[i].RemainingTimeForUse --;			if ((pAd->Mlme.PeriodicRound%5) == 0)			{				DBGPRINT(RT_DEBUG_TRACE, ("RadarDetectPeriodic - ch=%d, RemainingTimeForUse=%d\n", pAd->ChannelList[i].Channel, pAd->ChannelList[i].RemainingTimeForUse));			}		}	}	//radar detect	if ((pAd->CommonCfg.Channel > 14)		&& (pAd->CommonCfg.bIEEE80211H == 1)		&& RadarChannelCheck(pAd, pAd->CommonCfg.Channel))	{		RadarDetectPeriodic(pAd);	}	return;}// Periodic Radar detection, switch channel will occur in RTMPHandleTBTTInterrupt()// Before switch channel, driver needs doing channel switch announcement.VOID RadarDetectPeriodic(	IN PRTMP_ADAPTER	pAd){	// need to check channel availability, after switch channel	if (pAd->CommonCfg.RadarDetect.RDMode != RD_SILENCE_MODE)			return;	// channel availability check time is 60sec, use 65 for assurance	if (pAd->CommonCfg.RadarDetect.RDCount++ > pAd->CommonCfg.RadarDetect.ChMovingTime)	{		DBGPRINT(RT_DEBUG_TRACE, ("Not found radar signal, start send beacon and radar detection in service monitor\n\n"));			BbpRadarDetectionStop(pAd);		AsicEnableBssSync(pAd);		pAd->CommonCfg.RadarDetect.RDMode = RD_NORMAL_MODE;		return;	}	return;}/*     ==========================================================================    Description:		change channel moving time for DFS testing.	Arguments:	    pAdapter                    Pointer to our adapter	    wrq                         Pointer to the ioctl argument    Return Value:        None    Note:        Usage:                1.) iwpriv ra0 set ChMovTime=[value]    ==========================================================================*/INT Set_ChMovingTime_Proc(	IN PRTMP_ADAPTER pAd, 	IN PUCHAR arg){	UINT8 Value;	Value = simple_strtol(arg, 0, 10);	pAd->CommonCfg.RadarDetect.ChMovingTime = Value;	DBGPRINT(RT_DEBUG_TRACE, ("%s:: %d\n", __FUNCTION__,		pAd->CommonCfg.RadarDetect.ChMovingTime));	return TRUE;}INT Set_LongPulseRadarTh_Proc(	IN PRTMP_ADAPTER pAd, 	IN PUCHAR arg){	UINT8 Value;	Value = simple_strtol(arg, 0, 10) > 10 ? 10 : simple_strtol(arg, 0, 10);		pAd->CommonCfg.RadarDetect.LongPulseRadarTh = Value;	DBGPRINT(RT_DEBUG_TRACE, ("%s:: %d\n", __FUNCTION__,		pAd->CommonCfg.RadarDetect.LongPulseRadarTh));	return TRUE;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -