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

Commit 77d74143 authored by Andrew Vasquez's avatar Andrew Vasquez Committed by James Bottomley
Browse files

[SCSI] qla2xxx: Cleanup FC remote port registration.



Cleanup FC remote port registration.

Due to the inherent behaviour (an immediate scan) of adding
a 'target'-role-capable rport via fc_remote_port_add(),
split the registration into two steps -- addition as
unknown-type role, then use fc_remote_port_rolchg() with
appropriate role (based on PLOGI/PRLI bits).  This allows
for a more cleaner rport->dd_data management as can be seen
with the simplified qla2xxx_slave_alloc() function.

Signed-off-by: default avatarAndrew Vasquez <andrew.vasquez@qlogic.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
parent 88c26663
Loading
Loading
Loading
Loading
+10 −7
Original line number Original line Diff line number Diff line
@@ -2067,22 +2067,25 @@ qla2x00_reg_remote_port(scsi_qla_host_t *ha, fc_port_t *fcport)
	rport_ids.port_name = be64_to_cpu(*(uint64_t *)fcport->port_name);
	rport_ids.port_name = be64_to_cpu(*(uint64_t *)fcport->port_name);
	rport_ids.port_id = fcport->d_id.b.domain << 16 |
	rport_ids.port_id = fcport->d_id.b.domain << 16 |
	    fcport->d_id.b.area << 8 | fcport->d_id.b.al_pa;
	    fcport->d_id.b.area << 8 | fcport->d_id.b.al_pa;
	rport_ids.roles = FC_RPORT_ROLE_UNKNOWN;
	fcport->rport = rport = fc_remote_port_add(ha->host, 0, &rport_ids);
	if (!rport) {
		qla_printk(KERN_WARNING, ha,
		    "Unable to allocate fc remote port!\n");
		return;
	}
	rport->dd_data = fcport;

	rport_ids.roles = FC_RPORT_ROLE_UNKNOWN;
	rport_ids.roles = FC_RPORT_ROLE_UNKNOWN;
	if (fcport->port_type == FCT_INITIATOR)
	if (fcport->port_type == FCT_INITIATOR)
		rport_ids.roles |= FC_RPORT_ROLE_FCP_INITIATOR;
		rport_ids.roles |= FC_RPORT_ROLE_FCP_INITIATOR;
	if (fcport->port_type == FCT_TARGET)
	if (fcport->port_type == FCT_TARGET)
		rport_ids.roles |= FC_RPORT_ROLE_FCP_TARGET;
		rport_ids.roles |= FC_RPORT_ROLE_FCP_TARGET;

	fc_remote_port_rolechg(rport, rport_ids.roles);
	fcport->rport = rport = fc_remote_port_add(ha->host, 0, &rport_ids);
	if (!rport)
		qla_printk(KERN_WARNING, ha,
		    "Unable to allocate fc remote port!\n");


	if (rport->scsi_target_id != -1 &&
	if (rport->scsi_target_id != -1 &&
	    rport->scsi_target_id < ha->host->max_id)
	    rport->scsi_target_id < ha->host->max_id)
		fcport->os_target_id = rport->scsi_target_id;
		fcport->os_target_id = rport->scsi_target_id;

	rport->dd_data = fcport;
}
}


/*
/*
+1 −15
Original line number Original line Diff line number Diff line
@@ -1071,26 +1071,12 @@ qla2x00_device_reset(scsi_qla_host_t *ha, fc_port_t *reset_fcport)
static int
static int
qla2xxx_slave_alloc(struct scsi_device *sdev)
qla2xxx_slave_alloc(struct scsi_device *sdev)
{
{
	scsi_qla_host_t *ha = to_qla_host(sdev->host);
	struct fc_rport *rport = starget_to_rport(scsi_target(sdev));
	struct fc_rport *rport = starget_to_rport(scsi_target(sdev));
	fc_port_t *fcport;
	int found;


	if (!rport)
	if (!rport)
		return -ENXIO;
		return -ENXIO;


	found = 0;
	sdev->hostdata = rport->dd_data;
	list_for_each_entry(fcport, &ha->fcports, list) {
		if (rport->port_name ==
		    be64_to_cpu(*(uint64_t *)fcport->port_name)) {
			found++;
			break;
		}
	}
	if (!found)
		return -ENXIO;

	sdev->hostdata = fcport;


	return 0;
	return 0;
}
}