summaryrefslogtreecommitdiff
path: root/OptionRomPkg/Bus/Usb
diff options
context:
space:
mode:
authorMichael D Kinney <michael.d.kinney@intel.com>2019-05-09 20:42:03 -0700
committerMichael D Kinney <michael.d.kinney@intel.com>2019-05-13 15:30:42 -0700
commit5347c48016f27061475fdb053e867a06ce73492f (patch)
treedf7f0a2746d0f2ef4727a122614b7e6a0a8074a5 /OptionRomPkg/Bus/Usb
parent96ef5a8e30a8da33eaab09f13cc8d752342717a5 (diff)
downloadedk2-5347c48016f27061475fdb053e867a06ce73492f.zip
edk2-5347c48016f27061475fdb053e867a06ce73492f.tar.gz
edk2-5347c48016f27061475fdb053e867a06ce73492f.tar.bz2
edk2: Remove packages moved to edk2-platforms
https://bugzilla.tianocore.org/show_bug.cgi?id=1467 https://bugzilla.tianocore.org/show_bug.cgi?id=1374 https://bugzilla.tianocore.org/show_bug.cgi?id=1793 Remove the following packages that have been imported to edk2-platforms/master * Omap35xxPkg * BeagleBoardPkg * QuarkSocPkg * QuarkPlatformPkg * Vlv2DeviceRefCodePkg * Vlv2TbltDevicePkg * OptionRomPkg Cc: Zailiang Sun <zailiang.sun@intel.com> Cc: Yi Qian <yi.qian@intel.com> Cc: Kelly Steele <kelly.steele@intel.com> Cc: Ray Ni <ray.ni@intel.com> Cc: Michael Kubacki <michael.a.kubacki@intel.com> Cc: Leif Lindholm <leif.lindholm@linaro.org> Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org> Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com> Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org> Reviewed-by: Michael Kubacki <michael.a.kubacki@intel.com> Reviewed-by: Ray Ni <ray.ni@intel.com> Reviewed-by: Zailiang Sun <zailiang.sun@intel.com> Reviewed-by: Kelly Steele <kelly.steele@intel.com>
Diffstat (limited to 'OptionRomPkg/Bus/Usb')
-rw-r--r--OptionRomPkg/Bus/Usb/FtdiUsbSerialDxe/CompatibleDevices.txt5
-rw-r--r--OptionRomPkg/Bus/Usb/FtdiUsbSerialDxe/ComponentName.c218
-rw-r--r--OptionRomPkg/Bus/Usb/FtdiUsbSerialDxe/FtdiUsbSerialDriver.c2580
-rw-r--r--OptionRomPkg/Bus/Usb/FtdiUsbSerialDxe/FtdiUsbSerialDriver.h589
-rw-r--r--OptionRomPkg/Bus/Usb/FtdiUsbSerialDxe/FtdiUsbSerialDxe.inf55
-rw-r--r--OptionRomPkg/Bus/Usb/FtdiUsbSerialDxe/ReadMe.txt32
-rw-r--r--OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772/Ax88772.c1318
-rw-r--r--OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772/Ax88772.h969
-rw-r--r--OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772/Ax88772.inf61
-rw-r--r--OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772/ComponentName.c178
-rw-r--r--OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772/DriverBinding.c507
-rw-r--r--OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772/SimpleNetwork.c1503
-rw-r--r--OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772b/Ax88772.c875
-rw-r--r--OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772b/Ax88772.h1026
-rw-r--r--OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772b/Ax88772b.inf61
-rw-r--r--OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772b/ComponentName.c175
-rw-r--r--OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772b/DriverBinding.c696
-rw-r--r--OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772b/SimpleNetwork.c1657
18 files changed, 0 insertions, 12505 deletions
diff --git a/OptionRomPkg/Bus/Usb/FtdiUsbSerialDxe/CompatibleDevices.txt b/OptionRomPkg/Bus/Usb/FtdiUsbSerialDxe/CompatibleDevices.txt
deleted file mode 100644
index 1ec1cce..0000000
--- a/OptionRomPkg/Bus/Usb/FtdiUsbSerialDxe/CompatibleDevices.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-The following devices have been confirmed to work with the USB Serial Driver:
-
-Brand Model Name Product Name Vendor ID Device ID
-Gearmo USA_FTDI-36 USB to RS-232 0x0403 0x6001
-Sabrent CB-FTDI 0x0403 0x6001 \ No newline at end of file
diff --git a/OptionRomPkg/Bus/Usb/FtdiUsbSerialDxe/ComponentName.c b/OptionRomPkg/Bus/Usb/FtdiUsbSerialDxe/ComponentName.c
deleted file mode 100644
index d15abf5..0000000
--- a/OptionRomPkg/Bus/Usb/FtdiUsbSerialDxe/ComponentName.c
+++ /dev/null
@@ -1,218 +0,0 @@
-/** @file
- UEFI Component Name(2) protocol implementation for USB Serial driver.
-
-Copyright (c) 2004 - 2013, Intel Corporation. All rights reserved.<BR>
-SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include "FtdiUsbSerialDriver.h"
-
-//
-// EFI Component Name Protocol
-//
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gUsbSerialComponentName = {
- (EFI_COMPONENT_NAME_GET_DRIVER_NAME) UsbSerialComponentNameGetDriverName,
- (EFI_COMPONENT_NAME_GET_CONTROLLER_NAME) UsbSerialComponentNameGetControllerName,
- "eng"
-};
-
-//
-// EFI Component Name 2 Protocol
-//
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gUsbSerialComponentName2 = {
- UsbSerialComponentNameGetDriverName,
- UsbSerialComponentNameGetControllerName,
- "en"
-};
-
-//
-// Driver name string table
-//
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mUsbSerialDriverNameTable[] = {
- { "eng;en", L"FTDI-232 USB Serial Driver" },
- { NULL , NULL }
-};
-
-/**
- Retrieves a Unicode string that is the user readable name of the driver.
-
- This function retrieves the user readable name of a driver in the form of a
- Unicode string. If the driver specified by This has a user readable name in
- the language specified by Language, then a pointer to the driver name is
- returned in DriverName, and EFI_SUCCESS is returned. If the driver specified
- by This does not support the language specified by Language,
- then EFI_UNSUPPORTED is returned.
-
- @param This A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
- EFI_COMPONENT_NAME_PROTOCOL instance.
- @param Language A pointer to a Null-terminated ASCII string
- array indicating the language. This is the
- language of the driver name that the caller is
- requesting, and it must match one of the
- languages specified in SupportedLanguages. The
- number of languages supported by a driver is up
- to the driver writer. Language is specified
- in RFC 4646 or ISO 639-2 language code format.
- @param DriverName A pointer to the Unicode string to return.
- This Unicode string is the name of the
- driver specified by This in the language
- specified by Language.
-
- @retval EFI_SUCCESS The Unicode string for the Driver specified by
- This and the language specified by Language was
- returned in DriverName.
- @retval EFI_INVALID_PARAMETER Language is NULL.
- @retval EFI_INVALID_PARAMETER DriverName is NULL.
- @retval EFI_UNSUPPORTED The driver specified by This does not support
- the language specified by Language.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbSerialComponentNameGetDriverName (
- IN EFI_COMPONENT_NAME2_PROTOCOL *This,
- IN CHAR8 *Language,
- OUT CHAR16 **DriverName
- )
-{
- return LookupUnicodeString2 (
- Language,
- This->SupportedLanguages,
- mUsbSerialDriverNameTable,
- DriverName,
- (BOOLEAN)(This == &gUsbSerialComponentName2)
- );
-}
-
-
-/**
- Retrieves a Unicode string that is the user readable name of the controller
- that is being managed by a driver.
-
- This function retrieves the user readable name of the controller specified by
- ControllerHandle and ChildHandle in the form of a Unicode string. If the
- driver specified by This has a user readable name in the language specified by
- Language, then a pointer to the controller name is returned in ControllerName,
- and EFI_SUCCESS is returned. If the driver specified by This is not currently
- managing the controller specified by ControllerHandle and ChildHandle,
- then EFI_UNSUPPORTED is returned. If the driver specified by This does not
- support the language specified by Language, then EFI_UNSUPPORTED is returned.
-
- @param This A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
- EFI_COMPONENT_NAME_PROTOCOL instance.
- @param ControllerHandle The handle of a controller that the driver
- specified by This is managing. This handle
- specifies the controller whose name is to be
- returned.
- @param ChildHandle The handle of the child controller to retrieve
- the name of. This is an optional parameter that
- may be NULL. It will be NULL for device
- drivers. It will also be NULL for a bus drivers
- that wish to retrieve the name of the bus
- controller. It will not be NULL for a bus
- driver that wishes to retrieve the name of a
- child controller.
- @param Language A pointer to a Null-terminated ASCII string
- array indicating the language. This is the
- language of the driver name that the caller is
- requesting, and it must match one of the
- languages specified in SupportedLanguages. The
- number of languages supported by a driver is up
- to the driver writer. Language is specified in
- RFC 4646 or ISO 639-2 language code format.
- @param ControllerName A pointer to the Unicode string to return.
- This Unicode string is the name of the
- controller specified by ControllerHandle and
- ChildHandle in the language specified by
- Language from the point of view of the driver
- specified by This.
-
- @retval EFI_SUCCESS The Unicode string for the user readable name in
- the language specified by Language for the
- driver specified by This was returned in
- DriverName.
- @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE.
- @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid
- EFI_HANDLE.
- @retval EFI_INVALID_PARAMETER Language is NULL.
- @retval EFI_INVALID_PARAMETER ControllerName is NULL.
- @retval EFI_UNSUPPORTED The driver specified by This is not currently
- managing the controller specified by
- ControllerHandle and ChildHandle.
- @retval EFI_UNSUPPORTED The driver specified by This does not support
- the language specified by Language.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbSerialComponentNameGetControllerName (
- IN EFI_COMPONENT_NAME2_PROTOCOL *This,
- IN EFI_HANDLE ControllerHandle,
- IN EFI_HANDLE ChildHandle OPTIONAL,
- IN CHAR8 *Language,
- OUT CHAR16 **ControllerName
- )
-{
- EFI_STATUS Status;
- USB_SER_DEV *UsbSerDev;
- EFI_SERIAL_IO_PROTOCOL *SerialIo;
- EFI_USB_IO_PROTOCOL *UsbIoProtocol;
-
- //
- // This is a device driver, so ChildHandle must be NULL.
- //
- if (ChildHandle != NULL) {
- return EFI_UNSUPPORTED;
- }
-
- //
- // Check Controller's handle
- //
- Status = gBS->OpenProtocol (
- ControllerHandle,
- &gEfiUsbIoProtocolGuid,
- (VOID **) &UsbIoProtocol,
- gUsbSerialDriverBinding.DriverBindingHandle,
- ControllerHandle,
- EFI_OPEN_PROTOCOL_BY_DRIVER
- );
- if (!EFI_ERROR (Status)) {
- gBS->CloseProtocol (
- ControllerHandle,
- &gEfiUsbIoProtocolGuid,
- gUsbSerialDriverBinding.DriverBindingHandle,
- ControllerHandle
- );
-
- return EFI_UNSUPPORTED;
- }
-
- if (Status != EFI_ALREADY_STARTED) {
- return EFI_UNSUPPORTED;
- }
- //
- // Get the device context
- //
- Status = gBS->OpenProtocol (
- ControllerHandle,
- &gEfiSerialIoProtocolGuid,
- (VOID **) &SerialIo,
- gUsbSerialDriverBinding.DriverBindingHandle,
- ControllerHandle,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- UsbSerDev = USB_SER_DEV_FROM_THIS (SerialIo);
-
- return LookupUnicodeString2 (
- Language,
- This->SupportedLanguages,
- UsbSerDev->ControllerNameTable,
- ControllerName,
- (BOOLEAN)(This == &gUsbSerialComponentName2)
- );
-}
diff --git a/OptionRomPkg/Bus/Usb/FtdiUsbSerialDxe/FtdiUsbSerialDriver.c b/OptionRomPkg/Bus/Usb/FtdiUsbSerialDxe/FtdiUsbSerialDriver.c
deleted file mode 100644
index ac09fae..0000000
--- a/OptionRomPkg/Bus/Usb/FtdiUsbSerialDxe/FtdiUsbSerialDriver.c
+++ /dev/null
@@ -1,2580 +0,0 @@
-/** @file
- USB Serial Driver that manages USB to Serial and produces Serial IO Protocol.
-
-Copyright (c) 2004 - 2013, Intel Corporation. All rights reserved.
-Portions Copyright 2012 Ashley DeSimone
-SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-//
-
-// Tested with VEND_ID 0x0403, DEVICE_ID 0x6001
-//
-// Driver starts the device with the following values:
-// 115200, No parity, 8 data bits, 1 stop bit, No Flow control
-//
-
-#include "FtdiUsbSerialDriver.h"
-
-//
-// Table of supported devices. This is the device information that this
-// driver was developed with. Add other FTDI devices as needed.
-//
-USB_DEVICE gUSBDeviceList[] = {
- {VID_FTDI, DID_FTDI_FT232},
- {0,0}
-};
-
-//
-// USB Serial Driver Global Variables
-//
-EFI_DRIVER_BINDING_PROTOCOL gUsbSerialDriverBinding = {
- UsbSerialDriverBindingSupported,
- UsbSerialDriverBindingStart,
- UsbSerialDriverBindingStop,
- 0xa,
- NULL,
- NULL
-};
-
-//
-// Table with the nearest power of 2 for the numbers 0-15
-//
-UINT8 gRoundedPowersOf2[16] = { 0, 2, 2, 4, 4, 4, 8, 8, 8, 8, 8, 8, 16, 16, 16, 16 };
-
-/**
- Check to see if the device path node is the Flow control node
-
- @param[in] FlowControl The device path node to be checked
-
- @retval TRUE It is the flow control node
- @retval FALSE It is not the flow control node
-
-**/
-BOOLEAN
-IsUartFlowControlNode (
- IN UART_FLOW_CONTROL_DEVICE_PATH *FlowControl
- )
-{
- return (BOOLEAN) (
- (DevicePathType (FlowControl) == MESSAGING_DEVICE_PATH) &&
- (DevicePathSubType (FlowControl) == MSG_VENDOR_DP) &&
- (CompareGuid (&FlowControl->Guid, &gEfiUartDevicePathGuid))
- );
-}
-
-/**
- Checks the device path to see if it contains flow control.
-
- @param[in] DevicePath The device path to be checked
-
- @retval TRUE It contains flow control
- @retval FALSE It does not contain flow control
-
-**/
-BOOLEAN
-ContainsFlowControl (
- IN EFI_DEVICE_PATH_PROTOCOL *DevicePath
- )
-{
- while (!IsDevicePathEnd (DevicePath)) {
- if (IsUartFlowControlNode ((UART_FLOW_CONTROL_DEVICE_PATH *) DevicePath)) {
- return TRUE;
- }
- DevicePath = NextDevicePathNode (DevicePath);
- }
- return FALSE;
-}
-
-/**
- Transfer the data between the device and host.
-
- This function transfers the data between the device and host.
- BOT transfer is composed of three phases: Command, Data, and Status.
- This is the Data phase.
-
- @param UsbBot[in] The USB BOT device
- @param DataDir[in] The direction of the data
- @param Data[in, out] The buffer to hold data
- @param TransLen[in, out] The expected length of the data
- @param Timeout[in] The time to wait the command to complete
-
- @retval EFI_SUCCESS The data is transferred
- @retval EFI_SUCCESS No data to transfer
- @retval EFI_NOT_READY The device return NAK to the transfer
- @retval Others Failed to transfer data
-
-**/
-EFI_STATUS
-UsbSerialDataTransfer (
- IN USB_SER_DEV *UsbBot,
- IN EFI_USB_DATA_DIRECTION DataDir,
- IN OUT VOID *Data,
- IN OUT UINTN *TransLen,
- IN UINT32 Timeout
- )
-{
- EFI_USB_ENDPOINT_DESCRIPTOR *Endpoint;
- EFI_STATUS Status;
- UINT32 Result;
-
- //
- // If no data to transfer, just return EFI_SUCCESS.
- //
- if ((DataDir == EfiUsbNoData) || (*TransLen == 0)) {
- return EFI_SUCCESS;
- }
-
- //
- // Select the endpoint then issue the transfer
- //
- if (DataDir == EfiUsbDataIn) {
- Endpoint = &UsbBot->InEndpointDescriptor;
- } else {
- Endpoint = &UsbBot->OutEndpointDescriptor;
- }
-
- Result = 0;
- Status = UsbBot->UsbIo->UsbBulkTransfer (
- UsbBot->UsbIo,
- Endpoint->EndpointAddress,
- Data,
- TransLen,
- Timeout,
- &Result
- );
- if (EFI_ERROR (Status)) {
- if (USB_IS_ERROR (Result, EFI_USB_ERR_NAK)) {
- Status = EFI_NOT_READY;
- } else {
- UsbBot->Shutdown = TRUE; // Fixes infinite loop in older EFI
- }
- return Status;
- }
- return Status;
-}
-
-/**
- Sets the status values of the Usb Serial Device.
-
- @param UsbSerialDevice[in] Handle to the Usb Serial Device to set the status
- for
- @param StatusBuffer[in] Buffer holding the status values
-
- @retval EFI_SUCCESS The status values were read and set correctly
-
-**/
-EFI_STATUS
-EFIAPI
-SetStatusInternal (
- IN USB_SER_DEV *UsbSerialDevice,
- IN UINT8 *StatusBuffer
- )
-{
- UINT8 Msr;
-
- Msr = (StatusBuffer[0] & MSR_MASK);
-
- //
- // set the Status values to disabled
- //
- UsbSerialDevice->StatusValues.CtsState = FALSE;
- UsbSerialDevice->StatusValues.DsrState = FALSE;
- UsbSerialDevice->StatusValues.RiState = FALSE;
- UsbSerialDevice->StatusValues.SdState = FALSE;
-
- //
- // Check the values from the status buffer and set the appropriate status
- // values to enabled
- //
- if ((Msr & CTS_MASK) == CTS_MASK) {
- UsbSerialDevice->StatusValues.CtsState = TRUE;
- }
- if ((Msr & DSR_MASK) == DSR_MASK) {
- UsbSerialDevice->StatusValues.DsrState = TRUE;
- }
- if ((Msr & RI_MASK) == RI_MASK) {
- UsbSerialDevice->StatusValues.RiState = TRUE;
- }
- if ((Msr & SD_MASK) == SD_MASK) {
- UsbSerialDevice->StatusValues.SdState = TRUE;
- }
- return EFI_SUCCESS;
-}
-
-/**
- Initiates a read operation on the Usb Serial Device.
-
- @param UsbSerialDevice[in] Handle to the USB device to read
- @param BufferSize[in, out] On input, the size of the Buffer. On output,
- the amount of data returned in Buffer.
- Setting this to zero will initiate a read
- and store all data returned in the internal
- buffer.
- @param Buffer [out] The buffer to return the data into.
-
- @retval EFI_SUCCESS The data was read.
- @retval EFI_DEVICE_ERROR The device reported an error.
- @retval EFI_TIMEOUT The data write was stopped due to a timeout.
-
-**/
-EFI_STATUS
-EFIAPI
-ReadDataFromUsb (
- IN USB_SER_DEV *UsbSerialDevice,
- IN OUT UINTN *BufferSize,
- OUT VOID *Buffer
- )
-{
- EFI_STATUS Status;
- UINTN ReadBufferSize;
- UINT8 *ReadBuffer;
- UINTN Index;
- EFI_TPL Tpl;
- UINT8 StatusBuffer[2]; // buffer to store the status bytes
-
- ReadBufferSize = 512;
- ReadBuffer = &(UsbSerialDevice->ReadBuffer[0]);
-
- if (UsbSerialDevice->Shutdown) {
- return EFI_DEVICE_ERROR;
- }
-
- Tpl = gBS->RaiseTPL (TPL_NOTIFY);
-
- Status = UsbSerialDataTransfer (
- UsbSerialDevice,
- EfiUsbDataIn,
- ReadBuffer,
- &ReadBufferSize,
- FTDI_TIMEOUT*2 //Padded because timers won't be exactly aligned
- );
- if (EFI_ERROR (Status)) {
- gBS->RestoreTPL (Tpl);
- if (Status == EFI_TIMEOUT) {
- return EFI_TIMEOUT;
- } else {
- return EFI_DEVICE_ERROR;
- }
- }
-
- //
- // Store the status bytes in the status buffer
- //
- for (Index = 0; Index < 2; Index++) {//only the first 2 bytes are status bytes
- StatusBuffer[Index] = ReadBuffer[Index];
- }
- //
- // update the statusvalue field of the usbserialdevice
- //
- Status = SetStatusInternal (UsbSerialDevice, StatusBuffer);
- if (Status != EFI_SUCCESS) {
- }
-
- //
- // Store the read data in the read buffer, start at 2 to ignore status bytes
- //
- for (Index = 2; Index < ReadBufferSize; Index++) {
- if (((UsbSerialDevice->DataBufferTail + 1) % SW_FIFO_DEPTH) == UsbSerialDevice->DataBufferHead) {
- break;
- }
- if (ReadBuffer[Index] == 0x00) {
- //
- // This is null, do not add
- //
- } else {
- UsbSerialDevice->DataBuffer[UsbSerialDevice->DataBufferTail] = ReadBuffer[Index];
- UsbSerialDevice->DataBufferTail = (UsbSerialDevice->DataBufferTail + 1) % SW_FIFO_DEPTH;
- }
- }
-
- //
- // Read characters out of the buffer to satisfy caller's request.
- //
- for (Index = 0; Index < *BufferSize; Index++) {
- if (UsbSerialDevice->DataBufferHead == UsbSerialDevice->DataBufferTail) {
- break;
- }
- //
- // Still have characters in the buffer to return
- //
- ((UINT8 *)Buffer)[Index] = UsbSerialDevice->DataBuffer[UsbSerialDevice->DataBufferHead];
- UsbSerialDevice->DataBufferHead = (UsbSerialDevice->DataBufferHead + 1) % SW_FIFO_DEPTH;
- }
- //
- // Return actual number of bytes returned.
- //
- *BufferSize = Index;
- gBS->RestoreTPL (Tpl);
- return EFI_SUCCESS;
-}
-
-/**
- Sets the initial status values of the Usb Serial Device by reading the status
- bytes from the device.
-
- @param UsbSerialDevice[in] Handle to the Usb Serial Device that needs its
- initial status values set
-
- @retval EFI_SUCCESS The status bytes were read successfully and the
- initial status values were set correctly
- @retval EFI_TIMEOUT The read of the status bytes was stopped due to a
- timeout
- @retval EFI_DEVICE_ERROR The device reported an error during the read of
- the status bytes
-
-**/
-EFI_STATUS
-EFIAPI
-SetInitialStatus (
- IN USB_SER_DEV *UsbSerialDevice
- )
-{
- EFI_STATUS Status;
- UINTN BufferSize;
- EFI_TPL Tpl;
- UINT8 StatusBuffer[2];
-
- Status = EFI_UNSUPPORTED;
- BufferSize = sizeof (StatusBuffer);
-
- if (UsbSerialDevice->Shutdown) {
- return EFI_DEVICE_ERROR;
- }
-
- Tpl = gBS->RaiseTPL (TPL_NOTIFY);
-
- Status = UsbSerialDataTransfer (
- UsbSerialDevice,
- EfiUsbDataIn,
- StatusBuffer,
- &BufferSize,
- 40 //Slightly more than 2x the FTDI polling frequency to make sure that data will be returned
- );
-
- Status = SetStatusInternal (UsbSerialDevice, StatusBuffer);
-
- gBS->RestoreTPL (Tpl);
-
- return Status;
-}
-
-/**
- UsbSerialDriverCheckInput.
- attempts to read data in from the device periodically, stores any read data
- and updates the control attributes.
-
- @param Event[in]
- @param Context[in]....The current instance of the USB serial device
-
-**/
-VOID
-EFIAPI
-UsbSerialDriverCheckInput (
- IN EFI_EVENT Event,
- IN VOID *Context
- )
-{
- UINTN BufferSize;
- USB_SER_DEV *UsbSerialDevice;
-
- UsbSerialDevice = (USB_SER_DEV*)Context;
-
- if (UsbSerialDevice->DataBufferHead == UsbSerialDevice->DataBufferTail) {
- //
- // Data buffer is empty, try to read from device
- //
- BufferSize = 0;
- ReadDataFromUsb (UsbSerialDevice, &BufferSize, NULL);
- if (UsbSerialDevice->DataBufferHead == UsbSerialDevice->DataBufferTail) {
- //
- // Data buffer still has no data, set the EFI_SERIAL_INPUT_BUFFER_EMPTY
- // flag
- //
- UsbSerialDevice->ControlBits |= EFI_SERIAL_INPUT_BUFFER_EMPTY;
- } else {
- //
- // Read has returned some data, clear the EFI_SERIAL_INPUT_BUFFER_EMPTY
- // flag
- //
- UsbSerialDevice->ControlBits &= ~(EFI_SERIAL_INPUT_BUFFER_EMPTY);
- }
- } else {
- //
- // Data buffer has data, no read attempt required
- //
- UsbSerialDevice->ControlBits &= ~(EFI_SERIAL_INPUT_BUFFER_EMPTY);
- }
-}
-
-/**
- Encodes the baud rate into the format expected by the Ftdi device.
-
- @param BaudRate[in] The baudrate to be set on the device
- @param EncodedBaudRate[out] The baud rate encoded in the format
- expected by the Ftdi device
-
- @return EFI_SUCCESS Baudrate encoding was calculated
- successfully
- @return EFI_INVALID_PARAMETER An invalid value of BaudRate was received
-
-**/
-EFI_STATUS
-EFIAPI
-EncodeBaudRateForFtdi (
- IN UINT64 BaudRate,
- OUT UINT16 *EncodedBaudRate
- )
-{
- UINT32 Divisor;
- UINT32 AdjustedFrequency;
- UINT16 Result;
-
- //
- // Check to make sure we won't get an integer overflow
- //
- if ((BaudRate < 178) || ( BaudRate > ((FTDI_UART_FREQUENCY * 100) / 97))) {
- return EFI_INVALID_PARAMETER;
- }
-
- //
- // Baud Rates of 2000000 and 3000000 are special cases
- //
- if ((BaudRate >= FTDI_SPECIAL_CASE_300_MIN) && (BaudRate <= FTDI_SPECIAL_CASE_300_MAX)) {
- *EncodedBaudRate = 0;
- return EFI_SUCCESS;
- }
- if ((BaudRate >= FTDI_SPECIAL_CASE_200_MIN) && (BaudRate <= FTDI_SPECIAL_CASE_200_MAX)) {
- *EncodedBaudRate = 1;
- return EFI_SUCCESS;
- }
-
- //
- // Compute divisor
- //
- Divisor = (FTDI_UART_FREQUENCY << 4) / (UINT32)BaudRate;
-
- //
- // Round the last 4 bits to the nearest power of 2
- //
- Divisor = (Divisor & ~(0xF)) + (gRoundedPowersOf2[Divisor & 0xF]);
-
- //
- // Check to make sure computed divisor is within
- // the min and max that FTDI controller will accept
- //
- if (Divisor < FTDI_MIN_DIVISOR) {
- Divisor = FTDI_MIN_DIVISOR;
- } else if (Divisor > FTDI_MAX_DIVISOR) {
- Divisor = FTDI_MAX_DIVISOR;
- }
-
- //
- // Check to make sure the frequency that the FTDI chip will need to
- // generate to attain the requested Baud Rate is within 3% of the
- // 3MHz clock frequency that the FTDI chip runs at.
- //
- // (3MHz * 1600) / 103 = 46601941
- // (3MHz * 1600) / 97 = 49484536
- //
- AdjustedFrequency = (((UINT32)BaudRate) * Divisor);
- if ((AdjustedFrequency < FTDI_MIN_FREQUENCY) || (AdjustedFrequency > FTDI_MAX_FREQUENCY)) {
- return EFI_INVALID_PARAMETER;
- }
-
- //
- // Encode the Divisor into the format FTDI expects
- //
- Result = (UINT16)(Divisor >> 4);
- if ((Divisor & 0x8) != 0) {
- Result |= 0x4000;
- } else if ((Divisor & 0x4) != 0) {
- Result |= 0x8000;
- } else if ((Divisor & 0x2) != 0) {
- Result |= 0xC000;
- }
-
- *EncodedBaudRate = Result;
- return EFI_SUCCESS;
-}
-
-/**
- Uses USB I/O to check whether the device is a USB Serial device.
-
- @param UsbIo[in] Pointer to a USB I/O protocol instance.
-
- @retval TRUE Device is a USB Serial device.
- @retval FALSE Device is a not USB Serial device.
-
-**/
-BOOLEAN
-IsUsbSerial (
- IN EFI_USB_IO_PROTOCOL *UsbIo
- )
-{
- EFI_STATUS Status;
- EFI_USB_DEVICE_DESCRIPTOR DeviceDescriptor;
- CHAR16 *StrMfg;
- BOOLEAN Found;
- UINT32 Index;
-
- //
- // Get the default device descriptor
- //
- Status = UsbIo->UsbGetDeviceDescriptor (
- UsbIo,
- &DeviceDescriptor
- );
- if (EFI_ERROR (Status)) {
- return FALSE;
- }
-
- Found = FALSE;
- Index = 0;
- while (gUSBDeviceList[Index].VendorId != 0 &&
- gUSBDeviceList[Index].DeviceId != 0 &&
- !Found ) {
- if (DeviceDescriptor.IdProduct == gUSBDeviceList[Index].DeviceId &&
- DeviceDescriptor.IdVendor == gUSBDeviceList[Index].VendorId ){
- //
- // Checks to see if a string descriptor can be pulled from the device in
- // the selected language. If not False is returned indicating that this
- // is not a Usb Serial Device that can be managegd by this driver
- //
- StrMfg = NULL;
- Status = UsbIo->UsbGetStringDescriptor (
- UsbIo,
- USB_US_LANG_ID, // LANGID selector, should make this
- // more robust to verify lang support
- // for device
- DeviceDescriptor.StrManufacturer,
- &StrMfg
- );
- if (StrMfg != NULL) {
- FreePool (StrMfg);
- }
- if (EFI_ERROR (Status)) {
- return FALSE;
- }
- return TRUE;
- }
- Index++;
- }
- return FALSE;
-}
-
-/**
- Internal function that sets the Data Bits, Stop Bits and Parity values on the
- Usb Serial Device with a single usb control transfer.
-
- @param UsbIo[in] Usb Io Protocol instance pointer
- @param DataBits[in] The data bits value to be set on the Usb
- Serial Device
- @param Parity[in] The parity type that will be set on the Usb
- Serial Device
- @param StopBits[in] The stop bits type that will be set on the
- Usb Serial Device
- @param LastSettings[in] A pointer to the Usb Serial Device's
- PREVIOUS_ATTRIBUTES item
-
- @retval EFI_SUCCESS The data items were correctly set on the
- USB Serial Device
- @retval EFI_INVALID_PARAMETER An invalid data parameter or an invalid
- combination or parameters was used
- @retval EFI_DEVICE_ERROR The device is not functioning correctly and
- the data values were unable to be set
-
-**/
-EFI_STATUS
-EFIAPI
-SetDataInternal (
- IN EFI_USB_IO_PROTOCOL *UsbIo,
- IN UINT8 DataBits,
- IN EFI_PARITY_TYPE Parity,
- IN EFI_STOP_BITS_TYPE StopBits,
- IN PREVIOUS_ATTRIBUTES *LastSettings
- )
-{
- EFI_STATUS Status;
- EFI_USB_DEVICE_REQUEST DevReq;
- UINT32 ReturnValue;
- UINT8 ConfigurationValue;
-
- //
- // Since data bits settings of 6,7,8 cannot be set with a stop bits setting of
- // 1.5 check to see if this happens when the values of last settings are used
- //
- if ((DataBits == 0) && (StopBits == OneFiveStopBits)) {
- if ((LastSettings->DataBits == 6) || (LastSettings->DataBits == 7) || (LastSettings->DataBits == 8)) {
- return EFI_INVALID_PARAMETER;
- }
- } else if ((StopBits == DefaultStopBits) && ((DataBits == 6) || (DataBits == 7) || (DataBits == 8))) {
- if (LastSettings->StopBits == OneFiveStopBits) {
- return EFI_INVALID_PARAMETER;
- }
- } else if ((DataBits == 0) && (StopBits == DefaultStopBits)) {
- if (LastSettings->StopBits == OneFiveStopBits) {
- if ((LastSettings->DataBits == 6) || (LastSettings->DataBits == 7) || (LastSettings->DataBits == 8)) {
- return EFI_INVALID_PARAMETER;
- }
- }
- }
-
- //
- // set the DevReq.Value for the usb control transfer to the correct value
- // based on the seleceted number of data bits if there is an invalid number of
- // data bits requested return EFI_INVALID_PARAMETER
- //
- if (((DataBits < 5 ) || (DataBits > 8)) && (DataBits != 0)) {
- return EFI_INVALID_PARAMETER;
- }
- if (DataBits == 0) {
- //
- // use the value of LastDataBits
- //
- DevReq.Value = SET_DATA_BITS (LastSettings->DataBits);
- } else {
- //
- // use the value of DataBits
- //
- DevReq.Value = SET_DATA_BITS (DataBits);
- }
-
- //
- // Set Parity
- //
- if (Parity == DefaultParity) {
- Parity = LastSettings->Parity;
- }
-
- if (Parity == NoParity) {
- DevReq.Value |= SET_PARITY_NONE;
- } else if (Parity == EvenParity) {
- DevReq.Value |= SET_PARITY_EVEN;
- } else if (Parity == OddParity){
- DevReq.Value |= SET_PARITY_ODD;
- } else if (Parity == MarkParity) {
- DevReq.Value |= SET_PARITY_MARK;
- } else if (Parity == SpaceParity) {
- DevReq.Value |= SET_PARITY_SPACE;
- }
-
- //
- // Set Stop Bits
- //
- if (StopBits == DefaultStopBits) {
- StopBits = LastSettings->StopBits;
- }
-
- if (StopBits == OneStopBit) {
- DevReq.Value |= SET_STOP_BITS_1;
- } else if (StopBits == OneFiveStopBits) {
- DevReq.Value |= SET_STOP_BITS_15;
- } else if (StopBits == TwoStopBits) {
- DevReq.Value |= SET_STOP_BITS_2;
- }
-
- //
- // set the rest of the DevReq parameters and perform the usb control transfer
- // to set the data bits on the device
- //
- DevReq.Request = FTDI_COMMAND_SET_DATA;
- DevReq.RequestType = USB_REQ_TYPE_VENDOR;
- DevReq.Index = FTDI_PORT_IDENTIFIER;
- DevReq.Length = 0; // indicates that there is no data phase in this request
-
- Status = UsbIo->UsbControlTransfer (
- UsbIo,
- &DevReq,
- EfiUsbDataOut,
- WDR_SHORT_TIMEOUT,
- &ConfigurationValue,
- 1,
- &ReturnValue
- );
- if (EFI_ERROR (Status)) {
- goto StatusError;
- }
- return Status;
-
-StatusError:
- if ((Status != EFI_INVALID_PARAMETER) || (Status != EFI_DEVICE_ERROR)) {
- return EFI_DEVICE_ERROR;
- } else {
- return Status;
- }
-}
-
-/**
- Internal function that sets the baudrate on the Usb Serial Device.
-
- @param UsbIo[in] Usb Io Protocol instance pointer
- @param BaudRate[in] The baudrate value to be set on the device.
- If this value is 0 the value of LastBaudRate
- will be used instead
- @param LastBaudRate[in] The baud rate value that was previously set
- on the Usb Serial Device
-
- @retval EFI_SUCCESS The baudrate was set succesfully
- @retval EFI_INVALID_PARAMETER An invalid baudrate was used
- @retval EFI_DEVICE_ERROR The device is not functioning correctly and
- the baudrate was unable to be set
-
-**/
-EFI_STATUS
-EFIAPI
-SetBaudRateInternal (
- IN EFI_USB_IO_PROTOCOL *UsbIo,
- IN UINT64 BaudRate,
- IN UINT64 LastBaudRate
- )
-{
- EFI_STATUS Status;
- EFI_USB_DEVICE_REQUEST DevReq;
- UINT32 ReturnValue;
- UINT8 ConfigurationValue;
- UINT16 EncodedBaudRate;
- EFI_TPL Tpl;
-
- Tpl = gBS->RaiseTPL(TPL_NOTIFY);
-
- //
- // set the value of DevReq.Value based on the value of BaudRate
- // if 0 is selected as baud rate use the value of LastBaudRate
- //
- if (BaudRate == 0) {
- Status = EncodeBaudRateForFtdi (LastBaudRate, &EncodedBaudRate);
- if (EFI_ERROR (Status)) {
- gBS->RestoreTPL (Tpl);
- //
- // EncodeBaudRateForFtdi returns EFI_INVALID_PARAMETER when not
- // succesfull
- //
- return Status;
- }
- DevReq.Value = EncodedBaudRate;
- } else {
- Status = EncodeBaudRateForFtdi (BaudRate, &EncodedBaudRate);
- if (EFI_ERROR (Status)) {
- gBS->RestoreTPL (Tpl);
- //
- // EncodeBaudRateForFtdi returns EFI_INVALID_PARAMETER when not
- // successfull
- //
- return Status;
- }
- DevReq.Value = EncodedBaudRate;
- }
-
- //
- // set the remaining parameters of DevReq and perform the usb control transfer
- // to set the device
- //
- DevReq.Request = FTDI_COMMAND_SET_BAUDRATE;
- DevReq.RequestType = USB_REQ_TYPE_VENDOR;
- DevReq.Index = FTDI_PORT_IDENTIFIER;
- DevReq.Length = 0; // indicates that there is no data phase in this request
-
- Status = UsbIo->UsbControlTransfer (
- UsbIo,
- &DevReq,
- EfiUsbDataOut,
- WDR_SHORT_TIMEOUT,
- &ConfigurationValue,
- 1,
- &ReturnValue
- );
- if (EFI_ERROR (Status)) {
- goto StatusError;
- }
- gBS->RestoreTPL (Tpl);
- return Status;
-
-StatusError:
- gBS->RestoreTPL (Tpl);
- if ((Status != EFI_INVALID_PARAMETER) || (Status != EFI_DEVICE_ERROR)) {
- return EFI_DEVICE_ERROR;
- } else {
- return Status;
- }
-}
-
-/**
- Sets the baud rate, receive FIFO depth, transmit/receice time out, parity,
- data bits, and stop bits on a serial device.
-
- @param UsbSerialDevice[in] Pointer to the current instance of the USB Serial
- Device.
- @param BaudRate[in] The requested baud rate. A BaudRate value of 0
- will use the device's default interface speed.
- @param ReveiveFifoDepth[in] The requested depth of the FIFO on the receive
- side of the serial interface. A ReceiveFifoDepth
- value of 0 will use the device's default FIFO
- depth.
- @param Timeout[in] The requested time out for a single character in
- microseconds.This timeout applies to both the
- transmit and receive side of the interface.A
- Timeout value of 0 will use the device's default
- time out value.
- @param Parity[in] The type of parity to use on this serial device.
- A Parity value of DefaultParity will use the
- device's default parity value.
- @param DataBits[in] The number of data bits to use on the serial
- device. A DataBits value of 0 will use the
- device's default data bit setting.
- @param StopBits[in] The number of stop bits to use on this serial
- device. A StopBits value of DefaultStopBits will
- use the device's default number of stop bits.
-
- @retval EFI_SUCCESS The attributes were set
- @retval EFI_DEVICE_ERROR The attributes were not able to be set
-
-**/
-EFI_STATUS
-EFIAPI
-SetAttributesInternal (
- IN USB_SER_DEV *UsbSerialDevice,
- IN UINT64 BaudRate,
- IN UINT32 ReceiveFifoDepth,
- IN UINT32 Timeout,
- IN EFI_PARITY_TYPE Parity,
- IN UINT8 DataBits,
- IN EFI_STOP_BITS_TYPE StopBits
- )
-{
- EFI_STATUS Status;
- EFI_TPL Tpl;
- UART_DEVICE_PATH *Uart;
- EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath;
-
- Status = EFI_UNSUPPORTED;
- Tpl = gBS->RaiseTPL(TPL_NOTIFY);
- Uart = NULL;
-
- //
- // check for invalid combinations of parameters
- //
- if (((DataBits >= 6) && (DataBits <= 8)) && (StopBits == OneFiveStopBits)) {
- return EFI_INVALID_PARAMETER;
- }
-
- //
- // set data bits, parity and stop bits
- //
- Status = SetDataInternal (
- UsbSerialDevice->UsbIo,
- DataBits,
- Parity,
- StopBits,
- &(UsbSerialDevice->LastSettings)
- );
- if (EFI_ERROR (Status)) {
- goto StatusError;
- }
- //
- // set baudrate
- //
- Status = SetBaudRateInternal (
- UsbSerialDevice->UsbIo,
- BaudRate,
- UsbSerialDevice->LastSettings.BaudRate
- );
- if (EFI_ERROR (Status)){
- goto StatusError;
- }
-
- //
- // update the values of UsbSerialDevice->LastSettings and UsbSerialDevice->SerialIo.Mode
- //
- if (BaudRate == 0) {
- UsbSerialDevice->LastSettings.BaudRate = UsbSerialDevice->LastSettings.BaudRate;
- UsbSerialDevice->SerialIo.Mode->BaudRate = UsbSerialDevice->LastSettings.BaudRate;
- } else {
- UsbSerialDevice->LastSettings.BaudRate = BaudRate;
- UsbSerialDevice->SerialIo.Mode->BaudRate = BaudRate;
- }
-
- UsbSerialDevice->LastSettings.Timeout = FTDI_TIMEOUT;
- UsbSerialDevice->LastSettings.ReceiveFifoDepth = FTDI_MAX_RECEIVE_FIFO_DEPTH;
-
- if (Parity == DefaultParity) {
- UsbSerialDevice->LastSettings.Parity = UsbSerialDevice->LastSettings.Parity;
- UsbSerialDevice->SerialIo.Mode->Parity = UsbSerialDevice->LastSettings.Parity;
- } else {
- UsbSerialDevice->LastSettings.Parity = Parity;
- UsbSerialDevice->SerialIo.Mode->Parity = Parity;
- }
- if (DataBits == 0) {
- UsbSerialDevice->LastSettings.DataBits = UsbSerialDevice->LastSettings.DataBits;
- UsbSerialDevice->SerialIo.Mode->DataBits = UsbSerialDevice->LastSettings.DataBits;
- } else {
- UsbSerialDevice->LastSettings.DataBits = DataBits;
- UsbSerialDevice->SerialIo.Mode->DataBits = DataBits;
- }
- if (StopBits == DefaultStopBits) {
- UsbSerialDevice->LastSettings.StopBits = UsbSerialDevice->LastSettings.StopBits;
- UsbSerialDevice->SerialIo.Mode->StopBits = UsbSerialDevice->LastSettings.StopBits;
- } else {
- UsbSerialDevice->LastSettings.StopBits = StopBits;
- UsbSerialDevice->SerialIo.Mode->StopBits = StopBits;
- }
-
- //
- // See if the device path node has changed
- //
- if (UsbSerialDevice->UartDevicePath.BaudRate == BaudRate &&
- UsbSerialDevice->UartDevicePath.DataBits == DataBits &&
- UsbSerialDevice->UartDevicePath.StopBits == StopBits &&
- UsbSerialDevice->UartDevicePath.Parity == Parity
- ) {
- gBS->RestoreTPL (Tpl);
- return EFI_SUCCESS;
- }
-
- //
- // Update the device path
- //
- UsbSerialDevice->UartDevicePath.BaudRate = BaudRate;
- UsbSerialDevice->UartDevicePath.DataBits = DataBits;
- UsbSerialDevice->UartDevicePath.StopBits = (UINT8) StopBits;
- UsbSerialDevice->UartDevicePath.Parity = (UINT8) Parity;
-
- Status = EFI_SUCCESS;
- if (UsbSerialDevice->ControllerHandle != NULL) {
- RemainingDevicePath = UsbSerialDevice->DevicePath;
- while (!IsDevicePathEnd (RemainingDevicePath)) {
- Uart = (UART_DEVICE_PATH *) NextDevicePathNode (RemainingDevicePath);
- if (Uart->Header.Type == MESSAGING_DEVICE_PATH &&
- Uart->Header.SubType == MSG_UART_DP &&
- sizeof (UART_DEVICE_PATH) == DevicePathNodeLength ((EFI_DEVICE_PATH *) Uart)) {
- Uart->BaudRate = BaudRate;
- Uart->DataBits = DataBits;
- Uart->StopBits = (UINT8)StopBits;
- Uart->Parity = (UINT8) Parity;
- break;
- }
- RemainingDevicePath = NextDevicePathNode (RemainingDevicePath);
- }
- }
-
- gBS->RestoreTPL (Tpl);
- return Status;
-
-StatusError:
- gBS->RestoreTPL (Tpl);
- if ((Status != EFI_INVALID_PARAMETER) || (Status != EFI_DEVICE_ERROR)) {
- return EFI_DEVICE_ERROR;
- } else {
- return Status;
- }
-}
-
-/**
- Internal function that performs a Usb Control Transfer to set the flow control
- on the Usb Serial Device.
-
- @param UsbIo[in] Usb Io Protocol instance pointer
- @param FlowControlEnable[in] Data on the Enable/Disable status of Flow
- Control on the Usb Serial Device
-
- @retval EFI_SUCCESS The flow control was set on the Usb Serial
- device
- @retval EFI_INVALID_PARAMETER An invalid flow control value was used
- @retval EFI_EFI_UNSUPPORTED The operation is not supported
- @retval EFI_DEVICE_ERROR The device is not functioning correctly
-
-**/
-EFI_STATUS
-EFIAPI
-SetFlowControlInternal (
- IN EFI_USB_IO_PROTOCOL *UsbIo,
- IN BOOLEAN FlowControlEnable
- )
-{
- EFI_STATUS Status;
- EFI_USB_DEVICE_REQUEST DevReq;
- UINT32 ReturnValue;
- UINT8 ConfigurationValue;
-
- //
- // set DevReq.Value based on the value of FlowControlEnable
- //
- if (!FlowControlEnable) {
- DevReq.Value = NO_FLOW_CTRL;
- }
- if (FlowControlEnable) {
- DevReq.Value = XON_XOFF_CTRL;
- }
- //
- // set the remaining DevReq parameters and perform the usb control transfer to
- // set the flow control on the device
- //
- DevReq.Request = FTDI_COMMAND_SET_FLOW_CTRL;
- DevReq.RequestType = USB_REQ_TYPE_VENDOR;
- DevReq.Index = FTDI_PORT_IDENTIFIER;
- DevReq.Length = 0; // indicates that this transfer has no data phase
- Status = UsbIo->UsbControlTransfer (
- UsbIo,
- &DevReq,
- EfiUsbDataOut,
- WDR_TIMEOUT,
- &ConfigurationValue,
- 1,
- &ReturnValue
- );
- if (EFI_ERROR (Status)) {
- goto StatusError;
- }
-
- return Status;
-
-StatusError:
- if ((Status != EFI_INVALID_PARAMETER) ||
- (Status != EFI_DEVICE_ERROR) ||
- (Status != EFI_UNSUPPORTED) ) {
- return EFI_DEVICE_ERROR;
- } else {
- return Status;
- }
-}
-
-/**
- Internal function that performs a Usb Control Transfer to set the Dtr value on
- the Usb Serial Device.
-
- @param UsbIo[in] Usb Io Protocol instance pointer
- @param DtrEnable[in] Data on the Enable/Disable status of the
- Dtr for the Usb Serial Device
-
- @retval EFI_SUCCESS The Dtr value was set on the Usb Serial
- Device
- @retval EFI_INVALID_PARAMETER An invalid Dtr value was used
- @retval EFI_UNSUPPORTED The operation is not supported
- @retval EFI_DEVICE_ERROR The device is not functioning correctly
-
-**/
-EFI_STATUS
-EFIAPI
-SetDtrInternal (
- IN EFI_USB_IO_PROTOCOL *UsbIo,
- IN BOOLEAN DtrEnable
- )
-{
- EFI_STATUS Status;
- EFI_USB_DEVICE_REQUEST DevReq;
- UINT32 ReturnValue;
- UINT8 ConfigurationValue;
-
- //
- // set the value of DevReq.Value based on the value of DtrEnable
- //
- if (!DtrEnable) {
- DevReq.Value = SET_DTR_LOW;
- }
- if (DtrEnable) {
- DevReq.Value = SET_DTR_HIGH;
- }
- //
- // set the remaining attributes of DevReq and perform the usb control transfer
- // to set the device
- //
- DevReq.Request = FTDI_COMMAND_MODEM_CTRL;
- DevReq.RequestType = USB_REQ_TYPE_VENDOR;
- DevReq.Index = FTDI_PORT_IDENTIFIER;
- DevReq.Length = 0; // indicates that there is no data phase in this transfer
-
- Status = UsbIo->UsbControlTransfer (
- UsbIo,
- &DevReq,
- EfiUsbDataOut,
- WDR_TIMEOUT,
- &ConfigurationValue,
- 1,
- &ReturnValue
- );
- if (EFI_ERROR (Status)) {
- goto StatusError;
- }
- return Status;
-
-StatusError:
- if ((Status != EFI_INVALID_PARAMETER) ||
- (Status != EFI_DEVICE_ERROR) ||
- (Status != EFI_UNSUPPORTED) ) {
- return EFI_DEVICE_ERROR;
- } else {
- return Status;
- }
-}
-
-/**
- Internal function that performs a Usb Control Transfer to set the Dtr value on
- the Usb Serial Device.
-
- @param UsbIo[in] Usb Io Protocol instance pointer
- @param RtsEnable[in] Data on the Enable/Disable status of the
- Rts for the Usb Serial Device
-
- @retval EFI_SUCCESS The Rts value was set on the Usb Serial
- Device
- @retval EFI_INVALID_PARAMETER An invalid Rts value was used
- @retval EFI_UNSUPPORTED The operation is not supported
- @retval EFI_DEVICE_ERROR The device is not functioning correctly
-
-**/
-EFI_STATUS
-EFIAPI
-SetRtsInternal (
- IN EFI_USB_IO_PROTOCOL *UsbIo,
- IN BOOLEAN RtsEnable
- )
-{
- EFI_STATUS Status;
- EFI_USB_DEVICE_REQUEST DevReq;
- UINT32 ReturnValue;
- UINT8 ConfigurationValue;
-
- //
- // set DevReq.Value based on the value of RtsEnable
- //
- if (!RtsEnable) {
- DevReq.Value = SET_RTS_LOW;
- }
- if (RtsEnable) {
- DevReq.Value = SET_RTS_HIGH;
- }
-
- //
- // set the remaining parameters of DevReq and perform the usb control transfer
- // to set the values on the device
- //
- DevReq.Request = FTDI_COMMAND_MODEM_CTRL;
- DevReq.RequestType = USB_REQ_TYPE_VENDOR;
- DevReq.Index = FTDI_PORT_IDENTIFIER;
- DevReq.Length = 0; // indicates that there is no data phase in this request
-
- Status = UsbIo->UsbControlTransfer (
- UsbIo,
- &DevReq,
- EfiUsbDataOut,
- WDR_TIMEOUT,
- &ConfigurationValue,
- 1,
- &ReturnValue
- );
- if (EFI_ERROR (Status)) {
- goto StatusError;
- }
-
- return Status;
-
-StatusError:
- if ((Status != EFI_INVALID_PARAMETER) ||
- (Status != EFI_DEVICE_ERROR) ||
- (Status != EFI_UNSUPPORTED) ) {
- return EFI_DEVICE_ERROR;
- } else {
- return Status;
- }
-}
-
-/**
- Internal function that checks for valid control values and sets the control
- bits on the Usb Serial Device.
-
- @param UsbSerialDevice[in] Handle to the Usb Serial Device whose
- control bits are being set
- @param Control[in] The control value passed to the function
- that contains the values of the control
- bits that are being set
-
- @retval EFI_SUCCESS The control bits were set on the Usb Serial
- Device
- @retval EFI_INVALID_PARAMETER An invalid control value was encountered
- @retval EFI_EFI_UNSUPPORTED The operation is not supported
- @retval EFI_DEVICE_ERROR The device is not functioning correctly
-
-**/
-EFI_STATUS
-EFIAPI
-SetControlBitsInternal (
- IN USB_SER_DEV *UsbSerialDevice,
- IN CONTROL_BITS *Control
- )
-{
- EFI_STATUS Status;
- UART_FLOW_CONTROL_DEVICE_PATH *FlowControl;
- EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath;
-
- //
- // check for invalid control parameters hardware and software loopback enabled
- // must always be set to FALSE
- //
- Control->HardwareLoopBack = FALSE;
- Control->SoftwareLoopBack = FALSE;
-
- //
- // set hardware flow control
- //
- Status = SetFlowControlInternal (
- UsbSerialDevice->UsbIo,
- Control->HardwareFlowControl
- );
- if (EFI_ERROR (Status)) {
- goto StatusError;
- }
-
- //
- // set Dtr state
- //
- Status = SetDtrInternal (UsbSerialDevice->UsbIo, Control->DtrState);
- if (EFI_ERROR (Status)) {
- goto StatusError;
- }
-
- //
- // set Rts state
- //
- Status = SetRtsInternal (UsbSerialDevice->UsbIo, Control->RtsState);
- if (EFI_ERROR (Status)){
- goto StatusError;
- }
-
- //
- // update the remaining control values for UsbSerialDevice->ControlValues
- //
- UsbSerialDevice->ControlValues.DtrState = Control->DtrState;
- UsbSerialDevice->ControlValues.RtsState = Control->RtsState;
- UsbSerialDevice->ControlValues.HardwareFlowControl = Control->HardwareFlowControl;
- UsbSerialDevice->ControlValues.HardwareLoopBack = FALSE;
- UsbSerialDevice->ControlValues.SoftwareLoopBack = FALSE;
-
- Status = EFI_SUCCESS;
- //
- // Update the device path to have the correct flow control values
- //
- if (UsbSerialDevice->ControllerHandle != NULL) {
- RemainingDevicePath = UsbSerialDevice->DevicePath;
- while (!IsDevicePathEnd (RemainingDevicePath)) {
- FlowControl = (UART_FLOW_CONTROL_DEVICE_PATH *) NextDevicePathNode (RemainingDevicePath);
- if (FlowControl->Header.Type == MESSAGING_DEVICE_PATH &&
- FlowControl->Header.SubType == MSG_VENDOR_DP &&
- sizeof (UART_FLOW_CONTROL_DEVICE_PATH) == DevicePathNodeLength ((EFI_DEVICE_PATH *) FlowControl)){
- if (UsbSerialDevice->ControlValues.HardwareFlowControl == TRUE) {
- FlowControl->FlowControlMap = UART_FLOW_CONTROL_HARDWARE;
- } else if (UsbSerialDevice->ControlValues.HardwareFlowControl == FALSE) {
- FlowControl->FlowControlMap = 0;
- }
- break;
- }
- RemainingDevicePath = NextDevicePathNode (RemainingDevicePath);
- }
- }
-
- return Status;
-
-StatusError:
- if ((Status != EFI_INVALID_PARAMETER) ||
- (Status != EFI_DEVICE_ERROR) ||
- (Status != EFI_UNSUPPORTED) ) {
- return EFI_DEVICE_ERROR;
- } else {
- return Status;
- }
-}
-
-/**
- Internal function that calculates the Control value used by GetControlBits()
- based on the status and control values of the Usb Serial Device.
-
- @param UsbSerialDevice[in] Handle to the Usb Serial Devie whose status
- and control values are being used to set
- Control
- @param Control[out] On output the formated value of Control
- that has been calculated based on the
- control and status values of the Usb Serial
- Device
-
- @retval EFI_SUCCESS The value of Control was successfully
- calculated
-
-**/
-EFI_STATUS
-EFIAPI
-GetControlBitsInternal (
- IN USB_SER_DEV *UsbSerialDevice,
- OUT UINT32 *Control
- )
-{
- *Control = 0;
-
- //
- // Check the values of UsbSerialDevice->Status Values and modify control
- // accordingly these values correspond to the modem status register
- //
- if (UsbSerialDevice->StatusValues.CtsState) {
- *Control |= EFI_SERIAL_CLEAR_TO_SEND;
- }
- if (UsbSerialDevice->StatusValues.DsrState) {
- *Control |= EFI_SERIAL_DATA_SET_READY;
- }
- if (UsbSerialDevice->StatusValues.RiState) {
- *Control |= EFI_SERIAL_RING_INDICATE;
- }
- if (UsbSerialDevice->StatusValues.SdState) {
- *Control |= EFI_SERIAL_CARRIER_DETECT;
- }
-
- //
- // check the values of UsbSerialDevice->ControlValues and modify control
- // accordingly these values correspond to the values of the Modem Control
- // Register
- //
- if (UsbSerialDevice->ControlValues.DtrState) {
- *Control |= EFI_SERIAL_DATA_TERMINAL_READY;
- }
- if (UsbSerialDevice->ControlValues.RtsState) {
- *Control |= EFI_SERIAL_REQUEST_TO_SEND;
- }
- if (UsbSerialDevice->ControlValues.HardwareLoopBack) {
- *Control |= EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE;
- }
- if (UsbSerialDevice->ControlValues.HardwareFlowControl) {
- *Control |= EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE;
- }
- //
- // check if the buffer is empty since only one is being used if it is empty
- // set both the receive and transmit buffers to empty
- //
- if (UsbSerialDevice->DataBufferHead == UsbSerialDevice->DataBufferTail) {
- *Control |= EFI_SERIAL_OUTPUT_BUFFER_EMPTY;
- *Control |= EFI_SERIAL_INPUT_BUFFER_EMPTY;
- }
- //
- // check for software loopback enable in UsbSerialDevice->ControlValues
- //
- if (UsbSerialDevice->ControlValues.SoftwareLoopBack) {
- *Control |= EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE;
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Resets the USB Serial Device
-
- This function is the internal method for resetting the device and is called by
- SerialReset()
-
- @param UsbSerialDevice[in] A pointer to the USB Serial device
-
- @retval EFI_SUCCESS The device was reset
- @retval EFI_DEVICE_ERROR The device could not be reset
-
-**/
-EFI_STATUS
-EFIAPI
-ResetInternal (
- IN USB_SER_DEV *UsbSerialDevice
- )
-{
- EFI_STATUS Status;
- EFI_USB_DEVICE_REQUEST DevReq;
- UINT8 ConfigurationValue;
- UINT32 ReturnValue;
-
- DevReq.Request = FTDI_COMMAND_RESET_PORT;
- DevReq.RequestType = USB_REQ_TYPE_VENDOR;
- DevReq.Value = RESET_PORT_PURGE_RX;
- DevReq.Index = FTDI_PORT_IDENTIFIER;
- DevReq.Length = 0; //indicates that there is not data phase in this request
-
- Status = UsbSerialDevice->UsbIo->UsbControlTransfer (
- UsbSerialDevice->UsbIo,
- &DevReq,
- EfiUsbDataIn,
- WDR_TIMEOUT,
- &ConfigurationValue,
- 1,
- &ReturnValue
- );
- if (EFI_ERROR (Status)) {
- return EFI_DEVICE_ERROR;
- }
-
- DevReq.Request = FTDI_COMMAND_RESET_PORT;
- DevReq.RequestType = USB_REQ_TYPE_VENDOR;
- DevReq.Value = RESET_PORT_PURGE_TX;
- DevReq.Index = FTDI_PORT_IDENTIFIER;
- DevReq.Length = 0; //indicates that there is no data phase in this request
-
- Status = UsbSerialDevice->UsbIo->UsbControlTransfer (
- UsbSerialDevice->UsbIo,
- &DevReq,
- EfiUsbDataIn,
- WDR_TIMEOUT,
- &ConfigurationValue,
- 1,
- &ReturnValue
- );
- if (EFI_ERROR (Status)) {
- return EFI_DEVICE_ERROR;
- }
- return Status;
-}
-
-/**
- Entrypoint of USB Serial Driver.
-
- This function is the entrypoint of USB Serial Driver. It installs
- Driver Binding Protocols together with Component Name Protocols.
-
- @param ImageHandle[in] The firmware allocated handle for the EFI image.
- @param SystemTable[in] A pointer to the EFI System Table.
-
- @retval EFI_SUCCESS The entry point is executed successfully.
-
-**/
-EFI_STATUS
-EFIAPI
-FtdiUsbSerialEntryPoint (
- IN EFI_HANDLE ImageHandle,
- IN EFI_SYSTEM_TABLE *SystemTable
- )
-{
- EFI_STATUS Status;
-
- Status = EfiLibInstallDriverBindingComponentName2 (
- ImageHandle,
- SystemTable,
- &gUsbSerialDriverBinding,
- ImageHandle,
- &gUsbSerialComponentName,
- &gUsbSerialComponentName2
- );
- ASSERT_EFI_ERROR (Status);
- return EFI_SUCCESS;
-}
-
-/**
- Unload function for the Usb Serial Driver.
-
- @param ImageHandle[in] The allocated handle for the EFI image
-
- @retval EFI_SUCCESS The driver was unloaded successfully
-**/
-EFI_STATUS
-EFIAPI
-FtdiUsbSerialUnload (
- IN EFI_HANDLE ImageHandle
- )
-{
- EFI_STATUS Status;
- EFI_HANDLE *HandleBuffer;
- UINTN HandleCount;
- UINTN Index;
-
- //
- // Retrieve all handles in the handle database
- //
- Status = gBS->LocateHandleBuffer (
- AllHandles,
- NULL,
- NULL,
- &HandleCount,
- &HandleBuffer
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- //
- // Disconnect the driver from the handles in the handle database
- //
- for (Index = 0; Index < HandleCount; Index++) {
- Status = gBS->DisconnectController (
- HandleBuffer[Index],
- gImageHandle,
- NULL
- );
- }
-
- //
- // Free the handle array
- //
- FreePool (HandleBuffer);
-
- //
- // Uninstall protocols installed by the driver in its entrypoint
- //
- Status = gBS->UninstallMultipleProtocolInterfaces (
- ImageHandle,
- &gEfiDriverBindingProtocolGuid,
- &gUsbSerialDriverBinding,
- &gEfiComponentNameProtocolGuid,
- &gUsbSerialComponentName,
- &gEfiComponentName2ProtocolGuid,
- &gUsbSerialComponentName2,
- NULL
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Check whether USB Serial driver supports this device.
-
- @param This[in] The USB Serial driver binding protocol.
- @param Controller[in] The controller handle to check.
- @param RemainingDevicePath[in] The remaining device path.
-
- @retval EFI_SUCCESS The driver supports this controller.
- @retval other This device isn't supported.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbSerialDriverBindingSupported (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE Controller,
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
- )
-{
- EFI_STATUS Status;
- EFI_USB_IO_PROTOCOL *UsbIo;
- UART_DEVICE_PATH *UartNode;
- UART_FLOW_CONTROL_DEVICE_PATH *FlowControlNode;
- UINTN Index;
- UINTN EntryCount;
- EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfoBuffer;
- BOOLEAN HasFlowControl;
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;
- EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
-
- if (RemainingDevicePath != NULL) {
- if (!IsDevicePathEnd (RemainingDevicePath)) {
- Status = EFI_UNSUPPORTED;
- UartNode = (UART_DEVICE_PATH *) NextDevicePathNode (RemainingDevicePath);
- if (UartNode->Header.Type != MESSAGING_DEVICE_PATH ||
- UartNode->Header.SubType != MSG_UART_DP ||
- sizeof (UART_DEVICE_PATH) != DevicePathNodeLength ((EFI_DEVICE_PATH *) UartNode)) {
- goto Error;
- }
- FlowControlNode = (UART_FLOW_CONTROL_DEVICE_PATH *) NextDevicePathNode (UartNode);
- if ((ReadUnaligned32 (&FlowControlNode->FlowControlMap) & ~UART_FLOW_CONTROL_HARDWARE) != 0) {
- goto Error;
- }
- }
- }
-
- //
- // Check if USB I/O Protocol is attached on the controller handle.
- //
- Status = gBS->OpenProtocol (
- Controller,
- &gEfiUsbIoProtocolGuid,
- (VOID **) &UsbIo,
- This->DriverBindingHandle,
- Controller,
- EFI_OPEN_PROTOCOL_BY_DRIVER
- );
- if (Status == EFI_ALREADY_STARTED) {
- if (RemainingDevicePath == NULL || IsDevicePathEnd (RemainingDevicePath)) {
- return EFI_SUCCESS;
- }
- Status = gBS->OpenProtocolInformation (
- Controller,
- &gEfiUsbIoProtocolGuid,
- &OpenInfoBuffer,
- &EntryCount
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
- for (Index = 0; Index < EntryCount; Index++) {
- if ((OpenInfoBuffer[Index].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {
- Status = gBS->OpenProtocol (
- OpenInfoBuffer[Index].ControllerHandle,
- &gEfiDevicePathProtocolGuid,
- (VOID **) &DevicePath,
- This->DriverBindingHandle,
- Controller,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
- if (!EFI_ERROR (Status)) {
- HasFlowControl = ContainsFlowControl (RemainingDevicePath);
- if (HasFlowControl ^ ContainsFlowControl (DevicePath)) {
- Status = EFI_UNSUPPORTED;
- }
- }
- break;
- }
- }
- FreePool (OpenInfoBuffer);
- return Status;
- }
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- gBS->CloseProtocol (
- Controller,
- &gEfiUsbIoProtocolGuid,
- This->DriverBindingHandle,
- Controller
- );
-
- Status = gBS->OpenProtocol (
- Controller,
- &gEfiDevicePathProtocolGuid,
- (VOID **) &ParentDevicePath,
- This->DriverBindingHandle,
- Controller,
- EFI_OPEN_PROTOCOL_BY_DRIVER
- );
- if (Status == EFI_ALREADY_STARTED) {
- return EFI_SUCCESS;
- }
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- //
- // Use the USB I/O Protocol interface to check whether Controller is
- // a USB Serial device that can be managed by this driver.
- //
- Status = EFI_SUCCESS;
-
- if (!IsUsbSerial (UsbIo)) {
- Status = EFI_UNSUPPORTED;
- goto Error;
- }
-
-Error:
- gBS->CloseProtocol (
- Controller,
- &gEfiDevicePathProtocolGuid,
- This->DriverBindingHandle,
- Controller
- );
- return Status;
-}
-
-/**
- Starts the USB Serial device with this driver.
-
- This function produces initializes the USB Serial device and
- produces the Serial IO Protocol.
-
- @param This[in] The USB Serial driver binding instance.
- @param Controller[in] Handle of device to bind driver to.
- @param RemainingDevicePath[in] Optional parameter use to pick a specific
- child device to start.
-
- @retval EFI_SUCCESS The controller is controlled by the usb USB
- Serial driver.
- @retval EFI_UNSUPPORTED No interrupt endpoint can be found.
- @retval Other This controller cannot be started.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbSerialDriverBindingStart (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE Controller,
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
- )
-{
- EFI_STATUS Status;
- EFI_USB_IO_PROTOCOL *UsbIo;
- USB_SER_DEV *UsbSerialDevice;
- UINT8 EndpointNumber;
- EFI_USB_ENDPOINT_DESCRIPTOR EndpointDescriptor;
- UINT8 Index;
- BOOLEAN FoundIn;
- BOOLEAN FoundOut;
- EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
- EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfoBuffer;
- UINTN EntryCount;
- EFI_SERIAL_IO_PROTOCOL *SerialIo;
- UART_DEVICE_PATH *Uart;
- UART_FLOW_CONTROL_DEVICE_PATH *FlowControl;
- UINT32 Control;
- EFI_DEVICE_PATH_PROTOCOL *TempDevicePath;
-
- UsbSerialDevice = AllocateZeroPool (sizeof (USB_SER_DEV));
- ASSERT (UsbSerialDevice != NULL);
-
- //
- // Get the Parent Device path
- //
- Status = gBS->OpenProtocol (
- Controller,
- &gEfiDevicePathProtocolGuid,
- (VOID **) &ParentDevicePath,
- This->DriverBindingHandle,
- Controller,
- EFI_OPEN_PROTOCOL_BY_DRIVER
- );
- if (EFI_ERROR (Status) && Status != EFI_ALREADY_STARTED) {
- goto ErrorExit1;
- }
-
- //
- // Open USB I/O Protocol
- //
- Status = gBS->OpenProtocol (
- Controller,
- &gEfiUsbIoProtocolGuid,
- (VOID **) &UsbIo,
- This->DriverBindingHandle,
- Controller,
- EFI_OPEN_PROTOCOL_BY_DRIVER
- );
- if (EFI_ERROR (Status) && Status != EFI_ALREADY_STARTED) {
- goto ErrorExit1;
- }
-
- if (Status == EFI_ALREADY_STARTED) {
- if (RemainingDevicePath == NULL || IsDevicePathEnd (RemainingDevicePath)) {
- FreePool (UsbSerialDevice);
- return EFI_SUCCESS;
- }
-
- //
- // Check to see if a child handle exists
- //
- Status = gBS->OpenProtocolInformation (
- Controller,
- &gEfiSerialIoProtocolGuid,
- &OpenInfoBuffer,
- &EntryCount
- );
- if (EFI_ERROR (Status)) {
- goto ErrorExit1;
- }
-
- Status = EFI_ALREADY_STARTED;
- for (Index = 0; Index < EntryCount; Index++) {
- if ((OpenInfoBuffer[Index].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {
- Status = gBS->OpenProtocol (
- OpenInfoBuffer[Index].ControllerHandle,
- &gEfiSerialIoProtocolGuid,
- (VOID **) &SerialIo,
- This->DriverBindingHandle,
- Controller,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
- if (EFI_ERROR (Status)) {
- }
- if (!EFI_ERROR (Status)) {
- Uart = (UART_DEVICE_PATH *) RemainingDevicePath;
- Status = SerialIo->SetAttributes (
- SerialIo,
- Uart->BaudRate,
- SerialIo->Mode->ReceiveFifoDepth,
- SerialIo->Mode->Timeout,
- (EFI_PARITY_TYPE) Uart->Parity,
- Uart->DataBits,
- (EFI_STOP_BITS_TYPE) Uart->StopBits
- );
- FlowControl = (UART_FLOW_CONTROL_DEVICE_PATH *) NextDevicePathNode (Uart);
- if (!EFI_ERROR (Status) && IsUartFlowControlNode (FlowControl)) {
- Status = SerialIo->GetControl (
- SerialIo,
- &Control
- );
- if (!EFI_ERROR (Status)) {
- if (ReadUnaligned32 (&FlowControl->FlowControlMap) == UART_FLOW_CONTROL_HARDWARE) {
- Control |= EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE;
- } else {
- Control &= ~EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE;
- }
- //
- // Clear bits that are not allowed to be passed to SetControl
- //
- Control &= (EFI_SERIAL_REQUEST_TO_SEND |
- EFI_SERIAL_DATA_TERMINAL_READY |
- EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE |
- EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE |
- EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE);
- Status = SerialIo->SetControl (SerialIo, Control);
- }
- }
- }
- break;
- }
- }
- FreePool (OpenInfoBuffer);
- return Status;
- }
-
- if (RemainingDevicePath != NULL) {
- if (IsDevicePathEnd (RemainingDevicePath)) {
- return EFI_SUCCESS;
- }
- }
-
- UsbSerialDevice->UsbIo = UsbIo;
-
- //
- // Get interface & endpoint descriptor
- //
- UsbIo->UsbGetInterfaceDescriptor (
- UsbIo,
- &UsbSerialDevice->InterfaceDescriptor
- );
-
- EndpointNumber = UsbSerialDevice->InterfaceDescriptor.NumEndpoints;
-
- //
- // Traverse endpoints to find the IN and OUT endpoints that will send and
- // receive data.
- //
- FoundIn = FALSE;
- FoundOut = FALSE;
- for (Index = 0; Index < EndpointNumber; Index++) {
-
- Status = UsbIo->UsbGetEndpointDescriptor (
- UsbIo,
- Index,
- &EndpointDescriptor
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- if (EndpointDescriptor.EndpointAddress == FTDI_ENDPOINT_ADDRESS_OUT) {
- //
- // Set the Out endpoint device
- //
- CopyMem (
- &UsbSerialDevice->OutEndpointDescriptor,
- &EndpointDescriptor,
- sizeof(EndpointDescriptor)
- );
- FoundOut = TRUE;
- }
-
- if (EndpointDescriptor.EndpointAddress == FTDI_ENDPOINT_ADDRESS_IN) {
- //
- // Set the In endpoint device
- //
- CopyMem (
- &UsbSerialDevice->InEndpointDescriptor,
- &EndpointDescriptor,
- sizeof(EndpointDescriptor)
- );
- FoundIn = TRUE;
- }
- }
-
- if (!FoundIn || !FoundOut) {
- //
- // No interrupt endpoint found, then return unsupported.
- //
- Status = EFI_UNSUPPORTED;
- goto ErrorExit;
- }
- //
- // set the initial values of UsbSerialDevice->LastSettings to the default
- // values
- //
- UsbSerialDevice->LastSettings.BaudRate = 115200;
- UsbSerialDevice->LastSettings.DataBits = 8;
- UsbSerialDevice->LastSettings.Parity = NoParity;
- UsbSerialDevice->LastSettings.ReceiveFifoDepth = FTDI_MAX_RECEIVE_FIFO_DEPTH;
- UsbSerialDevice->LastSettings.StopBits = OneStopBit;
- UsbSerialDevice->LastSettings.Timeout = FTDI_TIMEOUT;
-
- //
- // set the initial values of UsbSerialDevice->ControlValues
- //
- UsbSerialDevice->ControlValues.DtrState = FALSE;
- UsbSerialDevice->ControlValues.RtsState = FALSE;
- UsbSerialDevice->ControlValues.HardwareFlowControl = FALSE;
- UsbSerialDevice->ControlValues.HardwareLoopBack = FALSE;
- UsbSerialDevice->ControlValues.SoftwareLoopBack = FALSE;
-
- //
- // set the values of UsbSerialDevice->UartDevicePath
- //
- UsbSerialDevice->UartDevicePath.Header.Type = MESSAGING_DEVICE_PATH;
- UsbSerialDevice->UartDevicePath.Header.SubType = MSG_UART_DP;
- UsbSerialDevice->UartDevicePath.Header.Length[0] = (UINT8) (sizeof (UART_DEVICE_PATH));
- UsbSerialDevice->UartDevicePath.Header.Length[1] = (UINT8) ((sizeof (UART_DEVICE_PATH)) >> 8);
-
- //
- // set the values of UsbSerialDevice->FlowControlDevicePath
- UsbSerialDevice->FlowControlDevicePath.Header.Type = MESSAGING_DEVICE_PATH;
- UsbSerialDevice->FlowControlDevicePath.Header.SubType = MSG_VENDOR_DP;
- UsbSerialDevice->FlowControlDevicePath.Header.Length[0] = (UINT8) (sizeof (UART_FLOW_CONTROL_DEVICE_PATH));
- UsbSerialDevice->FlowControlDevicePath.Header.Length[1] = (UINT8) ((sizeof (UART_FLOW_CONTROL_DEVICE_PATH)) >> 8);
- UsbSerialDevice->FlowControlDevicePath.FlowControlMap = 0;
-
- Status = SetAttributesInternal (
- UsbSerialDevice,
- UsbSerialDevice->LastSettings.BaudRate,
- UsbSerialDevice->LastSettings.ReceiveFifoDepth,
- UsbSerialDevice->LastSettings.Timeout,
- UsbSerialDevice->LastSettings.Parity,
- UsbSerialDevice->LastSettings.DataBits,
- UsbSerialDevice->LastSettings.StopBits
- );
-
- ASSERT_EFI_ERROR (Status);
-
- Status = SetControlBitsInternal (
- UsbSerialDevice,
- &(UsbSerialDevice->ControlValues)
- );
-
- ASSERT_EFI_ERROR (Status);
-
- //
- // Publish Serial GUID and protocol
- //
-
- UsbSerialDevice->Signature = USB_SER_DEV_SIGNATURE;
- UsbSerialDevice->SerialIo.Reset = SerialReset;
- UsbSerialDevice->SerialIo.SetControl = SetControlBits;
- UsbSerialDevice->SerialIo.SetAttributes = SetAttributes;
- UsbSerialDevice->SerialIo.GetControl = GetControlBits;
- UsbSerialDevice->SerialIo.Read = ReadSerialIo;
- UsbSerialDevice->SerialIo.Write = WriteSerialIo;
-
- //
- // Set the static Serial IO modes that will display when running
- // "sermode" within the UEFI shell.
- //
-
- UsbSerialDevice->SerialIo.Mode->Timeout = 0;
- UsbSerialDevice->SerialIo.Mode->BaudRate = 115200;
- UsbSerialDevice->SerialIo.Mode->DataBits = 8;
- UsbSerialDevice->SerialIo.Mode->Parity = 1;
- UsbSerialDevice->SerialIo.Mode->StopBits = 1;
-
- UsbSerialDevice->ParentDevicePath = ParentDevicePath;
- UsbSerialDevice->ControllerHandle = NULL;
- FlowControl = NULL;
-
- //
- // Allocate space for the receive buffer
- //
- UsbSerialDevice->DataBuffer = AllocateZeroPool (SW_FIFO_DEPTH);
-
- //
- // Initialize data buffer pointers.
- // Head==Tail = true means buffer is empty.
- //
- UsbSerialDevice->DataBufferHead = 0;
- UsbSerialDevice->DataBufferTail = 0;
-
- UsbSerialDevice->ControllerNameTable = NULL;
- AddUnicodeString2 (
- "eng",
- gUsbSerialComponentName.SupportedLanguages,
- &UsbSerialDevice->ControllerNameTable,
- L"FTDI USB Serial Adapter",
- TRUE
- );
- AddUnicodeString2 (
- "en",
- gUsbSerialComponentName2.SupportedLanguages,
- &UsbSerialDevice->ControllerNameTable,
- L"FTDI USB Serial Adapter",
- FALSE
- );
-
- Status = SetInitialStatus (UsbSerialDevice);
- ASSERT_EFI_ERROR (Status);
-
- //
- // Create a polling loop to check for input
- //
-
- gBS->CreateEvent (
- EVT_TIMER | EVT_NOTIFY_SIGNAL,
- TPL_CALLBACK,
- UsbSerialDriverCheckInput,
- UsbSerialDevice,
- &(UsbSerialDevice->PollingLoop)
- );
- //
- // add code to set trigger time based on baud rate
- // setting to 0.5s for now
- //
- gBS->SetTimer (
- UsbSerialDevice->PollingLoop,
- TimerPeriodic,
- EFI_TIMER_PERIOD_MILLISECONDS (500)
- );
-
- //
- // Check if the remaining device path is null. If it is not null change the settings
- // of the device to match those on the device path
- //
- if (RemainingDevicePath != NULL) {
- CopyMem (
- &UsbSerialDevice->UartDevicePath,
- RemainingDevicePath,
- sizeof (UART_DEVICE_PATH)
- );
- FlowControl = (UART_FLOW_CONTROL_DEVICE_PATH *) NextDevicePathNode (RemainingDevicePath);
- if (IsUartFlowControlNode (FlowControl)) {
- UsbSerialDevice->FlowControlDevicePath.FlowControlMap = ReadUnaligned32 (&FlowControl->FlowControlMap);
- } else {
- FlowControl = NULL;
- }
- }
-
- //
- // Build the device path by appending the UART node to the parent device path
- //
- UsbSerialDevice->DevicePath = AppendDevicePathNode (
- ParentDevicePath,
- (EFI_DEVICE_PATH_PROTOCOL *) &UsbSerialDevice->UartDevicePath
- );
- //
- // Continue building the device path by appending the flow control node
- //
- TempDevicePath = UsbSerialDevice->DevicePath;
- UsbSerialDevice->DevicePath = AppendDevicePathNode (
- TempDevicePath,
- (EFI_DEVICE_PATH_PROTOCOL *) &UsbSerialDevice->FlowControlDevicePath
- );
- FreePool (TempDevicePath);
-
- if (UsbSerialDevice->DevicePath == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto ErrorExit;
- }
-
- //
- // Install protocol interfaces for the device
- //
- Status = gBS->InstallMultipleProtocolInterfaces (
- &UsbSerialDevice->ControllerHandle,
- &gEfiDevicePathProtocolGuid,
- UsbSerialDevice->DevicePath,
- &gEfiSerialIoProtocolGuid,
- &UsbSerialDevice->SerialIo,
- NULL
- );
- if (EFI_ERROR (Status)){
- goto ErrorExit;
- }
-
- //
- // Open for child device
- //
- Status = gBS->OpenProtocol (
- Controller,
- &gEfiUsbIoProtocolGuid,
- (VOID **) &UsbIo,
- This->DriverBindingHandle,
- UsbSerialDevice->ControllerHandle,
- EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
- );
-
- UsbSerialDevice->Shutdown = FALSE;
-
- return EFI_SUCCESS;
-
-ErrorExit:
- //
- // Error handler
- //
-
- Status = gBS->UninstallMultipleProtocolInterfaces (
- Controller,
- &gEfiSerialIoProtocolGuid,
- &UsbSerialDevice->SerialIo,
- NULL
- );
- if (EFI_ERROR (Status)) {
- goto ErrorExit1;
- }
-
- FreePool (UsbSerialDevice->DataBuffer);
- FreePool (UsbSerialDevice);
-
- UsbSerialDevice = NULL;
- gBS->CloseProtocol (
- Controller,
- &gEfiUsbIoProtocolGuid,
- This->DriverBindingHandle,
- Controller
- );
-
-ErrorExit1:
- return Status;
-}
-
-/**
- Stop the USB Serial device handled by this driver.
-
- @param This[in] The USB Serial driver binding protocol.
- @param Controller[in] The controller to release.
- @param NumberOfChildren[in] The number of handles in ChildHandleBuffer.
- @param ChildHandleBuffer[in] The array of child handle.
-
- @retval EFI_SUCCESS The device was stopped.
- @retval EFI_UNSUPPORTED Serial IO Protocol is not installed on
- Controller.
- @retval EFI_DEVICE_ERROR The device could not be stopped due to a
- device error.
- @retval Others Fail to uninstall protocols attached on the
- device.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbSerialDriverBindingStop (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE Controller,
- IN UINTN NumberOfChildren,
- IN EFI_HANDLE *ChildHandleBuffer
- )
-{
- EFI_STATUS Status;
- EFI_SERIAL_IO_PROTOCOL *SerialIo;
- EFI_USB_IO_PROTOCOL *UsbIo;
- USB_SER_DEV *UsbSerialDevice;
- UINTN Index;
- BOOLEAN AllChildrenStopped;
-
- Status = EFI_SUCCESS;
- UsbSerialDevice = NULL;
-
- if (NumberOfChildren == 0) {
- //
- // Close the driver
- //
- Status = gBS->CloseProtocol (
- Controller,
- &gEfiUsbIoProtocolGuid,
- This->DriverBindingHandle,
- Controller
- );
- Status = gBS->CloseProtocol (
- Controller,
- &gEfiDevicePathProtocolGuid,
- This->DriverBindingHandle,
- Controller
- );
- return Status;
- }
-
- AllChildrenStopped = TRUE;
-
- for (Index = 0; Index < NumberOfChildren ;Index++) {
- Status = gBS->OpenProtocol (
- ChildHandleBuffer[Index],
- &gEfiSerialIoProtocolGuid,
- (VOID **) &SerialIo,
- This->DriverBindingHandle,
- Controller,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
- if (Status == EFI_SUCCESS) {//!EFI_ERROR (Status)) {
- UsbSerialDevice = USB_SER_DEV_FROM_THIS (SerialIo);
- Status = gBS->CloseProtocol (
- Controller,
- &gEfiUsbIoProtocolGuid,
- This->DriverBindingHandle,
- ChildHandleBuffer[Index]
- );
- Status = gBS->UninstallMultipleProtocolInterfaces (
- ChildHandleBuffer[Index],
- &gEfiDevicePathProtocolGuid,
- UsbSerialDevice->DevicePath,
- &gEfiSerialIoProtocolGuid,
- &UsbSerialDevice->SerialIo,
- NULL
- );
-
- if (EFI_ERROR (Status)) {
- gBS->OpenProtocol (
- Controller,
- &gEfiUsbIoProtocolGuid,
- (VOID **) &UsbIo,
- This->DriverBindingHandle,
- ChildHandleBuffer[Index],
- EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
- );
- } else {
- if (UsbSerialDevice->DevicePath != NULL) {
- gBS->FreePool (UsbSerialDevice->DevicePath);
- }
- gBS->SetTimer (
- UsbSerialDevice->PollingLoop,
- TimerCancel,
- 0
- );
- gBS->CloseEvent (UsbSerialDevice->PollingLoop);
- UsbSerialDevice->Shutdown = TRUE;
- FreeUnicodeStringTable (UsbSerialDevice->ControllerNameTable);
- FreePool (UsbSerialDevice->DataBuffer);
- FreePool (UsbSerialDevice);
- }
- }
- if (EFI_ERROR (Status)) {
- AllChildrenStopped = FALSE;
- }
- }
-
- if (!AllChildrenStopped) {
- return EFI_DEVICE_ERROR;
- }
- return EFI_SUCCESS;
-}
-
-//
-// Serial IO Member Functions
-//
-
-/**
- Reset the serial device.
-
- @param This[in] Protocol instance pointer.
-
- @retval EFI_SUCCESS The device was reset.
- @retval EFI_DEVICE_ERROR The serial device could not be reset.
-
-**/
-EFI_STATUS
-EFIAPI
-SerialReset (
- IN EFI_SERIAL_IO_PROTOCOL *This
- )
-{
- EFI_STATUS Status;
- USB_SER_DEV *UsbSerialDevice;
-
- UsbSerialDevice = USB_SER_DEV_FROM_THIS (This);
- Status = ResetInternal (UsbSerialDevice);
- if (EFI_ERROR (Status)){
- return EFI_DEVICE_ERROR;
- }
- return Status;
-}
-
-/**
- Set the control bits on a serial device.
-
- @param This[in] Protocol instance pointer.
- @param Control[in] Set the bits of Control that are settable.
-
- @retval EFI_SUCCESS The new control bits were set on the serial device.
- @retval EFI_UNSUPPORTED The serial device does not support this operation.
- @retval EFI_DEVICE_ERROR The serial device is not functioning correctly.
-
-**/
-EFI_STATUS
-EFIAPI
-SetControlBits (
- IN EFI_SERIAL_IO_PROTOCOL *This,
- IN UINT32 Control
- )
-{
- EFI_STATUS Status;
- USB_SER_DEV *UsbSerialDevice;
- CONTROL_BITS ControlBits;
-
- UsbSerialDevice = USB_SER_DEV_FROM_THIS (This);
-
- //
- // check for invalid control parameters
- //
- if ((Control & (~(EFI_SERIAL_REQUEST_TO_SEND |
- EFI_SERIAL_DATA_TERMINAL_READY |
- EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE |
- EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE |
- EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE))) != 0 ) {
- return EFI_UNSUPPORTED;
- }
-
- //
- // check the control parameters and set the correct setting for
- // the paramerts of ControlBits
- // both loopback enables are always set to FALSE
- //
- ControlBits.HardwareLoopBack = FALSE;
- ControlBits.SoftwareLoopBack = FALSE;
- //
- // check for hardware flow control
- //
- if ((Control & EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE) == EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE) {
- ControlBits.HardwareFlowControl = TRUE;
- } else {
- ControlBits.HardwareFlowControl = FALSE;
- }
- //
- // check for DTR enabled
- //
- if ((Control & EFI_SERIAL_DATA_TERMINAL_READY) == EFI_SERIAL_DATA_TERMINAL_READY) {
- ControlBits.DtrState = TRUE;
- } else {
- ControlBits.DtrState = FALSE;
- }
- //
- // check for RTS enabled
- //
- if ((Control & EFI_SERIAL_REQUEST_TO_SEND) == EFI_SERIAL_REQUEST_TO_SEND) {
- ControlBits.RtsState = TRUE;
- } else {
- ControlBits.RtsState = FALSE;
- }
-
- //
- // set the control values with a call to SetControlBitsInternal()
- //
- Status = SetControlBitsInternal (UsbSerialDevice, &ControlBits);
-
- return Status;
-}
-
-/**
- calls SetAttributesInternal() to set the baud rate, receive FIFO depth,
- transmit/receive time out, parity, data buts, and stop bits on a serial
- device.
-
- @param This[in] Protocol instance pointer.
- @param BaudRate[in] The requested baud rate. A BaudRate value of 0
- will use the device's default interface speed.
- @param ReveiveFifoDepth[in] The requested depth of the FIFO on the receive
- side of the serial interface. A ReceiveFifoDepth
- value of 0 will use the device's default FIFO
- depth.
- @param Timeout[in] The requested time out for a single character in
- microseconds.This timeout applies to both the
- transmit and receive side of the interface. A
- Timeout value of 0 will use the device's default
- time out value.
- @param Parity[in] The type of parity to use on this serial device.
- A Parity value of DefaultParity will use the
- device's default parity value.
- @param DataBits[in] The number of data bits to use on the serial
- device. A DataBit vaule of 0 will use the
- device's default data bit setting.
- @param StopBits[in] The number of stop bits to use on this serial
- device. A StopBits value of DefaultStopBits will
- use the device's default number of stop bits.
-
- @retval EFI_SUCCESS The attributes were set
- @retval EFI_DEVICE_ERROR The attributes were not able to be
-
-**/
-EFI_STATUS
-EFIAPI
-SetAttributes (
- IN EFI_SERIAL_IO_PROTOCOL *This,
- IN UINT64 BaudRate,
- IN UINT32 ReceiveFifoDepth,
- IN UINT32 Timeout,
- IN EFI_PARITY_TYPE Parity,
- IN UINT8 DataBits,
- IN EFI_STOP_BITS_TYPE StopBits
- )
-{
-
- EFI_STATUS Status;
- USB_SER_DEV *UsbSerialDevice;
-
- UsbSerialDevice = USB_SER_DEV_FROM_THIS (This);
-
- Status = SetAttributesInternal (
- UsbSerialDevice,
- BaudRate,
- ReceiveFifoDepth,
- Timeout,
- Parity,
- DataBits,
- StopBits
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- return Status;
-}
-
-
-/**
- Retrieves the status of the control bits on a serial device.
-
- @param This[in] Protocol instance pointer.
- @param Control[out] A pointer to return the current Control signals
- from the serial device.
-
- @retval EFI_SUCCESS The control bits were read from the serial
- device.
- @retval EFI_DEVICE_ERROR The serial device is not functioning correctly.
-
-**/
-EFI_STATUS
-EFIAPI
-GetControlBits (
- IN EFI_SERIAL_IO_PROTOCOL *This,
- OUT UINT32 *Control
- )
-{
- USB_SER_DEV *UsbSerialDevice;
- EFI_STATUS Status;
-
- UsbSerialDevice = USB_SER_DEV_FROM_THIS (This);
-
- *Control = 0;
-
- Status = GetControlBitsInternal (UsbSerialDevice, Control);
-
- if (EFI_ERROR (Status)) {
- return EFI_DEVICE_ERROR;
- }
- return Status;
-}
-
-/**
- Reads data from a serial device.
-
- @param This[in] Protocol instance pointer.
- @param BufferSize[in, out] On input, the size of the Buffer. On output,
- the amount of data returned in Buffer.
- @param Buffer[out] The buffer to return the data into.
-
- @retval EFI_SUCCESS The data was read.
- @retval EFI_DEVICE_ERROR The device reported an error.
- @retval EFI_TIMEOUT The data write was stopped due to a timeout.
-
-**/
-EFI_STATUS
-EFIAPI
-ReadSerialIo (
- IN EFI_SERIAL_IO_PROTOCOL *This,
- IN OUT UINTN *BufferSize,
- OUT VOID *Buffer
- )
-{
- UINTN Index;
- UINTN RemainingCallerBufferSize;
- USB_SER_DEV *UsbSerialDevice;
- EFI_STATUS Status;
-
-
- if (*BufferSize == 0) {
- return EFI_SUCCESS;
- }
-
- if (Buffer == NULL) {
- return EFI_DEVICE_ERROR;
- }
-
- Status = EFI_SUCCESS;
- UsbSerialDevice = USB_SER_DEV_FROM_THIS (This);
-
- //
- // Clear out any data that we already have in our internal buffer
- //
- for (Index = 0; Index < *BufferSize; Index++) {
- if (UsbSerialDevice->DataBufferHead == UsbSerialDevice->DataBufferTail) {
- break;
- }
-
- //
- // Still have characters in the buffer to return
- //
- ((UINT8 *)Buffer)[Index] = UsbSerialDevice->DataBuffer[UsbSerialDevice->DataBufferHead];
- UsbSerialDevice->DataBufferHead = (UsbSerialDevice->DataBufferHead + 1) % SW_FIFO_DEPTH;
- }
-
- //
- // If we haven't filled the caller's buffer using data that we already had on
- // hand We need to generate an additional USB request to try and fill the
- // caller's buffer
- //
- if (Index != *BufferSize) {
- RemainingCallerBufferSize = *BufferSize - Index;
- Status = ReadDataFromUsb (
- UsbSerialDevice,
- &RemainingCallerBufferSize,
- (VOID *)(((CHAR8 *)Buffer) + Index)
- );
- if (!EFI_ERROR (Status)) {
- *BufferSize = RemainingCallerBufferSize + Index;
- } else {
- *BufferSize = Index;
- }
- }
-
- if (UsbSerialDevice->DataBufferHead == UsbSerialDevice->DataBufferTail) {
- //
- // Data buffer has no data, set the EFI_SERIAL_INPUT_BUFFER_EMPTY flag
- //
- UsbSerialDevice->ControlBits |= EFI_SERIAL_INPUT_BUFFER_EMPTY;
- } else {
- //
- // There is some leftover data, clear EFI_SERIAL_INPUT_BUFFER_EMPTY flag
- //
- UsbSerialDevice->ControlBits &= ~(EFI_SERIAL_INPUT_BUFFER_EMPTY);
- }
- return Status;
-}
-
-/**
- Writes data to a serial device.
-
- @param This[in] Protocol instance pointer.
- @param BufferSize[in, out] On input, the size of the Buffer. On output,
- the amount of data actually written.
- @param Buffer[in] The buffer of data to write
-
- @retval EFI_SUCCESS The data was written.
- @retval EFI_DEVICE_ERROR The device reported an error.
- @retval EFI_TIMEOUT The data write was stopped due to a timeout.
-
-**/
-EFI_STATUS
-EFIAPI
-WriteSerialIo (
- IN EFI_SERIAL_IO_PROTOCOL *This,
- IN OUT UINTN *BufferSize,
- IN VOID *Buffer
- )
-{
- EFI_STATUS Status;
- USB_SER_DEV *UsbSerialDevice;
- EFI_TPL Tpl;
-
- UsbSerialDevice = USB_SER_DEV_FROM_THIS (This);
-
- if (UsbSerialDevice->Shutdown) {
- return EFI_DEVICE_ERROR;
- }
-
- Tpl = gBS->RaiseTPL (TPL_NOTIFY);
-
- Status = UsbSerialDataTransfer (
- UsbSerialDevice,
- EfiUsbDataOut,
- Buffer,
- BufferSize,
- FTDI_TIMEOUT
- );
-
- gBS->RestoreTPL (Tpl);
- if (EFI_ERROR (Status)) {
- if (Status == EFI_TIMEOUT){
- return Status;
- } else {
- return EFI_DEVICE_ERROR;
- }
- }
-
- return EFI_SUCCESS;
-}
diff --git a/OptionRomPkg/Bus/Usb/FtdiUsbSerialDxe/FtdiUsbSerialDriver.h b/OptionRomPkg/Bus/Usb/FtdiUsbSerialDxe/FtdiUsbSerialDriver.h
deleted file mode 100644
index 6048923..0000000
--- a/OptionRomPkg/Bus/Usb/FtdiUsbSerialDxe/FtdiUsbSerialDriver.h
+++ /dev/null
@@ -1,589 +0,0 @@
-/** @file
- Header file for USB Serial Driver's Data Structures.
-
-Copyright (c) 2004 - 2013, Intel Corporation. All rights reserved.
-Portions Copyright 2012 Ashley DeSimone
-SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#ifndef _FTDI_USB_SERIAL_DRIVER_H_
-#define _FTDI_USB_SERIAL_DRIVER_H_
-
-#include <Library/BaseMemoryLib.h>
-#include <Library/DebugLib.h>
-#include <Library/MemoryAllocationLib.h>
-#include <Library/UefiBootServicesTableLib.h>
-#include <Library/UefiLib.h>
-#include <Library/DevicePathLib.h>
-
-#include <Protocol/DevicePath.h>
-#include <Protocol/UsbIo.h>
-#include <Protocol/SerialIo.h>
-
-//
-// US English LangID
-//
-#define USB_US_LANG_ID 0x0409
-
-//
-// Supported Vendor Ids
-//
-#define VID_FTDI 0x0403
-
-//
-// Supported product ids
-//
-#define DID_FTDI_FT232 0x6001
-
-//
-// FTDI Commands
-//
-#define FTDI_COMMAND_RESET_PORT 0
-#define FTDI_COMMAND_MODEM_CTRL 1
-#define FTDI_COMMAND_SET_FLOW_CTRL 2
-#define FTDI_COMMAND_SET_BAUDRATE 3
-#define FTDI_COMMAND_SET_DATA 4
-#define FTDI_COMMAND_GET_MODEM_STATUS 5
-#define FTDI_COMMAND_SET_EVENT_CHAR 6
-#define FTDI_COMMAND_SET_ERROR_CHAR 7
-#define FTDI_COMMAND_SET_LATENCY_TIMER 9
-#define FTDI_COMMAND_GET_LATENCY_TIMER 10
-
-//
-// FTDI_PORT_IDENTIFIER
-// Used in the usb control transfers that issue FTDI commands as the index value.
-//
-#define FTDI_PORT_IDENTIFIER 0x1 // For FTDI USB serial adapter the port
- // identifier is always 1.
-
-//
-// RESET_PORT
-//
-#define RESET_PORT_RESET 0x0 // Purges RX and TX, clears DTR and RTS sets
- // flow control to none, disables event
- // trigger, sets the event char to 0x0d and
- // does nothing to baudrate or data settings
-#define RESET_PORT_PURGE_RX 0x1
-#define RESET_PORT_PURGE_TX 0x2
-
-//
-// SET_FLOW_CONTROL
-//
-#define NO_FLOW_CTRL 0x0
-#define XON_XOFF_CTRL 0x4
-
-//
-// SET_BAUD_RATE
-// To set baud rate, one must calculate an encoding of the baud rate from
-// UINT32 to UINT16.See EncodeBaudRateForFtdi() for details
-//
-#define FTDI_UART_FREQUENCY 3000000
-#define FTDI_MIN_DIVISOR 0x20
-#define FTDI_MAX_DIVISOR 0x3FFF8
-//
-// Special case baudrate values
-// 300,000 and 200,000 are special cases for calculating the encoded baudrate
-//
-#define FTDI_SPECIAL_CASE_300_MIN (3000000 * 100) / 103 // minimum adjusted
- // value for 300,000
-#define FTDI_SPECIAL_CASE_300_MAX (3000000 * 100) / 97 // maximum adjusted
- // value for 300,000
-#define FTDI_SPECIAL_CASE_200_MIN (2000000 * 100) / 103 // minimum adjusted
- // value for 200,000
-#define FTDI_SPECIAL_CASE_200_MAX (2000000 * 100) / 97 // maximum adjusted
- // value for 200,000
-//
-// Min and max frequency values that the FTDI chip can attain
-//.all generated frequencies must be between these values
-//
-#define FTDI_MIN_FREQUENCY 46601941 // (3MHz * 1600) / 103 = 46601941
-#define FTDI_MAX_FREQUENCY 49484536 // (3MHz * 1600) / 97 = 49484536
-
-//
-// SET_DATA_BITS
-//
-#define SET_DATA_BITS(n) (n)
-
-//
-// SET_PARITY
-//
-#define SET_PARITY_NONE 0x0
-#define SET_PARITY_ODD BIT8 // (0x1 << 8)
-#define SET_PARITY_EVEN BIT9 // (0x2 << 8)
-#define SET_PARITY_MARK BIT9 | BIT8 // (0x3 << 8)
-#define SET_PARITY_SPACE BIT10 // (0x4 << 8)
-
-//
-// SET_STOP_BITS
-//
-#define SET_STOP_BITS_1 0x0
-#define SET_STOP_BITS_15 BIT11 // (0x1 << 11)
-#define SET_STOP_BITS_2 BIT12 // (0x2 << 11)
-
-//
-// SET_MODEM_CTRL
-// SET_DTR_HIGH = (1 | (1 << 8)), SET_DTR_LOW = (0 | (1 << 8)
-// SET_RTS_HIGH = (2 | (2 << 8)), SET_RTS_LOW = (0 | (2 << 8)
-//
-#define SET_DTR_HIGH (BIT8 | BIT0)
-#define SET_DTR_LOW (BIT8)
-#define SET_RTS_HIGH (BIT9 | BIT1)
-#define SET_RTS_LOW (BIT9)
-
-//
-// MODEM_STATUS
-//
-#define CTS_MASK BIT4
-#define DSR_MASK BIT5
-#define RI_MASK BIT6
-#define SD_MASK BIT7
-#define MSR_MASK (CTS_MASK | DSR_MASK | RI_MASK | SD_MASK)
-
-//
-// Macro used to check for USB transfer errors
-//
-#define USB_IS_ERROR(Result, Error) (((Result) & (Error)) != 0)
-
-//
-// USB request timeouts
-//
-#define WDR_TIMEOUT 5000 // default urb timeout in ms
-#define WDR_SHORT_TIMEOUT 1000 // shorter urb timeout in ms
-
-//
-// FTDI timeout
-//
-#define FTDI_TIMEOUT 16
-
-//
-// FTDI FIFO depth
-//
-#define FTDI_MAX_RECEIVE_FIFO_DEPTH 384
-
-//
-// FTDI Endpoint Descriptors
-//
-#define FTDI_ENDPOINT_ADDRESS_IN 0x81 //the endpoint address for the in enpoint generated by the device
-#define FTDI_ENDPOINT_ADDRESS_OUT 0x02 //the endpoint address for the out endpoint generated by the device
-
-//
-// Max buffer size for USB transfers
-//
-#define SW_FIFO_DEPTH 1024
-
-//
-// struct to define a usb device as a vendor and product id pair
-//
-typedef struct {
- UINTN VendorId;
- UINTN DeviceId;
-} USB_DEVICE;
-
-//
-//struct to describe the control bits of the device
-//true indicates enabled
-//false indicates disabled
-//
-typedef struct {
- BOOLEAN HardwareFlowControl;
- BOOLEAN DtrState;
- BOOLEAN RtsState;
- BOOLEAN HardwareLoopBack;
- BOOLEAN SoftwareLoopBack;
-} CONTROL_BITS;
-
-//
-//struct to describe the status bits of the device
-//true indicates enabled
-//false indicated disabled
-//
-typedef struct {
- BOOLEAN CtsState;
- BOOLEAN DsrState;
- BOOLEAN RiState;
- BOOLEAN SdState;
-} STATUS_BITS;
-
-//
-// Structure to describe the last attributes of the Usb Serial device
-//
-typedef struct {
- UINT64 BaudRate;
- UINT32 ReceiveFifoDepth;
- UINT32 Timeout;
- EFI_PARITY_TYPE Parity;
- UINT8 DataBits;
- EFI_STOP_BITS_TYPE StopBits;
-} PREVIOUS_ATTRIBUTES;
-
-//
-// Structure to describe USB serial device
-//
-#define USB_SER_DEV_SIGNATURE SIGNATURE_32 ('u', 's', 'b', 's')
-
-typedef struct {
- UINTN Signature;
- EFI_HANDLE ControllerHandle;
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;
- EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
- UART_DEVICE_PATH UartDevicePath;
- UART_FLOW_CONTROL_DEVICE_PATH FlowControlDevicePath;
- EFI_USB_IO_PROTOCOL *UsbIo;
- EFI_USB_INTERFACE_DESCRIPTOR InterfaceDescriptor;
- EFI_USB_ENDPOINT_DESCRIPTOR InEndpointDescriptor;
- EFI_USB_ENDPOINT_DESCRIPTOR OutEndpointDescriptor;
- EFI_UNICODE_STRING_TABLE *ControllerNameTable;
- UINT32 DataBufferHead;
- UINT32 DataBufferTail;
- UINT8 *DataBuffer;
- EFI_SERIAL_IO_PROTOCOL SerialIo;
- BOOLEAN Shutdown;
- EFI_EVENT PollingLoop;
- UINT32 ControlBits;
- PREVIOUS_ATTRIBUTES LastSettings;
- CONTROL_BITS ControlValues;
- STATUS_BITS StatusValues;
- UINT8 ReadBuffer[512];
-} USB_SER_DEV;
-
-#define USB_SER_DEV_FROM_THIS(a) \
- CR(a, USB_SER_DEV, SerialIo, USB_SER_DEV_SIGNATURE)
-
-//
-// Global Variables
-//
-extern EFI_DRIVER_BINDING_PROTOCOL gUsbSerialDriverBinding;
-extern EFI_COMPONENT_NAME_PROTOCOL gUsbSerialComponentName;
-extern EFI_COMPONENT_NAME2_PROTOCOL gUsbSerialComponentName2;
-
-//
-// Functions of Driver Binding Protocol
-//
-/**
- Check whether USB Serial driver supports this device.
-
- @param This[in] The USB Serial driver binding protocol.
- @param Controller[in] The controller handle to check.
- @param RemainingDevicePath[in] The remaining device path.
-
- @retval EFI_SUCCESS The driver supports this controller.
- @retval other This device isn't supported.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbSerialDriverBindingSupported (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE Controller,
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
- );
-
-/**
- Starts the Serial device with this driver.
-
- This function produces Serial IO Protocol and initializes the USB
- Serial device to manage this USB Serial device.
-
- @param This[in] The USB Serial driver binding instance.
- @param Controller[in] Handle of device to bind driver to.
- @param RemainingDevicePath[in] Optional parameter use to pick a specific
- child device to start.
-
- @retval EFI_SUCCESS The controller is controlled by the USB
- Serial driver.
- @retval EFI_UNSUPPORTED No interrupt endpoint can be found.
- @retval Other This controller cannot be started.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbSerialDriverBindingStart (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE Controller,
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
- );
-
-/**
- Stop the USB Serial device handled by this driver.
-
- @param This[in] The USB Serial driver binding protocol.
- @param Controller[in] The controller to release.
- @param NumberOfChildren[in] The number of handles in ChildHandleBuffer.
- @param ChildHandleBuffer[in] The array of child handle.
-
- @retval EFI_SUCCESS The device was stopped.
- @retval EFI_UNSUPPORTED Simple Text In Protocol or Simple Text In Ex
- Protocol is not installed on Controller.
- @retval EFI_DEVICE_ERROR The device could not be stopped due to a
- device error.
- @retval Others Fail to uninstall protocols attached on the
- device.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbSerialDriverBindingStop (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE Controller,
- IN UINTN NumberOfChildren,
- IN EFI_HANDLE *ChildHandleBuffer
- );
-
-//
-// Serial IO Member Functions
-//
-
-/**
- Writes data to a serial device.
-
- @param This[in] Protocol instance pointer.
- @param BufferSize[in, out] On input, the size of the Buffer. On output,
- the amount of data actually written.
- @param Buffer[in] The buffer of data to write
-
- @retval EFI_SUCCESS The data was written.
- @retval EFI_DEVICE_ERROR The device reported an error.
- @retval EFI_TIMEOUT The data write was stopped due to a timeout.
-
-**/
-EFI_STATUS
-EFIAPI
-WriteSerialIo (
- IN EFI_SERIAL_IO_PROTOCOL *This,
- IN OUT UINTN *BufferSize,
- IN VOID *Buffer
- );
-
-/**
- Reads data from a serial device.
-
- @param This[in] Protocol instance pointer.
- @param BufferSize[in, out] On input, the size of the Buffer. On output,
- the amount of data returned in Buffer.
- @param Buffer[out] The buffer to return the data into.
-
- @retval EFI_SUCCESS The data was read.
- @retval EFI_DEVICE_ERROR The device reported an error.
- @retval EFI_TIMEOUT The data write was stopped due to a timeout.
-
-**/
-EFI_STATUS
-EFIAPI
-ReadSerialIo (
- IN EFI_SERIAL_IO_PROTOCOL *This,
- IN OUT UINTN *BufferSize,
- OUT VOID *Buffer
- );
-
-/**
- Retrieves the status of the control bits on a serial device.
-
- @param This[in] Protocol instance pointer.
- @param Control[out] A pointer to return the current Control signals
- from the serial device.
-
- @retval EFI_SUCCESS The control bits were read from the serial
- device.
- @retval EFI_DEVICE_ERROR The serial device is not functioning correctly.
-
-**/
-EFI_STATUS
-EFIAPI
-GetControlBits (
- IN EFI_SERIAL_IO_PROTOCOL *This,
- OUT UINT32 *Control
- );
-
-/**
- Set the control bits on a serial device.
-
- @param This[in] Protocol instance pointer.
- @param Control[in] Set the bits of Control that are settable.
-
- @retval EFI_SUCCESS The new control bits were set on the serial device.
- @retval EFI_UNSUPPORTED The serial device does not support this operation.
- @retval EFI_DEVICE_ERROR The serial device is not functioning correctly.
-
-**/
-EFI_STATUS
-EFIAPI
-SetControlBits (
- IN EFI_SERIAL_IO_PROTOCOL *This,
- IN UINT32 Control
- );
-
-/**
- Calls SetAttributesInternal() to set the baud rate, receive FIFO depth,
- transmit/receice time out, parity, data buts, and stop bits on a serial device.
-
- @param This[in] Protocol instance pointer.
- @param BaudRate[in] The requested baud rate. A BaudRate value of 0
- will use the device's default interface speed.
- @param ReveiveFifoDepth[in] The requested depth of the FIFO on the receive
- side of the serial interface. A ReceiveFifoDepth
- value of 0 will use the device's default FIFO
- depth.
- @param Timeout[in] The requested time out for a single character in
- microseconds.This timeout applies to both the
- transmit and receive side of the interface.A
- Timeout value of 0 will use the device's default
- time out value.
- @param Parity[in] The type of parity to use on this serial device.A
- Parity value of DefaultParity will use the
- device's default parity value.
- @param DataBits[in] The number of data bits to use on the serial
- device. A DataBits value of 0 will use the
- device's default data bit setting.
- @param StopBits[in] The number of stop bits to use on this serial
- device. A StopBits value of DefaultStopBits will
- use the device's default number of stop bits.
-
- @retval EFI_SUCCESS The attributes were set
- @retval EFI_DEVICE_ERROR The attributes were not able to be
-
-**/
-EFI_STATUS
-EFIAPI
-SetAttributes (
- IN EFI_SERIAL_IO_PROTOCOL *This,
- IN UINT64 BaudRate,
- IN UINT32 ReceiveFifoDepth,
- IN UINT32 Timeout,
- IN EFI_PARITY_TYPE Parity,
- IN UINT8 DataBits,
- IN EFI_STOP_BITS_TYPE StopBits
- );
-
-/**
- Reset the serial device.
-
- @param This Protocol instance pointer.
-
- @retval EFI_SUCCESS The device was reset.
- @retval EFI_DEVICE_ERROR The serial device could not be reset.
-
-**/
-EFI_STATUS
-EFIAPI
-SerialReset (
- IN EFI_SERIAL_IO_PROTOCOL *This
- );
-
-//
-// EFI Component Name Functions
-//
-
-/**
- Retrieves a Unicode string that is the user readable name of the driver.
-
- This function retrieves the user readable name of a driver in the form of a
- Unicode string. If the driver specified by This has a user readable name in
- the language specified by Language, then a pointer to the driver name is
- returned in DriverName, and EFI_SUCCESS is returned. If the driver specified
- by This does not support the language specified by Language,
- then EFI_UNSUPPORTED is returned.
-
- @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL
- or EFI_COMPONENT_NAME_PROTOCOL instance.
- @param Language[in] A pointer to a Null-terminated ASCII string
- array indicating the language. This is the
- language of the driver name that the caller
- is requesting, and it must match one of the
- languages specified in SupportedLanguages.
- The number of languages supported by a
- driver is up to the driver writer. Language
- is specified in RFC 4646 or ISO 639-2
- language code format.
- @param DriverName[out] A pointer to the Unicode string to return.
- This Unicode string is the name of the
- driver specified by This in the language
- specified by Language.
-
- @retval EFI_SUCCESS The Unicode string for the Driver specified
- by This and the language specified by
- Language was returned in DriverName.
- @retval EFI_INVALID_PARAMETER Language is NULL.
- @retval EFI_INVALID_PARAMETER DriverName is NULL.
- @retval EFI_UNSUPPORTED The driver specified by This does not
- support the language specified by Language.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbSerialComponentNameGetDriverName (
- IN EFI_COMPONENT_NAME2_PROTOCOL *This,
- IN CHAR8 *Language,
- OUT CHAR16 **DriverName
- );
-
-/**
- Retrieves a Unicode string that is the user readable name of the controller
- that is being managed by a driver.
-
- This function retrieves the user readable name of the controller specified by
- ControllerHandle and ChildHandle in the form of a Unicode string. If the
- driver specified by This has a user readable name in the language specified by
- Language, then a pointer to the controller name is returned in ControllerName,
- and EFI_SUCCESS is returned. If the driver specified by This is not currently
- managing the controller specified by ControllerHandle and ChildHandle,
- then EFI_UNSUPPORTED is returned. If the driver specified by This does not
- support the language specified by Language, then EFI_UNSUPPORTED is returned.
-
- @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL
- or EFI_COMPONENT_NAME_PROTOCOL instance.
- @param ControllerHandle[in] The handle of a controller that the driver
- specified by This is managing. This handle
- specifies the controller whose name is to
- be returned.
- @param ChildHandle[in] The handle of the child controller to
- retrieve the name of. This is an optional
- parameter that may be NULL. It will be NULL
- for device drivers. It will also be NULL
- for a bus drivers that wish to retrieve the
- name of the bus controller. It will not be
- NULL for a bus driver that wishes to
- retrieve the name of a child controller.
- @param Language[in] A pointer to a Null-terminated ASCII string
- array indicating the language. This is the
- language of the driver name that the caller
- is requesting, and it must match one of the
- languages specified in SupportedLanguages.
- The number of languages supported by a
- driver is up to the driver writer. Language
- is specified in RFC 4646 or ISO 639-2
- language code format.
- @param ControllerName[out] A pointer to the Unicode string to return.
- This Unicode string is the name of the
- controller specified by ControllerHandle
- and ChildHandle in the language specified
- by Language from the point of view of the
- driver specified by This.
-
- @retval EFI_SUCCESS The Unicode string for the user readable
- name in the language specified by Language
- for the driver specified by This was
- returned in DriverName.
- @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE.
- @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a
- valid EFI_HANDLE.
- @retval EFI_INVALID_PARAMETER Language is NULL.
- @retval EFI_INVALID_PARAMETER ControllerName is NULL.
- @retval EFI_UNSUPPORTED The driver specified by This is not
- currently managing the controller specified
- by ControllerHandle and ChildHandle.
- @retval EFI_UNSUPPORTED The driver specified by This does not
- support the language specified by Language.
-
-**/
-EFI_STATUS
-EFIAPI
-UsbSerialComponentNameGetControllerName (
- IN EFI_COMPONENT_NAME2_PROTOCOL *This,
- IN EFI_HANDLE ControllerHandle,
- IN EFI_HANDLE ChildHandle OPTIONAL,
- IN CHAR8 *Language,
- OUT CHAR16 **ControllerName
- );
-
-#endif
diff --git a/OptionRomPkg/Bus/Usb/FtdiUsbSerialDxe/FtdiUsbSerialDxe.inf b/OptionRomPkg/Bus/Usb/FtdiUsbSerialDxe/FtdiUsbSerialDxe.inf
deleted file mode 100644
index 67c1d36..0000000
--- a/OptionRomPkg/Bus/Usb/FtdiUsbSerialDxe/FtdiUsbSerialDxe.inf
+++ /dev/null
@@ -1,55 +0,0 @@
-## @file
-# USB Serial Driver that manages USB Serial device and produces Serial IO
-# Protocol.
-#
-# USB Serial Driver consumes USB I/O Protocol and Device Path Protocol, and
-# produces Serial IO Protocol on USB Serial devices.
-# It manages the USB Serial device via USB Bulk Transfer of USB I/O Protocol.
-# This module refers to following specifications:
-# 1. UEFI Specification, v2.1
-#
-# Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
-#
-# SPDX-License-Identifier: BSD-2-Clause-Patent
-#
-##
-
-[Defines]
- INF_VERSION = 0x00010005
- BASE_NAME = FtdiUsbSerialDxe
- FILE_GUID = A8154B55-2021-4D40-AE81-2E23A02dCC46
- MODULE_TYPE = UEFI_DRIVER
- VERSION_STRING = 1.0
- ENTRY_POINT = FtdiUsbSerialEntryPoint
- UNLOAD_IMAGE = FtdiUsbSerialUnload
-
-#
-# VALID_ARCHITECTURES = IA32 X64 EBC
-#
-
-[Sources]
- FtdiUsbSerialDriver.c
- FtdiUsbSerialDriver.h
- ComponentName.c
-
-[Packages]
- MdePkg/MdePkg.dec
-
-[LibraryClasses]
- UefiDriverEntryPoint
- BaseMemoryLib
- DebugLib
- MemoryAllocationLib
- UefiBootServicesTableLib
- UefiLib
- DevicePathLib
-
-[Guids]
- gEfiUartDevicePathGuid
-
-[Protocols]
- ## TO_START
- ## BY_START
- gEfiDevicePathProtocolGuid
- gEfiUsbIoProtocolGuid ## TO_START
- gEfiSerialIoProtocolGuid ## BY_START
diff --git a/OptionRomPkg/Bus/Usb/FtdiUsbSerialDxe/ReadMe.txt b/OptionRomPkg/Bus/Usb/FtdiUsbSerialDxe/ReadMe.txt
deleted file mode 100644
index d8ca227..0000000
--- a/OptionRomPkg/Bus/Usb/FtdiUsbSerialDxe/ReadMe.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-
-=== FTDI USB SERIAL OVERVIEW ===
-
-This is a bus driver that enables the EfiSerialIoProtocol interface
-for FTDI8U232AM based USB-to-Serial adapters.
-
-=== STATUS ===
-
-Serial Input: Functional on real hardware.
-Serial Output: Functional on real hardware.
-
-Operating Modes: Currently the user is able to change all operating modes
-except timeout and FIFO depth.
-The default operating mode is:
- Baudrate: 115200
- Parity: None
- Flow Control: None
- Data Bits: 8
- Stop Bits: 1
-Notes:
- Data Bits setting of 6,7,8 can not be combined with a Stop Bits setting of 1.5
-
- At baudrates less than 9600 some of the characters may be transmitted incorrectly.
-
-=== COMPATIBILITY ===
-
-Tested with:
-An FTDI8U232AM based USB-To-Serial adapter, the UEFI Shell, and the SerialTest application
-using a PuTTY Terminal
-
-See CompatibleDevices.txt for a list of devices which have been confirmed to work with this
-driver. \ No newline at end of file
diff --git a/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772/Ax88772.c b/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772/Ax88772.c
deleted file mode 100644
index c9329f5..0000000
--- a/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772/Ax88772.c
+++ /dev/null
@@ -1,1318 +0,0 @@
-/** @file
- Implement the interface to the AX88772 Ethernet controller.
-
- This module implements the interface to the ASIX AX88772
- USB to Ethernet MAC with integrated 10/100 PHY. Note that this implementation
- only supports the integrated PHY since no other test cases were available.
-
- Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include "Ax88772.h"
-
-
-/**
- Compute the CRC
-
- @param [in] pMacAddress Address of a six byte buffer to containing the MAC address.
-
- @returns The CRC-32 value associated with this MAC address
-
-**/
-UINT32
-Ax88772Crc (
- IN UINT8 * pMacAddress
- )
-{
- UINT32 BitNumber;
- INT32 Carry;
- INT32 Crc;
- UINT32 Data;
- UINT8 * pEnd;
-
- DBG_ENTER ( );
-
- //
- // Walk the MAC address
- //
- Crc = -1;
- pEnd = &pMacAddress[ PXE_HWADDR_LEN_ETHER ];
- while ( pEnd > pMacAddress ) {
- Data = *pMacAddress++;
-
-
- //
- // CRC32: x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1
- //
- // 1 0000 0100 1100 0001 0001 1101 1011 0111
- //
- for ( BitNumber = 0; 8 > BitNumber; BitNumber++ ) {
- Carry = (( Crc >> 31 ) & 1 ) ^ ( Data & 1 );
- Crc <<= 1;
- if ( 0 != Carry ) {
- Crc ^= 0x04c11db7;
- }
- Data >>= 1;
- }
- }
-
- //
- // Return the CRC value
- //
- DBG_EXIT_HEX ( Crc );
- return (UINT32) Crc;
-}
-
-
-/**
- Get the MAC address
-
- This routine calls ::Ax88772UsbCommand to request the MAC
- address from the network adapter.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
- @param [out] pMacAddress Address of a six byte buffer to receive the MAC address.
-
- @retval EFI_SUCCESS The MAC address is available.
- @retval other The MAC address is not valid.
-
-**/
-EFI_STATUS
-Ax88772MacAddressGet (
- IN NIC_DEVICE * pNicDevice,
- OUT UINT8 * pMacAddress
- )
-{
- USB_DEVICE_REQUEST SetupMsg;
- EFI_STATUS Status;
-
- DBG_ENTER ( );
-
- //
- // Set the register address.
- //
- SetupMsg.RequestType = USB_ENDPOINT_DIR_IN
- | USB_REQ_TYPE_VENDOR
- | USB_TARGET_DEVICE;
- SetupMsg.Request = CMD_MAC_ADDRESS_READ;
- SetupMsg.Value = 0;
- SetupMsg.Index = 0;
- SetupMsg.Length = PXE_HWADDR_LEN_ETHER;
-
- //
- // Read the PHY register
- //
- Status = Ax88772UsbCommand ( pNicDevice,
- &SetupMsg,
- pMacAddress );
-
- //
- // Return the operation status
- //
- DBG_EXIT_STATUS ( Status );
- return Status;
-}
-
-
-/**
- Set the MAC address
-
- This routine calls ::Ax88772UsbCommand to set the MAC address
- in the network adapter.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
- @param [in] pMacAddress Address of a six byte buffer to containing the new MAC address.
-
- @retval EFI_SUCCESS The MAC address was set.
- @retval other The MAC address was not set.
-
-**/
-EFI_STATUS
-Ax88772MacAddressSet (
- IN NIC_DEVICE * pNicDevice,
- IN UINT8 * pMacAddress
- )
-{
- USB_DEVICE_REQUEST SetupMsg;
- EFI_STATUS Status;
-
- DBG_ENTER ( );
-
- //
- // Set the register address.
- //
- SetupMsg.RequestType = USB_REQ_TYPE_VENDOR
- | USB_TARGET_DEVICE;
- SetupMsg.Request = CMD_MAC_ADDRESS_WRITE;
- SetupMsg.Value = 0;
- SetupMsg.Index = 0;
- SetupMsg.Length = PXE_HWADDR_LEN_ETHER;
-
- //
- // Read the PHY register
- //
- Status = Ax88772UsbCommand ( pNicDevice,
- &SetupMsg,
- pMacAddress );
-
- //
- // Return the operation status
- //
- DBG_EXIT_STATUS ( Status );
- return Status;
-}
-
-
-/**
- Clear the multicast hash table
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
-
-**/
-VOID
-Ax88772MulticastClear (
- IN NIC_DEVICE * pNicDevice
- )
-{
- DBG_ENTER ( );
-
- //
- // Clear the multicast hash table
- //
- pNicDevice->MulticastHash[0] = 0;
- pNicDevice->MulticastHash[1] = 0;
-
- DBG_EXIT ( );
-}
-
-
-/**
- Enable a multicast address in the multicast hash table
-
- This routine calls ::Ax88772Crc to compute the hash bit for
- this MAC address.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
- @param [in] pMacAddress Address of a six byte buffer to containing the MAC address.
-
-**/
-VOID
-Ax88772MulticastSet (
- IN NIC_DEVICE * pNicDevice,
- IN UINT8 * pMacAddress
- )
-{
- UINT32 BitNumber;
- UINT32 Crc;
- UINT32 Mask;
-
- DBG_ENTER ( );
-
- //
- // Compute the CRC on the destination address
- //
- Crc = Ax88772Crc ( pMacAddress );
-
- //
- // Set the bit corresponding to the destination address
- //
- BitNumber = Crc >> 26;
- if ( 32 > BitNumber ) {
- Mask = 1 << BitNumber;
- pNicDevice->MulticastHash[0] |= Mask;
- }
- else {
- Mask = 1 << ( BitNumber - 32 );
- pNicDevice->MulticastHash[1] |= Mask;
- }
-
- //
- // Display the multicast address
- //
- DEBUG (( DEBUG_RX_MULTICAST | DEBUG_INFO,
- "Enable multicast: 0x%02x-%02x-%02x-%02x-%02x-%02x, CRC: 0x%08x, Bit number: 0x%02x\r\n",
- pMacAddress[0],
- pMacAddress[1],
- pMacAddress[2],
- pMacAddress[3],
- pMacAddress[4],
- pMacAddress[5],
- Crc,
- BitNumber ));
-
- DBG_EXIT ( );
-}
-
-
-/**
- Start the link negotiation
-
- This routine calls ::Ax88772PhyWrite to start the PHY's link
- negotiation.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
-
- @retval EFI_SUCCESS The link negotiation was started.
- @retval other Failed to start the link negotiation.
-
-**/
-EFI_STATUS
-Ax88772NegotiateLinkStart (
- IN NIC_DEVICE * pNicDevice
- )
-{
- UINT16 Control;
- EFI_STATUS Status;
-
- DBG_ENTER ( );
-
- //
- // Set the supported capabilities.
- //
- Status = Ax88772PhyWrite ( pNicDevice,
- PHY_ANAR,
- AN_CSMA_CD
- | AN_TX_FDX | AN_TX_HDX
- | AN_10_FDX | AN_10_HDX );
- if ( !EFI_ERROR ( Status )) {
- //
- // Set the link speed and duplex
- //
- Control = BMCR_AUTONEGOTIATION_ENABLE
- | BMCR_RESTART_AUTONEGOTIATION;
- if ( pNicDevice->b100Mbps ) {
- Control |= BMCR_100MBPS;
- }
- if ( pNicDevice->bFullDuplex ) {
- Control |= BMCR_FULL_DUPLEX;
- }
- Status = Ax88772PhyWrite ( pNicDevice, PHY_BMCR, Control );
- }
-
- //
- // Return the operation status
- //
- DBG_EXIT_STATUS ( Status );
- return Status;
-}
-
-
-/**
- Complete the negotiation of the PHY link
-
- This routine calls ::Ax88772PhyRead to determine if the
- link negotiation is complete.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
- @param [in, out] pPollCount Address of number of times this routine was polled
- @param [out] pbComplete Address of boolean to receive complate status.
- @param [out] pbLinkUp Address of boolean to receive link status, TRUE=up.
- @param [out] pbHiSpeed Address of boolean to receive link speed, TRUE=100Mbps.
- @param [out] pbFullDuplex Address of boolean to receive link duplex, TRUE=full.
-
- @retval EFI_SUCCESS The MAC address is available.
- @retval other The MAC address is not valid.
-
-**/
-EFI_STATUS
-Ax88772NegotiateLinkComplete (
- IN NIC_DEVICE * pNicDevice,
- IN OUT UINTN * pPollCount,
- OUT BOOLEAN * pbComplete,
- OUT BOOLEAN * pbLinkUp,
- OUT BOOLEAN * pbHiSpeed,
- OUT BOOLEAN * pbFullDuplex
- )
-{
- UINT16 Mask;
- UINT16 PhyData;
- EFI_STATUS Status;
-
- DBG_ENTER ( );
-
- //
- // Determine if the link is up.
- //
- *pbComplete = FALSE;
-
- //
- // Get the link status
- //
- Status = Ax88772PhyRead ( pNicDevice,
- PHY_BMSR,
- &PhyData );
- if ( !EFI_ERROR ( Status )) {
- //
- // Determine if the autonegotiation is complete.
- //
- *pbLinkUp = (BOOLEAN)( 0 != ( PhyData & BMSR_LINKST ));
- *pbComplete = *pbLinkUp;
- if ( 0 != *pbComplete ) {
- //
- // Get the partners capabilities.
- //
- Status = Ax88772PhyRead ( pNicDevice,
- PHY_ANLPAR,
- &PhyData );
- if ( !EFI_ERROR ( Status )) {
- //
- // Autonegotiation is complete
- // Determine the link speed.
- //
- *pbHiSpeed = (BOOLEAN)( 0 != ( PhyData & ( AN_TX_FDX | AN_TX_HDX )));
-
- //
- // Determine the link duplex.
- //
- Mask = ( *pbHiSpeed ) ? AN_TX_FDX : AN_10_FDX;
- *pbFullDuplex = (BOOLEAN)( 0 != ( PhyData & Mask ));
- }
- }
- }
-
- //
- // Return the operation status
- //
- DBG_EXIT_STATUS ( Status );
- return Status;
-}
-
-
-/**
- Read a register from the PHY
-
- This routine calls ::Ax88772UsbCommand to read a PHY register.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
- @param [in] RegisterAddress Number of the register to read.
- @param [in, out] pPhyData Address of a buffer to receive the PHY register value
-
- @retval EFI_SUCCESS The PHY data is available.
- @retval other The PHY data is not valid.
-
-**/
-EFI_STATUS
-Ax88772PhyRead (
- IN NIC_DEVICE * pNicDevice,
- IN UINT8 RegisterAddress,
- IN OUT UINT16 * pPhyData
- )
-{
- USB_DEVICE_REQUEST SetupMsg;
- EFI_STATUS Status;
-
- DBG_ENTER ( );
-
- //
- // Request access to the PHY
- //
- SetupMsg.RequestType = USB_REQ_TYPE_VENDOR
- | USB_TARGET_DEVICE;
- SetupMsg.Request = CMD_PHY_ACCESS_SOFTWARE;
- SetupMsg.Value = 0;
- SetupMsg.Index = 0;
- SetupMsg.Length = 0;
- Status = Ax88772UsbCommand ( pNicDevice,
- &SetupMsg,
- NULL );
- if ( !EFI_ERROR ( Status )) {
- //
- // Read the PHY register address.
- //
- SetupMsg.RequestType = USB_ENDPOINT_DIR_IN
- | USB_REQ_TYPE_VENDOR
- | USB_TARGET_DEVICE;
- SetupMsg.Request = CMD_PHY_REG_READ;
- SetupMsg.Value = pNicDevice->PhyId;
- SetupMsg.Index = RegisterAddress;
- SetupMsg.Length = sizeof ( *pPhyData );
- Status = Ax88772UsbCommand ( pNicDevice,
- &SetupMsg,
- pPhyData );
- if ( !EFI_ERROR ( Status )) {
- DEBUG (( DEBUG_PHY | DEBUG_INFO,
- "PHY %d: 0x%02x --> 0x%04x\r\n",
- pNicDevice->PhyId,
- RegisterAddress,
- *pPhyData ));
-
- //
- // Release the PHY to the hardware
- //
- SetupMsg.RequestType = USB_REQ_TYPE_VENDOR
- | USB_TARGET_DEVICE;
- SetupMsg.Request = CMD_PHY_ACCESS_HARDWARE;
- SetupMsg.Value = 0;
- SetupMsg.Index = 0;
- SetupMsg.Length = 0;
- Status = Ax88772UsbCommand ( pNicDevice,
- &SetupMsg,
- NULL );
- }
- }
-
- //
- // Return the operation status.
- //
- DBG_EXIT_STATUS ( Status );
- return Status;
-}
-
-
-/**
- Write to a PHY register
-
- This routine calls ::Ax88772UsbCommand to write a PHY register.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
- @param [in] RegisterAddress Number of the register to read.
- @param [in] PhyData Address of a buffer to receive the PHY register value
-
- @retval EFI_SUCCESS The PHY data was written.
- @retval other Failed to wwrite the PHY register.
-
-**/
-EFI_STATUS
-Ax88772PhyWrite (
- IN NIC_DEVICE * pNicDevice,
- IN UINT8 RegisterAddress,
- IN UINT16 PhyData
- )
-{
- USB_DEVICE_REQUEST SetupMsg;
- EFI_STATUS Status;
-
- DBG_ENTER ( );
-
- //
- // Request access to the PHY
- //
- SetupMsg.RequestType = USB_REQ_TYPE_VENDOR
- | USB_TARGET_DEVICE;
- SetupMsg.Request = CMD_PHY_ACCESS_SOFTWARE;
- SetupMsg.Value = 0;
- SetupMsg.Index = 0;
- SetupMsg.Length = 0;
- Status = Ax88772UsbCommand ( pNicDevice,
- &SetupMsg,
- NULL );
- if ( !EFI_ERROR ( Status )) {
- //
- // Write the PHY register
- //
- SetupMsg.RequestType = USB_REQ_TYPE_VENDOR
- | USB_TARGET_DEVICE;
- SetupMsg.Request = CMD_PHY_REG_WRITE;
- SetupMsg.Value = pNicDevice->PhyId;
- SetupMsg.Index = RegisterAddress;
- SetupMsg.Length = sizeof ( PhyData );
- Status = Ax88772UsbCommand ( pNicDevice,
- &SetupMsg,
- &PhyData );
- if ( !EFI_ERROR ( Status )) {
- DEBUG (( DEBUG_PHY | DEBUG_INFO,
- "PHY %d: 0x%02x <-- 0x%04x\r\n",
- pNicDevice->PhyId,
- RegisterAddress,
- PhyData ));
-
- //
- // Release the PHY to the hardware
- //
- SetupMsg.RequestType = USB_REQ_TYPE_VENDOR
- | USB_TARGET_DEVICE;
- SetupMsg.Request = CMD_PHY_ACCESS_HARDWARE;
- SetupMsg.Value = 0;
- SetupMsg.Index = 0;
- SetupMsg.Length = 0;
- Status = Ax88772UsbCommand ( pNicDevice,
- &SetupMsg,
- NULL );
- }
- }
-
- //
- // Return the operation status.
- //
- DBG_EXIT_STATUS ( Status );
- return Status;
-}
-
-
-/**
- Reset the AX88772
-
- This routine uses ::Ax88772UsbCommand to reset the network
- adapter. This routine also uses ::Ax88772PhyWrite to reset
- the PHY.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
-
- @retval EFI_SUCCESS The MAC address is available.
- @retval other The MAC address is not valid.
-
-**/
-EFI_STATUS
-Ax88772Reset (
- IN NIC_DEVICE * pNicDevice
- )
-{
- USB_DEVICE_REQUEST SetupMsg;
- EFI_STATUS Status;
-
- DBG_ENTER ( );
-
- //
- // Turn off the MAC
- //
- SetupMsg.RequestType = USB_REQ_TYPE_VENDOR
- | USB_TARGET_DEVICE;
- SetupMsg.Request = CMD_RX_CONTROL_WRITE;
- SetupMsg.Value = 0;
- SetupMsg.Index = 0;
- SetupMsg.Length = 0;
- Status = Ax88772UsbCommand ( pNicDevice,
- &SetupMsg,
- NULL );
- if ( !EFI_ERROR ( Status )) {
- DEBUG (( DEBUG_PHY | DEBUG_RX_BROADCAST | DEBUG_RX_MULTICAST
- | DEBUG_RX_UNICAST | DEBUG_TX | DEBUG_INFO,
- "MAC reset\r\n" ));
-
- //
- // The link is now idle
- //
- pNicDevice->bLinkIdle = TRUE;
-
- //
- // Delay for a bit
- //
- gBS->Stall ( RESET_MSEC );
-
- //
- // Select the internal PHY
- //
- SetupMsg.RequestType = USB_REQ_TYPE_VENDOR
- | USB_TARGET_DEVICE;
- SetupMsg.Request = CMD_PHY_SELECT;
- SetupMsg.Value = SPHY_PSEL;
- SetupMsg.Index = 0;
- SetupMsg.Length = 0;
- Status = Ax88772UsbCommand ( pNicDevice,
- &SetupMsg,
- NULL );
- if ( !EFI_ERROR ( Status )) {
- //
- // Delay for a bit
- //
- gBS->Stall ( PHY_RESET_MSEC );
-
- //
- // Clear the internal PHY reset
- //
- SetupMsg.Request = CMD_RESET;
- SetupMsg.Value = SRR_IPRL | SRR_PRL;
- Status = Ax88772UsbCommand ( pNicDevice,
- &SetupMsg,
- NULL );
- if ( !EFI_ERROR ( Status )) {
- //
- // Reset the PHY
- //
- Status = Ax88772PhyWrite ( pNicDevice,
- PHY_BMCR,
- BMCR_RESET );
- if ( !EFI_ERROR ( Status )) {
- //
- // Set the gaps
- //
- SetupMsg.RequestType = USB_REQ_TYPE_VENDOR
- | USB_TARGET_DEVICE;
- SetupMsg.Request = CMD_GAPS_WRITE;
- SetupMsg.Value = 0x0c15;
- SetupMsg.Index = 0x0e;
- SetupMsg.Length = 0;
- Status = Ax88772UsbCommand ( pNicDevice,
- &SetupMsg,
- NULL );
- }
- }
- }
- }
-
- //
- // Return the operation status.
- //
- DBG_EXIT_STATUS ( Status );
- return Status;
-}
-
-
-VOID
-FillPkt2Queue (
- IN NIC_DEVICE * pNicDevice,
- IN UINTN BufLength)
-{
-
- UINT16 * pLength;
- UINT16 * pLengthBar;
- UINT8* pData;
- UINT32 offset;
- RX_TX_PACKET * pRxPacket;
- 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;
- 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.
-
- This routine polls the USB receive interface for a packet. If a packet
- is available, this routine adds the receive packet to the list of
- pending receive packets.
-
- This routine calls ::Ax88772NegotiateLinkComplete to verify
- that the link is up. This routine also calls ::SN_Reset to
- reset the network adapter when necessary. Finally this
- routine attempts to receive one or more packets from the
- network adapter.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
- @param [in] bUpdateLink TRUE = Update link status
-
-**/
-VOID
-Ax88772Rx (
- IN NIC_DEVICE * pNicDevice,
- IN BOOLEAN bUpdateLink
- )
-{
- BOOLEAN bFullDuplex;
- BOOLEAN bLinkUp;
- BOOLEAN bRxPacket;
- BOOLEAN bSpeed100;
- UINTN LengthInBytes;
- RX_TX_PACKET Packet;
- RX_TX_PACKET * pRxPacket;
- EFI_USB_IO_PROTOCOL *pUsbIo;
- EFI_STATUS Status;
- EFI_TPL TplPrevious;
- UINT32 TransferStatus;
-
- //
- // Synchronize with Ax88772Timer
- //
- VERIFY_TPL ( TPL_AX88772 );
- TplPrevious = gBS->RaiseTPL ( TPL_AX88772 );
- DEBUG (( DEBUG_TPL | DEBUG_INFO,
- "%d: TPL\r\n",
- TPL_AX88772 ));
-
- //
- // Get the link status
- //
- if ( bUpdateLink ) {
- bLinkUp = pNicDevice->bLinkUp;
- bSpeed100 = pNicDevice->b100Mbps;
- bFullDuplex = pNicDevice->bFullDuplex;
- Status = Ax88772NegotiateLinkComplete ( pNicDevice,
- &pNicDevice->PollCount,
- &pNicDevice->bComplete,
- &pNicDevice->bLinkUp,
- &pNicDevice->b100Mbps,
- &pNicDevice->bFullDuplex );
-
- //
- // Determine if the autonegotiation is complete
- //
- if ( pNicDevice->bComplete ) {
- if ( pNicDevice->bLinkUp ) {
- if (( bSpeed100 && ( !pNicDevice->b100Mbps ))
- || (( !bSpeed100 ) && pNicDevice->b100Mbps )
- || ( bFullDuplex && ( !pNicDevice->bFullDuplex ))
- || (( !bFullDuplex ) && pNicDevice->bFullDuplex )) {
- pNicDevice->PollCount = 0;
- DEBUG (( DEBUG_LINK | DEBUG_INFO,
- "Reset to establish proper link setup: %d Mbps, %s duplex\r\n",
- pNicDevice->b100Mbps ? 100 : 10,
- pNicDevice->bFullDuplex ? L"Full" : L"Half" ));
- Status = SN_Reset ( &pNicDevice->SimpleNetwork, FALSE );
- }
- if (( !bLinkUp ) && pNicDevice->bLinkUp ) {
- //
- // Display the autonegotiation status
- //
- DEBUG (( DEBUG_LINK | DEBUG_INFO,
- "Link: Up, %d Mbps, %s duplex\r\n",
- pNicDevice->b100Mbps ? 100 : 10,
- pNicDevice->bFullDuplex ? L"Full" : L"Half" ));
- }
- }
- }
-
- //
- // Update the link status
- //
- if ( bLinkUp && ( !pNicDevice->bLinkUp )) {
- DEBUG (( DEBUG_LINK | DEBUG_INFO, "Link: Down\r\n" ));
- }
- }
-
- //
- // Loop until all the packets are emptied from the receiver
- //
- do {
- bRxPacket = FALSE;
-
- //
- // Locate a packet for use
- //
- pRxPacket = pNicDevice->pRxFree;
- LengthInBytes = MAX_BULKIN_SIZE;
- if ( NULL == pRxPacket ) {
- Status = gBS->AllocatePool ( EfiRuntimeServicesData,
- sizeof ( *pRxPacket ),
- (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;
- }
- }
-
- //
- // 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,
- &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 ))
- && ( LengthInBytes > 0)) {
-
- //
- // Determine if the packet should be received
- //
- bRxPacket = TRUE;
- LengthInBytes = pRxPacket->Length;
- pNicDevice->bLinkIdle = FALSE;
- if ( pNicDevice->pRxFree == pRxPacket ) {
- //
- // Display the received packet
- //
- if ( 0 != ( pRxPacket->Data[0] & 1 )) {
- if (( 0xff == pRxPacket->Data[0])
- && ( 0xff == pRxPacket->Data[1])
- && ( 0xff == pRxPacket->Data[2])
- && ( 0xff == pRxPacket->Data[3])
- && ( 0xff == pRxPacket->Data[4])
- && ( 0xff == pRxPacket->Data[5])) {
- DEBUG (( DEBUG_RX_BROADCAST | DEBUG_INFO,
- "RX: %02x-%02x-%02x-%02x-%02x-%02x %02x-%02x-%02x-%02x-%02x-%02x %02x-%02x %d bytes\r\n",
- pRxPacket->Data[0],
- pRxPacket->Data[1],
- pRxPacket->Data[2],
- pRxPacket->Data[3],
- pRxPacket->Data[4],
- pRxPacket->Data[5],
- pRxPacket->Data[6],
- pRxPacket->Data[7],
- pRxPacket->Data[8],
- pRxPacket->Data[9],
- pRxPacket->Data[10],
- pRxPacket->Data[11],
- pRxPacket->Data[12],
- pRxPacket->Data[13],
- LengthInBytes ));
- }
- else {
- DEBUG (( DEBUG_RX_MULTICAST | DEBUG_INFO,
- "RX: %02x-%02x-%02x-%02x-%02x-%02x %02x-%02x-%02x-%02x-%02x-%02x %02x-%02x %d bytes\r\n",
- pRxPacket->Data[0],
- pRxPacket->Data[1],
- pRxPacket->Data[2],
- pRxPacket->Data[3],
- pRxPacket->Data[4],
- pRxPacket->Data[5],
- pRxPacket->Data[6],
- pRxPacket->Data[7],
- pRxPacket->Data[8],
- pRxPacket->Data[9],
- pRxPacket->Data[10],
- pRxPacket->Data[11],
- pRxPacket->Data[12],
- pRxPacket->Data[13],
- LengthInBytes ));
- }
- }
- else {
- DEBUG (( DEBUG_RX_UNICAST | DEBUG_INFO,
- "RX: %02x-%02x-%02x-%02x-%02x-%02x %02x-%02x-%02x-%02x-%02x-%02x %02x-%02x %d bytes\r\n",
- pRxPacket->Data[0],
- pRxPacket->Data[1],
- pRxPacket->Data[2],
- pRxPacket->Data[3],
- pRxPacket->Data[4],
- pRxPacket->Data[5],
- pRxPacket->Data[6],
- pRxPacket->Data[7],
- pRxPacket->Data[8],
- pRxPacket->Data[9],
- pRxPacket->Data[10],
- pRxPacket->Data[11],
- pRxPacket->Data[12],
- pRxPacket->Data[13],
- LengthInBytes ));
- }
-
- }
- else {
- //
- // Error, not enough buffers for this packet, discard packet
- //
- DEBUG (( DEBUG_WARN | DEBUG_INFO,
- "WARNING - No buffer, discarding RX packet: %02x-%02x-%02x-%02x-%02x-%02x %02x-%02x-%02x-%02x-%02x-%02x %02x-%02x %d bytes\r\n",
- pRxPacket->Data[0],
- pRxPacket->Data[1],
- pRxPacket->Data[2],
- pRxPacket->Data[3],
- pRxPacket->Data[4],
- pRxPacket->Data[5],
- pRxPacket->Data[6],
- pRxPacket->Data[7],
- pRxPacket->Data[8],
- pRxPacket->Data[9],
- pRxPacket->Data[10],
- pRxPacket->Data[11],
- pRxPacket->Data[12],
- pRxPacket->Data[13],
- LengthInBytes ));
- }
- }
- }while ( bRxPacket );
-
- //
- // Release the synchronization withhe Ax88772Timer
- //
- gBS->RestoreTPL ( TplPrevious );
- DEBUG (( DEBUG_TPL | DEBUG_INFO,
- "%d: TPL\r\n",
- TplPrevious ));
-}
-
-
-/**
- Enable or disable the receiver
-
- This routine calls ::Ax88772UsbCommand to update the
- receiver state. This routine also calls ::Ax88772MacAddressSet
- to establish the MAC address for the network adapter.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
- @param [in] RxFilter Simple network RX filter mask value
-
- @retval EFI_SUCCESS The MAC address was set.
- @retval other The MAC address was not set.
-
-**/
-EFI_STATUS
-Ax88772RxControl (
- IN NIC_DEVICE * pNicDevice,
- IN UINT32 RxFilter
- )
-{
- UINT16 MediumStatus;
- INT32 MulticastHash[2];
- UINT16 RxControl;
- USB_DEVICE_REQUEST SetupMsg;
- EFI_STATUS Status;
-
- DBG_ENTER ( );
-
- //
- // Disable all multicast
- //
- MulticastHash[0] = 0;
- MulticastHash[1] = 0;
-
- //
- // Enable the receiver if something is to be received
- //
- Status = EFI_SUCCESS;
- RxControl = RXC_SO | RXC_MFB_16384;
- if ( 0 != RxFilter ) {
- //
- // Enable the receiver
- //
- SetupMsg.RequestType = USB_ENDPOINT_DIR_IN
- | USB_REQ_TYPE_VENDOR
- | USB_TARGET_DEVICE;
- SetupMsg.Request = CMD_MEDIUM_STATUS_READ;
- SetupMsg.Value = 0;
- SetupMsg.Index = 0;
- SetupMsg.Length = sizeof ( MediumStatus );
- Status = Ax88772UsbCommand ( pNicDevice,
- &SetupMsg,
- &MediumStatus );
- if ( !EFI_ERROR ( Status )) {
- if ( 0 == ( MediumStatus & MS_RE )) {
- MediumStatus |= MS_RE | MS_ONE;
- if ( pNicDevice->bFullDuplex ) {
- MediumStatus |= MS_TFC | MS_RFC;
- }
- SetupMsg.RequestType = USB_REQ_TYPE_VENDOR
- | USB_TARGET_DEVICE;
- SetupMsg.Request = CMD_MEDIUM_STATUS_WRITE;
- SetupMsg.Value = MediumStatus;
- SetupMsg.Index = 0;
- SetupMsg.Length = 0;
- Status = Ax88772UsbCommand ( pNicDevice,
- &SetupMsg,
- NULL );
- if ( EFI_ERROR ( Status )) {
- DEBUG (( DEBUG_ERROR | DEBUG_INFO,
- "ERROR - Failed to enable receiver, Status: %r\r\n",
- Status ));
- }
- }
- }
- else {
- DEBUG (( DEBUG_ERROR | DEBUG_INFO,
- "ERROR - Failed to read receiver status, Status: %r\r\n",
- Status ));
- }
-
- //
- // Enable multicast if requested
- //
- if ( 0 != ( RxFilter & EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST )) {
- RxControl |= RXC_AM;
- MulticastHash[0] = pNicDevice->MulticastHash[0];
- MulticastHash[1] = pNicDevice->MulticastHash[1];
- }
-
- //
- // Enable all multicast if requested
- //
- if ( 0 != ( RxFilter & EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS_MULTICAST )) {
- RxControl |= RXC_AMALL;
- MulticastHash[0] = -1;
- MulticastHash[1] = -1;
- }
-
- //
- // Enable broadcast if requested
- //
- if ( 0 != ( RxFilter & EFI_SIMPLE_NETWORK_RECEIVE_BROADCAST )) {
- RxControl |= RXC_AB;
- }
-
- //
- // Enable promiscuous mode if requested
- //
- if ( 0 != ( RxFilter & EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS )) {
- RxControl |= RXC_PRO;
- MulticastHash[0] = -1;
- MulticastHash[1] = -1;
- }
- }
-
- //
- // Update the MAC address
- //
- if ( !EFI_ERROR ( Status )) {
- Status = Ax88772MacAddressSet ( pNicDevice, &pNicDevice->SimpleNetworkData.CurrentAddress.Addr[0]);
- }
-
- //
- // Update the receiver control
- //
- if ( !EFI_ERROR ( Status )) {
- SetupMsg.RequestType = USB_REQ_TYPE_VENDOR
- | USB_TARGET_DEVICE;
- SetupMsg.Request = CMD_RX_CONTROL_WRITE;
- SetupMsg.Value = RxControl;
- SetupMsg.Index = 0;
- SetupMsg.Length = 0;
- Status = Ax88772UsbCommand ( pNicDevice,
- &SetupMsg,
- NULL );
- if ( !EFI_ERROR ( Status )) {
- DEBUG (( DEBUG_RX_BROADCAST | DEBUG_RX_MULTICAST | DEBUG_RX_UNICAST | DEBUG_INFO,
- "RxControl: 0x%04x\r\n",
- RxControl ));
-
- //
- // Update the multicast hash table
- //
- SetupMsg.RequestType = USB_REQ_TYPE_VENDOR
- | USB_TARGET_DEVICE;
- SetupMsg.Request = CMD_MULTICAST_HASH_WRITE;
- SetupMsg.Value = 0;
- SetupMsg.Index = 0;
- SetupMsg.Length = sizeof ( pNicDevice ->MulticastHash );
- Status = Ax88772UsbCommand ( pNicDevice,
- &SetupMsg,
- &pNicDevice->MulticastHash );
- if ( !EFI_ERROR ( Status )) {
- DEBUG (( DEBUG_RX_MULTICAST | DEBUG_INFO,
- "Multicast Hash: 0x%02x %02x %02x %02x %02x %02x %02x %02x\r\n",
- (UINT8) MulticastHash[0],
- (UINT8)( MulticastHash[0] >> 8 ),
- (UINT8)( MulticastHash[0] >> 16 ),
- (UINT8)( MulticastHash[0] >> 24 ),
- (UINT8) MulticastHash[1],
- (UINT8)( MulticastHash[1] >> 8 ),
- (UINT8)( MulticastHash[1] >> 16 ),
- (UINT8)( MulticastHash[1] >> 24 )));
- }
- else {
- DEBUG (( DEBUG_ERROR | DEBUG_INFO,
- "ERROR - Failed to update multicast hash table, Status: %r\r\n",
- Status ));
- }
- }
- else {
- DEBUG (( DEBUG_ERROR | DEBUG_INFO,
- "ERROR - Failed to set receiver control, Status: %r\r\n",
- Status ));
- }
- }
-
- //
- // Return the operation status
- //
- DBG_EXIT_STATUS ( Status );
- return Status;
-}
-
-
-/**
- Read an SROM location
-
- This routine calls ::Ax88772UsbCommand to read data from the
- SROM.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
- @param [in] Address SROM address
- @param [out] pData Buffer to receive the data
-
- @retval EFI_SUCCESS The read was successful
- @retval other The read failed
-
-**/
-EFI_STATUS
-Ax88772SromRead (
- IN NIC_DEVICE * pNicDevice,
- IN UINT32 Address,
- OUT UINT16 * pData
- )
-{
- USB_DEVICE_REQUEST SetupMsg;
- EFI_STATUS Status;
-
- DBG_ENTER ( );
-
- //
- // Read a value from the SROM
- //
- SetupMsg.RequestType = USB_ENDPOINT_DIR_IN
- | USB_REQ_TYPE_VENDOR
- | USB_TARGET_DEVICE;
- SetupMsg.Request = CMD_SROM_READ;
- SetupMsg.Value = (UINT16) Address;
- SetupMsg.Index = 0;
- SetupMsg.Length = sizeof ( *pData );
- Status = Ax88772UsbCommand ( pNicDevice,
- &SetupMsg,
- pData );
-
- //
- // Return the operation status
- //
- DBG_EXIT_STATUS ( Status );
- return Status;
-}
-
-
-/**
- This routine is called at a regular interval to poll for
- receive packets.
-
- This routine polls the link state and gets any receive packets
- by calling ::Ax88772Rx.
-
- @param [in] Event Timer event
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
-
-**/
-VOID
-Ax88772Timer (
- IN EFI_EVENT Event,
- IN NIC_DEVICE * pNicDevice
- )
-{
- //
- // Use explicit DEBUG messages since the output frequency is too
- // high for DEBUG_INFO to keep up and have spare cycles for the
- // shell
- //
- DEBUG (( DEBUG_TIMER, "Entering Ax88772Timer\r\n" ));
-
- //
- // Poll the link state and get any receive packets
- //
- Ax88772Rx ( pNicDevice, FALSE );
-
- DEBUG (( DEBUG_TIMER, "Exiting Ax88772Timer\r\n" ));
-}
-
-
-/**
- Send a command to the USB device.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
- @param [in] pRequest Pointer to the request structure
- @param [in, out] pBuffer Data buffer address
-
- @retval EFI_SUCCESS The USB transfer was successful
- @retval other The USB transfer failed
-
-**/
-EFI_STATUS
-Ax88772UsbCommand (
- IN NIC_DEVICE * pNicDevice,
- IN USB_DEVICE_REQUEST * pRequest,
- IN OUT VOID * pBuffer
- )
-{
- UINT32 CmdStatus;
- EFI_USB_DATA_DIRECTION Direction;
- EFI_USB_IO_PROTOCOL * pUsbIo;
- EFI_STATUS Status;
-
- DBG_ENTER ( );
-
- //
- // Determine the transfer direction
- //
- Direction = EfiUsbNoData;
- if ( 0 != pRequest->Length ) {
- Direction = ( 0 != ( pRequest->RequestType & USB_ENDPOINT_DIR_IN ))
- ? EfiUsbDataIn : EfiUsbDataOut;
- }
-
- //
- // Issue the command
- //
- pUsbIo = pNicDevice->pUsbIo;
- Status = pUsbIo->UsbControlTransfer ( pUsbIo,
- pRequest,
- Direction,
- USB_BUS_TIMEOUT,
- pBuffer,
- pRequest->Length,
- &CmdStatus );
-
- //
- // Determine the operation status
- //
- if ( !EFI_ERROR ( Status )) {
- Status = CmdStatus;
- }
- else {
- //
- // Display any errors
- //
- DEBUG (( DEBUG_INFO,
- "Ax88772UsbCommand - Status: %r\n",
- Status ));
-
- //
- // Only use status values associated with the Simple Network protocol
- //
- if ( EFI_TIMEOUT == Status ) {
- Status = EFI_DEVICE_ERROR;
- }
- }
-
- //
- // Return the operation status
- //
- DBG_EXIT_STATUS ( Status );
- return Status;
-}
diff --git a/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772/Ax88772.h b/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772/Ax88772.h
deleted file mode 100644
index 8840a4f..0000000
--- a/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772/Ax88772.h
+++ /dev/null
@@ -1,969 +0,0 @@
-/** @file
- Definitions for ASIX AX88772 Ethernet adapter.
-
- Copyright (c) 2011 - 2015, Intel Corporation. All rights reserved.<BR>
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#ifndef _AX88772_H_
-#define _AX88772_H_
-
-#include <Uefi.h>
-
-#include <Guid/EventGroup.h>
-
-#include <IndustryStandard/Pci.h>
-
-#include <Library/BaseMemoryLib.h>
-#include <Library/DebugLib.h>
-#include <Library/DevicePathLib.h>
-#include <Library/UefiBootServicesTableLib.h>
-#include <Library/UefiDriverEntryPoint.h>
-#include <Library/UefiLib.h>
-#include <Library/UefiRuntimeLib.h>
-
-#include <Protocol/DevicePath.h>
-#include <Protocol/LoadedImage.h>
-#include <Protocol/NetworkInterfaceIdentifier.h>
-#include <Protocol/SimpleNetwork.h>
-#include <Protocol/UsbIo.h>
-
-//------------------------------------------------------------------------------
-// Macros
-//------------------------------------------------------------------------------
-//
-//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
-
-#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_BULK_ENDPOINT(Attribute) (((Attribute) & (BIT0 | BIT1)) == USB_ENDPOINT_BULK) ///< Return TRUE/FALSE for BULK type
-#define USB_IS_INTERRUPT_ENDPOINT(Attribute) (((Attribute) & (BIT0 | BIT1)) == USB_ENDPOINT_INTERRUPT) ///< Return TRUE/FALSE for INTERRUPT type
-
-//------------------------------------------------------------------------------
-// Constants
-//------------------------------------------------------------------------------
-
-#define DEBUG_RX_BROADCAST 0x40000000 ///< Display RX broadcast messages
-#define DEBUG_RX_MULTICAST 0x20000000 ///< Display RX multicast messages
-#define DEBUG_RX_UNICAST 0x10000000 ///< Display RX unicast messages
-#define DEBUG_MAC_ADDRESS 0x08000000 ///< Display the MAC address
-#define DEBUG_LINK 0x04000000 ///< Display the link status
-#define DEBUG_TX 0x02000000 ///< Display the TX messages
-#define DEBUG_PHY 0x01000000 ///< Display the PHY register values
-#define DEBUG_SROM 0x00800000 ///< Display the SROM contents
-#define DEBUG_TIMER 0x00400000 ///< Display the timer routine entry/exit
-#define DEBUG_TPL 0x00200000 ///< Display the timer routine entry/exit
-
-#define AX88772_MAX_PKT_SIZE ( 2048 - 4 ) ///< Maximum packet size
-#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
-
-#define TIMER_MSEC 20 ///< Polling interval for the NIC
-#define TPL_AX88772 TPL_CALLBACK ///< TPL for routine synchronization
-
-/**
- Verify new TPL value
-
- This macro which is enabled when debug is enabled verifies that
- the new TPL value is >= the current TPL value.
-**/
-#ifdef VERIFY_TPL
-#undef VERIFY_TPL
-#endif // VERIFY_TPL
-
-#if !defined(MDEPKG_NDEBUG)
-
-#define VERIFY_TPL(tpl) \
-{ \
- EFI_TPL PreviousTpl; \
- \
- PreviousTpl = gBS->RaiseTPL ( TPL_HIGH_LEVEL ); \
- gBS->RestoreTPL ( PreviousTpl ); \
- if ( PreviousTpl > tpl ) { \
- DEBUG (( DEBUG_ERROR, "Current TPL: %d, New TPL: %d\r\n", PreviousTpl, tpl )); \
- ASSERT ( PreviousTpl <= tpl ); \
- } \
-}
-
-#else // MDEPKG_NDEBUG
-
-#define VERIFY_TPL(tpl)
-
-#endif // MDEPKG_NDEBUG
-
-//------------------------------------------------------------------------------
-// Hardware Definition
-//------------------------------------------------------------------------------
-
-#define DEV_SIGNATURE SIGNATURE_32 ('A','X','8','8') ///< Signature of data structures in memory
-
-#define VENDOR_ID 0x0b95 ///< Vendor ID for Asix
-#define PRODUCT_ID 0x7720 ///< Product ID for the AX88772 USB 10/100 Ethernet controller
-
-#define RESET_MSEC 1000 ///< Reset duration
-#define PHY_RESET_MSEC 500 ///< PHY reset duration
-
-//
-// RX Control register
-//
-
-#define RXC_PRO 0x0001 ///< Receive all packets
-#define RXC_AMALL 0x0002 ///< Receive all multicast packets
-#define RXC_SEP 0x0004 ///< Save error packets
-#define RXC_AB 0x0008 ///< Receive broadcast packets
-#define RXC_AM 0x0010 ///< Use multicast destination address hash table
-#define RXC_AP 0x0020 ///< Accept physical address from Multicast Filter
-#define RXC_SO 0x0080 ///< Start operation
-#define RXC_MFB 0x0300 ///< Maximum frame burst
-#define RXC_MFB_2048 0 ///< Maximum frame size: 2048 bytes
-#define RXC_MFB_4096 0x0100 ///< Maximum frame size: 4096 bytes
-#define RXC_MFB_8192 0x0200 ///< Maximum frame size: 8192 bytes
-#define RXC_MFB_16384 0x0300 ///< Maximum frame size: 16384 bytes
-
-//
-// Medium Status register
-//
-
-#define MS_FD 0x0002 ///< Full duplex
-#define MS_ONE 0x0004 ///< Must be one
-#define MS_RFC 0x0010 ///< RX flow control enable
-#define MS_TFC 0x0020 ///< TX flow control enable
-#define MS_PF 0x0080 ///< Pause frame enable
-#define MS_RE 0x0100 ///< Receive enable
-#define MS_PS 0x0200 ///< Port speed 1=100, 0=10 Mbps
-#define MS_SBP 0x0800 ///< Stop back pressure
-#define MS_SM 0x1000 ///< Super MAC support
-
-//
-// Software PHY Select register
-//
-
-#define SPHY_PSEL 0x01 ///< Select internal PHY
-#define SPHY_ASEL 0x02 ///< 1=Auto select, 0=Manual select
-
-//
-// Software Reset register
-//
-
-#define SRR_RR 0x01 ///< Clear receive frame length error
-#define SRR_RT 0x02 ///< Clear transmit frame length error
-#define SRR_PRTE 0x04 ///< External PHY reset pin tri-state enable
-#define SRR_PRL 0x08 ///< External PHY reset pin level
-#define SRR_BZ 0x10 ///< Force Bulk to return zero length packet
-#define SRR_IPRL 0x20 ///< Internal PHY reset control
-#define SRR_IPPD 0x40 ///< Internal PHY power down
-
-//
-// PHY ID values
-//
-
-#define PHY_ID_INTERNAL 0x0010 ///< Internal PHY
-
-//
-// USB Commands
-//
-
-#define CMD_PHY_ACCESS_SOFTWARE 0x06 ///< Software in control of PHY
-#define CMD_PHY_REG_READ 0x07 ///< Read PHY register, Value: PHY, Index: Register, Data: Register value
-#define CMD_PHY_REG_WRITE 0x08 ///< Write PHY register, Value: PHY, Index: Register, Data: New 16-bit value
-#define CMD_PHY_ACCESS_HARDWARE 0x0a ///< Hardware in control of PHY
-#define CMD_SROM_READ 0x0b ///< Read SROM register: Value: Address, Data: Value
-#define CMD_RX_CONTROL_WRITE 0x10 ///< Set the RX control register, Value: New value
-#define CMD_GAPS_WRITE 0x12 ///< Write the gaps register, Value: New value
-#define CMD_MAC_ADDRESS_READ 0x13 ///< Read the MAC address, Data: 6 byte MAC address
-#define CMD_MAC_ADDRESS_WRITE 0x14 ///< Set the MAC address, Data: New 6 byte MAC address
-#define CMD_MULTICAST_HASH_WRITE 0x16 ///< Write the multicast hash table, Data: New 8 byte value
-#define CMD_MEDIUM_STATUS_READ 0x1a ///< Read medium status register, Data: Register value
-#define CMD_MEDIUM_STATUS_WRITE 0x1b ///< Write medium status register, Value: New value
-#define CMD_RESET 0x20 ///< Reset register, Value: New value
-#define CMD_PHY_SELECT 0x22 ///< PHY select register, Value: New value
-
-//------------------------------
-// USB Endpoints
-//------------------------------
-
-#define CONTROL_ENDPOINT 0 ///< Control endpoint
-#define INTERRUPT_ENDPOINT 1 ///< Interrupt endpoint
-#define BULK_IN_ENDPOINT 2 ///< Receive endpoint
-#define BULK_OUT_ENDPOINT 3 ///< Transmit endpoint
-
-//------------------------------
-// PHY Registers
-//------------------------------
-
-#define PHY_BMCR 0 ///< Control register
-#define PHY_BMSR 1 ///< Status register
-#define PHY_ANAR 4 ///< Autonegotiation advertisement register
-#define PHY_ANLPAR 5 ///< Autonegotiation link parter ability register
-#define PHY_ANER 6 ///< Autonegotiation expansion register
-
-// BMCR - Register 0
-
-#define BMCR_RESET 0x8000 ///< 1 = Reset the PHY, bit clears after reset
-#define BMCR_LOOPBACK 0x4000 ///< 1 = Loopback enabled
-#define BMCR_100MBPS 0x2000 ///< 100 Mbits/Sec
-#define BMCR_10MBPS 0 ///< 10 Mbits/Sec
-#define BMCR_AUTONEGOTIATION_ENABLE 0x1000 ///< 1 = Enable autonegotiation
-#define BMCR_POWER_DOWN 0x0800 ///< 1 = Power down
-#define BMCR_ISOLATE 0x0400 ///< 0 = Isolate PHY
-#define BMCR_RESTART_AUTONEGOTIATION 0x0200 ///< 1 = Restart autonegotiation
-#define BMCR_FULL_DUPLEX 0x0100 ///< Full duplex operation
-#define BMCR_HALF_DUPLEX 0 ///< Half duplex operation
-#define BMCR_COLLISION_TEST 0x0080 ///< 1 = Collision test enabled
-
-// BSMR - Register 1
-
-#define BMSR_100BASET4 0x8000 ///< 1 = 100BASE-T4 mode
-#define BMSR_100BASETX_FDX 0x4000 ///< 1 = 100BASE-TX full duplex
-#define BMSR_100BASETX_HDX 0x2000 ///< 1 = 100BASE-TX half duplex
-#define BMSR_10BASET_FDX 0x1000 ///< 1 = 10BASE-T full duplex
-#define BMSR_10BASET_HDX 0x0800 ///< 1 = 10BASE-T half duplex
-#define BMSR_MF 0x0040 ///< 1 = PHY accepts frames with preamble suppressed
-#define BMSR_AUTONEG_CMPLT 0x0020 ///< 1 = Autonegotiation complete
-#define BMSR_RF 0x0010 ///< 1 = Remote fault
-#define BMSR_AUTONEG 0x0008 ///< 1 = Able to perform autonegotiation
-#define BMSR_LINKST 0x0004 ///< 1 = Link up
-#define BMSR_JABBER_DETECT 0x0002 ///< 1 = jabber condition detected
-#define BMSR_EXTENDED_CAPABILITY 0x0001 ///< 1 = Extended register capable
-
-// ANAR and ANLPAR Registers 4, 5
-
-#define AN_NP 0x8000 ///< 1 = Next page available
-#define AN_ACK 0x4000 ///< 1 = Link partner acknowledged
-#define AN_RF 0x2000 ///< 1 = Remote fault indicated by link partner
-#define AN_FCS 0x0400 ///< 1 = Flow control ability
-#define AN_T4 0x0200 ///< 1 = 100BASE-T4 support
-#define AN_TX_FDX 0x0100 ///< 1 = 100BASE-TX Full duplex
-#define AN_TX_HDX 0x0080 ///< 1 = 100BASE-TX support
-#define AN_10_FDX 0x0040 ///< 1 = 10BASE-T Full duplex
-#define AN_10_HDX 0x0020 ///< 1 = 10BASE-T support
-#define AN_CSMA_CD 0x0001 ///< 1 = IEEE 802.3 CSMA/CD support
-
-//------------------------------------------------------------------------------
-// Data Types
-//------------------------------------------------------------------------------
-
-/**
- Ethernet header layout
-
- IEEE 802.3-2002 Part 3 specification, section 3.1.1.
-**/
-#pragma pack(1)
-typedef struct {
- UINT8 dest_addr[PXE_HWADDR_LEN_ETHER]; ///< Destination LAN address
- UINT8 src_addr[PXE_HWADDR_LEN_ETHER]; ///< Source LAN address
- UINT16 type; ///< Protocol or length
-} ETHERNET_HEADER;
-#pragma pack()
-
-/**
- Receive and Transmit packet structure
-**/
-#pragma pack(1)
-typedef struct _RX_TX_PACKET {
- struct _RX_TX_PACKET * pNext; ///< Next receive packet
- UINT16 Length; ///< Packet length
- UINT16 LengthBar; ///< Complement of the length
- UINT8 Data[ AX88772_MAX_PKT_SIZE ]; ///< Received packet data
-} RX_TX_PACKET;
-#pragma pack()
-
-/**
- AX88772 control structure
-
- The driver uses this structure to manage the Asix AX88772 10/100
- Ethernet controller.
-**/
-typedef struct {
- UINTN Signature; ///< Structure identification
-
- //
- // USB data
- //
- EFI_HANDLE Controller; ///< Controller handle
- EFI_USB_IO_PROTOCOL * pUsbIo; ///< USB driver interface
-
- //
- // Simple network protocol data
- //
- EFI_SIMPLE_NETWORK_PROTOCOL SimpleNetwork; ///< Driver's network stack interface
- EFI_SIMPLE_NETWORK_MODE SimpleNetworkData; ///< Data for simple network
-
- //
- // Ethernet controller data
- //
- BOOLEAN bInitialized; ///< Controller initialized
- VOID * pTxBuffer; ///< Last transmit buffer
- UINT16 PhyId; ///< PHY ID
-
- //
- // Link state
- //
- BOOLEAN b100Mbps; ///< Current link speed, FALSE = 10 Mbps
- BOOLEAN bComplete; ///< Current state of auto-negotiation
- BOOLEAN bFullDuplex; ///< Current duplex
- BOOLEAN bLinkUp; ///< Current link state
- BOOLEAN bLinkIdle; ///< TRUE = No received traffic
- EFI_EVENT Timer; ///< Timer to monitor link state and receive packets
- UINTN PollCount; ///< Number of times the autonegotiation status was polled
-
- //
- // Receive buffer list
- //
- RX_TX_PACKET * pRxHead; ///< Head of receive packet list
- 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
-
-//------------------------------------------------------------------------------
-// Simple Network Protocol
-//------------------------------------------------------------------------------
-
-/**
- Reset the network adapter.
-
- Resets a network adapter and reinitializes it with the parameters that
- were provided in the previous call to Initialize (). The transmit and
- receive queues are cleared. Receive filters, the station address, the
- statistics, and the multicast-IP-to-HW MAC addresses are not reset by
- this call.
-
- This routine calls ::Ax88772Reset to perform the adapter specific
- reset operation. This routine also starts the link negotiation
- by calling ::Ax88772NegotiateLinkStart.
-
- @param [in] pSimpleNetwork Protocol instance pointer
- @param [in] bExtendedVerification Indicates that the driver may perform a more
- exhaustive verification operation of the device
- during reset.
-
- @retval EFI_SUCCESS This operation was successful.
- @retval EFI_NOT_STARTED The network interface was not started.
- @retval EFI_INVALID_PARAMETER pSimpleNetwork parameter was NULL or did not point to a valid
- EFI_SIMPLE_NETWORK_PROTOCOL structure.
- @retval EFI_DEVICE_ERROR The command could not be sent to the network interface.
- @retval EFI_UNSUPPORTED The increased buffer size feature is not supported.
-
-**/
-EFI_STATUS
-EFIAPI
-SN_Reset (
- IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork,
- IN BOOLEAN bExtendedVerification
- );
-
-/**
- Initialize the simple network protocol.
-
- This routine calls ::Ax88772MacAddressGet to obtain the
- MAC address.
-
- @param [in] pNicDevice NIC_DEVICE_INSTANCE pointer
-
- @retval EFI_SUCCESS Setup was successful
-
-**/
-EFI_STATUS
-SN_Setup (
- IN NIC_DEVICE * pNicDevice
- );
-
-/**
- This routine starts the network interface.
-
- @param [in] pSimpleNetwork Protocol instance pointer
-
- @retval EFI_SUCCESS This operation was successful.
- @retval EFI_ALREADY_STARTED The network interface was already started.
- @retval EFI_INVALID_PARAMETER pSimpleNetwork parameter was NULL or did not point to a valid
- EFI_SIMPLE_NETWORK_PROTOCOL structure.
- @retval EFI_DEVICE_ERROR The command could not be sent to the network interface.
- @retval EFI_UNSUPPORTED The increased buffer size feature is not supported.
-
-**/
-EFI_STATUS
-EFIAPI
-SN_Start (
- IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork
- );
-
-/**
- Set the MAC address.
-
- This function modifies or resets the current station address of a
- network interface. If Reset is TRUE, then the current station address
- is set ot the network interface's permanent address. If Reset if FALSE
- then the current station address is changed to the address specified by
- pNew.
-
- This routine calls ::Ax88772MacAddressSet to update the MAC address
- in the network adapter.
-
- @param [in] pSimpleNetwork Protocol instance pointer
- @param [in] bReset Flag used to reset the station address to the
- network interface's permanent address.
- @param [in] pNew New station address to be used for the network
- interface.
-
- @retval EFI_SUCCESS This operation was successful.
- @retval EFI_NOT_STARTED The network interface was not started.
- @retval EFI_INVALID_PARAMETER pSimpleNetwork parameter was NULL or did not point to a valid
- EFI_SIMPLE_NETWORK_PROTOCOL structure.
- @retval EFI_DEVICE_ERROR The command could not be sent to the network interface.
- @retval EFI_UNSUPPORTED The increased buffer size feature is not supported.
-
-**/
-EFI_STATUS
-EFIAPI
-SN_StationAddress (
- IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork,
- IN BOOLEAN bReset,
- IN EFI_MAC_ADDRESS * pNew
- );
-
-/**
- This function resets or collects the statistics on a network interface.
- If the size of the statistics table specified by StatisticsSize is not
- big enough for all of the statistics that are collected by the network
- interface, then a partial buffer of statistics is returned in
- StatisticsTable.
-
- @param [in] pSimpleNetwork Protocol instance pointer
- @param [in] bReset Set to TRUE to reset the statistics for the network interface.
- @param [in, out] pStatisticsSize On input the size, in bytes, of StatisticsTable. On output
- the size, in bytes, of the resulting table of statistics.
- @param [out] pStatisticsTable A pointer to the EFI_NETWORK_STATISTICS structure that
- conains the statistics.
-
- @retval EFI_SUCCESS This operation was successful.
- @retval EFI_NOT_STARTED The network interface was not started.
- @retval EFI_BUFFER_TOO_SMALL The pStatisticsTable is NULL or the buffer is too small.
- @retval EFI_INVALID_PARAMETER pSimpleNetwork parameter was NULL or did not point to a valid
- EFI_SIMPLE_NETWORK_PROTOCOL structure.
- @retval EFI_DEVICE_ERROR The command could not be sent to the network interface.
- @retval EFI_UNSUPPORTED The increased buffer size feature is not supported.
-
-**/
-EFI_STATUS
-EFIAPI
-SN_Statistics (
- IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork,
- IN BOOLEAN bReset,
- IN OUT UINTN * pStatisticsSize,
- OUT EFI_NETWORK_STATISTICS * pStatisticsTable
- );
-
-/**
- This function stops a network interface. This call is only valid
- if the network interface is in the started state.
-
- @param [in] pSimpleNetwork Protocol instance pointer
-
- @retval EFI_SUCCESS This operation was successful.
- @retval EFI_NOT_STARTED The network interface was not started.
- @retval EFI_INVALID_PARAMETER pSimpleNetwork parameter was NULL or did not point to a valid
- EFI_SIMPLE_NETWORK_PROTOCOL structure.
- @retval EFI_DEVICE_ERROR The command could not be sent to the network interface.
- @retval EFI_UNSUPPORTED The increased buffer size feature is not supported.
-
-**/
-EFI_STATUS
-EFIAPI
-SN_Stop (
- IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork
- );
-
-/**
- This function releases the memory buffers assigned in the Initialize() call.
- Pending transmits and receives are lost, and interrupts are cleared and disabled.
- After this call, only Initialize() and Stop() calls may be used.
-
- @param [in] pSimpleNetwork Protocol instance pointer
-
- @retval EFI_SUCCESS This operation was successful.
- @retval EFI_NOT_STARTED The network interface was not started.
- @retval EFI_INVALID_PARAMETER pSimpleNetwork parameter was NULL or did not point to a valid
- EFI_SIMPLE_NETWORK_PROTOCOL structure.
- @retval EFI_DEVICE_ERROR The command could not be sent to the network interface.
- @retval EFI_UNSUPPORTED The increased buffer size feature is not supported.
-
-**/
-EFI_STATUS
-EFIAPI
-SN_Shutdown (
- IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork
- );
-
-/**
- Send a packet over the network.
-
- This function places the packet specified by Header and Buffer on
- the transmit queue. This function performs a non-blocking transmit
- operation. When the transmit is complete, the buffer is returned
- via the GetStatus() call.
-
- This routine calls ::Ax88772Rx to empty the network adapter of
- receive packets. The routine then passes the transmit packet
- to the network adapter.
-
- @param [in] pSimpleNetwork Protocol instance pointer
- @param [in] HeaderSize The size, in bytes, of the media header to be filled in by
- the Transmit() function. If HeaderSize is non-zero, then
- it must be equal to SimpleNetwork->Mode->MediaHeaderSize
- and DestAddr and Protocol parameters must not be NULL.
- @param [in] BufferSize The size, in bytes, of the entire packet (media header and
- data) to be transmitted through the network interface.
- @param [in] pBuffer A pointer to the packet (media header followed by data) to
- to be transmitted. This parameter can not be NULL. If
- HeaderSize is zero, then the media header is Buffer must
- already be filled in by the caller. If HeaderSize is nonzero,
- then the media header will be filled in by the Transmit()
- function.
- @param [in] pSrcAddr The source HW MAC address. If HeaderSize is zero, then
- this parameter is ignored. If HeaderSize is nonzero and
- SrcAddr is NULL, then SimpleNetwork->Mode->CurrentAddress
- is used for the source HW MAC address.
- @param [in] pDestAddr The destination HW MAC address. If HeaderSize is zero, then
- this parameter is ignored.
- @param [in] pProtocol The type of header to build. If HeaderSize is zero, then
- this parameter is ignored.
-
- @retval EFI_SUCCESS This operation was successful.
- @retval EFI_NOT_STARTED The network interface was not started.
- @retval EFI_NOT_READY The network interface is too busy to accept this transmit request.
- @retval EFI_BUFFER_TOO_SMALL The BufferSize parameter is too small.
- @retval EFI_INVALID_PARAMETER pSimpleNetwork parameter was NULL or did not point to a valid
- EFI_SIMPLE_NETWORK_PROTOCOL structure.
- @retval EFI_DEVICE_ERROR The command could not be sent to the network interface.
-
-**/
-EFI_STATUS
-EFIAPI
-SN_Transmit (
- IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork,
- IN UINTN HeaderSize,
- IN UINTN BufferSize,
- IN VOID * pBuffer,
- IN EFI_MAC_ADDRESS * pSrcAddr,
- IN EFI_MAC_ADDRESS * pDestAddr,
- IN UINT16 * pProtocol
- );
-
-//------------------------------------------------------------------------------
-// Support Routines
-//------------------------------------------------------------------------------
-
-/**
- Get the MAC address
-
- This routine calls ::Ax88772UsbCommand to request the MAC
- address from the network adapter.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
- @param [out] pMacAddress Address of a six byte buffer to receive the MAC address.
-
- @retval EFI_SUCCESS The MAC address is available.
- @retval other The MAC address is not valid.
-
-**/
-EFI_STATUS
-Ax88772MacAddressGet (
- IN NIC_DEVICE * pNicDevice,
- OUT UINT8 * pMacAddress
- );
-
-/**
- Set the MAC address
-
- This routine calls ::Ax88772UsbCommand to set the MAC address
- in the network adapter.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
- @param [in] pMacAddress Address of a six byte buffer to containing the new MAC address.
-
- @retval EFI_SUCCESS The MAC address was set.
- @retval other The MAC address was not set.
-
-**/
-EFI_STATUS
-Ax88772MacAddressSet (
- IN NIC_DEVICE * pNicDevice,
- IN UINT8 * pMacAddress
- );
-
-/**
- Clear the multicast hash table
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
-
-**/
-VOID
-Ax88772MulticastClear (
- IN NIC_DEVICE * pNicDevice
- );
-
-/**
- Enable a multicast address in the multicast hash table
-
- This routine calls ::Ax88772Crc to compute the hash bit for
- this MAC address.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
- @param [in] pMacAddress Address of a six byte buffer to containing the MAC address.
-
-**/
-VOID
-Ax88772MulticastSet (
- IN NIC_DEVICE * pNicDevice,
- IN UINT8 * pMacAddress
- );
-
-/**
- Start the link negotiation
-
- This routine calls ::Ax88772PhyWrite to start the PHY's link
- negotiation.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
-
- @retval EFI_SUCCESS The link negotiation was started.
- @retval other Failed to start the link negotiation.
-
-**/
-EFI_STATUS
-Ax88772NegotiateLinkStart (
- IN NIC_DEVICE * pNicDevice
- );
-
-/**
- Complete the negotiation of the PHY link
-
- This routine calls ::Ax88772PhyRead to determine if the
- link negotiation is complete.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
- @param [in, out] pPollCount Address of number of times this routine was polled
- @param [out] pbComplete Address of boolean to receive complate status.
- @param [out] pbLinkUp Address of boolean to receive link status, TRUE=up.
- @param [out] pbHiSpeed Address of boolean to receive link speed, TRUE=100Mbps.
- @param [out] pbFullDuplex Address of boolean to receive link duplex, TRUE=full.
-
- @retval EFI_SUCCESS The MAC address is available.
- @retval other The MAC address is not valid.
-
-**/
-EFI_STATUS
-Ax88772NegotiateLinkComplete (
- IN NIC_DEVICE * pNicDevice,
- IN OUT UINTN * pPollCount,
- OUT BOOLEAN * pbComplete,
- OUT BOOLEAN * pbLinkUp,
- OUT BOOLEAN * pbHiSpeed,
- OUT BOOLEAN * pbFullDuplex
- );
-
-/**
- Read a register from the PHY
-
- This routine calls ::Ax88772UsbCommand to read a PHY register.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
- @param [in] RegisterAddress Number of the register to read.
- @param [in, out] pPhyData Address of a buffer to receive the PHY register value
-
- @retval EFI_SUCCESS The PHY data is available.
- @retval other The PHY data is not valid.
-
-**/
-EFI_STATUS
-Ax88772PhyRead (
- IN NIC_DEVICE * pNicDevice,
- IN UINT8 RegisterAddress,
- IN OUT UINT16 * pPhyData
- );
-
-/**
- Write to a PHY register
-
- This routine calls ::Ax88772UsbCommand to write a PHY register.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
- @param [in] RegisterAddress Number of the register to read.
- @param [in] PhyData Address of a buffer to receive the PHY register value
-
- @retval EFI_SUCCESS The PHY data was written.
- @retval other Failed to wwrite the PHY register.
-
-**/
-EFI_STATUS
-Ax88772PhyWrite (
- IN NIC_DEVICE * pNicDevice,
- IN UINT8 RegisterAddress,
- IN UINT16 PhyData
- );
-
-/**
- Reset the AX88772
-
- This routine uses ::Ax88772UsbCommand to reset the network
- adapter. This routine also uses ::Ax88772PhyWrite to reset
- the PHY.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
-
- @retval EFI_SUCCESS The MAC address is available.
- @retval other The MAC address is not valid.
-
-**/
-EFI_STATUS
-Ax88772Reset (
- IN NIC_DEVICE * pNicDevice
- );
-
-/**
- Receive a frame from the network.
-
- This routine polls the USB receive interface for a packet. If a packet
- is available, this routine adds the receive packet to the list of
- pending receive packets.
-
- This routine calls ::Ax88772NegotiateLinkComplete to verify
- that the link is up. This routine also calls ::SN_Reset to
- reset the network adapter when necessary. Finally this
- routine attempts to receive one or more packets from the
- network adapter.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
- @param [in] bUpdateLink TRUE = Update link status
-
-**/
-VOID
-Ax88772Rx (
- IN NIC_DEVICE * pNicDevice,
- IN BOOLEAN bUpdateLink
- );
-
-/**
- Enable or disable the receiver
-
- This routine calls ::Ax88772UsbCommand to update the
- receiver state. This routine also calls ::Ax88772MacAddressSet
- to establish the MAC address for the network adapter.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
- @param [in] RxFilter Simple network RX filter mask value
-
- @retval EFI_SUCCESS The MAC address was set.
- @retval other The MAC address was not set.
-
-**/
-EFI_STATUS
-Ax88772RxControl (
- IN NIC_DEVICE * pNicDevice,
- IN UINT32 RxFilter
- );
-
-/**
- Read an SROM location
-
- This routine calls ::Ax88772UsbCommand to read data from the
- SROM.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
- @param [in] Address SROM address
- @param [out] pData Buffer to receive the data
-
- @retval EFI_SUCCESS The read was successful
- @retval other The read failed
-
-**/
-EFI_STATUS
-Ax88772SromRead (
- IN NIC_DEVICE * pNicDevice,
- IN UINT32 Address,
- OUT UINT16 * pData
- );
-
-/**
- This routine is called at a regular interval to poll for
- receive packets.
-
- This routine polls the link state and gets any receive packets
- by calling ::Ax88772Rx.
-
- @param [in] Event Timer event
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
-
-**/
-VOID
-Ax88772Timer (
- IN EFI_EVENT Event,
- IN NIC_DEVICE * pNicDevice
- );
-
-/**
- Send a command to the USB device.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
- @param [in] pRequest Pointer to the request structure
- @param [in, out] pBuffer Data buffer address
-
- @retval EFI_SUCCESS The USB transfer was successful
- @retval other The USB transfer failed
-
-**/
-EFI_STATUS
-Ax88772UsbCommand (
- IN NIC_DEVICE * pNicDevice,
- IN USB_DEVICE_REQUEST * pRequest,
- IN OUT VOID * pBuffer
- );
-
-//------------------------------------------------------------------------------
-// EFI Component Name Protocol Support
-//------------------------------------------------------------------------------
-
-extern EFI_COMPONENT_NAME_PROTOCOL gComponentName; ///< Component name protocol declaration
-extern EFI_COMPONENT_NAME2_PROTOCOL gComponentName2; ///< Component name 2 protocol declaration
-
-/**
- Retrieves a Unicode string that is the user readable name of the driver.
-
- This function retrieves the user readable name of a driver in the form of a
- Unicode string. If the driver specified by This has a user readable name in
- the language specified by Language, then a pointer to the driver name is
- returned in DriverName, and EFI_SUCCESS is returned. If the driver specified
- by This does not support the language specified by Language,
- then EFI_UNSUPPORTED is returned.
-
- @param [in] pThis A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
- EFI_COMPONENT_NAME_PROTOCOL instance.
- @param [in] pLanguage A pointer to a Null-terminated ASCII string
- array indicating the language. This is the
- language of the driver name that the caller is
- requesting, and it must match one of the
- languages specified in SupportedLanguages. The
- number of languages supported by a driver is up
- to the driver writer. Language is specified
- in RFC 3066 or ISO 639-2 language code format.
- @param [out] ppDriverName A pointer to the Unicode string to return.
- This Unicode string is the name of the
- driver specified by This in the language
- specified by Language.
-
- @retval EFI_SUCCESS The Unicode string for the Driver specified by
- This and the language specified by Language was
- returned in DriverName.
- @retval EFI_INVALID_PARAMETER Language is NULL.
- @retval EFI_INVALID_PARAMETER DriverName is NULL.
- @retval EFI_UNSUPPORTED The driver specified by This does not support
- the language specified by Language.
-
-**/
-EFI_STATUS
-EFIAPI
-GetDriverName (
- IN EFI_COMPONENT_NAME_PROTOCOL * pThis,
- IN CHAR8 * pLanguage,
- OUT CHAR16 ** ppDriverName
- );
-
-
-/**
- Retrieves a Unicode string that is the user readable name of the controller
- that is being managed by a driver.
-
- This function retrieves the user readable name of the controller specified by
- ControllerHandle and ChildHandle in the form of a Unicode string. If the
- driver specified by This has a user readable name in the language specified by
- Language, then a pointer to the controller name is returned in ControllerName,
- and EFI_SUCCESS is returned. If the driver specified by This is not currently
- managing the controller specified by ControllerHandle and ChildHandle,
- then EFI_UNSUPPORTED is returned. If the driver specified by This does not
- support the language specified by Language, then EFI_UNSUPPORTED is returned.
-
- @param [in] pThis A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
- EFI_COMPONENT_NAME_PROTOCOL instance.
- @param [in] ControllerHandle The handle of a controller that the driver
- specified by This is managing. This handle
- specifies the controller whose name is to be
- returned.
- @param [in] ChildHandle The handle of the child controller to retrieve
- the name of. This is an optional parameter that
- may be NULL. It will be NULL for device
- drivers. It will also be NULL for a bus drivers
- that wish to retrieve the name of the bus
- controller. It will not be NULL for a bus
- driver that wishes to retrieve the name of a
- child controller.
- @param [in] pLanguage A pointer to a Null-terminated ASCII string
- array indicating the language. This is the
- language of the driver name that the caller is
- requesting, and it must match one of the
- languages specified in SupportedLanguages. The
- number of languages supported by a driver is up
- to the driver writer. Language is specified in
- RFC 3066 or ISO 639-2 language code format.
- @param [out] ppControllerName A pointer to the Unicode string to return.
- This Unicode string is the name of the
- controller specified by ControllerHandle and
- ChildHandle in the language specified by
- Language from the point of view of the driver
- specified by This.
-
- @retval EFI_SUCCESS The Unicode string for the user readable name in
- the language specified by Language for the
- driver specified by This was returned in
- DriverName.
- @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE.
- @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid
- EFI_HANDLE.
- @retval EFI_INVALID_PARAMETER Language is NULL.
- @retval EFI_INVALID_PARAMETER ControllerName is NULL.
- @retval EFI_UNSUPPORTED The driver specified by This is not currently
- managing the controller specified by
- ControllerHandle and ChildHandle.
- @retval EFI_UNSUPPORTED The driver specified by This does not support
- the language specified by Language.
-
-**/
-EFI_STATUS
-EFIAPI
-GetControllerName (
- IN EFI_COMPONENT_NAME_PROTOCOL * pThis,
- IN EFI_HANDLE ControllerHandle,
- IN OPTIONAL EFI_HANDLE ChildHandle,
- IN CHAR8 * pLanguage,
- OUT CHAR16 ** ppControllerName
- );
-
-//------------------------------------------------------------------------------
-
-#endif // _AX88772_H_
diff --git a/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772/Ax88772.inf b/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772/Ax88772.inf
deleted file mode 100644
index 12e7ebc..0000000
--- a/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772/Ax88772.inf
+++ /dev/null
@@ -1,61 +0,0 @@
-## @file
-# Component description file for ASIX AX88772 USB/Ethernet driver.
-#
-# This module provides support for the ASIX AX88772 USB/Ethernet adapter.
-# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
-#
-# SPDX-License-Identifier: BSD-2-Clause-Patent
-#
-##
-
-[Defines]
- INF_VERSION = 0x00010018
- BASE_NAME = Ax88772
- FILE_GUID = B15239D6-6A01-4808-A0F7-B7F20F073555
- MODULE_TYPE = DXE_RUNTIME_DRIVER
- VERSION_STRING = 1.0
-
- ENTRY_POINT = EntryPoint
-
-#
-# VALID_ARCHITECTURES = IA32 X64 EBC
-#
-
-[Sources.common]
- Ax88772.h
- Ax88772.c
- ComponentName.c
- DriverBinding.c
- SimpleNetwork.c
-
-
-[Packages]
- MdePkg/MdePkg.dec
- MdeModulePkg/MdeModulePkg.dec
-
-[LibraryClasses]
- UefiLib
- UefiBootServicesTableLib
- BaseMemoryLib
- DebugLib
- UefiRuntimeLib
- UefiDriverEntryPoint
-
-[Protocols]
- gEfiDevicePathProtocolGuid ## BY_START
- gEfiSimpleNetworkProtocolGuid ## BY_START
- gEfiUsbIoProtocolGuid ## TO_START
-
-[Depex]
- gEfiBdsArchProtocolGuid AND
- gEfiCpuArchProtocolGuid AND
- gEfiMetronomeArchProtocolGuid AND
- gEfiMonotonicCounterArchProtocolGuid AND
- gEfiRealTimeClockArchProtocolGuid AND
- gEfiResetArchProtocolGuid AND
- gEfiRuntimeArchProtocolGuid AND
- gEfiSecurityArchProtocolGuid AND
- gEfiTimerArchProtocolGuid AND
- gEfiVariableWriteArchProtocolGuid AND
- gEfiVariableArchProtocolGuid AND
- gEfiWatchdogTimerArchProtocolGuid
diff --git a/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772/ComponentName.c b/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772/ComponentName.c
deleted file mode 100644
index b6dce7e..0000000
--- a/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772/ComponentName.c
+++ /dev/null
@@ -1,178 +0,0 @@
-/** @file
- UEFI Component Name(2) protocol implementation.
-
- Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include "Ax88772.h"
-
-/**
- EFI Component Name Protocol declaration
-**/
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gComponentName = {
- GetDriverName,
- GetControllerName,
- "eng"
-};
-
-/**
- EFI Component Name 2 Protocol declaration
-**/
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gComponentName2 = {
- (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) GetDriverName,
- (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) GetControllerName,
- "en"
-};
-
-
-/**
- Driver name table declaration
-**/
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE
-mDriverNameTable[] = {
- {"eng;en", L"AX88772 Ethernet Driver"},
- {NULL, NULL}
-};
-
-/**
- Retrieves a Unicode string that is the user readable name of the driver.
-
- This function retrieves the user readable name of a driver in the form of a
- Unicode string. If the driver specified by This has a user readable name in
- the language specified by Language, then a pointer to the driver name is
- returned in DriverName, and EFI_SUCCESS is returned. If the driver specified
- by This does not support the language specified by Language,
- then EFI_UNSUPPORTED is returned.
-
- @param [in] pThis A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
- EFI_COMPONENT_NAME_PROTOCOL instance.
- @param [in] pLanguage A pointer to a Null-terminated ASCII string
- array indicating the language. This is the
- language of the driver name that the caller is
- requesting, and it must match one of the
- languages specified in SupportedLanguages. The
- number of languages supported by a driver is up
- to the driver writer. Language is specified
- in RFC 3066 or ISO 639-2 language code format.
- @param [out] ppDriverName A pointer to the Unicode string to return.
- This Unicode string is the name of the
- driver specified by This in the language
- specified by Language.
-
- @retval EFI_SUCCESS The Unicode string for the Driver specified by
- This and the language specified by Language was
- returned in DriverName.
- @retval EFI_INVALID_PARAMETER Language is NULL.
- @retval EFI_INVALID_PARAMETER DriverName is NULL.
- @retval EFI_UNSUPPORTED The driver specified by This does not support
- the language specified by Language.
-
-**/
-EFI_STATUS
-EFIAPI
-GetDriverName (
- IN EFI_COMPONENT_NAME_PROTOCOL * pThis,
- IN CHAR8 * pLanguage,
- OUT CHAR16 ** ppDriverName
- )
-{
- EFI_STATUS Status;
-
- DBG_ENTER ( );
- Status = LookupUnicodeString2 (
- pLanguage,
- pThis->SupportedLanguages,
- mDriverNameTable,
- ppDriverName,
- (BOOLEAN)(pThis == &gComponentName)
- );
- DBG_EXIT_HEX ( Status );
- return Status;
-}
-
-/**
- Retrieves a Unicode string that is the user readable name of the controller
- that is being managed by a driver.
-
- This function retrieves the user readable name of the controller specified by
- ControllerHandle and ChildHandle in the form of a Unicode string. If the
- driver specified by This has a user readable name in the language specified by
- Language, then a pointer to the controller name is returned in ControllerName,
- and EFI_SUCCESS is returned. If the driver specified by This is not currently
- managing the controller specified by ControllerHandle and ChildHandle,
- then EFI_UNSUPPORTED is returned. If the driver specified by This does not
- support the language specified by Language, then EFI_UNSUPPORTED is returned.
-
- @param [in] pThis A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
- EFI_COMPONENT_NAME_PROTOCOL instance.
- @param [in] ControllerHandle The handle of a controller that the driver
- specified by This is managing. This handle
- specifies the controller whose name is to be
- returned.
- @param [in] ChildHandle The handle of the child controller to retrieve
- the name of. This is an optional parameter that
- may be NULL. It will be NULL for device
- drivers. It will also be NULL for a bus drivers
- that wish to retrieve the name of the bus
- controller. It will not be NULL for a bus
- driver that wishes to retrieve the name of a
- child controller.
- @param [in] pLanguage A pointer to a Null-terminated ASCII string
- array indicating the language. This is the
- language of the driver name that the caller is
- requesting, and it must match one of the
- languages specified in SupportedLanguages. The
- number of languages supported by a driver is up
- to the driver writer. Language is specified in
- RFC 3066 or ISO 639-2 language code format.
- @param [out] ppControllerName A pointer to the Unicode string to return.
- This Unicode string is the name of the
- controller specified by ControllerHandle and
- ChildHandle in the language specified by
- Language from the point of view of the driver
- specified by This.
-
- @retval EFI_SUCCESS The Unicode string for the user readable name in
- the language specified by Language for the
- driver specified by This was returned in
- DriverName.
- @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE.
- @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid
- EFI_HANDLE.
- @retval EFI_INVALID_PARAMETER Language is NULL.
- @retval EFI_INVALID_PARAMETER ControllerName is NULL.
- @retval EFI_UNSUPPORTED The driver specified by This is not currently
- managing the controller specified by
- ControllerHandle and ChildHandle.
- @retval EFI_UNSUPPORTED The driver specified by This does not support
- the language specified by Language.
-
-**/
-EFI_STATUS
-EFIAPI
-GetControllerName (
- IN EFI_COMPONENT_NAME_PROTOCOL * pThis,
- IN EFI_HANDLE ControllerHandle,
- IN OPTIONAL EFI_HANDLE ChildHandle,
- IN CHAR8 * pLanguage,
- OUT CHAR16 ** ppControllerName
- )
-{
- EFI_STATUS Status;
-
- DBG_ENTER ( );
-
- //
- // Set the controller name
- //
- *ppControllerName = L"AX88772 10/100 Ethernet";
- Status = EFI_SUCCESS;
-
- //
- // Return the operation status
- //
- DBG_EXIT_HEX ( Status );
- return Status;
-}
diff --git a/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772/DriverBinding.c b/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772/DriverBinding.c
deleted file mode 100644
index 5bcde4b..0000000
--- a/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772/DriverBinding.c
+++ /dev/null
@@ -1,507 +0,0 @@
-/** @file
- Implement the driver binding protocol for Asix AX88772 Ethernet driver.
-
- Copyright (c) 2011-2013, Intel Corporation. All rights reserved.<BR>
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include "Ax88772.h"
-
-/**
- Verify the controller type
-
- @param [in] pThis Protocol instance pointer.
- @param [in] Controller Handle of device to test.
- @param [in] pRemainingDevicePath Not used.
-
- @retval EFI_SUCCESS This driver supports this device.
- @retval other This driver does not support this device.
-
-**/
-EFI_STATUS
-EFIAPI
-DriverSupported (
- IN EFI_DRIVER_BINDING_PROTOCOL * pThis,
- IN EFI_HANDLE Controller,
- IN EFI_DEVICE_PATH_PROTOCOL * pRemainingDevicePath
- )
-{
- EFI_USB_DEVICE_DESCRIPTOR Device;
- EFI_USB_IO_PROTOCOL * pUsbIo;
- EFI_STATUS Status;
-
- //
- // Connect to the USB stack
- //
- Status = gBS->OpenProtocol (
- Controller,
- &gEfiUsbIoProtocolGuid,
- (VOID **) &pUsbIo,
- pThis->DriverBindingHandle,
- Controller,
- EFI_OPEN_PROTOCOL_BY_DRIVER
- );
- if (!EFI_ERROR ( Status )) {
-
- //
- // Get the interface descriptor to check the USB class and find a transport
- // protocol handler.
- //
- Status = pUsbIo->UsbGetDeviceDescriptor ( pUsbIo, &Device );
- if (!EFI_ERROR ( Status )) {
-
- //
- // Validate the adapter
- //
- if (( VENDOR_ID != Device.IdVendor )
- || ( PRODUCT_ID != Device.IdProduct )) {
- Status = EFI_UNSUPPORTED;
- }
- }
-
- //
- // Done with the USB stack
- //
- gBS->CloseProtocol (
- Controller,
- &gEfiUsbIoProtocolGuid,
- pThis->DriverBindingHandle,
- Controller
- );
- }
-
- //
- // Return the device supported status
- //
- return Status;
-}
-
-
-/**
- Start this driver on Controller by opening UsbIo and DevicePath protocols.
- Initialize PXE structures, create a copy of the Controller Device Path with the
- NIC's MAC address appended to it, install the NetworkInterfaceIdentifier protocol
- on the newly created Device Path.
-
- @param [in] pThis Protocol instance pointer.
- @param [in] Controller Handle of device to work with.
- @param [in] pRemainingDevicePath Not used, always produce all possible children.
-
- @retval EFI_SUCCESS This driver is added to Controller.
- @retval other This driver does not support this device.
-
-**/
-EFI_STATUS
-EFIAPI
-DriverStart (
- IN EFI_DRIVER_BINDING_PROTOCOL * pThis,
- IN EFI_HANDLE Controller,
- IN EFI_DEVICE_PATH_PROTOCOL * pRemainingDevicePath
- )
-{
- EFI_STATUS Status;
- NIC_DEVICE * pNicDevice;
- UINTN LengthInBytes;
-
- DBG_ENTER ( );
-
- //
- // Allocate the device structure
- //
- LengthInBytes = sizeof ( *pNicDevice );
- Status = gBS->AllocatePool (
- EfiRuntimeServicesData,
- LengthInBytes,
- (VOID **) &pNicDevice
- );
- if ( !EFI_ERROR ( Status )) {
- DEBUG (( DEBUG_POOL | DEBUG_INIT,
- "0x%08x: Allocate pNicDevice, %d bytes\r\n",
- pNicDevice,
- sizeof ( *pNicDevice )));
-
- //
- // Set the structure signature
- //
- ZeroMem ( pNicDevice, LengthInBytes );
- pNicDevice->Signature = DEV_SIGNATURE;
-
- //
- // Connect to the USB I/O protocol
- //
- Status = gBS->OpenProtocol (
- Controller,
- &gEfiUsbIoProtocolGuid,
- (VOID **) &pNicDevice->pUsbIo,
- pThis->DriverBindingHandle,
- Controller,
- EFI_OPEN_PROTOCOL_BY_DRIVER
- );
-
- if ( !EFI_ERROR ( Status )) {
- //
- // Allocate the necessary events
- //
- Status = gBS->CreateEvent ( EVT_TIMER,
- TPL_AX88772,
- (EFI_EVENT_NOTIFY)Ax88772Timer,
- pNicDevice,
- (VOID **)&pNicDevice->Timer );
- if ( !EFI_ERROR ( Status )) {
- DEBUG (( DEBUG_POOL | DEBUG_INIT | DEBUG_INFO,
- "0x%08x: Allocated timer\r\n",
- pNicDevice->Timer ));
-
- //
- // Initialize the simple network protocol
- //
- pNicDevice->Controller = Controller;
- SN_Setup ( pNicDevice );
-
- //
- // Start the timer
- //
- Status = gBS->SetTimer ( pNicDevice->Timer,
- TimerPeriodic,
- TIMER_MSEC );
- if ( !EFI_ERROR ( Status )) {
- //
- // Install both the simple network and device path protocols.
- //
- Status = gBS->InstallMultipleProtocolInterfaces (
- &Controller,
- &gEfiCallerIdGuid,
- pNicDevice,
- &gEfiSimpleNetworkProtocolGuid,
- &pNicDevice->SimpleNetwork,
- NULL
- );
-
- if ( !EFI_ERROR ( Status )) {
- DEBUG (( DEBUG_POOL | DEBUG_INIT | DEBUG_INFO,
- "Installed: gEfiCallerIdGuid on 0x%08x\r\n",
- Controller ));
- DEBUG (( DEBUG_POOL | DEBUG_INIT | DEBUG_INFO,
- "Installed: gEfiSimpleNetworkProtocolGuid on 0x%08x\r\n",
- Controller ));
- DBG_EXIT_STATUS ( Status );
- return Status;
- }
- DEBUG (( DEBUG_ERROR | DEBUG_INIT | DEBUG_INFO,
- "ERROR - Failed to install gEfiSimpleNetworkProtocol on 0x%08x\r\n",
- Controller ));
- }
- else {
- DEBUG (( DEBUG_ERROR | DEBUG_INIT | DEBUG_INFO,
- "ERROR - Failed to start the timer, Status: %r\r\n",
- Status ));
- }
- }
- else {
- DEBUG (( DEBUG_ERROR | DEBUG_INIT | DEBUG_INFO,
- "ERROR - Failed to create timer event, Status: %r\r\n",
- Status ));
- }
-
- //
- // Done with the USB stack
- //
- gBS->CloseProtocol (
- Controller,
- &gEfiUsbIoProtocolGuid,
- pThis->DriverBindingHandle,
- Controller
- );
- }
-
- //
- // Done with the device
- //
- gBS->FreePool ( pNicDevice );
- }
-
- //
- // Display the driver start status
- //
- DBG_EXIT_STATUS ( Status );
- return Status;
-}
-
-
-/**
- Stop this driver on Controller by removing NetworkInterfaceIdentifier protocol and
- closing the DevicePath and PciIo protocols on Controller.
-
- @param [in] pThis Protocol instance pointer.
- @param [in] Controller Handle of device to stop driver on.
- @param [in] NumberOfChildren How many children need to be stopped.
- @param [in] pChildHandleBuffer Not used.
-
- @retval EFI_SUCCESS This driver is removed Controller.
- @retval EFI_DEVICE_ERROR The device could not be stopped due to a device error.
- @retval other This driver was not removed from this device.
-
-**/
-EFI_STATUS
-EFIAPI
-DriverStop (
- IN EFI_DRIVER_BINDING_PROTOCOL * pThis,
- IN EFI_HANDLE Controller,
- IN UINTN NumberOfChildren,
- IN EFI_HANDLE * pChildHandleBuffer
- )
-{
- NIC_DEVICE * pNicDevice;
- EFI_STATUS Status;
-
- DBG_ENTER ( );
-
- //
- // Determine if this driver is already attached
- //
- Status = gBS->OpenProtocol (
- Controller,
- &gEfiCallerIdGuid,
- (VOID **) &pNicDevice,
- pThis->DriverBindingHandle,
- Controller,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
- if ( !EFI_ERROR ( Status )) {
- //
- // AX88772 driver is no longer running on this device
- //
- gBS->UninstallMultipleProtocolInterfaces (
- Controller,
- &gEfiSimpleNetworkProtocolGuid,
- &pNicDevice->SimpleNetwork,
- &gEfiCallerIdGuid,
- pNicDevice,
- NULL );
- DEBUG (( DEBUG_POOL | DEBUG_INIT,
- "Removed: gEfiSimpleNetworkProtocolGuid from 0x%08x\r\n",
- Controller ));
- DEBUG (( DEBUG_POOL | DEBUG_INIT,
- "Removed: gEfiCallerIdGuid from 0x%08x\r\n",
- Controller ));
-
- //
- // Stop the timer
- //
- if ( NULL != pNicDevice->Timer ) {
- gBS->SetTimer ( pNicDevice->Timer, TimerCancel, 0 );
- gBS->CloseEvent ( pNicDevice->Timer );
- DEBUG (( DEBUG_POOL | DEBUG_INIT | DEBUG_INFO,
- "0x%08x: Released timer\r\n",
- pNicDevice->Timer ));
- }
-
- //
- // Done with the device context
- //
- DEBUG (( DEBUG_POOL | DEBUG_INIT,
- "0x%08x: Free pNicDevice, %d bytes\r\n",
- pNicDevice,
- sizeof ( *pNicDevice )));
- gBS->FreePool ( pNicDevice );
- }
-
- //
- // Return the shutdown status
- //
- DBG_EXIT_STATUS ( Status );
- return Status;
-}
-
-
-/**
- Driver binding protocol declaration
-**/
-EFI_DRIVER_BINDING_PROTOCOL gDriverBinding = {
- DriverSupported,
- DriverStart,
- DriverStop,
- 0xa,
- NULL,
- NULL
-};
-
-
-/**
- Ax88772 driver unload routine.
-
- @param [in] ImageHandle Handle for the image.
-
- @retval EFI_SUCCESS Image may be unloaded
-
-**/
-EFI_STATUS
-EFIAPI
-DriverUnload (
- IN EFI_HANDLE ImageHandle
- )
-{
- UINTN BufferSize;
- UINTN Index;
- UINTN Max;
- EFI_HANDLE * pHandle;
- EFI_STATUS Status;
-
- //
- // Determine which devices are using this driver
- //
- BufferSize = 0;
- pHandle = NULL;
- Status = gBS->LocateHandle (
- ByProtocol,
- &gEfiCallerIdGuid,
- NULL,
- &BufferSize,
- NULL );
- if ( EFI_BUFFER_TOO_SMALL == Status ) {
- for ( ; ; ) {
- //
- // One or more block IO devices are present
- //
- Status = gBS->AllocatePool (
- EfiRuntimeServicesData,
- BufferSize,
- (VOID **) &pHandle
- );
- if ( EFI_ERROR ( Status )) {
- DEBUG (( DEBUG_ERROR | DEBUG_POOL | DEBUG_INIT | DEBUG_INFO,
- "Insufficient memory, failed handle buffer allocation\r\n" ));
- break;
- }
-
- //
- // Locate the block IO devices
- //
- Status = gBS->LocateHandle (
- ByProtocol,
- &gEfiCallerIdGuid,
- NULL,
- &BufferSize,
- pHandle );
- if ( EFI_ERROR ( Status )) {
- //
- // Error getting handles
- //
- DEBUG (( DEBUG_ERROR | DEBUG_INIT | DEBUG_INFO,
- "Failure getting Telnet handles\r\n" ));
- break;
- }
-
- //
- // Remove any use of the driver
- //
- Max = BufferSize / sizeof ( pHandle[ 0 ]);
- for ( Index = 0; Max > Index; Index++ ) {
- Status = DriverStop ( &gDriverBinding,
- pHandle[ Index ],
- 0,
- NULL );
- if ( EFI_ERROR ( Status )) {
- DEBUG (( DEBUG_WARN | DEBUG_INIT | DEBUG_INFO,
- "WARNING - Failed to shutdown the driver on handle %08x\r\n", pHandle[ Index ]));
- break;
- }
- }
- break;
- }
- }
- else {
- if ( EFI_NOT_FOUND == Status ) {
- //
- // No devices were found
- //
- Status = EFI_SUCCESS;
- }
- }
-
- //
- // Free the handle array
- //
- if ( NULL != pHandle ) {
- gBS->FreePool ( pHandle );
- }
-
- //
- // Remove the protocols installed by the EntryPoint routine.
- //
- if ( !EFI_ERROR ( Status )) {
- gBS->UninstallMultipleProtocolInterfaces (
- ImageHandle,
- &gEfiDriverBindingProtocolGuid,
- &gDriverBinding,
- &gEfiComponentNameProtocolGuid,
- &gComponentName,
- &gEfiComponentName2ProtocolGuid,
- &gComponentName2,
- NULL
- );
- DEBUG (( DEBUG_POOL | DEBUG_INIT | DEBUG_INFO,
- "Removed: gEfiComponentName2ProtocolGuid from 0x%08x\r\n",
- ImageHandle ));
- DEBUG (( DEBUG_POOL | DEBUG_INIT | DEBUG_INFO,
- "Removed: gEfiComponentNameProtocolGuid from 0x%08x\r\n",
- ImageHandle ));
- DEBUG (( DEBUG_POOL | DEBUG_INIT | DEBUG_INFO,
- "Removed: gEfiDriverBindingProtocolGuid from 0x%08x\r\n",
- ImageHandle ));
- }
-
- //
- // Return the unload status
- //
- return Status;
-}
-
-
-/**
-Ax88772 driver entry point.
-
-@param [in] ImageHandle Handle for the image.
-@param [in] pSystemTable Address of the system table.
-
-@retval EFI_SUCCESS Image successfully loaded.
-
-**/
-EFI_STATUS
-EFIAPI
-EntryPoint (
- IN EFI_HANDLE ImageHandle,
- IN EFI_SYSTEM_TABLE * pSystemTable
- )
-{
- EFI_STATUS Status;
-
- DBG_ENTER ( );
-
- //
- // Add the driver to the list of drivers
- //
- Status = EfiLibInstallDriverBindingComponentName2 (
- ImageHandle,
- pSystemTable,
- &gDriverBinding,
- ImageHandle,
- &gComponentName,
- &gComponentName2
- );
- ASSERT_EFI_ERROR (Status);
- if ( !EFI_ERROR ( Status )) {
- DEBUG (( DEBUG_POOL | DEBUG_INIT | DEBUG_INFO,
- "Installed: gEfiDriverBindingProtocolGuid on 0x%08x\r\n",
- ImageHandle ));
- DEBUG (( DEBUG_POOL | DEBUG_INIT | DEBUG_INFO,
- "Installed: gEfiComponentNameProtocolGuid on 0x%08x\r\n",
- ImageHandle ));
- DEBUG (( DEBUG_POOL | DEBUG_INIT | DEBUG_INFO,
- "Installed: gEfiComponentName2ProtocolGuid on 0x%08x\r\n",
- ImageHandle ));
- }
- DBG_EXIT_STATUS ( Status );
- return Status;
-}
diff --git a/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772/SimpleNetwork.c b/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772/SimpleNetwork.c
deleted file mode 100644
index 0105d04..0000000
--- a/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772/SimpleNetwork.c
+++ /dev/null
@@ -1,1503 +0,0 @@
-/** @file
- Provides the Simple Network functions.
-
- Copyright (c) 2011 - 2016, Intel Corporation. All rights reserved.<BR>
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include "Ax88772.h"
-
-/**
- This function updates the filtering on the receiver.
-
- This support routine calls ::Ax88772MacAddressSet to update
- the MAC address. This routine then rebuilds the multicast
- hash by calling ::Ax88772MulticastClear and ::Ax88772MulticastSet.
- Finally this routine enables the receiver by calling
- ::Ax88772RxControl.
-
- @param [in] pSimpleNetwork Simple network mode pointer
-
- @retval EFI_SUCCESS This operation was successful.
- @retval EFI_NOT_STARTED The network interface was not started.
- @retval EFI_INVALID_PARAMETER pSimpleNetwork parameter was NULL or did not point to a valid
- EFI_SIMPLE_NETWORK_PROTOCOL structure.
- @retval EFI_DEVICE_ERROR The command could not be sent to the network interface.
- @retval EFI_UNSUPPORTED The increased buffer size feature is not supported.
-
-**/
-EFI_STATUS
-ReceiveFilterUpdate (
- IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork
- )
-{
- EFI_SIMPLE_NETWORK_MODE * pMode;
- NIC_DEVICE * pNicDevice;
- EFI_STATUS Status;
- UINT32 Index;
-
- DBG_ENTER ( );
-
- //
- // Set the MAC address
- //
- pNicDevice = DEV_FROM_SIMPLE_NETWORK ( pSimpleNetwork );
- pMode = pSimpleNetwork->Mode;
- Status = Ax88772MacAddressSet ( pNicDevice,
- &pMode->CurrentAddress.Addr[0]);
- if ( !EFI_ERROR ( Status )) {
- //
- // Clear the multicast hash table
- //
- Ax88772MulticastClear ( pNicDevice );
-
- //
- // Load the multicast hash table
- //
- if ( 0 != ( pMode->ReceiveFilterSetting & EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST )) {
- for ( Index = 0;
- ( !EFI_ERROR ( Status )) && ( Index < pMode->MCastFilterCount );
- Index++ ) {
- //
- // Enable the next multicast address
- //
- Ax88772MulticastSet ( pNicDevice,
- &pMode->MCastFilter[ Index ].Addr[0]);
- }
- }
-
- //
- // Enable the receiver
- //
- if ( !EFI_ERROR ( Status )) {
- Status = Ax88772RxControl ( pNicDevice, pMode->ReceiveFilterSetting );
- }
- }
-
- //
- // Return the operation status
- //
- DBG_EXIT_STATUS ( Status );
- return Status;
-}
-
-
-/**
- This function updates the SNP driver status.
-
- This function gets the current interrupt and recycled transmit
- buffer status from the network interface. The interrupt status
- and the media status are returned as a bit mask in InterruptStatus.
- If InterruptStatus is NULL, the interrupt status will not be read.
- Upon successful return of the media status, the MediaPresent field
- of EFI_SIMPLE_NETWORK_MODE will be updated to reflect any change
- of media status. If TxBuf is not NULL, a recycled transmit buffer
- address will be retrived. If a recycled transmit buffer address
- is returned in TxBuf, then the buffer has been successfully
- transmitted, and the status for that buffer is cleared.
-
- This function calls ::Ax88772Rx to update the media status and
- queue any receive packets.
-
- @param [in] pSimpleNetwork Protocol instance pointer
- @param [in] pInterruptStatus A pointer to the bit mask of the current active interrupts.
- If this is NULL, the interrupt status will not be read from
- the device. If this is not NULL, the interrupt status will
- be read from teh device. When the interrupt status is read,
- it will also be cleared. Clearing the transmit interrupt
- does not empty the recycled transmit buffer array.
- @param [out] ppTxBuf Recycled transmit buffer address. The network interface will
- not transmit if its internal recycled transmit buffer array is
- full. Reading the transmit buffer does not clear the transmit
- interrupt. If this is NULL, then the transmit buffer status
- will not be read. If there are not transmit buffers to recycle
- and TxBuf is not NULL, *TxBuf will be set to NULL.
-
- @retval EFI_SUCCESS This operation was successful.
- @retval EFI_NOT_STARTED The network interface was not started.
- @retval EFI_INVALID_PARAMETER pSimpleNetwork parameter was NULL or did not point to a valid
- EFI_SIMPLE_NETWORK_PROTOCOL structure.
- @retval EFI_DEVICE_ERROR The command could not be sent to the network interface.
-
-**/
-EFI_STATUS
-EFIAPI
-SN_GetStatus (
- IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork,
- OUT UINT32 * pInterruptStatus,
- OUT VOID ** ppTxBuf
- )
-{
- BOOLEAN bLinkIdle;
- EFI_SIMPLE_NETWORK_MODE * pMode;
- NIC_DEVICE * pNicDevice;
- EFI_STATUS Status;
- EFI_TPL TplPrevious;
-
- DBG_ENTER ( );
-
- //
- // Verify the parameters
- //
- if (( NULL != pSimpleNetwork ) && ( NULL != pSimpleNetwork->Mode )) {
- //
- // Return the transmit buffer
- //
- pNicDevice = DEV_FROM_SIMPLE_NETWORK ( pSimpleNetwork );
- if (( NULL != ppTxBuf ) && ( NULL != pNicDevice->pTxBuffer )) {
- *ppTxBuf = pNicDevice->pTxBuffer;
- pNicDevice->pTxBuffer = NULL;
- }
-
- //
- // Determine if interface is running
- //
- pMode = pSimpleNetwork->Mode;
- if ( EfiSimpleNetworkStopped != pMode->State ) {
- //
- // Synchronize with Ax88772Timer
- //
- VERIFY_TPL ( TPL_AX88772 );
- TplPrevious = gBS->RaiseTPL ( TPL_AX88772 );
-
- //
- // Update the link status
- //
- bLinkIdle = pNicDevice->bLinkIdle;
- pNicDevice->bLinkIdle = TRUE;
- Ax88772Rx ( pNicDevice, bLinkIdle );
- pMode->MediaPresent = pNicDevice->bLinkUp;
-
- //
- // Release the synchronization with Ax88772Timer
- //
- gBS->RestoreTPL ( TplPrevious );
-
- //
- // Return the interrupt status
- //
- if ( NULL != pInterruptStatus ) {
- *pInterruptStatus = 0;
- }
- Status = EFI_SUCCESS;
- }
- else {
- Status = EFI_NOT_STARTED;
- }
- }
- else {
- Status = EFI_INVALID_PARAMETER;
- }
-
- //
- // Return the operation status
- //
- DBG_EXIT_STATUS ( Status );
- return Status;
-}
-
-
-/**
- Resets the network adapter and allocates the transmit and receive buffers
- required by the network interface; optionally, also requests allocation of
- additional transmit and receive buffers. This routine must be called before
- any other routine in the Simple Network protocol is called.
-
- @param [in] pSimpleNetwork Protocol instance pointer
- @param [in] ExtraRxBufferSize Size in bytes to add to the receive buffer allocation
- @param [in] ExtraTxBufferSize Size in bytes to add to the transmit buffer allocation
-
- @retval EFI_SUCCESS This operation was successful.
- @retval EFI_NOT_STARTED The network interface was not started.
- @retval EFI_OUT_OF_RESOURCES There was not enough memory for the transmit and receive buffers
- @retval EFI_INVALID_PARAMETER pSimpleNetwork parameter was NULL or did not point to a valid
- EFI_SIMPLE_NETWORK_PROTOCOL structure.
- @retval EFI_DEVICE_ERROR The command could not be sent to the network interface.
- @retval EFI_UNSUPPORTED The increased buffer size feature is not supported.
-
-**/
-EFI_STATUS
-EFIAPI
-SN_Initialize (
- IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork,
- IN UINTN ExtraRxBufferSize,
- IN UINTN ExtraTxBufferSize
- )
-{
- EFI_SIMPLE_NETWORK_MODE * pMode;
- EFI_STATUS Status;
-
- DBG_ENTER ( );
-
- //
- // Verify the parameters
- //
- if (( NULL != pSimpleNetwork ) && ( NULL != pSimpleNetwork->Mode )) {
- //
- // Determine if the interface is already started
- //
- pMode = pSimpleNetwork->Mode;
- if ( EfiSimpleNetworkStarted == pMode->State ) {
- if (( 0 == ExtraRxBufferSize ) && ( 0 == ExtraTxBufferSize )) {
- //
- // Start the adapter
- //
- Status = SN_Reset ( pSimpleNetwork, FALSE );
- if ( !EFI_ERROR ( Status )) {
- //
- // Update the network state
- //
- pMode->State = EfiSimpleNetworkInitialized;
- }
- }
- else {
- Status = EFI_UNSUPPORTED;
- }
- }
- else {
- Status = EFI_NOT_STARTED;
- }
- }
- else {
- Status = EFI_INVALID_PARAMETER;
- }
-
- //
- // Return the operation status
- //
- DBG_EXIT_STATUS ( Status );
- return Status;
-}
-
-
-/**
- This function converts a multicast IP address to a multicast HW MAC address
- for all packet transactions.
-
- @param [in] pSimpleNetwork Protocol instance pointer
- @param [in] bIPv6 Set to TRUE if the multicast IP address is IPv6 [RFC2460].
- Set to FALSE if the multicast IP address is IPv4 [RFC 791].
- @param [in] pIP The multicast IP address that is to be converted to a
- multicast HW MAC address.
- @param [in] pMAC The multicast HW MAC address that is to be generated from IP.
-
- @retval EFI_SUCCESS This operation was successful.
- @retval EFI_NOT_STARTED The network interface was not started.
- @retval EFI_INVALID_PARAMETER pSimpleNetwork parameter was NULL or did not point to a valid
- EFI_SIMPLE_NETWORK_PROTOCOL structure.
- @retval EFI_DEVICE_ERROR The command could not be sent to the network interface.
- @retval EFI_UNSUPPORTED The increased buffer size feature is not supported.
-
-**/
-EFI_STATUS
-EFIAPI
-SN_MCastIPtoMAC (
- IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork,
- IN BOOLEAN bIPv6,
- IN EFI_IP_ADDRESS * pIP,
- IN EFI_MAC_ADDRESS * pMAC
- )
-{
- EFI_STATUS Status;
-
- DBG_ENTER ( );
-
- //
- // This is not currently supported
- //
- Status = EFI_UNSUPPORTED;
-
- //
- // Return the operation status
- //
- DBG_EXIT_STATUS ( Status );
- return Status;
-}
-
-
-/**
- This function performs read and write operations on the NVRAM device
- attached to a network interface.
-
- @param [in] pSimpleNetwork Protocol instance pointer
- @param [in] ReadWrite TRUE for read operations, FALSE for write operations.
- @param [in] Offset Byte offset in the NVRAM device at which to start the
- read or write operation. This must be a multiple of
- NvRamAccessSize and less than NvRamSize.
- @param [in] BufferSize The number of bytes to read or write from the NVRAM device.
- This must also be a multiple of NvramAccessSize.
- @param [in, out] pBuffer A pointer to the data buffer.
-
- @retval EFI_SUCCESS This operation was successful.
- @retval EFI_NOT_STARTED The network interface was not started.
- @retval EFI_INVALID_PARAMETER pSimpleNetwork parameter was NULL or did not point to a valid
- EFI_SIMPLE_NETWORK_PROTOCOL structure.
- @retval EFI_DEVICE_ERROR The command could not be sent to the network interface.
- @retval EFI_UNSUPPORTED The increased buffer size feature is not supported.
-
-**/
-EFI_STATUS
-EFIAPI
-SN_NvData (
- IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork,
- IN BOOLEAN ReadWrite,
- IN UINTN Offset,
- IN UINTN BufferSize,
- IN OUT VOID * pBuffer
- )
-{
- EFI_STATUS Status;
-
- DBG_ENTER ( );
-
- //
- // This is not currently supported
- //
- Status = EFI_UNSUPPORTED;
-
- //
- // Return the operation status
- //
- DBG_EXIT_STATUS ( Status );
- return Status;
-}
-
-
-/**
- Attempt to receive a packet from the network adapter.
-
- This function retrieves one packet from the receive queue of the network
- interface. If there are no packets on the receive queue, then EFI_NOT_READY
- will be returned. If there is a packet on the receive queue, and the size
- of the packet is smaller than BufferSize, then the contents of the packet
- will be placed in Buffer, and BufferSize will be udpated with the actual
- size of the packet. In addition, if SrcAddr, DestAddr, and Protocol are
- not NULL, then these values will be extracted from the media header and
- returned. If BufferSize is smaller than the received packet, then the
- size of the receive packet will be placed in BufferSize and
- EFI_BUFFER_TOO_SMALL will be returned.
-
- This routine calls ::Ax88772Rx to update the media status and
- empty the network adapter of receive packets.
-
- @param [in] pSimpleNetwork Protocol instance pointer
- @param [out] pHeaderSize The size, in bytes, of the media header to be filled in by
- the Transmit() function. If HeaderSize is non-zero, then
- it must be equal to SimpleNetwork->Mode->MediaHeaderSize
- and DestAddr and Protocol parameters must not be NULL.
- @param [out] pBufferSize The size, in bytes, of the entire packet (media header and
- data) to be transmitted through the network interface.
- @param [out] pBuffer A pointer to the packet (media header followed by data) to
- to be transmitted. This parameter can not be NULL. If
- HeaderSize is zero, then the media header is Buffer must
- already be filled in by the caller. If HeaderSize is nonzero,
- then the media header will be filled in by the Transmit()
- function.
- @param [out] pSrcAddr The source HW MAC address. If HeaderSize is zero, then
- this parameter is ignored. If HeaderSize is nonzero and
- SrcAddr is NULL, then SimpleNetwork->Mode->CurrentAddress
- is used for the source HW MAC address.
- @param [out] pDestAddr The destination HW MAC address. If HeaderSize is zero, then
- this parameter is ignored.
- @param [out] pProtocol The type of header to build. If HeaderSize is zero, then
- this parameter is ignored.
-
- @retval EFI_SUCCESS This operation was successful.
- @retval EFI_NOT_STARTED The network interface was not started.
- @retval EFI_NOT_READY No packets have been received on the network interface.
- @retval EFI_BUFFER_TOO_SMALL The packet is larger than BufferSize bytes.
- @retval EFI_INVALID_PARAMETER pSimpleNetwork parameter was NULL or did not point to a valid
- EFI_SIMPLE_NETWORK_PROTOCOL structure.
- @retval EFI_DEVICE_ERROR The command could not be sent to the network interface.
-
-**/
-EFI_STATUS
-EFIAPI
-SN_Receive (
- IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork,
- OUT UINTN * pHeaderSize,
- OUT UINTN * pBufferSize,
- OUT VOID * pBuffer,
- OUT EFI_MAC_ADDRESS * pSrcAddr,
- OUT EFI_MAC_ADDRESS * pDestAddr,
- OUT UINT16 * pProtocol
- )
-{
- ETHERNET_HEADER * pHeader;
- EFI_SIMPLE_NETWORK_MODE * pMode;
- NIC_DEVICE * pNicDevice;
- RX_TX_PACKET * pRxPacket;
- EFI_STATUS Status;
- EFI_TPL TplPrevious;
- UINT16 Type;
-
- DBG_ENTER ( );
-
- //
- // Verify the parameters
- //
- if (( NULL != pSimpleNetwork ) && ( NULL != pSimpleNetwork->Mode )) {
- //
- // The interface must be running
- //
- pMode = pSimpleNetwork->Mode;
- if ( EfiSimpleNetworkInitialized == pMode->State ) {
- //
- // Synchronize with Ax88772Timer
- //
- VERIFY_TPL ( TPL_AX88772 );
- TplPrevious = gBS->RaiseTPL ( TPL_AX88772 );
-
- //
- // Update the link status
- //
- pNicDevice = DEV_FROM_SIMPLE_NETWORK ( pSimpleNetwork );
- Ax88772Rx ( pNicDevice, FALSE );
- pMode->MediaPresent = pNicDevice->bLinkUp;
- if ( pMode->MediaPresent ) {
- //
- // Attempt to receive a packet
- //
- pRxPacket = pNicDevice->pRxHead;
- if ( NULL != pRxPacket ) {
- pNicDevice->pRxHead = pRxPacket->pNext;
- if ( NULL == pNicDevice->pRxHead ) {
- pNicDevice->pRxTail = NULL;
- }
-
- //
- // Copy the received packet into the receive buffer
- //
- *pBufferSize = pRxPacket->Length;
- CopyMem ( pBuffer, &pRxPacket->Data[0], pRxPacket->Length );
- pHeader = (ETHERNET_HEADER *) &pRxPacket->Data[0];
- if ( NULL != pHeaderSize ) {
- *pHeaderSize = sizeof ( *pHeader );
- }
- if ( NULL != pDestAddr ) {
- CopyMem ( pDestAddr, &pHeader->dest_addr, PXE_HWADDR_LEN_ETHER );
- }
- if ( NULL != pSrcAddr ) {
- CopyMem ( pSrcAddr, &pHeader->src_addr, PXE_HWADDR_LEN_ETHER );
- }
- if ( NULL != pProtocol ) {
- Type = pHeader->type;
- Type = (UINT16)(( Type >> 8 ) | ( Type << 8 ));
- *pProtocol = Type;
- }
- Status = EFI_SUCCESS;
- }
- else {
- //
- // No receive packets available
- //
- Status = EFI_NOT_READY;
- }
- }
- else {
- //
- // Link no up
- //
- Status = EFI_NOT_READY;
- }
-
- //
- // Release the synchronization with Ax88772Timer
- //
- gBS->RestoreTPL ( TplPrevious );
- }
- else {
- Status = EFI_NOT_STARTED;
- }
- }
- else {
- Status = EFI_INVALID_PARAMETER;
- }
-
- //
- // Return the operation status
- //
- DBG_EXIT_STATUS ( Status );
- return Status;
-}
-
-
-/**
- This function is used to enable and disable the hardware and software receive
- filters for the underlying network device.
-
- The receive filter change is broken down into three steps:
-
- 1. The filter mask bits that are set (ON) in the Enable parameter
- are added to the current receive filter settings.
-
- 2. The filter mask bits that are set (ON) in the Disable parameter
- are subtracted from the updated receive filter settins.
-
- 3. If the resulting filter settigns is not supported by the hardware
- a more liberal setting is selected.
-
- If the same bits are set in the Enable and Disable parameters, then the bits
- in the Disable parameter takes precedence.
-
- If the ResetMCastFilter parameter is TRUE, then the multicast address list
- filter is disabled (irregardless of what other multicast bits are set in
- the enable and Disable parameters). The SNP->Mode->MCastFilterCount field
- is set to zero. The SNP->Mode->MCastFilter contents are undefined.
-
- After enableing or disabling receive filter settings, software should
- verify the new settings by checking the SNP->Mode->ReceeiveFilterSettings,
- SNP->Mode->MCastFilterCount and SNP->Mode->MCastFilter fields.
-
- Note: Some network drivers and/or devices will automatically promote
- receive filter settings if the requested setting can not be honored.
- For example, if a request for four multicast addresses is made and
- the underlying hardware only supports two multicast addresses the
- driver might set the promiscuous or promiscuous multicast receive filters
- instead. The receiving software is responsible for discarding any extra
- packets that get through the hardware receive filters.
-
- If ResetMCastFilter is TRUE, then the multicast receive filter list
- on the network interface will be reset to the default multicast receive
- filter list. If ResetMCastFilter is FALSE, and this network interface
- allows the multicast receive filter list to be modified, then the
- MCastFilterCnt and MCastFilter are used to update the current multicast
- receive filter list. The modified receive filter list settings can be
- found in the MCastFilter field of EFI_SIMPLE_NETWORK_MODE.
-
- This routine calls ::ReceiveFilterUpdate to update the receive
- state in the network adapter.
-
- @param [in] pSimpleNetwork Protocol instance pointer
- @param [in] Enable A bit mask of receive filters to enable on the network interface.
- @param [in] Disable A bit mask of receive filters to disable on the network interface.
- For backward compatibility with EFI 1.1 platforms, the
- EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST bit must be set
- when the ResetMCastFilter parameter is TRUE.
- @param [in] bResetMCastFilter Set to TRUE to reset the contents of the multicast receive
- filters on the network interface to their default values.
- @param [in] MCastFilterCnt Number of multicast HW MAC address in the new MCastFilter list.
- This value must be less than or equal to the MaxMCastFilterCnt
- field of EFI_SIMPLE_NETWORK_MODE. This field is optional if
- ResetMCastFilter is TRUE.
- @param [in] pMCastFilter A pointer to a list of new multicast receive filter HW MAC
- addresses. This list will replace any existing multicast
- HW MAC address list. This field is optional if ResetMCastFilter
- is TRUE.
-
- @retval EFI_SUCCESS This operation was successful.
- @retval EFI_NOT_STARTED The network interface was not started.
- @retval EFI_INVALID_PARAMETER pSimpleNetwork parameter was NULL or did not point to a valid
- EFI_SIMPLE_NETWORK_PROTOCOL structure.
- @retval EFI_DEVICE_ERROR The command could not be sent to the network interface.
- @retval EFI_UNSUPPORTED The increased buffer size feature is not supported.
-
-**/
-EFI_STATUS
-EFIAPI
-SN_ReceiveFilters (
- IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork,
- IN UINT32 Enable,
- IN UINT32 Disable,
- IN BOOLEAN bResetMCastFilter,
- IN UINTN MCastFilterCnt,
- IN EFI_MAC_ADDRESS * pMCastFilter
- )
-{
- EFI_SIMPLE_NETWORK_MODE * pMode;
- EFI_MAC_ADDRESS * pMulticastAddress;
- EFI_MAC_ADDRESS * pTableEnd;
- EFI_STATUS Status;
-
- DBG_ENTER ( );
-
- //
- // Verify the parameters
- //
- Status = EFI_INVALID_PARAMETER;
- if (( NULL != pSimpleNetwork ) && ( NULL != pSimpleNetwork->Mode )) {
- pMode = pSimpleNetwork->Mode;
-
- //
- // Update the multicast list if necessary
- //
- if ( !bResetMCastFilter ) {
- if ( 0 != MCastFilterCnt ) {
- if (( MAX_MCAST_FILTER_CNT >= MCastFilterCnt )
- && ( NULL != pMCastFilter )) {
- //
- // Verify the multicast addresses
- //
- pMulticastAddress = pMCastFilter;
- pTableEnd = pMulticastAddress + MCastFilterCnt;
- while ( pTableEnd > pMulticastAddress ) {
- //
- // The first digit of the multicast address must have the LSB set
- //
- if ( 0 == ( pMulticastAddress->Addr[0] & 1 )) {
- //
- // Invalid multicast address
- //
- break;
- }
- pMulticastAddress += 1;
- }
- if ( pTableEnd == pMulticastAddress ) {
- //
- // Update the multicast filter list.
- //
- CopyMem (&pMode->MCastFilter[0],
- pMCastFilter,
- MCastFilterCnt * sizeof ( *pMCastFilter ));
- Status = EFI_SUCCESS;
- }
- }
- }
- else {
- Status = EFI_SUCCESS;
- }
- }
- else {
- //
- // No multicast address list is specified
- //
- MCastFilterCnt = 0;
- Status = EFI_SUCCESS;
- }
- if ( !EFI_ERROR ( Status )) {
- //
- // The parameters are valid!
- //
- pMode->ReceiveFilterSetting |= Enable;
- pMode->ReceiveFilterSetting &= ~Disable;
- pMode->MCastFilterCount = (UINT32)MCastFilterCnt;
-
- //
- // Update the receive filters in the adapter
- //
- Status = ReceiveFilterUpdate ( pSimpleNetwork );
- }
- }
-
- //
- // Return the operation status
- //
- DBG_EXIT_STATUS ( Status );
- return Status;
-}
-
-
-/**
- Reset the network adapter.
-
- Resets a network adapter and reinitializes it with the parameters that
- were provided in the previous call to Initialize (). The transmit and
- receive queues are cleared. Receive filters, the station address, the
- statistics, and the multicast-IP-to-HW MAC addresses are not reset by
- this call.
-
- This routine calls ::Ax88772Reset to perform the adapter specific
- reset operation. This routine also starts the link negotiation
- by calling ::Ax88772NegotiateLinkStart.
-
- @param [in] pSimpleNetwork Protocol instance pointer
- @param [in] bExtendedVerification Indicates that the driver may perform a more
- exhaustive verification operation of the device
- during reset.
-
- @retval EFI_SUCCESS This operation was successful.
- @retval EFI_NOT_STARTED The network interface was not started.
- @retval EFI_INVALID_PARAMETER pSimpleNetwork parameter was NULL or did not point to a valid
- EFI_SIMPLE_NETWORK_PROTOCOL structure.
- @retval EFI_DEVICE_ERROR The command could not be sent to the network interface.
- @retval EFI_UNSUPPORTED The increased buffer size feature is not supported.
-
-**/
-EFI_STATUS
-EFIAPI
-SN_Reset (
- IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork,
- IN BOOLEAN bExtendedVerification
- )
-{
- EFI_SIMPLE_NETWORK_MODE * pMode;
- NIC_DEVICE * pNicDevice;
- RX_TX_PACKET * pRxPacket;
- EFI_STATUS Status;
- EFI_TPL TplPrevious;
-
- DBG_ENTER ( );
-
- //
- // Verify the parameters
- //
- if (( NULL != pSimpleNetwork ) && ( NULL != pSimpleNetwork->Mode )) {
- //
- // Synchronize with Ax88772Timer
- //
- VERIFY_TPL ( TPL_AX88772 );
- TplPrevious = gBS->RaiseTPL ( TPL_AX88772 );
-
- //
- // Update the device state
- //
- pNicDevice = DEV_FROM_SIMPLE_NETWORK ( pSimpleNetwork );
- pNicDevice->bComplete = FALSE;
- pNicDevice->bLinkUp = FALSE;
-
- pMode = pSimpleNetwork->Mode;
- pMode->MediaPresent = FALSE;
-
- //
- // Discard any received packets
- //
- while ( NULL != pNicDevice->pRxHead ) {
- //
- // Remove the packet from the received packet list
- //
- pRxPacket = pNicDevice->pRxHead;
- pNicDevice->pRxHead = pRxPacket->pNext;
-
- //
- // Queue the packet to the free list
- //
- pRxPacket->pNext = pNicDevice->pRxFree;
- pNicDevice->pRxFree = pRxPacket;
- }
- pNicDevice->pRxTail = NULL;
-
- //
- // Reset the device
- //
- Status = Ax88772Reset ( pNicDevice );
- if ( !EFI_ERROR ( Status )) {
- //
- // Update the receive filters in the adapter
- //
- Status = ReceiveFilterUpdate ( pSimpleNetwork );
-
- //
- // Try to get a connection to the network
- //
- if ( !EFI_ERROR ( Status )) {
- //
- // Start the autonegotiation
- //
- Status = Ax88772NegotiateLinkStart ( pNicDevice );
- }
- }
-
- //
- // Release the synchronization with Ax88772Timer
- //
- gBS->RestoreTPL ( TplPrevious );
- }
- else {
- Status = EFI_INVALID_PARAMETER;
- }
-
- //
- // Return the operation status
- //
- DBG_EXIT_STATUS ( Status );
- return Status;
-}
-
-
-/**
- Initialize the simple network protocol.
-
- This routine calls ::Ax88772MacAddressGet to obtain the
- MAC address.
-
- @param [in] pNicDevice NIC_DEVICE_INSTANCE pointer
-
- @retval EFI_SUCCESS Setup was successful
-
-**/
-EFI_STATUS
-SN_Setup (
- IN NIC_DEVICE * pNicDevice
- )
-{
- EFI_SIMPLE_NETWORK_MODE * pMode;
- EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork;
- EFI_STATUS Status;
-
- DBG_ENTER ( );
-
- //
- // Initialize the simple network protocol
- //
- pSimpleNetwork = &pNicDevice->SimpleNetwork;
- pSimpleNetwork->Revision = EFI_SIMPLE_NETWORK_PROTOCOL_REVISION;
- pSimpleNetwork->Start = (EFI_SIMPLE_NETWORK_START)SN_Start;
- pSimpleNetwork->Stop = (EFI_SIMPLE_NETWORK_STOP)SN_Stop;
- pSimpleNetwork->Initialize = (EFI_SIMPLE_NETWORK_INITIALIZE)SN_Initialize;
- pSimpleNetwork->Reset = (EFI_SIMPLE_NETWORK_RESET)SN_Reset;
- pSimpleNetwork->Shutdown = (EFI_SIMPLE_NETWORK_SHUTDOWN)SN_Shutdown;
- pSimpleNetwork->ReceiveFilters = (EFI_SIMPLE_NETWORK_RECEIVE_FILTERS)SN_ReceiveFilters;
- pSimpleNetwork->StationAddress = (EFI_SIMPLE_NETWORK_STATION_ADDRESS)SN_StationAddress;
- pSimpleNetwork->Statistics = (EFI_SIMPLE_NETWORK_STATISTICS)SN_Statistics;
- pSimpleNetwork->MCastIpToMac = (EFI_SIMPLE_NETWORK_MCAST_IP_TO_MAC)SN_MCastIPtoMAC;
- pSimpleNetwork->NvData = (EFI_SIMPLE_NETWORK_NVDATA)SN_NvData;
- pSimpleNetwork->GetStatus = (EFI_SIMPLE_NETWORK_GET_STATUS)SN_GetStatus;
- pSimpleNetwork->Transmit = (EFI_SIMPLE_NETWORK_TRANSMIT)SN_Transmit;
- pSimpleNetwork->Receive = (EFI_SIMPLE_NETWORK_RECEIVE)SN_Receive;
- pSimpleNetwork->WaitForPacket = NULL;
- pMode = &pNicDevice->SimpleNetworkData;
- pSimpleNetwork->Mode = pMode;
-
- pMode->State = EfiSimpleNetworkStopped;
- pMode->HwAddressSize = PXE_HWADDR_LEN_ETHER;
- pMode->MediaHeaderSize = sizeof ( ETHERNET_HEADER );
- pMode->MaxPacketSize = MAX_ETHERNET_PKT_SIZE;
- pMode->NvRamSize = 0;
- pMode->NvRamAccessSize = 0;
- pMode->ReceiveFilterMask = EFI_SIMPLE_NETWORK_RECEIVE_UNICAST
- | EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST
- | EFI_SIMPLE_NETWORK_RECEIVE_BROADCAST
- | EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS
- | EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS_MULTICAST;
- pMode->ReceiveFilterSetting = EFI_SIMPLE_NETWORK_RECEIVE_UNICAST
- | EFI_SIMPLE_NETWORK_RECEIVE_BROADCAST;
- pMode->MaxMCastFilterCount = MAX_MCAST_FILTER_CNT;
- pMode->MCastFilterCount = 0;
- SetMem ( &pMode->BroadcastAddress,
- PXE_HWADDR_LEN_ETHER,
- 0xff );
- pMode->IfType = EfiNetworkInterfaceUndi;
- pMode->MacAddressChangeable = TRUE;
- pMode->MultipleTxSupported = TRUE;
- pMode->MediaPresentSupported = TRUE;
- pMode->MediaPresent = FALSE;
-
- //
- // Read the MAC address
- //
- 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]);
- if ( !EFI_ERROR ( Status )) {
- //
- // Display the MAC address
- //
- DEBUG (( DEBUG_MAC_ADDRESS | DEBUG_INFO,
- "MAC: %02x-%02x-%02x-%02x-%02x-%02x\n",
- pMode->PermanentAddress.Addr[0],
- pMode->PermanentAddress.Addr[1],
- pMode->PermanentAddress.Addr[2],
- pMode->PermanentAddress.Addr[3],
- pMode->PermanentAddress.Addr[4],
- pMode->PermanentAddress.Addr[5]));
-
- //
- // Use the hardware address as the current address
- //
- CopyMem ( &pMode->CurrentAddress,
- &pMode->PermanentAddress,
- PXE_HWADDR_LEN_ETHER );
- }
-
- //
- // Return the setup status
- //
- DBG_EXIT_STATUS ( Status );
- return Status;
-}
-
-
-/**
- This routine starts the network interface.
-
- @param [in] pSimpleNetwork Protocol instance pointer
-
- @retval EFI_SUCCESS This operation was successful.
- @retval EFI_ALREADY_STARTED The network interface was already started.
- @retval EFI_INVALID_PARAMETER pSimpleNetwork parameter was NULL or did not point to a valid
- EFI_SIMPLE_NETWORK_PROTOCOL structure.
- @retval EFI_DEVICE_ERROR The command could not be sent to the network interface.
- @retval EFI_UNSUPPORTED The increased buffer size feature is not supported.
-
-**/
-EFI_STATUS
-EFIAPI
-SN_Start (
- IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork
- )
-{
- NIC_DEVICE * pNicDevice;
- EFI_SIMPLE_NETWORK_MODE * pMode;
- EFI_STATUS Status;
-
- DBG_ENTER ( );
-
- //
- // Verify the parameters
- //
- Status = EFI_INVALID_PARAMETER;
- if (( NULL != pSimpleNetwork ) && ( NULL != pSimpleNetwork->Mode )) {
- pMode = pSimpleNetwork->Mode;
- if ( EfiSimpleNetworkStopped == pMode->State ) {
- //
- // Initialize the mode structure
- // NVRAM access is not supported
- //
- ZeroMem ( pMode, sizeof ( *pMode ));
-
- pMode->State = EfiSimpleNetworkStarted;
- pMode->HwAddressSize = PXE_HWADDR_LEN_ETHER;
- pMode->MediaHeaderSize = sizeof ( ETHERNET_HEADER );
- pMode->MaxPacketSize = MAX_ETHERNET_PKT_SIZE;
- pMode->ReceiveFilterMask = EFI_SIMPLE_NETWORK_RECEIVE_UNICAST
- | EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST
- | EFI_SIMPLE_NETWORK_RECEIVE_BROADCAST
- | EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS
- | EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS_MULTICAST;
- pMode->ReceiveFilterSetting = EFI_SIMPLE_NETWORK_RECEIVE_UNICAST;
- pMode->MaxMCastFilterCount = MAX_MCAST_FILTER_CNT;
- pNicDevice = DEV_FROM_SIMPLE_NETWORK ( pSimpleNetwork );
- Status = Ax88772MacAddressGet ( pNicDevice, &pMode->PermanentAddress.Addr[0]);
- CopyMem ( &pMode->CurrentAddress,
- &pMode->PermanentAddress,
- sizeof ( pMode->CurrentAddress ));
- pMode->BroadcastAddress.Addr[0] = 0xff;
- pMode->BroadcastAddress.Addr[1] = 0xff;
- pMode->BroadcastAddress.Addr[2] = 0xff;
- pMode->BroadcastAddress.Addr[3] = 0xff;
- pMode->BroadcastAddress.Addr[4] = 0xff;
- pMode->BroadcastAddress.Addr[5] = 0xff;
- pMode->IfType = 1;
- pMode->MacAddressChangeable = TRUE;
- pMode->MultipleTxSupported = TRUE;
- pMode->MediaPresentSupported = TRUE;
- pMode->MediaPresent = FALSE;
- }
- else {
- Status = EFI_ALREADY_STARTED;
- }
- }
-
- //
- // Return the operation status
- //
- DBG_EXIT_STATUS ( Status );
- return Status;
-}
-
-
-/**
- Set the MAC address.
-
- This function modifies or resets the current station address of a
- network interface. If Reset is TRUE, then the current station address
- is set ot the network interface's permanent address. If Reset if FALSE
- then the current station address is changed to the address specified by
- pNew.
-
- This routine calls ::Ax88772MacAddressSet to update the MAC address
- in the network adapter.
-
- @param [in] pSimpleNetwork Protocol instance pointer
- @param [in] bReset Flag used to reset the station address to the
- network interface's permanent address.
- @param [in] pNew New station address to be used for the network
- interface.
-
- @retval EFI_SUCCESS This operation was successful.
- @retval EFI_NOT_STARTED The network interface was not started.
- @retval EFI_INVALID_PARAMETER pSimpleNetwork parameter was NULL or did not point to a valid
- EFI_SIMPLE_NETWORK_PROTOCOL structure.
- @retval EFI_DEVICE_ERROR The command could not be sent to the network interface.
- @retval EFI_UNSUPPORTED The increased buffer size feature is not supported.
-
-**/
-EFI_STATUS
-EFIAPI
-SN_StationAddress (
- IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork,
- IN BOOLEAN bReset,
- IN EFI_MAC_ADDRESS * pNew
- )
-{
- NIC_DEVICE * pNicDevice;
- EFI_SIMPLE_NETWORK_MODE * pMode;
- EFI_STATUS Status;
-
- DBG_ENTER ( );
-
- //
- // Verify the parameters
- //
- if (( NULL != pSimpleNetwork )
- && ( NULL != pSimpleNetwork->Mode )
- && (( !bReset ) || ( bReset && ( NULL != pNew )))) {
- //
- // Verify that the adapter is already started
- //
- pNicDevice = DEV_FROM_SIMPLE_NETWORK ( pSimpleNetwork );
- pMode = pSimpleNetwork->Mode;
- if ( EfiSimpleNetworkStarted == pMode->State ) {
- //
- // Determine the adapter MAC address
- //
- if ( bReset ) {
- //
- // Use the permanent address
- //
- CopyMem ( &pMode->CurrentAddress,
- &pMode->PermanentAddress,
- sizeof ( pMode->CurrentAddress ));
- }
- else {
- //
- // Use the specified address
- //
- CopyMem ( &pMode->CurrentAddress,
- pNew,
- sizeof ( pMode->CurrentAddress ));
- }
-
- //
- // Update the address on the adapter
- //
- Status = Ax88772MacAddressSet ( pNicDevice, &pMode->CurrentAddress.Addr[0]);
- }
- else {
- Status = EFI_NOT_STARTED;
- }
- }
- else {
- Status = EFI_INVALID_PARAMETER;
- }
-
- //
- // Return the operation status
- //
- DBG_EXIT_STATUS ( Status );
- return Status;
-}
-
-
-/**
- This function resets or collects the statistics on a network interface.
- If the size of the statistics table specified by StatisticsSize is not
- big enough for all of the statistics that are collected by the network
- interface, then a partial buffer of statistics is returned in
- StatisticsTable.
-
- @param [in] pSimpleNetwork Protocol instance pointer
- @param [in] bReset Set to TRUE to reset the statistics for the network interface.
- @param [in, out] pStatisticsSize On input the size, in bytes, of StatisticsTable. On output
- the size, in bytes, of the resulting table of statistics.
- @param [out] pStatisticsTable A pointer to the EFI_NETWORK_STATISTICS structure that
- conains the statistics.
-
- @retval EFI_SUCCESS This operation was successful.
- @retval EFI_NOT_STARTED The network interface was not started.
- @retval EFI_BUFFER_TOO_SMALL The pStatisticsTable is NULL or the buffer is too small.
- @retval EFI_INVALID_PARAMETER pSimpleNetwork parameter was NULL or did not point to a valid
- EFI_SIMPLE_NETWORK_PROTOCOL structure.
- @retval EFI_DEVICE_ERROR The command could not be sent to the network interface.
- @retval EFI_UNSUPPORTED The increased buffer size feature is not supported.
-
-**/
-EFI_STATUS
-EFIAPI
-SN_Statistics (
- IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork,
- IN BOOLEAN bReset,
- IN OUT UINTN * pStatisticsSize,
- OUT EFI_NETWORK_STATISTICS * pStatisticsTable
- )
-{
- EFI_STATUS Status;
-
- DBG_ENTER ( );
-
- //
- // This is not currently supported
- //
- Status = EFI_UNSUPPORTED;
-
- //
- // Return the operation status
- //
- DBG_EXIT_STATUS ( Status );
- return Status;
-}
-
-
-/**
- This function stops a network interface. This call is only valid
- if the network interface is in the started state.
-
- @param [in] pSimpleNetwork Protocol instance pointer
-
- @retval EFI_SUCCESS This operation was successful.
- @retval EFI_NOT_STARTED The network interface was not started.
- @retval EFI_INVALID_PARAMETER pSimpleNetwork parameter was NULL or did not point to a valid
- EFI_SIMPLE_NETWORK_PROTOCOL structure.
- @retval EFI_DEVICE_ERROR The command could not be sent to the network interface.
- @retval EFI_UNSUPPORTED The increased buffer size feature is not supported.
-
-**/
-EFI_STATUS
-EFIAPI
-SN_Stop (
- IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork
- )
-{
- EFI_SIMPLE_NETWORK_MODE * pMode;
- EFI_STATUS Status;
-
- DBG_ENTER ( );
-
- //
- // Verify the parameters
- //
- if (( NULL != pSimpleNetwork ) && ( NULL != pSimpleNetwork->Mode )) {
- //
- // Determine if the interface is started
- //
- pMode = pSimpleNetwork->Mode;
- if ( EfiSimpleNetworkStopped != pMode->State ) {
- if ( EfiSimpleNetworkStarted == pMode->State ) {
- //
- // Release the resources acquired in SN_Start
- //
-
- //
- // Mark the adapter as stopped
- //
- pMode->State = EfiSimpleNetworkStopped;
- Status = EFI_SUCCESS;
- }
- else {
- Status = EFI_UNSUPPORTED;
- }
- }
- else {
- Status = EFI_NOT_STARTED;
- }
- }
- else {
- Status = EFI_INVALID_PARAMETER;
- }
-
- //
- // Return the operation status
- //
- DBG_EXIT_STATUS ( Status );
- return Status;
-}
-
-
-/**
- This function releases the memory buffers assigned in the Initialize() call.
- Pending transmits and receives are lost, and interrupts are cleared and disabled.
- After this call, only Initialize() and Stop() calls may be used.
-
- @param [in] pSimpleNetwork Protocol instance pointer
-
- @retval EFI_SUCCESS This operation was successful.
- @retval EFI_NOT_STARTED The network interface was not started.
- @retval EFI_INVALID_PARAMETER pSimpleNetwork parameter was NULL or did not point to a valid
- EFI_SIMPLE_NETWORK_PROTOCOL structure.
- @retval EFI_DEVICE_ERROR The command could not be sent to the network interface.
- @retval EFI_UNSUPPORTED The increased buffer size feature is not supported.
-
-**/
-EFI_STATUS
-EFIAPI
-SN_Shutdown (
- IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork
- )
-{
- EFI_SIMPLE_NETWORK_MODE * pMode;
- UINT32 RxFilter;
- EFI_STATUS Status;
-
- DBG_ENTER ( );
-
- //
- // Verify the parameters
- //
- if (( NULL != pSimpleNetwork ) && ( NULL != pSimpleNetwork->Mode )) {
- //
- // Determine if the interface is already started
- //
- pMode = pSimpleNetwork->Mode;
- if ( EfiSimpleNetworkInitialized == pMode->State ) {
- //
- // Stop the adapter
- //
- RxFilter = pMode->ReceiveFilterSetting;
- pMode->ReceiveFilterSetting = 0;
- Status = SN_Reset ( pSimpleNetwork, FALSE );
- pMode->ReceiveFilterSetting = RxFilter;
- if ( !EFI_ERROR ( Status )) {
- //
- // Release the resources acquired by SN_Initialize
- //
-
- //
- // Update the network state
- //
- pMode->State = EfiSimpleNetworkStarted;
- }
- }
- else {
- Status = EFI_NOT_STARTED;
- }
- }
- else {
- Status = EFI_INVALID_PARAMETER;
- }
-
- //
- // Return the operation status
- //
- DBG_EXIT_STATUS ( Status );
- return Status;
-}
-
-
-/**
- Send a packet over the network.
-
- This function places the packet specified by Header and Buffer on
- the transmit queue. This function performs a non-blocking transmit
- operation. When the transmit is complete, the buffer is returned
- via the GetStatus() call.
-
- This routine calls ::Ax88772Rx to empty the network adapter of
- receive packets. The routine then passes the transmit packet
- to the network adapter.
-
- @param [in] pSimpleNetwork Protocol instance pointer
- @param [in] HeaderSize The size, in bytes, of the media header to be filled in by
- the Transmit() function. If HeaderSize is non-zero, then
- it must be equal to SimpleNetwork->Mode->MediaHeaderSize
- and DestAddr and Protocol parameters must not be NULL.
- @param [in] BufferSize The size, in bytes, of the entire packet (media header and
- data) to be transmitted through the network interface.
- @param [in] pBuffer A pointer to the packet (media header followed by data) to
- to be transmitted. This parameter can not be NULL. If
- HeaderSize is zero, then the media header is Buffer must
- already be filled in by the caller. If HeaderSize is nonzero,
- then the media header will be filled in by the Transmit()
- function.
- @param [in] pSrcAddr The source HW MAC address. If HeaderSize is zero, then
- this parameter is ignored. If HeaderSize is nonzero and
- SrcAddr is NULL, then SimpleNetwork->Mode->CurrentAddress
- is used for the source HW MAC address.
- @param [in] pDestAddr The destination HW MAC address. If HeaderSize is zero, then
- this parameter is ignored.
- @param [in] pProtocol The type of header to build. If HeaderSize is zero, then
- this parameter is ignored.
-
- @retval EFI_SUCCESS This operation was successful.
- @retval EFI_NOT_STARTED The network interface was not started.
- @retval EFI_NOT_READY The network interface is too busy to accept this transmit request.
- @retval EFI_BUFFER_TOO_SMALL The BufferSize parameter is too small.
- @retval EFI_INVALID_PARAMETER pSimpleNetwork parameter was NULL or did not point to a valid
- EFI_SIMPLE_NETWORK_PROTOCOL structure.
- @retval EFI_DEVICE_ERROR The command could not be sent to the network interface.
-
-**/
-EFI_STATUS
-EFIAPI
-SN_Transmit (
- IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork,
- IN UINTN HeaderSize,
- IN UINTN BufferSize,
- IN VOID * pBuffer,
- IN EFI_MAC_ADDRESS * pSrcAddr,
- IN EFI_MAC_ADDRESS * pDestAddr,
- IN UINT16 * pProtocol
- )
-{
- RX_TX_PACKET Packet;
- ETHERNET_HEADER * pHeader;
- EFI_SIMPLE_NETWORK_MODE * pMode;
- NIC_DEVICE * pNicDevice;
- EFI_USB_IO_PROTOCOL * pUsbIo;
- EFI_STATUS Status;
- EFI_TPL TplPrevious;
- UINTN TransferLength;
- UINT32 TransferStatus;
- UINT16 Type;
-
- DBG_ENTER ( );
-
- //
- // Verify the parameters
- //
- if (( NULL != pSimpleNetwork ) && ( NULL != pSimpleNetwork->Mode )) {
- //
- // The interface must be running
- //
- pMode = pSimpleNetwork->Mode;
- if ( EfiSimpleNetworkInitialized == pMode->State ) {
- //
- // Synchronize with Ax88772Timer
- //
- VERIFY_TPL ( TPL_AX88772 );
- TplPrevious = gBS->RaiseTPL ( TPL_AX88772 );
-
- //
- // Update the link status
- //
- pNicDevice = DEV_FROM_SIMPLE_NETWORK ( pSimpleNetwork );
-
- //
- //No need to call receive to receive packet
- //
- //Ax88772Rx ( pNicDevice, FALSE );
- pMode->MediaPresent = pNicDevice->bLinkUp;
-
- //
- // Release the synchronization with Ax88772Timer
- //
- gBS->RestoreTPL ( TplPrevious );
- if ( pMode->MediaPresent ) {
- //
- // Copy the packet into the USB buffer
- //
- CopyMem ( &Packet.Data[0], pBuffer, BufferSize );
- Packet.Length = (UINT16) BufferSize;
-
- //
- // Transmit the packet
- //
- pHeader = (ETHERNET_HEADER *) &Packet.Data[0];
- if ( 0 != HeaderSize ) {
- if ( NULL != pDestAddr ) {
- CopyMem ( &pHeader->dest_addr, pDestAddr, PXE_HWADDR_LEN_ETHER );
- }
- if ( NULL != pSrcAddr ) {
- CopyMem ( &pHeader->src_addr, pSrcAddr, PXE_HWADDR_LEN_ETHER );
- }
- else {
- CopyMem ( &pHeader->src_addr, &pMode->CurrentAddress.Addr[0], PXE_HWADDR_LEN_ETHER );
- }
- if ( NULL != pProtocol ) {
- Type = *pProtocol;
- }
- else {
- Type = Packet.Length;
- }
- Type = (UINT16)(( Type >> 8 ) | ( Type << 8 ));
- pHeader->type = Type;
- }
- if ( Packet.Length < MIN_ETHERNET_PKT_SIZE ) {
- Packet.Length = MIN_ETHERNET_PKT_SIZE;
- ZeroMem ( &Packet.Data[ BufferSize ],
- Packet.Length - BufferSize );
- }
- DEBUG (( DEBUG_TX | DEBUG_INFO,
- "TX: %02x-%02x-%02x-%02x-%02x-%02x %02x-%02x-%02x-%02x-%02x-%02x %02x-%02x %d bytes\r\n",
- Packet.Data[0],
- Packet.Data[1],
- Packet.Data[2],
- Packet.Data[3],
- Packet.Data[4],
- Packet.Data[5],
- Packet.Data[6],
- Packet.Data[7],
- Packet.Data[8],
- Packet.Data[9],
- Packet.Data[10],
- Packet.Data[11],
- Packet.Data[12],
- Packet.Data[13],
- Packet.Length ));
- Packet.LengthBar = ~Packet.Length;
- TransferLength = sizeof ( Packet.Length )
- + sizeof ( Packet.LengthBar )
- + Packet.Length;
-
- //
- // Work around USB bus driver bug where a timeout set by receive
- // succeeds but the timeout expires immediately after, causing the
- // transmit operation to timeout.
- //
- pUsbIo = pNicDevice->pUsbIo;
- Status = pUsbIo->UsbBulkTransfer ( pUsbIo,
- BULK_OUT_ENDPOINT,
- &Packet.Length,
- &TransferLength,
- 0xfffffffe,
- &TransferStatus );
- if ( !EFI_ERROR ( Status )) {
- Status = TransferStatus;
- }
- if (( !EFI_ERROR ( Status ))
- && ( TransferLength != (UINTN)( Packet.Length + 4 ))) {
- Status = EFI_WARN_WRITE_FAILURE;
- }
- if ( EFI_SUCCESS == Status ) {
- pNicDevice->pTxBuffer = pBuffer;
- }
- else {
- DEBUG (( DEBUG_ERROR | DEBUG_INFO,
- "Ax88772 USB transmit error, TransferLength: %d, Status: %r\r\n",
- sizeof ( Packet.Length ) + Packet.Length,
- Status ));
- //
- // Reset the controller to fix the error
- //
- if ( EFI_DEVICE_ERROR == Status ) {
- SN_Reset ( pSimpleNetwork, FALSE );
- }
- }
- }
- else {
- //
- // No packets available.
- //
- Status = EFI_NOT_READY;
- }
- }
- else {
- Status = EFI_NOT_STARTED;
- }
- }
- else {
- DEBUG (( DEBUG_ERROR | DEBUG_INFO,
- "Ax88772 invalid transmit parameter\r\n"
- " 0x%08x: HeaderSize\r\n"
- " 0x%08x: BufferSize\r\n"
- " 0x%08x: Buffer\r\n"
- " 0x%08x: SrcAddr\r\n"
- " 0x%08x: DestAddr\r\n"
- " 0x%04x: Protocol\r\n",
- HeaderSize,
- BufferSize,
- pBuffer,
- pSrcAddr,
- pDestAddr,
- pProtocol ));
- Status = EFI_INVALID_PARAMETER;
- }
-
- //
- // Return the operation status
- //
- DBG_EXIT_STATUS ( Status );
- return Status;
-}
diff --git a/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772b/Ax88772.c b/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772b/Ax88772.c
deleted file mode 100644
index 12684a6..0000000
--- a/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772b/Ax88772.c
+++ /dev/null
@@ -1,875 +0,0 @@
-/** @file
- Implement the interface to the AX88772 Ethernet controller.
-
- This module implements the interface to the ASIX AX88772
- USB to Ethernet MAC with integrated 10/100 PHY. Note that this implementation
- only supports the integrated PHY since no other test cases were available.
-
- Copyright (c) 2011, Intel Corporation. All rights reserved.
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include "Ax88772.h"
-
-
-/**
- Compute the CRC
-
- @param [in] pMacAddress Address of a six byte buffer to containing the MAC address.
-
- @returns The CRC-32 value associated with this MAC address
-
-**/
-UINT32
-Ax88772Crc (
- IN UINT8 * pMacAddress
- )
-{
- UINT32 BitNumber;
- INT32 Carry;
- INT32 Crc;
- UINT32 Data;
- UINT8 * pEnd;
-
- //
- // Walk the MAC address
- //
- Crc = -1;
- pEnd = &pMacAddress[ PXE_HWADDR_LEN_ETHER ];
- while ( pEnd > pMacAddress ) {
- Data = *pMacAddress++;
- //
- // CRC32: x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1
- //
- // 1 0000 0100 1100 0001 0001 1101 1011 0111
- //
- for ( BitNumber = 0; 8 > BitNumber; BitNumber++ ) {
- Carry = (( Crc >> 31 ) & 1 ) ^ ( Data & 1 );
- Crc <<= 1;
- if ( 0 != Carry ) {
- Crc ^= 0x04c11db7;
- }
- Data >>= 1;
- }
- }
- //
- // Return the CRC value
- //
- return (UINT32) Crc;
-}
-
-
-/**
- Get the MAC address
-
- This routine calls ::Ax88772UsbCommand to request the MAC
- address from the network adapter.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
- @param [out] pMacAddress Address of a six byte buffer to receive the MAC address.
-
- @retval EFI_SUCCESS The MAC address is available.
- @retval other The MAC address is not valid.
-
-**/
-EFI_STATUS
-Ax88772MacAddressGet (
- IN NIC_DEVICE * pNicDevice,
- OUT UINT8 * pMacAddress
- )
-{
- USB_DEVICE_REQUEST SetupMsg;
- EFI_STATUS Status;
-
- //
- // Set the register address.
- //
- SetupMsg.RequestType = USB_ENDPOINT_DIR_IN
- | USB_REQ_TYPE_VENDOR
- | USB_TARGET_DEVICE;
- SetupMsg.Request = CMD_MAC_ADDRESS_READ;
- SetupMsg.Value = 0;
- SetupMsg.Index = 0;
- SetupMsg.Length = PXE_HWADDR_LEN_ETHER;
-
- //
- // Read the PHY register
- //
- Status = Ax88772UsbCommand ( pNicDevice,
- &SetupMsg,
- pMacAddress );
- return Status;
-}
-
-
-/**
- Set the MAC address
-
- This routine calls ::Ax88772UsbCommand to set the MAC address
- in the network adapter.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
- @param [in] pMacAddress Address of a six byte buffer to containing the new MAC address.
-
- @retval EFI_SUCCESS The MAC address was set.
- @retval other The MAC address was not set.
-
-**/
-EFI_STATUS
-Ax88772MacAddressSet (
- IN NIC_DEVICE * pNicDevice,
- IN UINT8 * pMacAddress
- )
-{
- USB_DEVICE_REQUEST SetupMsg;
- EFI_STATUS Status;
-
- //
- // Set the register address.
- //
- SetupMsg.RequestType = USB_REQ_TYPE_VENDOR
- | USB_TARGET_DEVICE;
- SetupMsg.Request = CMD_MAC_ADDRESS_WRITE;
- SetupMsg.Value = 0;
- SetupMsg.Index = 0;
- SetupMsg.Length = PXE_HWADDR_LEN_ETHER;
-
- //
- // Read the PHY register
- //
- Status = Ax88772UsbCommand ( pNicDevice,
- &SetupMsg,
- pMacAddress );
- return Status;
-}
-
-/**
- Clear the multicast hash table
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
-
-**/
-VOID
-Ax88772MulticastClear (
- IN NIC_DEVICE * pNicDevice
- )
-{
- int i = 0;
- //
- // Clear the multicast hash table
- //
- for ( i = 0 ; i < 8 ; i ++ )
- pNicDevice->MulticastHash[0] = 0;
-}
-
-/**
- Enable a multicast address in the multicast hash table
-
- This routine calls ::Ax88772Crc to compute the hash bit for
- this MAC address.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
- @param [in] pMacAddress Address of a six byte buffer to containing the MAC address.
-
-**/
-VOID
-Ax88772MulticastSet (
- IN NIC_DEVICE * pNicDevice,
- IN UINT8 * pMacAddress
- )
-{
- UINT32 Crc;
-
- //
- // Compute the CRC on the destination address
- //
- Crc = Ax88772Crc ( pMacAddress ) >> 26;
-
- //
- // Set the bit corresponding to the destination address
- //
- pNicDevice->MulticastHash [ Crc >> 3 ] |= ( 1<< (Crc& 7));
-}
-
-/**
- Start the link negotiation
-
- This routine calls ::Ax88772PhyWrite to start the PHY's link
- negotiation.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
-
- @retval EFI_SUCCESS The link negotiation was started.
- @retval other Failed to start the link negotiation.
-
-**/
-EFI_STATUS
-Ax88772NegotiateLinkStart (
- IN NIC_DEVICE * pNicDevice
- )
-{
- UINT16 Control;
- EFI_STATUS Status;
- int i;
- //
- // Set the supported capabilities.
- //
- Status = Ax88772PhyWrite ( pNicDevice,
- PHY_ANAR,
- AN_CSMA_CD
- | AN_TX_FDX | AN_TX_HDX
- | AN_10_FDX | AN_10_HDX );
- if ( !EFI_ERROR ( Status )) {
- //
- // Set the link speed and duplex
- //
- Control = BMCR_AUTONEGOTIATION_ENABLE
- | BMCR_RESTART_AUTONEGOTIATION;
- if ( pNicDevice->b100Mbps ) {
- Control |= BMCR_100MBPS;
- }
- if ( pNicDevice->bFullDuplex ) {
- Control |= BMCR_FULL_DUPLEX;
- }
- Status = Ax88772PhyWrite ( pNicDevice, PHY_BMCR, Control );
- }
-
- if (!EFI_ERROR(Status)) {
- i = 0;
- do {
-
- if (pNicDevice->bComplete && pNicDevice->bLinkUp) {
- pNicDevice->SimpleNetwork.Mode->MediaPresent
- = pNicDevice->bLinkUp & pNicDevice->bComplete;
- break;
- }
- else {
- gBS->Stall(AUTONEG_DELAY);
- Status = Ax88772NegotiateLinkComplete ( pNicDevice,
- &pNicDevice->PollCount,
- &pNicDevice->bComplete,
- &pNicDevice->bLinkUp,
- &pNicDevice->b100Mbps,
- &pNicDevice->bFullDuplex );
- i++;
- }
- }while(!pNicDevice->bLinkUp && i < AUTONEG_POLLCNT);
- }
- return Status;
-}
-
-
-/**
- Complete the negotiation of the PHY link
-
- This routine calls ::Ax88772PhyRead to determine if the
- link negotiation is complete.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
- @param [in, out] pPollCount Address of number of times this routine was polled
- @param [out] pbComplete Address of boolean to receive complate status.
- @param [out] pbLinkUp Address of boolean to receive link status, TRUE=up.
- @param [out] pbHiSpeed Address of boolean to receive link speed, TRUE=100Mbps.
- @param [out] pbFullDuplex Address of boolean to receive link duplex, TRUE=full.
-
- @retval EFI_SUCCESS The MAC address is available.
- @retval other The MAC address is not valid.
-
-**/
-EFI_STATUS
-Ax88772NegotiateLinkComplete (
- IN NIC_DEVICE * pNicDevice,
- IN OUT UINTN * pPollCount,
- OUT BOOLEAN * pbComplete,
- OUT BOOLEAN * pbLinkUp,
- OUT BOOLEAN * pbHiSpeed,
- OUT BOOLEAN * pbFullDuplex
- )
-{
- UINT16 Mask;
- UINT16 PhyData;
- EFI_STATUS Status;
-
- //
- // Determine if the link is up.
- //
- *pbComplete = FALSE;
-
- //
- // Get the link status
- //
- Status = Ax88772PhyRead ( pNicDevice,
- PHY_BMSR,
- &PhyData );
-
- if ( !EFI_ERROR ( Status )) {
- *pbLinkUp = (BOOLEAN)( 0 != ( PhyData & BMSR_LINKST ));
- if ( 0 == *pbLinkUp ) {
- DEBUG (( EFI_D_INFO, "Link Down\n" ));
- }
- else {
- *pbComplete = (BOOLEAN)( 0 != ( PhyData & 0x20 ));
- if ( 0 == *pbComplete ) {
- DEBUG (( EFI_D_INFO, "Autoneg is not yet Complete\n" ));
- }
- else {
- Status = Ax88772PhyRead ( pNicDevice,
- PHY_ANLPAR,
- &PhyData );
- if ( !EFI_ERROR ( Status )) {
- //
- // Autonegotiation is complete
- // Determine the link speed.
- //
- *pbHiSpeed = (BOOLEAN)( 0 != ( PhyData & ( AN_TX_FDX | AN_TX_HDX )));
-
- //
- // Determine the link duplex.
- //
- Mask = ( *pbHiSpeed ) ? AN_TX_FDX : AN_10_FDX;
- *pbFullDuplex = (BOOLEAN)( 0 != ( PhyData & Mask ));
- }
- }
- }
- }
- else {
- DEBUG (( EFI_D_ERROR, "Failed to read BMCR\n" ));
- }
- return Status;
-}
-
-
-/**
- Read a register from the PHY
-
- This routine calls ::Ax88772UsbCommand to read a PHY register.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
- @param [in] RegisterAddress Number of the register to read.
- @param [in, out] pPhyData Address of a buffer to receive the PHY register value
-
- @retval EFI_SUCCESS The PHY data is available.
- @retval other The PHY data is not valid.
-
-**/
-EFI_STATUS
-Ax88772PhyRead (
- IN NIC_DEVICE * pNicDevice,
- IN UINT8 RegisterAddress,
- IN OUT UINT16 * pPhyData
- )
-{
- USB_DEVICE_REQUEST SetupMsg;
- EFI_STATUS Status;
-
- //
- // Request access to the PHY
- //
- SetupMsg.RequestType = USB_REQ_TYPE_VENDOR
- | USB_TARGET_DEVICE;
- SetupMsg.Request = CMD_PHY_ACCESS_SOFTWARE;
- SetupMsg.Value = 0;
- SetupMsg.Index = 0;
- SetupMsg.Length = 0;
- Status = Ax88772UsbCommand ( pNicDevice,
- &SetupMsg,
- NULL );
- if ( !EFI_ERROR ( Status )) {
- //
- // Read the PHY register address.
- //
- SetupMsg.RequestType = USB_ENDPOINT_DIR_IN
- | USB_REQ_TYPE_VENDOR
- | USB_TARGET_DEVICE;
- SetupMsg.Request = CMD_PHY_REG_READ;
- SetupMsg.Value = pNicDevice->PhyId;
- SetupMsg.Index = RegisterAddress;
- SetupMsg.Length = sizeof ( *pPhyData );
- Status = Ax88772UsbCommand ( pNicDevice,
- &SetupMsg,
- pPhyData );
- if ( !EFI_ERROR ( Status )) {
-
- //
- // Release the PHY to the hardware
- //
- SetupMsg.RequestType = USB_REQ_TYPE_VENDOR
- | USB_TARGET_DEVICE;
- SetupMsg.Request = CMD_PHY_ACCESS_HARDWARE;
- SetupMsg.Value = 0;
- SetupMsg.Index = 0;
- SetupMsg.Length = 0;
- Status = Ax88772UsbCommand ( pNicDevice,
- &SetupMsg,
- NULL );
- }
- }
- return Status;
-}
-
-
-/**
- Write to a PHY register
-
- This routine calls ::Ax88772UsbCommand to write a PHY register.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
- @param [in] RegisterAddress Number of the register to read.
- @param [in] PhyData Address of a buffer to receive the PHY register value
-
- @retval EFI_SUCCESS The PHY data was written.
- @retval other Failed to wwrite the PHY register.
-
-**/
-EFI_STATUS
-Ax88772PhyWrite (
- IN NIC_DEVICE * pNicDevice,
- IN UINT8 RegisterAddress,
- IN UINT16 PhyData
- )
-{
- USB_DEVICE_REQUEST SetupMsg;
- EFI_STATUS Status;
-
- //
- // Request access to the PHY
- //
- SetupMsg.RequestType = USB_REQ_TYPE_VENDOR
- | USB_TARGET_DEVICE;
- SetupMsg.Request = CMD_PHY_ACCESS_SOFTWARE;
- SetupMsg.Value = 0;
- SetupMsg.Index = 0;
- SetupMsg.Length = 0;
- Status = Ax88772UsbCommand ( pNicDevice,
- &SetupMsg,
- NULL );
- if ( !EFI_ERROR ( Status )) {
- //
- // Write the PHY register
- //
- SetupMsg.RequestType = USB_REQ_TYPE_VENDOR
- | USB_TARGET_DEVICE;
- SetupMsg.Request = CMD_PHY_REG_WRITE;
- SetupMsg.Value = pNicDevice->PhyId;
- SetupMsg.Index = RegisterAddress;
- SetupMsg.Length = sizeof ( PhyData );
- Status = Ax88772UsbCommand ( pNicDevice,
- &SetupMsg,
- &PhyData );
- if ( !EFI_ERROR ( Status )) {
-
- //
- // Release the PHY to the hardware
- //
- SetupMsg.RequestType = USB_REQ_TYPE_VENDOR
- | USB_TARGET_DEVICE;
- SetupMsg.Request = CMD_PHY_ACCESS_HARDWARE;
- SetupMsg.Value = 0;
- SetupMsg.Index = 0;
- SetupMsg.Length = 0;
- Status = Ax88772UsbCommand ( pNicDevice,
- &SetupMsg,
- NULL );
- }
- }
-
- return Status;
-}
-
-
-/**
- Reset the AX88772
-
- This routine uses ::Ax88772UsbCommand to reset the network
- adapter. This routine also uses ::Ax88772PhyWrite to reset
- the PHY.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
-
- @retval EFI_SUCCESS The MAC address is available.
- @retval other The MAC address is not valid.
-
-**/
-EFI_STATUS
-Ax88772Reset (
- IN NIC_DEVICE * pNicDevice
- )
-{
- USB_DEVICE_REQUEST SetupMsg;
- EFI_STATUS Status;
-
- EFI_USB_IO_PROTOCOL *pUsbIo;
- EFI_USB_DEVICE_DESCRIPTOR Device;
-
- pUsbIo = pNicDevice->pUsbIo;
- Status = pUsbIo->UsbGetDeviceDescriptor ( pUsbIo, &Device );
-
- if (EFI_ERROR(Status)) goto err;
-
- SetupMsg.RequestType = USB_REQ_TYPE_VENDOR
- | USB_TARGET_DEVICE;
- SetupMsg.Request = CMD_PHY_ACCESS_HARDWARE;
- SetupMsg.Value = 0;
- SetupMsg.Index = 0;
- SetupMsg.Length = 0;
- Status = Ax88772UsbCommand ( pNicDevice,
- &SetupMsg,
- NULL );
-
- if (EFI_ERROR(Status)) goto err;
-
- SetupMsg.RequestType = USB_REQ_TYPE_VENDOR
- | USB_TARGET_DEVICE;
- SetupMsg.Request = CMD_PHY_SELECT;
- SetupMsg.Value = SPHY_PSEL;
- SetupMsg.Index = 0;
- SetupMsg.Length = 0;
- Status = Ax88772UsbCommand ( pNicDevice,
- &SetupMsg,
- NULL );
-
- if (EFI_ERROR(Status)) goto err;
-
- SetupMsg.RequestType = USB_REQ_TYPE_VENDOR
- | USB_TARGET_DEVICE;
- SetupMsg.Request = CMD_RESET;
- SetupMsg.Value = SRR_IPRL ;
- SetupMsg.Index = 0;
- SetupMsg.Length = 0;
- Status = Ax88772UsbCommand ( pNicDevice,
- &SetupMsg,
- NULL );
-
- if (EFI_ERROR(Status)) goto err;
-
- SetupMsg.RequestType = USB_REQ_TYPE_VENDOR
- | USB_TARGET_DEVICE;
- SetupMsg.Request = CMD_RESET;
- SetupMsg.Value = SRR_IPPD | SRR_IPRL ;
- SetupMsg.Index = 0;
- SetupMsg.Length = 0;
- Status = Ax88772UsbCommand ( pNicDevice,
- &SetupMsg,
- NULL );
-
- gBS->Stall ( 200000 );
-
- if (EFI_ERROR(Status)) goto err;
-
- SetupMsg.RequestType = USB_REQ_TYPE_VENDOR
- | USB_TARGET_DEVICE;
- SetupMsg.Request = CMD_RESET;
- SetupMsg.Value = SRR_IPRL ;
- SetupMsg.Index = 0;
- SetupMsg.Length = 0;
- Status = Ax88772UsbCommand ( pNicDevice,
- &SetupMsg,
- NULL );
-
- gBS->Stall ( 200000 );
-
- if (EFI_ERROR(Status)) goto err;
-
- SetupMsg.RequestType = USB_REQ_TYPE_VENDOR
- | USB_TARGET_DEVICE;
- SetupMsg.Request = CMD_RESET;
- SetupMsg.Value = 0;
- SetupMsg.Index = 0;
- SetupMsg.Length = 0;
- Status = Ax88772UsbCommand ( pNicDevice,
- &SetupMsg,
- NULL );
-
- if (EFI_ERROR(Status)) goto err;
-
- SetupMsg.RequestType = USB_REQ_TYPE_VENDOR
- | USB_TARGET_DEVICE;
- SetupMsg.Request = CMD_PHY_SELECT;
- SetupMsg.Value = SPHY_PSEL;
- SetupMsg.Index = 0;
- SetupMsg.Length = 0;
- Status = Ax88772UsbCommand ( pNicDevice,
- &SetupMsg,
- NULL );
-
- if (EFI_ERROR(Status)) goto err;
-
- SetupMsg.RequestType = USB_REQ_TYPE_VENDOR
- | USB_TARGET_DEVICE;
- SetupMsg.Request = CMD_RESET;
- SetupMsg.Value = SRR_IPRL | SRR_BZ | SRR_BZTYPE;
- SetupMsg.Index = 0;
- SetupMsg.Length = 0;
- Status = Ax88772UsbCommand ( pNicDevice,
- &SetupMsg,
- NULL );
-
- if (EFI_ERROR(Status)) goto err;
-
- SetupMsg.RequestType = USB_REQ_TYPE_VENDOR
- | USB_TARGET_DEVICE;
- SetupMsg.Request = CMD_RX_CONTROL_WRITE;
- SetupMsg.Value = 0;
- SetupMsg.Index = 0;
- SetupMsg.Length = 0;
- Status = Ax88772UsbCommand ( pNicDevice,
- &SetupMsg,
- NULL );
-
- if (EFI_ERROR(Status)) goto err;
-
- if (pNicDevice->Flags != FLAG_TYPE_AX88772) {
- SetupMsg.RequestType = USB_REQ_TYPE_VENDOR
- | USB_TARGET_DEVICE;
- SetupMsg.Request = CMD_RXQTC;
- SetupMsg.Value = 0x8000;
- SetupMsg.Index = 0x8001;
- SetupMsg.Length = 0;
- Status = Ax88772UsbCommand ( pNicDevice,
- &SetupMsg,
- NULL );
- }
-
-err:
- return Status;
-}
-
-/**
- Enable or disable the receiver
-
- This routine calls ::Ax88772UsbCommand to update the
- receiver state. This routine also calls ::Ax88772MacAddressSet
- to establish the MAC address for the network adapter.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
- @param [in] RxFilter Simple network RX filter mask value
-
- @retval EFI_SUCCESS The MAC address was set.
- @retval other The MAC address was not set.
-
-**/
-EFI_STATUS
-Ax88772RxControl (
- IN NIC_DEVICE * pNicDevice,
- IN UINT32 RxFilter
- )
-{
- UINT16 MediumStatus;
- UINT16 RxControl;
- USB_DEVICE_REQUEST SetupMsg;
- EFI_STATUS Status;
- EFI_USB_IO_PROTOCOL *pUsbIo;
- EFI_USB_DEVICE_DESCRIPTOR Device;
-
- pUsbIo = pNicDevice->pUsbIo;
- Status = pUsbIo->UsbGetDeviceDescriptor ( pUsbIo, &Device );
-
- if (EFI_ERROR(Status)) {
- DEBUG (( EFI_D_ERROR, "Failed to get device descriptor\n" ));
- return Status;
- }
-
- //
- // Enable the receiver if something is to be received
- //
-
- if ( 0 != RxFilter ) {
- //
- // Enable the receiver
- //
- SetupMsg.RequestType = USB_ENDPOINT_DIR_IN
- | USB_REQ_TYPE_VENDOR
- | USB_TARGET_DEVICE;
- SetupMsg.Request = CMD_MEDIUM_STATUS_READ;
- SetupMsg.Value = 0;
- SetupMsg.Index = 0;
- SetupMsg.Length = sizeof ( MediumStatus );
- Status = Ax88772UsbCommand ( pNicDevice,
- &SetupMsg,
- &MediumStatus );
- if ( !EFI_ERROR ( Status )) {
- if ( 0 == ( MediumStatus & MS_RE )) {
- MediumStatus |= MS_RE | MS_ONE;
-
- if ( pNicDevice->bFullDuplex )
- MediumStatus |= MS_TFC | MS_RFC | MS_FD;
- else
- MediumStatus &= ~(MS_TFC | MS_RFC | MS_FD);
-
- if ( pNicDevice->b100Mbps )
- MediumStatus |= MS_PS;
- else
- MediumStatus &= ~MS_PS;
-
- SetupMsg.RequestType = USB_REQ_TYPE_VENDOR
- | USB_TARGET_DEVICE;
- SetupMsg.Request = CMD_MEDIUM_STATUS_WRITE;
- SetupMsg.Value = MediumStatus;
- SetupMsg.Index = 0;
- SetupMsg.Length = 0;
- Status = Ax88772UsbCommand ( pNicDevice,
- &SetupMsg,
- NULL );
- if ( EFI_ERROR ( Status )) {
- DEBUG (( EFI_D_ERROR, "Failed to enable receiver, Status: %r\r\n",
- Status ));
- }
- }
- }
- else {
- DEBUG (( EFI_D_ERROR, "Failed to read receiver status, Status: %r\r\n",
- Status ));
- }
- }
-
- RxControl = RXC_SO | RXC_RH1M;
- //
- // Enable multicast if requested
- //
- if ( 0 != ( RxFilter & EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST )) {
- RxControl |= RXC_AM;
- //
- // Update the multicast hash table
- //
- SetupMsg.RequestType = USB_REQ_TYPE_VENDOR
- | USB_TARGET_DEVICE;
- SetupMsg.Request = CMD_MULTICAST_HASH_WRITE;
- SetupMsg.Value = 0;
- SetupMsg.Index = 0;
- SetupMsg.Length = sizeof ( pNicDevice ->MulticastHash );
- Status = Ax88772UsbCommand ( pNicDevice,
- &SetupMsg,
- &pNicDevice->MulticastHash );
- }
- //
- // Enable all multicast if requested
- //
- if ( 0 != ( RxFilter & EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS_MULTICAST )) {
- RxControl |= RXC_AMALL;
- }
-
- //
- // Enable broadcast if requested
- //
- if ( 0 != ( RxFilter & EFI_SIMPLE_NETWORK_RECEIVE_BROADCAST )) {
- RxControl |= RXC_AB;
- }
-
- //
- // Enable promiscuous mode if requested
- //
- if ( 0 != ( RxFilter & EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS )) {
- RxControl |= RXC_PRO;
- }
-
- //
- // Update the receiver control
- //
- if (pNicDevice->CurRxControl != RxControl) {
- SetupMsg.RequestType = USB_REQ_TYPE_VENDOR
- | USB_TARGET_DEVICE;
- SetupMsg.Request = CMD_RX_CONTROL_WRITE;
- SetupMsg.Value = RxControl;
- SetupMsg.Index = 0;
- SetupMsg.Length = 0;
- Status = Ax88772UsbCommand ( pNicDevice,
- &SetupMsg,
- NULL );
- if ( !EFI_ERROR ( Status )) {
- pNicDevice->CurRxControl = RxControl;
-
- }
- else {
- DEBUG (( EFI_D_ERROR, "ERROR - Failed to set receiver control, Status: %r\r\n",
- Status ));
- }
- }
- return Status;
-}
-
-
-/**
- Read an SROM location
-
- This routine calls ::Ax88772UsbCommand to read data from the
- SROM.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
- @param [in] Address SROM address
- @param [out] pData Buffer to receive the data
-
- @retval EFI_SUCCESS The read was successful
- @retval other The read failed
-
-**/
-EFI_STATUS
-Ax88772SromRead (
- IN NIC_DEVICE * pNicDevice,
- IN UINT32 Address,
- OUT UINT16 * pData
- )
-{
- return EFI_UNSUPPORTED;
-}
-
-/**
- Send a command to the USB device.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
- @param [in] pRequest Pointer to the request structure
- @param [in, out] pBuffer Data buffer address
-
- @retval EFI_SUCCESS The USB transfer was successful
- @retval other The USB transfer failed
-
-**/
-EFI_STATUS
-Ax88772UsbCommand (
- IN NIC_DEVICE * pNicDevice,
- IN USB_DEVICE_REQUEST * pRequest,
- IN OUT VOID * pBuffer
- )
-{
- UINT32 CmdStatus;
- EFI_USB_DATA_DIRECTION Direction;
- EFI_USB_IO_PROTOCOL * pUsbIo;
- EFI_STATUS Status;
-
- //
- // Determine the transfer direction
- //
- Direction = EfiUsbNoData;
- if ( 0 != pRequest->Length ) {
- Direction = ( 0 != ( pRequest->RequestType & USB_ENDPOINT_DIR_IN ))
- ? EfiUsbDataIn : EfiUsbDataOut;
- }
-
- //
- // Issue the command
- //
- pUsbIo = pNicDevice->pUsbIo;
- Status = pUsbIo->UsbControlTransfer ( pUsbIo,
- pRequest,
- Direction,
- USB_BUS_TIMEOUT,
- pBuffer,
- pRequest->Length,
- &CmdStatus );
- //
- // Determine the operation status
- //
- if ( !EFI_ERROR ( Status )) {
- Status = CmdStatus;
- }
- else {
- //
- // Only use status values associated with the Simple Network protocol
- //
- if ( EFI_TIMEOUT == Status ) {
- Status = EFI_DEVICE_ERROR;
- }
- }
- return Status;
-}
-
diff --git a/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772b/Ax88772.h b/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772b/Ax88772.h
deleted file mode 100644
index 3659294..0000000
--- a/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772b/Ax88772.h
+++ /dev/null
@@ -1,1026 +0,0 @@
-/** @file
- Definitions for ASIX AX88772 Ethernet adapter.
-
- Copyright (c) 2011 - 2015, Intel Corporation. All rights reserved.
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#ifndef _AX88772_H_
-#define _AX88772_H_
-
-#include <Uefi.h>
-
-#include <Guid/EventGroup.h>
-
-#include <IndustryStandard/Pci.h>
-
-#include <Library/BaseMemoryLib.h>
-#include <Library/DebugLib.h>
-#include <Library/DevicePathLib.h>
-#include <Library/UefiBootServicesTableLib.h>
-#include <Library/UefiDriverEntryPoint.h>
-#include <Library/UefiLib.h>
-#include <Library/UefiRuntimeLib.h>
-
-#include <Protocol/DevicePath.h>
-#include <Protocol/LoadedImage.h>
-#include <Protocol/NetworkInterfaceIdentifier.h>
-#include <Protocol/SimpleNetwork.h>
-#include <Protocol/UsbIo.h>
-
-#define MAX_QUEUE_SIZE 50
-#define MAX_BULKIN_SIZE 16384
-#define HW_HDR_LENGTH 8
-
-
-#define MAX_LINKIDLE_THRESHOLD 20000
-
-
-
-//------------------------------------------------------------------------------
-// Macros
-//------------------------------------------------------------------------------
-
-#if defined(_MSC_VER) /* Handle Microsoft VC++ compiler specifics. */
-#define DBG_ENTER() DEBUG (( 0xffffffff, "Entering " __FUNCTION__ "\n" )) ///< Display routine entry
-#define DBG_EXIT() DEBUG (( 0xffffffff, "Exiting " __FUNCTION__ "\n" )) ///< Display routine exit
-#define DBG_EXIT_DEC(Status) DEBUG (( 0xffffffff, "Exiting " __FUNCTION__ ", Status: %d\n", Status )) ///< Display routine exit with decimal value
-#define DBG_EXIT_HEX(Status) DEBUG (( 0xffffffff, "Exiting " __FUNCTION__ ", Status: 0x%08x\n", Status )) ///< Display routine exit with hex value
-#define DBG_EXIT_STATUS(Status) DEBUG (( 0xffffffff, "Exiting " __FUNCTION__ ", Status: %r\n", Status )) ///< Display routine exit with status value
-#define DBG_EXIT_TF(Status) DEBUG (( 0xffffffff, "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
-
-#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_BULK_ENDPOINT(Attribute) (((Attribute) & (BIT0 | BIT1)) == USB_ENDPOINT_BULK) ///< Return TRUE/FALSE for BULK type
-#define USB_IS_INTERRUPT_ENDPOINT(Attribute) (((Attribute) & (BIT0 | BIT1)) == USB_ENDPOINT_INTERRUPT) ///< Return TRUE/FALSE for INTERRUPT type
-
-
-#define PRINT(_L_STR) (gST->ConOut->OutputString(gST->ConOut,(_L_STR)))
-//------------------------------------------------------------------------------
-// Constants
-//------------------------------------------------------------------------------
-
-#define DEBUG_RX_BROADCAST 0x40000000 ///< Display RX broadcast messages
-#define DEBUG_RX_MULTICAST 0x20000000 ///< Display RX multicast messages
-#define DEBUG_RX_UNICAST 0x10000000 ///< Display RX unicast messages
-#define DEBUG_MAC_ADDRESS 0x08000000 ///< Display the MAC address
-#define DEBUG_LINK 0x04000000 ///< Display the link status
-#define DEBUG_TX 0x02000000 ///< Display the TX messages
-#define DEBUG_PHY 0x01000000 ///< Display the PHY register values
-#define DEBUG_SROM 0x00800000 ///< Display the SROM contents
-#define DEBUG_TIMER 0x00400000 ///< Display the timer routine entry/exit
-#define DEBUG_TPL 0x00200000 ///< Display the timer routine entry/exit
-
-#define AX88772_MAX_PKT_SIZE 2048 ///< Maximum packet size
-
-#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 USB_NETWORK_CLASS 0x09 ///< USB Network class code
-#define USB_BUS_TIMEOUT 1000 ///< USB timeout in milliseconds
-
-#define TIMER_MSEC 20 ///< Polling interval for the NIC
-//#define TPL_AX88772 TPL_CALLBACK ///< TPL for routine synchronization
-
-#define HC_DEBUG 0
-#define BULKIN_TIMEOUT 20
-#define AUTONEG_DELAY 500000
-#define AUTONEG_POLLCNT 20
-
-/**
- Verify new TPL value
-
- This macro which is enabled when debug is enabled verifies that
- the new TPL value is >= the current TPL value.
-**/
-#ifdef VERIFY_TPL
-#undef VERIFY_TPL
-#endif // VERIFY_TPL
-
-#if !defined(MDEPKG_NDEBUG)
-
-#define VERIFY_TPL(tpl) \
-{ \
- EFI_TPL PreviousTpl; \
- \
- PreviousTpl = gBS->RaiseTPL ( TPL_HIGH_LEVEL ); \
- gBS->RestoreTPL ( PreviousTpl ); \
- if ( PreviousTpl > tpl ) { \
- DEBUG (( DEBUG_ERROR, "Current TPL: %d, New TPL: %d\r\n", PreviousTpl, tpl )); \
- ASSERT ( PreviousTpl <= tpl ); \
- } \
-}
-
-#else // MDEPKG_NDEBUG
-
-#define VERIFY_TPL(tpl)
-
-#endif // MDEPKG_NDEBUG
-
-//------------------------------------------------------------------------------
-// Hardware Definition
-//------------------------------------------------------------------------------
-
-#define FreeQueueSize 10
-
-#define DEV_SIGNATURE SIGNATURE_32 ('A','X','8','8') ///< Signature of data structures in memory
-
-#define RESET_MSEC 1000 ///< Reset duration
-#define PHY_RESET_MSEC 500 ///< PHY reset duration
-
-//
-// RX Control register
-//
-
-#define RXC_PRO 0x0001 ///< Receive all packets
-#define RXC_AMALL 0x0002 ///< Receive all multicast packets
-#define RXC_SEP 0x0004 ///< Save error packets
-#define RXC_AB 0x0008 ///< Receive broadcast packets
-#define RXC_AM 0x0010 ///< Use multicast destination address hash table
-#define RXC_AP 0x0020 ///< Accept physical address from Multicast Filter
-#define RXC_SO 0x0080 ///< Start operation
-#define RXC_MFB 0x0300 ///< Maximum frame burst
-#define RXC_MFB_2048 0 ///< Maximum frame size: 2048 bytes
-#define RXC_MFB_4096 0x0100 ///< Maximum frame size: 4096 bytes
-#define RXC_MFB_8192 0x0200 ///< Maximum frame size: 8192 bytes
-#define RXC_MFB_16384 0x0300 ///< Maximum frame size: 16384 bytes
-
-/*Freddy*/
-#define RXC_RH1M 0x0100 ///< Rx header 1
-#define RXC_RH2M 0x0200 ///< Rx header 2
-#define RXC_RH3M 0x0400 ///< Rx header 3
-/*Freddy*/
-
-//
-// Medium Status register
-//
-
-#define MS_FD 0x0002 ///< Full duplex
-#define MS_ONE 0x0004 ///< Must be one
-#define MS_RFC 0x0010 ///< RX flow control enable
-#define MS_TFC 0x0020 ///< TX flow control enable
-#define MS_PF 0x0080 ///< Pause frame enable
-#define MS_RE 0x0100 ///< Receive enable
-#define MS_PS 0x0200 ///< Port speed 1=100, 0=10 Mbps
-#define MS_SBP 0x0800 ///< Stop back pressure
-#define MS_SM 0x1000 ///< Super MAC support
-
-//
-// Software PHY Select register
-//
-
-#define SPHY_PSEL (1 << 0) ///< Select internal PHY
-#define SPHY_SSMII (1 << 2)
-#define SPHY_SSEN (1 << 4)
-#define SPHY_ASEL 0x02 ///< 1=Auto select, 0=Manual select
-
-//
-// Software Reset register
-//
-
-#define SRR_RR 0x01 ///< Clear receive frame length error
-#define SRR_RT 0x02 ///< Clear transmit frame length error
-#define SRR_BZTYPE 0x04 ///< External PHY reset pin tri-state enable
-#define SRR_PRL 0x08 ///< External PHY reset pin level
-#define SRR_BZ 0x10 ///< Force Bulk to return zero length packet
-#define SRR_IPRL 0x20 ///< Internal PHY reset control
-#define SRR_IPPD 0x40 ///< Internal PHY power down
-
-//
-// PHY ID values
-//
-
-#define PHY_ID_INTERNAL 0x0010 ///< Internal PHY
-
-//
-// USB Commands
-//
-
-#define CMD_PHY_ACCESS_SOFTWARE 0x06 ///< Software in control of PHY
-#define CMD_PHY_REG_READ 0x07 ///< Read PHY register, Value: PHY, Index: Register, Data: Register value
-#define CMD_PHY_REG_WRITE 0x08 ///< Write PHY register, Value: PHY, Index: Register, Data: New 16-bit value
-#define CMD_PHY_ACCESS_HARDWARE 0x0a ///< Hardware in control of PHY
-#define CMD_SROM_READ 0x0b ///< Read SROM register: Value: Address, Data: Value
-#define CMD_RX_CONTROL_WRITE 0x10 ///< Set the RX control register, Value: New value
-#define CMD_GAPS_WRITE 0x12 ///< Write the gaps register, Value: New value
-#define CMD_MAC_ADDRESS_READ 0x13 ///< Read the MAC address, Data: 6 byte MAC address
-#define CMD_MAC_ADDRESS_WRITE 0x14 ///< Set the MAC address, Data: New 6 byte MAC address
-#define CMD_MULTICAST_HASH_WRITE 0x16 ///< Write the multicast hash table, Data: New 8 byte value
-#define CMD_MULTICAST_HASH_READ 0x16 ///< Read the multicast hash table
-#define CMD_MEDIUM_STATUS_READ 0x1a ///< Read medium status register, Data: Register value
-#define CMD_MEDIUM_STATUS_WRITE 0x1b ///< Write medium status register, Value: New value
-#define CMD_WRITE_GPIOS 0x1f
-#define CMD_RESET 0x20 ///< Reset register, Value: New value
-#define CMD_PHY_SELECT 0x22 ///< PHY select register, Value: New value
-
-/*Freddy*/
-#define CMD_RXQTC 0x2a ///< RX Queue Cascade Threshold Control Register
-/*Freddy*/
-
-//------------------------------
-// USB Endpoints
-//------------------------------
-
-#define CONTROL_ENDPOINT 0 ///< Control endpoint
-#define INTERRUPT_ENDPOINT 1 ///< Interrupt endpoint
-#define BULK_IN_ENDPOINT 2 ///< Receive endpoint
-#define BULK_OUT_ENDPOINT 3 ///< Transmit endpoint
-
-//------------------------------
-// PHY Registers
-//------------------------------
-
-#define PHY_BMCR 0 ///< Control register
-#define PHY_BMSR 1 ///< Status register
-#define PHY_ANAR 4 ///< Autonegotiation advertisement register
-#define PHY_ANLPAR 5 ///< Autonegotiation link parter ability register
-#define PHY_ANER 6 ///< Autonegotiation expansion register
-
-// BMCR - Register 0
-
-#define BMCR_RESET 0x8000 ///< 1 = Reset the PHY, bit clears after reset
-#define BMCR_LOOPBACK 0x4000 ///< 1 = Loopback enabled
-#define BMCR_100MBPS 0x2000 ///< 100 Mbits/Sec
-#define BMCR_10MBPS 0 ///< 10 Mbits/Sec
-#define BMCR_AUTONEGOTIATION_ENABLE 0x1000 ///< 1 = Enable autonegotiation
-#define BMCR_POWER_DOWN 0x0800 ///< 1 = Power down
-#define BMCR_ISOLATE 0x0400 ///< 0 = Isolate PHY
-#define BMCR_RESTART_AUTONEGOTIATION 0x0200 ///< 1 = Restart autonegotiation
-#define BMCR_FULL_DUPLEX 0x0100 ///< Full duplex operation
-#define BMCR_HALF_DUPLEX 0 ///< Half duplex operation
-#define BMCR_COLLISION_TEST 0x0080 ///< 1 = Collision test enabled
-
-// BSMR - Register 1
-
-#define BMSR_100BASET4 0x8000 ///< 1 = 100BASE-T4 mode
-#define BMSR_100BASETX_FDX 0x4000 ///< 1 = 100BASE-TX full duplex
-#define BMSR_100BASETX_HDX 0x2000 ///< 1 = 100BASE-TX half duplex
-#define BMSR_10BASET_FDX 0x1000 ///< 1 = 10BASE-T full duplex
-#define BMSR_10BASET_HDX 0x0800 ///< 1 = 10BASE-T half duplex
-#define BMSR_MF 0x0040 ///< 1 = PHY accepts frames with preamble suppressed
-#define BMSR_AUTONEG_CMPLT 0x0020 ///< 1 = Autonegotiation complete
-#define BMSR_RF 0x0010 ///< 1 = Remote fault
-#define BMSR_AUTONEG 0x0008 ///< 1 = Able to perform autonegotiation
-#define BMSR_LINKST 0x0004 ///< 1 = Link up
-#define BMSR_JABBER_DETECT 0x0002 ///< 1 = jabber condition detected
-#define BMSR_EXTENDED_CAPABILITY 0x0001 ///< 1 = Extended register capable
-
-// ANAR and ANLPAR Registers 4, 5
-
-#define AN_NP 0x8000 ///< 1 = Next page available
-#define AN_ACK 0x4000 ///< 1 = Link partner acknowledged
-#define AN_RF 0x2000 ///< 1 = Remote fault indicated by link partner
-#define AN_FCS 0x0400 ///< 1 = Flow control ability
-#define AN_T4 0x0200 ///< 1 = 100BASE-T4 support
-#define AN_TX_FDX 0x0100 ///< 1 = 100BASE-TX Full duplex
-#define AN_TX_HDX 0x0080 ///< 1 = 100BASE-TX support
-#define AN_10_FDX 0x0040 ///< 1 = 10BASE-T Full duplex
-#define AN_10_HDX 0x0020 ///< 1 = 10BASE-T support
-#define AN_CSMA_CD 0x0001 ///< 1 = IEEE 802.3 CSMA/CD support
-
-// asix_flags defines
-#define FLAG_NONE 0
-#define FLAG_TYPE_AX88172 BIT0
-#define FLAG_TYPE_AX88772 BIT1
-#define FLAG_TYPE_AX88772B BIT2
-#define FLAG_EEPROM_MAC BIT3 // initial mac address in eeprom
-
-//------------------------------------------------------------------------------
-// Data Types
-//------------------------------------------------------------------------------
-
-typedef struct {
- UINT16 VendorId;
- UINT16 ProductId;
- INT32 Flags;
-}ASIX_DONGLE;
-
-/**
- Ethernet header layout
-
- IEEE 802.3-2002 Part 3 specification, section 3.1.1.
-**/
-#pragma pack(1)
-typedef struct {
- UINT8 dest_addr[PXE_HWADDR_LEN_ETHER]; ///< Destination LAN address
- UINT8 src_addr[PXE_HWADDR_LEN_ETHER]; ///< Source LAN address
- UINT16 type; ///< Protocol or length
-} ETHERNET_HEADER;
-#pragma pack()
-
-/**
- Receive and Transmit packet structure
-**/
-#pragma pack(1)
-typedef struct _RX_TX_PACKET {
- struct _RX_TX_PACKET * pNext; ///< Next receive packet
- UINT16 Length; ///< Packet length
- UINT16 LengthBar; ///< Complement of the length
- UINT8 Data[ AX88772_MAX_PKT_SIZE ]; ///< Received packet data
-} RX_TX_PACKET;
-#pragma pack()
-
-
-#pragma pack(1)
-typedef struct _RX_PKT {
- struct _RX_PKT *pNext;
- BOOLEAN f_Used;
- UINT16 Length;
- UINT8 Data [AX88772_MAX_PKT_SIZE] ;
-} RX_PKT;
-#pragma pack()
-
-/**
- AX88772 control structure
-
- The driver uses this structure to manage the Asix AX88772 10/100
- Ethernet controller.
-**/
-typedef struct {
- UINTN Signature; ///< Structure identification
-
- //
- // USB data
- //
- EFI_HANDLE Controller; ///< Controller handle
- EFI_USB_IO_PROTOCOL * pUsbIo; ///< USB driver interface
-
- //
- // Simple network protocol data
- //
- EFI_SIMPLE_NETWORK_PROTOCOL SimpleNetwork; ///< Driver's network stack interface
- EFI_SIMPLE_NETWORK_PROTOCOL SimpleNetwork_Backup;
- EFI_SIMPLE_NETWORK_MODE SimpleNetworkData; ///< Data for simple network
-
- //
- // Ethernet controller data
- //
- BOOLEAN bInitialized; ///< Controller initialized
- VOID * pTxBuffer; ///< Last transmit buffer
- UINT16 PhyId; ///< PHY ID
-
- //
- // Link state
- //
- BOOLEAN b100Mbps; ///< Current link speed, FALSE = 10 Mbps
- BOOLEAN bComplete; ///< Current state of auto-negotiation
- BOOLEAN bFullDuplex; ///< Current duplex
- BOOLEAN bLinkUp; ///< Current link state
- UINTN LinkIdleCnt;
- UINTN PollCount; ///< Number of times the autonegotiation status was polled
- UINT16 CurRxControl;
- //
- // Receive buffer list
- //
- RX_TX_PACKET * pRxTest;
- RX_TX_PACKET * pTxTest;
-
- INT8 MulticastHash[8];
- EFI_MAC_ADDRESS MAC;
- BOOLEAN bHavePkt;
-
- EFI_DEVICE_PATH_PROTOCOL *MyDevPath;
-
- EFI_DRIVER_BINDING_PROTOCOL * DrvBind;
-
- RX_PKT * QueueHead;
- RX_PKT * pNextFill;
- RX_PKT * pFirstFill;
- UINTN PktCntInQueue;
- UINT8 * pBulkInBuff;
-
- INT32 Flags;
-
-} NIC_DEVICE;
-
-#define DEV_FROM_SIMPLE_NETWORK(a) CR (a, NIC_DEVICE, SimpleNetwork, DEV_SIGNATURE) ///< Locate NIC_DEVICE from Simple Network Protocol
-
-//------------------------------------------------------------------------------
-// Simple Network Protocol
-//------------------------------------------------------------------------------
-
-/**
- Reset the network adapter.
-
- Resets a network adapter and reinitializes it with the parameters that
- were provided in the previous call to Initialize (). The transmit and
- receive queues are cleared. Receive filters, the station address, the
- statistics, and the multicast-IP-to-HW MAC addresses are not reset by
- this call.
-
- This routine calls ::Ax88772Reset to perform the adapter specific
- reset operation. This routine also starts the link negotiation
- by calling ::Ax88772NegotiateLinkStart.
-
- @param [in] pSimpleNetwork Protocol instance pointer
- @param [in] bExtendedVerification Indicates that the driver may perform a more
- exhaustive verification operation of the device
- during reset.
-
- @retval EFI_SUCCESS This operation was successful.
- @retval EFI_NOT_STARTED The network interface was not started.
- @retval EFI_INVALID_PARAMETER pSimpleNetwork parameter was NULL or did not point to a valid
- EFI_SIMPLE_NETWORK_PROTOCOL structure.
- @retval EFI_DEVICE_ERROR The command could not be sent to the network interface.
- @retval EFI_UNSUPPORTED The increased buffer size feature is not supported.
-
-**/
-EFI_STATUS
-EFIAPI
-SN_Reset (
- IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork,
- IN BOOLEAN bExtendedVerification
- );
-
-/**
- Initialize the simple network protocol.
-
- This routine calls ::Ax88772MacAddressGet to obtain the
- MAC address.
-
- @param [in] pNicDevice NIC_DEVICE_INSTANCE pointer
-
- @retval EFI_SUCCESS Setup was successful
-
-**/
-EFI_STATUS
-SN_Setup (
- IN NIC_DEVICE * pNicDevice
- );
-
-/**
- This routine starts the network interface.
-
- @param [in] pSimpleNetwork Protocol instance pointer
-
- @retval EFI_SUCCESS This operation was successful.
- @retval EFI_ALREADY_STARTED The network interface was already started.
- @retval EFI_INVALID_PARAMETER pSimpleNetwork parameter was NULL or did not point to a valid
- EFI_SIMPLE_NETWORK_PROTOCOL structure.
- @retval EFI_DEVICE_ERROR The command could not be sent to the network interface.
- @retval EFI_UNSUPPORTED The increased buffer size feature is not supported.
-
-**/
-EFI_STATUS
-EFIAPI
-SN_Start (
- IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork
- );
-
-/**
- Set the MAC address.
-
- This function modifies or resets the current station address of a
- network interface. If Reset is TRUE, then the current station address
- is set ot the network interface's permanent address. If Reset if FALSE
- then the current station address is changed to the address specified by
- pNew.
-
- This routine calls ::Ax88772MacAddressSet to update the MAC address
- in the network adapter.
-
- @param [in] pSimpleNetwork Protocol instance pointer
- @param [in] bReset Flag used to reset the station address to the
- network interface's permanent address.
- @param [in] pNew New station address to be used for the network
- interface.
-
- @retval EFI_SUCCESS This operation was successful.
- @retval EFI_NOT_STARTED The network interface was not started.
- @retval EFI_INVALID_PARAMETER pSimpleNetwork parameter was NULL or did not point to a valid
- EFI_SIMPLE_NETWORK_PROTOCOL structure.
- @retval EFI_DEVICE_ERROR The command could not be sent to the network interface.
- @retval EFI_UNSUPPORTED The increased buffer size feature is not supported.
-
-**/
-EFI_STATUS
-EFIAPI
-SN_StationAddress (
- IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork,
- IN BOOLEAN bReset,
- IN EFI_MAC_ADDRESS * pNew
- );
-
-/**
- This function resets or collects the statistics on a network interface.
- If the size of the statistics table specified by StatisticsSize is not
- big enough for all of the statistics that are collected by the network
- interface, then a partial buffer of statistics is returned in
- StatisticsTable.
-
- @param [in] pSimpleNetwork Protocol instance pointer
- @param [in] bReset Set to TRUE to reset the statistics for the network interface.
- @param [in, out] pStatisticsSize On input the size, in bytes, of StatisticsTable. On output
- the size, in bytes, of the resulting table of statistics.
- @param [out] pStatisticsTable A pointer to the EFI_NETWORK_STATISTICS structure that
- conains the statistics.
-
- @retval EFI_SUCCESS This operation was successful.
- @retval EFI_NOT_STARTED The network interface was not started.
- @retval EFI_BUFFER_TOO_SMALL The pStatisticsTable is NULL or the buffer is too small.
- @retval EFI_INVALID_PARAMETER pSimpleNetwork parameter was NULL or did not point to a valid
- EFI_SIMPLE_NETWORK_PROTOCOL structure.
- @retval EFI_DEVICE_ERROR The command could not be sent to the network interface.
- @retval EFI_UNSUPPORTED The increased buffer size feature is not supported.
-
-**/
-EFI_STATUS
-EFIAPI
-SN_Statistics (
- IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork,
- IN BOOLEAN bReset,
- IN OUT UINTN * pStatisticsSize,
- OUT EFI_NETWORK_STATISTICS * pStatisticsTable
- );
-
-/**
- This function stops a network interface. This call is only valid
- if the network interface is in the started state.
-
- @param [in] pSimpleNetwork Protocol instance pointer
-
- @retval EFI_SUCCESS This operation was successful.
- @retval EFI_NOT_STARTED The network interface was not started.
- @retval EFI_INVALID_PARAMETER pSimpleNetwork parameter was NULL or did not point to a valid
- EFI_SIMPLE_NETWORK_PROTOCOL structure.
- @retval EFI_DEVICE_ERROR The command could not be sent to the network interface.
- @retval EFI_UNSUPPORTED The increased buffer size feature is not supported.
-
-**/
-EFI_STATUS
-EFIAPI
-SN_Stop (
- IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork
- );
-
-/**
- This function releases the memory buffers assigned in the Initialize() call.
- Pending transmits and receives are lost, and interrupts are cleared and disabled.
- After this call, only Initialize() and Stop() calls may be used.
-
- @param [in] pSimpleNetwork Protocol instance pointer
-
- @retval EFI_SUCCESS This operation was successful.
- @retval EFI_NOT_STARTED The network interface was not started.
- @retval EFI_INVALID_PARAMETER pSimpleNetwork parameter was NULL or did not point to a valid
- EFI_SIMPLE_NETWORK_PROTOCOL structure.
- @retval EFI_DEVICE_ERROR The command could not be sent to the network interface.
- @retval EFI_UNSUPPORTED The increased buffer size feature is not supported.
-
-**/
-EFI_STATUS
-EFIAPI
-SN_Shutdown (
- IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork
- );
-
-/**
- Send a packet over the network.
-
- This function places the packet specified by Header and Buffer on
- the transmit queue. This function performs a non-blocking transmit
- operation. When the transmit is complete, the buffer is returned
- via the GetStatus() call.
-
- This routine calls ::Ax88772Rx to empty the network adapter of
- receive packets. The routine then passes the transmit packet
- to the network adapter.
-
- @param [in] pSimpleNetwork Protocol instance pointer
- @param [in] HeaderSize The size, in bytes, of the media header to be filled in by
- the Transmit() function. If HeaderSize is non-zero, then
- it must be equal to SimpleNetwork->Mode->MediaHeaderSize
- and DestAddr and Protocol parameters must not be NULL.
- @param [in] BufferSize The size, in bytes, of the entire packet (media header and
- data) to be transmitted through the network interface.
- @param [in] pBuffer A pointer to the packet (media header followed by data) to
- to be transmitted. This parameter can not be NULL. If
- HeaderSize is zero, then the media header is Buffer must
- already be filled in by the caller. If HeaderSize is nonzero,
- then the media header will be filled in by the Transmit()
- function.
- @param [in] pSrcAddr The source HW MAC address. If HeaderSize is zero, then
- this parameter is ignored. If HeaderSize is nonzero and
- SrcAddr is NULL, then SimpleNetwork->Mode->CurrentAddress
- is used for the source HW MAC address.
- @param [in] pDestAddr The destination HW MAC address. If HeaderSize is zero, then
- this parameter is ignored.
- @param [in] pProtocol The type of header to build. If HeaderSize is zero, then
- this parameter is ignored.
-
- @retval EFI_SUCCESS This operation was successful.
- @retval EFI_NOT_STARTED The network interface was not started.
- @retval EFI_NOT_READY The network interface is too busy to accept this transmit request.
- @retval EFI_BUFFER_TOO_SMALL The BufferSize parameter is too small.
- @retval EFI_INVALID_PARAMETER pSimpleNetwork parameter was NULL or did not point to a valid
- EFI_SIMPLE_NETWORK_PROTOCOL structure.
- @retval EFI_DEVICE_ERROR The command could not be sent to the network interface.
-
-**/
-EFI_STATUS
-EFIAPI
-SN_Transmit (
- IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork,
- IN UINTN HeaderSize,
- IN UINTN BufferSize,
- IN VOID * pBuffer,
- IN EFI_MAC_ADDRESS * pSrcAddr,
- IN EFI_MAC_ADDRESS * pDestAddr,
- IN UINT16 * pProtocol
- );
-
-//------------------------------------------------------------------------------
-// Support Routines
-//------------------------------------------------------------------------------
-
-/**
- Get the MAC address
-
- This routine calls ::Ax88772UsbCommand to request the MAC
- address from the network adapter.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
- @param [out] pMacAddress Address of a six byte buffer to receive the MAC address.
-
- @retval EFI_SUCCESS The MAC address is available.
- @retval other The MAC address is not valid.
-
-**/
-EFI_STATUS
-Ax88772MacAddressGet (
- IN NIC_DEVICE * pNicDevice,
- OUT UINT8 * pMacAddress
- );
-
-/**
- Set the MAC address
-
- This routine calls ::Ax88772UsbCommand to set the MAC address
- in the network adapter.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
- @param [in] pMacAddress Address of a six byte buffer to containing the new MAC address.
-
- @retval EFI_SUCCESS The MAC address was set.
- @retval other The MAC address was not set.
-
-**/
-EFI_STATUS
-Ax88772MacAddressSet (
- IN NIC_DEVICE * pNicDevice,
- IN UINT8 * pMacAddress
- );
-
-/**
- Clear the multicast hash table
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
-
-**/
-VOID
-Ax88772MulticastClear (
- IN NIC_DEVICE * pNicDevice
- );
-
-/**
- Enable a multicast address in the multicast hash table
-
- This routine calls ::Ax88772Crc to compute the hash bit for
- this MAC address.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
- @param [in] pMacAddress Address of a six byte buffer to containing the MAC address.
-
-**/
-VOID
-Ax88772MulticastSet (
- IN NIC_DEVICE * pNicDevice,
- IN UINT8 * pMacAddress
- );
-
-/**
- Start the link negotiation
-
- This routine calls ::Ax88772PhyWrite to start the PHY's link
- negotiation.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
-
- @retval EFI_SUCCESS The link negotiation was started.
- @retval other Failed to start the link negotiation.
-
-**/
-EFI_STATUS
-Ax88772NegotiateLinkStart (
- IN NIC_DEVICE * pNicDevice
- );
-
-/**
- Complete the negotiation of the PHY link
-
- This routine calls ::Ax88772PhyRead to determine if the
- link negotiation is complete.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
- @param [in, out] pPollCount Address of number of times this routine was polled
- @param [out] pbComplete Address of boolean to receive complate status.
- @param [out] pbLinkUp Address of boolean to receive link status, TRUE=up.
- @param [out] pbHiSpeed Address of boolean to receive link speed, TRUE=100Mbps.
- @param [out] pbFullDuplex Address of boolean to receive link duplex, TRUE=full.
-
- @retval EFI_SUCCESS The MAC address is available.
- @retval other The MAC address is not valid.
-
-**/
-EFI_STATUS
-Ax88772NegotiateLinkComplete (
- IN NIC_DEVICE * pNicDevice,
- IN OUT UINTN * pPollCount,
- OUT BOOLEAN * pbComplete,
- OUT BOOLEAN * pbLinkUp,
- OUT BOOLEAN * pbHiSpeed,
- OUT BOOLEAN * pbFullDuplex
- );
-
-/**
- Read a register from the PHY
-
- This routine calls ::Ax88772UsbCommand to read a PHY register.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
- @param [in] RegisterAddress Number of the register to read.
- @param [in, out] pPhyData Address of a buffer to receive the PHY register value
-
- @retval EFI_SUCCESS The PHY data is available.
- @retval other The PHY data is not valid.
-
-**/
-EFI_STATUS
-Ax88772PhyRead (
- IN NIC_DEVICE * pNicDevice,
- IN UINT8 RegisterAddress,
- IN OUT UINT16 * pPhyData
- );
-
-/**
- Write to a PHY register
-
- This routine calls ::Ax88772UsbCommand to write a PHY register.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
- @param [in] RegisterAddress Number of the register to read.
- @param [in] PhyData Address of a buffer to receive the PHY register value
-
- @retval EFI_SUCCESS The PHY data was written.
- @retval other Failed to wwrite the PHY register.
-
-**/
-EFI_STATUS
-Ax88772PhyWrite (
- IN NIC_DEVICE * pNicDevice,
- IN UINT8 RegisterAddress,
- IN UINT16 PhyData
- );
-
-/**
- Reset the AX88772
-
- This routine uses ::Ax88772UsbCommand to reset the network
- adapter. This routine also uses ::Ax88772PhyWrite to reset
- the PHY.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
-
- @retval EFI_SUCCESS The MAC address is available.
- @retval other The MAC address is not valid.
-
-**/
-EFI_STATUS
-Ax88772Reset (
- IN NIC_DEVICE * pNicDevice
- );
-
-VOID
-Ax88772ChkLink (
- IN NIC_DEVICE * pNicDevice,
- IN BOOLEAN bUpdateLink
- );
-
-/**
- Receive a frame from the network.
-
- This routine polls the USB receive interface for a packet. If a packet
- is available, this routine adds the receive packet to the list of
- pending receive packets.
-
- This routine calls ::Ax88772NegotiateLinkComplete to verify
- that the link is up. This routine also calls ::SN_Reset to
- reset the network adapter when necessary. Finally this
- routine attempts to receive one or more packets from the
- network adapter.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
- @param [in] bUpdateLink TRUE = Update link status
-
-**/
-VOID
-Ax88772Rx (
- IN NIC_DEVICE * pNicDevice,
- IN BOOLEAN bUpdateLink
- );
-
-/**
- Enable or disable the receiver
-
- This routine calls ::Ax88772UsbCommand to update the
- receiver state. This routine also calls ::Ax88772MacAddressSet
- to establish the MAC address for the network adapter.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
- @param [in] RxFilter Simple network RX filter mask value
-
- @retval EFI_SUCCESS The MAC address was set.
- @retval other The MAC address was not set.
-
-**/
-EFI_STATUS
-Ax88772RxControl (
- IN NIC_DEVICE * pNicDevice,
- IN UINT32 RxFilter
- );
-
-/**
- Read an SROM location
-
- This routine calls ::Ax88772UsbCommand to read data from the
- SROM.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
- @param [in] Address SROM address
- @param [out] pData Buffer to receive the data
-
- @retval EFI_SUCCESS The read was successful
- @retval other The read failed
-
-**/
-EFI_STATUS
-Ax88772SromRead (
- IN NIC_DEVICE * pNicDevice,
- IN UINT32 Address,
- OUT UINT16 * pData
- );
-
-/**
- Send a command to the USB device.
-
- @param [in] pNicDevice Pointer to the NIC_DEVICE structure
- @param [in] pRequest Pointer to the request structure
- @param [in, out] pBuffer Data buffer address
-
- @retval EFI_SUCCESS The USB transfer was successful
- @retval other The USB transfer failed
-
-**/
-EFI_STATUS
-Ax88772UsbCommand (
- IN NIC_DEVICE * pNicDevice,
- IN USB_DEVICE_REQUEST * pRequest,
- IN OUT VOID * pBuffer
- );
-
-//------------------------------------------------------------------------------
-// EFI Component Name Protocol Support
-//------------------------------------------------------------------------------
-
-extern EFI_COMPONENT_NAME_PROTOCOL gComponentName; ///< Component name protocol declaration
-extern EFI_COMPONENT_NAME2_PROTOCOL gComponentName2; ///< Component name 2 protocol declaration
-
-/**
- Retrieves a Unicode string that is the user readable name of the driver.
-
- This function retrieves the user readable name of a driver in the form of a
- Unicode string. If the driver specified by This has a user readable name in
- the language specified by Language, then a pointer to the driver name is
- returned in DriverName, and EFI_SUCCESS is returned. If the driver specified
- by This does not support the language specified by Language,
- then EFI_UNSUPPORTED is returned.
-
- @param [in] pThis A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
- EFI_COMPONENT_NAME_PROTOCOL instance.
- @param [in] pLanguage A pointer to a Null-terminated ASCII string
- array indicating the language. This is the
- language of the driver name that the caller is
- requesting, and it must match one of the
- languages specified in SupportedLanguages. The
- number of languages supported by a driver is up
- to the driver writer. Language is specified
- in RFC 3066 or ISO 639-2 language code format.
- @param [out] ppDriverName A pointer to the Unicode string to return.
- This Unicode string is the name of the
- driver specified by This in the language
- specified by Language.
-
- @retval EFI_SUCCESS The Unicode string for the Driver specified by
- This and the language specified by Language was
- returned in DriverName.
- @retval EFI_INVALID_PARAMETER Language is NULL.
- @retval EFI_INVALID_PARAMETER DriverName is NULL.
- @retval EFI_UNSUPPORTED The driver specified by This does not support
- the language specified by Language.
-
-**/
-EFI_STATUS
-EFIAPI
-GetDriverName (
- IN EFI_COMPONENT_NAME_PROTOCOL * pThis,
- IN CHAR8 * pLanguage,
- OUT CHAR16 ** ppDriverName
- );
-
-
-/**
- Retrieves a Unicode string that is the user readable name of the controller
- that is being managed by a driver.
-
- This function retrieves the user readable name of the controller specified by
- ControllerHandle and ChildHandle in the form of a Unicode string. If the
- driver specified by This has a user readable name in the language specified by
- Language, then a pointer to the controller name is returned in ControllerName,
- and EFI_SUCCESS is returned. If the driver specified by This is not currently
- managing the controller specified by ControllerHandle and ChildHandle,
- then EFI_UNSUPPORTED is returned. If the driver specified by This does not
- support the language specified by Language, then EFI_UNSUPPORTED is returned.
-
- @param [in] pThis A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
- EFI_COMPONENT_NAME_PROTOCOL instance.
- @param [in] ControllerHandle The handle of a controller that the driver
- specified by This is managing. This handle
- specifies the controller whose name is to be
- returned.
- @param [in] ChildHandle The handle of the child controller to retrieve
- the name of. This is an optional parameter that
- may be NULL. It will be NULL for device
- drivers. It will also be NULL for a bus drivers
- that wish to retrieve the name of the bus
- controller. It will not be NULL for a bus
- driver that wishes to retrieve the name of a
- child controller.
- @param [in] pLanguage A pointer to a Null-terminated ASCII string
- array indicating the language. This is the
- language of the driver name that the caller is
- requesting, and it must match one of the
- languages specified in SupportedLanguages. The
- number of languages supported by a driver is up
- to the driver writer. Language is specified in
- RFC 3066 or ISO 639-2 language code format.
- @param [out] ppControllerName A pointer to the Unicode string to return.
- This Unicode string is the name of the
- controller specified by ControllerHandle and
- ChildHandle in the language specified by
- Language from the point of view of the driver
- specified by This.
-
- @retval EFI_SUCCESS The Unicode string for the user readable name in
- the language specified by Language for the
- driver specified by This was returned in
- DriverName.
- @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE.
- @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid
- EFI_HANDLE.
- @retval EFI_INVALID_PARAMETER Language is NULL.
- @retval EFI_INVALID_PARAMETER ControllerName is NULL.
- @retval EFI_UNSUPPORTED The driver specified by This is not currently
- managing the controller specified by
- ControllerHandle and ChildHandle.
- @retval EFI_UNSUPPORTED The driver specified by This does not support
- the language specified by Language.
-
-**/
-EFI_STATUS
-EFIAPI
-GetControllerName (
- IN EFI_COMPONENT_NAME_PROTOCOL * pThis,
- IN EFI_HANDLE ControllerHandle,
- IN OPTIONAL EFI_HANDLE ChildHandle,
- IN CHAR8 * pLanguage,
- OUT CHAR16 ** ppControllerName
- );
-
-VOID
-FillPkt2Queue (
- IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork,
- IN UINTN BufLength);
-
-//------------------------------------------------------------------------------
-
-#endif // _AX88772_H_
diff --git a/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772b/Ax88772b.inf b/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772b/Ax88772b.inf
deleted file mode 100644
index 60e43fd..0000000
--- a/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772b/Ax88772b.inf
+++ /dev/null
@@ -1,61 +0,0 @@
-## @file
-# Component description file for ASIX AX88772 USB/Ethernet driver.
-#
-# This module provides support for the ASIX AX88772 USB/Ethernet adapter.
-# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
-#
-# SPDX-License-Identifier: BSD-2-Clause-Patent
-#
-##
-
-[Defines]
- INF_VERSION = 0x00010018
- BASE_NAME = Ax88772b
- FILE_GUID = 95C8D770-E1A4-4422-B263-E32F14FD8186
- MODULE_TYPE = DXE_RUNTIME_DRIVER
- VERSION_STRING = 1.0
-
- ENTRY_POINT = EntryPoint
-
-#
-# VALID_ARCHITECTURES = IA32 X64 EBC
-#
-
-[Sources.common]
- Ax88772.h
- Ax88772.c
- ComponentName.c
- DriverBinding.c
- SimpleNetwork.c
-
-
-[Packages]
- MdePkg/MdePkg.dec
- MdeModulePkg/MdeModulePkg.dec
-
-[LibraryClasses]
- UefiLib
- UefiBootServicesTableLib
- BaseMemoryLib
- DebugLib
- UefiRuntimeLib
- UefiDriverEntryPoint
-
-[Protocols]
- gEfiDevicePathProtocolGuid ## BY_START
- gEfiSimpleNetworkProtocolGuid ## BY_START
- gEfiUsbIoProtocolGuid ## TO_START
-
-[Depex]
- gEfiBdsArchProtocolGuid AND
- gEfiCpuArchProtocolGuid AND
- gEfiMetronomeArchProtocolGuid AND
- gEfiMonotonicCounterArchProtocolGuid AND
- gEfiRealTimeClockArchProtocolGuid AND
- gEfiResetArchProtocolGuid AND
- gEfiRuntimeArchProtocolGuid AND
- gEfiSecurityArchProtocolGuid AND
- gEfiTimerArchProtocolGuid AND
- gEfiVariableWriteArchProtocolGuid AND
- gEfiVariableArchProtocolGuid AND
- gEfiWatchdogTimerArchProtocolGuid
diff --git a/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772b/ComponentName.c b/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772b/ComponentName.c
deleted file mode 100644
index 76a732a..0000000
--- a/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772b/ComponentName.c
+++ /dev/null
@@ -1,175 +0,0 @@
-/** @file
- UEFI Component Name(2) protocol implementation.
-
- Copyright (c) 2011, Intel Corporation. All rights reserved.
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include "Ax88772.h"
-
-/**
- EFI Component Name Protocol declaration
-**/
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gComponentName = {
- GetDriverName,
- GetControllerName,
- "eng"
-};
-
-/**
- EFI Component Name 2 Protocol declaration
-**/
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gComponentName2 = {
- (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) GetDriverName,
- (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) GetControllerName,
- "en"
-};
-
-
-/**
- Driver name table declaration
-**/
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE
-mDriverNameTable[] = {
- {"eng;en", L"ASIX AX88772B Ethernet Driver 1.0"},
- {NULL, NULL}
-};
-
-/**
- Retrieves a Unicode string that is the user readable name of the driver.
-
- This function retrieves the user readable name of a driver in the form of a
- Unicode string. If the driver specified by This has a user readable name in
- the language specified by Language, then a pointer to the driver name is
- returned in DriverName, and EFI_SUCCESS is returned. If the driver specified
- by This does not support the language specified by Language,
- then EFI_UNSUPPORTED is returned.
-
- @param [in] pThis A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
- EFI_COMPONENT_NAME_PROTOCOL instance.
- @param [in] pLanguage A pointer to a Null-terminated ASCII string
- array indicating the language. This is the
- language of the driver name that the caller is
- requesting, and it must match one of the
- languages specified in SupportedLanguages. The
- number of languages supported by a driver is up
- to the driver writer. Language is specified
- in RFC 3066 or ISO 639-2 language code format.
- @param [out] ppDriverName A pointer to the Unicode string to return.
- This Unicode string is the name of the
- driver specified by This in the language
- specified by Language.
-
- @retval EFI_SUCCESS The Unicode string for the Driver specified by
- This and the language specified by Language was
- returned in DriverName.
- @retval EFI_INVALID_PARAMETER Language is NULL.
- @retval EFI_INVALID_PARAMETER DriverName is NULL.
- @retval EFI_UNSUPPORTED The driver specified by This does not support
- the language specified by Language.
-
-**/
-EFI_STATUS
-EFIAPI
-GetDriverName (
- IN EFI_COMPONENT_NAME_PROTOCOL * pThis,
- IN CHAR8 * pLanguage,
- OUT CHAR16 ** ppDriverName
- )
-{
- EFI_STATUS Status;
-
- Status = LookupUnicodeString2 (
- pLanguage,
- pThis->SupportedLanguages,
- mDriverNameTable,
- ppDriverName,
- (BOOLEAN)(pThis == &gComponentName)
- );
-
- return Status;
-}
-
-/**
- Retrieves a Unicode string that is the user readable name of the controller
- that is being managed by a driver.
-
- This function retrieves the user readable name of the controller specified by
- ControllerHandle and ChildHandle in the form of a Unicode string. If the
- driver specified by This has a user readable name in the language specified by
- Language, then a pointer to the controller name is returned in ControllerName,
- and EFI_SUCCESS is returned. If the driver specified by This is not currently
- managing the controller specified by ControllerHandle and ChildHandle,
- then EFI_UNSUPPORTED is returned. If the driver specified by This does not
- support the language specified by Language, then EFI_UNSUPPORTED is returned.
-
- @param [in] pThis A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
- EFI_COMPONENT_NAME_PROTOCOL instance.
- @param [in] ControllerHandle The handle of a controller that the driver
- specified by This is managing. This handle
- specifies the controller whose name is to be
- returned.
- @param [in] ChildHandle The handle of the child controller to retrieve
- the name of. This is an optional parameter that
- may be NULL. It will be NULL for device
- drivers. It will also be NULL for a bus drivers
- that wish to retrieve the name of the bus
- controller. It will not be NULL for a bus
- driver that wishes to retrieve the name of a
- child controller.
- @param [in] pLanguage A pointer to a Null-terminated ASCII string
- array indicating the language. This is the
- language of the driver name that the caller is
- requesting, and it must match one of the
- languages specified in SupportedLanguages. The
- number of languages supported by a driver is up
- to the driver writer. Language is specified in
- RFC 3066 or ISO 639-2 language code format.
- @param [out] ppControllerName A pointer to the Unicode string to return.
- This Unicode string is the name of the
- controller specified by ControllerHandle and
- ChildHandle in the language specified by
- Language from the point of view of the driver
- specified by This.
-
- @retval EFI_SUCCESS The Unicode string for the user readable name in
- the language specified by Language for the
- driver specified by This was returned in
- DriverName.
- @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE.
- @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid
- EFI_HANDLE.
- @retval EFI_INVALID_PARAMETER Language is NULL.
- @retval EFI_INVALID_PARAMETER ControllerName is NULL.
- @retval EFI_UNSUPPORTED The driver specified by This is not currently
- managing the controller specified by
- ControllerHandle and ChildHandle.
- @retval EFI_UNSUPPORTED The driver specified by This does not support
- the language specified by Language.
-
-**/
-EFI_STATUS
-EFIAPI
-GetControllerName (
- IN EFI_COMPONENT_NAME_PROTOCOL * pThis,
- IN EFI_HANDLE ControllerHandle,
- IN OPTIONAL EFI_HANDLE ChildHandle,
- IN CHAR8 * pLanguage,
- OUT CHAR16 ** ppControllerName
- )
-{
- EFI_STATUS Status;
-
- //
- // Set the controller name
- //
- *ppControllerName = L"ASIX AX88772B USB Fast Ethernet Controller";
- Status = EFI_SUCCESS;
-
- //
- // Return the operation status
- //
-
- return Status;
-}
diff --git a/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772b/DriverBinding.c b/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772b/DriverBinding.c
deleted file mode 100644
index 2bec944..0000000
--- a/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772b/DriverBinding.c
+++ /dev/null
@@ -1,696 +0,0 @@
-/** @file
- Implement the driver binding protocol for Asix AX88772 Ethernet driver.
-
- Copyright (c) 2011-2013, Intel Corporation. All rights reserved.
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include "Ax88772.h"
-
-ASIX_DONGLE ASIX_DONGLES[] = {
- { 0x05AC, 0x1402, FLAG_TYPE_AX88772 }, // Apple USB Ethernet Adapter
- // ASIX 88772B
- { 0x0B95, 0x772B, FLAG_TYPE_AX88772B | FLAG_EEPROM_MAC },
- { 0x0000, 0x0000, FLAG_NONE } // END - Do not remove
-};
-
-/**
- Verify the controller type
-
- @param [in] pThis Protocol instance pointer.
- @param [in] Controller Handle of device to test.
- @param [in] pRemainingDevicePath Not used.
-
- @retval EFI_SUCCESS This driver supports this device.
- @retval other This driver does not support this device.
-
-**/
-EFI_STATUS
-EFIAPI
-DriverSupported (
- IN EFI_DRIVER_BINDING_PROTOCOL * pThis,
- IN EFI_HANDLE Controller,
- IN EFI_DEVICE_PATH_PROTOCOL * pRemainingDevicePath
- )
-{
- EFI_USB_DEVICE_DESCRIPTOR Device;
- EFI_USB_IO_PROTOCOL * pUsbIo;
- EFI_STATUS Status;
- UINT32 Index;
-
- //
- // Connect to the USB stack
- //
- Status = gBS->OpenProtocol (
- Controller,
- &gEfiUsbIoProtocolGuid,
- (VOID **) &pUsbIo,
- pThis->DriverBindingHandle,
- Controller,
- EFI_OPEN_PROTOCOL_BY_DRIVER
- );
- if (!EFI_ERROR ( Status )) {
-
- //
- // Get the interface descriptor to check the USB class and find a transport
- // protocol handler.
- //
- Status = pUsbIo->UsbGetDeviceDescriptor ( pUsbIo, &Device );
- if (EFI_ERROR ( Status )) {
- Status = EFI_UNSUPPORTED;
- }
- else {
- //
- // Validate the adapter
- //
- for (Index = 0; ASIX_DONGLES[Index].VendorId != 0; Index++) {
- if (ASIX_DONGLES[Index].VendorId == Device.IdVendor &&
- ASIX_DONGLES[Index].ProductId == Device.IdProduct) {
- DEBUG ((EFI_D_INFO, "Found the AX88772B\r\n"));
- break;
- }
- }
-
- if (ASIX_DONGLES[Index].VendorId == 0)
- Status = EFI_UNSUPPORTED;
- }
-
- //
- // Done with the USB stack
- //
- gBS->CloseProtocol (
- Controller,
- &gEfiUsbIoProtocolGuid,
- pThis->DriverBindingHandle,
- Controller
- );
- }
- return Status;
-}
-
-
-/**
- Start this driver on Controller by opening UsbIo and DevicePath protocols.
- Initialize PXE structures, create a copy of the Controller Device Path with the
- NIC's MAC address appended to it, install the NetworkInterfaceIdentifier protocol
- on the newly created Device Path.
-
- @param [in] pThis Protocol instance pointer.
- @param [in] Controller Handle of device to work with.
- @param [in] pRemainingDevicePath Not used, always produce all possible children.
-
- @retval EFI_SUCCESS This driver is added to Controller.
- @retval other This driver does not support this device.
-
-**/
-EFI_STATUS
-EFIAPI
-DriverStart (
- IN EFI_DRIVER_BINDING_PROTOCOL * pThis,
- IN EFI_HANDLE Controller,
- IN EFI_DEVICE_PATH_PROTOCOL * pRemainingDevicePath
- )
-{
-
- EFI_STATUS Status;
- NIC_DEVICE *pNicDevice;
- UINTN LengthInBytes;
- EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath = NULL;
- MAC_ADDR_DEVICE_PATH MacDeviceNode;
- EFI_USB_DEVICE_DESCRIPTOR Device;
- UINT32 Index;
-
- //
- // Allocate the device structure
- //
- LengthInBytes = sizeof ( *pNicDevice );
- Status = gBS->AllocatePool (
- EfiRuntimeServicesData,
- LengthInBytes,
- (VOID **) &pNicDevice
- );
-
- if (EFI_ERROR (Status)) {
- DEBUG ((EFI_D_ERROR, "gBS->AllocatePool:pNicDevice ERROR Status = %r\n", Status));
- goto EXIT;
- }
-
- //
- // Set the structure signature
- //
- ZeroMem ( pNicDevice, LengthInBytes );
- pNicDevice->Signature = DEV_SIGNATURE;
-
- Status = gBS->OpenProtocol (
- Controller,
- &gEfiUsbIoProtocolGuid,
- (VOID **) &pNicDevice->pUsbIo,
- pThis->DriverBindingHandle,
- Controller,
- EFI_OPEN_PROTOCOL_BY_DRIVER
- );
-
- if (EFI_ERROR (Status)) {
- DEBUG ((EFI_D_ERROR, "gBS->OpenProtocol:EFI_USB_IO_PROTOCOL ERROR Status = %r\n", Status));
- gBS->FreePool ( pNicDevice );
- goto EXIT;
- }
-
- //
- // Initialize the simple network protocol
- //
- Status = SN_Setup ( pNicDevice );
-
- if (EFI_ERROR(Status)){
- DEBUG ((EFI_D_ERROR, "SN_Setup ERROR Status = %r\n", Status));
- gBS->CloseProtocol (
- Controller,
- &gEfiUsbIoProtocolGuid,
- pThis->DriverBindingHandle,
- Controller
- );
- gBS->FreePool ( pNicDevice );
- goto EXIT;
- }
-
- Status = pNicDevice->pUsbIo->UsbGetDeviceDescriptor ( pNicDevice->pUsbIo, &Device );
- if (EFI_ERROR ( Status )) {
- gBS->CloseProtocol (
- Controller,
- &gEfiUsbIoProtocolGuid,
- pThis->DriverBindingHandle,
- Controller
- );
- gBS->FreePool ( pNicDevice );
- goto EXIT;
- } else {
- //
- // Validate the adapter
- //
- for (Index = 0; ASIX_DONGLES[Index].VendorId != 0; Index++) {
- if (ASIX_DONGLES[Index].VendorId == Device.IdVendor &&
- ASIX_DONGLES[Index].ProductId == Device.IdProduct) {
- break;
- }
- }
-
- if (ASIX_DONGLES[Index].VendorId == 0) {
- gBS->CloseProtocol (
- Controller,
- &gEfiUsbIoProtocolGuid,
- pThis->DriverBindingHandle,
- Controller
- );
- gBS->FreePool ( pNicDevice );
- goto EXIT;
- }
-
- pNicDevice->Flags = ASIX_DONGLES[Index].Flags;
- }
-
- //
- // Set Device Path
- //
- Status = gBS->OpenProtocol (
- Controller,
- &gEfiDevicePathProtocolGuid,
- (VOID **) &ParentDevicePath,
- pThis->DriverBindingHandle,
- Controller,
- EFI_OPEN_PROTOCOL_BY_DRIVER
- );
- if (EFI_ERROR(Status)) {
- DEBUG ((EFI_D_ERROR, "gBS->OpenProtocol:EFI_DEVICE_PATH_PROTOCOL error. Status = %r\n",
- Status));
- gBS->CloseProtocol (
- Controller,
- &gEfiUsbIoProtocolGuid,
- pThis->DriverBindingHandle,
- Controller
- );
- gBS->FreePool ( pNicDevice );
- goto EXIT;
- }
-
- ZeroMem (&MacDeviceNode, sizeof (MAC_ADDR_DEVICE_PATH));
- MacDeviceNode.Header.Type = MESSAGING_DEVICE_PATH;
- MacDeviceNode.Header.SubType = MSG_MAC_ADDR_DP;
-
- SetDevicePathNodeLength (&MacDeviceNode.Header, sizeof (MAC_ADDR_DEVICE_PATH));
-
- CopyMem (&MacDeviceNode.MacAddress,
- &pNicDevice->SimpleNetworkData.CurrentAddress,
- PXE_HWADDR_LEN_ETHER);
-
- MacDeviceNode.IfType = pNicDevice->SimpleNetworkData.IfType;
-
- pNicDevice->MyDevPath = AppendDevicePathNode (
- ParentDevicePath,
- (EFI_DEVICE_PATH_PROTOCOL *) &MacDeviceNode
- );
-
- pNicDevice->Controller = NULL;
-
- //
- // Install both the simple network and device path protocols.
- //
- Status = gBS->InstallMultipleProtocolInterfaces (
- &pNicDevice->Controller,
- &gEfiCallerIdGuid,
- pNicDevice,
- &gEfiSimpleNetworkProtocolGuid,
- &pNicDevice->SimpleNetwork,
- &gEfiDevicePathProtocolGuid,
- pNicDevice->MyDevPath,
- NULL
- );
-
- if (EFI_ERROR(Status)){
- DEBUG ((EFI_D_ERROR, "gBS->InstallMultipleProtocolInterfaces error. Status = %r\n",
- Status));
- gBS->CloseProtocol (
- Controller,
- &gEfiDevicePathProtocolGuid,
- pThis->DriverBindingHandle,
- Controller);
- gBS->CloseProtocol (
- Controller,
- &gEfiUsbIoProtocolGuid,
- pThis->DriverBindingHandle,
- Controller
- );
- gBS->FreePool ( pNicDevice );
- goto EXIT;
- }
-
- //
- // Open For Child Device
- //
- Status = gBS->OpenProtocol (
- Controller,
- &gEfiUsbIoProtocolGuid,
- (VOID **) &pNicDevice->pUsbIo,
- pThis->DriverBindingHandle,
- pNicDevice->Controller,
- EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
- );
-
- if (EFI_ERROR(Status)){
- gBS->UninstallMultipleProtocolInterfaces (
- &pNicDevice->Controller,
- &gEfiCallerIdGuid,
- pNicDevice,
- &gEfiSimpleNetworkProtocolGuid,
- &pNicDevice->SimpleNetwork,
- &gEfiDevicePathProtocolGuid,
- pNicDevice->MyDevPath,
- NULL
- );
- gBS->CloseProtocol (
- Controller,
- &gEfiDevicePathProtocolGuid,
- pThis->DriverBindingHandle,
- Controller);
- gBS->CloseProtocol (
- Controller,
- &gEfiUsbIoProtocolGuid,
- pThis->DriverBindingHandle,
- Controller
- );
- gBS->FreePool ( pNicDevice );
- }
-
-EXIT:
- return Status;
-
-}
-
-/**
- Stop this driver on Controller by removing NetworkInterfaceIdentifier protocol and
- closing the DevicePath and PciIo protocols on Controller.
-
- @param [in] pThis Protocol instance pointer.
- @param [in] Controller Handle of device to stop driver on.
- @param [in] NumberOfChildren How many children need to be stopped.
- @param [in] pChildHandleBuffer Not used.
-
- @retval EFI_SUCCESS This driver is removed Controller.
- @retval EFI_DEVICE_ERROR The device could not be stopped due to a device error.
- @retval other This driver was not removed from this device.
-
-**/
-EFI_STATUS
-EFIAPI
-DriverStop (
- IN EFI_DRIVER_BINDING_PROTOCOL * pThis,
- IN EFI_HANDLE Controller,
- IN UINTN NumberOfChildren,
- IN EFI_HANDLE * ChildHandleBuffer
- )
-{
- BOOLEAN AllChildrenStopped;
- UINTN Index;
- EFI_SIMPLE_NETWORK_PROTOCOL *SimpleNetwork;
- EFI_STATUS Status = EFI_SUCCESS;
- NIC_DEVICE *pNicDevice;
-
- //
- // Complete all outstanding transactions to Controller.
- // Don't allow any new transaction to Controller to be started.
- //
- if (NumberOfChildren == 0) {
-
- Status = gBS->OpenProtocol (
- Controller,
- &gEfiSimpleNetworkProtocolGuid,
- (VOID **) &SimpleNetwork,
- pThis->DriverBindingHandle,
- Controller,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
-
- if (EFI_ERROR(Status)) {
- //
- // This is a 2nd type handle(multi-lun root), it needs to close devicepath
- // and usbio protocol.
- //
- gBS->CloseProtocol (
- Controller,
- &gEfiDevicePathProtocolGuid,
- pThis->DriverBindingHandle,
- Controller
- );
- gBS->CloseProtocol (
- Controller,
- &gEfiUsbIoProtocolGuid,
- pThis->DriverBindingHandle,
- Controller
- );
- return EFI_SUCCESS;
- }
-
- pNicDevice = DEV_FROM_SIMPLE_NETWORK ( SimpleNetwork );
-
- Status = gBS->UninstallMultipleProtocolInterfaces (
- Controller,
- &gEfiCallerIdGuid,
- pNicDevice,
- &gEfiSimpleNetworkProtocolGuid,
- &pNicDevice->SimpleNetwork,
- &gEfiDevicePathProtocolGuid,
- pNicDevice->MyDevPath,
- NULL
- );
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
- //
- // Close the bus driver
- //
- Status = gBS->CloseProtocol (
- Controller,
- &gEfiDevicePathProtocolGuid,
- pThis->DriverBindingHandle,
- Controller
- );
-
- if (EFI_ERROR(Status)){
- DEBUG ((EFI_D_ERROR, "driver stop: gBS->CloseProtocol:EfiDevicePathProtocol error. Status %r\n", Status));
- }
-
- Status = gBS->CloseProtocol (
- Controller,
- &gEfiUsbIoProtocolGuid,
- pThis->DriverBindingHandle,
- Controller
- );
-
- if (EFI_ERROR(Status)){
- DEBUG ((EFI_D_ERROR, "driver stop: gBS->CloseProtocol:EfiUsbIoProtocol error. Status %r\n", Status));
- }
- return EFI_SUCCESS;
- }
- AllChildrenStopped = TRUE;
-
- for (Index = 0; Index < NumberOfChildren; Index++) {
-
- Status = gBS->OpenProtocol (
- ChildHandleBuffer[Index],
- &gEfiSimpleNetworkProtocolGuid,
- (VOID **) &SimpleNetwork,
- pThis->DriverBindingHandle,
- Controller,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
-
- if (EFI_ERROR (Status)) {
- AllChildrenStopped = FALSE;
- DEBUG ((EFI_D_ERROR, "Fail to stop No.%d multi-lun child handle when opening SimpleNetwork\n", (UINT32)Index));
- continue;
- }
-
- pNicDevice = DEV_FROM_SIMPLE_NETWORK ( SimpleNetwork );
-
- gBS->CloseProtocol (
- Controller,
- &gEfiUsbIoProtocolGuid,
- pThis->DriverBindingHandle,
- ChildHandleBuffer[Index]
- );
-
- Status = gBS->UninstallMultipleProtocolInterfaces (
- ChildHandleBuffer[Index],
- &gEfiCallerIdGuid,
- pNicDevice,
- &gEfiSimpleNetworkProtocolGuid,
- &pNicDevice->SimpleNetwork,
- &gEfiDevicePathProtocolGuid,
- pNicDevice->MyDevPath,
- NULL
- );
-
- if (EFI_ERROR (Status)) {
- Status = gBS->OpenProtocol (
- Controller,
- &gEfiUsbIoProtocolGuid,
- (VOID **) &pNicDevice->pUsbIo,
- pThis->DriverBindingHandle,
- ChildHandleBuffer[Index],
- EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
- );
- }
- else {
- int i;
- RX_PKT * pCurr = pNicDevice->QueueHead;
- RX_PKT * pFree;
-
- for ( i = 0 ; i < MAX_QUEUE_SIZE ; i++) {
- if ( NULL != pCurr ) {
- pFree = pCurr;
- pCurr = pCurr->pNext;
- gBS->FreePool (pFree);
- }
- }
-
- if ( NULL != pNicDevice->pRxTest)
- gBS->FreePool (pNicDevice->pRxTest);
-
- if ( NULL != pNicDevice->pTxTest)
- gBS->FreePool (pNicDevice->pTxTest);
-
- if ( NULL != pNicDevice->MyDevPath)
- gBS->FreePool (pNicDevice->MyDevPath);
-
- if ( NULL != pNicDevice)
- gBS->FreePool (pNicDevice);
- }
- }
-
- if (!AllChildrenStopped) {
- return EFI_DEVICE_ERROR;
- }
- return EFI_SUCCESS;
-}
-
-
-/**
- Driver binding protocol declaration
-**/
-EFI_DRIVER_BINDING_PROTOCOL gDriverBinding = {
- DriverSupported,
- DriverStart,
- DriverStop,
- 0xa,
- NULL,
- NULL
-};
-
-
-/**
- Ax88772 driver unload routine.
-
- @param [in] ImageHandle Handle for the image.
-
- @retval EFI_SUCCESS Image may be unloaded
-
-**/
-EFI_STATUS
-EFIAPI
-DriverUnload (
- IN EFI_HANDLE ImageHandle
- )
-{
- UINTN BufferSize;
- UINTN Index;
- UINTN Max;
- EFI_HANDLE * pHandle;
- EFI_STATUS Status;
-
- //
- // Determine which devices are using this driver
- //
- BufferSize = 0;
- pHandle = NULL;
- Status = gBS->LocateHandle (
- ByProtocol,
- &gEfiCallerIdGuid,
- NULL,
- &BufferSize,
- NULL );
- if ( EFI_BUFFER_TOO_SMALL == Status ) {
- for ( ; ; ) {
- //
- // One or more block IO devices are present
- //
- Status = gBS->AllocatePool (
- EfiRuntimeServicesData,
- BufferSize,
- (VOID **) &pHandle
- );
- if ( EFI_ERROR ( Status )) {
- DEBUG ((EFI_D_ERROR, "Insufficient memory, failed handle buffer allocation\r\n"));
- break;
- }
-
- //
- // Locate the block IO devices
- //
- Status = gBS->LocateHandle (
- ByProtocol,
- &gEfiCallerIdGuid,
- NULL,
- &BufferSize,
- pHandle );
- if ( EFI_ERROR ( Status )) {
- //
- // Error getting handles
- //
- break;
- }
-
- //
- // Remove any use of the driver
- //
- Max = BufferSize / sizeof ( pHandle[ 0 ]);
- for ( Index = 0; Max > Index; Index++ ) {
- Status = DriverStop ( &gDriverBinding,
- pHandle[ Index ],
- 0,
- NULL );
- if ( EFI_ERROR ( Status )) {
- DEBUG ((EFI_D_ERROR, "WARNING - Failed to shutdown the driver on handle %08x\r\n", pHandle[ Index ]));
- break;
- }
- }
- break;
- }
- }
- else {
- if ( EFI_NOT_FOUND == Status ) {
- //
- // No devices were found
- //
- Status = EFI_SUCCESS;
- }
- }
-
- //
- // Free the handle array
- //
- if ( NULL != pHandle ) {
- gBS->FreePool ( pHandle );
- }
-
- //
- // Remove the protocols installed by the EntryPoint routine.
- //
- if ( !EFI_ERROR ( Status )) {
- gBS->UninstallMultipleProtocolInterfaces (
- ImageHandle,
- &gEfiDriverBindingProtocolGuid,
- &gDriverBinding,
- &gEfiComponentNameProtocolGuid,
- &gComponentName,
- &gEfiComponentName2ProtocolGuid,
- &gComponentName2,
- NULL
- );
-
- DEBUG (( DEBUG_POOL | DEBUG_INIT | DEBUG_INFO,
- "Removed: gEfiComponentName2ProtocolGuid from 0x%08x\r\n",
- ImageHandle ));
- DEBUG (( DEBUG_POOL | DEBUG_INIT | DEBUG_INFO,
- "Removed: gEfiComponentNameProtocolGuid from 0x%08x\r\n",
- ImageHandle ));
- DEBUG (( DEBUG_POOL | DEBUG_INIT | DEBUG_INFO,
- "Removed: gEfiDriverBindingProtocolGuid from 0x%08x\r\n",
- ImageHandle ));
-
- }
-
- return Status;
-}
-
-
-/**
-Ax88772 driver entry point.
-
-@param [in] ImageHandle Handle for the image.
-@param [in] pSystemTable Address of the system table.
-
-@retval EFI_SUCCESS Image successfully loaded.
-
-**/
-EFI_STATUS
-EFIAPI
-EntryPoint (
- IN EFI_HANDLE ImageHandle,
- IN EFI_SYSTEM_TABLE * pSystemTable
- )
-{
- EFI_STATUS Status;
-
- //
- // Add the driver to the list of drivers
- //
- Status = EfiLibInstallDriverBindingComponentName2 (
- ImageHandle,
- pSystemTable,
- &gDriverBinding,
- ImageHandle,
- &gComponentName,
- &gComponentName2
- );
- if ( !EFI_ERROR ( Status )) {
- DEBUG ((EFI_D_INFO, "Installed: gEfiDriverBindingProtocolGuid on 0x%08x\r\n",
- ImageHandle));
- DEBUG ((EFI_D_INFO, "Installed: gEfiComponentNameProtocolGuid on 0x%08x\r\n",
- ImageHandle));
- DEBUG ((EFI_D_INFO,"Installed: gEfiComponentName2ProtocolGuid on 0x%08x\r\n",
- ImageHandle ));
-
- }
- return Status;
-}
diff --git a/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772b/SimpleNetwork.c b/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772b/SimpleNetwork.c
deleted file mode 100644
index 76babed..0000000
--- a/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772b/SimpleNetwork.c
+++ /dev/null
@@ -1,1657 +0,0 @@
-/** @file
- Provides the Simple Network functions.
-
- Copyright (c) 2011 - 2016, Intel Corporation. All rights reserved.
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include "Ax88772.h"
-
-/**
- This function updates the filtering on the receiver.
-
- This support routine calls ::Ax88772MacAddressSet to update
- the MAC address. This routine then rebuilds the multicast
- hash by calling ::Ax88772MulticastClear and ::Ax88772MulticastSet.
- Finally this routine enables the receiver by calling
- ::Ax88772RxControl.
-
- @param [in] pSimpleNetwork Simple network mode pointer
-
- @retval EFI_SUCCESS This operation was successful.
- @retval EFI_NOT_STARTED The network interface was not started.
- @retval EFI_INVALID_PARAMETER pSimpleNetwork parameter was NULL or did not point to a valid
- EFI_SIMPLE_NETWORK_PROTOCOL structure.
- @retval EFI_DEVICE_ERROR The command could not be sent to the network interface.
- @retval EFI_UNSUPPORTED The increased buffer size feature is not supported.
-
-**/
-EFI_STATUS
-ReceiveFilterUpdate (
- IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork
- )
-{
- EFI_SIMPLE_NETWORK_MODE * pMode;
- NIC_DEVICE * pNicDevice;
- EFI_STATUS Status;
- UINT32 Index;
-
- //
- // Set the MAC address
- //
- pNicDevice = DEV_FROM_SIMPLE_NETWORK ( pSimpleNetwork );
- pMode = pSimpleNetwork->Mode;
-
- //
- // Clear the multicast hash table
- //
- Ax88772MulticastClear ( pNicDevice );
-
- //
- // Load the multicast hash table
- //
- if ( 0 != ( pMode->ReceiveFilterSetting & EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST )) {
- for ( Index = 0; Index < pMode->MCastFilterCount; Index++ ) {
- //
- // Enable the next multicast address
- //
- Ax88772MulticastSet ( pNicDevice,
- &pMode->MCastFilter[ Index ].Addr[0]);
- }
- }
-
- Status = Ax88772RxControl ( pNicDevice, pMode->ReceiveFilterSetting );
-
- return Status;
-}
-
-
-/**
- This function updates the SNP driver status.
-
- This function gets the current interrupt and recycled transmit
- buffer status from the network interface. The interrupt status
- and the media status are returned as a bit mask in InterruptStatus.
- If InterruptStatus is NULL, the interrupt status will not be read.
- Upon successful return of the media status, the MediaPresent field
- of EFI_SIMPLE_NETWORK_MODE will be updated to reflect any change
- of media status. If TxBuf is not NULL, a recycled transmit buffer
- address will be retrived. If a recycled transmit buffer address
- is returned in TxBuf, then the buffer has been successfully
- transmitted, and the status for that buffer is cleared.
-
- This function calls ::Ax88772Rx to update the media status and
- queue any receive packets.
-
- @param [in] pSimpleNetwork Protocol instance pointer
- @param [in] pInterruptStatus A pointer to the bit mask of the current active interrupts.
- If this is NULL, the interrupt status will not be read from
- the device. If this is not NULL, the interrupt status will
- be read from teh device. When the interrupt status is read,
- it will also be cleared. Clearing the transmit interrupt
- does not empty the recycled transmit buffer array.
- @param [out] ppTxBuf Recycled transmit buffer address. The network interface will
- not transmit if its internal recycled transmit buffer array is
- full. Reading the transmit buffer does not clear the transmit
- interrupt. If this is NULL, then the transmit buffer status
- will not be read. If there are not transmit buffers to recycle
- and TxBuf is not NULL, *TxBuf will be set to NULL.
-
- @retval EFI_SUCCESS This operation was successful.
- @retval EFI_NOT_STARTED The network interface was not started.
- @retval EFI_INVALID_PARAMETER pSimpleNetwork parameter was NULL or did not point to a valid
- EFI_SIMPLE_NETWORK_PROTOCOL structure.
- @retval EFI_DEVICE_ERROR The command could not be sent to the network interface.
-
-**/
-EFI_STATUS
-EFIAPI
-SN_GetStatus (
- IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork,
- OUT UINT32 * pInterruptStatus,
- OUT VOID ** ppTxBuf
- )
-{
- EFI_SIMPLE_NETWORK_MODE * pMode;
- NIC_DEVICE * pNicDevice;
- EFI_STATUS Status;
- BOOLEAN bFullDuplex;
- BOOLEAN bLinkUp;
- BOOLEAN bSpeed100;
- EFI_TPL TplPrevious;
-
- TplPrevious = gBS->RaiseTPL(TPL_CALLBACK);
- //
- // Verify the parameters
- //
- if (( NULL != pSimpleNetwork ) && ( NULL != pSimpleNetwork->Mode )) {
- //
- // Return the transmit buffer
- //
-
- pNicDevice = DEV_FROM_SIMPLE_NETWORK ( pSimpleNetwork );
- if (( NULL != ppTxBuf ) && ( NULL != pNicDevice->pTxBuffer )) {
- *ppTxBuf = pNicDevice->pTxBuffer;
- pNicDevice->pTxBuffer = NULL;
- }
-
- //
- // Determine if interface is running
- //
- pMode = pSimpleNetwork->Mode;
- if ( EfiSimpleNetworkInitialized == pMode->State ) {
-
- if ( pNicDevice->LinkIdleCnt > MAX_LINKIDLE_THRESHOLD) {
-
- bLinkUp = pNicDevice->bLinkUp;
- bSpeed100 = pNicDevice->b100Mbps;
- bFullDuplex = pNicDevice->bFullDuplex;
- Status = Ax88772NegotiateLinkComplete ( pNicDevice,
- &pNicDevice->PollCount,
- &pNicDevice->bComplete,
- &pNicDevice->bLinkUp,
- &pNicDevice->b100Mbps,
- &pNicDevice->bFullDuplex );
-
- //
- // Determine if the autonegotiation is complete
- //
- if ( pNicDevice->bComplete ) {
- if ( pNicDevice->bLinkUp ) {
- if (( bSpeed100 && ( !pNicDevice->b100Mbps ))
- || (( !bSpeed100 ) && pNicDevice->b100Mbps )
- || ( bFullDuplex && ( !pNicDevice->bFullDuplex ))
- || (( !bFullDuplex ) && pNicDevice->bFullDuplex )) {
- pNicDevice->PollCount = 0;
- DEBUG (( EFI_D_INFO , "Reset to establish proper link setup: %d Mbps, %a duplex\r\n",
- pNicDevice->b100Mbps ? 100 : 10, pNicDevice->bFullDuplex ? "Full" : "Half"));
- Status = SN_Reset ( &pNicDevice->SimpleNetwork, FALSE );
- }
- if (( !bLinkUp ) && pNicDevice->bLinkUp ) {
- //
- // Display the autonegotiation status
- //
- DEBUG (( EFI_D_INFO , "Link: Up, %d Mbps, %a duplex\r\n",
- pNicDevice->b100Mbps ? 100 : 10, pNicDevice->bFullDuplex ? "Full" : "Half"));
-
- }
- pNicDevice->LinkIdleCnt = 0;
- }
- }
- //
- // Update the link status
- //
- if ( bLinkUp && ( !pNicDevice->bLinkUp )) {
- DEBUG (( EFI_D_INFO , "Link: Down\r\n"));
- }
- }
-
- pMode->MediaPresent = pNicDevice->bLinkUp;
- //
- // Return the interrupt status
- //
- if ( NULL != pInterruptStatus ) {
- *pInterruptStatus = 0;
- }
- Status = EFI_SUCCESS;
- }
- else {
- if ( EfiSimpleNetworkStarted == pMode->State ) {
- Status = EFI_DEVICE_ERROR;
- }
- else {
- Status = EFI_NOT_STARTED;
- }
- }
-
- }
- else {
- Status = EFI_INVALID_PARAMETER;
- }
- gBS->RestoreTPL(TplPrevious) ;
-
- return Status;
-}
-
-
-/**
- Resets the network adapter and allocates the transmit and receive buffers
- required by the network interface; optionally, also requests allocation of
- additional transmit and receive buffers. This routine must be called before
- any other routine in the Simple Network protocol is called.
-
- @param [in] pSimpleNetwork Protocol instance pointer
- @param [in] ExtraRxBufferSize Size in bytes to add to the receive buffer allocation
- @param [in] ExtraTxBufferSize Size in bytes to add to the transmit buffer allocation
-
- @retval EFI_SUCCESS This operation was successful.
- @retval EFI_NOT_STARTED The network interface was not started.
- @retval EFI_OUT_OF_RESOURCES There was not enough memory for the transmit and receive buffers
- @retval EFI_INVALID_PARAMETER pSimpleNetwork parameter was NULL or did not point to a valid
- EFI_SIMPLE_NETWORK_PROTOCOL structure.
- @retval EFI_DEVICE_ERROR The command could not be sent to the network interface.
- @retval EFI_UNSUPPORTED The increased buffer size feature is not supported.
-
-**/
-EFI_STATUS
-EFIAPI
-SN_Initialize (
- IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork,
- IN UINTN ExtraRxBufferSize,
- IN UINTN ExtraTxBufferSize
- )
-{
- EFI_SIMPLE_NETWORK_MODE * pMode;
- EFI_STATUS Status;
- UINT32 TmpState;
- EFI_TPL TplPrevious;
-
- TplPrevious = gBS->RaiseTPL (TPL_CALLBACK);
- //
- // Verify the parameters
- //
- if (( NULL != pSimpleNetwork ) && ( NULL != pSimpleNetwork->Mode )) {
- //
- // Determine if the interface is already started
- //
- pMode = pSimpleNetwork->Mode;
- if ( EfiSimpleNetworkStarted == pMode->State ) {
- if (( 0 == ExtraRxBufferSize ) && ( 0 == ExtraTxBufferSize )) {
- //
- // Start the adapter
- //
- TmpState = pMode->State;
- pMode->State = EfiSimpleNetworkInitialized;
- Status = SN_Reset ( pSimpleNetwork, FALSE );
- if ( EFI_ERROR ( Status )) {
- //
- // Update the network state
- //
- pMode->State = TmpState;
- DEBUG (( EFI_D_ERROR , "SN_reset failed\n"));
- }
- }
- else {
- DEBUG (( EFI_D_ERROR , "Increase ExtraRxBufferSize = %d ExtraTxBufferSize=%d\n",
- ExtraRxBufferSize, ExtraTxBufferSize));
- Status = EFI_UNSUPPORTED;
- }
- }
- else {
- Status = EFI_NOT_STARTED;
- }
- }
- else {
- Status = EFI_INVALID_PARAMETER;
- }
- gBS->RestoreTPL (TplPrevious);
-
- return Status;
-}
-
-
-/**
- This function converts a multicast IP address to a multicast HW MAC address
- for all packet transactions.
-
- @param [in] pSimpleNetwork Protocol instance pointer
- @param [in] bIPv6 Set to TRUE if the multicast IP address is IPv6 [RFC2460].
- Set to FALSE if the multicast IP address is IPv4 [RFC 791].
- @param [in] pIP The multicast IP address that is to be converted to a
- multicast HW MAC address.
- @param [in] pMAC The multicast HW MAC address that is to be generated from IP.
-
- @retval EFI_SUCCESS This operation was successful.
- @retval EFI_NOT_STARTED The network interface was not started.
- @retval EFI_INVALID_PARAMETER pSimpleNetwork parameter was NULL or did not point to a valid
- EFI_SIMPLE_NETWORK_PROTOCOL structure.
- @retval EFI_DEVICE_ERROR The command could not be sent to the network interface.
- @retval EFI_UNSUPPORTED The increased buffer size feature is not supported.
-
-**/
-EFI_STATUS
-EFIAPI
-SN_MCastIPtoMAC (
- IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork,
- IN BOOLEAN bIPv6,
- IN EFI_IP_ADDRESS * pIP,
- OUT EFI_MAC_ADDRESS * pMAC
- )
-{
- EFI_STATUS Status;
- EFI_TPL TplPrevious;
-
- TplPrevious = gBS->RaiseTPL(TPL_CALLBACK);
- //
- // Get pointer to SNP driver instance for *this.
- //
- if (pSimpleNetwork == NULL) {
- gBS->RestoreTPL(TplPrevious);
- return EFI_INVALID_PARAMETER;
- }
-
- if (pIP == NULL || pMAC == NULL) {
- gBS->RestoreTPL(TplPrevious);
- return EFI_INVALID_PARAMETER;
- }
-
- if (bIPv6){
- Status = EFI_UNSUPPORTED;
- }
- else {
- //
- // check if the ip given is a mcast IP
- //
- if ((pIP->v4.Addr[0] & 0xF0) != 0xE0) {
- gBS->RestoreTPL(TplPrevious);
- return EFI_INVALID_PARAMETER;
- }
- else {
- if (pSimpleNetwork->Mode->State == EfiSimpleNetworkInitialized)
- {
- pMAC->Addr[0] = 0x01;
- pMAC->Addr[1] = 0x00;
- pMAC->Addr[2] = 0x5e;
- pMAC->Addr[3] = (UINT8) (pIP->v4.Addr[1] & 0x7f);
- pMAC->Addr[4] = (UINT8) pIP->v4.Addr[2];
- pMAC->Addr[5] = (UINT8) pIP->v4.Addr[3];
- Status = EFI_SUCCESS;
- }
- else if (pSimpleNetwork->Mode->State == EfiSimpleNetworkStarted) {
- Status = EFI_DEVICE_ERROR;
- }
- else {
- Status = EFI_NOT_STARTED;
- }
- gBS->RestoreTPL(TplPrevious);
- }
- }
- return Status;
-}
-
-
-/**
- This function performs read and write operations on the NVRAM device
- attached to a network interface.
-
- @param [in] pSimpleNetwork Protocol instance pointer
- @param [in] ReadWrite TRUE for read operations, FALSE for write operations.
- @param [in] Offset Byte offset in the NVRAM device at which to start the
- read or write operation. This must be a multiple of
- NvRamAccessSize and less than NvRamSize.
- @param [in] BufferSize The number of bytes to read or write from the NVRAM device.
- This must also be a multiple of NvramAccessSize.
- @param [in, out] pBuffer A pointer to the data buffer.
-
- @retval EFI_SUCCESS This operation was successful.
- @retval EFI_NOT_STARTED The network interface was not started.
- @retval EFI_INVALID_PARAMETER pSimpleNetwork parameter was NULL or did not point to a valid
- EFI_SIMPLE_NETWORK_PROTOCOL structure.
- @retval EFI_DEVICE_ERROR The command could not be sent to the network interface.
- @retval EFI_UNSUPPORTED The increased buffer size feature is not supported.
-
-**/
-EFI_STATUS
-EFIAPI
-SN_NvData (
- IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork,
- IN BOOLEAN ReadWrite,
- IN UINTN Offset,
- IN UINTN BufferSize,
- IN OUT VOID * pBuffer
- )
-{
- EFI_STATUS Status;
- //
- // This is not currently supported
- //
- Status = EFI_UNSUPPORTED;
- return Status;
-}
-
-VOID
-FillPkt2Queue (
- IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork,
- IN UINTN BufLength)
-{
-
- UINT16 * pLength;
- UINT16 * pLengthBar;
- UINT8* pData;
- UINT32 offset;
- NIC_DEVICE * pNicDevice;
-
- pNicDevice = DEV_FROM_SIMPLE_NETWORK ( pSimpleNetwork);
- 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;
- }
-
- if (TRUE == pNicDevice->pNextFill->f_Used) {
- return;
- }
- else {
- pData = pNicDevice->pBulkInBuff + offset + 4;
- pNicDevice->pNextFill->f_Used = TRUE;
- pNicDevice->pNextFill->Length = *pLength;
- CopyMem (&pNicDevice->pNextFill->Data[0], pData, *pLength);
-
- pNicDevice->pNextFill = pNicDevice->pNextFill->pNext;
- offset += ((*pLength + HW_HDR_LENGTH - 1) &~3) + 1;
- pNicDevice->PktCntInQueue++;
- }
-
- }
-}
-
-EFI_STATUS
-EFIAPI
-SN_Receive (
- IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork,
- OUT UINTN * pHeaderSize,
- OUT UINTN * pBufferSize,
- OUT VOID * pBuffer,
- OUT EFI_MAC_ADDRESS * pSrcAddr,
- OUT EFI_MAC_ADDRESS * pDestAddr,
- OUT UINT16 * pProtocol
- )
-{
- EFI_SIMPLE_NETWORK_MODE * pMode;
- NIC_DEVICE * pNicDevice;
- EFI_STATUS Status;
- EFI_TPL TplPrevious;
- UINT16 Type;
- EFI_USB_IO_PROTOCOL *pUsbIo;
- UINTN LengthInBytes;
- UINT32 TransferStatus;
- RX_PKT * pFirstFill;
- TplPrevious = gBS->RaiseTPL (TPL_CALLBACK);
-
- //
- // Verify the parameters
- //
- if (( NULL != pSimpleNetwork ) &&
- ( NULL != pSimpleNetwork->Mode ) &&
- (NULL != pBufferSize) &&
- (NULL != pBuffer)) {
- //
- // The interface must be running
- //
- pMode = pSimpleNetwork->Mode;
- if ( EfiSimpleNetworkInitialized == pMode->State ) {
- //
- // Update the link status
- //
- pNicDevice = DEV_FROM_SIMPLE_NETWORK ( pSimpleNetwork );
- pNicDevice->LinkIdleCnt++;
- pMode->MediaPresent = pNicDevice->bLinkUp;
-
- if ( pMode->MediaPresent && pNicDevice->bComplete) {
-
-
- if (pNicDevice->PktCntInQueue != 0 ) {
- DEBUG (( EFI_D_INFO, "pNicDevice->PktCntInQueue = %d\n",
- pNicDevice->PktCntInQueue));
- }
-
- LengthInBytes = MAX_BULKIN_SIZE;
- if (pNicDevice->PktCntInQueue == 0 ){
- //
- // Attempt to do bulk in
- //
- SetMem (&pNicDevice->pBulkInBuff[0], 4, 0);
- pUsbIo = pNicDevice->pUsbIo;
- Status = pUsbIo->UsbBulkTransfer ( pUsbIo,
- USB_ENDPOINT_DIR_IN | BULK_IN_ENDPOINT,
- &pNicDevice->pBulkInBuff[0],
- &LengthInBytes,
- BULKIN_TIMEOUT,
- &TransferStatus );
-
- if (LengthInBytes != 0 && !EFI_ERROR(Status) && !EFI_ERROR(TransferStatus) ){
- FillPkt2Queue(pSimpleNetwork, LengthInBytes);
- }
- }
-
- pFirstFill = pNicDevice->pFirstFill;
-
- if (TRUE == pFirstFill->f_Used) {
- ETHERNET_HEADER * pHeader;
- pNicDevice->LinkIdleCnt = 0;
- CopyMem (pBuffer, &pFirstFill->Data[0], pFirstFill->Length);
- pHeader = (ETHERNET_HEADER *) &pFirstFill->Data[0];
-
- DEBUG (( EFI_D_INFO, "RX: %02x-%02x-%02x-%02x-%02x-%02x "
- "%02x-%02x-%02x-%02x-%02x-%02x %02x-%02x %d bytes\r\n",
- pFirstFill->Data[0],
- pFirstFill->Data[1],
- pFirstFill->Data[2],
- pFirstFill->Data[3],
- pFirstFill->Data[4],
- pFirstFill->Data[5],
- pFirstFill->Data[6],
- pFirstFill->Data[7],
- pFirstFill->Data[8],
- pFirstFill->Data[9],
- pFirstFill->Data[10],
- pFirstFill->Data[11],
- pFirstFill->Data[12],
- pFirstFill->Data[13],
- pFirstFill->Length));
-
- if ( NULL != pHeaderSize ) {
- *pHeaderSize = sizeof ( *pHeader );
- }
- if ( NULL != pDestAddr ) {
- CopyMem ( pDestAddr, &pHeader->dest_addr, PXE_HWADDR_LEN_ETHER );
- }
- if ( NULL != pSrcAddr ) {
- CopyMem ( pSrcAddr, &pHeader->src_addr, PXE_HWADDR_LEN_ETHER );
- }
- if ( NULL != pProtocol ) {
- Type = pHeader->type;
- Type = (UINT16)(( Type >> 8 ) | ( Type << 8 ));
- *pProtocol = Type;
- }
- Status = EFI_SUCCESS;
- if (*pBufferSize < pFirstFill->Length) {
- DEBUG (( EFI_D_ERROR, "RX: Buffer was too small"));
- Status = EFI_BUFFER_TOO_SMALL;
- }
- *pBufferSize = pFirstFill->Length;
- pFirstFill->f_Used = FALSE;
- pNicDevice->pFirstFill = pFirstFill->pNext;
- pNicDevice->PktCntInQueue--;
- }
- else {
- pNicDevice->LinkIdleCnt++;
- Status = EFI_NOT_READY;
- }
- }
- else {
- //
- // Link no up
- //
- pNicDevice->LinkIdleCnt++;
- Status = EFI_NOT_READY;
- }
-
- }
- else {
- if (EfiSimpleNetworkStarted == pMode->State) {
- Status = EFI_DEVICE_ERROR;
- }
- else {
- Status = EFI_NOT_STARTED;
- }
- }
- }
- else {
- Status = EFI_INVALID_PARAMETER;
- }
- gBS->RestoreTPL (TplPrevious);
- return Status;
-}
-
-/**
- This function is used to enable and disable the hardware and software receive
- filters for the underlying network device.
-
- The receive filter change is broken down into three steps:
-
- 1. The filter mask bits that are set (ON) in the Enable parameter
- are added to the current receive filter settings.
-
- 2. The filter mask bits that are set (ON) in the Disable parameter
- are subtracted from the updated receive filter settins.
-
- 3. If the resulting filter settigns is not supported by the hardware
- a more liberal setting is selected.
-
- If the same bits are set in the Enable and Disable parameters, then the bits
- in the Disable parameter takes precedence.
-
- If the ResetMCastFilter parameter is TRUE, then the multicast address list
- filter is disabled (irregardless of what other multicast bits are set in
- the enable and Disable parameters). The SNP->Mode->MCastFilterCount field
- is set to zero. The SNP->Mode->MCastFilter contents are undefined.
-
- After enableing or disabling receive filter settings, software should
- verify the new settings by checking the SNP->Mode->ReceeiveFilterSettings,
- SNP->Mode->MCastFilterCount and SNP->Mode->MCastFilter fields.
-
- Note: Some network drivers and/or devices will automatically promote
- receive filter settings if the requested setting can not be honored.
- For example, if a request for four multicast addresses is made and
- the underlying hardware only supports two multicast addresses the
- driver might set the promiscuous or promiscuous multicast receive filters
- instead. The receiving software is responsible for discarding any extra
- packets that get through the hardware receive filters.
-
- If ResetMCastFilter is TRUE, then the multicast receive filter list
- on the network interface will be reset to the default multicast receive
- filter list. If ResetMCastFilter is FALSE, and this network interface
- allows the multicast receive filter list to be modified, then the
- MCastFilterCnt and MCastFilter are used to update the current multicast
- receive filter list. The modified receive filter list settings can be
- found in the MCastFilter field of EFI_SIMPLE_NETWORK_MODE.
-
- This routine calls ::ReceiveFilterUpdate to update the receive
- state in the network adapter.
-
- @param [in] pSimpleNetwork Protocol instance pointer
- @param [in] Enable A bit mask of receive filters to enable on the network interface.
- @param [in] Disable A bit mask of receive filters to disable on the network interface.
- For backward compatibility with EFI 1.1 platforms, the
- EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST bit must be set
- when the ResetMCastFilter parameter is TRUE.
- @param [in] bResetMCastFilter Set to TRUE to reset the contents of the multicast receive
- filters on the network interface to their default values.
- @param [in] MCastFilterCnt Number of multicast HW MAC address in the new MCastFilter list.
- This value must be less than or equal to the MaxMCastFilterCnt
- field of EFI_SIMPLE_NETWORK_MODE. This field is optional if
- ResetMCastFilter is TRUE.
- @param [in] pMCastFilter A pointer to a list of new multicast receive filter HW MAC
- addresses. This list will replace any existing multicast
- HW MAC address list. This field is optional if ResetMCastFilter
- is TRUE.
-
- @retval EFI_SUCCESS This operation was successful.
- @retval EFI_NOT_STARTED The network interface was not started.
- @retval EFI_INVALID_PARAMETER pSimpleNetwork parameter was NULL or did not point to a valid
- EFI_SIMPLE_NETWORK_PROTOCOL structure.
- @retval EFI_DEVICE_ERROR The command could not be sent to the network interface.
- @retval EFI_UNSUPPORTED The increased buffer size feature is not supported.
-
-**/
-EFI_STATUS
-EFIAPI
-SN_ReceiveFilters (
- IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork,
- IN UINT32 Enable,
- IN UINT32 Disable,
-/*
-#define EFI_SIMPLE_NETWORK_RECEIVE_UNICAST 0x01
-#define EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST 0x02
-#define EFI_SIMPLE_NETWORK_RECEIVE_BROADCAST 0x04
-#define EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS 0x08
-#define EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS_MULTICAST 0x10
-*/
- IN BOOLEAN bResetMCastFilter,
- IN UINTN MCastFilterCnt,
- IN EFI_MAC_ADDRESS * pMCastFilter
- )
-{
- EFI_SIMPLE_NETWORK_MODE * pMode;
- EFI_STATUS Status = EFI_SUCCESS;
- EFI_TPL TplPrevious;
-
- TplPrevious = gBS->RaiseTPL(TPL_CALLBACK);
- pMode = pSimpleNetwork->Mode;
-
- if (pSimpleNetwork == NULL) {
- gBS->RestoreTPL(TplPrevious);
- return EFI_INVALID_PARAMETER;
- }
-
- switch (pMode->State) {
- case EfiSimpleNetworkInitialized:
- break;
- case EfiSimpleNetworkStopped:
- Status = EFI_NOT_STARTED;
- gBS->RestoreTPL(TplPrevious);
- return Status;
- default:
- Status = EFI_DEVICE_ERROR;
- gBS->RestoreTPL(TplPrevious);
- return Status;
- }
-
- //
- // check if we are asked to enable or disable something that the UNDI
- // does not even support!
- //
- if (((Enable &~pMode->ReceiveFilterMask) != 0) ||
- ((Disable &~pMode->ReceiveFilterMask) != 0)) {
- Status = EFI_INVALID_PARAMETER;
- gBS->RestoreTPL(TplPrevious);
- return Status;
- }
-
- if (bResetMCastFilter) {
- Disable |= (EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST & pMode->ReceiveFilterMask);
- pMode->MCastFilterCount = 0;
- if ( (0 == (pMode->ReceiveFilterSetting & EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST))
- && Enable == 0 && Disable == 2) {
- gBS->RestoreTPL(TplPrevious);
- return EFI_SUCCESS;
- }
- }
- else {
- if (MCastFilterCnt != 0) {
- UINTN i;
- EFI_MAC_ADDRESS * pMulticastAddress;
- pMulticastAddress = pMCastFilter;
-
- if ((MCastFilterCnt > pMode->MaxMCastFilterCount) ||
- (pMCastFilter == NULL)) {
- Status = EFI_INVALID_PARAMETER;
- gBS->RestoreTPL(TplPrevious);
- return Status;
- }
-
- for ( i = 0 ; i < MCastFilterCnt ; i++ ) {
- UINT8 tmp;
- tmp = pMulticastAddress->Addr[0];
- if ( (tmp & 0x01) != 0x01 ) {
- gBS->RestoreTPL(TplPrevious);
- return EFI_INVALID_PARAMETER;
- }
- pMulticastAddress++;
- }
-
- pMode->MCastFilterCount = (UINT32)MCastFilterCnt;
- CopyMem (&pMode->MCastFilter[0],
- pMCastFilter,
- MCastFilterCnt * sizeof ( EFI_MAC_ADDRESS));
- }
- }
-
- if (Enable == 0 && Disable == 0 && !bResetMCastFilter && MCastFilterCnt == 0) {
- Status = EFI_SUCCESS;
- gBS->RestoreTPL(TplPrevious);
- return Status;
- }
-
- if ((Enable & EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST) != 0 && MCastFilterCnt == 0) {
- Status = EFI_INVALID_PARAMETER;
- gBS->RestoreTPL(TplPrevious);
- return Status;
- }
-
- pMode->ReceiveFilterSetting |= Enable;
- pMode->ReceiveFilterSetting &= ~Disable;
- Status = ReceiveFilterUpdate (pSimpleNetwork);
-
- if (EFI_DEVICE_ERROR == Status || EFI_INVALID_PARAMETER == Status)
- Status = EFI_SUCCESS;
-
- gBS->RestoreTPL(TplPrevious);
- return Status;
-}
-
-/**
- Reset the network adapter.
-
- Resets a network adapter and reinitializes it with the parameters that
- were provided in the previous call to Initialize (). The transmit and
- receive queues are cleared. Receive filters, the station address, the
- statistics, and the multicast-IP-to-HW MAC addresses are not reset by
- this call.
-
- This routine calls ::Ax88772Reset to perform the adapter specific
- reset operation. This routine also starts the link negotiation
- by calling ::Ax88772NegotiateLinkStart.
-
- @param [in] pSimpleNetwork Protocol instance pointer
- @param [in] bExtendedVerification Indicates that the driver may perform a more
- exhaustive verification operation of the device
- during reset.
-
- @retval EFI_SUCCESS This operation was successful.
- @retval EFI_NOT_STARTED The network interface was not started.
- @retval EFI_INVALID_PARAMETER pSimpleNetwork parameter was NULL or did not point to a valid
- EFI_SIMPLE_NETWORK_PROTOCOL structure.
- @retval EFI_DEVICE_ERROR The command could not be sent to the network interface.
- @retval EFI_UNSUPPORTED The increased buffer size feature is not supported.
-
-**/
-EFI_STATUS
-EFIAPI
-SN_Reset (
- IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork,
- IN BOOLEAN bExtendedVerification
- )
-{
- EFI_SIMPLE_NETWORK_MODE * pMode;
- NIC_DEVICE * pNicDevice;
- EFI_STATUS Status;
- EFI_TPL TplPrevious;
-
- TplPrevious = gBS->RaiseTPL(TPL_CALLBACK);
- //
- // Verify the parameters
- //
- if (( NULL != pSimpleNetwork ) && ( NULL != pSimpleNetwork->Mode )) {
- pMode = pSimpleNetwork->Mode;
- if ( EfiSimpleNetworkInitialized == pMode->State ) {
- //
- // Update the device state
- //
- pNicDevice = DEV_FROM_SIMPLE_NETWORK ( pSimpleNetwork );
- pNicDevice->bComplete = FALSE;
- pNicDevice->bLinkUp = FALSE;
- pNicDevice->bHavePkt = FALSE;
- pMode = pSimpleNetwork->Mode;
- pMode->MediaPresent = FALSE;
-
- //
- // Reset the device
- //
- Status = Ax88772Reset ( pNicDevice );
- if ( !EFI_ERROR ( Status )) {
- //
- // Update the receive filters in the adapter
- //
- Status = ReceiveFilterUpdate ( pSimpleNetwork );
-
- //
- // Try to get a connection to the network
- //
- if ( !EFI_ERROR ( Status )) {
- //
- // Start the autonegotiation
- //
- Status = Ax88772NegotiateLinkStart ( pNicDevice );
- }
- }
- }
- else {
- if (EfiSimpleNetworkStarted == pMode->State) {
- Status = EFI_DEVICE_ERROR;
- }
- else {
- Status = EFI_NOT_STARTED;
- }
- }
- }
- else {
- Status = EFI_INVALID_PARAMETER;
- }
- gBS->RestoreTPL ( TplPrevious );
- return Status;
-}
-
-/**
- Initialize the simple network protocol.
-
- This routine calls ::Ax88772MacAddressGet to obtain the
- MAC address.
-
- @param [in] pNicDevice NIC_DEVICE_INSTANCE pointer
-
- @retval EFI_SUCCESS Setup was successful
-
-**/
-EFI_STATUS
-SN_Setup (
- IN NIC_DEVICE * pNicDevice
- )
-{
-
-
- EFI_SIMPLE_NETWORK_MODE * pMode;
- EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork;
- EFI_STATUS Status;
- RX_PKT * pCurr = NULL;
- RX_PKT * pPrev = NULL;
-
- pSimpleNetwork = &pNicDevice->SimpleNetwork;
- pSimpleNetwork->Revision = EFI_SIMPLE_NETWORK_PROTOCOL_REVISION;
- pSimpleNetwork->Start = (EFI_SIMPLE_NETWORK_START)SN_Start;
- pSimpleNetwork->Stop = (EFI_SIMPLE_NETWORK_STOP)SN_Stop;
- pSimpleNetwork->Initialize = (EFI_SIMPLE_NETWORK_INITIALIZE)SN_Initialize;
- pSimpleNetwork->Reset = (EFI_SIMPLE_NETWORK_RESET)SN_Reset;
- pSimpleNetwork->Shutdown = (EFI_SIMPLE_NETWORK_SHUTDOWN)SN_Shutdown;
- pSimpleNetwork->ReceiveFilters = (EFI_SIMPLE_NETWORK_RECEIVE_FILTERS)SN_ReceiveFilters;
- pSimpleNetwork->StationAddress = (EFI_SIMPLE_NETWORK_STATION_ADDRESS)SN_StationAddress;
- pSimpleNetwork->Statistics = (EFI_SIMPLE_NETWORK_STATISTICS)SN_Statistics;
- pSimpleNetwork->MCastIpToMac = (EFI_SIMPLE_NETWORK_MCAST_IP_TO_MAC)SN_MCastIPtoMAC;
- pSimpleNetwork->NvData = (EFI_SIMPLE_NETWORK_NVDATA)SN_NvData;
- pSimpleNetwork->GetStatus = (EFI_SIMPLE_NETWORK_GET_STATUS)SN_GetStatus;
- pSimpleNetwork->Transmit = (EFI_SIMPLE_NETWORK_TRANSMIT)SN_Transmit;
- pSimpleNetwork->Receive = (EFI_SIMPLE_NETWORK_RECEIVE)SN_Receive;
- pSimpleNetwork->WaitForPacket = NULL;
- pMode = &pNicDevice->SimpleNetworkData;
- pSimpleNetwork->Mode = pMode;
- pMode->State = EfiSimpleNetworkStopped;
- pMode->HwAddressSize = PXE_HWADDR_LEN_ETHER;
- pMode->MediaHeaderSize = sizeof ( ETHERNET_HEADER );
- pMode->MaxPacketSize = MAX_ETHERNET_PKT_SIZE;
- pMode->NvRamSize = 0;
- pMode->NvRamAccessSize = 0;
- pMode->ReceiveFilterMask = EFI_SIMPLE_NETWORK_RECEIVE_UNICAST
- | EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST
- | EFI_SIMPLE_NETWORK_RECEIVE_BROADCAST
- | EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS
- | EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS_MULTICAST;
- pMode->ReceiveFilterSetting = EFI_SIMPLE_NETWORK_RECEIVE_UNICAST
- | EFI_SIMPLE_NETWORK_RECEIVE_BROADCAST;
- pMode->MaxMCastFilterCount = MAX_MCAST_FILTER_CNT;
- pMode->MCastFilterCount = 0;
- SetMem ( &pMode->BroadcastAddress,
- PXE_HWADDR_LEN_ETHER,
- 0xff );
- pMode->IfType = EfiNetworkInterfaceUndi;
- pMode->MacAddressChangeable = TRUE;
- pMode->MultipleTxSupported = FALSE;
- pMode->MediaPresentSupported = TRUE;
- pMode->MediaPresent = FALSE;
- pNicDevice->LinkIdleCnt = 0;
- //
- // Read the MAC address
- //
- pNicDevice->PhyId = PHY_ID_INTERNAL;
- pNicDevice->b100Mbps = TRUE;
- pNicDevice->bFullDuplex = TRUE;
-
- Status = Ax88772MacAddressGet (
- pNicDevice,
- &pMode->PermanentAddress.Addr[0]);
-
- if ( !EFI_ERROR ( Status )) {
- int i;
- //
- // Use the hardware address as the current address
- //
-
- CopyMem ( &pMode->CurrentAddress,
- &pMode->PermanentAddress,
- PXE_HWADDR_LEN_ETHER );
-
- CopyMem ( &pNicDevice->MAC,
- &pMode->PermanentAddress,
- PXE_HWADDR_LEN_ETHER );
-
- pNicDevice->PktCntInQueue = 0;
-
- for ( i = 0 ; i < MAX_QUEUE_SIZE ; i++) {
- Status = gBS->AllocatePool ( EfiRuntimeServicesData,
- sizeof (RX_PKT),
- (VOID **) &pCurr);
- if ( EFI_ERROR(Status)) {
- DEBUG (( EFI_D_ERROR, "Memory are not enough\n"));
- return Status;
- }
- pCurr->f_Used = FALSE;
-
- if ( i ) {
- pPrev->pNext = pCurr;
- }
- else {
- pNicDevice->QueueHead = pCurr;
- }
-
- if (MAX_QUEUE_SIZE - 1 == i) {
- pCurr->pNext = pNicDevice->QueueHead;
- }
-
- pPrev = pCurr;
- }
-
- pNicDevice->pNextFill = pNicDevice->QueueHead;
- pNicDevice->pFirstFill = pNicDevice->QueueHead;
-
- Status = gBS->AllocatePool (EfiRuntimeServicesData,
- MAX_BULKIN_SIZE,
- (VOID **) &pNicDevice->pBulkInBuff);
-
- if (EFI_ERROR(Status)) {
- DEBUG (( EFI_D_ERROR, "gBS->AllocatePool for pBulkInBuff error. Status = %r\n",
- Status));
- return Status;
- }
- }
- else {
- DEBUG (( EFI_D_ERROR, "Ax88772MacAddressGet error. Status = %r\n", Status));
- return Status;
- }
-
- Status = gBS->AllocatePool ( EfiRuntimeServicesData,
- sizeof ( RX_TX_PACKET ),
- (VOID **) &pNicDevice->pRxTest );
-
- if (EFI_ERROR (Status)) {
- DEBUG (( EFI_D_ERROR, "gBS->AllocatePool:pNicDevice->pRxTest error. Status = %r\n",
- Status));
- return Status;
- }
-
- Status = gBS->AllocatePool ( EfiRuntimeServicesData,
- sizeof ( RX_TX_PACKET ),
- (VOID **) &pNicDevice->pTxTest );
-
- if (EFI_ERROR (Status)) {
- DEBUG (( EFI_D_ERROR, "gBS->AllocatePool:pNicDevice->pTxTest error. Status = %r\n",
- Status));
- gBS->FreePool (pNicDevice->pRxTest);
- }
-
- return Status;
-}
-
-
-/**
- This routine starts the network interface.
-
- @param [in] pSimpleNetwork Protocol instance pointer
-
- @retval EFI_SUCCESS This operation was successful.
- @retval EFI_ALREADY_STARTED The network interface was already started.
- @retval EFI_INVALID_PARAMETER pSimpleNetwork parameter was NULL or did not point to a valid
- EFI_SIMPLE_NETWORK_PROTOCOL structure.
- @retval EFI_DEVICE_ERROR The command could not be sent to the network interface.
- @retval EFI_UNSUPPORTED The increased buffer size feature is not supported.
-
-**/
-EFI_STATUS
-EFIAPI
-SN_Start (
- IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork
- )
-{
- NIC_DEVICE * pNicDevice;
- EFI_SIMPLE_NETWORK_MODE * pMode;
- EFI_STATUS Status;
- EFI_TPL TplPrevious;
- int i = 0;
- RX_PKT * pCurr = NULL;
-
- TplPrevious = gBS->RaiseTPL(TPL_CALLBACK);
- //
- // Verify the parameters
- //
- Status = EFI_INVALID_PARAMETER;
- if (( NULL != pSimpleNetwork ) && ( NULL != pSimpleNetwork->Mode )) {
- pMode = pSimpleNetwork->Mode;
- if ( EfiSimpleNetworkStopped == pMode->State ) {
- //
- // Initialize the mode structuref
- // NVRAM access is not supported
- //
- ZeroMem ( pMode, sizeof ( *pMode ));
-
- pMode->State = EfiSimpleNetworkStarted;
- pMode->HwAddressSize = PXE_HWADDR_LEN_ETHER;
- pMode->MediaHeaderSize = sizeof ( ETHERNET_HEADER );
- pMode->MaxPacketSize = MAX_ETHERNET_PKT_SIZE;
- pMode->ReceiveFilterMask = EFI_SIMPLE_NETWORK_RECEIVE_UNICAST
- | EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST
- | EFI_SIMPLE_NETWORK_RECEIVE_BROADCAST
- | EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS
- | EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS_MULTICAST;
- pMode->ReceiveFilterSetting = EFI_SIMPLE_NETWORK_RECEIVE_UNICAST;
- pMode->MaxMCastFilterCount = MAX_MCAST_FILTER_CNT;
- pNicDevice = DEV_FROM_SIMPLE_NETWORK ( pSimpleNetwork );
- Status = Ax88772MacAddressGet ( pNicDevice, &pMode->PermanentAddress.Addr[0]);
- CopyMem ( &pMode->CurrentAddress,
- &pMode->PermanentAddress,
- sizeof ( pMode->CurrentAddress ));
- SetMem(&pMode->BroadcastAddress, PXE_HWADDR_LEN_ETHER, 0xff);
- pMode->IfType = EfiNetworkInterfaceUndi;
- pMode->MacAddressChangeable = TRUE;
- pMode->MultipleTxSupported = FALSE;
- pMode->MediaPresentSupported = TRUE;
- pMode->MediaPresent = FALSE;
- pNicDevice->PktCntInQueue = 0;
- pNicDevice->pNextFill = pNicDevice->QueueHead;
- pNicDevice->pFirstFill = pNicDevice->QueueHead;
- pCurr = pNicDevice->QueueHead;
-
- for ( i = 0 ; i < MAX_QUEUE_SIZE ; i++) {
- pCurr->f_Used = FALSE;
- pCurr = pCurr->pNext;
- }
-
- }
- else {
- Status = EFI_ALREADY_STARTED;
- }
- }
- gBS->RestoreTPL ( TplPrevious );
- return Status;
-}
-
-
-/**
- Set the MAC address.
-
- This function modifies or resets the current station address of a
- network interface. If Reset is TRUE, then the current station address
- is set ot the network interface's permanent address. If Reset if FALSE
- then the current station address is changed to the address specified by
- pNew.
-
- This routine calls ::Ax88772MacAddressSet to update the MAC address
- in the network adapter.
-
- @param [in] pSimpleNetwork Protocol instance pointer
- @param [in] bReset Flag used to reset the station address to the
- network interface's permanent address.
- @param [in] pNew New station address to be used for the network
- interface.
-
- @retval EFI_SUCCESS This operation was successful.
- @retval EFI_NOT_STARTED The network interface was not started.
- @retval EFI_INVALID_PARAMETER pSimpleNetwork parameter was NULL or did not point to a valid
- EFI_SIMPLE_NETWORK_PROTOCOL structure.
- @retval EFI_DEVICE_ERROR The command could not be sent to the network interface.
- @retval EFI_UNSUPPORTED The increased buffer size feature is not supported.
-
-**/
-EFI_STATUS
-EFIAPI
-SN_StationAddress (
- IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork,
- IN BOOLEAN bReset,
- IN EFI_MAC_ADDRESS * pNew
- )
-{
- NIC_DEVICE * pNicDevice;
- EFI_SIMPLE_NETWORK_MODE * pMode;
- EFI_STATUS Status;
- EFI_TPL TplPrevious;
-
- TplPrevious = gBS->RaiseTPL(TPL_CALLBACK);
- //
- // Verify the parameters
- //
- if (( NULL != pSimpleNetwork )
- && ( NULL != pSimpleNetwork->Mode )
- && (( bReset ) || ( ( !bReset) && ( NULL != pNew )))) {
- //
- // Verify that the adapter is already started
- //
- pNicDevice = DEV_FROM_SIMPLE_NETWORK ( pSimpleNetwork );
- pMode = pSimpleNetwork->Mode;
- if ( EfiSimpleNetworkInitialized == pMode->State ) {
- //
- // Determine the adapter MAC address
- //
- if ( bReset ) {
- //
- // Use the permanent address
- //
- CopyMem ( &pMode->CurrentAddress,
- &pMode->PermanentAddress,
- sizeof ( pMode->CurrentAddress ));
- }
- else {
- //
- // Use the specified address
- //
- CopyMem ( &pMode->CurrentAddress,
- pNew,
- sizeof ( pMode->CurrentAddress ));
- }
-
- //
- // Update the address on the adapter
- //
- Status = Ax88772MacAddressSet ( pNicDevice, &pMode->CurrentAddress.Addr[0]);
- }
- else {
- if (EfiSimpleNetworkStarted == pMode->State) {
- Status = EFI_DEVICE_ERROR;
- }
- else {
- Status = EFI_NOT_STARTED;
- }
- }
- }
- else {
- Status = EFI_INVALID_PARAMETER;
- }
- gBS->RestoreTPL ( TplPrevious );
- return Status;
-}
-
-
-/**
- This function resets or collects the statistics on a network interface.
- If the size of the statistics table specified by StatisticsSize is not
- big enough for all of the statistics that are collected by the network
- interface, then a partial buffer of statistics is returned in
- StatisticsTable.
-
- @param [in] pSimpleNetwork Protocol instance pointer
- @param [in] bReset Set to TRUE to reset the statistics for the network interface.
- @param [in, out] pStatisticsSize On input the size, in bytes, of StatisticsTable. On output
- the size, in bytes, of the resulting table of statistics.
- @param [out] pStatisticsTable A pointer to the EFI_NETWORK_STATISTICS structure that
- conains the statistics.
-
- @retval EFI_SUCCESS This operation was successful.
- @retval EFI_NOT_STARTED The network interface was not started.
- @retval EFI_BUFFER_TOO_SMALL The pStatisticsTable is NULL or the buffer is too small.
- @retval EFI_INVALID_PARAMETER pSimpleNetwork parameter was NULL or did not point to a valid
- EFI_SIMPLE_NETWORK_PROTOCOL structure.
- @retval EFI_DEVICE_ERROR The command could not be sent to the network interface.
- @retval EFI_UNSUPPORTED The increased buffer size feature is not supported.
-
- typedef struct {
- UINT64 RxTotalFrames;
- UINT64 RxGoodFrames;
- UINT64 RxUndersizeFrames;
- UINT64 RxOversizeFrames;
- UINT64 RxDroppedFrames;
- UINT64 RxUnicastFrames;
- UINT64 RxBroadcastFrames;
- UINT64 RxMulticastFrames;
- UINT64 RxCrcErrorFrames;
- UINT64 RxTotalBytes;
- UINT64 TxTotalFrames;
- UINT64 TxGoodFrames;
- UINT64 TxUndersizeFrames;
- UINT64 TxOversizeFrames;
- UINT64 TxDroppedFrames;
- UINT64 TxUnicastFrames;
- UINT64 TxBroadcastFrames;
- UINT64 TxMulticastFrames;
- UINT64 TxCrcErrorFrames;
- UINT64 TxTotalBytes;
- UINT64 Collisions;
- UINT64 UnsupportedProtocol;
- } EFI_NETWORK_STATISTICS;
-**/
-EFI_STATUS
-EFIAPI
-SN_Statistics (
- IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork,
- IN BOOLEAN bReset,
- IN OUT UINTN * pStatisticsSize,
- OUT EFI_NETWORK_STATISTICS * pStatisticsTable
- )
-{
- 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;
- }
- }
- 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;
-}
-
-
-/**
- This function stops a network interface. This call is only valid
- if the network interface is in the started state.
-
- @param [in] pSimpleNetwork Protocol instance pointer
-
- @retval EFI_SUCCESS This operation was successful.
- @retval EFI_NOT_STARTED The network interface was not started.
- @retval EFI_INVALID_PARAMETER pSimpleNetwork parameter was NULL or did not point to a valid
- EFI_SIMPLE_NETWORK_PROTOCOL structure.
- @retval EFI_DEVICE_ERROR The command could not be sent to the network interface.
- @retval EFI_UNSUPPORTED The increased buffer size feature is not supported.
-
-**/
-EFI_STATUS
-EFIAPI
-SN_Stop (
- IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork
- )
-{
- EFI_SIMPLE_NETWORK_MODE * pMode;
- EFI_STATUS Status;
- EFI_TPL TplPrevious;
-
- TplPrevious = gBS->RaiseTPL(TPL_CALLBACK);
- //
- // Verify the parameters
- //
- if (( NULL != pSimpleNetwork ) && ( NULL != pSimpleNetwork->Mode )) {
- //
- // Determine if the interface is started
- //
- pMode = pSimpleNetwork->Mode;
- if ( EfiSimpleNetworkStarted == pMode->State ) {
- pMode->State = EfiSimpleNetworkStopped;
- Status = EFI_SUCCESS;
- }
- else {
- Status = EFI_NOT_STARTED;
- }
- }
- else {
- Status = EFI_INVALID_PARAMETER;
- }
-
- gBS->RestoreTPL ( TplPrevious );
- return Status;
-}
-
-
-/**
- This function releases the memory buffers assigned in the Initialize() call.
- Pending transmits and receives are lost, and interrupts are cleared and disabled.
- After this call, only Initialize() and Stop() calls may be used.
-
- @param [in] pSimpleNetwork Protocol instance pointer
-
- @retval EFI_SUCCESS This operation was successful.
- @retval EFI_NOT_STARTED The network interface was not started.
- @retval EFI_INVALID_PARAMETER pSimpleNetwork parameter was NULL or did not point to a valid
- EFI_SIMPLE_NETWORK_PROTOCOL structure.
- @retval EFI_DEVICE_ERROR The command could not be sent to the network interface.
- @retval EFI_UNSUPPORTED The increased buffer size feature is not supported.
-
-**/
-EFI_STATUS
-EFIAPI
-SN_Shutdown (
- IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork
- )
-{
- EFI_SIMPLE_NETWORK_MODE * pMode;
- UINT32 RxFilter;
- EFI_STATUS Status;
- EFI_TPL TplPrevious;
-
- TplPrevious = gBS->RaiseTPL(TPL_CALLBACK);
- //
- // Verify the parameters
- //
- if (( NULL != pSimpleNetwork ) && ( NULL != pSimpleNetwork->Mode )) {
- //
- // Determine if the interface is already started
- //
- pMode = pSimpleNetwork->Mode;
- if ( EfiSimpleNetworkInitialized == pMode->State ) {
- //
- // Stop the adapter
- //
- RxFilter = pMode->ReceiveFilterSetting;
- pMode->ReceiveFilterSetting = 0;
- Status = SN_Reset ( pSimpleNetwork, FALSE );
- pMode->ReceiveFilterSetting = RxFilter;
- if ( !EFI_ERROR ( Status )) {
-
- //
- // Update the network state
- //
- pMode->State = EfiSimpleNetworkStarted;
- }
- else if ( EFI_DEVICE_ERROR == Status ) {
- pMode->State = EfiSimpleNetworkStopped;
- }
- }
- else {
- Status = EFI_NOT_STARTED;
- }
- }
- else {
- Status = EFI_INVALID_PARAMETER;
- }
- gBS->RestoreTPL ( TplPrevious );
- return Status;
-}
-
-
-/**
- Send a packet over the network.
-
- This function places the packet specified by Header and Buffer on
- the transmit queue. This function performs a non-blocking transmit
- operation. When the transmit is complete, the buffer is returned
- via the GetStatus() call.
-
- This routine calls ::Ax88772Rx to empty the network adapter of
- receive packets. The routine then passes the transmit packet
- to the network adapter.
-
- @param [in] pSimpleNetwork Protocol instance pointer
- @param [in] HeaderSize The size, in bytes, of the media header to be filled in by
- the Transmit() function. If HeaderSize is non-zero, then
- it must be equal to SimpleNetwork->Mode->MediaHeaderSize
- and DestAddr and Protocol parameters must not be NULL.
- @param [in] BufferSize The size, in bytes, of the entire packet (media header and
- data) to be transmitted through the network interface.
- @param [in] pBuffer A pointer to the packet (media header followed by data) to
- to be transmitted. This parameter can not be NULL. If
- HeaderSize is zero, then the media header is Buffer must
- already be filled in by the caller. If HeaderSize is nonzero,
- then the media header will be filled in by the Transmit()
- function.
- @param [in] pSrcAddr The source HW MAC address. If HeaderSize is zero, then
- this parameter is ignored. If HeaderSize is nonzero and
- SrcAddr is NULL, then SimpleNetwork->Mode->CurrentAddress
- is used for the source HW MAC address.
- @param [in] pDestAddr The destination HW MAC address. If HeaderSize is zero, then
- this parameter is ignored.
- @param [in] pProtocol The type of header to build. If HeaderSize is zero, then
- this parameter is ignored.
-
- @retval EFI_SUCCESS This operation was successful.
- @retval EFI_NOT_STARTED The network interface was not started.
- @retval EFI_NOT_READY The network interface is too busy to accept this transmit request.
- @retval EFI_BUFFER_TOO_SMALL The BufferSize parameter is too small.
- @retval EFI_INVALID_PARAMETER pSimpleNetwork parameter was NULL or did not point to a valid
- EFI_SIMPLE_NETWORK_PROTOCOL structure.
- @retval EFI_DEVICE_ERROR The command could not be sent to the network interface.
-
-**/
-EFI_STATUS
-EFIAPI
-SN_Transmit (
- IN EFI_SIMPLE_NETWORK_PROTOCOL * pSimpleNetwork,
- IN UINTN HeaderSize,
- IN UINTN BufferSize,
- IN VOID * pBuffer,
- IN EFI_MAC_ADDRESS * pSrcAddr,
- IN EFI_MAC_ADDRESS * pDestAddr,
- IN UINT16 * pProtocol
- )
-{
- ETHERNET_HEADER * pHeader;
- EFI_SIMPLE_NETWORK_MODE * pMode;
- NIC_DEVICE * pNicDevice;
- EFI_USB_IO_PROTOCOL * pUsbIo;
- EFI_STATUS Status;
- UINTN TransferLength;
- UINT32 TransferStatus;
- UINT16 Type;
- EFI_TPL TplPrevious;
-
- TplPrevious = gBS->RaiseTPL(TPL_CALLBACK);
-
- // Verify the parameters
- //
- if (( NULL != pSimpleNetwork ) &&
- ( NULL != pSimpleNetwork->Mode ) &&
- ( NULL != pBuffer) &&
- ( (HeaderSize == 0) || ( (NULL != pDestAddr) && (NULL != pProtocol) ))) {
- //
- // The interface must be running
- //
- 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 ) {
- //
- // Update the link status
- //
- pNicDevice = DEV_FROM_SIMPLE_NETWORK ( pSimpleNetwork );
- pMode->MediaPresent = pNicDevice->bLinkUp;
-
- //
- // Release the synchronization with Ax88772Timer
- //
- if ( pMode->MediaPresent && pNicDevice->bComplete) {
- //
- // Copy the packet into the USB buffer
- //
-
- CopyMem ( &pNicDevice->pTxTest->Data[0], pBuffer, BufferSize );
- pNicDevice->pTxTest->Length = (UINT16) BufferSize;
-
- //
- // Transmit the packet
- //
- pHeader = (ETHERNET_HEADER *) &pNicDevice->pTxTest->Data[0];
- if ( 0 != HeaderSize ) {
- if ( NULL != pDestAddr ) {
- CopyMem ( &pHeader->dest_addr, pDestAddr, PXE_HWADDR_LEN_ETHER );
- }
- if ( NULL != pSrcAddr ) {
- CopyMem ( &pHeader->src_addr, pSrcAddr, PXE_HWADDR_LEN_ETHER );
- }
- else {
- CopyMem ( &pHeader->src_addr, &pMode->CurrentAddress.Addr[0], PXE_HWADDR_LEN_ETHER );
- }
- if ( NULL != pProtocol ) {
- Type = *pProtocol;
- }
- else {
- Type = pNicDevice->pTxTest->Length;
- }
- Type = (UINT16)(( Type >> 8 ) | ( Type << 8 ));
- pHeader->type = Type;
- }
- if ( pNicDevice->pTxTest->Length < MIN_ETHERNET_PKT_SIZE ) {
- pNicDevice->pTxTest->Length = MIN_ETHERNET_PKT_SIZE;
- ZeroMem ( &pNicDevice->pTxTest->Data[ BufferSize ],
- pNicDevice->pTxTest->Length - BufferSize );
- }
-
- DEBUG ((EFI_D_INFO, "TX: %02x-%02x-%02x-%02x-%02x-%02x %02x-%02x-%02x-%02x-%02x-%02x"
- " %02x-%02x %d bytes\r\n",
- pNicDevice->pTxTest->Data[0],
- pNicDevice->pTxTest->Data[1],
- pNicDevice->pTxTest->Data[2],
- pNicDevice->pTxTest->Data[3],
- pNicDevice->pTxTest->Data[4],
- pNicDevice->pTxTest->Data[5],
- pNicDevice->pTxTest->Data[6],
- pNicDevice->pTxTest->Data[7],
- pNicDevice->pTxTest->Data[8],
- pNicDevice->pTxTest->Data[9],
- pNicDevice->pTxTest->Data[10],
- pNicDevice->pTxTest->Data[11],
- pNicDevice->pTxTest->Data[12],
- pNicDevice->pTxTest->Data[13],
- pNicDevice->pTxTest->Length ));
-
- pNicDevice->pTxTest->LengthBar = ~(pNicDevice->pTxTest->Length);
- TransferLength = sizeof ( pNicDevice->pTxTest->Length )
- + sizeof ( pNicDevice->pTxTest->LengthBar )
- + pNicDevice->pTxTest->Length;
-
- if (TransferLength % 512 == 0 || TransferLength % 1024 == 0)
- TransferLength +=4;
-
- //
- // Work around USB bus driver bug where a timeout set by receive
- // succeeds but the timeout expires immediately after, causing the
- // transmit operation to timeout.
- //
- pUsbIo = pNicDevice->pUsbIo;
- Status = pUsbIo->UsbBulkTransfer ( pUsbIo,
- BULK_OUT_ENDPOINT,
- &pNicDevice->pTxTest->Length,
- &TransferLength,
- 0xfffffffe,
- &TransferStatus );
- if ( !EFI_ERROR ( Status )) {
- Status = TransferStatus;
- }
-
- if ( !EFI_ERROR ( Status )) {
- pNicDevice->pTxBuffer = pBuffer;
- }
- else {
- if ((TransferLength != (UINTN)( pNicDevice->pTxTest->Length + 4 )) &&
- (TransferLength != (UINTN)(( pNicDevice->pTxTest->Length + 4 ) + 4))) {
- DEBUG ((EFI_D_INFO, "TransferLength didn't match Packet Length\n"));
- }
- //
- // Reset the controller to fix the error
- //
- if ( EFI_DEVICE_ERROR == Status ) {
- SN_Reset ( pSimpleNetwork, FALSE );
- }
- Status = EFI_NOT_READY;
- }
- }
- else {
- //
- // No packets available.
- //
- Status = EFI_NOT_READY;
- }
-
- }
- else {
- if (EfiSimpleNetworkStarted == pMode->State) {
- Status = EFI_DEVICE_ERROR;
- }
- else {
- Status = EFI_NOT_STARTED ;
- }
- }
- }
- else {
- Status = EFI_BUFFER_TOO_SMALL;
- }
- }
- else {
- Status = EFI_INVALID_PARAMETER;
- }
- }
- else {
- Status = EFI_INVALID_PARAMETER;
- }
-
- gBS->RestoreTPL (TplPrevious);
-
- return Status;
-}