iPXE
intelxvf.c File Reference

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

#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <ipxe/io.h>
#include <ipxe/pci.h>
#include <ipxe/netdevice.h>
#include <ipxe/ethernet.h>
#include "intelx.h"
#include "intelxvf.h"

Go to the source code of this file.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 FILE_SECBOOT (PERMITTED)
static void intelxvf_stats (struct intel_nic *intel)
 Dump statistics.
static void intelxvf_reset (struct intel_nic *intel)
 Reset hardware.
static void intelxvf_check_link (struct net_device *netdev)
 Check link state.
static int intelxvf_mbox_version (struct intel_nic *intel, unsigned int version)
 Send negotiate API version message.
static int intelxvf_mbox_queues (struct intel_nic *intel, int *vlan_thing)
 Get queue configuration.
static int intelxvf_open (struct net_device *netdev)
 Open network device.
static void intelxvf_close (struct net_device *netdev)
 Close network device.
static void intelxvf_poll (struct net_device *netdev)
 Poll for completed and received packets.
static void intelxvf_irq (struct net_device *netdev, int enable)
 Enable or disable interrupts.
static int intelxvf_probe (struct pci_device *pci)
 Probe PCI device.
static void intelxvf_remove (struct pci_device *pci)
 Remove PCI device.

Variables

static struct net_device_operations intelxvf_operations
 Network device operations.
static struct pci_device_id intelxvf_nics []
 PCI device IDs.
struct pci_driver intelxvf_driver __pci_driver
 PCI driver.

Detailed Description

Intel 10 Gigabit Ethernet virtual function network card driver.

Definition in file intelxvf.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )

◆ FILE_SECBOOT()

FILE_SECBOOT ( PERMITTED )

References unused.

◆ intelxvf_stats()

void intelxvf_stats ( struct intel_nic * intel)
static

Dump statistics.

Parameters
intelIntel device

Definition at line 56 of file intelxvf.c.

56 {
57
58 DBGC ( intel, "INTEL %p TX %d (%#x%08x) RX %d (%#x%08x) multi %d\n",
59 intel, readl ( intel->regs + INTELXVF_GPTC ),
60 readl ( intel->regs + INTELXVF_GOTCH ),
61 readl ( intel->regs + INTELXVF_GOTCL ),
62 readl ( intel->regs + INTELXVF_GPRC ),
63 readl ( intel->regs + INTELXVF_GORCH ),
64 readl ( intel->regs + INTELXVF_GORCL ),
65 readl ( intel->regs + INTELXVF_MPRC ) );
66}
#define DBGC(...)
Definition compiler.h:505
#define INTELXVF_GOTCH
Good Packets Transmitted Count High.
Definition intelxvf.h:104
#define INTELXVF_MPRC
Definition intelxvf.h:92
#define INTELXVF_GORCL
Good Packets Received Count Low.
Definition intelxvf.h:86
#define INTELXVF_GORCH
Good Packets Received Count High.
Definition intelxvf.h:89
#define INTELXVF_GOTCL
Good Packets Transmitted Count Low.
Definition intelxvf.h:101
#define INTELXVF_GPTC
Good Packets Transmitted Count.
Definition intelxvf.h:98
#define INTELXVF_GPRC
Good Packets Received Count.
Definition intelxvf.h:83
void * regs
Registers.
Definition intel.h:291
#define readl
Definition w89c840.c:157

References DBGC, INTELXVF_GORCH, INTELXVF_GORCL, INTELXVF_GOTCH, INTELXVF_GOTCL, INTELXVF_GPRC, INTELXVF_GPTC, INTELXVF_MPRC, readl, and intel_nic::regs.

◆ intelxvf_reset()

void intelxvf_reset ( struct intel_nic * intel)
static

Reset hardware.

Parameters
intelIntel device

Definition at line 80 of file intelxvf.c.

80 {
81
82 /* Perform a function-level reset */
84}
#define INTELXVF_CTRL
Control Register.
Definition intelxvf.h:16
#define INTELXVF_CTRL_RST
Function-level reset.
Definition intelxvf.h:17
#define writel
Definition w89c840.c:160

References INTELXVF_CTRL, INTELXVF_CTRL_RST, intel_nic::regs, and writel.

Referenced by intelxvf_close(), intelxvf_open(), intelxvf_probe(), and intelxvf_remove().

◆ intelxvf_check_link()

void intelxvf_check_link ( struct net_device * netdev)
static

Check link state.

Parameters
netdevNetwork device

Definition at line 98 of file intelxvf.c.

98 {
99 struct intel_nic *intel = netdev->priv;
100 uint32_t links;
101
102 /* Read link status */
103 links = readl ( intel->regs + INTELXVF_LINKS );
104 DBGC ( intel, "INTEL %p link status is %08x\n", intel, links );
105
106 /* Update network device */
107 if ( links & INTELXVF_LINKS_UP ) {
109 } else {
111 }
112}
unsigned int uint32_t
Definition stdint.h:12
static struct net_device * netdev
Definition gdbudp.c:53
#define INTELXVF_LINKS_UP
Link up.
Definition intelxvf.h:21
#define INTELXVF_LINKS
Link Status Register.
Definition intelxvf.h:20
void netdev_link_down(struct net_device *netdev)
Mark network device as having link down.
Definition netdevice.c:231
static void netdev_link_up(struct net_device *netdev)
Mark network device as having link up.
Definition netdevice.h:789
An Intel network card.
Definition intel.h:289

References DBGC, INTELXVF_LINKS, INTELXVF_LINKS_UP, netdev, netdev_link_down(), netdev_link_up(), readl, and intel_nic::regs.

Referenced by intelxvf_open(), intelxvf_poll(), and intelxvf_probe().

◆ intelxvf_mbox_version()

int intelxvf_mbox_version ( struct intel_nic * intel,
unsigned int version )
static

Send negotiate API version message.

Parameters
intelIntel device
versionRequested version
Return values
rcReturn status code

Definition at line 128 of file intelxvf.c.

129 {
130 union intelvf_msg msg;
131 int rc;
132
133 /* Send set MTU message */
134 memset ( &msg, 0, sizeof ( msg ) );
136 msg.version.version = version;
137 if ( ( rc = intelvf_mbox_msg ( intel, &msg ) ) != 0 ) {
138 DBGC ( intel, "INTEL %p negotiate API version failed: %s\n",
139 intel, strerror ( rc ) );
140 return rc;
141 }
142
143 /* Check response */
145 DBGC ( intel, "INTEL %p negotiate API version unexpected "
146 "response:\n", intel );
147 DBGC_HDA ( intel, 0, &msg, sizeof ( msg ) );
148 return -EPROTO;
149 }
150
151 /* Check that this version is supported */
152 if ( ! ( msg.hdr & INTELVF_MSG_ACK ) ) {
153 DBGC ( intel, "INTEL %p negotiate API version failed\n",
154 intel );
155 return -EPERM;
156 }
157
158 return 0;
159}
struct arbelprm_rc_send_wqe rc
Definition arbel.h:3
u32 version
Driver version.
Definition ath9k_hw.c:1985
#define DBGC_HDA(...)
Definition compiler.h:506
#define EPROTO
Protocol error.
Definition errno.h:625
#define EPERM
Operation not permitted.
Definition errno.h:615
void * memset(void *dest, int character, size_t len) __nonnull
int intelvf_mbox_msg(struct intel_nic *intel, union intelvf_msg *msg)
Send/receive mailbox message.
Definition intelvf.c:152
#define INTELVF_MSG_ACK
Message ACK flag.
Definition intelvf.h:54
#define INTELVF_MSG_TYPE_MASK
Message type mask.
Definition intelvf.h:48
#define INTELXVF_MSG_TYPE_VERSION
Negotiate API version mailbox message.
Definition intelxvf.h:107
void msg(unsigned int row, const char *fmt,...)
Print message centred on specified row.
Definition message.c:62
char * strerror(int errno)
Retrieve string representation of error number.
Definition strerror.c:79
Mailbox message.
Definition intelvf.h:130

References DBGC, DBGC_HDA, EPERM, EPROTO, intelvf_mbox_msg(), INTELVF_MSG_ACK, INTELVF_MSG_TYPE_MASK, INTELXVF_MSG_TYPE_VERSION, memset(), msg(), rc, strerror(), and version.

Referenced by intelxvf_open().

◆ intelxvf_mbox_queues()

int intelxvf_mbox_queues ( struct intel_nic * intel,
int * vlan_thing )
static

Get queue configuration.

Parameters
intelIntel device
vlan_thingVLAN hand-waving thing to fill in
Return values
rcReturn status code

Definition at line 168 of file intelxvf.c.

168 {
169 union intelvf_msg msg;
170 int rc;
171
172 /* Send queue configuration message */
173 memset ( &msg, 0, sizeof ( msg ) );
175 if ( ( rc = intelvf_mbox_msg ( intel, &msg ) ) != 0 ) {
176 DBGC ( intel, "INTEL %p get queue configuration failed: %s\n",
177 intel, strerror ( rc ) );
178 return rc;
179 }
180
181 /* Check response */
183 DBGC ( intel, "INTEL %p get queue configuration unexpected "
184 "response:\n", intel );
185 DBGC_HDA ( intel, 0, &msg, sizeof ( msg ) );
186 return -EPROTO;
187 }
188
189 /* Check that we were allowed to get the queue configuration */
190 if ( ! ( msg.hdr & INTELVF_MSG_ACK ) ) {
191 DBGC ( intel, "INTEL %p get queue configuration refused\n",
192 intel );
193 return -EPERM;
194 }
195
196 /* Extract VLAN hand-waving thing */
197 *vlan_thing = msg.queues.vlan_thing;
198
199 return 0;
200}
#define INTELVF_MSG_TYPE_GET_QUEUES
Get queue configuration message.
Definition intelvf.h:42

References DBGC, DBGC_HDA, EPERM, EPROTO, intelvf_mbox_msg(), INTELVF_MSG_ACK, INTELVF_MSG_TYPE_GET_QUEUES, INTELVF_MSG_TYPE_MASK, memset(), msg(), rc, and strerror().

Referenced by intelxvf_open().

◆ intelxvf_open()

int intelxvf_open ( struct net_device * netdev)
static

Open network device.

Parameters
netdevNetwork device
Return values
rcReturn status code

Definition at line 215 of file intelxvf.c.

215 {
216 struct intel_nic *intel = netdev->priv;
217 uint32_t rxdctl;
218 uint32_t srrctl;
219 uint32_t dca_rxctrl;
220 unsigned int i;
221 int vlan_thing;
222 int rc;
223
224 /* Reset the function */
225 intelxvf_reset ( intel );
226
227 /* Notify PF that reset is complete */
228 if ( ( rc = intelvf_mbox_reset ( intel, NULL ) ) != 0 ) {
229 DBGC ( intel, "INTEL %p could not reset: %s\n",
230 intel, strerror ( rc ) );
231 goto err_mbox_reset;
232 }
233
234 /* Negotiate API version 1.1. If we do not negotiate at least
235 * this version, then the RX datapath will remain disabled if
236 * the PF has jumbo frames enabled.
237 *
238 * Ignore failures, since the host may not actually support
239 * v1.1.
240 */
242
243 /* Set MAC address */
244 if ( ( rc = intelvf_mbox_set_mac ( intel, netdev->ll_addr ) ) != 0 ) {
245 DBGC ( intel, "INTEL %p could not set MAC address: %s\n",
246 intel, strerror ( rc ) );
247 goto err_mbox_set_mac;
248 }
249
250 /* Set MTU */
251 if ( ( rc = intelvf_mbox_set_mtu ( intel, netdev->max_pkt_len ) ) != 0){
252 DBGC ( intel, "INTEL %p could not set MTU %zd: %s\n",
253 intel, netdev->max_pkt_len, strerror ( rc ) );
254 goto err_mbox_set_mtu;
255 }
256
257 /* Reset all descriptor rings */
258 for ( i = 0 ; i < INTELXVF_NUM_RINGS ; i++ ) {
259 intel_reset_ring ( intel, INTELXVF_TD ( i ) );
260 intel_reset_ring ( intel, INTELXVF_RD ( i ) );
261 }
262
263 /* Reset packet split receive type register */
264 writel ( 0, intel->regs + INTELXVF_PSRTYPE );
265
266 /* Get queue configuration. Ignore failures, since the host
267 * may not support this message.
268 */
269 vlan_thing = 0;
270 intelxvf_mbox_queues ( intel, &vlan_thing );
271 if ( vlan_thing ) {
272 DBGC ( intel, "INTEL %p stripping VLAN tags (thing=%d)\n",
273 intel, vlan_thing );
274 rxdctl = readl ( intel->regs + INTELXVF_RD(0) + INTEL_xDCTL );
275 rxdctl |= INTELX_RXDCTL_VME;
276 writel ( rxdctl, intel->regs + INTELXVF_RD(0) + INTEL_xDCTL );
277 }
278
279 /* Create transmit descriptor ring */
280 if ( ( rc = intel_create_ring ( intel, &intel->tx ) ) != 0 )
281 goto err_create_tx;
282
283 /* Create receive descriptor ring */
284 if ( ( rc = intel_create_ring ( intel, &intel->rx ) ) != 0 )
285 goto err_create_rx;
286
287 /* Allocate interrupt vectors */
290 intel->regs + INTELXVF_IVAR );
292 intel->regs + INTELXVF_IVARM );
293
294 /* Configure receive buffer sizes and set receive descriptor type */
295 srrctl = readl ( intel->regs + INTELXVF_SRRCTL );
296 srrctl &= ~( INTELXVF_SRRCTL_BSIZE_MASK |
303 writel ( srrctl, intel->regs + INTELXVF_SRRCTL );
304
305 /* Clear "must-be-zero" bit for direct cache access (DCA). We
306 * leave DCA disabled anyway, but if we do not clear this bit
307 * then the received packets contain garbage data.
308 */
309 dca_rxctrl = readl ( intel->regs + INTELXVF_DCA_RXCTRL );
311 writel ( dca_rxctrl, intel->regs + INTELXVF_DCA_RXCTRL );
312
313 /* Fill receive ring */
314 intel_refill_rx ( intel );
315
316 /* Update link state */
318
319 return 0;
320
321 intel_destroy_ring ( intel, &intel->rx );
322 err_create_rx:
323 intel_destroy_ring ( intel, &intel->tx );
324 err_create_tx:
325 err_mbox_set_mtu:
326 err_mbox_set_mac:
327 err_mbox_reset:
328 intelxvf_reset ( intel );
329 return rc;
330}
#define NULL
NULL pointer (VOID *)
Definition Base.h:322
int intel_create_ring(struct intel_nic *intel, struct intel_ring *ring)
Create descriptor ring.
Definition intel.c:512
void intel_destroy_ring(struct intel_nic *intel, struct intel_ring *ring)
Destroy descriptor ring.
Definition intel.c:564
void intel_reset_ring(struct intel_nic *intel, unsigned int reg)
Reset descriptor ring.
Definition intel.c:488
void intel_refill_rx(struct intel_nic *intel)
Refill receive descriptor ring.
Definition intel.c:581
#define INTEL_xDCTL
Receive/Transmit Descriptor Control (offset)
Definition intel.h:195
int intelvf_mbox_set_mac(struct intel_nic *intel, const uint8_t *ll_addr)
Send set MAC address message.
Definition intelvf.c:276
int intelvf_mbox_reset(struct intel_nic *intel, uint8_t *hw_addr)
Send reset message and get initial MAC address.
Definition intelvf.c:233
int intelvf_mbox_set_mtu(struct intel_nic *intel, size_t mtu)
Send set MTU message.
Definition intelvf.c:314
#define INTELX_RXDCTL_VME
Receive Descriptor Control Register.
Definition intelx.h:76
static int intelxvf_mbox_queues(struct intel_nic *intel, int *vlan_thing)
Get queue configuration.
Definition intelxvf.c:168
static void intelxvf_check_link(struct net_device *netdev)
Check link state.
Definition intelxvf.c:98
static int intelxvf_mbox_version(struct intel_nic *intel, unsigned int version)
Send negotiate API version message.
Definition intelxvf.c:128
static void intelxvf_reset(struct intel_nic *intel)
Reset hardware.
Definition intelxvf.c:80
#define INTELXVF_SRRCTL_BHDRSIZE_DEFAULT
Definition intelxvf.h:75
#define INTELXVF_TD(n)
Transmit Descriptor register block.
Definition intelxvf.h:95
#define INTELXVF_IVARM_MBOX_DEFAULT
Definition intelxvf.h:49
#define INTELXVF_SRRCTL_DESCTYPE_DEFAULT
Definition intelxvf.h:78
#define INTELXVF_PSRTYPE
Packet Split Receive Type.
Definition intelxvf.h:60
#define INTELXVF_IVAR
Interrupt Vector Allocation Register.
Definition intelxvf.h:36
#define INTELXVF_IVAR_RX0_VALID
RX queue 0 valid.
Definition intelxvf.h:40
#define INTELXVF_MSG_VERSION_1_1
API version 1.1.
Definition intelxvf.h:110
#define INTELXVF_DCA_RXCTRL
RX DCA Control Register.
Definition intelxvf.h:66
#define INTELXVF_SRRCTL_DROP_EN
Definition intelxvf.h:80
#define INTELXVF_NUM_RINGS
Number of queues.
Definition intelxvf.h:113
#define INTELXVF_IVAR_RX0_DEFAULT
Definition intelxvf.h:38
#define INTELXVF_SRRCTL
Split Receive Control Register.
Definition intelxvf.h:70
#define INTELXVF_RD(n)
Receive Descriptor register block.
Definition intelxvf.h:63
#define INTELXVF_SRRCTL_BSIZE_DEFAULT
Definition intelxvf.h:72
#define INTELXVF_DCA_RXCTRL_MUST_BE_ZERO
Must be zero.
Definition intelxvf.h:67
#define INTELXVF_SRRCTL_BSIZE_MASK
Definition intelxvf.h:73
#define INTELXVF_SRRCTL_BHDRSIZE_MASK
Definition intelxvf.h:76
#define INTELXVF_SRRCTL_DESCTYPE_MASK
Definition intelxvf.h:79
#define INTELXVF_IVARM
Interrupt Vector Allocation Miscellaneous Register.
Definition intelxvf.h:47
#define INTELXVF_IVARM_MBOX_VALID
Mailbox valid.
Definition intelxvf.h:51
#define INTELXVF_IVAR_TX0_VALID
TX queue 0 valid.
Definition intelxvf.h:44
#define INTELXVF_IVAR_TX0_DEFAULT
Definition intelxvf.h:42
struct intel_ring tx
Transmit descriptor ring.
Definition intel.h:312
struct intel_ring rx
Receive descriptor ring.
Definition intel.h:314

References DBGC, intel_create_ring(), intel_destroy_ring(), intel_refill_rx(), intel_reset_ring(), INTEL_xDCTL, intelvf_mbox_reset(), intelvf_mbox_set_mac(), intelvf_mbox_set_mtu(), INTELX_RXDCTL_VME, intelxvf_check_link(), INTELXVF_DCA_RXCTRL, INTELXVF_DCA_RXCTRL_MUST_BE_ZERO, INTELXVF_IVAR, INTELXVF_IVAR_RX0_DEFAULT, INTELXVF_IVAR_RX0_VALID, INTELXVF_IVAR_TX0_DEFAULT, INTELXVF_IVAR_TX0_VALID, INTELXVF_IVARM, INTELXVF_IVARM_MBOX_DEFAULT, INTELXVF_IVARM_MBOX_VALID, intelxvf_mbox_queues(), intelxvf_mbox_version(), INTELXVF_MSG_VERSION_1_1, INTELXVF_NUM_RINGS, INTELXVF_PSRTYPE, INTELXVF_RD, intelxvf_reset(), INTELXVF_SRRCTL, INTELXVF_SRRCTL_BHDRSIZE_DEFAULT, INTELXVF_SRRCTL_BHDRSIZE_MASK, INTELXVF_SRRCTL_BSIZE_DEFAULT, INTELXVF_SRRCTL_BSIZE_MASK, INTELXVF_SRRCTL_DESCTYPE_DEFAULT, INTELXVF_SRRCTL_DESCTYPE_MASK, INTELXVF_SRRCTL_DROP_EN, INTELXVF_TD, netdev, NULL, rc, readl, intel_nic::regs, intel_nic::rx, strerror(), intel_nic::tx, and writel.

◆ intelxvf_close()

void intelxvf_close ( struct net_device * netdev)
static

Close network device.

Parameters
netdevNetwork device

Definition at line 337 of file intelxvf.c.

337 {
338 struct intel_nic *intel = netdev->priv;
339
340 /* Destroy receive descriptor ring */
341 intel_destroy_ring ( intel, &intel->rx );
342
343 /* Discard any unused receive buffers */
344 intel_empty_rx ( intel );
345
346 /* Destroy transmit descriptor ring */
347 intel_destroy_ring ( intel, &intel->tx );
348
349 /* Reset the function */
350 intelxvf_reset ( intel );
351}
void intel_empty_rx(struct intel_nic *intel)
Discard unused receive I/O buffers.
Definition intel.c:631

References intel_destroy_ring(), intel_empty_rx(), intelxvf_reset(), netdev, intel_nic::rx, and intel_nic::tx.

◆ intelxvf_poll()

void intelxvf_poll ( struct net_device * netdev)
static

Poll for completed and received packets.

Parameters
netdevNetwork device

Definition at line 358 of file intelxvf.c.

358 {
359 struct intel_nic *intel = netdev->priv;
360 uint32_t eicr;
361 int rc;
362
363 /* Check for and acknowledge interrupts */
364 eicr = readl ( intel->regs + INTELXVF_EICR );
365 if ( ! eicr )
366 return;
367
368 /* Poll for TX completions, if applicable */
369 if ( eicr & INTELXVF_EIRQ_TX0 )
371
372 /* Poll for RX completions, if applicable */
373 if ( eicr & INTELXVF_EIRQ_RX0 )
375
376 /* Poll for mailbox messages, if applicable */
377 if ( eicr & INTELXVF_EIRQ_MBOX ) {
378
379 /* Poll mailbox */
380 if ( ( rc = intelvf_mbox_poll ( intel ) ) != 0 ) {
381 DBGC ( intel, "INTEL %p mailbox poll failed!\n",
382 intel );
384 }
385
386 /* Update link state */
388 }
389
390 /* Refill RX ring */
391 intel_refill_rx ( intel );
392}
void intel_poll_rx(struct net_device *netdev)
Poll for received packets.
Definition intel.c:821
void intel_poll_tx(struct net_device *netdev)
Poll for completed packets.
Definition intel.c:792
int intelvf_mbox_poll(struct intel_nic *intel)
Poll mailbox.
Definition intelvf.c:99
#define INTELXVF_EICR
Extended Interrupt Cause Read Register.
Definition intelxvf.h:24
#define INTELXVF_EIRQ_TX0
TX queue 0 (via IVAR)
Definition intelxvf.h:26
#define INTELXVF_EIRQ_RX0
RX queue 0 (via IVAR)
Definition intelxvf.h:25
#define INTELXVF_EIRQ_MBOX
Mailbox (via IVARM)
Definition intelxvf.h:27
void netdev_rx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard received packet.
Definition netdevice.c:587

References DBGC, intel_poll_rx(), intel_poll_tx(), intel_refill_rx(), intelvf_mbox_poll(), intelxvf_check_link(), INTELXVF_EICR, INTELXVF_EIRQ_MBOX, INTELXVF_EIRQ_RX0, INTELXVF_EIRQ_TX0, netdev, netdev_rx_err(), NULL, rc, readl, and intel_nic::regs.

◆ intelxvf_irq()

void intelxvf_irq ( struct net_device * netdev,
int enable )
static

Enable or disable interrupts.

Parameters
netdevNetwork device
enableInterrupts should be enabled

Definition at line 400 of file intelxvf.c.

400 {
401 struct intel_nic *intel = netdev->priv;
402 uint32_t mask;
403
405 if ( enable ) {
406 writel ( mask, intel->regs + INTELXVF_EIMS );
407 } else {
408 writel ( mask, intel->regs + INTELXVF_EIMC );
409 }
410}
#define INTELXVF_EIMS
Extended Interrupt Mask Set/Read Register.
Definition intelxvf.h:30
#define INTELXVF_EIMC
Extended Interrupt Mask Clear Register.
Definition intelxvf.h:33

References INTELXVF_EIMC, INTELXVF_EIMS, INTELXVF_EIRQ_MBOX, INTELXVF_EIRQ_RX0, INTELXVF_EIRQ_TX0, netdev, intel_nic::regs, and writel.

◆ intelxvf_probe()

int intelxvf_probe ( struct pci_device * pci)
static

Probe PCI device.

Parameters
pciPCI device
Return values
rcReturn status code

Definition at line 434 of file intelxvf.c.

434 {
435 struct net_device *netdev;
436 struct intel_nic *intel;
437 int rc;
438
439 /* Allocate and initialise net device */
440 netdev = alloc_etherdev ( sizeof ( *intel ) );
441 if ( ! netdev ) {
442 rc = -ENOMEM;
443 goto err_alloc;
444 }
446 intel = netdev->priv;
447 pci_set_drvdata ( pci, netdev );
448 netdev->dev = &pci->dev;
449 memset ( intel, 0, sizeof ( *intel ) );
455
456 /* Fix up PCI device */
457 adjust_pci_device ( pci );
458
459 /* Map registers */
460 intel->regs = pci_ioremap ( pci, pci->membase, INTELVF_BAR_SIZE );
461 if ( ! intel->regs ) {
462 rc = -ENODEV;
463 goto err_ioremap;
464 }
465
466 /* Configure DMA */
467 intel->dma = &pci->dma;
468 dma_set_mask_64bit ( intel->dma );
469 netdev->dma = intel->dma;
470
471 /* Reset the function */
472 intelxvf_reset ( intel );
473
474 /* Send reset message and fetch MAC address */
475 if ( ( rc = intelvf_mbox_reset ( intel, netdev->hw_addr ) ) != 0 ) {
476 DBGC ( intel, "INTEL %p could not reset and fetch MAC: %s\n",
477 intel, strerror ( rc ) );
478 goto err_mbox_reset;
479 }
480
481 /* Reset the function (since we will not respond to Control
482 * ("ping") mailbox messages until the network device is opened.
483 */
484 intelxvf_reset ( intel );
485
486 /* Register network device */
487 if ( ( rc = register_netdev ( netdev ) ) != 0 )
488 goto err_register_netdev;
489
490 /* Set initial link state */
492
493 return 0;
494
496 err_register_netdev:
497 err_mbox_reset:
498 intelxvf_reset ( intel );
499 iounmap ( intel->regs );
500 err_ioremap:
502 netdev_put ( netdev );
503 err_alloc:
504 return rc;
505}
struct net_device * alloc_etherdev(size_t priv_size)
Allocate Ethernet device.
Definition ethernet.c:265
#define ENOMEM
Not enough space.
Definition errno.h:535
#define ENODEV
No such device.
Definition errno.h:510
void iounmap(volatile const void *io_addr)
Unmap I/O address.
void * pci_ioremap(struct pci_device *pci, unsigned long bus_addr, size_t len)
Map PCI bus address as an I/O address.
void intel_describe_rx(struct intel_descriptor *rx, physaddr_t addr, size_t len __unused)
Populate receive descriptor.
Definition intel.c:434
void intel_describe_tx_adv(struct intel_descriptor *tx, physaddr_t addr, size_t len)
Populate advanced transmit descriptor.
Definition intel.c:415
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 intel_init_mbox(struct intel_mailbox *mbox, unsigned int ctrl, unsigned int mem)
Initialise mailbox.
Definition intel.h:281
#define INTEL_NUM_TX_DESC
Number of transmit descriptors.
Definition intel.h:174
#define INTEL_NUM_RX_DESC
Number of receive descriptors.
Definition intel.h:154
#define INTELVF_BAR_SIZE
Intel VF BAR size.
Definition intelvf.h:16
static struct net_device_operations intelxvf_operations
Network device operations.
Definition intelxvf.c:413
#define INTELXVF_MBMEM
Mailbox Memory Register Base.
Definition intelxvf.h:54
#define INTELXVF_MBCTRL
Mailbox Control Register.
Definition intelxvf.h:57
static __always_inline void dma_set_mask_64bit(struct dma_device *dma)
Set 64-bit addressable space mask.
Definition dma.h:467
void unregister_netdev(struct net_device *netdev)
Unregister network device.
Definition netdevice.c:942
int register_netdev(struct net_device *netdev)
Register network device.
Definition netdevice.c:760
static void netdev_init(struct net_device *netdev, struct net_device_operations *op)
Initialise a network device.
Definition netdevice.h:519
static void netdev_nullify(struct net_device *netdev)
Stop using a network device.
Definition netdevice.h:532
static void netdev_put(struct net_device *netdev)
Drop reference to network device.
Definition netdevice.h:576
void adjust_pci_device(struct pci_device *pci)
Enable PCI device.
Definition pci.c:241
static void pci_set_drvdata(struct pci_device *pci, void *priv)
Set PCI driver-private data.
Definition pci.h:366
struct intel_mailbox mbox
Mailbox.
Definition intel.h:309
struct dma_device * dma
DMA device.
Definition intel.h:293
A network device.
Definition netdevice.h:353
unsigned long membase
Memory base.
Definition pci.h:220
struct device dev
Generic device.
Definition pci.h:213
struct dma_device dma
DMA device.
Definition pci.h:215

References adjust_pci_device(), alloc_etherdev(), DBGC, pci_device::dev, intel_nic::dma, pci_device::dma, dma_set_mask_64bit(), ENODEV, ENOMEM, intel_describe_rx(), intel_describe_tx_adv(), intel_init_mbox(), intel_init_ring(), INTEL_NUM_RX_DESC, INTEL_NUM_TX_DESC, INTELVF_BAR_SIZE, intelvf_mbox_reset(), intelxvf_check_link(), INTELXVF_MBCTRL, INTELXVF_MBMEM, intelxvf_operations, INTELXVF_RD, intelxvf_reset(), INTELXVF_TD, iounmap(), intel_nic::mbox, pci_device::membase, memset(), netdev, netdev_init(), netdev_nullify(), netdev_put(), pci_ioremap(), pci_set_drvdata(), rc, register_netdev(), intel_nic::regs, intel_nic::rx, strerror(), intel_nic::tx, and unregister_netdev().

◆ intelxvf_remove()

void intelxvf_remove ( struct pci_device * pci)
static

Remove PCI device.

Parameters
pciPCI device

Definition at line 512 of file intelxvf.c.

512 {
513 struct net_device *netdev = pci_get_drvdata ( pci );
514 struct intel_nic *intel = netdev->priv;
515
516 /* Unregister network device */
518
519 /* Reset the NIC */
520 intelxvf_reset ( intel );
521
522 /* Free network device */
523 iounmap ( intel->regs );
525 netdev_put ( netdev );
526}
static void * pci_get_drvdata(struct pci_device *pci)
Get PCI driver-private data.
Definition pci.h:376

References intelxvf_reset(), iounmap(), netdev, netdev_nullify(), netdev_put(), pci_get_drvdata(), intel_nic::regs, and unregister_netdev().

Variable Documentation

◆ intelxvf_operations

struct net_device_operations intelxvf_operations
static
Initial value:
= {
.open = intelxvf_open,
.close = intelxvf_close,
.transmit = intel_transmit,
.poll = intelxvf_poll,
.irq = intelxvf_irq,
}
int intel_transmit(struct net_device *netdev, struct io_buffer *iobuf)
Transmit packet.
Definition intel.c:753
static void intelxvf_poll(struct net_device *netdev)
Poll for completed and received packets.
Definition intelxvf.c:358
static void intelxvf_irq(struct net_device *netdev, int enable)
Enable or disable interrupts.
Definition intelxvf.c:400
static void intelxvf_close(struct net_device *netdev)
Close network device.
Definition intelxvf.c:337
static int intelxvf_open(struct net_device *netdev)
Open network device.
Definition intelxvf.c:215

Network device operations.

Definition at line 413 of file intelxvf.c.

413 {
414 .open = intelxvf_open,
415 .close = intelxvf_close,
416 .transmit = intel_transmit,
417 .poll = intelxvf_poll,
418 .irq = intelxvf_irq,
419};

Referenced by intelxvf_probe().

◆ intelxvf_nics

struct pci_device_id intelxvf_nics[]
static
Initial value:
= {
PCI_ROM ( 0x8086, 0x10ed, "82599-vf", "82599 VF", 0 ),
PCI_ROM ( 0x8086, 0x1515, "x540-vf", "X540 VF", 0 ),
PCI_ROM ( 0x8086, 0x1565, "x550-vf", "X550 VF", 0 ),
PCI_ROM ( 0x8086, 0x15a8, "x552-vf", "X552 VF", 0 ),
PCI_ROM ( 0x8086, 0x15c5, "x557-vf", "X557-AT2 VF", 0 ),
}
#define PCI_ROM(_vendor, _device, _name, _description, _data)
Definition pci.h:308

PCI device IDs.

Definition at line 529 of file intelxvf.c.

529 {
530 PCI_ROM ( 0x8086, 0x10ed, "82599-vf", "82599 VF", 0 ),
531 PCI_ROM ( 0x8086, 0x1515, "x540-vf", "X540 VF", 0 ),
532 PCI_ROM ( 0x8086, 0x1565, "x550-vf", "X550 VF", 0 ),
533 PCI_ROM ( 0x8086, 0x15a8, "x552-vf", "X552 VF", 0 ),
534 PCI_ROM ( 0x8086, 0x15c5, "x557-vf", "X557-AT2 VF", 0 ),
535};

◆ __pci_driver

struct pci_driver intelxvf_driver __pci_driver
Initial value:
= {
.ids = intelxvf_nics,
.id_count = ( sizeof ( intelxvf_nics ) / sizeof ( intelxvf_nics[0] ) ),
.probe = intelxvf_probe,
}
static struct pci_device_id intelxvf_nics[]
PCI device IDs.
Definition intelxvf.c:529
static void intelxvf_remove(struct pci_device *pci)
Remove PCI device.
Definition intelxvf.c:512
static int intelxvf_probe(struct pci_device *pci)
Probe PCI device.
Definition intelxvf.c:434
static struct xen_remove_from_physmap * remove
Definition xenmem.h:40

PCI driver.

Definition at line 538 of file intelxvf.c.

538 {
539 .ids = intelxvf_nics,
540 .id_count = ( sizeof ( intelxvf_nics ) / sizeof ( intelxvf_nics[0] ) ),
541 .probe = intelxvf_probe,
543};