aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2022-08-16 15:48:24 +0100
committerMichael Brown <mcb30@ipxe.org>2022-08-16 17:58:52 +0100
commit491c075f7f3ce3e7d58e969d8fcd0af1e102e515 (patch)
treec28180d08bf1dc4df4b9f2b5c2ddffec3d04d024
parentb52ea208411e65a6583c70c9efdc0cd8eda2d7d7 (diff)
downloadipxe-491c075f7f3ce3e7d58e969d8fcd0af1e102e515.zip
ipxe-491c075f7f3ce3e7d58e969d8fcd0af1e102e515.tar.gz
ipxe-491c075f7f3ce3e7d58e969d8fcd0af1e102e515.tar.bz2
[intelxl] Negotiate virtual function API version 1.1
Negotiate API version 1.1 in order to allow access to virtual function opcodes that are disallowed by default on the E810. Signed-off-by: Michael Brown <mcb30@ipxe.org>
-rw-r--r--src/drivers/net/intelxl.h2
-rw-r--r--src/drivers/net/intelxlvf.c7
-rw-r--r--src/drivers/net/intelxlvf.h25
3 files changed, 31 insertions, 3 deletions
diff --git a/src/drivers/net/intelxl.h b/src/drivers/net/intelxl.h
index 0db16b5..6c7865a 100644
--- a/src/drivers/net/intelxl.h
+++ b/src/drivers/net/intelxl.h
@@ -927,6 +927,8 @@ struct intelxl_nic {
unsigned int qset;
/** Transmit element ID */
uint32_t teid;
+ /** Device capabilities */
+ uint32_t caps;
/** Interrupt control register */
unsigned int intr;
/** PCI Express capability offset */
diff --git a/src/drivers/net/intelxlvf.c b/src/drivers/net/intelxlvf.c
index c58520a..79245b4 100644
--- a/src/drivers/net/intelxlvf.c
+++ b/src/drivers/net/intelxlvf.c
@@ -377,16 +377,21 @@ static int intelxlvf_admin_get_resources ( struct net_device *netdev ) {
/* Populate descriptor */
cmd = intelxlvf_admin_command_descriptor ( intelxl );
cmd->vopcode = cpu_to_le32 ( INTELXLVF_ADMIN_GET_RESOURCES );
+ cmd->flags = cpu_to_le16 ( INTELXL_ADMIN_FL_RD | INTELXL_ADMIN_FL_BUF );
+ cmd->len = cpu_to_le16 ( sizeof ( buf->caps ) );
buf = intelxlvf_admin_command_buffer ( intelxl );
+ buf->caps.caps = cpu_to_le32 ( INTELXLVF_ADMIN_CAP_L2 );
/* Issue command */
if ( ( rc = intelxlvf_admin_command ( netdev ) ) != 0 )
return rc;
/* Parse response */
+ intelxl->caps = le32_to_cpu ( buf->res.caps );
intelxl->vsi = le16_to_cpu ( buf->res.vsi );
memcpy ( netdev->hw_addr, buf->res.mac, ETH_ALEN );
- DBGC ( intelxl, "INTELXL %p VSI %#04x\n", intelxl, intelxl->vsi );
+ DBGC ( intelxl, "INTELXL %p capabilities %#08x VSI %#04x\n",
+ intelxl, intelxl->caps, intelxl->vsi );
return 0;
}
diff --git a/src/drivers/net/intelxlvf.h b/src/drivers/net/intelxlvf.h
index c537f6a..783c856 100644
--- a/src/drivers/net/intelxlvf.h
+++ b/src/drivers/net/intelxlvf.h
@@ -91,7 +91,7 @@ struct intelxlvf_admin_version_buffer {
#define INTELXLVF_ADMIN_API_MAJOR 1
/** Admin queue VF API minor version */
-#define INTELXLVF_ADMIN_API_MINOR 0
+#define INTELXLVF_ADMIN_API_MINOR 1
/** Admin Queue VF Reset opcode */
#define INTELXLVF_ADMIN_RESET 0x00000002
@@ -99,10 +99,26 @@ struct intelxlvf_admin_version_buffer {
/** Admin Queue VF Get Resources opcode */
#define INTELXLVF_ADMIN_GET_RESOURCES 0x00000003
+/** Admin Queue VF Capabilities data buffer */
+struct intelxlvf_admin_capabilities_buffer {
+ /** Capabilities */
+ uint32_t caps;
+} __attribute__ (( packed ));
+
/** Admin Queue VF Get Resources data buffer */
struct intelxlvf_admin_get_resources_buffer {
+ /** Number of VSIs */
+ uint16_t vsis;
+ /** Number of queue pairs */
+ uint16_t qps;
+ /** Number of MSI-X vectors */
+ uint16_t vectors;
+ /** Maximum MTU */
+ uint16_t mtu;
+ /** Capabilities */
+ uint32_t caps;
/** Reserved */
- uint8_t reserved_a[20];
+ uint8_t reserved_a[8];
/** VSI switching element ID */
uint16_t vsi;
/** Reserved */
@@ -111,6 +127,9 @@ struct intelxlvf_admin_get_resources_buffer {
uint8_t mac[ETH_ALEN];
} __attribute__ (( packed ));
+/** Layer 2 capabilities (add/remove MAC, configure promiscuous mode) */
+#define INTELXLVF_ADMIN_CAP_L2 0x00000001
+
/** Admin Queue VF Status Change Event opcode */
#define INTELXLVF_ADMIN_STATUS 0x00000011
@@ -286,6 +305,8 @@ union intelxlvf_admin_buffer {
union intelxl_admin_buffer xl;
/** VF Version data buffer */
struct intelxlvf_admin_version_buffer ver;
+ /** VF Capabilities data buffer */
+ struct intelxlvf_admin_capabilities_buffer caps;
/** VF Get Resources data buffer */
struct intelxlvf_admin_get_resources_buffer res;
/** VF Status Change Event data buffer */