mei_hcsr_set(dev, hcsr);
 }
 
+/**
+ * mei_me_synchronize_irq - wait for pending IRQ handlers
+ *
+ * @dev: the device structure
+ */
+static void mei_me_synchronize_irq(struct mei_device *dev)
+{
+       struct pci_dev *pdev = to_pci_dev(dev->dev);
+
+       synchronize_irq(pdev->irq);
+}
+
 /**
  * mei_me_hw_reset_release - release device from the reset
  *
        .intr_clear = mei_me_intr_clear,
        .intr_enable = mei_me_intr_enable,
        .intr_disable = mei_me_intr_disable,
+       .synchronize_irq = mei_me_synchronize_irq,
 
        .hbuf_free_slots = mei_me_hbuf_empty_slots,
        .hbuf_is_ready = mei_me_hbuf_is_empty,
 
 #include <linux/ktime.h>
 #include <linux/delay.h>
 #include <linux/kthread.h>
-#include <linux/irqreturn.h>
+#include <linux/interrupt.h>
 #include <linux/pm_runtime.h>
 
 #include <linux/mei.h>
        mei_txe_br_reg_write(hw, HIER_REG, HIER_INT_EN_MSK);
 }
 
+/**
+ * mei_txe_synchronize_irq - wait for pending IRQ handlers
+ *
+ * @dev: the device structure
+ */
+static void mei_txe_synchronize_irq(struct mei_device *dev)
+{
+       struct pci_dev *pdev = to_pci_dev(dev->dev);
+
+       synchronize_irq(pdev->irq);
+}
+
 /**
  * mei_txe_pending_interrupts - check if there are pending interrupts
  *     only Aliveness, Input ready, and output doorbell are of relevance
        .intr_clear = mei_txe_intr_clear,
        .intr_enable = mei_txe_intr_enable,
        .intr_disable = mei_txe_intr_disable,
+       .synchronize_irq = mei_txe_synchronize_irq,
 
        .hbuf_free_slots = mei_txe_hbuf_empty_slots,
        .hbuf_is_ready = mei_txe_is_input_ready,
 
                         mei_dev_state_str(state), fw_sts_str);
        }
 
+       mei_clear_interrupts(dev);
+
+       mei_synchronize_irq(dev);
+
        /* we're already in reset, cancel the init timer
         * if the reset was called due the hbm protocol error
         * we need to call it before hw start
 
        mutex_lock(&dev->device_lock);
 
-       mei_clear_interrupts(dev);
-
        dev->dev_state = MEI_DEV_POWER_UP;
        dev->reset_count = 0;
 
 
  * @intr_clear       : clear pending interrupts
  * @intr_enable      : enable interrupts
  * @intr_disable     : disable interrupts
+ * @synchronize_irq  : synchronize irqs
  *
  * @hbuf_free_slots  : query for write buffer empty slots
  * @hbuf_is_ready    : query if write buffer is empty
        int (*hw_start)(struct mei_device *dev);
        void (*hw_config)(struct mei_device *dev);
 
-
        int (*fw_status)(struct mei_device *dev, struct mei_fw_status *fw_sts);
        enum mei_pg_state (*pg_state)(struct mei_device *dev);
        bool (*pg_in_transition)(struct mei_device *dev);
        void (*intr_clear)(struct mei_device *dev);
        void (*intr_enable)(struct mei_device *dev);
        void (*intr_disable)(struct mei_device *dev);
+       void (*synchronize_irq)(struct mei_device *dev);
 
        int (*hbuf_free_slots)(struct mei_device *dev);
        bool (*hbuf_is_ready)(struct mei_device *dev);
        dev->ops->intr_disable(dev);
 }
 
+static inline void mei_synchronize_irq(struct mei_device *dev)
+{
+       dev->ops->synchronize_irq(dev);
+}
+
 static inline bool mei_host_is_ready(struct mei_device *dev)
 {
        return dev->ops->host_is_ready(dev);