aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/lpfc/lpfc_els.c
diff options
context:
space:
mode:
authorJames Smart <james.smart@emulex.com>2010-10-22 11:06:08 -0400
committerJames Bottomley <James.Bottomley@suse.de>2010-10-26 11:40:49 -0400
commita93ff37a8a869c7065a1b05f75e69bfb74eb599c (patch)
tree357ef8d67e3a845c21a8843fc2a5b941e007b33d /drivers/scsi/lpfc/lpfc_els.c
parent12265f68ae925b9dee8099140b4213c28ef54f14 (diff)
[SCSI] lpfc 8.3.18: Add logic to detect last devloss timeout
Added driver logic to detect the last devloss timeout of remote nodes which was still in use of FCF. At that point, the driver should set the last in-use remote node devloss timeout flag if it was not already set and should perform proper action on the in-use FCF and recover of FCF from firmware, depending on the state the driver's FIP engine is in. Find eligible FCF through FCF table rescan or the next new FCF event when FCF table rescan turned out empty eligible FCF, and the successful flogi into an FCF shall clear the HBA_DEVLOSS_TMO flag, indicating the successful recovery from devloss timeout. [jejb: add delay.h include to lpfc_hbadisc.c to fix ppc compile] Signed-off-by: Alex Iannicelli <alex.iannicelli@emulex.com> Signed-off-by: James Smart <james.smart@emulex.com> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'drivers/scsi/lpfc/lpfc_els.c')
-rw-r--r--drivers/scsi/lpfc/lpfc_els.c54
1 files changed, 11 insertions, 43 deletions
diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c
index ea511d18f0e..b115e92025e 100644
--- a/drivers/scsi/lpfc/lpfc_els.c
+++ b/drivers/scsi/lpfc/lpfc_els.c
@@ -795,7 +795,7 @@ lpfc_cmpl_els_flogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
795 795
796 if (irsp->ulpStatus) { 796 if (irsp->ulpStatus) {
797 /* 797 /*
798 * In case of FIP mode, perform round robin FCF failover 798 * In case of FIP mode, perform roundrobin FCF failover
799 * due to new FCF discovery 799 * due to new FCF discovery
800 */ 800 */
801 if ((phba->hba_flag & HBA_FIP_SUPPORT) && 801 if ((phba->hba_flag & HBA_FIP_SUPPORT) &&
@@ -803,48 +803,16 @@ lpfc_cmpl_els_flogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
803 (irsp->ulpStatus != IOSTAT_LOCAL_REJECT) && 803 (irsp->ulpStatus != IOSTAT_LOCAL_REJECT) &&
804 (irsp->un.ulpWord[4] != IOERR_SLI_ABORTED)) { 804 (irsp->un.ulpWord[4] != IOERR_SLI_ABORTED)) {
805 lpfc_printf_log(phba, KERN_WARNING, LOG_FIP | LOG_ELS, 805 lpfc_printf_log(phba, KERN_WARNING, LOG_FIP | LOG_ELS,
806 "2611 FLOGI failed on registered " 806 "2611 FLOGI failed on FCF (x%x), "
807 "FCF record fcf_index(%d), status: " 807 "status:x%x/x%x, tmo:x%x, perform "
808 "x%x/x%x, tmo:x%x, trying to perform " 808 "roundrobin FCF failover\n",
809 "round robin failover\n",
810 phba->fcf.current_rec.fcf_indx, 809 phba->fcf.current_rec.fcf_indx,
811 irsp->ulpStatus, irsp->un.ulpWord[4], 810 irsp->ulpStatus, irsp->un.ulpWord[4],
812 irsp->ulpTimeout); 811 irsp->ulpTimeout);
813 fcf_index = lpfc_sli4_fcf_rr_next_index_get(phba); 812 fcf_index = lpfc_sli4_fcf_rr_next_index_get(phba);
814 if (fcf_index == LPFC_FCOE_FCF_NEXT_NONE) { 813 rc = lpfc_sli4_fcf_rr_next_proc(vport, fcf_index);
815 /* 814 if (rc)
816 * Exhausted the eligible FCF record list, 815 goto out;
817 * fail through to retry FLOGI on current
818 * FCF record.
819 */
820 lpfc_printf_log(phba, KERN_WARNING,
821 LOG_FIP | LOG_ELS,
822 "2760 Completed one round "
823 "of FLOGI FCF round robin "
824 "failover list, retry FLOGI "
825 "on currently registered "
826 "FCF index:%d\n",
827 phba->fcf.current_rec.fcf_indx);
828 } else {
829 lpfc_printf_log(phba, KERN_INFO,
830 LOG_FIP | LOG_ELS,
831 "2794 FLOGI FCF round robin "
832 "failover to FCF index x%x\n",
833 fcf_index);
834 rc = lpfc_sli4_fcf_rr_read_fcf_rec(phba,
835 fcf_index);
836 if (rc)
837 lpfc_printf_log(phba, KERN_WARNING,
838 LOG_FIP | LOG_ELS,
839 "2761 FLOGI round "
840 "robin FCF failover "
841 "read FCF failed "
842 "rc:x%x, fcf_index:"
843 "%d\n", rc,
844 phba->fcf.current_rec.fcf_indx);
845 else
846 goto out;
847 }
848 } 816 }
849 817
850 /* FLOGI failure */ 818 /* FLOGI failure */
@@ -934,6 +902,7 @@ lpfc_cmpl_els_flogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
934 lpfc_nlp_put(ndlp); 902 lpfc_nlp_put(ndlp);
935 spin_lock_irq(&phba->hbalock); 903 spin_lock_irq(&phba->hbalock);
936 phba->fcf.fcf_flag &= ~FCF_DISCOVERY; 904 phba->fcf.fcf_flag &= ~FCF_DISCOVERY;
905 phba->hba_flag &= ~(FCF_RR_INPROG | HBA_DEVLOSS_TMO);
937 spin_unlock_irq(&phba->hbalock); 906 spin_unlock_irq(&phba->hbalock);
938 goto out; 907 goto out;
939 } 908 }
@@ -942,13 +911,12 @@ lpfc_cmpl_els_flogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
942 if (phba->hba_flag & HBA_FIP_SUPPORT) 911 if (phba->hba_flag & HBA_FIP_SUPPORT)
943 lpfc_printf_vlog(vport, KERN_INFO, LOG_FIP | 912 lpfc_printf_vlog(vport, KERN_INFO, LOG_FIP |
944 LOG_ELS, 913 LOG_ELS,
945 "2769 FLOGI successful on FCF " 914 "2769 FLOGI to FCF (x%x) "
946 "record: current_fcf_index:" 915 "completed successfully\n",
947 "x%x, terminate FCF round "
948 "robin failover process\n",
949 phba->fcf.current_rec.fcf_indx); 916 phba->fcf.current_rec.fcf_indx);
950 spin_lock_irq(&phba->hbalock); 917 spin_lock_irq(&phba->hbalock);
951 phba->fcf.fcf_flag &= ~FCF_DISCOVERY; 918 phba->fcf.fcf_flag &= ~FCF_DISCOVERY;
919 phba->hba_flag &= ~(FCF_RR_INPROG | HBA_DEVLOSS_TMO);
952 spin_unlock_irq(&phba->hbalock); 920 spin_unlock_irq(&phba->hbalock);
953 goto out; 921 goto out;
954 } 922 }