FreeBSD Bugzilla – Attachment 182021 Details for
Bug 218830
[cam] [patch] add CAM pass(4) support for NVMe
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
patch to add NVMe support to pass
cam-pass-nvme-v2.patch (text/plain), 4.46 KB, created by
chuck
on 2017-04-23 17:16:44 UTC
(
hide
)
Description:
patch to add NVMe support to pass
Filename:
MIME Type:
Creator:
chuck
Created:
2017-04-23 17:16:44 UTC
Size:
4.46 KB
patch
obsolete
>diff --git a/sys/cam/cam_ccb.h b/sys/cam/cam_ccb.h >index 4cfe2e4fa34..7e1d28404db 100644 >--- a/sys/cam/cam_ccb.h >+++ b/sys/cam/cam_ccb.h >@@ -206,7 +206,7 @@ typedef enum { > /* Serial Management Protocol */ > > XPT_NVME_IO = 0x1c | XPT_FC_DEV_QUEUED, >- /* Execiute the requestred NVMe I/O operation */ >+ /* Execute the requested NVMe I/O operation */ > > XPT_MMCSD_IO = 0x1d | XPT_FC_DEV_QUEUED, > /* Placeholder for MMC / SD / SDIO I/O stuff */ >@@ -215,6 +215,9 @@ typedef enum { > | XPT_FC_XPT_ONLY, > /* Scan Target */ > >+ XPT_NVME_ADMIN = 0x1f | XPT_FC_DEV_QUEUED, >+ /* Execute the requested NVMe Admin operation */ >+ > /* HBA engine commands 0x20->0x2F */ > XPT_ENG_INQ = 0x20 | XPT_FC_XPT_ONLY, > /* HBA engine feature inquiry */ >@@ -805,7 +808,7 @@ struct ccb_relsim { > }; > > /* >- * NVMe I/O Request CCB used for the XPT_NVME_IO function code. >+ * NVMe I/O Request CCB used for the XPT_NVME_IO and XPT_NVME_ADMIN function codes. > */ > struct ccb_nvmeio { > struct ccb_hdr ccb_h; >@@ -1443,6 +1446,21 @@ cam_fill_nvmeio(struct ccb_nvmeio *nvmeio, u_int32_t retries, > nvmeio->data_ptr = data_ptr; > nvmeio->dxfer_len = dxfer_len; > } >+ >+static __inline void >+cam_fill_nvmeadmin(struct ccb_nvmeio *nvmeio, u_int32_t retries, >+ void (*cbfcnp)(struct cam_periph *, union ccb *), >+ u_int32_t flags, u_int8_t *data_ptr, u_int32_t dxfer_len, >+ u_int32_t timeout) >+{ >+ nvmeio->ccb_h.func_code = XPT_NVME_ADMIN; >+ nvmeio->ccb_h.flags = flags; >+ nvmeio->ccb_h.retry_count = retries; >+ nvmeio->ccb_h.cbfcnp = cbfcnp; >+ nvmeio->ccb_h.timeout = timeout; >+ nvmeio->data_ptr = data_ptr; >+ nvmeio->dxfer_len = dxfer_len; >+} > __END_DECLS > > #endif /* _CAM_CAM_CCB_H */ >diff --git a/sys/cam/cam_periph.c b/sys/cam/cam_periph.c >index b3cbf59e334..48ceedd83cb 100644 >--- a/sys/cam/cam_periph.c >+++ b/sys/cam/cam_periph.c >@@ -819,6 +819,17 @@ cam_periph_mapmem(union ccb *ccb, struct cam_periph_map_info *mapinfo, > dirs[1] = CAM_DIR_IN; > numbufs = 2; > break; >+ case XPT_NVME_IO: >+ case XPT_NVME_ADMIN: >+ if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_NONE) >+ return (0); >+ if ((ccb->ccb_h.flags & CAM_DATA_MASK) != CAM_DATA_VADDR) >+ return (EINVAL); >+ data_ptrs[0] = &ccb->nvmeio.data_ptr; >+ lengths[0] = ccb->nvmeio.dxfer_len; >+ dirs[0] = ccb->ccb_h.flags & CAM_DIR_MASK; >+ numbufs = 1; >+ break; > case XPT_DEV_ADVINFO: > if (ccb->cdai.bufsiz == 0) > return (0); >diff --git a/sys/cam/cam_xpt.c b/sys/cam/cam_xpt.c >index 6be86ce65b8..7e594760206 100644 >--- a/sys/cam/cam_xpt.c >+++ b/sys/cam/cam_xpt.c >@@ -2575,6 +2575,10 @@ xpt_action_default(union ccb *start_ccb) > if (start_ccb->ccb_h.func_code == XPT_NVME_IO) > start_ccb->nvmeio.resid = 0; > /* FALLTHROUGH */ >+ case XPT_NVME_ADMIN: >+ if (start_ccb->ccb_h.func_code == XPT_NVME_ADMIN) >+ start_ccb->nvmeio.resid = 0; >+ /* FALLTHROUGH */ > case XPT_RESET_DEV: > case XPT_ENG_EXEC: > case XPT_SMP_IO: >@@ -5428,6 +5432,7 @@ static struct kv map[] = { > { XPT_MMCSD_IO, "XPT_MMCSD_IO" }, > { XPT_SMP_IO, "XPT_SMP_IO" }, > { XPT_SCAN_TGT, "XPT_SCAN_TGT" }, >+ { XPT_NVME_ADMIN, "XPT_NVME_ADMIN" }, > { XPT_ENG_INQ, "XPT_ENG_INQ" }, > { XPT_ENG_EXEC, "XPT_ENG_EXEC" }, > { XPT_EN_LUN, "XPT_EN_LUN" }, >diff --git a/sys/cam/scsi/scsi_pass.c b/sys/cam/scsi/scsi_pass.c >index aa13a01d115..e171d39405f 100644 >--- a/sys/cam/scsi/scsi_pass.c >+++ b/sys/cam/scsi/scsi_pass.c >@@ -2202,6 +2202,7 @@ passsendccb(struct cam_periph *periph, union ccb *ccb, union ccb *inccb) > */ > fc = ccb->ccb_h.func_code; > if ((fc == XPT_SCSI_IO) || (fc == XPT_ATA_IO) || (fc == XPT_SMP_IO) >+ || (fc == XPT_NVME_IO) || (fc == XPT_NVME_ADMIN) > || (fc == XPT_DEV_MATCH) || (fc == XPT_DEV_ADVINFO)) { > bzero(&mapinfo, sizeof(mapinfo)); > >diff --git a/sys/dev/nvme/nvme_sim.c b/sys/dev/nvme/nvme_sim.c >index 86b7710d8b5..08ced0a2473 100644 >--- a/sys/dev/nvme/nvme_sim.c >+++ b/sys/dev/nvme/nvme_sim.c >@@ -110,7 +110,10 @@ nvme_sim_nvmeio(struct cam_sim *sim, union ccb *ccb) > > memcpy(&req->cmd, &ccb->nvmeio.cmd, sizeof(ccb->nvmeio.cmd)); > >- nvme_ctrlr_submit_io_request(ctrlr, req); >+ if (ccb->ccb_h.func_code == XPT_NVME_IO) >+ nvme_ctrlr_submit_io_request(ctrlr, req); >+ else >+ nvme_ctrlr_submit_admin_request(ctrlr, req); > > ccb->ccb_h.status |= CAM_SIM_QUEUED; > } >@@ -225,6 +228,7 @@ nvme_sim_action(struct cam_sim *sim, union ccb *ccb) > ccb->ccb_h.status = CAM_REQ_CMP; > break; > case XPT_NVME_IO: /* Execute the requested I/O operation */ >+ case XPT_NVME_ADMIN: /* or Admin operation */ > nvme_sim_nvmeio(sim, ccb); > return; /* no done */ > default:
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 218830
:
182021
|
183788