📄 rt_ate.c
字号:
RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData); } else if (!strcmp(arg, "TXFRAME")) // Tx Frames { DBGPRINT(RT_DEBUG_TRACE, ("ATE: TXFRAME(Count=%ld)\n", pAd->ate.TxCount)); pAd->ate.Mode |= ATE_TXFRAME; ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData); // Soft reset BBP. BbpSoftReset(pAd); RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData); // 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);#ifdef RALINK_2860_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; //pAd->ate.Repeat = 0; }#else // Disable Rx RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value); Value &= ~(1 << 3); RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);#endif // RALINK_2860_QA // RTMP_IO_READ32(pAd, TX_DTX_IDX0 + QID_AC_BE * RINGREG_DIFF, &pAd->TxRing[QID_AC_BE].TxDmaIdx); // kick Tx-Ring. RTMP_IO_WRITE32(pAd, TX_CTX_IDX0 + QID_AC_BE * RINGREG_DIFF, pAd->TxRing[QID_AC_BE].TxCpuIdx); pAd->RalinkCounters.KickTxCount++; } else if (!strcmp(arg, "RXFRAME")) // Rx Frames { DBGPRINT(RT_DEBUG_TRACE, ("ATE: RXFRAME\n")); ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData); RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData); pAd->ate.Mode |= ATE_RXFRAME; // abort all TX rings(Disable Tx) RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value); Value &= ~(1 << 2); RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value); // enable RX of MAC block RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value); Value |= (1 << 3); RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value); } else { DBGPRINT(RT_DEBUG_TRACE, ("ATE: Invalid arg!\n")); return FALSE; } RTMPusecDelay(5000); return TRUE;}INT Set_ATE_Proc( IN PRTMP_ADAPTER pAd, IN PUCHAR arg){ DBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_Proc Success\n")); return (set_ate_proc_inline(pAd, arg));}/* ========================================================================== Description: Set ATE ADDR1=DA for TxFrame Return: TRUE if all parameters are OK, FALSE otherwise ==========================================================================*/INT Set_ATE_DA_Proc( IN PRTMP_ADAPTER pAd, IN PUCHAR arg){ CHAR *value; INT i; if(strlen(arg) != 17) //Mac address acceptable format 01:02:03:04:05:06 length 17 return FALSE; for (i=0, value = rstrtok(arg, ":"); value; value = rstrtok(NULL, ":")) { if((strlen(value) != 2) || (!isxdigit(*value)) || (!isxdigit(*(value+1))) ) return FALSE; //Invalid AtoH(value, &pAd->ate.Addr1[i++], 1); } if(i != 6) return FALSE; //Invalid DBGPRINT(RT_DEBUG_TRACE, ("Set_ATE_DA_Proc (DA = %2X:%2X:%2X:%2X:%2X:%2X)\n", pAd->ate.Addr1[0], pAd->ate.Addr1[1], pAd->ate.Addr1[2], pAd->ate.Addr1[3], pAd->ate.Addr1[4], pAd->ate.Addr1[5])); DBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_DA_Proc Success\n")); return TRUE;}/* ========================================================================== Description: Set ATE ADDR2=SA for TxFrame Return: TRUE if all parameters are OK, FALSE otherwise ==========================================================================*/INT Set_ATE_SA_Proc( IN PRTMP_ADAPTER pAd, IN PUCHAR arg){ CHAR *value; INT i; if(strlen(arg) != 17) //Mac address acceptable format 01:02:03:04:05:06 length 17 return FALSE; for (i=0, value = rstrtok(arg,":"); value; value = rstrtok(NULL,":")) { if((strlen(value) != 2) || (!isxdigit(*value)) || (!isxdigit(*(value+1))) ) return FALSE; //Invalid AtoH(value, &pAd->ate.Addr2[i++], 2); } if(i != 6) return FALSE; //Invalid DBGPRINT(RT_DEBUG_TRACE, ("Set_ATE_SA_Proc (DA = %2X:%2X:%2X:%2X:%2X:%2X)\n", pAd->ate.Addr2[0], pAd->ate.Addr2[1], pAd->ate.Addr2[2], pAd->ate.Addr2[3], pAd->ate.Addr2[4], pAd->ate.Addr2[5])); DBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_SA_Proc Success\n")); return TRUE;}/* ========================================================================== Description: Set ATE ADDR3=BSSID for TxFrame Return: TRUE if all parameters are OK, FALSE otherwise ==========================================================================*/INT Set_ATE_BSSID_Proc( IN PRTMP_ADAPTER pAd, IN PUCHAR arg){ CHAR *value; INT i; if(strlen(arg) != 17) //Mac address acceptable format 01:02:03:04:05:06 length 17 return FALSE; for (i=0, value = rstrtok(arg,":"); value; value = rstrtok(NULL,":")) { if((strlen(value) != 2) || (!isxdigit(*value)) || (!isxdigit(*(value+1))) ) return FALSE; //Invalid AtoH(value, &pAd->ate.Addr3[i++], 2); } if(i != 6) return FALSE; //Invalid DBGPRINT(RT_DEBUG_TRACE, ("Set_ATE_BSSID_Proc (DA = %2X:%2X:%2X:%2X:%2X:%2X)\n", pAd->ate.Addr3[0], pAd->ate.Addr3[1], pAd->ate.Addr3[2], pAd->ate.Addr3[3], pAd->ate.Addr3[4], pAd->ate.Addr3[5])); DBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_BSSID_Proc Success\n")); return TRUE;}/* ========================================================================== Description: Set ATE Tx Length Return: TRUE if all parameters are OK, FALSE otherwise ==========================================================================*/INT Set_ATE_CHANNEL_Proc( IN PRTMP_ADAPTER pAd, IN PUCHAR arg){ UCHAR channel; channel = simple_strtol(arg, 0, 10); if((channel < 1) || (channel > 14))// to allow A band channel { DBGPRINT(RT_DEBUG_ERROR, ("Set_ATE_CHANNEL_Proc::Out of range, it should be in range of 1~14.\n")); return FALSE; } pAd->ate.Channel = channel; DBGPRINT(RT_DEBUG_TRACE, ("Set_ATE_CHANNEL_Proc (ATE Channel = %d)\n", pAd->ate.Channel)); DBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_CHANNEL_Proc Success\n")); return TRUE;}/* ========================================================================== Description: Set ATE Tx Power0 Return: TRUE if all parameters are OK, FALSE otherwise ==========================================================================*/INT Set_ATE_TX_POWER0_Proc( IN PRTMP_ADAPTER pAd, IN PUCHAR arg){ CHAR TxPower; TxPower = simple_strtol(arg, 0, 10); if ((TxPower > 31) || (TxPower < 0)) { DBGPRINT(RT_DEBUG_ERROR, ("Set_ATE_TX_POWER0_Proc::Out of range (Value=%d)\n", TxPower)); return FALSE; } pAd->ate.TxPower0 = TxPower; ATE_TxPwrHandler(pAd, 0); DBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_TX_POWER0_Proc Success\n")); return TRUE;}/* ========================================================================== Description: Set ATE Tx Power1 Return: TRUE if all parameters are OK, FALSE otherwise ==========================================================================*/INT Set_ATE_TX_POWER1_Proc( IN PRTMP_ADAPTER pAd, IN PUCHAR arg){ CHAR TxPower; TxPower = simple_strtol(arg, 0, 10); if ((TxPower > 31) || (TxPower < 0)) { DBGPRINT(RT_DEBUG_ERROR, ("Set_ATE_TX_POWER1_Proc::Out of range (Value=%d)\n", TxPower)); return FALSE; } pAd->ate.TxPower1 = TxPower; ATE_TxPwrHandler(pAd, 1); DBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_TX_POWER1_Proc Success\n")); return TRUE;}/* ========================================================================== Description: Set ATE Tx Antenna Return: TRUE if all parameters are OK, FALSE otherwise ==========================================================================*/INT Set_ATE_TX_Antenna_Proc( IN PRTMP_ADAPTER pAd, IN PUCHAR arg){ CHAR value; value = simple_strtol(arg, 0, 10); if ((value > 2) || (value < 0)) { DBGPRINT(RT_DEBUG_ERROR, ("Set_ATE_TX_Antenna_Proc::Out of range (Value=%d)\n", value)); return FALSE; } pAd->ate.TxAntennaSel = value; DBGPRINT(RT_DEBUG_TRACE, ("Set_ATE_TX_Antenna_Proc (Antenna = %d)\n", pAd->ate.TxAntennaSel)); DBGPRINT(RT_DEBUG_TRACE,("Ralink: Set_ATE_TX_Antenna_Proc Success\n")); return TRUE;}/* ========================================================================== Description: Set ATE Rx Antenna Return: TRUE if all parameters are OK, FALSE otherwise ==========================================================================*/INT Set_ATE_RX_Antenna_Proc( IN PRTMP_ADAPTER pAd, IN PUCHAR arg){ CHAR value; value = simple_strtol(arg, 0, 10); if ((value > 3) || (value < 0)) { DBGPRINT(RT_DEBUG_ERROR, ("Set_ATE_RX_Antenna_Proc::Out of range (Value=%d)\n", value)); return FALSE; } pAd->ate.RxAntennaSel = value; DBGPRINT(RT_DEBUG_TRACE, ("Set_ATE_RX_Antenna_Proc (Antenna = %d)\n", pAd->ate.RxAntennaSel)); DBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_RX_Antenna_Proc Success\n")); return TRUE;}/* ========================================================================== Description: Set ATE RF frequence offset Return: TRUE if all parameters are OK, FALSE otherwise ==========================================================================*/INT Set_ATE_TX_FREQOFFSET_Proc( IN PRTMP_ADAPTER pAd, IN PUCHAR arg){ UCHAR RFFreqOffset; ULONG R4; RFFreqOffset = simple_strtol(arg, 0, 10); if(RFFreqOffset >= 64) { DBGPRINT(RT_DEBUG_ERROR, ("Set_ATE_TX_FREQOFFSET_Proc::Out of range, it should be in range of 0~63.\n")); return FALSE; } pAd->ate.RFFreqOffset = RFFreqOffset; R4 = pAd->ate.RFFreqOffset << 15; // shift TX power control to correct RF register bit position R4 |= (pAd->LatchRfRegs.R4 & ((~0x001f8000))); pAd->LatchRfRegs.R4 = R4; RtmpRfIoWrite(pAd); DBGPRINT(RT_DEBUG_TRACE, ("Set_ATE_TX_FREQOFFSET_Proc (RFFreqOffset = %ld)\n", pAd->ate.RFFreqOffset)); DBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_TX_FREQOFFSET_Proc Success\n")); return TRUE;}/* ========================================================================== Description: Set ATE RF BW Return: TRUE if all parameters are OK, FALSE otherwise ==========================================================================*/INT Set_ATE_TX_BW_Proc( IN PRTMP_ADAPTER pAd, IN PUCHAR arg){ int i; UCHAR value = 0; UCHAR BBPCurrentBW; BBPCurrentBW = simple_strtol(arg, 0, 10); if(BBPCurrentBW == 0) pAd->ate.TxWI.BW = BW_40; else pAd->ate.TxWI.BW = BW_40; if(pAd->ate.TxWI.BW == BW_40) { for (i=0; i<5; i++) { if (pAd->TxPwrCfg[i] != 0xffffffff) { RTMP_IO_WRITE32(pAd, TX_PWR_CFG_0 + i*4, pAd->TxPwrCfg[i]); RTMPusecDelay(5000); } } //Set BBP R4 bit[4:3]=0:0 ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &value); value &= (~0x18); ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, value); //Set BBP R66=0x3C value = 0x3C;//(original is 0x30)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -