Module Name: src Committed By: martin Date: Tue Oct 15 19:33:24 UTC 2019
Modified Files: src/sys/dev/pci [netbsd-9]: pci.c Log Message: Pull up following revision(s) (requested by jmcneill in ticket #331): sys/dev/pci/pci.c: revision 1.155 The PCI Local Bus Specification says that we should probe devices by reading PCI_ID_REG. pci_enumerate_bus was incorrectly reading PCI_BHLC_REG first, which surprisingly has worked for the past 16 years. Unfortunately, this undefined behavior does the wrong thing on Amazon's Annapurna Labs PCIe host controller. To generate a diff of this commit: cvs rdiff -u -r1.154 -r1.154.4.1 src/sys/dev/pci/pci.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/pci.c diff -u src/sys/dev/pci/pci.c:1.154 src/sys/dev/pci/pci.c:1.154.4.1 --- src/sys/dev/pci/pci.c:1.154 Sat Dec 15 05:38:45 2018 +++ src/sys/dev/pci/pci.c Tue Oct 15 19:33:23 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: pci.c,v 1.154 2018/12/15 05:38:45 msaitoh Exp $ */ +/* $NetBSD: pci.c,v 1.154.4.1 2019/10/15 19:33:23 martin Exp $ */ /* * Copyright (c) 1995, 1996, 1997, 1998 @@ -36,7 +36,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pci.c,v 1.154 2018/12/15 05:38:45 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pci.c,v 1.154.4.1 2019/10/15 19:33:23 martin Exp $"); #ifdef _KERNEL_OPT #include "opt_pci.h" @@ -723,10 +723,6 @@ pci_enumerate_bus(struct pci_softc *sc, tag = pci_make_tag(pc, sc->sc_bus, device, 0); - bhlcr = pci_conf_read(pc, tag, PCI_BHLC_REG); - if (PCI_HDRTYPE_TYPE(bhlcr) > 2) - continue; - id = pci_conf_read(pc, tag, PCI_ID_REG); /* Invalid vendor ID value? */ @@ -736,6 +732,10 @@ pci_enumerate_bus(struct pci_softc *sc, if (PCI_VENDOR(id) == 0) continue; + bhlcr = pci_conf_read(pc, tag, PCI_BHLC_REG); + if (PCI_HDRTYPE_TYPE(bhlcr) > 2) + continue; + qd = pci_lookup_quirkdata(PCI_VENDOR(id), PCI_PRODUCT(id)); if (qd != NULL &&