📄 rt_ate.c
字号:
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); /* empty function */ AsicLockChannel(pAd, pAd->CommonCfg.Channel);#ifdef CONFIG_STA_SUPPORT RTMPStationStart(pAd);#endif // CONFIG_STA_SUPPORT // } // 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 */ RTMPusecDelay(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 RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value); Value |= (1 << 3); RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value); /* Wait 10ms for all of the bulk-in URBs to complete. */ /* todo : remove this if not necessary */ RTMPusecDelay(10000); // Everything is ready to start normal Tx/Rx. RTUSBBulkReceive(pAd);#if defined(LINUX) || defined(VXWORKS) RTMP_OS_NETDEV_START_QUEUE(pAd->net_dev);#endif // defined(LINUX) || defined(VXWORKS) // ATEDBGPRINT(RT_DEBUG_TRACE, ("<=== ATE : ATESTOP \n")); } else if (!strcmp(arg, "TXCARR")) { ATEDBGPRINT(RT_DEBUG_TRACE, ("ATE: TXCARR\n")); pAd->ate.Mode = ATE_TXCARR; /* RT35xx ATE will reuse this code segment. */ // Disable Rx // May be we need not to do this, because these have been done in ATE_START mode ??? RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value); Value &= ~(1 << 3); RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value); // 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")) { 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 for a moment. Step 2: Send more 50 packet then start continue mode. */ ATEDBGPRINT(RT_DEBUG_TRACE, ("ATE: TXCONT\n")); /* RT35xx ATE will reuse this code segment. */ // Step 1: send 50 packets first. pAd->ate.Mode = ATE_TXCONT; pAd->ate.TxCount = 50; pAd->ate.TxDoneCount = 0; // Soft reset BBP. BbpSoftReset(pAd); // Abort Tx, RX DMA. RtmpDmaEnable(pAd, 0); /* Only needed if we have to send some normal frames. */ SetJapanFilter(pAd); // Setup frame format. ATESetUpFrame(pAd, 0); // 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); // Start Tx, RX DMA. RtmpDmaEnable(pAd, 1); InterlockedExchange(&pAd->BulkOutRemained, pAd->ate.TxCount);#ifdef RALINK_28xx_QA if (pAd->ate.bQATxStart == TRUE) { pAd->ate.TxStatus = 1; }#endif // RALINK_28xx_QA // NdisAcquireSpinLock(&pAd->GenericLock); pAd->ContinBulkOut = FALSE; NdisReleaseSpinLock(&pAd->GenericLock); RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_ATE); // Kick bulk out RTUSBKickBulkOut(pAd); /* To make sure all the 50 frames have been bulk out before executing step 2 */ while (atomic_read(&pAd->BulkOutRemained) > 0) { 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; pAd->ate.TxDoneCount = 0; SetJapanFilter(pAd); // Setup frame format. ATESetUpFrame(pAd, 0); // 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); // Start Tx, RX DMA. RtmpDmaEnable(pAd, 1); InterlockedExchange(&pAd->BulkOutRemained, pAd->ate.TxCount);#ifdef RALINK_28xx_QA if (pAd->ate.bQATxStart == TRUE) { pAd->ate.TxStatus = 1; }#endif // RALINK_28xx_QA // NdisAcquireSpinLock(&pAd->GenericLock); pAd->ContinBulkOut = FALSE; NdisReleaseSpinLock(&pAd->GenericLock); RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_ATE); // Kick bulk out RTUSBKickBulkOut(pAd); /* Let pAd->BulkOutRemained be consumed to zero */ RTMPusecDelay(500); // Set MAC_SYS_CTRL(0x1004) Continuous Tx Production Test (bit4) = 1. RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData); MacData |= 0x00000010; RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData); } else if (!strcmp(arg, "TXFRAME")) { ATEDBGPRINT(RT_DEBUG_TRACE, ("ATE: TXFRAME(Count=0x%08x)\n", pAd->ate.TxCount)); pAd->ate.Mode |= ATE_TXFRAME; // Soft reset BBP. BbpSoftReset(pAd); // 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);#ifdef RALINK_28xx_QA // add this for LoopBack mode if (pAd->ate.bQARxStart == FALSE) { // Disable Rx RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value); Value &= ~(1 << 3); RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value); } if (pAd->ate.bQATxStart == TRUE) { pAd->ate.TxStatus = 1; }#else // Disable Rx RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value); Value &= ~(1 << 3); RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);#endif // RALINK_28xx_QA // // Enable Tx RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value); Value |= (1 << 2); RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value); SetJapanFilter(pAd); // Abort Tx, RX DMA. RtmpDmaEnable(pAd, 0); pAd->ate.TxDoneCount = 0; // Setup frame format ATESetUpFrame(pAd, 0); // Start Tx, RX DMA. RtmpDmaEnable(pAd, 1); /* Check count is continuous or not yet. */ if (pAd->ate.TxCount == 0) { /* Due to the type mismatch between "pAd->BulkOutRemained"(atomic_t) and "pAd->ate.TxCount"(UINT32) */ InterlockedExchange(&pAd->BulkOutRemained, 0); } else { InterlockedExchange(&pAd->BulkOutRemained, pAd->ate.TxCount); } ATEDBGPRINT(RT_DEBUG_TRACE, ("bulk out count = %d\n", atomic_read(&pAd->BulkOutRemained))); ASSERT((atomic_read(&pAd->BulkOutRemained) >= 0)); if (atomic_read(&pAd->BulkOutRemained) == 0) { ATEDBGPRINT(RT_DEBUG_TRACE, ("Send packet countinuously\n")); /* In 28xx, NdisAcquireSpinLock() == spin_lock_bh() */ /* NdisAcquireSpinLock only need one argument in 28xx. */ NdisAcquireSpinLock(&pAd->GenericLock); pAd->ContinBulkOut = TRUE; NdisReleaseSpinLock(&pAd->GenericLock); /* In 28xx, BULK_OUT_LOCK() == spin_lock_irqsave() */ BULK_OUT_LOCK(&pAd->BulkOutLock[0], IrqFlags);// NdisAcquireSpinLock ==> BULK_OUT_LOCK pAd->BulkOutPending[0] = FALSE; BULK_OUT_UNLOCK(&pAd->BulkOutLock[0], IrqFlags);// NdisAcquireSpinLock ==> BULK_OUT_LOCK } else { ATEDBGPRINT(RT_DEBUG_TRACE, ("Send packets depend on counter\n")); NdisAcquireSpinLock(&pAd->GenericLock); pAd->ContinBulkOut = FALSE; NdisReleaseSpinLock(&pAd->GenericLock); BULK_OUT_LOCK(&pAd->BulkOutLock[0], IrqFlags); pAd->BulkOutPending[0] = FALSE; BULK_OUT_UNLOCK(&pAd->BulkOutLock[0], IrqFlags); } RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_ATE); // Kick bulk out RTUSBKickBulkOut(pAd); }#ifdef RALINK_28xx_QA // Enter ATE mode and set Tx/Rx Idle else if (!strcmp(arg, "TXSTOP")) { ATEDBGPRINT(RT_DEBUG_TRACE, ("ATE: TXSTOP\n")); atemode = pAd->ate.Mode; pAd->ate.Mode &= ATE_TXSTOP; pAd->ate.bQATxStart = FALSE; 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, BBP_R24, &BbpData); BbpData &= 0xFFFFFFFE; // clear bit0 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R24, BbpData); } else if ((atemode & ATE_TXFRAME) || (atemode == ATE_STOP)) { 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); } } RTUSBRejectPendingPackets(pAd); RTUSBCleanUpDataBulkOutQueue(pAd); /* not used in RT28xx */// RTUSBCleanUpMLMEWaitQueue(pAd); /* empty function so far */ RTUSBCleanUpMLMEBulkOutQueue(pAd); // Abort Tx, RX DMA. RtmpDmaEnable(pAd, 0); /* In 28xx, pAd->PendingRx is not of type atomic_t anymore */ /* pAd->BulkFlags != 0 : wait bulk out finish */ /* todo : BulkInLock */ 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); // Enable Tx, Rx DMA. RtmpDmaEnable(pAd, 1); // TxStatus : 0 --> task is idle, 1 --> task is running pAd->ate.TxStatus = 0; // Soft reset BBP. BbpSoftReset(pAd); // Disable Tx RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData); MacData &= (0xfffffffb); RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData); // Clean ATE Bulk in/out counter and continue setup InterlockedExchange(&pAd->BulkOutRemained, 0); pAd->ContinBulkOut = FALSE; } else if (!strcmp(arg, "RXSTOP")) { ATEDBGPRINT(RT_DEBUG_TRACE, ("ATE: RXSTOP\n")); atemode = pAd->ate.Mode; // Disable Rx RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value); Value &= ~(1 << 3); RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value); pAd->ate.Mode &= ATE_RXSTOP; pAd->ate.bQARxStart = FALSE;// pAd->ate.TxDoneCount = pAd->ate.TxCount; RTUSBRejectPendingPackets(pAd); RTUSBCleanUpDataBulkOutQueue(pAd); /* not used in RT28xx */// RTUSBCleanUpMLMEWaitQueue(pAd); RTUSBCleanUpMLMEBulkOutQueue(pAd); // Abort Tx, RX DMA. RtmpDmaEnable(pAd, 0); 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); // Soft reset BBP. BbpSoftReset(pAd); pAd->ContinBulkIn = FALSE; }#endif // RALINK_28xx_QA // else if (!strcmp(arg, "RXFRAME")) { ATEDBGPRINT(RT_DEBUG_TRACE, ("ATE: RXFRAME\n")); // Disable Rx of MAC block RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value); Value &= ~(1 << 3); RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value); // Default value in BBP R22 is 0x0. BbpData = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -