Thomas Bogendoerfer 9f9f65
From: Edwin Peer <edwin.peer@broadcom.com>
Thomas Bogendoerfer 9f9f65
Date: Fri, 29 Oct 2021 03:47:47 -0400
Thomas Bogendoerfer 9f9f65
Subject: bnxt_en: Refactor coredump functions
Thomas Bogendoerfer 9f9f65
Patch-mainline: v5.16-rc1
Thomas Bogendoerfer 9f9f65
Git-commit: 9a575c8c25ae2372112db6d6b3e553cd90e9f02b
Thomas Bogendoerfer 9f9f65
References: jsc#SLE-18978
Thomas Bogendoerfer 9f9f65
Thomas Bogendoerfer 9f9f65
The coredump functionality will be used by devlink health. Refactor
Thomas Bogendoerfer 9f9f65
these functions that get coredump and coredump length. There is no
Thomas Bogendoerfer 9f9f65
functional change, but the following checkpatch warnings were
Thomas Bogendoerfer 9f9f65
addressed:
Thomas Bogendoerfer 9f9f65
Thomas Bogendoerfer 9f9f65
  - strscpy is preferred over strlcpy.
Thomas Bogendoerfer 9f9f65
  - sscanf results should be checked, with an additional warning.
Thomas Bogendoerfer 9f9f65
Thomas Bogendoerfer 9f9f65
Signed-off-by: Edwin Peer <edwin.peer@broadcom.com>
Thomas Bogendoerfer 9f9f65
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Thomas Bogendoerfer 9f9f65
Signed-off-by: David S. Miller <davem@davemloft.net>
Thomas Bogendoerfer 9f9f65
Acked-by: Thomas Bogendoerfer <tbogendoerfer@suse.de>
Thomas Bogendoerfer 9f9f65
---
Thomas Bogendoerfer 9f9f65
 drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c |   48 ++++++++++++++--------
Thomas Bogendoerfer 9f9f65
 1 file changed, 31 insertions(+), 17 deletions(-)
Thomas Bogendoerfer 9f9f65
Thomas Bogendoerfer 9f9f65
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
Thomas Bogendoerfer 9f9f65
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
Thomas Bogendoerfer 9f9f65
@@ -3808,7 +3808,7 @@ bnxt_fill_coredump_record(struct bnxt *b
Thomas Bogendoerfer 9f9f65
 	record->low_version = 0;
Thomas Bogendoerfer 9f9f65
 	record->high_version = 1;
Thomas Bogendoerfer 9f9f65
 	record->asic_state = 0;
Thomas Bogendoerfer 9f9f65
-	strlcpy(record->system_name, utsname()->nodename,
Thomas Bogendoerfer 9f9f65
+	strscpy(record->system_name, utsname()->nodename,
Thomas Bogendoerfer 9f9f65
 		sizeof(record->system_name));
Thomas Bogendoerfer 9f9f65
 	record->year = cpu_to_le16(tm.tm_year + 1900);
Thomas Bogendoerfer 9f9f65
 	record->month = cpu_to_le16(tm.tm_mon + 1);
Thomas Bogendoerfer 9f9f65
@@ -3820,11 +3820,12 @@ bnxt_fill_coredump_record(struct bnxt *b
Thomas Bogendoerfer 9f9f65
 	strcpy(record->commandline, "ethtool -w");
Thomas Bogendoerfer 9f9f65
 	record->total_segments = cpu_to_le32(total_segs);
Thomas Bogendoerfer 9f9f65
 
Thomas Bogendoerfer 9f9f65
-	sscanf(utsname()->release, "%u.%u", &os_ver_major, &os_ver_minor);
Thomas Bogendoerfer 9f9f65
+	if (sscanf(utsname()->release, "%u.%u", &os_ver_major, &os_ver_minor) != 2)
Thomas Bogendoerfer 9f9f65
+		netdev_warn(bp->dev, "Unknown OS release in coredump\n");
Thomas Bogendoerfer 9f9f65
 	record->os_ver_major = cpu_to_le32(os_ver_major);
Thomas Bogendoerfer 9f9f65
 	record->os_ver_minor = cpu_to_le32(os_ver_minor);
Thomas Bogendoerfer 9f9f65
 
Thomas Bogendoerfer 9f9f65
-	strlcpy(record->os_name, utsname()->sysname, 32);
Thomas Bogendoerfer 9f9f65
+	strscpy(record->os_name, utsname()->sysname, sizeof(record->os_name));
Thomas Bogendoerfer 9f9f65
 	time64_to_tm(end, 0, &tm;;
Thomas Bogendoerfer 9f9f65
 	record->end_year = cpu_to_le16(tm.tm_year + 1900);
Thomas Bogendoerfer 9f9f65
 	record->end_month = cpu_to_le16(tm.tm_mon + 1);
Thomas Bogendoerfer 9f9f65
@@ -3842,7 +3843,7 @@ bnxt_fill_coredump_record(struct bnxt *b
Thomas Bogendoerfer 9f9f65
 	record->ioctl_high_version = 0;
Thomas Bogendoerfer 9f9f65
 }
Thomas Bogendoerfer 9f9f65
 
Thomas Bogendoerfer 9f9f65
-static int bnxt_get_coredump(struct bnxt *bp, void *buf, u32 *dump_len)
Thomas Bogendoerfer 9f9f65
+static int __bnxt_get_coredump(struct bnxt *bp, void *buf, u32 *dump_len)
Thomas Bogendoerfer 9f9f65
 {
Thomas Bogendoerfer 9f9f65
 	u32 ver_get_resp_len = sizeof(struct hwrm_ver_get_output);
Thomas Bogendoerfer 9f9f65
 	u32 offset = 0, seg_hdr_len, seg_record_len, buf_len = 0;
Thomas Bogendoerfer 9f9f65
@@ -3945,6 +3946,30 @@ err:
Thomas Bogendoerfer 9f9f65
 	return rc;
Thomas Bogendoerfer 9f9f65
 }
Thomas Bogendoerfer 9f9f65
 
Thomas Bogendoerfer 9f9f65
+static int bnxt_get_coredump(struct bnxt *bp, u16 dump_type, void *buf, u32 *dump_len)
Thomas Bogendoerfer 9f9f65
+{
Thomas Bogendoerfer 9f9f65
+	if (dump_type == BNXT_DUMP_CRASH) {
Thomas Bogendoerfer 9f9f65
+#ifdef CONFIG_TEE_BNXT_FW
Thomas Bogendoerfer 9f9f65
+		return tee_bnxt_copy_coredump(buf, 0, *dump_len);
Thomas Bogendoerfer 9f9f65
+#else
Thomas Bogendoerfer 9f9f65
+		return -EOPNOTSUPP;
Thomas Bogendoerfer 9f9f65
+#endif
Thomas Bogendoerfer 9f9f65
+	} else {
Thomas Bogendoerfer 9f9f65
+		return __bnxt_get_coredump(bp, buf, dump_len);
Thomas Bogendoerfer 9f9f65
+	}
Thomas Bogendoerfer 9f9f65
+}
Thomas Bogendoerfer 9f9f65
+
Thomas Bogendoerfer 9f9f65
+static u32 bnxt_get_coredump_length(struct bnxt *bp, u16 dump_type)
Thomas Bogendoerfer 9f9f65
+{
Thomas Bogendoerfer 9f9f65
+	u32 len = 0;
Thomas Bogendoerfer 9f9f65
+
Thomas Bogendoerfer 9f9f65
+	if (dump_type == BNXT_DUMP_CRASH)
Thomas Bogendoerfer 9f9f65
+		len = BNXT_CRASH_DUMP_LEN;
Thomas Bogendoerfer 9f9f65
+	else
Thomas Bogendoerfer 9f9f65
+		__bnxt_get_coredump(bp, NULL, &len;;
Thomas Bogendoerfer 9f9f65
+	return len;
Thomas Bogendoerfer 9f9f65
+}
Thomas Bogendoerfer 9f9f65
+
Thomas Bogendoerfer 9f9f65
 static int bnxt_set_dump(struct net_device *dev, struct ethtool_dump *dump)
Thomas Bogendoerfer 9f9f65
 {
Thomas Bogendoerfer 9f9f65
 	struct bnxt *bp = netdev_priv(dev);
Thomas Bogendoerfer 9f9f65
@@ -3976,10 +4001,7 @@ static int bnxt_get_dump_flag(struct net
Thomas Bogendoerfer 9f9f65
 			bp->ver_resp.hwrm_fw_rsvd_8b;
Thomas Bogendoerfer 9f9f65
 
Thomas Bogendoerfer 9f9f65
 	dump->flag = bp->dump_flag;
Thomas Bogendoerfer 9f9f65
-	if (bp->dump_flag == BNXT_DUMP_CRASH)
Thomas Bogendoerfer 9f9f65
-		dump->len = BNXT_CRASH_DUMP_LEN;
Thomas Bogendoerfer 9f9f65
-	else
Thomas Bogendoerfer 9f9f65
-		bnxt_get_coredump(bp, NULL, &dump->len);
Thomas Bogendoerfer 9f9f65
+	dump->len = bnxt_get_coredump_length(bp, bp->dump_flag);
Thomas Bogendoerfer 9f9f65
 	return 0;
Thomas Bogendoerfer 9f9f65
 }
Thomas Bogendoerfer 9f9f65
 
Thomas Bogendoerfer 9f9f65
@@ -3994,15 +4016,7 @@ static int bnxt_get_dump_data(struct net
Thomas Bogendoerfer 9f9f65
 	memset(buf, 0, dump->len);
Thomas Bogendoerfer 9f9f65
 
Thomas Bogendoerfer 9f9f65
 	dump->flag = bp->dump_flag;
Thomas Bogendoerfer 9f9f65
-	if (dump->flag == BNXT_DUMP_CRASH) {
Thomas Bogendoerfer 9f9f65
-#ifdef CONFIG_TEE_BNXT_FW
Thomas Bogendoerfer 9f9f65
-		return tee_bnxt_copy_coredump(buf, 0, dump->len);
Thomas Bogendoerfer 9f9f65
-#endif
Thomas Bogendoerfer 9f9f65
-	} else {
Thomas Bogendoerfer 9f9f65
-		return bnxt_get_coredump(bp, buf, &dump->len);
Thomas Bogendoerfer 9f9f65
-	}
Thomas Bogendoerfer 9f9f65
-
Thomas Bogendoerfer 9f9f65
-	return 0;
Thomas Bogendoerfer 9f9f65
+	return bnxt_get_coredump(bp, dump->flag, buf, &dump->len);
Thomas Bogendoerfer 9f9f65
 }
Thomas Bogendoerfer 9f9f65
 
Thomas Bogendoerfer 9f9f65
 static int bnxt_get_ts_info(struct net_device *dev,