From: Michal Pecio <michal.pecio@gmail.com>
To: Mathias Nyman <mathias.nyman@linux.intel.com>
Cc: Mathias Nyman <mathias.nyman@intel.com>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Xu Rao <raoxu@uniontech.com>,
linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: [PATCH v3] usb: xhci: Fix debugfs bandwidth reporting
Date: Wed, 25 Mar 2026 11:34:42 +0100 [thread overview]
Message-ID: <20260325113442.07cc2976.michal.pecio@gmail.com> (raw)
In-Reply-To: <20260325113246.07681667.michal.pecio@gmail.com>
Replace kernel USB speed numbers with xHCI protocol IDs expected by HW.
They are numerically equal up to high speed, but instead of SuperSpeed
we were querying SuperSpeed+.
Gen1 hardware rejects such commands with TRB Error, which resulted in
zero available bandwidth being shown.
While at that, report failures properly. No attempt made at "tunneling"
all possible comp codes through errno, debugfs users may inspect the
result through event-ring/trbs.
Rename port_bandwidth to port-bandwidth for consistency with others.
Signed-off-by: Michal Pecio <michal.pecio@gmail.com>
---
New in v3:
- rename port_bandwidth to port-bandwidth
New in v2:
- print an error string instead of returning -EIO
- document known and sometimes unobvious error cases
drivers/usb/host/xhci-debugfs.c | 12 ++++++++----
drivers/usb/host/xhci.c | 9 ++++++++-
2 files changed, 16 insertions(+), 5 deletions(-)
diff --git a/drivers/usb/host/xhci-debugfs.c b/drivers/usb/host/xhci-debugfs.c
index 6cc0f60da771..55778c8cab78 100644
--- a/drivers/usb/host/xhci-debugfs.c
+++ b/drivers/usb/host/xhci-debugfs.c
@@ -703,6 +703,10 @@ static int xhci_port_bw_show(struct xhci_hcd *xhci, u8 dev_speed,
seq_printf(s, "port[%d] available bw: %d%%.\n", i,
ctx->bytes[i]);
err_out:
+ if (ret == -EIO) {
+ seq_puts(s, "Get Port Bandwidth failed\n");
+ ret = 0;
+ }
pm_runtime_put_sync(dev);
xhci_free_port_bw_ctx(xhci, ctx);
return ret;
@@ -713,7 +717,7 @@ static int xhci_ss_bw_show(struct seq_file *s, void *unused)
int ret;
struct xhci_hcd *xhci = (struct xhci_hcd *)s->private;
- ret = xhci_port_bw_show(xhci, USB_SPEED_SUPER, s);
+ ret = xhci_port_bw_show(xhci, DEV_PORT_SPEED(XDEV_SS), s);
return ret;
}
@@ -722,7 +726,7 @@ static int xhci_hs_bw_show(struct seq_file *s, void *unused)
int ret;
struct xhci_hcd *xhci = (struct xhci_hcd *)s->private;
- ret = xhci_port_bw_show(xhci, USB_SPEED_HIGH, s);
+ ret = xhci_port_bw_show(xhci, DEV_PORT_SPEED(XDEV_HS), s);
return ret;
}
@@ -731,7 +735,7 @@ static int xhci_fs_bw_show(struct seq_file *s, void *unused)
int ret;
struct xhci_hcd *xhci = (struct xhci_hcd *)s->private;
- ret = xhci_port_bw_show(xhci, USB_SPEED_FULL, s);
+ ret = xhci_port_bw_show(xhci, DEV_PORT_SPEED(XDEV_FS), s);
return ret;
}
@@ -767,7 +771,7 @@ static const struct file_operations bw_fops = {
static void xhci_debugfs_create_bandwidth(struct xhci_hcd *xhci,
struct dentry *parent)
{
- parent = debugfs_create_dir("port_bandwidth", parent);
+ parent = debugfs_create_dir("port-bandwidth", parent);
xhci_debugfs_create_files(xhci, bw_context_files,
ARRAY_SIZE(bw_context_files),
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
index e6edafdfcdb4..c86819afdede 100644
--- a/drivers/usb/host/xhci.c
+++ b/drivers/usb/host/xhci.c
@@ -3262,7 +3262,12 @@ void xhci_reset_bandwidth(struct usb_hcd *hcd, struct usb_device *udev)
}
EXPORT_SYMBOL_GPL(xhci_reset_bandwidth);
-/* Get the available bandwidth of the ports under the xhci roothub */
+/*
+ * Get the available bandwidth of the ports under the xhci roothub.
+ * EIO means the command failed: command not implemented or unsupported
+ * speed (TRB Error), some ASMedia complete with Parameter Error when
+ * querying the root hub (slot_id = 0), or other error or timeout.
+ */
int xhci_get_port_bandwidth(struct xhci_hcd *xhci, struct xhci_container_ctx *ctx,
u8 dev_speed)
{
@@ -3291,6 +3296,8 @@ int xhci_get_port_bandwidth(struct xhci_hcd *xhci, struct xhci_container_ctx *ct
spin_unlock_irqrestore(&xhci->lock, flags);
wait_for_completion(cmd->completion);
+ if (cmd->status != COMP_SUCCESS)
+ ret = -EIO;
err_out:
kfree(cmd->completion);
kfree(cmd);
--
2.48.1
next prev parent reply other threads:[~2026-03-25 10:34 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-04 10:49 [PATCH] usb: xhci: Fix debugfs bandwidth reporting Michal Pecio
2026-03-19 21:04 ` Mathias Nyman
2026-03-25 10:32 ` Michal Pecio
2026-03-25 10:33 ` [PATCH v2] " Michal Pecio
2026-03-25 10:34 ` Michal Pecio [this message]
2026-03-25 12:24 ` [PATCH] " Mathias Nyman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260325113442.07cc2976.michal.pecio@gmail.com \
--to=michal.pecio@gmail.com \
--cc=gregkh@linuxfoundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=mathias.nyman@intel.com \
--cc=mathias.nyman@linux.intel.com \
--cc=raoxu@uniontech.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox