diff options
author | tzafrir <tzafrir@5390a7c7-147a-4af0-8ec9-7488f05a26cb> | 2007-10-16 17:55:05 +0000 |
---|---|---|
committer | tzafrir <tzafrir@5390a7c7-147a-4af0-8ec9-7488f05a26cb> | 2007-10-16 17:55:05 +0000 |
commit | 6bc1dbffe9f77eb3c85a655ffeaff64d963c6b43 (patch) | |
tree | e94ccfa1c5bf43ffac9eb4ec251eee58ae8fe39a /xpp/utils/zconf | |
parent | 37886eb9069e5a088d721f41202e7c3dd4ca0a09 (diff) |
xpp r4892:
* Zaptel/Hardware perl modules:
- Use sysfs directly. Don't rely on lspci/lsusb.
- Each device has a description and driver name.
- Zaptel::Hardware::drivers() to show the list of required drivers
for this system (see zaptel_drivers).
- zaptel_hardware shows a description and a (suggested?) driver.
* zt_registration sorts by Serial first and only then by connector.
* USB_FW.hex replaces all the USB_11x0.hex .
- Separate USB interface for the management processor.
- Hence fpga_load can now work even with drivers loaded.
* Fix firmware upgrading.
* Fix manual firmware loading while auto-loading.
git-svn-id: http://svn.digium.com/svn/zaptel/branches/1.2@3142 5390a7c7-147a-4af0-8ec9-7488f05a26cb
Diffstat (limited to 'xpp/utils/zconf')
-rw-r--r-- | xpp/utils/zconf/Zaptel/Hardware.pm | 11 | ||||
-rw-r--r-- | xpp/utils/zconf/Zaptel/Hardware/PCI.pm | 187 | ||||
-rw-r--r-- | xpp/utils/zconf/Zaptel/Hardware/USB.pm | 81 | ||||
-rw-r--r-- | xpp/utils/zconf/Zaptel/Xpp.pm | 4 | ||||
-rw-r--r-- | xpp/utils/zconf/Zaptel/Xpp/Xbus.pm | 7 |
5 files changed, 186 insertions, 104 deletions
diff --git a/xpp/utils/zconf/Zaptel/Hardware.pm b/xpp/utils/zconf/Zaptel/Hardware.pm index 39305fb..8423c18 100644 --- a/xpp/utils/zconf/Zaptel/Hardware.pm +++ b/xpp/utils/zconf/Zaptel/Hardware.pm @@ -18,6 +18,7 @@ sub device_detected($$) { my $name = shift || die; warn "Device '$name' already known\n" if grep { $_->hardware_name eq $name } @zaptel_devices; + $dev->{'HARDWARE_NAME'} = $name; push(@zaptel_devices, $dev); } @@ -34,6 +35,16 @@ sub devices($) { return @zaptel_devices; } +sub drivers($) { + my $pack = shift or die "Wasn't called as a class method\n"; + my @devs = $pack->devices(); + my @drvs = map { $_->{DRIVER} } @devs; + # Make unique + my %drivers; + @drivers{@drvs} = 1; + return sort keys %drivers; +} + sub scan_hardware($) { my $pack = shift || die; diff --git a/xpp/utils/zconf/Zaptel/Hardware/PCI.pm b/xpp/utils/zconf/Zaptel/Hardware/PCI.pm index 9e916f6..bd6f6e3 100644 --- a/xpp/utils/zconf/Zaptel/Hardware/PCI.pm +++ b/xpp/utils/zconf/Zaptel/Hardware/PCI.pm @@ -10,29 +10,89 @@ package Zaptel::Hardware::PCI; use strict; use Zaptel::Hardware; -my @idlist = qw( - 0B0B:0206 - 1397:16B8 - 1397:08B4 - 1057:5608 - 10B5:3001 - 10B5:4000 - 10B5:9030 - 10B5:D00D - D161:0800 - D161:2400 - D161:0120 - D161:0205 - D161:0210 - D161:0220 - D161:0405 - D161:0410 - D161:0420 - E159:0001 +our @ISA = qw(Zaptel::Hardware); + +# Lookup algorithm: +# First match 'vendor:product/subvendor:subproduct' key +# Else match 'vendor:product/subvendor' key +# Else match 'vendor:product' key +# Else not a zaptel hardware. +my %pci_ids = ( + # from wct4xxp + '10ee:0314' => { DRIVER => 'wct4xxp', DESCRIPTION => 'Wildcard TE410P/TE405P (1st Gen)' }, + 'd161:0420/0004' => { DRIVER => 'wct4xxp', DESCRIPTION => 'Wildcard TE420 (4th Gen)' }, + 'd161:0410/0004' => { DRIVER => 'wct4xxp', DESCRIPTION => 'Wildcard TE410P (4th Gen)' }, + 'd161:0405/0004' => { DRIVER => 'wct4xxp', DESCRIPTION => 'Wildcard TE405P (4th Gen)' }, + 'd161:0410/0003' => { DRIVER => 'wct4xxp', DESCRIPTION => 'Wildcard TE410P (3rd Gen)' }, + 'd161:0405/0003' => { DRIVER => 'wct4xxp', DESCRIPTION => 'Wildcard TE405P (3rd Gen)' }, + 'd161:0410' => { DRIVER => 'wct4xxp', DESCRIPTION => 'Wildcard TE410P (2nd Gen)' }, + 'd161:0405' => { DRIVER => 'wct4xxp', DESCRIPTION => 'Wildcard TE405P (2nd Gen)' }, + 'd161:0220/0004' => { DRIVER => 'wct4xxp', DESCRIPTION => 'Wildcard TE220 (4th Gen)' }, + 'd161:0205/0004' => { DRIVER => 'wct4xxp', DESCRIPTION => 'Wildcard TE205P (4th Gen)' }, + 'd161:0210/0004' => { DRIVER => 'wct4xxp', DESCRIPTION => 'Wildcard TE210P (4th Gen)' }, + 'd161:0205/0003' => { DRIVER => 'wct4xxp', DESCRIPTION => 'Wildcard TE205P (3rd Gen)' }, + 'd161:0210/0003' => { DRIVER => 'wct4xxp', DESCRIPTION => 'Wildcard TE210P (3rd Gen)' }, + 'd161:0205' => { DRIVER => 'wct4xxp', DESCRIPTION => 'Wildcard TE205P ' }, + 'd161:0210' => { DRIVER => 'wct4xxp', DESCRIPTION => 'Wildcard TE210P ' }, + + # from wctdm24xxp + 'd161:2400' => { DRIVER => 'wctdm24xxp', DESCRIPTION => 'Wildcard TDM2400P' }, + 'd161:0800' => { DRIVER => 'wctdm24xxp', DESCRIPTION => 'Wildcard TDM800P' }, + 'd161:8002' => { DRIVER => 'wctdm24xxp', DESCRIPTION => 'Wildcard AEX800' }, + 'd161:8003' => { DRIVER => 'wctdm24xxp', DESCRIPTION => 'Wildcard AEX2400' }, + + # from pciradio + 'e159:0001/e16b' => { DRIVER => 'pciradio', DESCRIPTION => 'PCIRADIO' }, + + # from wcfxo + 'e159:0001/8085' => { DRIVER => 'wcfxo', DESCRIPTION => 'Wildcard X101P' }, + 'e159:0001/8086' => { DRIVER => 'wcfxo', DESCRIPTION => 'Generic Clone' }, + 'e159:0001/8087' => { DRIVER => 'wcfxo', DESCRIPTION => 'Generic Clone' }, + '1057:5608' => { DRIVER => 'wcfxo', DESCRIPTION => 'Wildcard X100P' }, + + # from wct1xxp + 'e159:0001/6159' => { DRIVER => 'wct1xxp', DESCRIPTION => 'Digium Wildcard T100P T1/PRI or E100P E1/PRA Board' }, + + # from wctdm + 'e159:0001/a159' => { DRIVER => 'wctdm', DESCRIPTION => 'Wildcard S400P Prototype' }, + 'e159:0001/e159' => { DRIVER => 'wctdm', DESCRIPTION => 'Wildcard S400P Prototype' }, + 'e159:0001/b100' => { DRIVER => 'wctdm', DESCRIPTION => 'Wildcard TDM400P REV E/F' }, + 'e159:0001/b1d9' => { DRIVER => 'wctdm', DESCRIPTION => 'Wildcard TDM400P REV I' }, + 'e159:0001/b118' => { DRIVER => 'wctdm', DESCRIPTION => 'Wildcard TDM400P REV I' }, + 'e159:0001/b119' => { DRIVER => 'wctdm', DESCRIPTION => 'Wildcard TDM400P REV I' }, + 'e159:0001/a9fd' => { DRIVER => 'wctdm', DESCRIPTION => 'Wildcard TDM400P REV H' }, + 'e159:0001/a8fd' => { DRIVER => 'wctdm', DESCRIPTION => 'Wildcard TDM400P REV H' }, + 'e159:0001/a800' => { DRIVER => 'wctdm', DESCRIPTION => 'Wildcard TDM400P REV H' }, + 'e159:0001/a801' => { DRIVER => 'wctdm', DESCRIPTION => 'Wildcard TDM400P REV H' }, + 'e159:0001/a908' => { DRIVER => 'wctdm', DESCRIPTION => 'Wildcard TDM400P REV H' }, + 'e159:0001/a901' => { DRIVER => 'wctdm', DESCRIPTION => 'Wildcard TDM400P REV H' }, + #'e159:0001' => { DRIVER => 'wctdm', DESCRIPTION => 'Wildcard TDM400P REV H' }, + + # from wcte11xp + 'e159:0001/71fe' => { DRIVER => 'wcte11xp', DESCRIPTION => 'Digium Wildcard TE110P T1/E1 Board' }, + 'e159:0001/79fe' => { DRIVER => 'wcte11xp', DESCRIPTION => 'Digium Wildcard TE110P T1/E1 Board' }, + 'e159:0001/795e' => { DRIVER => 'wcte11xp', DESCRIPTION => 'Digium Wildcard TE110P T1/E1 Board' }, + 'e159:0001/79de' => { DRIVER => 'wcte11xp', DESCRIPTION => 'Digium Wildcard TE110P T1/E1 Board' }, + 'e159:0001/797e' => { DRIVER => 'wcte11xp', DESCRIPTION => 'Digium Wildcard TE110P T1/E1 Board' }, + + # from wcte12xp + 'd161:0120' => { DRIVER => 'wcte12xp', DESCRIPTION => 'Wildcard TE12xP' }, + + # from tor2 + '10b5:9030' => { DRIVER => 'tor2', DESCRIPTION => 'PLX 9030' }, + '10b5:3001' => { DRIVER => 'tor2', DESCRIPTION => 'PLX Development Board' }, + '10b5:D00D' => { DRIVER => 'tor2', DESCRIPTION => 'Tormenta 2 Quad T1/PRI or E1/PRA' }, + '10b5:4000' => { DRIVER => 'tor2', DESCRIPTION => 'Tormenta 2 Quad T1/E1 (non-Digium clone)' }, + + # Cologne Chips: + # (Still a partial list) + '1397:08b4/b556' => { DRIVER => 'qozap', DESCRIPTION => 'Junghanns DuoBRI ISDN card' }, + '1397:08b4' => { DRIVER => 'qozap', DESCRIPTION => 'Junghanns QuadBRI ISDN card' }, + '1397:16b8' => { DRIVER => 'qozap', DESCRIPTION => 'Junghanns OctoBRI ISDN card' }, + '1397:2bd0' => { DRIVER => 'zaphfc', DESCRIPTION => 'HFC-S ISDN BRI card' }, ); $ENV{PATH} .= ":/usr/sbin:/sbin:/usr/bin:/bin"; -my $prog = 'lspci'; # Accessors (miniperl does not have Class:Accessor) our $AUTOLOAD; @@ -49,25 +109,16 @@ sub AUTOLOAD { my @devices; -sub pci_sorter() { - return - sprintf("%03d/%03d", $a->bus, $a->dev) cmp - sprintf("%03d/%03d", $b->bus, $b->dev); +sub pci_sorter { + return $a->priv_device_name() cmp $b->priv_device_name(); } sub new($$) { my $pack = shift or die "Wasn't called as a class method\n"; my $self = { @_ }; bless $self, $pack; - my $hardware_name = sprintf("pci:%s:%s:%s", $self->{DOMAIN}, $self->{BUS}, $self->{DEV}); - $self->{HARDWARE_NAME} = $hardware_name; - Zaptel::Hardware::device_detected($self, $hardware_name); - my $sysfile = sprintf "/sys/bus/pci/devices/%s:%s:%s/driver/module", $self->{DOMAIN}, $self->{BUS}, $self->{DEV}; - my $module = readlink($sysfile); - if(defined $module) { - $module =~ s:^.*/::; - $self->{DRIVER} = $module; - } + Zaptel::Hardware::device_detected($self, + sprintf("pci:%s", $self->{PRIV_DEVICE_NAME})); return $self; } @@ -76,38 +127,58 @@ sub devices($) { return sort pci_sorter @devices; } -my $domain_support = 1; # Optimistic... +my %pci_devs; + +sub readfile($) { + my $name = shift || die; + open(F, $name) || die "Failed to open '$name': $!"; + my $str = <F>; + close F; + chomp($str); + return $str; +} sub scan_devices($) { - my $pack = shift || die; - if(!open(F, "$prog -Dn 2> /dev/null |")) { - $domain_support = 0; - open(F, "$prog -n|") || die "$0: Failed running $prog: $!"; + while(</sys/bus/pci/devices/*>) { + m,([^/]+)$,,; + my $name = $1; + my $l = readlink $_ || die; + $pci_devs{$name}{PRIV_DEVICE_NAME} = $name; + $pci_devs{$name}{DEVICE} = $l; + $pci_devs{$name}{VENDOR} = readfile "$_/vendor"; + $pci_devs{$name}{PRODUCT} = readfile "$_/device"; + $pci_devs{$name}{SUBVENDOR} = readfile "$_/subsystem_vendor"; + $pci_devs{$name}{SUBPRODUCT} = readfile "$_/subsystem_device"; + my $dev = $pci_devs{$name}; + grep(s/0x//, $dev->{VENDOR}, $dev->{PRODUCT}, $dev->{SUBVENDOR}, $dev->{SUBPRODUCT}); + $pci_devs{$name}{DRIVER} = ''; } - while(<F>) { - chomp; - my ($phys,$id) = (split(/\s+/))[0,2]; - my $domain; - my $bus; - my $dev; - if($domain_support) { - ($domain,$bus,$dev) = split(/:/, $phys); - } else { - ($bus,$dev) = split(/:/, $phys); - $domain = '0000'; - } - next unless grep { uc($id) eq $_ } @idlist; - my($vendor,$product) = split(/:/, $id); + + while(</sys/bus/pci/drivers/*/[0-9]*>) { + m,([^/]+)/([^/]+)$,,; + $pci_devs{$2}{LOADED} = $1; + } + foreach (sort keys %pci_devs) { + my $dev = $pci_devs{$_}; + my $key; + # Try to match + $key = "$dev->{VENDOR}:$dev->{PRODUCT}/$dev->{SUBVENDOR}:$dev->{SUBPRODUCT}"; + $key = "$dev->{VENDOR}:$dev->{PRODUCT}/$dev->{SUBVENDOR}" if !defined($pci_ids{$key}); + $key = "$dev->{VENDOR}:$dev->{PRODUCT}" if !defined($pci_ids{$key}); + next unless defined $pci_ids{$key}; + my $d = Zaptel::Hardware::PCI->new( - DOMAIN => $domain, - BUS => $bus, - DEV => $dev, - VENDOR => $vendor, - PRODUCT => $product, + PRIV_DEVICE_NAME => $dev->{PRIV_DEVICE_NAME}, + VENDOR => $dev->{VENDOR}, + PRODUCT => $dev->{PRODUCT}, + SUBVENDOR => $dev->{SUBVENDOR}, + SUBPRODUCT => $dev->{SUBPRODUCT}, + LOADED => $dev->{LOADED}, + DRIVER => $pci_ids{$key}{DRIVER}, + DESCRIPTION => $pci_ids{$key}{DESCRIPTION}, ); push(@devices, $d); } - close F; } 1; diff --git a/xpp/utils/zconf/Zaptel/Hardware/USB.pm b/xpp/utils/zconf/Zaptel/Hardware/USB.pm index bbf00fe..0f2024b 100644 --- a/xpp/utils/zconf/Zaptel/Hardware/USB.pm +++ b/xpp/utils/zconf/Zaptel/Hardware/USB.pm @@ -12,21 +12,28 @@ use Zaptel::Hardware; use Zaptel::Xpp; use Zaptel::Xpp::Xbus; -my @idlist = qw( - e4e4:1130 - e4e4:1131 - e4e4:1132 - e4e4:1140 - e4e4:1141 - e4e4:1142 - e4e4:1150 - e4e4:1151 - e4e4:1152 +our @ISA = qw(Zaptel::Hardware); + +my %usb_ids = ( + # from wcusb + '06e6:831c' => { DRIVER => 'wcusb', DESCRIPTION => 'Wildcard S100U USB FXS Interface' }, + '06e6:831e' => { DRIVER => 'wcusb2', DESCRIPTION => 'Wildcard S110U USB FXS Interface' }, + '06e6:b210' => { DRIVER => 'wc_usb_phone', DESCRIPTION => 'Wildcard Phone Test driver' }, + + # from xpp_usb + 'e4e4:1130' => { DRIVER => 'xpp_usb', DESCRIPTION => 'Astribank-8/16 no-firmware' }, + 'e4e4:1131' => { DRIVER => 'xpp_usb', DESCRIPTION => 'Astribank-8/16 USB-firmware' }, + 'e4e4:1132' => { DRIVER => 'xpp_usb', DESCRIPTION => 'Astribank-8/16 FPGA-firmware' }, + 'e4e4:1140' => { DRIVER => 'xpp_usb', DESCRIPTION => 'Astribank-BRI no-firmware' }, + 'e4e4:1141' => { DRIVER => 'xpp_usb', DESCRIPTION => 'Astribank-BRI USB-firmware' }, + 'e4e4:1142' => { DRIVER => 'xpp_usb', DESCRIPTION => 'Astribank-BRI FPGA-firmware' }, + 'e4e4:1150' => { DRIVER => 'xpp_usb', DESCRIPTION => 'Astribank-multi no-firmware' }, + 'e4e4:1151' => { DRIVER => 'xpp_usb', DESCRIPTION => 'Astribank-multi USB-firmware' }, + 'e4e4:1152' => { DRIVER => 'xpp_usb', DESCRIPTION => 'Astribank-multi FPGA-firmware' }, ); $ENV{PATH} .= ":/usr/sbin:/sbin:/usr/bin:/bin"; -my $prog = 'lsusb'; # Accessors (miniperl does not have Class:Accessor) our $AUTOLOAD; @@ -45,21 +52,14 @@ my @devices; my @xbuses = Zaptel::Xpp::xbuses('SORT_CONNECTOR'); sub usb_sorter() { - return - sprintf("%03d/%03d", $a->bus, $a->dev) cmp - sprintf("%03d/%03d", $b->bus, $b->dev); + return $a->hardware_name cmp $b->hardware_name; } -sub xbus_of_usb($$) { - my $bus = shift; +sub xbus_of_usb($) { + my $priv_device_name = shift; my $dev = shift; - my ($wanted) = grep { - my $b = $_->usb_bus; - my $d = $_->usb_dev; - defined($b) && $b == $bus && - defined($d) && $d == $dev - } @xbuses; + my ($wanted) = grep { $priv_device_name eq $_->usb_devname } @xbuses; return $wanted; } @@ -67,14 +67,13 @@ sub new($$) { my $pack = shift or die "Wasn't called as a class method\n"; my $self = { @_ }; bless $self, $pack; - my $xbus = xbus_of_usb($self->bus, $self->dev); + my $xbus = xbus_of_usb($self->priv_device_name); if(defined $xbus) { $self->{XBUS} = $xbus; - $self->{DRIVER} = 'xpp_usb'; + $self->{LOADED} = 'xpp_usb'; } - my $hardware_name = sprintf("usb:%03d/%03d", $self->{BUS}, $self->{DEV}); - $self->{HARDWARE_NAME} = $hardware_name; - Zaptel::Hardware::device_detected($self, $hardware_name); + Zaptel::Hardware::device_detected($self, + sprintf("usb:%s", $self->{PRIV_DEVICE_NAME})); return $self; } @@ -85,20 +84,24 @@ sub devices($) { sub scan_devices($) { my $pack = shift || die; - open(F, "$prog|") || die "$0: Failed running $prog: $!"; + my $usb_device_list = "/proc/bus/usb/devices"; + open(F, $usb_device_list) || die "Failed to open $usb_device_list: $!"; + $/ = ''; while(<F>) { - chomp; - my ($bus,$dev,$id) = (split(/\s+/))[1,3,5]; - $dev =~ s/://; - $bus =~ s/^0*//; - $dev =~ s/^0*//; - next unless grep { lc($id) eq $_ } @idlist; - my($vendor,$product) = split(/:/, $id); + my @lines = split(/\n/); + my ($tline) = grep(/^T/, @lines); + my ($pline) = grep(/^P/, @lines); + my ($busnum,$devnum) = ($tline =~ /Bus=(\w+)\W.*Dev#=\s*(\w+)\W/); + my $devname = sprintf("%03d/%03d", $busnum, $devnum); + my ($vendor,$product) = ($pline =~ /Vendor=(\w+)\W.*ProdID=(\w+)\W/); + my $model = $usb_ids{"$vendor:$product"}; + next unless defined $model; my $d = Zaptel::Hardware::USB->new( - BUS => $bus, - DEV => $dev, - VENDOR => $vendor, - PRODUCT => $product, + PRIV_DEVICE_NAME => $devname, + VENDOR => $vendor, + PRODUCT => $product, + DESCRIPTION => $model->{DESCRIPTION}, + DRIVER => $model->{DRIVER}, ); push(@devices, $d); } diff --git a/xpp/utils/zconf/Zaptel/Xpp.pm b/xpp/utils/zconf/Zaptel/Xpp.pm index ff0008a..db9add6 100644 --- a/xpp/utils/zconf/Zaptel/Xpp.pm +++ b/xpp/utils/zconf/Zaptel/Xpp.pm @@ -24,7 +24,9 @@ sub by_connector { } sub by_serial { - return $a->serial cmp $b->serial; + my $cmp = $a->serial cmp $b->serial; + return $cmp if $cmp != 0; + return $a->connector cmp $b->connector; } sub xbuses { diff --git a/xpp/utils/zconf/Zaptel/Xpp/Xbus.pm b/xpp/utils/zconf/Zaptel/Xpp/Xbus.pm index 0dd6d84..7951d98 100644 --- a/xpp/utils/zconf/Zaptel/Xpp/Xbus.pm +++ b/xpp/utils/zconf/Zaptel/Xpp/Xbus.pm @@ -70,12 +70,7 @@ sub new($$) { chomp $head; close F; $head =~ s/^device: +([^, ]+)/$1/i or die; - my ($usb_bus, $usb_dev) = split('/', $head); - die unless defined($usb_bus) && defined($usb_dev); - $usb_bus =~ s/^0*//; - $usb_dev =~ s/^0*//; - $self->{USB_BUS} = $usb_bus; - $self->{USB_DEV} = $usb_dev; + $self->{USB_DEVNAME} = $head; } @{$self->{XPDS}} = (); foreach my $fqn (glob "$prefix/XPD-??") { |