Properly decode NVMe state of the drive and print out the information
in the attach to more closely match what SCSI and ATA attached storage provides. Sponsored by: Netflix
This commit is contained in:
parent
d1c9349f76
commit
5e8a39f6ab
@ -87,9 +87,16 @@ nvme_identify_match(caddr_t identbuffer, caddr_t table_entry)
|
||||
|
||||
void
|
||||
nvme_print_ident(const struct nvme_controller_data *cdata,
|
||||
const struct nvme_namespace_data *data)
|
||||
const struct nvme_namespace_data *data, struct sbuf *sb)
|
||||
{
|
||||
printf("I'm a pretty NVME drive\n");
|
||||
|
||||
sbuf_printf(sb, "<");
|
||||
cam_strvis_sbuf(sb, cdata->mn, sizeof(cdata->mn), 0);
|
||||
sbuf_printf(sb, " ");
|
||||
cam_strvis_sbuf(sb, cdata->fr, sizeof(cdata->fr), 0);
|
||||
sbuf_printf(sb, " ");
|
||||
cam_strvis_sbuf(sb, cdata->sn, sizeof(cdata->sn), 0);
|
||||
sbuf_printf(sb, ">\n");
|
||||
}
|
||||
|
||||
/* XXX need to do nvme admin opcodes too, but those aren't used yet by nda */
|
||||
|
@ -39,7 +39,8 @@ void nvme_ns_cmd(struct ccb_nvmeio *nvmeio, uint8_t cmd, uint32_t nsid,
|
||||
|
||||
int nvme_identify_match(caddr_t identbuffer, caddr_t table_entry);
|
||||
|
||||
void nvme_print_ident(const struct nvme_controller_data *, const struct nvme_namespace_data *);
|
||||
struct sbuf;
|
||||
void nvme_print_ident(const struct nvme_controller_data *, const struct nvme_namespace_data *, struct sbuf *);
|
||||
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 *);
|
||||
|
@ -619,35 +619,49 @@ nvme_announce_periph(struct cam_periph *periph)
|
||||
struct ccb_pathinq cpi;
|
||||
struct ccb_trans_settings cts;
|
||||
struct cam_path *path = periph->path;
|
||||
struct ccb_trans_settings_nvme *nvmex;
|
||||
|
||||
cam_periph_assert(periph, MA_OWNED);
|
||||
|
||||
/* Ask the SIM for connection details */
|
||||
xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NORMAL);
|
||||
cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS;
|
||||
cts.type = CTS_TYPE_CURRENT_SETTINGS;
|
||||
xpt_action((union ccb*)&cts);
|
||||
if ((cts.ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP)
|
||||
return;
|
||||
nvmex = &cts.xport_specific.nvme;
|
||||
|
||||
/* Ask the SIM for its base transfer speed */
|
||||
xpt_setup_ccb(&cpi.ccb_h, path, CAM_PRIORITY_NORMAL);
|
||||
cpi.ccb_h.func_code = XPT_PATH_INQ;
|
||||
xpt_action((union ccb *)&cpi);
|
||||
/* XXX NVME STUFF HERE */
|
||||
printf("%s%d: nvme version %d.%d x%d (max x%d) lanes PCIe Gen%d (max Gen%d) link",
|
||||
periph->periph_name, periph->unit_number,
|
||||
NVME_MAJOR(nvmex->spec),
|
||||
NVME_MINOR(nvmex->spec),
|
||||
nvmex->lanes, nvmex->max_lanes,
|
||||
nvmex->speed, nvmex->max_speed);
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
static void
|
||||
nvme_proto_announce(struct cam_ed *device)
|
||||
{
|
||||
struct sbuf sb;
|
||||
char buffer[120];
|
||||
|
||||
nvme_print_ident(device->nvme_cdata, device->nvme_data);
|
||||
sbuf_new(&sb, buffer, sizeof(buffer), SBUF_FIXEDLEN);
|
||||
nvme_print_ident(device->nvme_cdata, device->nvme_data, &sb);
|
||||
sbuf_finish(&sb);
|
||||
sbuf_putbuf(&sb);
|
||||
}
|
||||
|
||||
static void
|
||||
nvme_proto_denounce(struct cam_ed *device)
|
||||
{
|
||||
|
||||
nvme_print_ident(device->nvme_cdata, device->nvme_data);
|
||||
nvme_proto_announce(device);
|
||||
}
|
||||
|
||||
static void
|
||||
|
Loading…
Reference in New Issue
Block a user