summaryrefslogtreecommitdiff
path: root/xpp/utils/zconf
diff options
context:
space:
mode:
authortzafrir <tzafrir@5390a7c7-147a-4af0-8ec9-7488f05a26cb>2007-10-16 17:55:05 +0000
committertzafrir <tzafrir@5390a7c7-147a-4af0-8ec9-7488f05a26cb>2007-10-16 17:55:05 +0000
commit6bc1dbffe9f77eb3c85a655ffeaff64d963c6b43 (patch)
treee94ccfa1c5bf43ffac9eb4ec251eee58ae8fe39a /xpp/utils/zconf
parent37886eb9069e5a088d721f41202e7c3dd4ca0a09 (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.pm11
-rw-r--r--xpp/utils/zconf/Zaptel/Hardware/PCI.pm187
-rw-r--r--xpp/utils/zconf/Zaptel/Hardware/USB.pm81
-rw-r--r--xpp/utils/zconf/Zaptel/Xpp.pm4
-rw-r--r--xpp/utils/zconf/Zaptel/Xpp/Xbus.pm7
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-??") {