Index: sys/dev/oce/oce_if.c =================================================================== --- sys/dev/oce/oce_if.c +++ sys/dev/oce/oce_if.c @@ -46,6 +46,8 @@ #include "oce_if.h" #include "oce_user.h" +#include + #define is_tso_pkt(m) (m->m_pkthdr.csum_flags & CSUM_TSO) /* UE Status Low CSR */ @@ -227,19 +229,24 @@ /* Supported devices table */ -static uint32_t supportedDevices[] = { - (PCI_VENDOR_SERVERENGINES << 16) | PCI_PRODUCT_BE2, - (PCI_VENDOR_SERVERENGINES << 16) | PCI_PRODUCT_BE3, - (PCI_VENDOR_EMULEX << 16) | PCI_PRODUCT_BE3, - (PCI_VENDOR_EMULEX << 16) | PCI_PRODUCT_XE201, - (PCI_VENDOR_EMULEX << 16) | PCI_PRODUCT_XE201_VF, - (PCI_VENDOR_EMULEX << 16) | PCI_PRODUCT_SH +static const struct pci_device_table supported_devices[] = { + { PCI_DEV(PCI_VENDOR_SERVERENGINES, PCI_PRODUCT_BE2), + .driver_data = OCE_FLAGS_BE2 }, + { PCI_DEV(PCI_VENDOR_SERVERENGINES, PCI_PRODUCT_BE3), + .driver_data = OCE_FLAGS_BE3 }, + { PCI_DEV(PCI_VENDOR_EMULEX, PCI_PRODUCT_BE3), + .driver_data = OCE_FLAGS_BE3 }, + { PCI_DEV(PCI_VENDOR_EMULEX, PCI_PRODUCT_XE201), + .driver_data = OCE_FLAGS_XE201 }, + { PCI_DEV(PCI_VENDOR_EMULEX, PCI_PRODUCT_XE201_VF), + .driver_data = OCE_FLAGS_XE201 }, + { PCI_DEV(PCI_VENDOR_EMULEX, PCI_PRODUCT_SH), + .driver_data = OCE_FLAGS_SH }, }; DRIVER_MODULE(oce, pci, oce_driver, oce_devclass, 0, 0); -MODULE_PNP_INFO("W32:vendor/device", pci, oce, supportedDevices, - nitems(supportedDevices)); +PCI_PNP_INFO(supported_devices); MODULE_DEPEND(oce, pci, 1, 1, 1); MODULE_DEPEND(oce, ether, 1, 1, 1); MODULE_VERSION(oce, 1); @@ -257,49 +264,25 @@ static int oce_probe(device_t dev) { - uint16_t vendor = 0; - uint16_t device = 0; - int i = 0; - char str[256] = {0}; + const struct pci_device_table *tbl; POCE_SOFTC sc; + char desc[256] = {0}; + + tbl = PCI_MATCH(dev, supported_devices); + if (tbl == NULL) + return (ENXIO); sc = device_get_softc(dev); bzero(sc, sizeof(OCE_SOFTC)); sc->dev = dev; - vendor = pci_get_vendor(dev); - device = pci_get_device(dev); - - for (i = 0; i < (sizeof(supportedDevices) / sizeof(uint32_t)); i++) { - if (vendor == ((supportedDevices[i] >> 16) & 0xffff)) { - if (device == (supportedDevices[i] & 0xffff)) { - sprintf(str, "%s:%s", "Emulex CNA NIC function", - component_revision); - device_set_desc_copy(dev, str); - - switch (device) { - case PCI_PRODUCT_BE2: - sc->flags |= OCE_FLAGS_BE2; - break; - case PCI_PRODUCT_BE3: - sc->flags |= OCE_FLAGS_BE3; - break; - case PCI_PRODUCT_XE201: - case PCI_PRODUCT_XE201_VF: - sc->flags |= OCE_FLAGS_XE201; - break; - case PCI_PRODUCT_SH: - sc->flags |= OCE_FLAGS_SH; - break; - default: - return ENXIO; - } - return BUS_PROBE_DEFAULT; - } - } - } + snprintf(desc, sizeof(desc), "%s:%s", + "Emulex CNA NIC function", component_revision); + device_set_desc_copy(dev, desc); + + sc->flags = (uint32_t)tbl->driver_data; - return ENXIO; + return (BUS_PROBE_DEFAULT); }