Module Name: src Committed By: thorpej Date: Sat May 8 00:27:02 UTC 2021
Modified Files: src/sys/dev/pci: if_bwfm_pci.c if_bwi_pci.c if_cas.c if_dge.c if_et.c if_fxp_pci.c if_iwi.c if_iwn.c if_jme.c if_kse.c if_malo_pci.c if_msk.c if_mtd_pci.c if_rge.c if_sk.c if_tlp_pci.c if_vr.c Log Message: Use pci_compatible_match(). To generate a diff of this commit: cvs rdiff -u -r1.9 -r1.10 src/sys/dev/pci/if_bwfm_pci.c cvs rdiff -u -r1.16 -r1.17 src/sys/dev/pci/if_bwi_pci.c cvs rdiff -u -r1.44 -r1.45 src/sys/dev/pci/if_cas.c cvs rdiff -u -r1.58 -r1.59 src/sys/dev/pci/if_dge.c cvs rdiff -u -r1.32 -r1.33 src/sys/dev/pci/if_et.c cvs rdiff -u -r1.85 -r1.86 src/sys/dev/pci/if_fxp_pci.c cvs rdiff -u -r1.114 -r1.115 src/sys/dev/pci/if_iwi.c cvs rdiff -u -r1.94 -r1.95 src/sys/dev/pci/if_iwn.c cvs rdiff -u -r1.49 -r1.50 src/sys/dev/pci/if_jme.c cvs rdiff -u -r1.56 -r1.57 src/sys/dev/pci/if_kse.c cvs rdiff -u -r1.7 -r1.8 src/sys/dev/pci/if_malo_pci.c cvs rdiff -u -r1.115 -r1.116 src/sys/dev/pci/if_msk.c cvs rdiff -u -r1.21 -r1.22 src/sys/dev/pci/if_mtd_pci.c cvs rdiff -u -r1.18 -r1.19 src/sys/dev/pci/if_rge.c cvs rdiff -u -r1.107 -r1.108 src/sys/dev/pci/if_sk.c cvs rdiff -u -r1.129 -r1.130 src/sys/dev/pci/if_tlp_pci.c cvs rdiff -u -r1.133 -r1.134 src/sys/dev/pci/if_vr.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/pci/if_bwfm_pci.c diff -u src/sys/dev/pci/if_bwfm_pci.c:1.9 src/sys/dev/pci/if_bwfm_pci.c:1.10 --- src/sys/dev/pci/if_bwfm_pci.c:1.9 Sat May 30 15:55:47 2020 +++ src/sys/dev/pci/if_bwfm_pci.c Sat May 8 00:27:02 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: if_bwfm_pci.c,v 1.9 2020/05/30 15:55:47 jdolecek Exp $ */ +/* $NetBSD: if_bwfm_pci.c,v 1.10 2021/05/08 00:27:02 thorpej Exp $ */ /* $OpenBSD: if_bwfm_pci.c,v 1.18 2018/02/08 05:00:38 patrick Exp $ */ /* * Copyright (c) 2010-2016 Broadcom Corporation @@ -366,12 +366,14 @@ static const struct bwfm_firmware_select BWFM_FW_ENTRY_END }; -static const struct bwfm_pci_matchid { - pci_vendor_id_t bwfm_vendor; - pci_product_id_t bwfm_product; -} bwfm_pci_devices[] = { - { PCI_VENDOR_BROADCOM, PCI_PRODUCT_BROADCOM_BCM43602 }, - { PCI_VENDOR_BROADCOM, PCI_PRODUCT_BROADCOM_BCM4350 }, +static const struct device_compatible_entry compat_data[] = { + { .id = PCI_ID_CODE(PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM43602), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM4350), }, + + PCI_COMPAT_EOL }; static struct mbuf * @@ -397,14 +399,7 @@ bwfm_pci_match(device_t parent, cfdata_t { struct pci_attach_args *pa = aux; - if (PCI_VENDOR(pa->pa_id) != PCI_VENDOR_BROADCOM) - return 0; - - for (size_t i = 0; i < __arraycount(bwfm_pci_devices); i++) - if (PCI_PRODUCT(pa->pa_id) == bwfm_pci_devices[i].bwfm_product) - return 1; - - return 0; + return pci_compatible_match(pa, compat_data); } void Index: src/sys/dev/pci/if_bwi_pci.c diff -u src/sys/dev/pci/if_bwi_pci.c:1.16 src/sys/dev/pci/if_bwi_pci.c:1.17 --- src/sys/dev/pci/if_bwi_pci.c:1.16 Sun Dec 9 11:14:02 2018 +++ src/sys/dev/pci/if_bwi_pci.c Sat May 8 00:27:02 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: if_bwi_pci.c,v 1.16 2018/12/09 11:14:02 jdolecek Exp $ */ +/* $NetBSD: if_bwi_pci.c,v 1.17 2021/05/08 00:27:02 thorpej Exp $ */ /* $OpenBSD: if_bwi_pci.c,v 1.6 2008/02/14 22:10:02 brad Exp $ */ /* @@ -24,7 +24,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_bwi_pci.c,v 1.16 2018/12/09 11:14:02 jdolecek Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_bwi_pci.c,v 1.17 2021/05/08 00:27:02 thorpej Exp $"); #include <sys/param.h> #include <sys/callout.h> @@ -74,31 +74,52 @@ struct bwi_pci_softc { CFATTACH_DECL_NEW(bwi_pci, sizeof(struct bwi_pci_softc), bwi_pci_match, bwi_pci_attach, bwi_pci_detach, NULL); +static const struct device_compatible_entry compat_data[] = { + { .id = PCI_ID_CODE(PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM4303), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM4306), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM4306_2), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM4307), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM4309), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM4311), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM4312), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM4318), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM4319), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM4322), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM43XG), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_BROADCOM, + PCI_PRODUCT_BROADCOM_BCM4328), }, + + PCI_COMPAT_EOL +}; + static int bwi_pci_match(device_t parent, cfdata_t match, void *aux) { struct pci_attach_args *pa = aux; - if (PCI_VENDOR(pa->pa_id) != PCI_VENDOR_BROADCOM) - return (0); - - switch (PCI_PRODUCT(pa->pa_id)) { - case PCI_PRODUCT_BROADCOM_BCM4303: - case PCI_PRODUCT_BROADCOM_BCM4306: - case PCI_PRODUCT_BROADCOM_BCM4306_2: - case PCI_PRODUCT_BROADCOM_BCM4307: - case PCI_PRODUCT_BROADCOM_BCM4309: - case PCI_PRODUCT_BROADCOM_BCM4311: - case PCI_PRODUCT_BROADCOM_BCM4312: - case PCI_PRODUCT_BROADCOM_BCM4318: - case PCI_PRODUCT_BROADCOM_BCM4319: - case PCI_PRODUCT_BROADCOM_BCM4322: - case PCI_PRODUCT_BROADCOM_BCM43XG: - case PCI_PRODUCT_BROADCOM_BCM4328: - return (1); - } - - return (0); + return pci_compatible_match(pa, compat_data); } static void Index: src/sys/dev/pci/if_cas.c diff -u src/sys/dev/pci/if_cas.c:1.44 src/sys/dev/pci/if_cas.c:1.45 --- src/sys/dev/pci/if_cas.c:1.44 Tue Sep 15 08:33:40 2020 +++ src/sys/dev/pci/if_cas.c Sat May 8 00:27:02 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: if_cas.c,v 1.44 2020/09/15 08:33:40 mrg Exp $ */ +/* $NetBSD: if_cas.c,v 1.45 2021/05/08 00:27:02 thorpej Exp $ */ /* $OpenBSD: if_cas.c,v 1.29 2009/11/29 16:19:38 kettenis Exp $ */ /* @@ -44,7 +44,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_cas.c,v 1.44 2020/09/15 08:33:40 mrg Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_cas.c,v 1.45 2021/05/08 00:27:02 thorpej Exp $"); #ifndef _MODULE #include "opt_inet.h" @@ -163,14 +163,16 @@ int cas_intr(void *); #define DPRINTF(sc, x) /* nothing */ #endif -static const struct cas_pci_dev { - uint16_t cpd_vendor; - uint16_t cpd_device; - int cpd_variant; -} cas_pci_devlist[] = { - { PCI_VENDOR_SUN, PCI_PRODUCT_SUN_CASSINI, CAS_CAS }, - { PCI_VENDOR_NS, PCI_PRODUCT_NS_SATURN, CAS_SATURN }, - { 0, 0, 0 } +static const struct device_compatible_entry compat_data[] = { + { .id = PCI_ID_CODE(PCI_VENDOR_SUN, + PCI_PRODUCT_SUN_CASSINI), + .value = CAS_CAS }, + + { .id = PCI_ID_CODE(PCI_VENDOR_NS, + PCI_PRODUCT_NS_SATURN), + .value = CAS_SATURN }, + + PCI_COMPAT_EOL }; #define CAS_LOCAL_MAC_ADDRESS "local-mac-address" @@ -182,15 +184,8 @@ int cas_match(device_t parent, cfdata_t cf, void *aux) { struct pci_attach_args *pa = aux; - int i; - - for (i = 0; cas_pci_devlist[i].cpd_vendor != 0; i++) { - if ((PCI_VENDOR(pa->pa_id) == cas_pci_devlist[i].cpd_vendor) && - (PCI_PRODUCT(pa->pa_id) == cas_pci_devlist[i].cpd_device)) - return 1; - } - return 0; + return pci_compatible_match(pa, compat_data); } #define PROMHDR_PTR_DATA 0x18 @@ -403,8 +398,8 @@ void cas_attach(device_t parent, device_t self, void *aux) { struct pci_attach_args *pa = aux; + const struct device_compatible_entry *dce; struct cas_softc *sc = device_private(self); - int i; prop_data_t data; uint8_t enaddr[ETHER_ADDR_LEN]; @@ -417,19 +412,11 @@ cas_attach(device_t parent, device_t sel else sc->sc_dmatag = pa->pa_dmat; - sc->sc_variant = CAS_UNKNOWN; - for (i = 0; cas_pci_devlist[i].cpd_vendor != 0; i++) { - if ((PCI_VENDOR(pa->pa_id) == cas_pci_devlist[i].cpd_vendor) && - (PCI_PRODUCT(pa->pa_id) == cas_pci_devlist[i].cpd_device)) { - sc->sc_variant = cas_pci_devlist[i].cpd_variant; - break; - } - } + dce = pci_compatible_lookup(pa, compat_data); + KASSERT(dce != NULL); + sc->sc_variant = (u_int)dce->value; + aprint_debug_dev(sc->sc_dev, "variant = %d\n", sc->sc_variant); - if (sc->sc_variant == CAS_UNKNOWN) { - aprint_error_dev(sc->sc_dev, "unknown adaptor\n"); - return; - } #define PCI_CAS_BASEADDR 0x10 if (pci_mapreg_map(pa, PCI_CAS_BASEADDR, PCI_MAPREG_TYPE_MEM, 0, Index: src/sys/dev/pci/if_dge.c diff -u src/sys/dev/pci/if_dge.c:1.58 src/sys/dev/pci/if_dge.c:1.59 --- src/sys/dev/pci/if_dge.c:1.58 Sun Mar 1 15:11:31 2020 +++ src/sys/dev/pci/if_dge.c Sat May 8 00:27:02 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: if_dge.c,v 1.58 2020/03/01 15:11:31 thorpej Exp $ */ +/* $NetBSD: if_dge.c,v 1.59 2021/05/08 00:27:02 thorpej Exp $ */ /* * Copyright (c) 2004, SUNET, Swedish University Computer Network. @@ -80,7 +80,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_dge.c,v 1.58 2020/03/01 15:11:31 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_dge.c,v 1.59 2021/05/08 00:27:02 thorpej Exp $"); @@ -647,49 +647,41 @@ static char (*dge_txseg_evcnt_names)[DGE /* * Devices supported by this driver. */ -static const struct dge_product { - pci_vendor_id_t dgep_vendor; - pci_product_id_t dgep_product; - const char *dgep_name; - int dgep_flags; +struct dge_product { + const char *name; + int flags; #define DGEP_F_10G_LR 0x01 #define DGEP_F_10G_SR 0x02 -} dge_products[] = { - { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82597EX, - "Intel i82597EX 10GbE-LR Ethernet", - DGEP_F_10G_LR }, - - { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82597EX_SR, - "Intel i82597EX 10GbE-SR Ethernet", - DGEP_F_10G_SR }, - - { 0, 0, - NULL, - 0 }, }; -static const struct dge_product * -dge_lookup(const struct pci_attach_args *pa) -{ - const struct dge_product *dgep; +static const struct dge_product i82597EX_lr = { + .name = "Intel i82597EX 10GbE-LR Ethernet", + .flags = DGEP_F_10G_LR +}; - for (dgep = dge_products; dgep->dgep_name != NULL; dgep++) { - if (PCI_VENDOR(pa->pa_id) == dgep->dgep_vendor && - PCI_PRODUCT(pa->pa_id) == dgep->dgep_product) - return dgep; - } - return NULL; -} +static const struct dge_product i82597EX_sr = { + .name = "Intel i82597EX 10GbE-SR Ethernet", + .flags = DGEP_F_10G_SR +}; + +static const struct device_compatible_entry compat_data[] = { + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_82597EX), + .data = &i82597EX_lr }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_82597EX_SR), + .data = &i82597EX_sr }, + + PCI_COMPAT_EOL +}; static int dge_match(device_t parent, cfdata_t cf, void *aux) { struct pci_attach_args *pa = aux; - if (dge_lookup(pa) != NULL) - return 1; - - return 0; + return pci_compatible_match(pa, compat_data); } static void @@ -707,13 +699,12 @@ dge_attach(device_t parent, device_t sel pcireg_t preg, memtype; uint32_t reg; char intrbuf[PCI_INTRSTR_LEN]; + const struct device_compatible_entry *dce; const struct dge_product *dgep; - sc->sc_dgep = dgep = dge_lookup(pa); - if (dgep == NULL) { - printf("\n"); - panic("dge_attach: impossible"); - } + dce = pci_compatible_lookup(pa, compat_data); + KASSERT(dce != NULL); + sc->sc_dgep = dgep = dce->data; sc->sc_dev = self; sc->sc_pc = pa->pa_pc; @@ -725,7 +716,7 @@ dge_attach(device_t parent, device_t sel sc->sc_dmat = pa->pa_dmat; pci_aprint_devinfo_fancy(pa, "Ethernet controller", - dgep->dgep_name, 1); + dgep->name, 1); memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, DGE_PCI_BAR); if (pci_mapreg_map(pa, DGE_PCI_BAR, memtype, 0, @@ -914,7 +905,7 @@ dge_attach(device_t parent, device_t sel sc->sc_ethercom.ec_ifmedia = &sc->sc_media; ifmedia_init(&sc->sc_media, IFM_IMASK, dge_xgmii_mediachange, dge_xgmii_mediastatus); - if (dgep->dgep_flags & DGEP_F_10G_SR) { + if (dgep->flags & DGEP_F_10G_SR) { ifmedia_add(&sc->sc_media, IFM_ETHER | IFM_10G_SR, 0, NULL); ifmedia_set(&sc->sc_media, IFM_ETHER | IFM_10G_SR); } else { /* XXX default is LR */ @@ -2406,7 +2397,7 @@ dge_xgmii_mediastatus(struct ifnet *ifp, struct dge_softc *sc = ifp->if_softc; ifmr->ifm_status = IFM_AVALID; - if (sc->sc_dgep->dgep_flags & DGEP_F_10G_SR ) { + if (sc->sc_dgep->flags & DGEP_F_10G_SR ) { ifmr->ifm_active = IFM_ETHER | IFM_10G_SR; } else { ifmr->ifm_active = IFM_ETHER | IFM_10G_LR; Index: src/sys/dev/pci/if_et.c diff -u src/sys/dev/pci/if_et.c:1.32 src/sys/dev/pci/if_et.c:1.33 --- src/sys/dev/pci/if_et.c:1.32 Sun Mar 1 15:15:49 2020 +++ src/sys/dev/pci/if_et.c Sat May 8 00:27:02 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: if_et.c,v 1.32 2020/03/01 15:15:49 thorpej Exp $ */ +/* $NetBSD: if_et.c,v 1.33 2021/05/08 00:27:02 thorpej Exp $ */ /* $OpenBSD: if_et.c,v 1.12 2008/07/11 09:29:02 kevlo $ */ /* * Copyright (c) 2007 The DragonFly Project. All rights reserved. @@ -37,7 +37,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_et.c,v 1.32 2020/03/01 15:15:49 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_et.c,v 1.33 2021/05/08 00:27:02 thorpej Exp $"); #include "opt_inet.h" #include "vlan.h" @@ -152,12 +152,15 @@ static const struct et_bsize et_bufsize[ { .bufsize = 0, .newbuf = et_newbuf_cluster }, }; -static const struct et_product { - pci_vendor_id_t vendor; - pci_product_id_t product; -} et_devices[] = { - { PCI_VENDOR_LUCENT, PCI_PRODUCT_LUCENT_ET1310 }, - { PCI_VENDOR_LUCENT, PCI_PRODUCT_LUCENT_ET1301 } +static const struct device_compatible_entry compat_data[] = { + { .id = PCI_ID_CODE(PCI_VENDOR_LUCENT, PCI_PRODUCT_LUCENT_ET1310), + .value = 0 }, + + + { .id = PCI_ID_CODE(PCI_VENDOR_LUCENT, PCI_PRODUCT_LUCENT_ET1301), + .value = ET_FLAG_FASTETHER }, + + PCI_COMPAT_EOL }; CFATTACH_DECL_NEW(et, sizeof(struct et_softc), et_match, et_attach, et_detach, @@ -167,16 +170,8 @@ static int et_match(device_t dev, cfdata_t match, void *aux) { struct pci_attach_args *pa = aux; - const struct et_product *ep; - int i; - for (i = 0; i < __arraycount(et_devices); i++) { - ep = &et_devices[i]; - if (PCI_VENDOR(pa->pa_id) == ep->vendor && - PCI_PRODUCT(pa->pa_id) == ep->product) - return 1; - } - return 0; + return pci_compatible_match(pa, compat_data); } static void @@ -184,6 +179,7 @@ et_attach(device_t parent, device_t self { struct et_softc *sc = device_private(self); struct pci_attach_args *pa = aux; + const struct device_compatible_entry *dce; pci_chipset_tag_t pc = pa->pa_pc; pci_intr_handle_t ih; const char *intrstr; @@ -238,8 +234,9 @@ et_attach(device_t parent, device_t self else sc->sc_dmat = pa->pa_dmat; - if (pa->pa_id == PCI_PRODUCT_LUCENT_ET1301) - sc->sc_flags |= ET_FLAG_FASTETHER; + dce = pci_compatible_lookup(pa, compat_data); + KASSERT(dce != NULL); + sc->sc_flags = (uint32_t)dce->value; error = et_bus_config(sc); if (error) Index: src/sys/dev/pci/if_fxp_pci.c diff -u src/sys/dev/pci/if_fxp_pci.c:1.85 src/sys/dev/pci/if_fxp_pci.c:1.86 --- src/sys/dev/pci/if_fxp_pci.c:1.85 Wed Jan 23 06:56:19 2019 +++ src/sys/dev/pci/if_fxp_pci.c Sat May 8 00:27:02 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: if_fxp_pci.c,v 1.85 2019/01/23 06:56:19 msaitoh Exp $ */ +/* $NetBSD: if_fxp_pci.c,v 1.86 2021/05/08 00:27:02 thorpej Exp $ */ /*- * Copyright (c) 1997, 1998, 1999, 2000, 2001 The NetBSD Foundation, Inc. @@ -36,7 +36,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_fxp_pci.c,v 1.85 2019/01/23 06:56:19 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_fxp_pci.c,v 1.86 2021/05/08 00:27:02 thorpej Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -90,124 +90,145 @@ CFATTACH_DECL3_NEW(fxp_pci, sizeof(struc fxp_pci_match, fxp_pci_attach, fxp_pci_detach, NULL, NULL, null_childdetached, DVF_DETACH_SHUTDOWN); -static const struct fxp_pci_product { - uint32_t fpp_prodid; /* PCI product ID */ - const char *fpp_name; /* device name */ -} fxp_pci_products[] = { - { PCI_PRODUCT_INTEL_82552, - "Intel i82552 10/100 Network Connection" }, - { PCI_PRODUCT_INTEL_8255X, - "Intel i8255x Ethernet" }, - { PCI_PRODUCT_INTEL_82559ER, - "Intel i82559ER Ethernet" }, - { PCI_PRODUCT_INTEL_IN_BUSINESS, - "Intel InBusiness Ethernet" }, - { PCI_PRODUCT_INTEL_PRO_100, - "Intel PRO/100 Ethernet" }, - { PCI_PRODUCT_INTEL_PRO_100_VE_0, - "Intel PRO/100 VE Network Controller" }, - { PCI_PRODUCT_INTEL_PRO_100_VE_1, - "Intel PRO/100 VE Network Controller" }, - { PCI_PRODUCT_INTEL_PRO_100_VE_2, - "Intel PRO/100 VE Network Controller with 82562ET/EZ PHY" }, - { PCI_PRODUCT_INTEL_PRO_100_VE_3, - "Intel PRO/100 VE Network Controller with 82562ET/EZ (CNR) PHY" }, - { PCI_PRODUCT_INTEL_PRO_100_VE_4, - "Intel PRO/100 VE (MOB) Network Controller" }, - { PCI_PRODUCT_INTEL_PRO_100_VE_5, - "Intel PRO/100 VE (LOM) Network Controller" }, - { PCI_PRODUCT_INTEL_PRO_100_VE_6, - "Intel PRO/100 VE Network Controller" }, - { PCI_PRODUCT_INTEL_PRO_100_VE_7, - "Intel PRO/100 VE Network Controller" }, - { PCI_PRODUCT_INTEL_PRO_100_VE_8, - "Intel PRO/100 VE Network Controller" }, - { PCI_PRODUCT_INTEL_PRO_100_VE_9, - "Intel PRO/100 VE Network Controller" }, - { PCI_PRODUCT_INTEL_PRO_100_VE_10, - "Intel PRO/100 VE Network Controller" }, - { PCI_PRODUCT_INTEL_PRO_100_VE_11, - "Intel PRO/100 VE Network Controller" }, - { PCI_PRODUCT_INTEL_PRO_100_VM_0, - "Intel PRO/100 VM Network Controller" }, - { PCI_PRODUCT_INTEL_PRO_100_VM_1, - "Intel PRO/100 VM Network Controller" }, - { PCI_PRODUCT_INTEL_PRO_100_VM_2, - "Intel PRO/100 VM Network Controller" }, - { PCI_PRODUCT_INTEL_PRO_100_VM_3, - "Intel PRO/100 VM Network Controller with 82562EM/EX PHY" }, - { PCI_PRODUCT_INTEL_PRO_100_VM_4, - "Intel PRO/100 VM Network Controller with 82562EM/EX (CNR) PHY" }, - { PCI_PRODUCT_INTEL_PRO_100_VM_5, - "Intel PRO/100 VM (MOB) Network Controller" }, - { PCI_PRODUCT_INTEL_PRO_100_VM_6, - "Intel PRO/100 VM Network Controller with 82562ET/EZ PHY" }, - { PCI_PRODUCT_INTEL_PRO_100_VM_7, - "Intel PRO/100 VM Network Connection" }, - { PCI_PRODUCT_INTEL_PRO_100_VM_8, - "Intel PRO/100 VM Network Connection" }, - { PCI_PRODUCT_INTEL_PRO_100_VM_9, - "Intel PRO/100 VM Network Connection" }, - { PCI_PRODUCT_INTEL_PRO_100_VM_10, - "Intel PRO/100 VM Network Connection" }, - { PCI_PRODUCT_INTEL_PRO_100_VM_11, - "Intel PRO/100 VM Network Connection" }, - { PCI_PRODUCT_INTEL_PRO_100_VM_12, - "Intel PRO/100 VM Network Connection" }, - { PCI_PRODUCT_INTEL_PRO_100_VM_13, - "Intel PRO/100 VM Network Connection" }, - { PCI_PRODUCT_INTEL_PRO_100_VM_14, - "Intel PRO/100 VM Network Connection" }, - { PCI_PRODUCT_INTEL_PRO_100_VM_15, - "Intel PRO/100 VM Network Connection" }, - { PCI_PRODUCT_INTEL_PRO_100_VM_16, - "Intel PRO/100 VM Network Connection" }, - { PCI_PRODUCT_INTEL_PRO_100_M, - "Intel PRO/100 M Network Controller" }, - { PCI_PRODUCT_INTEL_82801BA_LAN, - "Intel i82562 Ethernet" }, - { PCI_PRODUCT_INTEL_82801E_LAN_1, - "Intel i82801E Ethernet" }, - { PCI_PRODUCT_INTEL_82801E_LAN_2, - "Intel i82801E Ethernet" }, - { PCI_PRODUCT_INTEL_82801EB_LAN, - "Intel 82801EB/ER (ICH5) Network Controller" }, - { PCI_PRODUCT_INTEL_82801FB_LAN, - "Intel i82801FB LAN Controller" }, - { PCI_PRODUCT_INTEL_82801FB_LAN_2, - "Intel i82801FB LAN Controller" }, - { PCI_PRODUCT_INTEL_82801G_LAN, - "Intel 82801GB/GR (ICH7) Network Controller" }, - { PCI_PRODUCT_INTEL_82801GB_LAN, - "Intel 82801GB 10/100 Network Controller" }, - { 0, - NULL }, -}; +static const struct device_compatible_entry compat_data[] = { + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82552), + .data = "Intel i82552 10/100 Network Connection" }, -static const struct fxp_pci_product * -fxp_pci_lookup(const struct pci_attach_args *pa) -{ - const struct fxp_pci_product *fpp; + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_8255X), + .data = "Intel i8255x Ethernet" }, - if (PCI_VENDOR(pa->pa_id) != PCI_VENDOR_INTEL) - return NULL; + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82559ER), + .data = "Intel i82559ER Ethernet" }, - for (fpp = fxp_pci_products; fpp->fpp_name != NULL; fpp++) - if (PCI_PRODUCT(pa->pa_id) == fpp->fpp_prodid) - return fpp; + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_IN_BUSINESS), + .data = "Intel InBusiness Ethernet" }, - return NULL; -} + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PRO_100), + .data = "Intel PRO/100 Ethernet" }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PRO_100_VE_0), + .data = "Intel PRO/100 VE Network Controller" }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PRO_100_VE_1), + .data = "Intel PRO/100 VE Network Controller" }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PRO_100_VE_2), + .data = "Intel PRO/100 VE Network Controller with 82562ET/EZ PHY" }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PRO_100_VE_3), + .data = "Intel PRO/100 VE Network Controller with 82562ET/EZ (CNR) PHY" }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PRO_100_VE_4), + .data = "Intel PRO/100 VE (MOB) Network Controller" }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PRO_100_VE_5), + .data = "Intel PRO/100 VE (LOM) Network Controller" }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PRO_100_VE_6), + .data = "Intel PRO/100 VE Network Controller" }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PRO_100_VE_7), + .data = "Intel PRO/100 VE Network Controller" }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PRO_100_VE_8), + .data = "Intel PRO/100 VE Network Controller" }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PRO_100_VE_9), + .data = "Intel PRO/100 VE Network Controller" }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PRO_100_VE_10), + .data = "Intel PRO/100 VE Network Controller" }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PRO_100_VE_11), + .data = "Intel PRO/100 VE Network Controller" }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PRO_100_VM_0), + .data = "Intel PRO/100 VM Network Controller" }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PRO_100_VM_1), + .data = "Intel PRO/100 VM Network Controller" }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PRO_100_VM_2), + .data = "Intel PRO/100 VM Network Controller" }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PRO_100_VM_3), + .data = "Intel PRO/100 VM Network Controller with 82562EM/EX PHY" }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PRO_100_VM_4), + .data = "Intel PRO/100 VM Network Controller with 82562EM/EX (CNR) PHY" }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PRO_100_VM_5), + .data = "Intel PRO/100 VM (MOB) Network Controller" }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PRO_100_VM_6), + .data = "Intel PRO/100 VM Network Controller with 82562ET/EZ PHY" }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PRO_100_VM_7), + .data = "Intel PRO/100 VM Network Connection" }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PRO_100_VM_8), + .data = "Intel PRO/100 VM Network Connection" }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PRO_100_VM_9), + .data = "Intel PRO/100 VM Network Connection" }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PRO_100_VM_10), + .data = "Intel PRO/100 VM Network Connection" }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PRO_100_VM_11), + .data = "Intel PRO/100 VM Network Connection" }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PRO_100_VM_12), + .data = "Intel PRO/100 VM Network Connection" }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PRO_100_VM_13), + .data = "Intel PRO/100 VM Network Connection" }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PRO_100_VM_14), + .data = "Intel PRO/100 VM Network Connection" }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PRO_100_VM_15), + .data = "Intel PRO/100 VM Network Connection" }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PRO_100_VM_16), + .data = "Intel PRO/100 VM Network Connection" }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PRO_100_M), + .data = "Intel PRO/100 M Network Controller" }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801BA_LAN), + .data = "Intel i82562 Ethernet" }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801E_LAN_1), + .data = "Intel i82801E Ethernet" }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801E_LAN_2), + .data = "Intel i82801E Ethernet" }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801EB_LAN), + .data = "Intel 82801EB/ER (ICH5) Network Controller" }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801FB_LAN), + .data = "Intel i82801FB LAN Controller" }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801FB_LAN_2), + .data = "Intel i82801FB LAN Controller" }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801G_LAN), + .data = "Intel 82801GB/GR (ICH7) Network Controller" }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801GB_LAN), + .data = "Intel 82801GB 10/100 Network Controller" }, + + PCI_COMPAT_EOL +}; static int fxp_pci_match(device_t parent, cfdata_t match, void *aux) { struct pci_attach_args *pa = aux; - if (fxp_pci_lookup(pa) != NULL) - return 1; - - return 0; + return pci_compatible_match(pa, compat_data); } /* @@ -295,7 +316,7 @@ fxp_pci_attach(device_t parent, device_t const struct pci_attach_args *pa = aux; pci_chipset_tag_t pc = pa->pa_pc; pci_intr_handle_t ih; - const struct fxp_pci_product *fpp; + const struct device_compatible_entry *dce; const char *chipname = NULL; const char *intrstr = NULL; bus_space_tag_t iot, memt; @@ -370,15 +391,12 @@ fxp_pci_attach(device_t parent, device_t sc->sc_dmat = pa->pa_dmat; - fpp = fxp_pci_lookup(pa); - if (fpp == NULL) { - printf("\n"); - panic("fxp_pci_attach: impossible"); - } + dce = pci_compatible_lookup(pa, compat_data); + KASSERT(dce != NULL); sc->sc_rev = PCI_REVISION(pa->pa_class); - switch (fpp->fpp_prodid) { + switch (PCI_PRODUCT(dce->id)) { case PCI_PRODUCT_INTEL_8255X: case PCI_PRODUCT_INTEL_IN_BUSINESS: @@ -459,7 +477,7 @@ fxp_pci_attach(device_t parent, device_t } pci_aprint_devinfo_fancy(pa, "Ethernet controller", - (chipname ? chipname : fpp->fpp_name), 1); + (chipname != NULL ? chipname : dce->data), 1); /* Make sure bus-mastering is enabled. */ pci_conf_write(pc, pa->pa_tag, PCI_COMMAND_STATUS_REG, Index: src/sys/dev/pci/if_iwi.c diff -u src/sys/dev/pci/if_iwi.c:1.114 src/sys/dev/pci/if_iwi.c:1.115 --- src/sys/dev/pci/if_iwi.c:1.114 Fri Mar 20 13:33:23 2020 +++ src/sys/dev/pci/if_iwi.c Sat May 8 00:27:02 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: if_iwi.c,v 1.114 2020/03/20 13:33:23 thorpej Exp $ */ +/* $NetBSD: if_iwi.c,v 1.115 2021/05/08 00:27:02 thorpej Exp $ */ /* $OpenBSD: if_iwi.c,v 1.111 2010/11/15 19:11:57 damien Exp $ */ /*- @@ -19,7 +19,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_iwi.c,v 1.114 2020/03/20 13:33:23 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_iwi.c,v 1.115 2021/05/08 00:27:02 thorpej Exp $"); /*- * Intel(R) PRO/Wireless 2200BG/2225BG/2915ABG driver @@ -164,21 +164,29 @@ MEM_READ_4(struct iwi_softc *sc, uint32_ CFATTACH_DECL_NEW(iwi, sizeof (struct iwi_softc), iwi_match, iwi_attach, iwi_detach, NULL); +static const struct device_compatible_entry compat_data[] = { + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_PRO_WL_2200BG), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_PRO_WL_2225BG), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_PRO_WL_2915ABG_1), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_PRO_WL_2915ABG_2), }, + + + PCI_COMPAT_EOL +}; + static int iwi_match(device_t parent, cfdata_t match, void *aux) { struct pci_attach_args *pa = aux; - if (PCI_VENDOR(pa->pa_id) != PCI_VENDOR_INTEL) - return 0; - - if (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_INTEL_PRO_WL_2200BG || - PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_INTEL_PRO_WL_2225BG || - PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_INTEL_PRO_WL_2915ABG_1 || - PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_INTEL_PRO_WL_2915ABG_2) - return 1; - - return 0; + return pci_compatible_match(pa, compat_data); } /* Base Address Register */ Index: src/sys/dev/pci/if_iwn.c diff -u src/sys/dev/pci/if_iwn.c:1.94 src/sys/dev/pci/if_iwn.c:1.95 --- src/sys/dev/pci/if_iwn.c:1.94 Fri Mar 20 16:35:41 2020 +++ src/sys/dev/pci/if_iwn.c Sat May 8 00:27:02 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: if_iwn.c,v 1.94 2020/03/20 16:35:41 sevan Exp $ */ +/* $NetBSD: if_iwn.c,v 1.95 2021/05/08 00:27:02 thorpej Exp $ */ /* $OpenBSD: if_iwn.c,v 1.135 2014/09/10 07:22:09 dcoppa Exp $ */ /*- @@ -22,7 +22,7 @@ * adapters. */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_iwn.c,v 1.94 2020/03/20 16:35:41 sevan Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_iwn.c,v 1.95 2021/05/08 00:27:02 thorpej Exp $"); #define IWN_USE_RBUF /* Use local storage for RX */ #undef IWN_HWCRYPTO /* XXX does not even compile yet */ @@ -75,47 +75,128 @@ __KERNEL_RCSID(0, "$NetBSD: if_iwn.c,v 1 #include <dev/pci/if_iwnreg.h> #include <dev/pci/if_iwnvar.h> -static const pci_product_id_t iwn_devices[] = { - PCI_PRODUCT_INTEL_WIFI_LINK_1030_1, - PCI_PRODUCT_INTEL_WIFI_LINK_1030_2, - PCI_PRODUCT_INTEL_WIFI_LINK_4965_1, - PCI_PRODUCT_INTEL_WIFI_LINK_4965_2, - PCI_PRODUCT_INTEL_WIFI_LINK_4965_3, - PCI_PRODUCT_INTEL_WIFI_LINK_4965_4, - PCI_PRODUCT_INTEL_WIFI_LINK_5100_1, - PCI_PRODUCT_INTEL_WIFI_LINK_5100_2, - PCI_PRODUCT_INTEL_WIFI_LINK_5150_1, - PCI_PRODUCT_INTEL_WIFI_LINK_5150_2, - PCI_PRODUCT_INTEL_WIFI_LINK_5300_1, - PCI_PRODUCT_INTEL_WIFI_LINK_5300_2, - PCI_PRODUCT_INTEL_WIFI_LINK_5350_1, - PCI_PRODUCT_INTEL_WIFI_LINK_5350_2, - PCI_PRODUCT_INTEL_WIFI_LINK_1000_1, - PCI_PRODUCT_INTEL_WIFI_LINK_1000_2, - PCI_PRODUCT_INTEL_WIFI_LINK_6000_3X3_1, - PCI_PRODUCT_INTEL_WIFI_LINK_6000_3X3_2, - PCI_PRODUCT_INTEL_WIFI_LINK_6000_IPA_1, - PCI_PRODUCT_INTEL_WIFI_LINK_6000_IPA_2, - PCI_PRODUCT_INTEL_WIFI_LINK_6050_2X2_1, - PCI_PRODUCT_INTEL_WIFI_LINK_6050_2X2_2, - PCI_PRODUCT_INTEL_WIFI_LINK_6005_2X2_1, - PCI_PRODUCT_INTEL_WIFI_LINK_6005_2X2_2, - PCI_PRODUCT_INTEL_WIFI_LINK_6230_1, - PCI_PRODUCT_INTEL_WIFI_LINK_6230_2, - PCI_PRODUCT_INTEL_WIFI_LINK_6235, - PCI_PRODUCT_INTEL_WIFI_LINK_6235_2, - PCI_PRODUCT_INTEL_WIFI_LINK_100_1, - PCI_PRODUCT_INTEL_WIFI_LINK_100_2, - PCI_PRODUCT_INTEL_WIFI_LINK_130_1, - PCI_PRODUCT_INTEL_WIFI_LINK_130_2, - PCI_PRODUCT_INTEL_WIFI_LINK_2230_1, - PCI_PRODUCT_INTEL_WIFI_LINK_2230_2, - PCI_PRODUCT_INTEL_WIFI_LINK_2200_1, - PCI_PRODUCT_INTEL_WIFI_LINK_2200_2, - PCI_PRODUCT_INTEL_WIFI_LINK_135_1, - PCI_PRODUCT_INTEL_WIFI_LINK_135_2, - PCI_PRODUCT_INTEL_WIFI_LINK_105_1, - PCI_PRODUCT_INTEL_WIFI_LINK_105_2, +static const struct device_compatible_entry compat_data[] = { + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_WIFI_LINK_1030_1), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_WIFI_LINK_1030_2), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_WIFI_LINK_4965_1), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_WIFI_LINK_4965_2), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_WIFI_LINK_4965_3), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_WIFI_LINK_4965_4), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_WIFI_LINK_5100_1), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_WIFI_LINK_5100_2), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_WIFI_LINK_5150_1), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_WIFI_LINK_5150_2), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_WIFI_LINK_5300_1), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_WIFI_LINK_5300_2), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_WIFI_LINK_5350_1), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_WIFI_LINK_5350_2), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_WIFI_LINK_1000_1), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_WIFI_LINK_1000_2), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_WIFI_LINK_6000_3X3_1), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_WIFI_LINK_6000_3X3_2), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_WIFI_LINK_6000_IPA_1), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_WIFI_LINK_6000_IPA_2), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_WIFI_LINK_6050_2X2_1), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_WIFI_LINK_6050_2X2_2), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_WIFI_LINK_6005_2X2_1), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_WIFI_LINK_6005_2X2_2), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_WIFI_LINK_6230_1), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_WIFI_LINK_6230_2), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_WIFI_LINK_6235), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_WIFI_LINK_6235_2), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_WIFI_LINK_100_1), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_WIFI_LINK_100_2), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_WIFI_LINK_130_1), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_WIFI_LINK_130_2), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_WIFI_LINK_2230_1), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_WIFI_LINK_2230_2), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_WIFI_LINK_2200_1), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_WIFI_LINK_2200_2), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_WIFI_LINK_135_1), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_WIFI_LINK_135_2), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_WIFI_LINK_105_1), }, + + { .id = PCI_ID_CODE(PCI_VENDOR_INTEL, + PCI_PRODUCT_INTEL_WIFI_LINK_105_2), }, + + PCI_COMPAT_EOL }; static int iwn_match(device_t , struct cfdata *, void *); @@ -331,16 +412,8 @@ static int iwn_match(device_t parent, cfdata_t match __unused, void *aux) { struct pci_attach_args *pa = aux; - size_t i; - - if (PCI_VENDOR(pa->pa_id) != PCI_VENDOR_INTEL) - return 0; - for (i = 0; i < __arraycount(iwn_devices); i++) - if (PCI_PRODUCT(pa->pa_id) == iwn_devices[i]) - return 1; - - return 0; + return pci_compatible_match(pa, compat_data); } static void Index: src/sys/dev/pci/if_jme.c diff -u src/sys/dev/pci/if_jme.c:1.49 src/sys/dev/pci/if_jme.c:1.50 --- src/sys/dev/pci/if_jme.c:1.49 Sat Feb 8 07:20:41 2020 +++ src/sys/dev/pci/if_jme.c Sat May 8 00:27:02 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: if_jme.c,v 1.49 2020/02/08 07:20:41 maxv Exp $ */ +/* $NetBSD: if_jme.c,v 1.50 2021/05/08 00:27:02 thorpej Exp $ */ /* * Copyright (c) 2008 Manuel Bouyer. All rights reserved. @@ -58,7 +58,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_jme.c,v 1.49 2020/02/08 07:20:41 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_jme.c,v 1.50 2021/05/08 00:27:02 thorpej Exp $"); #include <sys/param.h> @@ -111,11 +111,6 @@ __KERNEL_RCSID(0, "$NetBSD: if_jme.c,v 1 #include <dev/mii/mii.h> #include <dev/mii/miivar.h> -struct jme_product_desc { - uint32_t jme_product; - const char *jme_desc; -}; - /* number of entries in transmit and receive rings */ #define JME_NBUFS (PAGE_SIZE / sizeof(struct jme_desc)) @@ -222,40 +217,24 @@ static int jme_root_num; CFATTACH_DECL_NEW(jme, sizeof(jme_softc_t), jme_pci_match, jme_pci_attach, NULL, NULL); -static const struct jme_product_desc jme_products[] = { - { PCI_PRODUCT_JMICRON_JMC250, - "JMicron JMC250 Gigabit Ethernet Controller" }, - { PCI_PRODUCT_JMICRON_JMC260, - "JMicron JMC260 Gigabit Ethernet Controller" }, - { 0, NULL }, -}; - -static const struct jme_product_desc *jme_lookup_product(uint32_t); - -static const struct jme_product_desc * -jme_lookup_product(uint32_t id) -{ - const struct jme_product_desc *jp; - - for (jp = jme_products ; jp->jme_desc != NULL; jp++) - if (PCI_PRODUCT(id) == jp->jme_product) - return jp; +static const struct device_compatible_entry compat_data[] = { + { .id = PCI_ID_CODE(PCI_VENDOR_JMICRON, + PCI_PRODUCT_JMICRON_JMC250), + .data = "JMicron JMC250 Gigabit Ethernet Controller" }, + + { .id = PCI_ID_CODE(PCI_VENDOR_JMICRON, + PCI_PRODUCT_JMICRON_JMC260), + .data = "JMicron JMC260 Gigabit Ethernet Controller" }, - return NULL; -} + PCI_COMPAT_EOL +}; static int jme_pci_match(device_t parent, cfdata_t cf, void *aux) { struct pci_attach_args *pa = (struct pci_attach_args *)aux; - if (PCI_VENDOR(pa->pa_id) != PCI_VENDOR_JMICRON) - return 0; - - if (jme_lookup_product(pa->pa_id) != NULL) - return 1; - - return 0; + return pci_compatible_match(pa, compat_data); } static void @@ -263,7 +242,7 @@ jme_pci_attach(device_t parent, device_t { jme_softc_t *sc = device_private(self); struct pci_attach_args * const pa = (struct pci_attach_args *)aux; - const struct jme_product_desc *jp; + const struct device_compatible_entry *dce; struct ifnet * const ifp = &sc->jme_if; struct mii_data * const mii = &sc->jme_mii; bus_space_tag_t iot1, iot2, memt; @@ -282,11 +261,10 @@ jme_pci_attach(device_t parent, device_t callout_init(&sc->jme_tick_ch, 0); callout_setfunc(&sc->jme_tick_ch, jme_ticks, sc); - jp = jme_lookup_product(pa->pa_id); - if (jp == NULL) - panic("jme_pci_attach: impossible"); + dce = pci_compatible_lookup(pa, compat_data); + KASSERT(dce != NULL); - if (jp->jme_product == PCI_PRODUCT_JMICRON_JMC250) + if (PCI_PRODUCT(dce->id) == PCI_PRODUCT_JMICRON_JMC250) sc->jme_flags = JME_FLAG_GIGA; /* @@ -347,7 +325,7 @@ jme_pci_attach(device_t parent, device_t pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG, csr | PCI_COMMAND_MASTER_ENABLE); - aprint_normal_dev(self, "%s\n", jp->jme_desc); + aprint_normal_dev(self, "%s\n", (const char *)dce->data); sc->jme_rev = PCI_REVISION(pa->pa_class); Index: src/sys/dev/pci/if_kse.c diff -u src/sys/dev/pci/if_kse.c:1.56 src/sys/dev/pci/if_kse.c:1.57 --- src/sys/dev/pci/if_kse.c:1.56 Sun Sep 20 23:48:09 2020 +++ src/sys/dev/pci/if_kse.c Sat May 8 00:27:02 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: if_kse.c,v 1.56 2020/09/20 23:48:09 nisimura Exp $ */ +/* $NetBSD: if_kse.c,v 1.57 2021/05/08 00:27:02 thorpej Exp $ */ /*- * Copyright (c) 2006 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_kse.c,v 1.56 2020/09/20 23:48:09 nisimura Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_kse.c,v 1.57 2021/05/08 00:27:02 thorpej Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -353,18 +353,22 @@ static void stat_tick(void *); static void zerostats(struct kse_softc *); #endif +static const struct device_compatible_entry compat_data[] = { + { .id = PCI_ID_CODE(PCI_VENDOR_MICREL, + PCI_PRODUCT_MICREL_KSZ8842) }, + { .id = PCI_ID_CODE(PCI_VENDOR_MICREL, + PCI_PRODUCT_MICREL_KSZ8841) }, + + PCI_COMPAT_EOL +}; + static int kse_match(device_t parent, cfdata_t match, void *aux) { struct pci_attach_args *pa = (struct pci_attach_args *)aux; - if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_MICREL && - (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_MICREL_KSZ8842 || - PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_MICREL_KSZ8841) && - PCI_CLASS(pa->pa_class) == PCI_CLASS_NETWORK) - return 1; - - return 0; + return PCI_CLASS(pa->pa_class) == PCI_CLASS_NETWORK && + pci_compatible_match(pa, compat_data); } static void Index: src/sys/dev/pci/if_malo_pci.c diff -u src/sys/dev/pci/if_malo_pci.c:1.7 src/sys/dev/pci/if_malo_pci.c:1.8 --- src/sys/dev/pci/if_malo_pci.c:1.7 Sun Dec 9 11:14:02 2018 +++ src/sys/dev/pci/if_malo_pci.c Sat May 8 00:27:02 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: if_malo_pci.c,v 1.7 2018/12/09 11:14:02 jdolecek Exp $ */ +/* $NetBSD: if_malo_pci.c,v 1.8 2021/05/08 00:27:02 thorpej Exp $ */ /* $OpenBSD: if_malo_pci.c,v 1.6 2010/08/28 23:19:29 deraadt Exp $ */ /* @@ -22,7 +22,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_malo_pci.c,v 1.7 2018/12/09 11:14:02 jdolecek Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_malo_pci.c,v 1.8 2021/05/08 00:27:02 thorpej Exp $"); #include <sys/param.h> #include <sys/sockio.h> @@ -75,22 +75,23 @@ struct malo_pci_softc { CFATTACH_DECL_NEW(malo_pci, sizeof(struct malo_pci_softc), malo_pci_match, malo_pci_attach, malo_pci_detach, NULL); +static const struct device_compatible_entry compat_data[] = { + { .id = PCI_ID_CODE(PCI_VENDOR_MARVELL, + PCI_PRODUCT_MARVELL_88W8310) }, + { .id = PCI_ID_CODE(PCI_VENDOR_MARVELL, + PCI_PRODUCT_MARVELL_88W8335_1) }, + { .id = PCI_ID_CODE(PCI_VENDOR_MARVELL, + PCI_PRODUCT_MARVELL_88W8335_2) }, + + PCI_COMPAT_EOL +}; + static int malo_pci_match(device_t parent, cfdata_t match, void *aux) { struct pci_attach_args *pa = aux; - if (PCI_VENDOR(pa->pa_id) != PCI_VENDOR_MARVELL) - return (0); - - switch (PCI_PRODUCT(pa->pa_id)) { - case PCI_PRODUCT_MARVELL_88W8310: - case PCI_PRODUCT_MARVELL_88W8335_1: - case PCI_PRODUCT_MARVELL_88W8335_2: - return (1); - } - - return (0); + return pci_compatible_match(pa, compat_data); } static void Index: src/sys/dev/pci/if_msk.c diff -u src/sys/dev/pci/if_msk.c:1.115 src/sys/dev/pci/if_msk.c:1.116 --- src/sys/dev/pci/if_msk.c:1.115 Sat Apr 24 23:36:57 2021 +++ src/sys/dev/pci/if_msk.c Sat May 8 00:27:02 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: if_msk.c,v 1.115 2021/04/24 23:36:57 thorpej Exp $ */ +/* $NetBSD: if_msk.c,v 1.116 2021/05/08 00:27:02 thorpej Exp $ */ /* $OpenBSD: if_msk.c,v 1.79 2009/10/15 17:54:56 deraadt Exp $ */ /* @@ -52,7 +52,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_msk.c,v 1.115 2021/04/24 23:36:57 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_msk.c,v 1.116 2021/05/08 00:27:02 thorpej Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -153,52 +153,93 @@ static int msk_root_num; #define MSK_ADDR_HI(x) ((uint64_t) (x) >> 32) /* supported device vendors */ -static const struct msk_product { - pci_vendor_id_t msk_vendor; - pci_product_id_t msk_product; -} msk_products[] = { - { PCI_VENDOR_DLINK, PCI_PRODUCT_DLINK_DGE550SX }, - { PCI_VENDOR_DLINK, PCI_PRODUCT_DLINK_DGE550T_B1 }, - { PCI_VENDOR_DLINK, PCI_PRODUCT_DLINK_DGE560SX }, - { PCI_VENDOR_DLINK, PCI_PRODUCT_DLINK_DGE560T }, - { PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_YUKONII_8021CU }, - { PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_YUKONII_8021X }, - { PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_YUKONII_8022CU }, - { PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_YUKONII_8022X }, - { PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_YUKON_8035 }, - { PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_YUKON_8036 }, - { PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_YUKON_8038 }, - { PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_YUKON_8039 }, - { PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_YUKON_8040 }, - { PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_YUKON_8040T }, - { PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_YUKON_8042 }, - { PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_YUKON_8048 }, - { PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_YUKON_8050 }, - { PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_YUKON_8052 }, - { PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_YUKON_8053 }, - { PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_YUKON_8055 }, - { PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_YUKON_8055_2 }, - { PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_YUKON_8056 }, - { PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_YUKON_8057 }, - { PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_YUKON_8058 }, - { PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_YUKON_8059 }, - { PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_YUKONII_8061CU }, - { PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_YUKONII_8061X }, - { PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_YUKONII_8062CU }, - { PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_YUKONII_8062X }, - { PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_YUKON_8070 }, - { PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_YUKON_8071 }, - { PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_YUKON_8072 }, - { PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_YUKON_8075 }, - { PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_YUKON_8079 }, - { PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_YUKON_C032 }, - { PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_YUKON_C033 }, - { PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_YUKON_C034 }, - { PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_YUKON_C036 }, - { PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_YUKON_C042 }, - { PCI_VENDOR_SCHNEIDERKOCH, PCI_PRODUCT_SCHNEIDERKOCH_SK_9SXX }, - { PCI_VENDOR_SCHNEIDERKOCH, PCI_PRODUCT_SCHNEIDERKOCH_SK_9E21 }, - { 0, 0 } +static const struct device_compatible_entry compat_data[] = { + { .id = PCI_ID_CODE(PCI_VENDOR_DLINK, + PCI_PRODUCT_DLINK_DGE550SX) }, + { .id = PCI_ID_CODE(PCI_VENDOR_DLINK, + PCI_PRODUCT_DLINK_DGE550T_B1) }, + { .id = PCI_ID_CODE(PCI_VENDOR_DLINK, + PCI_PRODUCT_DLINK_DGE560SX) }, + { .id = PCI_ID_CODE(PCI_VENDOR_DLINK, + PCI_PRODUCT_DLINK_DGE560T) }, + + { .id = PCI_ID_CODE(PCI_VENDOR_MARVELL, + PCI_PRODUCT_MARVELL_YUKONII_8021CU) }, + { .id = PCI_ID_CODE(PCI_VENDOR_MARVELL, + PCI_PRODUCT_MARVELL_YUKONII_8021X) }, + { .id = PCI_ID_CODE(PCI_VENDOR_MARVELL, + PCI_PRODUCT_MARVELL_YUKONII_8022CU) }, + { .id = PCI_ID_CODE(PCI_VENDOR_MARVELL, + PCI_PRODUCT_MARVELL_YUKONII_8022X) }, + { .id = PCI_ID_CODE(PCI_VENDOR_MARVELL, + PCI_PRODUCT_MARVELL_YUKON_8035) }, + { .id = PCI_ID_CODE(PCI_VENDOR_MARVELL, + PCI_PRODUCT_MARVELL_YUKON_8036) }, + { .id = PCI_ID_CODE(PCI_VENDOR_MARVELL, + PCI_PRODUCT_MARVELL_YUKON_8038) }, + { .id = PCI_ID_CODE(PCI_VENDOR_MARVELL, + PCI_PRODUCT_MARVELL_YUKON_8039) }, + { .id = PCI_ID_CODE(PCI_VENDOR_MARVELL, + PCI_PRODUCT_MARVELL_YUKON_8040) }, + { .id = PCI_ID_CODE(PCI_VENDOR_MARVELL, + PCI_PRODUCT_MARVELL_YUKON_8040T) }, + { .id = PCI_ID_CODE(PCI_VENDOR_MARVELL, + PCI_PRODUCT_MARVELL_YUKON_8042) }, + { .id = PCI_ID_CODE(PCI_VENDOR_MARVELL, + PCI_PRODUCT_MARVELL_YUKON_8048) }, + { .id = PCI_ID_CODE(PCI_VENDOR_MARVELL, + PCI_PRODUCT_MARVELL_YUKON_8050) }, + { .id = PCI_ID_CODE(PCI_VENDOR_MARVELL, + PCI_PRODUCT_MARVELL_YUKON_8052) }, + { .id = PCI_ID_CODE(PCI_VENDOR_MARVELL, + PCI_PRODUCT_MARVELL_YUKON_8053) }, + { .id = PCI_ID_CODE(PCI_VENDOR_MARVELL, + PCI_PRODUCT_MARVELL_YUKON_8055) }, + { .id = PCI_ID_CODE(PCI_VENDOR_MARVELL, + PCI_PRODUCT_MARVELL_YUKON_8055_2) }, + { .id = PCI_ID_CODE(PCI_VENDOR_MARVELL, + PCI_PRODUCT_MARVELL_YUKON_8056) }, + { .id = PCI_ID_CODE(PCI_VENDOR_MARVELL, + PCI_PRODUCT_MARVELL_YUKON_8057) }, + { .id = PCI_ID_CODE(PCI_VENDOR_MARVELL, + PCI_PRODUCT_MARVELL_YUKON_8058) }, + { .id = PCI_ID_CODE(PCI_VENDOR_MARVELL, + PCI_PRODUCT_MARVELL_YUKON_8059) }, + { .id = PCI_ID_CODE(PCI_VENDOR_MARVELL, + PCI_PRODUCT_MARVELL_YUKONII_8061CU) }, + { .id = PCI_ID_CODE(PCI_VENDOR_MARVELL, + PCI_PRODUCT_MARVELL_YUKONII_8061X) }, + { .id = PCI_ID_CODE(PCI_VENDOR_MARVELL, + PCI_PRODUCT_MARVELL_YUKONII_8062CU) }, + { .id = PCI_ID_CODE(PCI_VENDOR_MARVELL, + PCI_PRODUCT_MARVELL_YUKONII_8062X) }, + { .id = PCI_ID_CODE(PCI_VENDOR_MARVELL, + PCI_PRODUCT_MARVELL_YUKON_8070) }, + { .id = PCI_ID_CODE(PCI_VENDOR_MARVELL, + PCI_PRODUCT_MARVELL_YUKON_8071) }, + { .id = PCI_ID_CODE(PCI_VENDOR_MARVELL, + PCI_PRODUCT_MARVELL_YUKON_8072) }, + { .id = PCI_ID_CODE(PCI_VENDOR_MARVELL, + PCI_PRODUCT_MARVELL_YUKON_8075) }, + { .id = PCI_ID_CODE(PCI_VENDOR_MARVELL, + PCI_PRODUCT_MARVELL_YUKON_8079) }, + { .id = PCI_ID_CODE(PCI_VENDOR_MARVELL, + PCI_PRODUCT_MARVELL_YUKON_C032) }, + { .id = PCI_ID_CODE(PCI_VENDOR_MARVELL, + PCI_PRODUCT_MARVELL_YUKON_C033) }, + { .id = PCI_ID_CODE(PCI_VENDOR_MARVELL, + PCI_PRODUCT_MARVELL_YUKON_C034) }, + { .id = PCI_ID_CODE(PCI_VENDOR_MARVELL, + PCI_PRODUCT_MARVELL_YUKON_C036) }, + { .id = PCI_ID_CODE(PCI_VENDOR_MARVELL, + PCI_PRODUCT_MARVELL_YUKON_C042) }, + + { .id = PCI_ID_CODE(PCI_VENDOR_SCHNEIDERKOCH, + PCI_PRODUCT_SCHNEIDERKOCH_SK_9SXX) }, + { .id = PCI_ID_CODE(PCI_VENDOR_SCHNEIDERKOCH, + PCI_PRODUCT_SCHNEIDERKOCH_SK_9E21) }, + + PCI_COMPAT_EOL }; static inline uint32_t @@ -865,19 +906,6 @@ msk_update_int_mod(struct sk_softc *sc, sc->sk_int_mod_pending = 0; } -static int -msk_lookup(const struct pci_attach_args *pa) -{ - const struct msk_product *pmsk; - - for ( pmsk = &msk_products[0]; pmsk->msk_vendor != 0; pmsk++) { - if (PCI_VENDOR(pa->pa_id) == pmsk->msk_vendor && - PCI_PRODUCT(pa->pa_id) == pmsk->msk_product) - return 1; - } - return 0; -} - /* * Probe for a SysKonnect GEnesis chip. Check the PCI vendor and device * IDs against our list and return a device name if we find a match. @@ -887,7 +915,7 @@ mskc_probe(device_t parent, cfdata_t mat { struct pci_attach_args *pa = (struct pci_attach_args *)aux; - return msk_lookup(pa); + return pci_compatible_match(pa, compat_data); } /* Index: src/sys/dev/pci/if_mtd_pci.c diff -u src/sys/dev/pci/if_mtd_pci.c:1.21 src/sys/dev/pci/if_mtd_pci.c:1.22 --- src/sys/dev/pci/if_mtd_pci.c:1.21 Sun Dec 9 11:14:02 2018 +++ src/sys/dev/pci/if_mtd_pci.c Sat May 8 00:27:02 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: if_mtd_pci.c,v 1.21 2018/12/09 11:14:02 jdolecek Exp $ */ +/* $NetBSD: if_mtd_pci.c,v 1.22 2021/05/08 00:27:02 thorpej Exp $ */ /*- * Copyright (c) 2002 The NetBSD Foundation, Inc. @@ -37,7 +37,7 @@ /* TODO: Check why in IO space, the MII won't work. Memory mapped works */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_mtd_pci.c,v 1.21 2018/12/09 11:14:02 jdolecek Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_mtd_pci.c,v 1.22 2021/05/08 00:27:02 thorpej Exp $"); #include <sys/param.h> #include <sys/device.h> @@ -57,14 +57,10 @@ __KERNEL_RCSID(0, "$NetBSD: if_mtd_pci.c #define PCI_IO_MAP_REG PCI_BAR(0) #define PCI_MEM_MAP_REG PCI_BAR(1) -struct mtd_pci_device_id { - pci_vendor_id_t vendor; /* PCI vendor ID */ - pci_product_id_t product; /* PCI product ID */ -}; +static const struct device_compatible_entry compat_data[] = { + { .id = PCI_ID_CODE(PCI_VENDOR_MYSON, PCI_PRODUCT_MYSON_MTD803) }, -static struct mtd_pci_device_id mtd_ids[] = { - { PCI_VENDOR_MYSON, PCI_PRODUCT_MYSON_MTD803 }, - { 0, 0 } + PCI_COMPAT_EOL }; static int mtd_pci_match(device_t, cfdata_t, void *); @@ -77,14 +73,8 @@ static int mtd_pci_match(device_t parent, cfdata_t match, void *aux) { struct pci_attach_args *pa = aux; - struct mtd_pci_device_id *id; - for (id = mtd_ids; id->vendor != 0; ++id) { - if (PCI_VENDOR(pa->pa_id) == id->vendor && - PCI_PRODUCT(pa->pa_id) == id->product) - return (1); - } - return (0); + return pci_compatible_match(pa, compat_data); } static void Index: src/sys/dev/pci/if_rge.c diff -u src/sys/dev/pci/if_rge.c:1.18 src/sys/dev/pci/if_rge.c:1.19 --- src/sys/dev/pci/if_rge.c:1.18 Tue Mar 2 07:55:16 2021 +++ src/sys/dev/pci/if_rge.c Sat May 8 00:27:02 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: if_rge.c,v 1.18 2021/03/02 07:55:16 knakahara Exp $ */ +/* $NetBSD: if_rge.c,v 1.19 2021/05/08 00:27:02 thorpej Exp $ */ /* $OpenBSD: if_rge.c,v 1.9 2020/12/12 11:48:53 jan Exp $ */ /* @@ -18,7 +18,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_rge.c,v 1.18 2021/03/02 07:55:16 knakahara Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_rge.c,v 1.19 2021/05/08 00:27:02 thorpej Exp $"); #include <sys/types.h> @@ -164,27 +164,19 @@ static const struct { CFATTACH_DECL_NEW(rge, sizeof(struct rge_softc), rge_match, rge_attach, NULL, NULL); /* Sevan - detach function? */ -static const struct { - pci_vendor_id_t vendor; - pci_product_id_t product; -}rge_devices[] = { - { PCI_VENDOR_REALTEK, PCI_PRODUCT_REALTEK_E3000 }, - { PCI_VENDOR_REALTEK, PCI_PRODUCT_REALTEK_RT8125 }, +static const struct device_compatible_entry compat_data[] = { + { .id = PCI_ID_CODE(PCI_VENDOR_REALTEK, PCI_PRODUCT_REALTEK_E3000) }, + { .id = PCI_ID_CODE(PCI_VENDOR_REALTEK, PCI_PRODUCT_REALTEK_RT8125) }, + + PCI_COMPAT_EOL }; static int rge_match(device_t parent, cfdata_t match, void *aux) { struct pci_attach_args *pa =aux; - int n; - - for (n =0; n < __arraycount(rge_devices); n++) { - if (PCI_VENDOR(pa->pa_id) == rge_devices[n].vendor && - PCI_PRODUCT(pa->pa_id) == rge_devices[n].product) - return 3; - } - return 0; + return pci_compatible_match(pa, compat_data); } void Index: src/sys/dev/pci/if_sk.c diff -u src/sys/dev/pci/if_sk.c:1.107 src/sys/dev/pci/if_sk.c:1.108 --- src/sys/dev/pci/if_sk.c:1.107 Sat Apr 24 23:36:57 2021 +++ src/sys/dev/pci/if_sk.c Sat May 8 00:27:02 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: if_sk.c,v 1.107 2021/04/24 23:36:57 thorpej Exp $ */ +/* $NetBSD: if_sk.c,v 1.108 2021/05/08 00:27:02 thorpej Exp $ */ /*- * Copyright (c) 2003 The NetBSD Foundation, Inc. @@ -115,7 +115,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_sk.c,v 1.107 2021/04/24 23:36:57 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_sk.c,v 1.108 2021/05/08 00:27:02 thorpej Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -225,19 +225,32 @@ static int sk_root_num; /* supported device vendors */ /* PCI_PRODUCT_DLINK_DGE560T_2 might belong in if_msk instead */ -static const struct sk_product { - pci_vendor_id_t sk_vendor; - pci_product_id_t sk_product; -} sk_products[] = { - { PCI_VENDOR_3COM, PCI_PRODUCT_3COM_3C940, }, - { PCI_VENDOR_DLINK, PCI_PRODUCT_DLINK_DGE530T, }, - { PCI_VENDOR_DLINK, PCI_PRODUCT_DLINK_DGE560T_2, }, - { PCI_VENDOR_LINKSYS, PCI_PRODUCT_LINKSYS_EG1064, }, - { PCI_VENDOR_SCHNEIDERKOCH, PCI_PRODUCT_SCHNEIDERKOCH_SKNET_GE, }, - { PCI_VENDOR_SCHNEIDERKOCH, PCI_PRODUCT_SCHNEIDERKOCH_SK9821v2, }, - { PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_SKNET, }, - { PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_BELKIN, }, - { 0, 0, } +static const struct device_compatible_entry compat_data[] = { + { .id = PCI_ID_CODE(PCI_VENDOR_3COM, + PCI_PRODUCT_3COM_3C940) }, + + { .id = PCI_ID_CODE(PCI_VENDOR_DLINK, + PCI_PRODUCT_DLINK_DGE530T) }, + + { .id = PCI_ID_CODE(PCI_VENDOR_DLINK, + PCI_PRODUCT_DLINK_DGE560T_2) }, + + { .id = PCI_ID_CODE(PCI_VENDOR_LINKSYS, + PCI_PRODUCT_LINKSYS_EG1064) }, + + { .id = PCI_ID_CODE(PCI_VENDOR_SCHNEIDERKOCH, + PCI_PRODUCT_SCHNEIDERKOCH_SKNET_GE) }, + + { .id = PCI_ID_CODE(PCI_VENDOR_SCHNEIDERKOCH, + PCI_PRODUCT_SCHNEIDERKOCH_SK9821v2) }, + + { .id = PCI_ID_CODE(PCI_VENDOR_MARVELL, + PCI_PRODUCT_MARVELL_SKNET) }, + + { .id = PCI_ID_CODE(PCI_VENDOR_MARVELL, + PCI_PRODUCT_MARVELL_BELKIN) }, + + PCI_COMPAT_EOL }; #define SK_LINKSYS_EG1032_SUBID 0x00151737 @@ -1108,19 +1121,6 @@ sk_update_int_mod(struct sk_softc *sc) * The structure if the IDs match against our list. */ -static const struct sk_product * -sk_lookup(const struct pci_attach_args *pa) -{ - const struct sk_product *psk; - - for ( psk = &sk_products[0]; psk->sk_vendor != 0; psk++ ) { - if (PCI_VENDOR(pa->pa_id) == psk->sk_vendor && - PCI_PRODUCT(pa->pa_id) == psk->sk_product) - return psk; - } - return NULL; -} - /* * Probe for a SysKonnect GEnesis chip. */ @@ -1129,7 +1129,6 @@ static int skc_probe(device_t parent, cfdata_t match, void *aux) { struct pci_attach_args *pa = (struct pci_attach_args *)aux; - const struct sk_product *psk; pcireg_t subid; subid = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_SUBSYS_ID_REG); @@ -1140,10 +1139,7 @@ skc_probe(device_t parent, cfdata_t matc subid == SK_LINKSYS_EG1032_SUBID) return 1; - if ((psk = sk_lookup(pa))) { - return 1; - } - return 0; + return pci_compatible_match(pa, compat_data); } /* Index: src/sys/dev/pci/if_tlp_pci.c diff -u src/sys/dev/pci/if_tlp_pci.c:1.129 src/sys/dev/pci/if_tlp_pci.c:1.130 --- src/sys/dev/pci/if_tlp_pci.c:1.129 Tue Jul 7 06:27:37 2020 +++ src/sys/dev/pci/if_tlp_pci.c Sat May 8 00:27:02 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: if_tlp_pci.c,v 1.129 2020/07/07 06:27:37 msaitoh Exp $ */ +/* $NetBSD: if_tlp_pci.c,v 1.130 2021/05/08 00:27:02 thorpej Exp $ */ /*- * Copyright (c) 1998, 1999, 2000, 2002 The NetBSD Foundation, Inc. @@ -36,7 +36,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_tlp_pci.c,v 1.129 2020/07/07 06:27:37 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_tlp_pci.c,v 1.130 2021/05/08 00:27:02 thorpej Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -111,69 +111,89 @@ CFATTACH_DECL3_NEW(tlp_pci, sizeof(struc tlp_pci_match, tlp_pci_attach, tlp_pci_detach, NULL, NULL, NULL, DVF_DETACH_SHUTDOWN); -static const struct tulip_pci_product { - uint32_t tpp_vendor; /* PCI vendor ID */ - uint32_t tpp_product; /* PCI product ID */ - tulip_chip_t tpp_chip; /* base Tulip chip type */ -} tlp_pci_products[] = { - { PCI_VENDOR_DEC, PCI_PRODUCT_DEC_21040, - TULIP_CHIP_21040 }, - { PCI_VENDOR_DEC, PCI_PRODUCT_DEC_21041, - TULIP_CHIP_21041 }, - { PCI_VENDOR_DEC, PCI_PRODUCT_DEC_21140, - TULIP_CHIP_21140 }, - { PCI_VENDOR_DEC, PCI_PRODUCT_DEC_21142, - TULIP_CHIP_21142 }, +static const struct device_compatible_entry compat_data[] = { + { .id = PCI_ID_CODE(PCI_VENDOR_DEC, PCI_PRODUCT_DEC_21040), + .value = TULIP_CHIP_21040 }, - { PCI_VENDOR_LITEON, PCI_PRODUCT_LITEON_82C168, - TULIP_CHIP_82C168 }, + { .id = PCI_ID_CODE(PCI_VENDOR_DEC, PCI_PRODUCT_DEC_21041), + .value = TULIP_CHIP_21041 }, + + { .id = PCI_ID_CODE(PCI_VENDOR_DEC, PCI_PRODUCT_DEC_21140), + .value = TULIP_CHIP_21140 }, + + { .id = PCI_ID_CODE(PCI_VENDOR_DEC, PCI_PRODUCT_DEC_21142), + .value = TULIP_CHIP_21142 }, + + + + { .id = PCI_ID_CODE(PCI_VENDOR_LITEON, PCI_PRODUCT_LITEON_82C168), + .value = TULIP_CHIP_82C168 }, /* * Note: This is like a MX98725 with Wake-On-LAN and a * 128-bit multicast hash table. */ - { PCI_VENDOR_LITEON, PCI_PRODUCT_LITEON_82C115, - TULIP_CHIP_82C115 }, + { .id = PCI_ID_CODE(PCI_VENDOR_LITEON, PCI_PRODUCT_LITEON_82C115), + .value = TULIP_CHIP_82C115 }, + + + + { .id = PCI_ID_CODE(PCI_VENDOR_MACRONIX, PCI_PRODUCT_MACRONIX_MX98713), + .value = TULIP_CHIP_MX98713 }, + + { .id = PCI_ID_CODE(PCI_VENDOR_MACRONIX, PCI_PRODUCT_MACRONIX_MX987x5), + .value = TULIP_CHIP_MX98715 }, + + { .id = PCI_ID_CODE(PCI_VENDOR_COMPEX, PCI_PRODUCT_COMPEX_RL100TX), + .value = TULIP_CHIP_MX98713 }, + + + + { .id = PCI_ID_CODE(PCI_VENDOR_WINBOND, PCI_PRODUCT_WINBOND_W89C840F), + .value = TULIP_CHIP_WB89C840F }, + + { .id = PCI_ID_CODE(PCI_VENDOR_COMPEX, PCI_PRODUCT_COMPEX_RL100ATX), + .value = TULIP_CHIP_WB89C840F }, + + + + { .id = PCI_ID_CODE(PCI_VENDOR_DAVICOM, PCI_PRODUCT_DAVICOM_DM9102), + .value = TULIP_CHIP_DM9102 }, + + + + { .id = PCI_ID_CODE(PCI_VENDOR_ADMTEK, PCI_PRODUCT_ADMTEK_AL981), + .value = TULIP_CHIP_AL981 }, - { PCI_VENDOR_MACRONIX, PCI_PRODUCT_MACRONIX_MX98713, - TULIP_CHIP_MX98713 }, - { PCI_VENDOR_MACRONIX, PCI_PRODUCT_MACRONIX_MX987x5, - TULIP_CHIP_MX98715 }, - - { PCI_VENDOR_COMPEX, PCI_PRODUCT_COMPEX_RL100TX, - TULIP_CHIP_MX98713 }, - - { PCI_VENDOR_WINBOND, PCI_PRODUCT_WINBOND_W89C840F, - TULIP_CHIP_WB89C840F }, - { PCI_VENDOR_COMPEX, PCI_PRODUCT_COMPEX_RL100ATX, - TULIP_CHIP_WB89C840F }, - - { PCI_VENDOR_DAVICOM, PCI_PRODUCT_DAVICOM_DM9102, - TULIP_CHIP_DM9102 }, - - { PCI_VENDOR_ADMTEK, PCI_PRODUCT_ADMTEK_AL981, - TULIP_CHIP_AL981 }, - - { PCI_VENDOR_ADMTEK, PCI_PRODUCT_ADMTEK_AN983, - TULIP_CHIP_AN985 }, - { PCI_VENDOR_ADMTEK, PCI_PRODUCT_ADMTEK_ADM9511, - TULIP_CHIP_AN985 }, - { PCI_VENDOR_ADMTEK, PCI_PRODUCT_ADMTEK_ADM9513, - TULIP_CHIP_AN985 }, - { PCI_VENDOR_ACCTON, PCI_PRODUCT_ACCTON_EN2242, - TULIP_CHIP_AN985 }, - - { PCI_VENDOR_3COM, PCI_PRODUCT_3COM_3C910SOHOB, - TULIP_CHIP_AN985 }, + { .id = PCI_ID_CODE(PCI_VENDOR_ADMTEK, PCI_PRODUCT_ADMTEK_AN983), + .value = TULIP_CHIP_AN985 }, - { PCI_VENDOR_ASIX, PCI_PRODUCT_ASIX_AX88140A, - TULIP_CHIP_AX88140 }, + { .id = PCI_ID_CODE(PCI_VENDOR_ADMTEK, PCI_PRODUCT_ADMTEK_ADM9511), + .value = TULIP_CHIP_AN985 }, - { PCI_VENDOR_CONEXANT, PCI_PRODUCT_CONEXANT_LANFINITY, - TULIP_CHIP_RS7112 }, + { .id = PCI_ID_CODE(PCI_VENDOR_ADMTEK, PCI_PRODUCT_ADMTEK_ADM9513), + .value = TULIP_CHIP_AN985 }, - { 0, 0, - TULIP_CHIP_INVALID }, + { .id = PCI_ID_CODE(PCI_VENDOR_ACCTON, PCI_PRODUCT_ACCTON_EN2242), + .value = TULIP_CHIP_AN985 }, + + { .id = PCI_ID_CODE(PCI_VENDOR_3COM, PCI_PRODUCT_3COM_3C910SOHOB), + .value = TULIP_CHIP_AN985 }, + + + + { .id = PCI_ID_CODE(PCI_VENDOR_ASIX, PCI_PRODUCT_ASIX_AX88140A), + .value = TULIP_CHIP_AX88140 }, + + + + { .id = PCI_ID_CODE(PCI_VENDOR_CONEXANT, + PCI_PRODUCT_CONEXANT_LANFINITY), + .value = TULIP_CHIP_RS7112 }, + + + + PCI_COMPAT_EOL }; struct tlp_pci_quirks { @@ -260,25 +280,6 @@ static const struct tlp_pci_quirks tlp_p static int tlp_pci_shared_intr(void *); -static const struct tulip_pci_product * -tlp_pci_lookup(const struct pci_attach_args *pa) -{ - const struct tulip_pci_product *tpp; - - /* Don't match lmc cards */ - if (PCI_VENDOR(pci_conf_read(pa->pa_pc, pa->pa_tag, - PCI_SUBSYS_ID_REG)) == PCI_VENDOR_LMC) - return NULL; - - for (tpp = tlp_pci_products; tpp->tpp_chip != TULIP_CHIP_INVALID; - tpp++) { - if (PCI_VENDOR(pa->pa_id) == tpp->tpp_vendor && - PCI_PRODUCT(pa->pa_id) == tpp->tpp_product) - return tpp; - } - return NULL; -} - static void tlp_pci_get_quirks(struct tulip_pci_softc *psc, const uint8_t *enaddr, const struct tlp_pci_quirks *tpq) @@ -332,9 +333,15 @@ tlp_pci_match(device_t parent, cfdata_t { struct pci_attach_args *pa = aux; - if (tlp_pci_lookup(pa) != NULL) + if (pci_compatible_match(pa, compat_data)) { + /* Don't match lmc cards */ + const pcireg_t subsys = pci_conf_read(pa->pa_pc, pa->pa_tag, + PCI_SUBSYS_ID_REG); + if (PCI_VENDOR(subsys) == PCI_VENDOR_LMC) { + return 0; + } return 10; /* beat if_de.c */ - + } return 0; } @@ -350,7 +357,7 @@ tlp_pci_attach(device_t parent, device_t bus_space_tag_t iot, memt; bus_space_handle_t ioh, memh; int ioh_valid, memh_valid, i, j; - const struct tulip_pci_product *tpp; + const struct device_compatible_entry *dce; prop_data_t ea; uint8_t enaddr[ETHER_ADDR_LEN]; uint32_t val = 0; @@ -366,12 +373,9 @@ tlp_pci_attach(device_t parent, device_t LIST_INIT(&psc->sc_intrslaves); - tpp = tlp_pci_lookup(pa); - if (tpp == NULL) { - printf("\n"); - panic("tlp_pci_attach: impossible"); - } - sc->sc_chip = tpp->tpp_chip; + dce = pci_compatible_lookup(pa, compat_data); + KASSERT(dce != NULL); + sc->sc_chip = (tulip_chip_t)dce->value; /* * By default, Tulip registers are 8 bytes long (4 bytes Index: src/sys/dev/pci/if_vr.c diff -u src/sys/dev/pci/if_vr.c:1.133 src/sys/dev/pci/if_vr.c:1.134 --- src/sys/dev/pci/if_vr.c:1.133 Fri Feb 7 00:04:28 2020 +++ src/sys/dev/pci/if_vr.c Sat May 8 00:27:02 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: if_vr.c,v 1.133 2020/02/07 00:04:28 thorpej Exp $ */ +/* $NetBSD: if_vr.c,v 1.134 2021/05/08 00:27:02 thorpej Exp $ */ /*- * Copyright (c) 1998, 1999 The NetBSD Foundation, Inc. @@ -97,7 +97,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_vr.c,v 1.133 2020/02/07 00:04:28 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_vr.c,v 1.134 2021/05/08 00:27:02 thorpej Exp $"); @@ -140,15 +140,23 @@ __KERNEL_RCSID(0, "$NetBSD: if_vr.c,v 1. /* * Various supported device vendors/types and their names. */ -static const struct vr_type { - pci_vendor_id_t vr_vid; - pci_product_id_t vr_did; -} vr_devs[] = { - { PCI_VENDOR_VIATECH, PCI_PRODUCT_VIATECH_VT3043 }, - { PCI_VENDOR_VIATECH, PCI_PRODUCT_VIATECH_VT6102 }, - { PCI_VENDOR_VIATECH, PCI_PRODUCT_VIATECH_VT6105 }, - { PCI_VENDOR_VIATECH, PCI_PRODUCT_VIATECH_VT6105M }, - { PCI_VENDOR_VIATECH, PCI_PRODUCT_VIATECH_VT86C100A } +static const struct device_compatible_entry compat_data[] = { + { .id = PCI_ID_CODE(PCI_VENDOR_VIATECH, + PCI_PRODUCT_VIATECH_VT3043) }, + + { .id = PCI_ID_CODE(PCI_VENDOR_VIATECH, + PCI_PRODUCT_VIATECH_VT6102) }, + + { .id = PCI_ID_CODE(PCI_VENDOR_VIATECH, + PCI_PRODUCT_VIATECH_VT6105) }, + + { .id = PCI_ID_CODE(PCI_VENDOR_VIATECH, + PCI_PRODUCT_VIATECH_VT6105M) }, + + { .id = PCI_ID_CODE(PCI_VENDOR_VIATECH, + PCI_PRODUCT_VIATECH_VT86C100A) }, + + PCI_COMPAT_EOL }; /* @@ -1433,30 +1441,12 @@ static bool vr_shutdown(device_t, int); CFATTACH_DECL_NEW(vr, sizeof (struct vr_softc), vr_probe, vr_attach, NULL, NULL); -static const struct vr_type * -vr_lookup(struct pci_attach_args *pa) -{ - const struct vr_type *vrt; - int i; - - for (i = 0; i < __arraycount(vr_devs); i++) { - vrt = &vr_devs[i]; - if (PCI_VENDOR(pa->pa_id) == vrt->vr_vid && - PCI_PRODUCT(pa->pa_id) == vrt->vr_did) - return (vrt); - } - return (NULL); -} - static int vr_probe(device_t parent, cfdata_t match, void *aux) { struct pci_attach_args *pa = (struct pci_attach_args *)aux; - if (vr_lookup(pa) != NULL) - return (1); - - return (0); + return pci_compatible_match(pa, compat_data); } /*