📄 rtmp_init.c.bak
字号:
{ csr0.field.Ac0Txop = 192;//cpu2le16(192); // AC_VI: 192*32us ~= 6ms csr0.field.Ac1Txop = 96;//cpu2le16(96); // AC_VO: 96*32us ~= 3ms } else { csr0.field.Ac0Txop = 96;//cpu2le16(96); // AC_VI: 96*32us ~= 3ms csr0.field.Ac1Txop = 48;//cpu2le16(48); // AC_VO: 48*32us ~= 1.5ms } RTMP_IO_WRITE32(pAd, WMM_TXOP1_CFG, csr0.word); // 3. Set DMA global configuration except TX_DMA_EN and RX_DMA_EN bits: i = 0; do { RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word); if ((GloCfg.field.TxDMABusy == 0) && (GloCfg.field.RxDMABusy == 0)) break; RTMPusecDelay(1000); i++; }while ( i < 100); GloCfg.word &= 0xff0; GloCfg.field.EnTXWriteBackDDONE =1; RTMP_IO_WRITE32(pAd, WPDMA_GLO_CFG, GloCfg.word); IntCfg.word = 0; RTMP_IO_WRITE32(pAd, DELAY_INT_CFG, IntCfg.word); // reset action // Load firmware // Status = NICLoadFirmware(pAd); DBGPRINT(RT_DEBUG_TRACE, ("<-- NICInitializeAdapter\n")); return Status;}/* ======================================================================== Routine Description: Initialize ASIC Arguments: Adapter Pointer to our adapter Return Value: None IRQL = PASSIVE_LEVEL Note: ========================================================================*/VOID NICInitializeAsic( IN PRTMP_ADAPTER pAd, IN BOOLEAN bHardReset){ ULONG Index = 0, Counter; UCHAR R0 = 0xff; ULONG MacCsr12;// ULONG value; USHORT KeyIdx; INT i; DBGPRINT(RT_DEBUG_TRACE, ("--> NICInitializeAsic\n")); if (bHardReset == TRUE) { RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x3); } else RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x1); RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x0); // Initialize MAC register to default value for (Index = 0; Index < NUM_MAC_REG_PARMS; Index++) { RTMP_IO_WRITE32(pAd, MACRegTable[Index].Register, MACRegTable[Index].Value); } // // Before program BBP, we need to wait BBP/RF get wake up. // Index = 0; do { RTMP_IO_READ32(pAd, MAC_STATUS_CFG, &MacCsr12); if ((MacCsr12 & 0x03) == 0) // if BB.RF is stable break; DBGPRINT(RT_DEBUG_TRACE, ("Check MAC_STATUS_CFG = Busy = %lx\n", MacCsr12)); RTMPusecDelay(1000); } while (Index++ < 100); RTMP_IO_WRITE32(pAd, H2M_BBP_AGENT, 0); // initialize BBP R/W access agent RTMP_IO_WRITE32(pAd, H2M_MAILBOX_CSR, 0); // Read BBP register, make sure BBP is up and running before write new data Index = 0; do { RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R0, &R0); DBGPRINT(RT_DEBUG_TRACE, ("BBP version = %x\n", R0)); } while ((++Index < 20) && ((R0 == 0xff) || (R0 == 0x00))); //ASSERT(Index < 20); //this will cause BSOD on Check-build driver // Initialize BBP register to default value for (Index = 0; Index < NUM_BBP_REG_PARMS; Index++) { RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBPRegTable[Index].Register, BBPRegTable[Index].Value); } if (pAd->MACVersion == 0x28600100) { RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x16); RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x12); } // Add radio off control#ifdef CONFIG_STA_SUPPORT if (pAd->StaCfg.bRadio == FALSE) {// RTMP_IO_WRITE32(pAd, PWR_PIN_CFG, 0x00001818); RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF); DBGPRINT(RT_DEBUG_TRACE, ("Set Radio Off\n")); }#endif // CONFIG_STA_SUPPORT // // Clear raw counters RTMP_IO_READ32(pAd, RX_STA_CNT0, &Counter); RTMP_IO_READ32(pAd, RX_STA_CNT1, &Counter); RTMP_IO_READ32(pAd, RX_STA_CNT2, &Counter); RTMP_IO_READ32(pAd, TX_STA_CNT0, &Counter); RTMP_IO_READ32(pAd, TX_STA_CNT1, &Counter); RTMP_IO_READ32(pAd, TX_STA_CNT2, &Counter); // ASIC will keep garbage value after boot // Clear all seared key table when initial for (KeyIdx = 0; KeyIdx < 4; KeyIdx++) { RTMP_IO_WRITE32(pAd, SHARED_KEY_MODE_BASE + 4*KeyIdx, 0); } // Clear all pairwise key table when initial for (KeyIdx = 0; KeyIdx < 256; KeyIdx++) { RTMP_IO_WRITE32(pAd, MAC_WCID_ATTRIBUTE_BASE + (KeyIdx * HW_WCID_ATTRI_SIZE), 1); } // assert HOST ready bit// RTMP_IO_WRITE32(pAd, MAC_CSR1, 0x0); // 2004-09-14 asked by Mark// RTMP_IO_WRITE32(pAd, MAC_CSR1, 0x4); // clear all on-chip BEACON frame space for (i = 0; i < HW_BEACON_MAX_SIZE; i++) RTMP_IO_WRITE8(pAd, HW_BEACON_BASE0 + i, 0x00); DBGPRINT(RT_DEBUG_TRACE, ("<-- NICInitializeAsic\n"));}/* ======================================================================== Routine Description: Reset NIC Asics Arguments: Adapter Pointer to our adapter Return Value: None IRQL = PASSIVE_LEVEL Note: Reset NIC to initial state AS IS system boot up time. ========================================================================*/VOID NICIssueReset( IN PRTMP_ADAPTER pAd){ ULONG Value; DBGPRINT(RT_DEBUG_TRACE, ("--> NICIssueReset\n")); // Abort Tx, prevent ASIC from writing to Host memory //RTMP_IO_WRITE32(pAd, TX_CNTL_CSR, 0x001f0000); // Disable Rx, register value supposed will remain after reset RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value); Value &= (0xfffffff3); RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value); // Issue reset and clear from reset state RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x03); // 2004-09-17 change from 0x01 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x00); DBGPRINT(RT_DEBUG_TRACE, ("<-- NICIssueReset\n"));}/* ======================================================================== Routine Description: Check ASIC registers and find any reason the system might hang Arguments: Adapter Pointer to our adapter Return Value: None IRQL = DISPATCH_LEVEL ========================================================================*/BOOLEAN NICCheckForHang( IN PRTMP_ADAPTER pAd){ return (FALSE);}VOID NICUpdateFifoStaCounters( IN PRTMP_ADAPTER pAd){ TX_STA_FIFO_STRUC StaFifo; MAC_TABLE_ENTRY *pEntry; UCHAR i = 0; UCHAR pid = 0, wcid = 0; CHAR reTry; UCHAR succMCS; do { RTMP_IO_READ32(pAd, TX_STA_FIFO, &StaFifo.word); if (StaFifo.field.bValid == 0) break; wcid = (UCHAR)StaFifo.field.wcid; /* ignore NoACK and MGMT frame use 0xFF as WCID */ if ((StaFifo.field.TxAckRequired == 0) || (wcid >= MAX_LEN_OF_MAC_TABLE)) { i++; continue; } /* PID store Tx MCS Rate */ pid = (UCHAR)StaFifo.field.PidType; pEntry = &pAd->MacTab.Content[wcid]; pEntry->DebugFIFOCount++; if (!StaFifo.field.TxSuccess) { pEntry->FIFOCount++; pEntry->OneSecTxFailCount++; if (pEntry->FIFOCount >= 1) { DBGPRINT(RT_DEBUG_TRACE, ("#")); { int tid; for (tid=0; tid<8; tid++) { BAOriSessionTearDown(pAd, pEntry->Aid, tid, FALSE, FALSE); } } } //pEntry->bSendBAR = TRUE; } else { if (pEntry->NoBADataCountDown > 0) { pEntry->NoBADataCountDown--; if (pEntry->NoBADataCountDown==0) { DBGPRINT(RT_DEBUG_TRACE, ("@\n")); } } pEntry->FIFOCount = 0; pEntry->OneSecTxNoRetryOkCount++; // update NoDataIdleCount when sucessful send packet to STA. pEntry->NoDataIdleCount = 0; } succMCS = StaFifo.field.SuccessRate & 0x7F; reTry = pid - succMCS; if (StaFifo.field.TxSuccess) { pEntry->TXMCSExpected[pid]++; if (pid == succMCS) { pEntry->TXMCSSuccessful[pid]++; } else { pEntry->TXMCSAutoFallBack[pid][succMCS]++; } } else { pEntry->TXMCSFailed[pid]++; } if (reTry > 0) { if ((pid >= 12) && succMCS <=7) { reTry -= 4; } pEntry->OneSecTxRetryOkCount += reTry; } else if (reTry < 0) { DBGPRINT(RT_DEBUG_INFO, ("(%d): reTry %d , (TxMCS = %d, SuccessRate = %d)\n", wcid, reTry, pid, StaFifo.field.SuccessRate & 0x7F)); } i++; // ASIC store 16 stack } while ( i < (2*TX_RING_SIZE) );}/* ======================================================================== 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 IRQL = DISPATCH_LEVEL ========================================================================*/VOID NICUpdateRawCounters( IN PRTMP_ADAPTER pAd){ ULONG OldValue, Value2, PageSum, OneSecTransmitCount; ULONG TxErrorRatio, Retry, Fail; RX_STA_CNT0_STRUC RxStaCnt0; RX_STA_CNT1_STRUC RxStaCnt1; RX_STA_CNT2_STRUC RxStaCnt2; TX_STA_CNT0_STRUC TxStaCnt0; TX_STA_CNT1_STRUC StaTx1; TX_STA_CNT2_STRUC StaTx2; TX_AGG_CNT_STRUC TxAggCnt; TX_AGG_CNT0_STRUC TxAggCnt0; TX_AGG_CNT1_STRUC TxAggCnt1; TX_AGG_CNT2_STRUC TxAggCnt2; TX_AGG_CNT3_STRUC TxAggCnt3; TX_AGG_CNT4_STRUC TxAggCnt4; TX_AGG_CNT5_STRUC TxAggCnt5; TX_AGG_CNT6_STRUC TxAggCnt6; TX_AGG_CNT7_STRUC TxAggCnt7;//==================================================================//Read PBF for emulation debug. RTMP_IO_READ32(pAd, PBF_DBG, &OldValue); RTMP_IO_READ32(pAd, TXRXQ_PCNT, &Value2); PageSum = (OldValue&0xff); PageSum += ((Value2&0xff)); PageSum += ((Value2&0xff00)>>8); PageSum += ((Value2&0xff0000)>>16); PageSum += ((Value2&0xff000000)>>24); //================================================================== RTMP_IO_READ32(pAd, RX_STA_CNT0, &RxStaCnt0.word); RTMP_IO_READ32(pAd, RX_STA_CNT2, &RxStaCnt2.word); { RTMP_IO_READ32(pAd, RX_STA_CNT1, &RxStaCnt1.word); // Update RX PLCP error counter pAd->PrivateInfo.PhyRxErrCnt += RxStaCnt1.field.PlcpErr; // Update False CCA counter pAd->RalinkCounters.OneSecFalseCCACnt += RxStaCnt1.field.FalseCca; } // Update FCS counters OldValue= pAd->WlanCounters.FCSErrorCount.u.LowPart; pAd->WlanCounters.FCSErrorCount.u.LowPart += (RxStaCnt0.field.CrcErr); // >> 7); if (pAd->WlanCounters.FCSErrorCount.u.LowPart < OldValue) pAd->WlanCounters.FCSErrorCount.u.HighPart++; // Add FCS error count to private counters pAd->RalinkCounters.OneSecRxFcsErrCnt += RxStaCnt0.field.CrcErr; OldValue = pAd->RalinkCounters.RealFcsErrCount.u.LowPart; pAd->RalinkCounters.RealFcsErrCount.u.LowPart += RxStaCnt0.field.CrcErr; if (pAd->RalinkCounters.RealFcsErrCount.u.LowPart < OldValue) pAd->RalinkCounters.RealFcsErrCount.u.HighPart++; // Update Duplicate Rcv check pAd->RalinkCounters.DuplicateRcv += RxStaCnt2.field.RxDupliCount; pAd->WlanCounters.FrameDuplicateCount.u.LowPart += RxStaCnt2.field.RxDupliCount; // Update RX Overflow counter pAd->Counters8023.RxNoBuffer += (RxStaCnt2.field.RxFifoOverflowCount); // Update BEACON sent count RTMP_IO_READ32(pAd, TX_STA_CNT0, &TxStaCnt0.word); RTMP_IO_READ32(pAd, TX_STA_CNT1, &StaTx1.word); RTMP_IO_READ32(pAd, TX_STA_CNT2, &StaTx2.word); pAd->RalinkCounters.OneSecBeaconSentCnt += TxStaCnt0.field.TxBeaconCount; pAd->RalinkCounters.OneSecTxRetryOkCount += StaTx1.field.TxRetransmit; pAd->RalinkCounters.OneSecTxNoRetryOkCount += StaTx1.field.TxSuccess; pAd->RalinkCounters.OneSecTxFailCount += TxStaCnt0.field.TxFailCount; pAd->WlanCounters.TransmittedFragmentCount.u.LowPart += StaTx1.field.TxSuccess; pAd->WlanCounters.RetryCount.u.LowPart += StaTx1.field.TxRetransmit; pAd->WlanCounters.FailedCount.u.LowPart += TxStaCnt0.field.TxFailCount;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -