void DynamicCCKThreshold(struct net_device *dev)
{
    struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
    u16         CCK_Up_Th;
    u16         CCK_Lw_Th;
    u16         CCKFalseAlarm;


    CCK_Up_Th = priv->CCKUpperTh;
    CCK_Lw_Th = priv->CCKLowerTh;
    CCKFalseAlarm = (u16)((priv->FalseAlarmRegValue & 0x0000ffff) >> 8);

    if(priv->StageCCKTh < 3 && CCKFalseAlarm >= CCK_Up_Th)
    {
        priv->StageCCKTh ++;
        UpdateCCKThreshold(dev);
    }
    else if(priv->StageCCKTh > 0 && CCKFalseAlarm <= CCK_Lw_Th)
    {
        priv->StageCCKTh --;
        UpdateCCKThreshold(dev);
    }

}
Exemple #2
0
void DynamicInitGain(_adapter *padapter)
{
	struct mib_info *_sys_mib = &(padapter->_sys_mib);
	u16	CCKFalseAlarm, OFDMFalseAlarm;
	u16	OfdmFA1, OfdmFA2;
	u16	CCK_Up_Th, CCK_Lw_Th;
	int	InitialGainStep = 7; // The number of initial gain stages.
	int	LowestGainStage = 4; // The capable lowest stage of performing dig workitem.
	
	set_current_state(TASK_INTERRUPTIBLE);	
#ifdef TODO
	_sys_mib->FalseAlarmRegValue = read32(padapter, CCK_FALSE_ALARM);
#endif
	
	CCKFalseAlarm = (u16)(_sys_mib->FalseAlarmRegValue & 0x0000ffff);
	OFDMFalseAlarm = (u16)( (_sys_mib->FalseAlarmRegValue>>16) & 0x0000ffff);
	OfdmFA1 = 0x15;
	OfdmFA2 = ((u16)(_sys_mib->RegDigOfdmFaUpTh)) << 8;
	//OfdmFA2 = 0xC00;

	DEBUG_INFO(("\n r8187_dig_thread:FalseAlarmRegValue = %8x \n", _sys_mib->FalseAlarmRegValue));

	// The number of initial gain steps is different, by Bruce, 2007-04-13.		
	if(_sys_mib->InitialGain == 0)  //autoDIG
	{// Advised from SD3 DZ, by Bruce, 2007-06-05.
		_sys_mib->InitialGain = 4; // In 87B, m74dBm means State 4 (m82dBm)
	}

#ifdef TODO
	if(padapter->registrypriv.chip_version != VERSION_8187B_B)
	{ // Advised from SD3 DZ, by Bruce, 2007-06-05.
		OfdmFA1 =  0x20;
	}
#endif

	InitialGainStep = 8;
	LowestGainStage = 1;

	if (OFDMFalseAlarm > OfdmFA1)
	{
		if (OFDMFalseAlarm > OfdmFA2)
		{
			_sys_mib->DIG_NumberFallbackVote++;
			if (_sys_mib->DIG_NumberFallbackVote >1)
			{
                             // serious OFDM  False Alarm, need fallback
                             // By Bruce, 2007-03-29.
                             // if (priv->InitialGain < 7) // In 87B, m66dBm means State 7 (m74dBm)
				if (_sys_mib->InitialGain < InitialGainStep)
				{
					_sys_mib->InitialGain = (_sys_mib->InitialGain + 1);
					UpdateInitialGain(padapter); // 2005.01.06, by rcnjko.
				}
				_sys_mib->DIG_NumberFallbackVote	= 0;
				_sys_mib->DIG_NumberUpgradeVote	= 0;
			}
		}
		else
		{
			if (_sys_mib->DIG_NumberFallbackVote)
				_sys_mib->DIG_NumberFallbackVote--;
		}
		_sys_mib->DIG_NumberUpgradeVote=0;
	}
	else    //OFDM False Alarm < 0x15
	{
		if (_sys_mib->DIG_NumberFallbackVote)
			_sys_mib->DIG_NumberFallbackVote--;
		_sys_mib->DIG_NumberUpgradeVote++;

		if (_sys_mib->DIG_NumberUpgradeVote>9)
		{
			if (_sys_mib->InitialGain > LowestGainStage) // In 87B, m78dBm means State 4 (m864dBm)
			{
				_sys_mib->InitialGain = (_sys_mib->InitialGain - 1);
				UpdateInitialGain(padapter); // 2005.01.06, by rcnjko.
			}
			_sys_mib->DIG_NumberFallbackVote	= 0;
			_sys_mib->DIG_NumberUpgradeVote	= 0;
		}
	}

	// By Bruce, 2007-03-29.
	// Dynamically update CCK Power Detection Threshold.
	CCK_Up_Th = _sys_mib->CCKUpperTh;
	CCK_Lw_Th = _sys_mib->CCKLowerTh;	
	CCKFalseAlarm = (u16)((_sys_mib->FalseAlarmRegValue & 0x0000ffff) >> 8); // We only care about the higher byte.

	if( _sys_mib->StageCCKTh < 3 && CCKFalseAlarm >= CCK_Up_Th)
	{
		_sys_mib->StageCCKTh ++;
		UpdateCCKThreshold(padapter);
	}
	else if(_sys_mib->StageCCKTh > 0 && CCKFalseAlarm <= CCK_Lw_Th)
	{
		_sys_mib->StageCCKTh --;
		UpdateCCKThreshold(padapter);
	}	
}