📄 rtusb_init.c
字号:
if ((pAdapter->EEPROMBBPTuningParameters[6] != 0xffff) && (pAdapter->EEPROMBBPTuningParameters[6] != 0))
{
pAdapter->BBPTuningParameters.RSSIToDbmOffset = (UCHAR)(pAdapter->EEPROMBBPTuningParameters[6] & 0xff);
DBGPRINT_RAW(RT_DEBUG_INFO, "RSSIToDbmOffset = 0x%x\n", pAdapter->BBPTuningParameters.RSSIToDbmOffset);
}
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 PRT2570ADAPTER pAdapter)
{
USHORT i, value;
USHORT Value5, Value6;
UCHAR TxValue,RxValue;
EEPROM_ANTENNA_STRUC Antenna;
EEPROM_NIC_CONFIG2_STRUC NicConfig2;
DBGPRINT(RT_DEBUG_TRACE,"--> NICInitAsicFromEEPROM\n");
//Initialize BBP registers.
for(i = 3; i < NUM_EEPROM_BBP_PARMS; i++)
{
value = pAdapter->EEPROMDefaultValue[i];
if((value != 0xFFFF) && (value != 0))
{
//blue,RTUSBWriteMACRegister(pAdapter, PHY_CSR7, value);
USHORT id;
id = ((value & 0xff00) >> 8);
{
USHORT temp;
UINT j = 0;
do
{
RTUSBReadMACRegister(pAdapter, PHY_CSR8, &temp);
if (!(temp & BUSY))
break;
j++;
}
while (j < RETRY_LIMIT);
RTUSBWriteMACRegister(pAdapter, PHY_CSR7, value);
}
}
}
DBGPRINT(RT_DEBUG_INFO,"pAdapter->BBPTuningParameters.R24LowerValue = %x\n", pAdapter->BBPTuningParameters.R24LowerValue);
DBGPRINT(RT_DEBUG_INFO, "pAdapter->BBPTuningParameters.R25LowerValue = %x\n", pAdapter->BBPTuningParameters.R25LowerValue);
DBGPRINT(RT_DEBUG_INFO, "pAdapter->BBPTuningParameters.R61LowerValue = %x\n", pAdapter->BBPTuningParameters.R61LowerValue);
RTUSBWriteBBPRegister(pAdapter, 24, pAdapter->BBPTuningParameters.R24LowerValue);
RTUSBWriteBBPRegister(pAdapter, 25, pAdapter->BBPTuningParameters.R25LowerValue);
RTUSBWriteBBPRegister(pAdapter, 61, pAdapter->BBPTuningParameters.R61LowerValue);
//Select antennas.
Antenna.word = pAdapter->EEPROMDefaultValue[0];
if ((Antenna.word == 0xFFFF) || (Antenna.field.TxDefaultAntenna > 2) || (Antenna.field.RxDefaultAntenna > 2))
{
DBGPRINT(RT_DEBUG_ERROR,"E2PROM error(=0x%04x), hard code as 0x0002\n", Antenna.word);
Antenna.word = 0x0002;
}
DBGPRINT(RT_DEBUG_TRACE,"Antenna.word = 0x%x \n", Antenna.word);
pAdapter->PortCfg.NumberOfAntenna = 2; // (UCHAR)Antenna.field.NumOfAntenna;
pAdapter->PortCfg.CurrentTxAntenna = (UCHAR)Antenna.field.TxDefaultAntenna;
pAdapter->PortCfg.CurrentRxAntenna = (UCHAR)Antenna.field.RxDefaultAntenna;
pAdapter->PortCfg.RfType = (UCHAR) Antenna.field.RfType;//blue
DBGPRINT(RT_DEBUG_TRACE,"pAdapter->PortCfg.RfType = 0x%x \n", pAdapter->PortCfg.RfType);
RTUSBReadBBPRegister(pAdapter, BBP_Tx_Configure, &TxValue);
RTUSBReadBBPRegister(pAdapter, BBP_Rx_Configure, &RxValue);
RTUSBReadMACRegister(pAdapter, PHY_CSR5, &Value5);
RTUSBReadMACRegister(pAdapter, PHY_CSR6, &Value6);
// Tx antenna select
if(Antenna.field.TxDefaultAntenna == 1)
{
TxValue = (TxValue & 0xFC) | 0x00; // Antenna A
Value5 = (Value5 & 0xFFFC) | 0x0000;
Value6 = (Value6 & 0xFFFC) | 0x0000;
}
else if(Antenna.field.TxDefaultAntenna == 2)
{
TxValue = (TxValue & 0xFC) | 0x02; // Antenna B
Value5 = (Value5 & 0xFFFC) | 0x0002;
Value6 = (Value6 & 0xFFFC) | 0x0002;
}
else
{
TxValue = (TxValue & 0xFC) | 0x01; // Antenna Diversity
Value5 = (Value5 & 0xFFFC) | 0x0001;
Value6 = (Value6 & 0xFFFC) | 0x0001;
}
// Rx antenna select
if(Antenna.field.RxDefaultAntenna == 1)
RxValue = (RxValue & 0xFC) | 0x00; // Antenna A
else if(Antenna.field.RxDefaultAntenna == 2)
RxValue = (RxValue & 0xFC) | 0x02; // Antenna B
else
RxValue = (RxValue & 0xFC) | 0x01; // Antenna Diversity
DBGPRINT(RT_DEBUG_TRACE, "<-- NICInitAsicFromEEPROM pAdapter->PortCfg.RfType = %d\n", pAdapter->PortCfg.RfType);
// RT5222 needs special treatment to swap TX I/Q
if (pAdapter->PortCfg.RfType == RFIC_5222)
{
Value5 |= 0x0004;
Value6 |= 0x0004;
TxValue |= 0x04; // TX I/Q flip
}
// RT2525E need to flip TX I/Q but not RX I/Q
else if (pAdapter->PortCfg.RfType == RFIC_2525E)
{
Value5 |= 0x0004;
Value6 |= 0x0004;
TxValue |= 0x04; // TX I/Q flip
RxValue &= 0xfb; // RX I/Q no flip
}
RTUSBWriteMACRegister(pAdapter, PHY_CSR5, Value5);
RTUSBWriteMACRegister(pAdapter, PHY_CSR6, Value6);
// Change to match microsoft definition, 0xff: diversity, 0: A, 1: B
pAdapter->PortCfg.CurrentTxAntenna--;
pAdapter->PortCfg.CurrentRxAntenna--;
RTUSBWriteBBPRegister(pAdapter, BBP_Tx_Configure, TxValue);
RTUSBWriteBBPRegister(pAdapter, BBP_Rx_Configure, RxValue);
//Set LED mode.
if (Antenna.field.LedMode == LED_MODE_TXRX_ACTIVITY)
pAdapter->PortCfg.LedMode = LED_MODE_TXRX_ACTIVITY;
else if (Antenna.field.LedMode == LED_MODE_SINGLE)
{
pAdapter->PortCfg.LedMode = LED_MODE_SINGLE;
ASIC_LED_ACT_ON(pAdapter);
}
else if (Antenna.field.LedMode == LED_MODE_ASUS)
{
pAdapter->PortCfg.LedMode = LED_MODE_ASUS;
RTUSBWriteMACRegister(pAdapter, MAC_CSR20, 0x0002);
}
else if (Antenna.field.LedMode == LED_MODE_ALPHA)
{
pAdapter->PortCfg.LedMode = LED_MODE_ALPHA;
RTUSBWriteMACRegister(pAdapter, MAC_CSR20, 1);
pAdapter->PortCfg.LedCntl.fOdd = FALSE;
}
else
pAdapter->PortCfg.LedMode = LED_MODE_DEFAULT;
// Read Hardware controlled Radio state enable bit
if (Antenna.field.HardwareRadioControl == 1)
{
pAdapter->PortCfg.bHardwareRadio = TRUE;
RTUSBWriteMACRegister(pAdapter, MAC_CSR19, 0);
// Read GPIO pin0 as Hardware controlled radio state
RTUSBReadMACRegister(pAdapter, MAC_CSR19, &value);
if ((value & 0x80) == 0)
{
pAdapter->PortCfg.bHwRadio = FALSE;
pAdapter->PortCfg.bRadio = FALSE;
RTUSBWriteMACRegister(pAdapter, MAC_CSR13, 0);
RTUSBWriteMACRegister(pAdapter, MAC_CSR14, 0);
RTMP_SET_FLAG(pAdapter, fRTMP_ADAPTER_RADIO_OFF);
DBGPRINT(RT_DEBUG_ERROR, "2Set fRTMP_ADAPTER_RADIO_OFF ");
if (pAdapter->PortCfg.LedMode == LED_MODE_ASUS)
{
// Turn bit 17 for Radio OFF
RTUSBWriteMACRegister(pAdapter, MAC_CSR20, 1);
}
}
}
else
pAdapter->PortCfg.bHardwareRadio = FALSE;
NicConfig2.word = pAdapter->EEPROMDefaultValue[1];
if (NicConfig2.word == 0xffff)
NicConfig2.word = 0; // empty E2PROM, use default
// for dynamic BBP R17:RX sensibility tuning
{
UCHAR r17;
RTUSBReadBBPRegister(pAdapter, 17, &r17);
pAdapter->PortCfg.BbpTuningEnable = (NicConfig2.field.DynamicBbpTuning==0)? 1:0;
pAdapter->PortCfg.VgcLowerBound = r17;
// 2004-3-4 per David's request, R7 starts at upper bound
r17 = pAdapter->PortCfg.BbpTuning.VgcUpperBound;
pAdapter->PortCfg.LastR17Value = r17;
RTUSBWriteBBPRegister(pAdapter, 17, r17);
// 2004-2-2 per David's request, lower R17 low-bound for very good quality NIC
pAdapter->PortCfg.VgcLowerBound -= 6;
DBGPRINT(RT_DEBUG_TRACE,"R17 tuning enable=%d, R17=0x%02x, range=<0x%02x, 0x%02x>\n",
pAdapter->PortCfg.BbpTuningEnable, r17, pAdapter->PortCfg.VgcLowerBound, pAdapter->PortCfg.BbpTuning.VgcUpperBound);
}
AsicSwitchChannel(pAdapter, pAdapter->PortCfg.Channel);
DBGPRINT(RT_DEBUG_TRACE,"RF IC=%d, LED mode=%d\n", pAdapter->PortCfg.RfType, pAdapter->PortCfg.LedMode);
DBGPRINT(RT_DEBUG_TRACE,"<-- NICInitAsicFromEEPROM\n");
}
VOID RT2570InitializeAsic(
IN PRT2570ADAPTER pAdapter)
{
ULONG Index;
UCHAR buffer[22];
USHORT temp;
UCHAR Value = 0xff;
UINT i;
DBGPRINT(RT_DEBUG_TRACE, "--> NICInitializeAsic\n");
do
{
//NdisMSleep(1000);
RTUSB_VendorRequest(pAdapter,
0,
DEVICE_VENDOR_REQUEST_OUT,
0x1,
0x4,
0x1,
NULL,
0);
RTUSBSingleWrite(pAdapter, 0x308, 0xf0);//asked by MAX
// Disable RX at first beginning. Before BulkInReceive, we will enable RX.
RTUSBWriteMACRegister(pAdapter, TXRX_CSR2, 1);
RTUSBWriteMACRegister(pAdapter, MAC_CSR13, 0x1111);//requested by Jerry
RTUSBWriteMACRegister(pAdapter, MAC_CSR14, 0x1E11);
RTUSBWriteMACRegister(pAdapter, MAC_CSR1, 3); // reset MAC state machine, requested by Kevin 2003-2-11
RTUSBWriteMACRegister(pAdapter, MAC_CSR1, 0); // reset MAC state machine, requested by Kevin 2003-2-11
RTUSBWriteMACRegister(pAdapter, TXRX_CSR5, 0x8C8D);
RTUSBWriteMACRegister(pAdapter, TXRX_CSR6, 0x8B8A);
RTUSBWriteMACRegister(pAdapter, TXRX_CSR7, 0x8687);
RTUSBWriteMACRegister(pAdapter, TXRX_CSR8, 0x0085);
RTUSBWriteMACRegister(pAdapter, TXRX_CSR21, 0xe78f);
RTUSBWriteMACRegister(pAdapter, MAC_CSR9, 0xFF1D);
i = 0;
RTUSBReadMACRegister(pAdapter, MAC_CSR17, &temp);
while (((temp & 0x01e0 ) != 0x01e0) && (i < 50))
{
NdisMSleep(1000);
RTUSBReadMACRegister(pAdapter, MAC_CSR17, &temp);
i++;
}
if (i == 50)
{
if (RTUSB_ResetDevice(pAdapter) == FALSE)
{
//RTMP_SET_FLAG(pAdapter, fRTMP_ADAPTER_REMOVE_IN_PROGRESS);
DBGPRINT(RT_DEBUG_TRACE, "<== NICInitializeAsic ERROR\n");
return;
}
else
continue;
}
RTUSBWriteMACRegister(pAdapter, MAC_CSR1, 4);
RTUSBReadMACRegister(pAdapter, MAC_CSR0, &temp);
if ( temp >= 3){
RTUSBReadMACRegister(pAdapter, PHY_CSR2, &temp);
RTUSBWriteMACRegister(pAdapter, PHY_CSR2, temp & 0xFFFD);
}
else
{
DBGPRINT(RT_DEBUG_TRACE, "LNA 3 mode\n");
RTUSBWriteMACRegister(pAdapter, PHY_CSR2, 0x3002); // LNA 3 mode
}
RTUSBWriteMACRegister(pAdapter, MAC_CSR11, 2);
RTUSBWriteMACRegister(pAdapter, MAC_CSR22, 0x53);
RTUSBWriteMACRegister(pAdapter, MAC_CSR15, 0x01ee);
RTUSBWriteMACRegister(pAdapter, MAC_CSR16, 0);
RTUSBWriteMACRegister(pAdapter, MAC_CSR8, 0x0780);//steven:limit the maximum frame length
RTUSBReadMACRegister(pAdapter, TXRX_CSR0, &temp);
temp &= 0xe007;
temp |= ((LENGTH_802_11 << 3) | (0x000f << 9));
RTUSBWriteMACRegister(pAdapter, TXRX_CSR0, temp);
RTUSBWriteMACRegister(pAdapter, TXRX_CSR19, 0);
RTUSBWriteMACRegister(pAdapter, MAC_CSR18, 0x5a);
//set RF_LE to low when standby
RTUSBReadMACRegister(pAdapter, PHY_CSR4, &temp);
RTUSBWriteMACRegister(pAdapter, PHY_CSR4, temp | 1);
//NdisMSleep(1);//wait for PLL to become stable
i = 0;
do
{
RTUSBReadBBPRegister(pAdapter, BBP_Version, &Value);
DBGPRINT(RT_DEBUG_TRACE, "Read BBP_Version Value = %d\n", Value);
i++;
}while (((Value == 0xff) || (Value == 0x00)) && (i < 50));
if (i < 50)//BBP ready
{
break;
}
else
{
if ( RTUSB_ResetDevice(pAdapter) == FALSE)
{
RTMP_SET_FLAG(pAdapter, fRTMP_ADAPTER_REMOVE_IN_PROGRESS);
return;
}
}
}while (1);
// Initialize BBP register to default value
for (Index = 0; Index < NUM_BBP_REG_PARMS; Index++)
{
i = 0;
do
{
RTUSBReadMACRegister(pAdapter, PHY_CSR8, &temp);
if (!(temp & BUSY))
break;
i++;
}
while (i < RETRY_LIMIT);
RTUSBWriteMACRegister(pAdapter, PHY_CSR7, BBPRegTable[Index]);
}
// Initialize RF register to default value
AsicSwitchChannel(pAdapter, pAdapter->PortCfg.Channel);
AsicLockChannel(pAdapter, pAdapter->PortCfg.Channel);
// Add radio off control
if (pAdapter->PortCfg.bRadio == FALSE)
{
RTUSBWriteMACRegister(pAdapter, MAC_CSR13, 0);
RTUSBWriteMACRegister(pAdapter, MAC_CSR14, 0);
RTMP_SET_FLAG(pAdapter, fRTMP_ADAPTER_RADIO_OFF);
DBGPRINT(RT_DEBUG_ERROR, "1Set fRTMP_ADAPTER_RADIO_OFF ");
}
RTUSBMultiRead(pAdapter, STA_CSR0, buffer, 22);
DBGPRINT(RT_DEBUG_TRACE, "<-- NICInitializeAsic\n");
}
/*
========================================================================
Routine Description:
Reset NIC from error
Arguments:
Adapter Pointer to our adapter
Return Value:
None
IRQL = PASSIVE_LEVEL
Note:
Reset NIC from error state
========================================================================
*/
VOID NICResetFromError(
IN PRT2570ADAPTER pAdapter)
{
RT2570InitializeAsic(pAdapter);
#ifdef INIT_FROM_EEPROM
NICInitAsicFromEEPROM(pAdapter);
#endif
RTUSBWriteHWMACAddress(pAdapter);
// Switch to current channel, since during reset process, the connection should remains on.
AsicSwitchChannel(pAdapter, pAdapter->PortCfg.Channel);
AsicLockChannel(pAdapter, pAdapter->PortCfg.Channel);
}
/*
========================================================================
Routine Description:
Compare two memory block
Arguments:
Adapter Pointer to our adapter
Return Value:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -