iPXE
mnpnet.h File Reference

MNP NIC driver. More...

Go to the source code of this file.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 FILE_SECBOOT (PERMITTED)
int mnpnet_start (struct efi_device *efidev)
 Attach driver to device.
void mnpnet_stop (struct efi_device *efidev)
 Detach driver from device.
int mnptemp_create (EFI_HANDLE handle, struct net_device **netdev)
 Create temporary MNP network device.
void mnptemp_destroy (struct net_device *netdev)
 Destroy temporary MNP network device.

Detailed Description

MNP NIC driver.

Definition in file mnpnet.h.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )

◆ FILE_SECBOOT()

FILE_SECBOOT ( PERMITTED )

References EFI_HANDLE, handle, and netdev.

◆ mnpnet_start()

int mnpnet_start ( struct efi_device * efidev)
extern

Attach driver to device.

Parameters
efidevEFI device
Return values
rcReturn status code

Definition at line 370 of file mnpnet.c.

370 {
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}
#define NULL
NULL pointer (VOID *)
Definition Base.h:322
#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.
struct arbelprm_rc_send_wqe rc
Definition arbel.h:3
const char * efi_handle_name(EFI_HANDLE handle)
Get name of an EFI handle.
Definition efi_debug.c:652
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
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
void efi_device_info(EFI_HANDLE device, const char *prefix, struct device *dev)
Get underlying device information.
Definition efi_utils.c:189
uint16_t mode
Acceleration mode.
Definition ena.h:15
struct net_device * alloc_etherdev(size_t priv_size)
Allocate Ethernet device.
Definition ethernet.c:265
static struct net_device * netdev
Definition gdbudp.c:53
#define DBGC(...)
Definition compiler.h:505
#define ENOMEM
Not enough space.
Definition errno.h:535
#define ENOTSUP
Operation not supported.
Definition errno.h:590
#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
void * memcpy(void *dest, const void *src, size_t len) __nonnull
#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 struct net_device_operations mnpnet_operations
MNP network device operations.
Definition mnpnet.c:357
void unregister_netdev(struct net_device *netdev)
Unregister network device.
Definition netdevice.c:942
int register_netdev(struct net_device *netdev)
Register network device.
Definition netdevice.c:760
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_MANAGED_NETWORK_GET_MODE_DATA GetModeData
A hardware device.
Definition device.h:77
struct list_head children
Devices attached to this device.
Definition device.h:87
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
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
A network device.
Definition netdevice.h:353

References alloc_etherdev(), efi_device::child, device::children, DBGC, efi_device::dev, efi_device::device, EEFI, efi_close_by_driver(), efi_device_info(), EFI_HANDLE, efi_handle_name(), efi_managed_network_protocol_guid, efi_managed_network_service_binding_protocol_guid, EFI_NOT_STARTED, efi_open_by_driver, efi_service_add(), efi_service_del(), mnp_nic::efidev, efidev_set_drvdata(), ENOMEM, ENOTSUP, _EFI_MANAGED_NETWORK_PROTOCOL::GetModeData, INIT_LIST_HEAD, list_add, list_del, memcpy(), mnp_nic::mnp, mnpnet_operations, mode, netdev, netdev_init(), netdev_link_up(), netdev_nullify(), netdev_put(), NULL, rc, register_netdev(), strerror(), and unregister_netdev().

Referenced by __efi_driver(), and mnptemp_create().

◆ mnpnet_stop()

void mnpnet_stop ( struct efi_device * efidev)
extern

Detach driver from device.

Parameters
efidevEFI device

Definition at line 475 of file mnpnet.c.

475 {
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}
static void * efidev_get_drvdata(struct efi_device *efidev)
Get EFI driver-private data.
Definition efi_driver.h:98
int efi_shutdown_in_progress
EFI shutdown is in progress.
Definition efi_init.c:60

References efi_device::child, efi_device::device, efi_close_by_driver(), efi_managed_network_protocol_guid, efi_managed_network_service_binding_protocol_guid, efi_service_del(), efi_shutdown_in_progress, mnp_nic::efidev, efidev_get_drvdata(), list_del, mnp_nic::mnp, netdev, netdev_nullify(), netdev_put(), and unregister_netdev().

Referenced by __efi_driver(), mnptemp_create(), and mnptemp_destroy().

◆ mnptemp_create()

int mnptemp_create ( EFI_HANDLE handle,
struct net_device ** netdev )
extern

Create temporary MNP network device.

Parameters
handleMNP service binding handle
netdevNetwork device to fill in
Return values
rcReturn status code

Definition at line 504 of file mnpnet.c.

504 {
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}
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
uint16_t handle
Handle.
Definition smbios.h:5
int mnpnet_start(struct efi_device *efidev)
Attach driver to device.
Definition mnpnet.c:370
void mnpnet_stop(struct efi_device *efidev)
Detach driver from device.
Definition mnpnet.c:475
An EFI device.
Definition efi_driver.h:18

References DBGC, EFI_HANDLE, efi_handle_name(), efidev_alloc(), efidev_free(), efidev_get_drvdata(), ENOMEM, handle, mnpnet_start(), mnpnet_stop(), netdev, rc, and strerror().

Referenced by efi_autoexec_network().

◆ mnptemp_destroy()

void mnptemp_destroy ( struct net_device * netdev)
extern

Destroy temporary MNP network device.

Parameters
netdevNetwork device

Definition at line 541 of file mnpnet.c.

541 {
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}
void cachedhcp_recycle(struct net_device *netdev)
Recycle cached DHCPACK.
Definition cachedhcp.c:355

References cachedhcp_recycle(), mnp_nic::efidev, efidev_free(), mnp_nic::mnp, mnpnet_stop(), and netdev.

Referenced by efi_autoexec_network().