]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/VirtioNetDxe/VirtioNet.h
OvmfPkg/VirtioNetDxe: Fix build errors on VS2012 (IA32 & X64)
[mirror_edk2.git] / OvmfPkg / VirtioNetDxe / VirtioNet.h
CommitLineData
201cac0d
LE
1/** @file\r
2\r
3 Internal definitions for the virtio-net driver, which produces Simple Network\r
4 Protocol instances for virtio-net devices.\r
5\r
6 Copyright (C) 2013, Red Hat, Inc.\r
7\r
8 This program and the accompanying materials are licensed and made available\r
9 under the terms and conditions of the BSD License which accompanies this\r
10 distribution. The full text of the license may be found at\r
11 http://opensource.org/licenses/bsd-license.php\r
12\r
13 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT\r
14 WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
15**/\r
16\r
17#ifndef _VIRTIO_NET_DXE_H_\r
18#define _VIRTIO_NET_DXE_H_\r
19\r
20#include <IndustryStandard/VirtioNet.h>\r
21#include <Library/DebugLib.h>\r
22#include <Library/VirtioLib.h>\r
23#include <Protocol/ComponentName.h>\r
24#include <Protocol/ComponentName2.h>\r
25#include <Protocol/DevicePath.h>\r
26#include <Protocol/DriverBinding.h>\r
27#include <Protocol/PciIo.h>\r
28#include <Protocol/SimpleNetwork.h>\r
29\r
30#define VNET_SIG SIGNATURE_32 ('V', 'N', 'E', 'T')\r
31\r
32//\r
33// maximum number of pending packets, separately for each direction\r
34//\r
35#define VNET_MAX_PENDING 64\r
36\r
37//\r
38// State diagram:\r
39//\r
40// | ^\r
41// | |\r
42// BindingStart BindingStop\r
43// +SnpPopulate |\r
44// ++GetFeatures |\r
45// | |\r
46// v |\r
47// +---------+ virtio-net device is reset, no resources are\r
48// | stopped | allocated for traffic, but MAC address has\r
49// +---------+ been retrieved\r
50// | ^\r
51// | |\r
52// SNP.Start SNP.Stop\r
53// | |\r
54// v |\r
55// +---------+\r
56// | started | functionally identical to stopped\r
57// +---------+\r
58// | ^\r
59// | |\r
60// SNP.Initialize SNP.Shutdown\r
61// | |\r
62// v |\r
63// +-------------+ Virtio-net setup complete, including DRIVER_OK\r
64// | initialized | bit. The receive queue is populated with\r
65// +-------------+ requests; McastIpToMac, GetStatus, Transmit,\r
66// Receive are callable.\r
67//\r
68\r
69typedef struct {\r
70 //\r
71 // Parts of this structure are initialized / torn down in various functions\r
72 // at various call depths. The table to the right should make it easier to\r
73 // track them.\r
74 //\r
75 // field init function\r
76 // ------------------ ------------------------------\r
77 UINT32 Signature; // VirtioNetDriverBindingStart\r
78 EFI_PCI_IO_PROTOCOL *PciIo; // VirtioNetDriverBindingStart\r
79 UINT64 OrigPciAttributes; // VirtioNetDriverBindingStart\r
80 EFI_SIMPLE_NETWORK_PROTOCOL Snp; // VirtioNetSnpPopulate\r
81 EFI_SIMPLE_NETWORK_MODE Snm; // VirtioNetSnpPopulate\r
82 EFI_EVENT ExitBoot; // VirtioNetSnpPopulate\r
83 EFI_DEVICE_PATH_PROTOCOL *MacDevicePath; // VirtioNetDriverBindingStart\r
84 EFI_HANDLE MacHandle; // VirtioNetDriverBindingStart\r
85\r
86 VRING RxRing; // VirtioNetInitRing\r
87 UINT8 *RxBuf; // VirtioNetInitRx\r
88 UINT16 RxLastUsed; // VirtioNetInitRx\r
89\r
90 VRING TxRing; // VirtioNetInitRing\r
91 UINT16 TxMaxPending; // VirtioNetInitTx\r
92 UINT16 TxCurPending; // VirtioNetInitTx\r
93 UINT16 *TxFreeStack; // VirtioNetInitTx\r
94 VIRTIO_NET_REQ TxSharedReq; // VirtioNetInitTx\r
95 UINT16 TxLastUsed; // VirtioNetInitTx\r
96} VNET_DEV;\r
97\r
98\r
99//\r
100// In order to avoid duplication of interface documentation, please find all\r
101// leading comments near the respective function / variable definitions (not\r
102// the declarations here), which is where your code editor of choice takes you\r
103// anyway when jumping to a function.\r
104//\r
105\r
106//\r
107// utility macros\r
108//\r
109#define VIRTIO_NET_FROM_SNP(SnpPointer) \\r
110 CR (SnpPointer, VNET_DEV, Snp, VNET_SIG)\r
111\r
112#define VIRTIO_CFG_WRITE(Dev, Field, Value) (VirtioWrite ( \\r
113 (Dev)->PciIo, \\r
114 OFFSET_OF_VNET (Field), \\r
115 SIZE_OF_VNET (Field), \\r
116 (Value) \\r
117 ))\r
118\r
119#define VIRTIO_CFG_READ(Dev, Field, Pointer) (VirtioRead ( \\r
120 (Dev)->PciIo, \\r
121 OFFSET_OF_VNET (Field), \\r
122 SIZE_OF_VNET (Field), \\r
123 sizeof *(Pointer), \\r
124 (Pointer) \\r
125 ))\r
126\r
127//\r
128// component naming\r
129//\r
130extern EFI_COMPONENT_NAME_PROTOCOL gVirtioNetComponentName;\r
131extern EFI_COMPONENT_NAME2_PROTOCOL gVirtioNetComponentName2;\r
132\r
133//\r
134// driver binding\r
135//\r
136extern EFI_DRIVER_BINDING_PROTOCOL gVirtioNetDriverBinding;\r
137\r
138//\r
139// member functions implementing the Simple Network Protocol\r
140//\r
141EFI_STATUS\r
142EFIAPI\r
143VirtioNetStart (\r
144 IN EFI_SIMPLE_NETWORK_PROTOCOL *This\r
145 );\r
146\r
147EFI_STATUS\r
148EFIAPI\r
149VirtioNetStop (\r
150 IN EFI_SIMPLE_NETWORK_PROTOCOL *This\r
151 );\r
152\r
153EFI_STATUS\r
154EFIAPI\r
155VirtioNetInitialize (\r
156 IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
157 IN UINTN ExtraRxBufferSize OPTIONAL,\r
158 IN UINTN ExtraTxBufferSize OPTIONAL\r
159 );\r
160\r
161EFI_STATUS\r
162EFIAPI\r
163VirtioNetReset (\r
164 IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
165 IN BOOLEAN ExtendedVerification\r
166 );\r
167\r
168EFI_STATUS\r
169EFIAPI\r
170VirtioNetShutdown (\r
171 IN EFI_SIMPLE_NETWORK_PROTOCOL *This\r
172 );\r
173\r
174EFI_STATUS\r
175EFIAPI\r
176VirtioNetReceiveFilters (\r
177 IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
178 IN UINT32 Enable,\r
179 IN UINT32 Disable,\r
180 IN BOOLEAN ResetMCastFilter,\r
181 IN UINTN MCastFilterCnt OPTIONAL,\r
182 IN EFI_MAC_ADDRESS *MCastFilter OPTIONAL\r
183 );\r
184\r
185EFI_STATUS\r
186EFIAPI\r
187VirtioNetStationAddress (\r
188 IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
189 IN BOOLEAN Reset,\r
190 IN EFI_MAC_ADDRESS *New OPTIONAL\r
191 );\r
192\r
193EFI_STATUS\r
194EFIAPI\r
195VirtioNetStatistics (\r
196 IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
197 IN BOOLEAN Reset,\r
198 IN OUT UINTN *StatisticsSize OPTIONAL,\r
199 OUT EFI_NETWORK_STATISTICS *StatisticsTable OPTIONAL\r
200 );\r
201\r
202EFI_STATUS\r
203EFIAPI\r
204VirtioNetMcastIpToMac (\r
205 IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
206 IN BOOLEAN IPv6,\r
207 IN EFI_IP_ADDRESS *Ip,\r
208 OUT EFI_MAC_ADDRESS *Mac\r
209 );\r
210\r
211EFI_STATUS\r
212EFIAPI\r
213VirtioNetNvData (\r
214 IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
215 IN BOOLEAN ReadWrite,\r
216 IN UINTN Offset,\r
217 IN UINTN BufferSize,\r
218 IN OUT VOID *Buffer\r
219 );\r
220\r
221EFI_STATUS\r
222EFIAPI\r
223VirtioNetGetStatus (\r
224 IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
225 OUT UINT32 *InterruptStatus OPTIONAL,\r
226 OUT VOID **TxBuf OPTIONAL\r
227 );\r
228\r
229EFI_STATUS\r
230EFIAPI\r
231VirtioNetTransmit (\r
232 IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
233 IN UINTN HeaderSize,\r
234 IN UINTN BufferSize,\r
235 IN /* +OUT! */ VOID *Buffer,\r
236 IN EFI_MAC_ADDRESS *SrcAddr OPTIONAL,\r
237 IN EFI_MAC_ADDRESS *DestAddr OPTIONAL,\r
238 IN UINT16 *Protocol OPTIONAL\r
239 );\r
240\r
241EFI_STATUS\r
242EFIAPI\r
243VirtioNetReceive (\r
244 IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
245 OUT UINTN *HeaderSize OPTIONAL,\r
246 IN OUT UINTN *BufferSize,\r
247 OUT VOID *Buffer,\r
248 OUT EFI_MAC_ADDRESS *SrcAddr OPTIONAL,\r
249 OUT EFI_MAC_ADDRESS *DestAddr OPTIONAL,\r
250 OUT UINT16 *Protocol OPTIONAL\r
251 );\r
252\r
253//\r
254// utility functions shared by various SNP member functions\r
255//\r
256VOID\r
257EFIAPI\r
258VirtioNetShutdownRx (\r
259 IN OUT VNET_DEV *Dev\r
260 );\r
261\r
262VOID\r
263EFIAPI\r
264VirtioNetShutdownTx (\r
265 IN OUT VNET_DEV *Dev\r
266 );\r
267\r
268//\r
269// event callbacks\r
270//\r
271VOID\r
272EFIAPI\r
273VirtioNetIsPacketAvailable (\r
274 IN EFI_EVENT Event,\r
275 IN VOID *Context\r
276 );\r
277\r
278VOID\r
279EFIAPI\r
280VirtioNetExitBoot (\r
281 IN EFI_EVENT Event,\r
282 IN VOID *Context\r
283 );\r
284\r
285#endif // _VIRTIO_NET_DXE_H_\r