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)
 
 FILE_SECBOOT (PERMITTED)
 
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  )

◆ FILE_SECBOOT()

FILE_SECBOOT ( PERMITTED  )

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

76  {
77  struct intel_nic *intel =
78  container_of ( nvs, struct intel_nic, eeprom );
79  unsigned int i;
81  uint16_t *data_word = data;
82 
83  /* Sanity check. We advertise a blocksize of one word, so
84  * should only ever receive single-word requests.
85  */
86  assert ( len == sizeof ( *data_word ) );
87 
88  /* Initiate read */
89  writel ( ( INTEL_EERD_START | ( address << intel->eerd_addr_shift ) ),
90  intel->regs + INTEL_EERD );
91 
92  /* Wait for read to complete */
93  for ( i = 0 ; i < INTEL_EEPROM_MAX_WAIT_MS ; i++ ) {
94 
95  /* If read is not complete, delay 1ms and retry */
96  value = readl ( intel->regs + INTEL_EERD );
97  if ( ! ( value & intel->eerd_done ) ) {
98  mdelay ( 1 );
99  continue;
100  }
101 
102  /* Extract data */
103  *data_word = cpu_to_le16 ( INTEL_EERD_DATA ( value ) );
104  return 0;
105  }
106 
107  DBGC ( intel, "INTEL %p timed out waiting for EEPROM read\n", intel );
108  return -ETIMEDOUT;
109 }
void * regs
Registers.
Definition: intel.h:292
unsigned short uint16_t
Definition: stdint.h:11
#define INTEL_EERD
EEPROM Read Register.
Definition: intel.h:78
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:36
pseudo_bit_t value[0x00020]
Definition: arbel.h:13
#define INTEL_EERD_DATA(value)
Read data.
Definition: intel.h:84
ring len
Length.
Definition: dwmac.h:231
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:305
#define INTEL_EEPROM_MAX_WAIT_MS
Maximum time to wait for EEPROM read, in milliseconds.
Definition: intel.h:87
unsigned int uint32_t
Definition: stdint.h:12
void mdelay(unsigned long msecs)
Delay for a fixed number of milliseconds.
Definition: timer.c:79
#define cpu_to_le16(value)
Definition: byteswap.h:107
An Intel network card.
Definition: intel.h:290
uint8_t data[48]
Additional event data.
Definition: ena.h:22
#define INTEL_EERD_START
Start read.
Definition: intel.h:79
unsigned int eerd_addr_shift
EEPROM address shift.
Definition: intel.h:307
#define ETIMEDOUT
Connection timed out.
Definition: errno.h:670

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

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

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

137  {
138  unsigned int i;
139  uint32_t value;
140 
141  /* The NIC automatically detects the type of attached EEPROM.
142  * The EERD register provides access to only a single word at
143  * a time, so we pretend to have a single-word block size.
144  *
145  * The EEPROM size may be larger than the minimum size, but
146  * this doesn't matter to us since we access only the first
147  * few words.
148  */
151  intel->eeprom.block_size = 1;
152  intel->eeprom.read = intel_read_eeprom;
154 
155  /* The layout of the EERD register was changed at some point
156  * to accommodate larger EEPROMs. Read from address zero (for
157  * which the request layouts are compatible) to determine
158  * which type of register we have.
159  */
160  writel ( INTEL_EERD_START, intel->regs + INTEL_EERD );
161  for ( i = 0 ; i < INTEL_EEPROM_MAX_WAIT_MS ; i++ ) {
162  value = readl ( intel->regs + INTEL_EERD );
163  if ( value & INTEL_EERD_DONE_LARGE ) {
164  DBGC ( intel, "INTEL %p has large-format EERD\n",
165  intel );
168  return 0;
169  }
170  if ( value & INTEL_EERD_DONE_SMALL ) {
171  DBGC ( intel, "INTEL %p has small-format EERD\n",
172  intel );
175  return 0;
176  }
177  mdelay ( 1 );
178  }
179 
180  DBGC ( intel, "INTEL %p timed out waiting for initial EEPROM read "
181  "(value %08x)\n", intel, value );
182  return -ETIMEDOUT;
183 }
void * regs
Registers.
Definition: intel.h:292
int(* write)(struct nvs_device *nvs, unsigned int address, const void *data, size_t len)
Write data to device.
Definition: nvs.h:60
unsigned int word_len_log2
Word length.
Definition: nvs.h:23
#define INTEL_EERD
EEPROM Read Register.
Definition: intel.h:78
#define INTEL_EERD_DONE_SMALL
Read done (small EERD)
Definition: intel.h:80
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:37
pseudo_bit_t value[0x00020]
Definition: arbel.h:13
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:305
#define INTEL_EEPROM_WORD_LEN_LOG2
EEPROM word length.
Definition: intel.h:90
#define INTEL_EERD_ADDR_SHIFT_SMALL
Address shift (small)
Definition: intel.h:82
int(* read)(struct nvs_device *nvs, unsigned int address, void *data, size_t len)
Read data from device.
Definition: nvs.h:48
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:120
#define INTEL_EEPROM_MAX_WAIT_MS
Maximum time to wait for EEPROM read, in milliseconds.
Definition: intel.h:87
unsigned int uint32_t
Definition: stdint.h:12
void mdelay(unsigned long msecs)
Delay for a fixed number of milliseconds.
Definition: timer.c:79
#define INTEL_EERD_DONE_LARGE
Read done (large EERD)
Definition: intel.h:81
#define INTEL_EERD_ADDR_SHIFT_LARGE
Address shift (large)
Definition: intel.h:83
static int intel_read_eeprom(struct nvs_device *nvs, unsigned int address, void *data, size_t len)
Read data from EEPROM.
Definition: intel.c:75
#define INTEL_EERD_START
Start read.
Definition: intel.h:79
unsigned int eerd_addr_shift
EEPROM address shift.
Definition: intel.h:307
#define INTEL_EEPROM_MIN_SIZE_WORDS
Minimum EEPROM size, in words.
Definition: intel.h:93
struct nvs_device eeprom
EEPROM.
Definition: intel.h:303
#define ETIMEDOUT
Connection timed out.
Definition: errno.h:670
unsigned int size
Device size (in words)
Definition: nvs.h:25

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

200  {
201  int rc;
202 
203  /* Initialise EEPROM */
204  if ( ( rc = intel_init_eeprom ( intel ) ) != 0 )
205  return rc;
206 
207  /* Read base MAC address from EEPROM */
208  if ( ( rc = nvs_read ( &intel->eeprom, INTEL_EEPROM_MAC,
209  hw_addr, ETH_ALEN ) ) != 0 ) {
210  DBGC ( intel, "INTEL %p could not read EEPROM base MAC "
211  "address: %s\n", intel, strerror ( rc ) );
212  return rc;
213  }
214 
215  /* Adjust MAC address for multi-port devices */
216  hw_addr[ETH_ALEN-1] ^= intel->port;
217 
218  DBGC ( intel, "INTEL %p has EEPROM MAC address %s (port %d)\n",
219  intel, eth_ntoa ( hw_addr ), intel->port );
220  return 0;
221 }
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:296
#define INTEL_EEPROM_MAC
Offset of MAC address within EEPROM.
Definition: intel.h:96
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:79
const char * eth_ntoa(const void *ll_addr)
Transcribe Ethernet address.
Definition: ethernet.c:176
#define ETH_ALEN
Definition: if_ether.h:9
int nvs_read(struct nvs_device *nvs, unsigned int address, void *data, size_t len)
Read from non-volatile storage device.
Definition: nvs.c:76
static int intel_init_eeprom(struct intel_nic *intel)
Initialise EEPROM.
Definition: intel.c:137
struct nvs_device eeprom
EEPROM.
Definition: intel.h:303

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

230  {
232  int rc;
233 
234  /* Read current address from RAL0/RAH0 */
235  mac.reg.low = cpu_to_le32 ( readl ( intel->regs + INTEL_RAL0 ) );
236  mac.reg.high = cpu_to_le32 ( readl ( intel->regs + INTEL_RAH0 ) );
237  DBGC ( intel, "INTEL %p has autoloaded MAC address %s\n",
238  intel, eth_ntoa ( mac.raw ) );
239 
240  /* Use current address if valid */
241  if ( is_valid_ether_addr ( mac.raw ) ) {
242  memcpy ( hw_addr, mac.raw, ETH_ALEN );
243  return 0;
244  }
245 
246  /* Otherwise, try to read address from EEPROM */
247  if ( ( rc = intel_fetch_mac_eeprom ( intel, hw_addr ) ) == 0 )
248  return 0;
249 
250  DBGC ( intel, "INTEL %p has no MAC address to use\n", intel );
251  return -ENOENT;
252 }
void * regs
Registers.
Definition: intel.h:292
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:199
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:515
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:108
const char * eth_ntoa(const void *ll_addr)
Transcribe Ethernet address.
Definition: ethernet.c:176
#define ETH_ALEN
Definition: if_ether.h:9
static int is_valid_ether_addr(const void *addr)
Check if Ethernet address is valid.
Definition: ethernet.h:78
Receive address.
Definition: intel.h:214
#define INTEL_RAL0
Receive Address Low.
Definition: intel.h:203
#define INTEL_RAH0
Receive Address High.
Definition: intel.h:206

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

267  {
268  uint32_t pbs;
269  uint32_t pba;
270  uint32_t ctrl;
272  uint32_t orig_ctrl;
273  uint32_t orig_status;
274 
275  /* Record initial control and status register values */
276  orig_ctrl = ctrl = readl ( intel->regs + INTEL_CTRL );
277  orig_status = readl ( intel->regs + INTEL_STATUS );
278 
279  /* Force RX and TX packet buffer allocation, to work around an
280  * errata in ICH devices.
281  */
282  if ( intel->flags & INTEL_PBS_ERRATA ) {
283  DBGC ( intel, "INTEL %p WARNING: applying ICH PBS/PBA errata\n",
284  intel );
285  pbs = readl ( intel->regs + INTEL_PBS );
286  pba = readl ( intel->regs + INTEL_PBA );
287  writel ( 0x08, intel->regs + INTEL_PBA );
288  writel ( 0x10, intel->regs + INTEL_PBS );
289  DBGC ( intel, "INTEL %p PBS %#08x->%#08x PBA %#08x->%#08x\n",
290  intel, pbs, readl ( intel->regs + INTEL_PBS ),
291  pba, readl ( intel->regs + INTEL_PBA ) );
292  }
293 
294  /* The Intel I210's packet buffer size registers reset only on
295  * power up. If an operating system changes these but then
296  * the computer recieves a reset signal without losing power,
297  * the registers will stay the same (but be incompatible with
298  * other register defaults), thus making the device unable to
299  * pass traffic.
300  */
301  if ( intel->flags & INTEL_PBSIZE_RST ) {
302  writel ( INTEL_RXPBS_I210, intel->regs + INTEL_RXPBS );
303  writel ( INTEL_TXPBS_I210, intel->regs + INTEL_TXPBS );
304  }
305 
306  /* Always reset MAC. Required to reset the TX and RX rings. */
307  writel ( ( ctrl | INTEL_CTRL_RST ), intel->regs + INTEL_CTRL );
309 
310  /* Set a sensible default configuration */
311  if ( ! ( intel->flags & INTEL_NO_ASDE ) )
313  ctrl |= INTEL_CTRL_SLU;
315  writel ( ctrl, intel->regs + INTEL_CTRL );
317 
318  /* On some models (notably ICH), the PHY reset mechanism
319  * appears to be broken. In particular, the PHY_CTRL register
320  * will be correctly loaded from NVM but the values will not
321  * be propagated to the "OEM bits" PHY register. This
322  * typically has the effect of dropping the link speed to
323  * 10Mbps.
324  *
325  * Work around this problem by skipping the PHY reset if
326  * either (a) the link is already up, or (b) this particular
327  * NIC is known to be broken.
328  */
329  status = readl ( intel->regs + INTEL_STATUS );
330  if ( ( intel->flags & INTEL_NO_PHY_RST ) ||
331  ( status & INTEL_STATUS_LU ) ) {
332  DBGC ( intel, "INTEL %p %sMAC reset (%08x/%08x was "
333  "%08x/%08x)\n", intel,
334  ( ( intel->flags & INTEL_NO_PHY_RST ) ? "forced " : "" ),
335  ctrl, status, orig_ctrl, orig_status );
336  return 0;
337  }
338 
339  /* Reset PHY and MAC simultaneously */
341  intel->regs + INTEL_CTRL );
343 
344  /* PHY reset is not self-clearing on all models */
345  writel ( ctrl, intel->regs + INTEL_CTRL );
347  status = readl ( intel->regs + INTEL_STATUS );
348 
349  DBGC ( intel, "INTEL %p MAC+PHY reset (%08x/%08x was %08x/%08x)\n",
350  intel, ctrl, status, orig_ctrl, orig_status );
351  return 0;
352 }
void * regs
Registers.
Definition: intel.h:292
PHY reset is broken.
Definition: intel.h:327
#define INTEL_PBA
Packet Buffer Allocation.
Definition: intel.h:138
ASDE is broken.
Definition: intel.h:329
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:164
#define INTEL_PBS
Packet Buffer Size.
Definition: intel.h:141
PBS/PBA errata workaround required.
Definition: intel.h:323
#define INTEL_CTRL_FRCDPLX
Force duplex.
Definition: intel.h:66
#define INTEL_CTRL_ASDE
Auto-speed detection.
Definition: intel.h:63
PBSIZE registers must be explicitly reset.
Definition: intel.h:333
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:62
#define INTEL_CTRL_RST
Device reset.
Definition: intel.h:67
#define INTEL_STATUS_LU
Link up.
Definition: intel.h:75
unsigned int uint32_t
Definition: stdint.h:12
uint8_t status
Status.
Definition: ena.h:16
#define INTEL_CTRL
Device Control Register.
Definition: intel.h:61
void mdelay(unsigned long msecs)
Delay for a fixed number of milliseconds.
Definition: timer.c:79
#define INTEL_TXPBS_I210
I210 power-up default.
Definition: intel.h:165
#define INTEL_CTRL_PHY_RST
PHY reset.
Definition: intel.h:68
#define INTEL_RESET_DELAY_MS
Time to delay for device reset, in milliseconds.
Definition: intel.h:71
#define INTEL_CTRL_SLU
Set link up.
Definition: intel.h:64
uint8_t ctrl
Ring control.
Definition: dwmac.h:18
#define INTEL_RXPBS_I210
I210 power-up default.
Definition: intel.h:145
#define INTEL_STATUS
Device Status Register.
Definition: intel.h:74
unsigned int flags
Flags.
Definition: intel.h:298
#define INTEL_CTRL_FRCSPD
Force speed.
Definition: intel.h:65
#define INTEL_RXPBS
Receive packet buffer size.
Definition: intel.h:144

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

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

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

397  {
398 
399  /* Populate transmit descriptor */
400  tx->address = cpu_to_le64 ( addr );
401  tx->length = cpu_to_le16 ( len );
402  tx->flags = 0;
403  tx->command = ( INTEL_DESC_CMD_RS | INTEL_DESC_CMD_IFCS |
405  tx->status = 0;
406 }
#define cpu_to_le64(value)
Definition: byteswap.h:109
ring len
Length.
Definition: dwmac.h:231
#define INTEL_DESC_CMD_IFCS
Insert frame checksum (CRC)
Definition: intel.h:46
uint32_t addr
Buffer address.
Definition: dwmac.h:20
#define INTEL_DESC_CMD_EOP
End of packet.
Definition: intel.h:49
#define cpu_to_le16(value)
Definition: byteswap.h:107
#define INTEL_DESC_CMD_RS
Report status.
Definition: intel.h:43
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 415 of file intel.c.

416  {
417 
418  /* Populate advanced transmit descriptor */
419  tx->address = cpu_to_le64 ( addr );
420  tx->length = cpu_to_le16 ( len );
421  tx->flags = INTEL_DESC_FL_DTYP_DATA;
422  tx->command = ( INTEL_DESC_CMD_DEXT | INTEL_DESC_CMD_RS |
424  tx->status = cpu_to_le32 ( INTEL_DESC_STATUS_PAYLEN ( len ) );
425 }
#define INTEL_DESC_STATUS_PAYLEN(len)
Payload length.
Definition: intel.h:58
#define cpu_to_le64(value)
Definition: byteswap.h:109
#define INTEL_DESC_FL_DTYP_DATA
Definition: intel.h:37
ring len
Length.
Definition: dwmac.h:231
#define INTEL_DESC_CMD_IFCS
Insert frame checksum (CRC)
Definition: intel.h:46
#define cpu_to_le32(value)
Definition: byteswap.h:108
uint32_t addr
Buffer address.
Definition: dwmac.h:20
#define INTEL_DESC_CMD_DEXT
Descriptor extension.
Definition: intel.h:40
#define INTEL_DESC_CMD_EOP
End of packet.
Definition: intel.h:49
#define cpu_to_le16(value)
Definition: byteswap.h:107
#define INTEL_DESC_CMD_RS
Report status.
Definition: intel.h:43
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 434 of file intel.c.

435  {
436 
437  /* Populate transmit descriptor */
438  rx->address = cpu_to_le64 ( addr );
439  rx->length = 0;
440  rx->status = 0;
441 }
#define cpu_to_le64(value)
Definition: byteswap.h:109
uint32_t addr
Buffer address.
Definition: dwmac.h:20
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 457 of file intel.c.

457  {
458  uint32_t dctl;
459  unsigned int i;
460 
461  /* Disable ring */
462  writel ( 0, ( intel->regs + reg + INTEL_xDCTL ) );
463 
464  /* Wait for disable to complete */
465  for ( i = 0 ; i < INTEL_DISABLE_MAX_WAIT_MS ; i++ ) {
466 
467  /* Check if ring is disabled */
468  dctl = readl ( intel->regs + reg + INTEL_xDCTL );
469  if ( ! ( dctl & INTEL_xDCTL_ENABLE ) )
470  return 0;
471 
472  /* Delay */
473  mdelay ( 1 );
474  }
475 
476  DBGC ( intel, "INTEL %p ring %05x timed out waiting for disable "
477  "(dctl %08x)\n", intel, reg, dctl );
478  return -ETIMEDOUT;
479 }
void * regs
Registers.
Definition: intel.h:292
static unsigned int unsigned int reg
Definition: myson.h:162
#define INTEL_xDCTL
Receive/Transmit Descriptor Control (offset)
Definition: intel.h:196
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:200
unsigned int uint32_t
Definition: stdint.h:12
void mdelay(unsigned long msecs)
Delay for a fixed number of milliseconds.
Definition: timer.c:79
#define INTEL_xDCTL_ENABLE
Queue enable.
Definition: intel.h:197
#define ETIMEDOUT
Connection timed out.
Definition: errno.h:670

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

488  {
489 
490  /* Disable ring. Ignore errors and continue to reset the ring anyway */
491  intel_disable_ring ( intel, reg );
492 
493  /* Clear ring length */
494  writel ( 0, ( intel->regs + reg + INTEL_xDLEN ) );
495 
496  /* Clear ring address */
497  writel ( 0, ( intel->regs + reg + INTEL_xDBAH ) );
498  writel ( 0, ( intel->regs + reg + INTEL_xDBAL ) );
499 
500  /* Reset head and tail pointers */
501  writel ( 0, ( intel->regs + reg + INTEL_xDH ) );
502  writel ( 0, ( intel->regs + reg + INTEL_xDT ) );
503 }
void * regs
Registers.
Definition: intel.h:292
static unsigned int unsigned int reg
Definition: myson.h:162
#define INTEL_xDT
Receive/Transmit Descriptor Tail (offset)
Definition: intel.h:193
#define INTEL_xDLEN
Receive/Transmit Descriptor Length (offset)
Definition: intel.h:187
#define INTEL_xDH
Receive/Transmit Descriptor Head (offset)
Definition: intel.h:190
#define INTEL_xDBAL
Receive/Transmit Descriptor Base Address Low (offset)
Definition: intel.h:181
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:457
#define INTEL_xDBAH
Receive/Transmit Descriptor Base Address High (offset)
Definition: intel.h:184

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

512  {
514  uint32_t dctl;
515 
516  /* Allocate descriptor ring. Align ring on its own size to
517  * prevent any possible page-crossing errors due to hardware
518  * errata.
519  */
520  ring->desc = dma_alloc ( intel->dma, &ring->map, ring->len,
521  ring->len );
522  if ( ! ring->desc )
523  return -ENOMEM;
524 
525  /* Initialise descriptor ring */
526  memset ( ring->desc, 0, ring->len );
527 
528  /* Program ring address */
529  address = dma ( &ring->map, ring->desc );
530  writel ( ( address & 0xffffffffUL ),
531  ( intel->regs + ring->reg + INTEL_xDBAL ) );
532  if ( sizeof ( physaddr_t ) > sizeof ( uint32_t ) ) {
533  writel ( ( ( ( uint64_t ) address ) >> 32 ),
534  ( intel->regs + ring->reg + INTEL_xDBAH ) );
535  } else {
536  writel ( 0, intel->regs + ring->reg + INTEL_xDBAH );
537  }
538 
539  /* Program ring length */
540  writel ( ring->len, ( intel->regs + ring->reg + INTEL_xDLEN ) );
541 
542  /* Reset head and tail pointers */
543  writel ( 0, ( intel->regs + ring->reg + INTEL_xDH ) );
544  writel ( 0, ( intel->regs + ring->reg + INTEL_xDT ) );
545 
546  /* Enable ring */
547  dctl = readl ( intel->regs + ring->reg + INTEL_xDCTL );
548  dctl |= INTEL_xDCTL_ENABLE;
549  writel ( dctl, intel->regs + ring->reg + INTEL_xDCTL );
550 
551  DBGC ( intel, "INTEL %p ring %05x is at [%08lx,%08lx)\n",
552  intel, ring->reg, virt_to_phys ( ring->desc ),
553  ( virt_to_phys ( ring->desc ) + ring->len ) );
554 
555  return 0;
556 }
void * regs
Registers.
Definition: intel.h:292
struct dma_mapping map
Descriptor ring DMA mapping.
Definition: intel.h:227
#define INTEL_xDCTL
Receive/Transmit Descriptor Control (offset)
Definition: intel.h:196
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:193
size_t len
Length (in bytes)
Definition: intel.h:236
unsigned long long uint64_t
Definition: stdint.h:13
#define INTEL_xDLEN
Receive/Transmit Descriptor Length (offset)
Definition: intel.h:187
unsigned int reg
Register block.
Definition: intel.h:234
#define INTEL_xDH
Receive/Transmit Descriptor Head (offset)
Definition: intel.h:190
#define ENOMEM
Not enough space.
Definition: errno.h:535
#define INTEL_xDBAL
Receive/Transmit Descriptor Base Address Low (offset)
Definition: intel.h:181
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:294
#define INTEL_xDCTL_ENABLE
Queue enable.
Definition: intel.h:197
struct intel_descriptor * desc
Descriptors.
Definition: intel.h:225
#define INTEL_xDBAH
Receive/Transmit Descriptor Base Address High (offset)
Definition: intel.h:184
physaddr_t dma(struct dma_mapping *map, void *addr)
Get DMA address from virtual address.
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, 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 564 of file intel.c.

564  {
565 
566  /* Reset ring */
567  intel_reset_ring ( intel, ring->reg );
568 
569  /* Free descriptor ring */
570  dma_free ( &ring->map, ring->desc, ring->len );
571  ring->desc = NULL;
572  ring->prod = 0;
573  ring->cons = 0;
574 }
void intel_reset_ring(struct intel_nic *intel, unsigned int reg)
Reset descriptor ring.
Definition: intel.c:488
struct dma_mapping map
Descriptor ring DMA mapping.
Definition: intel.h:227
size_t len
Length (in bytes)
Definition: intel.h:236
unsigned int cons
Consumer index.
Definition: intel.h:231
unsigned int reg
Register block.
Definition: intel.h:234
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:229
struct intel_descriptor * desc
Descriptors.
Definition: intel.h:225
#define NULL
NULL pointer (VOID *)
Definition: Base.h:322

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

581  {
582  struct intel_descriptor *rx;
583  struct io_buffer *iobuf;
584  unsigned int rx_idx;
585  unsigned int rx_tail;
586  unsigned int refilled = 0;
587 
588  /* Refill ring */
589  while ( ( intel->rx.prod - intel->rx.cons ) < INTEL_RX_FILL ) {
590 
591  /* Allocate I/O buffer */
592  iobuf = alloc_rx_iob ( INTEL_RX_MAX_LEN, intel->dma );
593  if ( ! iobuf ) {
594  /* Wait for next refill */
595  break;
596  }
597 
598  /* Get next receive descriptor */
599  rx_idx = ( intel->rx.prod++ % INTEL_NUM_RX_DESC );
600  rx = &intel->rx.desc[rx_idx];
601 
602  /* Populate receive descriptor */
603  intel->rx.describe ( rx, iob_dma ( iobuf ), 0 );
604 
605  /* Record I/O buffer */
606  assert ( intel->rx_iobuf[rx_idx] == NULL );
607  intel->rx_iobuf[rx_idx] = iobuf;
608 
609  DBGC2 ( intel, "INTEL %p RX %d is [%lx,%lx)\n",
610  intel, rx_idx, virt_to_phys ( iobuf->data ),
611  ( virt_to_phys ( iobuf->data ) + INTEL_RX_MAX_LEN ) );
612  refilled++;
613  }
614 
615  /* Push descriptors to card, if applicable */
616  if ( refilled ) {
617  wmb();
618  rx_tail = ( intel->rx.prod % INTEL_NUM_RX_DESC );
619  profile_start ( &intel_vm_refill_profiler );
620  writel ( rx_tail, intel->regs + intel->rx.reg + INTEL_xDT );
621  profile_stop ( &intel_vm_refill_profiler );
622  profile_exclude ( &intel_vm_refill_profiler );
623  }
624 }
void * regs
Registers.
Definition: intel.h:292
wmb()
#define INTEL_NUM_RX_DESC
Number of receive descriptors.
Definition: intel.h:155
struct intel_ring rx
Receive descriptor ring.
Definition: intel.h:315
#define INTEL_xDT
Receive/Transmit Descriptor Tail (offset)
Definition: intel.h:193
static void profile_stop(struct profiler *profiler)
Stop profiling.
Definition: profile.h:174
unsigned int cons
Consumer index.
Definition: intel.h:231
unsigned int reg
Register block.
Definition: intel.h:234
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:268
struct io_buffer * rx_iobuf[INTEL_NUM_RX_DESC]
Receive I/O buffers.
Definition: intel.h:317
static void profile_start(struct profiler *profiler)
Start profiling.
Definition: profile.h:161
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:188
#define INTEL_RX_MAX_LEN
Receive buffer length.
Definition: intel.h:161
void(* describe)(struct intel_descriptor *desc, physaddr_t addr, size_t len)
Populate descriptor.
Definition: intel.h:244
struct dma_device * dma
DMA device.
Definition: intel.h:294
A packet descriptor.
Definition: intel.h:22
#define DBGC2(...)
Definition: compiler.h:522
void * data
Start of data.
Definition: iobuf.h:53
unsigned int prod
Producer index.
Definition: intel.h:229
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:158
struct intel_descriptor * desc
Descriptors.
Definition: intel.h:225
static void profile_exclude(struct profiler *profiler)
Exclude time from other ongoing profiling results.
Definition: profile.h:187
#define NULL
NULL pointer (VOID *)
Definition: Base.h:322
A persistent I/O buffer.
Definition: iobuf.h:38

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

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

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

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

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

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

753  {
754  struct intel_nic *intel = netdev->priv;
755  struct intel_descriptor *tx;
756  unsigned int tx_idx;
757  unsigned int tx_tail;
758  size_t len;
759 
760  /* Get next transmit descriptor */
761  if ( ( intel->tx.prod - intel->tx.cons ) >= INTEL_TX_FILL ) {
762  DBGC ( intel, "INTEL %p out of transmit descriptors\n", intel );
763  return -ENOBUFS;
764  }
765  tx_idx = ( intel->tx.prod++ % INTEL_NUM_TX_DESC );
766  tx_tail = ( intel->tx.prod % INTEL_NUM_TX_DESC );
767  tx = &intel->tx.desc[tx_idx];
768 
769  /* Populate transmit descriptor */
770  len = iob_len ( iobuf );
771  intel->tx.describe ( tx, iob_dma ( iobuf ), len );
772  wmb();
773 
774  /* Notify card that there are packets ready to transmit */
775  profile_start ( &intel_vm_tx_profiler );
776  writel ( tx_tail, intel->regs + intel->tx.reg + INTEL_xDT );
777  profile_stop ( &intel_vm_tx_profiler );
778  profile_exclude ( &intel_vm_tx_profiler );
779 
780  DBGC2 ( intel, "INTEL %p TX %d is [%lx,%lx)\n",
781  intel, tx_idx, virt_to_phys ( iobuf->data ),
782  ( virt_to_phys ( iobuf->data ) + len ) );
783 
784  return 0;
785 }
void * regs
Registers.
Definition: intel.h:292
wmb()
#define INTEL_NUM_TX_DESC
Number of transmit descriptors.
Definition: intel.h:175
#define DBGC(...)
Definition: compiler.h:505
#define INTEL_xDT
Receive/Transmit Descriptor Tail (offset)
Definition: intel.h:193
static void profile_stop(struct profiler *profiler)
Stop profiling.
Definition: profile.h:174
unsigned int cons
Consumer index.
Definition: intel.h:231
unsigned int reg
Register block.
Definition: intel.h:234
#define INTEL_TX_FILL
Transmit descriptor ring maximum fill level.
Definition: intel.h:178
void * priv
Driver private data.
Definition: netdevice.h:432
ring len
Length.
Definition: dwmac.h:231
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:268
static void profile_start(struct profiler *profiler)
Start profiling.
Definition: profile.h:161
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition: iobuf.h:160
void(* describe)(struct intel_descriptor *desc, physaddr_t addr, size_t len)
Populate descriptor.
Definition: intel.h:244
A packet descriptor.
Definition: intel.h:22
#define ENOBUFS
No buffer space available.
Definition: errno.h:499
#define DBGC2(...)
Definition: compiler.h:522
void * data
Start of data.
Definition: iobuf.h:53
unsigned int prod
Producer index.
Definition: intel.h:229
An Intel network card.
Definition: intel.h:290
struct intel_descriptor * desc
Descriptors.
Definition: intel.h:225
struct intel_ring tx
Transmit descriptor ring.
Definition: intel.h:313
static void profile_exclude(struct profiler *profiler)
Exclude time from other ongoing profiling results.
Definition: profile.h:187
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, wmb(), and writel().

◆ intel_poll_tx()

void intel_poll_tx ( struct net_device netdev)

Poll for completed packets.

Parameters
netdevNetwork device

Definition at line 792 of file intel.c.

792  {
793  struct intel_nic *intel = netdev->priv;
794  struct intel_descriptor *tx;
795  unsigned int tx_idx;
796 
797  /* Check for completed packets */
798  while ( intel->tx.cons != intel->tx.prod ) {
799 
800  /* Get next transmit descriptor */
801  tx_idx = ( intel->tx.cons % INTEL_NUM_TX_DESC );
802  tx = &intel->tx.desc[tx_idx];
803 
804  /* Stop if descriptor is still in use */
805  if ( ! ( tx->status & cpu_to_le32 ( INTEL_DESC_STATUS_DD ) ) )
806  return;
807 
808  DBGC2 ( intel, "INTEL %p TX %d complete\n", intel, tx_idx );
809 
810  /* Complete TX descriptor */
812  intel->tx.cons++;
813  }
814 }
#define INTEL_DESC_STATUS_DD
Descriptor done.
Definition: intel.h:52
static void netdev_tx_complete_next(struct net_device *netdev)
Complete network transmission.
Definition: netdevice.h:779
#define INTEL_NUM_TX_DESC
Number of transmit descriptors.
Definition: intel.h:175
unsigned int cons
Consumer index.
Definition: intel.h:231
void * priv
Driver private data.
Definition: netdevice.h:432
static struct net_device * netdev
Definition: gdbudp.c:52
#define cpu_to_le32(value)
Definition: byteswap.h:108
A packet descriptor.
Definition: intel.h:22
#define DBGC2(...)
Definition: compiler.h:522
unsigned int prod
Producer index.
Definition: intel.h:229
An Intel network card.
Definition: intel.h:290
struct intel_descriptor * desc
Descriptors.
Definition: intel.h:225
struct intel_ring tx
Transmit descriptor ring.
Definition: intel.h:313
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 821 of file intel.c.

821  {
822  struct intel_nic *intel = netdev->priv;
823  struct intel_descriptor *rx;
824  struct io_buffer *iobuf;
825  unsigned int rx_idx;
826  size_t len;
827 
828  /* Check for received packets */
829  while ( intel->rx.cons != intel->rx.prod ) {
830 
831  /* Get next receive descriptor */
832  rx_idx = ( intel->rx.cons % INTEL_NUM_RX_DESC );
833  rx = &intel->rx.desc[rx_idx];
834 
835  /* Stop if descriptor is still in use */
836  if ( ! ( rx->status & cpu_to_le32 ( INTEL_DESC_STATUS_DD ) ) )
837  return;
838 
839  /* Populate I/O buffer */
840  iobuf = intel->rx_iobuf[rx_idx];
841  intel->rx_iobuf[rx_idx] = NULL;
842  len = le16_to_cpu ( rx->length );
843  iob_put ( iobuf, len );
844 
845  /* Hand off to network stack */
846  if ( rx->status & cpu_to_le32 ( INTEL_DESC_STATUS_RXE ) ) {
847  DBGC ( intel, "INTEL %p RX %d error (length %zd, "
848  "status %08x)\n", intel, rx_idx, len,
849  le32_to_cpu ( rx->status ) );
850  netdev_rx_err ( netdev, iobuf, -EIO );
851  } else {
852  DBGC2 ( intel, "INTEL %p RX %d complete (length %zd)\n",
853  intel, rx_idx, len );
854  netdev_rx ( netdev, iobuf );
855  }
856  intel->rx.cons++;
857  }
858 }
#define INTEL_DESC_STATUS_DD
Descriptor done.
Definition: intel.h:52
#define iob_put(iobuf, len)
Definition: iobuf.h:125
#define INTEL_NUM_RX_DESC
Number of receive descriptors.
Definition: intel.h:155
void netdev_rx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard received packet.
Definition: netdevice.c:587
#define le32_to_cpu(value)
Definition: byteswap.h:114
struct intel_ring rx
Receive descriptor ring.
Definition: intel.h:315
#define DBGC(...)
Definition: compiler.h:505
unsigned int cons
Consumer index.
Definition: intel.h:231
void * priv
Driver private data.
Definition: netdevice.h:432
ring len
Length.
Definition: dwmac.h:231
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:317
#define cpu_to_le32(value)
Definition: byteswap.h:108
#define le16_to_cpu(value)
Definition: byteswap.h:113
void netdev_rx(struct net_device *netdev, struct io_buffer *iobuf)
Add packet to receive queue.
Definition: netdevice.c:549
A packet descriptor.
Definition: intel.h:22
#define DBGC2(...)
Definition: compiler.h:522
unsigned int prod
Producer index.
Definition: intel.h:229
#define EIO
Input/output error.
Definition: errno.h:434
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:290
struct intel_descriptor * desc
Descriptors.
Definition: intel.h:225
#define INTEL_DESC_STATUS_RXE
Receive error.
Definition: intel.h:55
#define NULL
NULL pointer (VOID *)
Definition: Base.h:322
A persistent I/O buffer.
Definition: iobuf.h:38

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

865  {
866  struct intel_nic *intel = netdev->priv;
867  uint32_t icr;
868 
869  /* Check for and acknowledge interrupts */
870  profile_start ( &intel_vm_poll_profiler );
871  icr = readl ( intel->regs + INTEL_ICR );
872  profile_stop ( &intel_vm_poll_profiler );
873  profile_exclude ( &intel_vm_poll_profiler );
874  icr |= intel->force_icr;
875  if ( ! icr )
876  return;
877 
878  /* Poll for TX completions, if applicable */
879  if ( icr & INTEL_IRQ_TXDW )
880  intel_poll_tx ( netdev );
881 
882  /* Poll for RX completions, if applicable */
883  if ( icr & ( INTEL_IRQ_RXT0 | INTEL_IRQ_RXO ) )
884  intel_poll_rx ( netdev );
885 
886  /* Report receive overruns */
887  if ( icr & INTEL_IRQ_RXO )
889 
890  /* Check link state, if applicable */
891  if ( icr & INTEL_IRQ_LSC )
893 
894  /* Check for unexpected interrupts */
895  if ( icr & ~( INTEL_IRQ_TXDW | INTEL_IRQ_TXQE | INTEL_IRQ_LSC |
897  DBGC ( intel, "INTEL %p unexpected ICR %08x\n", intel, icr );
898  /* Report as a TX error */
900  }
901 
902  /* Refill RX ring */
903  intel_refill_rx ( intel );
904 }
unsigned int force_icr
Forced interrupts.
Definition: intel.h:300
void * regs
Registers.
Definition: intel.h:292
#define INTEL_ICR
Interrupt Cause Read Register.
Definition: intel.h:99
void netdev_rx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard received packet.
Definition: netdevice.c:587
#define INTEL_IRQ_RXDMT0
Receive queue low.
Definition: intel.h:103
void intel_poll_rx(struct net_device *netdev)
Poll for received packets.
Definition: intel.c:821
#define INTEL_IRQ_RXT0
Receive timer.
Definition: intel.h:105
void netdev_tx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard transmitted packet.
Definition: netdevice.c:441
void intel_poll_tx(struct net_device *netdev)
Poll for completed packets.
Definition: intel.c:792
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:100
static void profile_stop(struct profiler *profiler)
Stop profiling.
Definition: profile.h:174
#define ENOTSUP
Operation not supported.
Definition: errno.h:590
void intel_refill_rx(struct intel_nic *intel)
Refill receive descriptor ring.
Definition: intel.c:581
static void intel_check_link(struct net_device *netdev)
Check link state.
Definition: intel.c:366
void * priv
Driver private data.
Definition: netdevice.h:432
static struct net_device * netdev
Definition: gdbudp.c:52
static void profile_start(struct profiler *profiler)
Start profiling.
Definition: profile.h:161
unsigned int uint32_t
Definition: stdint.h:12
#define ENOBUFS
No buffer space available.
Definition: errno.h:499
An Intel network card.
Definition: intel.h:290
#define INTEL_IRQ_TXQE
Transmit queue empty.
Definition: intel.h:101
#define INTEL_IRQ_LSC
Link status change.
Definition: intel.h:102
static void profile_exclude(struct profiler *profiler)
Exclude time from other ongoing profiling results.
Definition: profile.h:187
#define NULL
NULL pointer (VOID *)
Definition: Base.h:322
#define INTEL_IRQ_RXO
Receive overrun.
Definition: intel.h:104

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

912  {
913  struct intel_nic *intel = netdev->priv;
914  uint32_t mask;
915 
917  if ( enable ) {
918  writel ( mask, intel->regs + INTEL_IMS );
919  } else {
920  writel ( mask, intel->regs + INTEL_IMC );
921  }
922 }
void * regs
Registers.
Definition: intel.h:292
#define INTEL_IRQ_RXT0
Receive timer.
Definition: intel.h:105
#define INTEL_IRQ_TXDW
Transmit descriptor done.
Definition: intel.h:100
void * priv
Driver private data.
Definition: netdevice.h:432
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:108
unsigned int uint32_t
Definition: stdint.h:12
An Intel network card.
Definition: intel.h:290
#define INTEL_IRQ_LSC
Link status change.
Definition: intel.h:102
#define INTEL_IMC
Interrupt Mask Clear Register.
Definition: intel.h:111

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

946  {
947  struct net_device *netdev;
948  struct intel_nic *intel;
949  int rc;
950 
951  /* Allocate and initialise net device */
952  netdev = alloc_etherdev ( sizeof ( *intel ) );
953  if ( ! netdev ) {
954  rc = -ENOMEM;
955  goto err_alloc;
956  }
958  intel = netdev->priv;
959  pci_set_drvdata ( pci, netdev );
960  netdev->dev = &pci->dev;
961  memset ( intel, 0, sizeof ( *intel ) );
962  intel->port = PCI_FUNC ( pci->busdevfn );
963  intel->flags = pci->id->driver_data;
968 
969  /* Fix up PCI device */
970  adjust_pci_device ( pci );
971 
972  /* Map registers */
973  intel->regs = pci_ioremap ( pci, pci->membase, INTEL_BAR_SIZE );
974  if ( ! intel->regs ) {
975  rc = -ENODEV;
976  goto err_ioremap;
977  }
978 
979  /* Configure DMA */
980  intel->dma = &pci->dma;
981  dma_set_mask_64bit ( intel->dma );
982  netdev->dma = intel->dma;
983 
984  /* Reset the NIC */
985  if ( ( rc = intel_reset ( intel ) ) != 0 )
986  goto err_reset;
987 
988  /* Fetch MAC address */
989  if ( ( rc = intel_fetch_mac ( intel, netdev->hw_addr ) ) != 0 )
990  goto err_fetch_mac;
991 
992  /* Register network device */
993  if ( ( rc = register_netdev ( netdev ) ) != 0 )
994  goto err_register_netdev;
995 
996  /* Set initial link state */
998 
999  return 0;
1000 
1002  err_register_netdev:
1003  err_fetch_mac:
1004  intel_reset ( intel );
1005  err_reset:
1006  iounmap ( intel->regs );
1007  err_ioremap:
1008  netdev_nullify ( netdev );
1009  netdev_put ( netdev );
1010  err_alloc:
1011  return rc;
1012 }
void * regs
Registers.
Definition: intel.h:292
#define PCI_FUNC(busdevfn)
Definition: pci.h:286
unsigned long membase
Memory base.
Definition: pci.h:220
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
struct dma_device dma
DMA device.
Definition: pci.h:215
#define INTEL_NUM_RX_DESC
Number of receive descriptors.
Definition: intel.h:155
static int intel_fetch_mac(struct intel_nic *intel, uint8_t *hw_addr)
Fetch initial MAC address.
Definition: intel.c:230
#define INTEL_RD
Receive Descriptor register block.
Definition: intel.h:148
unsigned long driver_data
Arbitrary driver data.
Definition: pci.h:183
#define INTEL_NUM_TX_DESC
Number of transmit descriptors.
Definition: intel.h:175
struct intel_ring rx
Receive descriptor ring.
Definition: intel.h:315
static __always_inline void dma_set_mask_64bit(struct dma_device *dma)
Set 64-bit addressable space mask.
Definition: dma.h:467
void intel_describe_tx(struct intel_descriptor *tx, physaddr_t addr, size_t len)
Populate transmit descriptor.
Definition: intel.c:396
struct dma_device * dma
DMA device.
Definition: netdevice.h:367
#define INTEL_BAR_SIZE
Intel BAR size.
Definition: intel.h:19
void adjust_pci_device(struct pci_device *pci)
Enable PCI device.
Definition: pci.c:241
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:257
struct device dev
Generic device.
Definition: pci.h:213
static void intel_check_link(struct net_device *netdev)
Check link state.
Definition: intel.c:366
unsigned int port
Port number (for multi-port devices)
Definition: intel.h:296
static void netdev_init(struct net_device *netdev, struct net_device_operations *op)
Initialise a network device.
Definition: netdevice.h:519
static void pci_set_drvdata(struct pci_device *pci, void *priv)
Set PCI driver-private data.
Definition: pci.h:366
#define ENOMEM
Not enough space.
Definition: errno.h:535
static void netdev_put(struct net_device *netdev)
Drop reference to network device.
Definition: netdevice.h:576
static int intel_reset(struct intel_nic *intel)
Reset hardware.
Definition: intel.c:267
void * priv
Driver private data.
Definition: netdevice.h:432
void intel_describe_rx(struct intel_descriptor *rx, physaddr_t addr, size_t len __unused)
Populate receive descriptor.
Definition: intel.c:434
static struct net_device * netdev
Definition: gdbudp.c:52
void unregister_netdev(struct net_device *netdev)
Unregister network device.
Definition: netdevice.c:942
static struct net_device_operations intel_operations
Intel network device operations.
Definition: intel.c:925
int register_netdev(struct net_device *netdev)
Register network device.
Definition: netdevice.c:760
A network device.
Definition: netdevice.h:353
#define ENODEV
No such device.
Definition: errno.h:510
static void netdev_nullify(struct net_device *netdev)
Stop using a network device.
Definition: netdevice.h:532
struct device * dev
Underlying hardware device.
Definition: netdevice.h:365
struct dma_device * dma
DMA device.
Definition: intel.h:294
uint32_t busdevfn
Segment, bus, device, and function (bus:dev.fn) number.
Definition: pci.h:238
struct net_device * alloc_etherdev(size_t priv_size)
Allocate Ethernet device.
Definition: ethernet.c:265
struct pci_device_id * id
Driver device ID.
Definition: pci.h:248
An Intel network card.
Definition: intel.h:290
void iounmap(volatile const void *io_addr)
Unmap I/O address.
struct intel_ring tx
Transmit descriptor ring.
Definition: intel.h:313
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:298
uint8_t hw_addr[MAX_HW_ADDR_LEN]
Hardware address.
Definition: netdevice.h:382
#define INTEL_TD
Transmit Descriptor register block.
Definition: intel.h:168
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 1019 of file intel.c.

1019  {
1020  struct net_device *netdev = pci_get_drvdata ( pci );
1021  struct intel_nic *intel = netdev->priv;
1022 
1023  /* Unregister network device */
1025 
1026  /* Reset the NIC */
1027  intel_reset ( intel );
1028 
1029  /* Free network device */
1030  iounmap ( intel->regs );
1031  netdev_nullify ( netdev );
1032  netdev_put ( netdev );
1033 }
void * regs
Registers.
Definition: intel.h:292
static void netdev_put(struct net_device *netdev)
Drop reference to network device.
Definition: netdevice.h:576
static int intel_reset(struct intel_nic *intel)
Reset hardware.
Definition: intel.c:267
void * priv
Driver private data.
Definition: netdevice.h:432
static struct net_device * netdev
Definition: gdbudp.c:52
void unregister_netdev(struct net_device *netdev)
Unregister network device.
Definition: netdevice.c:942
A network device.
Definition: netdevice.h:353
static void netdev_nullify(struct net_device *netdev)
Stop using a network device.
Definition: netdevice.h:532
static void * pci_get_drvdata(struct pci_device *pci)
Get PCI driver-private data.
Definition: pci.h:376
An Intel network card.
Definition: intel.h:290
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 48 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:648
static void intel_irq(struct net_device *netdev, int enable)
Enable or disable interrupts.
Definition: intel.c:912
static void intel_poll(struct net_device *netdev)
Poll for completed and received packets.
Definition: intel.c:865
int intel_transmit(struct net_device *netdev, struct io_buffer *iobuf)
Transmit packet.
Definition: intel.c:753
static void intel_close(struct net_device *netdev)
Close network device.
Definition: intel.c:724

Intel network device operations.

Definition at line 925 of file intel.c.

Referenced by intel_probe().

◆ intel_nics

struct pci_device_id intel_nics[]
static

Intel PCI device IDs.

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

Intel PCI driver.

Definition at line 1209 of file intel.c.