diff options
author | James Smart <james.smart@emulex.com> | 2010-10-22 11:06:08 -0400 |
---|---|---|
committer | James Bottomley <James.Bottomley@suse.de> | 2010-10-26 11:40:49 -0400 |
commit | a93ff37a8a869c7065a1b05f75e69bfb74eb599c (patch) | |
tree | 357ef8d67e3a845c21a8843fc2a5b941e007b33d /drivers/scsi/lpfc/lpfc_init.c | |
parent | 12265f68ae925b9dee8099140b4213c28ef54f14 (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_init.c')
-rw-r--r-- | drivers/scsi/lpfc/lpfc_init.c | 41 |
1 files changed, 18 insertions, 23 deletions
diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c index 9a2e2c79287..814d0b324d7 100644 --- a/drivers/scsi/lpfc/lpfc_init.c +++ b/drivers/scsi/lpfc/lpfc_init.c | |||
@@ -2936,8 +2936,7 @@ lpfc_sli4_fcf_redisc_wait_tmo(unsigned long ptr) | |||
2936 | phba->fcf.fcf_flag |= FCF_REDISC_EVT; | 2936 | phba->fcf.fcf_flag |= FCF_REDISC_EVT; |
2937 | spin_unlock_irq(&phba->hbalock); | 2937 | spin_unlock_irq(&phba->hbalock); |
2938 | lpfc_printf_log(phba, KERN_INFO, LOG_FIP, | 2938 | lpfc_printf_log(phba, KERN_INFO, LOG_FIP, |
2939 | "2776 FCF rediscover wait timer expired, post " | 2939 | "2776 FCF rediscover quiescent timer expired\n"); |
2940 | "a worker thread event for FCF table scan\n"); | ||
2941 | /* wake up worker thread */ | 2940 | /* wake up worker thread */ |
2942 | lpfc_worker_wake_up(phba); | 2941 | lpfc_worker_wake_up(phba); |
2943 | } | 2942 | } |
@@ -3312,35 +3311,34 @@ lpfc_sli4_async_fcoe_evt(struct lpfc_hba *phba, | |||
3312 | if (event_type == LPFC_FCOE_EVENT_TYPE_NEW_FCF) | 3311 | if (event_type == LPFC_FCOE_EVENT_TYPE_NEW_FCF) |
3313 | lpfc_printf_log(phba, KERN_ERR, LOG_FIP | | 3312 | lpfc_printf_log(phba, KERN_ERR, LOG_FIP | |
3314 | LOG_DISCOVERY, | 3313 | LOG_DISCOVERY, |
3315 | "2546 New FCF found event: " | 3314 | "2546 New FCF event, evt_tag:x%x, " |
3316 | "evt_tag:x%x, fcf_index:x%x\n", | 3315 | "index:x%x\n", |
3317 | acqe_fcoe->event_tag, | 3316 | acqe_fcoe->event_tag, |
3318 | acqe_fcoe->index); | 3317 | acqe_fcoe->index); |
3319 | else | 3318 | else |
3320 | lpfc_printf_log(phba, KERN_WARNING, LOG_FIP | | 3319 | lpfc_printf_log(phba, KERN_WARNING, LOG_FIP | |
3321 | LOG_DISCOVERY, | 3320 | LOG_DISCOVERY, |
3322 | "2788 FCF parameter modified event: " | 3321 | "2788 FCF param modified event, " |
3323 | "evt_tag:x%x, fcf_index:x%x\n", | 3322 | "evt_tag:x%x, index:x%x\n", |
3324 | acqe_fcoe->event_tag, | 3323 | acqe_fcoe->event_tag, |
3325 | acqe_fcoe->index); | 3324 | acqe_fcoe->index); |
3326 | if (phba->fcf.fcf_flag & FCF_DISCOVERY) { | 3325 | if (phba->fcf.fcf_flag & FCF_DISCOVERY) { |
3327 | /* | 3326 | /* |
3328 | * During period of FCF discovery, read the FCF | 3327 | * During period of FCF discovery, read the FCF |
3329 | * table record indexed by the event to update | 3328 | * table record indexed by the event to update |
3330 | * FCF round robin failover eligible FCF bmask. | 3329 | * FCF roundrobin failover eligible FCF bmask. |
3331 | */ | 3330 | */ |
3332 | lpfc_printf_log(phba, KERN_INFO, LOG_FIP | | 3331 | lpfc_printf_log(phba, KERN_INFO, LOG_FIP | |
3333 | LOG_DISCOVERY, | 3332 | LOG_DISCOVERY, |
3334 | "2779 Read new FCF record with " | 3333 | "2779 Read FCF (x%x) for updating " |
3335 | "fcf_index:x%x for updating FCF " | 3334 | "roundrobin FCF failover bmask\n", |
3336 | "round robin failover bmask\n", | ||
3337 | acqe_fcoe->index); | 3335 | acqe_fcoe->index); |
3338 | rc = lpfc_sli4_read_fcf_rec(phba, acqe_fcoe->index); | 3336 | rc = lpfc_sli4_read_fcf_rec(phba, acqe_fcoe->index); |
3339 | } | 3337 | } |
3340 | 3338 | ||
3341 | /* If the FCF discovery is in progress, do nothing. */ | 3339 | /* If the FCF discovery is in progress, do nothing. */ |
3342 | spin_lock_irq(&phba->hbalock); | 3340 | spin_lock_irq(&phba->hbalock); |
3343 | if (phba->hba_flag & FCF_DISC_INPROGRESS) { | 3341 | if (phba->hba_flag & FCF_TS_INPROG) { |
3344 | spin_unlock_irq(&phba->hbalock); | 3342 | spin_unlock_irq(&phba->hbalock); |
3345 | break; | 3343 | break; |
3346 | } | 3344 | } |
@@ -3359,15 +3357,15 @@ lpfc_sli4_async_fcoe_evt(struct lpfc_hba *phba, | |||
3359 | 3357 | ||
3360 | /* Otherwise, scan the entire FCF table and re-discover SAN */ | 3358 | /* Otherwise, scan the entire FCF table and re-discover SAN */ |
3361 | lpfc_printf_log(phba, KERN_INFO, LOG_FIP | LOG_DISCOVERY, | 3359 | lpfc_printf_log(phba, KERN_INFO, LOG_FIP | LOG_DISCOVERY, |
3362 | "2770 Start FCF table scan due to new FCF " | 3360 | "2770 Start FCF table scan per async FCF " |
3363 | "event: evt_tag:x%x, fcf_index:x%x\n", | 3361 | "event, evt_tag:x%x, index:x%x\n", |
3364 | acqe_fcoe->event_tag, acqe_fcoe->index); | 3362 | acqe_fcoe->event_tag, acqe_fcoe->index); |
3365 | rc = lpfc_sli4_fcf_scan_read_fcf_rec(phba, | 3363 | rc = lpfc_sli4_fcf_scan_read_fcf_rec(phba, |
3366 | LPFC_FCOE_FCF_GET_FIRST); | 3364 | LPFC_FCOE_FCF_GET_FIRST); |
3367 | if (rc) | 3365 | if (rc) |
3368 | lpfc_printf_log(phba, KERN_ERR, LOG_FIP | LOG_DISCOVERY, | 3366 | lpfc_printf_log(phba, KERN_ERR, LOG_FIP | LOG_DISCOVERY, |
3369 | "2547 Issue FCF scan read FCF mailbox " | 3367 | "2547 Issue FCF scan read FCF mailbox " |
3370 | "command failed 0x%x\n", rc); | 3368 | "command failed (x%x)\n", rc); |
3371 | break; | 3369 | break; |
3372 | 3370 | ||
3373 | case LPFC_FCOE_EVENT_TYPE_FCF_TABLE_FULL: | 3371 | case LPFC_FCOE_EVENT_TYPE_FCF_TABLE_FULL: |
@@ -3379,9 +3377,8 @@ lpfc_sli4_async_fcoe_evt(struct lpfc_hba *phba, | |||
3379 | 3377 | ||
3380 | case LPFC_FCOE_EVENT_TYPE_FCF_DEAD: | 3378 | case LPFC_FCOE_EVENT_TYPE_FCF_DEAD: |
3381 | lpfc_printf_log(phba, KERN_ERR, LOG_FIP | LOG_DISCOVERY, | 3379 | lpfc_printf_log(phba, KERN_ERR, LOG_FIP | LOG_DISCOVERY, |
3382 | "2549 FCF disconnected from network index 0x%x" | 3380 | "2549 FCF (x%x) disconnected from network, " |
3383 | " tag 0x%x\n", acqe_fcoe->index, | 3381 | "tag:x%x\n", acqe_fcoe->index, acqe_fcoe->event_tag); |
3384 | acqe_fcoe->event_tag); | ||
3385 | /* | 3382 | /* |
3386 | * If we are in the middle of FCF failover process, clear | 3383 | * If we are in the middle of FCF failover process, clear |
3387 | * the corresponding FCF bit in the roundrobin bitmap. | 3384 | * the corresponding FCF bit in the roundrobin bitmap. |
@@ -3495,9 +3492,8 @@ lpfc_sli4_async_fcoe_evt(struct lpfc_hba *phba, | |||
3495 | spin_unlock_irq(&phba->hbalock); | 3492 | spin_unlock_irq(&phba->hbalock); |
3496 | lpfc_printf_log(phba, KERN_INFO, LOG_FIP | | 3493 | lpfc_printf_log(phba, KERN_INFO, LOG_FIP | |
3497 | LOG_DISCOVERY, | 3494 | LOG_DISCOVERY, |
3498 | "2773 Start FCF fast failover due " | 3495 | "2773 Start FCF failover per CVL, " |
3499 | "to CVL event: evt_tag:x%x\n", | 3496 | "evt_tag:x%x\n", acqe_fcoe->event_tag); |
3500 | acqe_fcoe->event_tag); | ||
3501 | rc = lpfc_sli4_redisc_fcf_table(phba); | 3497 | rc = lpfc_sli4_redisc_fcf_table(phba); |
3502 | if (rc) { | 3498 | if (rc) { |
3503 | lpfc_printf_log(phba, KERN_ERR, LOG_FIP | | 3499 | lpfc_printf_log(phba, KERN_ERR, LOG_FIP | |
@@ -3647,8 +3643,7 @@ void lpfc_sli4_fcf_redisc_event_proc(struct lpfc_hba *phba) | |||
3647 | 3643 | ||
3648 | /* Scan FCF table from the first entry to re-discover SAN */ | 3644 | /* Scan FCF table from the first entry to re-discover SAN */ |
3649 | lpfc_printf_log(phba, KERN_INFO, LOG_FIP | LOG_DISCOVERY, | 3645 | lpfc_printf_log(phba, KERN_INFO, LOG_FIP | LOG_DISCOVERY, |
3650 | "2777 Start FCF table scan after FCF " | 3646 | "2777 Start post-quiescent FCF table scan\n"); |
3651 | "rediscovery quiescent period over\n"); | ||
3652 | rc = lpfc_sli4_fcf_scan_read_fcf_rec(phba, LPFC_FCOE_FCF_GET_FIRST); | 3647 | rc = lpfc_sli4_fcf_scan_read_fcf_rec(phba, LPFC_FCOE_FCF_GET_FIRST); |
3653 | if (rc) | 3648 | if (rc) |
3654 | lpfc_printf_log(phba, KERN_ERR, LOG_FIP | LOG_DISCOVERY, | 3649 | lpfc_printf_log(phba, KERN_ERR, LOG_FIP | LOG_DISCOVERY, |
@@ -4166,7 +4161,7 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba) | |||
4166 | goto out_free_active_sgl; | 4161 | goto out_free_active_sgl; |
4167 | } | 4162 | } |
4168 | 4163 | ||
4169 | /* Allocate eligible FCF bmask memory for FCF round robin failover */ | 4164 | /* Allocate eligible FCF bmask memory for FCF roundrobin failover */ |
4170 | longs = (LPFC_SLI4_FCF_TBL_INDX_MAX + BITS_PER_LONG - 1)/BITS_PER_LONG; | 4165 | longs = (LPFC_SLI4_FCF_TBL_INDX_MAX + BITS_PER_LONG - 1)/BITS_PER_LONG; |
4171 | phba->fcf.fcf_rr_bmask = kzalloc(longs * sizeof(unsigned long), | 4166 | phba->fcf.fcf_rr_bmask = kzalloc(longs * sizeof(unsigned long), |
4172 | GFP_KERNEL); | 4167 | GFP_KERNEL); |