OSDN Git Service

bnxt_en: remove fw_reset devlink health reporter
authorEdwin Peer <edwin.peer@broadcom.com>
Fri, 29 Oct 2021 07:47:44 +0000 (03:47 -0400)
committerDavid S. Miller <davem@davemloft.net>
Fri, 29 Oct 2021 11:13:05 +0000 (12:13 +0100)
Firmware resets initiated by the user are not errors and should not
be reported via devlink. Once only unsolicited resets remain, it is no
longer sensible to maintain a separate fw_reset reporter.

Signed-off-by: Edwin Peer <edwin.peer@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/bnxt/bnxt.c
drivers/net/ethernet/broadcom/bnxt/bnxt.h
drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.h

index 517ce16..1251d78 100644 (file)
@@ -2122,7 +2122,7 @@ static int bnxt_async_event_process(struct bnxt *bp,
                set_bit(BNXT_RESET_TASK_SILENT_SP_EVENT, &bp->sp_event);
                break;
        case ASYNC_EVENT_CMPL_EVENT_ID_RESET_NOTIFY: {
-               char *fatal_str = "non-fatal";
+               char *type_str = "Solicited";
 
                if (!bp->fw_health)
                        goto async_event_process_exit;
@@ -2137,12 +2137,16 @@ static int bnxt_async_event_process(struct bnxt *bp,
                if (EVENT_DATA1_RESET_NOTIFY_FW_ACTIVATION(data1)) {
                        set_bit(BNXT_STATE_FW_ACTIVATE_RESET, &bp->state);
                } else if (EVENT_DATA1_RESET_NOTIFY_FATAL(data1)) {
-                       fatal_str = "fatal";
+                       type_str = "Fatal";
                        set_bit(BNXT_STATE_FW_FATAL_COND, &bp->state);
+               } else if (data2 && BNXT_FW_STATUS_HEALTHY !=
+                          EVENT_DATA2_RESET_NOTIFY_FW_STATUS_CODE(data2)) {
+                       type_str = "Non-fatal";
+                       set_bit(BNXT_STATE_FW_NON_FATAL_COND, &bp->state);
                }
                netif_warn(bp, hw, bp->dev,
-                          "Firmware %s reset event, data1: 0x%x, data2: 0x%x, min wait %u ms, max wait %u ms\n",
-                          fatal_str, data1, data2,
+                          "%s firmware reset event, data1: 0x%x, data2: 0x%x, min wait %u ms, max wait %u ms\n",
+                          type_str, data1, data2,
                           bp->fw_reset_min_dsecs * 100,
                           bp->fw_reset_max_dsecs * 100);
                set_bit(BNXT_FW_RESET_NOTIFY_SP_EVENT, &bp->sp_event);
@@ -11737,13 +11741,17 @@ static void bnxt_sp_task(struct work_struct *work)
        if (test_and_clear_bit(BNXT_RST_RING_SP_EVENT, &bp->sp_event))
                bnxt_rx_ring_reset(bp);
 
-       if (test_and_clear_bit(BNXT_FW_RESET_NOTIFY_SP_EVENT, &bp->sp_event))
-               bnxt_devlink_health_report(bp, BNXT_FW_RESET_NOTIFY_SP_EVENT);
+       if (test_and_clear_bit(BNXT_FW_RESET_NOTIFY_SP_EVENT, &bp->sp_event)) {
+               if (test_bit(BNXT_STATE_FW_FATAL_COND, &bp->state) ||
+                   test_bit(BNXT_STATE_FW_NON_FATAL_COND, &bp->state))
+                       bnxt_devlink_health_fw_report(bp);
+               else
+                       bnxt_fw_reset(bp);
+       }
 
        if (test_and_clear_bit(BNXT_FW_EXCEPTION_SP_EVENT, &bp->sp_event)) {
                if (!is_bnxt_fw_ok(bp))
-                       bnxt_devlink_health_report(bp,
-                                                  BNXT_FW_EXCEPTION_SP_EVENT);
+                       bnxt_devlink_health_fw_report(bp);
        }
 
        smp_mb__before_atomic();
@@ -12079,7 +12087,7 @@ static void bnxt_fw_reset_abort(struct bnxt *bp, int rc)
        clear_bit(BNXT_STATE_IN_FW_RESET, &bp->state);
        if (bp->fw_reset_state != BNXT_FW_RESET_STATE_POLL_VF) {
                bnxt_ulp_start(bp, rc);
-               bnxt_dl_health_status_update(bp, false);
+               bnxt_dl_health_fw_status_update(bp, false);
        }
        bp->fw_reset_state = 0;
        dev_close(bp->dev);
@@ -12178,6 +12186,7 @@ static void bnxt_fw_reset_task(struct work_struct *work)
                        }
                }
                clear_bit(BNXT_STATE_FW_FATAL_COND, &bp->state);
+               clear_bit(BNXT_STATE_FW_NON_FATAL_COND, &bp->state);
                if (test_and_clear_bit(BNXT_STATE_FW_ACTIVATE_RESET, &bp->state) &&
                    !test_bit(BNXT_STATE_FW_ACTIVATE, &bp->state))
                        bnxt_dl_remote_reload(bp);
@@ -12230,9 +12239,11 @@ static void bnxt_fw_reset_task(struct work_struct *work)
                bnxt_vf_reps_alloc(bp);
                bnxt_vf_reps_open(bp);
                bnxt_ptp_reapply_pps(bp);
-               bnxt_dl_health_recovery_done(bp);
-               bnxt_dl_health_status_update(bp, true);
                clear_bit(BNXT_STATE_FW_ACTIVATE, &bp->state);
+               if (test_and_clear_bit(BNXT_STATE_RECOVER, &bp->state)) {
+                       bnxt_dl_health_fw_recovery_done(bp);
+                       bnxt_dl_health_fw_status_update(bp, true);
+               }
                rtnl_unlock();
                break;
        }
index 16d33d0..e640df6 100644 (file)
@@ -494,6 +494,10 @@ struct rx_tpa_end_cmp_ext {
          ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA1_REASON_CODE_MASK) ==\
        ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA1_REASON_CODE_FW_ACTIVATION)
 
+#define EVENT_DATA2_RESET_NOTIFY_FW_STATUS_CODE(data2)                 \
+       ((data2) &                                                      \
+       ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA2_FW_STATUS_CODE_MASK)
+
 #define EVENT_DATA1_RECOVERY_MASTER_FUNC(data1)                                \
        !!((data1) &                                                    \
           ASYNC_EVENT_CMPL_ERROR_RECOVERY_EVENT_DATA1_FLAGS_MASTER_FUNC)
@@ -1537,7 +1541,6 @@ struct bnxt_fw_health {
        u32 last_fw_reset_cnt;
        u8 enabled:1;
        u8 primary:1;
-       u8 fatal:1;
        u8 status_reliable:1;
        u8 tmr_multiplier;
        u8 tmr_counter;
@@ -1548,14 +1551,9 @@ struct bnxt_fw_health {
        u32 echo_req_data1;
        u32 echo_req_data2;
        struct devlink_health_reporter  *fw_reporter;
-       struct devlink_health_reporter *fw_reset_reporter;
        struct devlink_health_reporter *fw_fatal_reporter;
 };
 
-struct bnxt_fw_reporter_ctx {
-       unsigned long sp_event;
-};
-
 #define BNXT_FW_HEALTH_REG_TYPE_MASK   3
 #define BNXT_FW_HEALTH_REG_TYPE_CFG    0
 #define BNXT_FW_HEALTH_REG_TYPE_GRC    1
@@ -1894,6 +1892,8 @@ struct bnxt {
 #define BNXT_STATE_PCI_CHANNEL_IO_FROZEN       8
 #define BNXT_STATE_NAPI_DISABLED       9
 #define BNXT_STATE_FW_ACTIVATE         11
+#define BNXT_STATE_RECOVER             12
+#define BNXT_STATE_FW_NON_FATAL_COND   13
 #define BNXT_STATE_FW_ACTIVATE_RESET   14
 
 #define BNXT_NO_FW_ACCESS(bp)                                  \
index 8673f3c..2c72f3b 100644 (file)
 #include "bnxt_ulp.h"
 #include "bnxt_ptp.h"
 
+static void __bnxt_fw_recover(struct bnxt *bp)
+{
+       if (test_bit(BNXT_STATE_FW_FATAL_COND, &bp->state) ||
+           test_bit(BNXT_STATE_FW_NON_FATAL_COND, &bp->state))
+               bnxt_fw_reset(bp);
+       else
+               bnxt_fw_exception(bp);
+}
+
 static int
 bnxt_dl_flash_update(struct devlink *dl,
                     struct devlink_flash_update_params *params,
@@ -106,42 +115,14 @@ static const struct devlink_health_reporter_ops bnxt_dl_fw_reporter_ops = {
        .diagnose = bnxt_fw_reporter_diagnose,
 };
 
-static int bnxt_fw_reset_recover(struct devlink_health_reporter *reporter,
-                                void *priv_ctx,
-                                struct netlink_ext_ack *extack)
-{
-       struct bnxt *bp = devlink_health_reporter_priv(reporter);
-
-       if (!priv_ctx)
-               return -EOPNOTSUPP;
-
-       bnxt_fw_reset(bp);
-       return -EINPROGRESS;
-}
-
-static const
-struct devlink_health_reporter_ops bnxt_dl_fw_reset_reporter_ops = {
-       .name = "fw_reset",
-       .recover = bnxt_fw_reset_recover,
-};
-
 static int bnxt_fw_fatal_recover(struct devlink_health_reporter *reporter,
                                 void *priv_ctx,
                                 struct netlink_ext_ack *extack)
 {
        struct bnxt *bp = devlink_health_reporter_priv(reporter);
-       struct bnxt_fw_reporter_ctx *fw_reporter_ctx = priv_ctx;
-       unsigned long event;
-
-       if (!priv_ctx)
-               return -EOPNOTSUPP;
 
-       bp->fw_health->fatal = true;
-       event = fw_reporter_ctx->sp_event;
-       if (event == BNXT_FW_RESET_NOTIFY_SP_EVENT)
-               bnxt_fw_reset(bp);
-       else if (event == BNXT_FW_EXCEPTION_SP_EVENT)
-               bnxt_fw_exception(bp);
+       set_bit(BNXT_STATE_RECOVER, &bp->state);
+       __bnxt_fw_recover(bp);
 
        return -EINPROGRESS;
 }
@@ -159,24 +140,6 @@ void bnxt_dl_fw_reporters_create(struct bnxt *bp)
        if (!health)
                return;
 
-       if (!(bp->fw_cap & BNXT_FW_CAP_HOT_RESET) || health->fw_reset_reporter)
-               goto err_recovery;
-
-       health->fw_reset_reporter =
-               devlink_health_reporter_create(bp->dl,
-                                              &bnxt_dl_fw_reset_reporter_ops,
-                                              0, bp);
-       if (IS_ERR(health->fw_reset_reporter)) {
-               netdev_warn(bp->dev, "Failed to create FW fatal health reporter, rc = %ld\n",
-                           PTR_ERR(health->fw_reset_reporter));
-               health->fw_reset_reporter = NULL;
-               bp->fw_cap &= ~BNXT_FW_CAP_HOT_RESET;
-       }
-
-err_recovery:
-       if (!(bp->fw_cap & BNXT_FW_CAP_ERROR_RECOVERY))
-               return;
-
        if (!health->fw_reporter) {
                health->fw_reporter =
                        devlink_health_reporter_create(bp->dl,
@@ -186,7 +149,6 @@ err_recovery:
                        netdev_warn(bp->dev, "Failed to create FW health reporter, rc = %ld\n",
                                    PTR_ERR(health->fw_reporter));
                        health->fw_reporter = NULL;
-                       bp->fw_cap &= ~BNXT_FW_CAP_ERROR_RECOVERY;
                        return;
                }
        }
@@ -213,12 +175,6 @@ void bnxt_dl_fw_reporters_destroy(struct bnxt *bp, bool all)
        if (!health)
                return;
 
-       if ((all || !(bp->fw_cap & BNXT_FW_CAP_HOT_RESET)) &&
-           health->fw_reset_reporter) {
-               devlink_health_reporter_destroy(health->fw_reset_reporter);
-               health->fw_reset_reporter = NULL;
-       }
-
        if ((bp->fw_cap & BNXT_FW_CAP_ERROR_RECOVERY) && !all)
                return;
 
@@ -233,43 +189,23 @@ void bnxt_dl_fw_reporters_destroy(struct bnxt *bp, bool all)
        }
 }
 
-void bnxt_devlink_health_report(struct bnxt *bp, unsigned long event)
+void bnxt_devlink_health_fw_report(struct bnxt *bp)
 {
        struct bnxt_fw_health *fw_health = bp->fw_health;
-       struct bnxt_fw_reporter_ctx fw_reporter_ctx;
-
-       fw_reporter_ctx.sp_event = event;
-       switch (event) {
-       case BNXT_FW_RESET_NOTIFY_SP_EVENT:
-               if (test_bit(BNXT_STATE_FW_FATAL_COND, &bp->state)) {
-                       if (!fw_health->fw_fatal_reporter)
-                               return;
-
-                       devlink_health_report(fw_health->fw_fatal_reporter,
-                                             "FW fatal async event received",
-                                             &fw_reporter_ctx);
-                       return;
-               }
-               if (!fw_health->fw_reset_reporter)
-                       return;
 
-               devlink_health_report(fw_health->fw_reset_reporter,
-                                     "FW non-fatal reset event received",
-                                     &fw_reporter_ctx);
+       if (!fw_health)
                return;
 
-       case BNXT_FW_EXCEPTION_SP_EVENT:
-               if (!fw_health->fw_fatal_reporter)
-                       return;
-
-               devlink_health_report(fw_health->fw_fatal_reporter,
-                                     "FW fatal error reported",
-                                     &fw_reporter_ctx);
+       if (!fw_health->fw_fatal_reporter) {
+               __bnxt_fw_recover(bp);
                return;
        }
+
+       devlink_health_report(fw_health->fw_fatal_reporter,
+                             "FW fatal error reported", NULL);
 }
 
-void bnxt_dl_health_status_update(struct bnxt *bp, bool healthy)
+void bnxt_dl_health_fw_status_update(struct bnxt *bp, bool healthy)
 {
        struct bnxt_fw_health *health = bp->fw_health;
        u8 state;
@@ -279,25 +215,15 @@ void bnxt_dl_health_status_update(struct bnxt *bp, bool healthy)
        else
                state = DEVLINK_HEALTH_REPORTER_STATE_ERROR;
 
-       if (health->fatal)
-               devlink_health_reporter_state_update(health->fw_fatal_reporter,
-                                                    state);
-       else
-               devlink_health_reporter_state_update(health->fw_reset_reporter,
-                                                    state);
-
-       health->fatal = false;
+       devlink_health_reporter_state_update(health->fw_fatal_reporter, state);
 }
 
-void bnxt_dl_health_recovery_done(struct bnxt *bp)
+void bnxt_dl_health_fw_recovery_done(struct bnxt *bp)
 {
        struct bnxt_fw_health *hlth = bp->fw_health;
        struct bnxt_dl *dl = devlink_priv(bp->dl);
 
-       if (hlth->fatal)
-               devlink_health_reporter_recovery_done(hlth->fw_fatal_reporter);
-       else
-               devlink_health_reporter_recovery_done(hlth->fw_reset_reporter);
+       devlink_health_reporter_recovery_done(hlth->fw_fatal_reporter);
        bnxt_hwrm_remote_dev_reset_set(bp, dl->remote_reset);
 }
 
index 456e18c..a715458 100644 (file)
@@ -71,9 +71,9 @@ enum bnxt_dl_version_type {
        BNXT_VERSION_STORED,
 };
 
-void bnxt_devlink_health_report(struct bnxt *bp, unsigned long event);
-void bnxt_dl_health_status_update(struct bnxt *bp, bool healthy);
-void bnxt_dl_health_recovery_done(struct bnxt *bp);
+void bnxt_devlink_health_fw_report(struct bnxt *bp);
+void bnxt_dl_health_fw_status_update(struct bnxt *bp, bool healthy);
+void bnxt_dl_health_fw_recovery_done(struct bnxt *bp);
 void bnxt_dl_fw_reporters_create(struct bnxt *bp);
 void bnxt_dl_fw_reporters_destroy(struct bnxt *bp, bool all);
 int bnxt_dl_register(struct bnxt *bp);