Commit d52cd774 authored by Quinn Tran's avatar Quinn Tran Committed by Martin K. Petersen
Browse files

scsi: qla2xxx: Capture FW dump on MPI heartbeat stop event

For MPI heartbeat stop Async Event, this patch would capture MPI FW dump
and chip reset. FW will tell which function to capture FW dump for.

Link: https://lore.kernel.org/r/20190912180918.6436-13-hmadhani@marvell.com


Reviewed-by: default avatarLaurence Oberman <loberman@redhat.com>
Signed-off-by: default avatarQuinn Tran <qutran@marvell.com>
Signed-off-by: default avatarHimanshu Madhani <hmadhani@marvell.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent c5547419
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -102,8 +102,10 @@ qla2x00_sysfs_write_fw_dump(struct file *filp, struct kobject *kobj,
			qla8044_idc_lock(ha);
			qla82xx_set_reset_owner(vha);
			qla8044_idc_unlock(ha);
		} else
		} else {
			ha->fw_dump_mpi = 1;
			qla2x00_system_error(vha);
		}
		break;
	case 4:
		if (IS_P3P_TYPE(ha)) {
+26 −5
Original line number Diff line number Diff line
@@ -1227,11 +1227,32 @@ global_port_update:
		break;

	case MBA_IDC_AEN:
		if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) {
			ha->flags.fw_init_done = 0;
			ql_log(ql_log_warn, vha, 0xffff,
			    "MPI Heartbeat stop. Chip reset needed. MB0[%xh] MB1[%xh] MB2[%xh] MB3[%xh]\n",
			    mb[0], mb[1], mb[2], mb[3]);

			if ((mb[1] & BIT_8) ||
			    (mb[2] & BIT_8)) {
				ql_log(ql_log_warn, vha, 0xd013,
				    "MPI Heartbeat stop. FW dump needed\n");
				ha->fw_dump_mpi = 1;
				ha->isp_ops->fw_dump(vha, 1);
			}
			set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
			qla2xxx_wake_dpc(vha);
		} else if (IS_QLA83XX(ha)) {
			mb[4] = RD_REG_WORD(&reg24->mailbox4);
			mb[5] = RD_REG_WORD(&reg24->mailbox5);
			mb[6] = RD_REG_WORD(&reg24->mailbox6);
			mb[7] = RD_REG_WORD(&reg24->mailbox7);
			qla83xx_handle_8200_aen(vha, mb);
		} else {
			ql_dbg(ql_dbg_async, vha, 0x5052,
			    "skip Heartbeat processing mb0-3=[0x%04x] [0x%04x] [0x%04x] [0x%04x]\n",
			    mb[0], mb[1], mb[2], mb[3]);
		}
		break;

	case MBA_DPORT_DIAGNOSTICS:
+3 −1
Original line number Diff line number Diff line
@@ -1017,8 +1017,9 @@ qla27xx_fwdump(scsi_qla_host_t *vha, int hardware_locked)
		uint j;
		ulong len;
		void *buf = vha->hw->fw_dump;
		uint count = vha->hw->fw_dump_mpi ? 2 : 1;

		for (j = 0; j < 2; j++, fwdt++, buf += len) {
		for (j = 0; j < count; j++, fwdt++, buf += len) {
			ql_log(ql_log_warn, vha, 0xd011,
			    "-> fwdt%u running...\n", j);
			if (!fwdt->template) {
@@ -1046,6 +1047,7 @@ qla27xx_fwdump(scsi_qla_host_t *vha, int hardware_locked)
	}

bailout:
	vha->hw->fw_dump_mpi = 0;
#ifndef __CHECKER__
	if (!hardware_locked)
		spin_unlock_irqrestore(&vha->hw->hardware_lock, flags);