📄 rt_ate.c
字号:
1. ATESTOP = Stop ATE Mode 2. TXCONT = Continuous Transmit 3. TXCARR = Transmit Carrier 4. TXFRAME = Transmit Frames 5. RXFRAME = Receive Frames Return: TRUE if all parameters are OK, FALSE otherwise ==========================================================================*/static inline INT set_ate_proc_inline( IN PRTMP_ADAPTER pAd, IN PUCHAR arg){ UINT32 Value; UCHAR BbpData; UINT32 MacData; PTXD_STRUC pTxD; UINT i, atemode; PRTMP_TX_RING pTxRing = &pAd->TxRing[QID_AC_BE]; NDIS_STATUS Status = NDIS_STATUS_SUCCESS;#ifdef BIG_ENDIAN PTXD_STRUC pDestTxD; TXD_STRUC TxD;#endif DBGPRINT(RT_DEBUG_TRACE, ("===> set_ate_proc_inline()\n")); ATEAsicSwitchChannel(pAd); AsicLockChannel(pAd, pAd->ate.Channel); RTMPusecDelay(5000); if (pAd->ate.Mode == ATE_STOP) { RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R22, &BbpData); } else { ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R22, &BbpData); } // read PHY_CSR1 and backup MAC_SYS_CTRL value. RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData); BbpData = 0; MacData &= 0xFFFFFFEF; // clean bit4, continuous Tx production test. if (!strcmp(arg, "ATESTART")) { DBGPRINT(RT_DEBUG_TRACE, ("ATE: ATESTART\n")); // check if we have removed the firmware if (pAd->ate.Mode == ATE_STOP) { NICEraseFirmware(pAd); } atemode = pAd->ate.Mode; pAd->ate.Mode = ATE_START; pAd->ate.TxDoneCount = pAd->ate.TxCount; RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData); if (atemode & ATE_TXCARR) { // No Carrier Test set BBP R22 bit7=0, bit6=0, bit[5~0]=0x0 ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R22, &BbpData); BbpData &= 0xFFFFFF00; //clear bit7, bit6, bit[5~0] ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData); } else if (atemode & ATE_TXCARRSUPP) { // No Cont. TX set BBP R22 bit7=0 ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R22, &BbpData); BbpData &= ~(1 << 7); //set bit7=0 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData); // No Carrier Suppression set BBP R24 bit0=0 ATE_BBP_IO_READ8_BY_REG_ID(pAd, 24, &BbpData); BbpData &= 0xFFFFFFFE; //clear bit0 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, 24, BbpData); } // We should free some resource which allocate when ATE_TXFRAME , ATE_STOP, and ATE_TXCONT. // TODO:Should we free some resource which was allocated when LoopBack and ATE_STOP ? else if ((atemode & ATE_TXFRAME) || (atemode == ATE_STOP)) { PRTMP_TX_RING pTxRing = &pAd->TxRing[QID_AC_BE]; if (atemode & ATE_TXCONT) { // No Cont. TX set BBP R22 bit7=0 ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R22, &BbpData); BbpData &= ~(1 << 7); //set bit7=0 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData); } // Abort Tx, RX DMA. RtmpDmaEnable(pAd, 0); for (i=0; i<TX_RING_SIZE; i++) { PNDIS_PACKET pPacket;#ifndef BIG_ENDIAN pTxD = (PTXD_STRUC)pAd->TxRing[QID_AC_BE].Cell[i].AllocVa;#else pDestTxD = (PTXD_STRUC)pAd->TxRing[QID_AC_BE].Cell[i].AllocVa; TxD = *pDestTxD; pTxD = &TxD; RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD);#endif pTxD->DMADONE = 0; pPacket = pTxRing->Cell[i].pNdisPacket; if (pPacket) { PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr0, pTxD->SDLen0, PCI_DMA_TODEVICE); RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_SUCCESS); } //Always assign pNdisPacket as NULL after clear pTxRing->Cell[i].pNdisPacket = NULL; pPacket = pTxRing->Cell[i].pNextNdisPacket; if (pPacket) { PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr1, pTxD->SDLen1, PCI_DMA_TODEVICE); RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_SUCCESS); } //Always assign pNextNdisPacket as NULL after clear pTxRing->Cell[i].pNextNdisPacket = NULL;#ifdef BIG_ENDIAN RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD); WriteBackToDescriptor((PUCHAR)pDestTxD, (PUCHAR)pTxD, FALSE, TYPE_TXD);#endif } // Start Tx, RX DMA RtmpDmaEnable(pAd, 1); } // reset Rx Cnt. pAd->ate.LastRssi0 = 0; pAd->ate.LastRssi1 = 0; pAd->ate.LastRssi2 = 0; pAd->ate.AvgRssi0 = 0; pAd->ate.AvgRssi1 = 0; pAd->ate.AvgRssi2 = 0; pAd->ate.AvgRssi0X8 = 0; pAd->ate.AvgRssi1X8 = 0; pAd->ate.AvgRssi2X8 = 0; pAd->ate.NumOfAvgRssiSample = 0;#ifdef RALINK_2860_QA // Tx frame pAd->ate.bQATxStart = FALSE; pAd->ate.bQARxStart = FALSE; pAd->ate.seq = 0; // counters pAd->ate.U2M = 0; pAd->ate.OtherData = 0; pAd->ate.Beacon = 0; pAd->ate.OtherCount = 0; pAd->ate.TxAc0 = 0; pAd->ate.TxAc1 = 0; pAd->ate.TxAc2 = 0; pAd->ate.TxAc3 = 0; pAd->ate.TxHCCA = 0; pAd->ate.TxMgmt = 0; pAd->ate.RSSI0 = 0; pAd->ate.RSSI1 = 0; pAd->ate.RSSI2 = 0; pAd->ate.SNR0 = 0; pAd->ate.SNR1 = 0; // control pAd->ate.TxDoneCount = 0; pAd->ate.TxStatus = 0; // task Tx status // 0 --> task is idle, 1 --> task is running#endif // RALINK_2860_QA // // Soft reset BBP. BbpSoftReset(pAd);#ifdef CONFIG_STA_SUPPORT // // peter : It has "AsicDisableSync();" and "RTMP_BBP_IO_R/W8_BY_REG_ID();" inside. // Do we need to LinkDown ? //// LinkDown(pAd, FALSE); AsicEnableBssSync(pAd);// peter : Do we need to do this ? netif_stop_queue(pAd->net_dev); // // If we skip "LinkDown()", we should disable protection // to prevent from sending out RTS or CTS-to-self. // ATEDisableAsicProtect(pAd); RTMPStationStop(pAd);#endif // CONFIG_STA_SUPPORT // // Disable Tx, Rx RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value); Value &= ~((1 << 3) || (1 << 2)); RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value); } else if (!strcmp(arg, "ATESTOP")) { DBGPRINT(RT_DEBUG_TRACE, ("ATE: ATESTOP\n")); ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData); RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData); // recover the MAC_SYS_CTRL register back. // Abort Tx, RX DMA. RtmpDmaEnable(pAd, 0); Status = NICLoadFirmware(pAd); if (Status != NDIS_STATUS_SUCCESS) { DBGPRINT_ERR(("NICLoadFirmware failed, Status[=0x%08x]\n", Status)); return FALSE; } //RTMPusecDelay(1000000);// peter : Let MCU get ready.(not work!) pAd->ate.Mode = ATE_STOP;#ifdef CONFIG_STA_SUPPORT // // Even the firmware has been loaded, // we still could use ATE_BBP_IO_READ8_BY_REG_ID(). // But this is not suggested. // BbpSoftReset(pAd);#endif // CONFIG_STA_SUPPORT // NICDisableInterrupt(pAd); NICInitializeAdapter(pAd, TRUE); // We should read EEPROM for all cases. NICReadEEPROMParameters(pAd); NICInitAsicFromEEPROM(pAd); AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE); AsicLockChannel(pAd, pAd->CommonCfg.Channel); // // Enable Interrupt // // // These steps are only for APAutoSelectChannel(). // RTMP_IO_WRITE32(pAd, INT_SOURCE_CSR, 0xffffffff); // clear garbage interrupts NICEnableInterrupt(pAd); // Enable Tx, RX DMA. RtmpDmaEnable(pAd, 1); // Enable Tx RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value); Value |= (1 << 2); RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value); // Enable Rx RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value); Value |= (1 << 3); RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value); netif_start_queue(pAd->net_dev);#ifdef CONFIG_STA_SUPPORT RTMPStationStart(pAd);#endif // CONFIG_STA_SUPPORT // } else if (!strcmp(arg, "TXCARR")) // Tx Carrier { DBGPRINT(RT_DEBUG_TRACE, ("ATE: TXCARR\n")); pAd->ate.Mode |= ATE_TXCARR; // QA has done the following steps if it is used. if (pAd->ate.bQATxStart == FALSE) { // Soft reset BBP. BbpSoftReset(pAd); // Carrier Test set BBP R22 bit7=1, bit6=1, bit[5~0]=0x01 ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R22, &BbpData); BbpData &= 0xFFFFFF00; //clear bit7, bit6, bit[5~0] BbpData |= 0x000000C1; //set bit7=1, bit6=1, bit[5~0]=0x01 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData); // set MAC_SYS_CTRL(0x1004) Continuous Tx Production Test (bit4) = 1 RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value); Value = Value | 0x00000010; RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value); } } else if (!strcmp(arg, "TXCONT")) // Tx Continue { if (pAd->ate.bQATxStart == TRUE) { // set MAC_SYS_CTRL(0x1004) bit4(Continuous Tx Production Test) // and bit2(MAC TX enable) back to zero. RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData); MacData &= 0xFFFFFFEB; RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData); // set BBP R22 bit7=0 ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R22, &BbpData); BbpData &= 0xFFFFFF7F; //set bit7=0 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData); } /* for TxCont mode. ** Step 1: Send 50 packets first then wait 0.5 second. ** Step 2: Send more 50 packet then start continue mode. */ DBGPRINT(RT_DEBUG_TRACE, ("ATE: TXCONT\n")); // Step 1: send 50 packets first. pAd->ate.Mode |= ATE_TXCONT; pAd->ate.TxCount = 50; // Soft reset BBP. BbpSoftReset(pAd); // Abort Tx, RX DMA. RtmpDmaEnable(pAd, 0); // Fix can't smooth kick { RTMP_IO_READ32(pAd, TX_DTX_IDX0 + QID_AC_BE * 0x10, &pTxRing->TxDmaIdx); pTxRing->TxSwFreeIdx = pTxRing->TxDmaIdx; pTxRing->TxCpuIdx = pTxRing->TxDmaIdx; RTMP_IO_WRITE32(pAd, TX_CTX_IDX0 + QID_AC_BE * 0x10, pTxRing->TxCpuIdx); } pAd->ate.TxDoneCount = 0; SetJapanFilter(pAd); for (i = 0; (i < TX_RING_SIZE-1) && (i < pAd->ate.TxCount); i++) { PNDIS_PACKET pPacket; ULONG TxIdx = pTxRing->TxCpuIdx;#ifndef BIG_ENDIAN pTxD = (PTXD_STRUC)pTxRing->Cell[TxIdx].AllocVa;#else pDestTxD = (PTXD_STRUC)pTxRing->Cell[TxIdx].AllocVa; TxD = *pDestTxD; pTxD = &TxD; RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD);#endif // clean current cell. pPacket = pTxRing->Cell[TxIdx].pNdisPacket; if (pPacket) { PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr0, pTxD->SDLen0, PCI_DMA_TODEVICE); RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_SUCCESS); } //Always assign pNdisPacket as NULL after clear pTxRing->Cell[TxIdx].pNdisPacket = NULL; pPacket = pTxRing->Cell[TxIdx].pNextNdisPacket; if (pPacket) { PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr1, pTxD->SDLen1, PCI_DMA_TODEVICE); RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_SUCCESS); } //Always assign pNextNdisPacket as NULL after clear pTxRing->Cell[TxIdx].pNextNdisPacket = NULL; if(ATE_TxDInit(pAd, TxIdx) != 0) break; INC_RING_INDEX(pTxRing->TxCpuIdx, TX_RING_SIZE); } ATE_TxDInit(pAd, pTxRing->TxCpuIdx); // Start Tx, RX DMA. RtmpDmaEnable(pAd, 1); // Enable Tx RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value); Value |= (1 << 2); RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value); // Disable Rx RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value); Value &= ~(1 << 3); RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);#ifdef RALINK_2860_QA if (pAd->ate.bQATxStart == TRUE) { pAd->ate.TxStatus = 1; //pAd->ate.Repeat = 0; }#endif // RALINK_2860_QA // // kick Tx-Ring. RTMP_IO_WRITE32(pAd, TX_CTX_IDX0 + QID_AC_BE * RINGREG_DIFF, pAd->TxRing[QID_AC_BE].TxCpuIdx); RTMPusecDelay(5000); // Step 2: send more 50 packets then start continue mode. // Abort Tx, RX DMA. RtmpDmaEnable(pAd, 0); // Cont. TX set BBP R22 bit7=1 ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R22, &BbpData); BbpData |= 0x00000080; //set bit7=1 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData); pAd->ate.TxCount = 50; // Fix can't smooth kick { RTMP_IO_READ32(pAd, TX_DTX_IDX0 + QID_AC_BE * 0x10, &pTxRing->TxDmaIdx); pTxRing->TxSwFreeIdx = pTxRing->TxDmaIdx; pTxRing->TxCpuIdx = pTxRing->TxDmaIdx; RTMP_IO_WRITE32(pAd, TX_CTX_IDX0 + QID_AC_BE * 0x10, pTxRing->TxCpuIdx); } pAd->ate.TxDoneCount = 0; SetJapanFilter(pAd); for (i = 0; (i < TX_RING_SIZE-1) && (i < pAd->ate.TxCount); i++) { PNDIS_PACKET pPacket; ULONG TxIdx = pTxRing->TxCpuIdx;#ifndef BIG_ENDIAN pTxD = (PTXD_STRUC)pTxRing->Cell[TxIdx].AllocVa;#else pDestTxD = (PTXD_STRUC)pTxRing->Cell[TxIdx].AllocVa; TxD = *pDestTxD; pTxD = &TxD; RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD);#endif // clean current cell. pPacket = pTxRing->Cell[TxIdx].pNdisPacket; if (pPacket) { PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr0, pTxD->SDLen0, PCI_DMA_TODEVICE); RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_SUCCESS); } //Always assign pNdisPacket as NULL after clear pTxRing->Cell[TxIdx].pNdisPacket = NULL; pPacket = pTxRing->Cell[TxIdx].pNextNdisPacket; if (pPacket) { PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr1, pTxD->SDLen1, PCI_DMA_TODEVICE); RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_SUCCESS); } //Always assign pNextNdisPacket as NULL after clear pTxRing->Cell[TxIdx].pNextNdisPacket = NULL; if(ATE_TxDInit(pAd, TxIdx) != 0) break; INC_RING_INDEX(pTxRing->TxCpuIdx, TX_RING_SIZE); } ATE_TxDInit(pAd, pTxRing->TxCpuIdx); // Start Tx, RX DMA. RtmpDmaEnable(pAd, 1); // Enable Tx RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value); Value |= (1 << 2); RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value); // Disable Rx RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value); Value &= ~(1 << 3); RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);#ifdef RALINK_2860_QA if (pAd->ate.bQATxStart == TRUE) { pAd->ate.TxStatus = 1; //pAd->ate.Repeat = 0; }#endif // RALINK_2860_QA // // kick Tx-Ring. RTMP_IO_WRITE32(pAd, TX_CTX_IDX0 + QID_AC_BE * RINGREG_DIFF, pAd->TxRing[QID_AC_BE].TxCpuIdx); RTMPusecDelay(500); RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData); MacData |= 0x00000010;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -