Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c8f6544e authored by Chad Dupuis's avatar Chad Dupuis Committed by James Bottomley
Browse files

[SCSI] qla2xxx: Encapsulate prematurely completing mailbox commands during ISP82xx firmware hang.

parent 10a340e6
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -17,12 +17,12 @@
 * | Queue Command and IO tracing |       0x302e       |     0x3008     |
 * | DPC Thread                   |       0x401c       |		|
 * | Async Events                 |       0x5059       |		|
 * | Timer Routines               |       0x600d       |		|
 * | Timer Routines               |       0x6010       | 0x600e,0x600f  |
 * | User Space Interactions      |       0x709d       |		|
 * | Task Management              |       0x8041       |    		|
 * | Task Management              |       0x8041       | 0x800b         |
 * | AER/EEH                      |       0x900f       |		|
 * | Virtual Port                 |       0xa007       |		|
 * | ISP82XX Specific             |       0xb051       |    		|
 * | ISP82XX Specific             |       0xb052       |    		|
 * | MultiQ                       |       0xc00b       |		|
 * | Misc                         |       0xd00b       |		|
 * ----------------------------------------------------------------------
+1 −0
Original line number Diff line number Diff line
@@ -578,6 +578,7 @@ extern int qla82xx_check_md_needed(scsi_qla_host_t *);
extern void qla82xx_chip_reset_cleanup(scsi_qla_host_t *);
extern int qla82xx_mbx_beacon_ctl(scsi_qla_host_t *, int);
extern char *qdev_state(uint32_t);
extern void qla82xx_clear_pending_mbx(scsi_qla_host_t *);

/* BSG related functions */
extern int qla24xx_bsg_request(struct fc_bsg_job *);
+16 −17
Original line number Diff line number Diff line
@@ -3817,6 +3817,19 @@ qla82xx_device_state_handler(scsi_qla_host_t *vha)
	return rval;
}

void qla82xx_clear_pending_mbx(scsi_qla_host_t *vha)
{
	struct qla_hw_data *ha = vha->hw;

	if (ha->flags.mbox_busy) {
		ha->flags.mbox_int = 1;
		ql_log(ql_log_warn, vha, 0x6010,
		    "Doing premature completion of mbx command.\n");
		if (test_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags))
			complete(&ha->mbx_intr_comp);
	}
}

void qla82xx_watchdog(scsi_qla_host_t *vha)
{
	uint32_t dev_state, halt_status;
@@ -3874,16 +3887,8 @@ void qla82xx_watchdog(scsi_qla_host_t *vha)
				}
				qla2xxx_wake_dpc(vha);
				ha->flags.isp82xx_fw_hung = 1;
				if (ha->flags.mbox_busy) {
					ha->flags.mbox_int = 1;
					ql_log(ql_log_warn, vha, 0x6007,
					    "Due to FW hung, doing "
					    "premature completion of mbx "
					    "command.\n");
					if (test_bit(MBX_INTR_WAIT,
					    &ha->mbx_cmd_flags))
						complete(&ha->mbx_intr_comp);
				}
				ql_log(ql_log_warn, vha, 0x6007, "Firmware hung.\n");
				qla82xx_clear_pending_mbx(vha);
			}
		}
	}
@@ -4078,13 +4083,7 @@ qla82xx_chip_reset_cleanup(scsi_qla_host_t *vha)
			msleep(1000);
			if (qla82xx_check_fw_alive(vha)) {
				ha->flags.isp82xx_fw_hung = 1;
				if (ha->flags.mbox_busy) {
					ha->flags.mbox_int = 1;
					if (test_bit(MBX_INTR_WAIT,
					    &ha->mbx_cmd_flags)) {
						complete(&ha->mbx_intr_comp);
					}
				}
				qla82xx_clear_pending_mbx(vha);
				break;
			}
		}
+2 −10
Original line number Diff line number Diff line
@@ -4009,16 +4009,8 @@ qla2xxx_pci_error_detected(struct pci_dev *pdev, pci_channel_state_t state)
		/* For ISP82XX complete any pending mailbox cmd */
		if (IS_QLA82XX(ha)) {
			ha->flags.isp82xx_fw_hung = 1;
			if (ha->flags.mbox_busy) {
				ha->flags.mbox_int = 1;
				ql_dbg(ql_dbg_aer, vha, 0x9001,
				    "Due to pci channel io frozen, doing premature "
				    "completion of mbx command.\n");
				if (test_bit(MBX_INTR_WAIT,
				    &ha->mbx_cmd_flags)) {
					complete(&ha->mbx_intr_comp);
				}
			}
			ql_dbg(ql_dbg_aer, vha, 0x9001, "Pci channel io frozen\n");
			qla82xx_clear_pending_mbx(vha);
		}
		qla2x00_free_irqs(vha);
		pci_disable_device(pdev);