summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjimharris <jimharris@FreeBSD.org>2012-09-19 16:21:23 +0000
committerjimharris <jimharris@FreeBSD.org>2012-09-19 16:21:23 +0000
commit013f2062be82f210234b55883b3ddbdb0870aa55 (patch)
tree641eebb84d94efb29e44f69eab38815146d840b1
parent13681004dd325c4c4029473cb3c92da7080dede8 (diff)
downloadFreeBSD-src-013f2062be82f210234b55883b3ddbdb0870aa55.zip
FreeBSD-src-013f2062be82f210234b55883b3ddbdb0870aa55.tar.gz
Report nvme(4) as a generic driver for NVMe devices if PCI class, subclass
and programming interface codes match. Sponsored by: Intel
-rw-r--r--sys/dev/nvme/nvme.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/sys/dev/nvme/nvme.c b/sys/dev/nvme/nvme.c
index f7f925d..d17056e 100644
--- a/sys/dev/nvme/nvme.c
+++ b/sys/dev/nvme/nvme.c
@@ -32,6 +32,7 @@ __FBSDID("$FreeBSD$");
#include <sys/conf.h>
#include <sys/module.h>
+#include <dev/pci/pcireg.h>
#include <dev/pci/pcivar.h>
#include "nvme_private.h"
@@ -82,17 +83,29 @@ static struct _pcsid
static int
nvme_probe (device_t device)
{
- u_int32_t type = pci_get_devid(device);
- struct _pcsid *ep = pci_ids;
+ struct _pcsid *ep;
+ int probe_val = ENXIO;
+ u_int32_t type;
+
+ type = pci_get_devid(device);
+ ep = pci_ids;
+
+#if defined(PCIS_STORAGE_NVM)
+ if (pci_get_class(device) == PCIC_STORAGE &&
+ pci_get_subclass(device) == PCIS_STORAGE_NVM &&
+ pci_get_progif(device) == PCIP_STORAGE_NVM_ENTERPRISE_NVMHCI_1_0)
+ probe_val = BUS_PROBE_GENERIC;
+#endif
while (ep->type && ep->type != type)
++ep;
if (ep->desc) {
device_set_desc(device, ep->desc);
- return (BUS_PROBE_DEFAULT);
- } else
- return (ENXIO);
+ probe_val = BUS_PROBE_DEFAULT;
+ }
+
+ return (probe_val);
}
static void
OpenPOWER on IntegriCloud