diff options
author | James Smart <james.smart@emulex.com> | 2011-05-24 11:40:48 -0400 |
---|---|---|
committer | James Bottomley <jbottomley@parallels.com> | 2011-05-26 23:49:35 -0400 |
commit | 0558056c1ecd177f2621fc2a0484d565270f7ae1 (patch) | |
tree | c29b0ac1ddd56b94f15f6edf8c62bdddf6ae851e /drivers/scsi/lpfc/lpfc_hbadisc.c | |
parent | 1ca1e43e55f4cd068f997154ffaf5fa62b08b802 (diff) |
[SCSI] lpfc 8.3.24: Miscellaneous Fixes and Corrections
Miscellaneous Fixes and Corrections
- Remove the memset in the lpfc_sli4_remove_rpi_hdrs call.
- Correct swapping of SGE word 2 relative to offset value
- Reorganize CQ and EQ usage to comply with SLI4 Specification.
- Expand the driver to check the rn bit. Only detect an error if the error bit
is set and the RN bit is NOT set.
- If mailbox completion code is not success AND the mailbox status is success,
then and only then will the driver overwrite the mailbox status.
- When driver initializing device, if the device is on a PCIe bus, set
PCI's "needs fundamental reset" bit so that EEH uses fundamental reset
instead of hot reset for recovery.
- Prevent driver from using new WWN when changed in firmware (until driver
reload)
- When HBA reports maximum SGE size > 0xffffffff (infinite), override
with 0x80000000.
- Fixed potential missed SLI4 device initialization failure conditions.
- Added 100ms delay before driver action following IF_TYPE_2 function reset.
- Reverted patch to UNREG/REG on PLOGI to mapped/unmapped node.
- Add a check for the CVL received flag in the fcf inuse routine to avoid
unregistering the fcf if Devloss fires before Delay discover timer fires.
Signed-off-by: Alex Iannicelli <alex.iannicelli@emulex.com>
Signed-off-by: James Smart <james.smart@emulex.com>
Signed-off-by: James Bottomley <jbottomley@parallels.com>
Diffstat (limited to 'drivers/scsi/lpfc/lpfc_hbadisc.c')
-rw-r--r-- | drivers/scsi/lpfc/lpfc_hbadisc.c | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c index 7a35df5e2038..2653c844d20d 100644 --- a/drivers/scsi/lpfc/lpfc_hbadisc.c +++ b/drivers/scsi/lpfc/lpfc_hbadisc.c | |||
@@ -2690,16 +2690,7 @@ lpfc_mbx_cmpl_read_sparam(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) | |||
2690 | 2690 | ||
2691 | memcpy((uint8_t *) &vport->fc_sparam, (uint8_t *) mp->virt, | 2691 | memcpy((uint8_t *) &vport->fc_sparam, (uint8_t *) mp->virt, |
2692 | sizeof (struct serv_parm)); | 2692 | sizeof (struct serv_parm)); |
2693 | if (phba->cfg_soft_wwnn) | 2693 | lpfc_update_vport_wwn(vport); |
2694 | u64_to_wwn(phba->cfg_soft_wwnn, | ||
2695 | vport->fc_sparam.nodeName.u.wwn); | ||
2696 | if (phba->cfg_soft_wwpn) | ||
2697 | u64_to_wwn(phba->cfg_soft_wwpn, | ||
2698 | vport->fc_sparam.portName.u.wwn); | ||
2699 | memcpy(&vport->fc_nodename, &vport->fc_sparam.nodeName, | ||
2700 | sizeof(vport->fc_nodename)); | ||
2701 | memcpy(&vport->fc_portname, &vport->fc_sparam.portName, | ||
2702 | sizeof(vport->fc_portname)); | ||
2703 | if (vport->port_type == LPFC_PHYSICAL_PORT) { | 2694 | if (vport->port_type == LPFC_PHYSICAL_PORT) { |
2704 | memcpy(&phba->wwnn, &vport->fc_nodename, sizeof(phba->wwnn)); | 2695 | memcpy(&phba->wwnn, &vport->fc_nodename, sizeof(phba->wwnn)); |
2705 | memcpy(&phba->wwpn, &vport->fc_portname, sizeof(phba->wwnn)); | 2696 | memcpy(&phba->wwpn, &vport->fc_portname, sizeof(phba->wwnn)); |
@@ -5354,6 +5345,17 @@ lpfc_fcf_inuse(struct lpfc_hba *phba) | |||
5354 | for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) { | 5345 | for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) { |
5355 | shost = lpfc_shost_from_vport(vports[i]); | 5346 | shost = lpfc_shost_from_vport(vports[i]); |
5356 | spin_lock_irq(shost->host_lock); | 5347 | spin_lock_irq(shost->host_lock); |
5348 | /* | ||
5349 | * IF the CVL_RCVD bit is not set then we have sent the | ||
5350 | * flogi. | ||
5351 | * If dev_loss fires while we are waiting we do not want to | ||
5352 | * unreg the fcf. | ||
5353 | */ | ||
5354 | if (!(vports[i]->fc_flag & FC_VPORT_CVL_RCVD)) { | ||
5355 | spin_unlock_irq(shost->host_lock); | ||
5356 | ret = 1; | ||
5357 | goto out; | ||
5358 | } | ||
5357 | list_for_each_entry(ndlp, &vports[i]->fc_nodes, nlp_listp) { | 5359 | list_for_each_entry(ndlp, &vports[i]->fc_nodes, nlp_listp) { |
5358 | if (NLP_CHK_NODE_ACT(ndlp) && ndlp->rport && | 5360 | if (NLP_CHK_NODE_ACT(ndlp) && ndlp->rport && |
5359 | (ndlp->rport->roles & FC_RPORT_ROLE_FCP_TARGET)) { | 5361 | (ndlp->rport->roles & FC_RPORT_ROLE_FCP_TARGET)) { |