]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blob - src/hwinfo/src/ids/get_adaptec
Signierten GPG-Schluessel importiert.
[people/pmueller/ipfire-2.x.git] / src / hwinfo / src / ids / get_adaptec
1 #! /usr/bin/perl
2
3 #
4 # read gcc -E {aic79xx_pci.c,aic7xxx_pci.c} and extract module info
5 #
6
7 sub add_range;
8 sub add_entry;
9
10 while(<>) {
11 if(/^struct.*ah[cd]_pci_ident_table\s*\[\s*\]\s*=\s*$/ .. /^\}/) {
12 if(/^struct.*ah([cd])_pci_ident_table\s*\[\s*\]\s*=\s*$/) {
13 $mod = $1 eq "c" ? "aic7xxx" : "aic79xx";
14 }
15
16 if(/^\s+\{/ .. /^\s+\}/) {
17 if(/^\s+\}/) {
18 if($field && $field != 4) {
19 die "oops, unexpected line $.: $_";
20 }
21 if($field) {
22 # print "id = $id, id_mask = $id_mask, mask = $mask, name = $name, func = $func\n";
23 add_entry;
24 }
25
26 undef $field;
27 undef $id;
28 undef $id_mask;
29 undef $mask;
30 undef $name;
31 undef $func;
32 }
33
34 if($field == 0 && /^\s+0x([0-9A-Fa-f]{16})ull\s*,\s*$/) {
35 $id = $1;
36 $field++;
37 }
38 elsif($field == 0 && /^\s+0x([0-9A-Fa-f]{16})ull\s*\&\s*0x([0-9A-Fa-f]{16})ull\s*,\s*$/) {
39 $id = $1;
40 $id_mask = $2;
41 $field++;
42 }
43 elsif($field == 1 && /^\s+0x([0-9A-Fa-f]{16})ull\s*,\s*$/) {
44 $mask = $1;
45 $field++;
46 }
47 elsif($field == 2 && /^\s+((NULL|\(\(void\s*\*\)\s*0\))|(\".+\"))\s*,\s*$/) {
48 $name = $1;
49 $field++;
50 }
51 elsif($field == 3 && /^\s+((NULL|\(\(void\s*\*\)\s*0\))|([a-z].+))\s*,?\s*$/) {
52 $func = $1;
53 $field++;
54 }
55 }
56
57 }
58 }
59
60 sub add_range
61 {
62 my ($r);
63
64 $r = 0xffff - $_[0];
65
66 return unless $r;
67
68 if($r != 15) {
69 printf " & 0x%04x", $r;
70 }
71 else {
72 printf " + 0x0010";
73 }
74 }
75
76
77 sub add_entry
78 {
79 local $_;
80 my ($v, $d, $sv, $sd);
81 my ($vm, $dm, $svm, $sdm);
82 my ($tag);
83
84 $id_mask = "F" x 16 unless defined $id_mask;
85
86 $d = hex(substr $id, 0, 4) & hex(substr $id_mask, 0, 4);
87 $v = hex(substr $id, 4, 4) & hex(substr $id_mask, 4, 4);
88 $sd = hex(substr $id, 8, 4) & hex(substr $id_mask, 8, 4);
89 $sv = hex(substr $id, 12, 4) & hex(substr $id_mask, 12, 4);
90
91 $dm = hex(substr $mask, 0, 4);
92 $vm = hex(substr $mask, 4, 4);
93 $sdm = hex(substr $mask, 8, 4);
94 $svm = hex(substr $mask, 12, 4);
95
96 $name =~ s/^"|"$//g;
97
98 if($func !~ /^[a-z]/) {
99 print STDERR "entry \"$name\" dropped\n";
100 return;
101 }
102
103 print "\n# $name\n";
104
105 $tag = " ";
106
107 if($vm) {
108 printf "${tag}vendor.id\t\tpci 0x%04x", $v;
109 add_range $vm;
110 print "\n";
111
112 $tag = "&";
113 }
114
115 if($dm) {
116 printf "${tag}device.id\t\tpci 0x%04x", $d;
117 add_range $dm;
118 print "\n";
119
120 $tag = "&";
121 }
122
123 if($svm) {
124 printf "${tag}subvendor.id\t\tpci 0x%04x", $sv;
125 add_range $svm;
126 print "\n";
127
128 $tag = "&";
129 }
130
131 if($sdm) {
132 printf "${tag}subdevice.id\t\tpci 0x%04x", $sd;
133 add_range $sdm;
134 print "\n";
135
136 $tag = "&";
137 }
138
139 printf "+driver.module.modprobe\t%s\n", $mod;
140
141 }
142