extractedLnx/linux-2.6.30/drivers/staging/rt3070/common/rtmp_init.c_RTMPReadTxPwrPerRate.c
VOID RTMPReadTxPwrPerRate(
IN PRTMP_ADAPTER pAd)
{
ULONG data, Adata, Gdata;
USHORT i, value, value2;
INT Apwrdelta, Gpwrdelta;
UCHAR t1,t2,t3,t4;
BOOLEAN bValid, bApwrdeltaMinus = TRUE, bGpwrdeltaMinus = TRUE;
//
// Get power delta for 20MHz and 40MHz.
//
DBGPRINT(RT_DEBUG_TRACE, ("Txpower per Rate\n"));
RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_DELTA, value2);
Apwrdelta = 0;
Gpwrdelta = 0;
if ((value2 & 0xff) != 0xff)
{
if ((value2 & 0x80))
Gpwrdelta = (value2&0xf);
if ((value2 & 0x40))
bGpwrdeltaMinus = FALSE;
else
bGpwrdeltaMinus = TRUE;
}
if ((value2 & 0xff00) != 0xff00)
{
if ((value2 & 0x8000))
Apwrdelta = ((value2&0xf00)>>8);
if ((value2 & 0x4000))
bApwrdeltaMinus = FALSE;
else
bApwrdeltaMinus = TRUE;
}
DBGPRINT(RT_DEBUG_TRACE, ("Gpwrdelta = %x, Apwrdelta = %x .\n", Gpwrdelta, Apwrdelta));
//
// Get Txpower per MCS for 20MHz in 2.4G.
//
for (i=0; i<5; i++)
{
RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_20MHZ_2_4G + i*4, value);
data = value;
if (bApwrdeltaMinus == FALSE)
{
t1 = (value&0xf)+(Apwrdelta);
if (t1 > 0xf)
t1 = 0xf;
t2 = ((value&0xf0)>>4)+(Apwrdelta);
if (t2 > 0xf)
t2 = 0xf;
t3 = ((value&0xf00)>>8)+(Apwrdelta);
if (t3 > 0xf)
t3 = 0xf;
t4 = ((value&0xf000)>>12)+(Apwrdelta);
if (t4 > 0xf)
t4 = 0xf;
}
else
{
if ((value&0xf) > Apwrdelta)
t1 = (value&0xf)-(Apwrdelta);
else
t1 = 0;
if (((value&0xf0)>>4) > Apwrdelta)
t2 = ((value&0xf0)>>4)-(Apwrdelta);
else
t2 = 0;
if (((value&0xf00)>>8) > Apwrdelta)
t3 = ((value&0xf00)>>8)-(Apwrdelta);
else
t3 = 0;
if (((value&0xf000)>>12) > Apwrdelta)
t4 = ((value&0xf000)>>12)-(Apwrdelta);
else
t4 = 0;
}
Adata = t1 + (t2<<4) + (t3<<8) + (t4<<12);
if (bGpwrdeltaMinus == FALSE)
{
t1 = (value&0xf)+(Gpwrdelta);
if (t1 > 0xf)
t1 = 0xf;
t2 = ((value&0xf0)>>4)+(Gpwrdelta);
if (t2 > 0xf)
t2 = 0xf;
t3 = ((value&0xf00)>>8)+(Gpwrdelta);
if (t3 > 0xf)
t3 = 0xf;
t4 = ((value&0xf000)>>12)+(Gpwrdelta);
if (t4 > 0xf)
t4 = 0xf;
}
else
{
if ((value&0xf) > Gpwrdelta)
t1 = (value&0xf)-(Gpwrdelta);
else
t1 = 0;
if (((value&0xf0)>>4) > Gpwrdelta)
t2 = ((value&0xf0)>>4)-(Gpwrdelta);
else
t2 = 0;
if (((value&0xf00)>>8) > Gpwrdelta)
t3 = ((value&0xf00)>>8)-(Gpwrdelta);
else
t3 = 0;
if (((value&0xf000)>>12) > Gpwrdelta)
t4 = ((value&0xf000)>>12)-(Gpwrdelta);
else
t4 = 0;
}
Gdata = t1 + (t2<<4) + (t3<<8) + (t4<<12);
RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_20MHZ_2_4G + i*4 + 2, value);
if (bApwrdeltaMinus == FALSE)
{
t1 = (value&0xf)+(Apwrdelta);
if (t1 > 0xf)
t1 = 0xf;
t2 = ((value&0xf0)>>4)+(Apwrdelta);
if (t2 > 0xf)
t2 = 0xf;
t3 = ((value&0xf00)>>8)+(Apwrdelta);
if (t3 > 0xf)
t3 = 0xf;
t4 = ((value&0xf000)>>12)+(Apwrdelta);
if (t4 > 0xf)
t4 = 0xf;
}
else
{
if ((value&0xf) > Apwrdelta)
t1 = (value&0xf)-(Apwrdelta);
else
t1 = 0;
if (((value&0xf0)>>4) > Apwrdelta)
t2 = ((value&0xf0)>>4)-(Apwrdelta);
else
t2 = 0;
if (((value&0xf00)>>8) > Apwrdelta)
t3 = ((value&0xf00)>>8)-(Apwrdelta);
else
t3 = 0;
if (((value&0xf000)>>12) > Apwrdelta)
t4 = ((value&0xf000)>>12)-(Apwrdelta);
else
t4 = 0;
}
Adata |= ((t1<<16) + (t2<<20) + (t3<<24) + (t4<<28));
if (bGpwrdeltaMinus == FALSE)
{
t1 = (value&0xf)+(Gpwrdelta);
if (t1 > 0xf)
t1 = 0xf;
t2 = ((value&0xf0)>>4)+(Gpwrdelta);
if (t2 > 0xf)
t2 = 0xf;
t3 = ((value&0xf00)>>8)+(Gpwrdelta);
if (t3 > 0xf)
t3 = 0xf;
t4 = ((value&0xf000)>>12)+(Gpwrdelta);
if (t4 > 0xf)
t4 = 0xf;
}
else
{
if ((value&0xf) > Gpwrdelta)
t1 = (value&0xf)-(Gpwrdelta);
else
t1 = 0;
if (((value&0xf0)>>4) > Gpwrdelta)
t2 = ((value&0xf0)>>4)-(Gpwrdelta);
else
t2 = 0;
if (((value&0xf00)>>8) > Gpwrdelta)
t3 = ((value&0xf00)>>8)-(Gpwrdelta);
else
t3 = 0;
if (((value&0xf000)>>12) > Gpwrdelta)
t4 = ((value&0xf000)>>12)-(Gpwrdelta);
else
t4 = 0;
}
Gdata |= ((t1<<16) + (t2<<20) + (t3<<24) + (t4<<28));
data |= (value<<16);
pAd->Tx20MPwrCfgABand[i] = pAd->Tx40MPwrCfgABand[i] = Adata;
pAd->Tx20MPwrCfgGBand[i] = pAd->Tx40MPwrCfgGBand[i] = Gdata;
if (data != 0xffffffff)
RTMP_IO_WRITE32(pAd, TX_PWR_CFG_0 + i*4, data);
DBGPRINT_RAW(RT_DEBUG_TRACE, ("20MHz BW, 2.4G band-%lx, Adata = %lx, Gdata = %lx \n", data, Adata, Gdata));
}
//
// Check this block is valid for 40MHz in 2.4G. If invalid, use parameter for 20MHz in 2.4G
//
bValid = TRUE;
for (i=0; i<6; i++)
{
RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_40MHZ_2_4G + 2 + i*2, value);
if (((value & 0x00FF) == 0x00FF) || ((value & 0xFF00) == 0xFF00))
{
bValid = FALSE;
break;
}
}
//
// Get Txpower per MCS for 40MHz in 2.4G.
//
if (bValid)
{
for (i=0; i<4; i++)
{
RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_40MHZ_2_4G + i*4, value);
if (bGpwrdeltaMinus == FALSE)
{
t1 = (value&0xf)+(Gpwrdelta);
if (t1 > 0xf)
t1 = 0xf;
t2 = ((value&0xf0)>>4)+(Gpwrdelta);
if (t2 > 0xf)
t2 = 0xf;
t3 = ((value&0xf00)>>8)+(Gpwrdelta);
if (t3 > 0xf)
t3 = 0xf;
t4 = ((value&0xf000)>>12)+(Gpwrdelta);
if (t4 > 0xf)
t4 = 0xf;
}
else
{
if ((value&0xf) > Gpwrdelta)
t1 = (value&0xf)-(Gpwrdelta);
else
t1 = 0;
if (((value&0xf0)>>4) > Gpwrdelta)
t2 = ((value&0xf0)>>4)-(Gpwrdelta);
else
t2 = 0;
if (((value&0xf00)>>8) > Gpwrdelta)
t3 = ((value&0xf00)>>8)-(Gpwrdelta);
else
t3 = 0;
if (((value&0xf000)>>12) > Gpwrdelta)
t4 = ((value&0xf000)>>12)-(Gpwrdelta);
else
t4 = 0;
}
Gdata = t1 + (t2<<4) + (t3<<8) + (t4<<12);
RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_40MHZ_2_4G + i*4 + 2, value);
if (bGpwrdeltaMinus == FALSE)
{
t1 = (value&0xf)+(Gpwrdelta);
if (t1 > 0xf)
t1 = 0xf;
t2 = ((value&0xf0)>>4)+(Gpwrdelta);
if (t2 > 0xf)
t2 = 0xf;
t3 = ((value&0xf00)>>8)+(Gpwrdelta);
if (t3 > 0xf)
t3 = 0xf;
t4 = ((value&0xf000)>>12)+(Gpwrdelta);
if (t4 > 0xf)
t4 = 0xf;
}
else
{
if ((value&0xf) > Gpwrdelta)
t1 = (value&0xf)-(Gpwrdelta);
else
t1 = 0;
if (((value&0xf0)>>4) > Gpwrdelta)
t2 = ((value&0xf0)>>4)-(Gpwrdelta);
else
t2 = 0;
if (((value&0xf00)>>8) > Gpwrdelta)
t3 = ((value&0xf00)>>8)-(Gpwrdelta);
else
t3 = 0;
if (((value&0xf000)>>12) > Gpwrdelta)
t4 = ((value&0xf000)>>12)-(Gpwrdelta);
else
t4 = 0;
}
Gdata |= ((t1<<16) + (t2<<20) + (t3<<24) + (t4<<28));
if (i == 0)
pAd->Tx40MPwrCfgGBand[i+1] = (pAd->Tx40MPwrCfgGBand[i+1] & 0x0000FFFF) | (Gdata & 0xFFFF0000);
else
pAd->Tx40MPwrCfgGBand[i+1] = Gdata;
DBGPRINT_RAW(RT_DEBUG_TRACE, ("40MHz BW, 2.4G band, Gdata = %lx \n", Gdata));
}
}
//
// Check this block is valid for 20MHz in 5G. If invalid, use parameter for 20MHz in 2.4G
//
bValid = TRUE;
for (i=0; i<8; i++)
{
RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_20MHZ_5G + 2 + i*2, value);
if (((value & 0x00FF) == 0x00FF) || ((value & 0xFF00) == 0xFF00))
{
bValid = FALSE;
break;
}
}
//
// Get Txpower per MCS for 20MHz in 5G.
//
if (bValid)
{
for (i=0; i<5; i++)
{
RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_20MHZ_5G + i*4, value);
if (bApwrdeltaMinus == FALSE)
{
t1 = (value&0xf)+(Apwrdelta);
if (t1 > 0xf)
t1 = 0xf;
t2 = ((value&0xf0)>>4)+(Apwrdelta);
if (t2 > 0xf)
t2 = 0xf;
t3 = ((value&0xf00)>>8)+(Apwrdelta);
if (t3 > 0xf)
t3 = 0xf;
t4 = ((value&0xf000)>>12)+(Apwrdelta);
if (t4 > 0xf)
t4 = 0xf;
}
else
{
if ((value&0xf) > Apwrdelta)
t1 = (value&0xf)-(Apwrdelta);
else
t1 = 0;
if (((value&0xf0)>>4) > Apwrdelta)
t2 = ((value&0xf0)>>4)-(Apwrdelta);
else
t2 = 0;
if (((value&0xf00)>>8) > Apwrdelta)
t3 = ((value&0xf00)>>8)-(Apwrdelta);
else
t3 = 0;
if (((value&0xf000)>>12) > Apwrdelta)
t4 = ((value&0xf000)>>12)-(Apwrdelta);
else
t4 = 0;
}
Adata = t1 + (t2<<4) + (t3<<8) + (t4<<12);
RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_20MHZ_5G + i*4 + 2, value);
if (bApwrdeltaMinus == FALSE)
{
t1 = (value&0xf)+(Apwrdelta);
if (t1 > 0xf)
t1 = 0xf;
t2 = ((value&0xf0)>>4)+(Apwrdelta);
if (t2 > 0xf)
t2 = 0xf;
t3 = ((value&0xf00)>>8)+(Apwrdelta);
if (t3 > 0xf)
t3 = 0xf;
t4 = ((value&0xf000)>>12)+(Apwrdelta);
if (t4 > 0xf)
t4 = 0xf;
}
else
{
if ((value&0xf) > Apwrdelta)
t1 = (value&0xf)-(Apwrdelta);
else
t1 = 0;
if (((value&0xf0)>>4) > Apwrdelta)
t2 = ((value&0xf0)>>4)-(Apwrdelta);
else
t2 = 0;
if (((value&0xf00)>>8) > Apwrdelta)
t3 = ((value&0xf00)>>8)-(Apwrdelta);
else
t3 = 0;
if (((value&0xf000)>>12) > Apwrdelta)
t4 = ((value&0xf000)>>12)-(Apwrdelta);
else
t4 = 0;
}
Adata |= ((t1<<16) + (t2<<20) + (t3<<24) + (t4<<28));
if (i == 0)
pAd->Tx20MPwrCfgABand[i] = (pAd->Tx20MPwrCfgABand[i] & 0x0000FFFF) | (Adata & 0xFFFF0000);
else
pAd->Tx20MPwrCfgABand[i] = Adata;
DBGPRINT_RAW(RT_DEBUG_TRACE, ("20MHz BW, 5GHz band, Adata = %lx \n", Adata));
}
}
//
// Check this block is valid for 40MHz in 5G. If invalid, use parameter for 20MHz in 2.4G
//
bValid = TRUE;
for (i=0; i<6; i++)
{
RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_40MHZ_5G + 2 + i*2, value);
if (((value & 0x00FF) == 0x00FF) || ((value & 0xFF00) == 0xFF00))
{
bValid = FALSE;
break;
}
}
//
// Get Txpower per MCS for 40MHz in 5G.
//
if (bValid)
{
for (i=0; i<4; i++)
{
RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_40MHZ_5G + i*4, value);
if (bApwrdeltaMinus == FALSE)
{
t1 = (value&0xf)+(Apwrdelta);
if (t1 > 0xf)
t1 = 0xf;
t2 = ((value&0xf0)>>4)+(Apwrdelta);
if (t2 > 0xf)
t2 = 0xf;
t3 = ((value&0xf00)>>8)+(Apwrdelta);
if (t3 > 0xf)
t3 = 0xf;
t4 = ((value&0xf000)>>12)+(Apwrdelta);
if (t4 > 0xf)
t4 = 0xf;
}
else
{
if ((value&0xf) > Apwrdelta)
t1 = (value&0xf)-(Apwrdelta);
else
t1 = 0;
if (((value&0xf0)>>4) > Apwrdelta)
t2 = ((value&0xf0)>>4)-(Apwrdelta);
else
t2 = 0;
if (((value&0xf00)>>8) > Apwrdelta)
t3 = ((value&0xf00)>>8)-(Apwrdelta);
else
t3 = 0;
if (((value&0xf000)>>12) > Apwrdelta)
t4 = ((value&0xf000)>>12)-(Apwrdelta);
else
t4 = 0;
}
Adata = t1 + (t2<<4) + (t3<<8) + (t4<<12);
RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_40MHZ_5G + i*4 + 2, value);
if (bApwrdeltaMinus == FALSE)
{
t1 = (value&0xf)+(Apwrdelta);
if (t1 > 0xf)
t1 = 0xf;
t2 = ((value&0xf0)>>4)+(Apwrdelta);
if (t2 > 0xf)
t2 = 0xf;
t3 = ((value&0xf00)>>8)+(Apwrdelta);
if (t3 > 0xf)
t3 = 0xf;
t4 = ((value&0xf000)>>12)+(Apwrdelta);
if (t4 > 0xf)
t4 = 0xf;
}
else
{
if ((value&0xf) > Apwrdelta)
t1 = (value&0xf)-(Apwrdelta);
else
t1 = 0;
if (((value&0xf0)>>4) > Apwrdelta)
t2 = ((value&0xf0)>>4)-(Apwrdelta);
else
t2 = 0;
if (((value&0xf00)>>8) > Apwrdelta)
t3 = ((value&0xf00)>>8)-(Apwrdelta);
else
t3 = 0;
if (((value&0xf000)>>12) > Apwrdelta)
t4 = ((value&0xf000)>>12)-(Apwrdelta);
else
t4 = 0;
}
Adata |= ((t1<<16) + (t2<<20) + (t3<<24) + (t4<<28));
if (i == 0)
pAd->Tx40MPwrCfgABand[i+1] = (pAd->Tx40MPwrCfgABand[i+1] & 0x0000FFFF) | (Adata & 0xFFFF0000);
else
pAd->Tx40MPwrCfgABand[i+1] = Adata;
DBGPRINT_RAW(RT_DEBUG_TRACE, ("40MHz BW, 5GHz band, Adata = %lx \n", Adata));
}
}
}
Generated by GNU enscript 1.6.4.