📄 rtmp_init.c
字号:
Arguments: Adapter Pointer to our adapter Return Value: None IRQL = PASSIVE_LEVEL Note: ========================================================================*/VOID NICReadEEPROMParameters( IN PRTMP_ADAPTER pAd){ ULONG data, Adata40M, Gdata40M; USHORT i, value, value2; INT Apwrdelta, Gpwrdelta; BOOLEAN bApwrdeltaMinus = FALSE, bGpwrdeltaMinus = FALSE; UCHAR TmpPhy; EEPROM_TX_PWR_STRUC Power; EEPROM_VERSION_STRUC Version; EEPROM_ANTENNA_STRUC Antenna; EEPROM_NIC_CONFIG2_STRUC NicConfig2; UCHAR t1,t2,t3,t4;//#ifdef WIFI_TEST ULONG default_tx_power = 0x66666666;//#endif // WIFI_TEST // DBGPRINT(RT_DEBUG_TRACE, ("--> NICReadEEPROMParameters\n")); // Init EEPROM Address Number, before access EEPROM; if 93c46, EEPROMAddressNum=6, else if 93c66, EEPROMAddressNum=8 RTMP_IO_READ32(pAd, E2PROM_CSR, &data); DBGPRINT(RT_DEBUG_TRACE, ("--> E2PROM_CSR = 0x%lx\n", data)); if((data & 0x30) == 0) pAd->EEPROMAddressNum = 6; // 93C46 else if((data & 0x30) == 0x10) pAd->EEPROMAddressNum = 8; // 93C66 else pAd->EEPROMAddressNum = 8; // 93C86 DBGPRINT(RT_DEBUG_TRACE, ("--> EEPROMAddressNum = %d\n", pAd->EEPROMAddressNum )); // RT2860 MAC no longer auto load MAC address from E2PROM. Driver has to intialize // MAC address registers according to E2PROM setting { USHORT Addr01,Addr23,Addr45 ; Addr01=RTMP_EEPROM_READ16(pAd, 0x04); Addr23=RTMP_EEPROM_READ16(pAd, 0x06); Addr45=RTMP_EEPROM_READ16(pAd, 0x08); pAd->PermanentAddress[0] = (UCHAR)(Addr01 & 0xff); pAd->PermanentAddress[1] = (UCHAR)(Addr01 >> 8); pAd->PermanentAddress[2] = (UCHAR)(Addr23 & 0xff); pAd->PermanentAddress[3] = (UCHAR)(Addr23 >> 8); pAd->PermanentAddress[4] = (UCHAR)(Addr45 & 0xff); pAd->PermanentAddress[5] = (UCHAR)(Addr45 >> 8); //more conveninet to test mbssid, so ap's bssid &0xf1 if (pAd->PermanentAddress[0] == 0xff) pAd->PermanentAddress[0] = RandomByte(pAd)&0xf8; //if (pAd->PermanentAddress[5] == 0xff) // pAd->PermanentAddress[5] = RandomByte(pAd)&0xf8; DBGPRINT_RAW(RT_DEBUG_TRACE,("E2PROM MAC: =%02x:%02x:%02x:%02x:%02x:%02x\n", pAd->PermanentAddress[0], pAd->PermanentAddress[1], pAd->PermanentAddress[2], pAd->PermanentAddress[3], pAd->PermanentAddress[4], pAd->PermanentAddress[5])); if (pAd->bLocalAdminMAC == FALSE) { MAC_DW0_STRUC csr2; MAC_DW1_STRUC csr3; COPY_MAC_ADDR(pAd->CurrentAddress, pAd->PermanentAddress); csr2.field.Byte0 = pAd->CurrentAddress[0]; csr2.field.Byte1 = pAd->CurrentAddress[1]; csr2.field.Byte2 = pAd->CurrentAddress[2]; csr2.field.Byte3 = pAd->CurrentAddress[3]; RTMP_IO_WRITE32(pAd, MAC_ADDR_DW0, csr2.word); csr3.word = 0; csr3.field.Byte4 = pAd->CurrentAddress[4]; csr3.field.Byte5 = pAd->CurrentAddress[5]; csr3.field.U2MeMask = 0xff; RTMP_IO_WRITE32(pAd, MAC_ADDR_DW1, csr3.word); DBGPRINT_RAW(RT_DEBUG_TRACE,("E2PROM MAC: =%02x:%02x:%02x:%02x:%02x:%02x\n", pAd->PermanentAddress[0], pAd->PermanentAddress[1], pAd->PermanentAddress[2], pAd->PermanentAddress[3], pAd->PermanentAddress[4], pAd->PermanentAddress[5])); } } // if not return early. cause fail at emulation. // Init the channel number for TX channel power RTMPReadChannelPwr(pAd); // if E2PROM version mismatch with driver's expectation, then skip // all subsequent E2RPOM retieval and set a system error bit to notify GUI Version.word = RTMP_EEPROM_READ16(pAd, EEPROM_VERSION_OFFSET); pAd->EepromVersion = Version.field.Version + Version.field.FaeReleaseNumber * 256; DBGPRINT(RT_DEBUG_TRACE, ("E2PROM: Version = %d, FAE release #%d\n", Version.field.Version, Version.field.FaeReleaseNumber)); if (Version.field.Version > VALID_EEPROM_VERSION) { DBGPRINT_ERR(("E2PROM: WRONG VERSION 0x%x, should be %d\n",Version.field.Version, VALID_EEPROM_VERSION)); /*pAd->SystemErrorBitmap |= 0x00000001; // hard-code default value when no proper E2PROM installed pAd->bAutoTxAgcA = FALSE; pAd->bAutoTxAgcG = FALSE; // Default the channel power for (i = 0; i < MAX_NUM_OF_CHANNELS; i++) pAd->TxPower[i].Power = DEFAULT_RF_TX_POWER; // Default the channel power for (i = 0; i < MAX_NUM_OF_11JCHANNELS; i++) pAd->TxPower11J[i].Power = DEFAULT_RF_TX_POWER; for(i = 0; i < NUM_EEPROM_BBP_PARMS; i++) pAd->EEPROMDefaultValue[i] = 0xffff; return; */ } // Read BBP default value from EEPROM and store to array(EEPROMDefaultValue) in pAd value = RTMP_EEPROM_READ16(pAd, EEPROM_NIC1_OFFSET); pAd->EEPROMDefaultValue[0] = value; value = RTMP_EEPROM_READ16(pAd, EEPROM_NIC2_OFFSET); pAd->EEPROMDefaultValue[1] = value; value = RTMP_EEPROM_READ16(pAd, 0x38); // Country Region pAd->EEPROMDefaultValue[2] = value; for(i = 0; i < 8; i++) { value = RTMP_EEPROM_READ16(pAd, EEPROM_BBP_BASE_OFFSET + i*2); pAd->EEPROMDefaultValue[i+3] = value; } // We have to parse NIC configuration 0 at here. // If TSSI did not have preloaded value, it should reset the TxAutoAgc to false // Therefore, we have to read TxAutoAgc control beforehand. // Read Tx AGC control bit Antenna.word = pAd->EEPROMDefaultValue[0]; if (Antenna.word == 0xFFFF) { Antenna.word = 0; Antenna.field.RfIcType = RFIC_2820; Antenna.field.TxPath = 1; Antenna.field.RxPath = 2; DBGPRINT(RT_DEBUG_WARN, ("E2PROM error, hard code as 0x%04x\n", Antenna.word)); } // Choose the desired Tx&Rx stream. if ((pAd->CommonCfg.TxStream == 0) || (pAd->CommonCfg.TxStream > Antenna.field.TxPath)) pAd->CommonCfg.TxStream = Antenna.field.TxPath; if ((pAd->CommonCfg.RxStream == 0) || (pAd->CommonCfg.RxStream > Antenna.field.RxPath)) pAd->CommonCfg.RxStream = Antenna.field.RxPath; NicConfig2.word = pAd->EEPROMDefaultValue[1];#ifdef CONFIG_STA_SUPPORT NicConfig2.word = 0; if ((NicConfig2.word & 0x00ff) == 0xff) { NicConfig2.word &= 0xff00; } if ((NicConfig2.word >> 8) == 0xff) { NicConfig2.word &= 0x00ff; }#endif // CONFIG_STA_SUPPORT // if (NicConfig2.field.DynamicTxAgcControl == 1) pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = TRUE; else pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = FALSE; DBGPRINT_RAW(RT_DEBUG_TRACE, ("NICReadEEPROMParameters: RxPath = %d, TxPath = %d\n", Antenna.field.RxPath, Antenna.field.TxPath)); // Save the antenna for future use pAd->Antenna.word = Antenna.word; // // Reset PhyMode if we don't support 802.11a // if ((pAd->CommonCfg.PhyMode == PHY_11ABG_MIXED) || (pAd->CommonCfg.PhyMode == PHY_11ABGN_MIXED) || (pAd->CommonCfg.PhyMode == PHY_11A) || (pAd->CommonCfg.PhyMode == PHY_11AN_MIXED) || (pAd->CommonCfg.PhyMode == PHY_11AGN_MIXED)) { // // Only RFIC_2850 & RFIC_2750 support 802.11a // if ((Antenna.field.RfIcType != RFIC_2850) && (Antenna.field.RfIcType != RFIC_2750)) pAd->CommonCfg.PhyMode = PHY_11BGN_MIXED; } // Read TSSI reference and TSSI boundary for temperature compensation. This is ugly // 0. 11b/g { /* these are tempature reference value (0x00 ~ 0xFE) ex: 0x00 0x15 0x25 0x45 0x88 0xA0 0xB5 0xD0 0xF0 TssiPlusBoundaryG [4] [3] [2] [1] [0] (smaller) + TssiMinusBoundaryG[0] [1] [2] [3] [4] (larger) */ Power.word = RTMP_EEPROM_READ16(pAd, 0x6E); pAd->TssiMinusBoundaryG[4] = Power.field.Byte0; pAd->TssiMinusBoundaryG[3] = Power.field.Byte1; Power.word = RTMP_EEPROM_READ16(pAd, 0x70); pAd->TssiMinusBoundaryG[2] = Power.field.Byte0; pAd->TssiMinusBoundaryG[1] = Power.field.Byte1; Power.word = RTMP_EEPROM_READ16(pAd, 0x72); pAd->TssiRefG = Power.field.Byte0; /* reference value [0] */ pAd->TssiPlusBoundaryG[1] = Power.field.Byte1; Power.word = RTMP_EEPROM_READ16(pAd, 0x74); pAd->TssiPlusBoundaryG[2] = Power.field.Byte0; pAd->TssiPlusBoundaryG[3] = Power.field.Byte1; Power.word = RTMP_EEPROM_READ16(pAd, 0x76); pAd->TssiPlusBoundaryG[4] = Power.field.Byte0; pAd->TxAgcStepG = Power.field.Byte1; 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_TRACE,("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 { Power.word = RTMP_EEPROM_READ16(pAd, 0xD4); pAd->TssiMinusBoundaryA[4] = Power.field.Byte0; pAd->TssiMinusBoundaryA[3] = Power.field.Byte1; Power.word = RTMP_EEPROM_READ16(pAd, 0xD6); pAd->TssiMinusBoundaryA[2] = Power.field.Byte0; pAd->TssiMinusBoundaryA[1] = Power.field.Byte1; Power.word = RTMP_EEPROM_READ16(pAd, 0xD8); pAd->TssiRefA = Power.field.Byte0; pAd->TssiPlusBoundaryA[1] = Power.field.Byte1; Power.word = RTMP_EEPROM_READ16(pAd, 0xDA); pAd->TssiPlusBoundaryA[2] = Power.field.Byte0; pAd->TssiPlusBoundaryA[3] = Power.field.Byte1; Power.word = RTMP_EEPROM_READ16(pAd, 0xDC); pAd->TssiPlusBoundaryA[4] = Power.field.Byte0; pAd->TxAgcStepA = Power.field.Byte1; 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_TRACE,("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 = 0x0; // Read frequency offset setting for RF value = RTMP_EEPROM_READ16(pAd, EEPROM_FREQ_OFFSET); if ((value & 0x00FF) != 0x00FF) pAd->RfFreqOffset = (ULONG) (value & 0x00FF); else pAd->RfFreqOffset = 0; DBGPRINT(RT_DEBUG_TRACE, ("E2PROM: RF FreqOffset=0x%lx \n", pAd->RfFreqOffset)); //CountryRegion byte offset = 0x25 value = pAd->EEPROMDefaultValue[2] >> 8; value2 = pAd->EEPROMDefaultValue[2] & 0x00FF; if ((value <= 6) && (value2 <= 8)) { pAd->CommonCfg.CountryRegion = ((UCHAR) value) | 0x80; pAd->CommonCfg.CountryRegionForABand = ((UCHAR) value2) | 0x80; TmpPhy = pAd->CommonCfg.PhyMode; pAd->CommonCfg.PhyMode = 0xff; RTMPSetPhyMode(pAd, TmpPhy); } // // Get RSSI Offset on EEPROM 0x9Ah & 0x9Ch. // The valid value are (-10 ~ 10) // value = RTMP_EEPROM_READ16(pAd, EEPROM_RSSI_BG_OFFSET); pAd->BGRssiOffset0 = value & 0x00ff; pAd->BGRssiOffset1 = (value >> 8); value = RTMP_EEPROM_READ16(pAd, EEPROM_RSSI_BG_OFFSET+2); pAd->BGRssiOffset2 = value & 0x00ff; pAd->ALNAGain1 = (value >> 8); value = RTMP_EEPROM_READ16(pAd, EEPROM_LNA_OFFSET); pAd->BLNAGain = value & 0x00ff; pAd->ALNAGain0 = (value >> 8); #ifdef RALINK_ATE if (pAd->ate.Mode != ATE_STOP) { pAd->ALNAGain = (value >> 8); }#endif // RALINK_ATE // // Validate 11b/g RSSI_0 offset. if ((pAd->BGRssiOffset0 < -10) || (pAd->BGRssiOffset0 > 10)) pAd->BGRssiOffset0 = 0; // 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; value = RTMP_EEPROM_READ16(pAd, EEPROM_RSSI_A_OFFSET); pAd->ARssiOffset0 = value & 0x00ff; pAd->ARssiOffset1 = (value >> 8); value = RTMP_EEPROM_READ16(pAd, (EEPROM_RSSI_A_OFFSET+2)); pAd->ARssiOffset2 = value & 0x00ff; pAd->ALNAGain2 = (value >> 8); if (((UCHAR)pAd->ALNAGain1 == 0xFF) || (pAd->ALNAGain1 == 0x00)) pAd->ALNAGain1 = pAd->ALNAGain0; if (((UCHAR)pAd->ALNAGain2 == 0xFF) || (pAd->ALNAGain2 == 0x00)) pAd->ALNAGain2 = pAd->ALNAGain0; // Validate 11a RSSI_0 offset. if ((pAd->ARssiOffset0 < -10) || (pAd->ARssiOffset0 > 10)) pAd->ARssiOffset0 = 0; // 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. // value = RTMP_EEPROM_READ16(pAd, 0x3a); pAd->LedCntl.word = (value&0xff00) >> 8; value = RTMP_EEPROM_READ16(pAd, EEPROM_LED1_OFFSET); pAd->Led1 = value; value = RTMP_EEPROM_READ16(pAd, EEPROM_LED2_OFFSET); pAd->Led2 = value; value = RTMP_EEPROM_READ16(pAd, EEPROM_LED3_OFFSET); pAd->Led3 = value; // // Get Txpower per Rate & power delta for 40MHz. // DBGPRINT(RT_DEBUG_TRACE, ("Txpower per Rate\n")); /* default tx power = 0x66666666, 0x66666666, 0x66666666, 0x66666666, 0x66666666 adjust delta power based on reference tempature = 0x66666666, 0x77776666, 0x77775566, 0x66665566, 0xffff6666, only 11N rate is adjusted */ value2 = RTMP_EEPROM_READ16(pAd, EEPROM_TXPOWER_DELTA); 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)); for (i=0; i<5; i++) { value = RTMP_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE + i*4); 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)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -