* @send_intr: Send an interrupt for a particular doorbell on the card.
  * @ack_interrupt: Hardware specific operations to ack the h/w on
  * receipt of an interrupt.
+ * @intr_workarounds: Hardware specific workarounds needed after
+ * handling an interrupt.
  * @reset: Reset the remote processor.
  * @reset_fw_ready: Reset firmware ready field.
  * @is_fw_ready: Check if firmware is ready for OS download.
        void (*write_spad)(struct mic_device *mdev, unsigned int idx, u32 val);
        void (*send_intr)(struct mic_device *mdev, int doorbell);
        u32 (*ack_interrupt)(struct mic_device *mdev);
+       void (*intr_workarounds)(struct mic_device *mdev);
        void (*reset)(struct mic_device *mdev);
        void (*reset_fw_ready)(struct mic_device *mdev);
        bool (*is_fw_ready)(struct mic_device *mdev);
 
 }
 
 /**
- * mic_ack_interrupt - Device specific interrupt handling.
- * @mdev: pointer to mic_device instance
+ * mic_x100_ack_interrupt - Read the interrupt sources register and
+ * clear it. This function will be called in the MSI/INTx case.
+ * @mdev: Pointer to mic_device instance.
  *
- * Returns: bitmask of doorbell events triggered.
+ * Returns: bitmask of interrupt sources triggered.
  */
 static u32 mic_x100_ack_interrupt(struct mic_device *mdev)
 {
-       u32 reg = 0;
-       struct mic_mw *mw = &mdev->mmio;
        u32 sicr0 = MIC_X100_SBOX_BASE_ADDRESS + MIC_X100_SBOX_SICR0;
+       u32 reg = mic_mmio_read(&mdev->mmio, sicr0);
+       mic_mmio_write(&mdev->mmio, reg, sicr0);
+       return reg;
+}
+
+/**
+ * mic_x100_intr_workarounds - These hardware specific workarounds are
+ * to be invoked everytime an interrupt is handled.
+ * @mdev: Pointer to mic_device instance.
+ *
+ * Returns: none
+ */
+static void mic_x100_intr_workarounds(struct mic_device *mdev)
+{
+       struct mic_mw *mw = &mdev->mmio;
 
        /* Clear pending bit array. */
        if (MIC_A0_STEP == mdev->stepping)
                mic_mmio_write(mw, 1, MIC_X100_SBOX_BASE_ADDRESS +
                        MIC_X100_SBOX_MSIXPBACR);
 
-       if (mdev->irq_info.num_vectors <= 1) {
-               reg = mic_mmio_read(mw, sicr0);
-
-               if (unlikely(!reg))
-                       goto done;
-
-               mic_mmio_write(mw, reg, sicr0);
-       }
-
        if (mdev->stepping >= MIC_B0_STEP)
                mdev->intr_ops->enable_interrupts(mdev);
-done:
-       return reg;
 }
 
 /**
        .write_spad = mic_x100_write_spad,
        .send_intr = mic_x100_send_intr,
        .ack_interrupt = mic_x100_ack_interrupt,
+       .intr_workarounds = mic_x100_intr_workarounds,
        .reset = mic_x100_hw_reset,
        .reset_fw_ready = mic_x100_reset_fw_ready,
        .is_fw_ready = mic_x100_is_fw_ready,