/*
- * $Id: lspci.c,v 1.8 1998/02/15 09:30:39 mj Exp $
+ * $Id: lspci.c,v 1.9 1998/03/19 15:56:43 mj Exp $
*
* Linux PCI Utilities -- List All PCI Devices
*
grow_tree(void)
{
struct device *d, *d2;
- struct bridge *first_br, *b;
+ struct bridge **last_br, *b;
/* Build list of bridges */
- first_br = &host_bridge;
+ last_br = &host_bridge.chain;
for(d=first_dev; d; d=d->next)
{
word class = get_conf_word(d, PCI_CLASS_DEVICE);
b->primary = get_conf_byte(d, PCI_PRIMARY_BUS);
b->secondary = get_conf_byte(d, PCI_SECONDARY_BUS);
b->subordinate = get_conf_byte(d, PCI_SUBORDINATE_BUS);
- b->chain = first_br;
- first_br = b;
+ *last_br = b;
+ last_br = &b->chain;
b->next = b->child = NULL;
b->first_bus = NULL;
b->br_dev = d;
}
}
+ *last_br = NULL;
/* Create a bridge tree */
- for(b=first_br; b; b=b->chain)
+ for(b=&host_bridge; b; b=b->chain)
{
struct bridge *c, *best;
best = NULL;
- for(c=first_br; c; c=c->chain)
+ for(c=&host_bridge; c; c=c->chain)
if (c != b && b->primary >= c->secondary && b->primary <= c->subordinate &&
(!best || best->subordinate - best->primary > c->subordinate - c->primary))
best = c;
/* Insert secondary bus for each bridge */
- for(b=first_br; b; b=b->chain)
+ for(b=&host_bridge; b; b=b->chain)
if (!find_bus(b, b->secondary))
new_bus(b, b->secondary);
*p = 0;
fputs(line, stdout);
for(p=line; *p; p++)
- if (*p == '+')
+ if (*p == '+' || *p == '|')
*p = '|';
else
*p = ' ';
for(b=&host_bridge; b; b=b->chain)
if (b->br_dev == d)
{
- p += sprintf(p, "-[%02x-%02x]-", b->secondary, b->subordinate);
+ if (b->secondary == b->subordinate)
+ p += sprintf(p, "-[%02x]-", b->secondary);
+ else
+ p += sprintf(p, "-[%02x-%02x]-", b->secondary, b->subordinate);
show_tree_bridge(b, line, p);
return;
}