bnxt_en: Do not destroy health reporters during reset
authorEdwin Peer <edwin.peer@broadcom.com>
Sat, 5 Mar 2022 08:54:40 +0000 (03:54 -0500)
committerDavid S. Miller <davem@davemloft.net>
Sat, 5 Mar 2022 11:16:56 +0000 (11:16 +0000)
Health reporter state should be maintained over resets. Previously
reporters were destroyed if the device capabilities changed, but
since none of the reporters depend on capabilities anymore, this
logic should be removed.

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_devlink.c
drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.h

index 2280b189f3d67c7b14305a80aff6df37ef05bb5e..2de02950086fbf4bbcdb792cf6370f632c5859cc 100644 (file)
@@ -12149,11 +12149,6 @@ int bnxt_fw_init_one(struct bnxt *bp)
        if (rc)
                return rc;
 
-       /* In case fw capabilities have changed, destroy the unneeded
-        * reporters and create newly capable ones.
-        */
-       bnxt_dl_fw_reporters_destroy(bp, false);
-       bnxt_dl_fw_reporters_create(bp);
        bnxt_fw_init_one_p3(bp);
        return 0;
 }
@@ -12982,7 +12977,7 @@ static void bnxt_remove_one(struct pci_dev *pdev)
        cancel_delayed_work_sync(&bp->fw_reset_task);
        bp->sp_event = 0;
 
-       bnxt_dl_fw_reporters_destroy(bp, true);
+       bnxt_dl_fw_reporters_destroy(bp);
        bnxt_dl_unregister(bp);
        bnxt_shutdown_tc(bp);
 
index f6e21fac0e690d958fe0066c09443307d48a6e7e..0c17f90d44a25e5ac4030d7f89fffa1c5669569e 100644 (file)
@@ -241,37 +241,37 @@ static const struct devlink_health_reporter_ops bnxt_dl_fw_reporter_ops = {
        .recover = bnxt_fw_recover,
 };
 
-void bnxt_dl_fw_reporters_create(struct bnxt *bp)
+static struct devlink_health_reporter *
+__bnxt_dl_reporter_create(struct bnxt *bp,
+                         const struct devlink_health_reporter_ops *ops)
 {
-       struct bnxt_fw_health *health = bp->fw_health;
-
-       if (!health || health->fw_reporter)
-               return;
+       struct devlink_health_reporter *reporter;
 
-       health->fw_reporter =
-               devlink_health_reporter_create(bp->dl, &bnxt_dl_fw_reporter_ops,
-                                              0, bp);
-       if (IS_ERR(health->fw_reporter)) {
-               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;
+       reporter = devlink_health_reporter_create(bp->dl, ops, 0, bp);
+       if (IS_ERR(reporter)) {
+               netdev_warn(bp->dev, "Failed to create %s health reporter, rc = %ld\n",
+                           ops->name, PTR_ERR(reporter));
+               return NULL;
        }
+
+       return reporter;
 }
 
-void bnxt_dl_fw_reporters_destroy(struct bnxt *bp, bool all)
+void bnxt_dl_fw_reporters_create(struct bnxt *bp)
 {
-       struct bnxt_fw_health *health = bp->fw_health;
+       struct bnxt_fw_health *fw_health = bp->fw_health;
 
-       if (!health)
-               return;
+       if (fw_health && !fw_health->fw_reporter)
+               fw_health->fw_reporter = __bnxt_dl_reporter_create(bp, &bnxt_dl_fw_reporter_ops);
+}
 
-       if ((bp->fw_cap & BNXT_FW_CAP_ERROR_RECOVERY) && !all)
-               return;
+void bnxt_dl_fw_reporters_destroy(struct bnxt *bp)
+{
+       struct bnxt_fw_health *fw_health = bp->fw_health;
 
-       if (health->fw_reporter) {
-               devlink_health_reporter_destroy(health->fw_reporter);
-               health->fw_reporter = NULL;
+       if (fw_health && fw_health->fw_reporter) {
+               devlink_health_reporter_destroy(fw_health->fw_reporter);
+               fw_health->fw_reporter = NULL;
        }
 }
 
index a715458abc30e766867e6a14a27830156012a578..b8105065367b6029d03863e3c3be83637906e2d4 100644 (file)
@@ -75,7 +75,7 @@ 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);
+void bnxt_dl_fw_reporters_destroy(struct bnxt *bp);
 int bnxt_dl_register(struct bnxt *bp);
 void bnxt_dl_unregister(struct bnxt *bp);