]> Pileus Git - ~andy/linux/blobdiff - drivers/scsi/lpfc/lpfc_sli.c
[SCSI] lpfc 8.3.39: Fixed system panic during EEH recovery due to midlayer acting...
[~andy/linux] / drivers / scsi / lpfc / lpfc_sli.c
index d43faf34c1e29221ddc02b3aedcb2c566a0ed5e8..c13ab4fd36b9370fd13d2c15e043d00e5f1db5e1 100644 (file)
@@ -667,7 +667,7 @@ lpfc_handle_rrq_active(struct lpfc_hba *phba)
 
        spin_lock_irqsave(&phba->hbalock, iflags);
        phba->hba_flag &= ~HBA_RRQ_ACTIVE;
-       next_time = jiffies + HZ * (phba->fc_ratov + 1);
+       next_time = jiffies + msecs_to_jiffies(1000 * (phba->fc_ratov + 1));
        list_for_each_entry_safe(rrq, nextrrq,
                                 &phba->active_rrq_list, list) {
                if (time_after(jiffies, rrq->rrq_stop_time))
@@ -782,7 +782,7 @@ lpfc_cleanup_wt_rrqs(struct lpfc_hba *phba)
                return;
        spin_lock_irqsave(&phba->hbalock, iflags);
        phba->hba_flag &= ~HBA_RRQ_ACTIVE;
-       next_time = jiffies + HZ * (phba->fc_ratov * 2);
+       next_time = jiffies + msecs_to_jiffies(1000 * (phba->fc_ratov * 2));
        list_splice_init(&phba->active_rrq_list, &rrq_list);
        spin_unlock_irqrestore(&phba->hbalock, iflags);
 
@@ -873,14 +873,17 @@ lpfc_set_rrq_active(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp,
                                xritag, rxid, ndlp->nlp_DID, send_rrq);
                return -EINVAL;
        }
-       rrq->send_rrq = send_rrq;
+       if (phba->cfg_enable_rrq == 1)
+               rrq->send_rrq = send_rrq;
+       else
+               rrq->send_rrq = 0;
        rrq->xritag = xritag;
-       rrq->rrq_stop_time = jiffies + HZ * (phba->fc_ratov + 1);
+       rrq->rrq_stop_time = jiffies +
+                               msecs_to_jiffies(1000 * (phba->fc_ratov + 1));
        rrq->ndlp = ndlp;
        rrq->nlp_DID = ndlp->nlp_DID;
        rrq->vport = ndlp->vport;
        rrq->rxid = rxid;
-       rrq->send_rrq = send_rrq;
        spin_lock_irqsave(&phba->hbalock, iflags);
        empty = list_empty(&phba->active_rrq_list);
        list_add_tail(&rrq->list, &phba->active_rrq_list);
@@ -924,8 +927,7 @@ __lpfc_sli_get_sglq(struct lpfc_hba *phba, struct lpfc_iocbq *piocbq)
        } else  if ((piocbq->iocb.ulpCommand == CMD_GEN_REQUEST64_CR) &&
                        !(piocbq->iocb_flag & LPFC_IO_LIBDFC))
                ndlp = piocbq->context_un.ndlp;
-       else  if ((piocbq->iocb.ulpCommand == CMD_ELS_REQUEST64_CR) &&
-                       (piocbq->iocb_flag & LPFC_IO_LIBDFC))
+       else  if (piocbq->iocb_flag & LPFC_IO_LIBDFC)
                ndlp = piocbq->context_un.ndlp;
        else
                ndlp = piocbq->context1;
@@ -1009,6 +1011,18 @@ __lpfc_sli_release_iocbq_s4(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq)
        else
                sglq = __lpfc_clear_active_sglq(phba, iocbq->sli4_lxritag);
 
+       /*
+       ** This should have been removed from the txcmplq before calling
+       ** iocbq_release. The normal completion
+       ** path should have already done the list_del_init.
+       */
+       if (unlikely(!list_empty(&iocbq->list))) {
+               if (iocbq->iocb_flag & LPFC_IO_ON_TXCMPLQ)
+                       iocbq->iocb_flag &= ~LPFC_IO_ON_TXCMPLQ;
+               list_del_init(&iocbq->list);
+       }
+
+
        if (sglq)  {
                if ((iocbq->iocb_flag & LPFC_EXCHANGE_BUSY) &&
                        (sglq->state != SGL_XRI_ABORTED)) {
@@ -1025,7 +1039,7 @@ __lpfc_sli_release_iocbq_s4(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq)
                                &phba->sli4_hba.lpfc_sgl_list);
 
                        /* Check if TXQ queue needs to be serviced */
-                       if (pring->txq_cnt)
+                       if (!list_empty(&pring->txq))
                                lpfc_worker_wake_up(phba);
                }
        }
@@ -1056,6 +1070,14 @@ __lpfc_sli_release_iocbq_s3(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq)
 {
        size_t start_clean = offsetof(struct lpfc_iocbq, iocb);
 
+       /*
+       ** This should have been removed from the txcmplq before calling
+       ** iocbq_release. The normal completion
+       ** path should have already done the list_del_init.
+       */
+       if (unlikely(!list_empty(&iocbq->list)))
+               list_del_init(&iocbq->list);
+
        /*
         * Clean all volatile data fields, preserve iotag and node struct.
         */
@@ -1122,7 +1144,6 @@ lpfc_sli_cancel_iocbs(struct lpfc_hba *phba, struct list_head *iocblist,
 
        while (!list_empty(iocblist)) {
                list_remove_head(iocblist, piocb, struct lpfc_iocbq, list);
-
                if (!piocb->iocb_cmpl)
                        lpfc_sli_release_iocbq(phba, piocb);
                else {
@@ -1310,9 +1331,6 @@ lpfc_sli_ringtxcmpl_put(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
 {
        list_add_tail(&piocb->list, &pring->txcmplq);
        piocb->iocb_flag |= LPFC_IO_ON_TXCMPLQ;
-       pring->txcmplq_cnt++;
-       if (pring->txcmplq_cnt > pring->txcmplq_max)
-               pring->txcmplq_max = pring->txcmplq_cnt;
 
        if ((unlikely(pring->ringno == LPFC_ELS_RING)) &&
           (piocb->iocb.ulpCommand != CMD_ABORT_XRI_CN) &&
@@ -1321,7 +1339,8 @@ lpfc_sli_ringtxcmpl_put(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
                        BUG();
                else
                        mod_timer(&piocb->vport->els_tmofunc,
-                                 jiffies + HZ * (phba->fc_ratov << 1));
+                               jiffies +
+                               msecs_to_jiffies(1000 * (phba->fc_ratov << 1)));
        }
 
 
@@ -1344,8 +1363,6 @@ lpfc_sli_ringtx_get(struct lpfc_hba *phba, struct lpfc_sli_ring *pring)
        struct lpfc_iocbq *cmd_iocb;
 
        list_remove_head((&pring->txq), cmd_iocb, struct lpfc_iocbq, list);
-       if (cmd_iocb != NULL)
-               pring->txq_cnt--;
        return cmd_iocb;
 }
 
@@ -1614,8 +1631,9 @@ lpfc_sli_resume_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring)
         *  (c) link attention events can be processed (fcp ring only)
         *  (d) IOCB processing is not blocked by the outstanding mbox command.
         */
-       if (pring->txq_cnt &&
-           lpfc_is_link_up(phba) &&
+
+       if (lpfc_is_link_up(phba) &&
+           (!list_empty(&pring->txq)) &&
            (pring->ringno != phba->sli.fcp_ring ||
             phba->sli.sli_flag & LPFC_PROCESS_LA)) {
 
@@ -2323,7 +2341,8 @@ lpfc_sli_handle_mb_event(struct lpfc_hba *phba)
                /* Mailbox cmd <cmd> Cmpl <cmpl> */
                lpfc_printf_log(phba, KERN_INFO, LOG_MBOX | LOG_SLI,
                                "(%d):0307 Mailbox cmd x%x (x%x/x%x) Cmpl x%p "
-                               "Data: x%x x%x x%x x%x x%x x%x x%x x%x x%x\n",
+                               "Data: x%x x%x x%x x%x x%x x%x x%x x%x x%x "
+                               "x%x x%x x%x\n",
                                pmb->vport ? pmb->vport->vpi : 0,
                                pmbox->mbxCommand,
                                lpfc_sli_config_mbox_subsys_get(phba, pmb),
@@ -2337,7 +2356,10 @@ lpfc_sli_handle_mb_event(struct lpfc_hba *phba)
                                pmbox->un.varWords[4],
                                pmbox->un.varWords[5],
                                pmbox->un.varWords[6],
-                               pmbox->un.varWords[7]);
+                               pmbox->un.varWords[7],
+                               pmbox->un.varWords[8],
+                               pmbox->un.varWords[9],
+                               pmbox->un.varWords[10]);
 
                if (pmb->mbox_cmpl)
                        pmb->mbox_cmpl(phba,pmb);
@@ -2612,7 +2634,6 @@ lpfc_sli_iocbq_lookup(struct lpfc_hba *phba,
                cmd_iocb = phba->sli.iocbq_lookup[iotag];
                list_del_init(&cmd_iocb->list);
                if (cmd_iocb->iocb_flag & LPFC_IO_ON_TXCMPLQ) {
-                       pring->txcmplq_cnt--;
                        cmd_iocb->iocb_flag &= ~LPFC_IO_ON_TXCMPLQ;
                }
                return cmd_iocb;
@@ -2650,7 +2671,6 @@ lpfc_sli_iocbq_lookup_by_tag(struct lpfc_hba *phba,
                        /* remove from txcmpl queue list */
                        list_del_init(&cmd_iocb->list);
                        cmd_iocb->iocb_flag &= ~LPFC_IO_ON_TXCMPLQ;
-                       pring->txcmplq_cnt--;
                        return cmd_iocb;
                }
        }
@@ -2893,8 +2913,9 @@ void lpfc_poll_eratt(unsigned long ptr)
                lpfc_worker_wake_up(phba);
        else
                /* Restart the timer for next eratt poll */
-               mod_timer(&phba->eratt_poll, jiffies +
-                                       HZ * LPFC_ERATT_POLL_INTERVAL);
+               mod_timer(&phba->eratt_poll,
+                         jiffies +
+                         msecs_to_jiffies(1000 * LPFC_ERATT_POLL_INTERVAL));
        return;
 }
 
@@ -3499,7 +3520,6 @@ lpfc_sli_abort_iocb_ring(struct lpfc_hba *phba, struct lpfc_sli_ring *pring)
         */
        spin_lock_irq(&phba->hbalock);
        list_splice_init(&pring->txq, &completions);
-       pring->txq_cnt = 0;
 
        /* Next issue ABTS for everything on the txcmplq */
        list_for_each_entry_safe(iocb, next_iocb, &pring->txcmplq, list)
@@ -3536,11 +3556,9 @@ lpfc_sli_flush_fcp_rings(struct lpfc_hba *phba)
        spin_lock_irq(&phba->hbalock);
        /* Retrieve everything on txq */
        list_splice_init(&pring->txq, &txq);
-       pring->txq_cnt = 0;
 
        /* Retrieve everything on the txcmplq */
        list_splice_init(&pring->txcmplq, &txcmplq);
-       pring->txcmplq_cnt = 0;
 
        /* Indicate the I/O queues are flushed */
        phba->hba_flag |= HBA_FCP_IOQ_FLUSH;
@@ -5499,6 +5517,7 @@ lpfc_sli4_dealloc_extent(struct lpfc_hba *phba, uint16_t type)
                        list_del_init(&rsrc_blk->list);
                        kfree(rsrc_blk);
                }
+               phba->sli4_hba.max_cfg_param.vpi_used = 0;
                break;
        case LPFC_RSC_TYPE_FCOE_XRI:
                kfree(phba->sli4_hba.xri_bmask);
@@ -5799,6 +5818,7 @@ lpfc_sli4_dealloc_resource_identifiers(struct lpfc_hba *phba)
                lpfc_sli4_dealloc_extent(phba, LPFC_RSC_TYPE_FCOE_VFI);
        } else {
                kfree(phba->vpi_bmask);
+               phba->sli4_hba.max_cfg_param.vpi_used = 0;
                kfree(phba->vpi_ids);
                bf_set(lpfc_vpi_rsrc_rdy, &phba->sli4_hba.sli4_flags, 0);
                kfree(phba->sli4_hba.xri_bmask);
@@ -5980,7 +6000,7 @@ lpfc_sli4_repost_els_sgl_list(struct lpfc_hba *phba)
        struct lpfc_sglq *sglq_entry = NULL;
        struct lpfc_sglq *sglq_entry_next = NULL;
        struct lpfc_sglq *sglq_entry_first = NULL;
-       int status, post_cnt = 0, num_posted = 0, block_cnt = 0;
+       int status, total_cnt, post_cnt = 0, num_posted = 0, block_cnt = 0;
        int last_xritag = NO_XRI;
        LIST_HEAD(prep_sgl_list);
        LIST_HEAD(blck_sgl_list);
@@ -5988,10 +6008,11 @@ lpfc_sli4_repost_els_sgl_list(struct lpfc_hba *phba)
        LIST_HEAD(post_sgl_list);
        LIST_HEAD(free_sgl_list);
 
-       spin_lock(&phba->hbalock);
+       spin_lock_irq(&phba->hbalock);
        list_splice_init(&phba->sli4_hba.lpfc_sgl_list, &allc_sgl_list);
-       spin_unlock(&phba->hbalock);
+       spin_unlock_irq(&phba->hbalock);
 
+       total_cnt = phba->sli4_hba.els_xri_cnt;
        list_for_each_entry_safe(sglq_entry, sglq_entry_next,
                                 &allc_sgl_list, list) {
                list_del_init(&sglq_entry->list);
@@ -6043,9 +6064,7 @@ lpfc_sli4_repost_els_sgl_list(struct lpfc_hba *phba)
                                                sglq_entry->sli4_xritag);
                                        list_add_tail(&sglq_entry->list,
                                                      &free_sgl_list);
-                                       spin_lock_irq(&phba->hbalock);
-                                       phba->sli4_hba.els_xri_cnt--;
-                                       spin_unlock_irq(&phba->hbalock);
+                                       total_cnt--;
                                }
                        }
                }
@@ -6073,9 +6092,7 @@ lpfc_sli4_repost_els_sgl_list(struct lpfc_hba *phba)
                                        (sglq_entry_first->sli4_xritag +
                                         post_cnt - 1));
                        list_splice_init(&blck_sgl_list, &free_sgl_list);
-                       spin_lock_irq(&phba->hbalock);
-                       phba->sli4_hba.els_xri_cnt -= post_cnt;
-                       spin_unlock_irq(&phba->hbalock);
+                       total_cnt -= post_cnt;
                }
 
                /* don't reset xirtag due to hole in xri block */
@@ -6085,16 +6102,18 @@ lpfc_sli4_repost_els_sgl_list(struct lpfc_hba *phba)
                /* reset els sgl post count for next round of posting */
                post_cnt = 0;
        }
+       /* update the number of XRIs posted for ELS */
+       phba->sli4_hba.els_xri_cnt = total_cnt;
 
        /* free the els sgls failed to post */
        lpfc_free_sgl_list(phba, &free_sgl_list);
 
        /* push els sgls posted to the availble list */
        if (!list_empty(&post_sgl_list)) {
-               spin_lock(&phba->hbalock);
+               spin_lock_irq(&phba->hbalock);
                list_splice_init(&post_sgl_list,
                                 &phba->sli4_hba.lpfc_sgl_list);
-               spin_unlock(&phba->hbalock);
+               spin_unlock_irq(&phba->hbalock);
        } else {
                lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
                                "3161 Failure to post els sgl to port.\n");
@@ -6434,16 +6453,17 @@ lpfc_sli4_hba_setup(struct lpfc_hba *phba)
 
        /* Start the ELS watchdog timer */
        mod_timer(&vport->els_tmofunc,
-                 jiffies + HZ * (phba->fc_ratov * 2));
+                 jiffies + msecs_to_jiffies(1000 * (phba->fc_ratov * 2)));
 
        /* Start heart beat timer */
        mod_timer(&phba->hb_tmofunc,
-                 jiffies + HZ * LPFC_HB_MBOX_INTERVAL);
+                 jiffies + msecs_to_jiffies(1000 * LPFC_HB_MBOX_INTERVAL));
        phba->hb_outstanding = 0;
        phba->last_completion_time = jiffies;
 
        /* Start error attention (ERATT) polling timer */
-       mod_timer(&phba->eratt_poll, jiffies + HZ * LPFC_ERATT_POLL_INTERVAL);
+       mod_timer(&phba->eratt_poll,
+                 jiffies + msecs_to_jiffies(1000 * LPFC_ERATT_POLL_INTERVAL));
 
        /* Enable PCIe device Advanced Error Reporting (AER) if configured */
        if (phba->cfg_aer_support == 1 && !(phba->hba_flag & HBA_AER_ENABLED)) {
@@ -6810,8 +6830,9 @@ lpfc_sli_issue_mbox_s3(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmbox,
                        goto out_not_finished;
                }
                /* timeout active mbox command */
-               mod_timer(&psli->mbox_tmo, (jiffies +
-                              (HZ * lpfc_mbox_tmo_val(phba, pmbox))));
+               timeout = msecs_to_jiffies(lpfc_mbox_tmo_val(phba, pmbox) *
+                                          1000);
+               mod_timer(&psli->mbox_tmo, jiffies + timeout);
        }
 
        /* Mailbox cmd <cmd> issue */
@@ -7484,7 +7505,7 @@ lpfc_sli4_post_async_mbox(struct lpfc_hba *phba)
 
        /* Start timer for the mbox_tmo and log some mailbox post messages */
        mod_timer(&psli->mbox_tmo, (jiffies +
-                 (HZ * lpfc_mbox_tmo_val(phba, mboxq))));
+                 msecs_to_jiffies(1000 * lpfc_mbox_tmo_val(phba, mboxq))));
 
        lpfc_printf_log(phba, KERN_INFO, LOG_MBOX | LOG_SLI,
                        "(%d):0355 Mailbox cmd x%x (x%x/x%x) issue Data: "
@@ -7615,7 +7636,6 @@ __lpfc_sli_ringtx_put(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
 {
        /* Insert the caller's iocb in the txq tail for later processing. */
        list_add_tail(&piocb->list, &pring->txq);
-       pring->txq_cnt++;
 }
 
 /**
@@ -8387,7 +8407,7 @@ __lpfc_sli_issue_iocb_s4(struct lpfc_hba *phba, uint32_t ring_number,
                    piocb->iocb.ulpCommand == CMD_CLOSE_XRI_CN)
                        sglq = NULL;
                else {
-                       if (pring->txq_cnt) {
+                       if (!list_empty(&pring->txq)) {
                                if (!(flag & SLI_IOCB_RET_IOCB)) {
                                        __lpfc_sli_ringtx_put(phba,
                                                pring, piocb);
@@ -8433,10 +8453,14 @@ __lpfc_sli_issue_iocb_s4(struct lpfc_hba *phba, uint32_t ring_number,
 
        if ((piocb->iocb_flag & LPFC_IO_FCP) ||
                (piocb->iocb_flag & LPFC_USE_FCPWQIDX)) {
+               if (unlikely(!phba->sli4_hba.fcp_wq))
+                       return IOCB_ERROR;
                if (lpfc_sli4_wq_put(phba->sli4_hba.fcp_wq[piocb->fcp_wqidx],
                                     &wqe))
                        return IOCB_ERROR;
        } else {
+               if (unlikely(!phba->sli4_hba.els_wq))
+                       return IOCB_ERROR;
                if (lpfc_sli4_wq_put(phba->sli4_hba.els_wq, &wqe))
                        return IOCB_ERROR;
        }
@@ -9055,7 +9079,6 @@ lpfc_sli_host_down(struct lpfc_vport *vport)
                        if (iocb->vport != vport)
                                continue;
                        list_move_tail(&iocb->list, &completions);
-                       pring->txq_cnt--;
                }
 
                /* Next issue ABTS for everything on the txcmplq */
@@ -9124,8 +9147,6 @@ lpfc_sli_hba_down(struct lpfc_hba *phba)
                 * given to the FW yet.
                 */
                list_splice_init(&pring->txq, &completions);
-               pring->txq_cnt = 0;
-
        }
        spin_unlock_irqrestore(&phba->hbalock, flags);
 
@@ -9966,6 +9987,9 @@ lpfc_sli_issue_iocb_wait(struct lpfc_hba *phba,
        long timeleft, timeout_req = 0;
        int retval = IOCB_SUCCESS;
        uint32_t creg_val;
+       struct lpfc_iocbq *iocb;
+       int txq_cnt = 0;
+       int txcmplq_cnt = 0;
        struct lpfc_sli_ring *pring = &phba->sli.ring[LPFC_ELS_RING];
        /*
         * If the caller has provided a response iocbq buffer, then context2
@@ -9992,7 +10016,7 @@ lpfc_sli_issue_iocb_wait(struct lpfc_hba *phba,
        retval = lpfc_sli_issue_iocb(phba, ring_number, piocb,
                                     SLI_IOCB_RET_IOCB);
        if (retval == IOCB_SUCCESS) {
-               timeout_req = timeout * HZ;
+               timeout_req = msecs_to_jiffies(timeout * 1000);
                timeleft = wait_event_timeout(done_q,
                                lpfc_chk_iocb_flg(phba, piocb, LPFC_IO_WAKE),
                                timeout_req);
@@ -10013,9 +10037,17 @@ lpfc_sli_issue_iocb_wait(struct lpfc_hba *phba,
                        retval = IOCB_TIMEDOUT;
                }
        } else if (retval == IOCB_BUSY) {
-               lpfc_printf_log(phba, KERN_INFO, LOG_SLI,
-                       "2818 Max IOCBs %d txq cnt %d txcmplq cnt %d\n",
-                       phba->iocb_cnt, pring->txq_cnt, pring->txcmplq_cnt);
+               if (phba->cfg_log_verbose & LOG_SLI) {
+                       list_for_each_entry(iocb, &pring->txq, list) {
+                               txq_cnt++;
+                       }
+                       list_for_each_entry(iocb, &pring->txcmplq, list) {
+                               txcmplq_cnt++;
+                       }
+                       lpfc_printf_log(phba, KERN_INFO, LOG_SLI,
+                               "2818 Max IOCBs %d txq cnt %d txcmplq cnt %d\n",
+                               phba->iocb_cnt, txq_cnt, txcmplq_cnt);
+               }
                return retval;
        } else {
                lpfc_printf_log(phba, KERN_INFO, LOG_SLI,
@@ -10089,7 +10121,7 @@ lpfc_sli_issue_mbox_wait(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmboxq,
        if (retval == MBX_BUSY || retval == MBX_SUCCESS) {
                wait_event_interruptible_timeout(done_q,
                                pmboxq->mbox_flag & LPFC_MBX_WAKE,
-                               timeout * HZ);
+                               msecs_to_jiffies(timeout * 1000));
 
                spin_lock_irqsave(&phba->hbalock, flag);
                pmboxq->context1 = NULL;
@@ -11298,16 +11330,25 @@ lpfc_sli4_sp_handle_els_wcqe(struct lpfc_hba *phba, struct lpfc_queue *cq,
        struct lpfc_iocbq *irspiocbq;
        unsigned long iflags;
        struct lpfc_sli_ring *pring = cq->pring;
+       int txq_cnt = 0;
+       int txcmplq_cnt = 0;
+       int fcp_txcmplq_cnt = 0;
 
        /* Get an irspiocbq for later ELS response processing use */
        irspiocbq = lpfc_sli_get_iocbq(phba);
        if (!irspiocbq) {
+               if (!list_empty(&pring->txq))
+                       txq_cnt++;
+               if (!list_empty(&pring->txcmplq))
+                       txcmplq_cnt++;
+               if (!list_empty(&phba->sli.ring[LPFC_FCP_RING].txcmplq))
+                       fcp_txcmplq_cnt++;
                lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
                        "0387 NO IOCBQ data: txq_cnt=%d iocb_cnt=%d "
                        "fcp_txcmplq_cnt=%d, els_txcmplq_cnt=%d\n",
-                       pring->txq_cnt, phba->iocb_cnt,
-                       phba->sli.ring[LPFC_FCP_RING].txcmplq_cnt,
-                       phba->sli.ring[LPFC_ELS_RING].txcmplq_cnt);
+                       txq_cnt, phba->iocb_cnt,
+                       fcp_txcmplq_cnt,
+                       txcmplq_cnt);
                return false;
        }
 
@@ -12871,8 +12912,9 @@ lpfc_wq_create(struct lpfc_hba *phba, struct lpfc_queue *wq,
                }
                wq->db_regaddr = bar_memmap_p + db_offset;
                lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
-                               "3264 WQ[%d]: barset:x%x, offset:x%x\n",
-                               wq->queue_id, pci_barset, db_offset);
+                               "3264 WQ[%d]: barset:x%x, offset:x%x, "
+                               "format:x%x\n", wq->queue_id, pci_barset,
+                               db_offset, wq->db_format);
        } else {
                wq->db_format = LPFC_DB_LIST_FORMAT;
                wq->db_regaddr = phba->sli4_hba.WQDBregaddr;
@@ -13092,8 +13134,9 @@ lpfc_rq_create(struct lpfc_hba *phba, struct lpfc_queue *hrq,
                }
                hrq->db_regaddr = bar_memmap_p + db_offset;
                lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
-                               "3266 RQ[qid:%d]: barset:x%x, offset:x%x\n",
-                               hrq->queue_id, pci_barset, db_offset);
+                               "3266 RQ[qid:%d]: barset:x%x, offset:x%x, "
+                               "format:x%x\n", hrq->queue_id, pci_barset,
+                               db_offset, hrq->db_format);
        } else {
                hrq->db_format = LPFC_DB_RING_FORMAT;
                hrq->db_regaddr = phba->sli4_hba.RQDBregaddr;
@@ -15482,11 +15525,18 @@ lpfc_check_next_fcf_pri_level(struct lpfc_hba *phba)
                        LPFC_SLI4_FCF_TBL_INDX_MAX);
        lpfc_printf_log(phba, KERN_INFO, LOG_FIP,
                        "3060 Last IDX %d\n", last_index);
-       if (list_empty(&phba->fcf.fcf_pri_list)) {
+
+       /* Verify the priority list has 2 or more entries */
+       spin_lock_irq(&phba->hbalock);
+       if (list_empty(&phba->fcf.fcf_pri_list) ||
+           list_is_singular(&phba->fcf.fcf_pri_list)) {
+               spin_unlock_irq(&phba->hbalock);
                lpfc_printf_log(phba, KERN_ERR, LOG_FIP,
                        "3061 Last IDX %d\n", last_index);
                return 0; /* Empty rr list */
        }
+       spin_unlock_irq(&phba->hbalock);
+
        next_fcf_pri = 0;
        /*
         * Clear the rr_bmask and set all of the bits that are at this
@@ -16245,14 +16295,19 @@ lpfc_drain_txq(struct lpfc_hba *phba)
        char *fail_msg = NULL;
        struct lpfc_sglq *sglq;
        union lpfc_wqe wqe;
+       int txq_cnt = 0;
 
        spin_lock_irqsave(&phba->hbalock, iflags);
-       if (pring->txq_cnt > pring->txq_max)
-               pring->txq_max = pring->txq_cnt;
+       list_for_each_entry(piocbq, &pring->txq, list) {
+               txq_cnt++;
+       }
+
+       if (txq_cnt > pring->txq_max)
+               pring->txq_max = txq_cnt;
 
        spin_unlock_irqrestore(&phba->hbalock, iflags);
 
-       while (pring->txq_cnt) {
+       while (!list_empty(&pring->txq)) {
                spin_lock_irqsave(&phba->hbalock, iflags);
 
                piocbq = lpfc_sli_ringtx_get(phba, pring);
@@ -16260,7 +16315,7 @@ lpfc_drain_txq(struct lpfc_hba *phba)
                        spin_unlock_irqrestore(&phba->hbalock, iflags);
                        lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
                                "2823 txq empty and txq_cnt is %d\n ",
-                               pring->txq_cnt);
+                               txq_cnt);
                        break;
                }
                sglq = __lpfc_sli_get_sglq(phba, piocbq);
@@ -16269,6 +16324,7 @@ lpfc_drain_txq(struct lpfc_hba *phba)
                        spin_unlock_irqrestore(&phba->hbalock, iflags);
                        break;
                }
+               txq_cnt--;
 
                /* The xri and iocb resources secured,
                 * attempt to issue request
@@ -16300,5 +16356,5 @@ lpfc_drain_txq(struct lpfc_hba *phba)
        lpfc_sli_cancel_iocbs(phba, &completions, IOSTAT_LOCAL_REJECT,
                                IOERR_SLI_ABORTED);
 
-       return pring->txq_cnt;
+       return txq_cnt;
 }