1 /** @file 2 3 Internal definitions for the virtio-net driver, which produces Simple Network 4 Protocol instances for virtio-net devices. 5 6 Copyright (C) 2013, Red Hat, Inc. 7 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 12 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. 15 **/ 16 17 #ifndef _VIRTIO_NET_DXE_H_ 18 #define _VIRTIO_NET_DXE_H_ 19 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> 28 29 #define VNET_SIG SIGNATURE_32 ('V', 'N', 'E', 'T') 30 31 // 32 // maximum number of pending packets, separately for each direction 33 // 34 #define VNET_MAX_PENDING 64 35 36 // 37 // State diagram: 38 // 39 // | ^ 40 // | | 41 // BindingStart BindingStop 42 // +SnpPopulate | 43 // ++GetFeatures | 44 // | | 45 // v | 46 // +---------+ virtio-net device is reset, no resources are 47 // | stopped | allocated for traffic, but MAC address has 48 // +---------+ been retrieved 49 // | ^ 50 // | | 51 // SNP.Start SNP.Stop 52 // | | 53 // v | 54 // +---------+ 55 // | started | functionally identical to stopped 56 // +---------+ 57 // | ^ 58 // | | 59 // SNP.Initialize SNP.Shutdown 60 // | | 61 // v | 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. 66 // 67 68 typedef struct { 69 // 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 72 // track them. 73 // 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 83 84 VRING RxRing; // VirtioNetInitRing 85 UINT8 *RxBuf; // VirtioNetInitRx 86 UINT16 RxLastUsed; // VirtioNetInitRx 87 88 VRING TxRing; // VirtioNetInitRing 89 UINT16 TxMaxPending; // VirtioNetInitTx 90 UINT16 TxCurPending; // VirtioNetInitTx 91 UINT16 *TxFreeStack; // VirtioNetInitTx 92 VIRTIO_NET_REQ TxSharedReq; // VirtioNetInitTx 93 UINT16 TxLastUsed; // VirtioNetInitTx 94 } VNET_DEV; 95 96 97 // 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. 102 // 103 104 // 105 // utility macros 106 // 107 #define VIRTIO_NET_FROM_SNP(SnpPointer) \ 108 CR (SnpPointer, VNET_DEV, Snp, VNET_SIG) 109 110 #define VIRTIO_CFG_WRITE(Dev, Field, Value) ((Dev)->VirtIo->WriteDevice ( \ 111 (Dev)->VirtIo, \ 112 OFFSET_OF_VNET (Field), \ 113 SIZE_OF_VNET (Field), \ 114 (Value) \ 115 )) 116 117 #define VIRTIO_CFG_READ(Dev, Field, Pointer) ((Dev)->VirtIo->ReadDevice ( \ 118 (Dev)->VirtIo, \ 119 OFFSET_OF_VNET (Field), \ 120 SIZE_OF_VNET (Field), \ 121 sizeof *(Pointer), \ 122 (Pointer) \ 123 )) 124 125 // 126 // component naming 127 // 128 extern EFI_COMPONENT_NAME_PROTOCOL gVirtioNetComponentName; 129 extern EFI_COMPONENT_NAME2_PROTOCOL gVirtioNetComponentName2; 130 131 // 132 // driver binding 133 // 134 extern EFI_DRIVER_BINDING_PROTOCOL gVirtioNetDriverBinding; 135 136 // 137 // member functions implementing the Simple Network Protocol 138 // 139 EFI_STATUS 140 EFIAPI 141 VirtioNetStart ( 142 IN EFI_SIMPLE_NETWORK_PROTOCOL *This 143 ); 144 145 EFI_STATUS 146 EFIAPI 147 VirtioNetStop ( 148 IN EFI_SIMPLE_NETWORK_PROTOCOL *This 149 ); 150 151 EFI_STATUS 152 EFIAPI 153 VirtioNetInitialize ( 154 IN EFI_SIMPLE_NETWORK_PROTOCOL *This, 155 IN UINTN ExtraRxBufferSize OPTIONAL, 156 IN UINTN ExtraTxBufferSize OPTIONAL 157 ); 158 159 EFI_STATUS 160 EFIAPI 161 VirtioNetReset ( 162 IN EFI_SIMPLE_NETWORK_PROTOCOL *This, 163 IN BOOLEAN ExtendedVerification 164 ); 165 166 EFI_STATUS 167 EFIAPI 168 VirtioNetShutdown ( 169 IN EFI_SIMPLE_NETWORK_PROTOCOL *This 170 ); 171 172 EFI_STATUS 173 EFIAPI 174 VirtioNetReceiveFilters ( 175 IN EFI_SIMPLE_NETWORK_PROTOCOL *This, 176 IN UINT32 Enable, 177 IN UINT32 Disable, 178 IN BOOLEAN ResetMCastFilter, 179 IN UINTN MCastFilterCnt OPTIONAL, 180 IN EFI_MAC_ADDRESS *MCastFilter OPTIONAL 181 ); 182 183 EFI_STATUS 184 EFIAPI 185 VirtioNetStationAddress ( 186 IN EFI_SIMPLE_NETWORK_PROTOCOL *This, 187 IN BOOLEAN Reset, 188 IN EFI_MAC_ADDRESS *New OPTIONAL 189 ); 190 191 EFI_STATUS 192 EFIAPI 193 VirtioNetStatistics ( 194 IN EFI_SIMPLE_NETWORK_PROTOCOL *This, 195 IN BOOLEAN Reset, 196 IN OUT UINTN *StatisticsSize OPTIONAL, 197 OUT EFI_NETWORK_STATISTICS *StatisticsTable OPTIONAL 198 ); 199 200 EFI_STATUS 201 EFIAPI 202 VirtioNetMcastIpToMac ( 203 IN EFI_SIMPLE_NETWORK_PROTOCOL *This, 204 IN BOOLEAN IPv6, 205 IN EFI_IP_ADDRESS *Ip, 206 OUT EFI_MAC_ADDRESS *Mac 207 ); 208 209 EFI_STATUS 210 EFIAPI 211 VirtioNetNvData ( 212 IN EFI_SIMPLE_NETWORK_PROTOCOL *This, 213 IN BOOLEAN ReadWrite, 214 IN UINTN Offset, 215 IN UINTN BufferSize, 216 IN OUT VOID *Buffer 217 ); 218 219 EFI_STATUS 220 EFIAPI 221 VirtioNetGetStatus ( 222 IN EFI_SIMPLE_NETWORK_PROTOCOL *This, 223 OUT UINT32 *InterruptStatus OPTIONAL, 224 OUT VOID **TxBuf OPTIONAL 225 ); 226 227 EFI_STATUS 228 EFIAPI 229 VirtioNetTransmit ( 230 IN EFI_SIMPLE_NETWORK_PROTOCOL *This, 231 IN UINTN HeaderSize, 232 IN UINTN BufferSize, 233 IN /* +OUT! */ VOID *Buffer, 234 IN EFI_MAC_ADDRESS *SrcAddr OPTIONAL, 235 IN EFI_MAC_ADDRESS *DestAddr OPTIONAL, 236 IN UINT16 *Protocol OPTIONAL 237 ); 238 239 EFI_STATUS 240 EFIAPI 241 VirtioNetReceive ( 242 IN EFI_SIMPLE_NETWORK_PROTOCOL *This, 243 OUT UINTN *HeaderSize OPTIONAL, 244 IN OUT UINTN *BufferSize, 245 OUT VOID *Buffer, 246 OUT EFI_MAC_ADDRESS *SrcAddr OPTIONAL, 247 OUT EFI_MAC_ADDRESS *DestAddr OPTIONAL, 248 OUT UINT16 *Protocol OPTIONAL 249 ); 250 251 // 252 // utility functions shared by various SNP member functions 253 // 254 VOID 255 EFIAPI 256 VirtioNetShutdownRx ( 257 IN OUT VNET_DEV *Dev 258 ); 259 260 VOID 261 EFIAPI 262 VirtioNetShutdownTx ( 263 IN OUT VNET_DEV *Dev 264 ); 265 266 // 267 // event callbacks 268 // 269 VOID 270 EFIAPI 271 VirtioNetIsPacketAvailable ( 272 IN EFI_EVENT Event, 273 IN VOID *Context 274 ); 275 276 VOID 277 EFIAPI 278 VirtioNetExitBoot ( 279 IN EFI_EVENT Event, 280 IN VOID *Context 281 ); 282 283 #endif // _VIRTIO_NET_DXE_H_ 284