aboutsummaryrefslogtreecommitdiff
path: root/usr.sbin/usbconfig
diff options
context:
space:
mode:
authorHans Petter Selasky <hselasky@FreeBSD.org>2019-12-27 20:37:14 +0000
committerHans Petter Selasky <hselasky@FreeBSD.org>2019-12-27 20:37:14 +0000
commitfa6d8b65d3956f69cde9043a3c5e77fb57788904 (patch)
tree6e0c05a40cc832fdfac3d9fbed7e29feae4fb997 /usr.sbin/usbconfig
parent34b0ca243f6272d998475afd019d3a9e175cd817 (diff)
downloadsrc-fa6d8b65d3956f69cde9043a3c5e77fb57788904.tar.gz
src-fa6d8b65d3956f69cde9043a3c5e77fb57788904.zip
Implement dump_stats command for usbconfig(8).
This command is useful when debugging USB device issues. MFC after: 1 week Sponsored by: Mellanox Technologies
Notes
Notes: svn path=/head/; revision=356137
Diffstat (limited to 'usr.sbin/usbconfig')
-rw-r--r--usr.sbin/usbconfig/dump.c29
-rw-r--r--usr.sbin/usbconfig/dump.h1
-rw-r--r--usr.sbin/usbconfig/usbconfig.86
-rw-r--r--usr.sbin/usbconfig/usbconfig.c17
4 files changed, 50 insertions, 3 deletions
diff --git a/usr.sbin/usbconfig/dump.c b/usr.sbin/usbconfig/dump.c
index e818c035a59b..4a52ab9fd85e 100644
--- a/usr.sbin/usbconfig/dump.c
+++ b/usr.sbin/usbconfig/dump.c
@@ -483,3 +483,32 @@ dump_string_by_index(struct libusb20_device *pdev, uint8_t str_index)
}
free(pbuf);
}
+
+void
+dump_device_stats(struct libusb20_device *pdev)
+{
+ struct libusb20_device_stats st;
+
+ if (libusb20_dev_get_stats(pdev, &st)) {
+ printf("{}\n");
+ } else {
+ printf("{\n"
+ " UE_CONTROL_OK : %llu\n"
+ " UE_ISOCHRONOUS_OK : %llu\n"
+ " UE_BULK_OK : %llu\n"
+ " UE_INTERRUPT_OK : %llu\n"
+ " UE_CONTROL_FAIL : %llu\n"
+ " UE_ISOCHRONOUS_FAIL : %llu\n"
+ " UE_BULK_FAIL : %llu\n"
+ " UE_INTERRUPT_FAIL : %llu\n"
+ "}\n",
+ (unsigned long long)st.xfer_ok[0],
+ (unsigned long long)st.xfer_ok[1],
+ (unsigned long long)st.xfer_ok[2],
+ (unsigned long long)st.xfer_ok[3],
+ (unsigned long long)st.xfer_fail[0],
+ (unsigned long long)st.xfer_fail[1],
+ (unsigned long long)st.xfer_fail[2],
+ (unsigned long long)st.xfer_fail[3]);
+ }
+}
diff --git a/usr.sbin/usbconfig/dump.h b/usr.sbin/usbconfig/dump.h
index 4538a56fef36..d7fe12866282 100644
--- a/usr.sbin/usbconfig/dump.h
+++ b/usr.sbin/usbconfig/dump.h
@@ -37,6 +37,7 @@ void dump_device_info(struct libusb20_device *pdev, uint8_t show_drv);
void dump_be_quirk_names(struct libusb20_backend *pbe);
void dump_be_dev_quirks(struct libusb20_backend *pbe);
void dump_device_desc(struct libusb20_device *pdev);
+void dump_device_stats(struct libusb20_device *pdev);
void dump_config(struct libusb20_device *pdev, uint8_t all_cfg);
#endif /* _DUMP_H_ */
diff --git a/usr.sbin/usbconfig/usbconfig.8 b/usr.sbin/usbconfig/usbconfig.8
index 60b337a09cf3..79f070b169c6 100644
--- a/usr.sbin/usbconfig/usbconfig.8
+++ b/usr.sbin/usbconfig/usbconfig.8
@@ -1,6 +1,6 @@
.\" $FreeBSD$
.\"
-.\" Copyright (c) 2008-2010 Hans Petter Selasky. All rights reserved.
+.\" Copyright (c) 2008-2019 Hans Petter Selasky. All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
@@ -23,7 +23,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.Dd August 16, 2019
+.Dd December 27, 2019
.Dt USBCONFIG 8
.Os
.Sh NAME
@@ -116,6 +116,8 @@ Display all the configuration descriptors.
Display string descriptor at selected index.
.It Cm dump_info
Display summary information about the device.
+.It Cm dump_stats
+Display USB transfer statistics.
.It Cm show_ifdrv
Display the list of interface drivers (such as
.Xr ukbd 4
diff --git a/usr.sbin/usbconfig/usbconfig.c b/usr.sbin/usbconfig/usbconfig.c
index 3d9cc219991b..c25468fe6da4 100644
--- a/usr.sbin/usbconfig/usbconfig.c
+++ b/usr.sbin/usbconfig/usbconfig.c
@@ -82,6 +82,7 @@ struct options {
uint8_t got_dump_curr_config:1;
uint8_t got_dump_all_config:1;
uint8_t got_dump_info:1;
+ uint8_t got_dump_stats:1;
uint8_t got_show_iface_driver:1;
uint8_t got_remove_device_quirk:1;
uint8_t got_add_device_quirk:1;
@@ -121,6 +122,7 @@ enum {
T_DUMP_ALL_CONFIG_DESC,
T_DUMP_STRING,
T_DUMP_INFO,
+ T_DUMP_STATS,
T_SUSPEND,
T_RESUME,
T_POWER_OFF,
@@ -155,6 +157,7 @@ static const struct token token[] = {
{"dump_all_config_desc", T_DUMP_ALL_CONFIG_DESC, 0},
{"dump_string", T_DUMP_STRING, 1},
{"dump_info", T_DUMP_INFO, 0},
+ {"dump_stats", T_DUMP_STATS, 0},
{"show_ifdrv", T_SHOW_IFACE_DRIVER, 0},
{"suspend", T_SUSPEND, 0},
{"resume", T_RESUME, 0},
@@ -296,6 +299,7 @@ usage(void)
" dump_all_config_desc" "\n"
" dump_string <index>" "\n"
" dump_info" "\n"
+ " dump_stats" "\n"
" show_ifdrv" "\n"
" suspend" "\n"
" resume" "\n"
@@ -506,7 +510,8 @@ flush_command(struct libusb20_backend *pbe, struct options *opt)
opt->got_dump_device_desc ||
opt->got_dump_curr_config ||
opt->got_dump_all_config ||
- opt->got_dump_info);
+ opt->got_dump_info ||
+ opt->got_dump_stats);
if (opt->got_list || dump_any) {
dump_device_info(pdev,
@@ -527,6 +532,10 @@ flush_command(struct libusb20_backend *pbe, struct options *opt)
dump_device_desc(pdev);
dump_config(pdev, 1);
}
+ if (opt->got_dump_stats) {
+ printf("\n");
+ dump_device_stats(pdev);
+ }
if (dump_any) {
printf("\n");
}
@@ -751,6 +760,12 @@ main(int argc, char **argv)
opt->got_dump_info = 1;
opt->got_any++;
break;
+ case T_DUMP_STATS:
+ if (opt->got_dump_stats)
+ duplicate_option(argv[n]);
+ opt->got_dump_stats = 1;
+ opt->got_any++;
+ break;
case T_DUMP_STRING:
if (opt->got_dump_string)
duplicate_option(argv[n]);