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);
 }
 
 /*

Reply via email to