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

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

[SCSI] qla2xxx: Fix for handling some error conditions in loopback.

parent e92e4a8f
Loading
Loading
Loading
Loading
+11 −3
Original line number Original line Diff line number Diff line
@@ -568,9 +568,17 @@ qla81xx_set_loopback_mode(scsi_qla_host_t *vha, uint16_t *config,
	if (!wait_for_completion_timeout(&ha->dcbx_comp, (20 * HZ))) {
	if (!wait_for_completion_timeout(&ha->dcbx_comp, (20 * HZ))) {
		ql_dbg(ql_dbg_user, vha, 0x7022,
		ql_dbg(ql_dbg_user, vha, 0x7022,
		    "State change notification not received.\n");
		    "State change notification not received.\n");
		rval = -EINVAL;
	} else {
		if (ha->flags.idc_compl_status) {
			ql_dbg(ql_dbg_user, vha, 0x70c3,
			    "Bad status in IDC Completion AEN\n");
			rval = -EINVAL;
			ha->flags.idc_compl_status = 0;
		} else
		} else
			ql_dbg(ql_dbg_user, vha, 0x7023,
			ql_dbg(ql_dbg_user, vha, 0x7023,
			    "State change received.\n");
			    "State change received.\n");
	}


	ha->notify_dcbx_comp = 0;
	ha->notify_dcbx_comp = 0;


+1 −1
Original line number Original line Diff line number Diff line
@@ -22,7 +22,7 @@
 * | Async Events                 |       0x5071       | 0x502b-0x502f  |
 * | Async Events                 |       0x5071       | 0x502b-0x502f  |
 * |                              |                    | 0x5047,0x5052  |
 * |                              |                    | 0x5047,0x5052  |
 * | Timer Routines               |       0x6011       |                |
 * | Timer Routines               |       0x6011       |                |
 * | User Space Interactions      |       0x70c2       | 0x7018,0x702e, |
 * | User Space Interactions      |       0x70c3       | 0x7018,0x702e, |
 * |                              |                    | 0x7039,0x7045, |
 * |                              |                    | 0x7039,0x7045, |
 * |                              |                    | 0x7073-0x7075, |
 * |                              |                    | 0x7073-0x7075, |
 * |                              |                    | 0x708c,        |
 * |                              |                    | 0x708c,        |
+2 −1
Original line number Original line Diff line number Diff line
@@ -2622,7 +2622,8 @@ struct qla_hw_data {
		uint32_t	nic_core_reset_owner:1;
		uint32_t	nic_core_reset_owner:1;
		uint32_t	isp82xx_no_md_cap:1;
		uint32_t	isp82xx_no_md_cap:1;
		uint32_t	host_shutting_down:1;
		uint32_t	host_shutting_down:1;
		/* 30 bits */
		uint32_t	idc_compl_status:1;
		/* 32 bits */
	} flags;
	} flags;


	/* This spinlock is used to protect "io transactions", you must
	/* This spinlock is used to protect "io transactions", you must
+13 −12
Original line number Original line Diff line number Diff line
@@ -294,8 +294,12 @@ qla81xx_idc_event(scsi_qla_host_t *vha, uint16_t aen, uint16_t descr)
	    "%04x %04x %04x %04x %04x %04x %04x.\n",
	    "%04x %04x %04x %04x %04x %04x %04x.\n",
	    event[aen & 0xff], mb[0], mb[1], mb[2], mb[3],
	    event[aen & 0xff], mb[0], mb[1], mb[2], mb[3],
	    mb[4], mb[5], mb[6]);
	    mb[4], mb[5], mb[6]);
	if ((aen == MBA_IDC_COMPLETE && mb[1] >> 15)) {
		vha->hw->flags.idc_compl_status = 1;
		if (vha->hw->notify_dcbx_comp)
			complete(&vha->hw->dcbx_comp);
	}


	if (IS_QLA81XX(vha->hw)) {
	/* Acknowledgement needed? [Notify && non-zero timeout]. */
	/* Acknowledgement needed? [Notify && non-zero timeout]. */
	timeout = (descr >> 8) & 0xf;
	timeout = (descr >> 8) & 0xf;
	if (aen != MBA_IDC_NOTIFY || !timeout)
	if (aen != MBA_IDC_NOTIFY || !timeout)
@@ -304,7 +308,6 @@ qla81xx_idc_event(scsi_qla_host_t *vha, uint16_t aen, uint16_t descr)
	ql_dbg(ql_dbg_async, vha, 0x5022,
	ql_dbg(ql_dbg_async, vha, 0x5022,
	    "%lu Inter-Driver Communication %s -- ACK timeout=%d.\n",
	    "%lu Inter-Driver Communication %s -- ACK timeout=%d.\n",
	    vha->host_no, event[aen & 0xff], timeout);
	    vha->host_no, event[aen & 0xff], timeout);
	}


	rval = qla2x00_post_idc_ack_work(vha, mb);
	rval = qla2x00_post_idc_ack_work(vha, mb);
	if (rval != QLA_SUCCESS)
	if (rval != QLA_SUCCESS)
@@ -989,13 +992,11 @@ qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb)
			if ((mb[2] & 0x7fff) == MBC_PORT_RESET ||
			if ((mb[2] & 0x7fff) == MBC_PORT_RESET ||
			    (mb[2] & 0x7fff) == MBC_SET_PORT_CONFIG) {
			    (mb[2] & 0x7fff) == MBC_SET_PORT_CONFIG) {
				set_bit(ISP_QUIESCE_NEEDED, &vha->dpc_flags);
				set_bit(ISP_QUIESCE_NEEDED, &vha->dpc_flags);
				/* Ack that we have quiesced I/O */
				qla81xx_idc_event(vha, mb[0], mb[1]);
				qla2xxx_wake_dpc(vha);
				qla2xxx_wake_dpc(vha);
			}
			}
	case MBA_IDC_COMPLETE:
	case MBA_IDC_COMPLETE:
	case MBA_IDC_TIME_EXT:
	case MBA_IDC_TIME_EXT:
		if (IS_QLA81XX(vha->hw))
		if (IS_QLA81XX(vha->hw) || IS_QLA8031(vha->hw))
			qla81xx_idc_event(vha, mb[0], mb[1]);
			qla81xx_idc_event(vha, mb[0], mb[1]);
		break;
		break;