📄 rt_ate.c
字号:
R |= (pAd->LatchRfRegs.R4 & 0xfffff83f); pAd->LatchRfRegs.R4 = R; } } else { if (index == 0) { R = (R << 10) | (1 << 9); // shift TX power control to correct RF(R3) register bit position R |= (pAd->LatchRfRegs.R3 & 0xffffc1ff); pAd->LatchRfRegs.R3 = R; } else { R = (R << 7) | (1 << 6); // shift TX power control to correct RF(R4) register bit position R |= (pAd->LatchRfRegs.R4 & 0xfffff83f); pAd->LatchRfRegs.R4 = R; } } RtmpRfIoWrite(pAd); return 0; }}#endif // 1 ///* ========================================================================== 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 ==========================================================================*//* *//* *//*=======================End of RT2860=======================*//*======================Start of RT2870======================*//* *//* */#ifdef RT2870static INT ATECmdHandler( IN PRTMP_ADAPTER pAd, IN PUCHAR arg){ UINT32 Value; UCHAR BbpData; UINT32 MacData; UINT i=0, atemode; //NDIS_STATUS Status = NDIS_STATUS_SUCCESS; //PUCHAR pDest; 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")); netif_stop_queue(pAd->net_dev); atemode = pAd->ate.Mode; pAd->ate.Mode = ATE_START;// pAd->ate.TxDoneCount = pAd->ate.TxCount; // 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. RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData);//disable or cancel pending irp first ??? if (atemode & ATE_TXCARR#ifdef RT30xx || atemode & ATE_TXCONT#endif // RT30xx //) {#ifdef RT30xx //Hardware Reset BBP RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &temp); temp = temp |0x00000002; RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, temp); RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &temp); temp = temp & ~(0x00000002); RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, temp); //Restore All BBP Value for(i=0;i<ATE_BBP_REG_NUM;i++) ATE_BBP_IO_WRITE8_BY_REG_ID(pAd,i,restore_BBP[i]);#endif // RT30xx // // 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) {#ifdef RT30xx //Hardware Reset BBP RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &temp); temp = temp |0x00000002; RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, temp); RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &temp); temp = temp & ~(0x00000002); RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, temp); //Restore All BBP Value for(i=0;i<ATE_BBP_REG_NUM;i++) ATE_BBP_IO_WRITE8_BY_REG_ID(pAd,i,restore_BBP[i]);#endif // RT30xx // // 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 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)) { 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 to free, // because we didn't 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 // //RTUSBCleanUpMLMEWaitQueue(pAd); /* not used in RT28xx */ 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->PendingRx is not of type atomic_t anymore in 28xx */// while ((atomic_read(&pAd->PendingRx) > 0)) //pAd->BulkFlags != 0 wait bulk out finish while ((pAd->PendingRx > 0)) //pAd->BulkFlags != 0 wait bulk out finish {#if 1 ATE_RTUSBCancelPendingBulkInIRP(pAd);#else NdisInterlockedDecrement(&pAd->PendingRx);#endif /* delay 0.5 seconds */ RTMPusecDelay(500000); pAd->PendingRx = 0; } /* peter : 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); } /* pAd->PendingRx is not of type atomic_t anymore in 28xx */// ASSERT(atomic_read(&pAd->PendingRx) == 0); 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; pAd->ate.TxStatus = 0; // task Tx status // 0 --> task is idle, 1 --> task is running#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);//0820 // 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); // recover the MAC_SYS_CTRL register back. // 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. *//*=========================================================================*/// while ((atomic_read(&pAd->PendingRx) > 0)) //pAd->BulkFlags != 0 wait bulk out finish while (pAd->PendingRx > 0) {#if 1 ATE_RTUSBCancelPendingBulkInIRP(pAd);#else// NdisInterlockedDecrement(&pAd->PendingRx); pAd->PendingRx--;#endif 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(atomic_read(&pAd->PendingRx) == 0); ASSERT(pAd->PendingRx == 0);/*=========================================================================*//* Reset Rx RING */ /*=========================================================================*/// InterlockedExchange(&pAd->PendingRx, 0); pAd->PendingRx = 0; pAd->NextRxBulkInReadIndex = 0; // Next Rx Read index pAd->NextRxBulkInIndex = RX_RING_SIZE - 1; // Rx Bulk pointer pAd->NextRxBulkInPosition = 0; for (i = 0; i < (RX_RING_SIZE); i++) { PRX_CONTEXT pRxContext = &(pAd->RxContext[i]); NdisZeroMemory(pRxContext->TransferBuffer, MAX_RXBULK_SIZE); /* peter : why don't we have to get BulkInLock first ? */ pRxContext->pAd = pAd; pRxContext->pIrp = NULL; /* peter debug ++ */ pRxContext->BulkInOffset = 0; pRxContext->bRxHandling = FALSE; /* peter debug -- */ pRxContext->InUse = FALSE; pRxContext->IRPPending = FALSE; pRxContext->Readable = FALSE;// pRxContext->ReorderInUse = FALSE;// pRxContext->ReadPosOffset = 0; }/*=========================================================================*//* Reset Tx RING */ /*=========================================================================*/ do { RTUSBCancelPendingBulkOutIRP(pAd); } while (FALSE);/*=========================================================================*/ // Enable auto responder. RTMP_IO_READ32(pAd, AUTO_RSP_CFG, &temp); temp = temp | (0x01); RTMP_IO_WRITE32(pAd, AUTO_RSP_CFG, temp);/*================================================*/ AsicEnableBssSync(pAd); /* Soft reset BBP.*/ /* In 2870 chipset, ATE_BBP_IO_READ8_BY_REG_ID() == RTMP_BBP_IO_READ8_BY_REG_ID() */ /* Both rt2870ap and rt2870sta use BbpSoftReset(pAd) to do BBP soft reset */ BbpSoftReset(pAd);/*================================================*/ {#ifdef CONFIG_STA_SUPPORT // Set all state machines back IDLE pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE; pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE; pAd->Mlme.AuthRspMachine.CurrState = AUTH_RSP_IDLE; pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE; pAd->Mlme.ActMachine.CurrState = ACT_IDLE;#endif // CONFIG_STA_SUPPORT // // // ===> refer to MlmeRestartStateMachine(). // When we entered ATE_START mode, PeriodicTimer was not cancelled. // So we don't have to set it here. // //RTMPSetTimer(pAd, &pAd->Mlme.PeriodicTimer, MLME_TASK_EXEC_INTV); ASSERT(pAd->CommonCfg.Channel != 0); AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE); AsicLockChannel(pAd, pAd->CommonCfg.Channel);#ifdef CONFIG_STA_SUPPORT RTMPStationStart(pAd);#endif // CONFIG_STA_SUPPORT // } //// These two steps have been done when entering ATE_STOP mode.// // Clean ATE Bulk in/out counter and continue setup. InterlockedExchange(&pAd->BulkOutRemained, 0); NdisAcquireSpinLock(&pAd->GenericLock); pAd->ContinBulkOut = FALSE; pAd->ContinBulkIn = FALSE; NdisReleaseSpinLock(&pAd->GenericLock); /* Wait 50ms to prevent next URB to bulkout during HW reset. */ /* todo : remove this if not necessary */ NdisMSleep(50000); pAd->ate.Mode = ATE_STOP; // Enable Tx RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value); Value |= (1 << 2); RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);/*=========================================================================*/ /* restore RX_FILTR_CFG */#ifdef CONFIG_STA_SUPPORT /* restore RX_FILTR_CFG in order that QA maybe set it to 0x3 */ RTMP_IO_WRITE32(pAd, RX_FILTR_CFG, STANORMAL);#endif // CONFIG_STA_SUPPORT ///*=========================================================================*/ // Enable Tx, RX DMA. RtmpDmaEnable(pAd, 1); // Enable Rx
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -