| 6506 | } |
| 6507 | |
| 6508 | static int |
| 6509 | i40e_vmdq_setup(struct rte_eth_dev *dev) |
| 6510 | { |
| 6511 | struct rte_eth_conf *conf = &dev->data->dev_conf; |
| 6512 | struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private); |
| 6513 | int i, err, conf_vsis, j, loop; |
| 6514 | struct i40e_vsi *vsi; |
| 6515 | struct i40e_vmdq_info *vmdq_info; |
| 6516 | struct rte_eth_vmdq_rx_conf *vmdq_conf; |
| 6517 | struct i40e_hw *hw = I40E_PF_TO_HW(pf); |
| 6518 | |
| 6519 | /* |
| 6520 | * Disable interrupt to avoid message from VF. Furthermore, it will |
| 6521 | * avoid race condition in VSI creation/destroy. |
| 6522 | */ |
| 6523 | i40e_pf_disable_irq0(hw); |
| 6524 | |
| 6525 | if ((pf->flags & I40E_FLAG_VMDQ) == 0) { |
| 6526 | PMD_INIT_LOG(ERR, "FW doesn't support VMDQ"); |
| 6527 | return -ENOTSUP; |
| 6528 | } |
| 6529 | |
| 6530 | conf_vsis = conf->rx_adv_conf.vmdq_rx_conf.nb_queue_pools; |
| 6531 | if (conf_vsis > pf->max_nb_vmdq_vsi) { |
| 6532 | PMD_INIT_LOG(ERR, "VMDQ config: %u, max support:%u", |
| 6533 | conf->rx_adv_conf.vmdq_rx_conf.nb_queue_pools, |
| 6534 | pf->max_nb_vmdq_vsi); |
| 6535 | return -ENOTSUP; |
| 6536 | } |
| 6537 | |
| 6538 | if (pf->vmdq != NULL) { |
| 6539 | PMD_INIT_LOG(INFO, "VMDQ already configured"); |
| 6540 | return 0; |
| 6541 | } |
| 6542 | |
| 6543 | pf->vmdq = rte_zmalloc("vmdq_info_struct", |
| 6544 | sizeof(*vmdq_info) * conf_vsis, 0); |
| 6545 | |
| 6546 | if (pf->vmdq == NULL) { |
| 6547 | PMD_INIT_LOG(ERR, "Failed to allocate memory"); |
| 6548 | return -ENOMEM; |
| 6549 | } |
| 6550 | |
| 6551 | vmdq_conf = &conf->rx_adv_conf.vmdq_rx_conf; |
| 6552 | |
| 6553 | /* Create VMDQ VSI */ |
| 6554 | for (i = 0; i < conf_vsis; i++) { |
| 6555 | vsi = i40e_vsi_setup(pf, I40E_VSI_VMDQ2, pf->main_vsi, |
| 6556 | vmdq_conf->enable_loop_back); |
| 6557 | if (vsi == NULL) { |
| 6558 | PMD_INIT_LOG(ERR, "Failed to create VMDQ VSI"); |
| 6559 | err = -1; |
| 6560 | goto err_vsi_setup; |
| 6561 | } |
| 6562 | vmdq_info = &pf->vmdq[i]; |
| 6563 | vmdq_info->pf = pf; |
| 6564 | vmdq_info->vsi = vsi; |
| 6565 | } |
no test coverage detected