📄 rt_ate.c
字号:
PCHAR pRateTab; switch (Mode) { case 0: pRateTab = CCKRateTable; break; case 1: pRateTab = OFDMRateTable; break; case 2: case 3: pRateTab = HTMIXRateTable; break; default: ATEDBGPRINT(RT_DEBUG_ERROR, ("unrecognizable Tx Mode %d\n", Mode)); return -1; break; } i = 0; while (pRateTab[i] != -1) { if (pRateTab[i] == Mcs) return 0; i++; } return -1;}static INT ATETxPwrHandler( IN PRTMP_ADAPTER pAd, IN char index){ ULONG R; CHAR TxPower; UCHAR Bbp94 = 0; BOOLEAN bPowerReduce = FALSE;#ifdef RALINK_28xx_QA if ((pAd->ate.bQATxStart == TRUE) || (pAd->ate.bQARxStart == TRUE)) { /* When QA is used for Tx, pAd->ate.TxPower0/1 and real tx power are not synchronized. */ return 0; } else#endif // RALINK_28xx_QA // { TxPower = index == 0 ? pAd->ate.TxPower0 : pAd->ate.TxPower1; if (pAd->ate.Channel <= 14) { if (TxPower > 31) { // R3, R4 can't large than 31 (0x24), 31 ~ 36 used by BBP 94 R = 31; if (TxPower <= 36) Bbp94 = BBPR94_DEFAULT + (UCHAR)(TxPower - 31); } else if (TxPower < 0) { // R3, R4 can't less than 0, -1 ~ -6 used by BBP 94 R = 0; if (TxPower >= -6) Bbp94 = BBPR94_DEFAULT + TxPower; } else { // 0 ~ 31 R = (ULONG) TxPower; Bbp94 = BBPR94_DEFAULT; } ATEDBGPRINT(RT_DEBUG_TRACE, ("%s (TxPower=%d, R=%ld, BBP_R94=%d)\n", __FUNCTION__, TxPower, R, Bbp94)); } else /* 5.5 GHz */ { if (TxPower > 15) { // R3, R4 can't large than 15 (0x0F) R = 15; } else if (TxPower < 0) { // R3, R4 can't less than 0 // -1 ~ -7 ASSERT((TxPower >= -7)); R = (ULONG)(TxPower + 7); bPowerReduce = TRUE; } else { // 0 ~ 15 R = (ULONG) TxPower; } ATEDBGPRINT(RT_DEBUG_TRACE, ("%s (TxPower=%d, R=%lu)\n", __FUNCTION__, TxPower, R)); }//2008/09/10:KH adds to support 3070 ATE TX Power tunning real time<-- { if (pAd->ate.Channel <= 14) { if (index == 0) { // shift TX power control to correct RF(R3) register bit position R = R << 9; R |= (pAd->LatchRfRegs.R3 & 0xffffc1ff); pAd->LatchRfRegs.R3 = R; } else { // shift TX power control to correct RF(R4) register bit position R = R << 6; R |= (pAd->LatchRfRegs.R4 & 0xfffff83f); pAd->LatchRfRegs.R4 = R; } } else /* 5.5GHz */ { if (bPowerReduce == FALSE) { if (index == 0) { // shift TX power control to correct RF(R3) register bit position R = (R << 10) | (1 << 9); R |= (pAd->LatchRfRegs.R3 & 0xffffc1ff); pAd->LatchRfRegs.R3 = R; } else { // shift TX power control to correct RF(R4) register bit position R = (R << 7) | (1 << 6); R |= (pAd->LatchRfRegs.R4 & 0xfffff83f); pAd->LatchRfRegs.R4 = R; } } else { if (index == 0) { // shift TX power control to correct RF(R3) register bit position R = (R << 10); R |= (pAd->LatchRfRegs.R3 & 0xffffc1ff); /* Clear bit 9 of R3 to reduce 7dB. */ pAd->LatchRfRegs.R3 = (R & (~(1 << 9))); } else { // shift TX power control to correct RF(R4) register bit position R = (R << 7); R |= (pAd->LatchRfRegs.R4 & 0xfffff83f); /* Clear bit 6 of R4 to reduce 7dB. */ pAd->LatchRfRegs.R4 = (R & (~(1 << 6))); } } } RtmpRfIoWrite(pAd); }//2008/09/10:KH adds to support 3070 ATE TX Power tunning real time--> return 0; }}/*========================================================================== Description: Set ATE operation mode to 0. ATESTART = Start ATE Mode 1. ATESTOP = Stop ATE Mode 2. TXCONT = Continuous Transmit 3. TXCARR = Transmit Carrier 4. TXFRAME = Transmit Frames 5. RXFRAME = Receive Frames#ifdef RALINK_28xx_QA 6. TXSTOP = Stop Any Type of Transmition 7. RXSTOP = Stop Receiving Frames #endif // RALINK_28xx_QA // Return: TRUE if all parameters are OK, FALSE otherwise==========================================================================*/#ifdef RTMP_MAC_USB/*======================Start of RTMP_MAC_USB ======================*/static INT ATECmdHandler( IN PRTMP_ADAPTER pAd, IN PSTRING arg){ UINT32 Value; UCHAR BbpData; UINT32 MacData; UINT i=0, atemode, bbp_index=0; UINT32 temp; ULONG IrqFlags; ATEDBGPRINT(RT_DEBUG_TRACE, ("===> ATECmdHandler()\n")); ATEAsicSwitchChannel(pAd); /* AsicLockChannel() is empty function so far in fact */ AsicLockChannel(pAd, pAd->ate.Channel); RTMPusecDelay(5000); // Default value in BBP R22 is 0x0. BbpData = 0; /* Enter ATE mode and set Tx/Rx Idle */ if (!strcmp(arg, "ATESTART")) { #ifdef CONFIG_STA_SUPPORT BOOLEAN Cancelled;#endif // CONFIG_STA_SUPPORT // ATEDBGPRINT(RT_DEBUG_TRACE, ("ATE: ATESTART\n")); #if defined(LINUX) || defined(VXWORKS) RTMP_OS_NETDEV_STOP_QUEUE(pAd->net_dev);#endif // defined(LINUX) || defined(VXWORKS) // atemode = pAd->ate.Mode; pAd->ate.Mode = ATE_START; // Disable Rx RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value); Value &= ~(1 << 3); RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value); // Disable auto responder RTMP_IO_READ32(pAd, AUTO_RSP_CFG, &temp); temp = temp & 0xFFFFFFFE; RTMP_IO_WRITE32(pAd, AUTO_RSP_CFG, temp); // read MAC_SYS_CTRL and backup MAC_SYS_CTRL value RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData); // clean bit4 to stop continuous Tx production test MacData &= 0xFFFFFFEF; // Stop continuous TX production test. // Disable or cancel pending irp first ??? RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData); if (atemode == ATE_TXCARR) { /* RT35xx ATE will reuse this code segment. */ /* 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) { /* RT35xx ATE will reuse this code segment. */ /* 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, BBP_R24, &BbpData); BbpData &= 0xFFFFFFFE; //clear bit0 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R24, BbpData); } /* We should free some resource which was allocated when ATE_TXFRAME, ATE_STOP, and ATE_TXCONT. */ else if ((atemode & ATE_TXFRAME) || (atemode == ATE_STOP)) { if (atemode == ATE_TXCONT) { /* Not Cont. TX anymore, so 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); { /* It seems nothing needed to be free, because we did not allocate any resource when we entered ATE_TXFRAME mode latestly. */ } /* Start Tx, RX DMA */ RtmpDmaEnable(pAd, 1); } RTUSBRejectPendingPackets(pAd); RTUSBCleanUpDataBulkOutQueue(pAd);#ifdef CONFIG_STA_SUPPORT /* It will be called in MlmeSuspend(). Cancel pending timers. */ RTMPCancelTimer(&pAd->MlmeAux.AssocTimer, &Cancelled); RTMPCancelTimer(&pAd->MlmeAux.ReassocTimer, &Cancelled); RTMPCancelTimer(&pAd->MlmeAux.DisassocTimer, &Cancelled); RTMPCancelTimer(&pAd->MlmeAux.AuthTimer, &Cancelled); RTMPCancelTimer(&pAd->MlmeAux.BeaconTimer, &Cancelled); RTMPCancelTimer(&pAd->MlmeAux.ScanTimer, &Cancelled);#endif // CONFIG_STA_SUPPORT // /* not used in RT28xx */// RTUSBCleanUpMLMEWaitQueue(pAd); RTUSBCleanUpMLMEBulkOutQueue(pAd); // Sometimes kernel will hang on, so we avoid calling MlmeSuspend().// MlmeSuspend(pAd, TRUE);// RTMPCancelTimer(&pAd->Mlme.PeriodicTimer, &Cancelled); // Disable Rx RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value); Value &= ~(1 << 3); RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value); // Abort Tx, RX DMA. RtmpDmaEnable(pAd, 0); // Disable Tx RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value); Value &= ~(1 << 2); RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value); // Make sure there are no pending bulk in/out IRPs before we go on. // pAd->BulkFlags != 0 : wait bulk out finish while ((pAd->PendingRx > 0)) { ATE_RTUSBCancelPendingBulkInIRP(pAd); /* delay 0.5 seconds */ RTMPusecDelay(500000); pAd->PendingRx = 0; } /* Why don't we have to get BulkOutLock first ? */ while (((pAd->BulkOutPending[0] == TRUE) || (pAd->BulkOutPending[1] == TRUE) || (pAd->BulkOutPending[2] == TRUE) || (pAd->BulkOutPending[3] == TRUE)) && (pAd->BulkFlags != 0))// pAd->BulkFlags != 0 : wait bulk out finish { do { /* pAd->BulkOutPending[y] will be set to FALSE in RTUSBCancelPendingBulkOutIRP(pAd) */ RTUSBCancelPendingBulkOutIRP(pAd); } while (FALSE); /* we have enough time delay in RTUSBCancelPendingBulkOutIRP(pAd) so this is not necessary */// RTMPusecDelay(500000); } ASSERT(pAd->PendingRx == 0); // reset Rx statistics. pAd->ate.LastSNR0 = 0; pAd->ate.LastSNR1 = 0; 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_28xx_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; // TxStatus : 0 --> task is idle, 1 --> task is running pAd->ate.TxStatus = 0; #endif // RALINK_28xx_QA // // Soft reset BBP. BbpSoftReset(pAd); #ifdef CONFIG_STA_SUPPORT AsicDisableSync(pAd); /* 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 // // Default value in BBP R22 is 0x0. BbpData = 0; RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData); // Clean bit4 to stop continuous Tx production test. MacData &= 0xFFFFFFEF; ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData); RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData); // Clean ATE Bulk in/out counter and continue setup InterlockedExchange(&pAd->BulkOutRemained, 0); /* NdisAcquireSpinLock()/NdisReleaseSpinLock() need only one argument in RT28xx */ NdisAcquireSpinLock(&pAd->GenericLock); pAd->ContinBulkOut = FALSE; pAd->ContinBulkIn = FALSE; NdisReleaseSpinLock(&pAd->GenericLock); RTUSB_CLEAR_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_ATE); } else if (!strcmp(arg, "ATESTOP")) { ATEDBGPRINT(RT_DEBUG_TRACE, ("ATE : ATESTOP ===>\n")); // Default value in BBP R22 is 0x0. BbpData = 0; RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData); // Clean bit4 to stop continuous Tx production test. MacData &= 0xFFFFFFEF; ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData); // recover the MAC_SYS_CTRL register back. RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData); // Disable Rx RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value); Value &= ~(1 << 3); RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value); /* Abort Tx, RX DMA. Q : How to do the following I/O if Tx, Rx DMA is aborted ? Ans : Bulk endpoints are aborted, while the control endpoint is not. */ RtmpDmaEnable(pAd, 0); // Disable Tx RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value); Value &= ~(1 << 2); RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value); /* Make sure there are no pending bulk in/out IRPs before we go on. */ // pAd->BulkFlags != 0 : wait bulk out finish while (pAd->PendingRx > 0) { ATE_RTUSBCancelPendingBulkInIRP(pAd); RTMPusecDelay(500000); } while (((pAd->BulkOutPending[0] == TRUE) || (pAd->BulkOutPending[1] == TRUE) || (pAd->BulkOutPending[2] == TRUE) || (pAd->BulkOutPending[3] == TRUE)) && (pAd->BulkFlags != 0)) // pAd->BulkFlags != 0 : wait bulk out finish { do { RTUSBCancelPendingBulkOutIRP(pAd); } while (FALSE); RTMPusecDelay(500000); } ASSERT(pAd->PendingRx == 0);/*=========================================================================*//* Reset Rx RING */ /*=========================================================================*/// InterlockedExchange(&pAd->PendingRx, 0); pAd->PendingRx = 0; // Next Rx Read index pAd->NextRxBulkInReadIndex = 0; // Rx Bulk pointer pAd->NextRxBulkInIndex = RX_RING_SIZE - 1; pAd->NextRxBulkInPosition = 0; for (i = 0; i < (RX_RING_SIZE); i++) { PRX_CONTEXT pRxContext = &(pAd->RxContext[i]); NdisZeroMemory(pRxContext->TransferBuffer, MAX_RXBULK_SIZE); /* why don't we have to get BulkInLock first ? */ pRxContext->pAd = pAd; pRxContext->pIrp = NULL; pRxContext->BulkInOffset = 0; pRxContext->bRxHandling = FALSE; pRxContext->InUse = FALSE; pRxContext->IRPPending = FALSE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -