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

📄 rxproc.c

📁 Windows CE 6.0 BSP for VOIP sample phone. Intel PXA270 platform.
💻 C
📖 第 1 页 / 共 3 页
字号:

    	// get a free packet 
    	pPacketNode = (PPACKET_QUEUE_NODE)PopFirstQNode(&Adapter->RxPacketFreeQueue);

    	// return the pointer of the packet 
    	*p_PPacket = pPacketNode->pPacket;
	
    	Adapter->sNumOutstandingRxPacket++;

    	NdisReleaseSpinLock(&Adapter->RxQueueSpinLock);

   	 DBGPRINT(DBG_RXDATA, ("Packet 0x%x allocated, NumOutstandingRxPacket = %d\n", 
                            pPacketNode->pPacket,
                            Adapter->sNumOutstandingRxPacket));
#endif

    	return GPS_SUCCESS;
}

/******************************************************************************
 *
 *  Name: ReturnRxPacketDesc()
 *
 *  Description: Return a RX Packet descriptor
 *
 *  Arguments:  PMRVDRV_ADAPTER Adapter
 *    
 *  Return Value: NONE
 * 
 *  Notes:        
 *
 *****************************************************************************/
VOID
ReturnRxPacketDesc(PMRVDRV_ADAPTER Adapter,
                   PNDIS_PACKET    pPacket)
{
#ifdef USE_RX_QUEUE

	PPACKET_QUEUE_NODE  pPacketNode = *((PACKET_QUEUE_NODE **)pPacket->MiniportReserved);

    	NdisAcquireSpinLock(&Adapter->RxQueueSpinLock);
    	
    	if ( Adapter->sNumOutstandingRxPacket <= 0 )
    	{
       	DBGPRINT(DBG_ERROR, ("ERROR: numOutstandingPacket already 0 before subtraction!!\n"));
        	NdisReleaseSpinLock(&Adapter->RxQueueSpinLock);
        	return;
    	}
		
	InsertQNodeFromHead(&Adapter->RxPacketFreeQueue, pPacketNode);
	Adapter->sNumOutstandingRxPacket--;
	
    	DBGPRINT(DBG_RXDATA, ("PacketNode(0x%x) with Packet(0x%x) returned, NumOutstandingRxPacket = %d\n", 
       	                     pPacketNode,
              	              pPacketNode->pPacket,
                     	       Adapter->sNumOutstandingRxPacket));
    
    	NdisReleaseSpinLock(&Adapter->RxQueueSpinLock);

#endif

}


UCHAR 
wlan_getAvgSNR(PMRVDRV_ADAPTER Adapter)
{
	UCHAR 	i;
	USHORT 	temp = 0;

	if (Adapter->numSNRNF == 0)
		return 0;

	for (i = 0; i <Adapter->numSNRNF; i++)
		temp += Adapter->rawSNR[i];

	return (UCHAR)(temp/Adapter->numSNRNF);
	
}

UCHAR 
wlan_getAvgNF(PMRVDRV_ADAPTER Adapter)
{
	UCHAR 	i;
	USHORT 	temp = 0;
	
	if (Adapter->numSNRNF == 0)
		return 0;

	for (i = 0; i <Adapter->numSNRNF; i++)
		temp += Adapter->rawNF[i];

	return (UCHAR)(temp/Adapter->numSNRNF);
	
}

VOID
wlan_save_rawSNRNF(PMRVDRV_ADAPTER Adapter, RxPD * pRxPD)
{
///  AllenDBGPRINT(DBG_ALLEN, ("pRxPD->SNR = %d, pRxPD->NF = %d\n",  pRxPD->SNR, pRxPD->NF));
	
	if (Adapter->numSNRNF < Adapter->data_avg_factor)
		Adapter->numSNRNF++;
	
	Adapter->rawSNR[Adapter->nextSNRNF] = pRxPD->SNR;
	Adapter->rawNF[Adapter->nextSNRNF] = pRxPD->NF;
	Adapter->nextSNRNF++;

	if (Adapter->nextSNRNF >= Adapter->data_avg_factor)
		Adapter->nextSNRNF = 0;

	return;
}

VOID
wlan_compute_rssi(PMRVDRV_ADAPTER Adapter, RxPD *pRxPD)
{
       ULONG CurrentTime, Diff;

	Adapter->SNR[TYPE_RXPD][TYPE_AVG] / AVG_SCALE, 
	Adapter->NF[TYPE_RXPD][TYPE_AVG] / AVG_SCALE;

	Adapter->SNR[TYPE_RXPD][TYPE_NOAVG] = pRxPD->SNR;
	Adapter->NF[TYPE_RXPD][TYPE_NOAVG] = pRxPD->NF;

       NdisGetSystemUpTime(&CurrentTime);   // unit = 1/1000 sec
       
       if (CurrentTime >= Adapter->RxPDSNRAge)
		Diff = CurrentTime - Adapter->RxPDSNRAge;
	else
		Diff = (0xffffffff - Adapter->RxPDSNRAge) + CurrentTime;

	if (Diff > RXPD_SNR_AGEOUT_TIME)
	{
		Adapter->numSNRNF = 0;
		Adapter->nextSNRNF = 0;
	}
	
	wlan_save_rawSNRNF(Adapter , pRxPD);

	Adapter->RxPDSNRAge = CurrentTime;
	
	///AllenDBGPRINT(DBG_ALLEN, ("NdisGetSystemUpTime = %08x \n", Adapter->RxPDSNRAge));
	
	Adapter->SNR[TYPE_RXPD][TYPE_AVG] = wlan_getAvgSNR(Adapter) * AVG_SCALE;
	Adapter->NF[TYPE_RXPD][TYPE_AVG] = wlan_getAvgNF(Adapter ) * AVG_SCALE;

       ///AllenDBGPRINT(DBG_ALLEN, ("After computing SNR: SNR-avg = %d, NF-avg = %d\n",
	///			Adapter->SNR[TYPE_RXPD][TYPE_AVG] / AVG_SCALE, 
	///			Adapter->NF[TYPE_RXPD][TYPE_AVG] / AVG_SCALE));
	

	Adapter->RSSI[TYPE_RXPD][TYPE_NOAVG] = 
			CAL_RSSI(Adapter->SNR[TYPE_RXPD][TYPE_NOAVG],
			Adapter->NF[TYPE_RXPD][TYPE_NOAVG]);

	Adapter->RSSI[TYPE_RXPD][TYPE_AVG] = 
			CAL_RSSI(Adapter->SNR[TYPE_RXPD][TYPE_AVG] / AVG_SCALE,
			Adapter->NF[TYPE_RXPD][TYPE_AVG] / AVG_SCALE);
	
	///AllenDBGPRINT(DBG_ALLEN, ("After computing RSSI = %d, RSSI-avg = %d\n",
	///			(Adapter->RSSI[TYPE_RXPD][TYPE_NOAVG]), 
	///			(Adapter->RSSI[TYPE_RXPD][TYPE_AVG])));
	
	return;
}


/******************************************************************************
 *
 *  Name: HandleRxReadyEvent()
 *
 *  Description: Rx ready event handler
 *
 *  Arguments:	PMRVDRV_ADAPTER Adapter
 *    
 *  Return Value:        
 * 
 *  Notes:               
 *
 *****************************************************************************/
VOID
HandleRxReadyEvent(
	IN PMRVDRV_ADAPTER Adapter)
{
	ULONG                        			ulFramlen;
	int                              			IsRxOK = 0;
	PRxPD			      			pRxPDCurrent;
    	PCF_OBJECT 		     	 		pCf = Adapter->hwIface;		
#ifdef USE_RX_QUEUE  	
    	MRVDRV_GET_PACKET_STATUS  qStatus;
    	PNDIS_PACKET                		pPacket;
	NDIS_STATUS                 		pStatus;
    	PNDIS_BUFFER                		pBuffer;
    	UINT                        			bufferLength;
    	PVOID                       			pRxBufVM;
#else
       ULONG                                       ulLookAhead;
#endif

///	AllenDBGPRINT(DBG_RXDATA | DBG_CRLF,("+HandleRxReadyEvent()\n"));

	//NdisAcquireSpinLock(&Adapter->RxSpinLock);

	/// read a frame from FW 
    	IsRxOK = ReadRxFrame(Adapter, &ulFramlen);

	if (IsRxOK == 0)
	{
		DBGPRINT(DBG_RXDATA | DBG_CRLF,("Read rx frame error \n"));
		///RETAILMSG(1, (TEXT("Read rx frame error  \r\n")));
		//NdisReleaseSpinLock(&Adapter->RxSpinLock);
		return;
	} 

    	/// Check RxPD status and update 802.3 stat, we should have more bits to test
    	pRxPDCurrent = (PRxPD)(&Adapter->RxPD);
	
	if (pRxPDCurrent->Status & MRVDRV_RXPD_STATUS_OK)
	{
		Adapter->RcvOK++;
		Adapter->DirectedFramesRcvOK++;
		
              ///RETAILMSG(1, (TEXT(" receive Date Rate = %x  \r\n"), pRxPDCurrent->RxRate));
              switch ( pRxPDCurrent->RxRate )
        	{      
             		case FRAME_STATUS_LINK_SPEED_1mbps :
                 		Adapter->LinkSpeed = MRVDRV_LINK_SPEED_1mbps;
                 		break;
                 
             		case FRAME_STATUS_LINK_SPEED_2mbps :
                 		Adapter->LinkSpeed  = MRVDRV_LINK_SPEED_2mbps;
                 		break;
             
             		case FRAME_STATUS_LINK_SPEED_5dot5mbps :
                 		Adapter->LinkSpeed  = MRVDRV_LINK_SPEED_5dot5mbps;
                 		break;
             
             		case FRAME_STATUS_LINK_SPEED_11mbps :
                 		Adapter->LinkSpeed  = MRVDRV_LINK_SPEED_11mbps;
                 		break;
             
             		case FRAME_STATUS_LINK_SPEED_6mbps :
                 		Adapter->LinkSpeed = MRVDRV_LINK_SPEED_6mbps;
                 		break;

			case FRAME_STATUS_LINK_SPEED_9mbps :
                 		Adapter->LinkSpeed = MRVDRV_LINK_SPEED_9mbps;
                 		break;
                 
             		case FRAME_STATUS_LINK_SPEED_12mbps :
                 		Adapter->LinkSpeed  = MRVDRV_LINK_SPEED_12mbps;
                 		break;
             
             		case FRAME_STATUS_LINK_SPEED_18mbps :
                 		Adapter->LinkSpeed  = MRVDRV_LINK_SPEED_18mbps;
                 		break;
             
             		case FRAME_STATUS_LINK_SPEED_24mbps :
                 		Adapter->LinkSpeed  = MRVDRV_LINK_SPEED_24mbps;
                 		break;
             
             		case FRAME_STATUS_LINK_SPEED_36mbps :
                 		Adapter->LinkSpeed = MRVDRV_LINK_SPEED_36mbps;
                 		break;

			case FRAME_STATUS_LINK_SPEED_48mbps :
                 		Adapter->LinkSpeed  = MRVDRV_LINK_SPEED_48mbps;
                 		break;
             
             		case FRAME_STATUS_LINK_SPEED_54mbps :
                 		Adapter->LinkSpeed = MRVDRV_LINK_SPEED_54mbps;
                 		break;

             		default :
                 		Adapter->LinkSpeed = MRVDRV_LINK_SPEED_11mbps;
                 		break;
        	}
        	

		wlan_compute_rssi (Adapter, pRxPDCurrent);

     		if ((Adapter->RSSI[TYPE_RXPD][TYPE_AVG] > -10) || (Adapter->RSSI[TYPE_RXPD][TYPE_AVG] < -200))
        	{
			DBGPRINT(DBG_ERROR, ("ERROR: Incorrect RSSI Value2 - SNR = %d, "
                                          "NF= %d, Adapter->RSSI[TYPE_RXPD][TYPE_AVG] = %d, Adapter->LastRSSI = %d\n", 
                                 pRxPDCurrent->SNR, 
                                 pRxPDCurrent->NF,
                                          Adapter->RSSI[TYPE_RXPD][TYPE_AVG],
                                 Adapter->LastRSSI));
        	}
        	else
        	{
            	       Adapter->LastRSSI = Adapter->RSSI[TYPE_RXPD][TYPE_AVG];                    
            	}
		
		if (Adapter->LastRSSI <= Adapter->RSSITriggerValue)
		{
			// Increment RSSITriggerCounter
			Adapter->RSSITriggerCounter++;
		}
		else
		{
			// Reset the counter if RSSI goes above the trigger level
			if (Adapter->RSSITriggerCounter !=0)
				Adapter->RSSITriggerCounter=0;
		}
	
		// If the trigger occurs many times, send indication above
		if (Adapter->RSSITriggerCounter >= MRVDRV_RSSI_INDICATION_THRESHOLD)
		{
		
			// Indicate to protocol driver about RSSI status
			NdisMIndicateStatus(Adapter->MrvDrvAdapterHdl,
						NDIS_STATUS_MEDIA_SPECIFIC_INDICATION,
						&(Adapter->LastRSSI),
						sizeof(LONG));
			NdisMIndicateStatusComplete(Adapter->MrvDrvAdapterHdl);
		
			// Reset the counter
			Adapter->RSSITriggerCounter=0;
		}

   		///AllenDBGPRINT(DBG_RXDATA, ("HandleRxReadyEvent: RSSI: pRxPDCurrent->SNR = %d,pRxPDCurrent->NF= %d \n Adapter->RSSI[TYPE_BEACON][TYPE_NOAVG] = %d \n Adapter->RSSI[TYPE_BEACON][TYPE_AVG]= %d\n Adapter->LastRSSI=%d\n", 
              ///			                            pRxPDCurrent->SNR, 
              ///                      		              pRxPDCurrent->NF,
              ///                      		              Adapter->RSSI[TYPE_RXPD][TYPE_NOAVG],
              ///                      		              Adapter->RSSI[TYPE_RXPD][TYPE_AVG],
              ///                      		              Adapter->LastRSSI));

	}
	else
	{
		DBGPRINT(DBG_RXDATA | DBG_WARNING,("WARNING: frame received with bad status\n"));
		///RETAILMSG(1, (TEXT("WARNING: frame received with bad status  \r\n")));
	}

       if ( Adapter->bIsPendingReset == TRUE )
			return; 

	if (Adapter->bIsFreeNow == TRUE)
			return; 
	
	//return;
	

    	/// Get a packet then fill it and indicate to NDIS
    	
#ifdef USE_RX_QUEUE

	qStatus = GetRxPacketDesc(Adapter, &pPacket);

	if (qStatus == GPS_FAILED)
    	{
       	DBGPRINT( DBG_RXDATA | DBG_WARNING,("Unable to obtain packet descriptor, just drop packet\n"));

		//NdisReleaseSpinLock(&Adapter->RxSpinLock);
		return;
    	}
    
    	NdisQueryPacket(pPacket, NULL, NULL, &pBuffer, NULL);
    	NdisQueryBufferSafe(pBuffer, &pRxBufVM, &bufferLength, HighPagePriority);

    	if (Adapter->MediaConnectStatus == NdisMediaStateConnected)
    	{
       	Adapter->ulRxByteInLastPeriod += Adapter->ulRxSize;

        	NdisAdjustBufferLength(pBuffer, Adapter->ulRxSize);

		NdisMoveMemory( pRxBufVM, Adapter->pRxBuf, Adapter->ulRxSize);
		
        	NDIS_SET_PACKET_STATUS(pPacket, NDIS_STATUS_SUCCESS);


		if (Adapter->bIsRxIndicatePacket == FALSE)
		{
		NdisMIndicateReceivePacket(Adapter->MrvDrvAdapterHdl, &pPacket, 1);
        	pStatus = NDIS_GET_PACKET_STATUS(pPacket);
        

⌨️ 快捷键说明

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