Index: distrib/sets/lists/base/shl.mi =================================================================== RCS file: /cvsroot/src/distrib/sets/lists/base/shl.mi,v retrieving revision 1.783 diff -p -u -r1.783 shl.mi --- distrib/sets/lists/base/shl.mi 20 Aug 2016 11:34:49 -0000 1.783 +++ distrib/sets/lists/base/shl.mi 24 Aug 2016 06:48:06 -0000 @@ -432,7 +432,7 @@ ./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/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.143 diff -p -u -r1.143 shl.mi --- distrib/sets/lists/debug/shl.mi 20 Aug 2016 11:34:49 -0000 1.143 +++ distrib/sets/lists/debug/shl.mi 24 Aug 2016 06:48:06 -0000 @@ -152,7 +152,7 @@ ./usr/libdata/debug/usr/lib/libpam.so.4.0.debug comp-sys-debug debug,compatfile,pam ./usr/libdata/debug/usr/lib/libpanel.so.1.0.debug comp-sys-debug debug,compatfile ./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/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: lib/libpci/pci.3 =================================================================== RCS file: /cvsroot/src/lib/libpci/pci.3,v retrieving revision 1.12 diff -p -u -r1.12 pci.3 --- lib/libpci/pci.3 23 Jan 2016 07:21:18 -0000 1.12 +++ lib/libpci/pci.3 24 Aug 2016 06:48:06 -0000 @@ -61,6 +61,8 @@ .Fn pci_conf_print "int pcifd" "unsigned int bus" "unsigned int dev" "unsigned int func" .Ft int .Fn pci_drvname "int pcifd" "unsigned int dev" "unsigned 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 @@ -151,6 +153,10 @@ into 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.8 diff -p -u -r1.8 pci.h --- lib/libpci/pci.h 23 Jan 2016 01:26:14 -0000 1.8 +++ lib/libpci/pci.h 24 Aug 2016 06:48:06 -0000 @@ -59,6 +59,8 @@ int pcidev_conf_write(int, unsigned int, /* pci_drvname.c */ int pci_drvname(int, unsigned int, unsigned int, char *, size_t); +int pci_drvnameonbus(int, unsigned int, unsigned int, unsigned 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 -u -r1.1 pci_drvname.c --- lib/libpci/pci_drvname.c 25 Jul 2014 01:38:26 -0000 1.1 +++ lib/libpci/pci_drvname.c 24 Aug 2016 06:48:06 -0000 @@ -60,3 +60,27 @@ pci_drvname(int fd, u_int device, u_int 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_drvnameonbus drvname; + int rv; + + drvname.bus = bus; + drvname.device = device; + drvname.function = func; + + rv = ioctl(fd, PCI_IOC_DRVNAMEONBUS, &drvname); + if (rv == -1) + return -1; + + strlcpy(name, drvname.name, len); + return 0; +} Index: lib/libpci/shlib_version =================================================================== RCS file: /cvsroot/src/lib/libpci/shlib_version,v retrieving revision 1.4 diff -p -u -r1.4 shlib_version --- lib/libpci/shlib_version 25 Jul 2014 01:38:26 -0000 1.4 +++ lib/libpci/shlib_version 24 Aug 2016 06:48:06 -0000 @@ -2,4 +2,4 @@ # Remember to update distrib/sets/lists/base/shl.* when changing # major=2 -minor=1 +minor=2 Index: sys/dev/pci/pci_usrreq.c =================================================================== RCS file: /cvsroot/src/sys/dev/pci/pci_usrreq.c,v retrieving revision 1.29 diff -p -u -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 24 Aug 2016 06:48:06 -0000 @@ -80,6 +80,7 @@ pciioctl(dev_t dev, u_long cmd, void *da struct pciio_bdf_cfgreg *bdfr; struct pciio_businfo *binfo; struct pciio_drvname *dname; + struct pciio_drvnameonbus *dnameonbus; pcitag_t tag; switch (cmd) { @@ -120,6 +121,29 @@ pciioctl(dev_t dev, u_long cmd, void *da sizeof dname->name); return 0; + case PCI_IOC_DRVNAMEONBUS: + dnameonbus = data; + int i; + + for (i = 0; i < pci_cd.cd_ndevs; i++) { + sc = device_lookup_private(&pci_cd, i); + if (sc->sc_bus == dnameonbus->bus) + break; /* found the right bus */ + } + if (i == pci_cd.cd_ndevs || sc == NULL) + return ENXIO; + if (dnameonbus->device >= sc->sc_maxndevs || + dnameonbus->function > 7) + return EINVAL; + + child = &sc->PCI_SC_DEVICESC(dnameonbus->device, + dnameonbus->function); + if (!child->c_dev) + return ENXIO; + strlcpy(dnameonbus->name, device_xname(child->c_dev), + sizeof dnameonbus->name); + return 0; + default: return ENOTTY; } Index: sys/dev/pci/pciio.h =================================================================== RCS file: /cvsroot/src/sys/dev/pci/pciio.h,v retrieving revision 1.4 diff -p -u -r1.4 pciio.h --- sys/dev/pci/pciio.h 25 Jul 2014 01:38:26 -0000 1.4 +++ sys/dev/pci/pciio.h 24 Aug 2016 06:48:06 -0000 @@ -97,17 +97,24 @@ struct pciio_businfo { * pciio_drvname: * * Driver info for a PCI device (autoconfiguration node) instance. - * Must be run on the correct bus. */ +/* The old drvname 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) +struct pciio_drvnameonbus { + 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_DRVNAMEONBUS _IOWR('P', 5, struct pciio_drvnameonbus) + #endif /* _DEV_PCI_PCIIO_H_ */ Index: usr.sbin/pcictl/pcictl.c =================================================================== RCS file: /cvsroot/src/usr.sbin/pcictl/pcictl.c,v retrieving revision 1.21 diff -p -u -r1.21 pcictl.c --- usr.sbin/pcictl/pcictl.c 1 Sep 2014 07:11:19 -0000 1.21 +++ usr.sbin/pcictl/pcictl.c 24 Aug 2016 06:48:06 -0000 @@ -446,7 +446,8 @@ scan_pci_list(u_int bus, u_int dev, u_in } if (print_names) { char drvname[16]; - if (pci_drvname(pcifd, dev, func, drvname, sizeof drvname) == 0) + if (pci_drvnameonbus(pcifd, bus, dev, func, drvname, + sizeof drvname) == 0) printf(" [%s]", drvname); } printf("\n");