From: Shai Brandes <shaib...@amazon.com>

There can be cases when we trigger reset if an admin interrupt
is missing.
In order to identify this use-case specifically,
this commit adds a new reset reason.

Signed-off-by: Shai Brandes <shaib...@amazon.com>
Reviewed-by: Amit Bernstein <amitb...@amazon.com>
---
 drivers/net/ena/hal/ena_com.c                |  2 ++
 drivers/net/ena/hal/ena_com.h                | 12 ++++++++++++
 drivers/net/ena/hal/ena_defs/ena_regs_defs.h |  1 +
 3 files changed, 15 insertions(+)

diff --git a/drivers/net/ena/hal/ena_com.c b/drivers/net/ena/hal/ena_com.c
index d2de5e172d..8e9c112715 100644
--- a/drivers/net/ena/hal/ena_com.c
+++ b/drivers/net/ena/hal/ena_com.c
@@ -803,6 +803,7 @@ static int 
ena_com_wait_and_process_admin_cq_interrupts(struct ena_comp_ctx *com
                ENA_SPINLOCK_UNLOCK(admin_queue->q_lock, flags);
 
                if (comp_ctx->status == ENA_CMD_COMPLETED) {
+                       admin_queue->is_missing_admin_interrupt = true;
                        ena_trc_err(admin_queue->ena_dev,
                                    "The ena device sent a completion but the 
driver didn't receive a MSI-X interrupt (cmd %d), autopolling mode is %s\n",
                                    comp_ctx->cmd_opcode, 
admin_queue->auto_polling ? "ON" : "OFF");
@@ -2138,6 +2139,7 @@ int ena_com_admin_init(struct ena_com_dev *ena_dev,
 
        admin_queue->ena_dev = ena_dev;
        admin_queue->running_state = true;
+       admin_queue->is_missing_admin_interrupt = false;
 
        return 0;
 error:
diff --git a/drivers/net/ena/hal/ena_com.h b/drivers/net/ena/hal/ena_com.h
index c62016cc06..c999cd2381 100644
--- a/drivers/net/ena/hal/ena_com.h
+++ b/drivers/net/ena/hal/ena_com.h
@@ -237,6 +237,8 @@ struct ena_com_admin_queue {
         */
        bool running_state;
 
+       bool is_missing_admin_interrupt;
+
        /* Count the number of outstanding admin commands */
        ena_atomic32_t outstanding_cmds;
 
@@ -1089,6 +1091,16 @@ int ena_com_config_dev_mode(struct ena_com_dev *ena_dev,
                            struct ena_admin_feature_llq_desc *llq_features,
                            struct ena_llq_configurations *llq_default_config);
 
+/* ena_com_get_missing_admin_interrupt - Return if there is a missing admin 
interrupt
+ * @ena_dev: ENA communication layer struct
+ *
+ * @return - true if there is a missing admin interrupt or false otherwise
+ */
+static inline bool ena_com_get_missing_admin_interrupt(struct ena_com_dev 
*ena_dev)
+{
+       return ena_dev->admin_queue.is_missing_admin_interrupt;
+}
+
 /* ena_com_io_sq_to_ena_dev - Extract ena_com_dev using contained field io_sq.
  * @io_sq: IO submit queue struct
  *
diff --git a/drivers/net/ena/hal/ena_defs/ena_regs_defs.h 
b/drivers/net/ena/hal/ena_defs/ena_regs_defs.h
index a94025dc77..db6a97d675 100644
--- a/drivers/net/ena/hal/ena_defs/ena_regs_defs.h
+++ b/drivers/net/ena/hal/ena_defs/ena_regs_defs.h
@@ -24,6 +24,7 @@ enum ena_regs_reset_reason_types {
        ENA_REGS_RESET_SUSPECTED_POLL_STARVATION    = 15,
        ENA_REGS_RESET_RX_DESCRIPTOR_MALFORMED      = 16,
        ENA_REGS_RESET_TX_DESCRIPTOR_MALFORMED      = 17,
+       ENA_REGS_RESET_MISSING_ADMIN_INTERRUPT      = 18,
        ENA_REGS_RESET_LAST,
 };
 
-- 
2.17.1

Reply via email to