📄 rtmp_init.c
字号:
pAd->TxAgcStepA, pAd->bAutoTxAgcA);
}
pAd->BbpRssiToDbmDelta = 0x79;
RTUSBReadEEPROM(pAd, EEPROM_FREQ_OFFSET, (PUCHAR) &value, 2);
if ((value & 0xFF00) == 0xFF00)
{
pAd->RFProgSeq = 0;
}
else
{
pAd->RFProgSeq = (value & 0x0300) >> 8; // bit 8,9
}
value &= 0x00FF;
if (value != 0x00FF)
pAd->RfFreqOffset = (ULONG) value;
else
pAd->RfFreqOffset = 0;
DBGPRINT(RT_DEBUG_TRACE, "E2PROM: RF freq offset=0x%x\n", pAd->RfFreqOffset);
//CountryRegion byte offset = 0x25
value = pAd->EEPROMDefaultValue[2] >> 8;
value2 = pAd->EEPROMDefaultValue[2] & 0x00FF;
if ((value <= REGION_MAXIMUM_BG_BAND) && (value2 <= REGION_MAXIMUM_A_BAND))
{
pAd->PortCfg.CountryRegion = ((UCHAR) value) | 0x80;
pAd->PortCfg.CountryRegionForABand = ((UCHAR) value2) | 0x80;
}
//
// Get RSSI Offset on EEPROM 0x9Ah & 0x9Ch.
// The valid value are (-10 ~ 10)
//
RTUSBReadEEPROM(pAd, EEPROM_RSSI_BG_OFFSET, (PUCHAR) &value, 2);
pAd->BGRssiOffset1 = value & 0x00ff;
pAd->BGRssiOffset2 = (value >> 8);
// Validate 11b/g RSSI_1 offset.
if ((pAd->BGRssiOffset1 < -10) || (pAd->BGRssiOffset1 > 10))
pAd->BGRssiOffset1 = 0;
// Validate 11b/g RSSI_2 offset.
if ((pAd->BGRssiOffset2 < -10) || (pAd->BGRssiOffset2 > 10))
pAd->BGRssiOffset2 = 0;
RTUSBReadEEPROM(pAd, EEPROM_RSSI_A_OFFSET, (PUCHAR) &value, 2);
pAd->ARssiOffset1 = value & 0x00ff;
pAd->ARssiOffset2 = (value >> 8);
// Validate 11a RSSI_1 offset.
if ((pAd->ARssiOffset1 < -10) || (pAd->ARssiOffset1 > 10))
pAd->ARssiOffset1 = 0;
//Validate 11a RSSI_2 offset.
if ((pAd->ARssiOffset2 < -10) || (pAd->ARssiOffset2 > 10))
pAd->ARssiOffset2 = 0;
//
// Get LED Setting.
//
RTUSBReadEEPROM(pAd, EEPROM_LED_OFFSET, (PUCHAR)&LedSetting.word, 2);
if (LedSetting.word == 0xFFFF)
{
//
// Set it to Default.
//
LedSetting.field.PolarityRDY_G = 0; // Active High.
LedSetting.field.PolarityRDY_A = 0; // Active High.
LedSetting.field.PolarityACT = 0; // Active High.
LedSetting.field.PolarityGPIO_0 = 0; // Active High.
LedSetting.field.PolarityGPIO_1 = 0; // Active High.
LedSetting.field.PolarityGPIO_2 = 0; // Active High.
LedSetting.field.PolarityGPIO_3 = 0; // Active High.
LedSetting.field.PolarityGPIO_4 = 0; // Active High.
LedSetting.field.LedMode = LED_MODE_DEFAULT;
}
pAd->LedCntl.word = 0;
pAd->LedCntl.field.LedMode = LedSetting.field.LedMode;
pAd->LedCntl.field.PolarityRDY_G = LedSetting.field.PolarityRDY_G;
pAd->LedCntl.field.PolarityRDY_A = LedSetting.field.PolarityRDY_A;
pAd->LedCntl.field.PolarityACT = LedSetting.field.PolarityACT;
pAd->LedCntl.field.PolarityGPIO_0 = LedSetting.field.PolarityGPIO_0;
pAd->LedCntl.field.PolarityGPIO_1 = LedSetting.field.PolarityGPIO_1;
pAd->LedCntl.field.PolarityGPIO_2 = LedSetting.field.PolarityGPIO_2;
pAd->LedCntl.field.PolarityGPIO_3 = LedSetting.field.PolarityGPIO_3;
pAd->LedCntl.field.PolarityGPIO_4 = LedSetting.field.PolarityGPIO_4;
RTUSBReadEEPROM(pAd, EEPROM_TXPOWER_DELTA_OFFSET, (PUCHAR)&value, 2);
value = value & 0x00ff;
if (value != 0xff)
{
pAd->TxPowerDeltaConfig.value = (UCHAR) value;
if (pAd->TxPowerDeltaConfig.field.DeltaValue > 0x04)
pAd->TxPowerDeltaConfig.field.DeltaValue = 0x04;
}
else
pAd->TxPowerDeltaConfig.field.TxPowerEnable = FALSE;
DBGPRINT(RT_DEBUG_TRACE, "<-- NICReadEEPROMParameters\n");
}
/*
========================================================================
Routine Description:
Set default value from EEPROM
Arguments:
Adapter Pointer to our adapter
Return Value:
None
Note:
========================================================================
*/
VOID NICInitAsicFromEEPROM(
IN PRTMP_ADAPTER pAd)
{
ULONG data;
USHORT i;
ULONG MiscMode;
EEPROM_ANTENNA_STRUC Antenna;
EEPROM_NIC_CONFIG2_STRUC NicConfig2;
DBGPRINT(RT_DEBUG_TRACE, "--> NICInitAsicFromEEPROM\n");
for(i = 3; i < NUM_EEPROM_BBP_PARMS; i++)
{
UCHAR BbpRegIdx, BbpValue;
if ((pAd->EEPROMDefaultValue[i] != 0xFFFF) && (pAd->EEPROMDefaultValue[i] != 0))
{
BbpRegIdx = (UCHAR)(pAd->EEPROMDefaultValue[i] >> 8);
BbpValue = (UCHAR)(pAd->EEPROMDefaultValue[i] & 0xff);
RTUSBWriteBBPRegister(pAd, BbpRegIdx, BbpValue);
}
}
Antenna.word = pAd->EEPROMDefaultValue[0];
if (Antenna.word == 0xFFFF)
{
Antenna.word = 0;
Antenna.field.RfIcType = RFIC_5226;
Antenna.field.HardwareRadioControl = 0; // no hardware control
Antenna.field.DynamicTxAgcControl = 0;
Antenna.field.FrameType = 0;
Antenna.field.RxDefaultAntenna = 2; // Ant-B
Antenna.field.TxDefaultAntenna = 2; // Ant-B
Antenna.field.NumOfAntenna = 2;
DBGPRINT(RT_DEBUG_WARN, "E2PROM error, hard code as 0x%04x\n", Antenna.word);
}
pAd->RfIcType = (UCHAR) Antenna.field.RfIcType;
DBGPRINT(RT_DEBUG_WARN, "pAd->RfIcType = %d\n", pAd->RfIcType);
//
// For RFIC RFIC_5225 & RFIC_2527
// Must enable RF RPI mode on PHY_CSR1 bit 16.
//
if ((pAd->RfIcType == RFIC_5225) || (pAd->RfIcType == RFIC_2527))
{
RTUSBReadMACRegister(pAd, PHY_CSR1, &MiscMode);
MiscMode |= 0x10000;
RTUSBWriteMACRegister(pAd, PHY_CSR1, MiscMode);
}
// Save the antenna for future use
pAd->Antenna.word = Antenna.word;
// Read Hardware controlled Radio state enable bit
if (Antenna.field.HardwareRadioControl == 1)
{
pAd->PortCfg.bHardwareRadio = TRUE;
// Read GPIO pin7 as Hardware controlled radio state
RTUSBReadMACRegister(pAd, MAC_CSR13, &data);
//
// The GPIO pin7 default is 1:Pull-High, means HW Radio Enable.
// When the value is 0, means HW Radio disable.
//
if ((data & 0x80) == 0)
{
pAd->PortCfg.bHwRadio = FALSE;
// Update extra information to link is up
pAd->ExtraInfo = HW_RADIO_OFF;
}
}
else
pAd->PortCfg.bHardwareRadio = FALSE;
pAd->PortCfg.bRadio = pAd->PortCfg.bSwRadio && pAd->PortCfg.bHwRadio;
if (pAd->PortCfg.bRadio == FALSE)
{
RTUSBWriteMACRegister(pAd, MAC_CSR10, 0x00001818);
RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);
RTMPSetLED(pAd, LED_RADIO_OFF);
}
else
{
RTMPSetLED(pAd, LED_RADIO_ON);
}
NicConfig2.word = pAd->EEPROMDefaultValue[1];
if (NicConfig2.word == 0xffff)
{
NicConfig2.word = 0;
}
// Save the antenna for future use
pAd->NicConfig2.word = NicConfig2.word;
DBGPRINT(RT_DEBUG_TRACE, "Use Hw Radio Control Pin=%d; if used Pin=%d;\n",
pAd->PortCfg.bHardwareRadio, pAd->PortCfg.bHardwareRadio);
DBGPRINT(RT_DEBUG_TRACE, "RFIC=%d, LED mode=%d\n", pAd->RfIcType, pAd->LedCntl.field.LedMode);
pAd->PortCfg.BandState = UNKNOWN_BAND;
DBGPRINT(RT_DEBUG_TRACE, "<-- NICInitAsicFromEEPROM\n");
}
/*
========================================================================
Routine Description:
Initialize NIC hardware
Arguments:
Adapter Pointer to our adapter
Return Value:
None
Note:
========================================================================
*/
NDIS_STATUS NICInitializeAsic(
IN PRTMP_ADAPTER pAd)
{
ULONG Index, Counter;
UCHAR Value = 0xff;
ULONG Version;
MAC_CSR12_STRUC MacCsr12;
DBGPRINT(RT_DEBUG_TRACE, "--> NICInitializeAsic\n");
RTUSBReadMACRegister(pAd, MAC_CSR0, &Version);
// Initialize MAC register to default value
for (Index = 0; Index < NUM_MAC_REG_PARMS; Index++)
{
RTUSBWriteMACRegister(pAd, (USHORT)MACRegTable[Index].Register, MACRegTable[Index].Value);
}
// Set Host ready before kicking Rx
RTUSBWriteMACRegister(pAd, MAC_CSR1, 0x3);
RTUSBWriteMACRegister(pAd, MAC_CSR1, 0x0);
//
// Before program BBP, we need to wait BBP/RF get wake up.
//
Index = 0;
do
{
RTUSBReadMACRegister(pAd, MAC_CSR12, &MacCsr12.word);
if (MacCsr12.field.BbpRfStatus == 1)
break;
RTUSBWriteMACRegister(pAd, MAC_CSR12, 0x4); //Force wake up.
RTMPusecDelay(1000);
} while (Index++ < 1000);
// Read BBP register, make sure BBP is up and running before write new data
Index = 0;
do
{
RTUSBReadBBPRegister(pAd, BBP_R0, &Value);
DBGPRINT(RT_DEBUG_TRACE, "BBP version = %d\n", Value);
} while ((++Index < 100) && ((Value == 0xff) || (Value == 0x00)));
// Initialize BBP register to default value
for (Index = 0; Index < NUM_BBP_REG_PARMS; Index++)
{
RTUSBWriteBBPRegister(pAd, BBPRegTable[Index].Register, BBPRegTable[Index].Value);
}
// Clear raw counters
RTUSBReadMACRegister(pAd, STA_CSR0, &Counter);
RTUSBReadMACRegister(pAd, STA_CSR1, &Counter);
RTUSBReadMACRegister(pAd, STA_CSR2, &Counter);
// assert HOST ready bit
RTUSBWriteMACRegister(pAd, MAC_CSR1, 0x4);
DBGPRINT(RT_DEBUG_TRACE, "<-- NICInitializeAsic\n");
return NDIS_STATUS_SUCCESS;
}
/*
========================================================================
Routine Description:
Reset NIC Asics
Arguments:
Adapter Pointer to our adapter
Return Value:
None
Note:
Reset NIC to initial state AS IS system boot up time.
========================================================================
*/
VOID NICIssueReset(
IN PRTMP_ADAPTER pAd)
{
}
/*
========================================================================
Routine Description:
Check ASIC registers and find any reason the system might hang
Arguments:
Adapter Pointer to our adapter
Return Value:
None
========================================================================
*/
BOOLEAN NICCheckForHang(
IN PRTMP_ADAPTER pAd)
{
return (FALSE);
}
/*
========================================================================
Routine Description:
Read statistical counters from hardware registers and record them
in software variables for later on query
Arguments:
pAd Pointer to our adapter
Return Value:
None
========================================================================
*/
VOID NICUpdateRawCounters(
IN PRTMP_ADAPTER pAd)
{
ULONG OldValue;
STA_CSR0_STRUC StaCsr0;
STA_CSR1_STRUC StaCsr1;
STA_CSR2_STRUC StaCsr2;
STA_CSR3_STRUC StaCsr3;
STA_CSR4_STRUC StaCsr4;
STA_CSR5_STRUC StaCsr5;
RTUSBReadMACRegister(pAd, STA_CSR0, &StaCsr0.word);
// Update RX PLCP error counter
pAd->PrivateInfo.PhyRxErrCnt += StaCsr0.field.PlcpErr;
// Update FCS counters
OldValue= pAd->WlanCounters.FCSErrorCount.vv.LowPart;
pAd->WlanCounters.FCSErrorCount.vv.LowPart += (StaCsr0.field.CrcErr); // >> 7);
if (pAd->WlanCounters.FCSErrorCount.vv.LowPart < OldValue)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -