rte_delay_ms(ASQ_DELAY_MS);
/* If don't read msg or read sys event, continue */
} while (i++ < MAX_TRY_TIMES);
- /* If there's no response is received, clear command */
- if (i >= MAX_TRY_TIMES ||
- vf->cmd_retval != VIRTCHNL_STATUS_SUCCESS) {
- err = -1;
- PMD_DRV_LOG(ERR, "No response or return failure (%d)"
- " for cmd %d", vf->cmd_retval, args->ops);
+
+ if (i >= MAX_TRY_TIMES) {
+ PMD_DRV_LOG(ERR, "No response for cmd %d", args->ops);
_clear_cmd(vf);
+ err = -EIO;
+ } else if (vf->cmd_retval ==
+ VIRTCHNL_STATUS_ERR_NOT_SUPPORTED) {
+ PMD_DRV_LOG(ERR, "Cmd %d not supported", args->ops);
+ err = -ENOTSUP;
+ } else if (vf->cmd_retval != VIRTCHNL_STATUS_SUCCESS) {
+ PMD_DRV_LOG(ERR, "Return failure %d for cmd %d",
+ vf->cmd_retval, args->ops);
+ err = -EINVAL;
}
break;
}
VIRTCHNL_VF_OFFLOAD_REQ_QUEUES |
VIRTCHNL_VF_OFFLOAD_CRC |
VIRTCHNL_VF_OFFLOAD_VLAN_V2 |
- VIRTCHNL_VF_LARGE_NUM_QPAIRS;
+ VIRTCHNL_VF_LARGE_NUM_QPAIRS |
+ VIRTCHNL_VF_OFFLOAD_QOS;
args.in_args = (uint8_t *)∩︀
args.in_args_size = sizeof(caps);
iavf_config_vlan_strip_v2(struct iavf_adapter *adapter, bool enable)
{
struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(adapter);
- struct virtchnl_vlan_supported_caps *supported_caps;
- struct virtchnl_vlan_offload vlan_strip;
+ struct virtchnl_vlan_supported_caps *stripping_caps;
+ struct virtchnl_vlan_setting vlan_strip;
struct iavf_cmd_info args;
- uint32_t stripping_caps;
- uint32_t *vlan_setting;
+ uint32_t *ethertype;
int ret;
- supported_caps = &vf->vlan_v2_caps.offloads.stripping_support;
- if (supported_caps->outer) {
- stripping_caps = supported_caps->outer;
- vlan_setting = &vlan_strip.outer_ethertype_setting;
- } else {
- stripping_caps = supported_caps->inner;
- vlan_setting = &vlan_strip.inner_ethertype_setting;
- }
+ stripping_caps = &vf->vlan_v2_caps.offloads.stripping_support;
- if (!(stripping_caps & VIRTCHNL_VLAN_ETHERTYPE_8100))
+ if ((stripping_caps->outer & VIRTCHNL_VLAN_ETHERTYPE_8100) &&
+ (stripping_caps->outer & VIRTCHNL_VLAN_TOGGLE))
+ ethertype = &vlan_strip.outer_ethertype_setting;
+ else if ((stripping_caps->inner & VIRTCHNL_VLAN_ETHERTYPE_8100) &&
+ (stripping_caps->inner & VIRTCHNL_VLAN_TOGGLE))
+ ethertype = &vlan_strip.inner_ethertype_setting;
+ else
return -ENOTSUP;
memset(&vlan_strip, 0, sizeof(vlan_strip));
vlan_strip.vport_id = vf->vsi_res->vsi_id;
- *vlan_setting = VIRTCHNL_VLAN_ETHERTYPE_8100;
+ *ethertype = VIRTCHNL_VLAN_ETHERTYPE_8100;
args.ops = enable ? VIRTCHNL_OP_ENABLE_VLAN_STRIPPING_V2 :
VIRTCHNL_OP_DISABLE_VLAN_STRIPPING_V2;
iavf_config_vlan_insert_v2(struct iavf_adapter *adapter, bool enable)
{
struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(adapter);
- struct virtchnl_vlan_supported_caps *supported_caps;
- struct virtchnl_vlan_offload vlan_insert;
+ struct virtchnl_vlan_supported_caps *insertion_caps;
+ struct virtchnl_vlan_setting vlan_insert;
struct iavf_cmd_info args;
- uint32_t insertion_caps;
- uint32_t *vlan_setting;
+ uint32_t *ethertype;
int ret;
- supported_caps = &vf->vlan_v2_caps.offloads.insertion_support;
- if (supported_caps->outer) {
- insertion_caps = supported_caps->outer;
- vlan_setting = &vlan_insert.outer_ethertype_setting;
- } else {
- insertion_caps = supported_caps->inner;
- vlan_setting = &vlan_insert.inner_ethertype_setting;
- }
+ insertion_caps = &vf->vlan_v2_caps.offloads.insertion_support;
- if (!(insertion_caps & VIRTCHNL_VLAN_ETHERTYPE_8100))
+ if ((insertion_caps->outer & VIRTCHNL_VLAN_ETHERTYPE_8100) &&
+ (insertion_caps->outer & VIRTCHNL_VLAN_TOGGLE))
+ ethertype = &vlan_insert.outer_ethertype_setting;
+ else if ((insertion_caps->inner & VIRTCHNL_VLAN_ETHERTYPE_8100) &&
+ (insertion_caps->inner & VIRTCHNL_VLAN_TOGGLE))
+ ethertype = &vlan_insert.inner_ethertype_setting;
+ else
return -ENOTSUP;
memset(&vlan_insert, 0, sizeof(vlan_insert));
vlan_insert.vport_id = vf->vsi_res->vsi_id;
- *vlan_setting = VIRTCHNL_VLAN_ETHERTYPE_8100;
+ *ethertype = VIRTCHNL_VLAN_ETHERTYPE_8100;
args.ops = enable ? VIRTCHNL_OP_ENABLE_VLAN_INSERTION_V2 :
VIRTCHNL_OP_DISABLE_VLAN_INSERTION_V2;
continue;
rte_memcpy(list->list[j].addr, addr->addr_bytes,
sizeof(addr->addr_bytes));
+ list->list[j].type = (j == 0 ?
+ VIRTCHNL_ETHER_ADDR_PRIMARY :
+ VIRTCHNL_ETHER_ADDR_EXTRA);
PMD_DRV_LOG(DEBUG, "add/rm mac:%x:%x:%x:%x:%x:%x",
addr->addr_bytes[0], addr->addr_bytes[1],
addr->addr_bytes[2], addr->addr_bytes[3],
PMD_DRV_LOG(ERR,
"fail to execute command CONFIG_PROMISCUOUS_MODE");
- if (err == IAVF_NOT_SUPPORTED)
- return -ENOTSUP;
+ if (err == -ENOTSUP)
+ return err;
return -EAGAIN;
}
int
iavf_add_del_eth_addr(struct iavf_adapter *adapter, struct rte_ether_addr *addr,
- bool add)
+ bool add, uint8_t type)
{
struct virtchnl_ether_addr_list *list;
struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(adapter);
list = (struct virtchnl_ether_addr_list *)cmd_buffer;
list->vsi_id = vf->vsi_res->vsi_id;
list->num_elements = 1;
+ list->list[0].type = type;
rte_memcpy(list->list[0].addr, addr->addr_bytes,
sizeof(addr->addr_bytes));
return err;
}
+int
+iavf_get_hena_caps(struct iavf_adapter *adapter, uint64_t *caps)
+{
+ struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(adapter);
+ struct iavf_cmd_info args;
+ int err;
+
+ args.ops = VIRTCHNL_OP_GET_RSS_HENA_CAPS;
+ args.in_args = NULL;
+ args.in_args_size = 0;
+ args.out_buffer = vf->aq_resp;
+ args.out_size = IAVF_AQ_BUF_SZ;
+
+ err = iavf_execute_vf_cmd(adapter, &args);
+ if (err) {
+ PMD_DRV_LOG(ERR,
+ "Failed to execute command of OP_GET_RSS_HENA_CAPS");
+ return err;
+ }
+
+ *caps = ((struct virtchnl_rss_hena *)args.out_buffer)->hena;
+ return 0;
+}
+
int
iavf_set_hena(struct iavf_adapter *adapter, uint64_t hena)
{
return err;
}
+int
+iavf_get_qos_cap(struct iavf_adapter *adapter)
+{
+ struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(adapter);
+ struct iavf_cmd_info args;
+ uint32_t len;
+ int err;
+
+ args.ops = VIRTCHNL_OP_GET_QOS_CAPS;
+ args.in_args = NULL;
+ args.in_args_size = 0;
+ args.out_buffer = vf->aq_resp;
+ args.out_size = IAVF_AQ_BUF_SZ;
+ err = iavf_execute_vf_cmd(adapter, &args);
+
+ if (err) {
+ PMD_DRV_LOG(ERR,
+ "Failed to execute command of OP_GET_VF_RESOURCE");
+ return -1;
+ }
+
+ len = sizeof(struct virtchnl_qos_cap_list) +
+ IAVF_MAX_TRAFFIC_CLASS * sizeof(struct virtchnl_qos_cap_elem);
+
+ rte_memcpy(vf->qos_cap, args.out_buffer,
+ RTE_MIN(args.out_size, len));
+
+ return 0;
+}
+
+int iavf_set_q_tc_map(struct rte_eth_dev *dev,
+ struct virtchnl_queue_tc_mapping *q_tc_mapping, uint16_t size)
+{
+ struct iavf_adapter *adapter =
+ IAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
+ struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
+ struct iavf_cmd_info args;
+ int err;
+
+ memset(&args, 0, sizeof(args));
+ args.ops = VIRTCHNL_OP_CONFIG_QUEUE_TC_MAP;
+ args.in_args = (uint8_t *)q_tc_mapping;
+ args.in_args_size = size;
+ args.out_buffer = vf->aq_resp;
+ args.out_size = IAVF_AQ_BUF_SZ;
+
+ err = iavf_execute_vf_cmd(adapter, &args);
+ if (err)
+ PMD_DRV_LOG(ERR, "Failed to execute command of"
+ " VIRTCHNL_OP_CONFIG_TC_MAP");
+ return err;
+}
+
int
iavf_add_del_mc_addr_list(struct iavf_adapter *adapter,
struct rte_ether_addr *mc_addrs,
memcpy(list->list[i].addr, mc_addrs[i].addr_bytes,
sizeof(list->list[i].addr));
+ list->list[i].type = VIRTCHNL_ETHER_ADDR_EXTRA;
}
args.ops = add ? VIRTCHNL_OP_ADD_ETH_ADDR : VIRTCHNL_OP_DEL_ETH_ADDR;