iPXE
mnpnet.c
Go to the documentation of this file.
1/*
2 * Copyright (C) 2024 Michael Brown <mbrown@fensystems.co.uk>.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as
6 * published by the Free Software Foundation; either version 2 of the
7 * License, or any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17 * 02110-1301, USA.
18 *
19 * You can also choose to distribute this program under the terms of
20 * the Unmodified Binary Distribution Licence (as given in the file
21 * COPYING.UBDL), provided that you have satisfied its requirements.
22 */
23
24FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
25FILE_SECBOOT ( PERMITTED );
26
27/** @file
28 *
29 * MNP NIC driver
30 *
31 */
32
33#include <string.h>
34#include <errno.h>
35#include <ipxe/iobuf.h>
36#include <ipxe/netdevice.h>
37#include <ipxe/ethernet.h>
38#include <ipxe/cachedhcp.h>
39#include <ipxe/efi/efi.h>
40#include <ipxe/efi/efi_driver.h>
42#include <ipxe/efi/efi_utils.h>
43#include <ipxe/efi/mnpnet.h>
45
46/** An MNP transmit or receive token */
47struct mnp_token {
48 /** MNP completion token */
50 /** Token is owned by MNP */
51 int busy;
52};
53
54/** An MNP NIC */
55struct mnp_nic {
56 /** EFI device */
58 /** Managed network protocol */
60 /** Generic device */
61 struct device dev;
62
63 /** Transmit token */
64 struct mnp_token tx;
65 /** Transmit descriptor */
67 /** Transmit I/O buffer */
69
70 /** Receive token */
71 struct mnp_token rx;
72};
73
74/**
75 * Transmit or receive token event
76 *
77 * @v event Event
78 * @v context Event context
79 */
80static VOID EFIAPI mnpnet_event ( EFI_EVENT event __unused, VOID *context ) {
81 struct mnp_token *token = context;
82
83 /* Sanity check */
84 assert ( token->busy );
85
86 /* Mark token as no longer owned by MNP */
87 token->busy = 0;
88}
89
90/**
91 * Transmit packet
92 *
93 * @v netdev Network device
94 * @v iobuf I/O buffer
95 * @ret rc Return status code
96 */
97static int mnpnet_transmit ( struct net_device *netdev,
98 struct io_buffer *iobuf ) {
99 struct mnp_nic *mnp = netdev->priv;
100 struct ll_protocol *ll_protocol = netdev->ll_protocol;
101 EFI_STATUS efirc;
102 int rc;
103
104 /* Do nothing if shutdown is in progress */
106 return -ECANCELED;
107
108 /* Defer the packet if there is already a transmission in progress */
109 if ( mnp->txbuf ) {
110 netdev_tx_defer ( netdev, iobuf );
111 return 0;
112 }
113
114 /* Construct transmit token */
115 mnp->txdata.DataLength =
116 ( iob_len ( iobuf ) - ll_protocol->ll_header_len );
118 mnp->txdata.FragmentCount = 1;
119 mnp->txdata.FragmentTable[0].FragmentLength = iob_len ( iobuf );
120 mnp->txdata.FragmentTable[0].FragmentBuffer = iobuf->data;
121 mnp->tx.token.Packet.TxData = &mnp->txdata;
122
123 /* Record as in use */
124 mnp->tx.busy = 1;
125
126 /* Transmit packet */
127 if ( ( efirc = mnp->mnp->Transmit ( mnp->mnp, &mnp->tx.token ) ) != 0 ){
128 rc = -EEFI ( efirc );
129 DBGC ( mnp, "MNP %s could not transmit: %s\n",
130 netdev->name, strerror ( rc ) );
131 mnp->tx.busy = 0;
132 return rc;
133 }
134
135 /* Record I/O buffer */
136 mnp->txbuf = iobuf;
137
138 return 0;
139}
140
141/**
142 * Refill receive token
143 *
144 * @v netdev Network device
145 */
146static void mnpnet_refill_rx ( struct net_device *netdev ) {
147 struct mnp_nic *mnp = netdev->priv;
148 EFI_STATUS efirc;
149 int rc;
150
151 /* Do nothing if receive token is still in use */
152 if ( mnp->rx.busy )
153 return;
154
155 /* Mark as in use */
156 mnp->rx.busy = 1;
157
158 /* Queue receive token */
159 if ( ( efirc = mnp->mnp->Receive ( mnp->mnp, &mnp->rx.token ) ) != 0 ) {
160 rc = -EEFI ( efirc );
161 DBGC ( mnp, "MNP %s could not receive: %s\n",
162 netdev->name, strerror ( rc ) );
163 /* Wait for next refill */
164 mnp->rx.busy = 0;
165 return;
166 }
167}
168
169/**
170 * Poll for completed packets
171 *
172 * @v netdev Network device
173 */
174static void mnpnet_poll_tx ( struct net_device *netdev ) {
175 struct mnp_nic *mnp = netdev->priv;
176 struct io_buffer *iobuf;
177 EFI_STATUS efirc;
178 int rc;
179
180 /* Do nothing if transmit token is still in use */
181 if ( mnp->tx.busy )
182 return;
183
184 /* Do nothing unless we have a completion */
185 if ( ! mnp->txbuf )
186 return;
187
188 /* Get completion status */
189 efirc = mnp->tx.token.Status;
190 rc = ( efirc ? -EEFI ( efirc ) : 0 );
191
192 /* Complete transmission */
193 iobuf = mnp->txbuf;
194 mnp->txbuf = NULL;
195 netdev_tx_complete_err ( netdev, iobuf, rc );
196}
197
198/**
199 * Poll for received packets
200 *
201 * @v netdev Network device
202 */
203static void mnpnet_poll_rx ( struct net_device *netdev ) {
204 EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
205 struct mnp_nic *mnp = netdev->priv;
207 struct io_buffer *iobuf;
208 size_t len;
209 EFI_STATUS efirc;
210 int rc;
211
212 /* Do nothing unless we have a completion */
213 if ( mnp->rx.busy )
214 return;
215 rxdata = mnp->rx.token.Packet.RxData;
216
217 /* Get completion status */
218 if ( ( efirc = mnp->rx.token.Status ) != 0 ) {
219 rc = -EEFI ( efirc );
221 goto recycle;
222 }
223
224 /* Allocate and fill I/O buffer */
225 len = rxdata->PacketLength;
226 iobuf = alloc_iob ( len );
227 if ( ! iobuf ) {
229 goto recycle;
230 }
231 memcpy ( iob_put ( iobuf, len ), rxdata->MediaHeader, len );
232
233 /* Hand off to network stack */
234 netdev_rx ( netdev, iobuf );
235
236 recycle:
237 /* Recycle token */
238 bs->SignalEvent ( rxdata->RecycleEvent );
239}
240
241/**
242 * Poll for completed packets
243 *
244 * @v netdev Network device
245 */
246static void mnpnet_poll ( struct net_device *netdev ) {
247 struct mnp_nic *mnp = netdev->priv;
248
249 /* Do nothing if shutdown is in progress */
251 return;
252
253 /* Poll interface */
254 mnp->mnp->Poll ( mnp->mnp );
255
256 /* Process any transmit completions */
258
259 /* Process any receive completions */
261
262 /* Refill receive token */
264}
265
266/**
267 * Open network device
268 *
269 * @v netdev Network device
270 * @ret rc Return status code
271 */
272static int mnpnet_open ( struct net_device *netdev ) {
273 EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
274 static EFI_MANAGED_NETWORK_CONFIG_DATA config = {
275 .EnableUnicastReceive = TRUE,
276 .EnableMulticastReceive = TRUE,
277 .EnableBroadcastReceive = TRUE,
278 .EnablePromiscuousReceive = TRUE,
279 .FlushQueuesOnReset = TRUE,
280 .DisableBackgroundPolling = TRUE,
281 };
282 struct mnp_nic *mnp = netdev->priv;
283 EFI_STATUS efirc;
284 int rc;
285
286 /* Create transmit event */
287 if ( ( efirc = bs->CreateEvent ( EVT_NOTIFY_SIGNAL, TPL_NOTIFY,
288 mnpnet_event, &mnp->tx,
289 &mnp->tx.token.Event ) ) != 0 ) {
290 rc = -EEFI ( efirc );
291 DBGC ( mnp, "MNP %s could not create TX event: %s\n",
292 netdev->name, strerror ( rc ) );
293 goto err_tx_event;
294 }
295
296 /* Create receive event */
297 if ( ( efirc = bs->CreateEvent ( EVT_NOTIFY_SIGNAL, TPL_NOTIFY,
298 mnpnet_event, &mnp->rx,
299 &mnp->rx.token.Event ) ) != 0 ) {
300 rc = -EEFI ( efirc );
301 DBGC ( mnp, "MNP %s could not create RX event: %s\n",
302 netdev->name, strerror ( rc ) );
303 goto err_rx_event;
304 }
305
306 /* Configure MNP */
307 if ( ( efirc = mnp->mnp->Configure ( mnp->mnp, &config ) ) != 0 ) {
308 rc = -EEFI ( efirc );
309 DBGC ( mnp, "MNP %s could not configure: %s\n",
310 netdev->name, strerror ( rc ) );
311 goto err_configure;
312 }
313
314 /* Refill receive token */
316
317 return 0;
318
319 mnp->mnp->Configure ( mnp->mnp, NULL );
320 err_configure:
321 bs->CloseEvent ( mnp->rx.token.Event );
322 err_rx_event:
323 bs->CloseEvent ( mnp->tx.token.Event );
324 err_tx_event:
325 return rc;
326}
327
328/**
329 * Close network device
330 *
331 * @v netdev Network device
332 */
333static void mnpnet_close ( struct net_device *netdev ) {
334 EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
335 struct mnp_nic *mnp = netdev->priv;
336
337 /* Reset MNP (unless whole system shutdown is in progress) */
339 mnp->mnp->Configure ( mnp->mnp, NULL );
340
341 /* Close events */
342 bs->CloseEvent ( mnp->rx.token.Event );
343 bs->CloseEvent ( mnp->tx.token.Event );
344
345 /* Reset tokens */
346 mnp->tx.busy = 0;
347 mnp->rx.busy = 0;
348
349 /* Discard any incomplete I/O buffer */
350 if ( mnp->txbuf ) {
352 mnp->txbuf = NULL;
353 }
354}
355
356/** MNP network device operations */
358 .open = mnpnet_open,
359 .close = mnpnet_close,
360 .transmit = mnpnet_transmit,
361 .poll = mnpnet_poll,
362};
363
364/**
365 * Attach driver to device
366 *
367 * @v efidev EFI device
368 * @ret rc Return status code
369 */
370int mnpnet_start ( struct efi_device *efidev ) {
371 EFI_HANDLE device = efidev->device;
374 struct net_device *netdev;
375 struct mnp_nic *mnp;
376 EFI_STATUS efirc;
377 int rc;
378
379 /* Allocate and initalise structure */
380 netdev = alloc_etherdev ( sizeof ( *mnp ) );
381 if ( ! netdev ) {
382 rc = -ENOMEM;
383 goto err_alloc;
384 }
386 mnp = netdev->priv;
387 mnp->efidev = efidev;
389
390 /* Populate underlying device information */
391 efi_device_info ( device, "MNP", &mnp->dev );
392 mnp->dev.driver_name = "MNP";
393 mnp->dev.parent = &efidev->dev;
394 list_add ( &mnp->dev.siblings, &efidev->dev.children );
395 INIT_LIST_HEAD ( &mnp->dev.children );
396 netdev->dev = &mnp->dev;
397
398 /* Create MNP child */
399 if ( ( rc = efi_service_add ( device, binding,
400 &efidev->child ) ) != 0 ) {
401 DBGC ( mnp, "MNP %s could not create child: %s\n",
403 goto err_service;
404 }
405
406 /* Open MNP protocol */
407 if ( ( rc = efi_open_by_driver ( efidev->child,
409 &mnp->mnp ) ) != 0 ) {
410 DBGC ( mnp, "MNP %s could not open MNP protocol: %s\n",
412 goto err_open;
413 }
414
415 /* Get configuration */
416 efirc = mnp->mnp->GetModeData ( mnp->mnp, NULL, &mode );
417 if ( ( efirc != 0 ) && ( efirc != EFI_NOT_STARTED ) ) {
418 rc = -EEFI ( efirc );
419 DBGC ( mnp, "MNP %s could not get mode data: %s\n",
421 goto err_mode;
422 }
423
424 /* Populate network device parameters */
425 if ( mode.HwAddressSize != netdev->ll_protocol->hw_addr_len ) {
426 DBGC ( device, "MNP %s has invalid hardware address length "
427 "%d\n", efi_handle_name ( device ), mode.HwAddressSize );
428 rc = -ENOTSUP;
429 goto err_hw_addr_len;
430 }
431 memcpy ( netdev->hw_addr, &mode.PermanentAddress,
432 netdev->ll_protocol->hw_addr_len );
433 if ( mode.HwAddressSize != netdev->ll_protocol->ll_addr_len ) {
434 DBGC ( device, "MNP %s has invalid link-layer address length "
435 "%d\n", efi_handle_name ( device ), mode.HwAddressSize );
436 rc = -ENOTSUP;
437 goto err_ll_addr_len;
438 }
439 memcpy ( netdev->ll_addr, &mode.CurrentAddress,
440 netdev->ll_protocol->ll_addr_len );
441
442 /* Register network device */
443 if ( ( rc = register_netdev ( netdev ) ) != 0 )
444 goto err_register;
445 DBGC ( mnp, "MNP %s registered as %s\n",
446 efi_handle_name ( device ), netdev->name );
447
448 /* Mark as link up: we don't handle link state */
450
451 return 0;
452
454 err_register:
455 err_ll_addr_len:
456 err_hw_addr_len:
457 err_mode:
460 err_open:
461 efi_service_del ( device, binding, efidev->child );
462 err_service:
463 list_del ( &mnp->dev.siblings );
465 netdev_put ( netdev );
466 err_alloc:
467 return rc;
468}
469
470/**
471 * Detach driver from device
472 *
473 * @v efidev EFI device
474 */
475void mnpnet_stop ( struct efi_device *efidev ) {
477 struct net_device *netdev = efidev_get_drvdata ( efidev );
478 struct mnp_nic *mnp = netdev->priv;
479
480 /* Unregister network device */
482
483 /* Close MNP protocol */
486
487 /* Remove MNP child (unless whole system shutdown is in progress) */
489 efi_service_del ( efidev->device, binding, efidev->child );
490
491 /* Free network device */
492 list_del ( &mnp->dev.siblings );
494 netdev_put ( netdev );
495}
496
497/**
498 * Create temporary MNP network device
499 *
500 * @v handle MNP service binding handle
501 * @v netdev Network device to fill in
502 * @ret rc Return status code
503 */
505 struct efi_device *efidev;
506 int rc;
507
508 /* Create temporary EFI device */
509 efidev = efidev_alloc ( handle );
510 if ( ! efidev ) {
511 DBGC ( handle, "MNP %s could not create temporary device\n",
513 rc = -ENOMEM;
514 goto err_alloc;
515 }
516
517 /* Start temporary network device */
518 if ( ( rc = mnpnet_start ( efidev ) ) != 0 ) {
519 DBGC ( handle, "MNP %s could not start MNP: %s\n",
521 goto err_start;
522 }
523
524 /* Fill in network device */
525 *netdev = efidev_get_drvdata ( efidev );
526
527 return 0;
528
529 mnpnet_stop ( efidev );
530 err_start:
531 efidev_free ( efidev );
532 err_alloc:
533 return rc;
534}
535
536/**
537 * Destroy temporary MNP network device
538 *
539 * @v netdev Network device
540 */
542 struct mnp_nic *mnp = netdev->priv;
543 struct efi_device *efidev = mnp->efidev;
544
545 /* Recycle any cached DHCP packet */
547
548 /* Stop temporary network device */
549 mnpnet_stop ( efidev );
550
551 /* Free temporary EFI device */
552 efidev_free ( efidev );
553}
#define EFIAPI
#define NULL
NULL pointer (VOID *)
Definition Base.h:322
#define VOID
Undeclared type.
Definition Base.h:272
u8 token
Definition CIB_PRM.h:14
EFI_MANAGED_NETWORK_SERVICE_BINDING_PROTOCOL as defined in UEFI 2.0.
struct _EFI_MANAGED_NETWORK_PROTOCOL EFI_MANAGED_NETWORK_PROTOCOL
#define EFI_NOT_STARTED
Enumeration of EFI_STATUS.
RETURN_STATUS EFI_STATUS
Function return status for EFI API.
GUID EFI_GUID
128-bit buffer containing a unique identifier value.
#define TPL_NOTIFY
Definition UefiSpec.h:650
#define EVT_NOTIFY_SIGNAL
Definition UefiSpec.h:454
struct arbelprm_rc_send_wqe rc
Definition arbel.h:3
#define assert(condition)
Assert a condition at run-time.
Definition assert.h:50
void cachedhcp_recycle(struct net_device *netdev)
Recycle cached DHCPACK.
Definition cachedhcp.c:355
Cached DHCP packet.
ring len
Length.
Definition dwmac.h:226
const char * efi_handle_name(EFI_HANDLE handle)
Get name of an EFI handle.
Definition efi_debug.c:652
void efidev_free(struct efi_device *efidev)
Free EFI device.
Definition efi_driver.c:92
struct efi_device * efidev_alloc(EFI_HANDLE device)
Allocate new EFI device.
Definition efi_driver.c:57
EFI driver interface.
static void * efidev_get_drvdata(struct efi_device *efidev)
Get EFI driver-private data.
Definition efi_driver.h:98
static void efidev_set_drvdata(struct efi_device *efidev, void *priv)
Set EFI driver-private data.
Definition efi_driver.h:87
EFI_GUID efi_managed_network_service_binding_protocol_guid
Managed network service binding protocol GUID.
Definition efi_guid.c:285
EFI_GUID efi_managed_network_protocol_guid
Managed network protocol GUID.
Definition efi_guid.c:281
int efi_shutdown_in_progress
EFI shutdown is in progress.
Definition efi_init.c:60
void efi_close_by_driver(EFI_HANDLE handle, EFI_GUID *protocol)
Close protocol opened for persistent use by a driver.
Definition efi_open.c:279
int efi_service_add(EFI_HANDLE service, EFI_GUID *binding, EFI_HANDLE *handle)
Add service to child handle.
Definition efi_service.c:47
int efi_service_del(EFI_HANDLE service, EFI_GUID *binding, EFI_HANDLE handle)
Remove service from child handle.
Definition efi_service.c:84
EFI service binding.
void efi_device_info(EFI_HANDLE device, const char *prefix, struct device *dev)
Get underlying device information.
Definition efi_utils.c:189
EFI utilities.
uint16_t mode
Acceleration mode.
Definition ena.h:15
Error codes.
struct net_device * alloc_etherdev(size_t priv_size)
Allocate Ethernet device.
Definition ethernet.c:265
Ethernet protocol.
static struct net_device * netdev
Definition gdbudp.c:53
#define __unused
Declare a variable or data structure as unused.
Definition compiler.h:573
#define DBGC(...)
Definition compiler.h:505
#define FILE_LICENCE(_licence)
Declare a particular licence as applying to a file.
Definition compiler.h:896
#define ENOMEM
Not enough space.
Definition errno.h:535
#define ENOTSUP
Operation not supported.
Definition errno.h:590
#define ECANCELED
Operation canceled.
Definition errno.h:344
#define FILE_SECBOOT(_status)
Declare a file's UEFI Secure Boot permission status.
Definition compiler.h:926
EFI API.
#define efi_open_by_driver(handle, protocol, interface)
Open protocol for persistent use by a driver.
Definition efi.h:474
#define EFI_HANDLE
Definition efi.h:53
#define EEFI(efirc)
Convert an EFI status code to an iPXE status code.
Definition efi.h:175
#define EFI_EVENT
Definition efi.h:54
EFI_SYSTEM_TABLE * efi_systab
uint16_t handle
Handle.
Definition smbios.h:5
String functions.
void * memcpy(void *dest, const void *src, size_t len) __nonnull
struct io_buffer * alloc_iob(size_t len)
Allocate I/O buffer.
Definition iobuf.c:131
I/O buffers.
#define iob_put(iobuf, len)
Definition iobuf.h:125
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition iobuf.h:160
#define list_del(list)
Delete an entry from a list.
Definition list.h:120
#define INIT_LIST_HEAD(list)
Initialise a list head.
Definition list.h:46
#define list_add(new, head)
Add a new entry to the head of a list.
Definition list.h:70
static int mnpnet_open(struct net_device *netdev)
Open network device.
Definition mnpnet.c:272
static void mnpnet_close(struct net_device *netdev)
Close network device.
Definition mnpnet.c:333
static void mnpnet_poll_rx(struct net_device *netdev)
Poll for received packets.
Definition mnpnet.c:203
static VOID EFIAPI mnpnet_event(EFI_EVENT event __unused, VOID *context)
Transmit or receive token event.
Definition mnpnet.c:80
static void mnpnet_refill_rx(struct net_device *netdev)
Refill receive token.
Definition mnpnet.c:146
static struct net_device_operations mnpnet_operations
MNP network device operations.
Definition mnpnet.c:357
void mnptemp_destroy(struct net_device *netdev)
Destroy temporary MNP network device.
Definition mnpnet.c:541
static int mnpnet_transmit(struct net_device *netdev, struct io_buffer *iobuf)
Transmit packet.
Definition mnpnet.c:97
static void mnpnet_poll_tx(struct net_device *netdev)
Poll for completed packets.
Definition mnpnet.c:174
static void mnpnet_poll(struct net_device *netdev)
Poll for completed packets.
Definition mnpnet.c:246
int mnpnet_start(struct efi_device *efidev)
Attach driver to device.
Definition mnpnet.c:370
int mnptemp_create(EFI_HANDLE handle, struct net_device **netdev)
Create temporary MNP network device.
Definition mnpnet.c:504
void mnpnet_stop(struct efi_device *efidev)
Detach driver from device.
Definition mnpnet.c:475
MNP NIC driver.
void netdev_rx(struct net_device *netdev, struct io_buffer *iobuf)
Add packet to receive queue.
Definition netdevice.c:549
void unregister_netdev(struct net_device *netdev)
Unregister network device.
Definition netdevice.c:942
void netdev_tx_defer(struct net_device *netdev, struct io_buffer *iobuf)
Defer transmitted packet.
Definition netdevice.c:413
void netdev_tx_complete_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Complete network transmission.
Definition netdevice.c:471
void netdev_rx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard received packet.
Definition netdevice.c:587
int register_netdev(struct net_device *netdev)
Register network device.
Definition netdevice.c:760
Network device management.
static void netdev_link_up(struct net_device *netdev)
Mark network device as having link up.
Definition netdevice.h:789
static void netdev_init(struct net_device *netdev, struct net_device_operations *op)
Initialise a network device.
Definition netdevice.h:519
static void netdev_nullify(struct net_device *netdev)
Stop using a network device.
Definition netdevice.h:532
static void netdev_put(struct net_device *netdev)
Drop reference to network device.
Definition netdevice.h:576
char * strerror(int errno)
Retrieve string representation of error number.
Definition strerror.c:79
EFI Boot Services Table.
Definition UefiSpec.h:1931
EFI_CREATE_EVENT CreateEvent
Definition UefiSpec.h:1955
EFI_CLOSE_EVENT CloseEvent
Definition UefiSpec.h:1959
EFI_SIGNAL_EVENT SignalEvent
Definition UefiSpec.h:1958
EFI_MANAGED_NETWORK_RECEIVE_DATA * RxData
When this token is used for receiving, RxData is a pointer to the EFI_MANAGED_NETWORK_RECEIVE_DATA.
EFI_MANAGED_NETWORK_TRANSMIT_DATA * TxData
When this token is used for transmitting, TxData is a pointer to the EFI_MANAGED_NETWORK_TRANSMIT_DAT...
EFI_STATUS Status
The status that is returned to the caller at the end of the operation to indicate whether this operat...
union EFI_MANAGED_NETWORK_COMPLETION_TOKEN::@042067137253241214333163157372021340144013346150 Packet
EFI_MANAGED_NETWORK_FRAGMENT_DATA FragmentTable[1]
EFI_MANAGED_NETWORK_POLL Poll
EFI_MANAGED_NETWORK_RECEIVE Receive
EFI_MANAGED_NETWORK_CONFIGURE Configure
EFI_MANAGED_NETWORK_GET_MODE_DATA GetModeData
EFI_MANAGED_NETWORK_TRANSMIT Transmit
A hardware device.
Definition device.h:77
struct list_head children
Devices attached to this device.
Definition device.h:87
An EFI device.
Definition efi_driver.h:18
EFI_HANDLE device
EFI device handle.
Definition efi_driver.h:22
struct device dev
Generic device.
Definition efi_driver.h:20
EFI_HANDLE child
EFI child device handle (if present)
Definition efi_driver.h:24
A persistent I/O buffer.
Definition iobuf.h:38
void * data
Start of data.
Definition iobuf.h:53
A link-layer protocol.
Definition netdevice.h:115
uint8_t ll_header_len
Link-layer header length.
Definition netdevice.h:201
An MNP NIC.
Definition mnpnet.c:55
EFI_MANAGED_NETWORK_PROTOCOL * mnp
Managed network protocol.
Definition mnpnet.c:59
struct efi_device * efidev
EFI device.
Definition mnpnet.c:57
struct mnp_token rx
Receive token.
Definition mnpnet.c:71
struct mnp_token tx
Transmit token.
Definition mnpnet.c:64
struct io_buffer * txbuf
Transmit I/O buffer.
Definition mnpnet.c:68
EFI_MANAGED_NETWORK_TRANSMIT_DATA txdata
Transmit descriptor.
Definition mnpnet.c:66
struct device dev
Generic device.
Definition mnpnet.c:61
An MNP transmit or receive token.
Definition mnpnet.c:47
int busy
Token is owned by MNP.
Definition mnpnet.c:51
EFI_MANAGED_NETWORK_COMPLETION_TOKEN token
MNP completion token.
Definition mnpnet.c:49
Network device operations.
Definition netdevice.h:214
A network device.
Definition netdevice.h:353
#define TRUE
Definition tlan.h:46