iPXE
Functions | Variables
intel.c File Reference

Intel 10/100/1000 network card driver. More...

#include <stdint.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <byteswap.h>
#include <ipxe/netdevice.h>
#include <ipxe/ethernet.h>
#include <ipxe/if_ether.h>
#include <ipxe/iobuf.h>
#include <ipxe/malloc.h>
#include <ipxe/pci.h>
#include <ipxe/profile.h>
#include "intel.h"

Go to the source code of this file.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
static int intel_read_eeprom (struct nvs_device *nvs, unsigned int address, void *data, size_t len)
 Read data from EEPROM. More...
 
static int intel_write_eeprom (struct nvs_device *nvs, unsigned int address __unused, const void *data __unused, size_t len __unused)
 Write data to EEPROM. More...
 
static int intel_init_eeprom (struct intel_nic *intel)
 Initialise EEPROM. More...
 
static int intel_fetch_mac_eeprom (struct intel_nic *intel, uint8_t *hw_addr)
 Fetch initial MAC address from EEPROM. More...
 
static int intel_fetch_mac (struct intel_nic *intel, uint8_t *hw_addr)
 Fetch initial MAC address. More...
 
static int intel_reset (struct intel_nic *intel)
 Reset hardware. More...
 
static void intel_check_link (struct net_device *netdev)
 Check link state. More...
 
void intel_describe_tx (struct intel_descriptor *tx, physaddr_t addr, size_t len)
 Populate transmit descriptor. More...
 
void intel_describe_tx_adv (struct intel_descriptor *tx, physaddr_t addr, size_t len)
 Populate advanced transmit descriptor. More...
 
void intel_describe_rx (struct intel_descriptor *rx, physaddr_t addr, size_t len __unused)
 Populate receive descriptor. More...
 
static int intel_disable_ring (struct intel_nic *intel, unsigned int reg)
 Disable descriptor ring. More...
 
void intel_reset_ring (struct intel_nic *intel, unsigned int reg)
 Reset descriptor ring. More...
 
int intel_create_ring (struct intel_nic *intel, struct intel_ring *ring)
 Create descriptor ring. More...
 
void intel_destroy_ring (struct intel_nic *intel, struct intel_ring *ring)
 Destroy descriptor ring. More...
 
void intel_refill_rx (struct intel_nic *intel)
 Refill receive descriptor ring. More...
 
void intel_empty_rx (struct intel_nic *intel)
 Discard unused receive I/O buffers. More...
 
static int intel_open (struct net_device *netdev)
 Open network device. More...
 
static void intel_close (struct net_device *netdev)
 Close network device. More...
 
int intel_transmit (struct net_device *netdev, struct io_buffer *iobuf)
 Transmit packet. More...
 
void intel_poll_tx (struct net_device *netdev)
 Poll for completed packets. More...
 
void intel_poll_rx (struct net_device *netdev)
 Poll for received packets. More...
 
static void intel_poll (struct net_device *netdev)
 Poll for completed and received packets. More...
 
static void intel_irq (struct net_device *netdev, int enable)
 Enable or disable interrupts. More...
 
static int intel_probe (struct pci_device *pci)
 Probe PCI device. More...
 
static void intel_remove (struct pci_device *pci)
 Remove PCI device. More...
 

Variables

static struct profiler intel_vm_tx_profiler __profiler
 VM transmit profiler. More...
 
static struct net_device_operations intel_operations
 Intel network device operations. More...
 
static struct pci_device_id intel_nics []
 Intel PCI device IDs. More...
 
struct pci_driver intel_driver __pci_driver
 Intel PCI driver. More...
 

Detailed Description

Intel 10/100/1000 network card driver.

Definition in file intel.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ intel_read_eeprom()

static int intel_read_eeprom ( struct nvs_device nvs,
unsigned int  address,
void *  data,
size_t  len 
)
static

Read data from EEPROM.

Parameters
nvsNVS device
addressAddress from which to read
dataData buffer
lenLength of data buffer
Return values
rcReturn status code

Definition at line 74 of file intel.c.

75  {
76  struct intel_nic *intel =
77  container_of ( nvs, struct intel_nic, eeprom );
78  unsigned int i;
80  uint16_t *data_word = data;
81 
82  /* Sanity check. We advertise a blocksize of one word, so
83  * should only ever receive single-word requests.
84  */
85  assert ( len == sizeof ( *data_word ) );
86 
87  /* Initiate read */
88  writel ( ( INTEL_EERD_START | ( address << intel->eerd_addr_shift ) ),
89  intel->regs + INTEL_EERD );
90 
91  /* Wait for read to complete */
92  for ( i = 0 ; i < INTEL_EEPROM_MAX_WAIT_MS ; i++ ) {
93 
94  /* If read is not complete, delay 1ms and retry */
95  value = readl ( intel->regs + INTEL_EERD );
96  if ( ! ( value & intel->eerd_done ) ) {
97  mdelay ( 1 );
98  continue;
99  }
100 
101  /* Extract data */
102  *data_word = cpu_to_le16 ( INTEL_EERD_DATA ( value ) );
103  return 0;
104  }
105 
106  DBGC ( intel, "INTEL %p timed out waiting for EEPROM read\n", intel );
107  return -ETIMEDOUT;
108 }
void * regs
Registers.
Definition: intel.h:280
unsigned short uint16_t
Definition: stdint.h:11
#define INTEL_EERD
EEPROM Read Register.
Definition: intel.h:76
uint64_t address
Base address.
Definition: ena.h:24
uint32_t readl(volatile uint32_t *io_addr)
Read 32-bit dword from memory-mapped device.
#define DBGC(...)
Definition: compiler.h:505
eeprom
Definition: 3c90x.h:232
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
#define INTEL_EERD_DATA(value)
Read data.
Definition: intel.h:82
void writel(uint32_t data, volatile uint32_t *io_addr)
Write 32-bit dword to memory-mapped device.
uint32_t eerd_done
EEPROM done flag.
Definition: intel.h:291
pseudo_bit_t value[0x00020]
Definition: arbel.h:13
#define INTEL_EEPROM_MAX_WAIT_MS
Maximum time to wait for EEPROM read, in milliseconds.
Definition: intel.h:85
unsigned int uint32_t
Definition: stdint.h:12
void mdelay(unsigned long msecs)
Delay for a fixed number of milliseconds.
Definition: timer.c:78
uint32_t len
Length.
Definition: ena.h:14
#define cpu_to_le16(value)
Definition: byteswap.h:106
An Intel network card.
Definition: intel.h:278
#define INTEL_EERD_START
Start read.
Definition: intel.h:77
unsigned int eerd_addr_shift
EEPROM address shift.
Definition: intel.h:293
struct arbelprm_port_state_change_st data
Message.
Definition: arbel.h:12
#define ETIMEDOUT
Connection timed out.
Definition: errno.h:669

References address, assert(), container_of, cpu_to_le16, data, DBGC, intel_nic::eerd_addr_shift, intel_nic::eerd_done, ETIMEDOUT, INTEL_EEPROM_MAX_WAIT_MS, INTEL_EERD, INTEL_EERD_DATA, INTEL_EERD_START, len, mdelay(), readl(), intel_nic::regs, value, and writel().

Referenced by intel_init_eeprom().

◆ intel_write_eeprom()

static int intel_write_eeprom ( struct nvs_device nvs,
unsigned int address  __unused,
const void *data  __unused,
size_t len  __unused 
)
static

Write data to EEPROM.

Parameters
nvsNVS device
addressAddress to which to write
dataData buffer
lenLength of data buffer
Return values
rcReturn status code

Definition at line 119 of file intel.c.

122  {
123  struct intel_nic *intel =
124  container_of ( nvs, struct intel_nic, eeprom );
125 
126  DBGC ( intel, "INTEL %p EEPROM write not supported\n", intel );
127  return -ENOTSUP;
128 }
#define DBGC(...)
Definition: compiler.h:505
#define ENOTSUP
Operation not supported.
Definition: errno.h:589
eeprom
Definition: 3c90x.h:232
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
An Intel network card.
Definition: intel.h:278

References container_of, DBGC, and ENOTSUP.

Referenced by intel_init_eeprom().

◆ intel_init_eeprom()

static int intel_init_eeprom ( struct intel_nic intel)
static

Initialise EEPROM.

Parameters
intelIntel device
Return values
rcReturn status code

Definition at line 136 of file intel.c.

136  {
137  unsigned int i;
138  uint32_t value;
139 
140  /* The NIC automatically detects the type of attached EEPROM.
141  * The EERD register provides access to only a single word at
142  * a time, so we pretend to have a single-word block size.
143  *
144  * The EEPROM size may be larger than the minimum size, but
145  * this doesn't matter to us since we access only the first
146  * few words.
147  */
150  intel->eeprom.block_size = 1;
151  intel->eeprom.read = intel_read_eeprom;
153 
154  /* The layout of the EERD register was changed at some point
155  * to accommodate larger EEPROMs. Read from address zero (for
156  * which the request layouts are compatible) to determine
157  * which type of register we have.
158  */
159  writel ( INTEL_EERD_START, intel->regs + INTEL_EERD );
160  for ( i = 0 ; i < INTEL_EEPROM_MAX_WAIT_MS ; i++ ) {
161  value = readl ( intel->regs + INTEL_EERD );
162  if ( value & INTEL_EERD_DONE_LARGE ) {
163  DBGC ( intel, "INTEL %p has large-format EERD\n",
164  intel );
167  return 0;
168  }
169  if ( value & INTEL_EERD_DONE_SMALL ) {
170  DBGC ( intel, "INTEL %p has small-format EERD\n",
171  intel );
174  return 0;
175  }
176  mdelay ( 1 );
177  }
178 
179  DBGC ( intel, "INTEL %p timed out waiting for initial EEPROM read "
180  "(value %08x)\n", intel, value );
181  return -ETIMEDOUT;
182 }
void * regs
Registers.
Definition: intel.h:280
int(* write)(struct nvs_device *nvs, unsigned int address, const void *data, size_t len)
Write data to device.
Definition: nvs.h:59
unsigned int word_len_log2
Word length.
Definition: nvs.h:22
#define INTEL_EERD
EEPROM Read Register.
Definition: intel.h:76
#define INTEL_EERD_DONE_SMALL
Read done (small EERD)
Definition: intel.h:78
uint32_t readl(volatile uint32_t *io_addr)
Read 32-bit dword from memory-mapped device.
#define DBGC(...)
Definition: compiler.h:505
unsigned int block_size
Data block size (in words)
Definition: nvs.h:36
void writel(uint32_t data, volatile uint32_t *io_addr)
Write 32-bit dword to memory-mapped device.
uint32_t eerd_done
EEPROM done flag.
Definition: intel.h:291
#define INTEL_EEPROM_WORD_LEN_LOG2
EEPROM word length.
Definition: intel.h:88
#define INTEL_EERD_ADDR_SHIFT_SMALL
Address shift (small)
Definition: intel.h:80
int(* read)(struct nvs_device *nvs, unsigned int address, void *data, size_t len)
Read data from device.
Definition: nvs.h:47
pseudo_bit_t value[0x00020]
Definition: arbel.h:13
static int intel_write_eeprom(struct nvs_device *nvs, unsigned int address __unused, const void *data __unused, size_t len __unused)
Write data to EEPROM.
Definition: intel.c:119
#define INTEL_EEPROM_MAX_WAIT_MS
Maximum time to wait for EEPROM read, in milliseconds.
Definition: intel.h:85
unsigned int uint32_t
Definition: stdint.h:12
void mdelay(unsigned long msecs)
Delay for a fixed number of milliseconds.
Definition: timer.c:78
#define INTEL_EERD_DONE_LARGE
Read done (large EERD)
Definition: intel.h:79
#define INTEL_EERD_ADDR_SHIFT_LARGE
Address shift (large)
Definition: intel.h:81
static int intel_read_eeprom(struct nvs_device *nvs, unsigned int address, void *data, size_t len)
Read data from EEPROM.
Definition: intel.c:74
#define INTEL_EERD_START
Start read.
Definition: intel.h:77
unsigned int eerd_addr_shift
EEPROM address shift.
Definition: intel.h:293
#define INTEL_EEPROM_MIN_SIZE_WORDS
Minimum EEPROM size, in words.
Definition: intel.h:91
struct nvs_device eeprom
EEPROM.
Definition: intel.h:289
#define ETIMEDOUT
Connection timed out.
Definition: errno.h:669
unsigned int size
Device size (in words)
Definition: nvs.h:24

References nvs_device::block_size, DBGC, intel_nic::eeprom, intel_nic::eerd_addr_shift, intel_nic::eerd_done, ETIMEDOUT, INTEL_EEPROM_MAX_WAIT_MS, INTEL_EEPROM_MIN_SIZE_WORDS, INTEL_EEPROM_WORD_LEN_LOG2, INTEL_EERD, INTEL_EERD_ADDR_SHIFT_LARGE, INTEL_EERD_ADDR_SHIFT_SMALL, INTEL_EERD_DONE_LARGE, INTEL_EERD_DONE_SMALL, INTEL_EERD_START, intel_read_eeprom(), intel_write_eeprom(), mdelay(), nvs_device::read, readl(), intel_nic::regs, nvs_device::size, value, nvs_device::word_len_log2, nvs_device::write, and writel().

Referenced by intel_fetch_mac_eeprom().

◆ intel_fetch_mac_eeprom()

static int intel_fetch_mac_eeprom ( struct intel_nic intel,
uint8_t hw_addr 
)
static

Fetch initial MAC address from EEPROM.

Parameters
intelIntel device
hw_addrHardware address to fill in
Return values
rcReturn status code

Definition at line 198 of file intel.c.

199  {
200  int rc;
201 
202  /* Initialise EEPROM */
203  if ( ( rc = intel_init_eeprom ( intel ) ) != 0 )
204  return rc;
205 
206  /* Read base MAC address from EEPROM */
207  if ( ( rc = nvs_read ( &intel->eeprom, INTEL_EEPROM_MAC,
208  hw_addr, ETH_ALEN ) ) != 0 ) {
209  DBGC ( intel, "INTEL %p could not read EEPROM base MAC "
210  "address: %s\n", intel, strerror ( rc ) );
211  return rc;
212  }
213 
214  /* Adjust MAC address for multi-port devices */
215  hw_addr[ETH_ALEN-1] ^= intel->port;
216 
217  DBGC ( intel, "INTEL %p has EEPROM MAC address %s (port %d)\n",
218  intel, eth_ntoa ( hw_addr ), intel->port );
219  return 0;
220 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define DBGC(...)
Definition: compiler.h:505
unsigned int port
Port number (for multi-port devices)
Definition: intel.h:282
#define INTEL_EEPROM_MAC
Offset of MAC address within EEPROM.
Definition: intel.h:94
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
const char * eth_ntoa(const void *ll_addr)
Transcribe Ethernet address.
Definition: ethernet.c:175
#define ETH_ALEN
Definition: if_ether.h:8
int nvs_read(struct nvs_device *nvs, unsigned int address, void *data, size_t len)
Read from non-volatile storage device.
Definition: nvs.c:75
static int intel_init_eeprom(struct intel_nic *intel)
Initialise EEPROM.
Definition: intel.c:136
struct nvs_device eeprom
EEPROM.
Definition: intel.h:289

References DBGC, intel_nic::eeprom, ETH_ALEN, eth_ntoa(), INTEL_EEPROM_MAC, intel_init_eeprom(), nvs_read(), intel_nic::port, rc, and strerror().

Referenced by intel_fetch_mac().

◆ intel_fetch_mac()

static int intel_fetch_mac ( struct intel_nic intel,
uint8_t hw_addr 
)
static

Fetch initial MAC address.

Parameters
intelIntel device
hw_addrHardware address to fill in
Return values
rcReturn status code

Definition at line 229 of file intel.c.

229  {
231  int rc;
232 
233  /* Read current address from RAL0/RAH0 */
234  mac.reg.low = cpu_to_le32 ( readl ( intel->regs + INTEL_RAL0 ) );
235  mac.reg.high = cpu_to_le32 ( readl ( intel->regs + INTEL_RAH0 ) );
236  DBGC ( intel, "INTEL %p has autoloaded MAC address %s\n",
237  intel, eth_ntoa ( mac.raw ) );
238 
239  /* Use current address if valid */
240  if ( is_valid_ether_addr ( mac.raw ) ) {
241  memcpy ( hw_addr, mac.raw, ETH_ALEN );
242  return 0;
243  }
244 
245  /* Otherwise, try to read address from EEPROM */
246  if ( ( rc = intel_fetch_mac_eeprom ( intel, hw_addr ) ) == 0 )
247  return 0;
248 
249  DBGC ( intel, "INTEL %p has no MAC address to use\n", intel );
250  return -ENOENT;
251 }
void * regs
Registers.
Definition: intel.h:280
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
static int intel_fetch_mac_eeprom(struct intel_nic *intel, uint8_t *hw_addr)
Fetch initial MAC address from EEPROM.
Definition: intel.c:198
uint32_t readl(volatile uint32_t *io_addr)
Read 32-bit dword from memory-mapped device.
#define DBGC(...)
Definition: compiler.h:505
#define ENOENT
No such file or directory.
Definition: errno.h:514
uint8_t mac[ETH_ALEN]
MAC address.
Definition: ena.h:24
void * memcpy(void *dest, const void *src, size_t len) __nonnull
#define cpu_to_le32(value)
Definition: byteswap.h:107
const char * eth_ntoa(const void *ll_addr)
Transcribe Ethernet address.
Definition: ethernet.c:175
#define ETH_ALEN
Definition: if_ether.h:8
static int is_valid_ether_addr(const void *addr)
Check if Ethernet address is valid.
Definition: ethernet.h:77
Receive address.
Definition: intel.h:204
#define INTEL_RAL0
Receive Address Low.
Definition: intel.h:193
#define INTEL_RAH0
Receive Address High.
Definition: intel.h:196

References cpu_to_le32, DBGC, ENOENT, ETH_ALEN, eth_ntoa(), intel_fetch_mac_eeprom(), INTEL_RAH0, INTEL_RAL0, is_valid_ether_addr(), mac, memcpy(), rc, readl(), and intel_nic::regs.

Referenced by intel_probe().

◆ intel_reset()

static int intel_reset ( struct intel_nic intel)
static

Reset hardware.

Parameters
intelIntel device
Return values
rcReturn status code

Definition at line 266 of file intel.c.

266  {
267  uint32_t pbs;
268  uint32_t pba;
269  uint32_t ctrl;
271  uint32_t orig_ctrl;
272  uint32_t orig_status;
273 
274  /* Record initial control and status register values */
275  orig_ctrl = ctrl = readl ( intel->regs + INTEL_CTRL );
276  orig_status = readl ( intel->regs + INTEL_STATUS );
277 
278  /* Force RX and TX packet buffer allocation, to work around an
279  * errata in ICH devices.
280  */
281  if ( intel->flags & INTEL_PBS_ERRATA ) {
282  DBGC ( intel, "INTEL %p WARNING: applying ICH PBS/PBA errata\n",
283  intel );
284  pbs = readl ( intel->regs + INTEL_PBS );
285  pba = readl ( intel->regs + INTEL_PBA );
286  writel ( 0x08, intel->regs + INTEL_PBA );
287  writel ( 0x10, intel->regs + INTEL_PBS );
288  DBGC ( intel, "INTEL %p PBS %#08x->%#08x PBA %#08x->%#08x\n",
289  intel, pbs, readl ( intel->regs + INTEL_PBS ),
290  pba, readl ( intel->regs + INTEL_PBA ) );
291  }
292 
293  /* Always reset MAC. Required to reset the TX and RX rings. */
294  writel ( ( ctrl | INTEL_CTRL_RST ), intel->regs + INTEL_CTRL );
296 
297  /* Set a sensible default configuration */
298  if ( ! ( intel->flags & INTEL_NO_ASDE ) )
300  ctrl |= INTEL_CTRL_SLU;
302  writel ( ctrl, intel->regs + INTEL_CTRL );
304 
305  /* On some models (notably ICH), the PHY reset mechanism
306  * appears to be broken. In particular, the PHY_CTRL register
307  * will be correctly loaded from NVM but the values will not
308  * be propagated to the "OEM bits" PHY register. This
309  * typically has the effect of dropping the link speed to
310  * 10Mbps.
311  *
312  * Work around this problem by skipping the PHY reset if
313  * either (a) the link is already up, or (b) this particular
314  * NIC is known to be broken.
315  */
316  status = readl ( intel->regs + INTEL_STATUS );
317  if ( ( intel->flags & INTEL_NO_PHY_RST ) ||
318  ( status & INTEL_STATUS_LU ) ) {
319  DBGC ( intel, "INTEL %p %sMAC reset (%08x/%08x was "
320  "%08x/%08x)\n", intel,
321  ( ( intel->flags & INTEL_NO_PHY_RST ) ? "forced " : "" ),
322  ctrl, status, orig_ctrl, orig_status );
323  return 0;
324  }
325 
326  /* Reset PHY and MAC simultaneously */
328  intel->regs + INTEL_CTRL );
330 
331  /* PHY reset is not self-clearing on all models */
332  writel ( ctrl, intel->regs + INTEL_CTRL );
334  status = readl ( intel->regs + INTEL_STATUS );
335 
336  DBGC ( intel, "INTEL %p MAC+PHY reset (%08x/%08x was %08x/%08x)\n",
337  intel, ctrl, status, orig_ctrl, orig_status );
338  return 0;
339 }
void * regs
Registers.
Definition: intel.h:280
PHY reset is broken.
Definition: intel.h:313
#define INTEL_PBA
Packet Buffer Allocation.
Definition: intel.h:136
ASDE is broken.
Definition: intel.h:315
uint32_t readl(volatile uint32_t *io_addr)
Read 32-bit dword from memory-mapped device.
#define DBGC(...)
Definition: compiler.h:505
#define INTEL_PBS
Packet Buffer Size.
Definition: intel.h:139
PBS/PBA errata workaround required.
Definition: intel.h:309
uint8_t status
Status.
Definition: ena.h:16
#define INTEL_CTRL_FRCDPLX
Force duplex.
Definition: intel.h:64
#define INTEL_CTRL_ASDE
Auto-speed detection.
Definition: intel.h:61
void writel(uint32_t data, volatile uint32_t *io_addr)
Write 32-bit dword to memory-mapped device.
#define INTEL_CTRL_LRST
Link reset.
Definition: intel.h:60
#define INTEL_CTRL_RST
Device reset.
Definition: intel.h:65
#define INTEL_STATUS_LU
Link up.
Definition: intel.h:73
unsigned int uint32_t
Definition: stdint.h:12
#define INTEL_CTRL
Device Control Register.
Definition: intel.h:59
void mdelay(unsigned long msecs)
Delay for a fixed number of milliseconds.
Definition: timer.c:78
static unsigned int ctrl
Definition: intel.h:270
#define INTEL_CTRL_PHY_RST
PHY reset.
Definition: intel.h:66
#define INTEL_RESET_DELAY_MS
Time to delay for device reset, in milliseconds.
Definition: intel.h:69
#define INTEL_CTRL_SLU
Set link up.
Definition: intel.h:62
#define INTEL_STATUS
Device Status Register.
Definition: intel.h:72
unsigned int flags
Flags.
Definition: intel.h:284
#define INTEL_CTRL_FRCSPD
Force speed.
Definition: intel.h:63

References ctrl, DBGC, intel_nic::flags, INTEL_CTRL, INTEL_CTRL_ASDE, INTEL_CTRL_FRCDPLX, INTEL_CTRL_FRCSPD, INTEL_CTRL_LRST, INTEL_CTRL_PHY_RST, INTEL_CTRL_RST, INTEL_CTRL_SLU, INTEL_NO_ASDE, INTEL_NO_PHY_RST, INTEL_PBA, INTEL_PBS, INTEL_PBS_ERRATA, INTEL_RESET_DELAY_MS, INTEL_STATUS, INTEL_STATUS_LU, mdelay(), readl(), intel_nic::regs, status, and writel().

Referenced by intel_close(), intel_probe(), and intel_remove().

◆ intel_check_link()

static void intel_check_link ( struct net_device netdev)
static

Check link state.

Parameters
netdevNetwork device

Definition at line 353 of file intel.c.

353  {
354  struct intel_nic *intel = netdev->priv;
356 
357  /* Read link status */
358  status = readl ( intel->regs + INTEL_STATUS );
359  DBGC ( intel, "INTEL %p link status is %08x\n", intel, status );
360 
361  /* Update network device */
362  if ( status & INTEL_STATUS_LU ) {
364  } else {
366  }
367 }
void * regs
Registers.
Definition: intel.h:280
uint32_t readl(volatile uint32_t *io_addr)
Read 32-bit dword from memory-mapped device.
#define DBGC(...)
Definition: compiler.h:505
void netdev_link_down(struct net_device *netdev)
Mark network device as having link down.
Definition: netdevice.c:186
uint8_t status
Status.
Definition: ena.h:16
void * priv
Driver private data.
Definition: netdevice.h:425
static void netdev_link_up(struct net_device *netdev)
Mark network device as having link up.
Definition: netdevice.h:768
static struct net_device * netdev
Definition: gdbudp.c:52
#define INTEL_STATUS_LU
Link up.
Definition: intel.h:73
unsigned int uint32_t
Definition: stdint.h:12
An Intel network card.
Definition: intel.h:278
#define INTEL_STATUS
Device Status Register.
Definition: intel.h:72

References DBGC, INTEL_STATUS, INTEL_STATUS_LU, netdev, netdev_link_down(), netdev_link_up(), net_device::priv, readl(), intel_nic::regs, and status.

Referenced by intel_open(), intel_poll(), and intel_probe().

◆ intel_describe_tx()

void intel_describe_tx ( struct intel_descriptor tx,
physaddr_t  addr,
size_t  len 
)

Populate transmit descriptor.

Parameters
txTransmit descriptor
addrData buffer address
lenLength of data

Definition at line 383 of file intel.c.

384  {
385 
386  /* Populate transmit descriptor */
387  tx->address = cpu_to_le64 ( addr );
388  tx->length = cpu_to_le16 ( len );
389  tx->flags = 0;
390  tx->command = ( INTEL_DESC_CMD_RS | INTEL_DESC_CMD_IFCS |
392  tx->status = 0;
393 }
#define cpu_to_le64(value)
Definition: byteswap.h:108
#define INTEL_DESC_CMD_IFCS
Insert frame checksum (CRC)
Definition: intel.h:44
uint32_t tx
Maximum number of transmit queues.
Definition: intelvf.h:14
u32 addr
Definition: sky2.h:8
uint32_t len
Length.
Definition: ena.h:14
#define INTEL_DESC_CMD_EOP
End of packet.
Definition: intel.h:47
#define cpu_to_le16(value)
Definition: byteswap.h:106
#define INTEL_DESC_CMD_RS
Report status.
Definition: intel.h:41

References addr, cpu_to_le16, cpu_to_le64, INTEL_DESC_CMD_EOP, INTEL_DESC_CMD_IFCS, INTEL_DESC_CMD_RS, len, and tx.

Referenced by intel_probe(), and intelx_probe().

◆ intel_describe_tx_adv()

void intel_describe_tx_adv ( struct intel_descriptor tx,
physaddr_t  addr,
size_t  len 
)

Populate advanced transmit descriptor.

Parameters
txTransmit descriptor
addrData buffer address
lenLength of data

Definition at line 402 of file intel.c.

403  {
404 
405  /* Populate advanced transmit descriptor */
406  tx->address = cpu_to_le64 ( addr );
407  tx->length = cpu_to_le16 ( len );
408  tx->flags = INTEL_DESC_FL_DTYP_DATA;
409  tx->command = ( INTEL_DESC_CMD_DEXT | INTEL_DESC_CMD_RS |
411  tx->status = cpu_to_le32 ( INTEL_DESC_STATUS_PAYLEN ( len ) );
412 }
#define INTEL_DESC_STATUS_PAYLEN(len)
Payload length.
Definition: intel.h:56
#define cpu_to_le64(value)
Definition: byteswap.h:108
#define INTEL_DESC_FL_DTYP_DATA
Definition: intel.h:35
#define INTEL_DESC_CMD_IFCS
Insert frame checksum (CRC)
Definition: intel.h:44
#define cpu_to_le32(value)
Definition: byteswap.h:107
uint32_t tx
Maximum number of transmit queues.
Definition: intelvf.h:14
u32 addr
Definition: sky2.h:8
uint32_t len
Length.
Definition: ena.h:14
#define INTEL_DESC_CMD_DEXT
Descriptor extension.
Definition: intel.h:38
#define INTEL_DESC_CMD_EOP
End of packet.
Definition: intel.h:47
#define cpu_to_le16(value)
Definition: byteswap.h:106
#define INTEL_DESC_CMD_RS
Report status.
Definition: intel.h:41

References addr, cpu_to_le16, cpu_to_le32, cpu_to_le64, INTEL_DESC_CMD_DEXT, INTEL_DESC_CMD_EOP, INTEL_DESC_CMD_IFCS, INTEL_DESC_CMD_RS, INTEL_DESC_FL_DTYP_DATA, INTEL_DESC_STATUS_PAYLEN, len, and tx.

Referenced by intelxvf_probe().

◆ intel_describe_rx()

void intel_describe_rx ( struct intel_descriptor rx,
physaddr_t  addr,
size_t len  __unused 
)

Populate receive descriptor.

Parameters
rxReceive descriptor
addrData buffer address
lenLength of data

Definition at line 421 of file intel.c.

422  {
423 
424  /* Populate transmit descriptor */
425  rx->address = cpu_to_le64 ( addr );
426  rx->length = 0;
427  rx->status = 0;
428 }
#define cpu_to_le64(value)
Definition: byteswap.h:108
uint32_t rx
Maximum number of receive queues.
Definition: intelvf.h:16
u32 addr
Definition: sky2.h:8

References addr, cpu_to_le64, and rx.

Referenced by intel_probe(), intelx_probe(), and intelxvf_probe().

◆ intel_disable_ring()

static int intel_disable_ring ( struct intel_nic intel,
unsigned int  reg 
)
static

Disable descriptor ring.

Parameters
intelIntel device
regRegister block
Return values
rcReturn status code

Definition at line 444 of file intel.c.

444  {
445  uint32_t dctl;
446  unsigned int i;
447 
448  /* Disable ring */
449  writel ( 0, ( intel->regs + reg + INTEL_xDCTL ) );
450 
451  /* Wait for disable to complete */
452  for ( i = 0 ; i < INTEL_DISABLE_MAX_WAIT_MS ; i++ ) {
453 
454  /* Check if ring is disabled */
455  dctl = readl ( intel->regs + reg + INTEL_xDCTL );
456  if ( ! ( dctl & INTEL_xDCTL_ENABLE ) )
457  return 0;
458 
459  /* Delay */
460  mdelay ( 1 );
461  }
462 
463  DBGC ( intel, "INTEL %p ring %05x timed out waiting for disable "
464  "(dctl %08x)\n", intel, reg, dctl );
465  return -ETIMEDOUT;
466 }
void * regs
Registers.
Definition: intel.h:280
#define INTEL_xDCTL
Receive/Transmit Descriptor Control (offset)
Definition: intel.h:186
uint32_t readl(volatile uint32_t *io_addr)
Read 32-bit dword from memory-mapped device.
#define DBGC(...)
Definition: compiler.h:505
void writel(uint32_t data, volatile uint32_t *io_addr)
Write 32-bit dword to memory-mapped device.
static unsigned int unsigned int reg
Definition: intel.h:245
#define INTEL_DISABLE_MAX_WAIT_MS
Maximum time to wait for queue disable, in milliseconds.
Definition: intel.h:190
unsigned int uint32_t
Definition: stdint.h:12
void mdelay(unsigned long msecs)
Delay for a fixed number of milliseconds.
Definition: timer.c:78
#define INTEL_xDCTL_ENABLE
Queue enable.
Definition: intel.h:187
#define ETIMEDOUT
Connection timed out.
Definition: errno.h:669

References DBGC, ETIMEDOUT, INTEL_DISABLE_MAX_WAIT_MS, INTEL_xDCTL, INTEL_xDCTL_ENABLE, mdelay(), readl(), reg, intel_nic::regs, and writel().

Referenced by intel_reset_ring().

◆ intel_reset_ring()

void intel_reset_ring ( struct intel_nic intel,
unsigned int  reg 
)

Reset descriptor ring.

Parameters
intelIntel device
regRegister block
Return values
rcReturn status code

Definition at line 475 of file intel.c.

475  {
476 
477  /* Disable ring. Ignore errors and continue to reset the ring anyway */
478  intel_disable_ring ( intel, reg );
479 
480  /* Clear ring length */
481  writel ( 0, ( intel->regs + reg + INTEL_xDLEN ) );
482 
483  /* Clear ring address */
484  writel ( 0, ( intel->regs + reg + INTEL_xDBAH ) );
485  writel ( 0, ( intel->regs + reg + INTEL_xDBAL ) );
486 
487  /* Reset head and tail pointers */
488  writel ( 0, ( intel->regs + reg + INTEL_xDH ) );
489  writel ( 0, ( intel->regs + reg + INTEL_xDT ) );
490 }
void * regs
Registers.
Definition: intel.h:280
#define INTEL_xDT
Receive/Transmit Descriptor Tail (offset)
Definition: intel.h:183
#define INTEL_xDLEN
Receive/Transmit Descriptor Length (offset)
Definition: intel.h:177
#define INTEL_xDH
Receive/Transmit Descriptor Head (offset)
Definition: intel.h:180
#define INTEL_xDBAL
Receive/Transmit Descriptor Base Address Low (offset)
Definition: intel.h:171
void writel(uint32_t data, volatile uint32_t *io_addr)
Write 32-bit dword to memory-mapped device.
static unsigned int unsigned int reg
Definition: intel.h:245
static int intel_disable_ring(struct intel_nic *intel, unsigned int reg)
Disable descriptor ring.
Definition: intel.c:444
#define INTEL_xDBAH
Receive/Transmit Descriptor Base Address High (offset)
Definition: intel.h:174

References intel_disable_ring(), INTEL_xDBAH, INTEL_xDBAL, INTEL_xDH, INTEL_xDLEN, INTEL_xDT, reg, intel_nic::regs, and writel().

Referenced by intel_destroy_ring(), and intelxvf_open().

◆ intel_create_ring()

int intel_create_ring ( struct intel_nic intel,
struct intel_ring ring 
)

Create descriptor ring.

Parameters
intelIntel device
ringDescriptor ring
Return values
rcReturn status code

Definition at line 499 of file intel.c.

499  {
501  uint32_t dctl;
502 
503  /* Allocate descriptor ring. Align ring on its own size to
504  * prevent any possible page-crossing errors due to hardware
505  * errata.
506  */
507  ring->desc = malloc_dma ( ring->len, ring->len );
508  if ( ! ring->desc )
509  return -ENOMEM;
510 
511  /* Initialise descriptor ring */
512  memset ( ring->desc, 0, ring->len );
513 
514  /* Program ring address */
515  address = virt_to_bus ( ring->desc );
516  writel ( ( address & 0xffffffffUL ),
517  ( intel->regs + ring->reg + INTEL_xDBAL ) );
518  if ( sizeof ( physaddr_t ) > sizeof ( uint32_t ) ) {
519  writel ( ( ( ( uint64_t ) address ) >> 32 ),
520  ( intel->regs + ring->reg + INTEL_xDBAH ) );
521  } else {
522  writel ( 0, intel->regs + ring->reg + INTEL_xDBAH );
523  }
524 
525  /* Program ring length */
526  writel ( ring->len, ( intel->regs + ring->reg + INTEL_xDLEN ) );
527 
528  /* Reset head and tail pointers */
529  writel ( 0, ( intel->regs + ring->reg + INTEL_xDH ) );
530  writel ( 0, ( intel->regs + ring->reg + INTEL_xDT ) );
531 
532  /* Enable ring */
533  dctl = readl ( intel->regs + ring->reg + INTEL_xDCTL );
534  dctl |= INTEL_xDCTL_ENABLE;
535  writel ( dctl, intel->regs + ring->reg + INTEL_xDCTL );
536 
537  DBGC ( intel, "INTEL %p ring %05x is at [%08llx,%08llx)\n",
538  intel, ring->reg, ( ( unsigned long long ) address ),
539  ( ( unsigned long long ) address + ring->len ) );
540 
541  return 0;
542 }
void * regs
Registers.
Definition: intel.h:280
#define INTEL_xDCTL
Receive/Transmit Descriptor Control (offset)
Definition: intel.h:186
uint64_t address
Base address.
Definition: ena.h:24
uint32_t readl(volatile uint32_t *io_addr)
Read 32-bit dword from memory-mapped device.
#define DBGC(...)
Definition: compiler.h:505
#define INTEL_xDT
Receive/Transmit Descriptor Tail (offset)
Definition: intel.h:183
size_t len
Length (in bytes)
Definition: intel.h:224
unsigned long long uint64_t
Definition: stdint.h:13
#define INTEL_xDLEN
Receive/Transmit Descriptor Length (offset)
Definition: intel.h:177
unsigned int reg
Register block.
Definition: intel.h:222
#define INTEL_xDH
Receive/Transmit Descriptor Head (offset)
Definition: intel.h:180
#define ENOMEM
Not enough space.
Definition: errno.h:534
#define INTEL_xDBAL
Receive/Transmit Descriptor Base Address Low (offset)
Definition: intel.h:171
static __always_inline unsigned long virt_to_bus(volatile const void *addr)
Convert virtual address to a bus address.
Definition: io.h:183
void writel(uint32_t data, volatile uint32_t *io_addr)
Write 32-bit dword to memory-mapped device.
unsigned int uint32_t
Definition: stdint.h:12
unsigned long physaddr_t
Definition: stdint.h:20
static void *__malloc malloc_dma(size_t size, size_t phys_align)
Allocate memory for DMA.
Definition: malloc.h:66
#define INTEL_xDCTL_ENABLE
Queue enable.
Definition: intel.h:187
struct intel_descriptor * desc
Descriptors.
Definition: intel.h:215
#define INTEL_xDBAH
Receive/Transmit Descriptor Base Address High (offset)
Definition: intel.h:174
void * memset(void *dest, int character, size_t len) __nonnull

References address, DBGC, intel_ring::desc, ENOMEM, INTEL_xDBAH, INTEL_xDBAL, INTEL_xDCTL, INTEL_xDCTL_ENABLE, INTEL_xDH, INTEL_xDLEN, INTEL_xDT, intel_ring::len, malloc_dma(), memset(), readl(), intel_ring::reg, intel_nic::regs, virt_to_bus(), and writel().

Referenced by intel_open(), intelx_open(), and intelxvf_open().

◆ intel_destroy_ring()

void intel_destroy_ring ( struct intel_nic intel,
struct intel_ring ring 
)

Destroy descriptor ring.

Parameters
intelIntel device
ringDescriptor ring

Definition at line 550 of file intel.c.

550  {
551 
552  /* Reset ring */
553  intel_reset_ring ( intel, ring->reg );
554 
555  /* Free descriptor ring */
556  free_dma ( ring->desc, ring->len );
557  ring->desc = NULL;
558  ring->prod = 0;
559  ring->cons = 0;
560 }
void intel_reset_ring(struct intel_nic *intel, unsigned int reg)
Reset descriptor ring.
Definition: intel.c:475
size_t len
Length (in bytes)
Definition: intel.h:224
unsigned int cons
Consumer index.
Definition: intel.h:219
unsigned int reg
Register block.
Definition: intel.h:222
unsigned int prod
Producer index.
Definition: intel.h:217
struct intel_descriptor * desc
Descriptors.
Definition: intel.h:215
static void free_dma(void *ptr, size_t size)
Free memory allocated with malloc_dma()
Definition: malloc.h:81
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362

References intel_ring::cons, intel_ring::desc, free_dma(), intel_reset_ring(), intel_ring::len, NULL, intel_ring::prod, and intel_ring::reg.

Referenced by intel_close(), intel_open(), intelx_close(), intelx_open(), intelxvf_close(), and intelxvf_open().

◆ intel_refill_rx()

void intel_refill_rx ( struct intel_nic intel)

Refill receive descriptor ring.

Parameters
intelIntel device

Definition at line 567 of file intel.c.

567  {
568  struct intel_descriptor *rx;
569  struct io_buffer *iobuf;
570  unsigned int rx_idx;
571  unsigned int rx_tail;
573  unsigned int refilled = 0;
574 
575  /* Refill ring */
576  while ( ( intel->rx.prod - intel->rx.cons ) < INTEL_RX_FILL ) {
577 
578  /* Allocate I/O buffer */
579  iobuf = alloc_iob ( INTEL_RX_MAX_LEN );
580  if ( ! iobuf ) {
581  /* Wait for next refill */
582  break;
583  }
584 
585  /* Get next receive descriptor */
586  rx_idx = ( intel->rx.prod++ % INTEL_NUM_RX_DESC );
587  rx = &intel->rx.desc[rx_idx];
588 
589  /* Populate receive descriptor */
590  address = virt_to_bus ( iobuf->data );
591  intel->rx.describe ( rx, address, 0 );
592 
593  /* Record I/O buffer */
594  assert ( intel->rx_iobuf[rx_idx] == NULL );
595  intel->rx_iobuf[rx_idx] = iobuf;
596 
597  DBGC2 ( intel, "INTEL %p RX %d is [%llx,%llx)\n", intel, rx_idx,
598  ( ( unsigned long long ) address ),
599  ( ( unsigned long long ) address + INTEL_RX_MAX_LEN ) );
600  refilled++;
601  }
602 
603  /* Push descriptors to card, if applicable */
604  if ( refilled ) {
605  wmb();
606  rx_tail = ( intel->rx.prod % INTEL_NUM_RX_DESC );
607  profile_start ( &intel_vm_refill_profiler );
608  writel ( rx_tail, intel->regs + intel->rx.reg + INTEL_xDT );
609  profile_stop ( &intel_vm_refill_profiler );
610  profile_exclude ( &intel_vm_refill_profiler );
611  }
612 }
void * regs
Registers.
Definition: intel.h:280
wmb()
#define INTEL_NUM_RX_DESC
Number of receive descriptors.
Definition: intel.h:149
uint64_t address
Base address.
Definition: ena.h:24
struct intel_ring rx
Receive descriptor ring.
Definition: intel.h:301
#define INTEL_xDT
Receive/Transmit Descriptor Tail (offset)
Definition: intel.h:183
static void profile_stop(struct profiler *profiler)
Stop profiling.
Definition: profile.h:171
struct io_buffer * alloc_iob(size_t len)
Allocate I/O buffer.
Definition: iobuf.c:128
unsigned int cons
Consumer index.
Definition: intel.h:219
unsigned int reg
Register block.
Definition: intel.h:222
static __always_inline unsigned long virt_to_bus(volatile const void *addr)
Convert virtual address to a bus address.
Definition: io.h:183
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
void writel(uint32_t data, volatile uint32_t *io_addr)
Write 32-bit dword to memory-mapped device.
struct io_buffer * rx_iobuf[INTEL_NUM_RX_DESC]
Receive I/O buffers.
Definition: intel.h:303
static void profile_start(struct profiler *profiler)
Start profiling.
Definition: profile.h:158
uint32_t rx
Maximum number of receive queues.
Definition: intelvf.h:16
#define INTEL_RX_MAX_LEN
Receive buffer length.
Definition: intel.h:155
void(* describe)(struct intel_descriptor *desc, physaddr_t addr, size_t len)
Populate descriptor.
Definition: intel.h:232
unsigned long physaddr_t
Definition: stdint.h:20
A packet descriptor.
Definition: intel.h:20
#define DBGC2(...)
Definition: compiler.h:522
void * data
Start of data.
Definition: iobuf.h:44
unsigned int prod
Producer index.
Definition: intel.h:217
#define INTEL_RX_FILL
Receive descriptor ring fill level.
Definition: intel.h:152
struct intel_descriptor * desc
Descriptors.
Definition: intel.h:215
static void profile_exclude(struct profiler *profiler)
Exclude time from other ongoing profiling results.
Definition: profile.h:184
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362
A persistent I/O buffer.
Definition: iobuf.h:32

References address, alloc_iob(), assert(), intel_ring::cons, io_buffer::data, DBGC2, intel_ring::desc, intel_ring::describe, INTEL_NUM_RX_DESC, INTEL_RX_FILL, INTEL_RX_MAX_LEN, INTEL_xDT, NULL, intel_ring::prod, profile_exclude(), profile_start(), profile_stop(), intel_ring::reg, intel_nic::regs, rx, intel_nic::rx, intel_nic::rx_iobuf, virt_to_bus(), wmb(), and writel().

Referenced by intel_open(), intel_poll(), intelx_open(), intelx_poll(), intelxvf_open(), and intelxvf_poll().

◆ intel_empty_rx()

void intel_empty_rx ( struct intel_nic intel)

Discard unused receive I/O buffers.

Parameters
intelIntel device

Definition at line 619 of file intel.c.

619  {
620  unsigned int i;
621 
622  for ( i = 0 ; i < INTEL_NUM_RX_DESC ; i++ ) {
623  if ( intel->rx_iobuf[i] )
624  free_iob ( intel->rx_iobuf[i] );
625  intel->rx_iobuf[i] = NULL;
626  }
627 }
#define INTEL_NUM_RX_DESC
Number of receive descriptors.
Definition: intel.h:149
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition: iobuf.c:145
struct io_buffer * rx_iobuf[INTEL_NUM_RX_DESC]
Receive I/O buffers.
Definition: intel.h:303
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362

References free_iob(), INTEL_NUM_RX_DESC, NULL, and intel_nic::rx_iobuf.

Referenced by intel_close(), intelx_close(), and intelxvf_close().

◆ intel_open()

static int intel_open ( struct net_device netdev)
static

Open network device.

Parameters
netdevNetwork device
Return values
rcReturn status code

Definition at line 635 of file intel.c.

635  {
636  struct intel_nic *intel = netdev->priv;
638  uint32_t fextnvm11;
639  uint32_t tctl;
640  uint32_t rctl;
641  int rc;
642 
643  /* Set undocumented bit in FEXTNVM11 to work around an errata
644  * in i219 devices that will otherwise cause a complete
645  * datapath hang at the next device reset.
646  */
647  if ( intel->flags & INTEL_RST_HANG ) {
648  DBGC ( intel, "INTEL %p WARNING: applying reset hang "
649  "workaround\n", intel );
650  fextnvm11 = readl ( intel->regs + INTEL_FEXTNVM11 );
651  fextnvm11 |= INTEL_FEXTNVM11_WTF;
652  writel ( fextnvm11, intel->regs + INTEL_FEXTNVM11 );
653  }
654 
655  /* Create transmit descriptor ring */
656  if ( ( rc = intel_create_ring ( intel, &intel->tx ) ) != 0 )
657  goto err_create_tx;
658 
659  /* Create receive descriptor ring */
660  if ( ( rc = intel_create_ring ( intel, &intel->rx ) ) != 0 )
661  goto err_create_rx;
662 
663  /* Program MAC address */
664  memset ( &mac, 0, sizeof ( mac ) );
665  memcpy ( mac.raw, netdev->ll_addr, sizeof ( mac.raw ) );
666  writel ( le32_to_cpu ( mac.reg.low ), intel->regs + INTEL_RAL0 );
667  writel ( ( le32_to_cpu ( mac.reg.high ) | INTEL_RAH0_AV ),
668  intel->regs + INTEL_RAH0 );
669 
670  /* Enable transmitter */
671  tctl = readl ( intel->regs + INTEL_TCTL );
675  writel ( tctl, intel->regs + INTEL_TCTL );
676 
677  /* Enable receiver */
678  rctl = readl ( intel->regs + INTEL_RCTL );
679  rctl &= ~( INTEL_RCTL_BSIZE_BSEX_MASK );
682  writel ( rctl, intel->regs + INTEL_RCTL );
683 
684  /* Fill receive ring */
685  intel_refill_rx ( intel );
686 
687  /* Update link state */
689 
690  /* Apply required errata */
691  if ( intel->flags & INTEL_VMWARE ) {
692  DBGC ( intel, "INTEL %p applying VMware errata workaround\n",
693  intel );
694  intel->force_icr = INTEL_IRQ_RXT0;
695  }
696 
697  return 0;
698 
699  intel_destroy_ring ( intel, &intel->rx );
700  err_create_rx:
701  intel_destroy_ring ( intel, &intel->tx );
702  err_create_tx:
703  return rc;
704 }
unsigned int force_icr
Forced interrupts.
Definition: intel.h:286
void * regs
Registers.
Definition: intel.h:280
#define INTEL_RCTL_BSIZE_2048
Definition: intel.h:120
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define INTEL_IRQ_RXT0
Receive timer.
Definition: intel.h:103
#define le32_to_cpu(value)
Definition: byteswap.h:113
VMware missing interrupt workaround required.
Definition: intel.h:311
#define INTEL_RCTL_BSIZE_BSEX_MASK
Definition: intel.h:121
uint32_t readl(volatile uint32_t *io_addr)
Read 32-bit dword from memory-mapped device.
struct intel_ring rx
Receive descriptor ring.
Definition: intel.h:301
#define INTEL_TCTL_EN
Transmit enable.
Definition: intel.h:126
#define DBGC(...)
Definition: compiler.h:505
int intel_create_ring(struct intel_nic *intel, struct intel_ring *ring)
Create descriptor ring.
Definition: intel.c:499
uint8_t mac[ETH_ALEN]
MAC address.
Definition: ena.h:24
#define INTEL_RCTL_SECRC
Strip CRC.
Definition: intel.h:122
void intel_refill_rx(struct intel_nic *intel)
Refill receive descriptor ring.
Definition: intel.c:567
static void intel_check_link(struct net_device *netdev)
Check link state.
Definition: intel.c:353
#define INTEL_TCTL_CT_MASK
Definition: intel.h:130
void * memcpy(void *dest, const void *src, size_t len) __nonnull
#define INTEL_FEXTNVM11
Future Extended NVM register 11.
Definition: intel.h:200
void * priv
Driver private data.
Definition: netdevice.h:425
#define INTEL_FEXTNVM11_WTF
Don't ask.
Definition: intel.h:201
void writel(uint32_t data, volatile uint32_t *io_addr)
Write 32-bit dword to memory-mapped device.
static struct net_device * netdev
Definition: gdbudp.c:52
#define INTEL_TCTL_CT_DEFAULT
Definition: intel.h:129
#define INTEL_RCTL_BAM
Broadcast accept mode.
Definition: intel.h:116
unsigned int uint32_t
Definition: stdint.h:12
#define INTEL_RCTL_UPE
Unicast promiscuous mode.
Definition: intel.h:114
#define INTEL_RCTL
Receive Control Register.
Definition: intel.h:112
#define INTEL_TCTL
Transmit Control Register.
Definition: intel.h:125
void intel_destroy_ring(struct intel_nic *intel, struct intel_ring *ring)
Destroy descriptor ring.
Definition: intel.c:550
An Intel network card.
Definition: intel.h:278
#define INTEL_TCTL_PSP
Pad short packets.
Definition: intel.h:127
struct intel_ring tx
Transmit descriptor ring.
Definition: intel.h:299
Receive address.
Definition: intel.h:204
Reset may cause a complete device hang.
Definition: intel.h:317
#define INTEL_RCTL_EN
Receive enable.
Definition: intel.h:113
#define INTEL_RAH0_AV
Address valid.
Definition: intel.h:197
#define INTEL_RAL0
Receive Address Low.
Definition: intel.h:193
#define INTEL_RAH0
Receive Address High.
Definition: intel.h:196
uint8_t ll_addr[MAX_LL_ADDR_LEN]
Link-layer address.
Definition: netdevice.h:381
#define INTEL_TCTL_COLD_MASK
Definition: intel.h:133
#define INTEL_TCTL_COLD_DEFAULT
Definition: intel.h:132
unsigned int flags
Flags.
Definition: intel.h:284
#define INTEL_RCTL_MPE
Multicast promiscuous.
Definition: intel.h:115
void * memset(void *dest, int character, size_t len) __nonnull

References DBGC, intel_nic::flags, intel_nic::force_icr, intel_check_link(), intel_create_ring(), intel_destroy_ring(), INTEL_FEXTNVM11, INTEL_FEXTNVM11_WTF, INTEL_IRQ_RXT0, INTEL_RAH0, INTEL_RAH0_AV, INTEL_RAL0, INTEL_RCTL, INTEL_RCTL_BAM, INTEL_RCTL_BSIZE_2048, INTEL_RCTL_BSIZE_BSEX_MASK, INTEL_RCTL_EN, INTEL_RCTL_MPE, INTEL_RCTL_SECRC, INTEL_RCTL_UPE, intel_refill_rx(), INTEL_RST_HANG, INTEL_TCTL, INTEL_TCTL_COLD_DEFAULT, INTEL_TCTL_COLD_MASK, INTEL_TCTL_CT_DEFAULT, INTEL_TCTL_CT_MASK, INTEL_TCTL_EN, INTEL_TCTL_PSP, INTEL_VMWARE, le32_to_cpu, net_device::ll_addr, mac, memcpy(), memset(), netdev, net_device::priv, rc, readl(), intel_nic::regs, intel_nic::rx, intel_nic::tx, and writel().

◆ intel_close()

static void intel_close ( struct net_device netdev)
static

Close network device.

Parameters
netdevNetwork device

Definition at line 711 of file intel.c.

711  {
712  struct intel_nic *intel = netdev->priv;
713 
714  /* Disable receiver */
715  writel ( 0, intel->regs + INTEL_RCTL );
716 
717  /* Disable transmitter */
718  writel ( 0, intel->regs + INTEL_TCTL );
719 
720  /* Destroy receive descriptor ring */
721  intel_destroy_ring ( intel, &intel->rx );
722 
723  /* Discard any unused receive buffers */
724  intel_empty_rx ( intel );
725 
726  /* Destroy transmit descriptor ring */
727  intel_destroy_ring ( intel, &intel->tx );
728 
729  /* Reset the NIC, to flush the transmit and receive FIFOs */
730  intel_reset ( intel );
731 }
void * regs
Registers.
Definition: intel.h:280
struct intel_ring rx
Receive descriptor ring.
Definition: intel.h:301
void intel_empty_rx(struct intel_nic *intel)
Discard unused receive I/O buffers.
Definition: intel.c:619
static int intel_reset(struct intel_nic *intel)
Reset hardware.
Definition: intel.c:266
void * priv
Driver private data.
Definition: netdevice.h:425
void writel(uint32_t data, volatile uint32_t *io_addr)
Write 32-bit dword to memory-mapped device.
static struct net_device * netdev
Definition: gdbudp.c:52
#define INTEL_RCTL
Receive Control Register.
Definition: intel.h:112
#define INTEL_TCTL
Transmit Control Register.
Definition: intel.h:125
void intel_destroy_ring(struct intel_nic *intel, struct intel_ring *ring)
Destroy descriptor ring.
Definition: intel.c:550
An Intel network card.
Definition: intel.h:278
struct intel_ring tx
Transmit descriptor ring.
Definition: intel.h:299

References intel_destroy_ring(), intel_empty_rx(), INTEL_RCTL, intel_reset(), INTEL_TCTL, netdev, net_device::priv, intel_nic::regs, intel_nic::rx, intel_nic::tx, and writel().

◆ intel_transmit()

int intel_transmit ( struct net_device netdev,
struct io_buffer iobuf 
)

Transmit packet.

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

Definition at line 740 of file intel.c.

740  {
741  struct intel_nic *intel = netdev->priv;
742  struct intel_descriptor *tx;
743  unsigned int tx_idx;
744  unsigned int tx_tail;
746  size_t len;
747 
748  /* Get next transmit descriptor */
749  if ( ( intel->tx.prod - intel->tx.cons ) >= INTEL_TX_FILL ) {
750  DBGC ( intel, "INTEL %p out of transmit descriptors\n", intel );
751  return -ENOBUFS;
752  }
753  tx_idx = ( intel->tx.prod++ % INTEL_NUM_TX_DESC );
754  tx_tail = ( intel->tx.prod % INTEL_NUM_TX_DESC );
755  tx = &intel->tx.desc[tx_idx];
756 
757  /* Populate transmit descriptor */
758  address = virt_to_bus ( iobuf->data );
759  len = iob_len ( iobuf );
760  intel->tx.describe ( tx, address, len );
761  wmb();
762 
763  /* Notify card that there are packets ready to transmit */
764  profile_start ( &intel_vm_tx_profiler );
765  writel ( tx_tail, intel->regs + intel->tx.reg + INTEL_xDT );
766  profile_stop ( &intel_vm_tx_profiler );
767  profile_exclude ( &intel_vm_tx_profiler );
768 
769  DBGC2 ( intel, "INTEL %p TX %d is [%llx,%llx)\n", intel, tx_idx,
770  ( ( unsigned long long ) address ),
771  ( ( unsigned long long ) address + len ) );
772 
773  return 0;
774 }
void * regs
Registers.
Definition: intel.h:280
wmb()
#define INTEL_NUM_TX_DESC
Number of transmit descriptors.
Definition: intel.h:165
uint64_t address
Base address.
Definition: ena.h:24
#define DBGC(...)
Definition: compiler.h:505
#define INTEL_xDT
Receive/Transmit Descriptor Tail (offset)
Definition: intel.h:183
static void profile_stop(struct profiler *profiler)
Stop profiling.
Definition: profile.h:171
unsigned int cons
Consumer index.
Definition: intel.h:219
unsigned int reg
Register block.
Definition: intel.h:222
#define INTEL_TX_FILL
Transmit descriptor ring maximum fill level.
Definition: intel.h:168
static __always_inline unsigned long virt_to_bus(volatile const void *addr)
Convert virtual address to a bus address.
Definition: io.h:183
void * priv
Driver private data.
Definition: netdevice.h:425
void writel(uint32_t data, volatile uint32_t *io_addr)
Write 32-bit dword to memory-mapped device.
static struct net_device * netdev
Definition: gdbudp.c:52
static void profile_start(struct profiler *profiler)
Start profiling.
Definition: profile.h:158
uint32_t tx
Maximum number of transmit queues.
Definition: intelvf.h:14
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition: iobuf.h:151
void(* describe)(struct intel_descriptor *desc, physaddr_t addr, size_t len)
Populate descriptor.
Definition: intel.h:232
unsigned long physaddr_t
Definition: stdint.h:20
A packet descriptor.
Definition: intel.h:20
uint32_t len
Length.
Definition: ena.h:14
#define ENOBUFS
No buffer space available.
Definition: errno.h:498
#define DBGC2(...)
Definition: compiler.h:522
void * data
Start of data.
Definition: iobuf.h:44
unsigned int prod
Producer index.
Definition: intel.h:217
An Intel network card.
Definition: intel.h:278
struct intel_descriptor * desc
Descriptors.
Definition: intel.h:215
struct intel_ring tx
Transmit descriptor ring.
Definition: intel.h:299
static void profile_exclude(struct profiler *profiler)
Exclude time from other ongoing profiling results.
Definition: profile.h:184

References address, intel_ring::cons, io_buffer::data, DBGC, DBGC2, intel_ring::desc, intel_ring::describe, ENOBUFS, INTEL_NUM_TX_DESC, INTEL_TX_FILL, INTEL_xDT, iob_len(), len, netdev, net_device::priv, intel_ring::prod, profile_exclude(), profile_start(), profile_stop(), intel_ring::reg, intel_nic::regs, tx, intel_nic::tx, virt_to_bus(), wmb(), and writel().

◆ intel_poll_tx()

void intel_poll_tx ( struct net_device netdev)

Poll for completed packets.

Parameters
netdevNetwork device

Definition at line 781 of file intel.c.

781  {
782  struct intel_nic *intel = netdev->priv;
783  struct intel_descriptor *tx;
784  unsigned int tx_idx;
785 
786  /* Check for completed packets */
787  while ( intel->tx.cons != intel->tx.prod ) {
788 
789  /* Get next transmit descriptor */
790  tx_idx = ( intel->tx.cons % INTEL_NUM_TX_DESC );
791  tx = &intel->tx.desc[tx_idx];
792 
793  /* Stop if descriptor is still in use */
794  if ( ! ( tx->status & cpu_to_le32 ( INTEL_DESC_STATUS_DD ) ) )
795  return;
796 
797  DBGC2 ( intel, "INTEL %p TX %d complete\n", intel, tx_idx );
798 
799  /* Complete TX descriptor */
801  intel->tx.cons++;
802  }
803 }
#define INTEL_DESC_STATUS_DD
Descriptor done.
Definition: intel.h:50
static void netdev_tx_complete_next(struct net_device *netdev)
Complete network transmission.
Definition: netdevice.h:758
#define INTEL_NUM_TX_DESC
Number of transmit descriptors.
Definition: intel.h:165
unsigned int cons
Consumer index.
Definition: intel.h:219
void * priv
Driver private data.
Definition: netdevice.h:425
static struct net_device * netdev
Definition: gdbudp.c:52
#define cpu_to_le32(value)
Definition: byteswap.h:107
uint32_t tx
Maximum number of transmit queues.
Definition: intelvf.h:14
A packet descriptor.
Definition: intel.h:20
#define DBGC2(...)
Definition: compiler.h:522
unsigned int prod
Producer index.
Definition: intel.h:217
An Intel network card.
Definition: intel.h:278
struct intel_descriptor * desc
Descriptors.
Definition: intel.h:215
struct intel_ring tx
Transmit descriptor ring.
Definition: intel.h:299

References intel_ring::cons, cpu_to_le32, DBGC2, intel_ring::desc, INTEL_DESC_STATUS_DD, INTEL_NUM_TX_DESC, netdev, netdev_tx_complete_next(), net_device::priv, intel_ring::prod, tx, and intel_nic::tx.

Referenced by intel_poll(), intelx_poll(), and intelxvf_poll().

◆ intel_poll_rx()

void intel_poll_rx ( struct net_device netdev)

Poll for received packets.

Parameters
netdevNetwork device

Definition at line 810 of file intel.c.

810  {
811  struct intel_nic *intel = netdev->priv;
812  struct intel_descriptor *rx;
813  struct io_buffer *iobuf;
814  unsigned int rx_idx;
815  size_t len;
816 
817  /* Check for received packets */
818  while ( intel->rx.cons != intel->rx.prod ) {
819 
820  /* Get next receive descriptor */
821  rx_idx = ( intel->rx.cons % INTEL_NUM_RX_DESC );
822  rx = &intel->rx.desc[rx_idx];
823 
824  /* Stop if descriptor is still in use */
825  if ( ! ( rx->status & cpu_to_le32 ( INTEL_DESC_STATUS_DD ) ) )
826  return;
827 
828  /* Populate I/O buffer */
829  iobuf = intel->rx_iobuf[rx_idx];
830  intel->rx_iobuf[rx_idx] = NULL;
831  len = le16_to_cpu ( rx->length );
832  iob_put ( iobuf, len );
833 
834  /* Hand off to network stack */
835  if ( rx->status & cpu_to_le32 ( INTEL_DESC_STATUS_RXE ) ) {
836  DBGC ( intel, "INTEL %p RX %d error (length %zd, "
837  "status %08x)\n", intel, rx_idx, len,
838  le32_to_cpu ( rx->status ) );
839  netdev_rx_err ( netdev, iobuf, -EIO );
840  } else {
841  DBGC2 ( intel, "INTEL %p RX %d complete (length %zd)\n",
842  intel, rx_idx, len );
843  netdev_rx ( netdev, iobuf );
844  }
845  intel->rx.cons++;
846  }
847 }
#define INTEL_DESC_STATUS_DD
Descriptor done.
Definition: intel.h:50
#define iob_put(iobuf, len)
Definition: iobuf.h:116
#define INTEL_NUM_RX_DESC
Number of receive descriptors.
Definition: intel.h:149
void netdev_rx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard received packet.
Definition: netdevice.c:501
#define le32_to_cpu(value)
Definition: byteswap.h:113
struct intel_ring rx
Receive descriptor ring.
Definition: intel.h:301
#define DBGC(...)
Definition: compiler.h:505
unsigned int cons
Consumer index.
Definition: intel.h:219
void * priv
Driver private data.
Definition: netdevice.h:425
static struct net_device * netdev
Definition: gdbudp.c:52
struct io_buffer * rx_iobuf[INTEL_NUM_RX_DESC]
Receive I/O buffers.
Definition: intel.h:303
uint32_t rx
Maximum number of receive queues.
Definition: intelvf.h:16
#define cpu_to_le32(value)
Definition: byteswap.h:107
#define le16_to_cpu(value)
Definition: byteswap.h:112
void netdev_rx(struct net_device *netdev, struct io_buffer *iobuf)
Add packet to receive queue.
Definition: netdevice.c:470
A packet descriptor.
Definition: intel.h:20
uint32_t len
Length.
Definition: ena.h:14
#define DBGC2(...)
Definition: compiler.h:522
unsigned int prod
Producer index.
Definition: intel.h:217
#define EIO
Input/output error.
Definition: errno.h:433
An Intel network card.
Definition: intel.h:278
struct intel_descriptor * desc
Descriptors.
Definition: intel.h:215
#define INTEL_DESC_STATUS_RXE
Receive error.
Definition: intel.h:53
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362
A persistent I/O buffer.
Definition: iobuf.h:32

References intel_ring::cons, cpu_to_le32, DBGC, DBGC2, intel_ring::desc, EIO, INTEL_DESC_STATUS_DD, INTEL_DESC_STATUS_RXE, INTEL_NUM_RX_DESC, iob_put, le16_to_cpu, le32_to_cpu, len, netdev, netdev_rx(), netdev_rx_err(), NULL, net_device::priv, intel_ring::prod, rx, intel_nic::rx, and intel_nic::rx_iobuf.

Referenced by intel_poll(), intelx_poll(), and intelxvf_poll().

◆ intel_poll()

static void intel_poll ( struct net_device netdev)
static

Poll for completed and received packets.

Parameters
netdevNetwork device

Definition at line 854 of file intel.c.

854  {
855  struct intel_nic *intel = netdev->priv;
856  uint32_t icr;
857 
858  /* Check for and acknowledge interrupts */
859  profile_start ( &intel_vm_poll_profiler );
860  icr = readl ( intel->regs + INTEL_ICR );
861  profile_stop ( &intel_vm_poll_profiler );
862  profile_exclude ( &intel_vm_poll_profiler );
863  icr |= intel->force_icr;
864  if ( ! icr )
865  return;
866 
867  /* Poll for TX completions, if applicable */
868  if ( icr & INTEL_IRQ_TXDW )
869  intel_poll_tx ( netdev );
870 
871  /* Poll for RX completions, if applicable */
872  if ( icr & ( INTEL_IRQ_RXT0 | INTEL_IRQ_RXO ) )
873  intel_poll_rx ( netdev );
874 
875  /* Report receive overruns */
876  if ( icr & INTEL_IRQ_RXO )
878 
879  /* Check link state, if applicable */
880  if ( icr & INTEL_IRQ_LSC )
882 
883  /* Check for unexpected interrupts */
884  if ( icr & ~( INTEL_IRQ_TXDW | INTEL_IRQ_TXQE | INTEL_IRQ_LSC |
886  DBGC ( intel, "INTEL %p unexpected ICR %08x\n", intel, icr );
887  /* Report as a TX error */
889  }
890 
891  /* Refill RX ring */
892  intel_refill_rx ( intel );
893 }
unsigned int force_icr
Forced interrupts.
Definition: intel.h:286
void * regs
Registers.
Definition: intel.h:280
#define INTEL_ICR
Interrupt Cause Read Register.
Definition: intel.h:97
void netdev_rx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard received packet.
Definition: netdevice.c:501
#define INTEL_IRQ_RXDMT0
Receive queue low.
Definition: intel.h:101
void intel_poll_rx(struct net_device *netdev)
Poll for received packets.
Definition: intel.c:810
#define INTEL_IRQ_RXT0
Receive timer.
Definition: intel.h:103
void netdev_tx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard transmitted packet.
Definition: netdevice.c:369
void intel_poll_tx(struct net_device *netdev)
Poll for completed packets.
Definition: intel.c:781
uint32_t readl(volatile uint32_t *io_addr)
Read 32-bit dword from memory-mapped device.
#define DBGC(...)
Definition: compiler.h:505
#define INTEL_IRQ_TXDW
Transmit descriptor done.
Definition: intel.h:98
static void profile_stop(struct profiler *profiler)
Stop profiling.
Definition: profile.h:171
#define ENOTSUP
Operation not supported.
Definition: errno.h:589
void intel_refill_rx(struct intel_nic *intel)
Refill receive descriptor ring.
Definition: intel.c:567
static void intel_check_link(struct net_device *netdev)
Check link state.
Definition: intel.c:353
void * priv
Driver private data.
Definition: netdevice.h:425
static struct net_device * netdev
Definition: gdbudp.c:52
static void profile_start(struct profiler *profiler)
Start profiling.
Definition: profile.h:158
unsigned int uint32_t
Definition: stdint.h:12
#define ENOBUFS
No buffer space available.
Definition: errno.h:498
An Intel network card.
Definition: intel.h:278
#define INTEL_IRQ_TXQE
Transmit queue empty.
Definition: intel.h:99
#define INTEL_IRQ_LSC
Link status change.
Definition: intel.h:100
static void profile_exclude(struct profiler *profiler)
Exclude time from other ongoing profiling results.
Definition: profile.h:184
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362
#define INTEL_IRQ_RXO
Receive overrun.
Definition: intel.h:102

References DBGC, ENOBUFS, ENOTSUP, intel_nic::force_icr, intel_check_link(), INTEL_ICR, INTEL_IRQ_LSC, INTEL_IRQ_RXDMT0, INTEL_IRQ_RXO, INTEL_IRQ_RXT0, INTEL_IRQ_TXDW, INTEL_IRQ_TXQE, intel_poll_rx(), intel_poll_tx(), intel_refill_rx(), netdev, netdev_rx_err(), netdev_tx_err(), NULL, net_device::priv, profile_exclude(), profile_start(), profile_stop(), readl(), and intel_nic::regs.

◆ intel_irq()

static void intel_irq ( struct net_device netdev,
int  enable 
)
static

Enable or disable interrupts.

Parameters
netdevNetwork device
enableInterrupts should be enabled

Definition at line 901 of file intel.c.

901  {
902  struct intel_nic *intel = netdev->priv;
903  uint32_t mask;
904 
906  if ( enable ) {
907  writel ( mask, intel->regs + INTEL_IMS );
908  } else {
909  writel ( mask, intel->regs + INTEL_IMC );
910  }
911 }
void * regs
Registers.
Definition: intel.h:280
#define INTEL_IRQ_RXT0
Receive timer.
Definition: intel.h:103
#define INTEL_IRQ_TXDW
Transmit descriptor done.
Definition: intel.h:98
void * priv
Driver private data.
Definition: netdevice.h:425
void writel(uint32_t data, volatile uint32_t *io_addr)
Write 32-bit dword to memory-mapped device.
static struct net_device * netdev
Definition: gdbudp.c:52
#define INTEL_IMS
Interrupt Mask Set/Read Register.
Definition: intel.h:106
unsigned int uint32_t
Definition: stdint.h:12
An Intel network card.
Definition: intel.h:278
#define INTEL_IRQ_LSC
Link status change.
Definition: intel.h:100
#define INTEL_IMC
Interrupt Mask Clear Register.
Definition: intel.h:109

References INTEL_IMC, INTEL_IMS, INTEL_IRQ_LSC, INTEL_IRQ_RXT0, INTEL_IRQ_TXDW, netdev, net_device::priv, intel_nic::regs, and writel().

◆ intel_probe()

static int intel_probe ( struct pci_device pci)
static

Probe PCI device.

Parameters
pciPCI device
Return values
rcReturn status code

Definition at line 935 of file intel.c.

935  {
936  struct net_device *netdev;
937  struct intel_nic *intel;
938  int rc;
939 
940  /* Allocate and initialise net device */
941  netdev = alloc_etherdev ( sizeof ( *intel ) );
942  if ( ! netdev ) {
943  rc = -ENOMEM;
944  goto err_alloc;
945  }
947  intel = netdev->priv;
948  pci_set_drvdata ( pci, netdev );
949  netdev->dev = &pci->dev;
950  memset ( intel, 0, sizeof ( *intel ) );
951  intel->port = PCI_FUNC ( pci->busdevfn );
952  intel->flags = pci->id->driver_data;
953  intel_init_ring ( &intel->tx, INTEL_NUM_TX_DESC, INTEL_TD,
955  intel_init_ring ( &intel->rx, INTEL_NUM_RX_DESC, INTEL_RD,
957 
958  /* Fix up PCI device */
959  adjust_pci_device ( pci );
960 
961  /* Map registers */
962  intel->regs = ioremap ( pci->membase, INTEL_BAR_SIZE );
963  if ( ! intel->regs ) {
964  rc = -ENODEV;
965  goto err_ioremap;
966  }
967 
968  /* Reset the NIC */
969  if ( ( rc = intel_reset ( intel ) ) != 0 )
970  goto err_reset;
971 
972  /* Fetch MAC address */
973  if ( ( rc = intel_fetch_mac ( intel, netdev->hw_addr ) ) != 0 )
974  goto err_fetch_mac;
975 
976  /* Register network device */
977  if ( ( rc = register_netdev ( netdev ) ) != 0 )
978  goto err_register_netdev;
979 
980  /* Set initial link state */
982 
983  return 0;
984 
986  err_register_netdev:
987  err_fetch_mac:
988  intel_reset ( intel );
989  err_reset:
990  iounmap ( intel->regs );
991  err_ioremap:
993  netdev_put ( netdev );
994  err_alloc:
995  return rc;
996 }
void * regs
Registers.
Definition: intel.h:280
#define PCI_FUNC(busdevfn)
Definition: pci.h:258
unsigned long membase
Memory base.
Definition: pci.h:194
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define INTEL_NUM_RX_DESC
Number of receive descriptors.
Definition: intel.h:149
static int intel_fetch_mac(struct intel_nic *intel, uint8_t *hw_addr)
Fetch initial MAC address.
Definition: intel.c:229
#define INTEL_RD
Receive Descriptor register block.
Definition: intel.h:142
unsigned long driver_data
Arbitrary driver data.
Definition: pci.h:159
#define INTEL_NUM_TX_DESC
Number of transmit descriptors.
Definition: intel.h:165
struct intel_ring rx
Receive descriptor ring.
Definition: intel.h:301
void intel_describe_tx(struct intel_descriptor *tx, physaddr_t addr, size_t len)
Populate transmit descriptor.
Definition: intel.c:383
#define INTEL_BAR_SIZE
Intel BAR size.
Definition: intel.h:17
void adjust_pci_device(struct pci_device *pci)
Enable PCI device.
Definition: pci.c:149
struct device dev
Generic device.
Definition: pci.h:189
static void intel_check_link(struct net_device *netdev)
Check link state.
Definition: intel.c:353
unsigned int port
Port number (for multi-port devices)
Definition: intel.h:282
static void netdev_init(struct net_device *netdev, struct net_device_operations *op)
Initialise a network device.
Definition: netdevice.h:498
static void pci_set_drvdata(struct pci_device *pci, void *priv)
Set PCI driver-private data.
Definition: pci.h:338
#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:555
static int intel_reset(struct intel_nic *intel)
Reset hardware.
Definition: intel.c:266
void * priv
Driver private data.
Definition: netdevice.h:425
void intel_describe_rx(struct intel_descriptor *rx, physaddr_t addr, size_t len __unused)
Populate receive descriptor.
Definition: intel.c:421
static struct net_device * netdev
Definition: gdbudp.c:52
void unregister_netdev(struct net_device *netdev)
Unregister network device.
Definition: netdevice.c:844
static struct net_device_operations intel_operations
Intel network device operations.
Definition: intel.c:914
int register_netdev(struct net_device *netdev)
Register network device.
Definition: netdevice.c:667
A network device.
Definition: netdevice.h:348
#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:511
struct device * dev
Underlying hardware device.
Definition: netdevice.h:360
uint32_t busdevfn
Segment, bus, device, and function (bus:dev.fn) number.
Definition: pci.h:210
struct net_device * alloc_etherdev(size_t priv_size)
Allocate Ethernet device.
Definition: ethernet.c:264
struct pci_device_id * id
Driver device ID.
Definition: pci.h:220
An Intel network card.
Definition: intel.h:278
void iounmap(volatile const void *io_addr)
Unmap I/O address.
struct intel_ring tx
Transmit descriptor ring.
Definition: intel.h:299
void * ioremap(unsigned long bus_addr, size_t len)
Map bus address as an I/O address.
unsigned int flags
Flags.
Definition: intel.h:284
uint8_t hw_addr[MAX_HW_ADDR_LEN]
Hardware address.
Definition: netdevice.h:375
#define INTEL_TD
Transmit Descriptor register block.
Definition: intel.h:158
void * memset(void *dest, int character, size_t len) __nonnull

References adjust_pci_device(), alloc_etherdev(), pci_device::busdevfn, pci_device::dev, net_device::dev, pci_device_id::driver_data, ENODEV, ENOMEM, intel_nic::flags, net_device::hw_addr, pci_device::id, INTEL_BAR_SIZE, intel_check_link(), intel_describe_rx(), intel_describe_tx(), intel_fetch_mac(), INTEL_NUM_RX_DESC, INTEL_NUM_TX_DESC, intel_operations, INTEL_RD, intel_reset(), INTEL_TD, ioremap(), iounmap(), pci_device::membase, memset(), netdev, netdev_init(), netdev_nullify(), netdev_put(), PCI_FUNC, pci_set_drvdata(), intel_nic::port, net_device::priv, rc, register_netdev(), intel_nic::regs, intel_nic::rx, intel_nic::tx, and unregister_netdev().

◆ intel_remove()

static void intel_remove ( struct pci_device pci)
static

Remove PCI device.

Parameters
pciPCI device

Definition at line 1003 of file intel.c.

1003  {
1004  struct net_device *netdev = pci_get_drvdata ( pci );
1005  struct intel_nic *intel = netdev->priv;
1006 
1007  /* Unregister network device */
1009 
1010  /* Reset the NIC */
1011  intel_reset ( intel );
1012 
1013  /* Free network device */
1014  iounmap ( intel->regs );
1015  netdev_nullify ( netdev );
1016  netdev_put ( netdev );
1017 }
void * regs
Registers.
Definition: intel.h:280
static void netdev_put(struct net_device *netdev)
Drop reference to network device.
Definition: netdevice.h:555
static int intel_reset(struct intel_nic *intel)
Reset hardware.
Definition: intel.c:266
void * priv
Driver private data.
Definition: netdevice.h:425
static struct net_device * netdev
Definition: gdbudp.c:52
void unregister_netdev(struct net_device *netdev)
Unregister network device.
Definition: netdevice.c:844
A network device.
Definition: netdevice.h:348
static void netdev_nullify(struct net_device *netdev)
Stop using a network device.
Definition: netdevice.h:511
static void * pci_get_drvdata(struct pci_device *pci)
Get PCI driver-private data.
Definition: pci.h:348
An Intel network card.
Definition: intel.h:278
void iounmap(volatile const void *io_addr)
Unmap I/O address.

References intel_reset(), iounmap(), netdev, netdev_nullify(), netdev_put(), pci_get_drvdata(), net_device::priv, intel_nic::regs, and unregister_netdev().

Variable Documentation

◆ __profiler

struct profiler intel_vm_poll_profiler __profiler
static
Initial value:
=
{ .name = "intel.vm_tx" }

VM transmit profiler.

VM poll profiler.

VM receive refill profiler.

Definition at line 47 of file intel.c.

◆ intel_operations

struct net_device_operations intel_operations
static
Initial value:
= {
.open = intel_open,
.close = intel_close,
.transmit = intel_transmit,
.poll = intel_poll,
.irq = intel_irq,
}
static int intel_open(struct net_device *netdev)
Open network device.
Definition: intel.c:635
static void intel_irq(struct net_device *netdev, int enable)
Enable or disable interrupts.
Definition: intel.c:901
static void intel_poll(struct net_device *netdev)
Poll for completed and received packets.
Definition: intel.c:854
int intel_transmit(struct net_device *netdev, struct io_buffer *iobuf)
Transmit packet.
Definition: intel.c:740
static void intel_close(struct net_device *netdev)
Close network device.
Definition: intel.c:711

Intel network device operations.

Definition at line 914 of file intel.c.

Referenced by intel_probe().

◆ intel_nics

struct pci_device_id intel_nics[]
static

Intel PCI device IDs.

Definition at line 1020 of file intel.c.

◆ __pci_driver

struct pci_driver intel_driver __pci_driver
Initial value:
= {
.ids = intel_nics,
.id_count = ( sizeof ( intel_nics ) / sizeof ( intel_nics[0] ) ),
.probe = intel_probe,
}
static int intel_probe(struct pci_device *pci)
Probe PCI device.
Definition: intel.c:935
static struct pci_device_id intel_nics[]
Intel PCI device IDs.
Definition: intel.c:1020
static struct xen_remove_from_physmap * remove
Definition: xenmem.h:39
static void intel_remove(struct pci_device *pci)
Remove PCI device.
Definition: intel.c:1003

Intel PCI driver.

Definition at line 1167 of file intel.c.