iPXE
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)
 FILE_SECBOOT (PERMITTED)
static void intelvf_mbox_write (struct intel_nic *intel, const union intelvf_msg *msg)
 Write message to mailbox.
static void intelvf_mbox_read (struct intel_nic *intel, union intelvf_msg *msg)
 Read message from mailbox.
int intelvf_mbox_poll (struct intel_nic *intel)
 Poll mailbox.
int intelvf_mbox_wait (struct intel_nic *intel)
 Wait for PF reset to complete.
int intelvf_mbox_msg (struct intel_nic *intel, union intelvf_msg *msg)
 Send/receive mailbox message.
int intelvf_mbox_reset (struct intel_nic *intel, uint8_t *hw_addr)
 Send reset message and get initial MAC address.
int intelvf_mbox_set_mac (struct intel_nic *intel, const uint8_t *ll_addr)
 Send set MAC address message.
int intelvf_mbox_set_mtu (struct intel_nic *intel, size_t mtu)
 Send set MTU message.

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 )

◆ FILE_SECBOOT()

FILE_SECBOOT ( PERMITTED )

◆ intelvf_mbox_write()

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 54 of file intelvf.c.

55 {
56 const struct intelvf_msg_raw *raw = &msg->raw;
57 unsigned int i;
58
59 /* Write message */
60 DBGC2 ( intel, "INTEL %p sending message", intel );
61 for ( i = 0 ; i < ( sizeof ( *msg ) / sizeof ( raw->dword[0] ) ) ; i++){
62 DBGC2 ( intel, "%c%08x", ( i ? ':' : ' ' ), raw->dword[i] );
63 writel ( raw->dword[i], ( intel->regs + intel->mbox.mem +
64 ( i * sizeof ( raw->dword[0] ) ) ) );
65 }
66 DBGC2 ( intel, "\n" );
67}
__be32 raw[7]
Definition CIB_PRM.h:0
#define DBGC2(...)
Definition compiler.h:522
void msg(unsigned int row, const char *fmt,...)
Print message centred on specified row.
Definition message.c:62
unsigned int mem
Mailbox memory base.
Definition intel.h:270
struct intel_mailbox mbox
Mailbox.
Definition intel.h:309
void * regs
Registers.
Definition intel.h:291
Raw mailbox message.
Definition intelvf.h:124
#define writel
Definition w89c840.c:160

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

Referenced by intelvf_mbox_msg().

◆ intelvf_mbox_read()

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

Read message from mailbox.

Parameters
intelIntel device
msgMessage

Definition at line 75 of file intelvf.c.

76 {
77 struct intelvf_msg_raw *raw = &msg->raw;
78 unsigned int i;
79
80 /* Read message */
81 DBGC2 ( intel, "INTEL %p received message", intel );
82 for ( i = 0 ; i < ( sizeof ( *msg ) / sizeof ( raw->dword[0] ) ) ; i++){
83 raw->dword[i] = readl ( intel->regs + intel->mbox.mem +
84 ( i * sizeof ( raw->dword[0] ) ) );
85 DBGC2 ( intel, "%c%08x", ( i ? ':' : ' ' ), raw->dword[i] );
86 }
87 DBGC2 ( intel, "\n" );
88}
#define readl
Definition w89c840.c:157

References DBGC2, intel_nic::mbox, intel_mailbox::mem, msg(), raw, 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 99 of file intelvf.c.

99 {
100 struct intel_mailbox *mbox = &intel->mbox;
101 union intelvf_msg msg;
103
104 /* Get mailbox status */
105 ctrl = readl ( intel->regs + mbox->ctrl );
106
107 /* Fail if a reset is in progress */
109 return -EPIPE;
110
111 /* Acknowledge (and ignore) any received messages */
112 if ( ctrl & INTELVF_MBCTRL_PFSTS ) {
113 intelvf_mbox_read ( intel, &msg );
114 writel ( INTELVF_MBCTRL_ACK, intel->regs + mbox->ctrl );
115 }
116
117 return 0;
118}
unsigned int uint32_t
Definition stdint.h:12
uint8_t ctrl
Ring control.
Definition dwmac.h:7
#define EPIPE
Broken pipe.
Definition errno.h:620
static void intelvf_mbox_read(struct intel_nic *intel, union intelvf_msg *msg)
Read message from mailbox.
Definition intelvf.c:75
#define INTELVF_MBCTRL_ACK
PF message received.
Definition intelvf.h:21
#define INTELVF_MBCTRL_PFSTS
PF wrote a message.
Definition intelvf.h:24
#define INTELVF_MBCTRL_RSTI
PF reset in progress.
Definition intelvf.h:26
An Intel virtual function mailbox.
Definition intel.h:266
Definition golan.c:120
Mailbox message.
Definition intelvf.h:130

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 126 of file intelvf.c.

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

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 152 of file intelvf.c.

152 {
153 struct intel_mailbox *mbox = &intel->mbox;
155 uint32_t seen = 0;
156 unsigned int i;
157
158 /* Sanity check */
159 assert ( ! ( msg->hdr & INTELVF_MSG_RESPONSE ) );
160
161 /* Handle mailbox */
162 for ( i = 0 ; i < INTELVF_MBOX_MAX_WAIT_MS ; i++ ) {
163
164 /* Attempt to claim mailbox, if we have not yet sent
165 * our message.
166 */
167 if ( ! ( seen & INTELVF_MBCTRL_VFU ) )
168 writel ( INTELVF_MBCTRL_VFU, intel->regs + mbox->ctrl );
169
170 /* Get mailbox status and record observed flags */
171 ctrl = readl ( intel->regs + mbox->ctrl );
172 seen |= ctrl;
173
174 /* If a reset is in progress, clear VFU and abort */
175 if ( ctrl & INTELVF_MBCTRL_RSTI ) {
176 writel ( 0, intel->regs + mbox->ctrl );
177 return -EPIPE;
178 }
179
180 /* Write message to mailbox, if applicable. This
181 * potentially overwrites a message sent by the PF (if
182 * the PF has simultaneously released PFU (thus
183 * allowing our VFU) and asserted PFSTS), but that
184 * doesn't really matter since there are no
185 * unsolicited PF->VF messages that require the actual
186 * message content to be observed.
187 */
188 if ( ctrl & INTELVF_MBCTRL_VFU )
189 intelvf_mbox_write ( intel, msg );
190
191 /* Read message from mailbox, if applicable. */
192 if ( ( seen & INTELVF_MBCTRL_VFU ) &&
193 ( seen & INTELVF_MBCTRL_PFACK ) &&
195 intelvf_mbox_read ( intel, msg );
196
197 /* Acknowledge received message (if applicable),
198 * release VFU lock, and send message (if applicable).
199 */
200 ctrl = ( ( ( ctrl & INTELVF_MBCTRL_PFSTS ) ?
201 INTELVF_MBCTRL_ACK : 0 ) |
202 ( ( ctrl & INTELVF_MBCTRL_VFU ) ?
203 INTELVF_MBCTRL_REQ : 0 ) );
204 writel ( ctrl, intel->regs + mbox->ctrl );
205
206 /* Exit successfully if we have received a response */
207 if ( msg->hdr & INTELVF_MSG_RESPONSE ) {
208
209 /* Sanity check */
210 assert ( seen & INTELVF_MBCTRL_VFU );
211 assert ( seen & INTELVF_MBCTRL_PFACK );
212 assert ( seen & INTELVF_MBCTRL_PFSTS );
213
214 return 0;
215 }
216
217 /* Delay */
218 mdelay ( 1 );
219 }
220
221 DBGC ( intel, "INTEL %p timed out waiting for mailbox (seen %08x)\n",
222 intel, seen );
223 return -ETIMEDOUT;
224}
#define assert(condition)
Assert a condition at run-time.
Definition assert.h:50
static void intelvf_mbox_write(struct intel_nic *intel, const union intelvf_msg *msg)
Write message to mailbox.
Definition intelvf.c:54
#define INTELVF_MBCTRL_PFACK
PF acknowledged message.
Definition intelvf.h:25
#define INTELVF_MSG_RESPONSE
Message is a response.
Definition intelvf.h:57
#define INTELVF_MBCTRL_VFU
Buffer taken by VF.
Definition intelvf.h:22
#define INTELVF_MBCTRL_REQ
Request for PF ready.
Definition intelvf.h:20

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 233 of file intelvf.c.

233 {
234 union intelvf_msg msg;
235 int rc;
236
237 /* Send reset message */
238 memset ( &msg, 0, sizeof ( msg ) );
240 if ( ( rc = intelvf_mbox_msg ( intel, &msg ) ) != 0 ) {
241 DBGC ( intel, "INTEL %p reset failed: %s\n",
242 intel, strerror ( rc ) );
243 return rc;
244 }
245
246 /* Check response */
248 DBGC ( intel, "INTEL %p reset unexpected response:\n", intel );
249 DBGC_HDA ( intel, 0, &msg, sizeof ( msg ) );
250 return -EPROTO;
251 }
252
253 /* Fill in MAC address, if applicable */
254 if ( hw_addr ) {
255 if ( msg.hdr & INTELVF_MSG_ACK ) {
256 memcpy ( hw_addr, msg.mac.mac, sizeof ( msg.mac.mac ) );
257 DBGC ( intel, "INTEL %p reset assigned MAC address "
258 "%s\n", intel, eth_ntoa ( hw_addr ) );
259 } else {
260 eth_random_addr ( hw_addr );
261 DBGC ( intel, "INTEL %p reset generated MAC address "
262 "%s\n", intel, eth_ntoa ( hw_addr ) );
263 }
264 }
265
266 return 0;
267}
const char * eth_ntoa(const void *ll_addr)
Transcribe Ethernet address.
Definition ethernet.c:176
void eth_random_addr(void *hw_addr)
Generate random Ethernet address.
Definition ethernet.c:160
#define DBGC_HDA(...)
Definition compiler.h:506
#define EPROTO
Protocol error.
Definition errno.h:625
void * memcpy(void *dest, const void *src, size_t len) __nonnull
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_TYPE_RESET
Reset mailbox message.
Definition intelvf.h:33
#define INTELVF_MSG_ACK
Message ACK flag.
Definition intelvf.h:54
#define INTELVF_MSG_TYPE_MASK
Message type mask.
Definition intelvf.h:48
char * strerror(int errno)
Retrieve string representation of error number.
Definition strerror.c:79

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 276 of file intelvf.c.

276 {
277 union intelvf_msg msg;
278 int rc;
279
280 /* Send set MAC address message */
281 memset ( &msg, 0, sizeof ( msg ) );
283 memcpy ( msg.mac.mac, ll_addr, sizeof ( msg.mac.mac ) );
284 if ( ( rc = intelvf_mbox_msg ( intel, &msg ) ) != 0 ) {
285 DBGC ( intel, "INTEL %p set MAC address failed: %s\n",
286 intel, strerror ( rc ) );
287 return rc;
288 }
289
290 /* Check response */
292 DBGC ( intel, "INTEL %p set MAC address unexpected response:\n",
293 intel );
294 DBGC_HDA ( intel, 0, &msg, sizeof ( msg ) );
295 return -EPROTO;
296 }
297
298 /* Check that we were allowed to set the MAC address */
299 if ( ! ( msg.hdr & INTELVF_MSG_ACK ) ) {
300 DBGC ( intel, "INTEL %p set MAC address refused\n", intel );
301 return -EPERM;
302 }
303
304 return 0;
305}
#define EPERM
Operation not permitted.
Definition errno.h:615
#define INTELVF_MSG_TYPE_SET_MAC
Set MAC address mailbox message.
Definition intelvf.h:36

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 314 of file intelvf.c.

314 {
315 union intelvf_msg msg;
316 int rc;
317
318 /* Send set MTU message */
319 memset ( &msg, 0, sizeof ( msg ) );
321 msg.mtu.mtu = mtu;
322 if ( ( rc = intelvf_mbox_msg ( intel, &msg ) ) != 0 ) {
323 DBGC ( intel, "INTEL %p set MTU failed: %s\n",
324 intel, strerror ( rc ) );
325 return rc;
326 }
327
328 /* Check response */
330 DBGC ( intel, "INTEL %p set MTU unexpected response:\n",
331 intel );
332 DBGC_HDA ( intel, 0, &msg, sizeof ( msg ) );
333 return -EPROTO;
334 }
335
336 /* Check that we were allowed to set the MTU */
337 if ( ! ( msg.hdr & INTELVF_MSG_ACK ) ) {
338 DBGC ( intel, "INTEL %p set MTU refused\n", intel );
339 return -EPERM;
340 }
341
342 return 0;
343}
uint32_t mtu
Maximum MTU.
Definition ena.h:17
#define INTELVF_MSG_TYPE_SET_MTU
Set MTU mailbox message.
Definition intelvf.h:39

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().