📄 rtmp_init.c
字号:
pAd->TssiPlusBoundaryA[1], pAd->TssiPlusBoundaryA[2], pAd->TssiPlusBoundaryA[3], pAd->TssiPlusBoundaryA[4], 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); } } #ifdef BIG_ENDIAN Antenna.word = SWAP16(pAd->EEPROMDefaultValue[0]);#else Antenna.word = pAd->EEPROMDefaultValue[0];#endif 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) || (pAd->RfIcType == RFIC_3020)) { 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); } #ifdef BIG_ENDIAN NicConfig2.word = SWAP16(pAd->EEPROMDefaultValue[1]);#else NicConfig2.word = pAd->EEPROMDefaultValue[1];#endif 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) pAd->WlanCounters.FCSErrorCount.vv.HighPart++; // Add FCS error count to private counters OldValue = pAd->RalinkCounters.RealFcsErrCount.vv.LowPart; pAd->RalinkCounters.RealFcsErrCount.vv.LowPart += StaCsr0.field.CrcErr; if (pAd->RalinkCounters.RealFcsErrCount.vv.LowPart < OldValue) pAd->RalinkCounters.RealFcsErrCount.vv.HighPart++; // Update False CCA counter RTUSBReadMACRegister(pAd, STA_CSR1, &StaCsr1.word); pAd->RalinkCounters.OneSecFalseCCACnt += StaCsr1.field.FalseCca; // Update RX Overflow counter RTUSBReadMACRegister(pAd, STA_CSR2, &StaCsr2.word); pAd->Counters8023.RxNoBuffer += (StaCsr2.field.RxOverflowCount + StaCsr2.field.RxFifoOverflowCount); // Update BEACON sent count RTUSBReadMACRegister(pAd, STA_CSR3, &StaCsr3.word); pAd->RalinkCounters.OneSecBeaconSentCnt += StaCsr3.field.TxBeaconCount; RTUSBReadMACRegister(pAd, STA_CSR4, &StaCsr4.word); RTUSBReadMACRegister(pAd, STA_CSR5, &StaCsr5.word); // 1st - Transmit Success OldValue = pAd->WlanCounters.TransmittedFragmentCount.vv.LowPart;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -