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/dma.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:291
unsigned short uint16_t
Definition: stdint.h:11
#define INTEL_EERD
EEPROM Read Register.
Definition: intel.h:77
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:83
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:304
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:86
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:289
uint8_t data[48]
Additional event data.
Definition: ena.h:22
#define INTEL_EERD_START
Start read.
Definition: intel.h:78
unsigned int eerd_addr_shift
EEPROM address shift.
Definition: intel.h:306
#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:289

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:291
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:77
#define INTEL_EERD_DONE_SMALL
Read done (small EERD)
Definition: intel.h:79
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:304
#define INTEL_EEPROM_WORD_LEN_LOG2
EEPROM word length.
Definition: intel.h:89
#define INTEL_EERD_ADDR_SHIFT_SMALL
Address shift (small)
Definition: intel.h:81
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:86
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:80
#define INTEL_EERD_ADDR_SHIFT_LARGE
Address shift (large)
Definition: intel.h:82
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:78
unsigned int eerd_addr_shift
EEPROM address shift.
Definition: intel.h:306
#define INTEL_EEPROM_MIN_SIZE_WORDS
Minimum EEPROM size, in words.
Definition: intel.h:92
struct nvs_device eeprom
EEPROM.
Definition: intel.h:302
#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:295
#define INTEL_EEPROM_MAC
Offset of MAC address within EEPROM.
Definition: intel.h:95
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:302

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:291
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:213
#define INTEL_RAL0
Receive Address Low.
Definition: intel.h:202
#define INTEL_RAH0
Receive Address High.
Definition: intel.h:205

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  /* The Intel I210's packet buffer size registers reset only on
294  * power up. If an operating system changes these but then
295  * the computer recieves a reset signal without losing power,
296  * the registers will stay the same (but be incompatible with
297  * other register defaults), thus making the device unable to
298  * pass traffic.
299  */
300  if ( intel->flags & INTEL_PBSIZE_RST ) {
301  writel ( INTEL_RXPBS_I210, intel->regs + INTEL_RXPBS );
302  writel ( INTEL_TXPBS_I210, intel->regs + INTEL_TXPBS );
303  }
304 
305  /* Always reset MAC. Required to reset the TX and RX rings. */
306  writel ( ( ctrl | INTEL_CTRL_RST ), intel->regs + INTEL_CTRL );
308 
309  /* Set a sensible default configuration */
310  if ( ! ( intel->flags & INTEL_NO_ASDE ) )
312  ctrl |= INTEL_CTRL_SLU;
314  writel ( ctrl, intel->regs + INTEL_CTRL );
316 
317  /* On some models (notably ICH), the PHY reset mechanism
318  * appears to be broken. In particular, the PHY_CTRL register
319  * will be correctly loaded from NVM but the values will not
320  * be propagated to the "OEM bits" PHY register. This
321  * typically has the effect of dropping the link speed to
322  * 10Mbps.
323  *
324  * Work around this problem by skipping the PHY reset if
325  * either (a) the link is already up, or (b) this particular
326  * NIC is known to be broken.
327  */
328  status = readl ( intel->regs + INTEL_STATUS );
329  if ( ( intel->flags & INTEL_NO_PHY_RST ) ||
330  ( status & INTEL_STATUS_LU ) ) {
331  DBGC ( intel, "INTEL %p %sMAC reset (%08x/%08x was "
332  "%08x/%08x)\n", intel,
333  ( ( intel->flags & INTEL_NO_PHY_RST ) ? "forced " : "" ),
334  ctrl, status, orig_ctrl, orig_status );
335  return 0;
336  }
337 
338  /* Reset PHY and MAC simultaneously */
340  intel->regs + INTEL_CTRL );
342 
343  /* PHY reset is not self-clearing on all models */
344  writel ( ctrl, intel->regs + INTEL_CTRL );
346  status = readl ( intel->regs + INTEL_STATUS );
347 
348  DBGC ( intel, "INTEL %p MAC+PHY reset (%08x/%08x was %08x/%08x)\n",
349  intel, ctrl, status, orig_ctrl, orig_status );
350  return 0;
351 }
void * regs
Registers.
Definition: intel.h:291
PHY reset is broken.
Definition: intel.h:326
#define INTEL_PBA
Packet Buffer Allocation.
Definition: intel.h:137
ASDE is broken.
Definition: intel.h:328
uint32_t readl(volatile uint32_t *io_addr)
Read 32-bit dword from memory-mapped device.
#define DBGC(...)
Definition: compiler.h:505
#define INTEL_TXPBS
Transmit packet buffer size.
Definition: intel.h:163
#define INTEL_PBS
Packet Buffer Size.
Definition: intel.h:140
PBS/PBA errata workaround required.
Definition: intel.h:322
uint8_t status
Status.
Definition: ena.h:16
#define INTEL_CTRL_FRCDPLX
Force duplex.
Definition: intel.h:65
#define INTEL_CTRL_ASDE
Auto-speed detection.
Definition: intel.h:62
PBSIZE registers must be explicitly reset.
Definition: intel.h:332
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:61
#define INTEL_CTRL_RST
Device reset.
Definition: intel.h:66
#define INTEL_STATUS_LU
Link up.
Definition: intel.h:74
unsigned int uint32_t
Definition: stdint.h:12
#define INTEL_CTRL
Device Control Register.
Definition: intel.h:60
void mdelay(unsigned long msecs)
Delay for a fixed number of milliseconds.
Definition: timer.c:78
#define INTEL_TXPBS_I210
I210 power-up default.
Definition: intel.h:164
#define INTEL_CTRL_PHY_RST
PHY reset.
Definition: intel.h:67
#define INTEL_RESET_DELAY_MS
Time to delay for device reset, in milliseconds.
Definition: intel.h:70
#define INTEL_CTRL_SLU
Set link up.
Definition: intel.h:63
u8 ctrl
Definition: sky2.h:10
#define INTEL_RXPBS_I210
I210 power-up default.
Definition: intel.h:144
#define INTEL_STATUS
Device Status Register.
Definition: intel.h:73
unsigned int flags
Flags.
Definition: intel.h:297
#define INTEL_CTRL_FRCSPD
Force speed.
Definition: intel.h:64
#define INTEL_RXPBS
Receive packet buffer size.
Definition: intel.h:143

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_PBSIZE_RST, INTEL_RESET_DELAY_MS, INTEL_RXPBS, INTEL_RXPBS_I210, INTEL_STATUS, INTEL_STATUS_LU, INTEL_TXPBS, INTEL_TXPBS_I210, 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 365 of file intel.c.

365  {
366  struct intel_nic *intel = netdev->priv;
368 
369  /* Read link status */
370  status = readl ( intel->regs + INTEL_STATUS );
371  DBGC ( intel, "INTEL %p link status is %08x\n", intel, status );
372 
373  /* Update network device */
374  if ( status & INTEL_STATUS_LU ) {
376  } else {
378  }
379 }
void * regs
Registers.
Definition: intel.h:291
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:230
uint8_t status
Status.
Definition: ena.h:16
void * priv
Driver private data.
Definition: netdevice.h:431
static void netdev_link_up(struct net_device *netdev)
Mark network device as having link up.
Definition: netdevice.h:774
static struct net_device * netdev
Definition: gdbudp.c:52
#define INTEL_STATUS_LU
Link up.
Definition: intel.h:74
unsigned int uint32_t
Definition: stdint.h:12
An Intel network card.
Definition: intel.h:289
#define INTEL_STATUS
Device Status Register.
Definition: intel.h:73

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 395 of file intel.c.

396  {
397 
398  /* Populate transmit descriptor */
399  tx->address = cpu_to_le64 ( addr );
400  tx->length = cpu_to_le16 ( len );
401  tx->flags = 0;
402  tx->command = ( INTEL_DESC_CMD_RS | INTEL_DESC_CMD_IFCS |
404  tx->status = 0;
405 }
#define cpu_to_le64(value)
Definition: byteswap.h:108
#define INTEL_DESC_CMD_IFCS
Insert frame checksum (CRC)
Definition: intel.h:45
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:48
#define cpu_to_le16(value)
Definition: byteswap.h:106
#define INTEL_DESC_CMD_RS
Report status.
Definition: intel.h:42
u8 tx[WPA_TKIP_MIC_KEY_LEN]
MIC key for packets to the AP.
Definition: wpa.h:237

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 414 of file intel.c.

415  {
416 
417  /* Populate advanced transmit descriptor */
418  tx->address = cpu_to_le64 ( addr );
419  tx->length = cpu_to_le16 ( len );
420  tx->flags = INTEL_DESC_FL_DTYP_DATA;
421  tx->command = ( INTEL_DESC_CMD_DEXT | INTEL_DESC_CMD_RS |
423  tx->status = cpu_to_le32 ( INTEL_DESC_STATUS_PAYLEN ( len ) );
424 }
#define INTEL_DESC_STATUS_PAYLEN(len)
Payload length.
Definition: intel.h:57
#define cpu_to_le64(value)
Definition: byteswap.h:108
#define INTEL_DESC_FL_DTYP_DATA
Definition: intel.h:36
#define INTEL_DESC_CMD_IFCS
Insert frame checksum (CRC)
Definition: intel.h:45
#define cpu_to_le32(value)
Definition: byteswap.h:107
u32 addr
Definition: sky2.h:8
uint32_t len
Length.
Definition: ena.h:14
#define INTEL_DESC_CMD_DEXT
Descriptor extension.
Definition: intel.h:39
#define INTEL_DESC_CMD_EOP
End of packet.
Definition: intel.h:48
#define cpu_to_le16(value)
Definition: byteswap.h:106
#define INTEL_DESC_CMD_RS
Report status.
Definition: intel.h:42
u8 tx[WPA_TKIP_MIC_KEY_LEN]
MIC key for packets to the AP.
Definition: wpa.h:237

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 433 of file intel.c.

434  {
435 
436  /* Populate transmit descriptor */
437  rx->address = cpu_to_le64 ( addr );
438  rx->length = 0;
439  rx->status = 0;
440 }
#define cpu_to_le64(value)
Definition: byteswap.h:108
u32 addr
Definition: sky2.h:8
u8 rx[WPA_TKIP_MIC_KEY_LEN]
MIC key for packets from the AP.
Definition: wpa.h:234

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 456 of file intel.c.

456  {
457  uint32_t dctl;
458  unsigned int i;
459 
460  /* Disable ring */
461  writel ( 0, ( intel->regs + reg + INTEL_xDCTL ) );
462 
463  /* Wait for disable to complete */
464  for ( i = 0 ; i < INTEL_DISABLE_MAX_WAIT_MS ; i++ ) {
465 
466  /* Check if ring is disabled */
467  dctl = readl ( intel->regs + reg + INTEL_xDCTL );
468  if ( ! ( dctl & INTEL_xDCTL_ENABLE ) )
469  return 0;
470 
471  /* Delay */
472  mdelay ( 1 );
473  }
474 
475  DBGC ( intel, "INTEL %p ring %05x timed out waiting for disable "
476  "(dctl %08x)\n", intel, reg, dctl );
477  return -ETIMEDOUT;
478 }
void * regs
Registers.
Definition: intel.h:291
static unsigned int unsigned int reg
Definition: myson.h:162
#define INTEL_xDCTL
Receive/Transmit Descriptor Control (offset)
Definition: intel.h:195
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.
#define INTEL_DISABLE_MAX_WAIT_MS
Maximum time to wait for queue disable, in milliseconds.
Definition: intel.h:199
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:196
#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 487 of file intel.c.

487  {
488 
489  /* Disable ring. Ignore errors and continue to reset the ring anyway */
490  intel_disable_ring ( intel, reg );
491 
492  /* Clear ring length */
493  writel ( 0, ( intel->regs + reg + INTEL_xDLEN ) );
494 
495  /* Clear ring address */
496  writel ( 0, ( intel->regs + reg + INTEL_xDBAH ) );
497  writel ( 0, ( intel->regs + reg + INTEL_xDBAL ) );
498 
499  /* Reset head and tail pointers */
500  writel ( 0, ( intel->regs + reg + INTEL_xDH ) );
501  writel ( 0, ( intel->regs + reg + INTEL_xDT ) );
502 }
void * regs
Registers.
Definition: intel.h:291
static unsigned int unsigned int reg
Definition: myson.h:162
#define INTEL_xDT
Receive/Transmit Descriptor Tail (offset)
Definition: intel.h:192
#define INTEL_xDLEN
Receive/Transmit Descriptor Length (offset)
Definition: intel.h:186
#define INTEL_xDH
Receive/Transmit Descriptor Head (offset)
Definition: intel.h:189
#define INTEL_xDBAL
Receive/Transmit Descriptor Base Address Low (offset)
Definition: intel.h:180
void writel(uint32_t data, volatile uint32_t *io_addr)
Write 32-bit dword to memory-mapped device.
static int intel_disable_ring(struct intel_nic *intel, unsigned int reg)
Disable descriptor ring.
Definition: intel.c:456
#define INTEL_xDBAH
Receive/Transmit Descriptor Base Address High (offset)
Definition: intel.h:183

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 511 of file intel.c.

511  {
513  uint32_t dctl;
514 
515  /* Allocate descriptor ring. Align ring on its own size to
516  * prevent any possible page-crossing errors due to hardware
517  * errata.
518  */
519  ring->desc = dma_alloc ( intel->dma, &ring->map, ring->len,
520  ring->len );
521  if ( ! ring->desc )
522  return -ENOMEM;
523 
524  /* Initialise descriptor ring */
525  memset ( ring->desc, 0, ring->len );
526 
527  /* Program ring address */
528  address = dma ( &ring->map, ring->desc );
529  writel ( ( address & 0xffffffffUL ),
530  ( intel->regs + ring->reg + INTEL_xDBAL ) );
531  if ( sizeof ( physaddr_t ) > sizeof ( uint32_t ) ) {
532  writel ( ( ( ( uint64_t ) address ) >> 32 ),
533  ( intel->regs + ring->reg + INTEL_xDBAH ) );
534  } else {
535  writel ( 0, intel->regs + ring->reg + INTEL_xDBAH );
536  }
537 
538  /* Program ring length */
539  writel ( ring->len, ( intel->regs + ring->reg + INTEL_xDLEN ) );
540 
541  /* Reset head and tail pointers */
542  writel ( 0, ( intel->regs + ring->reg + INTEL_xDH ) );
543  writel ( 0, ( intel->regs + ring->reg + INTEL_xDT ) );
544 
545  /* Enable ring */
546  dctl = readl ( intel->regs + ring->reg + INTEL_xDCTL );
547  dctl |= INTEL_xDCTL_ENABLE;
548  writel ( dctl, intel->regs + ring->reg + INTEL_xDCTL );
549 
550  DBGC ( intel, "INTEL %p ring %05x is at [%08lx,%08lx)\n",
551  intel, ring->reg, virt_to_phys ( ring->desc ),
552  ( virt_to_phys ( ring->desc ) + ring->len ) );
553 
554  return 0;
555 }
void * regs
Registers.
Definition: intel.h:291
struct dma_mapping map
Descriptor ring DMA mapping.
Definition: intel.h:226
#define INTEL_xDCTL
Receive/Transmit Descriptor Control (offset)
Definition: intel.h:195
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:192
size_t len
Length (in bytes)
Definition: intel.h:235
unsigned long long uint64_t
Definition: stdint.h:13
#define INTEL_xDLEN
Receive/Transmit Descriptor Length (offset)
Definition: intel.h:186
static __always_inline unsigned long virt_to_phys(volatile const void *addr)
Convert virtual address to a physical address.
Definition: uaccess.h:287
unsigned int reg
Register block.
Definition: intel.h:233
#define INTEL_xDH
Receive/Transmit Descriptor Head (offset)
Definition: intel.h:189
#define ENOMEM
Not enough space.
Definition: errno.h:534
#define INTEL_xDBAL
Receive/Transmit Descriptor Base Address Low (offset)
Definition: intel.h:180
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
void * dma_alloc(struct dma_device *dma, struct dma_mapping *map, size_t len, size_t align)
Allocate and map DMA-coherent buffer.
unsigned long physaddr_t
Definition: stdint.h:20
struct dma_device * dma
DMA device.
Definition: intel.h:293
#define INTEL_xDCTL_ENABLE
Queue enable.
Definition: intel.h:196
struct intel_descriptor * desc
Descriptors.
Definition: intel.h:224
static __always_inline physaddr_t dma(struct dma_mapping *map, void *addr)
Get DMA address from virtual address.
Definition: dma.h:436
#define INTEL_xDBAH
Receive/Transmit Descriptor Base Address High (offset)
Definition: intel.h:183
void * memset(void *dest, int character, size_t len) __nonnull

References address, DBGC, intel_ring::desc, intel_nic::dma, dma(), dma_alloc(), ENOMEM, INTEL_xDBAH, INTEL_xDBAL, INTEL_xDCTL, INTEL_xDCTL_ENABLE, INTEL_xDH, INTEL_xDLEN, INTEL_xDT, intel_ring::len, intel_ring::map, memset(), readl(), intel_ring::reg, intel_nic::regs, virt_to_phys(), 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 563 of file intel.c.

563  {
564 
565  /* Reset ring */
566  intel_reset_ring ( intel, ring->reg );
567 
568  /* Free descriptor ring */
569  dma_free ( &ring->map, ring->desc, ring->len );
570  ring->desc = NULL;
571  ring->prod = 0;
572  ring->cons = 0;
573 }
void intel_reset_ring(struct intel_nic *intel, unsigned int reg)
Reset descriptor ring.
Definition: intel.c:487
struct dma_mapping map
Descriptor ring DMA mapping.
Definition: intel.h:226
size_t len
Length (in bytes)
Definition: intel.h:235
unsigned int cons
Consumer index.
Definition: intel.h:230
unsigned int reg
Register block.
Definition: intel.h:233
void dma_free(struct dma_mapping *map, void *addr, size_t len)
Unmap and free DMA-coherent buffer.
unsigned int prod
Producer index.
Definition: intel.h:228
struct intel_descriptor * desc
Descriptors.
Definition: intel.h:224
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References intel_ring::cons, intel_ring::desc, dma_free(), intel_reset_ring(), intel_ring::len, intel_ring::map, 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 580 of file intel.c.

580  {
581  struct intel_descriptor *rx;
582  struct io_buffer *iobuf;
583  unsigned int rx_idx;
584  unsigned int rx_tail;
585  unsigned int refilled = 0;
586 
587  /* Refill ring */
588  while ( ( intel->rx.prod - intel->rx.cons ) < INTEL_RX_FILL ) {
589 
590  /* Allocate I/O buffer */
591  iobuf = alloc_rx_iob ( INTEL_RX_MAX_LEN, intel->dma );
592  if ( ! iobuf ) {
593  /* Wait for next refill */
594  break;
595  }
596 
597  /* Get next receive descriptor */
598  rx_idx = ( intel->rx.prod++ % INTEL_NUM_RX_DESC );
599  rx = &intel->rx.desc[rx_idx];
600 
601  /* Populate receive descriptor */
602  intel->rx.describe ( rx, iob_dma ( iobuf ), 0 );
603 
604  /* Record I/O buffer */
605  assert ( intel->rx_iobuf[rx_idx] == NULL );
606  intel->rx_iobuf[rx_idx] = iobuf;
607 
608  DBGC2 ( intel, "INTEL %p RX %d is [%lx,%lx)\n",
609  intel, rx_idx, virt_to_phys ( iobuf->data ),
610  ( virt_to_phys ( iobuf->data ) + INTEL_RX_MAX_LEN ) );
611  refilled++;
612  }
613 
614  /* Push descriptors to card, if applicable */
615  if ( refilled ) {
616  wmb();
617  rx_tail = ( intel->rx.prod % INTEL_NUM_RX_DESC );
618  profile_start ( &intel_vm_refill_profiler );
619  writel ( rx_tail, intel->regs + intel->rx.reg + INTEL_xDT );
620  profile_stop ( &intel_vm_refill_profiler );
621  profile_exclude ( &intel_vm_refill_profiler );
622  }
623 }
void * regs
Registers.
Definition: intel.h:291
wmb()
#define INTEL_NUM_RX_DESC
Number of receive descriptors.
Definition: intel.h:154
struct intel_ring rx
Receive descriptor ring.
Definition: intel.h:314
#define INTEL_xDT
Receive/Transmit Descriptor Tail (offset)
Definition: intel.h:192
static void profile_stop(struct profiler *profiler)
Stop profiling.
Definition: profile.h:171
unsigned int cons
Consumer index.
Definition: intel.h:230
static __always_inline unsigned long virt_to_phys(volatile const void *addr)
Convert virtual address to a physical address.
Definition: uaccess.h:287
unsigned int reg
Register block.
Definition: intel.h:233
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.
static __always_inline physaddr_t iob_dma(struct io_buffer *iobuf)
Get I/O buffer DMA address.
Definition: iobuf.h:264
struct io_buffer * rx_iobuf[INTEL_NUM_RX_DESC]
Receive I/O buffers.
Definition: intel.h:316
static void profile_start(struct profiler *profiler)
Start profiling.
Definition: profile.h:158
struct io_buffer * alloc_rx_iob(size_t len, struct dma_device *dma)
Allocate and map I/O buffer for receive DMA.
Definition: iobuf.c:181
#define INTEL_RX_MAX_LEN
Receive buffer length.
Definition: intel.h:160
void(* describe)(struct intel_descriptor *desc, physaddr_t addr, size_t len)
Populate descriptor.
Definition: intel.h:243
struct dma_device * dma
DMA device.
Definition: intel.h:293
A packet descriptor.
Definition: intel.h:21
#define DBGC2(...)
Definition: compiler.h:522
void * data
Start of data.
Definition: iobuf.h:48
unsigned int prod
Producer index.
Definition: intel.h:228
u8 rx[WPA_TKIP_MIC_KEY_LEN]
MIC key for packets from the AP.
Definition: wpa.h:234
#define INTEL_RX_FILL
Receive descriptor ring fill level.
Definition: intel.h:157
struct intel_descriptor * desc
Descriptors.
Definition: intel.h:224
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:321
A persistent I/O buffer.
Definition: iobuf.h:33

References alloc_rx_iob(), assert(), intel_ring::cons, io_buffer::data, DBGC2, intel_ring::desc, intel_ring::describe, intel_nic::dma, INTEL_NUM_RX_DESC, INTEL_RX_FILL, INTEL_RX_MAX_LEN, INTEL_xDT, iob_dma(), 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_phys(), 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 630 of file intel.c.

630  {
631  unsigned int i;
632 
633  /* Discard unused receive buffers */
634  for ( i = 0 ; i < INTEL_NUM_RX_DESC ; i++ ) {
635  if ( intel->rx_iobuf[i] )
636  free_rx_iob ( intel->rx_iobuf[i] );
637  intel->rx_iobuf[i] = NULL;
638  }
639 }
#define INTEL_NUM_RX_DESC
Number of receive descriptors.
Definition: intel.h:154
struct io_buffer * rx_iobuf[INTEL_NUM_RX_DESC]
Receive I/O buffers.
Definition: intel.h:316
void free_rx_iob(struct io_buffer *iobuf)
Unmap and free I/O buffer for receive DMA.
Definition: iobuf.c:208
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References free_rx_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 647 of file intel.c.

647  {
648  struct intel_nic *intel = netdev->priv;
650  uint32_t fextnvm11;
651  uint32_t tctl;
652  uint32_t rctl;
653  int rc;
654 
655  /* Set undocumented bit in FEXTNVM11 to work around an errata
656  * in i219 devices that will otherwise cause a complete
657  * datapath hang at the next device reset.
658  */
659  if ( intel->flags & INTEL_RST_HANG ) {
660  DBGC ( intel, "INTEL %p WARNING: applying reset hang "
661  "workaround\n", intel );
662  fextnvm11 = readl ( intel->regs + INTEL_FEXTNVM11 );
663  fextnvm11 |= INTEL_FEXTNVM11_WTF;
664  writel ( fextnvm11, intel->regs + INTEL_FEXTNVM11 );
665  }
666 
667  /* Create transmit descriptor ring */
668  if ( ( rc = intel_create_ring ( intel, &intel->tx ) ) != 0 )
669  goto err_create_tx;
670 
671  /* Create receive descriptor ring */
672  if ( ( rc = intel_create_ring ( intel, &intel->rx ) ) != 0 )
673  goto err_create_rx;
674 
675  /* Program MAC address */
676  memset ( &mac, 0, sizeof ( mac ) );
677  memcpy ( mac.raw, netdev->ll_addr, sizeof ( mac.raw ) );
678  writel ( le32_to_cpu ( mac.reg.low ), intel->regs + INTEL_RAL0 );
679  writel ( ( le32_to_cpu ( mac.reg.high ) | INTEL_RAH0_AV ),
680  intel->regs + INTEL_RAH0 );
681 
682  /* Enable transmitter */
683  tctl = readl ( intel->regs + INTEL_TCTL );
687  writel ( tctl, intel->regs + INTEL_TCTL );
688 
689  /* Enable receiver */
690  rctl = readl ( intel->regs + INTEL_RCTL );
691  rctl &= ~( INTEL_RCTL_BSIZE_BSEX_MASK );
694  writel ( rctl, intel->regs + INTEL_RCTL );
695 
696  /* Fill receive ring */
697  intel_refill_rx ( intel );
698 
699  /* Update link state */
701 
702  /* Apply required errata */
703  if ( intel->flags & INTEL_VMWARE ) {
704  DBGC ( intel, "INTEL %p applying VMware errata workaround\n",
705  intel );
706  intel->force_icr = INTEL_IRQ_RXT0;
707  }
708 
709  return 0;
710 
711  intel_destroy_ring ( intel, &intel->rx );
712  err_create_rx:
713  intel_destroy_ring ( intel, &intel->tx );
714  err_create_tx:
715  return rc;
716 }
unsigned int force_icr
Forced interrupts.
Definition: intel.h:299
void * regs
Registers.
Definition: intel.h:291
#define INTEL_RCTL_BSIZE_2048
Definition: intel.h:121
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define INTEL_IRQ_RXT0
Receive timer.
Definition: intel.h:104
#define le32_to_cpu(value)
Definition: byteswap.h:113
VMware missing interrupt workaround required.
Definition: intel.h:324
#define INTEL_RCTL_BSIZE_BSEX_MASK
Definition: intel.h:122
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:314
#define INTEL_TCTL_EN
Transmit enable.
Definition: intel.h:127
#define DBGC(...)
Definition: compiler.h:505
int intel_create_ring(struct intel_nic *intel, struct intel_ring *ring)
Create descriptor ring.
Definition: intel.c:511
uint8_t mac[ETH_ALEN]
MAC address.
Definition: ena.h:24
#define INTEL_RCTL_SECRC
Strip CRC.
Definition: intel.h:123
void intel_refill_rx(struct intel_nic *intel)
Refill receive descriptor ring.
Definition: intel.c:580
static void intel_check_link(struct net_device *netdev)
Check link state.
Definition: intel.c:365
#define INTEL_TCTL_CT_MASK
Definition: intel.h:131
void * memcpy(void *dest, const void *src, size_t len) __nonnull
#define INTEL_FEXTNVM11
Future Extended NVM register 11.
Definition: intel.h:209
void * priv
Driver private data.
Definition: netdevice.h:431
#define INTEL_FEXTNVM11_WTF
Don't ask.
Definition: intel.h:210
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:130
#define INTEL_RCTL_BAM
Broadcast accept mode.
Definition: intel.h:117
unsigned int uint32_t
Definition: stdint.h:12
#define INTEL_RCTL_UPE
Unicast promiscuous mode.
Definition: intel.h:115
#define INTEL_RCTL
Receive Control Register.
Definition: intel.h:113
#define INTEL_TCTL
Transmit Control Register.
Definition: intel.h:126
void intel_destroy_ring(struct intel_nic *intel, struct intel_ring *ring)
Destroy descriptor ring.
Definition: intel.c:563
An Intel network card.
Definition: intel.h:289
#define INTEL_TCTL_PSP
Pad short packets.
Definition: intel.h:128
struct intel_ring tx
Transmit descriptor ring.
Definition: intel.h:312
Receive address.
Definition: intel.h:213
Reset may cause a complete device hang.
Definition: intel.h:330
#define INTEL_RCTL_EN
Receive enable.
Definition: intel.h:114
#define INTEL_RAH0_AV
Address valid.
Definition: intel.h:206
#define INTEL_RAL0
Receive Address Low.
Definition: intel.h:202
#define INTEL_RAH0
Receive Address High.
Definition: intel.h:205
uint8_t ll_addr[MAX_LL_ADDR_LEN]
Link-layer address.
Definition: netdevice.h:387
#define INTEL_TCTL_COLD_MASK
Definition: intel.h:134
#define INTEL_TCTL_COLD_DEFAULT
Definition: intel.h:133
unsigned int flags
Flags.
Definition: intel.h:297
#define INTEL_RCTL_MPE
Multicast promiscuous.
Definition: intel.h:116
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 723 of file intel.c.

723  {
724  struct intel_nic *intel = netdev->priv;
725 
726  /* Disable receiver */
727  writel ( 0, intel->regs + INTEL_RCTL );
728 
729  /* Disable transmitter */
730  writel ( 0, intel->regs + INTEL_TCTL );
731 
732  /* Destroy receive descriptor ring */
733  intel_destroy_ring ( intel, &intel->rx );
734 
735  /* Discard any unused receive buffers */
736  intel_empty_rx ( intel );
737 
738  /* Destroy transmit descriptor ring */
739  intel_destroy_ring ( intel, &intel->tx );
740 
741  /* Reset the NIC, to flush the transmit and receive FIFOs */
742  intel_reset ( intel );
743 }
void * regs
Registers.
Definition: intel.h:291
struct intel_ring rx
Receive descriptor ring.
Definition: intel.h:314
void intel_empty_rx(struct intel_nic *intel)
Discard unused receive I/O buffers.
Definition: intel.c:630
static int intel_reset(struct intel_nic *intel)
Reset hardware.
Definition: intel.c:266
void * priv
Driver private data.
Definition: netdevice.h:431
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:113
#define INTEL_TCTL
Transmit Control Register.
Definition: intel.h:126
void intel_destroy_ring(struct intel_nic *intel, struct intel_ring *ring)
Destroy descriptor ring.
Definition: intel.c:563
An Intel network card.
Definition: intel.h:289
struct intel_ring tx
Transmit descriptor ring.
Definition: intel.h:312

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 752 of file intel.c.

752  {
753  struct intel_nic *intel = netdev->priv;
754  struct intel_descriptor *tx;
755  unsigned int tx_idx;
756  unsigned int tx_tail;
757  size_t len;
758 
759  /* Get next transmit descriptor */
760  if ( ( intel->tx.prod - intel->tx.cons ) >= INTEL_TX_FILL ) {
761  DBGC ( intel, "INTEL %p out of transmit descriptors\n", intel );
762  return -ENOBUFS;
763  }
764  tx_idx = ( intel->tx.prod++ % INTEL_NUM_TX_DESC );
765  tx_tail = ( intel->tx.prod % INTEL_NUM_TX_DESC );
766  tx = &intel->tx.desc[tx_idx];
767 
768  /* Populate transmit descriptor */
769  len = iob_len ( iobuf );
770  intel->tx.describe ( tx, iob_dma ( iobuf ), len );
771  wmb();
772 
773  /* Notify card that there are packets ready to transmit */
774  profile_start ( &intel_vm_tx_profiler );
775  writel ( tx_tail, intel->regs + intel->tx.reg + INTEL_xDT );
776  profile_stop ( &intel_vm_tx_profiler );
777  profile_exclude ( &intel_vm_tx_profiler );
778 
779  DBGC2 ( intel, "INTEL %p TX %d is [%lx,%lx)\n",
780  intel, tx_idx, virt_to_phys ( iobuf->data ),
781  ( virt_to_phys ( iobuf->data ) + len ) );
782 
783  return 0;
784 }
void * regs
Registers.
Definition: intel.h:291
wmb()
#define INTEL_NUM_TX_DESC
Number of transmit descriptors.
Definition: intel.h:174
#define DBGC(...)
Definition: compiler.h:505
#define INTEL_xDT
Receive/Transmit Descriptor Tail (offset)
Definition: intel.h:192
static void profile_stop(struct profiler *profiler)
Stop profiling.
Definition: profile.h:171
unsigned int cons
Consumer index.
Definition: intel.h:230
static __always_inline unsigned long virt_to_phys(volatile const void *addr)
Convert virtual address to a physical address.
Definition: uaccess.h:287
unsigned int reg
Register block.
Definition: intel.h:233
#define INTEL_TX_FILL
Transmit descriptor ring maximum fill level.
Definition: intel.h:177
void * priv
Driver private data.
Definition: netdevice.h:431
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 __always_inline physaddr_t iob_dma(struct io_buffer *iobuf)
Get I/O buffer DMA address.
Definition: iobuf.h:264
static void profile_start(struct profiler *profiler)
Start profiling.
Definition: profile.h:158
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition: iobuf.h:155
void(* describe)(struct intel_descriptor *desc, physaddr_t addr, size_t len)
Populate descriptor.
Definition: intel.h:243
A packet descriptor.
Definition: intel.h:21
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:48
unsigned int prod
Producer index.
Definition: intel.h:228
An Intel network card.
Definition: intel.h:289
struct intel_descriptor * desc
Descriptors.
Definition: intel.h:224
struct intel_ring tx
Transmit descriptor ring.
Definition: intel.h:312
static void profile_exclude(struct profiler *profiler)
Exclude time from other ongoing profiling results.
Definition: profile.h:184
u8 tx[WPA_TKIP_MIC_KEY_LEN]
MIC key for packets to the AP.
Definition: wpa.h:237

References 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_dma(), 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_phys(), wmb(), and writel().

◆ intel_poll_tx()

void intel_poll_tx ( struct net_device netdev)

Poll for completed packets.

Parameters
netdevNetwork device

Definition at line 791 of file intel.c.

791  {
792  struct intel_nic *intel = netdev->priv;
793  struct intel_descriptor *tx;
794  unsigned int tx_idx;
795 
796  /* Check for completed packets */
797  while ( intel->tx.cons != intel->tx.prod ) {
798 
799  /* Get next transmit descriptor */
800  tx_idx = ( intel->tx.cons % INTEL_NUM_TX_DESC );
801  tx = &intel->tx.desc[tx_idx];
802 
803  /* Stop if descriptor is still in use */
804  if ( ! ( tx->status & cpu_to_le32 ( INTEL_DESC_STATUS_DD ) ) )
805  return;
806 
807  DBGC2 ( intel, "INTEL %p TX %d complete\n", intel, tx_idx );
808 
809  /* Complete TX descriptor */
811  intel->tx.cons++;
812  }
813 }
#define INTEL_DESC_STATUS_DD
Descriptor done.
Definition: intel.h:51
static void netdev_tx_complete_next(struct net_device *netdev)
Complete network transmission.
Definition: netdevice.h:764
#define INTEL_NUM_TX_DESC
Number of transmit descriptors.
Definition: intel.h:174
unsigned int cons
Consumer index.
Definition: intel.h:230
void * priv
Driver private data.
Definition: netdevice.h:431
static struct net_device * netdev
Definition: gdbudp.c:52
#define cpu_to_le32(value)
Definition: byteswap.h:107
A packet descriptor.
Definition: intel.h:21
#define DBGC2(...)
Definition: compiler.h:522
unsigned int prod
Producer index.
Definition: intel.h:228
An Intel network card.
Definition: intel.h:289
struct intel_descriptor * desc
Descriptors.
Definition: intel.h:224
struct intel_ring tx
Transmit descriptor ring.
Definition: intel.h:312
u8 tx[WPA_TKIP_MIC_KEY_LEN]
MIC key for packets to the AP.
Definition: wpa.h:237

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 820 of file intel.c.

820  {
821  struct intel_nic *intel = netdev->priv;
822  struct intel_descriptor *rx;
823  struct io_buffer *iobuf;
824  unsigned int rx_idx;
825  size_t len;
826 
827  /* Check for received packets */
828  while ( intel->rx.cons != intel->rx.prod ) {
829 
830  /* Get next receive descriptor */
831  rx_idx = ( intel->rx.cons % INTEL_NUM_RX_DESC );
832  rx = &intel->rx.desc[rx_idx];
833 
834  /* Stop if descriptor is still in use */
835  if ( ! ( rx->status & cpu_to_le32 ( INTEL_DESC_STATUS_DD ) ) )
836  return;
837 
838  /* Populate I/O buffer */
839  iobuf = intel->rx_iobuf[rx_idx];
840  intel->rx_iobuf[rx_idx] = NULL;
841  len = le16_to_cpu ( rx->length );
842  iob_put ( iobuf, len );
843 
844  /* Hand off to network stack */
845  if ( rx->status & cpu_to_le32 ( INTEL_DESC_STATUS_RXE ) ) {
846  DBGC ( intel, "INTEL %p RX %d error (length %zd, "
847  "status %08x)\n", intel, rx_idx, len,
848  le32_to_cpu ( rx->status ) );
849  netdev_rx_err ( netdev, iobuf, -EIO );
850  } else {
851  DBGC2 ( intel, "INTEL %p RX %d complete (length %zd)\n",
852  intel, rx_idx, len );
853  netdev_rx ( netdev, iobuf );
854  }
855  intel->rx.cons++;
856  }
857 }
#define INTEL_DESC_STATUS_DD
Descriptor done.
Definition: intel.h:51
#define iob_put(iobuf, len)
Definition: iobuf.h:120
#define INTEL_NUM_RX_DESC
Number of receive descriptors.
Definition: intel.h:154
void netdev_rx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard received packet.
Definition: netdevice.c:586
#define le32_to_cpu(value)
Definition: byteswap.h:113
struct intel_ring rx
Receive descriptor ring.
Definition: intel.h:314
#define DBGC(...)
Definition: compiler.h:505
unsigned int cons
Consumer index.
Definition: intel.h:230
void * priv
Driver private data.
Definition: netdevice.h:431
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:316
#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:548
A packet descriptor.
Definition: intel.h:21
uint32_t len
Length.
Definition: ena.h:14
#define DBGC2(...)
Definition: compiler.h:522
unsigned int prod
Producer index.
Definition: intel.h:228
#define EIO
Input/output error.
Definition: errno.h:433
u8 rx[WPA_TKIP_MIC_KEY_LEN]
MIC key for packets from the AP.
Definition: wpa.h:234
An Intel network card.
Definition: intel.h:289
struct intel_descriptor * desc
Descriptors.
Definition: intel.h:224
#define INTEL_DESC_STATUS_RXE
Receive error.
Definition: intel.h:54
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
A persistent I/O buffer.
Definition: iobuf.h:33

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 864 of file intel.c.

864  {
865  struct intel_nic *intel = netdev->priv;
866  uint32_t icr;
867 
868  /* Check for and acknowledge interrupts */
869  profile_start ( &intel_vm_poll_profiler );
870  icr = readl ( intel->regs + INTEL_ICR );
871  profile_stop ( &intel_vm_poll_profiler );
872  profile_exclude ( &intel_vm_poll_profiler );
873  icr |= intel->force_icr;
874  if ( ! icr )
875  return;
876 
877  /* Poll for TX completions, if applicable */
878  if ( icr & INTEL_IRQ_TXDW )
879  intel_poll_tx ( netdev );
880 
881  /* Poll for RX completions, if applicable */
882  if ( icr & ( INTEL_IRQ_RXT0 | INTEL_IRQ_RXO ) )
883  intel_poll_rx ( netdev );
884 
885  /* Report receive overruns */
886  if ( icr & INTEL_IRQ_RXO )
888 
889  /* Check link state, if applicable */
890  if ( icr & INTEL_IRQ_LSC )
892 
893  /* Check for unexpected interrupts */
894  if ( icr & ~( INTEL_IRQ_TXDW | INTEL_IRQ_TXQE | INTEL_IRQ_LSC |
896  DBGC ( intel, "INTEL %p unexpected ICR %08x\n", intel, icr );
897  /* Report as a TX error */
899  }
900 
901  /* Refill RX ring */
902  intel_refill_rx ( intel );
903 }
unsigned int force_icr
Forced interrupts.
Definition: intel.h:299
void * regs
Registers.
Definition: intel.h:291
#define INTEL_ICR
Interrupt Cause Read Register.
Definition: intel.h:98
void netdev_rx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard received packet.
Definition: netdevice.c:586
#define INTEL_IRQ_RXDMT0
Receive queue low.
Definition: intel.h:102
void intel_poll_rx(struct net_device *netdev)
Poll for received packets.
Definition: intel.c:820
#define INTEL_IRQ_RXT0
Receive timer.
Definition: intel.h:104
void netdev_tx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard transmitted packet.
Definition: netdevice.c:440
void intel_poll_tx(struct net_device *netdev)
Poll for completed packets.
Definition: intel.c:791
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:99
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:580
static void intel_check_link(struct net_device *netdev)
Check link state.
Definition: intel.c:365
void * priv
Driver private data.
Definition: netdevice.h:431
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:289
#define INTEL_IRQ_TXQE
Transmit queue empty.
Definition: intel.h:100
#define INTEL_IRQ_LSC
Link status change.
Definition: intel.h:101
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:321
#define INTEL_IRQ_RXO
Receive overrun.
Definition: intel.h:103

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 911 of file intel.c.

911  {
912  struct intel_nic *intel = netdev->priv;
913  uint32_t mask;
914 
916  if ( enable ) {
917  writel ( mask, intel->regs + INTEL_IMS );
918  } else {
919  writel ( mask, intel->regs + INTEL_IMC );
920  }
921 }
void * regs
Registers.
Definition: intel.h:291
#define INTEL_IRQ_RXT0
Receive timer.
Definition: intel.h:104
#define INTEL_IRQ_TXDW
Transmit descriptor done.
Definition: intel.h:99
void * priv
Driver private data.
Definition: netdevice.h:431
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:107
unsigned int uint32_t
Definition: stdint.h:12
An Intel network card.
Definition: intel.h:289
#define INTEL_IRQ_LSC
Link status change.
Definition: intel.h:101
#define INTEL_IMC
Interrupt Mask Clear Register.
Definition: intel.h:110

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 945 of file intel.c.

945  {
946  struct net_device *netdev;
947  struct intel_nic *intel;
948  int rc;
949 
950  /* Allocate and initialise net device */
951  netdev = alloc_etherdev ( sizeof ( *intel ) );
952  if ( ! netdev ) {
953  rc = -ENOMEM;
954  goto err_alloc;
955  }
957  intel = netdev->priv;
958  pci_set_drvdata ( pci, netdev );
959  netdev->dev = &pci->dev;
960  memset ( intel, 0, sizeof ( *intel ) );
961  intel->port = PCI_FUNC ( pci->busdevfn );
962  intel->flags = pci->id->driver_data;
967 
968  /* Fix up PCI device */
969  adjust_pci_device ( pci );
970 
971  /* Map registers */
972  intel->regs = pci_ioremap ( pci, pci->membase, INTEL_BAR_SIZE );
973  if ( ! intel->regs ) {
974  rc = -ENODEV;
975  goto err_ioremap;
976  }
977 
978  /* Configure DMA */
979  intel->dma = &pci->dma;
980  dma_set_mask_64bit ( intel->dma );
981  netdev->dma = intel->dma;
982 
983  /* Reset the NIC */
984  if ( ( rc = intel_reset ( intel ) ) != 0 )
985  goto err_reset;
986 
987  /* Fetch MAC address */
988  if ( ( rc = intel_fetch_mac ( intel, netdev->hw_addr ) ) != 0 )
989  goto err_fetch_mac;
990 
991  /* Register network device */
992  if ( ( rc = register_netdev ( netdev ) ) != 0 )
993  goto err_register_netdev;
994 
995  /* Set initial link state */
997 
998  return 0;
999 
1001  err_register_netdev:
1002  err_fetch_mac:
1003  intel_reset ( intel );
1004  err_reset:
1005  iounmap ( intel->regs );
1006  err_ioremap:
1007  netdev_nullify ( netdev );
1008  netdev_put ( netdev );
1009  err_alloc:
1010  return rc;
1011 }
void * regs
Registers.
Definition: intel.h:291
#define PCI_FUNC(busdevfn)
Definition: pci.h:281
unsigned long membase
Memory base.
Definition: pci.h:215
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
struct dma_device dma
DMA device.
Definition: pci.h:210
#define INTEL_NUM_RX_DESC
Number of receive descriptors.
Definition: intel.h:154
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:147
unsigned long driver_data
Arbitrary driver data.
Definition: pci.h:178
#define INTEL_NUM_TX_DESC
Number of transmit descriptors.
Definition: intel.h:174
struct intel_ring rx
Receive descriptor ring.
Definition: intel.h:314
static __always_inline void dma_set_mask_64bit(struct dma_device *dma)
Set 64-bit addressable space mask.
Definition: dma.h:474
void intel_describe_tx(struct intel_descriptor *tx, physaddr_t addr, size_t len)
Populate transmit descriptor.
Definition: intel.c:395
struct dma_device * dma
DMA device.
Definition: netdevice.h:366
#define INTEL_BAR_SIZE
Intel BAR size.
Definition: intel.h:18
void adjust_pci_device(struct pci_device *pci)
Enable PCI device.
Definition: pci.c:154
static void intel_init_ring(struct intel_ring *ring, unsigned int count, unsigned int reg, void(*describe)(struct intel_descriptor *desc, physaddr_t addr, size_t len))
Initialise descriptor ring.
Definition: intel.h:256
struct device dev
Generic device.
Definition: pci.h:208
static void intel_check_link(struct net_device *netdev)
Check link state.
Definition: intel.c:365
unsigned int port
Port number (for multi-port devices)
Definition: intel.h:295
static void netdev_init(struct net_device *netdev, struct net_device_operations *op)
Initialise a network device.
Definition: netdevice.h:515
static void pci_set_drvdata(struct pci_device *pci, void *priv)
Set PCI driver-private data.
Definition: pci.h:359
#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:572
static int intel_reset(struct intel_nic *intel)
Reset hardware.
Definition: intel.c:266
void * priv
Driver private data.
Definition: netdevice.h:431
void intel_describe_rx(struct intel_descriptor *rx, physaddr_t addr, size_t len __unused)
Populate receive descriptor.
Definition: intel.c:433
static struct net_device * netdev
Definition: gdbudp.c:52
void unregister_netdev(struct net_device *netdev)
Unregister network device.
Definition: netdevice.c:941
static struct net_device_operations intel_operations
Intel network device operations.
Definition: intel.c:924
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:528
struct device * dev
Underlying hardware device.
Definition: netdevice.h:364
struct dma_device * dma
DMA device.
Definition: intel.h:293
uint32_t busdevfn
Segment, bus, device, and function (bus:dev.fn) number.
Definition: pci.h:233
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:243
An Intel network card.
Definition: intel.h:289
void iounmap(volatile const void *io_addr)
Unmap I/O address.
struct intel_ring tx
Transmit descriptor ring.
Definition: intel.h:312
void * pci_ioremap(struct pci_device *pci, unsigned long bus_addr, size_t len)
Map PCI bus address as an I/O address.
unsigned int flags
Flags.
Definition: intel.h:297
uint8_t hw_addr[MAX_HW_ADDR_LEN]
Hardware address.
Definition: netdevice.h:381
#define INTEL_TD
Transmit Descriptor register block.
Definition: intel.h:167
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::dma, intel_nic::dma, net_device::dma, dma_set_mask_64bit(), 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_init_ring(), INTEL_NUM_RX_DESC, INTEL_NUM_TX_DESC, intel_operations, INTEL_RD, intel_reset(), INTEL_TD, iounmap(), pci_device::membase, memset(), netdev, netdev_init(), netdev_nullify(), netdev_put(), PCI_FUNC, pci_ioremap(), 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 1018 of file intel.c.

1018  {
1019  struct net_device *netdev = pci_get_drvdata ( pci );
1020  struct intel_nic *intel = netdev->priv;
1021 
1022  /* Unregister network device */
1024 
1025  /* Reset the NIC */
1026  intel_reset ( intel );
1027 
1028  /* Free network device */
1029  iounmap ( intel->regs );
1030  netdev_nullify ( netdev );
1031  netdev_put ( netdev );
1032 }
void * regs
Registers.
Definition: intel.h:291
static void netdev_put(struct net_device *netdev)
Drop reference to network device.
Definition: netdevice.h:572
static int intel_reset(struct intel_nic *intel)
Reset hardware.
Definition: intel.c:266
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:528
static void * pci_get_drvdata(struct pci_device *pci)
Get PCI driver-private data.
Definition: pci.h:369
An Intel network card.
Definition: intel.h:289
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:647
static void intel_irq(struct net_device *netdev, int enable)
Enable or disable interrupts.
Definition: intel.c:911
static void intel_poll(struct net_device *netdev)
Poll for completed and received packets.
Definition: intel.c:864
int intel_transmit(struct net_device *netdev, struct io_buffer *iobuf)
Transmit packet.
Definition: intel.c:752
static void intel_close(struct net_device *netdev)
Close network device.
Definition: intel.c:723

Intel network device operations.

Definition at line 924 of file intel.c.

Referenced by intel_probe().

◆ intel_nics

struct pci_device_id intel_nics[]
static

Intel PCI device IDs.

Definition at line 1035 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:945
static struct pci_device_id intel_nics[]
Intel PCI device IDs.
Definition: intel.c:1035
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:1018

Intel PCI driver.

Definition at line 1199 of file intel.c.