]> git.proxmox.com Git - pve-kernel-2.6.32.git/blob - assemble-firmware.pl
vzkernel-2.6.32-042stab046.1.src.rpm
[pve-kernel-2.6.32.git] / assemble-firmware.pl
1 #!/usr/bin/perl -w
2
3 use strict;
4 use File::Basename;
5 use File::Path;
6
7 my $fwsrc0 = "linux-2.6-2.6.32/firmware";
8 my $fwsrc1 = "linux-firmware.git";
9 my $fwsrc2 = "linux-firmware-from-kernel.git";
10 my $fwsrc3 = "firmware-misc";
11
12 my $fwlist = shift;
13 die "no firmware list specified" if !$fwlist || ! -f $fwlist;
14
15 my $target = shift;
16 die "no target directory" if !$target || ! -d $target;
17
18 my $force_skip = {
19
20 # not needed, the HBA has burned-in firmware
21 'ql8100_fw.bin' => 1,
22 };
23
24 my $skip = {};
25 # debian squeeze also misses those files
26 foreach my $fw (qw(
27 libertas/gspi8385.bin libertas/gspi8385_hlp.bin
28 cbfw.bin ctfw.bin ct2fw.bin
29 tehuti/firmware.bin
30 cyzfirm.bin
31 isi4616.bin
32 isi4608.bin
33 isi616em.bin
34 isi608.bin
35 isi608em.bin
36 c320tunx.cod
37 cp204unx.cod
38 c218tunx.cod
39 isight.fw
40 BT3CPCC.bin
41 bfubase.frm
42 solos-db-FPGA.bin
43 solos-Firmware.bin
44 solos-FPGA.bin
45 pca200e_ecd.bin2
46 prism2_ru.fw
47 tms380tr.bin
48 FW10
49 FW13
50 comedi/jr3pci.idm
51
52 sd8686.bin
53 sd8686_helper.bin
54 usb8388.bin
55 libertas_cs_helper.fw
56 lbtf_usb.bin
57
58 wl1271-fw.bin
59 wl1251-fw.bin
60 symbol_sp24t_sec_fw
61 symbol_sp24t_prim_fw
62 prism_ap_fw.bin
63 prism_sta_fw.bin
64 ar9170.fw
65 iwmc3200wifi-lmac-sdio.bin
66 iwmc3200wifi-calib-sdio.bin
67 iwmc3200wifi-umac-sdio.bin
68 iwmc3200top.1.fw
69 zd1201.fw
70 zd1201-ap.fw
71 isl3887usb
72 isl3886usb
73 isl3886pci
74 3826.arm
75
76 rtl8168d-1.fw
77 rtl8168d-2.fw
78
79 i2400m-fw-sdio-1.3.sbcf
80
81 nx3fwmn.bin
82 nx3fwct.bin
83 nxromimg.bin
84
85 myri10ge_rss_eth_z8e.dat
86 myri10ge_rss_ethp_z8e.dat
87 myri10ge_eth_z8e.dat
88 myri10ge_ethp_z8e.dat
89
90 i1480-phy-0.0.bin
91 i1480-usb-0.0.bin
92 i1480-pre-phy-0.0.bin
93
94 go7007fw.bin
95 go7007tv.bin
96
97 sep/resident.image.bin
98 sep/cache.image.bin
99 b43legacy/ucode4.fw
100 b43legacy/ucode2.fw
101 b43/ucode9.fw
102 b43/ucode5.fw
103 b43/ucode15.fw
104 b43/ucode14.fw
105 b43/ucode13.fw
106 b43/ucode11.fw
107 orinoco_ezusb_fw
108 isl3890
109 isl3886
110 isl3877
111 mwl8k/fmimage_8366.fw
112 mwl8k/helper_8366.fw
113 mwl8k/fmimage_8363.fw
114 mwl8k/helper_8363.fw
115 iwlwifi-6000g2a-4.ucode
116 iwlwifi-130-5.ucode
117 cxgb4/t4fw.bin
118 cxgb4/t4fw-1.3.10.0.bin
119
120 )) {
121 $skip->{$fw} = 1;
122 }
123
124 sub copy_fw {
125 my ($src, $dstfw) = @_;
126
127 my $dest = "$target/$dstfw";
128
129 return if -f $dest;
130
131 mkpath dirname($dest);
132 system ("cp '$src' '$dest'") == 0 || die "copy $src to $dest failed";
133 }
134
135 my $fwdone = {};
136
137 open(TMP, $fwlist);
138 while(defined(my $line = <TMP>)) {
139 chomp $line;
140 my ($fw, $mod) = split(/\s+/, $line, 2);
141
142 next if $mod =~ m|^kernel/sound|;
143 next if $mod =~ m|^kernel/drivers/isdn|;
144
145 # skip ZyDas usb wireless, use package zd1211-firmware instead
146 next if $fw =~ m|^zd1211/|;
147
148 # skip atmel at76c50x wireless networking chips.
149 # use package atmel-firmware instead
150 next if $fw =~ m|^atmel_at76c50|;
151
152 # skip Bluetooth dongles based on the Broadcom BCM203x
153 # use package bluez-firmware instead
154 next if $fw =~ m|^BCM2033|;
155
156 next if $force_skip->{$fw};
157
158 next if $fwdone->{$fw};
159 $fwdone->{$fw} = 1;
160
161 my $fwdest = $fw;
162 if ($fw eq 'libertas/gspi8686.bin') {
163 $fw = 'libertas/gspi8686_v9.bin';
164 }
165 if ($fw eq 'libertas/gspi8686_hlp.bin') {
166 $fw = 'libertas/gspi8686_v9_helper.bin';
167 }
168
169 if ($fw eq 'PE520.cis') {
170 $fw = 'cis/PE520.cis';
171 }
172
173 if (-f "$fwsrc0/$fw") {
174 copy_fw("$fwsrc0/$fw", $fwdest);
175 next;
176 }
177 if (-f "$fwsrc1/$fw") {
178 copy_fw("$fwsrc1/$fw", $fwdest);
179 next;
180 }
181 if (-f "$fwsrc2/$fw") {
182 copy_fw("$fwsrc2/$fw", $fwdest);
183 next;
184 }
185 if (-f "$fwsrc3/$fw") {
186 copy_fw("$fwsrc3/$fw", $fwdest);
187 next;
188 }
189
190 if ($fw =~ m|/|) {
191 next if $skip->{$fw};
192 die "unable to find firmware: $fw $mod\n";
193 }
194
195 my $name = basename($fw);
196
197 my $sr = `find '$fwsrc1' -name '$name'`;
198 chomp $sr;
199 if ($sr) {
200 #print "found $fw in $sr\n";
201 copy_fw($sr, $fwdest);
202 next;
203 }
204 $sr = `find '$fwsrc2' -name '$name'`;
205 chomp $sr;
206 if ($sr) {
207 #print "found $fw in $sr\n";
208 copy_fw($sr, $fwdest);
209 next;
210 }
211 $sr = `find '$fwsrc3' -name '$name'`;
212 chomp $sr;
213 if ($sr) {
214 #print "found $fw in $sr\n";
215 copy_fw($sr, $fwdest);
216 next;
217 }
218
219 next if $skip->{$fw};
220
221 die "unable to find firmware: $fw $mod\n";
222 }
223 close(TMP);
224
225 exit(0);