Commit 65475023 authored by Mathias Nyman's avatar Mathias Nyman Committed by Greg Kroah-Hartman

xhci: debugfs: add usb ports to xhci debugfs

Add ports/portxx/portsc for each xHC hardware usb port to debugfs.
Showing the content of the port status and control register for
each port (PORTSC)

Portxx is numbered starting from 1 for historical reasons to better
match port numbering shown by lsusb and other places.

Ports in debugfs are in the order XHC controller has them,
In most cases USB2 ports come first, followed by USB3 ports.
i.e. USB2 ports are port01-portxx, and USB3 portxx-portmax.
Signed-off-by: default avatarMathias Nyman <mathias.nyman@linux.intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 07f76190
...@@ -333,6 +333,31 @@ static const struct file_operations xhci_context_fops = { ...@@ -333,6 +333,31 @@ static const struct file_operations xhci_context_fops = {
.release = single_release, .release = single_release,
}; };
static int xhci_portsc_show(struct seq_file *s, void *unused)
{
struct xhci_port *port = s->private;
u32 portsc;
portsc = readl(port->addr);
seq_printf(s, "%s\n", xhci_decode_portsc(portsc));
return 0;
}
static int xhci_port_open(struct inode *inode, struct file *file)
{
return single_open(file, xhci_portsc_show, inode->i_private);
}
static const struct file_operations port_fops = {
.open = xhci_port_open,
.read = seq_read,
.llseek = seq_lseek,
.release = single_release,
};
static void xhci_debugfs_create_files(struct xhci_hcd *xhci, static void xhci_debugfs_create_files(struct xhci_hcd *xhci,
struct xhci_file_map *files, struct xhci_file_map *files,
size_t nentries, void *data, size_t nentries, void *data,
...@@ -449,6 +474,27 @@ void xhci_debugfs_remove_slot(struct xhci_hcd *xhci, int slot_id) ...@@ -449,6 +474,27 @@ void xhci_debugfs_remove_slot(struct xhci_hcd *xhci, int slot_id)
dev->debugfs_private = NULL; dev->debugfs_private = NULL;
} }
static void xhci_debugfs_create_ports(struct xhci_hcd *xhci,
struct dentry *parent)
{
unsigned int num_ports;
char port_name[8];
struct xhci_port *port;
struct dentry *dir;
num_ports = HCS_MAX_PORTS(xhci->hcs_params1);
parent = debugfs_create_dir("ports", parent);
while (num_ports--) {
scnprintf(port_name, sizeof(port_name), "port%02d",
num_ports + 1);
dir = debugfs_create_dir(port_name, parent);
port = &xhci->hw_ports[num_ports];
debugfs_create_file("portsc", 0444, dir, port, &port_fops);
}
}
void xhci_debugfs_init(struct xhci_hcd *xhci) void xhci_debugfs_init(struct xhci_hcd *xhci)
{ {
struct device *dev = xhci_to_hcd(xhci)->self.controller; struct device *dev = xhci_to_hcd(xhci)->self.controller;
...@@ -497,6 +543,8 @@ void xhci_debugfs_init(struct xhci_hcd *xhci) ...@@ -497,6 +543,8 @@ void xhci_debugfs_init(struct xhci_hcd *xhci)
xhci->debugfs_root); xhci->debugfs_root);
xhci->debugfs_slots = debugfs_create_dir("devices", xhci->debugfs_root); xhci->debugfs_slots = debugfs_create_dir("devices", xhci->debugfs_root);
xhci_debugfs_create_ports(xhci, xhci->debugfs_root);
} }
void xhci_debugfs_exit(struct xhci_hcd *xhci) void xhci_debugfs_exit(struct xhci_hcd *xhci)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment