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:
Yu Pei 2013-06-27 05:07:29 +00:00 committed by qianouyang
parent ca24313165
commit 4986bbaf11
8 changed files with 341 additions and 207 deletions

View File

@ -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. Receive a frame from the network.
@ -760,10 +832,10 @@ Ax88772Rx (
// Locate a packet for use // Locate a packet for use
// //
pRxPacket = pNicDevice->pRxFree; pRxPacket = pNicDevice->pRxFree;
LengthInBytes = sizeof ( *pRxPacket ) - sizeof ( pRxPacket->pNext ); LengthInBytes = MAX_BULKIN_SIZE;
if ( NULL == pRxPacket ) { if ( NULL == pRxPacket ) {
Status = gBS->AllocatePool ( EfiRuntimeServicesData, Status = gBS->AllocatePool ( EfiRuntimeServicesData,
LengthInBytes, sizeof ( *pRxPacket ),
(VOID **) &pRxPacket ); (VOID **) &pRxPacket );
if ( !EFI_ERROR ( Status )) { if ( !EFI_ERROR ( Status )) {
// //
@ -783,16 +855,22 @@ Ax88772Rx (
// //
// Attempt to receive a packet // Attempt to receive a packet
// //
SetMem (&pNicDevice->pBulkInBuff[0], MAX_BULKIN_SIZE, 0);
pUsbIo = pNicDevice->pUsbIo; pUsbIo = pNicDevice->pUsbIo;
Status = pUsbIo->UsbBulkTransfer ( pUsbIo, Status = pUsbIo->UsbBulkTransfer ( pUsbIo,
USB_ENDPOINT_DIR_IN | BULK_IN_ENDPOINT, USB_ENDPOINT_DIR_IN | BULK_IN_ENDPOINT,
&pRxPacket->Length, &pNicDevice->pBulkInBuff[0],
&LengthInBytes, &LengthInBytes,
2, 2,
&TransferStatus ); &TransferStatus );
if ( LengthInBytes > 0 ) {
FillPkt2Queue(pNicDevice, LengthInBytes);
}
pRxPacket = pNicDevice->pRxHead;
if (( !EFI_ERROR ( Status )) if (( !EFI_ERROR ( Status ))
&& ( 0 < pRxPacket->Length ) && ( 0 < pRxPacket->Length )
&& ( pRxPacket->Length <= sizeof ( pRxPacket->Data ))) { && ( pRxPacket->Length <= sizeof ( pRxPacket->Data ))
&& ( LengthInBytes > 0)) {
// //
// Determine if the packet should be received // Determine if the packet should be received
@ -869,22 +947,6 @@ Ax88772Rx (
LengthInBytes )); 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 { else {
// //

View File

@ -39,22 +39,24 @@
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// Macros // Macros
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
//
#if defined(_MSC_VER) /* Handle Microsoft VC++ compiler specifics. */ //Too many output debug info hangs system in Debug tip
#define DBG_ENTER() DEBUG (( DEBUG_INFO, "Entering " __FUNCTION__ "\n" )) ///< Display routine entry //
#define DBG_EXIT() DEBUG (( DEBUG_INFO, "Exiting " __FUNCTION__ "\n" )) ///< Display routine exit //#if defined(_MSC_VER) /* Handle Microsoft VC++ compiler specifics. */
#define DBG_EXIT_DEC(Status) DEBUG (( DEBUG_INFO, "Exiting " __FUNCTION__ ", Status: %d\n", Status )) ///< Display routine exit with decimal value //#define DBG_ENTER() DEBUG (( DEBUG_INFO, "Entering " __FUNCTION__ "\n" )) ///< Display routine entry
#define DBG_EXIT_HEX(Status) DEBUG (( DEBUG_INFO, "Exiting " __FUNCTION__ ", Status: 0x%08x\n", Status )) ///< Display routine exit with hex value //#define DBG_EXIT() DEBUG (( DEBUG_INFO, "Exiting " __FUNCTION__ "\n" )) ///< Display routine exit
#define DBG_EXIT_STATUS(Status) DEBUG (( DEBUG_INFO, "Exiting " __FUNCTION__ ", Status: %r\n", Status )) ///< Display routine exit with status value //#define DBG_EXIT_DEC(Status) DEBUG (( DEBUG_INFO, "Exiting " __FUNCTION__ ", Status: %d\n", Status )) ///< Display routine exit with decimal 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 //#define DBG_EXIT_HEX(Status) DEBUG (( DEBUG_INFO, "Exiting " __FUNCTION__ ", Status: 0x%08x\n", Status )) ///< Display routine exit with hex value
#else // _MSC_VER //#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_ENTER() ///< Display routine entry
#define DBG_EXIT() ///< Display routine exit #define DBG_EXIT() ///< Display routine exit
#define DBG_EXIT_DEC(Status) ///< Display routine exit with decimal value #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_HEX(Status) ///< Display routine exit with hex value
#define DBG_EXIT_STATUS(Status) ///< Display routine exit with status value #define DBG_EXIT_STATUS(Status) ///< Display routine exit with status value
#define DBG_EXIT_TF(Status) ///< Display routine with TRUE/FALSE 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_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 #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 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 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_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_NETWORK_CLASS 0x09 ///< USB Network class code
#define USB_BUS_TIMEOUT 1000 ///< USB timeout in milliseconds #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 * pRxTail; ///< Tail of receive packet list
RX_TX_PACKET * pRxFree; ///< Free packet list RX_TX_PACKET * pRxFree; ///< Free packet list
INT32 MulticastHash[2]; ///< Hash table for multicast destination addresses INT32 MulticastHash[2]; ///< Hash table for multicast destination addresses
UINT8 * pBulkInBuff; ///< Buffer for Usb Bulk
} NIC_DEVICE; } NIC_DEVICE;
#define DEV_FROM_SIMPLE_NETWORK(a) CR (a, NIC_DEVICE, SimpleNetwork, DEV_SIGNATURE) ///< Locate NIC_DEVICE from Simple Network Protocol #define DEV_FROM_SIMPLE_NETWORK(a) CR (a, NIC_DEVICE, SimpleNetwork, DEV_SIGNATURE) ///< Locate NIC_DEVICE from Simple Network Protocol

View File

@ -2,7 +2,7 @@
# Component description file for ASIX AX88772 USB/Ethernet driver. # Component description file for ASIX AX88772 USB/Ethernet driver.
# #
# This module provides support for the ASIX AX88772 USB/Ethernet adapter. # 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 # This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License # are licensed and made available under the terms and conditions of the BSD License
@ -15,7 +15,7 @@
## ##
[Defines] [Defines]
INF_VERSION = 0x00010005 INF_VERSION = 0x00010018
BASE_NAME = Ax88772 BASE_NAME = Ax88772
FILE_GUID = B15239D6-6A01-4808-A0F7-B7F20F073555 FILE_GUID = B15239D6-6A01-4808-A0F7-B7F20F073555
MODULE_TYPE = DXE_RUNTIME_DRIVER MODULE_TYPE = DXE_RUNTIME_DRIVER
@ -48,15 +48,10 @@
UefiDriverEntryPoint UefiDriverEntryPoint
[Protocols] [Protocols]
gEfiDevicePathProtocolGuid gEfiDevicePathProtocolGuid ## BY_START
gEfiSimpleNetworkProtocolGuid gEfiSimpleNetworkProtocolGuid ## BY_START
gEfiUsbIoProtocolGuid ## TO_START gEfiUsbIoProtocolGuid ## TO_START
[Guids]
gEfiEventExitBootServicesGuid ## PRODUCES ## Event
gEfiEventVirtualAddressChangeGuid ## PRODUCES ## Event
gEfiNicIp4ConfigVariableGuid
[Depex] [Depex]
gEfiBdsArchProtocolGuid AND gEfiBdsArchProtocolGuid AND
gEfiCpuArchProtocolGuid AND gEfiCpuArchProtocolGuid AND

View File

@ -1,7 +1,7 @@
/** @file /** @file
Implement the driver binding protocol for Asix AX88772 Ethernet driver. 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 This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License 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 which accompanies this distribution. The full text of the license may be found at
@ -481,23 +481,10 @@ EntryPoint (
IN EFI_SYSTEM_TABLE * pSystemTable IN EFI_SYSTEM_TABLE * pSystemTable
) )
{ {
EFI_LOADED_IMAGE_PROTOCOL * pLoadedImage;
EFI_STATUS Status; EFI_STATUS Status;
DBG_ENTER ( ); 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 // Add the driver to the list of drivers
// //

View File

@ -858,7 +858,7 @@ SN_Setup (
pMode->State = EfiSimpleNetworkStopped; pMode->State = EfiSimpleNetworkStopped;
pMode->HwAddressSize = PXE_HWADDR_LEN_ETHER; pMode->HwAddressSize = PXE_HWADDR_LEN_ETHER;
pMode->MediaHeaderSize = sizeof ( ETHERNET_HEADER ); pMode->MediaHeaderSize = sizeof ( ETHERNET_HEADER );
pMode->MaxPacketSize = AX88772_MAX_PKT_SIZE; pMode->MaxPacketSize = MAX_ETHERNET_PKT_SIZE;
pMode->NvRamSize = 0; pMode->NvRamSize = 0;
pMode->NvRamAccessSize = 0; pMode->NvRamAccessSize = 0;
pMode->ReceiveFilterMask = EFI_SIMPLE_NETWORK_RECEIVE_UNICAST pMode->ReceiveFilterMask = EFI_SIMPLE_NETWORK_RECEIVE_UNICAST
@ -885,6 +885,15 @@ SN_Setup (
pNicDevice->PhyId = PHY_ID_INTERNAL; pNicDevice->PhyId = PHY_ID_INTERNAL;
pNicDevice->b100Mbps = TRUE; pNicDevice->b100Mbps = TRUE;
pNicDevice->bFullDuplex = 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 ( Status = Ax88772MacAddressGet (
pNicDevice, pNicDevice,
&pMode->PermanentAddress.Addr[0]); &pMode->PermanentAddress.Addr[0]);
@ -958,7 +967,7 @@ SN_Start (
pMode->State = EfiSimpleNetworkStarted; pMode->State = EfiSimpleNetworkStarted;
pMode->HwAddressSize = PXE_HWADDR_LEN_ETHER; pMode->HwAddressSize = PXE_HWADDR_LEN_ETHER;
pMode->MediaHeaderSize = sizeof ( ETHERNET_HEADER ); pMode->MediaHeaderSize = sizeof ( ETHERNET_HEADER );
pMode->MaxPacketSize = AX88772_MAX_PKT_SIZE; pMode->MaxPacketSize = MAX_ETHERNET_PKT_SIZE;
pMode->ReceiveFilterMask = EFI_SIMPLE_NETWORK_RECEIVE_UNICAST pMode->ReceiveFilterMask = EFI_SIMPLE_NETWORK_RECEIVE_UNICAST
| EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST | EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST
| EFI_SIMPLE_NETWORK_RECEIVE_BROADCAST | EFI_SIMPLE_NETWORK_RECEIVE_BROADCAST
@ -1360,7 +1369,11 @@ SN_Transmit (
// Update the link status // Update the link status
// //
pNicDevice = DEV_FROM_SIMPLE_NETWORK ( pSimpleNetwork ); pNicDevice = DEV_FROM_SIMPLE_NETWORK ( pSimpleNetwork );
Ax88772Rx ( pNicDevice, FALSE );
//
//No need to call receive to receive packet
//
//Ax88772Rx ( pNicDevice, FALSE );
pMode->MediaPresent = pNicDevice->bLinkUp; pMode->MediaPresent = pNicDevice->bLinkUp;
// //

View File

@ -1,10 +1,10 @@
#/** @file ## @file
# Component description file for ASIX AX88772 USB/Ethernet driver. # Component description file for ASIX AX88772 USB/Ethernet driver.
# #
# This module provides support for the ASIX AX88772 USB/Ethernet adapter. # This module provides support for the ASIX AX88772 USB/Ethernet adapter.
# Copyright (c) 2011, Intel Corporation # Copyright (c) 2011-2013, Intel Corporation. All rights reserved.<BR>
# #
# All rights reserved. This program and the accompanying materials # This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License # 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 # which accompanies this distribution. The full text of the license may be found at
# http://opensource.org/licenses/bsd-license.php # http://opensource.org/licenses/bsd-license.php
@ -12,10 +12,10 @@
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
# #
#**/ ##
[Defines] [Defines]
INF_VERSION = 0x00010005 INF_VERSION = 0x00010018
BASE_NAME = Ax88772b BASE_NAME = Ax88772b
FILE_GUID = 95C8D770-E1A4-4422-B263-E32F14FD8186 FILE_GUID = 95C8D770-E1A4-4422-B263-E32F14FD8186
MODULE_TYPE = DXE_RUNTIME_DRIVER MODULE_TYPE = DXE_RUNTIME_DRIVER
@ -48,15 +48,10 @@
UefiDriverEntryPoint UefiDriverEntryPoint
[Protocols] [Protocols]
gEfiDevicePathProtocolGuid gEfiDevicePathProtocolGuid ## BY_START
gEfiSimpleNetworkProtocolGuid gEfiSimpleNetworkProtocolGuid ## BY_START
gEfiUsbIoProtocolGuid ## TO_START gEfiUsbIoProtocolGuid ## TO_START
[Guids]
gEfiEventExitBootServicesGuid ## PRODUCES ## Event
gEfiEventVirtualAddressChangeGuid ## PRODUCES ## Event
gEfiNicIp4ConfigVariableGuid
[Depex] [Depex]
gEfiBdsArchProtocolGuid AND gEfiBdsArchProtocolGuid AND
gEfiCpuArchProtocolGuid AND gEfiCpuArchProtocolGuid AND

View File

@ -1,7 +1,7 @@
/** @file /** @file
Implement the driver binding protocol for Asix AX88772 Ethernet driver. Implement the driver binding protocol for Asix AX88772 Ethernet driver.
Copyright (c) 2011, Intel Corporation Copyright (c) 2011-2013, Intel Corporation
All rights reserved. This program and the accompanying materials All rights reserved. This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License 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 which accompanies this distribution. The full text of the license may be found at
@ -632,21 +632,8 @@ EntryPoint (
IN EFI_SYSTEM_TABLE * pSystemTable IN EFI_SYSTEM_TABLE * pSystemTable
) )
{ {
EFI_LOADED_IMAGE_PROTOCOL * pLoadedImage;
EFI_STATUS Status; EFI_STATUS Status;
//
// 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 // Add the driver to the list of drivers
// //
@ -659,13 +646,12 @@ EntryPoint (
&gComponentName2 &gComponentName2
); );
if ( !EFI_ERROR ( Status )) { if ( !EFI_ERROR ( Status )) {
DEBUG ((EFI_D_INFO, "Installed: gEfiDriverBindingProtocolGuid on 0x%08x\r\n",
AsciiPrint ("Installed: gEfiDriverBindingProtocolGuid on 0x%08x\r\n", ImageHandle));
ImageHandle ); DEBUG ((EFI_D_INFO, "Installed: gEfiComponentNameProtocolGuid on 0x%08x\r\n",
AsciiPrint("Installed: gEfiComponentNameProtocolGuid on 0x%08x\r\n", ImageHandle));
ImageHandle ); DEBUG ((EFI_D_INFO,"Installed: gEfiComponentName2ProtocolGuid on 0x%08x\r\n",
AsciiPrint("Installed: gEfiComponentName2ProtocolGuid on 0x%08x\r\n", ImageHandle ));
ImageHandle );
} }
return Status; return Status;

View File

@ -1,7 +1,7 @@
/** @file /** @file
Provides the Simple Network functions. Provides the Simple Network functions.
Copyright (c) 2011, Intel Corporation Copyright (c) 2011 - 2013, Intel Corporation
All rights reserved. This program and the accompanying materials All rights reserved. This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License 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 which accompanies this distribution. The full text of the license may be found at
@ -202,9 +202,14 @@ SN_GetStatus (
} }
Status = EFI_SUCCESS; Status = EFI_SUCCESS;
} }
else {
if ( EfiSimpleNetworkStarted == pMode->State ) {
Status = EFI_DEVICE_ERROR;
}
else { else {
Status = EFI_NOT_STARTED; Status = EFI_NOT_STARTED;
} }
}
} }
else { else {
@ -317,7 +322,7 @@ SN_MCastIPtoMAC (
IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork, IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork,
IN BOOLEAN bIPv6, IN BOOLEAN bIPv6,
IN EFI_IP_ADDRESS * pIP, IN EFI_IP_ADDRESS * pIP,
IN EFI_MAC_ADDRESS * pMAC OUT EFI_MAC_ADDRESS * pMAC
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
@ -349,6 +354,8 @@ SN_MCastIPtoMAC (
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
else { else {
if (pSimpleNetwork->Mode->State == EfiSimpleNetworkInitialized)
{
pMAC->Addr[0] = 0x01; pMAC->Addr[0] = 0x01;
pMAC->Addr[1] = 0x00; pMAC->Addr[1] = 0x00;
pMAC->Addr[2] = 0x5e; pMAC->Addr[2] = 0x5e;
@ -356,6 +363,13 @@ SN_MCastIPtoMAC (
pMAC->Addr[4] = (UINT8) pIP->v4.Addr[2]; pMAC->Addr[4] = (UINT8) pIP->v4.Addr[2];
pMAC->Addr[5] = (UINT8) pIP->v4.Addr[3]; pMAC->Addr[5] = (UINT8) pIP->v4.Addr[3];
Status = EFI_SUCCESS; Status = EFI_SUCCESS;
}
else if (pSimpleNetwork->Mode->State == EfiSimpleNetworkStarted) {
Status = EFI_DEVICE_ERROR;
}
else {
Status = EFI_NOT_STARTED;
}
gBS->RestoreTPL(TplPrevious); gBS->RestoreTPL(TplPrevious);
} }
} }
@ -471,7 +485,10 @@ SN_Receive (
// //
// Verify the parameters // Verify the parameters
// //
if (( NULL != pSimpleNetwork ) && ( NULL != pSimpleNetwork->Mode )) { if (( NULL != pSimpleNetwork ) &&
( NULL != pSimpleNetwork->Mode ) &&
(NULL != pBufferSize) &&
(NULL != pBuffer)) {
// //
// The interface must be running // The interface must be running
// //
@ -575,10 +592,15 @@ SN_Receive (
} }
} }
else {
if (EfiSimpleNetworkStarted == pMode->State) {
Status = EFI_DEVICE_ERROR;
}
else { else {
Status = EFI_NOT_STARTED; Status = EFI_NOT_STARTED;
} }
} }
}
else { else {
Status = EFI_INVALID_PARAMETER; Status = EFI_INVALID_PARAMETER;
} }
@ -851,10 +873,15 @@ SN_Reset (
} }
} }
} }
else {
if (EfiSimpleNetworkStarted == pMode->State) {
Status = EFI_DEVICE_ERROR;
}
else { else {
Status = EFI_NOT_STARTED; Status = EFI_NOT_STARTED;
} }
} }
}
else { else {
Status = EFI_INVALID_PARAMETER; Status = EFI_INVALID_PARAMETER;
} }
@ -1148,13 +1175,13 @@ SN_StationAddress (
// //
if (( NULL != pSimpleNetwork ) if (( NULL != pSimpleNetwork )
&& ( NULL != pSimpleNetwork->Mode ) && ( NULL != pSimpleNetwork->Mode )
&& (( !bReset ) || ( bReset && ( NULL != pNew )))) { && (( bReset ) || ( ( !bReset) && ( NULL != pNew )))) {
// //
// Verify that the adapter is already started // Verify that the adapter is already started
// //
pNicDevice = DEV_FROM_SIMPLE_NETWORK ( pSimpleNetwork ); pNicDevice = DEV_FROM_SIMPLE_NETWORK ( pSimpleNetwork );
pMode = pSimpleNetwork->Mode; pMode = pSimpleNetwork->Mode;
if ( EfiSimpleNetworkStarted == pMode->State ) { if ( EfiSimpleNetworkInitialized == pMode->State ) {
// //
// Determine the adapter MAC address // Determine the adapter MAC address
// //
@ -1180,10 +1207,15 @@ SN_StationAddress (
// //
Status = Ax88772MacAddressSet ( pNicDevice, &pMode->CurrentAddress.Addr[0]); Status = Ax88772MacAddressSet ( pNicDevice, &pMode->CurrentAddress.Addr[0]);
} }
else {
if (EfiSimpleNetworkStarted == pMode->State) {
Status = EFI_DEVICE_ERROR;
}
else { else {
Status = EFI_NOT_STARTED; Status = EFI_NOT_STARTED;
} }
} }
}
else { else {
Status = EFI_INVALID_PARAMETER; Status = EFI_INVALID_PARAMETER;
} }
@ -1249,8 +1281,43 @@ SN_Statistics (
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_SIMPLE_NETWORK_MODE * pMode;
//
// Verify the prarameters
//
if (( NULL != pSimpleNetwork ) && ( NULL != pSimpleNetwork->Mode )) {
pMode = pSimpleNetwork->Mode;
//
// Determine if the interface is started
//
if (EfiSimpleNetworkInitialized == pMode->State){
//
// Determine if the StatisticsSize is big enough
//
if (sizeof (EFI_NETWORK_STATISTICS) <= *pStatisticsSize){
if (bReset) {
Status = EFI_SUCCESS;
}
else {
Status = EFI_UNSUPPORTED; Status = EFI_UNSUPPORTED;
}
}
else {
Status = EFI_BUFFER_TOO_SMALL;
}
}
else{
if (EfiSimpleNetworkStarted == pMode->State) {
Status = EFI_DEVICE_ERROR;
}
else {
Status = EFI_NOT_STARTED;
}
}
}
else {
Status = EFI_INVALID_PARAMETER;
}
return Status; return Status;
} }
@ -1441,11 +1508,22 @@ SN_Transmit (
// Verify the parameters // Verify the parameters
// //
if (( NULL != pSimpleNetwork ) && ( NULL != pSimpleNetwork->Mode )) { if (( NULL != pSimpleNetwork ) &&
( NULL != pSimpleNetwork->Mode ) &&
( NULL != pBuffer) &&
( (HeaderSize == 0) || ( (NULL != pDestAddr) && (NULL != pProtocol) ))) {
// //
// The interface must be running // The interface must be running
// //
pMode = pSimpleNetwork->Mode; pMode = pSimpleNetwork->Mode;
//
// Verify parameter of HeaderSize
//
if ((HeaderSize == 0) || (HeaderSize == pMode->MediaHeaderSize)){
//
// Determine if BufferSize is big enough
//
if (BufferSize >= pMode->MediaHeaderSize){
if ( EfiSimpleNetworkInitialized == pMode->State ) { if ( EfiSimpleNetworkInitialized == pMode->State ) {
// //
// Update the link status // Update the link status
@ -1560,10 +1638,23 @@ SN_Transmit (
} }
} }
else {
if (EfiSimpleNetworkStarted == pMode->State) {
Status = EFI_DEVICE_ERROR;
}
else { else {
Status = EFI_NOT_STARTED ; Status = EFI_NOT_STARTED ;
} }
} }
}
else {
Status = EFI_BUFFER_TOO_SMALL;
}
}
else {
Status = EFI_INVALID_PARAMETER;
}
}
else { else {
Status = EFI_INVALID_PARAMETER; Status = EFI_INVALID_PARAMETER;
} }