#define ICE_RX_HDR_SIZE                256
 
-#define FDIR_DESC_RXDID 0x40
 #define ICE_FDIR_CLEAN_DELAY 10
 
 /**
        return true;
 }
 
+/**
+ * ice_init_ctrl_rx_descs - Initialize Rx descriptors for control vsi.
+ * @rx_ring: ring to init descriptors on
+ * @count: number of descriptors to initialize
+ */
+void ice_init_ctrl_rx_descs(struct ice_rx_ring *rx_ring, u32 count)
+{
+       union ice_32b_rx_flex_desc *rx_desc;
+       u32 ntu = rx_ring->next_to_use;
+
+       if (!count)
+               return;
+
+       rx_desc = ICE_RX_DESC(rx_ring, ntu);
+
+       do {
+               rx_desc++;
+               ntu++;
+               if (unlikely(ntu == rx_ring->count)) {
+                       rx_desc = ICE_RX_DESC(rx_ring, 0);
+                       ntu = 0;
+               }
+
+               rx_desc->wb.status_error0 = 0;
+               count--;
+       } while (count);
+
+       if (rx_ring->next_to_use != ntu)
+               ice_release_rx_desc(rx_ring, ntu);
+}
+
 /**
  * ice_alloc_rx_bufs - Replace used receive buffers
  * @rx_ring: ring to place buffers on
        struct ice_rx_buf *bi;
 
        /* do nothing if no valid netdev defined */
-       if ((!rx_ring->netdev && rx_ring->vsi->type != ICE_VSI_CTRL) ||
-           !cleaned_count)
+       if (!rx_ring->netdev || !cleaned_count)
                return false;
 
        /* get the Rx descriptor and buffer based on next_to_use */
        rx_ring->nr_frags = 0;
 }
 
+/**
+ * ice_clean_ctrl_rx_irq - Clean descriptors from flow director Rx ring
+ * @rx_ring: Rx descriptor ring for ctrl_vsi to transact packets on
+ *
+ * This function cleans Rx descriptors from the ctrl_vsi Rx ring used
+ * to set flow director rules on VFs.
+ */
+void ice_clean_ctrl_rx_irq(struct ice_rx_ring *rx_ring)
+{
+       u32 ntc = rx_ring->next_to_clean;
+       unsigned int total_rx_pkts = 0;
+       u32 cnt = rx_ring->count;
+
+       while (likely(total_rx_pkts < ICE_DFLT_IRQ_WORK)) {
+               struct ice_vsi *ctrl_vsi = rx_ring->vsi;
+               union ice_32b_rx_flex_desc *rx_desc;
+               u16 stat_err_bits;
+
+               rx_desc = ICE_RX_DESC(rx_ring, ntc);
+
+               stat_err_bits = BIT(ICE_RX_FLEX_DESC_STATUS0_DD_S);
+               if (!ice_test_staterr(rx_desc->wb.status_error0, stat_err_bits))
+                       break;
+
+               dma_rmb();
+
+               if (ctrl_vsi->vf)
+                       ice_vc_fdir_irq_handler(ctrl_vsi, rx_desc);
+
+               if (++ntc == cnt)
+                       ntc = 0;
+               total_rx_pkts++;
+       }
+
+       rx_ring->first_desc = ntc;
+       rx_ring->next_to_clean = ntc;
+       ice_init_ctrl_rx_descs(rx_ring, ICE_RX_DESC_UNUSED(rx_ring));
+}
+
 /**
  * ice_clean_rx_irq - Clean completed descriptors from Rx ring - bounce buf
  * @rx_ring: Rx descriptor ring to transact packets on
  *
  * Returns amount of work completed
  */
-int ice_clean_rx_irq(struct ice_rx_ring *rx_ring, int budget)
+static int ice_clean_rx_irq(struct ice_rx_ring *rx_ring, int budget)
 {
        unsigned int total_rx_bytes = 0, total_rx_pkts = 0;
        unsigned int offset = rx_ring->rx_offset;
                dma_rmb();
 
                ice_trace(clean_rx_irq, rx_ring, rx_desc);
-               if (rx_desc->wb.rxdid == FDIR_DESC_RXDID || !rx_ring->netdev) {
-                       struct ice_vsi *ctrl_vsi = rx_ring->vsi;
-
-                       if (rx_desc->wb.rxdid == FDIR_DESC_RXDID &&
-                           ctrl_vsi->vf)
-                               ice_vc_fdir_irq_handler(ctrl_vsi, rx_desc);
-                       if (++ntc == cnt)
-                               ntc = 0;
-                       rx_ring->first_desc = ntc;
-                       continue;
-               }
 
                size = le16_to_cpu(rx_desc->wb.pkt_len) &
                        ICE_RX_FLX_DESC_PKT_LEN_M;
 
 
 union ice_32b_rx_flex_desc;
 
+void ice_init_ctrl_rx_descs(struct ice_rx_ring *rx_ring, u32 num_descs);
 bool ice_alloc_rx_bufs(struct ice_rx_ring *rxr, unsigned int cleaned_count);
 netdev_tx_t ice_start_xmit(struct sk_buff *skb, struct net_device *netdev);
 u16
 int
 ice_prgm_fdir_fltr(struct ice_vsi *vsi, struct ice_fltr_desc *fdir_desc,
                   u8 *raw_packet);
-int ice_clean_rx_irq(struct ice_rx_ring *rx_ring, int budget);
 void ice_clean_ctrl_tx_irq(struct ice_tx_ring *tx_ring);
+void ice_clean_ctrl_rx_irq(struct ice_rx_ring *rx_ring);
 #endif /* _ICE_TXRX_H_ */