diff --git a/sys/cam/cam_ccb.h b/sys/cam/cam_ccb.h index 19f18f36b8c..bb23c6bed26 100644 --- a/sys/cam/cam_ccb.h +++ b/sys/cam/cam_ccb.h @@ -650,7 +650,7 @@ struct ccb_pathinq_settings_nvme { uint8_t bus; uint8_t slot; uint8_t function; - uint8_t extra; + uint8_t progif; char dev_name[NVME_DEV_NAME_LEN]; /* nvme controller dev name for this device */ }; _Static_assert(sizeof(struct ccb_pathinq_settings_nvme) == 64, diff --git a/sys/dev/nvme/nvme_sim.c b/sys/dev/nvme/nvme_sim.c index d134d1daafc..8b861cf3aa7 100644 --- a/sys/dev/nvme/nvme_sim.c +++ b/sys/dev/nvme/nvme_sim.c @@ -208,7 +208,7 @@ nvme_sim_action(struct cam_sim *sim, union ccb *ccb) cpi->xport_specific.nvme.bus = pci_get_bus(dev); cpi->xport_specific.nvme.slot = pci_get_slot(dev); cpi->xport_specific.nvme.function = pci_get_function(dev); - cpi->xport_specific.nvme.extra = 0; + cpi->xport_specific.nvme.progif = pci_get_progif(dev); strlcpy(cpi->xport_specific.nvme.dev_name, device_get_nameunit(dev), sizeof(cpi->xport_specific.nvme.dev_name)); cpi->hba_vendor = pci_get_vendor(dev); @@ -314,6 +314,13 @@ nvme_sim_probe(device_t dev) { if (nvme_use_nvd) return (ENXIO); + /* + * Only do storage devices with CAM. NVMHCI 1.0 interfaces are the only + * ones that have namespaces with LBA ranges on them. + */ + if (pci_get_progif(device_get_parent(dev)) != + PCIP_STORAGE_NVM_ENTERPRISE_NVMHCI_1_0) + return (ENXIO); device_set_desc(dev, "nvme cam"); return (BUS_PROBE_DEFAULT);