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

Commit b9b12f73 authored by Seokmann Ju's avatar Seokmann Ju Committed by James Bottomley
Browse files

[SCSI] qla2xxx: Correct several PCI-EEH issues.



In addition to checking for potentially unnecessary iomem
readX()/writeX() operations, a pci_channel_io_perm_failure should
not trigger a full internal removal.  Found during additional
testing with pSeries blade systems.

Signed-off-by: default avatarSeokmann Ju <seokmann.ju@qlogic.com>
Signed-off-by: default avatarAndrew Vasquez <andrew.vasquez@qlogic.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@HansenPartnership.com>
parent 6749ce36
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -1282,6 +1282,9 @@ qla2x00_dev_loss_tmo_callbk(struct fc_rport *rport)
	if (!fcport)
		return;

	if (unlikely(pci_channel_offline(fcport->vha->hw->pdev)))
		qla2x00_abort_all_cmds(fcport->vha, DID_NO_CONNECT << 16);
	else
		qla2x00_abort_fcport_cmds(fcport);

	/*
@@ -1302,6 +1305,10 @@ qla2x00_terminate_rport_io(struct fc_rport *rport)
	if (!fcport)
		return;

	if (unlikely(pci_channel_offline(fcport->vha->hw->pdev))) {
		qla2x00_abort_all_cmds(fcport->vha, DID_NO_CONNECT << 16);
		return;
	}
	/*
	 * At this point all fcport's software-states are cleared.  Perform any
	 * final cleanup of firmware resources (PCBs and XCBs).
+3 −0
Original line number Diff line number Diff line
@@ -45,6 +45,9 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp)
	struct qla_hw_data *ha = vha->hw;
	scsi_qla_host_t *base_vha = pci_get_drvdata(ha->pdev);

	if (ha->pdev->error_state > pci_channel_io_frozen)
		return QLA_FUNCTION_TIMEOUT;

	reg = ha->iobase;
	io_lock_on = base_vha->flags.init_done;

+7 −2
Original line number Diff line number Diff line
@@ -407,7 +407,10 @@ qla2xxx_queuecommand(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *))
	int rval;

	if (unlikely(pci_channel_offline(ha->pdev))) {
		if (ha->pdev->error_state == pci_channel_io_frozen)
			cmd->result = DID_REQUEUE << 16;
		else
			cmd->result = DID_NO_CONNECT << 16;
		goto qc24_fail_command;
	}

@@ -2990,6 +2993,8 @@ qla2x00_release_firmware(void)
static pci_ers_result_t
qla2xxx_pci_error_detected(struct pci_dev *pdev, pci_channel_state_t state)
{
	scsi_qla_host_t *base_vha = pci_get_drvdata(pdev);

	switch (state) {
	case pci_channel_io_normal:
		return PCI_ERS_RESULT_CAN_RECOVER;
@@ -2997,7 +3002,7 @@ qla2xxx_pci_error_detected(struct pci_dev *pdev, pci_channel_state_t state)
		pci_disable_device(pdev);
		return PCI_ERS_RESULT_NEED_RESET;
	case pci_channel_io_perm_failure:
		qla2x00_remove_one(pdev);
		qla2x00_abort_all_cmds(base_vha, DID_NO_CONNECT << 16);
		return PCI_ERS_RESULT_DISCONNECT;
	}
	return PCI_ERS_RESULT_NEED_RESET;