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/SimpleNetwork.h>
29 #define VNET_SIG SIGNATURE_32 ('V', 'N', 'E', 'T')
32 // maximum number of pending packets, separately for each direction
34 #define VNET_MAX_PENDING 64
41 // BindingStart BindingStop
46 // +---------+ virtio-net device is reset, no resources are
47 // | stopped | allocated for traffic, but MAC address has
48 // +---------+ been retrieved
55 // | started | functionally identical to stopped
59 // SNP.Initialize SNP.Shutdown
62 // +-------------+ Virtio-net setup complete, including DRIVER_OK
63 // | initialized | bit. The receive queue is populated with
64 // +-------------+ requests; McastIpToMac, GetStatus, Transmit,
65 // Receive are callable.
70 // Parts of this structure are initialized / torn down in various functions
71 // at various call depths. The table to the right should make it easier to
74 // field init function
75 // ------------------ ------------------------------
76 UINT32 Signature
; // VirtioNetDriverBindingStart
77 VIRTIO_DEVICE_PROTOCOL
*VirtIo
; // VirtioNetDriverBindingStart
78 EFI_SIMPLE_NETWORK_PROTOCOL Snp
; // VirtioNetSnpPopulate
79 EFI_SIMPLE_NETWORK_MODE Snm
; // VirtioNetSnpPopulate
80 EFI_EVENT ExitBoot
; // VirtioNetSnpPopulate
81 EFI_DEVICE_PATH_PROTOCOL
*MacDevicePath
; // VirtioNetDriverBindingStart
82 EFI_HANDLE MacHandle
; // VirtioNetDriverBindingStart
84 VRING RxRing
; // VirtioNetInitRing
85 UINT8
*RxBuf
; // VirtioNetInitRx
86 UINT16 RxLastUsed
; // VirtioNetInitRx
88 VRING TxRing
; // VirtioNetInitRing
89 UINT16 TxMaxPending
; // VirtioNetInitTx
90 UINT16 TxCurPending
; // VirtioNetInitTx
91 UINT16
*TxFreeStack
; // VirtioNetInitTx
92 VIRTIO_1_0_NET_REQ TxSharedReq
; // VirtioNetInitTx
93 UINT16 TxLastUsed
; // VirtioNetInitTx
98 // In order to avoid duplication of interface documentation, please find all
99 // leading comments near the respective function / variable definitions (not
100 // the declarations here), which is where your code editor of choice takes you
101 // anyway when jumping to a function.
107 #define VIRTIO_NET_FROM_SNP(SnpPointer) \
108 CR (SnpPointer, VNET_DEV, Snp, VNET_SIG)
110 #define VIRTIO_CFG_WRITE(Dev, Field, Value) ((Dev)->VirtIo->WriteDevice ( \
112 OFFSET_OF_VNET (Field), \
113 SIZE_OF_VNET (Field), \
117 #define VIRTIO_CFG_READ(Dev, Field, Pointer) ((Dev)->VirtIo->ReadDevice ( \
119 OFFSET_OF_VNET (Field), \
120 SIZE_OF_VNET (Field), \
128 extern EFI_COMPONENT_NAME_PROTOCOL gVirtioNetComponentName
;
129 extern EFI_COMPONENT_NAME2_PROTOCOL gVirtioNetComponentName2
;
134 extern EFI_DRIVER_BINDING_PROTOCOL gVirtioNetDriverBinding
;
137 // member functions implementing the Simple Network Protocol
142 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
148 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
153 VirtioNetInitialize (
154 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
,
155 IN UINTN ExtraRxBufferSize OPTIONAL
,
156 IN UINTN ExtraTxBufferSize OPTIONAL
162 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
,
163 IN BOOLEAN ExtendedVerification
169 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
174 VirtioNetReceiveFilters (
175 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
,
178 IN BOOLEAN ResetMCastFilter
,
179 IN UINTN MCastFilterCnt OPTIONAL
,
180 IN EFI_MAC_ADDRESS
*MCastFilter OPTIONAL
185 VirtioNetStationAddress (
186 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
,
188 IN EFI_MAC_ADDRESS
*New OPTIONAL
193 VirtioNetStatistics (
194 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
,
196 IN OUT UINTN
*StatisticsSize OPTIONAL
,
197 OUT EFI_NETWORK_STATISTICS
*StatisticsTable OPTIONAL
202 VirtioNetMcastIpToMac (
203 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
,
205 IN EFI_IP_ADDRESS
*Ip
,
206 OUT EFI_MAC_ADDRESS
*Mac
212 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
,
213 IN BOOLEAN ReadWrite
,
222 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
,
223 OUT UINT32
*InterruptStatus OPTIONAL
,
224 OUT VOID
**TxBuf OPTIONAL
230 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
,
233 IN
/* +OUT! */ VOID
*Buffer
,
234 IN EFI_MAC_ADDRESS
*SrcAddr OPTIONAL
,
235 IN EFI_MAC_ADDRESS
*DestAddr OPTIONAL
,
236 IN UINT16
*Protocol OPTIONAL
242 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
,
243 OUT UINTN
*HeaderSize OPTIONAL
,
244 IN OUT UINTN
*BufferSize
,
246 OUT EFI_MAC_ADDRESS
*SrcAddr OPTIONAL
,
247 OUT EFI_MAC_ADDRESS
*DestAddr OPTIONAL
,
248 OUT UINT16
*Protocol OPTIONAL
252 // utility functions shared by various SNP member functions
256 VirtioNetShutdownRx (
262 VirtioNetShutdownTx (
271 VirtioNetIsPacketAvailable (
283 #endif // _VIRTIO_NET_DXE_H_