diff --git a/drivers/net/ice/ice_ethdev.c b/drivers/net/ice/ice_ethdev.c
index e59761c22..dd9105eed 100644
--- a/drivers/net/ice/ice_ethdev.c
+++ b/drivers/net/ice/ice_ethdev.c
@@ -2318,11 +2318,8 @@ ice_release_vsi(struct ice_vsi *vsi)
 }
 
 void
-ice_vsi_disable_queues_intr(struct ice_vsi *vsi)
+ice_vsi_disable_queues_intr(struct ice_vsi *vsi, bool use_misc)
 {
-	struct rte_eth_dev *dev = vsi->adapter->eth_dev;
-	struct rte_pci_device *pci_dev = ICE_DEV_TO_PCI(dev);
-	struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
 	struct ice_hw *hw = ICE_VSI_TO_HW(vsi);
 	uint16_t msix_intr, i;
 
@@ -2333,7 +2330,7 @@ ice_vsi_disable_queues_intr(struct ice_vsi *vsi)
 		rte_wmb();
 	}
 
-	if (rte_intr_allow_others(intr_handle))
+	if (!use_misc)
 		/* vfio-pci */
 		for (i = 0; i < vsi->nb_msix; i++) {
 			msix_intr = vsi->msix_intr + i;
@@ -2368,7 +2365,8 @@ ice_dev_stop(struct rte_eth_dev *dev)
 		ice_tx_queue_stop(dev, i);
 
 	/* disable all queue interrupts */
-	ice_vsi_disable_queues_intr(main_vsi);
+	ice_vsi_disable_queues_intr(main_vsi,
+				    !rte_intr_allow_others(intr_handle));
 
 	if (pf->init_link_up)
 		ice_dev_set_link_up(dev);
@@ -2616,16 +2614,15 @@ __vsi_queues_bind_intr(struct ice_vsi *vsi, uint16_t msix_vect,
 }
 
 void
-ice_vsi_queues_bind_intr(struct ice_vsi *vsi)
+ice_vsi_queues_bind_intr(struct ice_vsi *vsi,
+			 bool use_misc,
+			 int intr_num_max,
+			 int *intr_vec)
 {
-	struct rte_eth_dev *dev = vsi->adapter->eth_dev;
-	struct rte_pci_device *pci_dev = ICE_DEV_TO_PCI(dev);
-	struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
 	struct ice_hw *hw = ICE_VSI_TO_HW(vsi);
 	uint16_t msix_vect = vsi->msix_intr;
-	uint16_t nb_msix = RTE_MIN(vsi->nb_msix, intr_handle->nb_efd);
+	uint16_t nb_msix = RTE_MIN(vsi->nb_msix, intr_num_max);
 	uint16_t queue_idx = 0;
-	int record = 0;
 	int i;
 
 	/* clear Rx/Tx queue interrupt */
@@ -2634,15 +2631,12 @@ ice_vsi_queues_bind_intr(struct ice_vsi *vsi)
 		ICE_WRITE_REG(hw, QINT_RQCTL(vsi->base_queue + i), 0);
 	}
 
-	/* PF bind interrupt */
-	if (rte_intr_dp_is_en(intr_handle)) {
-		queue_idx = 0;
-		record = 1;
-	}
+	if (use_misc)
+		nb_msix = 1;
 
 	for (i = 0; i < vsi->nb_used_qps; i++) {
 		if (nb_msix <= 1) {
-			if (!rte_intr_allow_others(intr_handle))
+			if (use_misc)
 				msix_vect = ICE_MISC_VEC_ID;
 
 			/* uio mapping all queue to one msix_vect */
@@ -2650,9 +2644,8 @@ ice_vsi_queues_bind_intr(struct ice_vsi *vsi)
 					       vsi->base_queue + i,
 					       vsi->nb_used_qps - i);
 
-			for (; !!record && i < vsi->nb_used_qps; i++)
-				intr_handle->intr_vec[queue_idx + i] =
-					msix_vect;
+			for (; intr_vec && i < vsi->nb_used_qps; i++)
+				intr_vec[queue_idx + i] = msix_vect;
 			break;
 		}
 
@@ -2660,8 +2653,8 @@ ice_vsi_queues_bind_intr(struct ice_vsi *vsi)
 		__vsi_queues_bind_intr(vsi, msix_vect,
 				       vsi->base_queue + i, 1);
 
-		if (!!record)
-			intr_handle->intr_vec[queue_idx + i] = msix_vect;
+		if (intr_vec)
+			intr_vec[queue_idx + i] = msix_vect;
 
 		msix_vect++;
 		nb_msix--;
@@ -2669,15 +2662,12 @@ ice_vsi_queues_bind_intr(struct ice_vsi *vsi)
 }
 
 void
-ice_vsi_enable_queues_intr(struct ice_vsi *vsi)
+ice_vsi_enable_queues_intr(struct ice_vsi *vsi, bool use_misc)
 {
-	struct rte_eth_dev *dev = vsi->adapter->eth_dev;
-	struct rte_pci_device *pci_dev = ICE_DEV_TO_PCI(dev);
-	struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
 	struct ice_hw *hw = ICE_VSI_TO_HW(vsi);
 	uint16_t msix_intr, i;
 
-	if (rte_intr_allow_others(intr_handle))
+	if (!use_misc)
 		for (i = 0; i < vsi->nb_used_qps; i++) {
 			msix_intr = vsi->msix_intr + i;
 			ICE_WRITE_REG(hw, GLINT_DYN_CTL(msix_intr),
@@ -2733,10 +2723,13 @@ ice_rxq_intr_setup(struct rte_eth_dev *dev)
 
 	/* Map queues with MSIX interrupt */
 	vsi->nb_used_qps = dev->data->nb_rx_queues;
-	ice_vsi_queues_bind_intr(vsi);
+	ice_vsi_queues_bind_intr(vsi,
+				 !rte_intr_allow_others(intr_handle),
+				 intr_handle->nb_efd,
+				 intr_handle->intr_vec);
 
 	/* Enable interrupts for all the queues */
-	ice_vsi_enable_queues_intr(vsi);
+	ice_vsi_enable_queues_intr(vsi, !rte_intr_allow_others(intr_handle));
 
 	rte_intr_enable(intr_handle);
 
diff --git a/drivers/net/ice/ice_ethdev.h b/drivers/net/ice/ice_ethdev.h
index da557a254..392b937a9 100644
--- a/drivers/net/ice/ice_ethdev.h
+++ b/drivers/net/ice/ice_ethdev.h
@@ -461,9 +461,12 @@ struct ice_vsi *
 ice_setup_vsi(struct ice_pf *pf, enum ice_vsi_type type);
 int
 ice_release_vsi(struct ice_vsi *vsi);
-void ice_vsi_enable_queues_intr(struct ice_vsi *vsi);
-void ice_vsi_disable_queues_intr(struct ice_vsi *vsi);
-void ice_vsi_queues_bind_intr(struct ice_vsi *vsi);
+void ice_vsi_enable_queues_intr(struct ice_vsi *vsi, bool use_misc);
+void ice_vsi_disable_queues_intr(struct ice_vsi *vsi, bool use_misc);
+void ice_vsi_queues_bind_intr(struct ice_vsi *vsi,
+			      bool use_misc,
+			      int intr_num_max,
+			      int *intr_vec);
 
 static inline int
 ice_align_floor(int n)
diff --git a/drivers/net/ice/ice_fdir_filter.c b/drivers/net/ice/ice_fdir_filter.c
index 6342b560c..fdcfbd78f 100644
--- a/drivers/net/ice/ice_fdir_filter.c
+++ b/drivers/net/ice/ice_fdir_filter.c
@@ -501,8 +501,8 @@ ice_fdir_setup(struct ice_pf *pf)
 
 	/* Enable FDIR MSIX interrupt */
 	vsi->nb_used_qps = 1;
-	ice_vsi_queues_bind_intr(vsi);
-	ice_vsi_enable_queues_intr(vsi);
+	ice_vsi_queues_bind_intr(vsi, true, 1, NULL);
+	ice_vsi_enable_queues_intr(vsi, true);
 
 	/* reserve memory for the fdir programming packet */
 	snprintf(z_name, sizeof(z_name), "ICE_%s_%d",
@@ -628,7 +628,7 @@ ice_fdir_teardown(struct ice_pf *pf)
 	if (!vsi)
 		return;
 
-	ice_vsi_disable_queues_intr(vsi);
+	ice_vsi_disable_queues_intr(vsi, true);
 
 	err = ice_fdir_tx_queue_stop(eth_dev, pf->fdir.txq->queue_id);
 	if (err)
