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@xxxxxxxxxxxxxxxxxxxxx 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 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html