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

Commit ded6411f authored by Sawan Chandak's avatar Sawan Chandak Committed by James Bottomley
Browse files

qla2xxx: Fix virtual port configuration, when switch port is disabled/enabled.



On some vendor switches, when switch port is toggled (down /up),
then in some condition driver tries to configure virtual port,
before FW is actually in ready state to process any commands on wire.
At this time, configuring virtual port can fail. Add fix in driver
to make driver wait, for FW to be ready state before

Signed-off-by: default avatarSawan Chandak <sawan.chandak@qlogic.com>
Signed-off-by: default avatarHimanshu Madhani <himanshu.madhani@qlogic.com>
Reviewed-by: default avatarHannes Reinecke <hare@suse.de>
Signed-off-by: default avatarJames Bottomley <JBottomley@Odin.com>
parent e8fb1250
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -3590,6 +3590,7 @@ typedef struct scsi_qla_host {
#define VP_BIND_NEEDED		2
#define VP_BIND_NEEDED		2
#define VP_DELETE_NEEDED	3
#define VP_DELETE_NEEDED	3
#define VP_SCR_NEEDED		4	/* State Change Request registration */
#define VP_SCR_NEEDED		4	/* State Change Request registration */
#define VP_CONFIG_OK		5	/* Flag to cfg VP, if FW is ready */
	atomic_t 		vp_state;
	atomic_t 		vp_state;
#define VP_OFFLINE		0
#define VP_OFFLINE		0
#define VP_ACTIVE		1
#define VP_ACTIVE		1
+2 −0
Original line number Original line Diff line number Diff line
@@ -763,6 +763,7 @@ skip_rio:
				memcpy(vha->port_name, wwpn, WWN_SIZE);
				memcpy(vha->port_name, wwpn, WWN_SIZE);
			}
			}


			clear_bit(VP_CONFIG_OK, &vha->vp_flags);
			vha->device_flags |= DFLG_NO_CABLE;
			vha->device_flags |= DFLG_NO_CABLE;
			qla2x00_mark_all_devices_lost(vha, 1);
			qla2x00_mark_all_devices_lost(vha, 1);
		}
		}
@@ -947,6 +948,7 @@ skip_rio:


		set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
		set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
		set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags);
		set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags);
		set_bit(VP_CONFIG_OK, &vha->vp_flags);


		qlt_async_event(mb[0], vha, mb);
		qlt_async_event(mb[0], vha, mb);
		break;
		break;
+14 −8
Original line number Original line Diff line number Diff line
@@ -306,11 +306,16 @@ qla2x00_vp_abort_isp(scsi_qla_host_t *vha)
static int
static int
qla2x00_do_dpc_vp(scsi_qla_host_t *vha)
qla2x00_do_dpc_vp(scsi_qla_host_t *vha)
{
{
	struct qla_hw_data *ha = vha->hw;
	scsi_qla_host_t *base_vha = pci_get_drvdata(ha->pdev);

	ql_dbg(ql_dbg_dpc + ql_dbg_verbose, vha, 0x4012,
	ql_dbg(ql_dbg_dpc + ql_dbg_verbose, vha, 0x4012,
	    "Entering %s vp_flags: 0x%lx.\n", __func__, vha->vp_flags);
	    "Entering %s vp_flags: 0x%lx.\n", __func__, vha->vp_flags);


	qla2x00_do_work(vha);
	qla2x00_do_work(vha);


	/* Check if Fw is ready to configure VP first */
	if (test_bit(VP_CONFIG_OK, &base_vha->vp_flags)) {
		if (test_and_clear_bit(VP_IDX_ACQUIRED, &vha->vp_flags)) {
		if (test_and_clear_bit(VP_IDX_ACQUIRED, &vha->vp_flags)) {
			/* VP acquired. complete port configuration */
			/* VP acquired. complete port configuration */
			ql_dbg(ql_dbg_dpc, vha, 0x4014,
			ql_dbg(ql_dbg_dpc, vha, 0x4014,
@@ -320,6 +325,7 @@ qla2x00_do_dpc_vp(scsi_qla_host_t *vha)
			    "Configure VP end.\n");
			    "Configure VP end.\n");
			return 0;
			return 0;
		}
		}
	}


	if (test_bit(FCPORT_UPDATE_NEEDED, &vha->dpc_flags)) {
	if (test_bit(FCPORT_UPDATE_NEEDED, &vha->dpc_flags)) {
		ql_dbg(ql_dbg_dpc, vha, 0x4016,
		ql_dbg(ql_dbg_dpc, vha, 0x4016,