Blame view

Documentation/usb/ehci.txt 9.7 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
  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
254217d1a   Andrea Gelmini   USB: Documentatio...
12
  can be used on USB 1.1 systems, but they slow down to USB 1.1 speeds.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
  
  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.
cc62a7eb6   Kirill Smelkov   USB: EHCI: Allow ...
212
213
  TBD:  More than standard 80% periodic bandwidth allocation is possible
  through sysfs uframe_periodic_max parameter. Describe that.