Merge tag 'for-linus-20191212' of git://git.kernel.dk/linux-block
[platform/kernel/linux-starfive.git] / drivers / scsi / lpfc / lpfc_nvme.c
index 8e0f03e..f6c8963 100644 (file)
@@ -196,6 +196,46 @@ lpfc_nvme_cmd_template(void)
 }
 
 /**
+ * lpfc_nvme_prep_abort_wqe - set up 'abort' work queue entry.
+ * @pwqeq: Pointer to command iocb.
+ * @xritag: Tag that  uniqely identifies the local exchange resource.
+ * @opt: Option bits -
+ *             bit 0 = inhibit sending abts on the link
+ *
+ * This function is called with hbalock held.
+ **/
+void
+lpfc_nvme_prep_abort_wqe(struct lpfc_iocbq *pwqeq, u16 xritag, u8 opt)
+{
+       union lpfc_wqe128 *wqe = &pwqeq->wqe;
+
+       /* WQEs are reused.  Clear stale data and set key fields to
+        * zero like ia, iaab, iaar, xri_tag, and ctxt_tag.
+        */
+       memset(wqe, 0, sizeof(*wqe));
+
+       if (opt & INHIBIT_ABORT)
+               bf_set(abort_cmd_ia, &wqe->abort_cmd, 1);
+       /* Abort specified xri tag, with the mask deliberately zeroed */
+       bf_set(abort_cmd_criteria, &wqe->abort_cmd, T_XRI_TAG);
+
+       bf_set(wqe_cmnd, &wqe->abort_cmd.wqe_com, CMD_ABORT_XRI_CX);
+
+       /* Abort the IO associated with this outstanding exchange ID. */
+       wqe->abort_cmd.wqe_com.abort_tag = xritag;
+
+       /* iotag for the wqe completion. */
+       bf_set(wqe_reqtag, &wqe->abort_cmd.wqe_com, pwqeq->iotag);
+
+       bf_set(wqe_qosd, &wqe->abort_cmd.wqe_com, 1);
+       bf_set(wqe_lenloc, &wqe->abort_cmd.wqe_com, LPFC_WQE_LENLOC_NONE);
+
+       bf_set(wqe_cmd_type, &wqe->abort_cmd.wqe_com, OTHER_COMMAND);
+       bf_set(wqe_wqec, &wqe->abort_cmd.wqe_com, 1);
+       bf_set(wqe_cqid, &wqe->abort_cmd.wqe_com, LPFC_WQE_CQ_ID_DEFAULT);
+}
+
+/**
  * lpfc_nvme_create_queue -
  * @lpfc_pnvme: Pointer to the driver's nvme instance data
  * @qidx: An cpu index used to affinitize IO queues and MSIX vectors.
@@ -1791,7 +1831,6 @@ lpfc_nvme_fcp_abort(struct nvme_fc_local_port *pnvme_lport,
        struct lpfc_iocbq *abts_buf;
        struct lpfc_iocbq *nvmereq_wqe;
        struct lpfc_nvme_fcpreq_priv *freqpriv;
-       union lpfc_wqe128 *abts_wqe;
        unsigned long flags;
        int ret_val;
 
@@ -1912,37 +1951,7 @@ lpfc_nvme_fcp_abort(struct nvme_fc_local_port *pnvme_lport,
        /* Ready - mark outstanding as aborted by driver. */
        nvmereq_wqe->iocb_flag |= LPFC_DRIVER_ABORTED;
 
-       /* Complete prepping the abort wqe and issue to the FW. */
-       abts_wqe = &abts_buf->wqe;
-
-       /* WQEs are reused.  Clear stale data and set key fields to
-        * zero like ia, iaab, iaar, xri_tag, and ctxt_tag.
-        */
-       memset(abts_wqe, 0, sizeof(*abts_wqe));
-       bf_set(abort_cmd_criteria, &abts_wqe->abort_cmd, T_XRI_TAG);
-
-       /* word 7 */
-       bf_set(wqe_cmnd, &abts_wqe->abort_cmd.wqe_com, CMD_ABORT_XRI_CX);
-       bf_set(wqe_class, &abts_wqe->abort_cmd.wqe_com,
-              nvmereq_wqe->iocb.ulpClass);
-
-       /* word 8 - tell the FW to abort the IO associated with this
-        * outstanding exchange ID.
-        */
-       abts_wqe->abort_cmd.wqe_com.abort_tag = nvmereq_wqe->sli4_xritag;
-
-       /* word 9 - this is the iotag for the abts_wqe completion. */
-       bf_set(wqe_reqtag, &abts_wqe->abort_cmd.wqe_com,
-              abts_buf->iotag);
-
-       /* word 10 */
-       bf_set(wqe_qosd, &abts_wqe->abort_cmd.wqe_com, 1);
-       bf_set(wqe_lenloc, &abts_wqe->abort_cmd.wqe_com, LPFC_WQE_LENLOC_NONE);
-
-       /* word 11 */
-       bf_set(wqe_cmd_type, &abts_wqe->abort_cmd.wqe_com, OTHER_COMMAND);
-       bf_set(wqe_wqec, &abts_wqe->abort_cmd.wqe_com, 1);
-       bf_set(wqe_cqid, &abts_wqe->abort_cmd.wqe_com, LPFC_WQE_CQ_ID_DEFAULT);
+       lpfc_nvme_prep_abort_wqe(abts_buf, nvmereq_wqe->sli4_xritag, 0);
 
        /* ABTS WQE must go to the same WQ as the WQE to be aborted */
        abts_buf->iocb_flag |= LPFC_IO_NVME;
@@ -2086,7 +2095,7 @@ lpfc_release_nvme_buf(struct lpfc_hba *phba, struct lpfc_io_buf *lpfc_ncmd)
        lpfc_ncmd->flags &= ~LPFC_SBUF_BUMP_QDEPTH;
 
        qp = lpfc_ncmd->hdwq;
-       if (lpfc_ncmd->flags & LPFC_SBUF_XBUSY) {
+       if (unlikely(lpfc_ncmd->flags & LPFC_SBUF_XBUSY)) {
                lpfc_printf_log(phba, KERN_INFO, LOG_NVME_ABTS,
                                "6310 XB release deferred for "
                                "ox_id x%x on reqtag x%x\n",
@@ -2141,12 +2150,10 @@ lpfc_nvme_create_localport(struct lpfc_vport *vport)
         */
        lpfc_nvme_template.max_sgl_segments = phba->cfg_nvme_seg_cnt + 1;
 
-       /* Advertise how many hw queues we support based on fcp_io_sched */
-       if (phba->cfg_fcp_io_sched == LPFC_FCP_SCHED_BY_HDWQ)
-               lpfc_nvme_template.max_hw_queues = phba->cfg_hdw_queue;
-       else
-               lpfc_nvme_template.max_hw_queues =
-                       phba->sli4_hba.num_present_cpu;
+       /* Advertise how many hw queues we support based on cfg_hdw_queue,
+        * which will not exceed cpu count.
+        */
+       lpfc_nvme_template.max_hw_queues = phba->cfg_hdw_queue;
 
        if (!IS_ENABLED(CONFIG_NVME_FC))
                return ret;