diff options
author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
commit | 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 (patch) | |
tree | 0bba044c4ce775e45a88a51686b5d9f90697ea9d /Documentation/usb/ehci.txt |
Linux-2.6.12-rc2v2.6.12-rc2
Initial git repository build. I'm not bothering with the full history,
even though we have it. We can create a separate "historical" git
archive of that later if we want to, and in the meantime it's about
3.2GB when imported into git - space that would just make the early
git days unnecessarily complicated, when we don't have a lot of good
infrastructure for it.
Let it rip!
Diffstat (limited to 'Documentation/usb/ehci.txt')
-rw-r--r-- | Documentation/usb/ehci.txt | 212 |
1 files changed, 212 insertions, 0 deletions
diff --git a/Documentation/usb/ehci.txt b/Documentation/usb/ehci.txt new file mode 100644 index 000000000000..1536b7e75134 --- /dev/null +++ b/Documentation/usb/ehci.txt | |||
@@ -0,0 +1,212 @@ | |||
1 | 27-Dec-2002 | ||
2 | |||
3 | The EHCI driver is used to talk to high speed USB 2.0 devices using | ||
4 | USB 2.0-capable host controller hardware. The USB 2.0 standard is | ||
5 | compatible with the USB 1.1 standard. It defines three transfer speeds: | ||
6 | |||
7 | - "High Speed" 480 Mbit/sec (60 MByte/sec) | ||
8 | - "Full Speed" 12 Mbit/sec (1.5 MByte/sec) | ||
9 | - "Low Speed" 1.5 Mbit/sec | ||
10 | |||
11 | USB 1.1 only addressed full speed and low speed. High speed devices | ||
12 | can be used on USB 1.1 systems, but they slow down to USB 1.1 speeds. | ||
13 | |||
14 | USB 1.1 devices may also be used on USB 2.0 systems. When plugged | ||
15 | into an EHCI controller, they are given to a USB 1.1 "companion" | ||
16 | controller, which is a OHCI or UHCI controller as normally used with | ||
17 | such devices. When USB 1.1 devices plug into USB 2.0 hubs, they | ||
18 | interact with the EHCI controller through a "Transaction Translator" | ||
19 | (TT) in the hub, which turns low or full speed transactions into | ||
20 | high speed "split transactions" that don't waste transfer bandwidth. | ||
21 | |||
22 | At this writing, this driver has been seen to work with implementations | ||
23 | of EHCI from (in alphabetical order): Intel, NEC, Philips, and VIA. | ||
24 | Other EHCI implementations are becoming available from other vendors; | ||
25 | you should expect this driver to work with them too. | ||
26 | |||
27 | While usb-storage devices have been available since mid-2001 (working | ||
28 | quite speedily on the 2.4 version of this driver), hubs have only | ||
29 | been available since late 2001, and other kinds of high speed devices | ||
30 | appear to be on hold until more systems come with USB 2.0 built-in. | ||
31 | Such new systems have been available since early 2002, and became much | ||
32 | more typical in the second half of 2002. | ||
33 | |||
34 | Note that USB 2.0 support involves more than just EHCI. It requires | ||
35 | other changes to the Linux-USB core APIs, including the hub driver, | ||
36 | but those changes haven't needed to really change the basic "usbcore" | ||
37 | APIs exposed to USB device drivers. | ||
38 | |||
39 | - David Brownell | ||
40 | <dbrownell@users.sourceforge.net> | ||
41 | |||
42 | |||
43 | FUNCTIONALITY | ||
44 | |||
45 | This driver is regularly tested on x86 hardware, and has also been | ||
46 | used on PPC hardware so big/little endianness issues should be gone. | ||
47 | It's believed to do all the right PCI magic so that I/O works even on | ||
48 | systems with interesting DMA mapping issues. | ||
49 | |||
50 | Transfer Types | ||
51 | |||
52 | At this writing the driver should comfortably handle all control, bulk, | ||
53 | and interrupt transfers, including requests to USB 1.1 devices through | ||
54 | transaction translators (TTs) in USB 2.0 hubs. But you may find bugs. | ||
55 | |||
56 | High Speed Isochronous (ISO) transfer support is also functional, but | ||
57 | at this writing no Linux drivers have been using that support. | ||
58 | |||
59 | Full Speed Isochronous transfer support, through transaction translators, | ||
60 | is not yet available. Note that split transaction support for ISO | ||
61 | transfers can't share much code with the code for high speed ISO transfers, | ||
62 | since EHCI represents these with a different data structure. So for now, | ||
63 | most USB audio and video devices can't be connected to high speed buses. | ||
64 | |||
65 | Driver Behavior | ||
66 | |||
67 | Transfers of all types can be queued. This means that control transfers | ||
68 | from a driver on one interface (or through usbfs) won't interfere with | ||
69 | ones from another driver, and that interrupt transfers can use periods | ||
70 | of one frame without risking data loss due to interrupt processing costs. | ||
71 | |||
72 | The EHCI root hub code hands off USB 1.1 devices to its companion | ||
73 | controller. This driver doesn't need to know anything about those | ||
74 | drivers; a OHCI or UHCI driver that works already doesn't need to change | ||
75 | just because the EHCI driver is also present. | ||
76 | |||
77 | There are some issues with power management; suspend/resume doesn't | ||
78 | behave quite right at the moment. | ||
79 | |||
80 | Also, some shortcuts have been taken with the scheduling periodic | ||
81 | transactions (interrupt and isochronous transfers). These place some | ||
82 | limits on the number of periodic transactions that can be scheduled, | ||
83 | and prevent use of polling intervals of less than one frame. | ||
84 | |||
85 | |||
86 | USE BY | ||
87 | |||
88 | Assuming you have an EHCI controller (on a PCI card or motherboard) | ||
89 | and have compiled this driver as a module, load this like: | ||
90 | |||
91 | # modprobe ehci-hcd | ||
92 | |||
93 | and remove it by: | ||
94 | |||
95 | # rmmod ehci-hcd | ||
96 | |||
97 | You should also have a driver for a "companion controller", such as | ||
98 | "ohci-hcd" or "uhci-hcd". In case of any trouble with the EHCI driver, | ||
99 | remove its module and then the driver for that companion controller will | ||
100 | take over (at lower speed) all the devices that were previously handled | ||
101 | by the EHCI driver. | ||
102 | |||
103 | Module parameters (pass to "modprobe") include: | ||
104 | |||
105 | log2_irq_thresh (default 0): | ||
106 | Log2 of default interrupt delay, in microframes. The default | ||
107 | value is 0, indicating 1 microframe (125 usec). Maximum value | ||
108 | is 6, indicating 2^6 = 64 microframes. This controls how often | ||
109 | the EHCI controller can issue interrupts. | ||
110 | |||
111 | If you're using this driver on a 2.5 kernel, and you've enabled USB | ||
112 | debugging support, you'll see three files in the "sysfs" directory for | ||
113 | any EHCI controller: | ||
114 | |||
115 | "async" dumps the asynchronous schedule, used for control | ||
116 | and bulk transfers. Shows each active qh and the qtds | ||
117 | pending, usually one qtd per urb. (Look at it with | ||
118 | usb-storage doing disk I/O; watch the request queues!) | ||
119 | "periodic" dumps the periodic schedule, used for interrupt | ||
120 | and isochronous transfers. Doesn't show qtds. | ||
121 | "registers" show controller register state, and | ||
122 | |||
123 | The contents of those files can help identify driver problems. | ||
124 | |||
125 | |||
126 | Device drivers shouldn't care whether they're running over EHCI or not, | ||
127 | but they may want to check for "usb_device->speed == USB_SPEED_HIGH". | ||
128 | High speed devices can do things that full speed (or low speed) ones | ||
129 | can't, such as "high bandwidth" periodic (interrupt or ISO) transfers. | ||
130 | Also, some values in device descriptors (such as polling intervals for | ||
131 | periodic transfers) use different encodings when operating at high speed. | ||
132 | |||
133 | However, do make a point of testing device drivers through USB 2.0 hubs. | ||
134 | Those hubs report some failures, such as disconnections, differently when | ||
135 | transaction translators are in use; some drivers have been seen to behave | ||
136 | badly when they see different faults than OHCI or UHCI report. | ||
137 | |||
138 | |||
139 | PERFORMANCE | ||
140 | |||
141 | USB 2.0 throughput is gated by two main factors: how fast the host | ||
142 | controller can process requests, and how fast devices can respond to | ||
143 | them. The 480 Mbit/sec "raw transfer rate" is obeyed by all devices, | ||
144 | but aggregate throughput is also affected by issues like delays between | ||
145 | individual high speed packets, driver intelligence, and of course the | ||
146 | overall system load. Latency is also a performance concern. | ||
147 | |||
148 | Bulk transfers are most often used where throughput is an issue. It's | ||
149 | good to keep in mind that bulk transfers are always in 512 byte packets, | ||
150 | and at most 13 of those fit into one USB 2.0 microframe. Eight USB 2.0 | ||
151 | microframes fit in a USB 1.1 frame; a microframe is 1 msec/8 = 125 usec. | ||
152 | |||
153 | So more than 50 MByte/sec is available for bulk transfers, when both | ||
154 | hardware and device driver software allow it. Periodic transfer modes | ||
155 | (isochronous and interrupt) allow the larger packet sizes which let you | ||
156 | approach the quoted 480 MBit/sec transfer rate. | ||
157 | |||
158 | Hardware Performance | ||
159 | |||
160 | At this writing, individual USB 2.0 devices tend to max out at around | ||
161 | 20 MByte/sec transfer rates. This is of course subject to change; | ||
162 | and some devices now go faster, while others go slower. | ||
163 | |||
164 | The first NEC implementation of EHCI seems to have a hardware bottleneck | ||
165 | at around 28 MByte/sec aggregate transfer rate. While this is clearly | ||
166 | enough for a single device at 20 MByte/sec, putting three such devices | ||
167 | onto one bus does not get you 60 MByte/sec. The issue appears to be | ||
168 | that the controller hardware won't do concurrent USB and PCI access, | ||
169 | so that it's only trying six (or maybe seven) USB transactions each | ||
170 | microframe rather than thirteen. (Seems like a reasonable trade off | ||
171 | for a product that beat all the others to market by over a year!) | ||
172 | |||
173 | It's expected that newer implementations will better this, throwing | ||
174 | more silicon real estate at the problem so that new motherboard chip | ||
175 | sets will get closer to that 60 MByte/sec target. That includes an | ||
176 | updated implementation from NEC, as well as other vendors' silicon. | ||
177 | |||
178 | There's a minimum latency of one microframe (125 usec) for the host | ||
179 | to receive interrupts from the EHCI controller indicating completion | ||
180 | of requests. That latency is tunable; there's a module option. By | ||
181 | default ehci-hcd driver uses the minimum latency, which means that if | ||
182 | you issue a control or bulk request you can often expect to learn that | ||
183 | it completed in less than 250 usec (depending on transfer size). | ||
184 | |||
185 | Software Performance | ||
186 | |||
187 | To get even 20 MByte/sec transfer rates, Linux-USB device drivers will | ||
188 | need to keep the EHCI queue full. That means issuing large requests, | ||
189 | or using bulk queuing if a series of small requests needs to be issued. | ||
190 | When drivers don't do that, their performance results will show it. | ||
191 | |||
192 | In typical situations, a usb_bulk_msg() loop writing out 4 KB chunks is | ||
193 | going to waste more than half the USB 2.0 bandwidth. Delays between the | ||
194 | I/O completion and the driver issuing the next request will take longer | ||
195 | than the I/O. If that same loop used 16 KB chunks, it'd be better; a | ||
196 | sequence of 128 KB chunks would waste a lot less. | ||
197 | |||
198 | But rather than depending on such large I/O buffers to make synchronous | ||
199 | I/O be efficient, it's better to just queue up several (bulk) requests | ||
200 | to the HC, and wait for them all to complete (or be canceled on error). | ||
201 | Such URB queuing should work with all the USB 1.1 HC drivers too. | ||
202 | |||
203 | In the Linux 2.5 kernels, new usb_sg_*() api calls have been defined; they | ||
204 | queue all the buffers from a scatterlist. They also use scatterlist DMA | ||
205 | mapping (which might apply an IOMMU) and IRQ reduction, all of which will | ||
206 | help make high speed transfers run as fast as they can. | ||
207 | |||
208 | |||
209 | TBD: Interrupt and ISO transfer performance issues. Those periodic | ||
210 | transfers are fully scheduled, so the main issue is likely to be how | ||
211 | to trigger "high bandwidth" modes. | ||
212 | |||