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 VOID
*RxRingMap
; // VirtioRingMap and
87 UINT8
*RxBuf
; // VirtioNetInitRx
88 UINT16 RxLastUsed
; // VirtioNetInitRx
90 VRING TxRing
; // VirtioNetInitRing
91 VOID
*TxRingMap
; // VirtioRingMap and
93 UINT16 TxMaxPending
; // VirtioNetInitTx
94 UINT16 TxCurPending
; // VirtioNetInitTx
95 UINT16
*TxFreeStack
; // VirtioNetInitTx
96 VIRTIO_1_0_NET_REQ TxSharedReq
; // VirtioNetInitTx
97 UINT16 TxLastUsed
; // VirtioNetInitTx
102 // In order to avoid duplication of interface documentation, please find all
103 // leading comments near the respective function / variable definitions (not
104 // the declarations here), which is where your code editor of choice takes you
105 // anyway when jumping to a function.
111 #define VIRTIO_NET_FROM_SNP(SnpPointer) \
112 CR (SnpPointer, VNET_DEV, Snp, VNET_SIG)
114 #define VIRTIO_CFG_WRITE(Dev, Field, Value) ((Dev)->VirtIo->WriteDevice ( \
116 OFFSET_OF_VNET (Field), \
117 SIZE_OF_VNET (Field), \
121 #define VIRTIO_CFG_READ(Dev, Field, Pointer) ((Dev)->VirtIo->ReadDevice ( \
123 OFFSET_OF_VNET (Field), \
124 SIZE_OF_VNET (Field), \
132 extern EFI_COMPONENT_NAME_PROTOCOL gVirtioNetComponentName
;
133 extern EFI_COMPONENT_NAME2_PROTOCOL gVirtioNetComponentName2
;
138 extern EFI_DRIVER_BINDING_PROTOCOL gVirtioNetDriverBinding
;
141 // member functions implementing the Simple Network Protocol
146 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
152 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
157 VirtioNetInitialize (
158 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
,
159 IN UINTN ExtraRxBufferSize OPTIONAL
,
160 IN UINTN ExtraTxBufferSize OPTIONAL
166 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
,
167 IN BOOLEAN ExtendedVerification
173 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
178 VirtioNetReceiveFilters (
179 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
,
182 IN BOOLEAN ResetMCastFilter
,
183 IN UINTN MCastFilterCnt OPTIONAL
,
184 IN EFI_MAC_ADDRESS
*MCastFilter OPTIONAL
189 VirtioNetStationAddress (
190 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
,
192 IN EFI_MAC_ADDRESS
*New OPTIONAL
197 VirtioNetStatistics (
198 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
,
200 IN OUT UINTN
*StatisticsSize OPTIONAL
,
201 OUT EFI_NETWORK_STATISTICS
*StatisticsTable OPTIONAL
206 VirtioNetMcastIpToMac (
207 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
,
209 IN EFI_IP_ADDRESS
*Ip
,
210 OUT EFI_MAC_ADDRESS
*Mac
216 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
,
217 IN BOOLEAN ReadWrite
,
226 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
,
227 OUT UINT32
*InterruptStatus OPTIONAL
,
228 OUT VOID
**TxBuf OPTIONAL
234 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
,
237 IN
/* +OUT! */ VOID
*Buffer
,
238 IN EFI_MAC_ADDRESS
*SrcAddr OPTIONAL
,
239 IN EFI_MAC_ADDRESS
*DestAddr OPTIONAL
,
240 IN UINT16
*Protocol OPTIONAL
246 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
,
247 OUT UINTN
*HeaderSize OPTIONAL
,
248 IN OUT UINTN
*BufferSize
,
250 OUT EFI_MAC_ADDRESS
*SrcAddr OPTIONAL
,
251 OUT EFI_MAC_ADDRESS
*DestAddr OPTIONAL
,
252 OUT UINT16
*Protocol OPTIONAL
256 // utility functions shared by various SNP member functions
260 VirtioNetShutdownRx (
266 VirtioNetShutdownTx (
272 VirtioNetUninitRing (
273 IN OUT VNET_DEV
*Dev
,
283 VirtioNetIsPacketAvailable (
295 #endif // _VIRTIO_NET_DXE_H_