}\r
\r
\r
+VOID \r
+FillPkt2Queue (\r
+ IN NIC_DEVICE * pNicDevice,\r
+ IN UINTN BufLength)\r
+{\r
+\r
+ UINT16 * pLength;\r
+ UINT16 * pLengthBar;\r
+ UINT8* pData;\r
+ UINT32 offset;\r
+ RX_TX_PACKET * pRxPacket;\r
+ UINTN LengthInBytes;\r
+ EFI_STATUS Status;\r
+ \r
+ for ( offset = 0; offset < BufLength; ){\r
+ pLength = (UINT16*) (pNicDevice->pBulkInBuff + offset);\r
+ pLengthBar = (UINT16*) (pNicDevice->pBulkInBuff + offset +2);\r
+ \r
+ *pLength &= 0x7ff;\r
+ *pLengthBar &= 0x7ff;\r
+ *pLengthBar |= 0xf800;\r
+ \r
+ if ((*pLength ^ *pLengthBar ) != 0xFFFF) {\r
+ DEBUG (( EFI_D_ERROR , "Pkt length error. BufLength = %d\n", BufLength));\r
+ return;\r
+ }\r
+ \r
+ pRxPacket = pNicDevice->pRxFree;\r
+ LengthInBytes = sizeof ( *pRxPacket ) - sizeof ( pRxPacket->pNext );\r
+ if ( NULL == pRxPacket ) {\r
+ Status = gBS->AllocatePool ( EfiRuntimeServicesData,\r
+ sizeof( RX_TX_PACKET ),\r
+ (VOID **) &pRxPacket );\r
+ if ( !EFI_ERROR ( Status )) {\r
+ //\r
+ // Add this packet to the free packet list\r
+ //\r
+ pNicDevice->pRxFree = pRxPacket;\r
+ pRxPacket->pNext = NULL;\r
+ }\r
+ else {\r
+ //\r
+ // Use the discard packet buffer\r
+ //\r
+ //pRxPacket = &Packet;\r
+ }\r
+ }\r
+ \r
+\r
+ pData = pNicDevice->pBulkInBuff + offset + 4;\r
+ pRxPacket->Length = *pLength;\r
+ pRxPacket->LengthBar = *(UINT16*) (pNicDevice->pBulkInBuff + offset +2);\r
+ CopyMem (&pRxPacket->Data[0], pData, *pLength);\r
+ //DEBUG((DEBUG_INFO, "Packet [%d]\n", *pLength));\r
+ \r
+ pNicDevice->pRxFree = pRxPacket->pNext;\r
+ pRxPacket->pNext = NULL;\r
+ \r
+ if ( NULL == pNicDevice->pRxTail ) {\r
+ pNicDevice->pRxHead = pRxPacket;\r
+ }\r
+ else {\r
+ pNicDevice->pRxTail->pNext = pRxPacket;\r
+ }\r
+ pNicDevice->pRxTail = pRxPacket;\r
+ offset += (*pLength + 4);\r
+ \r
+ }\r
+}\r
+\r
+\r
+\r
/**\r
Receive a frame from the network.\r
\r
// Locate a packet for use\r
//\r
pRxPacket = pNicDevice->pRxFree;\r
- LengthInBytes = sizeof ( *pRxPacket ) - sizeof ( pRxPacket->pNext );\r
+ LengthInBytes = MAX_BULKIN_SIZE;\r
if ( NULL == pRxPacket ) {\r
Status = gBS->AllocatePool ( EfiRuntimeServicesData,\r
- LengthInBytes,\r
+ sizeof ( *pRxPacket ),\r
(VOID **) &pRxPacket );\r
if ( !EFI_ERROR ( Status )) {\r
//\r
//\r
// Attempt to receive a packet\r
//\r
+ SetMem (&pNicDevice->pBulkInBuff[0], MAX_BULKIN_SIZE, 0);\r
pUsbIo = pNicDevice->pUsbIo;\r
Status = pUsbIo->UsbBulkTransfer ( pUsbIo,\r
USB_ENDPOINT_DIR_IN | BULK_IN_ENDPOINT,\r
- &pRxPacket->Length,\r
+ &pNicDevice->pBulkInBuff[0],\r
&LengthInBytes,\r
2,\r
&TransferStatus );\r
+ if ( LengthInBytes > 0 ) {\r
+ FillPkt2Queue(pNicDevice, LengthInBytes);\r
+ }\r
+ pRxPacket = pNicDevice->pRxHead;\r
if (( !EFI_ERROR ( Status ))\r
&& ( 0 < pRxPacket->Length )\r
- && ( pRxPacket->Length <= sizeof ( pRxPacket->Data ))) {\r
+ && ( pRxPacket->Length <= sizeof ( pRxPacket->Data ))\r
+ && ( LengthInBytes > 0)) {\r
\r
//\r
// Determine if the packet should be received\r
LengthInBytes ));\r
}\r
\r
- //\r
- // Remove this packet from the free packet list\r
- //\r
- pNicDevice->pRxFree = pRxPacket->pNext;\r
- pRxPacket->pNext = NULL;\r
-\r
- //\r
- // Append this packet to the receive list\r
- //\r
- if ( NULL == pNicDevice->pRxTail ) {\r
- pNicDevice->pRxHead = pRxPacket;\r
- }\r
- else {\r
- pNicDevice->pRxTail->pNext = pRxPacket;\r
- }\r
- pNicDevice->pRxTail = pRxPacket;\r
}\r
else {\r
//\r