iPXE
Data Structures | Macros | Functions | Variables
snpnet.c File Reference

SNP NIC driver. More...

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <ipxe/iobuf.h>
#include <ipxe/netdevice.h>
#include <ipxe/ethernet.h>
#include <ipxe/vsprintf.h>
#include <ipxe/timer.h>
#include <ipxe/efi/efi.h>
#include <ipxe/efi/Protocol/SimpleNetwork.h>
#include <ipxe/efi/efi_driver.h>
#include <ipxe/efi/efi_utils.h>
#include "snpnet.h"

Go to the source code of this file.

Data Structures

struct  snp_nic
 An SNP NIC. More...
 

Macros

#define SNP_RX_QUOTA   4
 Maximum number of received packets per poll. More...
 
#define SNP_INITIALIZE_RETRY_MAX   10
 Maximum initialisation retry count. More...
 
#define SNP_INITIALIZE_RETRY_DELAY_MS   10
 Delay between each initialisation retry. More...
 

Functions

 FILE_LICENCE (GPL2_OR_LATER)
 
static const char * snpnet_mac_text (EFI_MAC_ADDRESS *mac, size_t len)
 Format SNP MAC address (for debugging) More...
 
static void snpnet_dump_mode (struct net_device *netdev)
 Dump SNP mode information (for debugging) More...
 
static void snpnet_check_link (struct net_device *netdev)
 Check link state. More...
 
static int snpnet_transmit (struct net_device *netdev, struct io_buffer *iobuf)
 Transmit packet. More...
 
static void snpnet_poll_tx (struct net_device *netdev)
 Poll for completed packets. More...
 
static void snpnet_poll_rx (struct net_device *netdev)
 Poll for received packets. More...
 
static void snpnet_poll (struct net_device *netdev)
 Poll for completed packets. More...
 
static int snpnet_rx_filters (struct net_device *netdev)
 Set receive filters. More...
 
static int snpnet_open (struct net_device *netdev)
 Open network device. More...
 
static void snpnet_close (struct net_device *netdev)
 Close network device. More...
 
int snpnet_start (struct efi_device *efidev)
 Attach driver to device. More...
 
void snpnet_stop (struct efi_device *efidev)
 Detach driver from device. More...
 

Variables

static struct net_device_operations snpnet_operations
 SNP network device operations. More...
 

Detailed Description

SNP NIC driver.

Definition in file snpnet.c.

Macro Definition Documentation

◆ SNP_RX_QUOTA

#define SNP_RX_QUOTA   4

Maximum number of received packets per poll.

Definition at line 66 of file snpnet.c.

◆ SNP_INITIALIZE_RETRY_MAX

#define SNP_INITIALIZE_RETRY_MAX   10

Maximum initialisation retry count.

Definition at line 69 of file snpnet.c.

◆ SNP_INITIALIZE_RETRY_DELAY_MS

#define SNP_INITIALIZE_RETRY_DELAY_MS   10

Delay between each initialisation retry.

Definition at line 72 of file snpnet.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER  )

◆ snpnet_mac_text()

static const char* snpnet_mac_text ( EFI_MAC_ADDRESS mac,
size_t  len 
)
static

Format SNP MAC address (for debugging)

Parameters
macMAC address
lenLength of MAC address
Return values
textMAC address as text

Definition at line 81 of file snpnet.c.

81  {
82  static char buf[ sizeof ( *mac ) * 3 /* "xx:" or "xx\0" */ ];
83  size_t used = 0;
84  unsigned int i;
85 
86  for ( i = 0 ; i < len ; i++ ) {
87  used += ssnprintf ( &buf[used], ( sizeof ( buf ) - used ),
88  "%s%02x", ( used ? ":" : "" ),
89  mac->Addr[i] );
90  }
91  return buf;
92 }
uint8_t mac[ETH_ALEN]
MAC address.
Definition: ena.h:24
int ssnprintf(char *buf, ssize_t ssize, const char *fmt,...)
Version of vsnprintf() that accepts a signed buffer size.
Definition: vsprintf.c:420
uint32_t len
Length.
Definition: ena.h:14

References len, mac, and ssnprintf().

Referenced by snpnet_dump_mode().

◆ snpnet_dump_mode()

static void snpnet_dump_mode ( struct net_device netdev)
static

Dump SNP mode information (for debugging)

Parameters
netdevNetwork device

Definition at line 99 of file snpnet.c.

99  {
100  struct snp_nic *snp = netdev_priv ( netdev );
101  EFI_SIMPLE_NETWORK_MODE *mode = snp->snp->Mode;
102  size_t mac_len = mode->HwAddressSize;
103  unsigned int i;
104 
105  /* Do nothing unless debugging is enabled */
106  if ( ! DBG_EXTRA )
107  return;
108 
109  DBGC2 ( snp, "SNP %s st %d type %d hdr %d pkt %d rxflt %#x/%#x%s "
110  "nvram %d acc %d mcast %d/%d\n", netdev->name, mode->State,
111  mode->IfType, mode->MediaHeaderSize, mode->MaxPacketSize,
113  ( mode->MultipleTxSupported ? " multitx" : "" ),
114  mode->NvRamSize, mode->NvRamAccessSize,
115  mode->MCastFilterCount, mode->MaxMCastFilterCount );
116  DBGC2 ( snp, "SNP %s hw %s", netdev->name,
117  snpnet_mac_text ( &mode->PermanentAddress, mac_len ) );
118  DBGC2 ( snp, " addr %s%s",
119  snpnet_mac_text ( &mode->CurrentAddress, mac_len ),
120  ( mode->MacAddressChangeable ? "" : "(f)" ) );
121  DBGC2 ( snp, " bcast %s\n",
122  snpnet_mac_text ( &mode->BroadcastAddress, mac_len ) );
123  for ( i = 0 ; i < mode->MCastFilterCount ; i++ ) {
124  DBGC2 ( snp, "SNP %s mcast %s\n", netdev->name,
125  snpnet_mac_text ( &mode->MCastFilter[i], mac_len ) );
126  }
127  DBGC2 ( snp, "SNP %s media %s\n", netdev->name,
128  ( mode->MediaPresentSupported ?
129  ( mode->MediaPresent ? "present" : "not present" ) :
130  "presence not supported" ) );
131 }
static void * netdev_priv(struct net_device *netdev)
Get driver private area for this network device.
Definition: netdevice.h:578
UINT32 NvRamSize
The size, in bytes, of the NVRAM device attached to the network interface.
UINT32 MediaHeaderSize
The size, in bytes, of the network interface's media header.
BOOLEAN MediaPresent
TRUE if media are connected to the network interface; otherwise FALSE.
EFI_SIMPLE_NETWORK_PROTOCOL * snp
Simple network protocol.
Definition: snpnet.c:48
BOOLEAN MediaPresentSupported
TRUE if the presence of media can be determined; otherwise FALSE.
UINT32 State
Reports the current state of the network interface.
EFI_MAC_ADDRESS CurrentAddress
The current HW MAC address for the network interface.
EFI_SIMPLE_NETWORK_MODE * Mode
Pointer to the EFI_SIMPLE_NETWORK_MODE data for the device.
EFI_MAC_ADDRESS MCastFilter[MAX_MCAST_FILTER_CNT]
Array containing the addresses of the current multicast address receive filters.
EFI_MAC_ADDRESS BroadcastAddress
The current HW MAC address for broadcast packets.
static const char * snpnet_mac_text(EFI_MAC_ADDRESS *mac, size_t len)
Format SNP MAC address (for debugging)
Definition: snpnet.c:81
BOOLEAN MultipleTxSupported
TRUE if the network interface can transmit more than one packet at a time.
UINT8 IfType
The interface type of the network interface.
UINT32 MaxPacketSize
The maximum size, in bytes, of the packets supported by the network interface.
UINT32 ReceiveFilterSetting
The current multicast receive filter settings.
UINT32 MCastFilterCount
The current number of multicast address receive filters.
static struct net_device * netdev
Definition: gdbudp.c:52
BOOLEAN MacAddressChangeable
TRUE if the HW MAC address can be changed.
An SNP NIC.
Definition: snpnet.c:44
UINT32 NvRamAccessSize
The size that must be used for all NVRAM reads and writes.
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:362
#define DBGC2(...)
Definition: compiler.h:522
UINT32 HwAddressSize
The size, in bytes, of the network interface's HW address.
UINT32 MaxMCastFilterCount
The maximum number of multicast address receive filters supported by the driver.
UINT32 ReceiveFilterMask
The multicast receive filter settings supported by the network interface.
#define DBG_EXTRA
Definition: compiler.h:319
EFI_MAC_ADDRESS PermanentAddress
The permanent HW MAC address for the network interface.

References EFI_SIMPLE_NETWORK_MODE::BroadcastAddress, EFI_SIMPLE_NETWORK_MODE::CurrentAddress, DBG_EXTRA, DBGC2, EFI_SIMPLE_NETWORK_MODE::HwAddressSize, EFI_SIMPLE_NETWORK_MODE::IfType, EFI_SIMPLE_NETWORK_MODE::MacAddressChangeable, EFI_SIMPLE_NETWORK_MODE::MaxMCastFilterCount, EFI_SIMPLE_NETWORK_MODE::MaxPacketSize, EFI_SIMPLE_NETWORK_MODE::MCastFilter, EFI_SIMPLE_NETWORK_MODE::MCastFilterCount, EFI_SIMPLE_NETWORK_MODE::MediaHeaderSize, EFI_SIMPLE_NETWORK_MODE::MediaPresent, EFI_SIMPLE_NETWORK_MODE::MediaPresentSupported, _EFI_SIMPLE_NETWORK_PROTOCOL::Mode, EFI_SIMPLE_NETWORK_MODE::MultipleTxSupported, net_device::name, netdev, netdev_priv(), EFI_SIMPLE_NETWORK_MODE::NvRamAccessSize, EFI_SIMPLE_NETWORK_MODE::NvRamSize, EFI_SIMPLE_NETWORK_MODE::PermanentAddress, EFI_SIMPLE_NETWORK_MODE::ReceiveFilterMask, EFI_SIMPLE_NETWORK_MODE::ReceiveFilterSetting, snp_nic::snp, snpnet_mac_text(), and EFI_SIMPLE_NETWORK_MODE::State.

Referenced by snpnet_open().

◆ snpnet_check_link()

static void snpnet_check_link ( struct net_device netdev)
static

Check link state.

Parameters
netdevNetwork device

Definition at line 138 of file snpnet.c.

138  {
139  struct snp_nic *snp = netdev_priv ( netdev );
140  EFI_SIMPLE_NETWORK_MODE *mode = snp->snp->Mode;
141 
142  /* Do nothing unless media presence detection is supported */
143  if ( ! mode->MediaPresentSupported )
144  return;
145 
146  /* Report any link status change */
147  if ( mode->MediaPresent && ( ! netdev_link_ok ( netdev ) ) ) {
149  } else if ( ( ! mode->MediaPresent ) && netdev_link_ok ( netdev ) ) {
151  }
152 }
static void * netdev_priv(struct net_device *netdev)
Get driver private area for this network device.
Definition: netdevice.h:578
BOOLEAN MediaPresent
TRUE if media are connected to the network interface; otherwise FALSE.
EFI_SIMPLE_NETWORK_PROTOCOL * snp
Simple network protocol.
Definition: snpnet.c:48
BOOLEAN MediaPresentSupported
TRUE if the presence of media can be determined; otherwise FALSE.
void netdev_link_down(struct net_device *netdev)
Mark network device as having link down.
Definition: netdevice.c:183
EFI_SIMPLE_NETWORK_MODE * Mode
Pointer to the EFI_SIMPLE_NETWORK_MODE data for the device.
static void netdev_link_up(struct net_device *netdev)
Mark network device as having link up.
Definition: netdevice.h:778
static int netdev_link_ok(struct net_device *netdev)
Check link state of network device.
Definition: netdevice.h:642
static struct net_device * netdev
Definition: gdbudp.c:52
An SNP NIC.
Definition: snpnet.c:44

References EFI_SIMPLE_NETWORK_MODE::MediaPresent, EFI_SIMPLE_NETWORK_MODE::MediaPresentSupported, _EFI_SIMPLE_NETWORK_PROTOCOL::Mode, netdev, netdev_link_down(), netdev_link_ok(), netdev_link_up(), netdev_priv(), and snp_nic::snp.

Referenced by snpnet_poll(), and snpnet_start().

◆ snpnet_transmit()

static int snpnet_transmit ( struct net_device netdev,
struct io_buffer iobuf 
)
static

Transmit packet.

Parameters
netdevNetwork device
iobufI/O buffer
Return values
rcReturn status code

Definition at line 161 of file snpnet.c.

162  {
163  struct snp_nic *snp = netdev_priv ( netdev );
164  EFI_STATUS efirc;
165  int rc;
166 
167  /* Do nothing if shutdown is in progress */
169  return -ECANCELED;
170 
171  /* Defer the packet if there is already a transmission in progress */
172  if ( snp->txbuf ) {
173  netdev_tx_defer ( netdev, iobuf );
174  return 0;
175  }
176 
177  /* Transmit packet */
178  if ( ( efirc = snp->snp->Transmit ( snp->snp, 0, iob_len ( iobuf ),
179  iobuf->data, NULL, NULL,
180  NULL ) ) != 0 ) {
181  rc = -EEFI ( efirc );
182  DBGC ( snp, "SNP %s could not transmit: %s\n",
183  netdev->name, strerror ( rc ) );
184  return rc;
185  }
186  snp->txbuf = iobuf;
187 
188  return 0;
189 }
static void * netdev_priv(struct net_device *netdev)
Get driver private area for this network device.
Definition: netdevice.h:578
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:162
void netdev_tx_defer(struct net_device *netdev, struct io_buffer *iobuf)
Defer transmitted packet.
Definition: netdevice.c:365
EFI_SIMPLE_NETWORK_PROTOCOL * snp
Simple network protocol.
Definition: snpnet.c:48
#define DBGC(...)
Definition: compiler.h:505
#define ECANCELED
Operation canceled.
Definition: errno.h:343
static struct net_device * netdev
Definition: gdbudp.c:52
EFI_SIMPLE_NETWORK_TRANSMIT Transmit
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition: iobuf.h:155
An SNP NIC.
Definition: snpnet.c:44
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:362
void * data
Start of data.
Definition: iobuf.h:48
RETURN_STATUS EFI_STATUS
Function return status for EFI API.
Definition: UefiBaseType.h:31
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
int efi_shutdown_in_progress
EFI shutdown is in progress.
Definition: efi_init.c:58

References io_buffer::data, DBGC, ECANCELED, EEFI, efi_shutdown_in_progress, iob_len(), net_device::name, netdev, netdev_priv(), netdev_tx_defer(), NULL, rc, snp_nic::snp, strerror(), and _EFI_SIMPLE_NETWORK_PROTOCOL::Transmit.

◆ snpnet_poll_tx()

static void snpnet_poll_tx ( struct net_device netdev)
static

Poll for completed packets.

Parameters
netdevNetwork device

Definition at line 196 of file snpnet.c.

196  {
197  struct snp_nic *snp = netdev->priv;
198  struct io_buffer *iobuf;
199  UINT32 irq;
200  VOID *txbuf;
201  EFI_STATUS efirc;
202  int rc;
203 
204  /* Get status */
205  txbuf = NULL;
206  if ( ( efirc = snp->snp->GetStatus ( snp->snp, &irq, &txbuf ) ) != 0 ) {
207  rc = -EEFI ( efirc );
208  DBGC ( snp, "SNP %s could not get status: %s\n",
209  netdev->name, strerror ( rc ) );
210  netdev_rx_err ( netdev, NULL, rc );
211  return;
212  }
213 
214  /* Do nothing unless we have a completion */
215  if ( ! txbuf )
216  return;
217 
218  /* Sanity check */
219  if ( ! snp->txbuf ) {
220  DBGC ( snp, "SNP %s reported spurious TX completion\n",
221  netdev->name );
223  return;
224  }
225 
226  /* Complete transmission */
227  iobuf = snp->txbuf;
228  snp->txbuf = NULL;
229  netdev_tx_complete ( netdev, iobuf );
230 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
static void netdev_tx_complete(struct net_device *netdev, struct io_buffer *iobuf)
Complete network transmission.
Definition: netdevice.h:756
void netdev_rx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard received packet.
Definition: netdevice.c:539
#define EEFI(efirc)
Convert an EFI status code to an iPXE status code.
Definition: efi.h:162
void netdev_tx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard transmitted packet.
Definition: netdevice.c:393
EFI_SIMPLE_NETWORK_PROTOCOL * snp
Simple network protocol.
Definition: snpnet.c:48
#define EPIPE
Broken pipe.
Definition: errno.h:619
#define DBGC(...)
Definition: compiler.h:505
unsigned int UINT32
Definition: ProcessorBind.h:98
struct io_buffer * txbuf
Current transmit buffer.
Definition: snpnet.c:60
void * priv
Driver private data.
Definition: netdevice.h:431
EFI_SIMPLE_NETWORK_GET_STATUS GetStatus
static struct net_device * netdev
Definition: gdbudp.c:52
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
An SNP NIC.
Definition: snpnet.c:44
#define VOID
Undeclared type.
Definition: Base.h:271
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:362
RETURN_STATUS EFI_STATUS
Function return status for EFI API.
Definition: UefiBaseType.h:31
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
A persistent I/O buffer.
Definition: iobuf.h:33

References DBGC, EEFI, EPIPE, _EFI_SIMPLE_NETWORK_PROTOCOL::GetStatus, net_device::name, netdev, netdev_rx_err(), netdev_tx_complete(), netdev_tx_err(), NULL, net_device::priv, rc, snp_nic::snp, strerror(), snp_nic::txbuf, and VOID.

Referenced by snpnet_poll().

◆ snpnet_poll_rx()

static void snpnet_poll_rx ( struct net_device netdev)
static

Poll for received packets.

Parameters
netdevNetwork device

Definition at line 237 of file snpnet.c.

237  {
238  struct snp_nic *snp = netdev->priv;
239  UINTN len;
240  unsigned int quota;
241  EFI_STATUS efirc;
242  int rc;
243 
244  /* Retrieve up to SNP_RX_QUOTA packets */
245  for ( quota = SNP_RX_QUOTA ; quota ; quota-- ) {
246 
247  /* Allocate buffer, if required */
248  if ( ! snp->rxbuf ) {
249  snp->rxbuf = alloc_iob ( snp->mtu );
250  if ( ! snp->rxbuf ) {
251  /* Leave for next poll */
252  break;
253  }
254  }
255 
256  /* Receive packet */
257  len = iob_tailroom ( snp->rxbuf );
258  if ( ( efirc = snp->snp->Receive ( snp->snp, NULL, &len,
259  snp->rxbuf->data, NULL,
260  NULL, NULL ) ) != 0 ) {
261 
262  /* EFI_NOT_READY is just the usual "no packet"
263  * status indication; ignore it.
264  */
265  if ( efirc == EFI_NOT_READY )
266  break;
267 
268  /* Anything else is an error */
269  rc = -EEFI ( efirc );
270  DBGC ( snp, "SNP %s could not receive: %s\n",
271  netdev->name, strerror ( rc ) );
272  netdev_rx_err ( netdev, NULL, rc );
273  break;
274  }
275 
276  /* Hand off to network stack */
277  iob_put ( snp->rxbuf, len );
278  netdev_rx ( netdev, snp->rxbuf );
279  snp->rxbuf = NULL;
280  }
281 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define iob_put(iobuf, len)
Definition: iobuf.h:120
void netdev_rx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard received packet.
Definition: netdevice.c:539
#define EEFI(efirc)
Convert an EFI status code to an iPXE status code.
Definition: efi.h:162
EFI_SIMPLE_NETWORK_PROTOCOL * snp
Simple network protocol.
Definition: snpnet.c:48
#define DBGC(...)
Definition: compiler.h:505
struct io_buffer * alloc_iob(size_t len)
Allocate I/O buffer.
Definition: iobuf.c:129
void * priv
Driver private data.
Definition: netdevice.h:431
static struct net_device * netdev
Definition: gdbudp.c:52
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
An SNP NIC.
Definition: snpnet.c:44
static size_t iob_tailroom(struct io_buffer *iobuf)
Calculate available space at end of an I/O buffer.
Definition: iobuf.h:175
UINT64 UINTN
Unsigned value of native width.
#define EFI_NOT_READY
Enumeration of EFI_STATUS.
Definition: UefiBaseType.h:120
#define SNP_RX_QUOTA
Maximum number of received packets per poll.
Definition: snpnet.c:66
void netdev_rx(struct net_device *netdev, struct io_buffer *iobuf)
Add packet to receive queue.
Definition: netdevice.c:501
EFI_SIMPLE_NETWORK_RECEIVE Receive
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:362
uint32_t len
Length.
Definition: ena.h:14
RETURN_STATUS EFI_STATUS
Function return status for EFI API.
Definition: UefiBaseType.h:31
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References alloc_iob(), DBGC, EEFI, EFI_NOT_READY, iob_put, iob_tailroom(), len, net_device::name, netdev, netdev_rx(), netdev_rx_err(), NULL, net_device::priv, rc, _EFI_SIMPLE_NETWORK_PROTOCOL::Receive, snp_nic::snp, SNP_RX_QUOTA, and strerror().

Referenced by snpnet_poll().

◆ snpnet_poll()

static void snpnet_poll ( struct net_device netdev)
static

Poll for completed packets.

Parameters
netdevNetwork device

Definition at line 288 of file snpnet.c.

288  {
289 
290  /* Do nothing if shutdown is in progress */
292  return;
293 
294  /* Process any TX completions */
296 
297  /* Process any RX completions */
299 
300  /* Check for link state changes */
302 }
static struct net_device * netdev
Definition: gdbudp.c:52
static void snpnet_check_link(struct net_device *netdev)
Check link state.
Definition: snpnet.c:138
static void snpnet_poll_tx(struct net_device *netdev)
Poll for completed packets.
Definition: snpnet.c:196
static void snpnet_poll_rx(struct net_device *netdev)
Poll for received packets.
Definition: snpnet.c:237
int efi_shutdown_in_progress
EFI shutdown is in progress.
Definition: efi_init.c:58

References efi_shutdown_in_progress, netdev, snpnet_check_link(), snpnet_poll_rx(), and snpnet_poll_tx().

◆ snpnet_rx_filters()

static int snpnet_rx_filters ( struct net_device netdev)
static

Set receive filters.

Parameters
netdevNetwork device
Return values
rcReturn status code

Definition at line 310 of file snpnet.c.

310  {
311  struct snp_nic *snp = netdev->priv;
312  UINT32 filters[] = {
313  snp->snp->Mode->ReceiveFilterMask,
323  };
324  unsigned int i;
325  EFI_STATUS efirc;
326  int rc;
327 
328  /* Try possible receive filters in turn */
329  for ( i = 0; i < ( sizeof ( filters ) / sizeof ( filters[0] ) ); i++ ) {
330  efirc = snp->snp->ReceiveFilters ( snp->snp, filters[i],
332  0, NULL );
333  if ( efirc == 0 )
334  return 0;
335  rc = -EEFI ( efirc );
336  DBGC ( snp, "SNP %s could not set receive filters %#02x (have "
337  "%#02x): %s\n", netdev->name, filters[i],
338  snp->snp->Mode->ReceiveFilterSetting, strerror ( rc ) );
339  }
340 
341  return rc;
342 }
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:162
EFI_SIMPLE_NETWORK_PROTOCOL * snp
Simple network protocol.
Definition: snpnet.c:48
#define DBGC(...)
Definition: compiler.h:505
#define EFI_SIMPLE_NETWORK_RECEIVE_BROADCAST
unsigned int UINT32
Definition: ProcessorBind.h:98
#define EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS_MULTICAST
EFI_SIMPLE_NETWORK_MODE * Mode
Pointer to the EFI_SIMPLE_NETWORK_MODE data for the device.
UINT32 ReceiveFilterSetting
The current multicast receive filter settings.
void * priv
Driver private data.
Definition: netdevice.h:431
static struct net_device * netdev
Definition: gdbudp.c:52
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
#define EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST
An SNP NIC.
Definition: snpnet.c:44
#define TRUE
Definition: tlan.h:46
#define EFI_SIMPLE_NETWORK_RECEIVE_UNICAST
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:362
RETURN_STATUS EFI_STATUS
Function return status for EFI API.
Definition: UefiBaseType.h:31
UINT32 ReceiveFilterMask
The multicast receive filter settings supported by the network interface.
EFI_SIMPLE_NETWORK_RECEIVE_FILTERS ReceiveFilters
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References DBGC, EEFI, EFI_SIMPLE_NETWORK_RECEIVE_BROADCAST, EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST, EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS_MULTICAST, EFI_SIMPLE_NETWORK_RECEIVE_UNICAST, _EFI_SIMPLE_NETWORK_PROTOCOL::Mode, net_device::name, netdev, NULL, net_device::priv, rc, EFI_SIMPLE_NETWORK_MODE::ReceiveFilterMask, _EFI_SIMPLE_NETWORK_PROTOCOL::ReceiveFilters, EFI_SIMPLE_NETWORK_MODE::ReceiveFilterSetting, snp_nic::snp, strerror(), and TRUE.

Referenced by snpnet_open().

◆ snpnet_open()

static int snpnet_open ( struct net_device netdev)
static

Open network device.

Parameters
netdevNetwork device
Return values
rcReturn status code

Definition at line 350 of file snpnet.c.

350  {
351  struct snp_nic *snp = netdev->priv;
352  EFI_MAC_ADDRESS *mac = ( ( void * ) netdev->ll_addr );
353  EFI_SIMPLE_NETWORK_MODE *mode = snp->snp->Mode;
354  EFI_STATUS efirc;
355  unsigned int retry;
356  int rc;
357 
358  /* Try setting MAC address (before initialising) */
359  if ( ( efirc = snp->snp->StationAddress ( snp->snp, FALSE, mac ) ) !=0){
360  rc = -EEFI ( efirc );
361  DBGC ( snp, "SNP %s could not set station address before "
362  "initialising: %s\n", netdev->name, strerror ( rc ) );
363  /* Ignore error */
364  }
365 
366  /* Initialise NIC, retrying multiple times if link stays down */
367  for ( retry = 0 ; ; ) {
368 
369  /* Initialise NIC */
370  if ( ( efirc = snp->snp->Initialize ( snp->snp,
371  0, 0 ) ) != 0 ) {
372  rc = -EEFI ( efirc );
374  DBGC ( snp, "SNP %s could not initialise: %s\n",
375  netdev->name, strerror ( rc ) );
376  return rc;
377  }
378 
379  /* Stop if we have link up (or no link detection capability) */
380  if ( ( ! mode->MediaPresentSupported ) || mode->MediaPresent )
381  break;
382 
383  /* Stop if we have exceeded our retry count. This is
384  * not a failure; it is plausible that we genuinely do
385  * not have link up.
386  */
387  if ( ++retry >= SNP_INITIALIZE_RETRY_MAX )
388  break;
389  DBGC ( snp, "SNP %s retrying initialisation (retry %d)\n",
390  netdev->name, retry );
391 
392  /* Delay to allow time for link to establish */
394 
395  /* Shut down and retry; this is sometimes necessary in
396  * order to persuade the underlying SNP driver to
397  * actually update the link state.
398  */
399  if ( ( efirc = snp->snp->Shutdown ( snp->snp ) ) != 0 ) {
400  rc = -EEFI ( efirc );
402  DBGC ( snp, "SNP %s could not shut down: %s\n",
403  netdev->name, strerror ( rc ) );
404  return rc;
405  }
406  }
407 
408  /* Try setting MAC address (after initialising) */
409  if ( ( efirc = snp->snp->StationAddress ( snp->snp, FALSE, mac ) ) !=0){
410  rc = -EEFI ( efirc );
411  DBGC ( snp, "SNP %s could not set station address after "
412  "initialising: %s\n", netdev->name, strerror ( rc ) );
413  /* Ignore error */
414  }
415 
416  /* Set receive filters */
417  if ( ( rc = snpnet_rx_filters ( netdev ) ) != 0 ) {
418  /* Ignore error */
419  }
420 
421  /* Dump mode information (for debugging) */
423 
424  return 0;
425 }
EFI_SIMPLE_NETWORK_STATION_ADDRESS StationAddress
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
static void snpnet_dump_mode(struct net_device *netdev)
Dump SNP mode information (for debugging)
Definition: snpnet.c:99
#define EEFI(efirc)
Convert an EFI status code to an iPXE status code.
Definition: efi.h:162
BOOLEAN MediaPresent
TRUE if media are connected to the network interface; otherwise FALSE.
EFI_SIMPLE_NETWORK_PROTOCOL * snp
Simple network protocol.
Definition: snpnet.c:48
32-byte buffer containing a network Media Access Control address.
Definition: UefiBaseType.h:97
#define DBGC(...)
Definition: compiler.h:505
BOOLEAN MediaPresentSupported
TRUE if the presence of media can be determined; otherwise FALSE.
uint8_t mac[ETH_ALEN]
MAC address.
Definition: ena.h:24
EFI_SIMPLE_NETWORK_MODE * Mode
Pointer to the EFI_SIMPLE_NETWORK_MODE data for the device.
EFI_SIMPLE_NETWORK_INITIALIZE Initialize
void * priv
Driver private data.
Definition: netdevice.h:431
EFI_SIMPLE_NETWORK_SHUTDOWN Shutdown
static struct net_device * netdev
Definition: gdbudp.c:52
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
An SNP NIC.
Definition: snpnet.c:44
static int snpnet_rx_filters(struct net_device *netdev)
Set receive filters.
Definition: snpnet.c:310
#define SNP_INITIALIZE_RETRY_MAX
Maximum initialisation retry count.
Definition: snpnet.c:69
void mdelay(unsigned long msecs)
Delay for a fixed number of milliseconds.
Definition: timer.c:78
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:362
RETURN_STATUS EFI_STATUS
Function return status for EFI API.
Definition: UefiBaseType.h:31
#define FALSE
Definition: tlan.h:45
#define SNP_INITIALIZE_RETRY_DELAY_MS
Delay between each initialisation retry.
Definition: snpnet.c:72
uint8_t ll_addr[MAX_LL_ADDR_LEN]
Link-layer address.
Definition: netdevice.h:387

References DBGC, EEFI, FALSE, _EFI_SIMPLE_NETWORK_PROTOCOL::Initialize, net_device::ll_addr, mac, mdelay(), EFI_SIMPLE_NETWORK_MODE::MediaPresent, EFI_SIMPLE_NETWORK_MODE::MediaPresentSupported, _EFI_SIMPLE_NETWORK_PROTOCOL::Mode, net_device::name, netdev, net_device::priv, rc, _EFI_SIMPLE_NETWORK_PROTOCOL::Shutdown, snp_nic::snp, SNP_INITIALIZE_RETRY_DELAY_MS, SNP_INITIALIZE_RETRY_MAX, snpnet_dump_mode(), snpnet_rx_filters(), _EFI_SIMPLE_NETWORK_PROTOCOL::StationAddress, and strerror().

◆ snpnet_close()

static void snpnet_close ( struct net_device netdev)
static

Close network device.

Parameters
netdevNetwork device

Definition at line 432 of file snpnet.c.

432  {
433  struct snp_nic *snp = netdev->priv;
434  EFI_STATUS efirc;
435  int rc;
436 
437  /* Shut down NIC (unless whole system shutdown is in progress) */
438  if ( ( ! efi_shutdown_in_progress ) &&
439  ( ( efirc = snp->snp->Shutdown ( snp->snp ) ) != 0 ) ) {
440  rc = -EEFI ( efirc );
441  DBGC ( snp, "SNP %s could not shut down: %s\n",
442  netdev->name, strerror ( rc ) );
443  /* Nothing we can do about this */
444  }
445 
446  /* Discard transmit buffer, if applicable */
447  if ( snp->txbuf ) {
449  snp->txbuf = NULL;
450  }
451 
452  /* Discard receive buffer, if applicable */
453  if ( snp->rxbuf ) {
454  free_iob ( snp->rxbuf );
455  snp->rxbuf = NULL;
456  }
457 }
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:162
EFI_SIMPLE_NETWORK_PROTOCOL * snp
Simple network protocol.
Definition: snpnet.c:48
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition: iobuf.c:146
#define DBGC(...)
Definition: compiler.h:505
#define ECANCELED
Operation canceled.
Definition: errno.h:343
void * priv
Driver private data.
Definition: netdevice.h:431
EFI_SIMPLE_NETWORK_SHUTDOWN Shutdown
static struct net_device * netdev
Definition: gdbudp.c:52
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
An SNP NIC.
Definition: snpnet.c:44
void netdev_tx_complete_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Complete network transmission.
Definition: netdevice.c:423
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:362
RETURN_STATUS EFI_STATUS
Function return status for EFI API.
Definition: UefiBaseType.h:31
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
int efi_shutdown_in_progress
EFI shutdown is in progress.
Definition: efi_init.c:58

References DBGC, ECANCELED, EEFI, efi_shutdown_in_progress, free_iob(), net_device::name, netdev, netdev_tx_complete_err(), NULL, net_device::priv, rc, _EFI_SIMPLE_NETWORK_PROTOCOL::Shutdown, snp_nic::snp, and strerror().

◆ snpnet_start()

int snpnet_start ( struct efi_device efidev)

Attach driver to device.

Parameters
efidevEFI device
Return values
rcReturn status code

Definition at line 473 of file snpnet.c.

473  {
477  struct net_device *netdev;
478  struct snp_nic *snp;
479  void *interface;
480  EFI_STATUS efirc;
481  int rc;
482 
483  /* Open SNP protocol */
484  if ( ( efirc = bs->OpenProtocol ( device,
489  rc = -EEFI ( efirc );
490  DBGC ( device, "SNP %s cannot open SNP protocol: %s\n",
491  efi_handle_name ( device ), strerror ( rc ) );
494  goto err_open_protocol;
495  }
496 
497  /* Allocate and initialise structure */
498  netdev = alloc_etherdev ( sizeof ( *snp ) );
499  if ( ! netdev ) {
500  rc = -ENOMEM;
501  goto err_alloc;
502  }
504  snp = netdev->priv;
505  snp->efidev = efidev;
506  snp->snp = interface;
507  mode = snp->snp->Mode;
509 
510  /* Populate underlying device information */
511  efi_device_info ( device, "SNP", &snp->dev );
512  snp->dev.driver_name = "SNP";
513  snp->dev.parent = &efidev->dev;
514  list_add ( &snp->dev.siblings, &efidev->dev.children );
515  INIT_LIST_HEAD ( &snp->dev.children );
516  netdev->dev = &snp->dev;
517 
518  /* Bring to the Started state */
519  if ( ( mode->State == EfiSimpleNetworkStopped ) &&
520  ( ( efirc = snp->snp->Start ( snp->snp ) ) != 0 ) ) {
521  rc = -EEFI ( efirc );
522  DBGC ( device, "SNP %s could not start: %s\n",
523  efi_handle_name ( device ), strerror ( rc ) );
524  goto err_start;
525  }
526  if ( ( mode->State == EfiSimpleNetworkInitialized ) &&
527  ( ( efirc = snp->snp->Shutdown ( snp->snp ) ) != 0 ) ) {
528  rc = -EEFI ( efirc );
529  DBGC ( device, "SNP %s could not shut down: %s\n",
530  efi_handle_name ( device ), strerror ( rc ) );
531  goto err_shutdown;
532  }
533 
534  /* Populate network device parameters */
535  if ( mode->HwAddressSize != netdev->ll_protocol->hw_addr_len ) {
536  DBGC ( device, "SNP %s has invalid hardware address length "
537  "%d\n", efi_handle_name ( device ), mode->HwAddressSize);
538  rc = -ENOTSUP;
539  goto err_hw_addr_len;
540  }
543  if ( mode->HwAddressSize != netdev->ll_protocol->ll_addr_len ) {
544  DBGC ( device, "SNP %s has invalid link-layer address length "
545  "%d\n", efi_handle_name ( device ), mode->HwAddressSize);
546  rc = -ENOTSUP;
547  goto err_ll_addr_len;
548  }
549  memcpy ( netdev->ll_addr, &mode->CurrentAddress,
551  snp->mtu = ( snp->snp->Mode->MaxPacketSize +
552  snp->snp->Mode->MediaHeaderSize );
553 
554  /* Register network device */
555  if ( ( rc = register_netdev ( netdev ) ) != 0 )
556  goto err_register_netdev;
557  DBGC ( device, "SNP %s registered as %s\n",
559 
560  /* Set initial link state */
561  if ( snp->snp->Mode->MediaPresentSupported ) {
563  } else {
565  }
566 
567  return 0;
568 
570  err_register_netdev:
571  err_ll_addr_len:
572  err_hw_addr_len:
573  err_shutdown:
574  err_start:
575  list_del ( &snp->dev.siblings );
577  netdev_put ( netdev );
578  err_alloc:
581  err_open_protocol:
582  return rc;
583 }
EFI_BOOT_SERVICES * BootServices
A pointer to the EFI Boot Services Table.
Definition: UefiSpec.h:2030
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:162
uint8_t ll_addr_len
Link-layer address length.
Definition: netdevice.h:198
UINT32 MediaHeaderSize
The size, in bytes, of the network interface's media header.
#define list_add(new, head)
Add a new entry to the head of a list.
Definition: list.h:69
EFI_SIMPLE_NETWORK_PROTOCOL * snp
Simple network protocol.
Definition: snpnet.c:48
EFI_GUID efi_simple_network_protocol_guid
Simple network protocol GUID.
Definition: efi_guid.c:236
#define DBGC(...)
Definition: compiler.h:505
#define EFI_OPEN_PROTOCOL_BY_DRIVER
Definition: UefiSpec.h:1302
#define EFI_OPEN_PROTOCOL_EXCLUSIVE
Definition: UefiSpec.h:1303
BOOLEAN MediaPresentSupported
TRUE if the presence of media can be determined; otherwise FALSE.
#define DBGC_EFI_OPENERS(...)
Definition: efi.h:286
EFI_HANDLE device
EFI device handle.
Definition: efi_driver.h:21
UINT32 State
Reports the current state of the network interface.
EFI_CLOSE_PROTOCOL CloseProtocol
Definition: UefiSpec.h:1936
EFI_MAC_ADDRESS CurrentAddress
The current HW MAC address for the network interface.
#define ENOTSUP
Operation not supported.
Definition: errno.h:589
EFI_SIMPLE_NETWORK_MODE * Mode
Pointer to the EFI_SIMPLE_NETWORK_MODE data for the device.
static void netdev_init(struct net_device *netdev, struct net_device_operations *op)
Initialise a network device.
Definition: netdevice.h:510
#define list_del(list)
Delete an entry from a list.
Definition: list.h:119
UINT32 MaxPacketSize
The maximum size, in bytes, of the packets supported by the network interface.
#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:567
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
EFI_SIMPLE_NETWORK_SHUTDOWN Shutdown
static void netdev_link_up(struct net_device *netdev)
Mark network device as having link up.
Definition: netdevice.h:778
static struct net_device * netdev
Definition: gdbudp.c:52
static void snpnet_check_link(struct net_device *netdev)
Check link state.
Definition: snpnet.c:138
void unregister_netdev(struct net_device *netdev)
Unregister network device.
Definition: netdevice.c:894
const char * efi_handle_name(EFI_HANDLE handle)
Get name of an EFI handle.
Definition: efi_debug.c:722
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
EFI Boot Services Table.
Definition: UefiSpec.h:1866
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:719
A network device.
Definition: netdevice.h:352
An SNP NIC.
Definition: snpnet.c:44
static void netdev_nullify(struct net_device *netdev)
Stop using a network device.
Definition: netdevice.h:523
EFI_SIMPLE_NETWORK_START Start
struct efi_device * efidev
EFI device.
Definition: snpnet.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
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
EFI_SYSTEM_TABLE * efi_systab
EFI_OPEN_PROTOCOL OpenProtocol
Definition: UefiSpec.h:1935
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:72
struct device dev
Generic device.
Definition: efi_driver.h:19
uint8_t hw_addr[MAX_HW_ADDR_LEN]
Hardware address.
Definition: netdevice.h:381
static struct net_device_operations snpnet_operations
SNP network device operations.
Definition: snpnet.c:460
Definition: efi.h:50
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.

References alloc_etherdev(), EFI_SYSTEM_TABLE::BootServices, device::children, EFI_BOOT_SERVICES::CloseProtocol, EFI_SIMPLE_NETWORK_MODE::CurrentAddress, DBGC, DBGC_EFI_OPENERS, efi_device::dev, net_device::dev, efi_device::device, EEFI, efi_device_info(), efi_handle_name(), efi_image_handle, EFI_OPEN_PROTOCOL_BY_DRIVER, EFI_OPEN_PROTOCOL_EXCLUSIVE, efi_simple_network_protocol_guid, efi_systab, snp_nic::efidev, efidev_set_drvdata(), EfiSimpleNetworkInitialized, EfiSimpleNetworkStopped, ENOMEM, ENOTSUP, 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, EFI_SIMPLE_NETWORK_MODE::MaxPacketSize, EFI_SIMPLE_NETWORK_MODE::MediaHeaderSize, EFI_SIMPLE_NETWORK_MODE::MediaPresentSupported, memcpy(), _EFI_SIMPLE_NETWORK_PROTOCOL::Mode, net_device::name, netdev, netdev_init(), netdev_link_up(), netdev_nullify(), netdev_put(), EFI_BOOT_SERVICES::OpenProtocol, EFI_SIMPLE_NETWORK_MODE::PermanentAddress, net_device::priv, rc, register_netdev(), _EFI_SIMPLE_NETWORK_PROTOCOL::Shutdown, snp_nic::snp, snpnet_check_link(), snpnet_operations, _EFI_SIMPLE_NETWORK_PROTOCOL::Start, EFI_SIMPLE_NETWORK_MODE::State, strerror(), and unregister_netdev().

◆ snpnet_stop()

void snpnet_stop ( struct efi_device efidev)

Detach driver from device.

Parameters
efidevEFI device

Definition at line 590 of file snpnet.c.

590  {
592  struct net_device *netdev = efidev_get_drvdata ( efidev );
593  struct snp_nic *snp = netdev->priv;
595  EFI_STATUS efirc;
596  int rc;
597 
598  /* Unregister network device */
600 
601  /* Stop SNP protocol (unless whole system shutdown is in progress) */
602  if ( ( ! efi_shutdown_in_progress ) &&
603  ( ( efirc = snp->snp->Stop ( snp->snp ) ) != 0 ) ) {
604  rc = -EEFI ( efirc );
605  DBGC ( device, "SNP %s could not stop: %s\n",
606  efi_handle_name ( device ), strerror ( rc ) );
607  /* Nothing we can do about this */
608  }
609 
610  /* Free network device */
611  list_del ( &snp->dev.siblings );
613  netdev_put ( netdev );
614 
615  /* Close SNP protocol */
618 }
EFI_BOOT_SERVICES * BootServices
A pointer to the EFI Boot Services Table.
Definition: UefiSpec.h:2030
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:162
EFI_SIMPLE_NETWORK_PROTOCOL * snp
Simple network protocol.
Definition: snpnet.c:48
EFI_GUID efi_simple_network_protocol_guid
Simple network protocol GUID.
Definition: efi_guid.c:236
#define DBGC(...)
Definition: compiler.h:505
EFI_HANDLE device
EFI device handle.
Definition: efi_driver.h:21
EFI_CLOSE_PROTOCOL CloseProtocol
Definition: UefiSpec.h:1936
#define list_del(list)
Delete an entry from a list.
Definition: list.h:119
A hardware device.
Definition: device.h:73
static void netdev_put(struct net_device *netdev)
Drop reference to network device.
Definition: netdevice.h:567
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:894
const char * efi_handle_name(EFI_HANDLE handle)
Get name of an EFI handle.
Definition: efi_debug.c:722
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
EFI Boot Services Table.
Definition: UefiSpec.h:1866
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:83
A network device.
Definition: netdevice.h:352
An SNP NIC.
Definition: snpnet.c:44
static void netdev_nullify(struct net_device *netdev)
Stop using a network device.
Definition: netdevice.h:523
struct efi_device * efidev
EFI device.
Definition: snpnet.c:46
RETURN_STATUS EFI_STATUS
Function return status for EFI API.
Definition: UefiBaseType.h:31
EFI_SYSTEM_TABLE * efi_systab
EFI_SIMPLE_NETWORK_STOP Stop
Definition: efi.h:50
int efi_shutdown_in_progress
EFI shutdown is in progress.
Definition: efi_init.c:58

References EFI_SYSTEM_TABLE::BootServices, EFI_BOOT_SERVICES::CloseProtocol, DBGC, efi_device::device, EEFI, efi_handle_name(), efi_image_handle, efi_shutdown_in_progress, efi_simple_network_protocol_guid, efi_systab, snp_nic::efidev, efidev_get_drvdata(), list_del, netdev, netdev_nullify(), netdev_put(), net_device::priv, rc, snp_nic::snp, _EFI_SIMPLE_NETWORK_PROTOCOL::Stop, strerror(), and unregister_netdev().

Variable Documentation

◆ snpnet_operations

struct net_device_operations snpnet_operations
static
Initial value:
= {
.open = snpnet_open,
.close = snpnet_close,
.transmit = snpnet_transmit,
.poll = snpnet_poll,
}
static void snpnet_poll(struct net_device *netdev)
Poll for completed packets.
Definition: snpnet.c:288
static int snpnet_transmit(struct net_device *netdev, struct io_buffer *iobuf)
Transmit packet.
Definition: snpnet.c:161
static void snpnet_close(struct net_device *netdev)
Close network device.
Definition: snpnet.c:432
static int snpnet_open(struct net_device *netdev)
Open network device.
Definition: snpnet.c:350

SNP network device operations.

Definition at line 460 of file snpnet.c.

Referenced by snpnet_start().