aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2019-04-24 13:00:12 +0100
committerMichael Brown <mcb30@ipxe.org>2019-04-27 20:25:59 +0100
commit17298d01211a8611b9206086fff04624297a4197 (patch)
tree117a333ea2ebee67c51a7ee34947ba0f8e1b97ad
parent7b68c310f94af6466579a47dfbde38d90275f192 (diff)
downloadipxe-17298d01211a8611b9206086fff04624297a4197.zip
ipxe-17298d01211a8611b9206086fff04624297a4197.tar.gz
ipxe-17298d01211a8611b9206086fff04624297a4197.tar.bz2
[intelxl] Allow admin cookie to hold extended opcode and return code
The "send to PF" and "send to VF" admin queue descriptors (ab)use the cookie field to hold the extended opcode and return code values. Signed-off-by: Michael Brown <mcb30@ipxe.org>
-rw-r--r--src/drivers/net/intelxl.c10
-rw-r--r--src/drivers/net/intelxl.h13
2 files changed, 16 insertions, 7 deletions
diff --git a/src/drivers/net/intelxl.c b/src/drivers/net/intelxl.c
index a4dca5f..1cf5cad 100644
--- a/src/drivers/net/intelxl.c
+++ b/src/drivers/net/intelxl.c
@@ -313,8 +313,11 @@ static int intelxl_admin_command ( struct intelxl_nic *intelxl ) {
tail = ( admin->index % INTELXL_ADMIN_NUM_DESC );
cmd = &admin->desc[ index % INTELXL_ADMIN_NUM_DESC ];
buf = &admin->buf[ index % INTELXL_ADMIN_NUM_DESC ];
- DBGC2 ( intelxl, "INTELXL %p admin command %#x opcode %#04x:\n",
+ DBGC2 ( intelxl, "INTELXL %p admin command %#x opcode %#04x",
intelxl, index, le16_to_cpu ( cmd->opcode ) );
+ if ( cmd->vopcode )
+ DBGC2 ( intelxl, "/%#08x", le32_to_cpu ( cmd->vopcode ) );
+ DBGC2 ( intelxl, ":\n" );
/* Sanity checks */
assert ( ! ( cmd->flags & cpu_to_le16 ( INTELXL_ADMIN_FL_DD ) ) );
@@ -329,8 +332,9 @@ static int intelxl_admin_command ( struct intelxl_nic *intelxl ) {
cmd->params.buffer.low = cpu_to_le32 ( address & 0xffffffffUL );
}
- /* Populate cookie */
- cmd->cookie = cpu_to_le32 ( index );
+ /* Populate cookie, if not being (ab)used for VF opcode */
+ if ( ! cmd->vopcode )
+ cmd->cookie = cpu_to_le32 ( index );
/* Record cookie */
cookie = cmd->cookie;
diff --git a/src/drivers/net/intelxl.h b/src/drivers/net/intelxl.h
index 0175c1f..5067b80 100644
--- a/src/drivers/net/intelxl.h
+++ b/src/drivers/net/intelxl.h
@@ -333,10 +333,15 @@ struct intelxl_admin_descriptor {
uint16_t len;
/** Return value */
uint16_t ret;
- /** Cookie */
- uint32_t cookie;
- /** Reserved */
- uint32_t reserved;
+ /** Opaque cookie / VF opcode */
+ union {
+ /** Cookie */
+ uint32_t cookie;
+ /** VF opcode */
+ uint32_t vopcode;
+ };
+ /** VF return value */
+ int32_t vret;
/** Parameters */
union intelxl_admin_params params;
} __attribute__ (( packed ));