Beispiel #1
0
static void
nvme_io_qpair_print_command(struct nvme_qpair *qpair,
			    struct nvme_command *cmd)
{

	switch ((int)cmd->opc) {
	case NVME_OPC_WRITE:
	case NVME_OPC_READ:
	case NVME_OPC_WRITE_UNCORRECTABLE:
	case NVME_OPC_COMPARE:
		nvme_printf(qpair->ctrlr, "%s sqid:%d cid:%d nsid:%d "
			    "lba:%llu len:%d\n",
			    nvme_get_string(io_opcode, cmd->opc), qpair->id, cmd->cid,
			    cmd->nsid,
			    ((unsigned long long)cmd->cdw11 << 32) + cmd->cdw10,
			    (cmd->cdw12 & 0xFFFF) + 1);
		break;
	case NVME_OPC_FLUSH:
	case NVME_OPC_DATASET_MANAGEMENT:
		nvme_printf(qpair->ctrlr, "%s sqid:%d cid:%d nsid:%d\n",
			    nvme_get_string(io_opcode, cmd->opc), qpair->id, cmd->cid,
			    cmd->nsid);
		break;
	default:
		nvme_printf(qpair->ctrlr, "%s (%02x) sqid:%d cid:%d nsid:%d\n",
			    nvme_get_string(io_opcode, cmd->opc), cmd->opc, qpair->id,
			    cmd->cid, cmd->nsid);
		break;
	}
}
Beispiel #2
0
struct nvme_controller *
nvme_attach(void *devhandle)
{
	struct nvme_controller	*ctrlr;
	int			status;
	uint64_t		phys_addr = 0;

	ctrlr = nvme_malloc("nvme_ctrlr", sizeof(struct nvme_controller),
			    64, &phys_addr);
	if (ctrlr == NULL) {
		nvme_printf(NULL, "could not allocate ctrlr\n");
		return NULL;
	}

	status = nvme_ctrlr_construct(ctrlr, devhandle);
	if (status != 0) {
		nvme_free(ctrlr);
		return NULL;
	}

	if (nvme_ctrlr_start(ctrlr) != 0) {
		nvme_ctrlr_destruct(ctrlr);
		nvme_free(ctrlr);
		return NULL;
	}

	return ctrlr;
}
Beispiel #3
0
int
nvme_register_io_thread(void)
{
	int rc = 0;

	if (nvme_thread_ioq_index >= 0) {
		nvme_printf(NULL, "thread already registered\n");
		return -1;
	}

	rc = nvme_allocate_ioq_index();
	if (rc) {
		nvme_printf(NULL, "ioq_index_pool alloc failed\n");
		return rc;
	}
	return (nvme_thread_ioq_index >= 0) ? 0 : -1;
}
Beispiel #4
0
static void
nvme_qpair_print_completion(struct nvme_qpair *qpair,
			    struct nvme_completion *cpl)
{
	nvme_printf(qpair->ctrlr, "%s (%02x/%02x) sqid:%d cid:%d cdw0:%x sqhd:%04x p:%x m:%x dnr:%x\n",
		    get_status_string(cpl->status.sct, cpl->status.sc),
		    cpl->status.sct, cpl->status.sc, cpl->sqid, cpl->cid, cpl->cdw0,
		    cpl->sqhd, cpl->status.p, cpl->status.m, cpl->status.dnr);
}
Beispiel #5
0
static void
nvme_admin_qpair_print_command(struct nvme_qpair *qpair,
			       struct nvme_command *cmd)
{

	nvme_printf(qpair->ctrlr, "%s (%02x) sqid:%d cid:%d nsid:%x "
		    "cdw10:%08x cdw11:%08x\n",
		    nvme_get_string(admin_opcode, cmd->opc), cmd->opc, qpair->id, cmd->cid,
		    cmd->nsid, cmd->cdw10, cmd->cdw11);
}
Beispiel #6
0
void
nvme_ctrlr_cmd_set_interrupt_coalescing(struct nvme_controller *ctrlr,
    uint32_t microseconds, uint32_t threshold, nvme_cb_fn_t cb_fn, void *cb_arg)
{
	uint32_t cdw11;

	if ((microseconds/100) >= 0x100) {
		nvme_printf(ctrlr, "invalid coal time %d, disabling\n",
		    microseconds);
		microseconds = 0;
		threshold = 0;
	}

	if (threshold >= 0x100) {
		nvme_printf(ctrlr, "invalid threshold %d, disabling\n",
		    threshold);
		threshold = 0;
		microseconds = 0;
	}

	cdw11 = ((microseconds/100) << 8) | threshold;
	nvme_ctrlr_cmd_set_feature(ctrlr, NVME_FEAT_INTERRUPT_COALESCING, cdw11,
	    NULL, 0, cb_fn, cb_arg);
}