diff options
author | Michael Brown <mcb30@ipxe.org> | 2022-08-08 14:57:40 +0100 |
---|---|---|
committer | Michael Brown <mcb30@ipxe.org> | 2022-08-11 14:53:57 +0100 |
commit | fb69d1400269b60d80fc949f84a519e403c58f0e (patch) | |
tree | ee8018921ab33db0077d695e47dac9e38673c7e6 | |
parent | c220b93f3145b10cf9b2a10a52bac4ee1252992f (diff) | |
download | ipxe-fb69d1400269b60d80fc949f84a519e403c58f0e.zip ipxe-fb69d1400269b60d80fc949f84a519e403c58f0e.tar.gz ipxe-fb69d1400269b60d80fc949f84a519e403c58f0e.tar.bz2 |
[intelxl] Separate virtual function driver definitions
Move knowledge of the virtual function data structures and admin
command definitions from intelxl.h to intelxlvf.h.
Signed-off-by: Michael Brown <mcb30@ipxe.org>
-rw-r--r-- | src/drivers/net/intelxl.c | 6 | ||||
-rw-r--r-- | src/drivers/net/intelxl.h | 210 | ||||
-rw-r--r-- | src/drivers/net/intelxlvf.c | 106 | ||||
-rw-r--r-- | src/drivers/net/intelxlvf.h | 257 |
4 files changed, 320 insertions, 259 deletions
diff --git a/src/drivers/net/intelxl.c b/src/drivers/net/intelxl.c index e31595e..51e888a 100644 --- a/src/drivers/net/intelxl.c +++ b/src/drivers/net/intelxl.c @@ -360,8 +360,8 @@ int intelxl_admin_command ( struct intelxl_nic *intelxl ) { buf = &admin->buf[ index % INTELXL_ADMIN_NUM_DESC ]; 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 ) ); + if ( cmd->cookie ) + DBGC2 ( intelxl, "/%#08x", le32_to_cpu ( cmd->cookie ) ); DBGC2 ( intelxl, ":\n" ); /* Sanity checks */ @@ -378,7 +378,7 @@ int intelxl_admin_command ( struct intelxl_nic *intelxl ) { } /* Populate cookie, if not being (ab)used for VF opcode */ - if ( ! cmd->vopcode ) + if ( ! cmd->cookie ) cmd->cookie = cpu_to_le32 ( index ); /* Record cookie */ diff --git a/src/drivers/net/intelxl.h b/src/drivers/net/intelxl.h index 771932c..49a825b 100644 --- a/src/drivers/net/intelxl.h +++ b/src/drivers/net/intelxl.h @@ -305,183 +305,6 @@ struct intelxl_admin_link_params { /** Link is up */ #define INTELXL_ADMIN_LINK_UP 0x01 -/** Admin queue Send Message to PF command */ -#define INTELXL_ADMIN_SEND_TO_PF 0x0801 - -/** Admin queue Send Message to VF command */ -#define INTELXL_ADMIN_SEND_TO_VF 0x0802 - -/** Admin Queue VF Version opcode */ -#define INTELXL_ADMIN_VF_VERSION 0x00000001 - -/** Admin Queue VF Version data buffer */ -struct intelxl_admin_vf_version_buffer { - /** Major version */ - uint32_t major; - /** Minor version */ - uint32_t minor; -} __attribute__ (( packed )); - -/** Admin Queue VF Reset opcode */ -#define INTELXL_ADMIN_VF_RESET 0x00000002 - -/** Admin Queue VF Get Resources opcode */ -#define INTELXL_ADMIN_VF_GET_RESOURCES 0x00000003 - -/** Admin Queue VF Get Resources data buffer */ -struct intelxl_admin_vf_get_resources_buffer { - /** Reserved */ - uint8_t reserved_a[20]; - /** VSI switching element ID */ - uint16_t vsi; - /** Reserved */ - uint8_t reserved_b[8]; - /** MAC address */ - uint8_t mac[ETH_ALEN]; -} __attribute__ (( packed )); - -/** Admin Queue VF Status Change Event opcode */ -#define INTELXL_ADMIN_VF_STATUS 0x00000011 - -/** Link status change event type */ -#define INTELXL_ADMIN_VF_STATUS_LINK 0x00000001 - -/** Link status change event data */ -struct intelxl_admin_vf_status_link { - /** Link speed */ - uint32_t speed; - /** Link status */ - uint8_t status; - /** Reserved */ - uint8_t reserved[3]; -} __attribute__ (( packed )); - -/** Admin Queue VF Status Change Event data buffer */ -struct intelxl_admin_vf_status_buffer { - /** Event type */ - uint32_t event; - /** Event data */ - union { - /** Link change event data */ - struct intelxl_admin_vf_status_link link; - } data; - /** Reserved */ - uint8_t reserved[4]; -} __attribute__ (( packed )); - -/** Admin Queue VF Configure Queues opcode */ -#define INTELXL_ADMIN_VF_CONFIGURE 0x00000006 - -/** Admin Queue VF Configure Queues data buffer */ -struct intelxl_admin_vf_configure_buffer { - /** VSI switching element ID */ - uint16_t vsi; - /** Number of queue pairs */ - uint16_t count; - /** Reserved */ - uint8_t reserved_a[4]; - /** Transmit queue */ - struct { - /** VSI switching element ID */ - uint16_t vsi; - /** Queue ID */ - uint16_t id; - /** Queue count */ - uint16_t count; - /** Reserved */ - uint8_t reserved_a[2]; - /** Base address */ - uint64_t base; - /** Reserved */ - uint8_t reserved_b[8]; - } __attribute__ (( packed )) tx; - /** Receive queue */ - struct { - /** VSI switching element ID */ - uint16_t vsi; - /** Queue ID */ - uint16_t id; - /** Queue count */ - uint32_t count; - /** Reserved */ - uint8_t reserved_a[4]; - /** Data buffer length */ - uint32_t len; - /** Maximum frame size */ - uint32_t mfs; - /** Reserved */ - uint8_t reserved_b[4]; - /** Base address */ - uint64_t base; - /** Reserved */ - uint8_t reserved_c[8]; - } __attribute__ (( packed )) rx; - /** Reserved - * - * This field exists only due to a bug in the PF driver's - * message validation logic, which causes it to miscalculate - * the expected message length. - */ - uint8_t reserved_b[64]; -} __attribute__ (( packed )); - -/** Admin Queue VF IRQ Map opcode */ -#define INTELXL_ADMIN_VF_IRQ_MAP 0x00000007 - -/** Admin Queue VF IRQ Map data buffer */ -struct intelxl_admin_vf_irq_map_buffer { - /** Number of interrupt vectors */ - uint16_t count; - /** VSI switching element ID */ - uint16_t vsi; - /** Interrupt vector ID */ - uint16_t vec; - /** Receive queue bitmap */ - uint16_t rxmap; - /** Transmit queue bitmap */ - uint16_t txmap; - /** Receive interrupt throttling index */ - uint16_t rxitr; - /** Transmit interrupt throttling index */ - uint16_t txitr; - /** Reserved - * - * This field exists only due to a bug in the PF driver's - * message validation logic, which causes it to miscalculate - * the expected message length. - */ - uint8_t reserved[12]; -} __attribute__ (( packed )); - -/** Admin Queue VF Enable Queues opcode */ -#define INTELXL_ADMIN_VF_ENABLE 0x00000008 - -/** Admin Queue VF Disable Queues opcode */ -#define INTELXL_ADMIN_VF_DISABLE 0x00000009 - -/** Admin Queue VF Enable/Disable Queues data buffer */ -struct intelxl_admin_vf_queues_buffer { - /** VSI switching element ID */ - uint16_t vsi; - /** Reserved */ - uint8_t reserved[2]; - /** Receive queue bitmask */ - uint32_t rx; - /** Transmit queue bitmask */ - uint32_t tx; -} __attribute__ (( packed )); - -/** Admin Queue VF Configure Promiscuous Mode opcode */ -#define INTELXL_ADMIN_VF_PROMISC 0x0000000e - -/** Admin Queue VF Configure Promiscuous Mode data buffer */ -struct intelxl_admin_vf_promisc_buffer { - /** VSI switching element ID */ - uint16_t vsi; - /** Flags */ - uint16_t flags; -} __attribute__ (( packed )); - /** Admin queue command parameters */ union intelxl_admin_params { /** Additional data buffer command parameters */ @@ -514,20 +337,6 @@ union intelxl_admin_buffer { struct intelxl_admin_switch_buffer sw; /** Get VSI Parameters data buffer */ struct intelxl_admin_vsi_buffer vsi; - /** VF Version data buffer */ - struct intelxl_admin_vf_version_buffer ver; - /** VF Get Resources data buffer */ - struct intelxl_admin_vf_get_resources_buffer res; - /** VF Status Change Event data buffer */ - struct intelxl_admin_vf_status_buffer stat; - /** VF Configure Queues data buffer */ - struct intelxl_admin_vf_configure_buffer cfg; - /** VF Enable/Disable Queues data buffer */ - struct intelxl_admin_vf_queues_buffer queues; - /** VF Configure Promiscuous Mode data buffer */ - struct intelxl_admin_vf_promisc_buffer promisc; - /*** VF IRQ Map data buffer */ - struct intelxl_admin_vf_irq_map_buffer irq; /** Alignment padding */ uint8_t pad[INTELXL_ALIGN]; } __attribute__ (( packed )); @@ -542,15 +351,10 @@ struct intelxl_admin_descriptor { uint16_t len; /** Return value */ uint16_t ret; - /** Opaque cookie / VF opcode */ - union { - /** Cookie */ - uint32_t cookie; - /** VF opcode */ - uint32_t vopcode; - }; - /** VF return value */ - int32_t vret; + /** Opaque cookie */ + uint32_t cookie; + /** Reserved */ + uint8_t reserved[4]; /** Parameters */ union intelxl_admin_params params; } __attribute__ (( packed )); @@ -611,12 +415,6 @@ intelxl_init_admin ( struct intelxl_admin *admin, unsigned int base, /** Admin queue API major version */ #define INTELXL_ADMIN_API_MAJOR 1 -/** Admin queue VF API major version */ -#define INTELXL_ADMIN_VF_API_MAJOR 1 - -/** Admin queue VF API minor version */ -#define INTELXL_ADMIN_VF_API_MINOR 0 - /****************************************************************************** * * Transmit and receive queue context diff --git a/src/drivers/net/intelxlvf.c b/src/drivers/net/intelxlvf.c index 8774b11..3567be4 100644 --- a/src/drivers/net/intelxlvf.c +++ b/src/drivers/net/intelxlvf.c @@ -109,13 +109,13 @@ static int intelxlvf_reset_wait_active ( struct intelxl_nic *intelxl ) { * @ret rc Return status code */ static int intelxlvf_reset_admin ( struct intelxl_nic *intelxl ) { - struct intelxl_admin_descriptor *cmd; + struct intelxlvf_admin_descriptor *cmd; int rc; /* Populate descriptor */ - cmd = intelxl_admin_command_descriptor ( intelxl ); - cmd->opcode = cpu_to_le16 ( INTELXL_ADMIN_SEND_TO_PF ); - cmd->vopcode = cpu_to_le32 ( INTELXL_ADMIN_VF_RESET ); + cmd = intelxlvf_admin_command_descriptor ( intelxl ); + cmd->opcode = cpu_to_le16 ( INTELXLVF_ADMIN_SEND_TO_PF ); + cmd->vopcode = cpu_to_le32 ( INTELXLVF_ADMIN_RESET ); /* Issue command */ if ( ( rc = intelxl_admin_command ( intelxl ) ) != 0 ) @@ -173,13 +173,15 @@ static const struct intelxl_admin_offsets intelxlvf_admin_event_offsets = { static int intelxlvf_admin_command ( struct net_device *netdev ) { struct intelxl_nic *intelxl = netdev->priv; struct intelxl_admin *admin = &intelxl->command; - struct intelxl_admin_descriptor *cmd; + struct intelxl_admin_descriptor *xlcmd; + struct intelxlvf_admin_descriptor *cmd; unsigned int i; int rc; /* Populate descriptor */ - cmd = &admin->desc[ admin->index % INTELXL_ADMIN_NUM_DESC ]; - cmd->opcode = cpu_to_le16 ( INTELXL_ADMIN_SEND_TO_PF ); + xlcmd = &admin->desc[ admin->index % INTELXL_ADMIN_NUM_DESC ]; + cmd = container_of ( xlcmd, struct intelxlvf_admin_descriptor, xl ); + cmd->opcode = cpu_to_le16 ( INTELXLVF_ADMIN_SEND_TO_PF ); /* Record opcode */ intelxl->vopcode = le32_to_cpu ( cmd->vopcode ); @@ -222,7 +224,7 @@ static int intelxlvf_admin_command ( struct net_device *netdev ) { * @v link Link status */ static void intelxlvf_admin_link ( struct net_device *netdev, - struct intelxl_admin_vf_status_link *link ) { + struct intelxlvf_admin_status_link *link ) { struct intelxl_nic *intelxl = netdev->priv; DBGC ( intelxl, "INTELXL %p link %#02x speed %#02x\n", intelxl, @@ -244,12 +246,12 @@ static void intelxlvf_admin_link ( struct net_device *netdev, */ static void intelxlvf_admin_status ( struct net_device *netdev, - struct intelxl_admin_vf_status_buffer *stat ) { + struct intelxlvf_admin_status_buffer *stat ) { struct intelxl_nic *intelxl = netdev->priv; /* Handle event */ switch ( stat->event ) { - case cpu_to_le32 ( INTELXL_ADMIN_VF_STATUS_LINK ): + case cpu_to_le32 ( INTELXLVF_ADMIN_STATUS_LINK ): intelxlvf_admin_link ( netdev, &stat->data.link ); break; default: @@ -264,19 +266,23 @@ intelxlvf_admin_status ( struct net_device *netdev, * Handle admin event * * @v netdev Network device - * @v evt Admin queue event descriptor - * @v buf Admin queue event data buffer + * @v xlevt Admin queue event descriptor + * @v xlbuf Admin queue event data buffer */ static void intelxlvf_admin_event ( struct net_device *netdev, - struct intelxl_admin_descriptor *evt, - union intelxl_admin_buffer *buf ) { + struct intelxl_admin_descriptor *xlevt, + union intelxl_admin_buffer *xlbuf ) { struct intelxl_nic *intelxl = netdev->priv; struct intelxl_admin *admin = &intelxl->command; + struct intelxlvf_admin_descriptor *evt = + container_of ( xlevt, struct intelxlvf_admin_descriptor, xl ); + union intelxlvf_admin_buffer *buf = + container_of ( xlbuf, union intelxlvf_admin_buffer, xl ); unsigned int vopcode; unsigned int index; /* Ignore unrecognised events */ - if ( evt->opcode != cpu_to_le16 ( INTELXL_ADMIN_SEND_TO_VF ) ) { + if ( evt->opcode != cpu_to_le16 ( INTELXLVF_ADMIN_SEND_TO_VF ) ) { DBGC ( intelxl, "INTELXL %p unrecognised event opcode " "%#04x\n", intelxl, le16_to_cpu ( evt->opcode ) ); return; @@ -303,7 +309,7 @@ static void intelxlvf_admin_event ( struct net_device *netdev, /* Handle unsolicited events */ switch ( vopcode ) { - case INTELXL_ADMIN_VF_STATUS: + case INTELXLVF_ADMIN_STATUS: intelxlvf_admin_status ( netdev, &buf->stat ); break; default: @@ -325,19 +331,19 @@ static void intelxlvf_admin_event ( struct net_device *netdev, */ static int intelxlvf_admin_version ( struct net_device *netdev ) { struct intelxl_nic *intelxl = netdev->priv; - struct intelxl_admin_descriptor *cmd; - union intelxl_admin_buffer *buf; + struct intelxlvf_admin_descriptor *cmd; + union intelxlvf_admin_buffer *buf; unsigned int api; int rc; /* Populate descriptor */ - cmd = intelxl_admin_command_descriptor ( intelxl ); - cmd->vopcode = cpu_to_le32 ( INTELXL_ADMIN_VF_VERSION ); + cmd = intelxlvf_admin_command_descriptor ( intelxl ); + cmd->vopcode = cpu_to_le32 ( INTELXLVF_ADMIN_VERSION ); cmd->flags = cpu_to_le16 ( INTELXL_ADMIN_FL_RD | INTELXL_ADMIN_FL_BUF ); cmd->len = cpu_to_le16 ( sizeof ( buf->ver ) ); - buf = intelxl_admin_command_buffer ( intelxl ); - buf->ver.major = cpu_to_le32 ( INTELXL_ADMIN_VF_API_MAJOR ); - buf->ver.minor = cpu_to_le32 ( INTELXL_ADMIN_VF_API_MINOR ); + buf = intelxlvf_admin_command_buffer ( intelxl ); + buf->ver.major = cpu_to_le32 ( INTELXLVF_ADMIN_API_MAJOR ); + buf->ver.minor = cpu_to_le32 ( INTELXLVF_ADMIN_API_MINOR ); /* Issue command */ if ( ( rc = intelxlvf_admin_command ( netdev ) ) != 0 ) @@ -347,7 +353,7 @@ static int intelxlvf_admin_version ( struct net_device *netdev ) { intelxl, api, le32_to_cpu ( buf->ver.minor ) ); /* Check for API compatibility */ - if ( api > INTELXL_ADMIN_VF_API_MAJOR ) { + if ( api > INTELXLVF_ADMIN_API_MAJOR ) { DBGC ( intelxl, "INTELXL %p unsupported API v%d\n", intelxl, api ); return -ENOTSUP; @@ -364,14 +370,14 @@ static int intelxlvf_admin_version ( struct net_device *netdev ) { */ static int intelxlvf_admin_get_resources ( struct net_device *netdev ) { struct intelxl_nic *intelxl = netdev->priv; - struct intelxl_admin_descriptor *cmd; - union intelxl_admin_buffer *buf; + struct intelxlvf_admin_descriptor *cmd; + union intelxlvf_admin_buffer *buf; int rc; /* Populate descriptor */ - cmd = intelxl_admin_command_descriptor ( intelxl ); - cmd->vopcode = cpu_to_le32 ( INTELXL_ADMIN_VF_GET_RESOURCES ); - buf = intelxl_admin_command_buffer ( intelxl ); + cmd = intelxlvf_admin_command_descriptor ( intelxl ); + cmd->vopcode = cpu_to_le32 ( INTELXLVF_ADMIN_GET_RESOURCES ); + buf = intelxlvf_admin_command_buffer ( intelxl ); /* Issue command */ if ( ( rc = intelxlvf_admin_command ( netdev ) ) != 0 ) @@ -400,16 +406,16 @@ static int intelxlvf_admin_get_resources ( struct net_device *netdev ) { */ static int intelxlvf_admin_configure ( struct net_device *netdev ) { struct intelxl_nic *intelxl = netdev->priv; - struct intelxl_admin_descriptor *cmd; - union intelxl_admin_buffer *buf; + struct intelxlvf_admin_descriptor *cmd; + union intelxlvf_admin_buffer *buf; int rc; /* Populate descriptor */ - cmd = intelxl_admin_command_descriptor ( intelxl ); - cmd->vopcode = cpu_to_le32 ( INTELXL_ADMIN_VF_CONFIGURE ); + cmd = intelxlvf_admin_command_descriptor ( intelxl ); + cmd->vopcode = cpu_to_le32 ( INTELXLVF_ADMIN_CONFIGURE ); cmd->flags = cpu_to_le16 ( INTELXL_ADMIN_FL_RD | INTELXL_ADMIN_FL_BUF ); cmd->len = cpu_to_le16 ( sizeof ( buf->cfg ) ); - buf = intelxl_admin_command_buffer ( intelxl ); + buf = intelxlvf_admin_command_buffer ( intelxl ); buf->cfg.vsi = cpu_to_le16 ( intelxl->vsi ); buf->cfg.count = cpu_to_le16 ( 1 ); buf->cfg.tx.vsi = cpu_to_le16 ( intelxl->vsi ); @@ -438,16 +444,16 @@ static int intelxlvf_admin_configure ( struct net_device *netdev ) { */ static int intelxlvf_admin_irq_map ( struct net_device *netdev ) { struct intelxl_nic *intelxl = netdev->priv; - struct intelxl_admin_descriptor *cmd; - union intelxl_admin_buffer *buf; + struct intelxlvf_admin_descriptor *cmd; + union intelxlvf_admin_buffer *buf; int rc; /* Populate descriptor */ - cmd = intelxl_admin_command_descriptor ( intelxl ); - cmd->vopcode = cpu_to_le32 ( INTELXL_ADMIN_VF_IRQ_MAP ); + cmd = intelxlvf_admin_command_descriptor ( intelxl ); + cmd->vopcode = cpu_to_le32 ( INTELXLVF_ADMIN_IRQ_MAP ); cmd->flags = cpu_to_le16 ( INTELXL_ADMIN_FL_RD | INTELXL_ADMIN_FL_BUF ); cmd->len = cpu_to_le16 ( sizeof ( buf->irq ) ); - buf = intelxl_admin_command_buffer ( intelxl ); + buf = intelxlvf_admin_command_buffer ( intelxl ); buf->irq.count = cpu_to_le16 ( 1 ); buf->irq.vsi = cpu_to_le16 ( intelxl->vsi ); buf->irq.vec = cpu_to_le16 ( INTELXLVF_MSIX_VECTOR ); @@ -470,17 +476,17 @@ static int intelxlvf_admin_irq_map ( struct net_device *netdev ) { */ static int intelxlvf_admin_queues ( struct net_device *netdev, int enable ) { struct intelxl_nic *intelxl = netdev->priv; - struct intelxl_admin_descriptor *cmd; - union intelxl_admin_buffer *buf; + struct intelxlvf_admin_descriptor *cmd; + union intelxlvf_admin_buffer *buf; int rc; /* Populate descriptor */ - cmd = intelxl_admin_command_descriptor ( intelxl ); - cmd->vopcode = ( enable ? cpu_to_le32 ( INTELXL_ADMIN_VF_ENABLE ) : - cpu_to_le32 ( INTELXL_ADMIN_VF_DISABLE ) ); + cmd = intelxlvf_admin_command_descriptor ( intelxl ); + cmd->vopcode = ( enable ? cpu_to_le32 ( INTELXLVF_ADMIN_ENABLE ) : + cpu_to_le32 ( INTELXLVF_ADMIN_DISABLE ) ); cmd->flags = cpu_to_le16 ( INTELXL_ADMIN_FL_RD | INTELXL_ADMIN_FL_BUF ); cmd->len = cpu_to_le16 ( sizeof ( buf->queues ) ); - buf = intelxl_admin_command_buffer ( intelxl ); + buf = intelxlvf_admin_command_buffer ( intelxl ); buf->queues.vsi = cpu_to_le16 ( intelxl->vsi ); buf->queues.rx = cpu_to_le32 ( 1 ); buf->queues.tx = cpu_to_le32 ( 1 ); @@ -500,16 +506,16 @@ static int intelxlvf_admin_queues ( struct net_device *netdev, int enable ) { */ static int intelxlvf_admin_promisc ( struct net_device *netdev ) { struct intelxl_nic *intelxl = netdev->priv; - struct intelxl_admin_descriptor *cmd; - union intelxl_admin_buffer *buf; + struct intelxlvf_admin_descriptor *cmd; + union intelxlvf_admin_buffer *buf; int rc; /* Populate descriptor */ - cmd = intelxl_admin_command_descriptor ( intelxl ); - cmd->vopcode = cpu_to_le32 ( INTELXL_ADMIN_VF_PROMISC ); + cmd = intelxlvf_admin_command_descriptor ( intelxl ); + cmd->vopcode = cpu_to_le32 ( INTELXLVF_ADMIN_PROMISC ); cmd->flags = cpu_to_le16 ( INTELXL_ADMIN_FL_RD | INTELXL_ADMIN_FL_BUF ); cmd->len = cpu_to_le16 ( sizeof ( buf->promisc ) ); - buf = intelxl_admin_command_buffer ( intelxl ); + buf = intelxlvf_admin_command_buffer ( intelxl ); buf->promisc.vsi = cpu_to_le16 ( intelxl->vsi ); buf->promisc.flags = cpu_to_le16 ( INTELXL_ADMIN_PROMISC_FL_UNICAST | INTELXL_ADMIN_PROMISC_FL_MULTICAST ); diff --git a/src/drivers/net/intelxlvf.h b/src/drivers/net/intelxlvf.h index 58ade11..5c22275 100644 --- a/src/drivers/net/intelxlvf.h +++ b/src/drivers/net/intelxlvf.h @@ -70,6 +70,263 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); /** Maximum time to wait for a VF admin request to complete */ #define INTELXLVF_ADMIN_MAX_WAIT_MS 2000 +/** Admin queue Send Message to PF command */ +#define INTELXLVF_ADMIN_SEND_TO_PF 0x0801 + +/** Admin queue Send Message to VF command */ +#define INTELXLVF_ADMIN_SEND_TO_VF 0x0802 + +/** Admin Queue VF Version opcode */ +#define INTELXLVF_ADMIN_VERSION 0x00000001 + +/** Admin Queue VF Version data buffer */ +struct intelxlvf_admin_version_buffer { + /** Major version */ + uint32_t major; + /** Minor version */ + uint32_t minor; +} __attribute__ (( packed )); + +/** Admin queue VF API major version */ +#define INTELXLVF_ADMIN_API_MAJOR 1 + +/** Admin queue VF API minor version */ +#define INTELXLVF_ADMIN_API_MINOR 0 + +/** Admin Queue VF Reset opcode */ +#define INTELXLVF_ADMIN_RESET 0x00000002 + +/** Admin Queue VF Get Resources opcode */ +#define INTELXLVF_ADMIN_GET_RESOURCES 0x00000003 + +/** Admin Queue VF Get Resources data buffer */ +struct intelxlvf_admin_get_resources_buffer { + /** Reserved */ + uint8_t reserved_a[20]; + /** VSI switching element ID */ + uint16_t vsi; + /** Reserved */ + uint8_t reserved_b[8]; + /** MAC address */ + uint8_t mac[ETH_ALEN]; +} __attribute__ (( packed )); + +/** Admin Queue VF Status Change Event opcode */ +#define INTELXLVF_ADMIN_STATUS 0x00000011 + +/** Link status change event type */ +#define INTELXLVF_ADMIN_STATUS_LINK 0x00000001 + +/** Link status change event data */ +struct intelxlvf_admin_status_link { + /** Link speed */ + uint32_t speed; + /** Link status */ + uint8_t status; + /** Reserved */ + uint8_t reserved[3]; +} __attribute__ (( packed )); + +/** Admin Queue VF Status Change Event data buffer */ +struct intelxlvf_admin_status_buffer { + /** Event type */ + uint32_t event; + /** Event data */ + union { + /** Link change event data */ + struct intelxlvf_admin_status_link link; + } data; + /** Reserved */ + uint8_t reserved[4]; +} __attribute__ (( packed )); + +/** Admin Queue VF Configure Queues opcode */ +#define INTELXLVF_ADMIN_CONFIGURE 0x00000006 + +/** Admin Queue VF Configure Queues data buffer */ +struct intelxlvf_admin_configure_buffer { + /** VSI switching element ID */ + uint16_t vsi; + /** Number of queue pairs */ + uint16_t count; + /** Reserved */ + uint8_t reserved_a[4]; + /** Transmit queue */ + struct { + /** VSI switching element ID */ + uint16_t vsi; + /** Queue ID */ + uint16_t id; + /** Queue count */ + uint16_t count; + /** Reserved */ + uint8_t reserved_a[2]; + /** Base address */ + uint64_t base; + /** Reserved */ + uint8_t reserved_b[8]; + } __attribute__ (( packed )) tx; + /** Receive queue */ + struct { + /** VSI switching element ID */ + uint16_t vsi; + /** Queue ID */ + uint16_t id; + /** Queue count */ + uint32_t count; + /** Reserved */ + uint8_t reserved_a[4]; + /** Data buffer length */ + uint32_t len; + /** Maximum frame size */ + uint32_t mfs; + /** Reserved */ + uint8_t reserved_b[4]; + /** Base address */ + uint64_t base; + /** Reserved */ + uint8_t reserved_c[8]; + } __attribute__ (( packed )) rx; + /** Reserved + * + * This field exists only due to a bug in the PF driver's + * message validation logic, which causes it to miscalculate + * the expected message length. + */ + uint8_t reserved_b[64]; +} __attribute__ (( packed )); + +/** Admin Queue VF IRQ Map opcode */ +#define INTELXLVF_ADMIN_IRQ_MAP 0x00000007 + +/** Admin Queue VF IRQ Map data buffer */ +struct intelxlvf_admin_irq_map_buffer { + /** Number of interrupt vectors */ + uint16_t count; + /** VSI switching element ID */ + uint16_t vsi; + /** Interrupt vector ID */ + uint16_t vec; + /** Receive queue bitmap */ + uint16_t rxmap; + /** Transmit queue bitmap */ + uint16_t txmap; + /** Receive interrupt throttling index */ + uint16_t rxitr; + /** Transmit interrupt throttling index */ + uint16_t txitr; + /** Reserved + * + * This field exists only due to a bug in the PF driver's + * message validation logic, which causes it to miscalculate + * the expected message length. + */ + uint8_t reserved[12]; +} __attribute__ (( packed )); + +/** Admin Queue VF Enable Queues opcode */ +#define INTELXLVF_ADMIN_ENABLE 0x00000008 + +/** Admin Queue VF Disable Queues opcode */ +#define INTELXLVF_ADMIN_DISABLE 0x00000009 + +/** Admin Queue VF Enable/Disable Queues data buffer */ +struct intelxlvf_admin_queues_buffer { + /** VSI switching element ID */ + uint16_t vsi; + /** Reserved */ + uint8_t reserved[2]; + /** Receive queue bitmask */ + uint32_t rx; + /** Transmit queue bitmask */ + uint32_t tx; +} __attribute__ (( packed )); + +/** Admin Queue VF Configure Promiscuous Mode opcode */ +#define INTELXLVF_ADMIN_PROMISC 0x0000000e + +/** Admin Queue VF Configure Promiscuous Mode data buffer */ +struct intelxlvf_admin_promisc_buffer { + /** VSI switching element ID */ + uint16_t vsi; + /** Flags */ + uint16_t flags; +} __attribute__ (( packed )); + +/** Admin queue data buffer */ +union intelxlvf_admin_buffer { + /** Original 40 Gigabit Ethernet data buffer */ + union intelxl_admin_buffer xl; + /** VF Version data buffer */ + struct intelxlvf_admin_version_buffer ver; + /** VF Get Resources data buffer */ + struct intelxlvf_admin_get_resources_buffer res; + /** VF Status Change Event data buffer */ + struct intelxlvf_admin_status_buffer stat; + /** VF Configure Queues data buffer */ + struct intelxlvf_admin_configure_buffer cfg; + /** VF Enable/Disable Queues data buffer */ + struct intelxlvf_admin_queues_buffer queues; + /** VF Configure Promiscuous Mode data buffer */ + struct intelxlvf_admin_promisc_buffer promisc; + /** VF IRQ Map data buffer */ + struct intelxlvf_admin_irq_map_buffer irq; +} __attribute__ (( packed )); + +/** Admin queue descriptor */ +struct intelxlvf_admin_descriptor { + /** Transparent union */ + union { + /** Original 40 Gigabit Ethernet descriptor */ + struct intelxl_admin_descriptor xl; + /** Transparent struct */ + struct { + /** Flags */ + uint16_t flags; + /** Opcode */ + uint16_t opcode; + /** Data length */ + uint16_t len; + /** Return value */ + uint16_t ret; + /** VF opcode */ + uint32_t vopcode; + /** VF return value */ + int32_t vret; + /** Parameters */ + union intelxl_admin_params params; + } __attribute__ (( packed )); + } __attribute__ (( packed )); +} __attribute__ (( packed )); + +/** + * Get next admin command queue descriptor + * + * @v intelxl Intel device + * @ret cmd Command descriptor + */ +struct intelxlvf_admin_descriptor * +intelxlvf_admin_command_descriptor ( struct intelxl_nic *intelxl ) { + struct intelxl_admin_descriptor *xlcmd = + intelxl_admin_command_descriptor ( intelxl ); + + return container_of ( xlcmd, struct intelxlvf_admin_descriptor, xl ); +} + +/** + * Get next admin command queue data buffer + * + * @v intelxl Intel device + * @ret buf Data buffer + */ +static inline __attribute__ (( always_inline )) union intelxlvf_admin_buffer * +intelxlvf_admin_command_buffer ( struct intelxl_nic *intelxl ) { + union intelxl_admin_buffer *xlbuf = + intelxl_admin_command_buffer ( intelxl ); + + return container_of ( xlbuf, union intelxlvf_admin_buffer, xl ); +} + /** VF Reset Status Register */ #define INTELXLVF_VFGEN_RSTAT 0x8800 #define INTELXLVF_VFGEN_RSTAT_VFR_STATE(x) ( (x) & 0x3 ) |