?? rtmp_init.c
字號:
RTUSBReadEEPROM(pAd, EEPROM_BBP_BASE_OFFSET, (PUCHAR)(pAd->EEPROMDefaultValue), 2 * NUM_EEPROM_BBP_PARMS); // Bit of a swag, here - bb for (i = 0; i < NUM_EEPROM_BBP_PARMS; i++) { pAd->EEPROMDefaultValue[i] = le16_to_cpu(pAd->EEPROMDefaultValue[i]); } // We have to parse NIC configuration 0 at here. // If TSSI did not have preloaded value, it should reset TxAutoAgc to false // Therefore, we have to read TxAutoAgc control beforehand. // Read Tx AGC control bit Antenna.word = pAd->EEPROMDefaultValue[0]; if (Antenna.field.DynamicTxAgcControl == 1) pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = TRUE; else pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = FALSE; // // Reset PhyMode if we don't support 802.11a // if ((pAd->PortCfg.PhyMode == PHY_11ABG_MIXED) || (pAd->PortCfg.PhyMode == PHY_11A)) { // // Only RFIC_5226, RFIC_5225 suport 11a // if ((Antenna.field.RfIcType == RFIC_2528) || (Antenna.field.RfIcType == RFIC_2527)) pAd->PortCfg.PhyMode = PHY_11BG_MIXED; // // Reset Adhoc Mode if we don't support 802.11a // if ((pAd->PortCfg.AdhocMode == ADHOC_11A) || (pAd->PortCfg.AdhocMode == ADHOC_11ABG_MIXED)) { // // Only RFIC_5226, RFIC_5225 suport 11a // if ((Antenna.field.RfIcType == RFIC_2528) || (Antenna.field.RfIcType == RFIC_2527)) pAd->PortCfg.AdhocMode = ADHOC_11BG_MIXED; } } // Read Tx power value for all 14 channels // Value from 1 - 0x7f. Default value is 24. // 0. 11b/g // Power value 0xFA (-6) ~ 0x24 (36) RTUSBReadEEPROM(pAd, EEPROM_G_TX_PWR_OFFSET, ChannelTxPower, 2 * NUM_EEPROM_TX_G_PARMS); for (i = 0; i < 2 * NUM_EEPROM_TX_G_PARMS; i++) { if ((ChannelTxPower[i] > 36) || (ChannelTxPower[i] < -6)) pAd->TxPower[i].Power = 24; else pAd->TxPower[i].Power = ChannelTxPower[i]; DBGPRINT(RT_DEBUG_INFO, "Tx power for channel %d : 0x%02x\n", pAd->TxPower[i].Channel, (UCHAR)(pAd->TxPower[i].Power)); } // 1. UNI 36 - 64, HipperLAN 2 100 - 140, UNI 140 - 165 // Power value 0xFA (-6) ~ 0x24 (36) RTUSBReadEEPROM(pAd, EEPROM_A_TX_PWR_OFFSET, ChannelTxPower, MAX_NUM_OF_A_CHANNELS); for (i = 0; i < MAX_NUM_OF_A_CHANNELS; i++) { if ((ChannelTxPower[i] > 36) || (ChannelTxPower[i] < -6)) pAd->TxPower[i + 14].Power = 24; else pAd->TxPower[i + 14].Power = ChannelTxPower[i]; DBGPRINT(RT_DEBUG_INFO, "Tx power for channel %d : 0x%02x\n", pAd->TxPower[i + 14].Channel, (UCHAR)(pAd->TxPower[i + 14].Power)); } // // we must skip frist value, so we get TxPower as ChannelTxPower[i + 1]; // because the TxPower was stored from 0x7D, but we need to read EEPROM // from 0x7C. (Word alignment) // // for J52, 34/38/42/46 RTUSBReadEEPROM(pAd, EEPROM_J52_TX_PWR_OFFSET, ChannelTxPower, 6); //must Read even valuse for (i = 0; i < 4; i++) { ASSERT(pAd->TxPower[J52_CHANNEL_START_OFFSET + i].Channel == 34 + i * 4); if ((ChannelTxPower[i] > 36) || (ChannelTxPower[i] < -6)) pAd->TxPower[J52_CHANNEL_START_OFFSET + i].Power = 24; else pAd->TxPower[J52_CHANNEL_START_OFFSET + i].Power = ChannelTxPower[i + 1]; DBGPRINT(RT_DEBUG_INFO, "Tx power for channel %d : 0x%02x\n", pAd->TxPower[J52_CHANNEL_START_OFFSET + i].Channel, (UCHAR)pAd->TxPower[J52_CHANNEL_START_OFFSET + i].Power); } // Read TSSI reference and TSSI boundary for temperature compensation. // 0. 11b/g { RTUSBReadEEPROM(pAd, EEPROM_BG_TSSI_CALIBRAION, ChannelTxPower, 10); pAd->TssiMinusBoundaryG[4] = ChannelTxPower[0]; pAd->TssiMinusBoundaryG[3] = ChannelTxPower[1]; pAd->TssiMinusBoundaryG[2] = ChannelTxPower[2]; pAd->TssiMinusBoundaryG[1] = ChannelTxPower[3]; pAd->TssiPlusBoundaryG[1] = ChannelTxPower[4]; pAd->TssiPlusBoundaryG[2] = ChannelTxPower[5]; pAd->TssiPlusBoundaryG[3] = ChannelTxPower[6]; pAd->TssiPlusBoundaryG[4] = ChannelTxPower[7]; pAd->TssiRefG = ChannelTxPower[8]; pAd->TxAgcStepG = ChannelTxPower[9]; pAd->TxAgcCompensateG = 0; pAd->TssiMinusBoundaryG[0] = pAd->TssiRefG; pAd->TssiPlusBoundaryG[0] = pAd->TssiRefG; // Disable TxAgc if the based value is not right if (pAd->TssiRefG == 0xff) pAd->bAutoTxAgcG = FALSE; DBGPRINT(RT_DEBUG_INFO,"E2PROM: G Tssi[-4 .. +4] = %d %d %d %d - %d -%d %d %d %d, step=%d, tuning=%d\n", pAd->TssiMinusBoundaryG[4], pAd->TssiMinusBoundaryG[3], pAd->TssiMinusBoundaryG[2], pAd->TssiMinusBoundaryG[1], pAd->TssiRefG, pAd->TssiPlusBoundaryG[1], pAd->TssiPlusBoundaryG[2], pAd->TssiPlusBoundaryG[3], pAd->TssiPlusBoundaryG[4], pAd->TxAgcStepG, pAd->bAutoTxAgcG); } // 1. 11a { RTUSBReadEEPROM(pAd, EEPROM_A_TSSI_CALIBRAION, ChannelTxPower, 10); pAd->TssiMinusBoundaryA[4] = ChannelTxPower[0]; pAd->TssiMinusBoundaryA[3] = ChannelTxPower[1]; pAd->TssiMinusBoundaryA[2] = ChannelTxPower[2]; pAd->TssiMinusBoundaryA[1] = ChannelTxPower[3]; pAd->TssiPlusBoundaryA[1] = ChannelTxPower[4]; pAd->TssiPlusBoundaryA[2] = ChannelTxPower[5]; pAd->TssiPlusBoundaryA[3] = ChannelTxPower[6]; pAd->TssiPlusBoundaryA[4] = ChannelTxPower[7]; pAd->TssiRefA = ChannelTxPower[8]; pAd->TxAgcStepA = ChannelTxPower[9]; pAd->TxAgcCompensateA = 0; pAd->TssiMinusBoundaryA[0] = pAd->TssiRefA; pAd->TssiPlusBoundaryA[0] = pAd->TssiRefA; // Disable TxAgc if the based value is not right if (pAd->TssiRefA == 0xff) pAd->bAutoTxAgcA = FALSE; DBGPRINT(RT_DEBUG_INFO,"E2PROM: A Tssi[-4 .. +4] = %d %d %d %d - %d -%d %d %d %d, step=%d, tuning=%d\n", pAd->TssiMinusBoundaryA[4], pAd->TssiMinusBoundaryA[3], pAd->TssiMinusBoundaryA[2], pAd->TssiMinusBoundaryA[1], pAd->TssiRefA, 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); value = le16_to_cpu(value); DBGPRINT(RT_DEBUG_INFO, "E2PROM[EEPROM_FREQ_OFFSET]=0x%04x\n", value); 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; // n.b. already flipped - bb 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); value = le16_to_cpu(value); DBGPRINT(RT_DEBUG_INFO, "E2PROM[EEPROM_RSSI_BG_OFFSET]=0x%04x\n", value); 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); value = le16_to_cpu(value); DBGPRINT(RT_DEBUG_INFO, "E2PROM[EEPROM_RSSI_A_OFFSET]=0x%04x\n", value); 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); DBGPRINT(RT_DEBUG_INFO, "E2PROM[EEPROM_LED_OFFSET]=0x%04x\n", LedSetting.word); LedSetting.word = le16_to_cpu(LedSetting.word); 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 = le16_to_cpu(value); DBGPRINT(RT_DEBUG_INFO, "E2PROM[EEPROM_TXPOWER_DELTA_OFFSET]=0x%04x\n", value); 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; RTUSBReadMACRegister(pAd, MAC_CSR0, &Version); DBGPRINT(RT_DEBUG_TRACE, "--> NICInitializeAsic ASIC Ver 0x%x\n", 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);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -