Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 60dd6e8e authored by Darren Trapp's avatar Darren Trapp Committed by Martin K. Petersen
Browse files

scsi: qla2xxx: Cleanup code to improve FC-NVMe error handling



This patch cleans up ABTS handling for FC-NVMe by

- Removing allocation of sp, instead pass the sp pointer for abort IOCB
- Fix error handling from Trasport failure
- set outstanding_cmds array to NULL for nvme completion

Signed-off-by: default avatarDarren Trapp <darren.trapp@cavium.com>
Signed-off-by: default avatarHimanshu Madhani <himanshu.madhani@cavium.com>
Reviewed-by: default avatarHannes Reinecke <hare@suse.com>
Reviewed-by: default avatarJohannes Thumshirn <jthumshirn@suse.de>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 623ee824
Loading
Loading
Loading
Loading
+28 −50
Original line number Diff line number Diff line
@@ -1837,31 +1837,23 @@ qla24xx_tm_iocb_entry(scsi_qla_host_t *vha, struct req_que *req, void *tsk)
	sp->done(sp, 0);
}

static void
qla24xx_nvme_iocb_entry(scsi_qla_host_t *vha, struct req_que *req, void *tsk)
static void qla24xx_nvme_iocb_entry(scsi_qla_host_t *vha, struct req_que *req,
    void *tsk, srb_t *sp)
{
	const char func[] = "NVME-IOCB";
	fc_port_t *fcport;
	srb_t *sp;
	struct srb_iocb *iocb;
	struct sts_entry_24xx *sts = (struct sts_entry_24xx *)tsk;
	uint16_t        state_flags;
	struct nvmefc_fcp_req *fd;
	uint16_t        ret = 0;
	struct srb_iocb *nvme;

	sp = qla2x00_get_sp_from_handle(vha, func, req, tsk);
	if (!sp)
		return;

	iocb = &sp->u.iocb_cmd;
	fcport = sp->fcport;
	iocb->u.nvme.comp_status = le16_to_cpu(sts->comp_status);
	state_flags  = le16_to_cpu(sts->state_flags);
	fd = iocb->u.nvme.desc;
	nvme = &sp->u.iocb_cmd;

	if (unlikely(nvme->u.nvme.aen_op))
	if (unlikely(iocb->u.nvme.aen_op))
		atomic_dec(&sp->vha->hw->nvme_active_aen_cnt);

	/*
@@ -1895,26 +1887,13 @@ qla24xx_nvme_iocb_entry(scsi_qla_host_t *vha, struct req_que *req, void *tsk)
	fd->transferred_length = fd->payload_length -
	    le32_to_cpu(sts->residual_len);

	/*
	 * If transport error then Failure (HBA rejects request)
	 * otherwise transport will handle.
	 */
	if (sts->entry_status) {
		ql_log(ql_log_warn, fcport->vha, 0x5038,
		    "NVME-%s error - hdl=%x entry-status(%x).\n",
		    sp->name, sp->handle, sts->entry_status);
		ret = QLA_FUNCTION_FAILED;
	} else  {
	switch (le16_to_cpu(sts->comp_status)) {
	case CS_COMPLETE:
		ret = QLA_SUCCESS;
		break;

	case CS_ABORTED:
	case CS_RESET:
	case CS_PORT_UNAVAILABLE:
				fcport->nvme_flag |= NVME_FLAG_RESETTING;
				/* fall through */
			case CS_ABORTED:
	case CS_PORT_LOGGED_OUT:
	case CS_PORT_BUSY:
		ql_log(ql_log_warn, fcport->vha, 0x5060,
@@ -1925,7 +1904,6 @@ qla24xx_nvme_iocb_entry(scsi_qla_host_t *vha, struct req_que *req, void *tsk)
		iocb->u.nvme.rsp_pyld_len = 0;
		ret = QLA_ABORTED;
		break;

	default:
		ql_log(ql_log_warn, fcport->vha, 0x5060,
		    "NVME-%s error - hdl=%x completion status(%x) resid=%x  ox_id=%x\n",
@@ -1934,7 +1912,6 @@ qla24xx_nvme_iocb_entry(scsi_qla_host_t *vha, struct req_que *req, void *tsk)
		ret = QLA_FUNCTION_FAILED;
		break;
	}
	}
	sp->done(sp, ret);
}

@@ -2461,7 +2438,8 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt)

	/* NVME completion. */
	if (sp->type == SRB_NVME_CMD) {
		qla24xx_nvme_iocb_entry(vha, req, pkt);
		req->outstanding_cmds[handle] = NULL;
		qla24xx_nvme_iocb_entry(vha, req, pkt, sp);
		return;
	}

+1 −1
Original line number Diff line number Diff line
@@ -280,7 +280,7 @@ static void qla_nvme_poll(struct nvme_fc_local_port *lport, void *hw_queue_handl
	spin_unlock_irqrestore(&qpair->qp_lock, flags);
}

static int qla2x00_start_nvme_mq(srb_t *sp)
static inline int qla2x00_start_nvme_mq(srb_t *sp)
{
	unsigned long   flags;
	uint32_t        *clr_ptr;