View | Details | Raw Unified | Return to bug 218830 | Differences between
and this patch

Collapse All | Expand All

(-)b/sys/cam/cam_ccb.h (-2 / +20 lines)
Lines 206-212 typedef enum { Link Here
206
				/* Serial Management Protocol */
206
				/* Serial Management Protocol */
207
207
208
	XPT_NVME_IO		= 0x1c | XPT_FC_DEV_QUEUED,
208
	XPT_NVME_IO		= 0x1c | XPT_FC_DEV_QUEUED,
209
				/* Execiute the requestred NVMe I/O operation */
209
				/* Execute the requested NVMe I/O operation */
210
210
211
	XPT_MMCSD_IO		= 0x1d | XPT_FC_DEV_QUEUED,
211
	XPT_MMCSD_IO		= 0x1d | XPT_FC_DEV_QUEUED,
212
				/* Placeholder for MMC / SD / SDIO I/O stuff */
212
				/* Placeholder for MMC / SD / SDIO I/O stuff */
Lines 215-220 typedef enum { Link Here
215
				       | XPT_FC_XPT_ONLY,
215
				       | XPT_FC_XPT_ONLY,
216
				/* Scan Target */
216
				/* Scan Target */
217
217
218
	XPT_NVME_ADMIN		= 0x1f | XPT_FC_DEV_QUEUED,
219
				/* Execute the requested NVMe Admin operation */
220
218
/* HBA engine commands 0x20->0x2F */
221
/* HBA engine commands 0x20->0x2F */
219
	XPT_ENG_INQ		= 0x20 | XPT_FC_XPT_ONLY,
222
	XPT_ENG_INQ		= 0x20 | XPT_FC_XPT_ONLY,
220
				/* HBA engine feature inquiry */
223
				/* HBA engine feature inquiry */
Lines 805-811 struct ccb_relsim { Link Here
805
};
808
};
806
809
807
/*
810
/*
808
 * NVMe I/O Request CCB used for the XPT_NVME_IO function code.
811
 * NVMe I/O Request CCB used for the XPT_NVME_IO and XPT_NVME_ADMIN function codes.
809
 */
812
 */
810
struct ccb_nvmeio {
813
struct ccb_nvmeio {
811
	struct	   ccb_hdr ccb_h;
814
	struct	   ccb_hdr ccb_h;
Lines 1443-1448 cam_fill_nvmeio(struct ccb_nvmeio *nvmeio, u_int32_t retries, Link Here
1443
	nvmeio->data_ptr = data_ptr;
1446
	nvmeio->data_ptr = data_ptr;
1444
	nvmeio->dxfer_len = dxfer_len;
1447
	nvmeio->dxfer_len = dxfer_len;
1445
}
1448
}
1449
1450
static __inline void
1451
cam_fill_nvmeadmin(struct ccb_nvmeio *nvmeio, u_int32_t retries,
1452
	      void (*cbfcnp)(struct cam_periph *, union ccb *),
1453
	      u_int32_t flags, u_int8_t *data_ptr, u_int32_t dxfer_len,
1454
	      u_int32_t timeout)
1455
{
1456
	nvmeio->ccb_h.func_code = XPT_NVME_ADMIN;
1457
	nvmeio->ccb_h.flags = flags;
1458
	nvmeio->ccb_h.retry_count = retries;
1459
	nvmeio->ccb_h.cbfcnp = cbfcnp;
1460
	nvmeio->ccb_h.timeout = timeout;
1461
	nvmeio->data_ptr = data_ptr;
1462
	nvmeio->dxfer_len = dxfer_len;
1463
}
1446
__END_DECLS
1464
__END_DECLS
1447
1465
1448
#endif /* _CAM_CAM_CCB_H */
1466
#endif /* _CAM_CAM_CCB_H */
(-)b/sys/cam/cam_periph.c (+16 lines)
Lines 826-831 cam_periph_mapmem(union ccb *ccb, struct cam_periph_map_info *mapinfo, Link Here
826
		dirs[1] = CAM_DIR_IN;
826
		dirs[1] = CAM_DIR_IN;
827
		numbufs = 2;
827
		numbufs = 2;
828
		break;
828
		break;
829
	case XPT_NVME_IO:
830
	case XPT_NVME_ADMIN:
831
		if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_NONE)
832
			return (0);
833
		if ((ccb->ccb_h.flags & CAM_DATA_MASK) != CAM_DATA_VADDR)
834
			return (EINVAL);
835
		data_ptrs[0] = &ccb->nvmeio.data_ptr;
836
		lengths[0] = ccb->nvmeio.dxfer_len;
837
		dirs[0] = ccb->ccb_h.flags & CAM_DIR_MASK;
838
		numbufs = 1;
839
		break;
829
	case XPT_DEV_ADVINFO:
840
	case XPT_DEV_ADVINFO:
830
		if (ccb->cdai.bufsiz == 0)
841
		if (ccb->cdai.bufsiz == 0)
831
			return (0);
842
			return (0);
Lines 992-997 cam_periph_unmapmem(union ccb *ccb, struct cam_periph_map_info *mapinfo) Link Here
992
		numbufs = min(mapinfo->num_bufs_used, 1);
1003
		numbufs = min(mapinfo->num_bufs_used, 1);
993
		data_ptrs[0] = (uint8_t **)&ccb->cdai.buf;
1004
		data_ptrs[0] = (uint8_t **)&ccb->cdai.buf;
994
		break;
1005
		break;
1006
	case XPT_NVME_IO:
1007
	case XPT_NVME_ADMIN:
1008
		data_ptrs[0] = &ccb->nvmeio.data_ptr;
1009
		numbufs = min(mapinfo->num_bufs_used, 1);
1010
		break;
995
	default:
1011
	default:
996
		/* allow ourselves to be swapped once again */
1012
		/* allow ourselves to be swapped once again */
997
		PRELE(curproc);
1013
		PRELE(curproc);
(-)b/sys/cam/cam_xpt.c (-2 / +3 lines)
Lines 2687-2694 xpt_action_default(union ccb *start_ccb) Link Here
2687
			start_ccb->ataio.resid = 0;
2687
			start_ccb->ataio.resid = 0;
2688
		/* FALLTHROUGH */
2688
		/* FALLTHROUGH */
2689
	case XPT_NVME_IO:
2689
	case XPT_NVME_IO:
2690
		if (start_ccb->ccb_h.func_code == XPT_NVME_IO)
2690
		/* FALLTHROUGH */
2691
			start_ccb->nvmeio.resid = 0;
2691
	case XPT_NVME_ADMIN:
2692
		/* FALLTHROUGH */
2692
		/* FALLTHROUGH */
2693
	case XPT_RESET_DEV:
2693
	case XPT_RESET_DEV:
2694
	case XPT_ENG_EXEC:
2694
	case XPT_ENG_EXEC:
Lines 5543-5548 static struct kv map[] = { Link Here
5543
	{ XPT_MMCSD_IO, "XPT_MMCSD_IO" },
5543
	{ XPT_MMCSD_IO, "XPT_MMCSD_IO" },
5544
	{ XPT_SMP_IO, "XPT_SMP_IO" },
5544
	{ XPT_SMP_IO, "XPT_SMP_IO" },
5545
	{ XPT_SCAN_TGT, "XPT_SCAN_TGT" },
5545
	{ XPT_SCAN_TGT, "XPT_SCAN_TGT" },
5546
	{ XPT_NVME_ADMIN, "XPT_NVME_ADMIN" },
5546
	{ XPT_ENG_INQ, "XPT_ENG_INQ" },
5547
	{ XPT_ENG_INQ, "XPT_ENG_INQ" },
5547
	{ XPT_ENG_EXEC, "XPT_ENG_EXEC" },
5548
	{ XPT_ENG_EXEC, "XPT_ENG_EXEC" },
5548
	{ XPT_EN_LUN, "XPT_EN_LUN" },
5549
	{ XPT_EN_LUN, "XPT_EN_LUN" },
(-)b/sys/cam/scsi/scsi_pass.c (-1 / +27 lines)
Lines 1146-1151 passiocleanup(struct pass_softc *softc, struct pass_io_req *io_req) Link Here
1146
		numbufs = min(io_req->num_bufs, 1);
1146
		numbufs = min(io_req->num_bufs, 1);
1147
		data_ptrs[0] = (uint8_t **)&ccb->cdai.buf;
1147
		data_ptrs[0] = (uint8_t **)&ccb->cdai.buf;
1148
		break;
1148
		break;
1149
	case XPT_NVME_IO:
1150
	case XPT_NVME_ADMIN:
1151
		data_ptrs[0] = &ccb->nvmeio.data_ptr;
1152
		numbufs = min(io_req->num_bufs, 1);
1153
		break;
1149
	default:
1154
	default:
1150
		/* allow ourselves to be swapped once again */
1155
		/* allow ourselves to be swapped once again */
1151
		return;
1156
		return;
Lines 1384-1389 passmemsetup(struct cam_periph *periph, struct pass_io_req *io_req) Link Here
1384
		dirs[0] = CAM_DIR_IN;
1389
		dirs[0] = CAM_DIR_IN;
1385
		numbufs = 1;
1390
		numbufs = 1;
1386
		break;
1391
		break;
1392
	case XPT_NVME_ADMIN:
1393
	case XPT_NVME_IO:
1394
		if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_NONE)
1395
			return (0);
1396
1397
		io_req->data_flags = ccb->ccb_h.flags & CAM_DATA_MASK;
1398
1399
		/*
1400
		 * We only support a single virtual address for NVMe
1401
		 */
1402
		if ((ccb->ccb_h.flags & CAM_DATA_MASK) != CAM_DATA_VADDR)
1403
			return (EINVAL);
1404
1405
		data_ptrs[0] = &ccb->nvmeio.data_ptr;
1406
		lengths[0] = ccb->nvmeio.dxfer_len;
1407
		dirs[0] = ccb->ccb_h.flags & CAM_DIR_MASK;
1408
		numbufs = 1;
1409
		maxmap = softc->maxio;
1410
		break;
1387
	default:
1411
	default:
1388
		return(EINVAL);
1412
		return(EINVAL);
1389
		break; /* NOTREACHED */
1413
		break; /* NOTREACHED */
Lines 1957-1963 passdoioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag, struct thread Link Here
1957
		 */
1981
		 */
1958
		if ((fc == XPT_SCSI_IO) || (fc == XPT_ATA_IO)
1982
		if ((fc == XPT_SCSI_IO) || (fc == XPT_ATA_IO)
1959
		 || (fc == XPT_SMP_IO) || (fc == XPT_DEV_MATCH)
1983
		 || (fc == XPT_SMP_IO) || (fc == XPT_DEV_MATCH)
1960
		 || (fc == XPT_DEV_ADVINFO)) {
1984
		 || (fc == XPT_DEV_ADVINFO)
1985
		 || (fc == XPT_NVME_ADMIN) || (fc == XPT_NVME_IO)) {
1961
			error = passmemsetup(periph, io_req);
1986
			error = passmemsetup(periph, io_req);
1962
			if (error != 0)
1987
			if (error != 0)
1963
				goto camioqueue_error;
1988
				goto camioqueue_error;
Lines 2202-2207 passsendccb(struct cam_periph *periph, union ccb *ccb, union ccb *inccb) Link Here
2202
	 */
2227
	 */
2203
	fc = ccb->ccb_h.func_code;
2228
	fc = ccb->ccb_h.func_code;
2204
	if ((fc == XPT_SCSI_IO) || (fc == XPT_ATA_IO) || (fc == XPT_SMP_IO)
2229
	if ((fc == XPT_SCSI_IO) || (fc == XPT_ATA_IO) || (fc == XPT_SMP_IO)
2230
	 || (fc == XPT_NVME_IO) || (fc == XPT_NVME_ADMIN)
2205
	 || (fc == XPT_DEV_MATCH) || (fc == XPT_DEV_ADVINFO)) {
2231
	 || (fc == XPT_DEV_MATCH) || (fc == XPT_DEV_ADVINFO)) {
2206
		bzero(&mapinfo, sizeof(mapinfo));
2232
		bzero(&mapinfo, sizeof(mapinfo));
2207
2233
(-)b/sys/dev/nvme/nvme_sim.c (-1 / +5 lines)
Lines 110-116 nvme_sim_nvmeio(struct cam_sim *sim, union ccb *ccb) Link Here
110
110
111
	memcpy(&req->cmd, &ccb->nvmeio.cmd, sizeof(ccb->nvmeio.cmd));
111
	memcpy(&req->cmd, &ccb->nvmeio.cmd, sizeof(ccb->nvmeio.cmd));
112
112
113
	nvme_ctrlr_submit_io_request(ctrlr, req);
113
	if (ccb->ccb_h.func_code == XPT_NVME_IO)
114
		nvme_ctrlr_submit_io_request(ctrlr, req);
115
	else
116
		nvme_ctrlr_submit_admin_request(ctrlr, req);
114
117
115
	ccb->ccb_h.status |= CAM_SIM_QUEUED;
118
	ccb->ccb_h.status |= CAM_SIM_QUEUED;
116
}
119
}
Lines 225-230 nvme_sim_action(struct cam_sim *sim, union ccb *ccb) Link Here
225
		ccb->ccb_h.status = CAM_REQ_CMP;
228
		ccb->ccb_h.status = CAM_REQ_CMP;
226
		break;
229
		break;
227
	case XPT_NVME_IO:		/* Execute the requested I/O operation */
230
	case XPT_NVME_IO:		/* Execute the requested I/O operation */
231
	case XPT_NVME_ADMIN:		/* or Admin operation */
228
		nvme_sim_nvmeio(sim, ccb);
232
		nvme_sim_nvmeio(sim, ccb);
229
		return;			/* no done */
233
		return;			/* no done */
230
	default:
234
	default:
(-)b/sys/kern/subr_bus_dma.c (-1 / +10 lines)
Lines 218-223 _bus_dmamap_load_ccb(bus_dma_tag_t dmat, bus_dmamap_t map, union ccb *ccb, Link Here
218
		sglist_cnt = 0;
218
		sglist_cnt = 0;
219
		break;
219
		break;
220
	}
220
	}
221
	case XPT_NVME_IO:
222
	case XPT_NVME_ADMIN: {
223
		struct ccb_nvmeio *nvmeio;
224
225
		nvmeio = &ccb->nvmeio;
226
		data_ptr = nvmeio->data_ptr;
227
		dxfer_len = nvmeio->dxfer_len;
228
		sglist_cnt = 0;
229
		break;
230
	}
221
	default:
231
	default:
222
		panic("_bus_dmamap_load_ccb: Unsupported func code %d",
232
		panic("_bus_dmamap_load_ccb: Unsupported func code %d",
223
		    ccb_h->func_code);
233
		    ccb_h->func_code);
224
- 

Return to bug 218830