diff options
Diffstat (limited to 'drivers/scsi/lpfc/lpfc_sli.c')
-rw-r--r-- | drivers/scsi/lpfc/lpfc_sli.c | 413 |
1 files changed, 349 insertions, 64 deletions
diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c index 35e3b96d4e07..fe6660ca6452 100644 --- a/drivers/scsi/lpfc/lpfc_sli.c +++ b/drivers/scsi/lpfc/lpfc_sli.c | |||
@@ -494,7 +494,7 @@ __lpfc_clear_active_sglq(struct lpfc_hba *phba, uint16_t xritag) | |||
494 | * | 494 | * |
495 | * Returns sglq ponter = success, NULL = Failure. | 495 | * Returns sglq ponter = success, NULL = Failure. |
496 | **/ | 496 | **/ |
497 | static struct lpfc_sglq * | 497 | struct lpfc_sglq * |
498 | __lpfc_get_active_sglq(struct lpfc_hba *phba, uint16_t xritag) | 498 | __lpfc_get_active_sglq(struct lpfc_hba *phba, uint16_t xritag) |
499 | { | 499 | { |
500 | uint16_t adj_xri; | 500 | uint16_t adj_xri; |
@@ -526,6 +526,7 @@ __lpfc_sli_get_sglq(struct lpfc_hba *phba) | |||
526 | return NULL; | 526 | return NULL; |
527 | adj_xri = sglq->sli4_xritag - phba->sli4_hba.max_cfg_param.xri_base; | 527 | adj_xri = sglq->sli4_xritag - phba->sli4_hba.max_cfg_param.xri_base; |
528 | phba->sli4_hba.lpfc_sglq_active_list[adj_xri] = sglq; | 528 | phba->sli4_hba.lpfc_sglq_active_list[adj_xri] = sglq; |
529 | sglq->state = SGL_ALLOCATED; | ||
529 | return sglq; | 530 | return sglq; |
530 | } | 531 | } |
531 | 532 | ||
@@ -580,15 +581,18 @@ __lpfc_sli_release_iocbq_s4(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq) | |||
580 | else | 581 | else |
581 | sglq = __lpfc_clear_active_sglq(phba, iocbq->sli4_xritag); | 582 | sglq = __lpfc_clear_active_sglq(phba, iocbq->sli4_xritag); |
582 | if (sglq) { | 583 | if (sglq) { |
583 | if (iocbq->iocb_flag & LPFC_EXCHANGE_BUSY) { | 584 | if ((iocbq->iocb_flag & LPFC_EXCHANGE_BUSY) && |
585 | (sglq->state != SGL_XRI_ABORTED)) { | ||
584 | spin_lock_irqsave(&phba->sli4_hba.abts_sgl_list_lock, | 586 | spin_lock_irqsave(&phba->sli4_hba.abts_sgl_list_lock, |
585 | iflag); | 587 | iflag); |
586 | list_add(&sglq->list, | 588 | list_add(&sglq->list, |
587 | &phba->sli4_hba.lpfc_abts_els_sgl_list); | 589 | &phba->sli4_hba.lpfc_abts_els_sgl_list); |
588 | spin_unlock_irqrestore( | 590 | spin_unlock_irqrestore( |
589 | &phba->sli4_hba.abts_sgl_list_lock, iflag); | 591 | &phba->sli4_hba.abts_sgl_list_lock, iflag); |
590 | } else | 592 | } else { |
593 | sglq->state = SGL_FREED; | ||
591 | list_add(&sglq->list, &phba->sli4_hba.lpfc_sgl_list); | 594 | list_add(&sglq->list, &phba->sli4_hba.lpfc_sgl_list); |
595 | } | ||
592 | } | 596 | } |
593 | 597 | ||
594 | 598 | ||
@@ -2258,41 +2262,56 @@ lpfc_sli_process_sol_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, | |||
2258 | spin_unlock_irqrestore(&phba->hbalock, | 2262 | spin_unlock_irqrestore(&phba->hbalock, |
2259 | iflag); | 2263 | iflag); |
2260 | } | 2264 | } |
2261 | if ((phba->sli_rev == LPFC_SLI_REV4) && | 2265 | if (phba->sli_rev == LPFC_SLI_REV4) { |
2262 | (saveq->iocb_flag & LPFC_EXCHANGE_BUSY)) { | 2266 | if (saveq->iocb_flag & |
2263 | /* Set cmdiocb flag for the exchange | 2267 | LPFC_EXCHANGE_BUSY) { |
2264 | * busy so sgl (xri) will not be | 2268 | /* Set cmdiocb flag for the |
2265 | * released until the abort xri is | 2269 | * exchange busy so sgl (xri) |
2266 | * received from hba, clear the | 2270 | * will not be released until |
2267 | * LPFC_DRIVER_ABORTED bit in case | 2271 | * the abort xri is received |
2268 | * it was driver initiated abort. | 2272 | * from hba. |
2269 | */ | 2273 | */ |
2270 | spin_lock_irqsave(&phba->hbalock, | 2274 | spin_lock_irqsave( |
2271 | iflag); | 2275 | &phba->hbalock, iflag); |
2272 | cmdiocbp->iocb_flag &= | 2276 | cmdiocbp->iocb_flag |= |
2273 | ~LPFC_DRIVER_ABORTED; | 2277 | LPFC_EXCHANGE_BUSY; |
2274 | cmdiocbp->iocb_flag |= | 2278 | spin_unlock_irqrestore( |
2275 | LPFC_EXCHANGE_BUSY; | 2279 | &phba->hbalock, iflag); |
2276 | spin_unlock_irqrestore(&phba->hbalock, | 2280 | } |
2277 | iflag); | 2281 | if (cmdiocbp->iocb_flag & |
2278 | cmdiocbp->iocb.ulpStatus = | 2282 | LPFC_DRIVER_ABORTED) { |
2279 | IOSTAT_LOCAL_REJECT; | 2283 | /* |
2280 | cmdiocbp->iocb.un.ulpWord[4] = | 2284 | * Clear LPFC_DRIVER_ABORTED |
2281 | IOERR_ABORT_REQUESTED; | 2285 | * bit in case it was driver |
2282 | /* | 2286 | * initiated abort. |
2283 | * For SLI4, irsiocb contains NO_XRI | 2287 | */ |
2284 | * in sli_xritag, it shall not affect | 2288 | spin_lock_irqsave( |
2285 | * releasing sgl (xri) process. | 2289 | &phba->hbalock, iflag); |
2286 | */ | 2290 | cmdiocbp->iocb_flag &= |
2287 | saveq->iocb.ulpStatus = | 2291 | ~LPFC_DRIVER_ABORTED; |
2288 | IOSTAT_LOCAL_REJECT; | 2292 | spin_unlock_irqrestore( |
2289 | saveq->iocb.un.ulpWord[4] = | 2293 | &phba->hbalock, iflag); |
2290 | IOERR_SLI_ABORTED; | 2294 | cmdiocbp->iocb.ulpStatus = |
2291 | spin_lock_irqsave(&phba->hbalock, | 2295 | IOSTAT_LOCAL_REJECT; |
2292 | iflag); | 2296 | cmdiocbp->iocb.un.ulpWord[4] = |
2293 | saveq->iocb_flag |= LPFC_DELAY_MEM_FREE; | 2297 | IOERR_ABORT_REQUESTED; |
2294 | spin_unlock_irqrestore(&phba->hbalock, | 2298 | /* |
2295 | iflag); | 2299 | * For SLI4, irsiocb contains |
2300 | * NO_XRI in sli_xritag, it | ||
2301 | * shall not affect releasing | ||
2302 | * sgl (xri) process. | ||
2303 | */ | ||
2304 | saveq->iocb.ulpStatus = | ||
2305 | IOSTAT_LOCAL_REJECT; | ||
2306 | saveq->iocb.un.ulpWord[4] = | ||
2307 | IOERR_SLI_ABORTED; | ||
2308 | spin_lock_irqsave( | ||
2309 | &phba->hbalock, iflag); | ||
2310 | saveq->iocb_flag |= | ||
2311 | LPFC_DELAY_MEM_FREE; | ||
2312 | spin_unlock_irqrestore( | ||
2313 | &phba->hbalock, iflag); | ||
2314 | } | ||
2296 | } | 2315 | } |
2297 | } | 2316 | } |
2298 | (cmdiocbp->iocb_cmpl) (phba, cmdiocbp, saveq); | 2317 | (cmdiocbp->iocb_cmpl) (phba, cmdiocbp, saveq); |
@@ -2515,14 +2534,16 @@ lpfc_sli_handle_fast_ring_event(struct lpfc_hba *phba, | |||
2515 | 2534 | ||
2516 | cmdiocbq = lpfc_sli_iocbq_lookup(phba, pring, | 2535 | cmdiocbq = lpfc_sli_iocbq_lookup(phba, pring, |
2517 | &rspiocbq); | 2536 | &rspiocbq); |
2518 | if ((cmdiocbq) && (cmdiocbq->iocb_cmpl)) { | 2537 | if (unlikely(!cmdiocbq)) |
2519 | spin_unlock_irqrestore(&phba->hbalock, | 2538 | break; |
2520 | iflag); | 2539 | if (cmdiocbq->iocb_flag & LPFC_DRIVER_ABORTED) |
2521 | (cmdiocbq->iocb_cmpl)(phba, cmdiocbq, | 2540 | cmdiocbq->iocb_flag &= ~LPFC_DRIVER_ABORTED; |
2522 | &rspiocbq); | 2541 | if (cmdiocbq->iocb_cmpl) { |
2523 | spin_lock_irqsave(&phba->hbalock, | 2542 | spin_unlock_irqrestore(&phba->hbalock, iflag); |
2524 | iflag); | 2543 | (cmdiocbq->iocb_cmpl)(phba, cmdiocbq, |
2525 | } | 2544 | &rspiocbq); |
2545 | spin_lock_irqsave(&phba->hbalock, iflag); | ||
2546 | } | ||
2526 | break; | 2547 | break; |
2527 | case LPFC_UNSOL_IOCB: | 2548 | case LPFC_UNSOL_IOCB: |
2528 | spin_unlock_irqrestore(&phba->hbalock, iflag); | 2549 | spin_unlock_irqrestore(&phba->hbalock, iflag); |
@@ -3091,6 +3112,12 @@ lpfc_sli_brdready_s3(struct lpfc_hba *phba, uint32_t mask) | |||
3091 | 3112 | ||
3092 | /* Check to see if any errors occurred during init */ | 3113 | /* Check to see if any errors occurred during init */ |
3093 | if ((status & HS_FFERM) || (i >= 20)) { | 3114 | if ((status & HS_FFERM) || (i >= 20)) { |
3115 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | ||
3116 | "2751 Adapter failed to restart, " | ||
3117 | "status reg x%x, FW Data: A8 x%x AC x%x\n", | ||
3118 | status, | ||
3119 | readl(phba->MBslimaddr + 0xa8), | ||
3120 | readl(phba->MBslimaddr + 0xac)); | ||
3094 | phba->link_state = LPFC_HBA_ERROR; | 3121 | phba->link_state = LPFC_HBA_ERROR; |
3095 | retval = 1; | 3122 | retval = 1; |
3096 | } | 3123 | } |
@@ -3278,6 +3305,9 @@ lpfc_sli_brdkill(struct lpfc_hba *phba) | |||
3278 | if (retval != MBX_SUCCESS) { | 3305 | if (retval != MBX_SUCCESS) { |
3279 | if (retval != MBX_BUSY) | 3306 | if (retval != MBX_BUSY) |
3280 | mempool_free(pmb, phba->mbox_mem_pool); | 3307 | mempool_free(pmb, phba->mbox_mem_pool); |
3308 | lpfc_printf_log(phba, KERN_ERR, LOG_SLI, | ||
3309 | "2752 KILL_BOARD command failed retval %d\n", | ||
3310 | retval); | ||
3281 | spin_lock_irq(&phba->hbalock); | 3311 | spin_lock_irq(&phba->hbalock); |
3282 | phba->link_flag &= ~LS_IGNORE_ERATT; | 3312 | phba->link_flag &= ~LS_IGNORE_ERATT; |
3283 | spin_unlock_irq(&phba->hbalock); | 3313 | spin_unlock_irq(&phba->hbalock); |
@@ -4035,7 +4065,7 @@ lpfc_sli_hba_setup(struct lpfc_hba *phba) | |||
4035 | 4065 | ||
4036 | lpfc_sli_hba_setup_error: | 4066 | lpfc_sli_hba_setup_error: |
4037 | phba->link_state = LPFC_HBA_ERROR; | 4067 | phba->link_state = LPFC_HBA_ERROR; |
4038 | lpfc_printf_log(phba, KERN_INFO, LOG_INIT, | 4068 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, |
4039 | "0445 Firmware initialization failed\n"); | 4069 | "0445 Firmware initialization failed\n"); |
4040 | return rc; | 4070 | return rc; |
4041 | } | 4071 | } |
@@ -4388,7 +4418,13 @@ lpfc_sli4_hba_setup(struct lpfc_hba *phba) | |||
4388 | spin_unlock_irq(&phba->hbalock); | 4418 | spin_unlock_irq(&phba->hbalock); |
4389 | 4419 | ||
4390 | /* Read the port's service parameters. */ | 4420 | /* Read the port's service parameters. */ |
4391 | lpfc_read_sparam(phba, mboxq, vport->vpi); | 4421 | rc = lpfc_read_sparam(phba, mboxq, vport->vpi); |
4422 | if (rc) { | ||
4423 | phba->link_state = LPFC_HBA_ERROR; | ||
4424 | rc = -ENOMEM; | ||
4425 | goto out_free_vpd; | ||
4426 | } | ||
4427 | |||
4392 | mboxq->vport = vport; | 4428 | mboxq->vport = vport; |
4393 | rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_POLL); | 4429 | rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_POLL); |
4394 | mp = (struct lpfc_dmabuf *) mboxq->context1; | 4430 | mp = (struct lpfc_dmabuf *) mboxq->context1; |
@@ -4483,6 +4519,10 @@ lpfc_sli4_hba_setup(struct lpfc_hba *phba) | |||
4483 | /* Post receive buffers to the device */ | 4519 | /* Post receive buffers to the device */ |
4484 | lpfc_sli4_rb_setup(phba); | 4520 | lpfc_sli4_rb_setup(phba); |
4485 | 4521 | ||
4522 | /* Reset HBA FCF states after HBA reset */ | ||
4523 | phba->fcf.fcf_flag = 0; | ||
4524 | phba->fcf.current_rec.flag = 0; | ||
4525 | |||
4486 | /* Start the ELS watchdog timer */ | 4526 | /* Start the ELS watchdog timer */ |
4487 | mod_timer(&vport->els_tmofunc, | 4527 | mod_timer(&vport->els_tmofunc, |
4488 | jiffies + HZ * (phba->fc_ratov * 2)); | 4528 | jiffies + HZ * (phba->fc_ratov * 2)); |
@@ -7436,6 +7476,7 @@ lpfc_sli_wake_iocb_wait(struct lpfc_hba *phba, | |||
7436 | { | 7476 | { |
7437 | wait_queue_head_t *pdone_q; | 7477 | wait_queue_head_t *pdone_q; |
7438 | unsigned long iflags; | 7478 | unsigned long iflags; |
7479 | struct lpfc_scsi_buf *lpfc_cmd; | ||
7439 | 7480 | ||
7440 | spin_lock_irqsave(&phba->hbalock, iflags); | 7481 | spin_lock_irqsave(&phba->hbalock, iflags); |
7441 | cmdiocbq->iocb_flag |= LPFC_IO_WAKE; | 7482 | cmdiocbq->iocb_flag |= LPFC_IO_WAKE; |
@@ -7443,6 +7484,14 @@ lpfc_sli_wake_iocb_wait(struct lpfc_hba *phba, | |||
7443 | memcpy(&((struct lpfc_iocbq *)cmdiocbq->context2)->iocb, | 7484 | memcpy(&((struct lpfc_iocbq *)cmdiocbq->context2)->iocb, |
7444 | &rspiocbq->iocb, sizeof(IOCB_t)); | 7485 | &rspiocbq->iocb, sizeof(IOCB_t)); |
7445 | 7486 | ||
7487 | /* Set the exchange busy flag for task management commands */ | ||
7488 | if ((cmdiocbq->iocb_flag & LPFC_IO_FCP) && | ||
7489 | !(cmdiocbq->iocb_flag & LPFC_IO_LIBDFC)) { | ||
7490 | lpfc_cmd = container_of(cmdiocbq, struct lpfc_scsi_buf, | ||
7491 | cur_iocbq); | ||
7492 | lpfc_cmd->exch_busy = rspiocbq->iocb_flag & LPFC_EXCHANGE_BUSY; | ||
7493 | } | ||
7494 | |||
7446 | pdone_q = cmdiocbq->context_un.wait_queue; | 7495 | pdone_q = cmdiocbq->context_un.wait_queue; |
7447 | if (pdone_q) | 7496 | if (pdone_q) |
7448 | wake_up(pdone_q); | 7497 | wake_up(pdone_q); |
@@ -9061,6 +9110,12 @@ lpfc_sli4_fp_handle_fcp_wcqe(struct lpfc_hba *phba, | |||
9061 | /* Fake the irspiocb and copy necessary response information */ | 9110 | /* Fake the irspiocb and copy necessary response information */ |
9062 | lpfc_sli4_iocb_param_transfer(phba, &irspiocbq, cmdiocbq, wcqe); | 9111 | lpfc_sli4_iocb_param_transfer(phba, &irspiocbq, cmdiocbq, wcqe); |
9063 | 9112 | ||
9113 | if (cmdiocbq->iocb_flag & LPFC_DRIVER_ABORTED) { | ||
9114 | spin_lock_irqsave(&phba->hbalock, iflags); | ||
9115 | cmdiocbq->iocb_flag &= ~LPFC_DRIVER_ABORTED; | ||
9116 | spin_unlock_irqrestore(&phba->hbalock, iflags); | ||
9117 | } | ||
9118 | |||
9064 | /* Pass the cmd_iocb and the rsp state to the upper layer */ | 9119 | /* Pass the cmd_iocb and the rsp state to the upper layer */ |
9065 | (cmdiocbq->iocb_cmpl)(phba, cmdiocbq, &irspiocbq); | 9120 | (cmdiocbq->iocb_cmpl)(phba, cmdiocbq, &irspiocbq); |
9066 | } | 9121 | } |
@@ -11941,15 +11996,19 @@ lpfc_sli4_build_dflt_fcf_record(struct lpfc_hba *phba, | |||
11941 | } | 11996 | } |
11942 | 11997 | ||
11943 | /** | 11998 | /** |
11944 | * lpfc_sli4_read_fcf_record - Read the driver's default FCF Record. | 11999 | * lpfc_sli4_fcf_scan_read_fcf_rec - Read hba fcf record for fcf scan. |
11945 | * @phba: pointer to lpfc hba data structure. | 12000 | * @phba: pointer to lpfc hba data structure. |
11946 | * @fcf_index: FCF table entry offset. | 12001 | * @fcf_index: FCF table entry offset. |
11947 | * | 12002 | * |
11948 | * This routine is invoked to read up to @fcf_num of FCF record from the | 12003 | * This routine is invoked to scan the entire FCF table by reading FCF |
11949 | * device starting with the given @fcf_index. | 12004 | * record and processing it one at a time starting from the @fcf_index |
12005 | * for initial FCF discovery or fast FCF failover rediscovery. | ||
12006 | * | ||
12007 | * Return 0 if the mailbox command is submitted sucessfully, none 0 | ||
12008 | * otherwise. | ||
11950 | **/ | 12009 | **/ |
11951 | int | 12010 | int |
11952 | lpfc_sli4_read_fcf_record(struct lpfc_hba *phba, uint16_t fcf_index) | 12011 | lpfc_sli4_fcf_scan_read_fcf_rec(struct lpfc_hba *phba, uint16_t fcf_index) |
11953 | { | 12012 | { |
11954 | int rc = 0, error; | 12013 | int rc = 0, error; |
11955 | LPFC_MBOXQ_t *mboxq; | 12014 | LPFC_MBOXQ_t *mboxq; |
@@ -11961,17 +12020,17 @@ lpfc_sli4_read_fcf_record(struct lpfc_hba *phba, uint16_t fcf_index) | |||
11961 | "2000 Failed to allocate mbox for " | 12020 | "2000 Failed to allocate mbox for " |
11962 | "READ_FCF cmd\n"); | 12021 | "READ_FCF cmd\n"); |
11963 | error = -ENOMEM; | 12022 | error = -ENOMEM; |
11964 | goto fail_fcfscan; | 12023 | goto fail_fcf_scan; |
11965 | } | 12024 | } |
11966 | /* Construct the read FCF record mailbox command */ | 12025 | /* Construct the read FCF record mailbox command */ |
11967 | rc = lpfc_sli4_mbx_read_fcf_record(phba, mboxq, fcf_index); | 12026 | rc = lpfc_sli4_mbx_read_fcf_rec(phba, mboxq, fcf_index); |
11968 | if (rc) { | 12027 | if (rc) { |
11969 | error = -EINVAL; | 12028 | error = -EINVAL; |
11970 | goto fail_fcfscan; | 12029 | goto fail_fcf_scan; |
11971 | } | 12030 | } |
11972 | /* Issue the mailbox command asynchronously */ | 12031 | /* Issue the mailbox command asynchronously */ |
11973 | mboxq->vport = phba->pport; | 12032 | mboxq->vport = phba->pport; |
11974 | mboxq->mbox_cmpl = lpfc_mbx_cmpl_read_fcf_record; | 12033 | mboxq->mbox_cmpl = lpfc_mbx_cmpl_fcf_scan_read_fcf_rec; |
11975 | rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_NOWAIT); | 12034 | rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_NOWAIT); |
11976 | if (rc == MBX_NOT_FINISHED) | 12035 | if (rc == MBX_NOT_FINISHED) |
11977 | error = -EIO; | 12036 | error = -EIO; |
@@ -11979,9 +12038,13 @@ lpfc_sli4_read_fcf_record(struct lpfc_hba *phba, uint16_t fcf_index) | |||
11979 | spin_lock_irq(&phba->hbalock); | 12038 | spin_lock_irq(&phba->hbalock); |
11980 | phba->hba_flag |= FCF_DISC_INPROGRESS; | 12039 | phba->hba_flag |= FCF_DISC_INPROGRESS; |
11981 | spin_unlock_irq(&phba->hbalock); | 12040 | spin_unlock_irq(&phba->hbalock); |
12041 | /* Reset FCF round robin index bmask for new scan */ | ||
12042 | if (fcf_index == LPFC_FCOE_FCF_GET_FIRST) | ||
12043 | memset(phba->fcf.fcf_rr_bmask, 0, | ||
12044 | sizeof(*phba->fcf.fcf_rr_bmask)); | ||
11982 | error = 0; | 12045 | error = 0; |
11983 | } | 12046 | } |
11984 | fail_fcfscan: | 12047 | fail_fcf_scan: |
11985 | if (error) { | 12048 | if (error) { |
11986 | if (mboxq) | 12049 | if (mboxq) |
11987 | lpfc_sli4_mbox_cmd_free(phba, mboxq); | 12050 | lpfc_sli4_mbox_cmd_free(phba, mboxq); |
@@ -11994,6 +12057,181 @@ fail_fcfscan: | |||
11994 | } | 12057 | } |
11995 | 12058 | ||
11996 | /** | 12059 | /** |
12060 | * lpfc_sli4_fcf_rr_read_fcf_rec - Read hba fcf record for round robin fcf. | ||
12061 | * @phba: pointer to lpfc hba data structure. | ||
12062 | * @fcf_index: FCF table entry offset. | ||
12063 | * | ||
12064 | * This routine is invoked to read an FCF record indicated by @fcf_index | ||
12065 | * and to use it for FLOGI round robin FCF failover. | ||
12066 | * | ||
12067 | * Return 0 if the mailbox command is submitted sucessfully, none 0 | ||
12068 | * otherwise. | ||
12069 | **/ | ||
12070 | int | ||
12071 | lpfc_sli4_fcf_rr_read_fcf_rec(struct lpfc_hba *phba, uint16_t fcf_index) | ||
12072 | { | ||
12073 | int rc = 0, error; | ||
12074 | LPFC_MBOXQ_t *mboxq; | ||
12075 | |||
12076 | mboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); | ||
12077 | if (!mboxq) { | ||
12078 | lpfc_printf_log(phba, KERN_ERR, LOG_FIP | LOG_INIT, | ||
12079 | "2763 Failed to allocate mbox for " | ||
12080 | "READ_FCF cmd\n"); | ||
12081 | error = -ENOMEM; | ||
12082 | goto fail_fcf_read; | ||
12083 | } | ||
12084 | /* Construct the read FCF record mailbox command */ | ||
12085 | rc = lpfc_sli4_mbx_read_fcf_rec(phba, mboxq, fcf_index); | ||
12086 | if (rc) { | ||
12087 | error = -EINVAL; | ||
12088 | goto fail_fcf_read; | ||
12089 | } | ||
12090 | /* Issue the mailbox command asynchronously */ | ||
12091 | mboxq->vport = phba->pport; | ||
12092 | mboxq->mbox_cmpl = lpfc_mbx_cmpl_fcf_rr_read_fcf_rec; | ||
12093 | rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_NOWAIT); | ||
12094 | if (rc == MBX_NOT_FINISHED) | ||
12095 | error = -EIO; | ||
12096 | else | ||
12097 | error = 0; | ||
12098 | |||
12099 | fail_fcf_read: | ||
12100 | if (error && mboxq) | ||
12101 | lpfc_sli4_mbox_cmd_free(phba, mboxq); | ||
12102 | return error; | ||
12103 | } | ||
12104 | |||
12105 | /** | ||
12106 | * lpfc_sli4_read_fcf_rec - Read hba fcf record for update eligible fcf bmask. | ||
12107 | * @phba: pointer to lpfc hba data structure. | ||
12108 | * @fcf_index: FCF table entry offset. | ||
12109 | * | ||
12110 | * This routine is invoked to read an FCF record indicated by @fcf_index to | ||
12111 | * determine whether it's eligible for FLOGI round robin failover list. | ||
12112 | * | ||
12113 | * Return 0 if the mailbox command is submitted sucessfully, none 0 | ||
12114 | * otherwise. | ||
12115 | **/ | ||
12116 | int | ||
12117 | lpfc_sli4_read_fcf_rec(struct lpfc_hba *phba, uint16_t fcf_index) | ||
12118 | { | ||
12119 | int rc = 0, error; | ||
12120 | LPFC_MBOXQ_t *mboxq; | ||
12121 | |||
12122 | mboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); | ||
12123 | if (!mboxq) { | ||
12124 | lpfc_printf_log(phba, KERN_ERR, LOG_FIP | LOG_INIT, | ||
12125 | "2758 Failed to allocate mbox for " | ||
12126 | "READ_FCF cmd\n"); | ||
12127 | error = -ENOMEM; | ||
12128 | goto fail_fcf_read; | ||
12129 | } | ||
12130 | /* Construct the read FCF record mailbox command */ | ||
12131 | rc = lpfc_sli4_mbx_read_fcf_rec(phba, mboxq, fcf_index); | ||
12132 | if (rc) { | ||
12133 | error = -EINVAL; | ||
12134 | goto fail_fcf_read; | ||
12135 | } | ||
12136 | /* Issue the mailbox command asynchronously */ | ||
12137 | mboxq->vport = phba->pport; | ||
12138 | mboxq->mbox_cmpl = lpfc_mbx_cmpl_read_fcf_rec; | ||
12139 | rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_NOWAIT); | ||
12140 | if (rc == MBX_NOT_FINISHED) | ||
12141 | error = -EIO; | ||
12142 | else | ||
12143 | error = 0; | ||
12144 | |||
12145 | fail_fcf_read: | ||
12146 | if (error && mboxq) | ||
12147 | lpfc_sli4_mbox_cmd_free(phba, mboxq); | ||
12148 | return error; | ||
12149 | } | ||
12150 | |||
12151 | /** | ||
12152 | * lpfc_sli4_fcf_rr_next_index_get - Get next eligible fcf record index | ||
12153 | * @phba: pointer to lpfc hba data structure. | ||
12154 | * | ||
12155 | * This routine is to get the next eligible FCF record index in a round | ||
12156 | * robin fashion. If the next eligible FCF record index equals to the | ||
12157 | * initial round robin FCF record index, LPFC_FCOE_FCF_NEXT_NONE (0xFFFF) | ||
12158 | * shall be returned, otherwise, the next eligible FCF record's index | ||
12159 | * shall be returned. | ||
12160 | **/ | ||
12161 | uint16_t | ||
12162 | lpfc_sli4_fcf_rr_next_index_get(struct lpfc_hba *phba) | ||
12163 | { | ||
12164 | uint16_t next_fcf_index; | ||
12165 | |||
12166 | /* Search from the currently registered FCF index */ | ||
12167 | next_fcf_index = find_next_bit(phba->fcf.fcf_rr_bmask, | ||
12168 | LPFC_SLI4_FCF_TBL_INDX_MAX, | ||
12169 | phba->fcf.current_rec.fcf_indx); | ||
12170 | /* Wrap around condition on phba->fcf.fcf_rr_bmask */ | ||
12171 | if (next_fcf_index >= LPFC_SLI4_FCF_TBL_INDX_MAX) | ||
12172 | next_fcf_index = find_next_bit(phba->fcf.fcf_rr_bmask, | ||
12173 | LPFC_SLI4_FCF_TBL_INDX_MAX, 0); | ||
12174 | /* Round robin failover stop condition */ | ||
12175 | if (next_fcf_index == phba->fcf.fcf_rr_init_indx) | ||
12176 | return LPFC_FCOE_FCF_NEXT_NONE; | ||
12177 | |||
12178 | return next_fcf_index; | ||
12179 | } | ||
12180 | |||
12181 | /** | ||
12182 | * lpfc_sli4_fcf_rr_index_set - Set bmask with eligible fcf record index | ||
12183 | * @phba: pointer to lpfc hba data structure. | ||
12184 | * | ||
12185 | * This routine sets the FCF record index in to the eligible bmask for | ||
12186 | * round robin failover search. It checks to make sure that the index | ||
12187 | * does not go beyond the range of the driver allocated bmask dimension | ||
12188 | * before setting the bit. | ||
12189 | * | ||
12190 | * Returns 0 if the index bit successfully set, otherwise, it returns | ||
12191 | * -EINVAL. | ||
12192 | **/ | ||
12193 | int | ||
12194 | lpfc_sli4_fcf_rr_index_set(struct lpfc_hba *phba, uint16_t fcf_index) | ||
12195 | { | ||
12196 | if (fcf_index >= LPFC_SLI4_FCF_TBL_INDX_MAX) { | ||
12197 | lpfc_printf_log(phba, KERN_ERR, LOG_FIP, | ||
12198 | "2610 HBA FCF index reached driver's " | ||
12199 | "book keeping dimension: fcf_index:%d, " | ||
12200 | "driver_bmask_max:%d\n", | ||
12201 | fcf_index, LPFC_SLI4_FCF_TBL_INDX_MAX); | ||
12202 | return -EINVAL; | ||
12203 | } | ||
12204 | /* Set the eligible FCF record index bmask */ | ||
12205 | set_bit(fcf_index, phba->fcf.fcf_rr_bmask); | ||
12206 | |||
12207 | return 0; | ||
12208 | } | ||
12209 | |||
12210 | /** | ||
12211 | * lpfc_sli4_fcf_rr_index_set - Clear bmask from eligible fcf record index | ||
12212 | * @phba: pointer to lpfc hba data structure. | ||
12213 | * | ||
12214 | * This routine clears the FCF record index from the eligible bmask for | ||
12215 | * round robin failover search. It checks to make sure that the index | ||
12216 | * does not go beyond the range of the driver allocated bmask dimension | ||
12217 | * before clearing the bit. | ||
12218 | **/ | ||
12219 | void | ||
12220 | lpfc_sli4_fcf_rr_index_clear(struct lpfc_hba *phba, uint16_t fcf_index) | ||
12221 | { | ||
12222 | if (fcf_index >= LPFC_SLI4_FCF_TBL_INDX_MAX) { | ||
12223 | lpfc_printf_log(phba, KERN_ERR, LOG_FIP, | ||
12224 | "2762 HBA FCF index goes beyond driver's " | ||
12225 | "book keeping dimension: fcf_index:%d, " | ||
12226 | "driver_bmask_max:%d\n", | ||
12227 | fcf_index, LPFC_SLI4_FCF_TBL_INDX_MAX); | ||
12228 | return; | ||
12229 | } | ||
12230 | /* Clear the eligible FCF record index bmask */ | ||
12231 | clear_bit(fcf_index, phba->fcf.fcf_rr_bmask); | ||
12232 | } | ||
12233 | |||
12234 | /** | ||
11997 | * lpfc_mbx_cmpl_redisc_fcf_table - completion routine for rediscover FCF table | 12235 | * lpfc_mbx_cmpl_redisc_fcf_table - completion routine for rediscover FCF table |
11998 | * @phba: pointer to lpfc hba data structure. | 12236 | * @phba: pointer to lpfc hba data structure. |
11999 | * | 12237 | * |
@@ -12014,21 +12252,40 @@ lpfc_mbx_cmpl_redisc_fcf_table(struct lpfc_hba *phba, LPFC_MBOXQ_t *mbox) | |||
12014 | shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, | 12252 | shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, |
12015 | &redisc_fcf->header.cfg_shdr.response); | 12253 | &redisc_fcf->header.cfg_shdr.response); |
12016 | if (shdr_status || shdr_add_status) { | 12254 | if (shdr_status || shdr_add_status) { |
12017 | lpfc_printf_log(phba, KERN_ERR, LOG_SLI, | 12255 | lpfc_printf_log(phba, KERN_ERR, LOG_FIP, |
12018 | "2746 Requesting for FCF rediscovery failed " | 12256 | "2746 Requesting for FCF rediscovery failed " |
12019 | "status x%x add_status x%x\n", | 12257 | "status x%x add_status x%x\n", |
12020 | shdr_status, shdr_add_status); | 12258 | shdr_status, shdr_add_status); |
12021 | /* | 12259 | if (phba->fcf.fcf_flag & FCF_ACVL_DISC) { |
12022 | * Request failed, last resort to re-try current | 12260 | spin_lock_irq(&phba->hbalock); |
12023 | * registered FCF entry | 12261 | phba->fcf.fcf_flag &= ~FCF_ACVL_DISC; |
12024 | */ | 12262 | spin_unlock_irq(&phba->hbalock); |
12025 | lpfc_retry_pport_discovery(phba); | 12263 | /* |
12026 | } else | 12264 | * CVL event triggered FCF rediscover request failed, |
12265 | * last resort to re-try current registered FCF entry. | ||
12266 | */ | ||
12267 | lpfc_retry_pport_discovery(phba); | ||
12268 | } else { | ||
12269 | spin_lock_irq(&phba->hbalock); | ||
12270 | phba->fcf.fcf_flag &= ~FCF_DEAD_DISC; | ||
12271 | spin_unlock_irq(&phba->hbalock); | ||
12272 | /* | ||
12273 | * DEAD FCF event triggered FCF rediscover request | ||
12274 | * failed, last resort to fail over as a link down | ||
12275 | * to FCF registration. | ||
12276 | */ | ||
12277 | lpfc_sli4_fcf_dead_failthrough(phba); | ||
12278 | } | ||
12279 | } else { | ||
12280 | lpfc_printf_log(phba, KERN_INFO, LOG_FIP, | ||
12281 | "2775 Start FCF rediscovery quiescent period " | ||
12282 | "wait timer before scaning FCF table\n"); | ||
12027 | /* | 12283 | /* |
12028 | * Start FCF rediscovery wait timer for pending FCF | 12284 | * Start FCF rediscovery wait timer for pending FCF |
12029 | * before rescan FCF record table. | 12285 | * before rescan FCF record table. |
12030 | */ | 12286 | */ |
12031 | lpfc_fcf_redisc_wait_start_timer(phba); | 12287 | lpfc_fcf_redisc_wait_start_timer(phba); |
12288 | } | ||
12032 | 12289 | ||
12033 | mempool_free(mbox, phba->mbox_mem_pool); | 12290 | mempool_free(mbox, phba->mbox_mem_pool); |
12034 | } | 12291 | } |
@@ -12047,6 +12304,9 @@ lpfc_sli4_redisc_fcf_table(struct lpfc_hba *phba) | |||
12047 | struct lpfc_mbx_redisc_fcf_tbl *redisc_fcf; | 12304 | struct lpfc_mbx_redisc_fcf_tbl *redisc_fcf; |
12048 | int rc, length; | 12305 | int rc, length; |
12049 | 12306 | ||
12307 | /* Cancel retry delay timers to all vports before FCF rediscover */ | ||
12308 | lpfc_cancel_all_vport_retry_delay_timer(phba); | ||
12309 | |||
12050 | mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); | 12310 | mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); |
12051 | if (!mbox) { | 12311 | if (!mbox) { |
12052 | lpfc_printf_log(phba, KERN_ERR, LOG_SLI, | 12312 | lpfc_printf_log(phba, KERN_ERR, LOG_SLI, |
@@ -12078,6 +12338,31 @@ lpfc_sli4_redisc_fcf_table(struct lpfc_hba *phba) | |||
12078 | } | 12338 | } |
12079 | 12339 | ||
12080 | /** | 12340 | /** |
12341 | * lpfc_sli4_fcf_dead_failthrough - Failthrough routine to fcf dead event | ||
12342 | * @phba: pointer to lpfc hba data structure. | ||
12343 | * | ||
12344 | * This function is the failover routine as a last resort to the FCF DEAD | ||
12345 | * event when driver failed to perform fast FCF failover. | ||
12346 | **/ | ||
12347 | void | ||
12348 | lpfc_sli4_fcf_dead_failthrough(struct lpfc_hba *phba) | ||
12349 | { | ||
12350 | uint32_t link_state; | ||
12351 | |||
12352 | /* | ||
12353 | * Last resort as FCF DEAD event failover will treat this as | ||
12354 | * a link down, but save the link state because we don't want | ||
12355 | * it to be changed to Link Down unless it is already down. | ||
12356 | */ | ||
12357 | link_state = phba->link_state; | ||
12358 | lpfc_linkdown(phba); | ||
12359 | phba->link_state = link_state; | ||
12360 | |||
12361 | /* Unregister FCF if no devices connected to it */ | ||
12362 | lpfc_unregister_unused_fcf(phba); | ||
12363 | } | ||
12364 | |||
12365 | /** | ||
12081 | * lpfc_sli_read_link_ste - Read region 23 to decide if link is disabled. | 12366 | * lpfc_sli_read_link_ste - Read region 23 to decide if link is disabled. |
12082 | * @phba: pointer to lpfc hba data structure. | 12367 | * @phba: pointer to lpfc hba data structure. |
12083 | * | 12368 | * |