Hello community, here is the log from the commit of package biosdevname for openSUSE:Factory checked in at 2012-12-07 14:06:55 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/biosdevname (Old) and /work/SRC/openSUSE:Factory/.biosdevname.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "biosdevname", Maintainer is "[email protected]" Changes: -------- --- /work/SRC/openSUSE:Factory/biosdevname/biosdevname.changes 2012-09-14 12:14:38.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.biosdevname.new/biosdevname.changes 2012-12-07 14:06:59.000000000 +0100 @@ -1,0 +2,8 @@ +Mon Dec 3 13:51:01 UTC 2012 - [email protected] + +- Update to 0.4.1 version: + * Use addslot() to track both embedded and physical index per slot + * Add fixes to ignore NPAR parsing on some cards +- Removed patchs: more-cmdline-args, verify-network-VPD, bug-706505 + fixed on upstream releases bnc#706505 +------------------------------------------------------------------- Old: ---- biosdevname-0.3.8.tar.gz bug-706505 more-cmdline-args verify-network-VPD New: ---- biosdevname-0.4.1.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ biosdevname.spec ++++++ --- /var/tmp/diff_new_pack.enaMkx/_old 2012-12-07 14:07:01.000000000 +0100 +++ /var/tmp/diff_new_pack.enaMkx/_new 2012-12-07 14:07:01.000000000 +0100 @@ -17,7 +17,7 @@ Name: biosdevname -Version: 0.3.8 +Version: 0.4.1 Release: 0 Summary: Udev helper for naming devices per BIOS names License: GPL-2.0 @@ -30,11 +30,8 @@ ExclusiveArch: %{ix86} x86_64 Source0: http://linux.dell.com/files/%{name}/%{name}-%{version}/%{name}-%{version}.tar.gz Source1: setup-biosdevname.sh -Patch1: more-cmdline-args Patch2: ignore-broken-BIOSes Patch3: whitelist-dell -Patch4: verify-network-VPD -Patch5: bug-706505 BuildRoot: %{_tmppath}/%{name}-%{version}-build BuildRequires: pciutils-devel BuildRequires: zlib-devel @@ -57,11 +54,8 @@ %prep %setup -q -%patch1 -p1 %patch2 -p1 %patch3 -p1 -%patch4 -p1 -%patch5 -p1 %build # this is a udev rule, so it needs to live in / rather than /usr ++++++ biosdevname-0.3.8.tar.gz -> biosdevname-0.4.1.tar.gz ++++++ ++++ 4513 lines of diff (skipped) ++++ retrying with extended exclude list diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/biosdevname-0.3.8/ChangeLog new/biosdevname-0.4.1/ChangeLog --- old/biosdevname-0.3.8/ChangeLog 2011-03-09 00:58:08.000000000 +0100 +++ new/biosdevname-0.4.1/ChangeLog 2012-07-05 21:33:22.000000000 +0200 @@ -1,3 +1,7 @@ +* Mon Jul 1 2012 +- Use addslot() to track both embedded and physical index per slot +- Add fixes to ignore NPAR parsing on some cards + * Mon Jul 27 2009 - add SMBIOS naming policy - fix return error check for mmap diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/biosdevname-0.3.8/INSTALL new/biosdevname-0.4.1/INSTALL --- old/biosdevname-0.3.8/INSTALL 2011-03-09 00:58:08.000000000 +0100 +++ new/biosdevname-0.4.1/INSTALL 2012-07-05 21:35:01.000000000 +0200 @@ -1,8 +1,8 @@ Installation Instructions ************************* -Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, -2006 Free Software Foundation, Inc. +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free +Software Foundation, Inc. This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. @@ -10,10 +10,7 @@ Basic Installation ================== -Briefly, the shell commands `./configure; make; make install' should -configure, build, and install this package. The following -more-detailed instructions are generic; see the `README' file for -instructions specific to this package. +These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses @@ -26,9 +23,9 @@ It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves -the results of its tests to speed up reconfiguring. Caching is +the results of its tests to speed up reconfiguring. (Caching is disabled by default to prevent problems with accidental use of stale -cache files. +cache files.) If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail @@ -38,17 +35,20 @@ may remove or edit it. The file `configure.ac' (or `configure.in') is used to create -`configure' by a program called `autoconf'. You need `configure.ac' if -you want to change it or regenerate `configure' using a newer version -of `autoconf'. +`configure' by a program called `autoconf'. You only need +`configure.ac' if you want to change it or regenerate `configure' using +a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type - `./configure' to configure the package for your system. + `./configure' to configure the package for your system. If you're + using `csh' on an old version of System V, you might need to type + `sh ./configure' instead to prevent `csh' from trying to execute + `configure' itself. - Running `configure' might take a while. While running, it prints - some messages telling which features it is checking for. + Running `configure' takes awhile. While running, it prints some + messages telling which features it is checking for. 2. Type `make' to compile the package. @@ -78,7 +78,7 @@ by setting variables in the command line or in the environment. Here is an example: - ./configure CC=c99 CFLAGS=-g LIBS=-lposix + ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix *Note Defining Variables::, for more details. @@ -87,15 +87,17 @@ You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their -own directory. To do this, you can use GNU `make'. `cd' to the +own directory. To do this, you must use a version of `make' that +supports the `VPATH' variable, such as GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. - With a non-GNU `make', it is safer to compile the package for one -architecture at a time in the source code directory. After you have -installed the package for one architecture, use `make distclean' before -reconfiguring for another architecture. + If you have to use a `make' that does not support the `VPATH' +variable, you have to compile the package for one architecture at a +time in the source code directory. After you have installed the +package for one architecture, use `make distclean' before reconfiguring +for another architecture. Installation Names ================== @@ -188,12 +190,12 @@ ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is -overridden in the site shell script). +overridden in the site shell script). Here is a another example: -Unfortunately, this technique does not work for `CONFIG_SHELL' due to -an Autoconf bug. Until the bug is fixed you can use this workaround: + /bin/bash ./configure CONFIG_SHELL=/bin/bash - CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash +Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent +configuration-related scripts to be executed by `/bin/bash'. `configure' Invocation ====================== diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/biosdevname-0.3.8/biosdevname.1 new/biosdevname-0.4.1/biosdevname.1 --- old/biosdevname-0.3.8/biosdevname.1 2011-03-15 19:50:55.000000000 +0100 +++ new/biosdevname-0.4.1/biosdevname.1 2012-06-14 21:38:30.000000000 +0200 @@ -35,6 +35,13 @@ .TP .B \-\-prefix \fI[string] string use for embedded NICs in the physical policy (default=em) +.TP +.B \-\-nopirq +Do not use $PIR table for mapping PCI device to slot. Some BIOS have +incorrect values. +.TP +.B \-\-smbios \fI[x.y] +Require minimum SMBIOS version x.y .SH POLICIES .br The @@ -47,10 +54,10 @@ .B physical policy uses the following scheme: .TP -em<port> +em<port>[_<virtual instance>] for embedded NICs .TP -pci<slot>#<port>_<virtual instance> +p<slot>p<port>[_<virtual instance>] for cards in PCI slots .br .TP diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/biosdevname-0.3.8/biosdevname.spec.fedora new/biosdevname-0.4.1/biosdevname.spec.fedora --- old/biosdevname-0.3.8/biosdevname.spec.fedora 2011-03-16 18:44:09.000000000 +0100 +++ new/biosdevname-0.4.1/biosdevname.spec.fedora 2012-07-05 21:35:26.000000000 +0200 @@ -1,5 +1,5 @@ Name: biosdevname -Version: 0.3.8 +Version: 0.4.1 Release: 1%{?dist} Summary: Udev helper for naming devices per BIOS names @@ -9,12 +9,15 @@ # SMBIOS only exists on these arches. It's also likely that other # arches don't expect the PCI bus to be sorted breadth-first, or of # so, there haven't been any comments about that on LKML. -ExclusiveArch: %{ix86} x86_64 ia64 +ExclusiveArch: %{ix86} x86_64 Source0: http://linux.dell.com/files/%{name}/permalink/%{name}-%{version}.tar.gz BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX) BuildRequires: pciutils-devel, zlib-devel # to figure out how to name the rules file BuildRequires: udev +#To generate the configure script +BuildRequires: autoconf +BuildRequires: automake # for ownership of /etc/udev/rules.d Requires: udev @@ -29,6 +32,10 @@ %setup -q %build +#If configure script doesn't exist generate it with autogen script +[ -e ./configure ] || ./autogen.sh --no-configure + + # this is a udev rule, so it needs to live in / rather than /usr %configure --disable-rpath --prefix=/ --sbindir=/sbin make %{?_smp_mflags} @@ -51,6 +58,21 @@ %changelog +* Tue Oct 4 2011 Praveen K Paladugu <[email protected]> - 0.3.11-1 +- Fix man page for PCI slot naming +- Fix clearing of buffer for NPAR/SRIOV naming +- Add --nopirq and --smbios options to manpage. +- Verify length of VPD on network device +- Close file handle on sysfs read +- Fix naming policy for NPAR devices. + Match each PCI device to its VPD 'physical' device to get correct index +- Exclude building on ia64 arch +- Add support functions for determining PCIE slot +- Scan full path to parent when getting PCIE slot +- Fix NPAR naming for add-in cards +- Don't display _vf suffix on NPAR devices with single function +- Fix PCIe/PIRQ slot mapping + * Thu Feb 17 2011 Matt Domsch <[email protected]> - 0.3.7-1 - drop dump_pirq, suggest use biosdecode instead - don't use '#' in names, use 'p' instead, by popular demand diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/biosdevname-0.3.8/biosdevname.spec.fedora.in new/biosdevname-0.4.1/biosdevname.spec.fedora.in --- old/biosdevname-0.3.8/biosdevname.spec.fedora.in 2011-03-09 00:58:08.000000000 +0100 +++ new/biosdevname-0.4.1/biosdevname.spec.fedora.in 2012-06-14 21:38:30.000000000 +0200 @@ -9,12 +9,15 @@ # SMBIOS only exists on these arches. It's also likely that other # arches don't expect the PCI bus to be sorted breadth-first, or of # so, there haven't been any comments about that on LKML. -ExclusiveArch: %{ix86} x86_64 ia64 +ExclusiveArch: %{ix86} x86_64 Source0: http://linux.dell.com/files/%{name}/permalink/%{name}-%{version}.tar.gz BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX) BuildRequires: pciutils-devel, zlib-devel # to figure out how to name the rules file BuildRequires: udev +#To generate the configure script +BuildRequires: autoconf +BuildRequires: automake # for ownership of /etc/udev/rules.d Requires: udev @@ -29,6 +32,10 @@ %setup -q %build +#If configure script doesn't exist generate it with autogen script +[ -e ./configure ] || ./autogen.sh --no-configure + + # this is a udev rule, so it needs to live in / rather than /usr %configure --disable-rpath --prefix=/ --sbindir=/sbin make %{?_smp_mflags} @@ -51,6 +58,21 @@ %changelog +* Tue Oct 4 2011 Praveen K Paladugu <[email protected]> - 0.3.11-1 +- Fix man page for PCI slot naming +- Fix clearing of buffer for NPAR/SRIOV naming +- Add --nopirq and --smbios options to manpage. +- Verify length of VPD on network device +- Close file handle on sysfs read +- Fix naming policy for NPAR devices. + Match each PCI device to its VPD 'physical' device to get correct index +- Exclude building on ia64 arch +- Add support functions for determining PCIE slot +- Scan full path to parent when getting PCIE slot +- Fix NPAR naming for add-in cards +- Don't display _vf suffix on NPAR devices with single function +- Fix PCIe/PIRQ slot mapping + * Thu Feb 17 2011 Matt Domsch <[email protected]> - 0.3.7-1 - drop dump_pirq, suggest use biosdecode instead - don't use '#' in names, use 'p' instead, by popular demand diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/biosdevname-0.3.8/biosdevname.spec.suse new/biosdevname-0.4.1/biosdevname.spec.suse --- old/biosdevname-0.3.8/biosdevname.spec.suse 2011-03-16 18:44:09.000000000 +0100 +++ new/biosdevname-0.4.1/biosdevname.spec.suse 2012-07-05 21:35:26.000000000 +0200 @@ -1,5 +1,5 @@ Name: biosdevname -Version: 0.3.8 +Version: 0.4.1 Release: 1%{?dist} Summary: Udev helper for naming devices per BIOS names @@ -9,7 +9,7 @@ # SMBIOS only exists on these arches. It's also likely that other # arches don't expect the PCI bus to be sorted breadth-first, or of # so, there haven't been any comments about that on LKML. -ExclusiveArch: %{ix86} x86_64 ia64 +ExclusiveArch: %{ix86} x86_64 Source0: http://linux.dell.com/files/%{name}/permalink/%{name}-%{version}.tar.gz BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX) BuildRequires: pciutils-devel, zlib-devel diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/biosdevname-0.3.8/biosdevname.spec.suse.in new/biosdevname-0.4.1/biosdevname.spec.suse.in --- old/biosdevname-0.3.8/biosdevname.spec.suse.in 2011-03-09 00:58:08.000000000 +0100 +++ new/biosdevname-0.4.1/biosdevname.spec.suse.in 2012-06-14 21:37:18.000000000 +0200 @@ -9,7 +9,7 @@ # SMBIOS only exists on these arches. It's also likely that other # arches don't expect the PCI bus to be sorted breadth-first, or of # so, there haven't been any comments about that on LKML. -ExclusiveArch: %{ix86} x86_64 ia64 +ExclusiveArch: %{ix86} x86_64 Source0: http://linux.dell.com/files/%{name}/permalink/%{name}-%{version}.tar.gz BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX) BuildRequires: pciutils-devel, zlib-devel diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/biosdevname-0.3.8/configure.ac new/biosdevname-0.4.1/configure.ac --- old/biosdevname-0.3.8/configure.ac 2011-03-09 00:58:33.000000000 +0100 +++ new/biosdevname-0.4.1/configure.ac 2012-07-05 21:31:25.000000000 +0200 @@ -3,7 +3,7 @@ # vim:tw=0:ts=8:sw=8:et AC_PREREQ(2.59) -AC_INIT([biosdevname],[0.3.8],[[email protected]]) +AC_INIT([biosdevname],[0.4.1],[[email protected]]) AC_LANG([C]) AC_USE_SYSTEM_EXTENSIONS AC_CONFIG_SRCDIR([src/read_proc.c]) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/biosdevname-0.3.8/missing new/biosdevname-0.4.1/missing --- old/biosdevname-0.3.8/missing 2011-03-09 00:58:08.000000000 +0100 +++ new/biosdevname-0.4.1/missing 2012-07-05 21:35:01.000000000 +0200 @@ -1,9 +1,9 @@ #! /bin/sh # Common stub for a few missing GNU programs while installing. -scriptversion=2006-05-10.23 +scriptversion=2005-06-08.21 -# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006 +# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005 # Free Software Foundation, Inc. # Originally by Fran,cois Pinard <[email protected]>, 1996. @@ -33,8 +33,6 @@ fi run=: -sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' -sed_minuso='s/.* -o \([^ ]*\).*/\1/p' # In the cases where this matters, `missing' is being run in the # srcdir already. @@ -46,7 +44,7 @@ msg="missing on your system" -case $1 in +case "$1" in --run) # Try to run requested program, and just exit if it succeeds. run= @@ -79,7 +77,6 @@ aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' - autom4te touch the output file, or create a stub one automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c @@ -109,7 +106,7 @@ # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). -case $1 in +case "$1" in lex|yacc) # Not GNU programs, they don't have --version. ;; @@ -138,7 +135,7 @@ # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. -case $1 in +case "$1" in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if @@ -167,7 +164,7 @@ test -z "$files" && files="config.h" touch_files= for f in $files; do - case $f in + case "$f" in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; @@ -195,8 +192,8 @@ You can get \`$1' as part of \`Autoconf' from any GNU archive site." - file=`echo "$*" | sed -n "$sed_output"` - test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'` + test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'` if test -f "$file"; then touch $file else @@ -217,25 +214,25 @@ in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h - if test $# -ne 1; then + if [ $# -ne 1 ]; then eval LASTARG="\${$#}" - case $LASTARG in + case "$LASTARG" in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` - if test -f "$SRCFILE"; then + if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` - if test -f "$SRCFILE"; then + if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.h fi ;; esac fi - if test ! -f y.tab.h; then + if [ ! -f y.tab.h ]; then echo >y.tab.h fi - if test ! -f y.tab.c; then + if [ ! -f y.tab.c ]; then echo 'main() { return 0; }' >y.tab.c fi ;; @@ -247,18 +244,18 @@ in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c - if test $# -ne 1; then + if [ $# -ne 1 ]; then eval LASTARG="\${$#}" - case $LASTARG in + case "$LASTARG" in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` - if test -f "$SRCFILE"; then + if [ -f "$SRCFILE" ]; then cp "$SRCFILE" lex.yy.c fi ;; esac fi - if test ! -f lex.yy.c; then + if [ ! -f lex.yy.c ]; then echo 'main() { return 0; }' >lex.yy.c fi ;; @@ -270,9 +267,11 @@ \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." - file=`echo "$*" | sed -n "$sed_output"` - test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` - if test -f "$file"; then + file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` + if test -z "$file"; then + file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` + fi + if [ -f "$file" ]; then touch $file else test -z "$file" || exec >$file @@ -290,17 +289,11 @@ DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... - file=`echo "$*" | sed -n "$sed_output"` - test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` - file=`sed -n ' - /^@setfilename/{ - s/.* \([^ ]*\) *$/\1/ - p - q - }' $infile` + file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi @@ -324,13 +317,13 @@ fi firstarg="$1" if shift; then - case $firstarg in + case "$firstarg" in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" "$@" && exit 0 ;; esac - case $firstarg in + case "$firstarg" in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" "$@" && exit 0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/biosdevname-0.3.8/src/bios_dev_name.c new/biosdevname-0.4.1/src/bios_dev_name.c --- old/biosdevname-0.3.8/src/bios_dev_name.c 2011-03-09 00:58:08.000000000 +0100 +++ new/biosdevname-0.4.1/src/bios_dev_name.c 2012-06-14 21:38:30.000000000 +0200 @@ -14,6 +14,10 @@ #include "bios_dev_name.h" static struct bios_dev_name_opts opts; +int nopirq; +int smver_mjr; +int smver_mnr; +int is_valid_smbios = 0; static void usage(void) { @@ -23,6 +27,8 @@ fprintf(stderr, " -d or --debug enable debugging\n"); fprintf(stderr, " --policy [physical | all_ethN ]\n"); fprintf(stderr, " --prefix [string] string use for embedded NICs (default='em')\n"); + fprintf(stderr, " --smbios [x.y] Require SMBIOS x.y or greater\n"); + fprintf(stderr, " --nopirq Don't use $PIR table for slot numbers\n"); fprintf(stderr, " Example: biosdevname -i eth0\n"); fprintf(stderr, " returns: em1\n"); fprintf(stderr, " when eth0 is an embedded NIC with label '1' on the chassis.\n"); @@ -55,6 +61,8 @@ {"interface", no_argument, 0, 'i'}, {"policy", required_argument, 0, 'p'}, {"prefix", required_argument, 0, 'P'}, + {"nopirq", no_argument, 0, 'x'}, + {"smbios", required_argument, 0, 's'}, {0, 0, 0, 0} }; c = getopt_long(argc, argv, @@ -75,6 +83,12 @@ case 'P': opts.prefix = optarg; break; + case 's': + sscanf(optarg, "%u.%u", &smver_mjr, &smver_mnr); + break; + case 'x': + nopirq = 1; + break; default: usage(); exit(1); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/biosdevname-0.3.8/src/bios_dev_name.h new/biosdevname-0.4.1/src/bios_dev_name.h --- old/biosdevname-0.3.8/src/bios_dev_name.h 2011-03-09 00:58:08.000000000 +0100 +++ new/biosdevname-0.4.1/src/bios_dev_name.h 2012-06-14 21:38:30.000000000 +0200 @@ -13,8 +13,6 @@ int sortroutine; int namingpolicy; const char *prefix; - unsigned int verbose:1; - unsigned int show_all:1; unsigned int debug:1; unsigned int interface:1; }; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/biosdevname-0.3.8/src/bios_device.c new/biosdevname-0.4.1/src/bios_device.c --- old/biosdevname-0.3.8/src/bios_device.c 2011-03-09 00:58:08.000000000 +0100 +++ new/biosdevname-0.4.1/src/bios_device.c 2012-06-19 23:42:38.000000000 +0200 @@ -153,6 +153,11 @@ else if (a->physical_slot > b->physical_slot) return 1; } + /* Check if PCI devices are same, sort by ifindex */ + if (a == b) { + if (x->netdev->ifindex < y->netdev->ifindex) return -1; + if (x->netdev->ifindex > y->netdev->ifindex) return 1; + } return sort_pci(x, y); } @@ -207,6 +212,32 @@ list_splice(&sorted_devices, &state->bios_devices); } +static void match_pci_and_eth_devs(struct libbiosdevname_state *state) +{ + struct pci_device *p; + struct bios_device *b; + struct network_device *n; + + list_for_each_entry(n, &state->network_devices, node) { + p = find_dev_by_pci_name(state, n->drvinfo.bus_info); + if (!p) + continue; + + b = malloc(sizeof(*b)); + if (!b) + continue; + memset(b, 0, sizeof(*b)); + INIT_LIST_HEAD(&b->node); + b->pcidev = p; + b->netdev = n; + b->slot_num = -1; + b->port_num = -1; + claim_netdev(b->netdev); + list_add(&b->node, &state->bios_devices); + } +} + + static void match_eth_and_pci_devs(struct libbiosdevname_state *state) { struct pci_device *p; @@ -230,6 +261,8 @@ INIT_LIST_HEAD(&b->node); b->pcidev = p; b->netdev = n; + b->slot_num = -1; + b->port_num = -1; claim_netdev(b->netdev); list_add(&b->node, &state->bios_devices); } @@ -253,6 +286,8 @@ memset(b, 0, sizeof(*b)); INIT_LIST_HEAD(&b->node); b->netdev = n; + b->slot_num = -1; + b->port_num = -1; list_add(&b->node, &state->bios_devices); } } @@ -260,7 +295,7 @@ static void match_all(struct libbiosdevname_state *state) { - match_eth_and_pci_devs(state); + match_pci_and_eth_devs(state); match_unknown_eths(state); } @@ -273,6 +308,7 @@ INIT_LIST_HEAD(&state->bios_devices); INIT_LIST_HEAD(&state->pci_devices); INIT_LIST_HEAD(&state->network_devices); + INIT_LIST_HEAD(&state->slots); state->pacc = NULL; state->pirq_table = NULL; return state; @@ -319,6 +355,26 @@ } } +extern int addslot(struct libbiosdevname_state *state, int slot); + +/* Fix for RHBZ 816536/757743/756164/: Cards with same PCI but multiple ports + * chelsio, mellanox */ +static void check_ports(struct libbiosdevname_state *state) +{ + struct pci_device *dev; + struct bios_device *a; + + list_for_each_entry(a, &state->bios_devices, node) { + dev = a->pcidev; + if (dev == NULL || dev->is_sriov_virtual_function || dev->vpd_port != INT_MAX) + continue; + if (dev->physical_slot != PHYSICAL_SLOT_UNKNOWN) { + a->slot_num = dev->physical_slot; + a->port_num = addslot(state, 0x1000 + dev->physical_slot); + } + } +} + void * setup_bios_devices(int namingpolicy, const char *prefix) { int rc=1; @@ -334,6 +390,7 @@ get_eths(state); match_all(state); sort_device_list(state); + check_ports(state); rc = assign_bios_network_names(state, namingpolicy, prefix); if (rc) goto out; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/biosdevname-0.3.8/src/bios_device.h new/biosdevname-0.4.1/src/bios_device.h --- old/biosdevname-0.3.8/src/bios_device.h 2011-03-09 00:58:08.000000000 +0100 +++ new/biosdevname-0.4.1/src/bios_device.h 2012-06-19 23:42:38.000000000 +0200 @@ -19,6 +19,9 @@ struct pci_device *pcidev; char *bios_name; int duplicate; + + int slot_num; + int port_num; }; static inline int is_pci(const struct bios_device *dev) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/biosdevname-0.3.8/src/dmidecode/dmidecode.c new/biosdevname-0.4.1/src/dmidecode/dmidecode.c --- old/biosdevname-0.3.8/src/dmidecode/dmidecode.c 2011-03-09 00:58:08.000000000 +0100 +++ new/biosdevname-0.4.1/src/dmidecode/dmidecode.c 2012-06-19 23:42:38.000000000 +0200 @@ -40,6 +40,8 @@ #include "../pci.h" #include "../naming_policy.h" +extern int smver_mjr, smver_mnr, is_valid_smbios; + static const char *bad_index = "<BAD INDEX>"; /* @@ -176,12 +178,33 @@ h->data=data; } +static int isvalidsmbios(int mjr, int mnr) +{ + if (!smver_mjr && !smver_mnr) { + is_valid_smbios = 1; + return 1; + } + if (mjr > smver_mjr) { + is_valid_smbios = 1; + return 1; + } + if ((mjr == smver_mjr) && (mnr >= smver_mnr)) { + is_valid_smbios = 1; + return 1; + } + return 0; +} + static void dmi_table(u32 base, u16 len, u16 num, u16 ver, const char *devmem, const struct libbiosdevname_state *state) { u8 *buf; u8 *data; int i=0; + /* Verify SMBIOS version */ + if (!isvalidsmbios(ver >> 8, ver & 0xFF)) { + return; + } if((buf=mem_chunk(base, len, devmem))==NULL) { #ifndef USE_MMAP diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/biosdevname-0.3.8/src/eths.c new/biosdevname-0.4.1/src/eths.c --- old/biosdevname-0.3.8/src/eths.c 2011-03-09 00:58:08.000000000 +0100 +++ new/biosdevname-0.4.1/src/eths.c 2012-06-14 21:38:30.000000000 +0200 @@ -34,6 +34,29 @@ return (buf); } +static int eths_get_ifindex(const char *devname, int *ifindex) +{ + int fd, err; + struct ifreq ifr; + + memset(&ifr, 0, sizeof(ifr)); + strncpy(ifr.ifr_name, devname, sizeof(ifr.ifr_name)); + + /* Open control socket. */ + fd = socket(AF_INET, SOCK_DGRAM, 0); + if (fd < 0) { + perror("Cannot get control socket"); + return 1; + } + + err = ioctl(fd, SIOCGIFINDEX, &ifr); + if (!err) { + *ifindex = ifr.ifr_ifindex; + } + close(fd); + return err; +} + static int eths_get_hwaddr(const char *devname, unsigned char *buf, int size, int *type) { int fd, err; @@ -123,6 +146,7 @@ static void fill_eth_dev(struct network_device *dev) { int rc; + eths_get_ifindex(dev->kernel_name, &dev->ifindex); eths_get_hwaddr(dev->kernel_name, dev->dev_addr, sizeof(dev->dev_addr), &dev->arphrd_type); eths_get_permaddr(dev->kernel_name, dev->perm_addr, sizeof(dev->perm_addr)); rc = eths_get_info(dev->kernel_name, &dev->drvinfo); @@ -167,6 +191,7 @@ if (!zero_mac(dev->perm_addr)) s += snprintf(s, size-(s-buf), "Permanent MAC: %s\n", pr_ether(buffer, sizeof(buffer), dev->perm_addr)); s += snprintf(s, size-(s-buf), "Assigned MAC : %s\n", pr_ether(buffer, sizeof(buffer), dev->dev_addr)); + s += snprintf(s, size-(s-buf), "ifIndex: %d\n", dev->ifindex); if (drvinfo_valid(dev)) { s += snprintf(s, size-(s-buf), "Driver: %s\n", dev->drvinfo.driver); s += snprintf(s, size-(s-buf), "Driver version: %s\n", dev->drvinfo.version); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/biosdevname-0.3.8/src/eths.h new/biosdevname-0.4.1/src/eths.h --- old/biosdevname-0.3.8/src/eths.h 2011-03-09 00:58:08.000000000 +0100 +++ new/biosdevname-0.4.1/src/eths.h 2012-06-14 21:38:30.000000000 +0200 @@ -26,6 +26,7 @@ int drvinfo_valid; int arphrd_type; /* e.g. ARPHDR_ETHER */ int hardware_claimed; /* true when recognized as PCI or PCMCIA and added to list of bios_devices */ + int ifindex; }; extern void get_eths(struct libbiosdevname_state *state); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/biosdevname-0.3.8/src/naming_policy.c new/biosdevname-0.4.1/src/naming_policy.c --- old/biosdevname-0.3.8/src/naming_policy.c 2011-03-15 19:41:42.000000000 +0100 +++ new/biosdevname-0.4.1/src/naming_policy.c 2012-06-19 23:42:38.000000000 +0200 @@ -37,38 +37,43 @@ char interface[IFNAMSIZ]; unsigned int portnum=0; int known=0; - - memset(buffer, 0, sizeof(buffer)); - memset(location, 0, sizeof(location)); - memset(port, 0, sizeof(port)); - memset(interface, 0, sizeof(interface)); + struct pci_device *vf; list_for_each_entry(dev, &state->bios_devices, node) { known = 0; + memset(buffer, 0, sizeof(buffer)); + memset(location, 0, sizeof(location)); + memset(port, 0, sizeof(port)); + memset(interface, 0, sizeof(interface)); + if (is_pci(dev)) { + vf = dev->pcidev; if (dev->pcidev->physical_slot == 0) { /* embedded devices only */ - if (dev->pcidev->uses_sysfs & HAS_SYSFS_INDEX) { - portnum = dev->pcidev->sysfs_index; - snprintf(location, sizeof(location), "%s%u", prefix, portnum); - known=1; - } - else if (dev->pcidev->uses_smbios & HAS_SMBIOS_INSTANCE && is_pci_smbios_type_ethernet(dev->pcidev)) { - portnum = dev->pcidev->smbios_instance; - snprintf(location, sizeof(location), "%s%u", prefix, portnum); - known=1; - } - else if (dev->pcidev->embedded_index_valid) { - portnum = dev->pcidev->embedded_index; + portnum = INT_MAX; + /* Use master VPD device if available */ + if (vf->vpd_pf) + vf = vf->vpd_pf; + if (vf->pf) + vf = vf->pf; + if (vf->uses_sysfs & HAS_SYSFS_INDEX) + portnum = vf->sysfs_index; + else if (vf->uses_smbios & HAS_SMBIOS_INSTANCE && is_pci_smbios_type_ethernet(vf)) + portnum = vf->smbios_instance; + else if (dev->port_num != -1) + portnum = dev->port_num; + if (portnum != INT_MAX) { snprintf(location, sizeof(location), "%s%u", prefix, portnum); known=1; } } else if (dev->pcidev->physical_slot < PHYSICAL_SLOT_UNKNOWN) { snprintf(location, sizeof(location), "p%u", dev->pcidev->physical_slot); - if (!dev->pcidev->is_sriov_virtual_function) - portnum = dev->pcidev->index_in_slot; - else if (dev->pcidev->vpd_port < INT_MAX) + if (dev->pcidev->vpd_port < INT_MAX) portnum = dev->pcidev->vpd_port; + else if (dev->port_num != -1) + portnum = dev->port_num; + else if (!dev->pcidev->is_sriov_virtual_function) + portnum = dev->pcidev->index_in_slot; else portnum = dev->pcidev->pf->index_in_slot; snprintf(port, sizeof(port), "p%u", portnum); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/biosdevname-0.3.8/src/pci.c new/biosdevname-0.4.1/src/pci.c --- old/biosdevname-0.3.8/src/pci.c 2011-03-09 00:58:08.000000000 +0100 +++ new/biosdevname-0.4.1/src/pci.c 2012-06-19 23:42:38.000000000 +0200 @@ -21,6 +21,12 @@ #include "dmidecode/dmidecode.h" #include "pirq.h" +extern int is_valid_smbios; + +#ifndef PCI_CB_CAPABILITY_LIST +#define PCI_CB_CAPABILITY_LIST 0x14 +#endif + /* Borrowed from kernel vpd code */ #define PCI_VPD_LRDT 0x80 #define PCI_VPD_SRDT_END 0x78 @@ -45,6 +51,32 @@ return info_field[2]; } +static int pci_vpd_size(struct pci_device *pdev, int fd) +{ + uint8_t buf[3], tag; + int off; + + if (!is_pci_network(pdev)) + return 0; + off = 0; + for(;;) { + if (pread(fd, buf, 1, off) != 1) + break; + if (buf[0] & PCI_VPD_LRDT) { + tag = buf[0]; + if (pread(fd, buf, 3, off) != 3) + break; + off += PCI_VPD_LRDT_TAG_SIZE + pci_vpd_lrdt_size(buf); + } else { + tag = buf[0] & ~PCI_VPD_SRDT_LEN_MASK; + off += PCI_VPD_SRDT_TAG_SIZE + pci_vpd_srdt_size(buf); + } + if (tag == 0 || tag == 0xFF || tag == PCI_VPD_SRDT_END) + break; + } + return off; +} + static int pci_vpd_find_tag(const u8 *buf, unsigned int off, unsigned int len, u8 rdt) { int i; @@ -88,9 +120,10 @@ return -1; } -static int parse_vpd(struct pci_device *pdev, int len, unsigned char *vpd) +static int parse_vpd(struct libbiosdevname_state *state, struct pci_device *pdev, int len, unsigned char *vpd) { int i, j, k, isz, jsz, port, func, pfi; + struct pci_device *vf; i = pci_vpd_find_tag(vpd, 0, len, 0x90); if (i < 0) @@ -107,15 +140,6 @@ if (memcmp(vpd+j+3, "1028VPDR.VER1.0", 15)) return 1; - /* Lookup NPY Num Ports */ - j = pci_vpd_find_info_subkey(vpd, i, isz, "**", "NPY"); - if (j < 0) - return 1; - jsz = pci_vpd_info_field_size(&vpd[j]); - j += PCI_VPD_INFO_FLD_HDR_SIZE; - sscanf((char *)vpd+j+3, "%1x", &port); - pdev->vpd_nports = port; - /* Lookup Port Mappings */ j = pci_vpd_find_info_subkey(vpd, i, isz, "**", "DCM"); if (j < 0) @@ -126,16 +150,21 @@ for (k=3; k<jsz; k+=10) { /* Parse Port Info */ sscanf((char *)vpd+j+k, "%1x%1x%2x", &port, &func, &pfi); - if (func == pdev->pci_dev->func) { - pdev->vpd_port = port; - pdev->vpd_pfi = pfi; + if ((vf = find_pci_dev_by_pci_addr(state, pdev->pci_dev->domain, + pdev->pci_dev->bus, + pdev->pci_dev->dev, + func)) != NULL) { + if (vf->vpd_port == INT_MAX) { + vf->vpd_port = port; + vf->vpd_pfi = pfi; + } } } return 0; } /* Read and parse PCI VPD section if it exists */ -static int read_pci_vpd(struct pci_device *pdev) +static int read_pci_vpd(struct libbiosdevname_state *state, struct pci_device *pdev) { char path[PATH_MAX]; char pci_name[16]; @@ -146,13 +175,15 @@ unparse_pci_name(pci_name, sizeof(pci_name), pdev->pci_dev); snprintf(path, sizeof(path), "/sys/bus/pci/devices/%s/vpd", pci_name); - if ((fd = open(path, O_RDONLY)) >= 0) { - size = lseek(fd, 0, SEEK_END); - vpd = malloc(size); - if (vpd != NULL) { - if ((nrd = pread(fd, vpd, size, 0)) > 0) - rc = parse_vpd(pdev, nrd, vpd); - free(vpd); + if ((fd = open(path, O_RDONLY|O_SYNC)) >= 0) { + size = pci_vpd_size(pdev, fd); + if (size > 0) { + vpd = malloc(size); + if (vpd != NULL) { + if ((nrd = pread(fd, vpd, size, 0)) > 0) + rc = parse_vpd(state, pdev, nrd, vpd); + free(vpd); + } } close(fd); } @@ -161,11 +192,110 @@ static void set_pci_vpd_instance(struct libbiosdevname_state *state) { - struct pci_device *dev; + struct pci_device *dev, *dev2; + int fd; + char sys_vendor[10] = {0}; + + /* Read VPD-R on Dell systems only */ + if ((fd = open("/sys/devices/virtual/dmi/id/sys_vendor", O_RDONLY)) >= 0) { + if (read(fd, sys_vendor, 9) != 9) + return; + if (strncmp(sys_vendor, "Dell Inc.", 9)) + return; + } else + return; + + /* Read VPD information for each device */ + list_for_each_entry(dev, &state->pci_devices, node) { + /* RedHat bugzilla 801885, 789635, 781572 */ + if (dev->pci_dev->vendor_id == 0x1969 || + dev->pci_dev->vendor_id == 0x168c) + continue; + read_pci_vpd(state, dev); + } + + /* Now match VPD master device */ + list_for_each_entry(dev, &state->pci_devices, node) { + if (dev->vpd_port == INT_MAX) + continue; + list_for_each_entry(dev2, &state->pci_devices, node) { + if (dev2->pci_dev->domain == dev->pci_dev->domain && + dev2->pci_dev->bus == dev->pci_dev->bus && + dev2->pci_dev->dev == dev->pci_dev->dev && + dev2->vpd_port == dev->vpd_port) { + dev2->vpd_count++; + dev->vpd_pf = dev2; + break; + } + } + } + /* Delete all VPD devices with single function */ list_for_each_entry(dev, &state->pci_devices, node) { - read_pci_vpd(dev); + if (dev->vpd_count == 1) { + dev->vpd_port = INT_MAX; + dev->vpd_pfi = INT_MAX; + dev->vpd_pf = NULL; + } + } +} + +static int pci_find_capability(struct pci_dev *p, int cap) +{ + u16 status; + u8 hdr, id; + int pos, ttl = 48; + + status = pci_read_word(p, PCI_STATUS); + if (!(status & PCI_STATUS_CAP_LIST)) + return 0; + hdr = pci_read_byte(p, PCI_HEADER_TYPE); + switch(hdr & 0x7F) { + case PCI_HEADER_TYPE_NORMAL: + case PCI_HEADER_TYPE_BRIDGE: + pos = PCI_CAPABILITY_LIST; + break; + case PCI_HEADER_TYPE_CARDBUS: + pos = PCI_CB_CAPABILITY_LIST; + break; + default: + return 0; + } + + while (ttl--) { + pos = pci_read_byte(p, pos); + if (pos < 0x40) + break; + pos &= ~3; + id = pci_read_byte(p, pos+PCI_CAP_LIST_ID); + if (id == 0xFF) + break; + if (id == cap) + return pos; + pos += PCI_CAP_LIST_NEXT; + } + return 0; +} + +static struct pci_device * +find_parent(struct libbiosdevname_state *state, struct pci_device *dev); + +static int pcie_get_slot(struct libbiosdevname_state *state, struct pci_device *p) +{ + int pos; + u32 slot, flag; + + while (p) { + /* Return PCIE physical slot number */ + if ((pos = pci_find_capability(p->pci_dev, PCI_CAP_ID_EXP)) != 0) { + flag = pci_read_word(p->pci_dev, pos + PCI_EXP_FLAGS); + slot = (pci_read_long(p->pci_dev, pos + PCI_EXP_SLTCAP) >> 19); + if ((flag & PCI_EXP_FLAGS_SLOT) && slot) + return slot; + } + p = find_parent(state, p); } + return PHYSICAL_SLOT_UNKNOWN; } static int read_pci_sysfs_path(char *buf, size_t bufsize, const struct pci_dev *pdev) @@ -385,6 +515,8 @@ int slot; do { slot = pci_dev_to_slot(state, d); + if (slot == PHYSICAL_SLOT_UNKNOWN && is_valid_smbios) + slot = pcie_get_slot(state, d); if (slot == PHYSICAL_SLOT_UNKNOWN) slot = pirq_dev_to_slot(state, d); if (slot == PHYSICAL_SLOT_UNKNOWN) @@ -448,6 +580,7 @@ } } + static void add_pci_dev(struct libbiosdevname_state *state, struct pci_dev *p) { @@ -467,6 +600,7 @@ dev->vf_index = INT_MAX; dev->vpd_port = INT_MAX; dev->vpd_pfi = INT_MAX; + dev->vpd_pf = NULL; fill_pci_dev_sysfs(dev, p); list_add(&dev->node, &state->pci_devices); } @@ -484,58 +618,44 @@ } } -static void set_pci_slots(struct libbiosdevname_state *state) +int addslot(struct libbiosdevname_state *state, int slot) { - struct pci_device *dev; + struct slotlist *s; - list_for_each_entry(dev, &state->pci_devices, node) { - dev_to_slot(state, dev); + list_for_each_entry(s, &state->slots, node) { + if (s->slot == slot) { + return ++s->count; + } } -} + s = malloc(sizeof(*s)); + INIT_LIST_HEAD(&s->node); + s->slot = slot; + s->count = 0; + list_add(&s->node, &state->slots); - -static int set_pci_slot_index(struct libbiosdevname_state *state) -{ - struct pci_device *pcidev; - int prevslot=-1; - int index=1; - - /* only iterate over the PCI devices, because the bios_device list may be incomplete due to renames happening in parallel */ - list_for_each_entry(pcidev, &state->pci_devices, node) { - if (pcidev->physical_slot == 0) /* skip embedded devices */ - continue; - if (!is_pci_network(pcidev)) /* only look at PCI network devices */ - continue; - if (pcidev->is_sriov_virtual_function) /* skip sriov VFs, they're handled later */ - continue; - if (pcidev->physical_slot != prevslot) { - index=1; - prevslot = pcidev->physical_slot; - } - else - index++; - pcidev->index_in_slot = index; - } - return 0; + return ++s->count; } -static int set_embedded_index(struct libbiosdevname_state *state) +static void set_pci_slots(struct libbiosdevname_state *state) { - struct pci_device *pcidev; - int index=1; + struct pci_device *dev; - list_for_each_entry(pcidev, &state->pci_devices, node) { - if (pcidev->physical_slot != 0) /* skip non-embedded devices */ - continue; - if (!is_pci_network(pcidev)) /* only look at PCI network devices */ - continue; - if (pcidev->is_sriov_virtual_function) /* skip sriov VFs, they're handled later */ + list_for_each_entry(dev, &state->pci_devices, node) { + dev_to_slot(state, dev); + } + + /* Get mapping for each slot */ + list_for_each_entry(dev, &state->pci_devices, node) { + if (dev->is_sriov_virtual_function || !is_pci_network(dev) || dev->vpd_port != INT_MAX) { continue; - pcidev->embedded_index = index; - pcidev->embedded_index_valid = 1; - index++; + } + if (dev->physical_slot == 0) { + dev->embedded_index_valid = 1; + dev->embedded_index = addslot(state, 0); + } else if (dev->physical_slot != PHYSICAL_SLOT_UNKNOWN) { + dev->index_in_slot = addslot(state, dev->physical_slot); + } } - return 0; } static void set_sriov_pf_vf(struct libbiosdevname_state *state) @@ -616,11 +736,9 @@ /* ordering here is important */ dmidecode_main(state); /* this will fail on Xen guests, that's OK */ sort_device_list(state); + set_pci_vpd_instance(state); set_pci_slots(state); - set_embedded_index(state); - set_pci_slot_index(state); set_sriov_pf_vf(state); - set_pci_vpd_instance(state); return rc; } @@ -683,8 +801,8 @@ if (p->smbios_type) { s += snprintf(s, size-(s-buf), "SMBIOS Device Type: "); s += unparse_smbios_type41_type(s, size-(s-buf), p->smbios_type); - s += snprintf(s, size-(s-buf), "SMBIOS Instance: %u\n", p->smbios_instance); - s += snprintf(s, size-(s-buf), "SMBIOS Enabled: %s\n", p->smbios_instance?"True":"False"); + if (p->smbios_instance) + s += snprintf(s, size-(s-buf), "SMBIOS Instance: %u\n", p->smbios_instance); } if (p->uses_smbios & HAS_SMBIOS_LABEL && p->smbios_label) s += snprintf(s, size-(s-buf), "SMBIOS Label: %s\n", p->smbios_label); @@ -699,7 +817,11 @@ if (p->vpd_port < INT_MAX) { s += snprintf(s, size-(s-buf), "VPD Port: %u\n", p->vpd_port); s += snprintf(s, size-(s-buf), "VPD Index: %u\n", p->vpd_pfi); - s += snprintf(s, size-(s-buf), "VPD #Ports: %u\n", p->vpd_nports); + if (p->vpd_pf) { + s += snprintf(s, size-(s-buf), "VPD PCI master: "); + s += unparse_pci_name(s, size-(s-buf), p->vpd_pf->pci_dev); + s += snprintf(s, size-(s-buf), " count %d\n", p->vpd_pf->vpd_count); + } } if (!list_empty(&p->vfs)) { s += snprintf(s, size-(s-buf), "Virtual Functions:\n"); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/biosdevname-0.3.8/src/pci.h new/biosdevname-0.4.1/src/pci.h --- old/biosdevname-0.3.8/src/pci.h 2011-03-09 00:58:08.000000000 +0100 +++ new/biosdevname-0.4.1/src/pci.h 2012-06-19 23:42:38.000000000 +0200 @@ -13,6 +13,13 @@ #include "state.h" #include "config.h" +struct slotlist +{ + struct list_head node; + int slot; + int count; +}; + struct pci_device { struct list_head node; struct pci_dev *pci_dev; @@ -29,9 +36,10 @@ char * sysfs_label; unsigned char uses_sysfs; unsigned int vf_index; + unsigned int vpd_count; unsigned int vpd_pfi; - unsigned int vpd_nports; unsigned int vpd_port; + struct pci_device *vpd_pf; struct pci_device *pf; struct list_head vfnode; struct list_head vfs; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/biosdevname-0.3.8/src/pirq.c new/biosdevname-0.4.1/src/pirq.c --- old/biosdevname-0.3.8/src/pirq.c 2011-03-09 00:58:08.000000000 +0100 +++ new/biosdevname-0.4.1/src/pirq.c 2012-06-14 21:37:18.000000000 +0200 @@ -18,6 +18,8 @@ #include <sys/mman.h> #include "pirq.h" +extern int nopirq; + /* If unknown, use INT_MAX so they get sorted last */ int pirq_pci_dev_to_slot(struct routing_table *table, int domain, int bus, int dev) { @@ -33,8 +35,11 @@ for (i=0; i<num_slots; i++) { slot = &table->slot[i]; if (slot->bus == bus && - PCI_DEVICE(slot->device) == dev) + PCI_DEVICE(slot->device) == dev) { + if (slot->slot >= '1' && slot->slot <= '9') + return slot->slot - '0'; return slot->slot; + } } return INT_MAX; } @@ -49,8 +54,13 @@ int i; void *mem; off_t offset=0L; - int fd=open("/dev/mem", O_RDONLY); + int fd; + /* Skip PIRQ table parsing */ + if (nopirq) { + return NULL; + } + fd = open("/dev/mem", O_RDONLY); if(fd==-1) return NULL; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/biosdevname-0.3.8/src/state.h new/biosdevname-0.4.1/src/state.h --- old/biosdevname-0.3.8/src/state.h 2011-03-09 00:58:08.000000000 +0100 +++ new/biosdevname-0.4.1/src/state.h 2012-06-19 23:42:38.000000000 +0200 @@ -14,6 +14,7 @@ struct list_head bios_devices; struct list_head pci_devices; struct list_head network_devices; + struct list_head slots; struct pci_access *pacc; struct routing_table *pirq_table; }; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/biosdevname-0.3.8/src/sysfs.c new/biosdevname-0.4.1/src/sysfs.c --- old/biosdevname-0.3.8/src/sysfs.c 2011-03-09 00:58:08.000000000 +0100 +++ new/biosdevname-0.4.1/src/sysfs.c 2012-06-14 21:37:18.000000000 +0200 @@ -50,8 +50,9 @@ } length = read(fd, result, resultsize-1); + close(fd); + if (length < 0) { - close(fd); ret = -1; goto free_out; } -- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
