iPXE
Functions
intelvf.c File Reference

Intel 10/100/1000 virtual function network card driver. More...

#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <ipxe/io.h>
#include <ipxe/netdevice.h>
#include <ipxe/ethernet.h>
#include "intelvf.h"

Go to the source code of this file.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
static void intelvf_mbox_write (struct intel_nic *intel, const union intelvf_msg *msg)
 Write message to mailbox. More...
 
static void intelvf_mbox_read (struct intel_nic *intel, union intelvf_msg *msg)
 Read message from mailbox. More...
 
int intelvf_mbox_poll (struct intel_nic *intel)
 Poll mailbox. More...
 
int intelvf_mbox_wait (struct intel_nic *intel)
 Wait for PF reset to complete. More...
 
int intelvf_mbox_msg (struct intel_nic *intel, union intelvf_msg *msg)
 Send/receive mailbox message. More...
 
int intelvf_mbox_reset (struct intel_nic *intel, uint8_t *hw_addr)
 Send reset message and get initial MAC address. More...
 
int intelvf_mbox_set_mac (struct intel_nic *intel, const uint8_t *ll_addr)
 Send set MAC address message. More...
 
int intelvf_mbox_set_mtu (struct intel_nic *intel, size_t mtu)
 Send set MTU message. More...
 

Detailed Description

Intel 10/100/1000 virtual function network card driver.

Definition in file intelvf.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ intelvf_mbox_write()

static void intelvf_mbox_write ( struct intel_nic intel,
const union intelvf_msg msg 
)
static

Write message to mailbox.

Parameters
intelIntel device
msgMessage

Definition at line 53 of file intelvf.c.

54  {
55  unsigned int i;
56 
57  /* Write message */
58  DBGC2 ( intel, "INTEL %p sending message", intel );
59  for ( i = 0 ; i < ( sizeof ( *msg ) / sizeof ( msg->dword[0] ) ) ; i++){
60  DBGC2 ( intel, "%c%08x", ( i ? ':' : ' ' ), msg->dword[i] );
61  writel ( msg->dword[i], ( intel->regs + intel->mbox.mem +
62  ( i * sizeof ( msg->dword[0] ) ) ) );
63  }
64  DBGC2 ( intel, "\n" );
65 }
void * regs
Registers.
Definition: intel.h:280
struct intel_mailbox mbox
Mailbox.
Definition: intel.h:296
void writel(uint32_t data, volatile uint32_t *io_addr)
Write 32-bit dword to memory-mapped device.
unsigned int mem
Mailbox memory base.
Definition: intel.h:259
#define DBGC2(...)
Definition: compiler.h:522
static void msg(unsigned int row, const char *fmt,...)
Print message centred on specified row.
Definition: settings_ui.c:285

References DBGC2, intel_nic::mbox, intel_mailbox::mem, msg(), intel_nic::regs, and writel().

Referenced by intelvf_mbox_msg().

◆ intelvf_mbox_read()

static void intelvf_mbox_read ( struct intel_nic intel,
union intelvf_msg msg 
)
static

Read message from mailbox.

Parameters
intelIntel device
msgMessage

Definition at line 73 of file intelvf.c.

74  {
75  unsigned int i;
76 
77  /* Read message */
78  DBGC2 ( intel, "INTEL %p received message", intel );
79  for ( i = 0 ; i < ( sizeof ( *msg ) / sizeof ( msg->dword[0] ) ) ; i++){
80  msg->dword[i] = readl ( intel->regs + intel->mbox.mem +
81  ( i * sizeof ( msg->dword[0] ) ) );
82  DBGC2 ( intel, "%c%08x", ( i ? ':' : ' ' ), msg->dword[i] );
83  }
84  DBGC2 ( intel, "\n" );
85 }
void * regs
Registers.
Definition: intel.h:280
struct intel_mailbox mbox
Mailbox.
Definition: intel.h:296
uint32_t readl(volatile uint32_t *io_addr)
Read 32-bit dword from memory-mapped device.
unsigned int mem
Mailbox memory base.
Definition: intel.h:259
#define DBGC2(...)
Definition: compiler.h:522
static void msg(unsigned int row, const char *fmt,...)
Print message centred on specified row.
Definition: settings_ui.c:285

References DBGC2, intel_nic::mbox, intel_mailbox::mem, msg(), readl(), and intel_nic::regs.

Referenced by intelvf_mbox_msg(), and intelvf_mbox_poll().

◆ intelvf_mbox_poll()

int intelvf_mbox_poll ( struct intel_nic intel)

Poll mailbox.

Parameters
intelIntel device
Return values
rcReturn status code

Note that polling the mailbox may fail if the underlying PF is reset.

Definition at line 96 of file intelvf.c.

96  {
97  struct intel_mailbox *mbox = &intel->mbox;
98  union intelvf_msg msg;
99  uint32_t ctrl;
100 
101  /* Get mailbox status */
102  ctrl = readl ( intel->regs + mbox->ctrl );
103 
104  /* Fail if a reset is in progress */
105  if ( ctrl & INTELVF_MBCTRL_RSTI )
106  return -EPIPE;
107 
108  /* Acknowledge (and ignore) any received messages */
109  if ( ctrl & INTELVF_MBCTRL_PFSTS ) {
110  intelvf_mbox_read ( intel, &msg );
111  writel ( INTELVF_MBCTRL_ACK, intel->regs + mbox->ctrl );
112  }
113 
114  return 0;
115 }
void * regs
Registers.
Definition: intel.h:280
struct intel_mailbox mbox
Mailbox.
Definition: intel.h:296
#define EPIPE
Broken pipe.
Definition: errno.h:619
uint32_t readl(volatile uint32_t *io_addr)
Read 32-bit dword from memory-mapped device.
Mailbox message.
Definition: intelvf.h:123
void writel(uint32_t data, volatile uint32_t *io_addr)
Write 32-bit dword to memory-mapped device.
Definition: golan.c:120
#define INTELVF_MBCTRL_PFSTS
PF wrote a message.
Definition: intelvf.h:23
An Intel virtual function mailbox.
Definition: intel.h:255
#define INTELVF_MBCTRL_ACK
PF message received.
Definition: intelvf.h:20
unsigned int uint32_t
Definition: stdint.h:12
#define INTELVF_MBCTRL_RSTI
PF reset in progress.
Definition: intelvf.h:25
static unsigned int ctrl
Definition: intel.h:270
static void intelvf_mbox_read(struct intel_nic *intel, union intelvf_msg *msg)
Read message from mailbox.
Definition: intelvf.c:73
static void msg(unsigned int row, const char *fmt,...)
Print message centred on specified row.
Definition: settings_ui.c:285

References ctrl, EPIPE, INTELVF_MBCTRL_ACK, INTELVF_MBCTRL_PFSTS, INTELVF_MBCTRL_RSTI, intelvf_mbox_read(), intel_nic::mbox, msg(), readl(), intel_nic::regs, and writel().

Referenced by intelvf_mbox_wait(), and intelxvf_poll().

◆ intelvf_mbox_wait()

int intelvf_mbox_wait ( struct intel_nic intel)

Wait for PF reset to complete.

Parameters
intelIntel device
Return values
rcReturn status code

Definition at line 123 of file intelvf.c.

123  {
124  unsigned int i;
125  int rc;
126 
127  /* Wait until a poll completes successfully */
128  for ( i = 0 ; i < INTELVF_MBOX_MAX_WAIT_MS ; i++ ) {
129 
130  /* Check for successful poll */
131  if ( ( rc = intelvf_mbox_poll ( intel ) ) == 0 )
132  return 0;
133 
134  /* Delay */
135  mdelay ( 1 );
136  }
137 
138  DBGC ( intel, "INTEL %p timed out waiting for reset\n", intel );
139  return -ETIMEDOUT;
140 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define DBGC(...)
Definition: compiler.h:505
#define INTELVF_MBOX_MAX_WAIT_MS
Maximum time to wait for mailbox message.
Definition: intelvf.h:142
void mdelay(unsigned long msecs)
Delay for a fixed number of milliseconds.
Definition: timer.c:78
int intelvf_mbox_poll(struct intel_nic *intel)
Poll mailbox.
Definition: intelvf.c:96
#define ETIMEDOUT
Connection timed out.
Definition: errno.h:669

References DBGC, ETIMEDOUT, INTELVF_MBOX_MAX_WAIT_MS, intelvf_mbox_poll(), mdelay(), and rc.

◆ intelvf_mbox_msg()

int intelvf_mbox_msg ( struct intel_nic intel,
union intelvf_msg msg 
)

Send/receive mailbox message.

Parameters
intelIntel device
msgMessage buffer
Return values
rcReturn status code

Definition at line 149 of file intelvf.c.

149  {
150  struct intel_mailbox *mbox = &intel->mbox;
151  uint32_t ctrl;
152  uint32_t seen = 0;
153  unsigned int i;
154 
155  /* Sanity check */
156  assert ( ! ( msg->hdr & INTELVF_MSG_RESPONSE ) );
157 
158  /* Handle mailbox */
159  for ( i = 0 ; i < INTELVF_MBOX_MAX_WAIT_MS ; i++ ) {
160 
161  /* Attempt to claim mailbox, if we have not yet sent
162  * our message.
163  */
164  if ( ! ( seen & INTELVF_MBCTRL_VFU ) )
165  writel ( INTELVF_MBCTRL_VFU, intel->regs + mbox->ctrl );
166 
167  /* Get mailbox status and record observed flags */
168  ctrl = readl ( intel->regs + mbox->ctrl );
169  seen |= ctrl;
170 
171  /* If a reset is in progress, clear VFU and abort */
172  if ( ctrl & INTELVF_MBCTRL_RSTI ) {
173  writel ( 0, intel->regs + mbox->ctrl );
174  return -EPIPE;
175  }
176 
177  /* Write message to mailbox, if applicable. This
178  * potentially overwrites a message sent by the PF (if
179  * the PF has simultaneously released PFU (thus
180  * allowing our VFU) and asserted PFSTS), but that
181  * doesn't really matter since there are no
182  * unsolicited PF->VF messages that require the actual
183  * message content to be observed.
184  */
185  if ( ctrl & INTELVF_MBCTRL_VFU )
186  intelvf_mbox_write ( intel, msg );
187 
188  /* Read message from mailbox, if applicable. */
189  if ( ( seen & INTELVF_MBCTRL_VFU ) &&
190  ( seen & INTELVF_MBCTRL_PFACK ) &&
191  ( ctrl & INTELVF_MBCTRL_PFSTS ) )
192  intelvf_mbox_read ( intel, msg );
193 
194  /* Acknowledge received message (if applicable),
195  * release VFU lock, and send message (if applicable).
196  */
197  ctrl = ( ( ( ctrl & INTELVF_MBCTRL_PFSTS ) ?
198  INTELVF_MBCTRL_ACK : 0 ) |
199  ( ( ctrl & INTELVF_MBCTRL_VFU ) ?
200  INTELVF_MBCTRL_REQ : 0 ) );
201  writel ( ctrl, intel->regs + mbox->ctrl );
202 
203  /* Exit successfully if we have received a response */
204  if ( msg->hdr & INTELVF_MSG_RESPONSE ) {
205 
206  /* Sanity check */
207  assert ( seen & INTELVF_MBCTRL_VFU );
208  assert ( seen & INTELVF_MBCTRL_PFACK );
209  assert ( seen & INTELVF_MBCTRL_PFSTS );
210 
211  return 0;
212  }
213 
214  /* Delay */
215  mdelay ( 1 );
216  }
217 
218  DBGC ( intel, "INTEL %p timed out waiting for mailbox (seen %08x)\n",
219  intel, seen );
220  return -ETIMEDOUT;
221 }
void * regs
Registers.
Definition: intel.h:280
static void intelvf_mbox_write(struct intel_nic *intel, const union intelvf_msg *msg)
Write message to mailbox.
Definition: intelvf.c:53
struct intel_mailbox mbox
Mailbox.
Definition: intel.h:296
#define EPIPE
Broken pipe.
Definition: errno.h:619
uint32_t readl(volatile uint32_t *io_addr)
Read 32-bit dword from memory-mapped device.
#define DBGC(...)
Definition: compiler.h:505
#define INTELVF_MBCTRL_PFACK
PF acknowledged message.
Definition: intelvf.h:24
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
void writel(uint32_t data, volatile uint32_t *io_addr)
Write 32-bit dword to memory-mapped device.
Definition: golan.c:120
#define INTELVF_MBCTRL_REQ
Request for PF ready.
Definition: intelvf.h:19
#define INTELVF_MBCTRL_PFSTS
PF wrote a message.
Definition: intelvf.h:23
An Intel virtual function mailbox.
Definition: intel.h:255
#define INTELVF_MBCTRL_ACK
PF message received.
Definition: intelvf.h:20
#define INTELVF_MSG_RESPONSE
Message is a response.
Definition: intelvf.h:56
unsigned int uint32_t
Definition: stdint.h:12
#define INTELVF_MBCTRL_RSTI
PF reset in progress.
Definition: intelvf.h:25
#define INTELVF_MBCTRL_VFU
Buffer taken by VF.
Definition: intelvf.h:21
#define INTELVF_MBOX_MAX_WAIT_MS
Maximum time to wait for mailbox message.
Definition: intelvf.h:142
void mdelay(unsigned long msecs)
Delay for a fixed number of milliseconds.
Definition: timer.c:78
static unsigned int ctrl
Definition: intel.h:270
static void intelvf_mbox_read(struct intel_nic *intel, union intelvf_msg *msg)
Read message from mailbox.
Definition: intelvf.c:73
#define ETIMEDOUT
Connection timed out.
Definition: errno.h:669
static void msg(unsigned int row, const char *fmt,...)
Print message centred on specified row.
Definition: settings_ui.c:285

References assert(), ctrl, DBGC, EPIPE, ETIMEDOUT, INTELVF_MBCTRL_ACK, INTELVF_MBCTRL_PFACK, INTELVF_MBCTRL_PFSTS, INTELVF_MBCTRL_REQ, INTELVF_MBCTRL_RSTI, INTELVF_MBCTRL_VFU, INTELVF_MBOX_MAX_WAIT_MS, intelvf_mbox_read(), intelvf_mbox_write(), INTELVF_MSG_RESPONSE, intel_nic::mbox, mdelay(), msg(), readl(), intel_nic::regs, and writel().

Referenced by intelvf_mbox_reset(), intelvf_mbox_set_mac(), intelvf_mbox_set_mtu(), intelxvf_mbox_queues(), and intelxvf_mbox_version().

◆ intelvf_mbox_reset()

int intelvf_mbox_reset ( struct intel_nic intel,
uint8_t hw_addr 
)

Send reset message and get initial MAC address.

Parameters
intelIntel device
hw_addrHardware address to fill in, or NULL
Return values
rcReturn status code

Definition at line 230 of file intelvf.c.

230  {
231  union intelvf_msg msg;
232  int rc;
233 
234  /* Send reset message */
235  memset ( &msg, 0, sizeof ( msg ) );
237  if ( ( rc = intelvf_mbox_msg ( intel, &msg ) ) != 0 ) {
238  DBGC ( intel, "INTEL %p reset failed: %s\n",
239  intel, strerror ( rc ) );
240  return rc;
241  }
242 
243  /* Check response */
244  if ( ( msg.hdr & INTELVF_MSG_TYPE_MASK ) != INTELVF_MSG_TYPE_RESET ) {
245  DBGC ( intel, "INTEL %p reset unexpected response:\n", intel );
246  DBGC_HDA ( intel, 0, &msg, sizeof ( msg ) );
247  return -EPROTO;
248  }
249 
250  /* Fill in MAC address, if applicable */
251  if ( hw_addr ) {
252  if ( msg.hdr & INTELVF_MSG_ACK ) {
253  memcpy ( hw_addr, msg.mac.mac, sizeof ( msg.mac.mac ) );
254  DBGC ( intel, "INTEL %p reset assigned MAC address "
255  "%s\n", intel, eth_ntoa ( hw_addr ) );
256  } else {
257  eth_random_addr ( hw_addr );
258  DBGC ( intel, "INTEL %p reset generated MAC address "
259  "%s\n", intel, eth_ntoa ( hw_addr ) );
260  }
261  }
262 
263  return 0;
264 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define DBGC(...)
Definition: compiler.h:505
Mailbox message.
Definition: intelvf.h:123
void * memcpy(void *dest, const void *src, size_t len) __nonnull
#define DBGC_HDA(...)
Definition: compiler.h:506
#define EPROTO
Protocol error.
Definition: errno.h:624
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
#define INTELVF_MSG_ACK
Message ACK flag.
Definition: intelvf.h:53
int intelvf_mbox_msg(struct intel_nic *intel, union intelvf_msg *msg)
Send/receive mailbox message.
Definition: intelvf.c:149
const char * eth_ntoa(const void *ll_addr)
Transcribe Ethernet address.
Definition: ethernet.c:175
#define INTELVF_MSG_TYPE_MASK
Message type mask.
Definition: intelvf.h:47
#define INTELVF_MSG_TYPE_RESET
Reset mailbox message.
Definition: intelvf.h:32
void eth_random_addr(void *hw_addr)
Generate random Ethernet address.
Definition: ethernet.c:159
void * memset(void *dest, int character, size_t len) __nonnull
static void msg(unsigned int row, const char *fmt,...)
Print message centred on specified row.
Definition: settings_ui.c:285

References DBGC, DBGC_HDA, EPROTO, eth_ntoa(), eth_random_addr(), intelvf_mbox_msg(), INTELVF_MSG_ACK, INTELVF_MSG_TYPE_MASK, INTELVF_MSG_TYPE_RESET, memcpy(), memset(), msg(), rc, and strerror().

Referenced by intelxvf_open(), and intelxvf_probe().

◆ intelvf_mbox_set_mac()

int intelvf_mbox_set_mac ( struct intel_nic intel,
const uint8_t ll_addr 
)

Send set MAC address message.

Parameters
intelIntel device
ll_addrLink-layer address
Return values
rcReturn status code

Definition at line 273 of file intelvf.c.

273  {
274  union intelvf_msg msg;
275  int rc;
276 
277  /* Send set MAC address message */
278  memset ( &msg, 0, sizeof ( msg ) );
280  memcpy ( msg.mac.mac, ll_addr, sizeof ( msg.mac.mac ) );
281  if ( ( rc = intelvf_mbox_msg ( intel, &msg ) ) != 0 ) {
282  DBGC ( intel, "INTEL %p set MAC address failed: %s\n",
283  intel, strerror ( rc ) );
284  return rc;
285  }
286 
287  /* Check response */
289  DBGC ( intel, "INTEL %p set MAC address unexpected response:\n",
290  intel );
291  DBGC_HDA ( intel, 0, &msg, sizeof ( msg ) );
292  return -EPROTO;
293  }
294 
295  /* Check that we were allowed to set the MAC address */
296  if ( ! ( msg.hdr & INTELVF_MSG_ACK ) ) {
297  DBGC ( intel, "INTEL %p set MAC address refused\n", intel );
298  return -EPERM;
299  }
300 
301  return 0;
302 }
#define INTELVF_MSG_TYPE_SET_MAC
Set MAC address mailbox message.
Definition: intelvf.h:35
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define DBGC(...)
Definition: compiler.h:505
Mailbox message.
Definition: intelvf.h:123
void * memcpy(void *dest, const void *src, size_t len) __nonnull
#define DBGC_HDA(...)
Definition: compiler.h:506
#define EPROTO
Protocol error.
Definition: errno.h:624
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
#define INTELVF_MSG_ACK
Message ACK flag.
Definition: intelvf.h:53
int intelvf_mbox_msg(struct intel_nic *intel, union intelvf_msg *msg)
Send/receive mailbox message.
Definition: intelvf.c:149
#define EPERM
Operation not permitted.
Definition: errno.h:614
#define INTELVF_MSG_TYPE_MASK
Message type mask.
Definition: intelvf.h:47
void * memset(void *dest, int character, size_t len) __nonnull
static void msg(unsigned int row, const char *fmt,...)
Print message centred on specified row.
Definition: settings_ui.c:285

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

Referenced by intelxvf_open().

◆ intelvf_mbox_set_mtu()

int intelvf_mbox_set_mtu ( struct intel_nic intel,
size_t  mtu 
)

Send set MTU message.

Parameters
intelIntel device
mtuMaximum packet size
Return values
rcReturn status code

Definition at line 311 of file intelvf.c.

311  {
312  union intelvf_msg msg;
313  int rc;
314 
315  /* Send set MTU message */
316  memset ( &msg, 0, sizeof ( msg ) );
318  msg.mtu.mtu = mtu;
319  if ( ( rc = intelvf_mbox_msg ( intel, &msg ) ) != 0 ) {
320  DBGC ( intel, "INTEL %p set MTU failed: %s\n",
321  intel, strerror ( rc ) );
322  return rc;
323  }
324 
325  /* Check response */
327  DBGC ( intel, "INTEL %p set MTU unexpected response:\n",
328  intel );
329  DBGC_HDA ( intel, 0, &msg, sizeof ( msg ) );
330  return -EPROTO;
331  }
332 
333  /* Check that we were allowed to set the MTU */
334  if ( ! ( msg.hdr & INTELVF_MSG_ACK ) ) {
335  DBGC ( intel, "INTEL %p set MTU refused\n", intel );
336  return -EPERM;
337  }
338 
339  return 0;
340 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define DBGC(...)
Definition: compiler.h:505
Mailbox message.
Definition: intelvf.h:123
#define DBGC_HDA(...)
Definition: compiler.h:506
#define EPROTO
Protocol error.
Definition: errno.h:624
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
#define INTELVF_MSG_ACK
Message ACK flag.
Definition: intelvf.h:53
int intelvf_mbox_msg(struct intel_nic *intel, union intelvf_msg *msg)
Send/receive mailbox message.
Definition: intelvf.c:149
#define INTELVF_MSG_TYPE_SET_MTU
Set MTU mailbox message.
Definition: intelvf.h:38
#define EPERM
Operation not permitted.
Definition: errno.h:614
#define INTELVF_MSG_TYPE_MASK
Message type mask.
Definition: intelvf.h:47
uint32_t mtu
Maximum MTU.
Definition: ena.h:28
void * memset(void *dest, int character, size_t len) __nonnull
static void msg(unsigned int row, const char *fmt,...)
Print message centred on specified row.
Definition: settings_ui.c:285

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

Referenced by intelxvf_open().