summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Mares <mj@ucw.cz>2015-01-22 22:42:33 +0100
committerMartin Mares <mj@ucw.cz>2015-01-22 22:42:33 +0100
commit6ebebbaa0370c1b34a6aae9f25682ecd1c6c22b1 (patch)
tree4157efec2f37b8466c79510fa5d3c0150b34142d
parentd769789d4be111bdfab2f2106b60456808a5649e (diff)
downloadpciutils-6ebebbaa0370c1b34a6aae9f25682ecd1c6c22b1.tar.gz
Improved listing of vendor-specific information
-rw-r--r--ls-caps-vendor.c36
1 files changed, 21 insertions, 15 deletions
diff --git a/ls-caps-vendor.c b/ls-caps-vendor.c
index 4cdfe22..dc24f90 100644
--- a/ls-caps-vendor.c
+++ b/ls-caps-vendor.c
@@ -11,7 +11,7 @@
#include "lspci.h"
-static void
+static int
show_vendor_caps_virtio(struct device *d, int where, int cap)
{
int length = BITS(cap, 0, 8);
@@ -19,9 +19,9 @@ show_vendor_caps_virtio(struct device *d, int where, int cap)
char *tname;
if (length < 16)
- return;
+ return 0;
if (!config_fetch(d, where, length))
- return;
+ return 0;
switch (type)
{
@@ -45,32 +45,38 @@ show_vendor_caps_virtio(struct device *d, int where, int cap)
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));
}