mirror of https://github.com/ipxe/ipxe.git
[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
parent
c220b93f31
commit
fb69d14002
|
@ -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 */
|
||||
|
|
|
@ -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 */
|
||||
/** Opaque cookie */
|
||||
uint32_t cookie;
|
||||
/** VF opcode */
|
||||
uint32_t vopcode;
|
||||
};
|
||||
/** VF return value */
|
||||
int32_t vret;
|
||||
/** 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
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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 )
|
||||
|
|
Loading…
Reference in New Issue