3 Internal definitions for the virtio-net driver, which produces Simple Network
4 Protocol instances for virtio-net devices.
6 Copyright (C) 2013, Red Hat, Inc.
8 This program and the accompanying materials are licensed and made available
9 under the terms and conditions of the BSD License which accompanies this
10 distribution. The full text of the license may be found at
11 http://opensource.org/licenses/bsd-license.php
13 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT
14 WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
17 #ifndef _VIRTIO_NET_DXE_H_
18 #define _VIRTIO_NET_DXE_H_
20 #include <IndustryStandard/VirtioNet.h>
21 #include <Library/DebugLib.h>
22 #include <Library/VirtioLib.h>
23 #include <Protocol/ComponentName.h>
24 #include <Protocol/ComponentName2.h>
25 #include <Protocol/DevicePath.h>
26 #include <Protocol/DriverBinding.h>
27 #include <Protocol/PciIo.h>
28 #include <Protocol/SimpleNetwork.h>
30 #define VNET_SIG SIGNATURE_32 ('V', 'N', 'E', 'T')
33 // maximum number of pending packets, separately for each direction
35 #define VNET_MAX_PENDING 64
42 // BindingStart BindingStop
47 // +---------+ virtio-net device is reset, no resources are
48 // | stopped | allocated for traffic, but MAC address has
49 // +---------+ been retrieved
56 // | started | functionally identical to stopped
60 // SNP.Initialize SNP.Shutdown
63 // +-------------+ Virtio-net setup complete, including DRIVER_OK
64 // | initialized | bit. The receive queue is populated with
65 // +-------------+ requests; McastIpToMac, GetStatus, Transmit,
66 // Receive are callable.
71 // Parts of this structure are initialized / torn down in various functions
72 // at various call depths. The table to the right should make it easier to
75 // field init function
76 // ------------------ ------------------------------
77 UINT32 Signature
; // VirtioNetDriverBindingStart
78 EFI_PCI_IO_PROTOCOL
*PciIo
; // VirtioNetDriverBindingStart
79 UINT64 OrigPciAttributes
; // VirtioNetDriverBindingStart
80 EFI_SIMPLE_NETWORK_PROTOCOL Snp
; // VirtioNetSnpPopulate
81 EFI_SIMPLE_NETWORK_MODE Snm
; // VirtioNetSnpPopulate
82 EFI_EVENT ExitBoot
; // VirtioNetSnpPopulate
83 EFI_DEVICE_PATH_PROTOCOL
*MacDevicePath
; // VirtioNetDriverBindingStart
84 EFI_HANDLE MacHandle
; // VirtioNetDriverBindingStart
86 VRING RxRing
; // VirtioNetInitRing
87 UINT8
*RxBuf
; // VirtioNetInitRx
88 UINT16 RxLastUsed
; // VirtioNetInitRx
90 VRING TxRing
; // VirtioNetInitRing
91 UINT16 TxMaxPending
; // VirtioNetInitTx
92 UINT16 TxCurPending
; // VirtioNetInitTx
93 UINT16
*TxFreeStack
; // VirtioNetInitTx
94 VIRTIO_NET_REQ TxSharedReq
; // VirtioNetInitTx
95 UINT16 TxLastUsed
; // VirtioNetInitTx
100 // In order to avoid duplication of interface documentation, please find all
101 // leading comments near the respective function / variable definitions (not
102 // the declarations here), which is where your code editor of choice takes you
103 // anyway when jumping to a function.
109 #define VIRTIO_NET_FROM_SNP(SnpPointer) \
110 CR (SnpPointer, VNET_DEV, Snp, VNET_SIG)
112 #define VIRTIO_CFG_WRITE(Dev, Field, Value) (VirtioWrite ( \
114 OFFSET_OF_VNET (Field), \
115 SIZE_OF_VNET (Field), \
119 #define VIRTIO_CFG_READ(Dev, Field, Pointer) (VirtioRead ( \
121 OFFSET_OF_VNET (Field), \
122 SIZE_OF_VNET (Field), \
130 extern EFI_COMPONENT_NAME_PROTOCOL gVirtioNetComponentName
;
131 extern EFI_COMPONENT_NAME2_PROTOCOL gVirtioNetComponentName2
;
136 extern EFI_DRIVER_BINDING_PROTOCOL gVirtioNetDriverBinding
;
139 // member functions implementing the Simple Network Protocol
144 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
150 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
155 VirtioNetInitialize (
156 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
,
157 IN UINTN ExtraRxBufferSize OPTIONAL
,
158 IN UINTN ExtraTxBufferSize OPTIONAL
164 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
,
165 IN BOOLEAN ExtendedVerification
171 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
176 VirtioNetReceiveFilters (
177 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
,
180 IN BOOLEAN ResetMCastFilter
,
181 IN UINTN MCastFilterCnt OPTIONAL
,
182 IN EFI_MAC_ADDRESS
*MCastFilter OPTIONAL
187 VirtioNetStationAddress (
188 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
,
190 IN EFI_MAC_ADDRESS
*New OPTIONAL
195 VirtioNetStatistics (
196 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
,
198 IN OUT UINTN
*StatisticsSize OPTIONAL
,
199 OUT EFI_NETWORK_STATISTICS
*StatisticsTable OPTIONAL
204 VirtioNetMcastIpToMac (
205 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
,
207 IN EFI_IP_ADDRESS
*Ip
,
208 OUT EFI_MAC_ADDRESS
*Mac
214 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
,
215 IN BOOLEAN ReadWrite
,
224 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
,
225 OUT UINT32
*InterruptStatus OPTIONAL
,
226 OUT VOID
**TxBuf OPTIONAL
232 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
,
235 IN
/* +OUT! */ VOID
*Buffer
,
236 IN EFI_MAC_ADDRESS
*SrcAddr OPTIONAL
,
237 IN EFI_MAC_ADDRESS
*DestAddr OPTIONAL
,
238 IN UINT16
*Protocol OPTIONAL
244 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
,
245 OUT UINTN
*HeaderSize OPTIONAL
,
246 IN OUT UINTN
*BufferSize
,
248 OUT EFI_MAC_ADDRESS
*SrcAddr OPTIONAL
,
249 OUT EFI_MAC_ADDRESS
*DestAddr OPTIONAL
,
250 OUT UINT16
*Protocol OPTIONAL
254 // utility functions shared by various SNP member functions
258 VirtioNetShutdownRx (
264 VirtioNetShutdownTx (
273 VirtioNetIsPacketAvailable (
285 #endif // _VIRTIO_NET_DXE_H_