#include "lspci.h"
-static void
+static int
show_vendor_caps_virtio(struct device *d, int where, int cap)
{
int length = BITS(cap, 0, 8);
char *tname;
if (length < 16)
- return;
+ return 0;
if (!config_fetch(d, where, length))
- return;
+ return 0;
switch (type)
{
printf("VirtIO: %s\n", tname);
if (verbose < 2)
- return;
+ return 1;
- printf("\t\tBAR=%d offset=%08x size=%08x\n",
+ printf("\t\tBAR=%d offset=%08x size=%08x",
get_conf_byte(d, where + 4),
get_conf_long(d, where + 8),
get_conf_long(d, where + 12));
- if (type != 2 || length < 20)
- return;
+ if (type == 2 && length >= 20)
+ printf(" multiplier=%08x", get_conf_long(d, where+16));
- printf("\t\tmultiplier=%08x\n",
- get_conf_long(d, where+16));
+ printf("\n");
+ return 1;
}
-void
-show_vendor_caps(struct device *d, int where, int cap)
+static int
+do_show_vendor_caps(struct device *d, int where, int cap)
{
switch (get_conf_word(d, PCI_VENDOR_ID))
{
case 0x1af4: /* Red Hat */
if (get_conf_word(d, PCI_DEVICE_ID) >= 0x1000 &&
get_conf_word(d, PCI_DEVICE_ID) <= 0x107f)
- show_vendor_caps_virtio(d, where, cap);
- break;
- default:
- printf("Vendor Specific Information: Len=%02x <?>\n", BITS(cap, 0, 8));
+ return show_vendor_caps_virtio(d, where, cap);
break;
}
+ return 0;
+}
+
+void
+show_vendor_caps(struct device *d, int where, int cap)
+{
+ printf("Vendor Specific Information: ");
+ if (!do_show_vendor_caps(d, where, cap))
+ printf("Len=%02x <?>\n", BITS(cap, 0, 8));
}