diff options
author | Mauro Carvalho Chehab <mchehab+samsung@kernel.org> | 2019-06-18 18:05:38 -0300 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2019-06-20 14:28:36 +0200 |
commit | ecefae6db042283bf88ef3777f2381b18df8ed46 (patch) | |
tree | 5177129d720add73008eeadd6581fab7c27f5233 /Documentation/usb/ehci.txt | |
parent | 743344a952fcebee9ca4d783807cf1f03f933baf (diff) | |
download | linux-ecefae6db042283bf88ef3777f2381b18df8ed46.tar.bz2 |
docs: usb: rename files to .rst and add them to drivers-api
While there are a mix of things here, most of the stuff
were written from Kernel developer's PoV. So, add them to
the driver-api book.
A follow up for this patch would be to move documents from
there that are specific to sysadmins, adding them to the
admin-guide.
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
Acked-by: Johan Hovold <johan@kernel.org>
Acked-by: Felipe Balbi <felipe.balbi@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'Documentation/usb/ehci.txt')
-rw-r--r-- | Documentation/usb/ehci.txt | 230 |
1 files changed, 0 insertions, 230 deletions
diff --git a/Documentation/usb/ehci.txt b/Documentation/usb/ehci.txt deleted file mode 100644 index 31f650e7c1b4..000000000000 --- a/Documentation/usb/ehci.txt +++ /dev/null @@ -1,230 +0,0 @@ -=========== -EHCI driver -=========== - -27-Dec-2002 - -The EHCI driver is used to talk to high speed USB 2.0 devices using -USB 2.0-capable host controller hardware. The USB 2.0 standard is -compatible with the USB 1.1 standard. It defines three transfer speeds: - - - "High Speed" 480 Mbit/sec (60 MByte/sec) - - "Full Speed" 12 Mbit/sec (1.5 MByte/sec) - - "Low Speed" 1.5 Mbit/sec - -USB 1.1 only addressed full speed and low speed. High speed devices -can be used on USB 1.1 systems, but they slow down to USB 1.1 speeds. - -USB 1.1 devices may also be used on USB 2.0 systems. When plugged -into an EHCI controller, they are given to a USB 1.1 "companion" -controller, which is a OHCI or UHCI controller as normally used with -such devices. When USB 1.1 devices plug into USB 2.0 hubs, they -interact with the EHCI controller through a "Transaction Translator" -(TT) in the hub, which turns low or full speed transactions into -high speed "split transactions" that don't waste transfer bandwidth. - -At this writing, this driver has been seen to work with implementations -of EHCI from (in alphabetical order): Intel, NEC, Philips, and VIA. -Other EHCI implementations are becoming available from other vendors; -you should expect this driver to work with them too. - -While usb-storage devices have been available since mid-2001 (working -quite speedily on the 2.4 version of this driver), hubs have only -been available since late 2001, and other kinds of high speed devices -appear to be on hold until more systems come with USB 2.0 built-in. -Such new systems have been available since early 2002, and became much -more typical in the second half of 2002. - -Note that USB 2.0 support involves more than just EHCI. It requires -other changes to the Linux-USB core APIs, including the hub driver, -but those changes haven't needed to really change the basic "usbcore" -APIs exposed to USB device drivers. - -- David Brownell - <dbrownell@users.sourceforge.net> - - -Functionality -============= - -This driver is regularly tested on x86 hardware, and has also been -used on PPC hardware so big/little endianness issues should be gone. -It's believed to do all the right PCI magic so that I/O works even on -systems with interesting DMA mapping issues. - -Transfer Types --------------- - -At this writing the driver should comfortably handle all control, bulk, -and interrupt transfers, including requests to USB 1.1 devices through -transaction translators (TTs) in USB 2.0 hubs. But you may find bugs. - -High Speed Isochronous (ISO) transfer support is also functional, but -at this writing no Linux drivers have been using that support. - -Full Speed Isochronous transfer support, through transaction translators, -is not yet available. Note that split transaction support for ISO -transfers can't share much code with the code for high speed ISO transfers, -since EHCI represents these with a different data structure. So for now, -most USB audio and video devices can't be connected to high speed buses. - -Driver Behavior ---------------- - -Transfers of all types can be queued. This means that control transfers -from a driver on one interface (or through usbfs) won't interfere with -ones from another driver, and that interrupt transfers can use periods -of one frame without risking data loss due to interrupt processing costs. - -The EHCI root hub code hands off USB 1.1 devices to its companion -controller. This driver doesn't need to know anything about those -drivers; a OHCI or UHCI driver that works already doesn't need to change -just because the EHCI driver is also present. - -There are some issues with power management; suspend/resume doesn't -behave quite right at the moment. - -Also, some shortcuts have been taken with the scheduling periodic -transactions (interrupt and isochronous transfers). These place some -limits on the number of periodic transactions that can be scheduled, -and prevent use of polling intervals of less than one frame. - - -Use by -====== - -Assuming you have an EHCI controller (on a PCI card or motherboard) -and have compiled this driver as a module, load this like:: - - # modprobe ehci-hcd - -and remove it by:: - - # rmmod ehci-hcd - -You should also have a driver for a "companion controller", such as -"ohci-hcd" or "uhci-hcd". In case of any trouble with the EHCI driver, -remove its module and then the driver for that companion controller will -take over (at lower speed) all the devices that were previously handled -by the EHCI driver. - -Module parameters (pass to "modprobe") include: - - log2_irq_thresh (default 0): - Log2 of default interrupt delay, in microframes. The default - value is 0, indicating 1 microframe (125 usec). Maximum value - is 6, indicating 2^6 = 64 microframes. This controls how often - the EHCI controller can issue interrupts. - -If you're using this driver on a 2.5 kernel, and you've enabled USB -debugging support, you'll see three files in the "sysfs" directory for -any EHCI controller: - - "async" - dumps the asynchronous schedule, used for control - and bulk transfers. Shows each active qh and the qtds - pending, usually one qtd per urb. (Look at it with - usb-storage doing disk I/O; watch the request queues!) - "periodic" - dumps the periodic schedule, used for interrupt - and isochronous transfers. Doesn't show qtds. - "registers" - show controller register state, and - -The contents of those files can help identify driver problems. - - -Device drivers shouldn't care whether they're running over EHCI or not, -but they may want to check for "usb_device->speed == USB_SPEED_HIGH". -High speed devices can do things that full speed (or low speed) ones -can't, such as "high bandwidth" periodic (interrupt or ISO) transfers. -Also, some values in device descriptors (such as polling intervals for -periodic transfers) use different encodings when operating at high speed. - -However, do make a point of testing device drivers through USB 2.0 hubs. -Those hubs report some failures, such as disconnections, differently when -transaction translators are in use; some drivers have been seen to behave -badly when they see different faults than OHCI or UHCI report. - - -Performance -=========== - -USB 2.0 throughput is gated by two main factors: how fast the host -controller can process requests, and how fast devices can respond to -them. The 480 Mbit/sec "raw transfer rate" is obeyed by all devices, -but aggregate throughput is also affected by issues like delays between -individual high speed packets, driver intelligence, and of course the -overall system load. Latency is also a performance concern. - -Bulk transfers are most often used where throughput is an issue. It's -good to keep in mind that bulk transfers are always in 512 byte packets, -and at most 13 of those fit into one USB 2.0 microframe. Eight USB 2.0 -microframes fit in a USB 1.1 frame; a microframe is 1 msec/8 = 125 usec. - -So more than 50 MByte/sec is available for bulk transfers, when both -hardware and device driver software allow it. Periodic transfer modes -(isochronous and interrupt) allow the larger packet sizes which let you -approach the quoted 480 MBit/sec transfer rate. - -Hardware Performance --------------------- - -At this writing, individual USB 2.0 devices tend to max out at around -20 MByte/sec transfer rates. This is of course subject to change; -and some devices now go faster, while others go slower. - -The first NEC implementation of EHCI seems to have a hardware bottleneck -at around 28 MByte/sec aggregate transfer rate. While this is clearly -enough for a single device at 20 MByte/sec, putting three such devices -onto one bus does not get you 60 MByte/sec. The issue appears to be -that the controller hardware won't do concurrent USB and PCI access, -so that it's only trying six (or maybe seven) USB transactions each -microframe rather than thirteen. (Seems like a reasonable trade off -for a product that beat all the others to market by over a year!) - -It's expected that newer implementations will better this, throwing -more silicon real estate at the problem so that new motherboard chip -sets will get closer to that 60 MByte/sec target. That includes an -updated implementation from NEC, as well as other vendors' silicon. - -There's a minimum latency of one microframe (125 usec) for the host -to receive interrupts from the EHCI controller indicating completion -of requests. That latency is tunable; there's a module option. By -default ehci-hcd driver uses the minimum latency, which means that if -you issue a control or bulk request you can often expect to learn that -it completed in less than 250 usec (depending on transfer size). - -Software Performance --------------------- - -To get even 20 MByte/sec transfer rates, Linux-USB device drivers will -need to keep the EHCI queue full. That means issuing large requests, -or using bulk queuing if a series of small requests needs to be issued. -When drivers don't do that, their performance results will show it. - -In typical situations, a usb_bulk_msg() loop writing out 4 KB chunks is -going to waste more than half the USB 2.0 bandwidth. Delays between the -I/O completion and the driver issuing the next request will take longer -than the I/O. If that same loop used 16 KB chunks, it'd be better; a -sequence of 128 KB chunks would waste a lot less. - -But rather than depending on such large I/O buffers to make synchronous -I/O be efficient, it's better to just queue up several (bulk) requests -to the HC, and wait for them all to complete (or be canceled on error). -Such URB queuing should work with all the USB 1.1 HC drivers too. - -In the Linux 2.5 kernels, new usb_sg_*() api calls have been defined; they -queue all the buffers from a scatterlist. They also use scatterlist DMA -mapping (which might apply an IOMMU) and IRQ reduction, all of which will -help make high speed transfers run as fast as they can. - - -TBD: - Interrupt and ISO transfer performance issues. Those periodic - transfers are fully scheduled, so the main issue is likely to be how - to trigger "high bandwidth" modes. - -TBD: - More than standard 80% periodic bandwidth allocation is possible - through sysfs uframe_periodic_max parameter. Describe that. |