123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214 |
- 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
- <[email protected]>
- 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.
|