Contents of /trunk/pciutils/patches/pciutils-2.2.4-pcimodules.patch
Parent Directory | Revision Log
Revision 153 -
(show annotations)
(download)
Tue May 8 20:52:56 2007 UTC (17 years, 4 months ago) by niro
File size: 11724 byte(s)
Tue May 8 20:52:56 2007 UTC (17 years, 4 months ago) by niro
File size: 11724 byte(s)
-import
1 | diff -Naur pciutils-2.2.4/lspci.c pciutils-2.2.4-pcimodules/lspci.c |
2 | --- pciutils-2.2.4/lspci.c 2006-09-09 14:32:29.000000000 +0200 |
3 | +++ pciutils-2.2.4-pcimodules/lspci.c 2007-03-29 21:50:06.000000000 +0200 |
4 | @@ -120,8 +120,10 @@ |
5 | d->config = xmalloc(64); |
6 | d->present = xmalloc(64); |
7 | memset(d->present, 1, 64); |
8 | - if (!pci_read_block(p, 0, d->config, 64)) |
9 | - die("Unable to read the standard configuration space header"); |
10 | + if (!pci_read_block(p, 0, d->config, 64)) { |
11 | + fprintf(stderr, "Unable to read the standard configuration space header"); |
12 | + return NULL; |
13 | + } |
14 | if ((d->config[PCI_HEADER_TYPE] & 0x7f) == PCI_HEADER_TYPE_CARDBUS) |
15 | { |
16 | /* For cardbus bridges, we need to fetch 64 bytes more to get the |
17 | diff -Naur pciutils-2.2.4/Makefile pciutils-2.2.4-pcimodules/Makefile |
18 | --- pciutils-2.2.4/Makefile 2006-09-09 14:57:03.000000000 +0200 |
19 | +++ pciutils-2.2.4-pcimodules/Makefile 2007-03-29 21:55:20.000000000 +0200 |
20 | @@ -24,7 +24,7 @@ |
21 | |
22 | export |
23 | |
24 | -all: $(PCILIB) lspci setpci lspci.8 setpci.8 update-pciids update-pciids.8 $(PCI_IDS) |
25 | +all: $(PCILIB) lspci setpci pcimodules lspci.8 setpci.8 update-pciids update-pciids.8 pcimodules.8 $(PCI_IDS) |
26 | |
27 | $(PCILIB): $(PCIINC) force |
28 | $(MAKE) -C lib all |
29 | @@ -34,9 +34,11 @@ |
30 | lib/config.h lib/config.mk: |
31 | cd lib && ./configure "$(IDSDIR)" "$(VERSION)" "$(HOST)" "$(RELEASE)" "$(ZLIB)" |
32 | |
33 | +pcimodules: pcimodules.o common.o $(PCILIB) |
34 | lspci: lspci.o common.o $(PCILIB) |
35 | setpci: setpci.o common.o $(PCILIB) |
36 | |
37 | +pcimodules.o: pcimodules.c pciutils.h $(PCIINC) |
38 | lspci.o: lspci.c pciutils.h $(PCIINC) |
39 | setpci.o: setpci.c pciutils.h $(PCIINC) |
40 | common.o: common.c pciutils.h $(PCIINC) |
41 | @@ -58,15 +60,15 @@ |
42 | install: all |
43 | # -c is ignored on Linux, but required on FreeBSD |
44 | $(DIRINSTALL) -m 755 $(DESTDIR)$(SBINDIR) $(DESTDIR)$(IDSDIR) $(DESTDIR)$(MANDIR)/man8 |
45 | - $(INSTALL) -c -m 755 -s lspci setpci $(DESTDIR)$(SBINDIR) |
46 | + $(INSTALL) -c -m 755 -s lspci setpci pcimodules $(DESTDIR)$(SBINDIR) |
47 | $(INSTALL) -c -m 755 update-pciids $(DESTDIR)$(SBINDIR) |
48 | $(INSTALL) -c -m 644 $(PCI_IDS) $(DESTDIR)$(IDSDIR) |
49 | - $(INSTALL) -c -m 644 lspci.8 setpci.8 update-pciids.8 $(DESTDIR)$(MANDIR)/man8 |
50 | + $(INSTALL) -c -m 644 lspci.8 setpci.8 update-pciids.8 pcimodules.8 $(DESTDIR)$(MANDIR)/man8 |
51 | |
52 | uninstall: all |
53 | - rm -f $(DESTDIR)$(SBINDIR)/lspci $(DESTDIR)$(SBINDIR)/setpci $(DESTDIR)$(SBINDIR)/update-pciids |
54 | + rm -f $(DESTDIR)$(SBINDIR)/lspci $(DESTDIR)$(SBINDIR)/setpci $(DESTDIR)$(SBINDIR)/update-pciids $(DESTDIR)$(SBINDIR)/pcimodules |
55 | rm -f $(DESTDIR)$(IDSDIR)/$(PCI_IDS) |
56 | - rm -f $(DESTDIR)$(MANDIR)/man8/lspci.8 $(DESTDIR)$(MANDIR)/man8/setpci.8 $(DESTDIR)$(MANDIR)/man8/update-pciids.8 |
57 | + rm -f $(DESTDIR)$(MANDIR)/man8/lspci.8 $(DESTDIR)$(MANDIR)/man8/setpci.8 $(DESTDIR)$(MANDIR)/man8/update-pciids.8 $(DESTDIR)$(MANDIR)/man8/pcimodules.8 |
58 | |
59 | pci.ids.gz: pci.ids |
60 | gzip -9 <$< >$@ |
61 | diff -Naur pciutils-2.2.4/pcimodules.c pciutils-2.2.4-pcimodules/pcimodules.c |
62 | --- pciutils-2.2.4/pcimodules.c 1970-01-01 01:00:00.000000000 +0100 |
63 | +++ pciutils-2.2.4-pcimodules/pcimodules.c 2007-03-29 21:50:06.000000000 +0200 |
64 | @@ -0,0 +1,183 @@ |
65 | +/* |
66 | + * pcimodules: Load all kernel modules for PCI device currently |
67 | + * plugged into any PCI slot. |
68 | + * |
69 | + * Copyright 2000 Yggdrasil Computing, Incorporated |
70 | + * This file may be copied under the terms and conditions of version |
71 | + * two of the GNU General Public License, as published by the Free |
72 | + * Software Foundation (Cambridge, Massachusetts, USA). |
73 | + * |
74 | + * This file is based on pciutils/lib/example.c, which has the following |
75 | + * authorship and copyright statement: |
76 | + * |
77 | + * Written by Martin Mares and put to public domain. You can do |
78 | + * with it anything you want, but I don't give you any warranty. |
79 | + */ |
80 | + |
81 | +#include <stdlib.h> |
82 | +#include <stdio.h> |
83 | +#include <malloc.h> |
84 | +#include <string.h> |
85 | +#include <unistd.h> |
86 | +#include <sys/utsname.h> |
87 | +#include <sys/param.h> |
88 | +#include <sys/types.h> |
89 | + |
90 | +#define _GNU_SOURCE |
91 | +#include <getopt.h> |
92 | + |
93 | +#include "pciutils.h" |
94 | + |
95 | +#define MODDIR "/lib/modules" |
96 | +#define PCIMAP "modules.pcimap" |
97 | + |
98 | +#define LINELENGTH 8000 |
99 | + |
100 | +#define DEVICE_ANY 0xffffffff |
101 | +#define VENDOR_ANY 0xffffffff |
102 | + |
103 | +#include "lib/pci.h" |
104 | + |
105 | +struct pcimap_entry { |
106 | + unsigned int vendor, subsys_vendor, dev, subsys_dev, class, class_mask; |
107 | + char *module; |
108 | + struct pcimap_entry *next; |
109 | +}; |
110 | + |
111 | +static struct pcimap_entry *pcimap_list = NULL; |
112 | + |
113 | +#define OPT_STRING "h" |
114 | +static struct option long_options[] = { |
115 | + {"class", required_argument, NULL, 'c'}, |
116 | + {"classmask", required_argument, NULL, 'm'}, |
117 | + {"help", no_argument, NULL, 'h'}, |
118 | + { 0, 0, 0, 0} |
119 | +}; |
120 | + |
121 | +static unsigned long desired_class; |
122 | +static unsigned long desired_classmask; /* Default is 0: accept all classes.*/ |
123 | + |
124 | +void |
125 | +read_pcimap(void) |
126 | +{ |
127 | + struct utsname utsname; |
128 | + char filename[MAXPATHLEN]; |
129 | + FILE *pcimap_file; |
130 | + char line[LINELENGTH]; |
131 | + struct pcimap_entry *entry; |
132 | + unsigned int driver_data; |
133 | + char *prevmodule = ""; |
134 | + char module[LINELENGTH]; |
135 | + |
136 | + if (uname(&utsname) < 0) { |
137 | + perror("uname"); |
138 | + exit(1); |
139 | + } |
140 | + sprintf(filename, "%s/%s/%s", MODDIR, utsname.release, PCIMAP); |
141 | + if ((pcimap_file = fopen(filename, "r")) == NULL) { |
142 | + perror(filename); |
143 | + exit(1); |
144 | + } |
145 | + |
146 | + while(fgets(line, LINELENGTH, pcimap_file) != NULL) { |
147 | + if (line[0] == '#') |
148 | + continue; |
149 | + |
150 | + entry = xmalloc(sizeof(struct pcimap_entry)); |
151 | + |
152 | + if (sscanf(line, "%s 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x", |
153 | + module, |
154 | + &entry->vendor, &entry->dev, |
155 | + &entry->subsys_vendor, &entry->subsys_dev, |
156 | + &entry->class, &entry->class_mask, |
157 | + &driver_data) != 8) { |
158 | + fprintf (stderr, |
159 | + "modules.pcimap unparsable line: %s.\n", line); |
160 | + free(entry); |
161 | + continue; |
162 | + } |
163 | + |
164 | + /* Optimize memory allocation a bit, in case someday we |
165 | + have Linux systems with ~100,000 modules. It also |
166 | + allows us to just compare pointers to avoid trying |
167 | + to load a module twice. */ |
168 | + if (strcmp(module, prevmodule) != 0) { |
169 | + prevmodule = xmalloc(strlen(module)+1); |
170 | + strcpy(prevmodule, module); |
171 | + } |
172 | + entry->module = prevmodule; |
173 | + entry->next = pcimap_list; |
174 | + pcimap_list = entry; |
175 | + } |
176 | + fclose(pcimap_file); |
177 | +} |
178 | + |
179 | +/* Return a filled in pci_access->dev tree, with the device classes |
180 | + stored in dev->aux. |
181 | +*/ |
182 | +static void |
183 | +match_pci_modules(void) |
184 | +{ |
185 | + struct pci_access *pacc; |
186 | + struct pci_dev *dev; |
187 | + unsigned int class, subsys_dev, subsys_vendor; |
188 | + struct pcimap_entry *map; |
189 | + const char *prevmodule = ""; |
190 | + |
191 | + pacc = pci_alloc(); /* Get the pci_access structure */ |
192 | + /* Set all options you want -- here we stick with the defaults */ |
193 | + pci_init(pacc); /* Initialize the PCI library */ |
194 | + pci_scan_bus(pacc); /* We want to get the list of devices */ |
195 | + for(dev=pacc->devices; dev; dev=dev->next) { |
196 | + pci_fill_info(dev, PCI_FILL_IDENT | PCI_FILL_BASES); |
197 | + class = (pci_read_word(dev, PCI_CLASS_DEVICE) << 8) |
198 | + | pci_read_byte(dev, PCI_CLASS_PROG); |
199 | + subsys_dev = pci_read_word(dev, PCI_SUBSYSTEM_ID); |
200 | + subsys_vendor = pci_read_word(dev,PCI_SUBSYSTEM_VENDOR_ID); |
201 | + for(map = pcimap_list; map != NULL; map = map->next) { |
202 | + if (((map->class ^ class) & map->class_mask) == 0 && |
203 | + ((desired_class ^ class) & desired_classmask)==0 && |
204 | + (map->dev == DEVICE_ANY || |
205 | + map->dev == dev->device_id) && |
206 | + (map->vendor == VENDOR_ANY || |
207 | + map->vendor == dev->vendor_id) && |
208 | + (map->subsys_dev == DEVICE_ANY || |
209 | + map->subsys_dev == subsys_dev) && |
210 | + (map->subsys_vendor == VENDOR_ANY || |
211 | + map->subsys_vendor == subsys_vendor) && |
212 | + prevmodule != map->module) { |
213 | + printf("%s\n", map->module); |
214 | + prevmodule = map->module; |
215 | + } |
216 | + } |
217 | + |
218 | + } |
219 | + pci_cleanup(pacc); |
220 | +} |
221 | + |
222 | +int |
223 | +main (int argc, char **argv) |
224 | +{ |
225 | + int opt_index = 0; |
226 | + int opt; |
227 | + |
228 | + while ((opt = getopt_long(argc, argv, OPT_STRING, long_options, |
229 | + &opt_index)) != -1) { |
230 | + switch(opt) { |
231 | + case 'c': |
232 | + desired_class = strtol(optarg, NULL, 0); |
233 | + break; |
234 | + case 'm': |
235 | + desired_classmask = strtol(optarg, NULL, 0); |
236 | + break; |
237 | + case 'h': |
238 | + printf ("Usage: pcimodules [--help]\n" |
239 | + " Lists kernel modules corresponding to PCI devices currently plugged" |
240 | + " into the computer.\n"); |
241 | + } |
242 | + } |
243 | + |
244 | + read_pcimap(); |
245 | + match_pci_modules(); |
246 | + return 0; |
247 | +} |
248 | diff -Naur pciutils-2.2.4/pcimodules.man pciutils-2.2.4-pcimodules/pcimodules.man |
249 | --- pciutils-2.2.4/pcimodules.man 1970-01-01 01:00:00.000000000 +0100 |
250 | +++ pciutils-2.2.4-pcimodules/pcimodules.man 2007-03-29 21:50:06.000000000 +0200 |
251 | @@ -0,0 +1,92 @@ |
252 | +.TH pcimodules 8 "@TODAY@" "@VERSION@" "Linux PCI Utilities" |
253 | +.IX pcimodules |
254 | +.SH NAME |
255 | +pcimodules \- List kernel driver modules available for all currently plugged |
256 | +in PCI devices |
257 | +.SH SYNOPSIS |
258 | +.B pcimodules |
259 | +.RB [ --class class_id ] |
260 | +.RB [ --classmask mask ] |
261 | +.RB [ --help ] |
262 | +.SH DESCRIPTION |
263 | +.B pcimodules |
264 | +lists all driver modules for all currently plugged in PCI devices. |
265 | +.B pcimodules |
266 | +should be run at boot time, and whenever a PCI device is "hot plugged" |
267 | +into the system. This can be done by the following Bourne shell syntax: |
268 | +.IP |
269 | + for module in $(pcimodules) ; do |
270 | +.IP |
271 | + modprobe -s -k "$module" |
272 | +.IP |
273 | + done |
274 | +.PP |
275 | +When a PCI device is removed from the system, the Linux kernel will |
276 | +decrement a usage count on PCI driver module. If this count drops |
277 | +to zero (i.e., there are no PCI drivers), then the |
278 | +.B modprobe -r |
279 | +process that is normally configured to run from cron every few minutes |
280 | +will eventually remove the unneeded module. |
281 | +.PP |
282 | +The --class and --classmask arguments can be used to limit the search |
283 | +to certain classes of PCI devices. This is useful, for example, to |
284 | +generate a list of ethernet card drivers to be loaded when the kernel |
285 | +has indicated that it is trying to resolve an unknown network interface. |
286 | +.PP |
287 | +Modules are listed in the order in which the PCI devices are physically |
288 | +arranged so that the computer owner can arrange things like having scsi |
289 | +device 0 be on a controller that is not alphabetically the first scsi |
290 | +controller. |
291 | +.SH OPTIONS |
292 | +.TP |
293 | +.B --class class --classmask mask |
294 | +.PP |
295 | +--class and --classmask limit the search to PCI |
296 | +cards in particular classes. These arguments are always used together. |
297 | +The arguments to --class and --classmask |
298 | +can be given as hexadecimal numbers by prefixing a leading "0x". |
299 | +Note that the classes used by pcimodules are in "Linux" format, |
300 | +meaning the class value that you see with lspci would be shifted |
301 | +left eight bits, with the new low eight bits programming interface ID. |
302 | +An examples of how to use class and classmask is provided below. |
303 | +.B --help, -h |
304 | +Print a help message and exit. |
305 | +.SH EXAMPLES |
306 | +.TP |
307 | +pcimodules |
308 | +lists all modules corresponding to currently plugged in PCI devices. |
309 | +.TP |
310 | +pcimodules --class 0x200000 --classmask 0xffff00 |
311 | +lists all modules corresponding to currently plugged in ethernet PCI devices. |
312 | +.SH FILES |
313 | +.TP |
314 | +.B /lib/modules/<kernel-version>/modules.pcimap |
315 | +This file is automatically generated by |
316 | +.B depmod, |
317 | +and used by |
318 | +.B pcimodules |
319 | +to determine which modules correspond to which PCI ID's. |
320 | +.TP |
321 | +.B /proc/bus/pci |
322 | +An interface to PCI bus configuration space provided by the post-2.1.82 Linux |
323 | +kernels. Contains per-bus subdirectories with per-card config space files and a |
324 | +.I devices |
325 | +file containing a list of all PCI devices. |
326 | + |
327 | +.SH SEE ALSO |
328 | +.BR lspci (8) |
329 | + |
330 | +.SH MAINTAINER |
331 | +The Linux PCI Utilities are maintained by Martin Mares <mj@suse.cz>. |
332 | + |
333 | +.SH AUTHOR |
334 | +.B pcimodules |
335 | +was written by Adam J. Richter <adam@yggdrasil.com>, based on public |
336 | +domain example code by Martin Mares <mj@suse.cz>. |
337 | + |
338 | +.SH COPYRIGHT |
339 | +.B pcimodules |
340 | +is copyright 2000, Yggdrasil Computing, Incorporated, and may |
341 | +be copied under the terms and conditions of version 2 of the GNU |
342 | +General Public License as published by the Free Software Foundation |
343 | +(Cambrige, Massachusetts, United States of America). |