Rev 1301 | Rev 1324 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1301 | Rev 1302 | ||
---|---|---|---|
Line 57... | Line 57... | ||
57 | 57 | ||
58 | static void *id_alloc(struct pci_access *a, unsigned int size) |
58 | static void *id_alloc(struct pci_access *a, unsigned int size) |
59 | { |
59 | { |
60 | struct id_bucket *buck = a->current_id_bucket; |
60 | struct id_bucket *buck = a->current_id_bucket; |
61 | unsigned int pos; |
61 | unsigned int pos; |
62 | if (!buck || buck->full + size > BUCKET_SIZE) |
62 | if (!buck || buck->full + size > BUCKET_SIZE) { |
63 | { |
- | |
64 | buck = pci_malloc(a, BUCKET_SIZE); |
63 | buck = pci_malloc(a, BUCKET_SIZE); |
65 | buck->next = a->current_id_bucket; |
64 | buck->next = a->current_id_bucket; |
66 | a->current_id_bucket = buck; |
65 | a->current_id_bucket = buck; |
67 | buck->full = BUCKET_ALIGN(sizeof(struct id_bucket)); |
66 | buck->full = BUCKET_ALIGN(sizeof(struct id_bucket)); |
68 | } |
67 | } |
Line 82... | Line 81... | ||
82 | 81 | ||
83 | h = id12 ^ (id34 << 3) ^ (cat << 5); |
82 | h = id12 ^ (id34 << 3) ^ (cat << 5); |
84 | return h % HASH_SIZE; |
83 | return h % HASH_SIZE; |
85 | } |
84 | } |
86 | 85 | ||
87 | static struct id_entry *id_lookup(struct pci_access *a, int cat, int id1, int id2, int id3, int id4) |
86 | static struct id_entry *id_lookup(struct pci_access *a, int cat, int id1, |
- | 87 | int id2, int id3, int id4) |
|
88 | { |
88 | { |
89 | struct id_entry *n; |
89 | struct id_entry *n; |
90 | u32 id12 = id_pair(id1, id2); |
90 | u32 id12 = id_pair(id1, id2); |
91 | u32 id34 = id_pair(id3, id4); |
91 | u32 id34 = id_pair(id3, id4); |
92 | 92 | ||
Line 94... | Line 94... | ||
94 | while (n && (n->id12 != id12 || n->id34 != id34 || n->cat != cat)) |
94 | while (n && (n->id12 != id12 || n->id34 != id34 || n->cat != cat)) |
95 | n = n->next; |
95 | n = n->next; |
96 | return n; |
96 | return n; |
97 | } |
97 | } |
98 | 98 | ||
99 | static int id_insert(struct pci_access *a, int cat, int id1, int id2, int id3, int id4, byte *text) |
99 | static int id_insert(struct pci_access *a, int cat, int id1, int id2, |
- | 100 | int id3, int id4, byte * text) |
|
100 | { |
101 | { |
101 | u32 id12 = id_pair(id1, id2); |
102 | u32 id12 = id_pair(id1, id2); |
102 | u32 id34 = id_pair(id3, id4); |
103 | u32 id34 = id_pair(id3, id4); |
103 | unsigned int h = id_hash(cat, id12, id34); |
104 | unsigned int h = id_hash(cat, id12, id34); |
104 | struct id_entry *n = a->id_hash[h]; |
105 | struct id_entry *n = a->id_hash[h]; |
Line 119... | Line 120... | ||
119 | } |
120 | } |
120 | 121 | ||
121 | static int id_hex(byte *p, int cnt) |
122 | static int id_hex(byte * p, int cnt) |
122 | { |
123 | { |
123 | int x = 0; |
124 | int x = 0; |
124 | while (cnt--) |
125 | while (cnt--) { |
125 | { |
- | |
126 | x <<= 4; |
126 | x <<= 4; |
127 | if (*p >= '0' && *p <= '9') |
127 | if (*p >= '0' && *p <= '9') |
128 | x += (*p - '0'); |
128 | x += (*p - '0'); |
129 | else if (*p >= 'a' && *p <= 'f') |
129 | else if (*p >= 'a' && *p <= 'f') |
130 | x += (*p - 'a' + 10); |
130 | x += (*p - 'a' + 10); |
Line 171... | Line 171... | ||
171 | p = line; |
171 | p = line; |
172 | while (*p == '\t') |
172 | while (*p == '\t') |
173 | p++; |
173 | p++; |
174 | nest = p - line; |
174 | nest = p - line; |
175 | 175 | ||
176 | if (!nest) /* Top-level entries */ |
176 | if (!nest) { /* Top-level entries */ |
177 | { |
- | |
178 | if (p[0] == 'C' && p[1] == ' ') /* Class block */ |
177 | if (p[0] == 'C' && p[1] == ' ') { /* Class block */ |
179 | { |
178 | if ((id1 = id_hex(p + 2, 2)) < 0 |
180 | if ((id1 = id_hex(p+2, 2)) < 0 || !id_white_p(p[4])) |
179 | || !id_white_p(p[4])) |
181 | return parse_error; |
180 | return parse_error; |
182 | cat = ID_CLASS; |
181 | cat = ID_CLASS; |
183 | p += 5; |
182 | p += 5; |
184 | } |
- | |
185 | else if (p[0] == 'S' && p[1] == ' ') |
183 | } else if (p[0] == 'S' && p[1] == ' ') { /* Generic subsystem block */ |
186 | { /* Generic subsystem block */ |
- | |
187 | if ((id1 = id_hex(p+2, 4)) < 0 || p[6]) |
184 | if ((id1 = id_hex(p + 2, 4)) < 0 || p[6]) |
188 | return parse_error; |
185 | return parse_error; |
189 | if (!id_lookup(a, ID_VENDOR, id1, 0, 0, 0)) |
186 | if (!id_lookup(a, ID_VENDOR, id1, 0, 0, 0)) |
190 | return "Vendor does not exist"; |
187 | return "Vendor does not exist"; |
191 | cat = ID_GEN_SUBSYSTEM; |
188 | cat = ID_GEN_SUBSYSTEM; |
192 | continue; |
189 | continue; |
193 | } |
- | |
194 | else if (p[0] >= 'A' && p[0] <= 'Z' && p[1] == ' ') |
190 | } else if (p[0] >= 'A' && p[0] <= 'Z' && p[1] == ' ') { /* Unrecognized block (RFU) */ |
195 | { /* Unrecognized block (RFU) */ |
- | |
196 | cat = ID_UNKNOWN; |
191 | cat = ID_UNKNOWN; |
197 | continue; |
192 | continue; |
198 | } |
- | |
199 | else /* Vendor ID */ |
193 | } else { /* Vendor ID */ |
200 | { |
194 | |
201 | if ((id1 = id_hex(p, 4)) < 0 || !id_white_p(p[4])) |
195 | if ((id1 = id_hex(p, 4)) < 0 |
- | 196 | || !id_white_p(p[4])) |
|
202 | return parse_error; |
197 | return parse_error; |
203 | cat = ID_VENDOR; |
198 | cat = ID_VENDOR; |
204 | p += 5; |
199 | p += 5; |
205 | } |
200 | } |
206 | id2 = id3 = id4 = 0; |
201 | id2 = id3 = id4 = 0; |
207 | } |
- | |
208 | else if (cat == ID_UNKNOWN) /* Nested entries in RFU blocks are skipped */ |
202 | } else if (cat == ID_UNKNOWN) /* Nested entries in RFU blocks are skipped */ |
209 | continue; |
203 | continue; |
210 | else if (nest == 1) /* Nesting level 1 */ |
204 | else if (nest == 1) /* Nesting level 1 */ |
211 | switch (cat) |
205 | switch (cat) { |
212 | { |
- | |
213 | case ID_VENDOR: |
206 | case ID_VENDOR: |
214 | case ID_DEVICE: |
207 | case ID_DEVICE: |
215 | case ID_SUBSYSTEM: |
208 | case ID_SUBSYSTEM: |
216 | if ((id2 = id_hex(p, 4)) < 0 || !id_white_p(p[4])) |
209 | if ((id2 = id_hex(p, 4)) < 0 |
- | 210 | || !id_white_p(p[4])) |
|
217 | return parse_error; |
211 | return parse_error; |
218 | p += 5; |
212 | p += 5; |
219 | cat = ID_DEVICE; |
213 | cat = ID_DEVICE; |
220 | id3 = id4 = 0; |
214 | id3 = id4 = 0; |
221 | break; |
215 | break; |
222 | case ID_GEN_SUBSYSTEM: |
216 | case ID_GEN_SUBSYSTEM: |
223 | if ((id2 = id_hex(p, 4)) < 0 || !id_white_p(p[4])) |
217 | if ((id2 = id_hex(p, 4)) < 0 |
- | 218 | || !id_white_p(p[4])) |
|
224 | return parse_error; |
219 | return parse_error; |
225 | p += 5; |
220 | p += 5; |
226 | id3 = id4 = 0; |
221 | id3 = id4 = 0; |
227 | break; |
222 | break; |
228 | case ID_CLASS: |
223 | case ID_CLASS: |
229 | case ID_SUBCLASS: |
224 | case ID_SUBCLASS: |
230 | case ID_PROGIF: |
225 | case ID_PROGIF: |
231 | if ((id2 = id_hex(p, 2)) < 0 || !id_white_p(p[2])) |
226 | if ((id2 = id_hex(p, 2)) < 0 |
- | 227 | || !id_white_p(p[2])) |
|
232 | return parse_error; |
228 | return parse_error; |
233 | p += 3; |
229 | p += 3; |
234 | cat = ID_SUBCLASS; |
230 | cat = ID_SUBCLASS; |
235 | id3 = id4 = 0; |
231 | id3 = id4 = 0; |
236 | break; |
232 | break; |
237 | default: |
233 | default: |
238 | return parse_error; |
234 | return parse_error; |
239 | } |
- | |
240 | else if (nest == 2) /* Nesting level 2 */ |
235 | } else if (nest == 2) /* Nesting level 2 */ |
241 | switch (cat) |
236 | switch (cat) { |
242 | { |
- | |
243 | case ID_DEVICE: |
237 | case ID_DEVICE: |
244 | case ID_SUBSYSTEM: |
238 | case ID_SUBSYSTEM: |
- | 239 | if ((id3 = id_hex(p, 4)) < 0 |
|
- | 240 | || !id_white_p(p[4]) |
|
245 | if ((id3 = id_hex(p, 4)) < 0 || !id_white_p(p[4]) || (id4 = id_hex(p+5, 4)) < 0 || !id_white_p(p[9])) |
241 | || (id4 = id_hex(p + 5, 4)) < 0 |
- | 242 | || !id_white_p(p[9])) |
|
246 | return parse_error; |
243 | return parse_error; |
247 | p += 10; |
244 | p += 10; |
248 | cat = ID_SUBSYSTEM; |
245 | cat = ID_SUBSYSTEM; |
249 | break; |
246 | break; |
250 | case ID_CLASS: |
247 | case ID_CLASS: |
251 | case ID_SUBCLASS: |
248 | case ID_SUBCLASS: |
252 | case ID_PROGIF: |
249 | case ID_PROGIF: |
253 | if ((id3 = id_hex(p, 2)) < 0 || !id_white_p(p[2])) |
250 | if ((id3 = id_hex(p, 2)) < 0 |
- | 251 | || !id_white_p(p[2])) |
|
254 | return parse_error; |
252 | return parse_error; |
255 | p += 3; |
253 | p += 3; |
256 | cat = ID_PROGIF; |
254 | cat = ID_PROGIF; |
257 | id4 = 0; |
255 | id4 = 0; |
258 | break; |
256 | break; |
259 | default: |
257 | default: |
260 | return parse_error; |
258 | return parse_error; |
261 | } |
- | |
262 | else /* Nesting level 3 or more */ |
259 | } else /* Nesting level 3 or more */ |
263 | return parse_error; |
260 | return parse_error; |
264 | while (id_white_p(*p)) |
261 | while (id_white_p(*p)) |
265 | p++; |
262 | p++; |
266 | if (!*p) |
263 | if (!*p) |
267 | return parse_error; |
264 | return parse_error; |
Line 269... | Line 266... | ||
269 | return "Duplicate entry"; |
266 | return "Duplicate entry"; |
270 | } |
267 | } |
271 | return NULL; |
268 | return NULL; |
272 | } |
269 | } |
273 | 270 | ||
274 | int |
- | |
275 | pci_load_name_list(struct pci_access *a) |
271 | int pci_load_name_list(struct pci_access *a) |
276 | { |
272 | { |
277 | int lino; |
273 | int lino; |
278 | const char *err; |
274 | const char *err; |
279 | 275 | ||
280 | pci_free_name_list(a); |
276 | pci_free_name_list(a); |
Line 284... | Line 280... | ||
284 | if (err) |
280 | if (err) |
285 | a->error("%s at %s, element %d\n", err, "pci_ids.h", lino); |
281 | a->error("%s at %s, element %d\n", err, "pci_ids.h", lino); |
286 | return 1; |
282 | return 1; |
287 | } |
283 | } |
288 | 284 | ||
289 | void |
- | |
290 | pci_free_name_list(struct pci_access *a) |
285 | void pci_free_name_list(struct pci_access *a) |
291 | { |
286 | { |
292 | pci_mfree(a->id_hash); |
287 | pci_mfree(a->id_hash); |
293 | a->id_hash = NULL; |
288 | a->id_hash = NULL; |
294 | while (a->current_id_bucket) |
289 | while (a->current_id_bucket) { |
295 | { |
- | |
296 | struct id_bucket *buck = a->current_id_bucket; |
290 | struct id_bucket *buck = a->current_id_bucket; |
297 | a->current_id_bucket = buck->next; |
291 | a->current_id_bucket = buck->next; |
298 | pci_mfree(buck); |
292 | pci_mfree(buck); |
299 | } |
293 | } |
300 | } |
294 | } |
301 | 295 | ||
302 | static struct id_entry *id_lookup_subsys(struct pci_access *a, int iv, int id, int isv, int isd) |
296 | static struct id_entry *id_lookup_subsys(struct pci_access *a, int iv, |
- | 297 | int id, int isv, int isd) |
|
303 | { |
298 | { |
304 | struct id_entry *d = NULL; |
299 | struct id_entry *d = NULL; |
305 | if (iv > 0 && id > 0) /* Per-device lookup */ |
300 | if (iv > 0 && id > 0) /* Per-device lookup */ |
306 | d = id_lookup(a, ID_SUBSYSTEM, iv, id, isv, isd); |
301 | d = id_lookup(a, ID_SUBSYSTEM, iv, id, isv, isd); |
307 | if (!d) /* Generic lookup */ |
302 | if (!d) /* Generic lookup */ |
Line 309... | Line 304... | ||
309 | if (!d && iv == isv && id == isd) /* Check for subsystem == device */ |
304 | if (!d && iv == isv && id == isd) /* Check for subsystem == device */ |
310 | d = id_lookup(a, ID_DEVICE, iv, id, 0, 0); |
305 | d = id_lookup(a, ID_DEVICE, iv, id, 0, 0); |
311 | return d; |
306 | return d; |
312 | } |
307 | } |
313 | 308 | ||
314 | char * |
- | |
315 | pci_lookup_name(struct pci_access *a, char *buf, int size, int flags, ...) |
309 | char *pci_lookup_name(struct pci_access *a, char *buf, int size, int flags, |
- | 310 | ...) |
|
316 | { |
311 | { |
317 | va_list args; |
312 | va_list args; |
318 | int num, res, synth; |
313 | int num, res, synth; |
319 | struct id_entry *v, *d, *cls, *pif; |
314 | struct id_entry *v, *d, *cls, *pif; |
320 | int iv, id, isv, isd, icls, ipif; |
315 | int iv, id, isv, isd, icls, ipif; |
321 | 316 | ||
322 | va_start(args, flags); |
317 | va_start(args, flags); |
323 | 318 | ||
324 | num = 0; |
319 | num = 0; |
325 | if ((flags & PCI_LOOKUP_NUMERIC) || a->numeric_ids) |
320 | if ((flags & PCI_LOOKUP_NUMERIC) || a->numeric_ids) { |
326 | { |
- | |
327 | flags &= ~PCI_LOOKUP_NUMERIC; |
321 | flags &= ~PCI_LOOKUP_NUMERIC; |
328 | num = 1; |
322 | num = 1; |
329 | } |
- | |
330 | else if (!a->id_hash) |
323 | } else if (!a->id_hash) { |
331 | { |
- | |
332 | if (!pci_load_name_list(a)) |
324 | if (!pci_load_name_list(a)) |
333 | num = a->numeric_ids = 1; |
325 | num = a->numeric_ids = 1; |
334 | } |
326 | } |
335 | 327 | ||
336 | if (flags & PCI_LOOKUP_NO_NUMBERS) |
328 | if (flags & PCI_LOOKUP_NO_NUMBERS) { |
337 | { |
- | |
338 | flags &= ~PCI_LOOKUP_NO_NUMBERS; |
329 | flags &= ~PCI_LOOKUP_NO_NUMBERS; |
339 | synth = 0; |
330 | synth = 0; |
340 | if (num) |
331 | if (num) |
341 | return NULL; |
332 | return NULL; |
342 | } |
- | |
343 | else |
333 | } else |
344 | synth = 1; |
334 | synth = 1; |
345 | 335 | ||
346 | switch (flags) |
336 | switch (flags) { |
347 | { |
- | |
348 | case PCI_LOOKUP_VENDOR: |
337 | case PCI_LOOKUP_VENDOR: |
349 | iv = va_arg(args, int); |
338 | iv = va_arg(args, int); |
350 | if (num) |
339 | if (num) |
351 | res = snprintf(buf, size, "%04x", iv); |
340 | res = snprintf(buf, size, "%04x", iv); |
352 | else if (v = id_lookup(a, ID_VENDOR, iv, 0, 0, 0)) |
341 | else if (v = id_lookup(a, ID_VENDOR, iv, 0, 0, 0)) |
353 | return (char *) v->name; |
342 | return (char *) v->name; |
354 | else |
343 | else |
- | 344 | res = |
|
355 | res = snprintf(buf, size, "Unknown vendor %04x", iv); |
345 | snprintf(buf, size, "Unknown vendor %04x", iv); |
356 | break; |
346 | break; |
357 | case PCI_LOOKUP_DEVICE: |
347 | case PCI_LOOKUP_DEVICE: |
358 | iv = va_arg(args, int); |
348 | iv = va_arg(args, int); |
359 | id = va_arg(args, int); |
349 | id = va_arg(args, int); |
360 | if (num) |
350 | if (num) |
361 | res = snprintf(buf, size, "%04x", id); |
351 | res = snprintf(buf, size, "%04x", id); |
362 | else if (d = id_lookup(a, ID_DEVICE, iv, id, 0, 0)) |
352 | else if (d = id_lookup(a, ID_DEVICE, iv, id, 0, 0)) |
363 | return (char *) d->name; |
353 | return (char *) d->name; |
364 | else if (synth) |
354 | else if (synth) |
- | 355 | res = |
|
365 | res = snprintf(buf, size, "Unknown device %04x", id); |
356 | snprintf(buf, size, "Unknown device %04x", id); |
366 | else |
357 | else |
367 | return NULL; |
358 | return NULL; |
368 | break; |
359 | break; |
369 | case PCI_LOOKUP_VENDOR | PCI_LOOKUP_DEVICE: |
360 | case PCI_LOOKUP_VENDOR | PCI_LOOKUP_DEVICE: |
370 | iv = va_arg(args, int); |
361 | iv = va_arg(args, int); |
371 | id = va_arg(args, int); |
362 | id = va_arg(args, int); |
372 | if (num) |
363 | if (num) |
373 | res = snprintf(buf, size, "%04x:%04x", iv, id); |
364 | res = snprintf(buf, size, "%04x:%04x", iv, id); |
374 | else |
365 | else { |
375 | { |
- | |
376 | v = id_lookup(a, ID_VENDOR, iv, 0, 0, 0); |
366 | v = id_lookup(a, ID_VENDOR, iv, 0, 0, 0); |
377 | d = id_lookup(a, ID_DEVICE, iv, id, 0, 0); |
367 | d = id_lookup(a, ID_DEVICE, iv, id, 0, 0); |
378 | if (v && d) |
368 | if (v && d) |
- | 369 | res = |
|
379 | res = snprintf(buf, size, "%s %s", v->name, d->name); |
370 | snprintf(buf, size, "%s %s", v->name, |
- | 371 | d->name); |
|
380 | else if (!synth) |
372 | else if (!synth) |
381 | return NULL; |
373 | return NULL; |
382 | else if (!v) |
374 | else if (!v) |
- | 375 | res = |
|
- | 376 | snprintf(buf, size, |
|
383 | res = snprintf(buf, size, "Unknown device %04x:%04x", iv, id); |
377 | "Unknown device %04x:%04x", |
- | 378 | iv, id); |
|
384 | else /* !d */ |
379 | else /* !d */ |
- | 380 | res = |
|
- | 381 | snprintf(buf, size, |
|
385 | res = snprintf(buf, size, "%s Unknown device %04x", v->name, id); |
382 | "%s Unknown device %04x", |
- | 383 | v->name, id); |
|
386 | } |
384 | } |
387 | break; |
385 | break; |
388 | case PCI_LOOKUP_SUBSYSTEM | PCI_LOOKUP_VENDOR: |
386 | case PCI_LOOKUP_SUBSYSTEM | PCI_LOOKUP_VENDOR: |
389 | isv = va_arg(args, int); |
387 | isv = va_arg(args, int); |
390 | if (num) |
388 | if (num) |
391 | res = snprintf(buf, size, "%04x", isv); |
389 | res = snprintf(buf, size, "%04x", isv); |
392 | else if (v = id_lookup(a, ID_VENDOR, isv, 0, 0, 0)) |
390 | else if (v = id_lookup(a, ID_VENDOR, isv, 0, 0, 0)) |
393 | return (char *) v->name; |
391 | return (char *) v->name; |
394 | else if (synth) |
392 | else if (synth) |
- | 393 | res = |
|
395 | res = snprintf(buf, size, "Unknown vendor %04x", isv); |
394 | snprintf(buf, size, "Unknown vendor %04x", |
- | 395 | isv); |
|
396 | else |
396 | else |
397 | return NULL; |
397 | return NULL; |
398 | break; |
398 | break; |
399 | case PCI_LOOKUP_SUBSYSTEM | PCI_LOOKUP_DEVICE: |
399 | case PCI_LOOKUP_SUBSYSTEM | PCI_LOOKUP_DEVICE: |
400 | iv = va_arg(args, int); |
400 | iv = va_arg(args, int); |
Line 404... | Line 404... | ||
404 | if (num) |
404 | if (num) |
405 | res = snprintf(buf, size, "%04x", isd); |
405 | res = snprintf(buf, size, "%04x", isd); |
406 | else if (d = id_lookup_subsys(a, iv, id, isv, isd)) |
406 | else if (d = id_lookup_subsys(a, iv, id, isv, isd)) |
407 | return (char *) d->name; |
407 | return (char *) d->name; |
408 | else if (synth) |
408 | else if (synth) |
- | 409 | res = |
|
409 | res = snprintf(buf, size, "Unknown device %04x", isd); |
410 | snprintf(buf, size, "Unknown device %04x", |
- | 411 | isd); |
|
410 | else |
412 | else |
411 | return NULL; |
413 | return NULL; |
412 | break; |
414 | break; |
413 | case PCI_LOOKUP_VENDOR | PCI_LOOKUP_DEVICE | PCI_LOOKUP_SUBSYSTEM: |
415 | case PCI_LOOKUP_VENDOR | PCI_LOOKUP_DEVICE | PCI_LOOKUP_SUBSYSTEM: |
414 | iv = va_arg(args, int); |
416 | iv = va_arg(args, int); |
415 | id = va_arg(args, int); |
417 | id = va_arg(args, int); |
416 | isv = va_arg(args, int); |
418 | isv = va_arg(args, int); |
417 | isd = va_arg(args, int); |
419 | isd = va_arg(args, int); |
418 | if (num) |
420 | if (num) |
419 | res = snprintf(buf, size, "%04x:%04x", isv, isd); |
421 | res = snprintf(buf, size, "%04x:%04x", isv, isd); |
420 | else |
422 | else { |
421 | { |
- | |
422 | v = id_lookup(a, ID_VENDOR, isv, 0, 0, 0); |
423 | v = id_lookup(a, ID_VENDOR, isv, 0, 0, 0); |
423 | d = id_lookup_subsys(a, iv, id, isv, isd); |
424 | d = id_lookup_subsys(a, iv, id, isv, isd); |
424 | if (v && d) |
425 | if (v && d) |
- | 426 | res = |
|
425 | res = snprintf(buf, size, "%s %s", v->name, d->name); |
427 | snprintf(buf, size, "%s %s", v->name, |
- | 428 | d->name); |
|
426 | else if (!synth) |
429 | else if (!synth) |
427 | return NULL; |
430 | return NULL; |
428 | else if (!v) |
431 | else if (!v) |
- | 432 | res = |
|
- | 433 | snprintf(buf, size, |
|
429 | res = snprintf(buf, size, "Unknown device %04x:%04x", isv, isd); |
434 | "Unknown device %04x:%04x", |
- | 435 | isv, isd); |
|
430 | else /* !d */ |
436 | else /* !d */ |
- | 437 | res = |
|
- | 438 | snprintf(buf, size, |
|
431 | res = snprintf(buf, size, "%s Unknown device %04x", v->name, isd); |
439 | "%s Unknown device %04x", |
- | 440 | v->name, isd); |
|
432 | } |
441 | } |
433 | break; |
442 | break; |
434 | case PCI_LOOKUP_CLASS: |
443 | case PCI_LOOKUP_CLASS: |
435 | icls = va_arg(args, int); |
444 | icls = va_arg(args, int); |
436 | if (num) |
445 | if (num) |
437 | res = snprintf(buf, size, "%04x", icls); |
446 | res = snprintf(buf, size, "%04x", icls); |
- | 447 | else if (cls = |
|
438 | else if (cls = id_lookup(a, ID_SUBCLASS, icls >> 8, icls & 0xff, 0, 0)) |
448 | id_lookup(a, ID_SUBCLASS, icls >> 8, icls & 0xff, |
- | 449 | 0, 0)) |
|
439 | return (char *) cls->name; |
450 | return (char *) cls->name; |
440 | else if (cls = id_lookup(a, ID_CLASS, icls, 0, 0, 0)) |
451 | else if (cls = id_lookup(a, ID_CLASS, icls, 0, 0, 0)) |
- | 452 | res = |
|
441 | res = snprintf(buf, size, "%s [%04x]", cls->name, icls); |
453 | snprintf(buf, size, "%s [%04x]", cls->name, |
- | 454 | icls); |
|
442 | else if (synth) |
455 | else if (synth) |
443 | res = snprintf(buf, size, "Class %04x", icls); |
456 | res = snprintf(buf, size, "Class %04x", icls); |
444 | else |
457 | else |
445 | return NULL; |
458 | return NULL; |
446 | break; |
459 | break; |
447 | case PCI_LOOKUP_PROGIF: |
460 | case PCI_LOOKUP_PROGIF: |
448 | icls = va_arg(args, int); |
461 | icls = va_arg(args, int); |
449 | ipif = va_arg(args, int); |
462 | ipif = va_arg(args, int); |
450 | if (num) |
463 | if (num) |
451 | res = snprintf(buf, size, "%02x", ipif); |
464 | res = snprintf(buf, size, "%02x", ipif); |
- | 465 | else if (pif = |
|
452 | else if (pif = id_lookup(a, ID_PROGIF, icls >> 8, icls & 0xff, ipif, 0)) |
466 | id_lookup(a, ID_PROGIF, icls >> 8, icls & 0xff, |
- | 467 | ipif, 0)) |
|
453 | return (char *) pif->name; |
468 | return (char *) pif->name; |
454 | else if (icls == 0x0101 && !(ipif & 0x70)) |
469 | else if (icls == 0x0101 && !(ipif & 0x70)) { |
455 | { |
- | |
456 | /* IDE controllers have complex prog-if semantics */ |
470 | /* IDE controllers have complex prog-if semantics */ |
457 | res = snprintf(buf, size, "%s%s%s%s%s", |
471 | res = snprintf(buf, size, "%s%s%s%s%s", |
458 | (ipif & 0x80) ? "Master " : "", |
472 | (ipif & 0x80) ? "Master " : "", |
459 | (ipif & 0x08) ? "SecP " : "", |
473 | (ipif & 0x08) ? "SecP " : "", |
460 | (ipif & 0x04) ? "SecO " : "", |
474 | (ipif & 0x04) ? "SecO " : "", |
461 | (ipif & 0x02) ? "PriP " : "", |
475 | (ipif & 0x02) ? "PriP " : "", |
462 | (ipif & 0x01) ? "PriO " : ""); |
476 | (ipif & 0x01) ? "PriO " : ""); |
463 | if (res > 0 && res < size) |
477 | if (res > 0 && res < size) |
464 | buf[--res] = 0; |
478 | buf[--res] = 0; |
465 | } |
- | |
466 | else if (synth) |
479 | } else if (synth) |
467 | res = snprintf(buf, size, "ProgIf %02x", ipif); |
480 | res = snprintf(buf, size, "ProgIf %02x", ipif); |
468 | else |
481 | else |
469 | return NULL; |
482 | return NULL; |
470 | break; |
483 | break; |
471 | default: |
484 | default: |