There is a issue when iavf do vertor interrupt configuration,
it will miss one interrupt vector which set admin queue interrupt
when communicate with host pf.

Fixes: 69dd4c3d0898 ("net/avf: enable queue and device")
Cc: sta...@dpdk.org

Signed-off-by: Wei Zhao <wei.zh...@intel.com>
Signed-off-by: Zhao Wei <wei.zh...@intel.com>
---
 drivers/net/iavf/iavf_ethdev.c | 4 ++--
 drivers/net/iavf/iavf_vchnl.c  | 8 +++++++-
 2 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/drivers/net/iavf/iavf_ethdev.c b/drivers/net/iavf/iavf_ethdev.c
index 846e604..49c9499 100644
--- a/drivers/net/iavf/iavf_ethdev.c
+++ b/drivers/net/iavf/iavf_ethdev.c
@@ -308,7 +308,7 @@ static int iavf_config_rx_queues_irqs(struct rte_eth_dev 
*dev,
        if (!dev->data->dev_conf.intr_conf.rxq ||
            !rte_intr_dp_is_en(intr_handle)) {
                /* Rx interrupt disabled, Map interrupt only for writeback */
-               vf->nb_msix = 1;
+               vf->nb_msix = 2;
                if (vf->vf_res->vf_cap_flags &
                    VIRTCHNL_VF_OFFLOAD_WB_ON_ITR) {
                        /* If WB_ON_ITR supports, enable it */
@@ -338,7 +338,7 @@ static int iavf_config_rx_queues_irqs(struct rte_eth_dev 
*dev,
                        vf->rxq_map[vf->msix_base] |= 1 << i;
        } else {
                if (!rte_intr_allow_others(intr_handle)) {
-                       vf->nb_msix = 1;
+                       vf->nb_msix = 2;
                        vf->msix_base = IAVF_MISC_VEC_ID;
                        for (i = 0; i < dev->data->nb_rx_queues; i++) {
                                vf->rxq_map[vf->msix_base] |= 1 << i;
diff --git a/drivers/net/iavf/iavf_vchnl.c b/drivers/net/iavf/iavf_vchnl.c
index 6381fb6..d9a376e 100644
--- a/drivers/net/iavf/iavf_vchnl.c
+++ b/drivers/net/iavf/iavf_vchnl.c
@@ -609,7 +609,7 @@ iavf_config_irq_map(struct iavf_adapter *adapter)
                return -ENOMEM;
 
        map_info->num_vectors = vf->nb_msix;
-       for (i = 0; i < vf->nb_msix; i++) {
+       for (i = 0; i < vf->nb_msix - 1; i++) {
                vecmap = &map_info->vecmap[i];
                vecmap->vsi_id = vf->vsi_res->vsi_id;
                vecmap->rxitr_idx = IAVF_ITR_INDEX_DEFAULT;
@@ -618,6 +618,12 @@ iavf_config_irq_map(struct iavf_adapter *adapter)
                vecmap->rxq_map = vf->rxq_map[vf->msix_base + i];
        }
 
+       vecmap = &map_info->vecmap[i];
+       vecmap->vsi_id = vf->vsi_res->vsi_id;
+       vecmap->vector_id = 0;
+       vecmap->txq_map = 0;
+       vecmap->rxq_map = 0;
+
        args.ops = VIRTCHNL_OP_CONFIG_IRQ_MAP;
        args.in_args = (u8 *)map_info;
        args.in_args_size = len;
-- 
2.7.5

Reply via email to