Index: lib/libpci/pci.3 =================================================================== RCS file: /cvsroot/src/lib/libpci/pci.3,v retrieving revision 1.10 diff -p -r1.10 pci.3 *** lib/libpci/pci.3 16 Dec 2014 13:38:36 -0000 1.10 --- lib/libpci/pci.3 14 Nov 2015 10:28:57 -0000 *************** *** 61,66 **** --- 61,68 ---- .Fn pci_conf_print "int pcifd" "u_int bus" "u_int dev" "u_int func" .Ft int .Fn pci_drvname "int pcifd" "u_int dev" "u_int func" "char *drvname" "size_t len" + .Ft int + .Fn pci_drvnameonbus "int pcifd" "u_int bus" "u_int dev" "u_int func" "char *drvname" "size_t len" .Sh DESCRIPTION The .Nm *************** into *** 151,156 **** --- 153,162 ---- using .Fa len as the buffer length. + .It Fn pci_drvnameonbus + Just like + .Fn pci_drvname + but also allows looking up via PCI bus number. .El .Sh RETURN VALUES The Index: lib/libpci/pci.h =================================================================== RCS file: /cvsroot/src/lib/libpci/pci.h,v retrieving revision 1.6 diff -p -r1.6 pci.h *** lib/libpci/pci.h 21 Sep 2014 14:32:37 -0000 1.6 --- lib/libpci/pci.h 14 Nov 2015 10:28:57 -0000 *************** int pcidev_conf_write(int, u_int, pcireg *** 54,59 **** --- 54,60 ---- /* pci_drvname.c */ int pci_drvname(int, u_int, u_int, char *, size_t); + int pci_drvnameonbus(int, u_int, u_int, u_int, char *, size_t); /* pci_subr.c */ void pci_devinfo(pcireg_t, pcireg_t, int, char *, size_t); Index: lib/libpci/pci_drvname.c =================================================================== RCS file: /cvsroot/src/lib/libpci/pci_drvname.c,v retrieving revision 1.1 diff -p -r1.1 pci_drvname.c *** lib/libpci/pci_drvname.c 25 Jul 2014 01:38:26 -0000 1.1 --- lib/libpci/pci_drvname.c 14 Nov 2015 10:28:57 -0000 *************** __RCSID("$NetBSD: pci_drvname.c,v 1.1 20 *** 47,55 **** --- 47,79 ---- int pci_drvname(int fd, u_int device, u_int func, char *name, size_t len) { + struct pciio_odrvname drvname; + int rv; + + drvname.device = device; + drvname.function = func; + + rv = ioctl(fd, PCI_IOC_ODRVNAME, &drvname); + if (rv == -1) + return -1; + + strlcpy(name, drvname.name, len); + return 0; + } + + /* + * pci_drvnameonbus: + * + * What's the driver name for a PCI device on any PCI bus? + */ + int + pci_drvnameonbus(int fd, u_int bus, u_int device, u_int func, char *name, + size_t len) + { struct pciio_drvname drvname; int rv; + drvname.bus = bus; drvname.device = device; drvname.function = func; Index: lib/libpci/shlib_version =================================================================== RCS file: /cvsroot/src/lib/libpci/shlib_version,v retrieving revision 1.4 diff -p -r1.4 shlib_version *** lib/libpci/shlib_version 25 Jul 2014 01:38:26 -0000 1.4 --- lib/libpci/shlib_version 14 Nov 2015 10:28:57 -0000 *************** *** 2,5 **** # Remember to update distrib/sets/lists/base/shl.* when changing # major=2 ! minor=1 --- 2,5 ---- # Remember to update distrib/sets/lists/base/shl.* when changing # major=2 ! minor=2 Index: distrib/sets/lists/base/shl.mi =================================================================== RCS file: /cvsroot/src/distrib/sets/lists/base/shl.mi,v retrieving revision 1.754 diff -p -r1.754 shl.mi *** distrib/sets/lists/base/shl.mi 7 Nov 2015 16:21:42 -0000 1.754 --- distrib/sets/lists/base/shl.mi 14 Nov 2015 10:28:57 -0000 *************** *** 421,427 **** ./usr/lib/libpcap.so.5.1 base-net-shlib compatfile ./usr/lib/libpci.so base-sys-shlib compatfile ./usr/lib/libpci.so.2 base-sys-shlib compatfile ! ./usr/lib/libpci.so.2.1 base-sys-shlib compatfile ./usr/lib/libperfuse.so base-perfuse-shlib compatfile ./usr/lib/libperfuse.so.0 base-perfuse-shlib compatfile ./usr/lib/libperfuse.so.0.0 base-perfuse-shlib compatfile --- 421,427 ---- ./usr/lib/libpcap.so.5.1 base-net-shlib compatfile ./usr/lib/libpci.so base-sys-shlib compatfile ./usr/lib/libpci.so.2 base-sys-shlib compatfile ! ./usr/lib/libpci.so.2.2 base-sys-shlib compatfile ./usr/lib/libperfuse.so base-perfuse-shlib compatfile ./usr/lib/libperfuse.so.0 base-perfuse-shlib compatfile ./usr/lib/libperfuse.so.0.0 base-perfuse-shlib compatfile Index: distrib/sets/lists/debug/shl.mi =================================================================== RCS file: /cvsroot/src/distrib/sets/lists/debug/shl.mi,v retrieving revision 1.116 diff -p -r1.116 shl.mi *** distrib/sets/lists/debug/shl.mi 9 Nov 2015 11:57:00 -0000 1.116 --- distrib/sets/lists/debug/shl.mi 14 Nov 2015 10:28:57 -0000 *************** *** 147,153 **** ./usr/libdata/debug/usr/lib/libp2k.so.2.0.debug comp-puffs-debug debug,compatfile,rump ./usr/libdata/debug/usr/lib/libpam.so.4.0.debug comp-sys-debug debug,compatfile,pam ./usr/libdata/debug/usr/lib/libpcap.so.5.1.debug comp-net-debug debug,compatfile ! ./usr/libdata/debug/usr/lib/libpci.so.2.1.debug comp-sys-debug debug,compatfile ./usr/libdata/debug/usr/lib/libperfuse.so.0.0.debug comp-perfuse-debug debug,compatfile ./usr/libdata/debug/usr/lib/libposix.so.0.1.debug comp-sys-debug debug,compatfile ./usr/libdata/debug/usr/lib/libppath.so.0.0.debug comp-sys-debug debug,compatfile --- 147,153 ---- ./usr/libdata/debug/usr/lib/libp2k.so.2.0.debug comp-puffs-debug debug,compatfile,rump ./usr/libdata/debug/usr/lib/libpam.so.4.0.debug comp-sys-debug debug,compatfile,pam ./usr/libdata/debug/usr/lib/libpcap.so.5.1.debug comp-net-debug debug,compatfile ! ./usr/libdata/debug/usr/lib/libpci.so.2.2.debug comp-sys-debug debug,compatfile ./usr/libdata/debug/usr/lib/libperfuse.so.0.0.debug comp-perfuse-debug debug,compatfile ./usr/libdata/debug/usr/lib/libposix.so.0.1.debug comp-sys-debug debug,compatfile ./usr/libdata/debug/usr/lib/libppath.so.0.0.debug comp-sys-debug debug,compatfile Index: sys/dev/pci/pci_usrreq.c =================================================================== RCS file: /cvsroot/src/sys/dev/pci/pci_usrreq.c,v retrieving revision 1.29 diff -p -r1.29 pci_usrreq.c *** sys/dev/pci/pci_usrreq.c 24 Aug 2015 23:55:04 -0000 1.29 --- sys/dev/pci/pci_usrreq.c 14 Nov 2015 10:28:57 -0000 *************** pciioctl(dev_t dev, u_long cmd, void *da *** 79,84 **** --- 79,85 ---- struct pci_child *child; struct pciio_bdf_cfgreg *bdfr; struct pciio_businfo *binfo; + struct pciio_odrvname *odname; struct pciio_drvname *dname; pcitag_t tag; *************** pciioctl(dev_t dev, u_long cmd, void *da *** 109,118 **** --- 110,140 ---- binfo->maxdevs = sc->sc_maxndevs; return 0; + case PCI_IOC_ODRVNAME: + odname = data; + if (odname->device >= sc->sc_maxndevs || odname->function > 7) + return EINVAL; + child = &sc->PCI_SC_DEVICESC(odname->device, odname->function); + if (!child->c_dev) + return ENXIO; + strlcpy(odname->name, device_xname(child->c_dev), + sizeof odname->name); + return 0; + case PCI_IOC_DRVNAME: dname = data; + int i; + + for (i = 0; i < pci_cd.cd_ndevs; i++) { + sc = device_lookup_private(&pci_cd, i); + if (sc->sc_bus == dname->bus) + break; /* found the right bus */ + } + if (i == pci_cd.cd_ndevs || sc == NULL) + return ENXIO; if (dname->device >= sc->sc_maxndevs || dname->function > 7) return EINVAL; + child = &sc->PCI_SC_DEVICESC(dname->device, dname->function); if (!child->c_dev) return ENXIO; Index: sys/dev/pci/pciio.h =================================================================== RCS file: /cvsroot/src/sys/dev/pci/pciio.h,v retrieving revision 1.4 diff -p -r1.4 pciio.h *** sys/dev/pci/pciio.h 25 Jul 2014 01:38:26 -0000 1.4 --- sys/dev/pci/pciio.h 14 Nov 2015 10:28:57 -0000 *************** struct pciio_businfo { *** 97,112 **** * pciio_drvname: * * Driver info for a PCI device (autoconfiguration node) instance. - * Must be run on the correct bus. */ #define PCI_IO_DRVNAME_LEN 16 ! struct pciio_drvname { u_int device; /* in: device number */ u_int function; /* in: function number */ char name[PCI_IO_DRVNAME_LEN]; }; #define PCI_IOC_DRVNAME _IOWR('P', 5, struct pciio_drvname) --- 97,119 ---- * pciio_drvname: * * Driver info for a PCI device (autoconfiguration node) instance. */ + /* The old drvname must be run on the correct bus. */ #define PCI_IO_DRVNAME_LEN 16 ! struct pciio_odrvname { u_int device; /* in: device number */ u_int function; /* in: function number */ char name[PCI_IO_DRVNAME_LEN]; }; + #define PCI_IOC_ODRVNAME _IOWR('P', 5, struct pciio_odrvname) + struct pciio_drvname { + u_int bus; /* in: bus number */ + u_int device; /* in: device number */ + u_int function; /* in: function number */ + char name[PCI_IO_DRVNAME_LEN]; + }; #define PCI_IOC_DRVNAME _IOWR('P', 5, struct pciio_drvname)