iPXE
Functions | Variables
intelx.c File Reference

Intel 10 Gigabit Ethernet 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/pci.h>
#include "intelx.h"

Go to the source code of this file.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
static int intelx_try_fetch_mac (struct intel_nic *intel, unsigned int ral0, uint8_t *hw_addr)
 Try to fetch initial MAC address. More...
 
static int intelx_fetch_mac (struct intel_nic *intel, uint8_t *hw_addr)
 Fetch initial MAC address. More...
 
static int intelx_reset (struct intel_nic *intel)
 Reset hardware. More...
 
static void intelx_check_link (struct net_device *netdev)
 Check link state. More...
 
static int intelx_open (struct net_device *netdev)
 Open network device. More...
 
static void intelx_close (struct net_device *netdev)
 Close network device. More...
 
static void intelx_poll (struct net_device *netdev)
 Poll for completed and received packets. More...
 
static void intelx_irq (struct net_device *netdev, int enable)
 Enable or disable interrupts. More...
 
static int intelx_probe (struct pci_device *pci)
 Probe PCI device. More...
 
static void intelx_remove (struct pci_device *pci)
 Remove PCI device. More...
 

Variables

static struct net_device_operations intelx_operations
 Network device operations. More...
 
static struct pci_device_id intelx_nics []
 PCI device IDs. More...
 
struct pci_driver intelx_driver __pci_driver
 PCI driver. More...
 

Detailed Description

Intel 10 Gigabit Ethernet network card driver.

Definition in file intelx.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ intelx_try_fetch_mac()

static int intelx_try_fetch_mac ( struct intel_nic intel,
unsigned int  ral0,
uint8_t hw_addr 
)
static

Try to fetch initial MAC address.

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

Definition at line 59 of file intelx.c.

60  {
62 
63  /* Read current address from RAL0/RAH0 */
64  mac.reg.low = cpu_to_le32 ( readl ( intel->regs + ral0 ) );
65  mac.reg.high = cpu_to_le32 ( readl ( intel->regs + ral0 +
66  ( INTELX_RAH0 - INTELX_RAL0 ) ) );
67 
68  /* Use current address if valid */
69  if ( is_valid_ether_addr ( mac.raw ) ) {
70  DBGC ( intel, "INTEL %p has autoloaded MAC address %s at "
71  "%#05x\n", intel, eth_ntoa ( mac.raw ), ral0 );
72  memcpy ( hw_addr, mac.raw, ETH_ALEN );
73  return 0;
74  }
75 
76  return -ENOENT;
77 }
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
#define ENOENT
No such file or directory.
Definition: errno.h:514
uint8_t mac[ETH_ALEN]
MAC address.
Definition: ena.h:24
#define INTELX_RAH0
Receive Address High.
Definition: intelx.h:67
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
#define INTELX_RAL0
Receive Address Low.
Definition: intelx.h:63
Receive address.
Definition: intel.h:213

References cpu_to_le32, DBGC, ENOENT, ETH_ALEN, eth_ntoa(), INTELX_RAH0, INTELX_RAL0, is_valid_ether_addr(), mac, memcpy(), readl(), and intel_nic::regs.

Referenced by intelx_fetch_mac().

◆ intelx_fetch_mac()

static int intelx_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 86 of file intelx.c.

86  {
87  int rc;
88 
89  /* Try to fetch address from INTELX_RAL0 */
90  if ( ( rc = intelx_try_fetch_mac ( intel, INTELX_RAL0,
91  hw_addr ) ) == 0 ) {
92  return 0;
93  }
94 
95  /* Try to fetch address from INTELX_RAL0_ALT */
96  if ( ( rc = intelx_try_fetch_mac ( intel, INTELX_RAL0_ALT,
97  hw_addr ) ) == 0 ) {
98  return 0;
99  }
100 
101  DBGC ( intel, "INTEL %p has no MAC address to use\n", intel );
102  return -ENOENT;
103 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
static int intelx_try_fetch_mac(struct intel_nic *intel, unsigned int ral0, uint8_t *hw_addr)
Try to fetch initial MAC address.
Definition: intelx.c:59
#define INTELX_RAL0_ALT
Definition: intelx.h:64
#define DBGC(...)
Definition: compiler.h:505
#define ENOENT
No such file or directory.
Definition: errno.h:514
#define INTELX_RAL0
Receive Address Low.
Definition: intelx.h:63

References DBGC, ENOENT, INTELX_RAL0, INTELX_RAL0_ALT, intelx_try_fetch_mac(), and rc.

Referenced by intelx_probe().

◆ intelx_reset()

static int intelx_reset ( struct intel_nic intel)
static

Reset hardware.

Parameters
intelIntel device
Return values
rcReturn status code

Definition at line 118 of file intelx.c.

118  {
119  uint32_t ctrl;
120 
121  /* Perform a global software reset */
122  ctrl = readl ( intel->regs + INTELX_CTRL );
124  intel->regs + INTELX_CTRL );
126 
127  DBGC ( intel, "INTEL %p reset (ctrl %08x)\n", intel, ctrl );
128  return 0;
129 }
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
#define INTELX_CTRL
Device Control Register.
Definition: intelx.h:17
#define INTELX_RESET_DELAY_MS
Time to delay for device reset, in milliseconds.
Definition: intelx.h:22
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
#define INTELX_CTRL_LRST
Link reset.
Definition: intelx.h:18
void mdelay(unsigned long msecs)
Delay for a fixed number of milliseconds.
Definition: timer.c:78
#define INTELX_CTRL_RST
Device reset.
Definition: intelx.h:19
u8 ctrl
Definition: sky2.h:10

References ctrl, DBGC, INTELX_CTRL, INTELX_CTRL_LRST, INTELX_CTRL_RST, INTELX_RESET_DELAY_MS, mdelay(), readl(), intel_nic::regs, and writel().

Referenced by intelx_close(), intelx_probe(), and intelx_remove().

◆ intelx_check_link()

static void intelx_check_link ( struct net_device netdev)
static

Check link state.

Parameters
netdevNetwork device

Definition at line 143 of file intelx.c.

143  {
144  struct intel_nic *intel = netdev->priv;
145  uint32_t links;
146 
147  /* Read link status */
148  links = readl ( intel->regs + INTELX_LINKS );
149  DBGC ( intel, "INTEL %p link status is %08x\n", intel, links );
150 
151  /* Update network device */
152  if ( links & INTELX_LINKS_UP ) {
154  } else {
156  }
157 }
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
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
unsigned int uint32_t
Definition: stdint.h:12
An Intel network card.
Definition: intel.h:289
#define INTELX_LINKS
Link Status Register.
Definition: intelx.h:114
#define INTELX_LINKS_UP
Link up.
Definition: intelx.h:115

References DBGC, INTELX_LINKS, INTELX_LINKS_UP, netdev, netdev_link_down(), netdev_link_up(), net_device::priv, readl(), and intel_nic::regs.

Referenced by intelx_open(), intelx_poll(), and intelx_probe().

◆ intelx_open()

static int intelx_open ( struct net_device netdev)
static

Open network device.

Parameters
netdevNetwork device
Return values
rcReturn status code

Definition at line 172 of file intelx.c.

172  {
173  struct intel_nic *intel = netdev->priv;
175  uint32_t ral0;
176  uint32_t rah0;
177  uint32_t dmatxctl;
178  uint32_t fctrl;
179  uint32_t srrctl;
180  uint32_t hlreg0;
181  uint32_t maxfrs;
182  uint32_t rdrxctl;
183  uint32_t rxctrl;
184  uint32_t dca_rxctrl;
185  int rc;
186 
187  /* Create transmit descriptor ring */
188  if ( ( rc = intel_create_ring ( intel, &intel->tx ) ) != 0 )
189  goto err_create_tx;
190 
191  /* Create receive descriptor ring */
192  if ( ( rc = intel_create_ring ( intel, &intel->rx ) ) != 0 )
193  goto err_create_rx;
194 
195  /* Program MAC address */
196  memset ( &mac, 0, sizeof ( mac ) );
197  memcpy ( mac.raw, netdev->ll_addr, sizeof ( mac.raw ) );
198  ral0 = le32_to_cpu ( mac.reg.low );
199  rah0 = ( le32_to_cpu ( mac.reg.high ) | INTELX_RAH0_AV );
200  writel ( ral0, intel->regs + INTELX_RAL0 );
201  writel ( rah0, intel->regs + INTELX_RAH0 );
202  writel ( ral0, intel->regs + INTELX_RAL0_ALT );
203  writel ( rah0, intel->regs + INTELX_RAH0_ALT );
204 
205  /* Allocate interrupt vectors */
208  intel->regs + INTELX_IVAR );
209 
210  /* Enable transmitter */
211  dmatxctl = readl ( intel->regs + INTELX_DMATXCTL );
212  dmatxctl |= INTELX_DMATXCTL_TE;
213  writel ( dmatxctl, intel->regs + INTELX_DMATXCTL );
214 
215  /* Configure receive filter */
216  fctrl = readl ( intel->regs + INTELX_FCTRL );
218  writel ( fctrl, intel->regs + INTELX_FCTRL );
219 
220  /* Configure receive buffer sizes */
221  srrctl = readl ( intel->regs + INTELX_SRRCTL );
222  srrctl &= ~INTELX_SRRCTL_BSIZE_MASK;
223  srrctl |= INTELX_SRRCTL_BSIZE_DEFAULT;
224  writel ( srrctl, intel->regs + INTELX_SRRCTL );
225 
226  /* Configure jumbo frames. Required to allow the extra 4-byte
227  * headroom for VLANs, since we don't use the hardware's
228  * native VLAN offload.
229  */
230  hlreg0 = readl ( intel->regs + INTELX_HLREG0 );
231  hlreg0 |= INTELX_HLREG0_JUMBOEN;
232  writel ( hlreg0, intel->regs + INTELX_HLREG0 );
233 
234  /* Configure frame size */
235  maxfrs = readl ( intel->regs + INTELX_MAXFRS );
236  maxfrs &= ~INTELX_MAXFRS_MFS_MASK;
237  maxfrs |= INTELX_MAXFRS_MFS_DEFAULT;
238  writel ( maxfrs, intel->regs + INTELX_MAXFRS );
239 
240  /* Configure receive DMA */
241  rdrxctl = readl ( intel->regs + INTELX_RDRXCTL );
242  rdrxctl |= INTELX_RDRXCTL_SECRC;
243  writel ( rdrxctl, intel->regs + INTELX_RDRXCTL );
244 
245  /* Clear "must-be-zero" bit for direct cache access (DCA). We
246  * leave DCA disabled anyway, but if we do not clear this bit
247  * then the received packets contain garbage data.
248  */
249  dca_rxctrl = readl ( intel->regs + INTELX_DCA_RXCTRL );
250  dca_rxctrl &= ~INTELX_DCA_RXCTRL_MUST_BE_ZERO;
251  writel ( dca_rxctrl, intel->regs + INTELX_DCA_RXCTRL );
252 
253  /* Enable receiver */
254  rxctrl = readl ( intel->regs + INTELX_RXCTRL );
255  rxctrl |= INTELX_RXCTRL_RXEN;
256  writel ( rxctrl, intel->regs + INTELX_RXCTRL );
257 
258  /* Fill receive ring */
259  intel_refill_rx ( intel );
260 
261  /* Update link state */
263 
264  return 0;
265 
266  intel_destroy_ring ( intel, &intel->rx );
267  err_create_rx:
268  intel_destroy_ring ( intel, &intel->tx );
269  err_create_tx:
270  return rc;
271 }
void * regs
Registers.
Definition: intel.h:291
#define INTELX_RDRXCTL
Receive DMA Control Register.
Definition: intelx.h:84
#define INTELX_IVAR_TX0_VALID
TX queue 0 valid.
Definition: intelx.h:46
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define INTELX_RAL0_ALT
Definition: intelx.h:64
#define INTELX_IVAR
Interrupt Vector Allocation Register.
Definition: intelx.h:38
#define INTELX_FCTRL_BAM
Broadcast accept mode.
Definition: intelx.h:52
#define le32_to_cpu(value)
Definition: byteswap.h:113
#define INTELX_SRRCTL_BSIZE_MASK
Definition: intelx.h:81
#define INTELX_SRRCTL_BSIZE_DEFAULT
Definition: intelx.h:80
#define INTELX_IVAR_TX0_DEFAULT
Definition: intelx.h:44
#define INTELX_MAXFRS
Maximum Frame Size Register.
Definition: intelx.h:107
#define INTELX_RAH0_AV
Address valid.
Definition: intelx.h:69
#define INTELX_RXCTRL
Receive Control Register.
Definition: intelx.h:88
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
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 INTELX_HLREG0
MAC Core Control 0 Register.
Definition: intelx.h:103
static void intelx_check_link(struct net_device *netdev)
Check link state.
Definition: intelx.c:143
void intel_refill_rx(struct intel_nic *intel)
Refill receive descriptor ring.
Definition: intel.c:580
#define INTELX_RXCTRL_RXEN
Receive enable.
Definition: intelx.h:89
#define INTELX_RAH0
Receive Address High.
Definition: intelx.h:67
#define INTELX_DMATXCTL
Transmit DMA Control Register.
Definition: intelx.h:92
void * memcpy(void *dest, const void *src, size_t len) __nonnull
#define INTELX_FCTRL_MPE
Multicast promiscuous.
Definition: intelx.h:50
#define INTELX_IVAR_RX0_VALID
RX queue 0 valid.
Definition: intelx.h:42
void * priv
Driver private data.
Definition: netdevice.h:431
#define INTELX_FCTRL
Receive Filter Control Register.
Definition: intelx.h:49
void writel(uint32_t data, volatile uint32_t *io_addr)
Write 32-bit dword to memory-mapped device.
#define INTELX_IVAR_RX0_DEFAULT
Definition: intelx.h:40
static struct net_device * netdev
Definition: gdbudp.c:52
#define INTELX_HLREG0_JUMBOEN
Jumbo frame enable.
Definition: intelx.h:104
#define INTELX_DCA_RXCTRL_MUST_BE_ZERO
Must be zero.
Definition: intelx.h:100
#define INTELX_RAH0_ALT
Definition: intelx.h:68
#define INTELX_FCTRL_UPE
Unicast promiscuous mode.
Definition: intelx.h:51
#define INTELX_DCA_RXCTRL
RX DCA Control Register.
Definition: intelx.h:99
unsigned int uint32_t
Definition: stdint.h:12
#define INTELX_MAXFRS_MFS_MASK
Definition: intelx.h:111
#define INTELX_SRRCTL
Split Receive Control Register.
Definition: intelx.h:78
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 INTELX_RDRXCTL_SECRC
Strip CRC.
Definition: intelx.h:85
#define INTELX_DMATXCTL_TE
Transmit enable.
Definition: intelx.h:93
#define INTELX_RAL0
Receive Address Low.
Definition: intelx.h:63
struct intel_ring tx
Transmit descriptor ring.
Definition: intel.h:312
Receive address.
Definition: intel.h:213
uint8_t ll_addr[MAX_LL_ADDR_LEN]
Link-layer address.
Definition: netdevice.h:387
#define INTELX_MAXFRS_MFS_DEFAULT
Definition: intelx.h:109
void * memset(void *dest, int character, size_t len) __nonnull

References intel_create_ring(), intel_destroy_ring(), intel_refill_rx(), intelx_check_link(), INTELX_DCA_RXCTRL, INTELX_DCA_RXCTRL_MUST_BE_ZERO, INTELX_DMATXCTL, INTELX_DMATXCTL_TE, INTELX_FCTRL, INTELX_FCTRL_BAM, INTELX_FCTRL_MPE, INTELX_FCTRL_UPE, INTELX_HLREG0, INTELX_HLREG0_JUMBOEN, INTELX_IVAR, INTELX_IVAR_RX0_DEFAULT, INTELX_IVAR_RX0_VALID, INTELX_IVAR_TX0_DEFAULT, INTELX_IVAR_TX0_VALID, INTELX_MAXFRS, INTELX_MAXFRS_MFS_DEFAULT, INTELX_MAXFRS_MFS_MASK, INTELX_RAH0, INTELX_RAH0_ALT, INTELX_RAH0_AV, INTELX_RAL0, INTELX_RAL0_ALT, INTELX_RDRXCTL, INTELX_RDRXCTL_SECRC, INTELX_RXCTRL, INTELX_RXCTRL_RXEN, INTELX_SRRCTL, INTELX_SRRCTL_BSIZE_DEFAULT, INTELX_SRRCTL_BSIZE_MASK, 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().

◆ intelx_close()

static void intelx_close ( struct net_device netdev)
static

Close network device.

Parameters
netdevNetwork device

Definition at line 278 of file intelx.c.

278  {
279  struct intel_nic *intel = netdev->priv;
280  uint32_t rxctrl;
281  uint32_t dmatxctl;
282 
283  /* Disable receiver */
284  rxctrl = readl ( intel->regs + INTELX_RXCTRL );
285  rxctrl &= ~INTELX_RXCTRL_RXEN;
286  writel ( rxctrl, intel->regs + INTELX_RXCTRL );
287 
288  /* Disable transmitter */
289  dmatxctl = readl ( intel->regs + INTELX_DMATXCTL );
290  dmatxctl &= ~INTELX_DMATXCTL_TE;
291  writel ( dmatxctl, intel->regs + INTELX_DMATXCTL );
292 
293  /* Destroy receive descriptor ring */
294  intel_destroy_ring ( intel, &intel->rx );
295 
296  /* Discard any unused receive buffers */
297  intel_empty_rx ( intel );
298 
299  /* Destroy transmit descriptor ring */
300  intel_destroy_ring ( intel, &intel->tx );
301 
302  /* Reset the NIC, to flush the transmit and receive FIFOs */
303  intelx_reset ( intel );
304 }
void * regs
Registers.
Definition: intel.h:291
static int intelx_reset(struct intel_nic *intel)
Reset hardware.
Definition: intelx.c:118
#define INTELX_RXCTRL
Receive Control Register.
Definition: intelx.h:88
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
void intel_empty_rx(struct intel_nic *intel)
Discard unused receive I/O buffers.
Definition: intel.c:630
#define INTELX_RXCTRL_RXEN
Receive enable.
Definition: intelx.h:89
#define INTELX_DMATXCTL
Transmit DMA Control Register.
Definition: intelx.h:92
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
unsigned int uint32_t
Definition: stdint.h:12
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 INTELX_DMATXCTL_TE
Transmit enable.
Definition: intelx.h:93
struct intel_ring tx
Transmit descriptor ring.
Definition: intel.h:312

References intel_destroy_ring(), intel_empty_rx(), INTELX_DMATXCTL, INTELX_DMATXCTL_TE, intelx_reset(), INTELX_RXCTRL, INTELX_RXCTRL_RXEN, netdev, net_device::priv, readl(), intel_nic::regs, intel_nic::rx, intel_nic::tx, and writel().

◆ intelx_poll()

static void intelx_poll ( struct net_device netdev)
static

Poll for completed and received packets.

Parameters
netdevNetwork device

Definition at line 311 of file intelx.c.

311  {
312  struct intel_nic *intel = netdev->priv;
313  uint32_t eicr;
314 
315  /* Check for and acknowledge interrupts */
316  eicr = readl ( intel->regs + INTELX_EICR );
317  if ( ! eicr )
318  return;
319 
320  /* Poll for TX completions, if applicable */
321  if ( eicr & INTELX_EIRQ_TX0 )
322  intel_poll_tx ( netdev );
323 
324  /* Poll for RX completions, if applicable */
325  if ( eicr & ( INTELX_EIRQ_RX0 | INTELX_EIRQ_RXO ) )
326  intel_poll_rx ( netdev );
327 
328  /* Report receive overruns */
329  if ( eicr & INTELX_EIRQ_RXO )
331 
332  /* Check link state, if applicable */
333  if ( eicr & INTELX_EIRQ_LSC )
335 
336  /* Refill RX ring */
337  intel_refill_rx ( intel );
338 }
void * regs
Registers.
Definition: intel.h:291
#define INTELX_EIRQ_LSC
Link status change.
Definition: intelx.h:29
void netdev_rx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard received packet.
Definition: netdevice.c:586
void intel_poll_rx(struct net_device *netdev)
Poll for received packets.
Definition: intel.c:820
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 INTELX_EIRQ_RXO
Receive overrun.
Definition: intelx.h:28
static void intelx_check_link(struct net_device *netdev)
Check link state.
Definition: intelx.c:143
#define INTELX_EIRQ_RX0
RX0 (via IVAR)
Definition: intelx.h:26
void intel_refill_rx(struct intel_nic *intel)
Refill receive descriptor ring.
Definition: intel.c:580
void * priv
Driver private data.
Definition: netdevice.h:431
static struct net_device * netdev
Definition: gdbudp.c:52
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 INTELX_EIRQ_TX0
RX0 (via IVAR)
Definition: intelx.h:27
#define INTELX_EICR
Extended Interrupt Cause Read Register.
Definition: intelx.h:25
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References ENOBUFS, intel_poll_rx(), intel_poll_tx(), intel_refill_rx(), intelx_check_link(), INTELX_EICR, INTELX_EIRQ_LSC, INTELX_EIRQ_RX0, INTELX_EIRQ_RXO, INTELX_EIRQ_TX0, netdev, netdev_rx_err(), NULL, net_device::priv, readl(), and intel_nic::regs.

◆ intelx_irq()

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

Enable or disable interrupts.

Parameters
netdevNetwork device
enableInterrupts should be enabled

Definition at line 346 of file intelx.c.

346  {
347  struct intel_nic *intel = netdev->priv;
348  uint32_t mask;
349 
351  INTELX_EIRQ_RX0 );
352  if ( enable ) {
353  writel ( mask, intel->regs + INTELX_EIMS );
354  } else {
355  writel ( mask, intel->regs + INTELX_EIMC );
356  }
357 }
void * regs
Registers.
Definition: intel.h:291
#define INTELX_EIRQ_LSC
Link status change.
Definition: intelx.h:29
#define INTELX_EIRQ_RXO
Receive overrun.
Definition: intelx.h:28
#define INTELX_EIRQ_RX0
RX0 (via IVAR)
Definition: intelx.h:26
#define INTELX_EIMC
Interrupt Mask Clear Register.
Definition: intelx.h:35
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 INTELX_EIMS
Interrupt Mask Set/Read Register.
Definition: intelx.h:32
unsigned int uint32_t
Definition: stdint.h:12
An Intel network card.
Definition: intel.h:289
#define INTELX_EIRQ_TX0
RX0 (via IVAR)
Definition: intelx.h:27

References INTELX_EIMC, INTELX_EIMS, INTELX_EIRQ_LSC, INTELX_EIRQ_RX0, INTELX_EIRQ_RXO, INTELX_EIRQ_TX0, netdev, net_device::priv, intel_nic::regs, and writel().

◆ intelx_probe()

static int intelx_probe ( struct pci_device pci)
static

Probe PCI device.

Parameters
pciPCI device
Return values
rcReturn status code

Definition at line 381 of file intelx.c.

381  {
382  struct net_device *netdev;
383  struct intel_nic *intel;
384  int rc;
385 
386  /* Allocate and initialise net device */
387  netdev = alloc_etherdev ( sizeof ( *intel ) );
388  if ( ! netdev ) {
389  rc = -ENOMEM;
390  goto err_alloc;
391  }
393  intel = netdev->priv;
394  pci_set_drvdata ( pci, netdev );
395  netdev->dev = &pci->dev;
396  memset ( intel, 0, sizeof ( *intel ) );
397  intel->port = PCI_FUNC ( pci->busdevfn );
402 
403  /* Fix up PCI device */
404  adjust_pci_device ( pci );
405 
406  /* Map registers */
407  intel->regs = pci_ioremap ( pci, pci->membase, INTEL_BAR_SIZE );
408  if ( ! intel->regs ) {
409  rc = -ENODEV;
410  goto err_ioremap;
411  }
412 
413  /* Configure DMA */
414  intel->dma = &pci->dma;
415  dma_set_mask_64bit ( intel->dma );
416  netdev->dma = intel->dma;
417 
418  /* Reset the NIC */
419  if ( ( rc = intelx_reset ( intel ) ) != 0 )
420  goto err_reset;
421 
422  /* Fetch MAC address */
423  if ( ( rc = intelx_fetch_mac ( intel, netdev->hw_addr ) ) != 0 )
424  goto err_fetch_mac;
425 
426  /* Register network device */
427  if ( ( rc = register_netdev ( netdev ) ) != 0 )
428  goto err_register_netdev;
429 
430  /* Set initial link state */
432 
433  return 0;
434 
436  err_register_netdev:
437  err_fetch_mac:
438  intelx_reset ( intel );
439  err_reset:
440  iounmap ( intel->regs );
441  err_ioremap:
443  netdev_put ( netdev );
444  err_alloc:
445  return rc;
446 }
void * regs
Registers.
Definition: intel.h:291
#define PCI_FUNC(busdevfn)
Definition: pci.h:281
unsigned long membase
Memory base.
Definition: pci.h:215
static int intelx_reset(struct intel_nic *intel)
Reset hardware.
Definition: intelx.c:118
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define INTELX_RD
Receive Descriptor register block.
Definition: intelx.h:72
struct dma_device dma
DMA device.
Definition: pci.h:210
#define INTEL_NUM_RX_DESC
Number of receive descriptors.
Definition: intel.h:154
#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
static void intelx_check_link(struct net_device *netdev)
Check link state.
Definition: intelx.c:143
struct device dev
Generic device.
Definition: pci.h:208
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
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 int intelx_fetch_mac(struct intel_nic *intel, uint8_t *hw_addr)
Fetch initial MAC address.
Definition: intelx.c:86
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
static struct net_device_operations intelx_operations
Network device operations.
Definition: intelx.c:360
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
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.
#define INTELX_TD
Transmit Descriptor register block.
Definition: intelx.h:96
uint8_t hw_addr[MAX_HW_ADDR_LEN]
Hardware address.
Definition: netdevice.h:381
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(), ENODEV, ENOMEM, net_device::hw_addr, INTEL_BAR_SIZE, intel_describe_rx(), intel_describe_tx(), intel_init_ring(), INTEL_NUM_RX_DESC, INTEL_NUM_TX_DESC, intelx_check_link(), intelx_fetch_mac(), intelx_operations, INTELX_RD, intelx_reset(), INTELX_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().

◆ intelx_remove()

static void intelx_remove ( struct pci_device pci)
static

Remove PCI device.

Parameters
pciPCI device

Definition at line 453 of file intelx.c.

453  {
454  struct net_device *netdev = pci_get_drvdata ( pci );
455  struct intel_nic *intel = netdev->priv;
456 
457  /* Unregister network device */
459 
460  /* Reset the NIC */
461  intelx_reset ( intel );
462 
463  /* Free network device */
464  iounmap ( intel->regs );
466  netdev_put ( netdev );
467 }
void * regs
Registers.
Definition: intel.h:291
static int intelx_reset(struct intel_nic *intel)
Reset hardware.
Definition: intelx.c:118
static void netdev_put(struct net_device *netdev)
Drop reference to network device.
Definition: netdevice.h:572
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 intelx_reset(), iounmap(), netdev, netdev_nullify(), netdev_put(), pci_get_drvdata(), net_device::priv, intel_nic::regs, and unregister_netdev().

Variable Documentation

◆ intelx_operations

struct net_device_operations intelx_operations
static
Initial value:
= {
.open = intelx_open,
.close = intelx_close,
.transmit = intel_transmit,
.poll = intelx_poll,
.irq = intelx_irq,
}
static int intelx_open(struct net_device *netdev)
Open network device.
Definition: intelx.c:172
static void intelx_close(struct net_device *netdev)
Close network device.
Definition: intelx.c:278
static void intelx_poll(struct net_device *netdev)
Poll for completed and received packets.
Definition: intelx.c:311
int intel_transmit(struct net_device *netdev, struct io_buffer *iobuf)
Transmit packet.
Definition: intel.c:752
static void intelx_irq(struct net_device *netdev, int enable)
Enable or disable interrupts.
Definition: intelx.c:346

Network device operations.

Definition at line 360 of file intelx.c.

Referenced by intelx_probe().

◆ intelx_nics

struct pci_device_id intelx_nics[]
static
Initial value:
= {
PCI_ROM ( 0x8086, 0x10f7, "82599-kx4", "82599 (KX/KX4)", 0 ),
PCI_ROM ( 0x8086, 0x10f8, "82599-combo-backplane", "82599 (combined backplane; KR/KX4/KX)", 0 ),
PCI_ROM ( 0x8086, 0x10f9, "82599-cx4", "82599 (CX4)", 0 ),
PCI_ROM ( 0x8086, 0x10fb, "82599-sfp", "82599 (SFI/SFP+)", 0 ),
PCI_ROM ( 0x8086, 0x10fc, "82599-xaui", "82599 (XAUI/BX4)", 0 ),
PCI_ROM ( 0x8086, 0x151c, "82599-tn", "82599 (TN)", 0 ),
PCI_ROM ( 0x8086, 0x1528, "x540t", "X540-AT2/X540-BT2", 0 ),
PCI_ROM ( 0x8086, 0x154d, "82599-sfp-sf2", "82599 (SFI/SFP+)", 0 ),
PCI_ROM ( 0x8086, 0x1557, "82599en-sfp", "82599 (Single Port SFI Only)", 0 ),
PCI_ROM ( 0x8086, 0x1560, "x540t1", "X540-AT2/X540-BT2 (with single port NVM)", 0 ),
PCI_ROM ( 0x8086, 0x1563, "x550t2", "X550-T2", 0 ),
PCI_ROM ( 0x8086, 0x15ab, "x552", "X552", 0 ),
PCI_ROM ( 0x8086, 0x15c8, "x553t", "X553/X557-AT", 0 ),
PCI_ROM ( 0x8086, 0x15ce, "x553-sfp", "X553 (SFP+)", 0 ),
PCI_ROM ( 0x8086, 0x15e4, "x553a", "X553", 0 ),
PCI_ROM ( 0x8086, 0x15e5, "x553", "X553", 0 ),
}
#define PCI_ROM(_vendor, _device, _name, _description, _data)
Definition: pci.h:303

PCI device IDs.

Definition at line 470 of file intelx.c.

◆ __pci_driver

struct pci_driver intelx_driver __pci_driver
Initial value:
= {
.ids = intelx_nics,
.id_count = ( sizeof ( intelx_nics ) / sizeof ( intelx_nics[0] ) ),
.probe = intelx_probe,
}
static struct pci_device_id intelx_nics[]
PCI device IDs.
Definition: intelx.c:470
static int intelx_probe(struct pci_device *pci)
Probe PCI device.
Definition: intelx.c:381
static struct xen_remove_from_physmap * remove
Definition: xenmem.h:39
static void intelx_remove(struct pci_device *pci)
Remove PCI device.
Definition: intelx.c:453

PCI driver.

Definition at line 490 of file intelx.c.