[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: Andrew Vasquez <andrew.vasquez@qlogic.com> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
This commit is contained in:
parent
88c2666351
commit
77d7414361
2 changed files with 11 additions and 22 deletions
|
@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue