* [PATCH 1/1] xhci: add USB2 test mode support
@ 2017-02-08 10:26 Alexander Stein
2017-02-08 12:53 ` Greg Kroah-Hartman
0 siblings, 1 reply; 4+ messages in thread
From: Alexander Stein @ 2017-02-08 10:26 UTC (permalink / raw)
To: Mathias Nyman, Greg Kroah-Hartman
Cc: Alexander Stein, linux-usb, linux-kernel, Wang, Yu, Li, Guanglei,
Wu, Hao
This patch adds support for USB2 test mode (Test_J, Test_K,
Test_SE0_NAK and Test_Packet) per XHCI spec 4.19.6.
Signed-off-by: "Wang, Yu" <yu.y.wang@intel.com>
Signed-off-by: "Li, Guanglei" <guangleix.li@intel.com>
Signed-off-by: "Wu, Hao" <hao.wu@intel.com>
Signed-off-by: Alexander Stein <alexander.stein@systec-electronic.com>
---
This patch was taken from https://github.com/01org/ProductionKernelQuilts/blob/master/uefi/cht-m1stable/patches/0001-xhci-add-USB2-test-mode-support.patch
A major difference is that now a xhci_command has to be allocated manually.
drivers/usb/host/xhci-hub.c | 63 ++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 62 insertions(+), 1 deletion(-)
diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c
index 0ef1690..cd561f1 100644
--- a/drivers/usb/host/xhci-hub.c
+++ b/drivers/usb/host/xhci-hub.c
@@ -879,13 +879,14 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
int max_ports;
unsigned long flags;
u32 temp, status;
- int retval = 0;
+ int i, retval = 0;
__le32 __iomem **port_array;
int slot_id;
struct xhci_bus_state *bus_state;
u16 link_state = 0;
u16 wake_mask = 0;
u16 timeout = 0;
+ u16 selector = 0;
max_ports = xhci_get_ports(hcd, &port_array);
bus_state = &xhci->bus_state[hcd_index(hcd)];
@@ -959,6 +960,8 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
link_state = (wIndex & 0xff00) >> 3;
if (wValue == USB_PORT_FEAT_REMOTE_WAKE_MASK)
wake_mask = wIndex & 0xff00;
+ if (wValue == USB_PORT_FEAT_TEST)
+ selector = (wIndex & 0xff00) >> 8;
/* The MSB of wIndex is the U1/U2 timeout */
timeout = (wIndex & 0xff00) >> 8;
wIndex &= 0xff;
@@ -1134,6 +1137,64 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
temp |= PORT_U2_TIMEOUT(timeout);
writel(temp, port_array[wIndex] + PORTPMSC);
break;
+ case USB_PORT_FEAT_TEST:
+ /* 4.19.6 Port Test Modes (USB2 Test Mode) */
+ if (hcd->speed != HCD_USB2)
+ goto error;
+
+ /* FIXME: Test_Force_Enable case to be implemented */
+ if (selector < TEST_J || selector > TEST_PACKET)
+ goto error;
+
+ /* Disable all Device Slots */
+ for (i = 0; i < MAX_HC_SLOTS; i++) {
+ struct xhci_command *command;
+
+ if (!xhci->dcbaa->dev_context_ptrs[i])
+ continue;
+ command = xhci_alloc_command(xhci, false,
+ false, GFP_ATOMIC);
+ if (!command)
+ return -ENOMEM;
+ if (xhci_queue_slot_control(xhci, command,
+ TRB_DISABLE_SLOT, i)) {
+ xhci_err(xhci,
+ "Disable slot[%d] fail!\n", i);
+ goto error;
+ }
+ xhci_dbg(xhci, "Disable Slot[%d].\n", i);
+ }
+
+ /* Put all ports to the Disable state by clear PP */
+ xhci_dbg(xhci, "Disable all port (PP = 0)\n");
+ for (i = 0; i < max_ports; i++) {
+ temp = readl(port_array[i]);
+ temp &= ~PORT_POWER;
+ writel(temp, port_array[i]);
+ }
+
+ /* Stop the controller */
+ xhci_dbg(xhci, "Stop controller\n");
+ temp = readl(&xhci->op_regs->command);
+ temp &= ~CMD_RUN;
+ writel(temp, &xhci->op_regs->command);
+
+ if (xhci_handshake(&xhci->op_regs->status,
+ STS_HALT, STS_HALT, XHCI_MAX_HALT_USEC)) {
+ xhci_warn(xhci, "Stop controller timeout\n");
+ return -ETIMEDOUT;
+ }
+
+ /* Disable runtime PM for test mode */
+ pm_runtime_forbid(hcd->self.controller);
+
+ /* Set PORTPMSC.PTC field for selected test mode */
+ xhci_dbg(xhci, "Enter Test Mode: %d\n", selector);
+ temp = readl(port_array[wIndex] + PORTPMSC);
+ temp |= selector << 28;
+ writel(temp, port_array[wIndex] + PORTPMSC);
+
+ break;
default:
goto error;
}
--
2.10.2
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH 1/1] xhci: add USB2 test mode support
2017-02-08 10:26 [PATCH 1/1] xhci: add USB2 test mode support Alexander Stein
@ 2017-02-08 12:53 ` Greg Kroah-Hartman
2017-02-08 13:10 ` Alexander Stein
0 siblings, 1 reply; 4+ messages in thread
From: Greg Kroah-Hartman @ 2017-02-08 12:53 UTC (permalink / raw)
To: Alexander Stein
Cc: Mathias Nyman, linux-usb, linux-kernel, Wang, Yu, Li, Guanglei, Wu, Hao
On Wed, Feb 08, 2017 at 11:26:35AM +0100, Alexander Stein wrote:
> This patch adds support for USB2 test mode (Test_J, Test_K,
> Test_SE0_NAK and Test_Packet) per XHCI spec 4.19.6.
What does that mean "in English"? In other words, why do we want this?
What does it provide for a user? Why do we care?
>
> Signed-off-by: "Wang, Yu" <yu.y.wang@intel.com>
> Signed-off-by: "Li, Guanglei" <guangleix.li@intel.com>
> Signed-off-by: "Wu, Hao" <hao.wu@intel.com>
> Signed-off-by: Alexander Stein <alexander.stein@systec-electronic.com>
> ---
> This patch was taken from https://github.com/01org/ProductionKernelQuilts/blob/master/uefi/cht-m1stable/patches/0001-xhci-add-USB2-test-mode-support.patch
> A major difference is that now a xhci_command has to be allocated manually.
>
> drivers/usb/host/xhci-hub.c | 63 ++++++++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 62 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c
> index 0ef1690..cd561f1 100644
> --- a/drivers/usb/host/xhci-hub.c
> +++ b/drivers/usb/host/xhci-hub.c
> @@ -879,13 +879,14 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
> int max_ports;
> unsigned long flags;
> u32 temp, status;
> - int retval = 0;
> + int i, retval = 0;
> __le32 __iomem **port_array;
> int slot_id;
> struct xhci_bus_state *bus_state;
> u16 link_state = 0;
> u16 wake_mask = 0;
> u16 timeout = 0;
> + u16 selector = 0;
>
> max_ports = xhci_get_ports(hcd, &port_array);
> bus_state = &xhci->bus_state[hcd_index(hcd)];
> @@ -959,6 +960,8 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
> link_state = (wIndex & 0xff00) >> 3;
> if (wValue == USB_PORT_FEAT_REMOTE_WAKE_MASK)
> wake_mask = wIndex & 0xff00;
> + if (wValue == USB_PORT_FEAT_TEST)
> + selector = (wIndex & 0xff00) >> 8;
> /* The MSB of wIndex is the U1/U2 timeout */
> timeout = (wIndex & 0xff00) >> 8;
> wIndex &= 0xff;
> @@ -1134,6 +1137,64 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
> temp |= PORT_U2_TIMEOUT(timeout);
> writel(temp, port_array[wIndex] + PORTPMSC);
> break;
> + case USB_PORT_FEAT_TEST:
> + /* 4.19.6 Port Test Modes (USB2 Test Mode) */
> + if (hcd->speed != HCD_USB2)
> + goto error;
> +
> + /* FIXME: Test_Force_Enable case to be implemented */
> + if (selector < TEST_J || selector > TEST_PACKET)
> + goto error;
> +
> + /* Disable all Device Slots */
> + for (i = 0; i < MAX_HC_SLOTS; i++) {
> + struct xhci_command *command;
> +
> + if (!xhci->dcbaa->dev_context_ptrs[i])
> + continue;
> + command = xhci_alloc_command(xhci, false,
> + false, GFP_ATOMIC);
> + if (!command)
> + return -ENOMEM;
> + if (xhci_queue_slot_control(xhci, command,
> + TRB_DISABLE_SLOT, i)) {
> + xhci_err(xhci,
> + "Disable slot[%d] fail!\n", i);
> + goto error;
> + }
> + xhci_dbg(xhci, "Disable Slot[%d].\n", i);
> + }
> +
> + /* Put all ports to the Disable state by clear PP */
> + xhci_dbg(xhci, "Disable all port (PP = 0)\n");
> + for (i = 0; i < max_ports; i++) {
> + temp = readl(port_array[i]);
> + temp &= ~PORT_POWER;
> + writel(temp, port_array[i]);
> + }
> +
> + /* Stop the controller */
> + xhci_dbg(xhci, "Stop controller\n");
> + temp = readl(&xhci->op_regs->command);
> + temp &= ~CMD_RUN;
> + writel(temp, &xhci->op_regs->command);
> +
> + if (xhci_handshake(&xhci->op_regs->status,
> + STS_HALT, STS_HALT, XHCI_MAX_HALT_USEC)) {
> + xhci_warn(xhci, "Stop controller timeout\n");
> + return -ETIMEDOUT;
> + }
> +
> + /* Disable runtime PM for test mode */
> + pm_runtime_forbid(hcd->self.controller);
> +
> + /* Set PORTPMSC.PTC field for selected test mode */
> + xhci_dbg(xhci, "Enter Test Mode: %d\n", selector);
> + temp = readl(port_array[wIndex] + PORTPMSC);
> + temp |= selector << 28;
> + writel(temp, port_array[wIndex] + PORTPMSC);
> +
> + break;
What does this "test mode" do? Where does it report the information?
Who can use it?
thanks,
greg k-h
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 1/1] xhci: add USB2 test mode support
2017-02-08 12:53 ` Greg Kroah-Hartman
@ 2017-02-08 13:10 ` Alexander Stein
2017-02-08 13:24 ` Greg Kroah-Hartman
0 siblings, 1 reply; 4+ messages in thread
From: Alexander Stein @ 2017-02-08 13:10 UTC (permalink / raw)
To: Greg Kroah-Hartman
Cc: Mathias Nyman, linux-usb, linux-kernel, Wang, Yu, Li, Guanglei, Wu, Hao
On Wednesday 08 February 2017 13:53:30, Greg Kroah-Hartman wrote:
> On Wed, Feb 08, 2017 at 11:26:35AM +0100, Alexander Stein wrote:
> > This patch adds support for USB2 test mode (Test_J, Test_K,
> > Test_SE0_NAK and Test_Packet) per XHCI spec 4.19.6.
>
> What does that mean "in English"? In other words, why do we want this?
> What does it provide for a user? Why do we care?
USB2 test mode is a required hardware feature for system integrators
validating their hardware according to USB spec, regarding signal strength and
stuff. It is purely a hardware test feature.
> > @@ -1134,6 +1137,64 @@ int xhci_hub_control(struct usb_hcd *hcd, u16
> > typeReq, u16 wValue,>
> > temp |= PORT_U2_TIMEOUT(timeout);
> > writel(temp, port_array[wIndex] + PORTPMSC);
> > break;
> >
> > + case USB_PORT_FEAT_TEST:
> > + /* 4.19.6 Port Test Modes (USB2 Test Mode) */
> > + if (hcd->speed != HCD_USB2)
> > + goto error;
> > +
> > + /* FIXME: Test_Force_Enable case to be implemented */
> > + if (selector < TEST_J || selector > TEST_PACKET)
> > + goto error;
> > +
> > + /* Disable all Device Slots */
> > + for (i = 0; i < MAX_HC_SLOTS; i++) {
> > + struct xhci_command *command;
> > +
> > + if (!xhci->dcbaa->dev_context_ptrs[i])
> > + continue;
> > + command = xhci_alloc_command(xhci, false,
> > + false, GFP_ATOMIC);
> > + if (!command)
> > + return -ENOMEM;
> > + if (xhci_queue_slot_control(xhci, command,
> > + TRB_DISABLE_SLOT, i)) {
> > + xhci_err(xhci,
> > + "Disable slot[%d] fail!\n", i);
> > + goto error;
> > + }
> > + xhci_dbg(xhci, "Disable Slot[%d].\n", i);
> > + }
> > +
> > + /* Put all ports to the Disable state by clear PP */
> > + xhci_dbg(xhci, "Disable all port (PP = 0)\n");
> > + for (i = 0; i < max_ports; i++) {
> > + temp = readl(port_array[i]);
> > + temp &= ~PORT_POWER;
> > + writel(temp, port_array[i]);
> > + }
> > +
> > + /* Stop the controller */
> > + xhci_dbg(xhci, "Stop controller\n");
> > + temp = readl(&xhci->op_regs->command);
> > + temp &= ~CMD_RUN;
> > + writel(temp, &xhci->op_regs->command);
> > +
> > + if (xhci_handshake(&xhci->op_regs->status,
> > + STS_HALT, STS_HALT, XHCI_MAX_HALT_USEC)) {
> > + xhci_warn(xhci, "Stop controller timeout\n");
> > + return -ETIMEDOUT;
> > + }
> > +
> > + /* Disable runtime PM for test mode */
> > + pm_runtime_forbid(hcd->self.controller);
> > +
> > + /* Set PORTPMSC.PTC field for selected test mode */
> > + xhci_dbg(xhci, "Enter Test Mode: %d\n", selector);
> > + temp = readl(port_array[wIndex] + PORTPMSC);
> > + temp |= selector << 28;
> > + writel(temp, port_array[wIndex] + PORTPMSC);
> > +
> > + break;
>
> What does this "test mode" do? Where does it report the information?
> Who can use it?
Useually you need an oscilloscope and have to enable those test modes on the
hardware. This will send some specific test patterns on D+/D-. There is no
report available (in linux itself) as it is purely externaly visible.
Regular USB usage is not possible at that time.
Anyone (well access to e.g. /dev/bus/usb/001/001 provided) can use it by
sending appropriate USB_PORT_FEAT_TEST requests to the hub.
The same feature for ehci based hosts is already available at
https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/drivers/usb/host/ehci-hub.c#n1267
Best regards,
Alexander
--
Dipl.-Inf. Alexander Stein
SYS TEC electronic GmbH
alexander.stein@systec-electronic.com
Legal and Commercial Address:
Am Windrad 2
08468 Heinsdorfergrund
Germany
Office: +49 (0) 3765 38600-0
Fax: +49 (0) 3765 38600-4100
Managing Directors:
Director Technology/CEO: Dipl.-Phys. Siegmar Schmidt;
Director Commercial Affairs/COO: Dipl. Ing. (FH) Armin von Collrepp
Commercial Registry:
Amtsgericht Chemnitz, HRB 28082; USt.-Id Nr. DE150534010
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 1/1] xhci: add USB2 test mode support
2017-02-08 13:10 ` Alexander Stein
@ 2017-02-08 13:24 ` Greg Kroah-Hartman
0 siblings, 0 replies; 4+ messages in thread
From: Greg Kroah-Hartman @ 2017-02-08 13:24 UTC (permalink / raw)
To: Alexander Stein
Cc: Mathias Nyman, linux-usb, linux-kernel, Wang, Yu, Li, Guanglei, Wu, Hao
On Wed, Feb 08, 2017 at 02:10:39PM +0100, Alexander Stein wrote:
> On Wednesday 08 February 2017 13:53:30, Greg Kroah-Hartman wrote:
> > On Wed, Feb 08, 2017 at 11:26:35AM +0100, Alexander Stein wrote:
> > > This patch adds support for USB2 test mode (Test_J, Test_K,
> > > Test_SE0_NAK and Test_Packet) per XHCI spec 4.19.6.
> >
> > What does that mean "in English"? In other words, why do we want this?
> > What does it provide for a user? Why do we care?
>
> USB2 test mode is a required hardware feature for system integrators
> validating their hardware according to USB spec, regarding signal strength and
> stuff. It is purely a hardware test feature.
Then the changelog needs to say that!
> > > @@ -1134,6 +1137,64 @@ int xhci_hub_control(struct usb_hcd *hcd, u16
> > > typeReq, u16 wValue,>
> > > temp |= PORT_U2_TIMEOUT(timeout);
> > > writel(temp, port_array[wIndex] + PORTPMSC);
> > > break;
> > >
> > > + case USB_PORT_FEAT_TEST:
> > > + /* 4.19.6 Port Test Modes (USB2 Test Mode) */
> > > + if (hcd->speed != HCD_USB2)
> > > + goto error;
> > > +
> > > + /* FIXME: Test_Force_Enable case to be implemented */
> > > + if (selector < TEST_J || selector > TEST_PACKET)
> > > + goto error;
> > > +
> > > + /* Disable all Device Slots */
> > > + for (i = 0; i < MAX_HC_SLOTS; i++) {
> > > + struct xhci_command *command;
> > > +
> > > + if (!xhci->dcbaa->dev_context_ptrs[i])
> > > + continue;
> > > + command = xhci_alloc_command(xhci, false,
> > > + false, GFP_ATOMIC);
> > > + if (!command)
> > > + return -ENOMEM;
> > > + if (xhci_queue_slot_control(xhci, command,
> > > + TRB_DISABLE_SLOT, i)) {
> > > + xhci_err(xhci,
> > > + "Disable slot[%d] fail!\n", i);
> > > + goto error;
> > > + }
> > > + xhci_dbg(xhci, "Disable Slot[%d].\n", i);
> > > + }
> > > +
> > > + /* Put all ports to the Disable state by clear PP */
> > > + xhci_dbg(xhci, "Disable all port (PP = 0)\n");
> > > + for (i = 0; i < max_ports; i++) {
> > > + temp = readl(port_array[i]);
> > > + temp &= ~PORT_POWER;
> > > + writel(temp, port_array[i]);
> > > + }
> > > +
> > > + /* Stop the controller */
> > > + xhci_dbg(xhci, "Stop controller\n");
> > > + temp = readl(&xhci->op_regs->command);
> > > + temp &= ~CMD_RUN;
> > > + writel(temp, &xhci->op_regs->command);
> > > +
> > > + if (xhci_handshake(&xhci->op_regs->status,
> > > + STS_HALT, STS_HALT, XHCI_MAX_HALT_USEC)) {
> > > + xhci_warn(xhci, "Stop controller timeout\n");
> > > + return -ETIMEDOUT;
> > > + }
> > > +
> > > + /* Disable runtime PM for test mode */
> > > + pm_runtime_forbid(hcd->self.controller);
> > > +
> > > + /* Set PORTPMSC.PTC field for selected test mode */
> > > + xhci_dbg(xhci, "Enter Test Mode: %d\n", selector);
> > > + temp = readl(port_array[wIndex] + PORTPMSC);
> > > + temp |= selector << 28;
> > > + writel(temp, port_array[wIndex] + PORTPMSC);
> > > +
> > > + break;
> >
> > What does this "test mode" do? Where does it report the information?
> > Who can use it?
>
> Useually you need an oscilloscope and have to enable those test modes on the
> hardware. This will send some specific test patterns on D+/D-. There is no
> report available (in linux itself) as it is purely externaly visible.
> Regular USB usage is not possible at that time.
> Anyone (well access to e.g. /dev/bus/usb/001/001 provided) can use it by
> sending appropriate USB_PORT_FEAT_TEST requests to the hub.
> The same feature for ehci based hosts is already available at
> https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/drivers/usb/host/ehci-hub.c#n1267
Put that info in the changelog!
thanks,
greg k-h
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2017-02-08 13:26 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-02-08 10:26 [PATCH 1/1] xhci: add USB2 test mode support Alexander Stein
2017-02-08 12:53 ` Greg Kroah-Hartman
2017-02-08 13:10 ` Alexander Stein
2017-02-08 13:24 ` Greg Kroah-Hartman
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.