Index: sys/cam/cam_ccb.h =================================================================== --- sys/cam/cam_ccb.h +++ sys/cam/cam_ccb.h @@ -360,8 +360,6 @@ u_int8_t serial_num[252]; u_int8_t inq_flags; u_int8_t serial_num_len; - const struct nvme_controller_data *nvme_cdata; - const struct nvme_namespace_data *nvme_data; }; /* Device Statistics CCB */ @@ -1227,6 +1225,8 @@ #define CDAI_TYPE_PHYS_PATH 3 #define CDAI_TYPE_RCAPLONG 4 #define CDAI_TYPE_EXT_INQ 5 +#define CDAI_TYPE_NVME_CNTRL 6 /* NVMe Identify Controller data */ +#define CDAI_TYPE_NVME_NS 7 /* NVMe Identify Namespace data */ off_t bufsiz; /* IN: Size of external buffer */ #define CAM_SCSI_DEVID_MAXLEN 65536 /* length in buffer is an uint16_t */ off_t provsiz; /* OUT: Size required/used */ Index: sys/cam/cam_xpt.c =================================================================== --- sys/cam/cam_xpt.c +++ sys/cam/cam_xpt.c @@ -2713,8 +2713,6 @@ cgd->inq_data = dev->inq_data; cgd->ident_data = dev->ident_data; cgd->inq_flags = dev->inq_flags; - cgd->nvme_data = dev->nvme_data; - cgd->nvme_cdata = dev->nvme_cdata; cgd->ccb_h.status = CAM_REQ_CMP; cgd->serial_num_len = dev->serial_num_len; if ((dev->serial_num_len > 0) Index: sys/cam/nvme/nvme_all.h =================================================================== --- sys/cam/nvme/nvme_all.h +++ sys/cam/nvme/nvme_all.h @@ -44,5 +44,7 @@ void nvme_print_ident(const struct nvme_controller_data *, const struct nvme_namespace_data *); const char *nvme_op_string(const struct nvme_command *); const char *nvme_cmd_string(const struct nvme_command *, char *, size_t); +const void *nvme_get_identify_cntrl(struct cam_periph *); +const void *nvme_get_identify_ns(struct cam_periph *); #endif /* CAM_NVME_NVME_ALL_H */ Index: sys/cam/nvme/nvme_all.c =================================================================== --- sys/cam/nvme/nvme_all.c +++ sys/cam/nvme/nvme_all.c @@ -35,6 +35,7 @@ #include #include #include +#include #include #else #include @@ -54,6 +55,13 @@ #include #include +#ifdef _KERNEL +#include +#include +#include +#include +#endif + 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, @@ -122,3 +130,23 @@ return cmd_string; } + +const void * +nvme_get_identify_cntrl(struct cam_periph *periph) +{ + struct cam_ed *device; + + device = periph->path->device; + + return device->nvme_cdata; +} + +const void * +nvme_get_identify_ns(struct cam_periph *periph) +{ + struct cam_ed *device; + + device = periph->path->device; + + return device->nvme_data; +} Index: sys/cam/nvme/nvme_da.c =================================================================== --- sys/cam/nvme/nvme_da.c +++ sys/cam/nvme/nvme_da.c @@ -697,8 +697,10 @@ printf("ndaregister: no getdev CCB, can't register device\n"); return(CAM_REQ_CMP_ERR); } - nsd = cgd->nvme_data; - cd = cgd->nvme_cdata; + + + nsd = nvme_get_identify_ns(periph); + cd = nvme_get_identify_cntrl(periph); softc = (struct nda_softc *)malloc(sizeof(*softc), M_DEVBUF, M_NOWAIT | M_ZERO); Index: sys/cam/nvme/nvme_xpt.c =================================================================== --- sys/cam/nvme/nvme_xpt.c +++ sys/cam/nvme/nvme_xpt.c @@ -538,6 +538,24 @@ memcpy(cdai->buf, device->physpath, amt); } break; + case CDAI_TYPE_NVME_CNTRL: + if (cdai->flags & CDAI_FLAG_STORE) + return; + amt = sizeof(struct nvme_controller_data); + cdai->provsiz = amt; + if (amt > cdai->bufsiz) + amt = cdai->bufsiz; + memcpy(cdai->buf, device->nvme_cdata, amt); + break; + case CDAI_TYPE_NVME_NS: + if (cdai->flags & CDAI_FLAG_STORE) + return; + amt = sizeof(struct nvme_namespace_data); + cdai->provsiz = amt; + if (amt > cdai->bufsiz) + amt = cdai->bufsiz; + memcpy(cdai->buf, device->nvme_data, amt); + break; default: return; }