mirror of
				https://git.proxmox.com/git/mirror_edk2
				synced 2025-10-31 09:21:56 +00:00 
			
		
		
		
	git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@4729 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			434 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			434 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
| 
 | |
| Copyright (c) 2004 - 2007, 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.
 | |
| 
 | |
| Module name:
 | |
|     snp.h
 | |
| 
 | |
| Abstract:
 | |
| 
 | |
| Revision history:
 | |
| 
 | |
| 
 | |
| **/
 | |
| #ifndef _SNP_H
 | |
| #define _SNP_H
 | |
| 
 | |
| 
 | |
| #include <PiDxe.h>
 | |
| 
 | |
| #include <Protocol/SimpleNetwork.h>
 | |
| #include <Protocol/PciIo.h>
 | |
| #include <Protocol/NetworkInterfaceIdentifier.h>
 | |
| #include <Protocol/DevicePath.h>
 | |
| 
 | |
| #include <Library/DebugLib.h>
 | |
| #include <Library/BaseMemoryLib.h>
 | |
| #include <Library/UefiDriverEntryPoint.h>
 | |
| #include <Library/UefiBootServicesTableLib.h>
 | |
| #include <Library/BaseLib.h>
 | |
| #include <Library/UefiLib.h>
 | |
| #include <Library/MemoryAllocationLib.h>
 | |
| 
 | |
| #include <IndustryStandard/Pci22.h>
 | |
| 
 | |
| #define FOUR_GIGABYTES  (UINT64) 0x100000000ULL
 | |
| 
 | |
| 
 | |
| #define SNP_DRIVER_SIGNATURE  EFI_SIGNATURE_32 ('s', 'n', 'd', 's')
 | |
| #define MAX_MAP_LENGTH        100
 | |
| 
 | |
| #define PCI_BAR_IO_MASK       0x00000003
 | |
| #define PCI_BAR_IO_MODE       0x00000001
 | |
| 
 | |
| #define PCI_BAR_MEM_MASK      0x0000000F
 | |
| #define PCI_BAR_MEM_MODE      0x00000000
 | |
| #define PCI_BAR_MEM_64BIT     0x00000004
 | |
| 
 | |
| typedef struct {
 | |
|   UINT32                      Signature;
 | |
|   EFI_LOCK                    lock;
 | |
| 
 | |
|   EFI_SIMPLE_NETWORK_PROTOCOL snp;
 | |
|   EFI_SIMPLE_NETWORK_MODE     mode;
 | |
| 
 | |
|   EFI_HANDLE                  device_handle;
 | |
|   EFI_DEVICE_PATH_PROTOCOL    *device_path;
 | |
| 
 | |
|   //
 | |
|   //  Local instance data needed by SNP driver
 | |
|   //
 | |
|   //  Pointer to S/W UNDI API entry point
 | |
|   //  This will be NULL for H/W UNDI
 | |
|   //
 | |
|   EFI_STATUS (*issue_undi32_command) (UINT64 cdb);
 | |
| 
 | |
|   BOOLEAN               is_swundi;
 | |
| 
 | |
|   //
 | |
|   // undi interface number, if one undi manages more nics
 | |
|   //
 | |
|   PXE_IFNUM             if_num;
 | |
| 
 | |
|   //
 | |
|   //  Allocated tx/rx buffer that was passed to UNDI Initialize.
 | |
|   //
 | |
|   UINT32                tx_rx_bufsize;
 | |
|   VOID                  *tx_rx_buffer;
 | |
|   //
 | |
|   // mappable buffers for receive and fill header for undi3.0
 | |
|   // these will be used if the user buffers are above 4GB limit (instead of
 | |
|   // mapping the user buffers)
 | |
|   //
 | |
|   UINT8                 *receive_buf;
 | |
|   VOID                  *ReceiveBufUnmap;
 | |
|   UINT8                 *fill_hdr_buf;
 | |
|   VOID                  *FillHdrBufUnmap;
 | |
| 
 | |
|   EFI_PCI_IO_PROTOCOL   *IoFncs;
 | |
|   UINT8                 IoBarIndex;
 | |
|   UINT8                 MemoryBarIndex;
 | |
| 
 | |
|   //
 | |
|   // Buffers for command descriptor block, command parameter block
 | |
|   // and data block.
 | |
|   //
 | |
|   PXE_CDB               cdb;
 | |
|   VOID                  *cpb;
 | |
|   VOID                  *CpbUnmap;
 | |
|   VOID                  *db;
 | |
| 
 | |
|   //
 | |
|   // UNDI structure, we need to remember the init info for a long time!
 | |
|   //
 | |
|   PXE_DB_GET_INIT_INFO  init_info;
 | |
| 
 | |
|   VOID                  *SnpDriverUnmap;
 | |
|   //
 | |
|   // when ever we map an address, we must remember it's address and the un-map
 | |
|   // cookie so that we can unmap later
 | |
|   //
 | |
|   struct s_map_list {
 | |
|     EFI_PHYSICAL_ADDRESS  virt;
 | |
|     VOID                  *map_cookie;
 | |
|   } map_list[MAX_MAP_LENGTH];
 | |
| }
 | |
| SNP_DRIVER;
 | |
| 
 | |
| #define EFI_SIMPLE_NETWORK_DEV_FROM_THIS(a) CR (a, SNP_DRIVER, snp, SNP_DRIVER_SIGNATURE)
 | |
| 
 | |
| //
 | |
| // Global Variables
 | |
| //
 | |
| extern EFI_COMPONENT_NAME_PROTOCOL    gSimpleNetworkComponentName;
 | |
| extern EFI_COMPONENT_NAME2_PROTOCOL   gSimpleNetworkComponentName2;
 | |
| 
 | |
| //
 | |
| //  Virtual to physical mapping for all UNDI 3.0s.
 | |
| //
 | |
| extern struct                       s_v2p {
 | |
|   struct s_v2p          *next;
 | |
|   VOID                  *vaddr;
 | |
|   UINTN                 bsize;
 | |
|   EFI_PHYSICAL_ADDRESS  paddr;
 | |
|   VOID                  *unmap;
 | |
| }
 | |
| *_v2p;
 | |
| 
 | |
| EFI_STATUS
 | |
| add_v2p (
 | |
|   struct s_v2p                  **v2p,
 | |
|   EFI_PCI_IO_PROTOCOL_OPERATION type,
 | |
|   VOID                          *vaddr,
 | |
|   UINTN                         bsize
 | |
|   )
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| find_v2p (
 | |
|   struct s_v2p **v2p,
 | |
|   VOID         *vaddr
 | |
|   )
 | |
| ;
 | |
| 
 | |
| EFI_STATUS
 | |
| del_v2p (
 | |
|   VOID *vaddr
 | |
|   )
 | |
| ;
 | |
| 
 | |
| extern
 | |
| VOID 
 | |
| snp_undi32_callback_block_30 (
 | |
|   IN UINT32 Enable
 | |
|   )
 | |
| ;
 | |
| 
 | |
| extern
 | |
| VOID 
 | |
| snp_undi32_callback_delay_30 (
 | |
|   IN UINT64 MicroSeconds
 | |
|   )
 | |
| ;
 | |
| 
 | |
| extern
 | |
| VOID 
 | |
| snp_undi32_callback_memio_30 (
 | |
|   IN UINT8      ReadOrWrite,
 | |
|   IN UINT8      NumBytes,
 | |
|   IN UINT64     MemOrPortAddress,
 | |
|   IN OUT UINT64 BufferPtr
 | |
|   )
 | |
| ;
 | |
| 
 | |
| extern
 | |
| VOID 
 | |
| snp_undi32_callback_v2p_30 (
 | |
|   IN UINT64     CpuAddr,
 | |
|   IN OUT UINT64 DeviceAddrPtr
 | |
|   )
 | |
| ;
 | |
| 
 | |
| extern
 | |
| VOID 
 | |
| snp_undi32_callback_block (
 | |
|   IN UINT64 UniqueId,
 | |
|   IN UINT32 Enable
 | |
|   )
 | |
| ;
 | |
| 
 | |
| extern
 | |
| VOID 
 | |
| snp_undi32_callback_delay (
 | |
|   IN UINT64 UniqueId,
 | |
|   IN UINT64 MicroSeconds
 | |
|   )
 | |
| ;
 | |
| 
 | |
| extern
 | |
| VOID 
 | |
| snp_undi32_callback_memio (
 | |
|   IN UINT64     UniqueId,
 | |
|   IN UINT8      ReadOrWrite,
 | |
|   IN UINT8      NumBytes,
 | |
|   IN UINT64     MemOrPortAddr,
 | |
|   IN OUT UINT64 BufferPtr
 | |
|   )
 | |
| ;
 | |
| 
 | |
| extern
 | |
| VOID 
 | |
| snp_undi32_callback_map (
 | |
|   IN UINT64     UniqueId,
 | |
|   IN UINT64     CpuAddr,
 | |
|   IN UINT32     NumBytes,
 | |
|   IN UINT32     Direction,
 | |
|   IN OUT UINT64 DeviceAddrPtr
 | |
|   )
 | |
| ;
 | |
| 
 | |
| extern
 | |
| VOID 
 | |
| snp_undi32_callback_unmap (
 | |
|   IN UINT64             UniqueId,
 | |
|   IN UINT64             CpuAddr,
 | |
|   IN UINT32             NumBytes,
 | |
|   IN UINT32             Direction,
 | |
|   IN UINT64 DeviceAddr  // not a pointer to device address
 | |
|   )
 | |
| ;
 | |
| 
 | |
| extern
 | |
| VOID 
 | |
| snp_undi32_callback_sync (
 | |
|   IN UINT64             UniqueId,
 | |
|   IN UINT64             CpuAddr,
 | |
|   IN UINT32             NumBytes,
 | |
|   IN UINT32             Direction,
 | |
|   IN UINT64 DeviceAddr  // not a pointer to device address
 | |
|   )
 | |
| ;
 | |
| 
 | |
| extern
 | |
| EFI_STATUS 
 | |
| EFIAPI
 | |
| snp_undi32_start (
 | |
|   IN EFI_SIMPLE_NETWORK_PROTOCOL *this
 | |
|   )
 | |
| ;
 | |
| 
 | |
| extern
 | |
| EFI_STATUS 
 | |
| EFIAPI
 | |
| snp_undi32_stop (
 | |
|   IN EFI_SIMPLE_NETWORK_PROTOCOL *this
 | |
|   )
 | |
| ;
 | |
| 
 | |
| extern
 | |
| EFI_STATUS 
 | |
| EFIAPI
 | |
| snp_undi32_initialize (
 | |
|   IN EFI_SIMPLE_NETWORK_PROTOCOL *this,
 | |
|   IN UINTN                       extra_rx_buffer_size OPTIONAL,
 | |
|   IN UINTN                       extra_tx_buffer_size OPTIONAL
 | |
|   )
 | |
| ;
 | |
| 
 | |
| extern
 | |
| EFI_STATUS 
 | |
| EFIAPI
 | |
| snp_undi32_reset (
 | |
|   IN EFI_SIMPLE_NETWORK_PROTOCOL  *this,
 | |
|   IN BOOLEAN                      ExtendedVerification
 | |
|   )
 | |
| ;
 | |
| 
 | |
| extern
 | |
| EFI_STATUS 
 | |
| EFIAPI
 | |
| snp_undi32_shutdown (
 | |
|   IN EFI_SIMPLE_NETWORK_PROTOCOL *this
 | |
|   )
 | |
| ;
 | |
| 
 | |
| extern
 | |
| EFI_STATUS 
 | |
| EFIAPI
 | |
| snp_undi32_receive_filters (
 | |
|   IN EFI_SIMPLE_NETWORK_PROTOCOL * this,
 | |
|   IN UINT32                      enable,
 | |
|   IN UINT32                      disable,
 | |
|   IN BOOLEAN                     reset_mcast_filter,
 | |
|   IN UINTN                       mcast_filter_count OPTIONAL,
 | |
|   IN EFI_MAC_ADDRESS             * mcast_filter OPTIONAL
 | |
|   )
 | |
| ;
 | |
| 
 | |
| extern
 | |
| EFI_STATUS 
 | |
| EFIAPI
 | |
| snp_undi32_station_address (
 | |
|   IN EFI_SIMPLE_NETWORK_PROTOCOL * this,
 | |
|   IN BOOLEAN                     reset,
 | |
|   IN EFI_MAC_ADDRESS             *new OPTIONAL
 | |
|   )
 | |
| ;
 | |
| 
 | |
| extern
 | |
| EFI_STATUS 
 | |
| EFIAPI
 | |
| snp_undi32_statistics (
 | |
|   IN EFI_SIMPLE_NETWORK_PROTOCOL  * this,
 | |
|   IN BOOLEAN                      reset,
 | |
|   IN OUT UINTN                    *statistics_size OPTIONAL,
 | |
|   IN OUT EFI_NETWORK_STATISTICS   * statistics_table OPTIONAL
 | |
|   )
 | |
| ;
 | |
| 
 | |
| extern
 | |
| EFI_STATUS 
 | |
| EFIAPI
 | |
| snp_undi32_mcast_ip_to_mac (
 | |
|   IN EFI_SIMPLE_NETWORK_PROTOCOL *this,
 | |
|   IN BOOLEAN                     IPv6,
 | |
|   IN EFI_IP_ADDRESS              *IP,
 | |
|   OUT EFI_MAC_ADDRESS            *MAC
 | |
|   )
 | |
| ;
 | |
| 
 | |
| extern
 | |
| EFI_STATUS 
 | |
| EFIAPI
 | |
| snp_undi32_nvdata (
 | |
|   IN EFI_SIMPLE_NETWORK_PROTOCOL *this,
 | |
|   IN BOOLEAN                     read_write,
 | |
|   IN UINTN                       offset,
 | |
|   IN UINTN                       buffer_size,
 | |
|   IN OUT VOID                    *buffer
 | |
|   )
 | |
| ;
 | |
| 
 | |
| extern
 | |
| EFI_STATUS 
 | |
| EFIAPI
 | |
| snp_undi32_get_status (
 | |
|   IN EFI_SIMPLE_NETWORK_PROTOCOL * this,
 | |
|   OUT UINT32                     *interrupt_status OPTIONAL,
 | |
|   OUT VOID                       **tx_buffer OPTIONAL
 | |
|   )
 | |
| ;
 | |
| 
 | |
| extern
 | |
| EFI_STATUS 
 | |
| EFIAPI
 | |
| snp_undi32_transmit (
 | |
|   IN EFI_SIMPLE_NETWORK_PROTOCOL * this,
 | |
|   IN UINTN                       header_size,
 | |
|   IN UINTN                       buffer_size,
 | |
|   IN VOID                        *buffer,
 | |
|   IN EFI_MAC_ADDRESS             * src_addr OPTIONAL,
 | |
|   IN EFI_MAC_ADDRESS             * dest_addr OPTIONAL,
 | |
|   IN UINT16                      *protocol OPTIONAL
 | |
|   )
 | |
| ;
 | |
| 
 | |
| extern
 | |
| EFI_STATUS 
 | |
| EFIAPI
 | |
| snp_undi32_receive (
 | |
|   IN EFI_SIMPLE_NETWORK_PROTOCOL * this,
 | |
|   OUT UINTN                      *header_size OPTIONAL,
 | |
|   IN OUT UINTN                   *buffer_size,
 | |
|   OUT VOID                       *buffer,
 | |
|   OUT EFI_MAC_ADDRESS            * src_addr OPTIONAL,
 | |
|   OUT EFI_MAC_ADDRESS            * dest_addr OPTIONAL,
 | |
|   OUT UINT16                     *protocol OPTIONAL
 | |
|   )
 | |
| ;
 | |
| 
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (*issue_undi32_command) (
 | |
|   UINT64 cdb
 | |
|   );
 | |
| typedef
 | |
| VOID
 | |
| (*ptr) (
 | |
|   VOID
 | |
|   );
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Install all the driver protocol
 | |
| 
 | |
|   @param  ImageHandle  Driver image handle
 | |
|   @param  SystemTable  System services table
 | |
| 
 | |
|   @retval EFI_SUCEESS  Initialization routine has found UNDI hardware, loaded it's
 | |
|                        ROM, and installed a notify event for the Network
 | |
|                        Indentifier Interface Protocol successfully.
 | |
|   @retval Other        Return value from HandleProtocol for DeviceIoProtocol or
 | |
|                        LoadedImageProtocol
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| InitializeSnpNiiDriver (
 | |
|   IN EFI_HANDLE       ImageHandle,
 | |
|   IN EFI_SYSTEM_TABLE *SystemTable
 | |
|   )
 | |
| ;
 | |
| 
 | |
| #define SNP_MEM_PAGES(x)  (((x) - 1) / 4096 + 1)
 | |
| 
 | |
| 
 | |
| #endif /*  _SNP_H  */
 |