#! /usr/bin/perl -w

# get-pci-ids: extract pci vendor/device ids from linux net drivers

# Copyright (C) 2003 Georg Baum <gbaum@users.sf.net>

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA


# Known bugs/limitations:
# - Does not recognize all drivers because some require special cflags.
#   Fails also on some drivers that do belong to other architectures
#   than the one of the machine this script is running on.
#   This is currently not so important because all drivers that have an
#   Etherboot counterpart are recognized.


use strict;
use File::Basename "dirname";
use POSIX "uname";

# Where to find the kernel sources
my $kernel_src = "/usr/src/linux";

if($#ARGV >= 0) {
	$kernel_src = shift;
}

# Sanity checks
if($#ARGV >= 0) {
	print STDERR "Too many arguments.\n";
	print STDERR "Usage: get-pci-ids [path to kernel sources]\n";
	print STDERR "       /usr/src/linux is assumed if no path is given.\n";
	exit 1;
}

unless(-f "$kernel_src/include/linux/version.h") {
	print STDERR "Could not find $kernel_src/include/linux/version.h.\n";
	print STDERR "$kernel_src is probably no Linux kernel source tree.\n";
	exit 1;
}

# Flags that are needed to preprocess the drivers.
# Some drivers need optimization
my $cflags="-D__KERNEL__ -I$kernel_src/include -I$kernel_src/net/inet -O2";

# The C preprocessor. It needs to spit out the preprocessed source on stdout.
my $cpp="gcc -E";

# List of drivers. We parse every .c file. It does not harm if it does not contain a driver.
my @drivers = split /\s+/, `find $kernel_src/drivers/net -name '*.c' | sort`;

# Kernel version
my $version = `grep UTS_RELEASE $kernel_src/include/linux/version.h`;
chomp $version;
$version =~ s/\s*#define\s+UTS_RELEASE\s+"(\S+)".*$/$1/g;

# Architecture
my @uname = uname();


# Print header
print "# PCI vendor/device ids extracted from Linux $version on $uname[4] at " . gmtime() . "\n";

my $driver;

# Process the drivers
foreach $driver (@drivers) {

	# Preprocess to expand macros
	my $command = "$cpp $cflags -I" . dirname($driver) . " $driver";
	open  DRIVER, "$command |" or die "Could not execute\n\"$command\".\n";

	# Extract the pci_device_id structure
	my $found = 0;
	my $line = "";
	my @lines;
	while(<DRIVER>) {
		if(/^\s*static\s+struct\s+pci_device_id/) {
			# This file contains a driver. Print the name.
			$driver =~ s!$kernel_src/drivers/net/!!g;
			print "\n$driver\n";
			$found = 1;
			next;
		}
		if($found == 1){
			if(/\};/ or /{\s*0\s*,?\s*}/) {
				# End of struct
				$found = 0;
			} else {
				chomp;
				if(/\}\s*,?\s*\n?$/) {
					# This line contains a full entry or the last part of it.
					$_ = $line . $_;
					$line = "";
					s/[,\{\};\(\)]//g;	# Strip punctuation
					s/^\s+//g;		# Eat whitespace at beginning of line
					tr[A-Z][a-z];		# Convert to lowercase
					# Push the vendor and device id to @lines if this line is not empty.
					# We ignore everything else that might be there
					my ($vendor_id, $device_id, $remainder) = split /\W+/, $_, 3;
					push @lines, "$vendor_id $device_id\n" if($vendor_id && $device_id);
				} else {
					# This line does contain a partial entry. Remember it.
					$line .= "$_ ";
				}
			}
		}
	}
	close DRIVER;		# No "or die", because $cpp fails on some files

	# Now print out the sorted values
	@lines = sort @lines;
	my $lastline = "";
	foreach(@lines) {
		# Print each vendor/device id combination only once.
		# Some drivers (e.g. e100) do contain subfamilies
		print if($_ ne $lastline);
		$lastline = $_;
	}
}


