Ax88772: Add logic to separate packet, fix MTU issue. Ax88772b: Fix driver model unload function, fix SCT test failures.
Signed-off-by: Yu Pei <pei.yu@intel.com> Reviewed-by: Ouyang Qian <qian.ouyang@intel.com> Reviewed-by: Leahy, Leroy P <Leroy.P.Leahy@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14443 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@@ -656,6 +656,78 @@ Ax88772Reset (
|
||||
}
|
||||
|
||||
|
||||
VOID
|
||||
FillPkt2Queue (
|
||||
IN NIC_DEVICE * pNicDevice,
|
||||
IN UINTN BufLength)
|
||||
{
|
||||
|
||||
UINT16 * pLength;
|
||||
UINT16 * pLengthBar;
|
||||
UINT8* pData;
|
||||
UINT32 offset;
|
||||
RX_TX_PACKET * pRxPacket;
|
||||
UINTN LengthInBytes;
|
||||
EFI_STATUS Status;
|
||||
|
||||
for ( offset = 0; offset < BufLength; ){
|
||||
pLength = (UINT16*) (pNicDevice->pBulkInBuff + offset);
|
||||
pLengthBar = (UINT16*) (pNicDevice->pBulkInBuff + offset +2);
|
||||
|
||||
*pLength &= 0x7ff;
|
||||
*pLengthBar &= 0x7ff;
|
||||
*pLengthBar |= 0xf800;
|
||||
|
||||
if ((*pLength ^ *pLengthBar ) != 0xFFFF) {
|
||||
DEBUG (( EFI_D_ERROR , "Pkt length error. BufLength = %d\n", BufLength));
|
||||
return;
|
||||
}
|
||||
|
||||
pRxPacket = pNicDevice->pRxFree;
|
||||
LengthInBytes = sizeof ( *pRxPacket ) - sizeof ( pRxPacket->pNext );
|
||||
if ( NULL == pRxPacket ) {
|
||||
Status = gBS->AllocatePool ( EfiRuntimeServicesData,
|
||||
sizeof( RX_TX_PACKET ),
|
||||
(VOID **) &pRxPacket );
|
||||
if ( !EFI_ERROR ( Status )) {
|
||||
//
|
||||
// Add this packet to the free packet list
|
||||
//
|
||||
pNicDevice->pRxFree = pRxPacket;
|
||||
pRxPacket->pNext = NULL;
|
||||
}
|
||||
else {
|
||||
//
|
||||
// Use the discard packet buffer
|
||||
//
|
||||
//pRxPacket = &Packet;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
pData = pNicDevice->pBulkInBuff + offset + 4;
|
||||
pRxPacket->Length = *pLength;
|
||||
pRxPacket->LengthBar = *(UINT16*) (pNicDevice->pBulkInBuff + offset +2);
|
||||
CopyMem (&pRxPacket->Data[0], pData, *pLength);
|
||||
//DEBUG((DEBUG_INFO, "Packet [%d]\n", *pLength));
|
||||
|
||||
pNicDevice->pRxFree = pRxPacket->pNext;
|
||||
pRxPacket->pNext = NULL;
|
||||
|
||||
if ( NULL == pNicDevice->pRxTail ) {
|
||||
pNicDevice->pRxHead = pRxPacket;
|
||||
}
|
||||
else {
|
||||
pNicDevice->pRxTail->pNext = pRxPacket;
|
||||
}
|
||||
pNicDevice->pRxTail = pRxPacket;
|
||||
offset += (*pLength + 4);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Receive a frame from the network.
|
||||
|
||||
@@ -760,10 +832,10 @@ Ax88772Rx (
|
||||
// Locate a packet for use
|
||||
//
|
||||
pRxPacket = pNicDevice->pRxFree;
|
||||
LengthInBytes = sizeof ( *pRxPacket ) - sizeof ( pRxPacket->pNext );
|
||||
LengthInBytes = MAX_BULKIN_SIZE;
|
||||
if ( NULL == pRxPacket ) {
|
||||
Status = gBS->AllocatePool ( EfiRuntimeServicesData,
|
||||
LengthInBytes,
|
||||
sizeof ( *pRxPacket ),
|
||||
(VOID **) &pRxPacket );
|
||||
if ( !EFI_ERROR ( Status )) {
|
||||
//
|
||||
@@ -783,16 +855,22 @@ Ax88772Rx (
|
||||
//
|
||||
// Attempt to receive a packet
|
||||
//
|
||||
SetMem (&pNicDevice->pBulkInBuff[0], MAX_BULKIN_SIZE, 0);
|
||||
pUsbIo = pNicDevice->pUsbIo;
|
||||
Status = pUsbIo->UsbBulkTransfer ( pUsbIo,
|
||||
USB_ENDPOINT_DIR_IN | BULK_IN_ENDPOINT,
|
||||
&pRxPacket->Length,
|
||||
&pNicDevice->pBulkInBuff[0],
|
||||
&LengthInBytes,
|
||||
2,
|
||||
&TransferStatus );
|
||||
if ( LengthInBytes > 0 ) {
|
||||
FillPkt2Queue(pNicDevice, LengthInBytes);
|
||||
}
|
||||
pRxPacket = pNicDevice->pRxHead;
|
||||
if (( !EFI_ERROR ( Status ))
|
||||
&& ( 0 < pRxPacket->Length )
|
||||
&& ( pRxPacket->Length <= sizeof ( pRxPacket->Data ))) {
|
||||
&& ( pRxPacket->Length <= sizeof ( pRxPacket->Data ))
|
||||
&& ( LengthInBytes > 0)) {
|
||||
|
||||
//
|
||||
// Determine if the packet should be received
|
||||
@@ -869,22 +947,6 @@ Ax88772Rx (
|
||||
LengthInBytes ));
|
||||
}
|
||||
|
||||
//
|
||||
// Remove this packet from the free packet list
|
||||
//
|
||||
pNicDevice->pRxFree = pRxPacket->pNext;
|
||||
pRxPacket->pNext = NULL;
|
||||
|
||||
//
|
||||
// Append this packet to the receive list
|
||||
//
|
||||
if ( NULL == pNicDevice->pRxTail ) {
|
||||
pNicDevice->pRxHead = pRxPacket;
|
||||
}
|
||||
else {
|
||||
pNicDevice->pRxTail->pNext = pRxPacket;
|
||||
}
|
||||
pNicDevice->pRxTail = pRxPacket;
|
||||
}
|
||||
else {
|
||||
//
|
||||
|
@@ -39,22 +39,24 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// Macros
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#if defined(_MSC_VER) /* Handle Microsoft VC++ compiler specifics. */
|
||||
#define DBG_ENTER() DEBUG (( DEBUG_INFO, "Entering " __FUNCTION__ "\n" )) ///< Display routine entry
|
||||
#define DBG_EXIT() DEBUG (( DEBUG_INFO, "Exiting " __FUNCTION__ "\n" )) ///< Display routine exit
|
||||
#define DBG_EXIT_DEC(Status) DEBUG (( DEBUG_INFO, "Exiting " __FUNCTION__ ", Status: %d\n", Status )) ///< Display routine exit with decimal value
|
||||
#define DBG_EXIT_HEX(Status) DEBUG (( DEBUG_INFO, "Exiting " __FUNCTION__ ", Status: 0x%08x\n", Status )) ///< Display routine exit with hex value
|
||||
#define DBG_EXIT_STATUS(Status) DEBUG (( DEBUG_INFO, "Exiting " __FUNCTION__ ", Status: %r\n", Status )) ///< Display routine exit with status value
|
||||
#define DBG_EXIT_TF(Status) DEBUG (( DEBUG_INFO, "Exiting " __FUNCTION__ ", returning %s\n", (FALSE == Status) ? L"FALSE" : L"TRUE" )) ///< Display routine with TRUE/FALSE value
|
||||
#else // _MSC_VER
|
||||
//
|
||||
//Too many output debug info hangs system in Debug tip
|
||||
//
|
||||
//#if defined(_MSC_VER) /* Handle Microsoft VC++ compiler specifics. */
|
||||
//#define DBG_ENTER() DEBUG (( DEBUG_INFO, "Entering " __FUNCTION__ "\n" )) ///< Display routine entry
|
||||
//#define DBG_EXIT() DEBUG (( DEBUG_INFO, "Exiting " __FUNCTION__ "\n" )) ///< Display routine exit
|
||||
//#define DBG_EXIT_DEC(Status) DEBUG (( DEBUG_INFO, "Exiting " __FUNCTION__ ", Status: %d\n", Status )) ///< Display routine exit with decimal value
|
||||
//#define DBG_EXIT_HEX(Status) DEBUG (( DEBUG_INFO, "Exiting " __FUNCTION__ ", Status: 0x%08x\n", Status )) ///< Display routine exit with hex value
|
||||
//#define DBG_EXIT_STATUS(Status) DEBUG (( DEBUG_INFO, "Exiting " __FUNCTION__ ", Status: %r\n", Status )) ///< Display routine exit with status value
|
||||
//#define DBG_EXIT_TF(Status) DEBUG (( DEBUG_INFO, "Exiting " __FUNCTION__ ", returning %s\n", (FALSE == Status) ? L"FALSE" : L"TRUE" )) ///< Display routine with TRUE/FALSE value
|
||||
//#else // _MSC_VER
|
||||
#define DBG_ENTER() ///< Display routine entry
|
||||
#define DBG_EXIT() ///< Display routine exit
|
||||
#define DBG_EXIT_DEC(Status) ///< Display routine exit with decimal value
|
||||
#define DBG_EXIT_HEX(Status) ///< Display routine exit with hex value
|
||||
#define DBG_EXIT_STATUS(Status) ///< Display routine exit with status value
|
||||
#define DBG_EXIT_TF(Status) ///< Display routine with TRUE/FALSE value
|
||||
#endif // _MSC_VER
|
||||
//#endif // _MSC_VER
|
||||
|
||||
#define USB_IS_IN_ENDPOINT(EndPointAddr) (((EndPointAddr) & BIT7) != 0) ///< Return TRUE/FALSE for IN direction
|
||||
#define USB_IS_OUT_ENDPOINT(EndPointAddr) (((EndPointAddr) & BIT7) == 0) ///< Return TRUE/FALSE for OUT direction
|
||||
@@ -80,6 +82,8 @@
|
||||
#define ETHERNET_HEADER_SIZE sizeof ( ETHERNET_HEADER ) ///< Size in bytes of the Ethernet header
|
||||
#define MIN_ETHERNET_PKT_SIZE 60 ///< Minimum packet size including Ethernet header
|
||||
#define MAX_ETHERNET_PKT_SIZE 1500 ///< Ethernet spec 3.1.1: Minimum packet size
|
||||
#define MAX_BULKIN_SIZE 2048 ///< Maximum size of one UsbBulk
|
||||
|
||||
|
||||
#define USB_NETWORK_CLASS 0x09 ///< USB Network class code
|
||||
#define USB_BUS_TIMEOUT 1000 ///< USB timeout in milliseconds
|
||||
@@ -340,6 +344,7 @@ typedef struct {
|
||||
RX_TX_PACKET * pRxTail; ///< Tail of receive packet list
|
||||
RX_TX_PACKET * pRxFree; ///< Free packet list
|
||||
INT32 MulticastHash[2]; ///< Hash table for multicast destination addresses
|
||||
UINT8 * pBulkInBuff; ///< Buffer for Usb Bulk
|
||||
} NIC_DEVICE;
|
||||
|
||||
#define DEV_FROM_SIMPLE_NETWORK(a) CR (a, NIC_DEVICE, SimpleNetwork, DEV_SIGNATURE) ///< Locate NIC_DEVICE from Simple Network Protocol
|
||||
|
@@ -2,7 +2,7 @@
|
||||
# Component description file for ASIX AX88772 USB/Ethernet driver.
|
||||
#
|
||||
# This module provides support for the ASIX AX88772 USB/Ethernet adapter.
|
||||
# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
|
||||
# Copyright (c) 2011-2013, Intel Corporation. All rights reserved.<BR>
|
||||
#
|
||||
# This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
@@ -15,7 +15,7 @@
|
||||
##
|
||||
|
||||
[Defines]
|
||||
INF_VERSION = 0x00010005
|
||||
INF_VERSION = 0x00010018
|
||||
BASE_NAME = Ax88772
|
||||
FILE_GUID = B15239D6-6A01-4808-A0F7-B7F20F073555
|
||||
MODULE_TYPE = DXE_RUNTIME_DRIVER
|
||||
@@ -48,15 +48,10 @@
|
||||
UefiDriverEntryPoint
|
||||
|
||||
[Protocols]
|
||||
gEfiDevicePathProtocolGuid
|
||||
gEfiSimpleNetworkProtocolGuid
|
||||
gEfiDevicePathProtocolGuid ## BY_START
|
||||
gEfiSimpleNetworkProtocolGuid ## BY_START
|
||||
gEfiUsbIoProtocolGuid ## TO_START
|
||||
|
||||
[Guids]
|
||||
gEfiEventExitBootServicesGuid ## PRODUCES ## Event
|
||||
gEfiEventVirtualAddressChangeGuid ## PRODUCES ## Event
|
||||
gEfiNicIp4ConfigVariableGuid
|
||||
|
||||
[Depex]
|
||||
gEfiBdsArchProtocolGuid AND
|
||||
gEfiCpuArchProtocolGuid AND
|
||||
|
@@ -1,7 +1,7 @@
|
||||
/** @file
|
||||
Implement the driver binding protocol for Asix AX88772 Ethernet driver.
|
||||
|
||||
Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 2011-2013, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
@@ -481,23 +481,10 @@ EntryPoint (
|
||||
IN EFI_SYSTEM_TABLE * pSystemTable
|
||||
)
|
||||
{
|
||||
EFI_LOADED_IMAGE_PROTOCOL * pLoadedImage;
|
||||
EFI_STATUS Status;
|
||||
|
||||
DBG_ENTER ( );
|
||||
|
||||
//
|
||||
// Enable unload support
|
||||
//
|
||||
Status = gBS->HandleProtocol (
|
||||
gImageHandle,
|
||||
&gEfiLoadedImageProtocolGuid,
|
||||
(VOID **)&pLoadedImage
|
||||
);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
pLoadedImage->Unload = DriverUnload;
|
||||
}
|
||||
|
||||
//
|
||||
// Add the driver to the list of drivers
|
||||
//
|
||||
|
@@ -858,7 +858,7 @@ SN_Setup (
|
||||
pMode->State = EfiSimpleNetworkStopped;
|
||||
pMode->HwAddressSize = PXE_HWADDR_LEN_ETHER;
|
||||
pMode->MediaHeaderSize = sizeof ( ETHERNET_HEADER );
|
||||
pMode->MaxPacketSize = AX88772_MAX_PKT_SIZE;
|
||||
pMode->MaxPacketSize = MAX_ETHERNET_PKT_SIZE;
|
||||
pMode->NvRamSize = 0;
|
||||
pMode->NvRamAccessSize = 0;
|
||||
pMode->ReceiveFilterMask = EFI_SIMPLE_NETWORK_RECEIVE_UNICAST
|
||||
@@ -885,6 +885,15 @@ SN_Setup (
|
||||
pNicDevice->PhyId = PHY_ID_INTERNAL;
|
||||
pNicDevice->b100Mbps = TRUE;
|
||||
pNicDevice->bFullDuplex = TRUE;
|
||||
|
||||
Status = gBS->AllocatePool ( EfiRuntimeServicesData,
|
||||
MAX_BULKIN_SIZE,
|
||||
(VOID **) &pNicDevice->pBulkInBuff);
|
||||
if ( EFI_ERROR(Status)) {
|
||||
DEBUG (( EFI_D_ERROR, "Memory are not enough\n"));
|
||||
return Status;
|
||||
}
|
||||
|
||||
Status = Ax88772MacAddressGet (
|
||||
pNicDevice,
|
||||
&pMode->PermanentAddress.Addr[0]);
|
||||
@@ -958,7 +967,7 @@ SN_Start (
|
||||
pMode->State = EfiSimpleNetworkStarted;
|
||||
pMode->HwAddressSize = PXE_HWADDR_LEN_ETHER;
|
||||
pMode->MediaHeaderSize = sizeof ( ETHERNET_HEADER );
|
||||
pMode->MaxPacketSize = AX88772_MAX_PKT_SIZE;
|
||||
pMode->MaxPacketSize = MAX_ETHERNET_PKT_SIZE;
|
||||
pMode->ReceiveFilterMask = EFI_SIMPLE_NETWORK_RECEIVE_UNICAST
|
||||
| EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST
|
||||
| EFI_SIMPLE_NETWORK_RECEIVE_BROADCAST
|
||||
@@ -1360,7 +1369,11 @@ SN_Transmit (
|
||||
// Update the link status
|
||||
//
|
||||
pNicDevice = DEV_FROM_SIMPLE_NETWORK ( pSimpleNetwork );
|
||||
Ax88772Rx ( pNicDevice, FALSE );
|
||||
|
||||
//
|
||||
//No need to call receive to receive packet
|
||||
//
|
||||
//Ax88772Rx ( pNicDevice, FALSE );
|
||||
pMode->MediaPresent = pNicDevice->bLinkUp;
|
||||
|
||||
//
|
||||
|
Reference in New Issue
Block a user