Blame SOURCES/0074-netdrv-bnxt_en-Add-devlink-health-reset-reporter.patch

f95c89
From dd8e8f16e4fa95d701b184f9e8b93bd3f0177cb8 Mon Sep 17 00:00:00 2001
f95c89
From: Jonathan Toppins <jtoppins@redhat.com>
f95c89
Date: Wed, 2 Oct 2019 18:23:29 -0400
f95c89
Subject: [PATCH 74/96] [netdrv] bnxt_en: Add devlink health reset reporter
f95c89
f95c89
Message-id: <4524cb0b03008ec82cf84ba49c1d62dc2c7e029a.1570027456.git.jtoppins@redhat.com>
f95c89
Patchwork-id: 276496
f95c89
O-Subject: [RHEL-8.2 PATCH 67/78] bnxt_en: Add devlink health reset reporter.
f95c89
Bugzilla: 1724766
f95c89
RH-Acked-by: John Linville <linville@redhat.com>
f95c89
RH-Acked-by: Jarod Wilson <jarod@redhat.com>
f95c89
f95c89
Add devlink health reporter for the firmware reset event.  Once we get
f95c89
the notification from firmware about the impending reset, the driver
f95c89
will report this to devlink and the call to bnxt_fw_reset() will be
f95c89
initiated to complete the reset sequence.
f95c89
f95c89
Cc: Jiri Pirko <jiri@mellanox.com>
f95c89
Signed-off-by: Vasundhara Volam <vasundhara-v.volam@broadcom.com>
f95c89
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
f95c89
Signed-off-by: David S. Miller <davem@davemloft.net>
f95c89
(cherry picked from commit 657a33c8a0a2342e91259b28356838dc89216b19)
f95c89
Bugzilla: 1724766
f95c89
Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532
f95c89
Tested: build, boot, basic ping
f95c89
Signed-off-by: Jonathan Toppins <jtoppins@redhat.com>
f95c89
Signed-off-by: Bruno Meneguele <bmeneg@redhat.com>
f95c89
---
f95c89
 drivers/net/ethernet/broadcom/bnxt/bnxt.c         |  3 ++
f95c89
 drivers/net/ethernet/broadcom/bnxt/bnxt.h         |  5 +++
f95c89
 drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c | 52 +++++++++++++++++++++++
f95c89
 drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.h |  1 +
f95c89
 4 files changed, 61 insertions(+)
f95c89
f95c89
Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c
f95c89
===================================================================
f95c89
--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c	2020-02-06 16:23:20.162472286 +0100
f95c89
+++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c	2020-02-06 16:23:20.307470956 +0100
f95c89
@@ -10172,6 +10172,9 @@
f95c89
 	if (test_and_clear_bit(BNXT_RESET_TASK_SILENT_SP_EVENT, &bp->sp_event))
f95c89
 		bnxt_reset(bp, true);
f95c89
 
f95c89
+	if (test_and_clear_bit(BNXT_FW_RESET_NOTIFY_SP_EVENT, &bp->sp_event))
f95c89
+		bnxt_devlink_health_report(bp, BNXT_FW_RESET_NOTIFY_SP_EVENT);
f95c89
+
f95c89
 	smp_mb__before_atomic();
f95c89
 	clear_bit(BNXT_STATE_IN_SP_TASK, &bp->state);
f95c89
 }
f95c89
Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.h
f95c89
===================================================================
f95c89
--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.h	2020-02-06 16:23:20.163472277 +0100
f95c89
+++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.h	2020-02-06 16:23:20.307470956 +0100
f95c89
@@ -1371,6 +1371,11 @@
f95c89
 	u32 fw_reset_seq_vals[16];
f95c89
 	u32 fw_reset_seq_delay_msec[16];
f95c89
 	struct devlink_health_reporter	*fw_reporter;
f95c89
+	struct devlink_health_reporter *fw_reset_reporter;
f95c89
+};
f95c89
+
f95c89
+struct bnxt_fw_reporter_ctx {
f95c89
+	unsigned long sp_event;
f95c89
 };
f95c89
 
f95c89
 #define BNXT_FW_HEALTH_REG_TYPE_MASK	3
f95c89
Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
f95c89
===================================================================
f95c89
--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c	2020-02-06 16:23:19.896474728 +0100
f95c89
+++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c	2020-02-06 16:23:20.308470946 +0100
f95c89
@@ -65,6 +65,24 @@
f95c89
 	.diagnose = bnxt_fw_reporter_diagnose,
f95c89
 };
f95c89
 
f95c89
+static int bnxt_fw_reset_recover(struct devlink_health_reporter *reporter,
f95c89
+				 void *priv_ctx)
f95c89
+{
f95c89
+	struct bnxt *bp = devlink_health_reporter_priv(reporter);
f95c89
+
f95c89
+	if (!priv_ctx)
f95c89
+		return -EOPNOTSUPP;
f95c89
+
f95c89
+	bnxt_fw_reset(bp);
f95c89
+	return 0;
f95c89
+}
f95c89
+
f95c89
+static const
f95c89
+struct devlink_health_reporter_ops bnxt_dl_fw_reset_reporter_ops = {
f95c89
+	.name = "fw_reset",
f95c89
+	.recover = bnxt_fw_reset_recover,
f95c89
+};
f95c89
+
f95c89
 static void bnxt_dl_fw_reporters_create(struct bnxt *bp)
f95c89
 {
f95c89
 	struct bnxt_fw_health *health = bp->fw_health;
f95c89
@@ -80,6 +98,16 @@
f95c89
 			    PTR_ERR(health->fw_reporter));
f95c89
 		health->fw_reporter = NULL;
f95c89
 	}
f95c89
+
f95c89
+	health->fw_reset_reporter =
f95c89
+		devlink_health_reporter_create(bp->dl,
f95c89
+					       &bnxt_dl_fw_reset_reporter_ops,
f95c89
+					       0, true, bp);
f95c89
+	if (IS_ERR(health->fw_reset_reporter)) {
f95c89
+		netdev_warn(bp->dev, "Failed to create FW fatal health reporter, rc = %ld\n",
f95c89
+			    PTR_ERR(health->fw_reset_reporter));
f95c89
+		health->fw_reset_reporter = NULL;
f95c89
+	}
f95c89
 }
f95c89
 
f95c89
 static void bnxt_dl_fw_reporters_destroy(struct bnxt *bp)
f95c89
@@ -91,6 +119,30 @@
f95c89
 
f95c89
 	if (health->fw_reporter)
f95c89
 		devlink_health_reporter_destroy(health->fw_reporter);
f95c89
+
f95c89
+	if (health->fw_reset_reporter)
f95c89
+		devlink_health_reporter_destroy(health->fw_reset_reporter);
f95c89
+}
f95c89
+
f95c89
+void bnxt_devlink_health_report(struct bnxt *bp, unsigned long event)
f95c89
+{
f95c89
+	struct bnxt_fw_health *fw_health = bp->fw_health;
f95c89
+	struct bnxt_fw_reporter_ctx fw_reporter_ctx;
f95c89
+
f95c89
+	if (!fw_health)
f95c89
+		return;
f95c89
+
f95c89
+	fw_reporter_ctx.sp_event = event;
f95c89
+	switch (event) {
f95c89
+	case BNXT_FW_RESET_NOTIFY_SP_EVENT:
f95c89
+		if (!fw_health->fw_reset_reporter)
f95c89
+			return;
f95c89
+
f95c89
+		devlink_health_report(fw_health->fw_reset_reporter,
f95c89
+				      "FW non-fatal reset event received",
f95c89
+				      &fw_reporter_ctx);
f95c89
+		return;
f95c89
+	}
f95c89
 }
f95c89
 
f95c89
 static const struct devlink_ops bnxt_dl_ops = {
f95c89
Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.h
f95c89
===================================================================
f95c89
--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.h	2020-02-06 16:23:11.278553834 +0100
f95c89
+++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.h	2020-02-06 16:23:20.308470946 +0100
f95c89
@@ -55,6 +55,7 @@
f95c89
 	u16 num_bits;
f95c89
 };
f95c89
 
f95c89
+void bnxt_devlink_health_report(struct bnxt *bp, unsigned long event);
f95c89
 int bnxt_dl_register(struct bnxt *bp);
f95c89
 void bnxt_dl_unregister(struct bnxt *bp);
f95c89