diff options
author | James Smart <James.Smart@Emulex.Com> | 2007-06-18 04:56:39 +0400 |
---|---|---|
committer | James Bottomley <jejb@mulgrave.il.steeleye.com> | 2007-06-18 07:38:11 +0400 |
commit | 858c9f6c19c6f9bf86cbbc64ce0d17c61d6131b8 (patch) | |
tree | 9591b15b4424066023e375ad0aa33fdd37e1c452 /drivers/scsi/lpfc/lpfc_vport.c | |
parent | 92d7f7b0cde3ad2260e7462b40867b57efd49851 (diff) | |
download | linux-858c9f6c19c6f9bf86cbbc64ce0d17c61d6131b8.tar.xz |
[SCSI] lpfc: bug fixes
Following the NPIV support, the following changes have been accumulated
in the testing and qualification of the driver:
- Fix affinity of ELS ring to slow/deferred event processing
- Fix Ring attention masks
- Defer dev_loss_tmo timeout handling to worker thread
- Consolidate link down error classification for better error checking
- Remove unused/deprecated nlp_initiator_tmr timer
- Fix for async scan - move adapter init code back into pci_probe_one
context. Fix async scan interfaces.
- Expand validation of ability to create vports
- Extract VPI resource cnt from firmware
- Tuning of Login/Reject policies to better deal with overwhelmned targets
- Misc ELS and discovery fixes
- Export the npiv_enable attribute to sysfs
- Mailbox handling fix
- Add debugfs support
- A few other small misc fixes:
- wrong return values, double-frees, bad locking
- Added adapter failure heartbeat
Signed-off-by: James Smart <James.Smart@emulex.com>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/scsi/lpfc/lpfc_vport.c')
-rw-r--r-- | drivers/scsi/lpfc/lpfc_vport.c | 39 |
1 files changed, 27 insertions, 12 deletions
diff --git a/drivers/scsi/lpfc/lpfc_vport.c b/drivers/scsi/lpfc/lpfc_vport.c index 786125b7ad4c..85797dbf5478 100644 --- a/drivers/scsi/lpfc/lpfc_vport.c +++ b/drivers/scsi/lpfc/lpfc_vport.c @@ -82,7 +82,8 @@ lpfc_alloc_vpi(struct lpfc_hba *phba) int vpi; spin_lock_irq(&phba->hbalock); - vpi = find_next_zero_bit(phba->vpi_bmask, phba->max_vpi, 1); + /* Start at bit 1 because vpi zero is reserved for the physical port */ + vpi = find_next_zero_bit(phba->vpi_bmask, (phba->max_vpi + 1), 1); if (vpi > phba->max_vpi) vpi = 0; else @@ -131,7 +132,8 @@ lpfc_vport_sparm(struct lpfc_hba *phba, struct lpfc_vport *vport) mb->mbxCommand, mb->mbxStatus, rc); lpfc_mbuf_free(phba, mp->virt, mp->phys); kfree(mp); - mempool_free(pmb, phba->mbox_mem_pool); + if (rc != MBX_TIMEOUT) + mempool_free(pmb, phba->mbox_mem_pool); return -EIO; } @@ -241,6 +243,8 @@ lpfc_vport_create(struct fc_vport *fc_vport, bool disable) } vport->vpi = vpi; + lpfc_debugfs_initialize(vport); + if (lpfc_vport_sparm(phba, vport)) { lpfc_printf_log(phba, KERN_ERR, LOG_VPORT, "%d:1813 Create VPORT failed: vpi:%d " @@ -306,8 +310,16 @@ lpfc_vport_create(struct fc_vport *fc_vport, bool disable) */ ndlp = lpfc_findnode_did(phba->pport, Fabric_DID); if (ndlp && ndlp->nlp_state == NLP_STE_UNMAPPED_NODE) { - lpfc_set_disctmo(vport); - lpfc_initial_fdisc(vport); + if (phba->link_flag & LS_NPIV_FAB_SUPPORTED) { + lpfc_set_disctmo(vport); + lpfc_initial_fdisc(vport); + } else { + lpfc_vport_set_state(vport, FC_VPORT_NO_FABRIC_SUPP); + lpfc_printf_log(phba, KERN_ERR, LOG_ELS, + "%d (%d):0262 No NPIV Fabric " + "support\n", + phba->brd_no, vport->vpi); + } } else { lpfc_vport_set_state(vport, FC_VPORT_FAILED); } @@ -383,8 +395,16 @@ enable_vport(struct fc_vport *fc_vport) */ ndlp = lpfc_findnode_did(phba->pport, Fabric_DID); if (ndlp && ndlp->nlp_state == NLP_STE_UNMAPPED_NODE) { - lpfc_set_disctmo(vport); - lpfc_initial_fdisc(vport); + if (phba->link_flag & LS_NPIV_FAB_SUPPORTED) { + lpfc_set_disctmo(vport); + lpfc_initial_fdisc(vport); + } else { + lpfc_vport_set_state(vport, FC_VPORT_NO_FABRIC_SUPP); + lpfc_printf_log(phba, KERN_ERR, LOG_ELS, + "%d (%d):0264 No NPIV Fabric " + "support\n", + phba->brd_no, vport->vpi); + } } else { lpfc_vport_set_state(vport, FC_VPORT_FAILED); } @@ -441,6 +461,7 @@ lpfc_vport_delete(struct fc_vport *fc_vport) vport->load_flag |= FC_UNLOADING; kfree(vport->vname); + lpfc_debugfs_terminate(vport); fc_remove_host(lpfc_shost_from_vport(vport)); scsi_remove_host(lpfc_shost_from_vport(vport)); @@ -476,12 +497,6 @@ skip_logo: NLP_EVT_DEVICE_RM); } - list_for_each_entry_safe(ndlp, next_ndlp, &vport->fc_nodes, nlp_listp) { - /* free any ndlp's in unused state */ - if (ndlp->nlp_state == NLP_STE_UNUSED_NODE) - lpfc_drop_node(vport, ndlp); - } - lpfc_stop_vport_timers(vport); lpfc_unreg_all_rpis(vport); lpfc_unreg_default_rpis(vport); |