⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mdata.c

📁 atheros ar5001 5002 driver
💻 C
📖 第 1 页 / 共 5 页
字号:

	rxStatsInfo.descToRead = pLibDev->rx.descAddress;

	if (enableCompare) {
		//create a max size compare buffer for easy compare
		rxStatsInfo.pCompareData = (A_UCHAR *)malloc(FRAME_BODY_SIZE);

		if(!rxStatsInfo.pCompareData) {
			mError(devNum, ENOMEM, "Device Number %d:txrxDataBegin: Unable to allocate memory for compare buffer\n", devNum);
			ar5kInitData[pLibDev->ar5kInitIndex].pMacAPI->rxCleanupConfig(devNum);
			return;
		}

		fillCompareBuffer(rxStatsInfo.pCompareData, FRAME_BODY_SIZE, dataPattern, dataPatternLength);
	}	

	//start transmit
	ar5kInitData[pLibDev->ar5kInitIndex].pMacAPI->txBeginConfig(devNum, 1);
	start= milliTime();

	startTime = milliTime();
	do {
		if (!txComplete) {
			event = pLibDev->devMap.getISREvent(devNum);
		}

		//check for transmit
		if ((event.valid) && 
			(ar5kInitData[pLibDev->ar5kInitIndex].pMacAPI->isTxdescEvent(event.ISRValue)) && 
			!txComplete) {

				finish= milliTime();


			//ar5kInitData[pLibDev->ar5kInitIndex].pMacAPI->sendTxEndPacket(devNum, queueIndex );
			sendEndPacket(devNum, queueIndex);

			if(pLibDev->libCfgParams.enableXR) {
				REGW(devNum, XRMODE_REG, REGR(devNum, XRMODE_REG) | (0x1 << BITS_TO_XR_WAIT_FOR_POLL));
			}

			txComplete = TRUE;
			txAccumulateStats(devNum, finish - start, queueIndex);
		}

		//read descriptor status words
		pLibDev->devMap.OSmemRead(devNum, rxStatsInfo.descToRead + SECOND_STATUS_WORD, 
					(A_UCHAR *)&rxStatsInfo.status2, sizeof(rxStatsInfo.status2));

		if (rxStatsInfo.status2 & DESC_DONE) {
			pLibDev->devMap.OSmemRead(devNum, rxStatsInfo.descToRead + FIRST_STATUS_WORD, 
					(A_UCHAR *)&rxStatsInfo.status1, sizeof(rxStatsInfo.status1));
			pLibDev->devMap.OSmemRead(devNum, rxStatsInfo.descToRead + BUFFER_POINTER, 
					(A_UCHAR *)&rxStatsInfo.bufferAddr, sizeof(rxStatsInfo.bufferAddr));
			rxStatsInfo.descRate = descRate2bin((rxStatsInfo.status1 >> BITS_TO_RX_DATA_RATE) & pLibDev->rxDataRateMsk);

			// Initialize loop variables
			rxStatsInfo.badPacket = 0;
			rxStatsInfo.gotHeaderInfo = FALSE; // TODO: FIX for multi buffer packet support
			rxStatsInfo.illegalBuffSize = 0;
			rxStatsInfo.controlFrameReceived = 0;
			rxStatsInfo.mdkPktType = 0;
			//reset our timeout counter
			i = 0;

			// Increase buffer address for PPM
			if(pLibDev->rx.enablePPM) {
				rxStatsInfo.bufferAddr += PPM_DATA_SIZE;
			}
						
			if (numDesc == pLibDev->rx.numDesc - 1) {
				//This is the final looped rx desc and done bit is set, we ran out of receive descriptors, 
				//so return with an error
				mError(devNum, ENOMEM, "Device Number %d:txrxDataBegin:  ran out of receive descriptors\n", devNum);
				break;
			}
			mdkExtractAddrAndSequence(devNum, &rxStatsInfo);

			//only process packets if things are good
			if ( !((rxStatsInfo.status1 & DESC_MORE) || rxStatsInfo.badPacket || rxStatsInfo.controlFrameReceived || 
				rxStatsInfo.illegalBuffSize) ) {
				
				//check for this being "last packet" or stats packet
				//mdkExtractAddrAndSequence also pulled mdkPkt type info from packet
				if ((rxStatsInfo.status2 & DESC_FRM_RCV_OK) 
				 && (rxStatsInfo.mdkPktType == MDK_LAST_PKT)){
					lastPktReceived = TRUE;
					
					//if were not expecting remote stats then we are done
					if (!(remoteStats & ENABLE_STATS_RECEIVE)) {
						rxComplete = TRUE;
					}

					//we have done with receive so can send stats
					if((remoteStats & ENABLE_STATS_SEND) && txComplete) {
						for (i = 0; i < 1 /*MAX_TX_QUEUE*/; i++ )
						{
							for(statsLoop = 1; statsLoop < STATS_BINS; statsLoop++) {
								// Need to check if we have transmit OR receive stats for this rate
								if((pLibDev->rx.rxStats[i][statsLoop].crcPackets > 0) ||
									(pLibDev->rx.rxStats[i][statsLoop].goodPackets > 0) ||
									(pLibDev->tx[queueIndex].txStats[statsLoop].excessiveRetries > 0) ||
									(pLibDev->tx[queueIndex].txStats[statsLoop].goodPackets > 0)) {
									sendStatsPkt(devNum, statsLoop, MDK_TXRX_STATS_PKT, pLibDev->tx[queueIndex].destAddr.octets);
								}
							}
							sendStatsPkt(devNum, 0, MDK_TXRX_STATS_PKT, pLibDev->tx[queueIndex].destAddr.octets);
							statsSent = TRUE;
						}
					}
				}
				else if((rxStatsInfo.status2 & DESC_FRM_RCV_OK) 
					 && (rxStatsInfo.mdkPktType >= MDK_TX_STATS_PKT)
					 && (rxStatsInfo.mdkPktType <= MDK_TXRX_STATS_PKT)) {
					statsPktReceived = mdkExtractRemoteStats(devNum, &rxStatsInfo);
					rxComplete = statsPktReceived;
				}
				else if (rxStatsInfo.mdkPktType == MDK_NORMAL_PKT){
					if (enableCompare) {
						comparePktData(devNum, &rxStatsInfo);
					}
					if (pLibDev->rx.enablePPM) {
						extractPPM(devNum, &rxStatsInfo);
					}

					if(skipStats && (numStatsToSkip != 0)) {
						numStatsToSkip --;
					}
					else {
						mdkExtractRxStats(devNum, &rxStatsInfo);
					}

				}
				else {
					if(rxStatsInfo.status2 & DESC_FRM_RCV_OK) {
						mError(devNum, EIO, "Device Number %d:A good matching packet with an unknown MDK_PKT type detected MDK_PKT: %d\n", devNum, 
							rxStatsInfo.mdkPktType);
					}
					if (rxStatsInfo.status2 & DESC_CRC_ERR)
					{
						pLibDev->rx.rxStats[rxStatsInfo.qcuIndex][0].crcPackets++;
						pLibDev->rx.rxStats[rxStatsInfo.qcuIndex][rxStatsInfo.descRate].crcPackets++;
						pLibDev->rx.haveStats = 1;
					}
					else if (rxStatsInfo.status2 & pLibDev->decryptErrMsk)
					{
						pLibDev->rx.rxStats[rxStatsInfo.qcuIndex][0].decrypErrors++;
						pLibDev->rx.rxStats[rxStatsInfo.qcuIndex][rxStatsInfo.descRate].decrypErrors++;
						pLibDev->rx.haveStats = 1;
					}

				}
			}

			if(txComplete && rxComplete) {
				break;
			}

			//get next descriptor to process
			rxStatsInfo.descToRead += sizeof(MDK_ATHEROS_DESC);
			numDesc ++;
		}
		else {
			curTime = milliTime();
			if (curTime > (startTime+timeout)) {
				i = timeout;
				break;
			}
			mSleep(1);
			i++;
		}
	} while (i < timeout);

	if (i == timeout)
	{
		if (!txComplete) {
			mError(devNum, EIO, "Device Number %d:txrxDataBegin: timeout reached before all frames transmitted\n", devNum);
		}
		else {
			mError(devNum, EIO, 
			"Device Number %d:txrxDataBegin: timeout reached, without receiving all packets.  Number received = %lu\n", devNum,
			numDesc);

			if (!lastPktReceived) {
				mError(devNum, EIO, 
				"Device Number %d:txrxDataBegin: timeout reached, without receiving last packet\n", devNum);
			}

			if (!statsPktReceived && (remoteStats == ENABLE_STATS_RECEIVE)) {
				mError(devNum, EIO, 
				"Device Number %d:txrxDataBegin: timeout reached, without receiving stats packet\n", devNum);
			} 
			   
		}
	}



	if((remoteStats & ENABLE_STATS_SEND) && !statsSent) {
		for( i = 0; i < MAX_TX_QUEUE; i++ )
		{
			for(statsLoop = 1; statsLoop < STATS_BINS; statsLoop++) {
				// Need to check if we have transmit OR receive stats for this rate
				if((pLibDev->rx.rxStats[i][statsLoop].crcPackets > 0) ||
					(pLibDev->rx.rxStats[i][statsLoop].goodPackets > 0) ||
					(pLibDev->tx[queueIndex].txStats[statsLoop].excessiveRetries > 0) ||
					(pLibDev->tx[queueIndex].txStats[statsLoop].goodPackets > 0)) {
					sendStatsPkt(devNum, statsLoop, MDK_TXRX_STATS_PKT, pLibDev->tx[queueIndex].destAddr.octets);
				}
			}
			sendStatsPkt(devNum, 0, MDK_TXRX_STATS_PKT, pLibDev->tx[queueIndex].destAddr.octets);
		}
	}

	//cleanup
	ar5kInitData[pLibDev->ar5kInitIndex].pMacAPI->txCleanupConfig(devNum);
	ar5kInitData[pLibDev->ar5kInitIndex].pMacAPI->rxCleanupConfig(devNum);

	//write back the retry value
	//REGW(devNum, F2_RETRY_LMT, pLibDev->tx[queueIndex].retryValue);
	ar5kInitData[pLibDev->ar5kInitIndex].pMacAPI->setRetryLimit( devNum, 0 );	//__TODO__

	if(enableCompare) {
		free(rxStatsInfo.pCompareData);
	}

	return;
}

/**************************************************************************
* txGetStats - Read and return the tx stats values
*
* remote: set to 1 if want to get stats that were sent from a remote stn
*/
MANLIB_API void txGetStats
(
 A_UINT32 devNum, 
 A_UINT32 rateInMb,
 A_UINT32 remote,
 TX_STATS_STRUCT *pReturnStats 
)
{
	LIB_DEV_INFO *pLibDev = gLibInfo.pLibDevArray[devNum];
	A_UINT16	queueIndex = pLibDev->selQueueIndex;
	A_UINT32  rateBinIndex = rate2bin(rateInMb);
	
	memset(pReturnStats, 0, sizeof(TX_STATS_STRUCT));

	if (checkDevNum(devNum) == FALSE) {
		mError(devNum, EINVAL, "Device Number %d:txGetStats\n", devNum);
		return;
	}
//	if ( (rateInMb > 54) || ((rateBinIndex == 0) && (rateInMb)) ) {
//		mError(devNum, EINVAL, "Device Number %d:txGetStats: Invalid rateInMb value %x - use 0 for all rates\n", devNum,
//			rateInMb);
//		return;
//	}
	if (remote) {
		//check to see if we received remote stats
		if ((pLibDev->remoteStats == MDK_TX_STATS_PKT) || 
			(pLibDev->remoteStats == MDK_TXRX_STATS_PKT)) {
			memcpy(pReturnStats, &(pLibDev->txRemoteStats[rateBinIndex]), sizeof(TX_STATS_STRUCT)); 
		}
		else {
			mError(devNum, EIO, "Device Number %d:txGetStats: no remote stats were received\n", devNum);
			return;
		}
	}
	else {
		if(pLibDev->tx[queueIndex].haveStats) {
			memcpy(pReturnStats, &(pLibDev->tx[queueIndex].txStats[rateBinIndex]), sizeof(TX_STATS_STRUCT)); 
		}
		else {
			mError(devNum, EIO, "Device Number %d:txGetStats: no tx stats have been collected\n", devNum);
			return;
		}

	}
	return;
}

/**************************************************************************
* rxGetStats - Read and return the rx stats values
*
* remote: set to 1 if want to get stats that were sent from a remote stn
*/
MANLIB_API void rxGetStats
(
 A_UINT32 devNum,
 A_UINT32 rateInMb,
 A_UINT32 remote,
 RX_STATS_STRUCT *pReturnStats 
)
{
	LIB_DEV_INFO *pLibDev = gLibInfo.pLibDevArray[devNum];
	A_UINT32 rateBinIndex = rate2bin(rateInMb);

	//work around for venice to get to the correct CCK rate bins
	if(((pLibDev->swDevID & 0xff) >= 0x0013) && (pLibDev->mode == MODE_11B)){
		if((rateBinIndex > 0) && (rateBinIndex < 9)) {
			if(rateBinIndex == 1){
				rateBinIndex += 8;
			}
			else {
				rateBinIndex += 7;
			}
		}
	}

	memset(pReturnStats, 0, sizeof(RX_STATS_STRUCT));

	if (checkDevNum(devNum) == FALSE) {
		mError(devNum, EINVAL, "Device Number %d:rxGetStats\n", devNum);
		return;
	}
	if ( /*(rateInMb > 54) ||*/ ((rateBinIndex == 0) && (rateInMb)) ) {
		mError(devNum, EINVAL, "Device Number %d:rxGetStats: Invalid rateInMb value %d - use 0 for all rates\n", devNum,
			rateInMb);
		return;
	}

	if (remote) {
		//check to see if we received remote stats
		if ((pLibDev->remoteStats == MDK_RX_STATS_PKT) || 
			(pLibDev->remoteStats == MDK_TXRX_STATS_PKT)) {
			memcpy(pReturnStats, &(pLibDev->rxRemoteStats[rateBinIndex]), sizeof(RX_STATS_STRUCT)); 
		}
		else {
			mError(devNum, EIO, "Device Number %d:rxGetStats: no remote stats were received\n", devNum);
			return;
		}
	}
	else {
		if(pLibDev->rx.haveStats) { // __TODO__ 
			memcpy(pReturnStats, &(pLibDev->rx.rxStats[0][rateBinIndex]), sizeof(RX_STATS_STRUCT)); 
		}
		else {
			mError(devNum, EIO, "Device Number %d:rxGetStats: no rx stats have been collected\n", devNum);
			return;
		}
	}
	return;
}

/**************************************************************************
* rxGetData - Get data from a particular descriptor
*
* 
*/
MANLIB_API void rxGetData
(
 A_UINT32 devNum, 
 A_UINT32 bufferNum, 
 A_UCHAR *pReturnBuffer, 
 A_UINT32 sizeBuffer
)
{
	LIB_DEV_INFO *pLibDev = gLibInfo.pLibDevArray[devNum];
	A_UINT32 readSize, readAddr;
	A_UINT32 status;
	A_UINT32 descAddr;

	if (checkDevNum(devNum) == FALSE) {
		mError(devNum, EINVAL, "Device Number %d:rxGetData\n", devNum);
		return;
	}
	if(pLibDev->devState < RESET_STATE) {
		mError(devNum, EILSEQ, "Device Number %d:rxGetData: device not out of reset state - resetDevice must be run first\n", devNum);
	return;
	}
	if(pLibDev->rx.bufferAddress == 0) {
		mError(devNum, EILSEQ, "Device Number %d:rxGetData: receive buffer is empty - no valid data to read\n", devNum);
		return;
	}
	if(bufferNum > pLibDev->rx.numDesc) {
		mError(devNum, EINVAL, "Device Number %d:rxGetData: Asking for a buffer beyond the number setup for receive\n", devNum);
		return;
	}

	readSize = A_MIN(pLibDev->rx.bufferSize, sizeBuffer);
	readAddr = pLibDev->rx.bufferAddress + (pLibDev->rx.bufferSize * bufferNum);
	//read only if the descriptor is good, otherwise, move onto next descriptor
	descAddr = pLibDev->rx.descAddress + (sizeof(MDK_ATHEROS_DESC) * bufferNum);
	while(bufferNum < pLibDev->rx.numDesc) {
		pLibDev->devMap.OSmemRead(devNum, descAddr + SECOND_STATUS_WORD, 
					(A_UCHAR *)&status, sizeof(status));

		if (status & DESC_DONE) {
			if(status & DESC_FRM_RCV_OK) { 		
				pLibDev->devMap.OSmemRead(devNum, readAddr, pReturnBuffer, readSize);
				return;
			}
		} else {
			//found a descriptor that's not done, assume all others are same
			mError(devNum, EIO, "Device Number %d:rxGetData: Found descriptor not done before valid receive descriptor", devNum);
			return;
		}
		descAddr += sizeof(MDK_ATHEROS_DESC);
		readAddr += pLibDev->rx.bufferSize;
		bufferNum++;
	}
	//if got to here then ran out of descriptors
	mError(devNum, EIO, "Device Number %d:rxGetData: Unable to find a descriptor with RX_OK\n", devNum);
}


/**************************************************************************
* createTransmitPacket - create packet for transmission
*
*/
void createTransmitPacket
(
 A_UINT32 devNum, 
 A_UINT16 mdkType,
 A_UCHAR *dest, 
 A_UINT32 numDesc,
 A_UINT32 dataBodyLength, 
 A_UCHAR *dataPattern, 
 A_UINT32 da

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -