/**
  * idpf_vport_intr_buildreg_itr - Enable default interrupt generation settings
  * @q_vector: pointer to q_vector
- * @type: itr index
- * @itr: itr value
  */
-static u32 idpf_vport_intr_buildreg_itr(struct idpf_q_vector *q_vector,
-                                       const int type, u16 itr)
+static u32 idpf_vport_intr_buildreg_itr(struct idpf_q_vector *q_vector)
 {
-       u32 itr_val;
+       u32 itr_val = q_vector->intr_reg.dyn_ctl_intena_m;
+       int type = IDPF_NO_ITR_UPDATE_IDX;
+       u16 itr = 0;
+
+       if (q_vector->wb_on_itr) {
+               /*
+                * Trigger a software interrupt when exiting wb_on_itr, to make
+                * sure we catch any pending write backs that might have been
+                * missed due to interrupt state transition.
+                */
+               itr_val |= q_vector->intr_reg.dyn_ctl_swint_trig_m |
+                          q_vector->intr_reg.dyn_ctl_sw_itridx_ena_m;
+               type = IDPF_SW_ITR_UPDATE_IDX;
+               itr = IDPF_ITR_20K;
+       }
 
        itr &= IDPF_ITR_MASK;
        /* Don't clear PBA because that can cause lost interrupts that
         * came in while we were cleaning/polling
         */
-       itr_val = q_vector->intr_reg.dyn_ctl_intena_m |
-                 (type << q_vector->intr_reg.dyn_ctl_itridx_s) |
-                 (itr << (q_vector->intr_reg.dyn_ctl_intrvl_s - 1));
+       itr_val |= (type << q_vector->intr_reg.dyn_ctl_itridx_s) |
+                  (itr << (q_vector->intr_reg.dyn_ctl_intrvl_s - 1));
 
        return itr_val;
 }
        /* net_dim() updates ITR out-of-band using a work item */
        idpf_net_dim(q_vector);
 
+       intval = idpf_vport_intr_buildreg_itr(q_vector);
        q_vector->wb_on_itr = false;
-       intval = idpf_vport_intr_buildreg_itr(q_vector,
-                                             IDPF_NO_ITR_UPDATE_IDX, 0);
 
        writel(intval, q_vector->intr_reg.dyn_ctl);
 }