[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>
pull/697/head^2
Michael Brown 2022-08-08 14:57:40 +01:00
parent c220b93f31
commit fb69d14002
4 changed files with 320 additions and 259 deletions

View File

@ -360,8 +360,8 @@ int intelxl_admin_command ( struct intelxl_nic *intelxl ) {
buf = &admin->buf[ index % INTELXL_ADMIN_NUM_DESC ]; buf = &admin->buf[ index % INTELXL_ADMIN_NUM_DESC ];
DBGC2 ( intelxl, "INTELXL %p admin command %#x opcode %#04x", DBGC2 ( intelxl, "INTELXL %p admin command %#x opcode %#04x",
intelxl, index, le16_to_cpu ( cmd->opcode ) ); intelxl, index, le16_to_cpu ( cmd->opcode ) );
if ( cmd->vopcode ) if ( cmd->cookie )
DBGC2 ( intelxl, "/%#08x", le32_to_cpu ( cmd->vopcode ) ); DBGC2 ( intelxl, "/%#08x", le32_to_cpu ( cmd->cookie ) );
DBGC2 ( intelxl, ":\n" ); DBGC2 ( intelxl, ":\n" );
/* Sanity checks */ /* Sanity checks */
@ -378,7 +378,7 @@ int intelxl_admin_command ( struct intelxl_nic *intelxl ) {
} }
/* Populate cookie, if not being (ab)used for VF opcode */ /* Populate cookie, if not being (ab)used for VF opcode */
if ( ! cmd->vopcode ) if ( ! cmd->cookie )
cmd->cookie = cpu_to_le32 ( index ); cmd->cookie = cpu_to_le32 ( index );
/* Record cookie */ /* Record cookie */

View File

@ -305,183 +305,6 @@ struct intelxl_admin_link_params {
/** Link is up */ /** Link is up */
#define INTELXL_ADMIN_LINK_UP 0x01 #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 */ /** Admin queue command parameters */
union intelxl_admin_params { union intelxl_admin_params {
/** Additional data buffer command parameters */ /** Additional data buffer command parameters */
@ -514,20 +337,6 @@ union intelxl_admin_buffer {
struct intelxl_admin_switch_buffer sw; struct intelxl_admin_switch_buffer sw;
/** Get VSI Parameters data buffer */ /** Get VSI Parameters data buffer */
struct intelxl_admin_vsi_buffer vsi; 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 */ /** Alignment padding */
uint8_t pad[INTELXL_ALIGN]; uint8_t pad[INTELXL_ALIGN];
} __attribute__ (( packed )); } __attribute__ (( packed ));
@ -542,15 +351,10 @@ struct intelxl_admin_descriptor {
uint16_t len; uint16_t len;
/** Return value */ /** Return value */
uint16_t ret; uint16_t ret;
/** Opaque cookie / VF opcode */ /** Opaque cookie */
union {
/** Cookie */
uint32_t cookie; uint32_t cookie;
/** VF opcode */ /** Reserved */
uint32_t vopcode; uint8_t reserved[4];
};
/** VF return value */
int32_t vret;
/** Parameters */ /** Parameters */
union intelxl_admin_params params; union intelxl_admin_params params;
} __attribute__ (( packed )); } __attribute__ (( packed ));
@ -611,12 +415,6 @@ intelxl_init_admin ( struct intelxl_admin *admin, unsigned int base,
/** Admin queue API major version */ /** Admin queue API major version */
#define INTELXL_ADMIN_API_MAJOR 1 #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 * Transmit and receive queue context

View File

@ -109,13 +109,13 @@ static int intelxlvf_reset_wait_active ( struct intelxl_nic *intelxl ) {
* @ret rc Return status code * @ret rc Return status code
*/ */
static int intelxlvf_reset_admin ( struct intelxl_nic *intelxl ) { static int intelxlvf_reset_admin ( struct intelxl_nic *intelxl ) {
struct intelxl_admin_descriptor *cmd; struct intelxlvf_admin_descriptor *cmd;
int rc; int rc;
/* Populate descriptor */ /* Populate descriptor */
cmd = intelxl_admin_command_descriptor ( intelxl ); cmd = intelxlvf_admin_command_descriptor ( intelxl );
cmd->opcode = cpu_to_le16 ( INTELXL_ADMIN_SEND_TO_PF ); cmd->opcode = cpu_to_le16 ( INTELXLVF_ADMIN_SEND_TO_PF );
cmd->vopcode = cpu_to_le32 ( INTELXL_ADMIN_VF_RESET ); cmd->vopcode = cpu_to_le32 ( INTELXLVF_ADMIN_RESET );
/* Issue command */ /* Issue command */
if ( ( rc = intelxl_admin_command ( intelxl ) ) != 0 ) 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 ) { static int intelxlvf_admin_command ( struct net_device *netdev ) {
struct intelxl_nic *intelxl = netdev->priv; struct intelxl_nic *intelxl = netdev->priv;
struct intelxl_admin *admin = &intelxl->command; struct intelxl_admin *admin = &intelxl->command;
struct intelxl_admin_descriptor *cmd; struct intelxl_admin_descriptor *xlcmd;
struct intelxlvf_admin_descriptor *cmd;
unsigned int i; unsigned int i;
int rc; int rc;
/* Populate descriptor */ /* Populate descriptor */
cmd = &admin->desc[ admin->index % INTELXL_ADMIN_NUM_DESC ]; xlcmd = &admin->desc[ admin->index % INTELXL_ADMIN_NUM_DESC ];
cmd->opcode = cpu_to_le16 ( INTELXL_ADMIN_SEND_TO_PF ); cmd = container_of ( xlcmd, struct intelxlvf_admin_descriptor, xl );
cmd->opcode = cpu_to_le16 ( INTELXLVF_ADMIN_SEND_TO_PF );
/* Record opcode */ /* Record opcode */
intelxl->vopcode = le32_to_cpu ( cmd->vopcode ); intelxl->vopcode = le32_to_cpu ( cmd->vopcode );
@ -222,7 +224,7 @@ static int intelxlvf_admin_command ( struct net_device *netdev ) {
* @v link Link status * @v link Link status
*/ */
static void intelxlvf_admin_link ( struct net_device *netdev, 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; struct intelxl_nic *intelxl = netdev->priv;
DBGC ( intelxl, "INTELXL %p link %#02x speed %#02x\n", intelxl, 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 static void
intelxlvf_admin_status ( struct net_device *netdev, 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; struct intelxl_nic *intelxl = netdev->priv;
/* Handle event */ /* Handle event */
switch ( stat->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 ); intelxlvf_admin_link ( netdev, &stat->data.link );
break; break;
default: default:
@ -264,19 +266,23 @@ intelxlvf_admin_status ( struct net_device *netdev,
* Handle admin event * Handle admin event
* *
* @v netdev Network device * @v netdev Network device
* @v evt Admin queue event descriptor * @v xlevt Admin queue event descriptor
* @v buf Admin queue event data buffer * @v xlbuf Admin queue event data buffer
*/ */
static void intelxlvf_admin_event ( struct net_device *netdev, static void intelxlvf_admin_event ( struct net_device *netdev,
struct intelxl_admin_descriptor *evt, struct intelxl_admin_descriptor *xlevt,
union intelxl_admin_buffer *buf ) { union intelxl_admin_buffer *xlbuf ) {
struct intelxl_nic *intelxl = netdev->priv; struct intelxl_nic *intelxl = netdev->priv;
struct intelxl_admin *admin = &intelxl->command; 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 vopcode;
unsigned int index; unsigned int index;
/* Ignore unrecognised events */ /* 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 " DBGC ( intelxl, "INTELXL %p unrecognised event opcode "
"%#04x\n", intelxl, le16_to_cpu ( evt->opcode ) ); "%#04x\n", intelxl, le16_to_cpu ( evt->opcode ) );
return; return;
@ -303,7 +309,7 @@ static void intelxlvf_admin_event ( struct net_device *netdev,
/* Handle unsolicited events */ /* Handle unsolicited events */
switch ( vopcode ) { switch ( vopcode ) {
case INTELXL_ADMIN_VF_STATUS: case INTELXLVF_ADMIN_STATUS:
intelxlvf_admin_status ( netdev, &buf->stat ); intelxlvf_admin_status ( netdev, &buf->stat );
break; break;
default: default:
@ -325,19 +331,19 @@ static void intelxlvf_admin_event ( struct net_device *netdev,
*/ */
static int intelxlvf_admin_version ( struct net_device *netdev ) { static int intelxlvf_admin_version ( struct net_device *netdev ) {
struct intelxl_nic *intelxl = netdev->priv; struct intelxl_nic *intelxl = netdev->priv;
struct intelxl_admin_descriptor *cmd; struct intelxlvf_admin_descriptor *cmd;
union intelxl_admin_buffer *buf; union intelxlvf_admin_buffer *buf;
unsigned int api; unsigned int api;
int rc; int rc;
/* Populate descriptor */ /* Populate descriptor */
cmd = intelxl_admin_command_descriptor ( intelxl ); cmd = intelxlvf_admin_command_descriptor ( intelxl );
cmd->vopcode = cpu_to_le32 ( INTELXL_ADMIN_VF_VERSION ); cmd->vopcode = cpu_to_le32 ( INTELXLVF_ADMIN_VERSION );
cmd->flags = cpu_to_le16 ( INTELXL_ADMIN_FL_RD | INTELXL_ADMIN_FL_BUF ); cmd->flags = cpu_to_le16 ( INTELXL_ADMIN_FL_RD | INTELXL_ADMIN_FL_BUF );
cmd->len = cpu_to_le16 ( sizeof ( buf->ver ) ); cmd->len = cpu_to_le16 ( sizeof ( buf->ver ) );
buf = intelxl_admin_command_buffer ( intelxl ); buf = intelxlvf_admin_command_buffer ( intelxl );
buf->ver.major = cpu_to_le32 ( INTELXL_ADMIN_VF_API_MAJOR ); buf->ver.major = cpu_to_le32 ( INTELXLVF_ADMIN_API_MAJOR );
buf->ver.minor = cpu_to_le32 ( INTELXL_ADMIN_VF_API_MINOR ); buf->ver.minor = cpu_to_le32 ( INTELXLVF_ADMIN_API_MINOR );
/* Issue command */ /* Issue command */
if ( ( rc = intelxlvf_admin_command ( netdev ) ) != 0 ) 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 ) ); intelxl, api, le32_to_cpu ( buf->ver.minor ) );
/* Check for API compatibility */ /* 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", DBGC ( intelxl, "INTELXL %p unsupported API v%d\n",
intelxl, api ); intelxl, api );
return -ENOTSUP; 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 ) { static int intelxlvf_admin_get_resources ( struct net_device *netdev ) {
struct intelxl_nic *intelxl = netdev->priv; struct intelxl_nic *intelxl = netdev->priv;
struct intelxl_admin_descriptor *cmd; struct intelxlvf_admin_descriptor *cmd;
union intelxl_admin_buffer *buf; union intelxlvf_admin_buffer *buf;
int rc; int rc;
/* Populate descriptor */ /* Populate descriptor */
cmd = intelxl_admin_command_descriptor ( intelxl ); cmd = intelxlvf_admin_command_descriptor ( intelxl );
cmd->vopcode = cpu_to_le32 ( INTELXL_ADMIN_VF_GET_RESOURCES ); cmd->vopcode = cpu_to_le32 ( INTELXLVF_ADMIN_GET_RESOURCES );
buf = intelxl_admin_command_buffer ( intelxl ); buf = intelxlvf_admin_command_buffer ( intelxl );
/* Issue command */ /* Issue command */
if ( ( rc = intelxlvf_admin_command ( netdev ) ) != 0 ) 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 ) { static int intelxlvf_admin_configure ( struct net_device *netdev ) {
struct intelxl_nic *intelxl = netdev->priv; struct intelxl_nic *intelxl = netdev->priv;
struct intelxl_admin_descriptor *cmd; struct intelxlvf_admin_descriptor *cmd;
union intelxl_admin_buffer *buf; union intelxlvf_admin_buffer *buf;
int rc; int rc;
/* Populate descriptor */ /* Populate descriptor */
cmd = intelxl_admin_command_descriptor ( intelxl ); cmd = intelxlvf_admin_command_descriptor ( intelxl );
cmd->vopcode = cpu_to_le32 ( INTELXL_ADMIN_VF_CONFIGURE ); cmd->vopcode = cpu_to_le32 ( INTELXLVF_ADMIN_CONFIGURE );
cmd->flags = cpu_to_le16 ( INTELXL_ADMIN_FL_RD | INTELXL_ADMIN_FL_BUF ); cmd->flags = cpu_to_le16 ( INTELXL_ADMIN_FL_RD | INTELXL_ADMIN_FL_BUF );
cmd->len = cpu_to_le16 ( sizeof ( buf->cfg ) ); 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.vsi = cpu_to_le16 ( intelxl->vsi );
buf->cfg.count = cpu_to_le16 ( 1 ); buf->cfg.count = cpu_to_le16 ( 1 );
buf->cfg.tx.vsi = cpu_to_le16 ( intelxl->vsi ); 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 ) { static int intelxlvf_admin_irq_map ( struct net_device *netdev ) {
struct intelxl_nic *intelxl = netdev->priv; struct intelxl_nic *intelxl = netdev->priv;
struct intelxl_admin_descriptor *cmd; struct intelxlvf_admin_descriptor *cmd;
union intelxl_admin_buffer *buf; union intelxlvf_admin_buffer *buf;
int rc; int rc;
/* Populate descriptor */ /* Populate descriptor */
cmd = intelxl_admin_command_descriptor ( intelxl ); cmd = intelxlvf_admin_command_descriptor ( intelxl );
cmd->vopcode = cpu_to_le32 ( INTELXL_ADMIN_VF_IRQ_MAP ); cmd->vopcode = cpu_to_le32 ( INTELXLVF_ADMIN_IRQ_MAP );
cmd->flags = cpu_to_le16 ( INTELXL_ADMIN_FL_RD | INTELXL_ADMIN_FL_BUF ); cmd->flags = cpu_to_le16 ( INTELXL_ADMIN_FL_RD | INTELXL_ADMIN_FL_BUF );
cmd->len = cpu_to_le16 ( sizeof ( buf->irq ) ); 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.count = cpu_to_le16 ( 1 );
buf->irq.vsi = cpu_to_le16 ( intelxl->vsi ); buf->irq.vsi = cpu_to_le16 ( intelxl->vsi );
buf->irq.vec = cpu_to_le16 ( INTELXLVF_MSIX_VECTOR ); 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 ) { static int intelxlvf_admin_queues ( struct net_device *netdev, int enable ) {
struct intelxl_nic *intelxl = netdev->priv; struct intelxl_nic *intelxl = netdev->priv;
struct intelxl_admin_descriptor *cmd; struct intelxlvf_admin_descriptor *cmd;
union intelxl_admin_buffer *buf; union intelxlvf_admin_buffer *buf;
int rc; int rc;
/* Populate descriptor */ /* Populate descriptor */
cmd = intelxl_admin_command_descriptor ( intelxl ); cmd = intelxlvf_admin_command_descriptor ( intelxl );
cmd->vopcode = ( enable ? cpu_to_le32 ( INTELXL_ADMIN_VF_ENABLE ) : cmd->vopcode = ( enable ? cpu_to_le32 ( INTELXLVF_ADMIN_ENABLE ) :
cpu_to_le32 ( INTELXL_ADMIN_VF_DISABLE ) ); cpu_to_le32 ( INTELXLVF_ADMIN_DISABLE ) );
cmd->flags = cpu_to_le16 ( INTELXL_ADMIN_FL_RD | INTELXL_ADMIN_FL_BUF ); cmd->flags = cpu_to_le16 ( INTELXL_ADMIN_FL_RD | INTELXL_ADMIN_FL_BUF );
cmd->len = cpu_to_le16 ( sizeof ( buf->queues ) ); 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.vsi = cpu_to_le16 ( intelxl->vsi );
buf->queues.rx = cpu_to_le32 ( 1 ); buf->queues.rx = cpu_to_le32 ( 1 );
buf->queues.tx = 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 ) { static int intelxlvf_admin_promisc ( struct net_device *netdev ) {
struct intelxl_nic *intelxl = netdev->priv; struct intelxl_nic *intelxl = netdev->priv;
struct intelxl_admin_descriptor *cmd; struct intelxlvf_admin_descriptor *cmd;
union intelxl_admin_buffer *buf; union intelxlvf_admin_buffer *buf;
int rc; int rc;
/* Populate descriptor */ /* Populate descriptor */
cmd = intelxl_admin_command_descriptor ( intelxl ); cmd = intelxlvf_admin_command_descriptor ( intelxl );
cmd->vopcode = cpu_to_le32 ( INTELXL_ADMIN_VF_PROMISC ); cmd->vopcode = cpu_to_le32 ( INTELXLVF_ADMIN_PROMISC );
cmd->flags = cpu_to_le16 ( INTELXL_ADMIN_FL_RD | INTELXL_ADMIN_FL_BUF ); cmd->flags = cpu_to_le16 ( INTELXL_ADMIN_FL_RD | INTELXL_ADMIN_FL_BUF );
cmd->len = cpu_to_le16 ( sizeof ( buf->promisc ) ); 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.vsi = cpu_to_le16 ( intelxl->vsi );
buf->promisc.flags = cpu_to_le16 ( INTELXL_ADMIN_PROMISC_FL_UNICAST | buf->promisc.flags = cpu_to_le16 ( INTELXL_ADMIN_PROMISC_FL_UNICAST |
INTELXL_ADMIN_PROMISC_FL_MULTICAST ); INTELXL_ADMIN_PROMISC_FL_MULTICAST );

View File

@ -70,6 +70,263 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
/** Maximum time to wait for a VF admin request to complete */ /** Maximum time to wait for a VF admin request to complete */
#define INTELXLVF_ADMIN_MAX_WAIT_MS 2000 #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 */ /** VF Reset Status Register */
#define INTELXLVF_VFGEN_RSTAT 0x8800 #define INTELXLVF_VFGEN_RSTAT 0x8800
#define INTELXLVF_VFGEN_RSTAT_VFR_STATE(x) ( (x) & 0x3 ) #define INTELXLVF_VFGEN_RSTAT_VFR_STATE(x) ( (x) & 0x3 )