Merge tag 'sound-fix-5.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai...
[linux-2.6-microblaze.git] / drivers / scsi / lpfc / lpfc_sli.c
index fa1a714..06ccc01 100644 (file)
@@ -1,8 +1,8 @@
 /*******************************************************************
  * This file is part of the Emulex Linux Device Driver for         *
  * Fibre Channel Host Bus Adapters.                                *
- * Copyright (C) 2017-2020 Broadcom. All Rights Reserved. The term *
- * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.  *
+ * Copyright (C) 2017-2021 Broadcom. All Rights Reserved. The term *
+ * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.     *
  * Copyright (C) 2004-2016 Emulex.  All rights reserved.           *
  * EMULEX and SLI are trademarks of Emulex.                        *
  * www.broadcom.com                                                *
@@ -935,7 +935,7 @@ __lpfc_sli_get_iocbq(struct lpfc_hba *phba)
  * @phba: Pointer to HBA context object.
  * @xritag: XRI value.
  *
- * This function clears the sglq pointer from the array of acive
+ * This function clears the sglq pointer from the array of active
  * sglq's. The xritag that is passed in is used to index into the
  * array. Before the xritag can be used it needs to be adjusted
  * by subtracting the xribase.
@@ -957,7 +957,7 @@ __lpfc_clear_active_sglq(struct lpfc_hba *phba, uint16_t xritag)
  * @phba: Pointer to HBA context object.
  * @xritag: XRI value.
  *
- * This function returns the sglq pointer from the array of acive
+ * This function returns the sglq pointer from the array of active
  * sglq's. The xritag that is passed in is used to index into the
  * array. Before the xritag can be used it needs to be adjusted
  * by subtracting the xribase.
@@ -987,16 +987,10 @@ lpfc_clr_rrq_active(struct lpfc_hba *phba,
 {
        struct lpfc_nodelist *ndlp = NULL;
 
+       /* Lookup did to verify if did is still active on this vport */
        if (rrq->vport)
                ndlp = lpfc_findnode_did(rrq->vport, rrq->nlp_DID);
 
-       /* The target DID could have been swapped (cable swap)
-        * we should use the ndlp from the findnode if it is
-        * available.
-        */
-       if ((!ndlp) && rrq->ndlp)
-               ndlp = rrq->ndlp;
-
        if (!ndlp)
                goto out;
 
@@ -1118,9 +1112,14 @@ lpfc_cleanup_vports_rrqs(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
                lpfc_sli4_vport_delete_fcp_xri_aborted(vport);
        }
        spin_lock_irqsave(&phba->hbalock, iflags);
-       list_for_each_entry_safe(rrq, nextrrq, &phba->active_rrq_list, list)
-               if ((rrq->vport == vport) && (!ndlp  || rrq->ndlp == ndlp))
+       list_for_each_entry_safe(rrq, nextrrq, &phba->active_rrq_list, list) {
+               if (rrq->vport != vport)
+                       continue;
+
+               if (!ndlp || ndlp == lpfc_findnode_did(vport, rrq->nlp_DID))
                        list_move(&rrq->list, &rrq_list);
+
+       }
        spin_unlock_irqrestore(&phba->hbalock, iflags);
 
        list_for_each_entry_safe(rrq, nextrrq, &rrq_list, list) {
@@ -1213,7 +1212,6 @@ lpfc_set_rrq_active(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp,
        rrq->xritag = xritag;
        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;
@@ -1405,7 +1403,6 @@ __lpfc_sli_release_iocbq_s4(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq)
                        goto out;
                }
 
-               pring = phba->sli4_hba.els_wq->pring;
                if ((iocbq->iocb_flag & LPFC_EXCHANGE_BUSY) &&
                        (sglq->state != SGL_XRI_ABORTED)) {
                        spin_lock_irqsave(&phba->sli4_hba.sgl_list_lock,
@@ -1428,9 +1425,9 @@ __lpfc_sli_release_iocbq_s4(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq)
                                      &phba->sli4_hba.lpfc_els_sgl_list);
                        spin_unlock_irqrestore(
                                &phba->sli4_hba.sgl_list_lock, iflag);
-
+                       pring = lpfc_phba_elsring(phba);
                        /* Check if TXQ queue needs to be serviced */
-                       if (!list_empty(&pring->txq))
+                       if (pring && (!list_empty(&pring->txq)))
                                lpfc_worker_wake_up(phba);
                }
        }
@@ -2659,7 +2656,7 @@ lpfc_sli_def_mbox_cmpl(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
                                vport,
                                KERN_INFO, LOG_MBOX | LOG_DISCOVERY,
                                "1438 UNREG cmpl deferred mbox x%x "
-                               "on NPort x%x Data: x%x x%x %px x%x x%x\n",
+                               "on NPort x%x Data: x%x x%x x%px x%x x%x\n",
                                ndlp->nlp_rpi, ndlp->nlp_DID,
                                ndlp->nlp_flag, ndlp->nlp_defer_did,
                                ndlp, vport->load_flag, kref_read(&ndlp->kref));
@@ -2724,7 +2721,7 @@ lpfc_sli4_unreg_rpi_cmpl_clr(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
                                         vport, KERN_INFO, LOG_MBOX | LOG_SLI,
                                         "0010 UNREG_LOGIN vpi:%x "
                                         "rpi:%x DID:%x defer x%x flg x%x "
-                                        "%px\n",
+                                        "x%px\n",
                                         vport->vpi, ndlp->nlp_rpi,
                                         ndlp->nlp_DID, ndlp->nlp_defer_did,
                                         ndlp->nlp_flag,
@@ -3026,7 +3023,7 @@ lpfc_nvme_unsol_ls_handler(struct lpfc_hba *phba, struct lpfc_iocbq *piocb)
                                goto out_fail;
 
                        lpfc_printf_log(phba, KERN_ERR, LOG_NODE,
-                                       "6206 NVMET unsol ls_req ndlp %p "
+                                       "6206 NVMET unsol ls_req ndlp x%px "
                                        "DID x%x xflags x%x refcnt %d\n",
                                        ndlp, ndlp->nlp_DID,
                                        ndlp->fc4_xpt_flags,
@@ -5683,12 +5680,10 @@ lpfc_sli4_get_ctl_attr(struct lpfc_hba *phba)
                        phba->sli4_hba.lnk_info.lnk_no,
                        phba->BIOSVersion);
 out_free_mboxq:
-       if (rc != MBX_TIMEOUT) {
-               if (bf_get(lpfc_mqe_command, &mboxq->u.mqe) == MBX_SLI4_CONFIG)
-                       lpfc_sli4_mbox_cmd_free(phba, mboxq);
-               else
-                       mempool_free(mboxq, phba->mbox_mem_pool);
-       }
+       if (bf_get(lpfc_mqe_command, &mboxq->u.mqe) == MBX_SLI4_CONFIG)
+               lpfc_sli4_mbox_cmd_free(phba, mboxq);
+       else
+               mempool_free(mboxq, phba->mbox_mem_pool);
        return rc;
 }
 
@@ -5789,12 +5784,10 @@ retrieve_ppname:
        }
 
 out_free_mboxq:
-       if (rc != MBX_TIMEOUT) {
-               if (bf_get(lpfc_mqe_command, &mboxq->u.mqe) == MBX_SLI4_CONFIG)
-                       lpfc_sli4_mbox_cmd_free(phba, mboxq);
-               else
-                       mempool_free(mboxq, phba->mbox_mem_pool);
-       }
+       if (bf_get(lpfc_mqe_command, &mboxq->u.mqe) == MBX_SLI4_CONFIG)
+               lpfc_sli4_mbox_cmd_free(phba, mboxq);
+       else
+               mempool_free(mboxq, phba->mbox_mem_pool);
        return rc;
 }
 
@@ -9635,7 +9628,7 @@ lpfc_sli4_bpl2sgl(struct lpfc_hba *phba, struct lpfc_iocbq *piocbq,
 }
 
 /**
- * lpfc_sli_iocb2wqe - Convert the IOCB to a work queue entry.
+ * lpfc_sli4_iocb2wqe - Convert the IOCB to a work queue entry.
  * @phba: Pointer to HBA context object.
  * @iocbq: Pointer to command iocb.
  * @wqe: Pointer to the work queue entry.
@@ -10421,7 +10414,7 @@ __lpfc_sli_issue_iocb_s4(struct lpfc_hba *phba, uint32_t ring_number,
        return 0;
 }
 
-/**
+/*
  * lpfc_sli_issue_fcp_io - Wrapper func for issuing fcp i/o
  *
  * This routine wraps the actual fcp i/o function for issusing WQE for sli-4
@@ -11593,7 +11586,7 @@ release_iocb:
  * which are aborted. The function frees memory resources used for
  * the aborted ELS commands.
  **/
-static void
+void
 lpfc_ignore_els_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
                     struct lpfc_iocbq *rspiocb)
 {
@@ -11647,7 +11640,7 @@ lpfc_sli_issue_abort_iotag(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
        icmd = &cmdiocb->iocb;
        if (icmd->ulpCommand == CMD_ABORT_XRI_CN ||
            icmd->ulpCommand == CMD_CLOSE_XRI_CN ||
-           (cmdiocb->iocb_flag & LPFC_DRIVER_ABORTED) != 0)
+           cmdiocb->iocb_flag & LPFC_DRIVER_ABORTED)
                return IOCB_ABORTING;
 
        if (!pring) {
@@ -11945,7 +11938,6 @@ lpfc_sli_abort_fcp_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
 /**
  * lpfc_sli_abort_iocb - issue abort for all commands on a host/target/LUN
  * @vport: Pointer to virtual port.
- * @pring: Pointer to driver SLI ring object.
  * @tgt_id: SCSI ID of the target.
  * @lun_id: LUN ID of the scsi device.
  * @abort_cmd: LPFC_CTX_LUN/LPFC_CTX_TGT/LPFC_CTX_HOST.
@@ -11960,18 +11952,22 @@ lpfc_sli_abort_fcp_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
  * FCP iocbs associated with SCSI target specified by tgt_id parameter.
  * When abort_cmd == LPFC_CTX_HOST, the function sends abort to all
  * FCP iocbs associated with virtual port.
+ * The pring used for SLI3 is sli3_ring[LPFC_FCP_RING], for SLI4
+ * lpfc_sli4_calc_ring is used.
  * This function returns number of iocbs it failed to abort.
  * This function is called with no locks held.
  **/
 int
-lpfc_sli_abort_iocb(struct lpfc_vport *vport, struct lpfc_sli_ring *pring,
-                   uint16_t tgt_id, uint64_t lun_id, lpfc_ctx_cmd abort_cmd)
+lpfc_sli_abort_iocb(struct lpfc_vport *vport, u16 tgt_id, u64 lun_id,
+                   lpfc_ctx_cmd abort_cmd)
 {
        struct lpfc_hba *phba = vport->phba;
+       struct lpfc_sli_ring *pring = NULL;
        struct lpfc_iocbq *iocbq;
        int errcnt = 0, ret_val = 0;
        unsigned long iflags;
        int i;
+       void *fcp_cmpl = NULL;
 
        /* all I/Os are in process of being flushed */
        if (phba->hba_flag & HBA_IOQ_FLUSH)
@@ -11985,8 +11981,15 @@ lpfc_sli_abort_iocb(struct lpfc_vport *vport, struct lpfc_sli_ring *pring,
                        continue;
 
                spin_lock_irqsave(&phba->hbalock, iflags);
+               if (phba->sli_rev == LPFC_SLI_REV3) {
+                       pring = &phba->sli.sli3_ring[LPFC_FCP_RING];
+                       fcp_cmpl = lpfc_sli_abort_fcp_cmpl;
+               } else if (phba->sli_rev == LPFC_SLI_REV4) {
+                       pring = lpfc_sli4_calc_ring(phba, iocbq);
+                       fcp_cmpl = lpfc_sli4_abort_fcp_cmpl;
+               }
                ret_val = lpfc_sli_issue_abort_iotag(phba, pring, iocbq,
-                                                    lpfc_sli_abort_fcp_cmpl);
+                                                    fcp_cmpl);
                spin_unlock_irqrestore(&phba->hbalock, iflags);
                if (ret_val != IOCB_SUCCESS)
                        errcnt++;
@@ -14170,7 +14173,7 @@ rearm_and_exit:
 }
 
 /**
- * lpfc_sli4_sp_process_cq - Process a slow-path event queue entry
+ * __lpfc_sli4_sp_process_cq - Process a slow-path event queue entry
  * @cq: pointer to CQ to process
  *
  * This routine calls the cq processing routine with a handler specific
@@ -14744,7 +14747,7 @@ lpfc_sli4_hba_process_cq(struct work_struct *work)
 }
 
 /**
- * lpfc_sli4_hba_process_cq - fast-path work handler when started by timer
+ * lpfc_sli4_dly_hba_process_cq - fast-path work handler when started by timer
  * @work: pointer to work element
  *
  * translates from the work handler and calls the fast-path handler.
@@ -14848,7 +14851,7 @@ lpfc_sli4_hba_intr_handler(int irq, void *dev_id)
        }
 
        return IRQ_HANDLED;
-} /* lpfc_sli4_fp_intr_handler */
+} /* lpfc_sli4_hba_intr_handler */
 
 /**
  * lpfc_sli4_intr_handler - Device-level interrupt handler for SLI-4 device
@@ -17072,8 +17075,7 @@ lpfc_rq_destroy(struct lpfc_hba *phba, struct lpfc_queue *hrq,
                                "2509 RQ_DESTROY mailbox failed with "
                                "status x%x add_status x%x, mbx status x%x\n",
                                shdr_status, shdr_add_status, rc);
-               if (rc != MBX_TIMEOUT)
-                       mempool_free(mbox, hrq->phba->mbox_mem_pool);
+               mempool_free(mbox, hrq->phba->mbox_mem_pool);
                return -ENXIO;
        }
        bf_set(lpfc_mbx_rq_destroy_q_id, &mbox->u.mqe.un.rq_destroy.u.request,
@@ -17170,7 +17172,9 @@ lpfc_sli4_post_sgl(struct lpfc_hba *phba,
        shdr = (union lpfc_sli4_cfg_shdr *) &post_sgl_pages->header.cfg_shdr;
        shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response);
        shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response);
-       if (rc != MBX_TIMEOUT)
+       if (!phba->sli4_hba.intr_enable)
+               mempool_free(mbox, phba->mbox_mem_pool);
+       else if (rc != MBX_TIMEOUT)
                mempool_free(mbox, phba->mbox_mem_pool);
        if (shdr_status || shdr_add_status || rc) {
                lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
@@ -17218,7 +17222,7 @@ lpfc_sli4_alloc_xri(struct lpfc_hba *phba)
 }
 
 /**
- * lpfc_sli4_free_xri - Release an xri for reuse.
+ * __lpfc_sli4_free_xri - Release an xri for reuse.
  * @phba: pointer to lpfc hba data structure.
  * @xri: xri to release.
  *
@@ -17367,7 +17371,9 @@ lpfc_sli4_post_sgl_list(struct lpfc_hba *phba,
        shdr = (union lpfc_sli4_cfg_shdr *) &sgl->cfg_shdr;
        shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response);
        shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response);
-       if (rc != MBX_TIMEOUT)
+       if (!phba->sli4_hba.intr_enable)
+               lpfc_sli4_mbox_cmd_free(phba, mbox);
+       else if (rc != MBX_TIMEOUT)
                lpfc_sli4_mbox_cmd_free(phba, mbox);
        if (shdr_status || shdr_add_status || rc) {
                lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
@@ -17480,7 +17486,9 @@ lpfc_sli4_post_io_sgl_block(struct lpfc_hba *phba, struct list_head *nblist,
        shdr = (union lpfc_sli4_cfg_shdr *)&sgl->cfg_shdr;
        shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response);
        shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response);
-       if (rc != MBX_TIMEOUT)
+       if (!phba->sli4_hba.intr_enable)
+               lpfc_sli4_mbox_cmd_free(phba, mbox);
+       else if (rc != MBX_TIMEOUT)
                lpfc_sli4_mbox_cmd_free(phba, mbox);
        if (shdr_status || shdr_add_status || rc) {
                lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
@@ -18064,7 +18072,6 @@ lpfc_sli4_seq_abort_rsp_cmpl(struct lpfc_hba *phba,
        if (cmd_iocbq) {
                ndlp = (struct lpfc_nodelist *)cmd_iocbq->context1;
                lpfc_nlp_put(ndlp);
-               lpfc_nlp_not_used(ndlp);
                lpfc_sli_release_iocbq(phba, cmd_iocbq);
        }
 
@@ -18099,7 +18106,7 @@ lpfc_sli4_xri_inrange(struct lpfc_hba *phba,
 
 /**
  * lpfc_sli4_seq_abort_rsp - bls rsp to sequence abort
- * @vport: pointer to a vitural port.
+ * @vport: pointer to a virtual port.
  * @fc_hdr: pointer to a FC frame header.
  * @aborted: was the partially assembled receive sequence successfully aborted
  *
@@ -18831,8 +18838,7 @@ lpfc_sli4_post_rpi_hdr(struct lpfc_hba *phba, struct lpfc_rpi_hdr *rpi_page)
        shdr = (union lpfc_sli4_cfg_shdr *) &hdr_tmpl->header.cfg_shdr;
        shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response);
        shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response);
-       if (rc != MBX_TIMEOUT)
-               mempool_free(mboxq, phba->mbox_mem_pool);
+       mempool_free(mboxq, phba->mbox_mem_pool);
        if (shdr_status || shdr_add_status || rc) {
                lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
                                "2514 POST_RPI_HDR mailbox failed with "
@@ -18938,7 +18944,7 @@ lpfc_sli4_alloc_rpi(struct lpfc_hba *phba)
 }
 
 /**
- * lpfc_sli4_free_rpi - Release an rpi for reuse.
+ * __lpfc_sli4_free_rpi - Release an rpi for reuse.
  * @phba: pointer to lpfc hba data structure.
  * @rpi: rpi to free
  *
@@ -20076,7 +20082,9 @@ lpfc_wr_object(struct lpfc_hba *phba, struct list_head *dmabuf_list,
                        break;
                }
        }
-       if (rc != MBX_TIMEOUT)
+       if (!phba->sli4_hba.intr_enable)
+               mempool_free(mbox, phba->mbox_mem_pool);
+       else if (rc != MBX_TIMEOUT)
                mempool_free(mbox, phba->mbox_mem_pool);
        if (shdr_status || shdr_add_status || rc) {
                lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,