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

Commit b90c48d0 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Jens Axboe
Browse files

nvme: split nvme_trans_send_fw_cmd



This function handles two totally different opcodes, so split it.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarJens Axboe <axboe@fb.com>
parent e75ec752
Loading
Loading
Loading
Loading
+47 −46
Original line number Diff line number Diff line
@@ -1554,10 +1554,25 @@ static int nvme_trans_power_state(struct nvme_ns *ns, struct sg_io_hdr *hdr,
	return res;
}

/* Write Buffer Helper Functions */
/* Also using this for Format Unit with hdr passed as NULL, and buffer_id, 0 */
static int nvme_trans_send_activate_fw_cmd(struct nvme_ns *ns, struct sg_io_hdr *hdr,
					u8 buffer_id)
{
	struct nvme_command c;
	int nvme_sc;
	int res;

	memset(&c, 0, sizeof(c));
	c.common.opcode = nvme_admin_activate_fw;
	c.common.cdw10[0] = cpu_to_le32(buffer_id | NVME_FWACT_REPL_ACTV);

	nvme_sc = nvme_submit_sync_cmd(ns->queue, &c);
	res = nvme_trans_status_code(hdr, nvme_sc);
	if (res)
		return res;
	return nvme_sc;
}

static int nvme_trans_send_fw_cmd(struct nvme_ns *ns, struct sg_io_hdr *hdr,
static int nvme_trans_send_download_fw_cmd(struct nvme_ns *ns, struct sg_io_hdr *hdr,
					u8 opcode, u32 tot_len, u32 offset,
					u8 buffer_id)
{
@@ -1569,23 +1584,20 @@ static int nvme_trans_send_fw_cmd(struct nvme_ns *ns, struct sg_io_hdr *hdr,
	unsigned length;

	memset(&c, 0, sizeof(c));
	c.common.opcode = opcode;
	if (opcode == nvme_admin_download_fw) {
	c.common.opcode = nvme_admin_download_fw;

	if (hdr->iovec_count > 0) {
		/* Assuming SGL is not allowed for this command */
			res = nvme_trans_completion(hdr,
		return nvme_trans_completion(hdr,
					SAM_STAT_CHECK_CONDITION,
					ILLEGAL_REQUEST,
					SCSI_ASC_INVALID_CDB,
					SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
			goto out;
	}
	iod = nvme_map_user_pages(dev, DMA_TO_DEVICE,
			(unsigned long)hdr->dxferp, tot_len);
		if (IS_ERR(iod)) {
			res = PTR_ERR(iod);
			goto out;
		}
	if (IS_ERR(iod))
		return PTR_ERR(iod);
	length = nvme_setup_prps(dev, iod, tot_len, GFP_KERNEL);
	if (length != tot_len) {
		res = -ENOMEM;
@@ -1596,10 +1608,6 @@ static int nvme_trans_send_fw_cmd(struct nvme_ns *ns, struct sg_io_hdr *hdr,
	c.dlfw.prp2 = cpu_to_le64(iod->first_dma);
	c.dlfw.numd = cpu_to_le32((tot_len/BYTES_TO_DWORDS) - 1);
	c.dlfw.offset = cpu_to_le32(offset/BYTES_TO_DWORDS);
	} else if (opcode == nvme_admin_activate_fw) {
		u32 cdw10 = buffer_id | NVME_FWACT_REPL_ACTV;
		c.common.cdw10[0] = cpu_to_le32(cdw10);
	}

	nvme_sc = nvme_submit_sync_cmd(dev->admin_q, &c);
	res = nvme_trans_status_code(hdr, nvme_sc);
@@ -1609,11 +1617,8 @@ static int nvme_trans_send_fw_cmd(struct nvme_ns *ns, struct sg_io_hdr *hdr,
		res = nvme_sc;

 out_unmap:
	if (opcode == nvme_admin_download_fw) {
	nvme_unmap_user_pages(dev, DMA_TO_DEVICE, iod);
	nvme_free_iod(dev, iod);
	}
 out:
	return res;
}

@@ -2769,7 +2774,7 @@ static int nvme_trans_format_unit(struct nvme_ns *ns, struct sg_io_hdr *hdr,
	}

	/* Attempt to activate any previously downloaded firmware image */
	res = nvme_trans_send_fw_cmd(ns, hdr, nvme_admin_activate_fw, 0, 0, 0);
	res = nvme_trans_send_activate_fw_cmd(ns, hdr, 0);

	/* Determine Block size and count and send format command */
	res = nvme_trans_fmt_set_blk_size_count(ns, hdr);
@@ -2829,24 +2834,20 @@ static int nvme_trans_write_buffer(struct nvme_ns *ns, struct sg_io_hdr *hdr,

	switch (mode) {
	case DOWNLOAD_SAVE_ACTIVATE:
		res = nvme_trans_send_fw_cmd(ns, hdr, nvme_admin_download_fw,
		res = nvme_trans_send_download_fw_cmd(ns, hdr, nvme_admin_download_fw,
						parm_list_length, buffer_offset,
						buffer_id);
		if (res != SNTI_TRANSLATION_SUCCESS)
			goto out;
		res = nvme_trans_send_fw_cmd(ns, hdr, nvme_admin_activate_fw,
						parm_list_length, buffer_offset,
						buffer_id);
		res = nvme_trans_send_activate_fw_cmd(ns, hdr, buffer_id);
		break;
	case DOWNLOAD_SAVE_DEFER_ACTIVATE:
		res = nvme_trans_send_fw_cmd(ns, hdr, nvme_admin_download_fw,
		res = nvme_trans_send_download_fw_cmd(ns, hdr, nvme_admin_download_fw,
						parm_list_length, buffer_offset,
						buffer_id);
		break;
	case ACTIVATE_DEFERRED_MICROCODE:
		res = nvme_trans_send_fw_cmd(ns, hdr, nvme_admin_activate_fw,
						parm_list_length, buffer_offset,
						buffer_id);
		res = nvme_trans_send_activate_fw_cmd(ns, hdr, buffer_id);
		break;
	default:
		res = nvme_trans_completion(hdr, SAM_STAT_CHECK_CONDITION,