#define MAX_TRY_TIMES 200
#define ASQ_DELAY_MS 10
+static uint32_t
+iavf_convert_link_speed(enum virtchnl_link_speed virt_link_speed)
+{
+ uint32_t speed;
+
+ switch (virt_link_speed) {
+ case VIRTCHNL_LINK_SPEED_100MB:
+ speed = 100;
+ break;
+ case VIRTCHNL_LINK_SPEED_1GB:
+ speed = 1000;
+ break;
+ case VIRTCHNL_LINK_SPEED_10GB:
+ speed = 10000;
+ break;
+ case VIRTCHNL_LINK_SPEED_40GB:
+ speed = 40000;
+ break;
+ case VIRTCHNL_LINK_SPEED_20GB:
+ speed = 20000;
+ break;
+ case VIRTCHNL_LINK_SPEED_25GB:
+ speed = 25000;
+ break;
+ case VIRTCHNL_LINK_SPEED_2_5GB:
+ speed = 2500;
+ break;
+ case VIRTCHNL_LINK_SPEED_5GB:
+ speed = 5000;
+ break;
+ default:
+ speed = 0;
+ break;
+ }
+
+ return speed;
+}
+
/* Read data in admin queue to get msg from pf driver */
-static enum iavf_status
+static enum iavf_aq_result
iavf_read_msg_from_pf(struct iavf_adapter *adapter, uint16_t buf_len,
uint8_t *buf)
{
struct iavf_hw *hw = IAVF_DEV_PRIVATE_TO_HW(adapter);
struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(adapter);
+ struct rte_eth_dev *dev = adapter->eth_dev;
struct iavf_arq_event_info event;
+ enum iavf_aq_result result = IAVF_MSG_NON;
enum virtchnl_ops opcode;
int ret;
/* Can't read any msg from adminQ */
if (ret) {
PMD_DRV_LOG(DEBUG, "Can't read msg from AQ");
- return ret;
+ if (ret != IAVF_ERR_ADMIN_QUEUE_NO_WORK)
+ result = IAVF_MSG_ERR;
+ return result;
}
opcode = (enum virtchnl_ops)rte_le_to_cpu_32(event.desc.cookie_high);
PMD_DRV_LOG(DEBUG, "AQ from pf carries opcode %u, retval %d",
opcode, vf->cmd_retval);
- if (opcode != vf->pend_cmd) {
- if (opcode != VIRTCHNL_OP_EVENT) {
- PMD_DRV_LOG(WARNING,
- "command mismatch, expect %u, get %u",
- vf->pend_cmd, opcode);
+ if (opcode == VIRTCHNL_OP_EVENT) {
+ struct virtchnl_pf_event *vpe =
+ (struct virtchnl_pf_event *)event.msg_buf;
+
+ result = IAVF_MSG_SYS;
+ switch (vpe->event) {
+ case VIRTCHNL_EVENT_LINK_CHANGE:
+ vf->link_up =
+ vpe->event_data.link_event.link_status;
+ if (vf->vf_res->vf_cap_flags &
+ VIRTCHNL_VF_CAP_ADV_LINK_SPEED) {
+ vf->link_speed =
+ vpe->event_data.link_event_adv.link_speed;
+ } else {
+ enum virtchnl_link_speed speed;
+ speed = vpe->event_data.link_event.link_speed;
+ vf->link_speed = iavf_convert_link_speed(speed);
+ }
+ iavf_dev_link_update(dev, 0);
+ PMD_DRV_LOG(INFO, "Link status update:%s",
+ vf->link_up ? "up" : "down");
+ break;
+ case VIRTCHNL_EVENT_RESET_IMPENDING:
+ vf->vf_reset = true;
+ PMD_DRV_LOG(INFO, "VF is resetting");
+ break;
+ case VIRTCHNL_EVENT_PF_DRIVER_CLOSE:
+ vf->dev_closed = true;
+ PMD_DRV_LOG(INFO, "PF driver closed");
+ break;
+ default:
+ PMD_DRV_LOG(ERR, "%s: Unknown event %d from pf",
+ __func__, vpe->event);
+ }
+ } else {
+ /* async reply msg on command issued by vf previously */
+ result = IAVF_MSG_CMD;
+ if (opcode != vf->pend_cmd) {
+ PMD_DRV_LOG(WARNING, "command mismatch, expect %u, get %u",
+ vf->pend_cmd, opcode);
+ result = IAVF_MSG_ERR;
}
- return IAVF_ERR_OPCODE_MISMATCH;
}
- return IAVF_SUCCESS;
+ return result;
}
static int
{
struct iavf_hw *hw = IAVF_DEV_PRIVATE_TO_HW(adapter);
struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(adapter);
+ enum iavf_aq_result result;
enum iavf_status ret;
int err = 0;
int i = 0;
case VIRTCHNL_OP_GET_SUPPORTED_RXDIDS:
/* for init virtchnl ops, need to poll the response */
do {
- ret = iavf_read_msg_from_pf(adapter, args->out_size,
+ result = iavf_read_msg_from_pf(adapter, args->out_size,
args->out_buffer);
- if (ret == IAVF_SUCCESS)
+ if (result == IAVF_MSG_CMD)
break;
rte_delay_ms(ASQ_DELAY_MS);
} while (i++ < MAX_TRY_TIMES);
return err;
}
-static uint32_t
-iavf_convert_link_speed(enum virtchnl_link_speed virt_link_speed)
-{
- uint32_t speed;
-
- switch (virt_link_speed) {
- case VIRTCHNL_LINK_SPEED_100MB:
- speed = 100;
- break;
- case VIRTCHNL_LINK_SPEED_1GB:
- speed = 1000;
- break;
- case VIRTCHNL_LINK_SPEED_10GB:
- speed = 10000;
- break;
- case VIRTCHNL_LINK_SPEED_40GB:
- speed = 40000;
- break;
- case VIRTCHNL_LINK_SPEED_20GB:
- speed = 20000;
- break;
- case VIRTCHNL_LINK_SPEED_25GB:
- speed = 25000;
- break;
- case VIRTCHNL_LINK_SPEED_2_5GB:
- speed = 2500;
- break;
- case VIRTCHNL_LINK_SPEED_5GB:
- speed = 5000;
- break;
- default:
- speed = 0;
- break;
- }
-
- return speed;
-}
-
static void
iavf_handle_pf_event_msg(struct rte_eth_dev *dev, uint8_t *msg,
uint16_t msglen)