iPXE
Functions | Variables
legacy.c File Reference
#include <stdint.h>
#include <stdio.h>
#include <errno.h>
#include <ipxe/if_ether.h>
#include <ipxe/netdevice.h>
#include <ipxe/ethernet.h>
#include <ipxe/iobuf.h>
#include <nic.h>

Go to the source code of this file.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
static int legacy_transmit (struct net_device *netdev, struct io_buffer *iobuf)
 
static void legacy_poll (struct net_device *netdev)
 
static int legacy_open (struct net_device *netdev __unused)
 
static void legacy_close (struct net_device *netdev __unused)
 
static void legacy_irq (struct net_device *netdev __unused, int enable)
 
int legacy_probe (void *hwdev, void(*set_drvdata)(void *hwdev, void *priv), struct device *dev, int(*probe)(struct nic *nic, void *hwdev), void(*disable)(struct nic *nic, void *hwdev), size_t fake_bss_len)
 
void legacy_remove (void *hwdev, void *(*get_drvdata)(void *hwdev), void(*disable)(struct nic *nic, void *hwdev))
 
int dummy_connect (struct nic *nic __unused)
 
void dummy_irq (struct nic *nic __unused, irq_action_t irq_action __unused)
 

Variables

struct nic legacy_nic
 
static int legacy_registered = 0
 
static struct net_device_operations legacy_operations
 

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ legacy_transmit()

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

Definition at line 26 of file legacy.c.

26  {
27  struct nic *nic = netdev->priv;
28  struct ethhdr *ethhdr;
29 
30  DBG ( "Transmitting %zd bytes\n", iob_len ( iobuf ) );
31  iob_pad ( iobuf, ETH_ZLEN );
32  ethhdr = iobuf->data;
33  iob_pull ( iobuf, sizeof ( *ethhdr ) );
34  nic->nic_op->transmit ( nic, ( const char * ) ethhdr->h_dest,
35  ntohs ( ethhdr->h_protocol ),
36  iob_len ( iobuf ), iobuf->data );
37  netdev_tx_complete ( netdev, iobuf );
38  return 0;
39 }
uint16_t h_protocol
Protocol ID.
Definition: if_ether.h:37
#define iob_pull(iobuf, len)
Definition: iobuf.h:106
static void netdev_tx_complete(struct net_device *netdev, struct io_buffer *iobuf)
Complete network transmission.
Definition: netdevice.h:766
#define ntohs(value)
Definition: byteswap.h:136
void(* transmit)(struct nic *, const char *, unsigned int, unsigned int, const char *)
Definition: nic.h:71
uint8_t h_dest[ETH_ALEN]
Destination MAC address.
Definition: if_ether.h:33
void * priv
Driver private data.
Definition: netdevice.h:431
static struct net_device * netdev
Definition: gdbudp.c:52
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition: iobuf.h:159
#define ETH_ZLEN
Definition: if_ether.h:10
Definition: nic.h:49
void * data
Start of data.
Definition: iobuf.h:52
#define DBG(...)
Print a debugging message.
Definition: compiler.h:498
struct nic_operations * nic_op
Definition: nic.h:50
An Ethernet link-layer header.
Definition: if_ether.h:31
void iob_pad(struct io_buffer *iobuf, size_t min_len)
Pad I/O buffer.
Definition: iobpad.c:49

References io_buffer::data, DBG, ETH_ZLEN, ethhdr::h_dest, ethhdr::h_protocol, iob_len(), iob_pad(), iob_pull, netdev, netdev_tx_complete(), nic::nic_op, ntohs, net_device::priv, and nic_operations::transmit.

◆ legacy_poll()

static void legacy_poll ( struct net_device netdev)
static

Definition at line 41 of file legacy.c.

41  {
42  struct nic *nic = netdev->priv;
43  struct io_buffer *iobuf;
44 
45  iobuf = alloc_iob ( ETH_FRAME_LEN + 4 /* possible VLAN */
46  + 4 /* possible CRC */ );
47  if ( ! iobuf )
48  return;
49 
50  nic->packet = iobuf->data;
51  if ( nic->nic_op->poll ( nic, 1 ) ) {
52  DBG ( "Received %d bytes\n", nic->packetlen );
53  iob_put ( iobuf, nic->packetlen );
54  netdev_rx ( netdev, iobuf );
55  } else {
56  free_iob ( iobuf );
57  }
58 }
int(* poll)(struct nic *, int retrieve)
Definition: nic.h:70
#define iob_put(iobuf, len)
Definition: iobuf.h:124
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition: iobuf.c:152
struct io_buffer * alloc_iob(size_t len)
Allocate I/O buffer.
Definition: iobuf.c:130
#define ETH_FRAME_LEN
Definition: if_ether.h:11
void * priv
Driver private data.
Definition: netdevice.h:431
static struct net_device * netdev
Definition: gdbudp.c:52
unsigned int packetlen
Definition: nic.h:54
Definition: nic.h:49
void netdev_rx(struct net_device *netdev, struct io_buffer *iobuf)
Add packet to receive queue.
Definition: netdevice.c:548
unsigned char * packet
Definition: nic.h:53
void * data
Start of data.
Definition: iobuf.h:52
#define DBG(...)
Print a debugging message.
Definition: compiler.h:498
struct nic_operations * nic_op
Definition: nic.h:50
A persistent I/O buffer.
Definition: iobuf.h:37

References alloc_iob(), io_buffer::data, DBG, ETH_FRAME_LEN, free_iob(), iob_put, netdev, netdev_rx(), nic::nic_op, nic::packet, nic::packetlen, nic_operations::poll, and net_device::priv.

◆ legacy_open()

static int legacy_open ( struct net_device *netdev  __unused)
static

Definition at line 60 of file legacy.c.

60  {
61  /* Nothing to do */
62  return 0;
63 }

◆ legacy_close()

static void legacy_close ( struct net_device *netdev  __unused)
static

Definition at line 65 of file legacy.c.

65  {
66  /* Nothing to do */
67 }

◆ legacy_irq()

static void legacy_irq ( struct net_device *netdev  __unused,
int  enable 
)
static

Definition at line 69 of file legacy.c.

69  {
70  struct nic *nic = netdev->priv;
71 
72  nic->nic_op->irq ( nic, ( enable ? ENABLE : DISABLE ) );
73 }
Definition: nic.h:35
void(* irq)(struct nic *, irq_action_t)
Definition: nic.h:73
void * priv
Driver private data.
Definition: netdevice.h:431
static struct net_device * netdev
Definition: gdbudp.c:52
Definition: nic.h:49
Definition: nic.h:36
struct nic_operations * nic_op
Definition: nic.h:50

References DISABLE, ENABLE, nic_operations::irq, netdev, nic::nic_op, and net_device::priv.

◆ legacy_probe()

int legacy_probe ( void *  hwdev,
void(*)(void *hwdev, void *priv set_drvdata,
struct device dev,
int(*)(struct nic *nic, void *hwdev)  probe,
void(*)(struct nic *nic, void *hwdev)  disable,
size_t  fake_bss_len 
)

Definition at line 83 of file legacy.c.

88  {
89  struct net_device *netdev;
90  struct nic *nic;
91  int rc;
92 
93  if ( legacy_registered ) {
94  rc = -EBUSY;
95  goto err_registered;
96  }
97 
98  netdev = alloc_etherdev ( 0 );
99  if ( ! netdev ) {
100  rc = -ENOMEM;
101  goto err_alloc;
102  }
104  nic = &legacy_nic;
105  netdev->priv = nic;
106  memset ( nic, 0, sizeof ( *nic ) );
107  set_drvdata ( hwdev, netdev );
108  netdev->dev = dev;
109 
111  nic->irqno = dev->desc.irq;
112 
113  if ( fake_bss_len ) {
115  if ( ! nic->fake_bss ) {
116  rc = -ENOMEM;
117  goto err_fake_bss;
118  }
119  }
121 
122  if ( ! probe ( nic, hwdev ) ) {
123  rc = -ENODEV;
124  goto err_probe;
125  }
126 
127  /* Overwrite the IRQ number. Some legacy devices set
128  * nic->irqno to 0 in the probe routine to indicate that they
129  * don't support interrupts; doing this allows the timer
130  * interrupt to be used instead.
131  */
132  dev->desc.irq = nic->irqno;
133 
134  if ( ( rc = register_netdev ( netdev ) ) != 0 )
135  goto err_register;
136 
137  /* Mark as link up; legacy devices don't handle link state */
139 
140  /* Do not remove this message */
141  printf ( "WARNING: Using legacy NIC wrapper on %s\n",
143 
144  legacy_registered = 1;
145  return 0;
146 
147  err_register:
148  disable ( nic, hwdev );
149  err_probe:
150  if ( fake_bss_len )
152  err_fake_bss:
154  netdev_put ( netdev );
155  err_alloc:
156  err_registered:
157  return rc;
158 }
unsigned char irqno
Definition: nic.h:56
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
int printf(const char *fmt,...)
Write a formatted string to the console.
Definition: vsprintf.c:464
void * fake_bss
Definition: nic.h:60
#define EBUSY
Device or resource busy.
Definition: errno.h:338
struct nic legacy_nic
Definition: legacy.c:22
#define PAGE_SIZE
Page size.
Definition: io.h:27
static struct net_device_operations legacy_operations
Definition: legacy.c:75
static void netdev_init(struct net_device *netdev, struct net_device_operations *op)
Initialise a network device.
Definition: netdevice.h:518
#define ENOMEM
Not enough space.
Definition: errno.h:534
static void netdev_put(struct net_device *netdev)
Drop reference to network device.
Definition: netdevice.h:575
unsigned int irq
IRQ.
Definition: device.h:39
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:788
static struct net_device * netdev
Definition: gdbudp.c:52
int register_netdev(struct net_device *netdev)
Register network device.
Definition: netdevice.c:759
A network device.
Definition: netdevice.h:352
#define ENODEV
No such device.
Definition: errno.h:509
static void netdev_nullify(struct net_device *netdev)
Stop using a network device.
Definition: netdevice.h:531
Definition: nic.h:49
struct device * dev
Underlying hardware device.
Definition: netdevice.h:364
unsigned char * node_addr
Definition: nic.h:52
void free_phys(void *ptr, size_t size)
Free memory allocated with malloc_phys()
Definition: malloc.c:722
struct net_device * alloc_etherdev(size_t priv_size)
Allocate Ethernet device.
Definition: ethernet.c:264
struct device_description desc
Device description.
Definition: device.h:82
const char *(* ntoa)(const void *ll_addr)
Transcribe link-layer address.
Definition: netdevice.h:163
uint8_t hw_addr[MAX_HW_ADDR_LEN]
Hardware address.
Definition: netdevice.h:381
static int legacy_registered
Definition: legacy.c:24
size_t fake_bss_len
Definition: nic.h:61
struct ll_protocol * ll_protocol
Link-layer protocol.
Definition: netdevice.h:372
void * malloc_phys(size_t size, size_t phys_align)
Allocate memory with specified physical alignment.
Definition: malloc.c:706
void * memset(void *dest, int character, size_t len) __nonnull

References alloc_etherdev(), device::desc, net_device::dev, EBUSY, ENODEV, ENOMEM, nic::fake_bss, nic::fake_bss_len, free_phys(), net_device::hw_addr, device_description::irq, nic::irqno, legacy_nic, legacy_operations, legacy_registered, net_device::ll_protocol, malloc_phys(), memset(), netdev, netdev_init(), netdev_link_up(), netdev_nullify(), netdev_put(), nic::node_addr, ll_protocol::ntoa, PAGE_SIZE, printf(), net_device::priv, rc, and register_netdev().

Referenced by t509_probe().

◆ legacy_remove()

void legacy_remove ( void *  hwdev,
void *(*)(void *hwdev)  get_drvdata,
void(*)(struct nic *nic, void *hwdev)  disable 
)

Definition at line 160 of file legacy.c.

162  {
163  struct net_device *netdev = get_drvdata ( hwdev );
164  struct nic *nic = netdev->priv;
165 
167  disable ( nic, hwdev );
168  if ( nic->fake_bss_len )
171  netdev_put ( netdev );
172  legacy_registered = 0;
173 }
void * fake_bss
Definition: nic.h:60
static void netdev_put(struct net_device *netdev)
Drop reference to network device.
Definition: netdevice.h:575
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
A network device.
Definition: netdevice.h:352
static void netdev_nullify(struct net_device *netdev)
Stop using a network device.
Definition: netdevice.h:531
Definition: nic.h:49
void free_phys(void *ptr, size_t size)
Free memory allocated with malloc_phys()
Definition: malloc.c:722
static int legacy_registered
Definition: legacy.c:24
size_t fake_bss_len
Definition: nic.h:61

References nic::fake_bss, nic::fake_bss_len, free_phys(), legacy_registered, netdev, netdev_nullify(), netdev_put(), net_device::priv, and unregister_netdev().

Referenced by t509_remove().

◆ dummy_connect()

int dummy_connect ( struct nic *nic  __unused)

Definition at line 175 of file legacy.c.

175  {
176  return 1;
177 }

◆ dummy_irq()

void dummy_irq ( struct nic *nic  __unused,
irq_action_t irq_action  __unused 
)

Definition at line 179 of file legacy.c.

179  {
180  return;
181 }

Variable Documentation

◆ legacy_nic

struct nic legacy_nic

Definition at line 22 of file legacy.c.

Referenced by eth_poll(), eth_transmit(), and legacy_probe().

◆ legacy_registered

int legacy_registered = 0
static

Definition at line 24 of file legacy.c.

Referenced by legacy_probe(), and legacy_remove().

◆ legacy_operations

struct net_device_operations legacy_operations
static
Initial value:
= {
.open = legacy_open,
.close = legacy_close,
.transmit = legacy_transmit,
.poll = legacy_poll,
.irq = legacy_irq,
}
static int legacy_transmit(struct net_device *netdev, struct io_buffer *iobuf)
Definition: legacy.c:26
static void legacy_close(struct net_device *netdev __unused)
Definition: legacy.c:65
static void legacy_irq(struct net_device *netdev __unused, int enable)
Definition: legacy.c:69
static void legacy_poll(struct net_device *netdev)
Definition: legacy.c:41
static int legacy_open(struct net_device *netdev __unused)
Definition: legacy.c:60

Definition at line 75 of file legacy.c.

Referenced by legacy_probe().