iPXE
Data Structures | Macros | Typedefs | Enumerations | Functions | Variables
nic.h File Reference
#include <stdint.h>
#include <string.h>
#include <stdio.h>
#include <byteswap.h>
#include <ipxe/pci.h>
#include <ipxe/isapnp.h>
#include <ipxe/isa.h>
#include <ipxe/eisa.h>
#include <ipxe/mca.h>
#include <ipxe/io.h>

Go to the source code of this file.

Data Structures

struct  nic
 
struct  nic_operations
 

Macros

#define NIC_H
 
#define NIC_FAKE_BSS_PTR(type)   ( ( type * ) legacy_nic.fake_bss )
 
#define NIC_FAKE_BSS(type)   ( * NIC_FAKE_BSS_PTR ( type ) )
 
#define PCI_DRIVER(_name, _ids, _class)
 
#define ISAPNP_DRIVER(_name, _ids)
 
#define EISA_DRIVER(_name, _ids)
 
#define MCA_DRIVER(_name, _ids)
 
#define ISA_DRIVER(_name, _probe_addrs, _probe_addr, _vendor_id, _prod_id)
 
#define DRIVER(_name_text, _unused2, _unused3, _name, _probe, _disable, _fake_bss)
 

Typedefs

typedef enum duplex duplex_t
 

Enumerations

enum  irq_action_t { DISABLE = 0, ENABLE, FORCE }
 
enum  duplex { HALF_DUPLEX = 1, FULL_DUPLEX }
 

Functions

 FILE_LICENCE (GPL2_OR_LATER)
 
static int eth_poll (int retrieve)
 
static void eth_transmit (const char *dest, unsigned int type, unsigned int size, const void *packet)
 
int dummy_connect (struct nic *nic)
 
void dummy_irq (struct nic *nic, irq_action_t irq_action)
 
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))
 
static void legacy_pci_set_drvdata (void *hwdev, void *priv)
 
static void * legacy_pci_get_drvdata (void *hwdev)
 
static void legacy_isapnp_set_drvdata (void *hwdev, void *priv)
 
static void * legacy_isapnp_get_drvdata (void *hwdev)
 
static void legacy_eisa_set_drvdata (void *hwdev, void *priv)
 
static void * legacy_eisa_get_drvdata (void *hwdev)
 
static void legacy_mca_set_drvdata (void *hwdev, void *priv)
 
static void * legacy_mca_get_drvdata (void *hwdev)
 
static void legacy_isa_set_drvdata (void *hwdev, void *priv)
 
static void * legacy_isa_get_drvdata (void *hwdev)
 

Variables

struct {
no_fake_bss
 
struct nic legacy_nic
 

Macro Definition Documentation

◆ NIC_H

#define NIC_H

Definition at line 21 of file nic.h.

◆ NIC_FAKE_BSS_PTR

#define NIC_FAKE_BSS_PTR (   type)    ( ( type * ) legacy_nic.fake_bss )

Definition at line 64 of file nic.h.

◆ NIC_FAKE_BSS

#define NIC_FAKE_BSS (   type)    ( * NIC_FAKE_BSS_PTR ( type ) )

Definition at line 65 of file nic.h.

◆ PCI_DRIVER

#define PCI_DRIVER (   _name,
  _ids,
  _class 
)
Value:
static inline int \
_name ## _pci_legacy_probe ( struct pci_device *pci ); \
static inline void \
_name ## _pci_legacy_remove ( struct pci_device *pci ); \
struct pci_driver _name __pci_driver = { \
.ids = _ids, \
.id_count = sizeof ( _ids ) / sizeof ( _ids[0] ), \
.probe = _name ## _pci_legacy_probe, \
.remove = _name ## _pci_legacy_remove, \
}; \
REQUIRE_OBJECT ( pci );
A PCI driver.
Definition: pci.h:251
#define __pci_driver
Declare a PCI driver.
Definition: pci.h:277
A PCI device.
Definition: pci.h:210

Definition at line 105 of file nic.h.

◆ ISAPNP_DRIVER

#define ISAPNP_DRIVER (   _name,
  _ids 
)
Value:
static inline int \
_name ## _isapnp_legacy_probe ( struct isapnp_device *isapnp, \
const struct isapnp_device_id *id ); \
static inline void \
_name ## _isapnp_legacy_remove ( struct isapnp_device *isapnp ); \
struct isapnp_driver _name __isapnp_driver = { \
.ids = _ids, \
.id_count = sizeof ( _ids ) / sizeof ( _ids[0] ), \
.probe = _name ## _isapnp_legacy_probe, \
.remove = _name ## _isapnp_legacy_remove, \
}; \
REQUIRE_OBJECT ( isapnp );
An ISAPnP driver.
Definition: isapnp.h:209
An ISAPnP device ID list entry.
Definition: isapnp.h:173
An ISAPnP device.
Definition: isapnp.h:183
#define __isapnp_driver
Declare an ISAPnP driver.
Definition: isapnp.h:235

Definition at line 125 of file nic.h.

◆ EISA_DRIVER

#define EISA_DRIVER (   _name,
  _ids 
)
Value:
static inline int \
_name ## _eisa_legacy_probe ( struct eisa_device *eisa, \
const struct eisa_device_id *id ); \
static inline void \
_name ## _eisa_legacy_remove ( struct eisa_device *eisa ); \
struct eisa_driver _name __eisa_driver = { \
.ids = _ids, \
.id_count = sizeof ( _ids ) / sizeof ( _ids[0] ), \
.probe = _name ## _eisa_legacy_probe, \
.remove = _name ## _eisa_legacy_remove, \
}; \
REQUIRE_OBJECT ( eisa );
#define __eisa_driver
Declare an EISA driver.
Definition: eisa.h:86
An EISA device.
Definition: eisa.h:38
An EISA device ID list entry.
Definition: eisa.h:28
An EISA driver.
Definition: eisa.h:60

Definition at line 146 of file nic.h.

◆ MCA_DRIVER

#define MCA_DRIVER (   _name,
  _ids 
)
Value:
static inline int \
_name ## _mca_legacy_probe ( struct mca_device *mca, \
const struct mca_device_id *id ); \
static inline void \
_name ## _mca_legacy_remove ( struct mca_device *mca ); \
struct mca_driver _name __mca_driver = { \
.ids = _ids, \
.id_count = sizeof ( _ids ) / sizeof ( _ids[0] ), \
.probe = _name ## _mca_legacy_probe, \
.remove = _name ## _mca_legacy_remove, \
}; \
REQUIRE_OBJECT ( mca );
An MCA driver.
Definition: mca.h:58
An MCA device.
Definition: mca.h:38
#define __mca_driver
Declare an MCA driver.
Definition: mca.h:84
An MCA device ID list entry.
Definition: mca.h:30

Definition at line 167 of file nic.h.

◆ ISA_DRIVER

#define ISA_DRIVER (   _name,
  _probe_addrs,
  _probe_addr,
  _vendor_id,
  _prod_id 
)
Value:
static inline int \
_name ## _isa_legacy_probe ( struct isa_device *isa ); \
static inline int \
_name ## _isa_legacy_probe_at_addr ( struct isa_device *isa ) { \
if ( ! _probe_addr ( isa->ioaddr ) ) \
return -ENODEV; \
return _name ## _isa_legacy_probe ( isa ); \
} \
static inline void \
_name ## _isa_legacy_remove ( struct isa_device *isa ); \
static const char _name ## _text[]; \
struct isa_driver _name __isa_driver = { \
.name = _name ## _text, \
.probe_addrs = _probe_addrs, \
.addr_count = ( sizeof ( _probe_addrs ) / \
sizeof ( _probe_addrs[0] ) ), \
.vendor_id = _vendor_id, \
.prod_id = _prod_id, \
.probe = _name ## _isa_legacy_probe_at_addr, \
.remove = _name ## _isa_legacy_remove, \
}; \
REQUIRE_OBJECT ( isa );
uint16_t ioaddr
I/O address.
Definition: isa.h:16
An ISA device.
Definition: isa.h:12
uint8_t vendor_id[3]
Definition: ib_mad.h:22
#define ENODEV
No such device.
Definition: errno.h:509
#define __isa_driver
Declare an ISA driver.
Definition: isa.h:65
An ISA driver.
Definition: isa.h:34

Definition at line 188 of file nic.h.

◆ DRIVER

#define DRIVER (   _name_text,
  _unused2,
  _unused3,
  _name,
  _probe,
  _disable,
  _fake_bss 
)

Definition at line 220 of file nic.h.

Typedef Documentation

◆ duplex_t

typedef enum duplex duplex_t

Enumeration Type Documentation

◆ irq_action_t

Enumerator
DISABLE 
ENABLE 
FORCE 

Definition at line 34 of file nic.h.

34  {
35  DISABLE = 0,
36  ENABLE,
37  FORCE
38 } irq_action_t;
Definition: nic.h:35
irq_action_t
Definition: nic.h:34
Definition: nic.h:37
Definition: nic.h:36

◆ duplex

enum duplex
Enumerator
HALF_DUPLEX 
FULL_DUPLEX 

Definition at line 40 of file nic.h.

40  {
41  HALF_DUPLEX = 1,
43 } duplex_t;
enum duplex duplex_t

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER  )

◆ eth_poll()

static int eth_poll ( int  retrieve)
inlinestatic

Definition at line 78 of file nic.h.

78  {
79  struct nic *nic = &legacy_nic;
80  return nic->nic_op->poll ( nic, retrieve );
81 }
int(* poll)(struct nic *, int retrieve)
Definition: nic.h:70
struct nic legacy_nic
Definition: legacy.c:22
Definition: nic.h:49
struct nic_operations * nic_op
Definition: nic.h:50

References legacy_nic, nic::nic_op, and nic_operations::poll.

◆ eth_transmit()

static void eth_transmit ( const char *  dest,
unsigned int  type,
unsigned int  size,
const void *  packet 
)
inlinestatic

Definition at line 83 of file nic.h.

84  {
85  struct nic *nic = &legacy_nic;
87 }
uint32_t type
Operating system type.
Definition: ena.h:12
uint16_t size
Buffer size.
Definition: dwmac.h:14
void(* transmit)(struct nic *, const char *, unsigned int, unsigned int, const char *)
Definition: nic.h:71
struct nic legacy_nic
Definition: legacy.c:22
Definition: nic.h:49
unsigned char * packet
Definition: nic.h:53
if(len >=6 *4) __asm__ __volatile__("movsl" if(len >=5 *4) __asm__ __volatile__("movsl" if(len >=4 *4) __asm__ __volatile__("movsl" if(len >=3 *4) __asm__ __volatile__("movsl" if(len >=2 *4) __asm__ __volatile__("movsl" if(len >=1 *4) __asm__ __volatile__("movsl" if((len % 4) >=2) __asm__ __volatile__("movsw" if((len % 2) >=1) __asm__ __volatile__("movsb" return dest
Definition: string.h:150
struct nic_operations * nic_op
Definition: nic.h:50

References dest, legacy_nic, nic::nic_op, nic::packet, size, nic_operations::transmit, and type.

◆ dummy_connect()

int dummy_connect ( struct nic nic)

◆ dummy_irq()

void dummy_irq ( struct nic nic,
irq_action_t  irq_action 
)

◆ 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().

◆ legacy_pci_set_drvdata()

static void legacy_pci_set_drvdata ( void *  hwdev,
void *  priv 
)
inlinestatic

Definition at line 118 of file nic.h.

118  {
119  pci_set_drvdata ( hwdev, priv );
120 }
static void pci_set_drvdata(struct pci_device *pci, void *priv)
Set PCI driver-private data.
Definition: pci.h:365
static struct tlan_private * priv
Definition: tlan.c:225

References pci_set_drvdata(), and priv.

◆ legacy_pci_get_drvdata()

static void* legacy_pci_get_drvdata ( void *  hwdev)
inlinestatic

Definition at line 121 of file nic.h.

121  {
122  return pci_get_drvdata ( hwdev );
123 }
static void * pci_get_drvdata(struct pci_device *pci)
Get PCI driver-private data.
Definition: pci.h:375

References pci_get_drvdata().

◆ legacy_isapnp_set_drvdata()

static void legacy_isapnp_set_drvdata ( void *  hwdev,
void *  priv 
)
inlinestatic

Definition at line 139 of file nic.h.

139  {
140  isapnp_set_drvdata ( hwdev, priv );
141 }
static void isapnp_set_drvdata(struct isapnp_device *isapnp, void *priv)
Set ISAPnP driver-private data.
Definition: isapnp.h:266
static struct tlan_private * priv
Definition: tlan.c:225

References isapnp_set_drvdata(), and priv.

◆ legacy_isapnp_get_drvdata()

static void* legacy_isapnp_get_drvdata ( void *  hwdev)
inlinestatic

Definition at line 142 of file nic.h.

142  {
143  return isapnp_get_drvdata ( hwdev );
144 }
static void * isapnp_get_drvdata(struct isapnp_device *isapnp)
Get ISAPnP driver-private data.
Definition: isapnp.h:277

References isapnp_get_drvdata().

◆ legacy_eisa_set_drvdata()

static void legacy_eisa_set_drvdata ( void *  hwdev,
void *  priv 
)
inlinestatic

Definition at line 160 of file nic.h.

160  {
161  eisa_set_drvdata ( hwdev, priv );
162 }
static void eisa_set_drvdata(struct eisa_device *eisa, void *priv)
Set EISA driver-private data.
Definition: eisa.h:114
static struct tlan_private * priv
Definition: tlan.c:225

References eisa_set_drvdata(), and priv.

◆ legacy_eisa_get_drvdata()

static void* legacy_eisa_get_drvdata ( void *  hwdev)
inlinestatic

Definition at line 163 of file nic.h.

163  {
164  return eisa_get_drvdata ( hwdev );
165 }
static void * eisa_get_drvdata(struct eisa_device *eisa)
Get EISA driver-private data.
Definition: eisa.h:124

References eisa_get_drvdata().

◆ legacy_mca_set_drvdata()

static void legacy_mca_set_drvdata ( void *  hwdev,
void *  priv 
)
inlinestatic

Definition at line 181 of file nic.h.

181  {
182  mca_set_drvdata ( hwdev, priv );
183 }
static void mca_set_drvdata(struct mca_device *mca, void *priv)
Set MCA driver-private data.
Definition: mca.h:92
static struct tlan_private * priv
Definition: tlan.c:225

References mca_set_drvdata(), and priv.

◆ legacy_mca_get_drvdata()

static void* legacy_mca_get_drvdata ( void *  hwdev)
inlinestatic

Definition at line 184 of file nic.h.

184  {
185  return mca_get_drvdata ( hwdev );
186 }
static void * mca_get_drvdata(struct mca_device *mca)
Get MCA driver-private data.
Definition: mca.h:102

References mca_get_drvdata().

◆ legacy_isa_set_drvdata()

static void legacy_isa_set_drvdata ( void *  hwdev,
void *  priv 
)
inlinestatic

Definition at line 212 of file nic.h.

212  {
213  isa_set_drvdata ( hwdev, priv );
214 }
static void isa_set_drvdata(struct isa_device *isa, void *priv)
Set ISA driver-private data.
Definition: isa.h:73
static struct tlan_private * priv
Definition: tlan.c:225

References isa_set_drvdata(), and priv.

◆ legacy_isa_get_drvdata()

static void* legacy_isa_get_drvdata ( void *  hwdev)
inlinestatic

Definition at line 215 of file nic.h.

215  {
216  return isa_get_drvdata ( hwdev );
217 }
static void * isa_get_drvdata(struct isa_device *isa)
Get ISA driver-private data.
Definition: isa.h:83

References isa_get_drvdata().

Variable Documentation

◆ no_fake_bss

struct { ... } no_fake_bss

◆ legacy_nic

struct nic legacy_nic

Definition at line 22 of file legacy.c.

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