Merge tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
[linux-2.6-microblaze.git] / drivers / scsi / lpfc / lpfc_nvme.c
index 39d147e..4d819e5 100644 (file)
@@ -458,7 +458,7 @@ lpfc_nvme_gen_req(struct lpfc_vport *vport, struct lpfc_dmabuf *bmp,
        bf_set(wqe_xri_tag, &wqe->gen_req.wqe_com, genwqe->sli4_xritag);
 
        /* Word 7 */
-       bf_set(wqe_tmo, &wqe->gen_req.wqe_com, (vport->phba->fc_ratov-1));
+       bf_set(wqe_tmo, &wqe->gen_req.wqe_com, tmo);
        bf_set(wqe_class, &wqe->gen_req.wqe_com, CLASS3);
        bf_set(wqe_cmnd, &wqe->gen_req.wqe_com, CMD_GEN_REQUEST64_WQE);
        bf_set(wqe_ct, &wqe->gen_req.wqe_com, SLI4_CT_RPI);
@@ -618,7 +618,7 @@ __lpfc_nvme_ls_req(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
 
        ret = lpfc_nvme_gen_req(vport, bmp, pnvme_lsreq->rqstaddr,
                                pnvme_lsreq, gen_req_cmp, ndlp, 2,
-                               LPFC_NVME_LS_TIMEOUT, 0);
+                               pnvme_lsreq->timeout, 0);
        if (ret != WQE_SUCCESS) {
                lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
                                 "6052 NVMEx REQ: EXIT. issue ls wqe failed "
@@ -1850,6 +1850,10 @@ lpfc_nvme_fcp_abort(struct nvme_fc_local_port *pnvme_lport,
 
        spin_unlock(&lpfc_nbuf->buf_lock);
        spin_unlock_irqrestore(&phba->hbalock, flags);
+
+       /* Make sure HBA is alive */
+       lpfc_issue_hb_tmo(phba);
+
        if (ret_val != WQE_SUCCESS) {
                lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
                                 "6137 Failed abts issue_wqe with status x%x "
@@ -2596,17 +2600,24 @@ lpfc_nvme_wait_for_io_drain(struct lpfc_hba *phba)
                        }
                }
        }
+
+       /* Make sure HBA is alive */
+       lpfc_issue_hb_tmo(phba);
+
 }
 
 void
-lpfc_nvme_cancel_iocb(struct lpfc_hba *phba, struct lpfc_iocbq *pwqeIn)
+lpfc_nvme_cancel_iocb(struct lpfc_hba *phba, struct lpfc_iocbq *pwqeIn,
+                     uint32_t stat, uint32_t param)
 {
 #if (IS_ENABLED(CONFIG_NVME_FC))
        struct lpfc_io_buf *lpfc_ncmd;
        struct nvmefc_fcp_req *nCmd;
-       struct lpfc_nvme_fcpreq_priv *freqpriv;
+       struct lpfc_wcqe_complete wcqe;
+       struct lpfc_wcqe_complete *wcqep = &wcqe;
 
-       if (!pwqeIn->context1) {
+       lpfc_ncmd = (struct lpfc_io_buf *)pwqeIn->context1;
+       if (!lpfc_ncmd) {
                lpfc_sli_release_iocbq(phba, pwqeIn);
                return;
        }
@@ -2616,31 +2627,29 @@ lpfc_nvme_cancel_iocb(struct lpfc_hba *phba, struct lpfc_iocbq *pwqeIn)
                lpfc_sli_release_iocbq(phba, pwqeIn);
                return;
        }
-       lpfc_ncmd = (struct lpfc_io_buf *)pwqeIn->context1;
 
        spin_lock(&lpfc_ncmd->buf_lock);
-       if (!lpfc_ncmd->nvmeCmd) {
+       nCmd = lpfc_ncmd->nvmeCmd;
+       if (!nCmd) {
                spin_unlock(&lpfc_ncmd->buf_lock);
                lpfc_release_nvme_buf(phba, lpfc_ncmd);
                return;
        }
+       spin_unlock(&lpfc_ncmd->buf_lock);
 
-       nCmd = lpfc_ncmd->nvmeCmd;
        lpfc_printf_log(phba, KERN_INFO, LOG_NVME_IOERR,
                        "6194 NVME Cancel xri %x\n",
                        lpfc_ncmd->cur_iocbq.sli4_xritag);
 
-       nCmd->transferred_length = 0;
-       nCmd->rcv_rsplen = 0;
-       nCmd->status = NVME_SC_INTERNAL;
-       freqpriv = nCmd->private;
-       freqpriv->nvme_buf = NULL;
-       lpfc_ncmd->nvmeCmd = NULL;
-
-       spin_unlock(&lpfc_ncmd->buf_lock);
-       nCmd->done(nCmd);
+       wcqep->word0 = 0;
+       bf_set(lpfc_wcqe_c_status, wcqep, stat);
+       wcqep->parameter = param;
+       wcqep->word3 = 0; /* xb is 0 */
 
        /* Call release with XB=1 to queue the IO into the abort list. */
-       lpfc_release_nvme_buf(phba, lpfc_ncmd);
+       if (phba->sli.sli_flag & LPFC_SLI_ACTIVE)
+               bf_set(lpfc_wcqe_c_xb, wcqep, 1);
+
+       (pwqeIn->wqe_cmpl)(phba, pwqeIn, wcqep);
 #endif
 }