SNP driver for ASIX Electronics AX88772 found in SMC Networks SMC2209 USB/Ethernet 10/100 adapter.
Signed-off-by: lpleahy Contributed-by: Intel git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13348 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
		
							
								
								
									
										1264
									
								
								OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772/Ax88772.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1264
									
								
								OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772/Ax88772.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										971
									
								
								OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772/Ax88772.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										971
									
								
								OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772/Ax88772.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,971 @@ | |||||||
|  | /** @file | ||||||
|  |   Definitions for ASIX AX88772 Ethernet adapter. | ||||||
|  |  | ||||||
|  |   Copyright (c) 2011, Intel Corporation | ||||||
|  |   All rights reserved. This program and the accompanying materials | ||||||
|  |   are licensed and made available under the terms and conditions of the BSD License | ||||||
|  |   which accompanies this distribution.  The full text of the license may be found at | ||||||
|  |   http://opensource.org/licenses/bsd-license.php | ||||||
|  |  | ||||||
|  |   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | ||||||
|  |   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | ||||||
|  |  | ||||||
|  | **/ | ||||||
|  |  | ||||||
|  | #ifndef _AX88772_H_ | ||||||
|  | #define _AX88772_H_ | ||||||
|  |  | ||||||
|  | #include <Uefi.h> | ||||||
|  |  | ||||||
|  | #include <Guid/EventGroup.h> | ||||||
|  | #include <Guid/NicIp4ConfigNvData.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 | ||||||
|  | //------------------------------------------------------------------------------ | ||||||
|  |  | ||||||
|  | #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 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 | ||||||
|  | } 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_ | ||||||
							
								
								
									
										72
									
								
								OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772/Ax88772.inf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772/Ax88772.inf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,72 @@ | |||||||
|  | #/** @file | ||||||
|  | # Component description file for ASIX AX88772 USB/Ethernet driver. | ||||||
|  | # | ||||||
|  | # This module provides support for the ASIX AX88772 USB/Ethernet adapter. | ||||||
|  | # Copyright (c) 2011, Intel Corporation | ||||||
|  | # | ||||||
|  | #  All rights reserved. This program and the accompanying materials | ||||||
|  | #  are licensed and made available under the terms and conditions of the BSD License | ||||||
|  | #  which accompanies this distribution. The full text of the license may be found at | ||||||
|  | #  http://opensource.org/licenses/bsd-license.php | ||||||
|  | # | ||||||
|  | #  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | ||||||
|  | #  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | ||||||
|  | # | ||||||
|  | #**/ | ||||||
|  |  | ||||||
|  | [Defines] | ||||||
|  |   INF_VERSION                    = 0x00010005 | ||||||
|  |   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 IPF 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 | ||||||
|  |   gEfiSimpleNetworkProtocolGuid | ||||||
|  |   gEfiUsbIoProtocolGuid                ## TO_START | ||||||
|  |  | ||||||
|  | [Guids] | ||||||
|  |   gEfiEventExitBootServicesGuid        ## PRODUCES ## Event | ||||||
|  |   gEfiEventVirtualAddressChangeGuid    ## PRODUCES ## Event | ||||||
|  |   gEfiNicIp4ConfigVariableGuid | ||||||
|  |  | ||||||
|  | [Depex] | ||||||
|  |   gEfiBdsArchProtocolGuid AND | ||||||
|  |   gEfiCpuArchProtocolGuid AND | ||||||
|  |   gEfiMetronomeArchProtocolGuid AND | ||||||
|  |   gEfiMonotonicCounterArchProtocolGuid AND | ||||||
|  |   gEfiRealTimeClockArchProtocolGuid AND | ||||||
|  |   gEfiResetArchProtocolGuid AND | ||||||
|  |   gEfiRuntimeArchProtocolGuid AND | ||||||
|  |   gEfiSecurityArchProtocolGuid AND | ||||||
|  |   gEfiTimerArchProtocolGuid AND | ||||||
|  |   gEfiVariableWriteArchProtocolGuid AND | ||||||
|  |   gEfiVariableArchProtocolGuid AND | ||||||
|  |   gEfiWatchdogTimerArchProtocolGuid | ||||||
							
								
								
									
										184
									
								
								OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772/ComponentName.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										184
									
								
								OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772/ComponentName.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,184 @@ | |||||||
|  | /** @file | ||||||
|  |   UEFI Component Name(2) protocol implementation. | ||||||
|  |  | ||||||
|  |   Copyright (c) 2011, Intel Corporation | ||||||
|  |   All rights reserved. This program and the accompanying materials | ||||||
|  |   are licensed and made available under the terms and conditions of the BSD License | ||||||
|  |   which accompanies this distribution.  The full text of the license may be found at | ||||||
|  |   http://opensource.org/licenses/bsd-license.php | ||||||
|  |  | ||||||
|  |   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | ||||||
|  |   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | ||||||
|  |  | ||||||
|  | **/ | ||||||
|  |  | ||||||
|  | #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; | ||||||
|  | } | ||||||
							
								
								
									
										526
									
								
								OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772/DriverBinding.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										526
									
								
								OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772/DriverBinding.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,526 @@ | |||||||
|  | /** @file | ||||||
|  |   Implement the driver binding protocol for Asix AX88772 Ethernet driver. | ||||||
|  |  | ||||||
|  |   Copyright (c) 2011, Intel Corporation | ||||||
|  |   All rights reserved. This program and the accompanying materials | ||||||
|  |   are licensed and made available under the terms and conditions of the BSD License | ||||||
|  |   which accompanies this distribution.  The full text of the license may be found at | ||||||
|  |   http://opensource.org/licenses/bsd-license.php | ||||||
|  |  | ||||||
|  |   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | ||||||
|  |   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | ||||||
|  |  | ||||||
|  | **/ | ||||||
|  |  | ||||||
|  | #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_LOADED_IMAGE_PROTOCOL * pLoadedImage; | ||||||
|  |   EFI_STATUS    Status; | ||||||
|  |  | ||||||
|  |   DBG_ENTER ( ); | ||||||
|  |  | ||||||
|  |   // | ||||||
|  |   //  Enable unload support | ||||||
|  |   // | ||||||
|  |   Status = gBS->HandleProtocol ( | ||||||
|  |                   gImageHandle, | ||||||
|  |                   &gEfiLoadedImageProtocolGuid, | ||||||
|  |                   (VOID **)&pLoadedImage | ||||||
|  |                   ); | ||||||
|  |   if (!EFI_ERROR (Status)) { | ||||||
|  |     pLoadedImage->Unload = DriverUnload; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   // | ||||||
|  |   //  Add the driver to the list of drivers | ||||||
|  |   // | ||||||
|  |   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; | ||||||
|  | } | ||||||
							
								
								
									
										1496
									
								
								OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772/SimpleNetwork.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1496
									
								
								OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772/SimpleNetwork.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Reference in New Issue
	
	Block a user