iPXE
Functions
mnpnet.h File Reference

MNP NIC driver. More...

Go to the source code of this file.

Functions

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

Detailed Description

MNP NIC driver.

Definition in file mnpnet.h.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ mnpnet_start()

int mnpnet_start ( struct efi_device efidev)

Attach driver to device.

Parameters
efidevEFI device
Return values
rcReturn status code

Definition at line 369 of file mnpnet.c.

369  {
371  EFI_HANDLE device = efidev->device;
374  union {
376  void *interface;
377  } u;
378  struct net_device *netdev;
379  struct mnp_nic *mnp;
380  EFI_STATUS efirc;
381  int rc;
382 
383  /* Allocate and initalise structure */
384  netdev = alloc_etherdev ( sizeof ( *mnp ) );
385  if ( ! netdev ) {
386  rc = -ENOMEM;
387  goto err_alloc;
388  }
390  mnp = netdev->priv;
391  mnp->efidev = efidev;
393 
394  /* Populate underlying device information */
395  efi_device_info ( device, "MNP", &mnp->dev );
396  mnp->dev.driver_name = "MNP";
397  mnp->dev.parent = &efidev->dev;
398  list_add ( &mnp->dev.siblings, &efidev->dev.children );
399  INIT_LIST_HEAD ( &mnp->dev.children );
400  netdev->dev = &mnp->dev;
401 
402  /* Create MNP child */
403  if ( ( rc = efi_service_add ( device, binding,
404  &efidev->child ) ) != 0 ) {
405  DBGC ( mnp, "MNP %s could not create child: %s\n",
406  efi_handle_name ( device ), strerror ( rc ) );
407  goto err_service;
408  }
409 
410  /* Open MNP protocol */
411  if ( ( efirc = bs->OpenProtocol ( efidev->child,
413  &u.interface, efi_image_handle,
414  efidev->child,
417  rc = -EEFI ( efirc );
418  DBGC ( mnp, "MNP %s could not open MNP protocol: %s\n",
419  efi_handle_name ( device ), strerror ( rc ) );
420  goto err_open;
421  }
422  mnp->mnp = u.mnp;
423 
424  /* Get configuration */
425  efirc = mnp->mnp->GetModeData ( mnp->mnp, NULL, &mode );
426  if ( ( efirc != 0 ) && ( efirc != EFI_NOT_STARTED ) ) {
427  rc = -EEFI ( efirc );
428  DBGC ( mnp, "MNP %s could not get mode data: %s\n",
429  efi_handle_name ( device ), strerror ( rc ) );
430  goto err_mode;
431  }
432 
433  /* Populate network device parameters */
434  if ( mode.HwAddressSize != netdev->ll_protocol->hw_addr_len ) {
435  DBGC ( device, "MNP %s has invalid hardware address length "
436  "%d\n", efi_handle_name ( device ), mode.HwAddressSize );
437  rc = -ENOTSUP;
438  goto err_hw_addr_len;
439  }
442  if ( mode.HwAddressSize != netdev->ll_protocol->ll_addr_len ) {
443  DBGC ( device, "MNP %s has invalid link-layer address length "
444  "%d\n", efi_handle_name ( device ), mode.HwAddressSize );
445  rc = -ENOTSUP;
446  goto err_ll_addr_len;
447  }
450 
451  /* Register network device */
452  if ( ( rc = register_netdev ( netdev ) ) != 0 )
453  goto err_register;
454  DBGC ( mnp, "MNP %s registered as %s\n",
456 
457  /* Mark as link up: we don't handle link state */
459 
460  return 0;
461 
463  err_register:
464  err_ll_addr_len:
465  err_hw_addr_len:
466  err_mode:
469  err_open:
470  efi_service_del ( device, binding, efidev->child );
471  err_service:
472  list_del ( &mnp->dev.siblings );
474  netdev_put ( netdev );
475  err_alloc:
476  return rc;
477 }
EFI_BOOT_SERVICES * BootServices
A pointer to the EFI Boot Services Table.
Definition: UefiSpec.h:2081
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define EEFI(efirc)
Convert an EFI status code to an iPXE status code.
Definition: efi.h:171
uint8_t ll_addr_len
Link-layer address length.
Definition: netdevice.h:198
The MNP is used by network applications (and drivers) to perform raw (unformatted) asynchronous netwo...
#define list_add(new, head)
Add a new entry to the head of a list.
Definition: list.h:69
128 bit buffer containing a unique identifier value.
Definition: Base.h:215
int efi_service_del(EFI_HANDLE service, EFI_GUID *binding, EFI_HANDLE handle)
Remove service from child handle.
Definition: efi_service.c:96
#define DBGC(...)
Definition: compiler.h:505
#define EFI_OPEN_PROTOCOL_BY_DRIVER
Definition: UefiSpec.h:1347
#define EFI_OPEN_PROTOCOL_EXCLUSIVE
Definition: UefiSpec.h:1348
EFI_HANDLE device
EFI device handle.
Definition: efi_driver.h:21
EFI_GUID efi_managed_network_service_binding_protocol_guid
Managed network service binding protocol GUID.
Definition: efi_guid.c:255
EFI_CLOSE_PROTOCOL CloseProtocol
Definition: UefiSpec.h:1987
EFI_MANAGED_NETWORK_PROTOCOL * mnp
Managed network protocol.
Definition: mnpnet.c:58
EFI_MAC_ADDRESS CurrentAddress
The current HW MAC address for the network interface.
An MNP NIC.
Definition: mnpnet.c:54
#define ENOTSUP
Operation not supported.
Definition: errno.h:589
static void netdev_init(struct net_device *netdev, struct net_device_operations *op)
Initialise a network device.
Definition: netdevice.h:515
#define list_del(list)
Delete an entry from a list.
Definition: list.h:119
EFI_HANDLE child
EFI child device handle (if present)
Definition: efi_driver.h:23
#define ENOMEM
Not enough space.
Definition: errno.h:534
A hardware device.
Definition: device.h:73
void * memcpy(void *dest, const void *src, size_t len) __nonnull
static void netdev_put(struct net_device *netdev)
Drop reference to network device.
Definition: netdevice.h:572
An object interface.
Definition: interface.h:124
uint8_t hw_addr_len
Hardware address length.
Definition: netdevice.h:196
void * priv
Driver private data.
Definition: netdevice.h:431
static void netdev_link_up(struct net_device *netdev)
Mark network device as having link up.
Definition: netdevice.h:774
static struct net_device * netdev
Definition: gdbudp.c:52
void unregister_netdev(struct net_device *netdev)
Unregister network device.
Definition: netdevice.c:941
#define EFI_NOT_STARTED
Enumeration of EFI_STATUS.
Definition: UefiBaseType.h:133
const char * efi_handle_name(EFI_HANDLE handle)
Get name of an EFI handle.
Definition: efi_debug.c:808
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
EFI Boot Services Table.
Definition: UefiSpec.h:1917
EFI_HANDLE efi_image_handle
Image handle passed to entry point.
Definition: efi_init.c:34
int register_netdev(struct net_device *netdev)
Register network device.
Definition: netdevice.c:759
A network device.
Definition: netdevice.h:352
static void netdev_nullify(struct net_device *netdev)
Stop using a network device.
Definition: netdevice.h:528
EFI_DRIVER_BINDING_PROTOCOL * binding
Driving binding protocol.
Definition: efi_veto.c:65
int efi_service_add(EFI_HANDLE service, EFI_GUID *binding, EFI_HANDLE *handle)
Add service to child handle.
Definition: efi_service.c:46
struct device * dev
Underlying hardware device.
Definition: netdevice.h:364
#define INIT_LIST_HEAD(list)
Initialise a list head.
Definition: list.h:45
static struct net_device_operations mnpnet_operations
MNP network device operations.
Definition: mnpnet.c:356
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:362
UINT32 HwAddressSize
The size, in bytes, of the network interface's HW address.
RETURN_STATUS EFI_STATUS
Function return status for EFI API.
Definition: UefiBaseType.h:31
struct list_head children
Devices attached to this device.
Definition: device.h:83
struct net_device * alloc_etherdev(size_t priv_size)
Allocate Ethernet device.
Definition: ethernet.c:264
union @17 u
EFI_SYSTEM_TABLE * efi_systab
EFI_OPEN_PROTOCOL OpenProtocol
Definition: UefiSpec.h:1986
EFI_MANAGED_NETWORK_GET_MODE_DATA GetModeData
uint8_t ll_addr[MAX_LL_ADDR_LEN]
Link-layer address.
Definition: netdevice.h:387
static void efidev_set_drvdata(struct efi_device *efidev, void *priv)
Set EFI driver-private data.
Definition: efi_driver.h:74
struct device dev
Generic device.
Definition: efi_driver.h:19
struct efi_device * efidev
EFI device.
Definition: mnpnet.c:56
uint8_t hw_addr[MAX_HW_ADDR_LEN]
Hardware address.
Definition: netdevice.h:381
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
Definition: efi.h:59
struct ll_protocol * ll_protocol
Link-layer protocol.
Definition: netdevice.h:372
void efi_device_info(EFI_HANDLE device, const char *prefix, struct device *dev)
Get underlying device information.
Definition: efi_utils.c:209
EFI_MAC_ADDRESS PermanentAddress
The permanent HW MAC address for the network interface.
EFI_GUID efi_managed_network_protocol_guid
Managed network protocol GUID.
Definition: efi_guid.c:251

References alloc_etherdev(), EFI_SYSTEM_TABLE::BootServices, efi_device::child, device::children, EFI_BOOT_SERVICES::CloseProtocol, EFI_SIMPLE_NETWORK_MODE::CurrentAddress, DBGC, efi_device::dev, net_device::dev, efi_device::device, EEFI, efi_device_info(), efi_handle_name(), efi_image_handle, efi_managed_network_protocol_guid, efi_managed_network_service_binding_protocol_guid, EFI_NOT_STARTED, EFI_OPEN_PROTOCOL_BY_DRIVER, EFI_OPEN_PROTOCOL_EXCLUSIVE, efi_service_add(), efi_service_del(), efi_systab, mnp_nic::efidev, efidev_set_drvdata(), ENOMEM, ENOTSUP, _EFI_MANAGED_NETWORK_PROTOCOL::GetModeData, net_device::hw_addr, ll_protocol::hw_addr_len, EFI_SIMPLE_NETWORK_MODE::HwAddressSize, INIT_LIST_HEAD, list_add, list_del, net_device::ll_addr, ll_protocol::ll_addr_len, net_device::ll_protocol, memcpy(), mnp_nic::mnp, mnpnet_operations, net_device::name, netdev, netdev_init(), netdev_link_up(), netdev_nullify(), netdev_put(), NULL, EFI_BOOT_SERVICES::OpenProtocol, EFI_SIMPLE_NETWORK_MODE::PermanentAddress, net_device::priv, rc, register_netdev(), strerror(), u, and unregister_netdev().

Referenced by mnptemp_create().

◆ mnpnet_stop()

void mnpnet_stop ( struct efi_device efidev)

Detach driver from device.

Parameters
efidevEFI device

Definition at line 484 of file mnpnet.c.

484  {
487  struct net_device *netdev = efidev_get_drvdata ( efidev );
488  struct mnp_nic *mnp = netdev->priv;
489 
490  /* Unregister network device */
492 
493  /* Close MNP protocol */
496 
497  /* Remove MNP child (unless whole system shutdown is in progress) */
498  if ( ! efi_shutdown_in_progress )
499  efi_service_del ( efidev->device, binding, efidev->child );
500 
501  /* Free network device */
502  list_del ( &mnp->dev.siblings );
504  netdev_put ( netdev );
505 }
EFI_BOOT_SERVICES * BootServices
A pointer to the EFI Boot Services Table.
Definition: UefiSpec.h:2081
128 bit buffer containing a unique identifier value.
Definition: Base.h:215
int efi_service_del(EFI_HANDLE service, EFI_GUID *binding, EFI_HANDLE handle)
Remove service from child handle.
Definition: efi_service.c:96
EFI_HANDLE device
EFI device handle.
Definition: efi_driver.h:21
EFI_GUID efi_managed_network_service_binding_protocol_guid
Managed network service binding protocol GUID.
Definition: efi_guid.c:255
EFI_CLOSE_PROTOCOL CloseProtocol
Definition: UefiSpec.h:1987
EFI_MANAGED_NETWORK_PROTOCOL * mnp
Managed network protocol.
Definition: mnpnet.c:58
An MNP NIC.
Definition: mnpnet.c:54
#define list_del(list)
Delete an entry from a list.
Definition: list.h:119
EFI_HANDLE child
EFI child device handle (if present)
Definition: efi_driver.h:23
static void netdev_put(struct net_device *netdev)
Drop reference to network device.
Definition: netdevice.h:572
void * priv
Driver private data.
Definition: netdevice.h:431
static struct net_device * netdev
Definition: gdbudp.c:52
void unregister_netdev(struct net_device *netdev)
Unregister network device.
Definition: netdevice.c:941
EFI Boot Services Table.
Definition: UefiSpec.h:1917
EFI_HANDLE efi_image_handle
Image handle passed to entry point.
Definition: efi_init.c:34
static void * efidev_get_drvdata(struct efi_device *efidev)
Get EFI driver-private data.
Definition: efi_driver.h:85
A network device.
Definition: netdevice.h:352
static void netdev_nullify(struct net_device *netdev)
Stop using a network device.
Definition: netdevice.h:528
EFI_SYSTEM_TABLE * efi_systab
struct efi_device * efidev
EFI device.
Definition: mnpnet.c:56
int efi_shutdown_in_progress
EFI shutdown is in progress.
Definition: efi_init.c:58
EFI_GUID efi_managed_network_protocol_guid
Managed network protocol GUID.
Definition: efi_guid.c:251

References EFI_SYSTEM_TABLE::BootServices, efi_device::child, EFI_BOOT_SERVICES::CloseProtocol, efi_device::device, efi_image_handle, efi_managed_network_protocol_guid, efi_managed_network_service_binding_protocol_guid, efi_service_del(), efi_shutdown_in_progress, efi_systab, mnp_nic::efidev, efidev_get_drvdata(), list_del, mnp_nic::mnp, netdev, netdev_nullify(), netdev_put(), net_device::priv, and unregister_netdev().

Referenced by mnptemp_create(), and mnptemp_destroy().

◆ mnptemp_create()

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

Create temporary MNP network device.

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

Definition at line 514 of file mnpnet.c.

514  {
515  struct efi_device *efidev;
516  int rc;
517 
518  /* Create temporary EFI device */
519  efidev = efidev_alloc ( handle );
520  if ( ! efidev ) {
521  DBGC ( handle, "MNP %s could not create temporary device\n",
522  efi_handle_name ( handle ) );
523  rc = -ENOMEM;
524  goto err_alloc;
525  }
526 
527  /* Start temporary network device */
528  if ( ( rc = mnpnet_start ( efidev ) ) != 0 ) {
529  DBGC ( handle, "MNP %s could not start MNP: %s\n",
530  efi_handle_name ( handle ), strerror ( rc ) );
531  goto err_start;
532  }
533 
534  /* Fill in network device */
535  *netdev = efidev_get_drvdata ( efidev );
536 
537  return 0;
538 
539  mnpnet_stop ( efidev );
540  err_start:
541  efidev_free ( efidev );
542  err_alloc:
543  return rc;
544 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
void efidev_free(struct efi_device *efidev)
Free EFI device.
Definition: efi_driver.c:118
#define DBGC(...)
Definition: compiler.h:505
#define ENOMEM
Not enough space.
Definition: errno.h:534
static struct net_device * netdev
Definition: gdbudp.c:52
struct efi_device * efidev_alloc(EFI_HANDLE device)
Allocate new EFI device.
Definition: efi_driver.c:70
const char * efi_handle_name(EFI_HANDLE handle)
Get name of an EFI handle.
Definition: efi_debug.c:808
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
static void * efidev_get_drvdata(struct efi_device *efidev)
Get EFI driver-private data.
Definition: efi_driver.h:85
An EFI device.
Definition: efi_driver.h:17
void mnpnet_stop(struct efi_device *efidev)
Detach driver from device.
Definition: mnpnet.c:484
uint16_t handle
Handle.
Definition: smbios.h:16
int mnpnet_start(struct efi_device *efidev)
Attach driver to device.
Definition: mnpnet.c:369

References DBGC, 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)

Destroy temporary MNP network device.

Parameters
netdevNetwork device

Definition at line 551 of file mnpnet.c.

551  {
552  struct mnp_nic *mnp = netdev->priv;
553  struct efi_device *efidev = mnp->efidev;
554 
555  /* Recycle any cached DHCP packet */
557 
558  /* Stop temporary network device */
559  mnpnet_stop ( efidev );
560 
561  /* Free temporary EFI device */
562  efidev_free ( efidev );
563 }
void efidev_free(struct efi_device *efidev)
Free EFI device.
Definition: efi_driver.c:118
EFI_MANAGED_NETWORK_PROTOCOL * mnp
Managed network protocol.
Definition: mnpnet.c:58
An MNP NIC.
Definition: mnpnet.c:54
void cachedhcp_recycle(struct net_device *netdev)
Recycle cached DHCPACK.
Definition: cachedhcp.c:352
void * priv
Driver private data.
Definition: netdevice.h:431
static struct net_device * netdev
Definition: gdbudp.c:52
An EFI device.
Definition: efi_driver.h:17
void mnpnet_stop(struct efi_device *efidev)
Detach driver from device.
Definition: mnpnet.c:484
struct efi_device * efidev
EFI device.
Definition: mnpnet.c:56

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

Referenced by efi_autoexec_network().