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

📄 rxproc.c

📁 Windows CE 6.0 BSP for VOIP sample phone. Intel PXA270 platform.
💻 C
📖 第 1 页 / 共 3 页
字号:
        	if ((pStatus == NDIS_STATUS_RESOURCES) || (pStatus == NDIS_STATUS_SUCCESS))
        	{
            		// return packet
           	 	DBGPRINT(DBG_RXDATA, ("Packet returned success or resources...\n"));
            		ReturnRxPacketDesc(Adapter,pPacket);            
        	}
        	else
        	{
            		DBGPRINT(DBG_RXDATA, ("Packet returned pending...\n"));
				Adapter->bIsRxIndicatePacket = TRUE;		
        		}
		}
		else
		{
			PPACKET_QUEUE_NODE  pPacketNode = *((PACKET_QUEUE_NODE **)pPacket->MiniportReserved);
			InsertQNodeAtTail(&Adapter->RxPacketWaitQueue, pPacketNode);
        	}
    	}
    	else
    	{
        	DBGPRINT(DBG_RXDATA, ("Not connected, packet was dropped...\n"));
        	ReturnRxPacketDesc(Adapter,pPacket);

		Adapter->bIsRxIndicatePacket = FALSE;
    	}
	
#else

	if (Adapter->MediaConnectStatus == NdisMediaStateConnected)
    	{

///		RETAILMSG(1, (TEXT("NdisMEthIndicateReceive  \r\n")));
		
///		AllenDBGPRINT(DBG_RXDATA, ("NdisMEthIndicateReceive \n"));

		DBGPRINT(DBG_RXDATA,("Adapter->pRxBuf = %x  Adapter->ulRxSize = %x\n",
		                           (PVOID)(Adapter->pRxBuf), Adapter->ulRxSize));  
		DBGPRINT(DBG_RXDATA,("Adapter->CurrentLookAhead = %x \n",
		                           Adapter->CurrentLookAhead));  
   		///HexDump(DBG_RXDATA , "RX Buffer", Adapter->pRxBuf, Adapter->ulRxSize);

       	if ( Adapter->ulRxSize > Adapter->CurrentLookAhead  + MRVDRV_ETH_HEADER_SIZE )
			ulLookAhead = Adapter->CurrentLookAhead  + MRVDRV_ETH_HEADER_SIZE;
		else
			ulLookAhead = Adapter->ulRxSize;
	
		DBGPRINT(DBG_RXDATA,("ulLookAhead = %x \n", ulLookAhead));  
	
 		// Indicate to wrapper/protocol the received packet.
		if ( ulLookAhead < MRVDRV_ETH_HEADER_SIZE)
		{

			///RETAILMSG(1, (TEXT("NdisMEthIndicateReceive  1 \r\n")));

			DBGPRINT(DBG_RXDATA,("NdisMEthIndicateReceive 1 \n")); 
			
			NdisMEthIndicateReceive(
					Adapter->MrvDrvAdapterHdl,
					(NDIS_HANDLE)Adapter,
					(PVOID) (Adapter->pRxBuf ),
					(UINT)  MRVDRV_ETH_HEADER_SIZE,
					NULL,
					0,
					0
					);	
		}
		else
		{

			///RETAILMSG(1, (TEXT("NdisMEthIndicateReceive  2 \r\n")));
		
			DBGPRINT(DBG_RXDATA,("NdisMEthIndicateReceive 2 \n")); 
			
			NdisMEthIndicateReceive(
					Adapter->MrvDrvAdapterHdl,
					(NDIS_HANDLE)Adapter,
					(PVOID) (Adapter->pRxBuf ),
					(UINT)  MRVDRV_ETH_HEADER_SIZE,
					(PVOID) (Adapter->pRxBuf + MRVDRV_ETH_HEADER_SIZE),
					(UINT)(ulLookAhead -MRVDRV_ETH_HEADER_SIZE),
					(UINT)(Adapter->ulRxSize - MRVDRV_ETH_HEADER_SIZE)
					);
		}
	
		NdisMEthIndicateReceiveComplete(Adapter->MrvDrvAdapterHdl);
	}
	else
    	{
		///RETAILMSG(1, (TEXT("Not connected, packet was dropped  \r\n")));

        	DBGPRINT(DBG_RXDATA, ("Not connected, packet was dropped...\n"));
    	}
	
#endif

	//NdisReleaseSpinLock(&Adapter->RxSpinLock);

	DBGPRINT(DBG_RXDATA,("-HandleRxReadyEvent()\n\n"));	

	return;
}

int ReadRxFrame(
	PMRVDRV_ADAPTER Adapter,
	ULONG *pFrameLen
	)
{
        USHORT		  usRxPacketLength  , usval;
	 PUSHORT         packetPtr;
    	 PCF_OBJECT 	  pCf = Adapter->hwIface;		
	 USHORT 		  packetSizeWords;
	 int 			  ii;
	 BOOLEAN         status = FALSE;
  	
	 Adapter->bIsDoingRx = TRUE;


	 if (Adapter->bIsEnterD3 == TRUE)
		goto end;

	 if ( (Adapter->psState == PS_STATE_SLEEP) ||(Adapter->psState == PS_STATE_SLEEP_PENDING))
                goto end1;	
		
        /// check for upload ready
    	 NdisRawReadPortUshort( 
    			pCf->ulMrvDrvVirtualIoBase + CFMACREG_CCR_CARD_STATUS,
    			&usval);

        if (!(usval & CFMACREG_HCR_HIM_RxUpLdRdy))
    	 {	
                DBGPRINT(DBG_ERROR, ("ERROR: Device RX upload ready is not set, nothing to read!\n"));
        	  goto end1;
    	 }

    	 /// read packet length
    	 NdisRawReadPortUshort(
  		 		pCf->ulMrvDrvVirtualIoBase + CFMACREG_CCR_IO_READ_LEN,
				&usRxPacketLength);
	   
    	DBGPRINT(DBG_HWIF,("cf_RxStartPacket: Will transfer %d bytes\n",usRxPacketLength));          

	Adapter->ulRxSize = usRxPacketLength; 

    	if ( usRxPacketLength < (sizeof(RxPD) + 14) ||
	     usRxPacketLength > MRVDRV_ETH_RX_PACKET_BUFFER_SIZE )	                
	{
		DBGPRINT(DBG_ERROR,("RECV Got incorrect packet size (%d). Discarding!\n", usRxPacketLength));
        	goto end;
    	}

       /// Read current block from the device.
    	DBGPRINT(DBG_T2 | DBG_CRLF,("Start RX block\n"));
	  
   	// pCf->ulRxPacketByteCount += Adapter->ulRxSize;

    	// Read RxPD
    	packetPtr = (USHORT *)(&Adapter->RxPD);    
    	packetSizeWords = sizeof(RxPD) >> 1;
    	for ( ii=0; ii < (int)packetSizeWords; ii++ )
    	{
        	NdisRawReadPortUshort(
  			        	pCf->ulMrvDrvVirtualIoBase + CFMACREG_HCR_IO_READ_PORT,
   	           		 	packetPtr);
       	packetPtr++;
    	}	
		
       DBGPRINT(DBG_RXDATA,("Adapter->pRxBuf = %x \n", (PVOID)(Adapter->pRxBuf)));   
 	DBGPRINT(DBG_RXDATA,("sizeof(RxPD) = %x \n",  sizeof(RxPD)));   
	DBGPRINT(DBG_RXDATA,("Adapter->RxPD->PktPtr = %x \n", Adapter->RxPD.PktPtr)); 
	   
    	Adapter->ulRxSize -= sizeof(RxPD);

	// Read the destination and soure addresss of 802.3 frame
	packetPtr = (PUSHORT)Adapter->pRxBuf;
	       
    	packetSizeWords = MRVDRV_ETH_ADDR_LEN*2 >> 1;
    	for ( ii = 0; ii < (int)packetSizeWords; ii++ )
    	{
		NdisRawReadPortUshort(
  				        pCf->ulMrvDrvVirtualIoBase + CFMACREG_HCR_IO_READ_PORT,
   	             			 packetPtr);
        	packetPtr++;
    	}
	
    	// Read LLC header and discard, LLC header is 8 bytes
	packetSizeWords = 8 >> 1;
	for ( ii=0; ii < (int)packetSizeWords; ii++ )
            	{
        	NdisRawReadPortUshort(
  			        	pCf->ulMrvDrvVirtualIoBase + CFMACREG_HCR_IO_READ_PORT,
   	       	     		packetPtr);
		packetPtr++;
            	}
    	//Adapter->ulRxSize -= 8;
       
	// Read the other of 802.3 frame 
	packetSizeWords = (USHORT)(Adapter->ulRxSize+1) / sizeof(USHORT);
    	for( ii = 0; ii < (int)packetSizeWords; ii++ )
            	        {
		NdisRawReadPortUshort(
  				        pCf->ulMrvDrvVirtualIoBase + CFMACREG_HCR_IO_READ_PORT,
   	             			 packetPtr);
        	packetPtr++;
            	        }
	
	
       /*
       {     ULONG i;
			
		RETAILMSG(1, (TEXT("RX Buffer_2  \r\n")));	
			
		for (i=0; i<Adapter->ulRxSize; i++)
		{
                     RETAILMSG(1, (TEXT("%02x  "), *(((UCHAR *)(Adapter->pRxBuf))+ i) ));
			if (((i %16) == 0) && i)
				RETAILMSG(1, (TEXT("\r\n")));
			
	       }	
		RETAILMSG(1, (TEXT("\r\n")));		
       }
       */

     	if ((*(Adapter->pRxBuf + 14) == 0xaa) &&
             (*(Adapter->pRxBuf + 15) == 0xaa) &&
             (*(Adapter->pRxBuf + 16) == 0x03) &&
             (*(Adapter->pRxBuf + 20) == 0x88) &&
             (*(Adapter->pRxBuf + 21) == 0x8e) )

	       {
///RETAILMSG(1, (TEXT("Receive EPOL KEY  \r\n")));
		NdisMoveMemory( Adapter->pRxBuf+12, Adapter->pRxBuf+20, Adapter->ulRxSize-20);	
			 Adapter->ulRxSize -= 8;
    	       }
	       /*	
    	       else
    	       {
		        UCHAR c;
		        c = *(Adapter->pRxBuf+12);
		        *(Adapter->pRxBuf+12) = *(Adapter->pRxBuf+13);
		        *(Adapter->pRxBuf+13) = c;
    	       }
	       */
              ///HexDump(DBG_RXDATA | DBG_ALLEN, "RX Buffer_2", Adapter->pRxBuf, Adapter->ulRxSize);

	*pFrameLen = Adapter->ulRxSize;
    	status = TRUE;

end:
	
    	cf_RxEndPacket(pCf);
end1:		
	
	Adapter->bIsDoingRx = FALSE;

	return status;

}	

/******************************************************************************
 *
 *  Name: MrvDrvTransferData()
 *
 *  Description: Transferdata function to complete the Rx operation
 *
 *  Arguments:	
 *    
 *  Return Value:        
 * 
 *  Notes:               
 *
 *****************************************************************************/

NDIS_STATUS
MrvDrvTransferData(
    	OUT PNDIS_PACKET pPacket,
    	OUT PUINT pBytesTransferred,
    	IN NDIS_HANDLE hMiniportAdapterContext,
    	IN NDIS_HANDLE hMiniportReceiveContext,
    	IN UINT ulByteOffset,
    	IN UINT ulBytesToTransfer)
{

	PMRVDRV_ADAPTER	Adapter;
	UINT				nBytesLeft, nBytesNow, nBytesWanted, BufLen;
	PUCHAR				CurCardLoc, BufStart;
	PNDIS_BUFFER		CurBuffer;

	Adapter = (PMRVDRV_ADAPTER)hMiniportAdapterContext;

   	DBGPRINT(DBG_RXDATA, ("+MrvDrvTransferData() \n"));

	DBGPRINT(DBG_RXDATA,("ulByteOffset = %x,  ulBytesToTransfer = %x\n",ulByteOffset, ulBytesToTransfer));     

	DBGPRINT(DBG_RXDATA,("Adapter->pRxBuf = %x \n", (PVOID)(Adapter->pRxBuf)));     

       ulByteOffset += MRVDRV_ETH_HEADER_SIZE; 
 
	// See how much data there is to transfer.
	if ((ulByteOffset + ulBytesToTransfer) > Adapter->ulRxSize) 
	{
		if (Adapter->ulRxSize < ulByteOffset) 
		{
			*pBytesTransferred = 0;
			return NDIS_STATUS_FAILURE;
		} 
		nBytesWanted = Adapter->ulRxSize - ulByteOffset;
		DBGPRINT(DBG_RXDATA,("@@@@ \n"));   
	} 
	else
	{
		nBytesWanted = ulBytesToTransfer;
		DBGPRINT(DBG_RXDATA,("#### \n")); 
	}

	DBGPRINT(DBG_RXDATA,("ulByteOffset = %x,  nBytesWanted = %x\n",ulByteOffset, nBytesWanted));     

	// Set the number of bytes left to transfer
	nBytesLeft = nBytesWanted;

	// Copy data from the Adapter->pRxBuf to the Packet structure.
	CurCardLoc = (PUCHAR)(Adapter->pRxBuf);
	CurCardLoc += ulByteOffset;

	// Get location to copy into.
	NdisQueryPacket(pPacket, NULL, NULL, &CurBuffer, NULL);
	NdisQueryBufferSafe(CurBuffer, (PVOID *)&BufStart, &BufLen,NormalPagePriority);

	while (nBytesLeft > 0) 
	{
		if (BufLen > nBytesLeft) 
		{
			nBytesNow = nBytesLeft;
		} 
		else 
		{
			nBytesNow = BufLen;
		} 

		NdisMoveMemory((PVOID)BufStart, (PVOID)CurCardLoc, (ULONG)nBytesNow);

		CurCardLoc += nBytesNow;
		nBytesLeft -= nBytesNow;

		if (nBytesLeft == 0) 
		{
			break;
		} 

		// Set up next buffer.
		NdisGetNextBuffer(CurBuffer, &CurBuffer);
		if (CurBuffer == (PNDIS_BUFFER)NULL) 
		{
			break;
		} 
		NdisQueryBufferSafe(CurBuffer, (PVOID *)&BufStart, &BufLen, NormalPagePriority);

    	} 

	*pBytesTransferred = nBytesWanted - nBytesLeft;

	DBGPRINT(DBG_RXDATA,("*pBytesTransferred = %x \n",*pBytesTransferred));     
	
	// if ( Adapter->EnableQOS )
	// {
	// 	 PRxPD			pRxPD = (PRxPD)Adapter->pRxBuf;
	//	 ULONG			RxPriority;
	//
	//	 // Bits 7:4 is the tag
	//	 RxPriority = (pRxPD->Status >> 4) & 0xF;
	//
	//	 NDIS_PER_PACKET_INFO_FROM_PACKET(pPacket, Ieee8021pPriority) = (PVOID)RxPriority;
	// }
	
	NDIS_SET_PACKET_STATUS(pPacket, NDIS_STATUS_SUCCESS);
	
	return NDIS_STATUS_SUCCESS;
}

⌨️ 快捷键说明

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