// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
 /* Copyright (c) 2019-2020 Marvell International Ltd. All rights reserved */
 
+#include <linux/bitfield.h>
 #include <linux/circ_buf.h>
 #include <linux/device.h>
 #include <linux/firmware.h>
 /* PRESTERA_CMD_RCV_CTL_REG flags */
 #define PRESTERA_CMD_F_REPL_SENT       BIT(0)
 
+#define PRESTERA_FW_EVT_CTL_STATUS_MASK        GENMASK(1, 0)
+
+#define PRESTERA_FW_EVT_CTL_STATUS_ON  0
+#define PRESTERA_FW_EVT_CTL_STATUS_OFF 1
+
 #define PRESTERA_EVTQ_REG_OFFSET(q, f)                 \
        (PRESTERA_FW_REG_OFFSET(evtq_list) +            \
         (q) * sizeof(struct prestera_fw_evtq_regs) +   \
        return PRESTERA_EVT_QNUM_MAX;
 }
 
+static void prestera_fw_evt_ctl_status_set(struct prestera_fw *fw, u32 val)
+{
+       u32 status = prestera_fw_read(fw, PRESTERA_FW_STATUS_REG);
+
+       u32p_replace_bits(&status, val, PRESTERA_FW_EVT_CTL_STATUS_MASK);
+
+       prestera_fw_write(fw, PRESTERA_FW_STATUS_REG, status);
+}
+
 static void prestera_fw_evt_work_fn(struct work_struct *work)
 {
        struct prestera_fw *fw;
        fw = container_of(work, struct prestera_fw, evt_work);
        msg = fw->evt_msg;
 
+       prestera_fw_evt_ctl_status_set(fw, PRESTERA_FW_EVT_CTL_STATUS_OFF);
+
        while ((qid = prestera_fw_evtq_pick(fw)) < PRESTERA_EVT_QNUM_MAX) {
                u32 idx;
                u32 len;
                if (fw->dev.recv_msg)
                        fw->dev.recv_msg(&fw->dev, msg, len);
        }
+
+       prestera_fw_evt_ctl_status_set(fw, PRESTERA_FW_EVT_CTL_STATUS_ON);
 }
 
 static int prestera_fw_wait_reg32(struct prestera_fw *fw, u32 reg, u32 cmp,