📄 rxproc.c
字号:
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 + -