summaryrefslogtreecommitdiff
path: root/xpp/perl_modules/Dahdi/Xpp/Xbus.pm
diff options
context:
space:
mode:
Diffstat (limited to 'xpp/perl_modules/Dahdi/Xpp/Xbus.pm')
-rw-r--r--xpp/perl_modules/Dahdi/Xpp/Xbus.pm63
1 files changed, 52 insertions, 11 deletions
diff --git a/xpp/perl_modules/Dahdi/Xpp/Xbus.pm b/xpp/perl_modules/Dahdi/Xpp/Xbus.pm
index 2cae6f8..b7994f8 100644
--- a/xpp/perl_modules/Dahdi/Xpp/Xbus.pm
+++ b/xpp/perl_modules/Dahdi/Xpp/Xbus.pm
@@ -46,13 +46,16 @@ sub get_xpd_by_number($$) {
return $wanted;
}
+my %file_warned; # Prevent duplicate warnings about same file.
+
sub xbus_attr_path($$) {
my ($busnum, @attr) = @_;
foreach my $attr (@attr) {
my $file = sprintf "$Dahdi::Xpp::sysfs_astribanks/xbus-%02d/$attr", $busnum;
unless(-f $file) {
my $procfile = sprintf "/proc/xpp/XBUS-%02d/$attr", $busnum;
- warn "$0: OLD DRIVER: missing '$file'. Fall back to '$procfile'\n";
+ warn "$0: warning - OLD DRIVER: missing '$file'. Fall back to '$procfile'\n"
+ unless $file_warned{$attr}++;
$file = $procfile;
}
next unless -f $file;
@@ -92,6 +95,40 @@ sub read_attrs() {
}
}
+sub read_xpdnames_old($) {
+ my $xbus_num = shift || die;
+ my $pat = sprintf "/proc/xpp/XBUS-%02d/XPD-[0-9][0-9]", $xbus_num;
+ my @xpdnames;
+
+ #print STDERR "read_xpdnames_old($xbus_num): $pat\n";
+ foreach (glob $pat) {
+ die "Bad /proc entry: '$_'" unless /^.*XPD-([0-9])([0-9])$/;
+ my $name = sprintf("%02d:%1d:%1d", $xbus_num, $1, $2);
+ #print STDERR "\t> $_ ($name)\n";
+ push(@xpdnames, $name);
+ }
+ return @xpdnames;
+}
+
+sub read_xpdnames($) {
+ my $xbus_num = shift || die;
+ my $xbus_dir = "$Dahdi::Xpp::sysfs_astribanks/xbus-$xbus_num";
+ my $pat = sprintf "%s/xbus-%02d/[0-9][0-9]:[0-9]:[0-9]", $Dahdi::Xpp::sysfs_astribanks, $xbus_num;
+ my @xpdnames;
+
+ #print STDERR "read_xpdnames($xbus_num): $pat\n";
+ foreach (glob $pat) {
+ die "Bad /sys entry: '$_'" unless m/^.*\/([0-9][0-9]):([0-9]):([0-9])$/;
+ my ($busnum, $unit, $subunit) = ($1, $2, $3);
+ my $name = sprintf("%02d:%1d:%1d", $1, $2, $3);
+ #print STDERR "\t> $_ ($name)\n";
+ push(@xpdnames, $name);
+ }
+ return @xpdnames;
+}
+
+my $warned_notransport = 0;
+
sub new($$) {
my $pack = shift or die "Wasn't called as a class method\n";
my $num = shift;
@@ -116,18 +153,22 @@ sub new($$) {
warn "Bad USB transport='$transport' usbdev='$usbdev'\n";
}
}
- @{$self->{XPDS}} = ();
- opendir(D, $xbus_dir) || die "Failed opendir($xbus_dir): $!";
- while(my $entry = readdir D) {
- $entry =~ /^([0-9]+):([0-9]+):([0-9]+)$/ or next;
- my ($busnum, $unit, $subunit) = ($1, $2, $3);
+ my @xpdnames;
+ my @xpds;
+ if(-e $transport) {
+ @xpdnames = read_xpdnames($num);
+ } else {
+ @xpdnames = read_xpdnames_old($num);
+ warn "$0: warning - OLD DRIVER: missing '$transport'. Fall back to /proc\n"
+ unless $warned_notransport++;
+ }
+ foreach my $xpdstr (@xpdnames) {
+ my ($busnum, $unit, $subunit) = split(/:/, $xpdstr);
my $procdir = "/proc/xpp/XBUS-$busnum/XPD-$unit$subunit";
- #print STDERR "busnum=$busnum, unit=$unit, subunit=$subunit procdir=$procdir\n";
- my $xpd = Dahdi::Xpp::Xpd->new($self, $unit, $subunit, $procdir, "$xbus_dir/$entry");
- push(@{$self->{XPDS}}, $xpd);
+ my $xpd = Dahdi::Xpp::Xpd->new($self, $unit, $subunit, $procdir, "$xbus_dir/$xpdstr");
+ push(@xpds, $xpd);
}
- closedir D;
- @{$self->{XPDS}} = sort { $a->id <=> $b->id } @{$self->{XPDS}};
+ @{$self->{XPDS}} = sort { $a->id <=> $b->id } @xpds;
return $self;
}