diff options
| -rw-r--r-- | sys/cam/nvme/nvme_all.c | 201 | ||||
| -rw-r--r-- | sys/cam/nvme/nvme_all.h | 41 |
2 files changed, 242 insertions, 0 deletions
diff --git a/sys/cam/nvme/nvme_all.c b/sys/cam/nvme/nvme_all.c index 2ab8ae5340c6..a239498901d1 100644 --- a/sys/cam/nvme/nvme_all.c +++ b/sys/cam/nvme/nvme_all.c @@ -50,6 +50,7 @@ #include <cam/cam_queue.h> #include <cam/cam_xpt.h> #include <cam/nvme/nvme_all.h> +#include <dev/nvme/nvme.h> #include <sys/sbuf.h> #include <sys/endian.h> @@ -160,6 +161,206 @@ nvme_command_sbuf(struct ccb_nvmeio *nvmeio, struct sbuf *sb) return(0); } +void +nvme_resv_report(struct ccb_nvmeio *nvmeio, uint32_t retries, + void (*cbfcnp)(struct cam_periph *, union ccb *), + uint32_t nsid, uint32_t report_type, uint8_t *data_ptr, + uint32_t dxfer_len, uint32_t timeout) +{ + cam_fill_nvmeio(/*nvmeio*/ nvmeio, + /*retries*/ retries, + /*cbfcnp*/ cbfcnp, + /*flags*/ CAM_DIR_IN, + /*data_ptr*/ data_ptr, + /*dxfer_len*/ dxfer_len, + /*timeout*/ timeout); + + nvme_ns_resv_report_cmd(/*cmd*/ &nvmeio->cmd, + /*nsid*/ nsid, + /*length*/ dxfer_len, + /*report_type*/ report_type); +} + +void +nvme_resv_register(struct ccb_nvmeio *nvmeio, uint32_t retries, + void (*cbfcnp)(struct cam_periph *, union ccb *), + uint32_t nsid, int cptpl, int iekey, int rrega, + uint8_t *data_ptr, uint32_t dxfer_len, uint32_t timeout) +{ + cam_fill_nvmeio(/*nvmeio*/ nvmeio, + /*retries*/ retries, + /*cbfcnp*/ cbfcnp, + /*flags*/ CAM_DIR_OUT, + /*data_ptr*/ data_ptr, + /*dxfer_len*/ dxfer_len, + /*timeout*/ timeout); + + nvme_ns_resv_register_cmd(/*cmd*/ &nvmeio->cmd, + /*nsid*/ nsid, + /*cptpl*/ cptpl, + /*iekey*/ iekey, + /*rrega*/ rrega); +} + +void +nvme_resv_acquire(struct ccb_nvmeio *nvmeio, uint32_t retries, + void (*cbfcnp)(struct cam_periph *, union ccb *), + uint32_t nsid, int rtype, int iekey, int racqa, + uint8_t *data_ptr, uint32_t dxfer_len, uint32_t timeout) +{ + cam_fill_nvmeio(/*nvmeio*/ nvmeio, + /*retries*/ retries, + /*cbfcnp*/ cbfcnp, + /*flags*/ CAM_DIR_OUT, + /*data_ptr*/ data_ptr, + /*dxfer_len*/ dxfer_len, + /*timeout*/ timeout); + + nvme_ns_resv_acquire_cmd(/*cmd*/ &nvmeio->cmd, + /*nsid*/ nsid, + /*rtype*/ rtype, + /*iekey*/ iekey, + /*racqa*/ racqa); +} + +void +nvme_resv_release(struct ccb_nvmeio *nvmeio, uint32_t retries, + void (*cbfcnp)(struct cam_periph *, union ccb *), + uint32_t nsid, int rtype, int iekey, int rrela, + uint8_t *data_ptr, uint32_t dxfer_len, uint32_t timeout) +{ + cam_fill_nvmeio(/*nvmeio*/ nvmeio, + /*retries*/ retries, + /*cbfcnp*/ cbfcnp, + /*flags*/ CAM_DIR_OUT, + /*data_ptr*/ data_ptr, + /*dxfer_len*/ dxfer_len, + /*timeout*/ timeout); + + nvme_ns_resv_release_cmd(/*cmd*/ &nvmeio->cmd, + /*nsid*/ nsid, + /*rtype*/ rtype, + /*iekey*/ iekey, + /*rrela*/ rrela); +} + +void +nvme_format(struct ccb_nvmeio *nvmeio, uint32_t retries, + void (*cbfcnp)(struct cam_periph *, union ccb *), + uint32_t nsid, int ses, int pil, int pi, int mset, int lbaf, + uint32_t timeout) +{ + cam_fill_nvmeadmin(/*nvmeio*/ nvmeio, + /*retries*/ retries, + /*cbfcnp*/ cbfcnp, + /*flags*/ CAM_DIR_NONE, + /*data_ptr*/ NULL, + /*dxfer_len*/ 0, + /*timeout*/ timeout); + + nvme_admin_format_cmd(/*cmd*/ &nvmeio->cmd, + /*nsid*/ nsid, + /*ses*/ ses, + /*pil*/ pil, + /*pi*/ pi, + /*mset*/ mset, + /*lbaf*/ lbaf); +} + +void +nvme_get_feature(struct ccb_nvmeio *nvmeio, uint32_t retries, + void (*cbfcnp)(struct cam_periph *, union ccb *), + uint32_t nsid, int sel, uint8_t feature, uint32_t cdw11, + int uuid_idx, uint8_t *data_ptr, uint32_t dxfer_len, + uint32_t timeout) +{ + cam_fill_nvmeadmin(/*nvmeio*/ nvmeio, + /*retries*/ retries, + /*cbfcnp*/ cbfcnp, + /*flags*/ CAM_DIR_IN, + /*data_ptr*/ data_ptr, + /*dxfer_len*/ dxfer_len, + /*timeout*/ timeout); + + nvme_admin_get_feature_cmd(/*cmd*/ &nvmeio->cmd, + /*nsid*/ nsid, + /*sel*/ sel, + /*feature*/ feature, + /*cdw11*/ cdw11, + /*uuid_idx*/ uuid_idx); +} + +void +nvme_set_feature(struct ccb_nvmeio *nvmeio, uint32_t retries, + void (*cbfcnp)(struct cam_periph *, union ccb *), + uint32_t nsid, int sv, uint8_t feature, uint32_t cdw11, + uint32_t cdw12, uint32_t cdw13, uint32_t cdw14, uint32_t cdw15, + uint8_t *data_ptr, uint32_t dxfer_len, uint32_t timeout) +{ + cam_fill_nvmeadmin(/*nvmeio*/ nvmeio, + /*retries*/ retries, + /*cbfcnp*/ cbfcnp, + /*flags*/ CAM_DIR_OUT, + /*data_ptr*/ data_ptr, + /*dxfer_len*/ dxfer_len, + /*timeout*/ timeout); + + nvme_admin_set_feature_cmd(/*cmd*/ &nvmeio->cmd, + /*nsid*/ nsid, + /*sv*/ sv, + /*feature*/ feature, + /*cdw11*/ cdw11, + /*cdw12*/ cdw12, + /*cdw13*/ cdw13, + /*cdw14*/ cdw14, + /*cdw15*/ cdw15); +} + +void +nvme_get_feature_hostid(struct ccb_nvmeio *nvmeio, uint32_t retries, + void (*cbfcnp)(struct cam_periph *, union ccb *), + int sel, int uuid_idx, uint8_t *data_ptr, + uint32_t dxfer_len, uint32_t timeout) +{ + nvme_get_feature(/*nvmeio*/ nvmeio, + /*retries*/ retries, + /*cbfcnp*/ cbfcnp, + /*nsid*/ 0, + /*sel*/ sel, + /*feature*/ NVME_FEAT_HOST_IDENTIFIER, + /*cdw11*/ 0, + /*uuid_idx*/ uuid_idx, + /*data_ptr*/ data_ptr, + /*dxfer_len*/ dxfer_len, + /*timeout*/ timeout); +} + +void +nvme_set_feature_hostid(struct ccb_nvmeio *nvmeio, uint32_t retries, + void (*cbfcnp)(struct cam_periph *, union ccb *), + int sv, int exhid, uint8_t *data_ptr, + uint32_t dxfer_len, uint32_t timeout) +{ + uint32_t cdw11 = 0; + if (exhid) + cdw11 = 0x01; + + nvme_set_feature(/*nvmeio*/ nvmeio, + /*retries*/ retries, + /*cbfcnp*/ cbfcnp, + /*nsid*/ 0, + /*sv*/ sv, + /*feature*/ NVME_FEAT_HOST_IDENTIFIER, + /*cdw11*/ cdw11, + /*cdw12*/ 0, + /*cdw13*/ 0, + /*cdw14*/ 0, + /*cdw15*/ 0, + /*data_ptr*/ data_ptr, + /*dxfer_len*/ dxfer_len, + /*timeout*/ timeout); +} + /* * nvme_status_sbuf() returns 0 for success and -1 for failure. */ diff --git a/sys/cam/nvme/nvme_all.h b/sys/cam/nvme/nvme_all.h index 2bc1953e79be..fede596d4b74 100644 --- a/sys/cam/nvme/nvme_all.h +++ b/sys/cam/nvme/nvme_all.h @@ -32,6 +32,7 @@ struct ccb_nvmeio; +__BEGIN_DECLS void nvme_ns_cmd(struct ccb_nvmeio *nvmeio, uint8_t cmd, uint32_t nsid, uint32_t cdw10, uint32_t cdw11, uint32_t cdw12, uint32_t cdw13, uint32_t cdw14, uint32_t cdw15); @@ -44,9 +45,49 @@ void nvme_print_ident_short(const struct nvme_controller_data *, const struct nvme_namespace_data *, struct sbuf *); void nvme_cmd_sbuf(const struct nvme_command *, struct sbuf *sb); int nvme_command_sbuf(struct ccb_nvmeio *nvmeio, struct sbuf *sb); +void nvme_resv_report(struct ccb_nvmeio *nvmeio, uint32_t retries, + void (*cbfcnp)(struct cam_periph *, union ccb *), + uint32_t nsid, uint32_t report_type, uint8_t *data_ptr, + uint32_t dxfer_len, uint32_t timeout); +void nvme_resv_register(struct ccb_nvmeio *nvmeio, uint32_t retries, + void (*cbfcnp)(struct cam_periph *, union ccb *), + uint32_t nsid, int cptpl, int iekey, int rrega, + uint8_t *data_ptr, uint32_t dxfer_len,uint32_t timeout); +void nvme_resv_acquire(struct ccb_nvmeio *nvmeio, uint32_t retries, + void (*cbfcnp)(struct cam_periph *, union ccb *), + uint32_t nsid, int rtype, int iekey, int racqa, + uint8_t *data_ptr, uint32_t dxfer_len, uint32_t timeout); +void nvme_resv_release(struct ccb_nvmeio *nvmeio, uint32_t retries, + void (*cbfcnp)(struct cam_periph *, union ccb *), + uint32_t nsid, int rtype, int iekey, int rrela, + uint8_t *data_ptr, uint32_t dxfer_len, uint32_t timeout); +void nvme_format(struct ccb_nvmeio *nvmeio, uint32_t retries, + void (*cbfcnp)(struct cam_periph *, union ccb *), + uint32_t nsid, int ses, int pil, int pi, int mset, int lbaf, + uint32_t timeout); +void nvme_get_feature(struct ccb_nvmeio *nvmeio, uint32_t retries, + void (*cbfcnp)(struct cam_periph *, union ccb *), + uint32_t nsid, int sel, uint8_t feature, uint32_t cdw11, + int uuid_idx, uint8_t *data_ptr, uint32_t dxfer_len, + uint32_t timeout); +void nvme_set_feature(struct ccb_nvmeio *nvmeio, uint32_t retries, + void (*cbfcnp)(struct cam_periph *, union ccb *), + uint32_t nsid, int sv, uint8_t feature, uint32_t cdw11, + uint32_t cdw12, uint32_t cdw13, uint32_t cdw14, + uint32_t cdw15, uint8_t *data_ptr, uint32_t dxfer_len, + uint32_t timeout); +void nvme_get_feature_hostid(struct ccb_nvmeio *nvmeio, uint32_t retries, + void (*cbfcnp)(struct cam_periph *, union ccb *), + int sel, int uuid_idx, uint8_t *data_ptr, + uint32_t dxfer_len, uint32_t timeout); +void nvme_set_feature_hostid(struct ccb_nvmeio *nvmeio, uint32_t retries, + void (*cbfcnp)(struct cam_periph *, union ccb *), + int sv, int exhid, uint8_t *data_ptr, + uint32_t dxfer_len, uint32_t timeout); const char *nvme_command_string(struct ccb_nvmeio *nvmeio, char *, size_t); int nvme_status_sbuf(struct ccb_nvmeio *nvmeio, struct sbuf *sb); const void *nvme_get_identify_cntrl(struct cam_periph *); const void *nvme_get_identify_ns(struct cam_periph *); +__END_DECLS #endif /* CAM_NVME_NVME_ALL_H */ |
