Add support for Digium's new te13x line of cards
[dahdi/tools.git] / xpp / perl_modules / Dahdi / Hardware / PCI.pm
1 package Dahdi::Hardware::PCI;
2 #
3 # Written by Oron Peled <oron@actcom.co.il>
4 # Copyright (C) 2007, Xorcom
5 # This program is free software; you can redistribute and/or
6 # modify it under the same terms as Perl itself.
7 #
8 # $Id$
9 #
10 use strict;
11 use Dahdi::Utils;
12 use Dahdi::Hardware;
13
14 our @ISA = qw(Dahdi::Hardware);
15
16 # Lookup algorithm:
17 #       First match 'vendor:product/subvendor:subproduct' key
18 #       Else match 'vendor:product/subvendor' key
19 #       Else match 'vendor:product' key
20 #       Else not a dahdi hardware.
21 my %pci_ids = (
22         # from wct4xxp
23         '10ee:0314'             => { DRIVER => 'wct4xxp', DESCRIPTION => 'Wildcard TE410P/TE405P (1st Gen)' },
24         'd161:1420'             => { DRIVER => 'wct4xxp', DESCRIPTION => 'Wildcard TE420 (5th Gen)' },
25         'd161:1410'             => { DRIVER => 'wct4xxp', DESCRIPTION => 'Wildcard TE410P (5th Gen)' },
26         'd161:1405'             => { DRIVER => 'wct4xxp', DESCRIPTION => 'Wildcard TE405P (5th Gen)' },
27         'd161:0420/0004'        => { DRIVER => 'wct4xxp', DESCRIPTION => 'Wildcard TE420 (4th Gen)' },
28         'd161:0410/0004'        => { DRIVER => 'wct4xxp', DESCRIPTION => 'Wildcard TE410P (4th Gen)' },
29         'd161:0405/0004'        => { DRIVER => 'wct4xxp', DESCRIPTION => 'Wildcard TE405P (4th Gen)' },
30         'd161:0410/0003'        => { DRIVER => 'wct4xxp', DESCRIPTION => 'Wildcard TE410P (3rd Gen)' },
31         'd161:0405/0003'        => { DRIVER => 'wct4xxp', DESCRIPTION => 'Wildcard TE405P (3rd Gen)' },
32         'd161:0410'             => { DRIVER => 'wct4xxp', DESCRIPTION => 'Wildcard TE410P (2nd Gen)' },
33         'd161:0405'             => { DRIVER => 'wct4xxp', DESCRIPTION => 'Wildcard TE405P (2nd Gen)' },
34         'd161:1220'             => { DRIVER => 'wct4xxp', DESCRIPTION => 'Wildcard TE220 (5th Gen)' },
35         'd161:1205'             => { DRIVER => 'wct4xxp', DESCRIPTION => 'Wildcard TE205P (5th Gen)' },
36         'd161:1210'             => { DRIVER => 'wct4xxp', DESCRIPTION => 'Wildcard TE210P (5th Gen)' },
37         'd161:0220/0004'        => { DRIVER => 'wct4xxp', DESCRIPTION => 'Wildcard TE220 (4th Gen)' },
38         'd161:0205/0004'        => { DRIVER => 'wct4xxp', DESCRIPTION => 'Wildcard TE205P (4th Gen)' },
39         'd161:0210/0004'        => { DRIVER => 'wct4xxp', DESCRIPTION => 'Wildcard TE210P (4th Gen)' },
40         'd161:0205/0003'        => { DRIVER => 'wct4xxp', DESCRIPTION => 'Wildcard TE205P (3rd Gen)' },
41         'd161:0210/0003'        => { DRIVER => 'wct4xxp', DESCRIPTION => 'Wildcard TE210P (3rd Gen)' },
42         'd161:0205'             => { DRIVER => 'wct4xxp', DESCRIPTION => 'Wildcard TE205P ' },
43         'd161:0210'             => { DRIVER => 'wct4xxp', DESCRIPTION => 'Wildcard TE210P ' },
44         'd161:1820'             => { DRIVER => 'wct4xxp', DESCRIPTION => 'Wildcard TE820 (5th Gen)' },
45
46         # from wctdm24xxp
47         'd161:2400'             => { DRIVER => 'wctdm24xxp', DESCRIPTION => 'Wildcard TDM2400P' },
48         'd161:0800'             => { DRIVER => 'wctdm24xxp', DESCRIPTION => 'Wildcard TDM800P' },
49         'd161:8002'             => { DRIVER => 'wctdm24xxp', DESCRIPTION => 'Wildcard AEX800' },
50         'd161:8003'             => { DRIVER => 'wctdm24xxp', DESCRIPTION => 'Wildcard AEX2400' },
51         'd161:8005'             => { DRIVER => 'wctdm24xxp', DESCRIPTION => 'Wildcard TDM410P' },
52         'd161:8006'             => { DRIVER => 'wctdm24xxp', DESCRIPTION => 'Wildcard AEX410P' },
53         'd161:8007'             => { DRIVER => 'wctdm24xxp', DESCRIPTION => 'HA8-0000' },
54         'd161:8008'             => { DRIVER => 'wctdm24xxp', DESCRIPTION => 'HB8-0000' },
55
56         # from pciradio
57         'e159:0001/e16b'        => { DRIVER => 'pciradio', DESCRIPTION => 'PCIRADIO' },
58
59         # from wcfxo
60         'e159:0001/8084'        => { DRIVER => 'wcfxo', DESCRIPTION => 'Wildcard X101P clone' },
61         'e159:0001/8085'        => { DRIVER => 'wcfxo', DESCRIPTION => 'Wildcard X101P' },
62         'e159:0001/8086'        => { DRIVER => 'wcfxo', DESCRIPTION => 'Wildcard X101P clone' },
63         'e159:0001/8087'        => { DRIVER => 'wcfxo', DESCRIPTION => 'Wildcard X101P clone' },
64         '1057:5608'             => { DRIVER => 'wcfxo', DESCRIPTION => 'Wildcard X100P' },
65
66         # from wct1xxp
67         'e159:0001/6159'        => { DRIVER => 'wct1xxp', DESCRIPTION => 'Digium Wildcard T100P T1/PRI or E100P E1/PRA Board' },
68
69         # from wctdm
70         'e159:0001/a159'        => { DRIVER => 'wctdm', DESCRIPTION => 'Wildcard S400P Prototype' },
71         'e159:0001/e159'        => { DRIVER => 'wctdm', DESCRIPTION => 'Wildcard S400P Prototype' },
72         'e159:0001/b100'        => { DRIVER => 'wctdm', DESCRIPTION => 'Wildcard TDM400P REV E/F' },
73         'e159:0001/b1d9'        => { DRIVER => 'wctdm', DESCRIPTION => 'Wildcard TDM400P REV I' },
74         'e159:0001/b118'        => { DRIVER => 'wctdm', DESCRIPTION => 'Wildcard TDM400P REV I' },
75         'e159:0001/b119'        => { DRIVER => 'wctdm', DESCRIPTION => 'Wildcard TDM400P REV I' },
76         'e159:0001/a9fd'        => { DRIVER => 'wctdm', DESCRIPTION => 'Wildcard TDM400P REV H' },
77         'e159:0001/a8fd'        => { DRIVER => 'wctdm', DESCRIPTION => 'Wildcard TDM400P REV H' },
78         'e159:0001/a800'        => { DRIVER => 'wctdm', DESCRIPTION => 'Wildcard TDM400P REV H' },
79         'e159:0001/a801'        => { DRIVER => 'wctdm', DESCRIPTION => 'Wildcard TDM400P REV H' },
80         'e159:0001/a908'        => { DRIVER => 'wctdm', DESCRIPTION => 'Wildcard TDM400P REV H' },
81         'e159:0001/a901'        => { DRIVER => 'wctdm', DESCRIPTION => 'Wildcard TDM400P REV H' },
82         #'e159:0001'            => { DRIVER => 'wctdm', DESCRIPTION => 'Wildcard TDM400P REV H' },
83
84         # from wcte11xp
85         'e159:0001/71fe'        => { DRIVER => 'wcte11xp', DESCRIPTION => 'Digium Wildcard TE110P T1/E1 Board' },
86         'e159:0001/79fe'        => { DRIVER => 'wcte11xp', DESCRIPTION => 'Digium Wildcard TE110P T1/E1 Board' },
87         'e159:0001/795e'        => { DRIVER => 'wcte11xp', DESCRIPTION => 'Digium Wildcard TE110P T1/E1 Board' },
88         'e159:0001/79de'        => { DRIVER => 'wcte11xp', DESCRIPTION => 'Digium Wildcard TE110P T1/E1 Board' },
89         'e159:0001/797e'        => { DRIVER => 'wcte11xp', DESCRIPTION => 'Digium Wildcard TE110P T1/E1 Board' },
90
91         # from wcte12xp
92         'd161:0120'             => { DRIVER => 'wcte12xp', DESCRIPTION => 'Wildcard TE12xP' },
93         'd161:8000'             => { DRIVER => 'wcte12xp', DESCRIPTION => 'Wildcard TE121' },
94         'd161:8001'             => { DRIVER => 'wcte12xp', DESCRIPTION => 'Wildcard TE122' },
95
96         # from wcte13xp
97         'd161:800a'             => { DRIVER => 'wcte13xp', DESCRIPTION => 'Wildcard TE133' },
98         'd161:800b'             => { DRIVER => 'wcte13xp', DESCRIPTION => 'Wildcard TE134' },
99
100         # from wcb4xxp
101         'd161:b410'             => { DRIVER => 'wcb4xxp', DESCRIPTION => 'Digium Wildcard B410P' },
102
103         # from tor2
104         '10b5:9030'             => { DRIVER => 'tor2', DESCRIPTION => 'PLX 9030' },
105         '10b5:3001'             => { DRIVER => 'tor2', DESCRIPTION => 'PLX Development Board' },
106         '10b5:d00d'             => { DRIVER => 'tor2', DESCRIPTION => 'Tormenta 2 Quad T1/PRI or E1/PRA' },
107         '10b5:4000'             => { DRIVER => 'tor2', DESCRIPTION => 'Tormenta 2 Quad T1/E1 (non-Digium clone)' },
108
109         # # from wctc4xxp
110         'd161:3400'             => { DRIVER => 'wctc4xxp', DESCRIPTION => 'Wildcard TC400P' },
111         'd161:8004'             => { DRIVER => 'wctc4xxp', DESCRIPTION => 'Wildcard TCE400P' },
112
113         # Cologne Chips:
114         # (Still a partial list)
115         '1397:08b4/1397:b540'   => { DRIVER => 'wcb4xxp', DESCRIPTION => 'Swyx 4xS0 SX2 QuadBri' },
116         '1397:08b4/1397:b556'   => { DRIVER => 'wcb4xxp', DESCRIPTION => 'Junghanns DuoBRI ISDN card' },
117         '1397:08b4/1397:b520'   => { DRIVER => 'wcb4xxp', DESCRIPTION => 'Junghanns QuadBRI ISDN card' },
118         '1397:08b4/1397:b550'   => { DRIVER => 'wcb4xxp', DESCRIPTION => 'Junghanns QuadBRI ISDN card' },
119         '1397:08b4/1397:b752'   => { DRIVER => 'wcb4xxp', DESCRIPTION => 'Junghanns QuadBRI ISDN PCI-E card' },
120         '1397:16b8/1397:b552'   => { DRIVER => 'wcb4xxp', DESCRIPTION => 'Junghanns OctoBRI ISDN card' },
121         '1397:16b8/1397:b55b'   => { DRIVER => 'wcb4xxp', DESCRIPTION => 'Junghanns OctoBRI ISDN card' },
122         '1397:08b4/1397:e884'   => { DRIVER => 'wcb4xxp', DESCRIPTION => 'OpenVox B200P' },
123         '1397:08b4/1397:e888'   => { DRIVER => 'wcb4xxp', DESCRIPTION => 'OpenVox B400P' },
124         '1397:16b8/1397:e998'   => { DRIVER => 'wcb4xxp', DESCRIPTION => 'OpenVox B800P' },
125         '1397:08b4/1397:b566'   => { DRIVER => 'wcb4xxp', DESCRIPTION => 'BeroNet BN2S0' },
126         '1397:08b4/1397:b560'   => { DRIVER => 'wcb4xxp', DESCRIPTION => 'BeroNet BN4S0' },
127         '1397:08b4/1397:b762'   => { DRIVER => 'wcb4xxp', DESCRIPTION => 'BeroNet BN4S0 PCI-E card' },
128         '1397:16b8/1397:b562'   => { DRIVER => 'wcb4xxp', DESCRIPTION => 'BeroNet BN8S0' },
129         '1397:08b4'             => { DRIVER => 'qozap', DESCRIPTION => 'Generic Cologne ISDN card' },
130         '1397:16b8'             => { DRIVER => 'qozap', DESCRIPTION => 'Generic OctoBRI ISDN card' },
131         '1397:30b1'             => { DRIVER => 'cwain', DESCRIPTION => 'HFC-E1 ISDN E1 card' },
132         '1397:2bd0'             => { DRIVER => 'zaphfc', DESCRIPTION => 'HFC-S ISDN BRI card' },
133         # Has three submodels. Tested with 0675:1704:
134         '1043:0675'             => { DRIVER => 'zaphfc', DESCRIPTION => 'ASUSTeK Computer Inc. ISDNLink P-IN100-ST-D' },
135         '1397:f001'             => { DRIVER => 'ztgsm', DESCRIPTION => 'HFC-GSM Cologne Chips GSM' },
136
137         # Rhino cards (based on pci.ids)
138         '0b0b:0105'     => { DRIVER => 'r1t1', DESCRIPTION => 'Rhino R1T1' },
139         '0b0b:0205'     => { DRIVER => 'r4fxo', DESCRIPTION => 'Rhino R14FXO' },
140         '0b0b:0206'     => { DRIVER => 'rcbfx', DESCRIPTION => 'Rhino RCB4FXO 4-channel FXO analog telphony card' },
141         '0b0b:0305'     => { DRIVER => 'rxt1', DESCRIPTION => 'Rhino R4T1' },
142         '0b0b:0405'     => { DRIVER => 'rcbfx', DESCRIPTION => 'Rhino R8FXX' },
143         '0b0b:0406'     => { DRIVER => 'rcbfx', DESCRIPTION => 'Rhino RCB8FXX 8-channel modular analog telphony card' },
144         '0b0b:0505'     => { DRIVER => 'rcbfx', DESCRIPTION => 'Rhino R24FXX' },
145         '0b0b:0506'     => { DRIVER => 'rcbfx', DESCRIPTION => 'Rhino RCB24FXS 24-Channel FXS analog telphony card' },
146         '0b0b:0605'     => { DRIVER => 'rxt1', DESCRIPTION => 'Rhino R2T1' },
147         '0b0b:0705'     => { DRIVER => 'rcbfx', DESCRIPTION => 'Rhino R24FXS' },
148         '0b0b:0706'     => { DRIVER => 'rcbfx', DESCRIPTION => 'Rhino RCB24FXO 24-Channel FXO analog telphony card' },
149         '0b0b:0906'     => { DRIVER => 'rcbfx', DESCRIPTION => 'Rhino RCB24FXX 24-channel modular analog telphony card' },
150
151         # Sangoma cards (based on pci.ids)
152         '1923:0040'     => { DRIVER => 'wanpipe', DESCRIPTION => 'Sangoma Technologies Corp. A200/Remora FXO/FXS Analog AFT card' },
153         '1923:0100'     => { DRIVER => 'wanpipe', DESCRIPTION => 'Sangoma Technologies Corp. A104d QUAD T1/E1 AFT card' },
154         '1923:0300'     => { DRIVER => 'wanpipe', DESCRIPTION => 'Sangoma Technologies Corp. A101 single-port T1/E1' },
155         '1923:0400'     => { DRIVER => 'wanpipe', DESCRIPTION => 'Sangoma Technologies Corp. A104u Quad T1/E1 AFT' },
156
157         # Yeastar (from output of modinfo):
158         'e159:0001/2151' => { DRIVER => 'ystdm8xx', DESCRIPTION => 'Yeastar YSTDM8xx'},
159
160         'e159:0001/9500:0003' => { DRIVER => 'opvxa1200', DESCRIPTION => 'OpenVox A800P' },
161
162         # Aligera
163         '10ee:1004'             => { DRIVER => 'ap400', DESCRIPTION => 'Aligera AP40X/APE40X 1E1/2E1/4E1 card' },
164         );
165
166 $ENV{PATH} .= ":/usr/sbin:/sbin:/usr/bin:/bin";
167
168 sub pci_sorter {
169         return $a->priv_device_name() cmp $b->priv_device_name();
170 }
171
172 sub new($@) {
173         my $pack = shift || die "Wasn't called as a class method\n";
174         my %attr = @_;
175         my $name = sprintf("pci:%s", $attr{PRIV_DEVICE_NAME});
176         my $self = Dahdi::Hardware->new($name, 'PCI');
177         %{$self} = (%{$self}, %attr);
178         bless $self, $pack;
179         return $self;
180 }
181
182 my %pci_devs;
183
184 sub readfile($) {
185         my $name = shift || die;
186         open(F, $name) || die "Failed to open '$name': $!";
187         my $str = <F>;
188         close F;
189         chomp($str);
190         return $str;
191 }
192
193 sub scan_devices($) {
194         my @devices;
195
196         while(<$Dahdi::sys_base/bus/pci/devices/*>) {
197                 m,([^/]+)$,,;
198                 my $name = $1;
199                 my $l = readlink $_ || die;
200                 $pci_devs{$name}{PRIV_DEVICE_NAME} = $name;
201                 $pci_devs{$name}{DEVICE} = $l;
202                 $pci_devs{$name}{VENDOR} = readfile "$_/vendor";
203                 $pci_devs{$name}{PRODUCT} = readfile "$_/device";
204                 $pci_devs{$name}{SUBVENDOR} = readfile "$_/subsystem_vendor";
205                 $pci_devs{$name}{SUBPRODUCT} = readfile "$_/subsystem_device";
206                 my $dev = $pci_devs{$name};
207                 grep(s/0x//, $dev->{VENDOR}, $dev->{PRODUCT}, $dev->{SUBVENDOR}, $dev->{SUBPRODUCT});
208                 $pci_devs{$name}{DRIVER} = '';
209         }
210
211         while(<$Dahdi::sys_base/bus/pci/drivers/*/[0-9]*>) {
212                 m,^(.*?)/([^/]+)/([^/]+)$,;
213                 my $prefix = $1;
214                 my $drvname = $2;
215                 my $id = $3;
216                 my $l = readlink "$prefix/$drvname/module";
217                 # Find the real module name (if we can).
218                 if(defined $l) {
219                         my $moduledir = "$prefix/$drvname/$l";
220                         my $modname = $moduledir;
221                         $modname =~ s:^.*/::;
222                         $drvname = $modname;
223                 }
224                 $pci_devs{$id}{LOADED} = $drvname;
225         }
226         foreach (sort keys %pci_devs) {
227                 my $dev = $pci_devs{$_};
228                 my $key;
229                 # Try to match
230                 $key = "$dev->{VENDOR}:$dev->{PRODUCT}/$dev->{SUBVENDOR}:$dev->{SUBPRODUCT}";
231                 $key = "$dev->{VENDOR}:$dev->{PRODUCT}/$dev->{SUBVENDOR}" if !defined($pci_ids{$key});
232                 $key = "$dev->{VENDOR}:$dev->{PRODUCT}" if !defined($pci_ids{$key});
233                 next unless defined $pci_ids{$key};
234
235                 my $d = Dahdi::Hardware::PCI->new(
236                         PRIV_DEVICE_NAME        => $dev->{PRIV_DEVICE_NAME},
237                         VENDOR                  => $dev->{VENDOR},
238                         PRODUCT                 => $dev->{PRODUCT},
239                         SUBVENDOR               => $dev->{SUBVENDOR},
240                         SUBPRODUCT              => $dev->{SUBPRODUCT},
241                         LOADED                  => $dev->{LOADED},
242                         DRIVER                  => $pci_ids{$key}{DRIVER},
243                         DESCRIPTION             => $pci_ids{$key}{DESCRIPTION},
244                         );
245                 push(@devices, $d);
246         }
247         @devices = sort pci_sorter @devices;
248         return @devices;
249 }
250
251 1;