iPXE
Functions | Variables
intelxlvf.c File Reference

Intel 40 Gigabit Ethernet virtual function network card driver. More...

#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <byteswap.h>
#include <ipxe/pci.h>
#include <ipxe/netdevice.h>
#include <ipxe/ethernet.h>
#include "intelxlvf.h"

Go to the source code of this file.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
static int intelxlvf_reset_wait_teardown (struct intelxl_nic *intelxl)
 Wait for admin event queue to be torn down. More...
 
static int intelxlvf_reset_wait_active (struct intelxl_nic *intelxl)
 Wait for virtual function to be marked as active. More...
 
static int intelxlvf_reset_wait (struct intelxl_nic *intelxl)
 Wait for reset to complete. More...
 
static int intelxlvf_reset_admin (struct intelxl_nic *intelxl)
 Reset hardware via admin queue. More...
 
static int intelxlvf_admin_command (struct net_device *netdev)
 Issue admin queue virtual function command. More...
 
static void intelxlvf_admin_link (struct net_device *netdev, struct intelxlvf_admin_status_link *link)
 Handle link status event. More...
 
static void intelxlvf_admin_status (struct net_device *netdev, struct intelxlvf_admin_status_buffer *stat)
 Handle status change event. More...
 
static void intelxlvf_admin_event (struct net_device *netdev, struct intelxl_admin_descriptor *xlevt, union intelxl_admin_buffer *xlbuf)
 Handle admin event. More...
 
static int intelxlvf_admin_version (struct net_device *netdev)
 Negotiate API version. More...
 
static int intelxlvf_admin_get_resources (struct net_device *netdev)
 Get resources. More...
 
static int intelxlvf_admin_stats (struct net_device *netdev)
 Get statistics (for debugging) More...
 
static int intelxlvf_admin_request_qps (struct net_device *netdev)
 Configure number of queue pairs. More...
 
static int intelxlvf_admin_configure (struct net_device *netdev)
 Configure queues. More...
 
static int intelxlvf_admin_irq_map (struct net_device *netdev)
 Configure IRQ mapping. More...
 
static int intelxlvf_admin_queues (struct net_device *netdev, int enable)
 Enable/disable queues. More...
 
static int intelxlvf_admin_promisc (struct net_device *netdev)
 Configure promiscuous mode. More...
 
static int intelxlvf_open (struct net_device *netdev)
 Open network device. More...
 
static void intelxlvf_close (struct net_device *netdev)
 Close network device. More...
 
static int intelxlvf_probe (struct pci_device *pci)
 Probe PCI device. More...
 
static void intelxlvf_remove (struct pci_device *pci)
 Remove PCI device. More...
 

Variables

static const struct intelxl_admin_offsets intelxlvf_admin_command_offsets
 Admin command queue register offsets. More...
 
static const struct intelxl_admin_offsets intelxlvf_admin_event_offsets
 Admin event queue register offsets. More...
 
static struct net_device_operations intelxlvf_operations
 Network device operations. More...
 
static struct pci_device_id intelxlvf_nics []
 PCI device IDs. More...
 
struct pci_driver intelxlvf_driver __pci_driver
 PCI driver. More...
 

Detailed Description

Intel 40 Gigabit Ethernet virtual function network card driver.

Definition in file intelxlvf.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ intelxlvf_reset_wait_teardown()

static int intelxlvf_reset_wait_teardown ( struct intelxl_nic intelxl)
static

Wait for admin event queue to be torn down.

Parameters
intelxlIntel device
Return values
rcReturn status code

Definition at line 54 of file intelxlvf.c.

54  {
55  uint32_t admin_evt_len;
56  unsigned int i;
57 
58  /* Wait for admin event queue to be torn down */
59  for ( i = 0 ; i < INTELXLVF_RESET_MAX_WAIT_MS ; i++ ) {
60 
61  /* Check admin event queue length register */
62  admin_evt_len = readl ( intelxl->regs + INTELXLVF_ADMIN +
64  if ( ! ( admin_evt_len & INTELXL_ADMIN_LEN_ENABLE ) )
65  return 0;
66 
67  /* Delay */
68  mdelay ( 1 );
69  }
70 
71  DBGC ( intelxl, "INTELXL %p timed out waiting for teardown (%#08x)\n",
72  intelxl, admin_evt_len );
73  return -ETIMEDOUT;
74 }
void * regs
Registers.
Definition: intelxl.h:921
#define INTELXLVF_ADMIN_EVT_LEN
Admin Event Queue Length Register (offset)
Definition: intelxlvf.h:62
#define INTELXL_ADMIN_LEN_ENABLE
Queue enable.
Definition: intelxl.h:50
uint32_t readl(volatile uint32_t *io_addr)
Read 32-bit dword from memory-mapped device.
#define DBGC(...)
Definition: compiler.h:505
#define INTELXLVF_ADMIN
VF Admin Queue register block.
Definition: intelxlvf.h:38
#define INTELXLVF_RESET_MAX_WAIT_MS
Maximum time to wait for reset to complete.
Definition: intelxlvf.h:403
unsigned int uint32_t
Definition: stdint.h:12
void mdelay(unsigned long msecs)
Delay for a fixed number of milliseconds.
Definition: timer.c:78
#define ETIMEDOUT
Connection timed out.
Definition: errno.h:669

References DBGC, ETIMEDOUT, INTELXL_ADMIN_LEN_ENABLE, INTELXLVF_ADMIN, INTELXLVF_ADMIN_EVT_LEN, INTELXLVF_RESET_MAX_WAIT_MS, mdelay(), readl(), and intelxl_nic::regs.

Referenced by intelxlvf_reset_wait().

◆ intelxlvf_reset_wait_active()

static int intelxlvf_reset_wait_active ( struct intelxl_nic intelxl)
static

Wait for virtual function to be marked as active.

Parameters
intelxlIntel device
Return values
rcReturn status code

Definition at line 82 of file intelxlvf.c.

82  {
83  uint32_t vfgen_rstat;
84  unsigned int vfr_state;
85  unsigned int i;
86 
87  /* Wait for virtual function to be marked as active */
88  for ( i = 0 ; i < INTELXLVF_RESET_MAX_WAIT_MS ; i++ ) {
89 
90  /* Check status as written by physical function driver */
91  vfgen_rstat = readl ( intelxl->regs + INTELXLVF_VFGEN_RSTAT );
92  vfr_state = INTELXLVF_VFGEN_RSTAT_VFR_STATE ( vfgen_rstat );
93  if ( vfr_state == INTELXLVF_VFGEN_RSTAT_VFR_STATE_ACTIVE )
94  return 0;
95 
96  /* Delay */
97  mdelay ( 1 );
98  }
99 
100  DBGC ( intelxl, "INTELXL %p timed out waiting for activation "
101  "(%#08x)\n", intelxl, vfgen_rstat );
102  return -ETIMEDOUT;
103 }
void * regs
Registers.
Definition: intelxl.h:921
uint32_t readl(volatile uint32_t *io_addr)
Read 32-bit dword from memory-mapped device.
#define DBGC(...)
Definition: compiler.h:505
#define INTELXLVF_VFGEN_RSTAT_VFR_STATE(x)
Definition: intelxlvf.h:396
#define INTELXLVF_VFGEN_RSTAT_VFR_STATE_ACTIVE
Definition: intelxlvf.h:397
#define INTELXLVF_RESET_MAX_WAIT_MS
Maximum time to wait for reset to complete.
Definition: intelxlvf.h:403
unsigned int uint32_t
Definition: stdint.h:12
void mdelay(unsigned long msecs)
Delay for a fixed number of milliseconds.
Definition: timer.c:78
#define INTELXLVF_VFGEN_RSTAT
VF Reset Status Register.
Definition: intelxlvf.h:395
#define ETIMEDOUT
Connection timed out.
Definition: errno.h:669

References DBGC, ETIMEDOUT, INTELXLVF_RESET_MAX_WAIT_MS, INTELXLVF_VFGEN_RSTAT, INTELXLVF_VFGEN_RSTAT_VFR_STATE, INTELXLVF_VFGEN_RSTAT_VFR_STATE_ACTIVE, mdelay(), readl(), and intelxl_nic::regs.

Referenced by intelxlvf_reset_wait().

◆ intelxlvf_reset_wait()

static int intelxlvf_reset_wait ( struct intelxl_nic intelxl)
static

Wait for reset to complete.

Parameters
intelxlIntel device
Return values
rcReturn status code

Definition at line 111 of file intelxlvf.c.

111  {
112  int rc;
113 
114  /* Wait for minimum reset time */
116 
117  /* Wait for reset to take effect */
118  if ( ( rc = intelxlvf_reset_wait_teardown ( intelxl ) ) != 0 )
119  goto err_teardown;
120 
121  /* Wait for virtual function to become active */
122  if ( ( rc = intelxlvf_reset_wait_active ( intelxl ) ) != 0 )
123  goto err_active;
124 
125  err_active:
126  err_teardown:
127  intelxl_reopen_admin ( intelxl );
128  return rc;
129 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
static int intelxlvf_reset_wait_active(struct intelxl_nic *intelxl)
Wait for virtual function to be marked as active.
Definition: intelxlvf.c:82
void mdelay(unsigned long msecs)
Delay for a fixed number of milliseconds.
Definition: timer.c:78
#define INTELXLVF_RESET_DELAY_MS
Minimum time to wait for reset to complete.
Definition: intelxlvf.h:400
static int intelxlvf_reset_wait_teardown(struct intelxl_nic *intelxl)
Wait for admin event queue to be torn down.
Definition: intelxlvf.c:54
void intelxl_reopen_admin(struct intelxl_nic *intelxl)
Reopen admin queues (after virtual function reset)
Definition: intelxl.c:924

References intelxl_reopen_admin(), INTELXLVF_RESET_DELAY_MS, intelxlvf_reset_wait_active(), intelxlvf_reset_wait_teardown(), mdelay(), and rc.

Referenced by intelxlvf_admin_request_qps(), and intelxlvf_reset_admin().

◆ intelxlvf_reset_admin()

static int intelxlvf_reset_admin ( struct intelxl_nic intelxl)
static

Reset hardware via admin queue.

Parameters
intelxlIntel device
Return values
rcReturn status code

Definition at line 137 of file intelxlvf.c.

137  {
139  int rc;
140 
141  /* Populate descriptor */
144  cmd->vopcode = cpu_to_le32 ( INTELXLVF_ADMIN_RESET );
145 
146  /* Issue command */
147  if ( ( rc = intelxl_admin_command ( intelxl ) ) != 0 )
148  return rc;
149 
150  /* Wait for reset to complete */
151  if ( ( rc = intelxlvf_reset_wait ( intelxl ) ) != 0 )
152  return rc;
153 
154  return 0;
155 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define cpu_to_le32(value)
Definition: byteswap.h:107
Admin queue descriptor.
Definition: intelxlvf.h:341
int intelxl_admin_command(struct intelxl_nic *intelxl)
Issue admin queue command.
Definition: intelxl.c:295
#define INTELXLVF_ADMIN_SEND_TO_PF
Admin queue Send Message to PF command.
Definition: intelxlvf.h:74
#define cpu_to_le16(value)
Definition: byteswap.h:106
struct intelxlvf_admin_descriptor * intelxlvf_admin_command_descriptor(struct intelxl_nic *intelxl)
Get next admin command queue descriptor.
Definition: intelxlvf.h:373
static int intelxlvf_reset_wait(struct intelxl_nic *intelxl)
Wait for reset to complete.
Definition: intelxlvf.c:111
struct golan_eqe_cmd cmd
Definition: CIB_PRM.h:29
#define INTELXLVF_ADMIN_RESET
Admin Queue VF Reset opcode.
Definition: intelxlvf.h:97

References cmd, cpu_to_le16, cpu_to_le32, intelxl_admin_command(), intelxlvf_admin_command_descriptor(), INTELXLVF_ADMIN_RESET, INTELXLVF_ADMIN_SEND_TO_PF, intelxlvf_reset_wait(), and rc.

Referenced by intelxlvf_probe(), and intelxlvf_remove().

◆ intelxlvf_admin_command()

static int intelxlvf_admin_command ( struct net_device netdev)
static

Issue admin queue virtual function command.

Parameters
netdevNetwork device
Return values
rcReturn status code

Definition at line 188 of file intelxlvf.c.

188  {
189  struct intelxl_nic *intelxl = netdev->priv;
190  struct intelxl_admin *admin = &intelxl->command;
191  struct intelxl_admin_descriptor *xlcmd;
193  unsigned int i;
194  int rc;
195 
196  /* Populate descriptor */
197  xlcmd = &admin->desc[ admin->index % INTELXL_ADMIN_NUM_DESC ];
198  cmd = container_of ( xlcmd, struct intelxlvf_admin_descriptor, xl );
200 
201  /* Record opcode */
202  intelxl->vopcode = le32_to_cpu ( cmd->vopcode );
203 
204  /* Issue command */
205  if ( ( rc = intelxl_admin_command ( intelxl ) ) != 0 )
206  goto err_command;
207 
208  /* Wait for response */
209  for ( i = 0 ; i < INTELXLVF_ADMIN_MAX_WAIT_MS ; i++ ) {
210 
211  /* Poll admin event queue */
213 
214  /* If response has not arrived, delay 1ms and retry */
215  if ( intelxl->vopcode ) {
216  mdelay ( 1 );
217  continue;
218  }
219 
220  /* Check for errors */
221  if ( cmd->vret != 0 )
222  return -EIO;
223 
224  return 0;
225  }
226 
227  rc = -ETIMEDOUT;
228  DBGC ( intelxl, "INTELXL %p timed out waiting for admin VF command "
229  "%#x\n", intelxl, intelxl->vopcode );
230  err_command:
231  intelxl->vopcode = 0;
232  return rc;
233 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define le32_to_cpu(value)
Definition: byteswap.h:113
Admin queue.
Definition: intelxl.h:451
#define DBGC(...)
Definition: compiler.h:505
struct intelxl_admin command
Admin command queue.
Definition: intelxl.h:951
#define INTELXL_ADMIN_NUM_DESC
Number of admin queue descriptors.
Definition: intelxl.h:483
unsigned int index
Queue index.
Definition: intelxl.h:459
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
void * priv
Driver private data.
Definition: netdevice.h:431
static struct net_device * netdev
Definition: gdbudp.c:52
void intelxl_poll_admin(struct net_device *netdev)
Poll admin event queue.
Definition: intelxl.c:853
struct intelxl_admin_descriptor xl
Original 40 Gigabit Ethernet descriptor.
Definition: intelxlvf.h:345
struct intelxl_admin_descriptor * desc
Descriptors.
Definition: intelxl.h:453
Admin queue descriptor.
Definition: intelxlvf.h:341
An Intel 40 Gigabit network card.
Definition: intelxl.h:919
int intelxl_admin_command(struct intelxl_nic *intelxl)
Issue admin queue command.
Definition: intelxl.c:295
#define INTELXLVF_ADMIN_SEND_TO_PF
Admin queue Send Message to PF command.
Definition: intelxlvf.h:74
void mdelay(unsigned long msecs)
Delay for a fixed number of milliseconds.
Definition: timer.c:78
Admin queue descriptor.
Definition: intelxl.h:415
#define EIO
Input/output error.
Definition: errno.h:433
#define INTELXLVF_ADMIN_MAX_WAIT_MS
Maximum time to wait for a VF admin request to complete.
Definition: intelxlvf.h:71
#define cpu_to_le16(value)
Definition: byteswap.h:106
struct golan_eqe_cmd cmd
Definition: CIB_PRM.h:29
#define ETIMEDOUT
Connection timed out.
Definition: errno.h:669
unsigned int vopcode
Current VF opcode.
Definition: intelxl.h:956

References cmd, intelxl_nic::command, container_of, cpu_to_le16, DBGC, intelxl_admin::desc, EIO, ETIMEDOUT, intelxl_admin::index, intelxl_admin_command(), INTELXL_ADMIN_NUM_DESC, intelxl_poll_admin(), INTELXLVF_ADMIN_MAX_WAIT_MS, INTELXLVF_ADMIN_SEND_TO_PF, le32_to_cpu, mdelay(), netdev, net_device::priv, rc, intelxl_nic::vopcode, and intelxlvf_admin_descriptor::xl.

Referenced by intelxlvf_admin_configure(), intelxlvf_admin_get_resources(), intelxlvf_admin_irq_map(), intelxlvf_admin_promisc(), intelxlvf_admin_queues(), intelxlvf_admin_stats(), and intelxlvf_admin_version().

◆ intelxlvf_admin_link()

static void intelxlvf_admin_link ( struct net_device netdev,
struct intelxlvf_admin_status_link link 
)
static

Handle link status event.

Parameters
netdevNetwork device
linkLink status

Definition at line 241 of file intelxlvf.c.

242  {
243  struct intelxl_nic *intelxl = netdev->priv;
244 
245  DBGC ( intelxl, "INTELXL %p link %#02x speed %#02x\n", intelxl,
246  link->status, link->speed );
247 
248  /* Update network device */
249  if ( link->status ) {
251  } else {
253  }
254 }
#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
u32 link
Link to next descriptor.
Definition: ar9003_mac.h:68
An Intel 40 Gigabit network card.
Definition: intelxl.h:919

References DBGC, link, netdev, netdev_link_down(), netdev_link_up(), and net_device::priv.

Referenced by intelxlvf_admin_status().

◆ intelxlvf_admin_status()

static void intelxlvf_admin_status ( struct net_device netdev,
struct intelxlvf_admin_status_buffer stat 
)
static

Handle status change event.

Parameters
netdevNetwork device
statStatus change event

Definition at line 263 of file intelxlvf.c.

264  {
265  struct intelxl_nic *intelxl = netdev->priv;
266 
267  /* Handle event */
268  switch ( stat->event ) {
270  intelxlvf_admin_link ( netdev, &stat->data.link );
271  break;
272  default:
273  DBGC ( intelxl, "INTELXL %p unrecognised status change "
274  "event %#x:\n", intelxl, le32_to_cpu ( stat->event ) );
275  DBGC_HDA ( intelxl, 0, stat, sizeof ( *stat ) );
276  break;
277  }
278 }
static void intelxlvf_admin_link(struct net_device *netdev, struct intelxlvf_admin_status_link *link)
Handle link status event.
Definition: intelxlvf.c:241
uint32_t event
Event type.
Definition: intelxlvf.h:155
#define le32_to_cpu(value)
Definition: byteswap.h:113
#define DBGC(...)
Definition: compiler.h:505
#define INTELXLVF_ADMIN_STATUS_LINK
Link status change event type.
Definition: intelxlvf.h:140
void * priv
Driver private data.
Definition: netdevice.h:431
#define DBGC_HDA(...)
Definition: compiler.h:506
static struct net_device * netdev
Definition: gdbudp.c:52
u32 link
Link to next descriptor.
Definition: ar9003_mac.h:68
#define cpu_to_le32(value)
Definition: byteswap.h:107
An Intel 40 Gigabit network card.
Definition: intelxl.h:919
uint8_t data[48]
Additional event data.
Definition: ena.h:22

References cpu_to_le32, intelxlvf_admin_status_buffer::data, DBGC, DBGC_HDA, intelxlvf_admin_status_buffer::event, intelxlvf_admin_link(), INTELXLVF_ADMIN_STATUS_LINK, le32_to_cpu, intelxlvf_admin_status_buffer::link, netdev, and net_device::priv.

Referenced by intelxlvf_admin_event().

◆ intelxlvf_admin_event()

static void intelxlvf_admin_event ( struct net_device netdev,
struct intelxl_admin_descriptor xlevt,
union intelxl_admin_buffer xlbuf 
)
static

Handle admin event.

Parameters
netdevNetwork device
xlevtAdmin queue event descriptor
xlbufAdmin queue event data buffer

Definition at line 287 of file intelxlvf.c.

289  {
290  struct intelxl_nic *intelxl = netdev->priv;
291  struct intelxl_admin *admin = &intelxl->command;
292  struct intelxlvf_admin_descriptor *evt =
293  container_of ( xlevt, struct intelxlvf_admin_descriptor, xl );
294  union intelxlvf_admin_buffer *buf =
295  container_of ( xlbuf, union intelxlvf_admin_buffer, xl );
296  unsigned int vopcode;
297  unsigned int index;
298 
299  /* Ignore unrecognised events */
300  if ( evt->opcode != cpu_to_le16 ( INTELXLVF_ADMIN_SEND_TO_VF ) ) {
301  DBGC ( intelxl, "INTELXL %p unrecognised event opcode "
302  "%#04x\n", intelxl, le16_to_cpu ( evt->opcode ) );
303  return;
304  }
305 
306  /* Record command response if applicable */
307  vopcode = le32_to_cpu ( evt->vopcode );
308  if ( vopcode == intelxl->vopcode ) {
309  index = ( ( admin->index - 1 ) % INTELXL_ADMIN_NUM_DESC );
310  memcpy ( &admin->desc[index], evt, sizeof ( *evt ) );
311  memcpy ( &admin->buf[index], buf, sizeof ( *buf ) );
312  intelxl->vopcode = 0;
313  if ( evt->vret != 0 ) {
314  DBGC ( intelxl, "INTELXL %p admin VF command %#x "
315  "error %d\n", intelxl, vopcode,
316  le32_to_cpu ( evt->vret ) );
317  DBGC_HDA ( intelxl, virt_to_phys ( evt ), evt,
318  sizeof ( *evt ) );
319  DBGC_HDA ( intelxl, virt_to_phys ( buf ), buf,
320  le16_to_cpu ( evt->len ) );
321  }
322  return;
323  }
324 
325  /* Handle unsolicited events */
326  switch ( vopcode ) {
329  break;
330  default:
331  DBGC ( intelxl, "INTELXL %p unrecognised VF event %#x:\n",
332  intelxl, vopcode );
333  DBGC_HDA ( intelxl, virt_to_phys ( evt ), evt,
334  sizeof ( *evt ) );
335  DBGC_HDA ( intelxl, virt_to_phys ( buf ), buf,
336  le16_to_cpu ( evt->len ) );
337  break;
338  }
339 }
Admin queue data buffer.
Definition: intelxlvf.h:315
#define le32_to_cpu(value)
Definition: byteswap.h:113
union intelxl_admin_buffer * buf
Data buffers.
Definition: intelxl.h:455
Admin queue.
Definition: intelxl.h:451
#define DBGC(...)
Definition: compiler.h:505
int32_t vret
VF return value.
Definition: intelxlvf.h:359
struct intelxl_admin command
Admin command queue.
Definition: intelxl.h:951
static __always_inline unsigned long virt_to_phys(volatile const void *addr)
Convert virtual address to a physical address.
Definition: uaccess.h:287
#define INTELXL_ADMIN_NUM_DESC
Number of admin queue descriptors.
Definition: intelxl.h:483
void * memcpy(void *dest, const void *src, size_t len) __nonnull
unsigned int index
Queue index.
Definition: intelxl.h:459
struct intelxlvf_admin_status_buffer stat
VF Status Change Event data buffer.
Definition: intelxlvf.h:325
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
void * priv
Driver private data.
Definition: netdevice.h:431
#define DBGC_HDA(...)
Definition: compiler.h:506
static struct net_device * netdev
Definition: gdbudp.c:52
static void intelxlvf_admin_status(struct net_device *netdev, struct intelxlvf_admin_status_buffer *stat)
Handle status change event.
Definition: intelxlvf.c:263
#define INTELXLVF_ADMIN_SEND_TO_VF
Admin queue Send Message to VF command.
Definition: intelxlvf.h:77
struct intelxl_admin_descriptor xl
Original 40 Gigabit Ethernet descriptor.
Definition: intelxlvf.h:345
uint32_t vopcode
VF opcode.
Definition: intelxlvf.h:357
struct intelxl_admin_descriptor * desc
Descriptors.
Definition: intelxl.h:453
Admin queue descriptor.
Definition: intelxlvf.h:341
An Intel 40 Gigabit network card.
Definition: intelxl.h:919
#define le16_to_cpu(value)
Definition: byteswap.h:112
#define INTELXLVF_ADMIN_STATUS
Admin Queue VF Status Change Event opcode.
Definition: intelxlvf.h:137
#define cpu_to_le16(value)
Definition: byteswap.h:106
uint64_t index
Index of the first segment within the content.
Definition: pccrc.h:21
uint16_t opcode
Opcode.
Definition: intelxlvf.h:351
union intelxl_admin_buffer xl
Original 40 Gigabit Ethernet data buffer.
Definition: intelxlvf.h:317
unsigned int vopcode
Current VF opcode.
Definition: intelxl.h:956
uint16_t len
Data length.
Definition: intelxlvf.h:353

References intelxl_admin::buf, intelxl_nic::command, container_of, cpu_to_le16, DBGC, DBGC_HDA, intelxl_admin::desc, index, intelxl_admin::index, INTELXL_ADMIN_NUM_DESC, INTELXLVF_ADMIN_SEND_TO_VF, INTELXLVF_ADMIN_STATUS, intelxlvf_admin_status(), le16_to_cpu, le32_to_cpu, intelxlvf_admin_descriptor::len, memcpy(), netdev, intelxlvf_admin_descriptor::opcode, net_device::priv, intelxlvf_admin_buffer::stat, virt_to_phys(), intelxlvf_admin_descriptor::vopcode, intelxl_nic::vopcode, intelxlvf_admin_descriptor::vret, intelxlvf_admin_descriptor::xl, and intelxlvf_admin_buffer::xl.

Referenced by intelxlvf_probe().

◆ intelxlvf_admin_version()

static int intelxlvf_admin_version ( struct net_device netdev)
static

Negotiate API version.

Parameters
netdevNetwork device
Return values
rcReturn status code

Definition at line 347 of file intelxlvf.c.

347  {
348  struct intelxl_nic *intelxl = netdev->priv;
350  union intelxlvf_admin_buffer *buf;
351  unsigned int api;
352  int rc;
353 
354  /* Populate descriptor */
356  cmd->vopcode = cpu_to_le32 ( INTELXLVF_ADMIN_VERSION );
358  cmd->len = cpu_to_le16 ( sizeof ( buf->ver ) );
359  buf = intelxlvf_admin_command_buffer ( intelxl );
362 
363  /* Issue command */
364  if ( ( rc = intelxlvf_admin_command ( netdev ) ) != 0 )
365  return rc;
366  api = le32_to_cpu ( buf->ver.major );
367  DBGC ( intelxl, "INTELXL %p API v%d.%d\n",
368  intelxl, api, le32_to_cpu ( buf->ver.minor ) );
369 
370  /* Check for API compatibility */
371  if ( api > INTELXLVF_ADMIN_API_MAJOR ) {
372  DBGC ( intelxl, "INTELXL %p unsupported API v%d\n",
373  intelxl, api );
374  return -ENOTSUP;
375  }
376 
377  return 0;
378 }
Admin queue data buffer.
Definition: intelxlvf.h:315
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
static int intelxlvf_admin_command(struct net_device *netdev)
Issue admin queue virtual function command.
Definition: intelxlvf.c:188
struct intelxlvf_admin_version_buffer ver
VF Version data buffer.
Definition: intelxlvf.h:319
#define le32_to_cpu(value)
Definition: byteswap.h:113
#define INTELXLVF_ADMIN_VERSION
Admin Queue VF Version opcode.
Definition: intelxlvf.h:80
#define DBGC(...)
Definition: compiler.h:505
#define ENOTSUP
Operation not supported.
Definition: errno.h:589
void * priv
Driver private data.
Definition: netdevice.h:431
static struct net_device * netdev
Definition: gdbudp.c:52
#define cpu_to_le32(value)
Definition: byteswap.h:107
uint32_t minor
Minor version.
Definition: intelxlvf.h:87
Admin queue descriptor.
Definition: intelxlvf.h:341
#define INTELXLVF_ADMIN_API_MINOR
Admin queue VF API minor version.
Definition: intelxlvf.h:94
#define INTELXL_ADMIN_FL_BUF
Admin descriptor uses data buffer.
Definition: intelxl.h:445
#define INTELXLVF_ADMIN_API_MAJOR
Admin queue VF API major version.
Definition: intelxlvf.h:91
An Intel 40 Gigabit network card.
Definition: intelxl.h:919
uint32_t major
Major version.
Definition: intelxlvf.h:85
static union intelxlvf_admin_buffer * intelxlvf_admin_command_buffer(struct intelxl_nic *intelxl)
Get next admin command queue data buffer.
Definition: intelxlvf.h:387
#define cpu_to_le16(value)
Definition: byteswap.h:106
struct intelxlvf_admin_descriptor * intelxlvf_admin_command_descriptor(struct intelxl_nic *intelxl)
Get next admin command queue descriptor.
Definition: intelxlvf.h:373
#define INTELXL_ADMIN_FL_RD
Admin descriptor uses data buffer for command parameters.
Definition: intelxl.h:442
struct golan_eqe_cmd cmd
Definition: CIB_PRM.h:29

References cmd, cpu_to_le16, cpu_to_le32, DBGC, ENOTSUP, INTELXL_ADMIN_FL_BUF, INTELXL_ADMIN_FL_RD, INTELXLVF_ADMIN_API_MAJOR, INTELXLVF_ADMIN_API_MINOR, intelxlvf_admin_command(), intelxlvf_admin_command_buffer(), intelxlvf_admin_command_descriptor(), INTELXLVF_ADMIN_VERSION, le32_to_cpu, intelxlvf_admin_version_buffer::major, intelxlvf_admin_version_buffer::minor, netdev, net_device::priv, rc, and intelxlvf_admin_buffer::ver.

Referenced by intelxlvf_probe().

◆ intelxlvf_admin_get_resources()

static int intelxlvf_admin_get_resources ( struct net_device netdev)
static

Get resources.

Parameters
netdevNetwork device
Return values
rcReturn status code

Definition at line 386 of file intelxlvf.c.

386  {
387  struct intelxl_nic *intelxl = netdev->priv;
389  union intelxlvf_admin_buffer *buf;
390  int rc;
391 
392  /* Populate descriptor */
396  cmd->len = cpu_to_le16 ( sizeof ( buf->caps ) );
397  buf = intelxlvf_admin_command_buffer ( intelxl );
400 
401  /* Issue command */
402  if ( ( rc = intelxlvf_admin_command ( netdev ) ) != 0 )
403  return rc;
404 
405  /* Parse response */
406  intelxl->caps = le32_to_cpu ( buf->res.caps );
407  intelxl->vsi = le16_to_cpu ( buf->res.vsi );
408  memcpy ( netdev->hw_addr, buf->res.mac, ETH_ALEN );
409  DBGC ( intelxl, "INTELXL %p capabilities %#08x VSI %#04x\n",
410  intelxl, intelxl->caps, intelxl->vsi );
411 
412  return 0;
413 }
Admin queue data buffer.
Definition: intelxlvf.h:315
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
static int intelxlvf_admin_command(struct net_device *netdev)
Issue admin queue virtual function command.
Definition: intelxlvf.c:188
#define le32_to_cpu(value)
Definition: byteswap.h:113
#define INTELXLVF_ADMIN_CAP_RQPS
Request Queues capabilities.
Definition: intelxlvf.h:134
#define DBGC(...)
Definition: compiler.h:505
struct intelxlvf_admin_capabilities_buffer caps
VF Capabilities data buffer.
Definition: intelxlvf.h:321
uint32_t caps
Capabilities.
Definition: intelxlvf.h:119
void * memcpy(void *dest, const void *src, size_t len) __nonnull
struct intelxlvf_admin_get_resources_buffer res
VF Get Resources data buffer.
Definition: intelxlvf.h:323
uint16_t vsi
VSI switching element ID.
Definition: intelxlvf.h:123
unsigned int vsi
Virtual Station Interface switching element ID.
Definition: intelxl.h:936
void * priv
Driver private data.
Definition: netdevice.h:431
static struct net_device * netdev
Definition: gdbudp.c:52
#define cpu_to_le32(value)
Definition: byteswap.h:107
uint32_t caps
Device capabilities.
Definition: intelxl.h:942
#define INTELXLVF_ADMIN_CAP_L2
Layer 2 capabilities (add/remove MAC, configure promiscuous mode)
Definition: intelxlvf.h:131
uint8_t mac[ETH_ALEN]
MAC address.
Definition: intelxlvf.h:127
Admin queue descriptor.
Definition: intelxlvf.h:341
#define INTELXL_ADMIN_FL_BUF
Admin descriptor uses data buffer.
Definition: intelxl.h:445
An Intel 40 Gigabit network card.
Definition: intelxl.h:919
#define ETH_ALEN
Definition: if_ether.h:8
#define le16_to_cpu(value)
Definition: byteswap.h:112
#define INTELXLVF_ADMIN_GET_RESOURCES
Admin Queue VF Get Resources opcode.
Definition: intelxlvf.h:100
uint32_t caps
Capabilities.
Definition: intelxlvf.h:105
static union intelxlvf_admin_buffer * intelxlvf_admin_command_buffer(struct intelxl_nic *intelxl)
Get next admin command queue data buffer.
Definition: intelxlvf.h:387
#define cpu_to_le16(value)
Definition: byteswap.h:106
struct intelxlvf_admin_descriptor * intelxlvf_admin_command_descriptor(struct intelxl_nic *intelxl)
Get next admin command queue descriptor.
Definition: intelxlvf.h:373
#define INTELXL_ADMIN_FL_RD
Admin descriptor uses data buffer for command parameters.
Definition: intelxl.h:442
uint8_t hw_addr[MAX_HW_ADDR_LEN]
Hardware address.
Definition: netdevice.h:381
struct golan_eqe_cmd cmd
Definition: CIB_PRM.h:29

References intelxlvf_admin_capabilities_buffer::caps, intelxlvf_admin_get_resources_buffer::caps, intelxlvf_admin_buffer::caps, intelxl_nic::caps, cmd, cpu_to_le16, cpu_to_le32, DBGC, ETH_ALEN, net_device::hw_addr, INTELXL_ADMIN_FL_BUF, INTELXL_ADMIN_FL_RD, INTELXLVF_ADMIN_CAP_L2, INTELXLVF_ADMIN_CAP_RQPS, intelxlvf_admin_command(), intelxlvf_admin_command_buffer(), intelxlvf_admin_command_descriptor(), INTELXLVF_ADMIN_GET_RESOURCES, le16_to_cpu, le32_to_cpu, intelxlvf_admin_get_resources_buffer::mac, memcpy(), netdev, net_device::priv, rc, intelxlvf_admin_buffer::res, intelxlvf_admin_get_resources_buffer::vsi, and intelxl_nic::vsi.

Referenced by intelxlvf_admin_request_qps(), and intelxlvf_probe().

◆ intelxlvf_admin_stats()

static int intelxlvf_admin_stats ( struct net_device netdev)
static

Get statistics (for debugging)

Parameters
netdevNetwork device
Return values
rcReturn status code

Definition at line 421 of file intelxlvf.c.

421  {
422  struct intelxl_nic *intelxl = netdev->priv;
424  union intelxlvf_admin_buffer *buf;
425  struct intelxlvf_admin_stats *tx;
426  struct intelxlvf_admin_stats *rx;
427  int rc;
428 
429  /* Populate descriptor */
433  cmd->len = cpu_to_le16 ( sizeof ( buf->queues ) );
434  buf = intelxlvf_admin_command_buffer ( intelxl );
435  buf->queues.vsi = cpu_to_le16 ( intelxl->vsi );
436  tx = &buf->stats.tx;
437  rx = &buf->stats.rx;
438 
439  /* Issue command */
440  if ( ( rc = intelxlvf_admin_command ( netdev ) ) != 0 )
441  return rc;
442  DBGC ( intelxl, "INTELXL %p TX bytes %#llx discards %#llx errors "
443  "%#llx\n", intelxl,
444  ( ( unsigned long long ) le64_to_cpu ( tx->bytes ) ),
445  ( ( unsigned long long ) le64_to_cpu ( tx->discards ) ),
446  ( ( unsigned long long ) le64_to_cpu ( tx->errors ) ) );
447  DBGC ( intelxl, "INTELXL %p TX unicasts %#llx multicasts %#llx "
448  "broadcasts %#llx\n", intelxl,
449  ( ( unsigned long long ) le64_to_cpu ( tx->unicasts ) ),
450  ( ( unsigned long long ) le64_to_cpu ( tx->multicasts ) ),
451  ( ( unsigned long long ) le64_to_cpu ( tx->broadcasts ) ) );
452  DBGC ( intelxl, "INTELXL %p RX bytes %#llx discards %#llx errors "
453  "%#llx\n", intelxl,
454  ( ( unsigned long long ) le64_to_cpu ( rx->bytes ) ),
455  ( ( unsigned long long ) le64_to_cpu ( rx->discards ) ),
456  ( ( unsigned long long ) le64_to_cpu ( rx->errors ) ) );
457  DBGC ( intelxl, "INTELXL %p RX unicasts %#llx multicasts %#llx "
458  "broadcasts %#llx\n", intelxl,
459  ( ( unsigned long long ) le64_to_cpu ( rx->unicasts ) ),
460  ( ( unsigned long long ) le64_to_cpu ( rx->multicasts ) ),
461  ( ( unsigned long long ) le64_to_cpu ( rx->broadcasts ) ) );
462 
463  return 0;
464 }
uint16_t vsi
VSI switching element ID.
Definition: intelxlvf.h:258
Admin queue data buffer.
Definition: intelxlvf.h:315
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
static int intelxlvf_admin_command(struct net_device *netdev)
Issue admin queue virtual function command.
Definition: intelxlvf.c:188
#define DBGC(...)
Definition: compiler.h:505
struct intelxlvf_admin_queues_buffer queues
VF Enable/Disable Queues data buffer.
Definition: intelxlvf.h:329
struct intelxlvf_admin_stats tx
Transmit statistics.
Definition: intelxlvf.h:302
unsigned int vsi
Virtual Station Interface switching element ID.
Definition: intelxl.h:936
void * priv
Driver private data.
Definition: netdevice.h:431
static struct net_device * netdev
Definition: gdbudp.c:52
#define cpu_to_le32(value)
Definition: byteswap.h:107
Admin queue descriptor.
Definition: intelxlvf.h:341
#define INTELXL_ADMIN_FL_BUF
Admin descriptor uses data buffer.
Definition: intelxl.h:445
An Intel 40 Gigabit network card.
Definition: intelxl.h:919
VF statistics.
Definition: intelxlvf.h:282
struct intelxlvf_admin_stats_buffer stats
VF Get Statistics data buffer.
Definition: intelxlvf.h:335
static union intelxlvf_admin_buffer * intelxlvf_admin_command_buffer(struct intelxl_nic *intelxl)
Get next admin command queue data buffer.
Definition: intelxlvf.h:387
struct intelxlvf_admin_stats rx
Receive statistics.
Definition: intelxlvf.h:300
u8 rx[WPA_TKIP_MIC_KEY_LEN]
MIC key for packets from the AP.
Definition: wpa.h:234
#define cpu_to_le16(value)
Definition: byteswap.h:106
struct intelxlvf_admin_descriptor * intelxlvf_admin_command_descriptor(struct intelxl_nic *intelxl)
Get next admin command queue descriptor.
Definition: intelxlvf.h:373
#define le64_to_cpu(value)
Definition: byteswap.h:114
#define INTELXL_ADMIN_FL_RD
Admin descriptor uses data buffer for command parameters.
Definition: intelxl.h:442
struct golan_eqe_cmd cmd
Definition: CIB_PRM.h:29
#define INTELXLVF_ADMIN_GET_STATS
Admin Queue VF Get Statistics opcode.
Definition: intelxlvf.h:279
u8 tx[WPA_TKIP_MIC_KEY_LEN]
MIC key for packets to the AP.
Definition: wpa.h:237

References cmd, cpu_to_le16, cpu_to_le32, DBGC, INTELXL_ADMIN_FL_BUF, INTELXL_ADMIN_FL_RD, intelxlvf_admin_command(), intelxlvf_admin_command_buffer(), intelxlvf_admin_command_descriptor(), INTELXLVF_ADMIN_GET_STATS, le64_to_cpu, netdev, net_device::priv, intelxlvf_admin_buffer::queues, rc, rx, intelxlvf_admin_stats_buffer::rx, intelxlvf_admin_buffer::stats, tx, intelxlvf_admin_stats_buffer::tx, intelxlvf_admin_queues_buffer::vsi, and intelxl_nic::vsi.

Referenced by intelxlvf_close(), and intelxlvf_open().

◆ intelxlvf_admin_request_qps()

static int intelxlvf_admin_request_qps ( struct net_device netdev)
static

Configure number of queue pairs.

Parameters
netdevNetwork device
Return values
rcReturn status code

Definition at line 472 of file intelxlvf.c.

472  {
473  struct intelxl_nic *intelxl = netdev->priv;
475  union intelxlvf_admin_buffer *buf;
476  int rc;
477 
478  /* Populate descriptor */
483  cmd->len = cpu_to_le16 ( sizeof ( buf->rqps ) );
484  buf = intelxlvf_admin_command_buffer ( intelxl );
485  buf->rqps.count = cpu_to_le16 ( 1 );
486 
487  /* Issue command (which will trigger a reset) */
488  if ( ( rc = intelxl_admin_command ( intelxl ) ) != 0 )
489  return rc;
490 
491  /* Wait for reset to complete */
492  if ( ( rc = intelxlvf_reset_wait ( intelxl ) ) != 0 )
493  return rc;
494 
495  /* Reestablish capabilities to reactivate VF after reset */
496  if ( ( rc = intelxlvf_admin_get_resources ( netdev ) ) != 0 )
497  return rc;
498 
499  return 0;
500 }
Admin queue data buffer.
Definition: intelxlvf.h:315
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
void * priv
Driver private data.
Definition: netdevice.h:431
static int intelxlvf_admin_get_resources(struct net_device *netdev)
Get resources.
Definition: intelxlvf.c:386
static struct net_device * netdev
Definition: gdbudp.c:52
#define cpu_to_le32(value)
Definition: byteswap.h:107
uint16_t count
Number of queue pairs.
Definition: intelxlvf.h:311
struct intelxlvf_admin_request_qps_buffer rqps
VF Request Queues data buffer.
Definition: intelxlvf.h:337
Admin queue descriptor.
Definition: intelxlvf.h:341
#define INTELXL_ADMIN_FL_BUF
Admin descriptor uses data buffer.
Definition: intelxl.h:445
An Intel 40 Gigabit network card.
Definition: intelxl.h:919
int intelxl_admin_command(struct intelxl_nic *intelxl)
Issue admin queue command.
Definition: intelxl.c:295
#define INTELXLVF_ADMIN_SEND_TO_PF
Admin queue Send Message to PF command.
Definition: intelxlvf.h:74
static union intelxlvf_admin_buffer * intelxlvf_admin_command_buffer(struct intelxl_nic *intelxl)
Get next admin command queue data buffer.
Definition: intelxlvf.h:387
#define cpu_to_le16(value)
Definition: byteswap.h:106
#define INTELXLVF_ADMIN_REQUEST_QPS
Admin Queue VF Request Queues opcode.
Definition: intelxlvf.h:306
struct intelxlvf_admin_descriptor * intelxlvf_admin_command_descriptor(struct intelxl_nic *intelxl)
Get next admin command queue descriptor.
Definition: intelxlvf.h:373
static int intelxlvf_reset_wait(struct intelxl_nic *intelxl)
Wait for reset to complete.
Definition: intelxlvf.c:111
#define INTELXL_ADMIN_FL_RD
Admin descriptor uses data buffer for command parameters.
Definition: intelxl.h:442
struct golan_eqe_cmd cmd
Definition: CIB_PRM.h:29

References cmd, intelxlvf_admin_request_qps_buffer::count, cpu_to_le16, cpu_to_le32, intelxl_admin_command(), INTELXL_ADMIN_FL_BUF, INTELXL_ADMIN_FL_RD, intelxlvf_admin_command_buffer(), intelxlvf_admin_command_descriptor(), intelxlvf_admin_get_resources(), INTELXLVF_ADMIN_REQUEST_QPS, INTELXLVF_ADMIN_SEND_TO_PF, intelxlvf_reset_wait(), netdev, net_device::priv, rc, and intelxlvf_admin_buffer::rqps.

Referenced by intelxlvf_probe().

◆ intelxlvf_admin_configure()

static int intelxlvf_admin_configure ( struct net_device netdev)
static

Configure queues.

Parameters
netdevNetwork device
Return values
rcReturn status code

Definition at line 515 of file intelxlvf.c.

515  {
516  struct intelxl_nic *intelxl = netdev->priv;
518  union intelxlvf_admin_buffer *buf;
519  int rc;
520 
521  /* Populate descriptor */
525  cmd->len = cpu_to_le16 ( sizeof ( buf->cfg ) );
526  buf = intelxlvf_admin_command_buffer ( intelxl );
527  buf->cfg.vsi = cpu_to_le16 ( intelxl->vsi );
528  buf->cfg.count = cpu_to_le16 ( 1 );
529  buf->cfg.tx.vsi = cpu_to_le16 ( intelxl->vsi );
531  buf->cfg.tx.base = cpu_to_le64 ( dma ( &intelxl->tx.map,
532  intelxl->tx.desc.raw ) );
533  buf->cfg.rx.vsi = cpu_to_le16 ( intelxl->vsi );
535  buf->cfg.rx.len = cpu_to_le32 ( intelxl->mfs );
536  buf->cfg.rx.mfs = cpu_to_le32 ( intelxl->mfs );
537  buf->cfg.rx.base = cpu_to_le64 ( dma ( &intelxl->rx.map,
538  intelxl->rx.desc.raw ) );
539 
540  /* Issue command */
541  if ( ( rc = intelxlvf_admin_command ( netdev ) ) != 0 )
542  return rc;
543 
544  return 0;
545 }
Admin queue data buffer.
Definition: intelxlvf.h:315
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
static int intelxlvf_admin_command(struct net_device *netdev)
Issue admin queue virtual function command.
Definition: intelxlvf.c:188
#define cpu_to_le64(value)
Definition: byteswap.h:108
size_t mfs
Maximum frame size.
Definition: intelxl.h:925
struct intelxlvf_admin_configure_buffer::@68 rx
Receive queue.
struct intelxl_ring rx
Receive descriptor ring.
Definition: intelxl.h:961
struct intelxlvf_admin_configure_buffer cfg
VF Configure Queues data buffer.
Definition: intelxlvf.h:327
uint64_t base
Base address.
Definition: intelxlvf.h:187
unsigned int vsi
Virtual Station Interface switching element ID.
Definition: intelxl.h:936
#define INTELXL_TX_NUM_DESC
Number of transmit descriptors.
Definition: intelxl.h:808
void * priv
Driver private data.
Definition: netdevice.h:431
void * raw
Raw data.
Definition: intelxl.h:763
uint32_t len
Data buffer length.
Definition: intelxlvf.h:202
static struct net_device * netdev
Definition: gdbudp.c:52
#define INTELXL_RX_NUM_DESC
Number of receive descriptors.
Definition: intelxl.h:817
uint16_t count
Number of queue pairs.
Definition: intelxlvf.h:173
union intelxl_ring::@65 desc
Descriptors.
#define cpu_to_le32(value)
Definition: byteswap.h:107
uint16_t vsi
VSI switching element ID.
Definition: intelxlvf.h:171
Admin queue descriptor.
Definition: intelxlvf.h:341
struct dma_mapping map
Descriptor ring DMA mapping.
Definition: intelxl.h:766
#define INTELXL_ADMIN_FL_BUF
Admin descriptor uses data buffer.
Definition: intelxl.h:445
An Intel 40 Gigabit network card.
Definition: intelxl.h:919
#define INTELXLVF_ADMIN_CONFIGURE
Admin Queue VF Configure Queues opcode.
Definition: intelxlvf.h:166
struct intelxl_ring tx
Transmit descriptor ring.
Definition: intelxl.h:959
static union intelxlvf_admin_buffer * intelxlvf_admin_command_buffer(struct intelxl_nic *intelxl)
Get next admin command queue data buffer.
Definition: intelxlvf.h:387
#define cpu_to_le16(value)
Definition: byteswap.h:106
struct intelxlvf_admin_descriptor * intelxlvf_admin_command_descriptor(struct intelxl_nic *intelxl)
Get next admin command queue descriptor.
Definition: intelxlvf.h:373
struct intelxlvf_admin_configure_buffer::@67 tx
Transmit queue.
static __always_inline physaddr_t dma(struct dma_mapping *map, void *addr)
Get DMA address from virtual address.
Definition: dma.h:436
#define INTELXL_ADMIN_FL_RD
Admin descriptor uses data buffer for command parameters.
Definition: intelxl.h:442
struct golan_eqe_cmd cmd
Definition: CIB_PRM.h:29
uint32_t mfs
Maximum frame size.
Definition: intelxlvf.h:204

References intelxlvf_admin_configure_buffer::base, intelxlvf_admin_buffer::cfg, cmd, intelxlvf_admin_configure_buffer::count, cpu_to_le16, cpu_to_le32, cpu_to_le64, intelxl_ring::desc, dma(), INTELXL_ADMIN_FL_BUF, INTELXL_ADMIN_FL_RD, INTELXL_RX_NUM_DESC, INTELXL_TX_NUM_DESC, intelxlvf_admin_command(), intelxlvf_admin_command_buffer(), intelxlvf_admin_command_descriptor(), INTELXLVF_ADMIN_CONFIGURE, intelxlvf_admin_configure_buffer::len, intelxl_ring::map, intelxlvf_admin_configure_buffer::mfs, intelxl_nic::mfs, netdev, net_device::priv, intelxl_ring::raw, rc, intelxlvf_admin_configure_buffer::rx, intelxl_nic::rx, intelxlvf_admin_configure_buffer::tx, intelxl_nic::tx, intelxlvf_admin_configure_buffer::vsi, and intelxl_nic::vsi.

Referenced by intelxlvf_open().

◆ intelxlvf_admin_irq_map()

static int intelxlvf_admin_irq_map ( struct net_device netdev)
static

Configure IRQ mapping.

Parameters
netdevNetwork device
Return values
rcReturn status code

Definition at line 553 of file intelxlvf.c.

553  {
554  struct intelxl_nic *intelxl = netdev->priv;
556  union intelxlvf_admin_buffer *buf;
557  int rc;
558 
559  /* Populate descriptor */
561  cmd->vopcode = cpu_to_le32 ( INTELXLVF_ADMIN_IRQ_MAP );
563  cmd->len = cpu_to_le16 ( sizeof ( buf->irq ) );
564  buf = intelxlvf_admin_command_buffer ( intelxl );
565  buf->irq.count = cpu_to_le16 ( 1 );
566  buf->irq.vsi = cpu_to_le16 ( intelxl->vsi );
568  buf->irq.rxmap = cpu_to_le16 ( 0x0001 );
569  buf->irq.txmap = cpu_to_le16 ( 0x0001 );
570 
571  /* Issue command */
572  if ( ( rc = intelxlvf_admin_command ( netdev ) ) != 0 )
573  return rc;
574 
575  return 0;
576 }
Admin queue data buffer.
Definition: intelxlvf.h:315
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
uint16_t txmap
Transmit queue bitmap.
Definition: intelxlvf.h:235
static int intelxlvf_admin_command(struct net_device *netdev)
Issue admin queue virtual function command.
Definition: intelxlvf.c:188
struct intelxlvf_admin_irq_map_buffer irq
VF IRQ Map data buffer.
Definition: intelxlvf.h:333
uint16_t vsi
VSI switching element ID.
Definition: intelxlvf.h:229
#define INTELXLVF_ADMIN_IRQ_MAP
Admin Queue VF IRQ Map opcode.
Definition: intelxlvf.h:222
unsigned int vsi
Virtual Station Interface switching element ID.
Definition: intelxl.h:936
void * priv
Driver private data.
Definition: netdevice.h:431
uint16_t rxmap
Receive queue bitmap.
Definition: intelxlvf.h:233
static struct net_device * netdev
Definition: gdbudp.c:52
#define cpu_to_le32(value)
Definition: byteswap.h:107
uint16_t count
Number of interrupt vectors.
Definition: intelxlvf.h:227
Admin queue descriptor.
Definition: intelxlvf.h:341
#define INTELXL_ADMIN_FL_BUF
Admin descriptor uses data buffer.
Definition: intelxl.h:445
An Intel 40 Gigabit network card.
Definition: intelxl.h:919
#define INTELXLVF_MSIX_VECTOR
MSI-X vector.
Definition: intelxlvf.h:23
static union intelxlvf_admin_buffer * intelxlvf_admin_command_buffer(struct intelxl_nic *intelxl)
Get next admin command queue data buffer.
Definition: intelxlvf.h:387
#define cpu_to_le16(value)
Definition: byteswap.h:106
uint16_t vec
Interrupt vector ID.
Definition: intelxlvf.h:231
struct intelxlvf_admin_descriptor * intelxlvf_admin_command_descriptor(struct intelxl_nic *intelxl)
Get next admin command queue descriptor.
Definition: intelxlvf.h:373
#define INTELXL_ADMIN_FL_RD
Admin descriptor uses data buffer for command parameters.
Definition: intelxl.h:442
struct golan_eqe_cmd cmd
Definition: CIB_PRM.h:29

References cmd, intelxlvf_admin_irq_map_buffer::count, cpu_to_le16, cpu_to_le32, INTELXL_ADMIN_FL_BUF, INTELXL_ADMIN_FL_RD, intelxlvf_admin_command(), intelxlvf_admin_command_buffer(), intelxlvf_admin_command_descriptor(), INTELXLVF_ADMIN_IRQ_MAP, INTELXLVF_MSIX_VECTOR, intelxlvf_admin_buffer::irq, netdev, net_device::priv, rc, intelxlvf_admin_irq_map_buffer::rxmap, intelxlvf_admin_irq_map_buffer::txmap, intelxlvf_admin_irq_map_buffer::vec, intelxlvf_admin_irq_map_buffer::vsi, and intelxl_nic::vsi.

Referenced by intelxlvf_open().

◆ intelxlvf_admin_queues()

static int intelxlvf_admin_queues ( struct net_device netdev,
int  enable 
)
static

Enable/disable queues.

Parameters
netdevNetwork device
enableEnable queues
Return values
rcReturn status code

Definition at line 585 of file intelxlvf.c.

585  {
586  struct intelxl_nic *intelxl = netdev->priv;
588  union intelxlvf_admin_buffer *buf;
589  int rc;
590 
591  /* Populate descriptor */
593  cmd->vopcode = ( enable ? cpu_to_le32 ( INTELXLVF_ADMIN_ENABLE ) :
596  cmd->len = cpu_to_le16 ( sizeof ( buf->queues ) );
597  buf = intelxlvf_admin_command_buffer ( intelxl );
598  buf->queues.vsi = cpu_to_le16 ( intelxl->vsi );
599  buf->queues.rx = cpu_to_le32 ( 1 );
600  buf->queues.tx = cpu_to_le32 ( 1 );
601 
602  /* Issue command */
603  if ( ( rc = intelxlvf_admin_command ( netdev ) ) != 0 )
604  return rc;
605 
606  return 0;
607 }
uint16_t vsi
VSI switching element ID.
Definition: intelxlvf.h:258
Admin queue data buffer.
Definition: intelxlvf.h:315
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
static int intelxlvf_admin_command(struct net_device *netdev)
Issue admin queue virtual function command.
Definition: intelxlvf.c:188
uint32_t tx
Transmit queue bitmask.
Definition: intelxlvf.h:264
struct intelxlvf_admin_queues_buffer queues
VF Enable/Disable Queues data buffer.
Definition: intelxlvf.h:329
unsigned int vsi
Virtual Station Interface switching element ID.
Definition: intelxl.h:936
void * priv
Driver private data.
Definition: netdevice.h:431
static struct net_device * netdev
Definition: gdbudp.c:52
#define cpu_to_le32(value)
Definition: byteswap.h:107
Admin queue descriptor.
Definition: intelxlvf.h:341
#define INTELXL_ADMIN_FL_BUF
Admin descriptor uses data buffer.
Definition: intelxl.h:445
An Intel 40 Gigabit network card.
Definition: intelxl.h:919
#define INTELXLVF_ADMIN_DISABLE
Admin Queue VF Disable Queues opcode.
Definition: intelxlvf.h:253
static union intelxlvf_admin_buffer * intelxlvf_admin_command_buffer(struct intelxl_nic *intelxl)
Get next admin command queue data buffer.
Definition: intelxlvf.h:387
#define cpu_to_le16(value)
Definition: byteswap.h:106
uint32_t rx
Receive queue bitmask.
Definition: intelxlvf.h:262
struct intelxlvf_admin_descriptor * intelxlvf_admin_command_descriptor(struct intelxl_nic *intelxl)
Get next admin command queue descriptor.
Definition: intelxlvf.h:373
#define INTELXL_ADMIN_FL_RD
Admin descriptor uses data buffer for command parameters.
Definition: intelxl.h:442
struct golan_eqe_cmd cmd
Definition: CIB_PRM.h:29
#define INTELXLVF_ADMIN_ENABLE
Admin Queue VF Enable Queues opcode.
Definition: intelxlvf.h:250

References cmd, cpu_to_le16, cpu_to_le32, INTELXL_ADMIN_FL_BUF, INTELXL_ADMIN_FL_RD, intelxlvf_admin_command(), intelxlvf_admin_command_buffer(), intelxlvf_admin_command_descriptor(), INTELXLVF_ADMIN_DISABLE, INTELXLVF_ADMIN_ENABLE, netdev, net_device::priv, intelxlvf_admin_buffer::queues, rc, intelxlvf_admin_queues_buffer::rx, intelxlvf_admin_queues_buffer::tx, intelxlvf_admin_queues_buffer::vsi, and intelxl_nic::vsi.

Referenced by intelxlvf_close(), and intelxlvf_open().

◆ intelxlvf_admin_promisc()

static int intelxlvf_admin_promisc ( struct net_device netdev)
static

Configure promiscuous mode.

Parameters
netdevNetwork device
Return values
rcReturn status code

Definition at line 615 of file intelxlvf.c.

615  {
616  struct intelxl_nic *intelxl = netdev->priv;
618  union intelxlvf_admin_buffer *buf;
619  int rc;
620 
621  /* Populate descriptor */
623  cmd->vopcode = cpu_to_le32 ( INTELXLVF_ADMIN_PROMISC );
625  cmd->len = cpu_to_le16 ( sizeof ( buf->promisc ) );
626  buf = intelxlvf_admin_command_buffer ( intelxl );
627  buf->promisc.vsi = cpu_to_le16 ( intelxl->vsi );
630 
631  /* Issue command */
632  if ( ( rc = intelxlvf_admin_command ( netdev ) ) != 0 )
633  return rc;
634 
635  return 0;
636 }
uint16_t vsi
VSI switching element ID.
Definition: intelxlvf.h:273
Admin queue data buffer.
Definition: intelxlvf.h:315
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
static int intelxlvf_admin_command(struct net_device *netdev)
Issue admin queue virtual function command.
Definition: intelxlvf.c:188
#define INTELXLVF_ADMIN_PROMISC
Admin Queue VF Configure Promiscuous Mode opcode.
Definition: intelxlvf.h:268
struct intelxlvf_admin_promisc_buffer promisc
VF Configure Promiscuous Mode data buffer.
Definition: intelxlvf.h:331
unsigned int vsi
Virtual Station Interface switching element ID.
Definition: intelxl.h:936
void * priv
Driver private data.
Definition: netdevice.h:431
static struct net_device * netdev
Definition: gdbudp.c:52
#define cpu_to_le32(value)
Definition: byteswap.h:107
Admin queue descriptor.
Definition: intelxlvf.h:341
#define INTELXL_ADMIN_FL_BUF
Admin descriptor uses data buffer.
Definition: intelxl.h:445
An Intel 40 Gigabit network card.
Definition: intelxl.h:919
static union intelxlvf_admin_buffer * intelxlvf_admin_command_buffer(struct intelxl_nic *intelxl)
Get next admin command queue data buffer.
Definition: intelxlvf.h:387
#define cpu_to_le16(value)
Definition: byteswap.h:106
#define INTELXL_ADMIN_PROMISC_FL_UNICAST
Promiscuous unicast mode.
Definition: intelxl.h:298
struct intelxlvf_admin_descriptor * intelxlvf_admin_command_descriptor(struct intelxl_nic *intelxl)
Get next admin command queue descriptor.
Definition: intelxlvf.h:373
#define INTELXL_ADMIN_FL_RD
Admin descriptor uses data buffer for command parameters.
Definition: intelxl.h:442
struct golan_eqe_cmd cmd
Definition: CIB_PRM.h:29
#define INTELXL_ADMIN_PROMISC_FL_MULTICAST
Promiscuous multicast mode.
Definition: intelxl.h:301

References cmd, cpu_to_le16, cpu_to_le32, intelxlvf_admin_promisc_buffer::flags, INTELXL_ADMIN_FL_BUF, INTELXL_ADMIN_FL_RD, INTELXL_ADMIN_PROMISC_FL_MULTICAST, INTELXL_ADMIN_PROMISC_FL_UNICAST, intelxlvf_admin_command(), intelxlvf_admin_command_buffer(), intelxlvf_admin_command_descriptor(), INTELXLVF_ADMIN_PROMISC, netdev, net_device::priv, intelxlvf_admin_buffer::promisc, rc, intelxlvf_admin_promisc_buffer::vsi, and intelxl_nic::vsi.

Referenced by intelxlvf_open().

◆ intelxlvf_open()

static int intelxlvf_open ( struct net_device netdev)
static

Open network device.

Parameters
netdevNetwork device
Return values
rcReturn status code

Definition at line 644 of file intelxlvf.c.

644  {
645  struct intelxl_nic *intelxl = netdev->priv;
646  int rc;
647 
648  /* Calculate maximum frame size */
649  intelxl->mfs = ( ( ETH_HLEN + netdev->mtu + 4 /* CRC */ +
650  INTELXL_ALIGN - 1 ) & ~( INTELXL_ALIGN - 1 ) );
651 
652  /* Allocate transmit descriptor ring */
653  if ( ( rc = intelxl_alloc_ring ( intelxl, &intelxl->tx ) ) != 0 )
654  goto err_alloc_tx;
655 
656  /* Allocate receive descriptor ring */
657  if ( ( rc = intelxl_alloc_ring ( intelxl, &intelxl->rx ) ) != 0 )
658  goto err_alloc_rx;
659 
660  /* Configure queues */
661  if ( ( rc = intelxlvf_admin_configure ( netdev ) ) != 0 )
662  goto err_configure;
663 
664  /* Configure IRQ map */
665  if ( ( rc = intelxlvf_admin_irq_map ( netdev ) ) != 0 )
666  goto err_irq_map;
667 
668  /* Enable queues */
669  if ( ( rc = intelxlvf_admin_queues ( netdev, 1 ) ) != 0 )
670  goto err_enable;
671 
672  /* Configure promiscuous mode */
673  if ( ( rc = intelxlvf_admin_promisc ( netdev ) ) != 0 )
674  goto err_promisc;
675 
676  /* Reset statistics counters (if debugging) */
677  if ( DBG_LOG )
679 
680  return 0;
681 
682  err_promisc:
684  err_enable:
685  err_irq_map:
686  err_configure:
687  intelxl_free_ring ( intelxl, &intelxl->rx );
688  err_alloc_rx:
689  intelxl_free_ring ( intelxl, &intelxl->tx );
690  err_alloc_tx:
691  return rc;
692 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
static int intelxlvf_admin_configure(struct net_device *netdev)
Configure queues.
Definition: intelxlvf.c:515
static int intelxlvf_admin_irq_map(struct net_device *netdev)
Configure IRQ mapping.
Definition: intelxlvf.c:553
static int intelxlvf_admin_promisc(struct net_device *netdev)
Configure promiscuous mode.
Definition: intelxlvf.c:615
size_t mtu
Maximum transmission unit length.
Definition: netdevice.h:415
#define INTELXL_ALIGN
Alignment.
Definition: intelxl.h:26
size_t mfs
Maximum frame size.
Definition: intelxl.h:925
struct intelxl_ring rx
Receive descriptor ring.
Definition: intelxl.h:961
#define ETH_HLEN
Definition: if_ether.h:9
void * priv
Driver private data.
Definition: netdevice.h:431
static struct net_device * netdev
Definition: gdbudp.c:52
static int intelxlvf_admin_queues(struct net_device *netdev, int enable)
Enable/disable queues.
Definition: intelxlvf.c:585
static int intelxlvf_admin_stats(struct net_device *netdev)
Get statistics (for debugging)
Definition: intelxlvf.c:421
void intelxl_free_ring(struct intelxl_nic *intelxl __unused, struct intelxl_ring *ring)
Free descriptor ring.
Definition: intelxl.c:1013
An Intel 40 Gigabit network card.
Definition: intelxl.h:919
struct intelxl_ring tx
Transmit descriptor ring.
Definition: intelxl.h:959
#define DBG_LOG
Definition: compiler.h:317
int intelxl_alloc_ring(struct intelxl_nic *intelxl, struct intelxl_ring *ring)
Allocate descriptor ring.
Definition: intelxl.c:974

References DBG_LOG, ETH_HLEN, INTELXL_ALIGN, intelxl_alloc_ring(), intelxl_free_ring(), intelxlvf_admin_configure(), intelxlvf_admin_irq_map(), intelxlvf_admin_promisc(), intelxlvf_admin_queues(), intelxlvf_admin_stats(), intelxl_nic::mfs, net_device::mtu, netdev, net_device::priv, rc, intelxl_nic::rx, and intelxl_nic::tx.

◆ intelxlvf_close()

static void intelxlvf_close ( struct net_device netdev)
static

Close network device.

Parameters
netdevNetwork device

Definition at line 699 of file intelxlvf.c.

699  {
700  struct intelxl_nic *intelxl = netdev->priv;
701  int rc;
702 
703  /* Show statistics (if debugging) */
704  if ( DBG_LOG )
706 
707  /* Disable queues */
708  if ( ( rc = intelxlvf_admin_queues ( netdev, 0 ) ) != 0 ) {
709  /* Leak memory; there's nothing else we can do */
710  return;
711  }
712 
713  /* Free receive descriptor ring */
714  intelxl_free_ring ( intelxl, &intelxl->rx );
715 
716  /* Free transmit descriptor ring */
717  intelxl_free_ring ( intelxl, &intelxl->tx );
718 
719  /* Discard any unused receive buffers */
720  intelxl_empty_rx ( intelxl );
721 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
struct intelxl_ring rx
Receive descriptor ring.
Definition: intelxl.h:961
void * priv
Driver private data.
Definition: netdevice.h:431
static struct net_device * netdev
Definition: gdbudp.c:52
static int intelxlvf_admin_queues(struct net_device *netdev, int enable)
Enable/disable queues.
Definition: intelxlvf.c:585
static int intelxlvf_admin_stats(struct net_device *netdev)
Get statistics (for debugging)
Definition: intelxlvf.c:421
void intelxl_free_ring(struct intelxl_nic *intelxl __unused, struct intelxl_ring *ring)
Free descriptor ring.
Definition: intelxl.c:1013
An Intel 40 Gigabit network card.
Definition: intelxl.h:919
struct intelxl_ring tx
Transmit descriptor ring.
Definition: intelxl.h:959
#define DBG_LOG
Definition: compiler.h:317
void intelxl_empty_rx(struct intelxl_nic *intelxl)
Discard unused receive I/O buffers.
Definition: intelxl.c:1384

References DBG_LOG, intelxl_empty_rx(), intelxl_free_ring(), intelxlvf_admin_queues(), intelxlvf_admin_stats(), netdev, net_device::priv, rc, intelxl_nic::rx, and intelxl_nic::tx.

◆ intelxlvf_probe()

static int intelxlvf_probe ( struct pci_device pci)
static

Probe PCI device.

Parameters
pciPCI device
Return values
rcReturn status code

Definition at line 744 of file intelxlvf.c.

744  {
745  struct net_device *netdev;
746  struct intelxl_nic *intelxl;
747  int rc;
748 
749  /* Allocate and initialise net device */
750  netdev = alloc_etherdev ( sizeof ( *intelxl ) );
751  if ( ! netdev ) {
752  rc = -ENOMEM;
753  goto err_alloc;
754  }
756  intelxl = netdev->priv;
757  pci_set_drvdata ( pci, netdev );
758  netdev->dev = &pci->dev;
759  memset ( intelxl, 0, sizeof ( *intelxl ) );
761  intelxl->handle = intelxlvf_admin_event;
767  sizeof ( intelxl->tx.desc.tx[0] ),
770  sizeof ( intelxl->rx.desc.rx[0] ),
772 
773  /* Fix up PCI device */
774  adjust_pci_device ( pci );
775 
776  /* Map registers */
777  intelxl->regs = pci_ioremap ( pci, pci->membase, INTELXLVF_BAR_SIZE );
778  if ( ! intelxl->regs ) {
779  rc = -ENODEV;
780  goto err_ioremap;
781  }
782 
783  /* Configure DMA */
784  intelxl->dma = &pci->dma;
785  dma_set_mask_64bit ( intelxl->dma );
786  netdev->dma = intelxl->dma;
787 
788  /* Locate PCI Express capability */
789  intelxl->exp = pci_find_capability ( pci, PCI_CAP_ID_EXP );
790  if ( ! intelxl->exp ) {
791  DBGC ( intelxl, "INTELXL %p missing PCIe capability\n",
792  intelxl );
793  rc = -ENXIO;
794  goto err_exp;
795  }
796 
797  /* Reset the function via PCIe FLR */
798  pci_reset ( pci, intelxl->exp );
799 
800  /* Enable MSI-X dummy interrupt */
801  if ( ( rc = intelxl_msix_enable ( intelxl, pci,
802  INTELXLVF_MSIX_VECTOR ) ) != 0 )
803  goto err_msix;
804 
805  /* Open admin queues */
806  if ( ( rc = intelxl_open_admin ( intelxl ) ) != 0 )
807  goto err_open_admin;
808 
809  /* Reset the function via admin queue */
810  if ( ( rc = intelxlvf_reset_admin ( intelxl ) ) != 0 )
811  goto err_reset_admin;
812 
813  /* Negotiate API version */
814  if ( ( rc = intelxlvf_admin_version ( netdev ) ) != 0 )
815  goto err_version;
816 
817  /* Get MAC address */
818  if ( ( rc = intelxlvf_admin_get_resources ( netdev ) ) != 0 )
819  goto err_get_resources;
820 
821  /* Configure number of queue pairs, if applicable */
822  if ( ( intelxl->caps & INTELXLVF_ADMIN_CAP_RQPS ) &&
823  ( ( rc = intelxlvf_admin_request_qps ( netdev ) ) != 0 ) )
824  goto err_rqps;
825 
826  /* Register network device */
827  if ( ( rc = register_netdev ( netdev ) ) != 0 )
828  goto err_register_netdev;
829 
830  return 0;
831 
833  err_register_netdev:
834  err_rqps:
835  err_get_resources:
836  err_version:
837  err_reset_admin:
838  intelxl_close_admin ( intelxl );
839  err_open_admin:
841  err_msix:
842  pci_reset ( pci, intelxl->exp );
843  err_exp:
844  iounmap ( intelxl->regs );
845  err_ioremap:
847  netdev_put ( netdev );
848  err_alloc:
849  return rc;
850 }
void * regs
Registers.
Definition: intelxl.h:921
unsigned long membase
Memory base.
Definition: pci.h:215
struct dma_device * dma
DMA device.
Definition: intelxl.h:923
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
struct dma_device dma
DMA device.
Definition: pci.h:210
int pci_find_capability(struct pci_device *pci, int cap)
Look for a PCI capability.
Definition: pciextra.c:38
#define INTELXLVF_ADMIN_CAP_RQPS
Request Queues capabilities.
Definition: intelxlvf.h:134
void(* handle)(struct net_device *netdev, struct intelxl_admin_descriptor *evt, union intelxl_admin_buffer *buf)
Handle admin event.
Definition: intelxl.h:972
#define DBGC(...)
Definition: compiler.h:505
#define INTELXLVF_VFINT_DYN_CTLN(x)
VF Interrupt N Dynamic Control Register.
Definition: intelxlvf.h:32
struct intelxl_admin command
Admin command queue.
Definition: intelxl.h:951
#define INTELXLVF_BAR_SIZE
BAR size.
Definition: intelxlvf.h:15
static __always_inline void dma_set_mask_64bit(struct dma_device *dma)
Set 64-bit addressable space mask.
Definition: dma.h:474
struct dma_device * dma
DMA device.
Definition: netdevice.h:366
int intelxl_open_admin(struct intelxl_nic *intelxl)
Open admin queues.
Definition: intelxl.c:894
#define INTELXLVF_ADMIN
VF Admin Queue register block.
Definition: intelxlvf.h:38
void pci_reset(struct pci_device *pci, unsigned int exp)
Perform PCI Express function-level reset (FLR)
Definition: pciextra.c:124
union intelxl_tx_descriptor * tx
Transmit descriptors.
Definition: intelxl.h:759
void adjust_pci_device(struct pci_device *pci)
Enable PCI device.
Definition: pci.c:154
struct device dev
Generic device.
Definition: pci.h:208
unsigned int exp
PCI Express capability offset.
Definition: intelxl.h:946
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
struct intelxl_ring rx
Receive descriptor ring.
Definition: intelxl.h:961
static void intelxl_init_admin(struct intelxl_admin *admin, unsigned int base, const struct intelxl_admin_offsets *regs)
Initialise admin queue.
Definition: intelxl.h:475
static void netdev_put(struct net_device *netdev)
Drop reference to network device.
Definition: netdevice.h:572
#define INTELXL_TX_NUM_DESC
Number of transmit descriptors.
Definition: intelxl.h:808
void * priv
Driver private data.
Definition: netdevice.h:431
static int intelxlvf_admin_get_resources(struct net_device *netdev)
Get resources.
Definition: intelxlvf.c:386
static struct net_device * netdev
Definition: gdbudp.c:52
#define INTELXL_RX_NUM_DESC
Number of receive descriptors.
Definition: intelxl.h:817
static int intelxlvf_admin_version(struct net_device *netdev)
Negotiate API version.
Definition: intelxlvf.c:347
void unregister_netdev(struct net_device *netdev)
Unregister network device.
Definition: netdevice.c:941
static void intelxlvf_admin_event(struct net_device *netdev, struct intelxl_admin_descriptor *xlevt, union intelxl_admin_buffer *xlbuf)
Handle admin event.
Definition: intelxlvf.c:287
union intelxl_ring::@65 desc
Descriptors.
uint32_t caps
Device capabilities.
Definition: intelxl.h:942
#define INTELXLVF_QTX_TAIL
Transmit Queue Tail Register.
Definition: intelxlvf.h:26
union intelxl_rx_descriptor * rx
Receive descriptors.
Definition: intelxl.h:761
int register_netdev(struct net_device *netdev)
Register network device.
Definition: netdevice.c:759
unsigned int intr
Interrupt control register.
Definition: intelxl.h:944
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
void intelxl_msix_disable(struct intelxl_nic *intelxl, struct pci_device *pci, unsigned int vector)
Disable MSI-X dummy interrupt.
Definition: intelxl.c:105
An Intel 40 Gigabit network card.
Definition: intelxl.h:919
static const struct intelxl_admin_offsets intelxlvf_admin_event_offsets
Admin event queue register offsets.
Definition: intelxlvf.c:174
struct intelxl_ring tx
Transmit descriptor ring.
Definition: intelxl.h:959
#define PCI_CAP_ID_EXP
PCI Express.
Definition: pci.h:97
struct device * dev
Underlying hardware device.
Definition: netdevice.h:364
static struct net_device_operations intelxlvf_operations
Network device operations.
Definition: intelxlvf.c:724
#define INTELXLVF_MSIX_VECTOR
MSI-X vector.
Definition: intelxlvf.h:23
#define ENXIO
No such device or address.
Definition: errno.h:599
static int intelxlvf_admin_request_qps(struct net_device *netdev)
Configure number of queue pairs.
Definition: intelxlvf.c:472
struct net_device * alloc_etherdev(size_t priv_size)
Allocate Ethernet device.
Definition: ethernet.c:264
static const struct intelxl_admin_offsets intelxlvf_admin_command_offsets
Admin command queue register offsets.
Definition: intelxlvf.c:165
static void intelxlvf_init_ring(struct intelxl_ring *ring, unsigned int count, size_t len, unsigned int tail)
Initialise descriptor ring.
Definition: intelxlvf.h:414
void iounmap(volatile const void *io_addr)
Unmap I/O address.
void intelxl_close_admin(struct intelxl_nic *intelxl)
Close admin queues.
Definition: intelxl.c:946
void * pci_ioremap(struct pci_device *pci, unsigned long bus_addr, size_t len)
Map PCI bus address as an I/O address.
struct intelxl_admin event
Admin event queue.
Definition: intelxl.h:953
static int intelxlvf_reset_admin(struct intelxl_nic *intelxl)
Reset hardware via admin queue.
Definition: intelxlvf.c:137
void * memset(void *dest, int character, size_t len) __nonnull
int intelxl_msix_enable(struct intelxl_nic *intelxl, struct pci_device *pci, unsigned int vector)
Enable MSI-X dummy interrupt.
Definition: intelxl.c:62
#define INTELXLVF_QRX_TAIL
Receive Queue Tail Register.
Definition: intelxlvf.h:29

References adjust_pci_device(), alloc_etherdev(), intelxl_nic::caps, intelxl_nic::command, DBGC, intelxl_ring::desc, pci_device::dev, net_device::dev, pci_device::dma, net_device::dma, intelxl_nic::dma, dma_set_mask_64bit(), ENODEV, ENOMEM, ENXIO, intelxl_nic::event, intelxl_nic::exp, intelxl_nic::handle, intelxl_close_admin(), intelxl_init_admin(), intelxl_msix_disable(), intelxl_msix_enable(), intelxl_open_admin(), INTELXL_RX_NUM_DESC, INTELXL_TX_NUM_DESC, INTELXLVF_ADMIN, INTELXLVF_ADMIN_CAP_RQPS, intelxlvf_admin_command_offsets, intelxlvf_admin_event(), intelxlvf_admin_event_offsets, intelxlvf_admin_get_resources(), intelxlvf_admin_request_qps(), intelxlvf_admin_version(), INTELXLVF_BAR_SIZE, intelxlvf_init_ring(), INTELXLVF_MSIX_VECTOR, intelxlvf_operations, INTELXLVF_QRX_TAIL, INTELXLVF_QTX_TAIL, intelxlvf_reset_admin(), INTELXLVF_VFINT_DYN_CTLN, intelxl_nic::intr, iounmap(), pci_device::membase, memset(), netdev, netdev_init(), netdev_nullify(), netdev_put(), PCI_CAP_ID_EXP, pci_find_capability(), pci_ioremap(), pci_reset(), pci_set_drvdata(), net_device::priv, rc, register_netdev(), intelxl_nic::regs, intelxl_ring::rx, intelxl_nic::rx, intelxl_ring::tx, intelxl_nic::tx, and unregister_netdev().

◆ intelxlvf_remove()

static void intelxlvf_remove ( struct pci_device pci)
static

Remove PCI device.

Parameters
pciPCI device

Definition at line 857 of file intelxlvf.c.

857  {
858  struct net_device *netdev = pci_get_drvdata ( pci );
859  struct intelxl_nic *intelxl = netdev->priv;
860 
861  /* Unregister network device */
863 
864  /* Reset the function via admin queue */
865  intelxlvf_reset_admin ( intelxl );
866 
867  /* Close admin queues */
868  intelxl_close_admin ( intelxl );
869 
870  /* Disable MSI-X dummy interrupt */
872 
873  /* Reset the function via PCIe FLR */
874  pci_reset ( pci, intelxl->exp );
875 
876  /* Free network device */
877  iounmap ( intelxl->regs );
879  netdev_put ( netdev );
880 }
void * regs
Registers.
Definition: intelxl.h:921
void pci_reset(struct pci_device *pci, unsigned int exp)
Perform PCI Express function-level reset (FLR)
Definition: pciextra.c:124
unsigned int exp
PCI Express capability offset.
Definition: intelxl.h:946
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
void intelxl_msix_disable(struct intelxl_nic *intelxl, struct pci_device *pci, unsigned int vector)
Disable MSI-X dummy interrupt.
Definition: intelxl.c:105
An Intel 40 Gigabit network card.
Definition: intelxl.h:919
static void * pci_get_drvdata(struct pci_device *pci)
Get PCI driver-private data.
Definition: pci.h:369
#define INTELXLVF_MSIX_VECTOR
MSI-X vector.
Definition: intelxlvf.h:23
void iounmap(volatile const void *io_addr)
Unmap I/O address.
void intelxl_close_admin(struct intelxl_nic *intelxl)
Close admin queues.
Definition: intelxl.c:946
static int intelxlvf_reset_admin(struct intelxl_nic *intelxl)
Reset hardware via admin queue.
Definition: intelxlvf.c:137

References intelxl_nic::exp, intelxl_close_admin(), intelxl_msix_disable(), INTELXLVF_MSIX_VECTOR, intelxlvf_reset_admin(), iounmap(), netdev, netdev_nullify(), netdev_put(), pci_get_drvdata(), pci_reset(), net_device::priv, intelxl_nic::regs, and unregister_netdev().

Variable Documentation

◆ intelxlvf_admin_command_offsets

const struct intelxl_admin_offsets intelxlvf_admin_command_offsets
static
Initial value:
= {
}
#define INTELXLVF_ADMIN_CMD_HEAD
Admin Command Queue Head Register (offset)
Definition: intelxlvf.h:50
#define INTELXLVF_ADMIN_CMD_TAIL
Admin Command Queue Tail Register (offset)
Definition: intelxlvf.h:53
#define INTELXLVF_ADMIN_CMD_LEN
Admin Command Queue Length Register (offset)
Definition: intelxlvf.h:47
#define INTELXLVF_ADMIN_CMD_BAL
Admin Command Queue Base Address Low Register (offset)
Definition: intelxlvf.h:41
#define INTELXLVF_ADMIN_CMD_BAH
Admin Command Queue Base Address High Register (offset)
Definition: intelxlvf.h:44

Admin command queue register offsets.

Definition at line 165 of file intelxlvf.c.

Referenced by intelxlvf_probe().

◆ intelxlvf_admin_event_offsets

const struct intelxl_admin_offsets intelxlvf_admin_event_offsets
static
Initial value:
= {
}
#define INTELXLVF_ADMIN_EVT_LEN
Admin Event Queue Length Register (offset)
Definition: intelxlvf.h:62
#define INTELXLVF_ADMIN_EVT_HEAD
Admin Event Queue Head Register (offset)
Definition: intelxlvf.h:65
#define INTELXLVF_ADMIN_EVT_BAH
Admin Event Queue Base Address High Register (offset)
Definition: intelxlvf.h:59
#define INTELXLVF_ADMIN_EVT_BAL
Admin Event Queue Base Address Low Register (offset)
Definition: intelxlvf.h:56
#define INTELXLVF_ADMIN_EVT_TAIL
Admin Event Queue Tail Register (offset)
Definition: intelxlvf.h:68

Admin event queue register offsets.

Definition at line 174 of file intelxlvf.c.

Referenced by intelxlvf_probe().

◆ intelxlvf_operations

struct net_device_operations intelxlvf_operations
static
Initial value:
= {
.open = intelxlvf_open,
.close = intelxlvf_close,
.transmit = intelxl_transmit,
.poll = intelxl_poll,
}
int intelxl_transmit(struct net_device *netdev, struct io_buffer *iobuf)
Transmit packet.
Definition: intelxl.c:1510
static void intelxlvf_close(struct net_device *netdev)
Close network device.
Definition: intelxlvf.c:699
static int intelxlvf_open(struct net_device *netdev)
Open network device.
Definition: intelxlvf.c:644
void intelxl_poll(struct net_device *netdev)
Poll for completed and received packets.
Definition: intelxl.c:1630

Network device operations.

Definition at line 724 of file intelxlvf.c.

Referenced by intelxlvf_probe().

◆ intelxlvf_nics

struct pci_device_id intelxlvf_nics[]
static
Initial value:
= {
PCI_ROM ( 0x8086, 0x154c, "xl710-vf", "XL710 VF", 0 ),
PCI_ROM ( 0x8086, 0x1571, "xl710-vf-hv", "XL710 VF (Hyper-V)", 0 ),
PCI_ROM ( 0x8086, 0x1889, "iavf", "Intel adaptive VF", 0 ),
PCI_ROM ( 0x8086, 0x37cd, "x722-vf", "X722 VF", 0 ),
PCI_ROM ( 0x8086, 0x37d9, "x722-vf-hv", "X722 VF (Hyper-V)", 0 ),
}
#define PCI_ROM(_vendor, _device, _name, _description, _data)
Definition: pci.h:303

PCI device IDs.

Definition at line 883 of file intelxlvf.c.

◆ __pci_driver

struct pci_driver intelxlvf_driver __pci_driver
Initial value:
= {
.id_count = ( sizeof ( intelxlvf_nics ) /
sizeof ( intelxlvf_nics[0] ) ),
.probe = intelxlvf_probe,
}
static int intelxlvf_probe(struct pci_device *pci)
Probe PCI device.
Definition: intelxlvf.c:744
static struct xen_remove_from_physmap * remove
Definition: xenmem.h:39
static struct pci_device_id intelxlvf_nics[]
PCI device IDs.
Definition: intelxlvf.c:883
static void intelxlvf_remove(struct pci_device *pci)
Remove PCI device.
Definition: intelxlvf.c:857

PCI driver.

Definition at line 892 of file intelxlvf.c.