diff mbox series

[10/14] qla2xxx: Correction and improvement to fwdt processing

Message ID 20190308051704.30752-11-hmadhani@marvell.com (mailing list archive)
State Superseded
Headers show
Series qla2xxx: Add support for ISP28XX (Gen7) adapter | expand

Commit Message

Himanshu Madhani March 8, 2019, 5:17 a.m. UTC
From: Joe Carnuccio <joe.carnuccio@cavium.com>

This patch cleans up and fixes firmware dump template
processing. These changes are added to support newer
features for ISP27XX/ISP28XX.

Signed-off-by: Joe Carnuccio <joe.carnuccio@cavium.com>
Signed-off-by: Himanshu Madhani <hmadhani@marvell.com>
---
 drivers/scsi/qla2xxx/qla_tmpl.c | 51 ++++++++++++++++++++++-------------------
 drivers/scsi/qla2xxx/qla_tmpl.h |  2 +-
 2 files changed, 29 insertions(+), 24 deletions(-)
diff mbox series

Patch

diff --git a/drivers/scsi/qla2xxx/qla_tmpl.c b/drivers/scsi/qla2xxx/qla_tmpl.c
index fab09bcefc72..07ebebcbc0db 100644
--- a/drivers/scsi/qla2xxx/qla_tmpl.c
+++ b/drivers/scsi/qla2xxx/qla_tmpl.c
@@ -99,9 +99,9 @@  static inline void
 qla27xx_write_reg(__iomem struct device_reg_24xx *reg,
 	uint offset, uint32_t data, void *buf)
 {
-	__iomem void *window = (void __iomem *)reg + offset;
-
 	if (buf) {
+		void __iomem *window = (void __iomem *)reg + offset;
+
 		WRT_REG_DWORD(window, data);
 	}
 }
@@ -697,9 +697,9 @@  static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t275(struct scsi_qla_host *vha,
 	struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
-	ulong offset = offsetof(typeof(*ent), t275.buffer);
-	ulong length = le32_to_cpu(ent->t275.length);
 	ulong size = le32_to_cpu(ent->hdr.size);
+	ulong length = le32_to_cpu(ent->t275.length);
+	ulong offset = offsetof(typeof(*ent), t275.buffer);
 	void *buffer = ent->t275.buffer;
 
 	ql_dbg(ql_dbg_misc + ql_dbg_verbose, vha, 0xd213,
@@ -711,10 +711,10 @@  qla27xx_fwdt_entry_t275(struct scsi_qla_host *vha,
 		goto done;
 	}
 	if (offset + length > size) {
+		length = size - offset;
 		ql_dbg(ql_dbg_misc, vha, 0xd030,
-		    "%s: buffer overflow\n", __func__);
-		qla27xx_skip_entry(ent, buf);
-		goto done;
+		    "%s: buffer overflow, truncate [%lx]\n", __func__, length);
+		ent->t275.length = cpu_to_le32(length);
 	}
 
 	qla27xx_insertbuf(buffer, length, buf, len);
@@ -726,17 +726,22 @@  static struct qla27xx_fwdt_entry *
 qla27xx_fwdt_entry_t276(struct scsi_qla_host *vha,
     struct qla27xx_fwdt_entry *ent, void *buf, ulong *len)
 {
-	ulong cond1 = le32_to_cpu(ent->t276.cond1);
-	ulong cond2 = le32_to_cpu(ent->t276.cond2);
-	uint type = vha->hw->pdev->device >> 4 & 0xf;
-	uint func = vha->hw->port_no & 0x3;
-
 	ql_dbg(ql_dbg_misc + ql_dbg_verbose, vha, 0xd214,
 	    "%s: cond [%lx]\n", __func__, *len);
 
-	if (type != cond1 || func != cond2) {
-		ent = qla27xx_next_entry(ent);
-		qla27xx_skip_entry(ent, buf);
+	if (buf) {
+		ulong cond1 = le32_to_cpu(ent->t276.cond1);
+		ulong cond2 = le32_to_cpu(ent->t276.cond2);
+		uint type = vha->hw->pdev->device >> 4 & 0xf;
+		uint func = vha->hw->port_no & 0x3;
+
+		if (type != cond1 || func != cond2) {
+			struct qla27xx_fwdt_template *tmp = buf;
+
+			tmp->count--;
+			ent = qla27xx_next_entry(ent);
+			qla27xx_skip_entry(ent, buf);
+		}
 	}
 
 	return qla27xx_next_entry(ent);
@@ -842,25 +847,25 @@  qla27xx_walk_template(struct scsi_qla_host *vha,
 {
 	struct qla27xx_fwdt_entry *ent =
 	    (void *)tmp + le32_to_cpu(tmp->entry_offset);
-	ulong count = le32_to_cpu(tmp->entry_count);
-	ulong type = 0;
+	ulong type;
 
+	tmp->count = le32_to_cpu(tmp->entry_count);
 	ql_dbg(ql_dbg_misc, vha, 0xd01a,
-	    "%s: entry count %lx\n", __func__, count);
-	while (count--) {
+	    "%s: entry count %u\n", __func__, tmp->count);
+	while (ent && tmp->count--) {
 		type = le32_to_cpu(ent->hdr.type);
 		ent = qla27xx_find_entry(type)(vha, ent, buf, len);
-		if (!ent)
-			break;
 	}
 
-	if (count)
+	if (tmp->count)
 		ql_dbg(ql_dbg_misc, vha, 0xd018,
-		    "%s: entry count residual=+%lu\n", __func__, count);
+		    "%s: entry count residual=+%u\n", __func__, tmp->count);
 
 	if (ent)
 		ql_dbg(ql_dbg_misc, vha, 0xd019,
 		    "%s: missing end entry\n", __func__);
+
+	cpu_to_le32s(&tmp->count);	/* endianize residual count */
 }
 
 static void
diff --git a/drivers/scsi/qla2xxx/qla_tmpl.h b/drivers/scsi/qla2xxx/qla_tmpl.h
index 5c2c2a8a19c4..030633ee47f8 100644
--- a/drivers/scsi/qla2xxx/qla_tmpl.h
+++ b/drivers/scsi/qla2xxx/qla_tmpl.h
@@ -14,7 +14,7 @@  struct __packed qla27xx_fwdt_template {
 	uint32_t template_type;
 	uint32_t entry_offset;
 	uint32_t template_size;
-	uint32_t reserved_1;
+	uint32_t count;		/* borrow field for running/residual count */
 
 	uint32_t entry_count;
 	uint32_t template_version;