Subversion Repositories HelenOS-historic

Rev

Rev 1301 | 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: