€•Ï…Œsphinx.addnodes”Œdocument”“”)”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)”}”(hhh]”(hŒ pending_xref”“”)”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…””}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ/translations/zh_CN/usb/ehci”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)”}”(hhh]”hŒChinese (Traditional)”…””}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ/translations/zh_TW/usb/ehci”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒItalian”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ/translations/it_IT/usb/ehci”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ/translations/ja_JP/usb/ehci”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ/translations/ko_KR/usb/ehci”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒPortuguese (Brazilian)”…””}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ/translations/pt_BR/usb/ehci”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒSpanish”…””}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ/translations/sp_SP/usb/ehci”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒ EHCI driver”h]”hŒ EHCI driver”…””}”(hh¼h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhh·h²hh³Œ6/var/lib/git/docbuild/linux/Documentation/usb/ehci.rst”h´KubhŒ paragraph”“”)”}”(hŒ 27-Dec-2002”h]”hŒ 27-Dec-2002”…””}”(hhÍh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Khh·h²hubhÌ)”}”(hŒÎ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:”h]”hŒÎ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:”…””}”(hhÛh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Khh·h²hubhŒ block_quote”“”)”}”(hŒq- "High Speed" 480 Mbit/sec (60 MByte/sec) - "Full Speed" 12 Mbit/sec (1.5 MByte/sec) - "Low Speed" 1.5 Mbit/sec ”h]”hŒ bullet_list”“”)”}”(hhh]”(hŒ list_item”“”)”}”(hŒ("High Speed" 480 Mbit/sec (60 MByte/sec)”h]”hÌ)”}”(hhøh]”hŒ,“High Speed†480 Mbit/sec (60 MByte/sec)”…””}”(hhúh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K hhöubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhhñubhõ)”}”(hŒ("Full Speed" 12 Mbit/sec (1.5 MByte/sec)”h]”hÌ)”}”(hjh]”hŒ,“Full Speed†12 Mbit/sec (1.5 MByte/sec)”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhhñubhõ)”}”(hŒ"Low Speed" 1.5 Mbit/sec ”h]”hÌ)”}”(hŒ"Low Speed" 1.5 Mbit/sec”h]”hŒ“Low Speed†1.5 Mbit/sec”…””}”(hj(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K hj$ubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhhñubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ-”uh1hïh³hÊh´K hhëubah}”(h]”h ]”h"]”h$]”h&]”uh1héh³hÊh´K hh·h²hubhÌ)”}”(hŒŠ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.”h]”hŒŠ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.”…””}”(hjJh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Khh·h²hubhÌ)”}”(hXÔ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.”h]”hXâ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.”…””}”(hjXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Khh·h²hubhÌ)”}”(hXAt 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.”h]”hXAt 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.”…””}”(hjfh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Khh·h²hubhÌ)”}”(hXWhile 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.”h]”hXWhile 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.”…””}”(hjth²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Khh·h²hubhÌ)”}”(hŒò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.”h]”hŒø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.”…””}”(hj‚h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K&hh·h²hubhð)”}”(hhh]”hõ)”}”(hŒ2David Brownell ”h]”hÌ)”}”(hŒ0David Brownell ”h]”(hŒDavid Brownell <”…””}”(hj—h²hh³Nh´NubhŒ reference”“”)”}”(hŒdbrownell@users.sourceforge.net”h]”hŒdbrownell@users.sourceforge.net”…””}”(hj¡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œ&mailto:dbrownell@users.sourceforge.net”uh1jŸhj—ubhŒ>”…””}”(hj—h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K+hj“ubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhjh²hh³hÊh´Nubah}”(h]”h ]”h"]”h$]”h&]”jBjCuh1hïh³hÊh´K+hh·h²hubh¶)”}”(hhh]”(h»)”}”(hŒ Functionality”h]”hŒ Functionality”…””}”(hjÊh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjÇh²hh³hÊh´K0ubhÌ)”}”(hŒú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.”h]”hŒü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.”…””}”(hjØh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K2hjÇh²hubh¶)”}”(hhh]”(h»)”}”(hŒTransfer Types”h]”hŒTransfer Types”…””}”(hjéh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjæh²hh³hÊh´K8ubhÌ)”}”(hŒÕ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.”h]”hŒÕ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.”…””}”(hj÷h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K:hjæh²hubhÌ)”}”(hŒ„High Speed Isochronous (ISO) transfer support is also functional, but at this writing no Linux drivers have been using that support.”h]”hŒ„High Speed Isochronous (ISO) transfer support is also functional, but at this writing no Linux drivers have been using that support.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K>hjæh²hubhÌ)”}”(hXkFull 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.”h]”hXoFull 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.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KAhjæh²hubeh}”(h]”Œtransfer-types”ah ]”h"]”Œtransfer types”ah$]”h&]”uh1hµhjÇh²hh³hÊh´K8ubh¶)”}”(hhh]”(h»)”}”(hŒDriver Behavior”h]”hŒDriver Behavior”…””}”(hj,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj)h²hh³hÊh´KHubhÌ)”}”(hX 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.”h]”hX"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.”…””}”(hj:h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KJhj)h²hubhÌ)”}”(hŒû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.”h]”hŒÿ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.”…””}”(hjHh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KOhj)h²hubhÌ)”}”(hŒeThere are some issues with power management; suspend/resume doesn't behave quite right at the moment.”h]”hŒgThere are some issues with power management; suspend/resume doesn’t behave quite right at the moment.”…””}”(hjVh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KThj)h²hubhÌ)”}”(hX 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.”h]”hX 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.”…””}”(hjdh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KWhj)h²hubeh}”(h]”Œdriver-behavior”ah ]”h"]”Œdriver behavior”ah$]”h&]”uh1hµhjÇh²hh³hÊh´KHubeh}”(h]”Œ functionality”ah ]”h"]”Œ functionality”ah$]”h&]”uh1hµhh·h²hh³hÊh´K0ubh¶)”}”(hhh]”(h»)”}”(hŒUse by”h]”hŒUse by”…””}”(hj…h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj‚h²hh³hÊh´K^ubhÌ)”}”(hŒAssuming you have an EHCI controller (on a PCI card or motherboard) and have compiled this driver as a module, load this like::”h]”hŒ~Assuming you have an EHCI controller (on a PCI card or motherboard) and have compiled this driver as a module, load this like:”…””}”(hj“h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K`hj‚h²hubhŒ literal_block”“”)”}”(hŒ# modprobe ehci-hcd”h]”hŒ# modprobe ehci-hcd”…””}”hj£sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1j¡h³hÊh´Kchj‚h²hubhÌ)”}”(hŒand remove it by::”h]”hŒand remove it by:”…””}”(hj³h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Kehj‚h²hubj¢)”}”(hŒ# rmmod ehci-hcd”h]”hŒ# rmmod ehci-hcd”…””}”hjÁsbah}”(h]”h ]”h"]”h$]”h&]”j±j²uh1j¡h³hÊh´Kghj‚h²hubhÌ)”}”(hX1You 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.”h]”hX=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.”…””}”(hjÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Kihj‚h²hubhÌ)”}”(hŒ/Module parameters (pass to "modprobe") include:”h]”hŒ3Module parameters (pass to “modprobeâ€) include:”…””}”(hjÝh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Kohj‚h²hubhê)”}”(hXlog2_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. ”h]”hŒdefinition_list”“”)”}”(hhh]”hŒdefinition_list_item”“”)”}”(hXlog2_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. ”h]”(hŒterm”“”)”}”(hŒlog2_irq_thresh (default 0):”h]”hŒlog2_irq_thresh (default 0):”…””}”(hjüh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júh³hÊh´KuhjöubhŒ definition”“”)”}”(hhh]”hÌ)”}”(hŒæ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.”h]”hŒæ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.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Krhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjöubeh}”(h]”h ]”h"]”h$]”h&]”uh1jôh³hÊh´Kuhjñubah}”(h]”h ]”h"]”h$]”h&]”uh1jïhjëubah}”(h]”h ]”h"]”h$]”h&]”uh1héh³hÊh´Kqhj‚h²hubhÌ)”}”(hŒŸ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:”h]”hŒ©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:”…””}”(hj5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Kwhj‚h²hubhê)”}”(hX®"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 ”h]”jð)”}”(hhh]”(jõ)”}”(hŒÛ"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!)”h]”(jû)”}”(hŒ"async"”h]”hŒ “async—…””}”(hjNh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júh³hÊh´K~hjJubj )”}”(hhh]”hÌ)”}”(hŒÓ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!)”h]”hŒÓ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!)”…””}”(hj_h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K|hj\ubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjJubeh}”(h]”h ]”h"]”h$]”h&]”uh1jôh³hÊh´K~hjGubjõ)”}”(hŒi"periodic" dumps the periodic schedule, used for interrupt and isochronous transfers. Doesn't show qtds.”h]”(jû)”}”(hŒ "periodic"”h]”hŒ“periodic—…””}”(hj}h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júh³hÊh´Khjyubj )”}”(hhh]”hÌ)”}”(hŒ^dumps the periodic schedule, used for interrupt and isochronous transfers. Doesn't show qtds.”h]”hŒ`dumps the periodic schedule, used for interrupt and isochronous transfers. Doesn’t show qtds.”…””}”(hjŽh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Khj‹ubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjyubeh}”(h]”h ]”h"]”h$]”h&]”uh1jôh³hÊh´KhjGubjõ)”}”(hŒ0"registers" show controller register state, and ”h]”(jû)”}”(hŒ "registers"”h]”hŒ“registers—…””}”(hj¬h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júh³hÊh´K„hj¨ubj )”}”(hhh]”hÌ)”}”(hŒ#show controller register state, and”h]”hŒ#show controller register state, and”…””}”(hj½h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K„hjºubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj¨ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jôh³hÊh´K„hjGubeh}”(h]”h ]”h"]”h$]”h&]”uh1jïhjCubah}”(h]”h ]”h"]”h$]”h&]”uh1héh³hÊh´K{hj‚h²hubhÌ)”}”(hŒ>The contents of those files can help identify driver problems.”h]”hŒ>The contents of those files can help identify driver problems.”…””}”(hjãh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K†hj‚h²hubhÌ)”}”(hXª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.”h]”hX¸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.”…””}”(hjñh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K‰hj‚h²hubhÌ)”}”(hXHowever, 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.”h]”hXHowever, 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.”…””}”(hjÿh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Khj‚h²hubeh}”(h]”Œuse-by”ah ]”h"]”Œuse by”ah$]”h&]”uh1hµhh·h²hh³hÊh´K^ubh¶)”}”(hhh]”(h»)”}”(hŒ Performance”h]”hŒ Performance”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjh²hh³hÊh´K—ubhÌ)”}”(hX™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.”h]”hXUSB 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.”…””}”(hj&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K™hjh²hubhÌ)”}”(hX 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.”h]”hX"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.”…””}”(hj4h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K hjh²hubhÌ)”}”(hXSo 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.”h]”hXSo 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.”…””}”(hjBh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K¥hjh²hubh¶)”}”(hhh]”(h»)”}”(hŒHardware Performance”h]”hŒHardware Performance”…””}”(hjSh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjPh²hh³hÊh´K«ubhÌ)”}”(hŒÀ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.”h]”hŒÀ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.”…””}”(hjah²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K­hjPh²hubhÌ)”}”(hX+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!)”h]”hX/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!)”…””}”(hjoh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K±hjPh²hubhÌ)”}”(hXIt'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.”h]”hXIt’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.”…””}”(hj}h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KºhjPh²hubhÌ)”}”(hXš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).”h]”hXž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).”…””}”(hj‹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K¿hjPh²hubeh}”(h]”Œhardware-performance”ah ]”h"]”Œhardware performance”ah$]”h&]”uh1hµhjh²hh³hÊh´K«ubh¶)”}”(hhh]”(h»)”}”(hŒSoftware Performance”h]”hŒSoftware Performance”…””}”(hj¤h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj¡h²hh³hÊh´KÇubhÌ)”}”(hXTo 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.”h]”hXTo 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.”…””}”(hj²h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KÉhj¡h²hubhÌ)”}”(hXPIn 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.”h]”hXRIn 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.”…””}”(hjÀh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KÎhj¡h²hubhÌ)”}”(hXBut 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.”h]”hXBut 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.”…””}”(hjÎh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KÔhj¡h²hubhÌ)”}”(hXIn 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.”h]”hXIn 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.”…””}”(hjÜh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KÙhj¡h²hubjð)”}”(hhh]”(jõ)”}”(hŒ¬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. ”h]”(jû)”}”(hŒTBD:”h]”hŒTBD:”…””}”(hjñh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júh³hÊh´Kâhjíubj )”}”(hhh]”hÌ)”}”(hŒ¦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.”h]”hŒª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.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Kàhjÿubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjíubeh}”(h]”h ]”h"]”h$]”h&]”uh1jôh³hÊh´Kâhjêubjõ)”}”(hŒTBD: More than standard 80% periodic bandwidth allocation is possible through sysfs uframe_periodic_max parameter. Describe that.”h]”(jû)”}”(hŒTBD:”h]”hŒTBD:”…””}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júh³hÊh´Kåhjubj )”}”(hhh]”hÌ)”}”(hŒ|More than standard 80% periodic bandwidth allocation is possible through sysfs uframe_periodic_max parameter. Describe that.”h]”hŒ|More than standard 80% periodic bandwidth allocation is possible through sysfs uframe_periodic_max parameter. Describe that.”…””}”(hj1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Kåhj.ubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jôh³hÊh´Kåhjêh²hubeh}”(h]”h ]”h"]”h$]”h&]”uh1jïhj¡h²hh³hÊh´Nubeh}”(h]”Œsoftware-performance”ah ]”h"]”Œsoftware performance”ah$]”h&]”uh1hµhjh²hh³hÊh´KÇubeh}”(h]”Œ performance”ah ]”h"]”Œ performance”ah$]”h&]”uh1hµhh·h²hh³hÊh´K—ubeh}”(h]”Œ ehci-driver”ah ]”h"]”Œ ehci driver”ah$]”h&]”uh1hµhhh²hh³hÊh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÊuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)”}”(hºNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”jŒŒerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÊŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(jfjcjj|j&j#jwjtjjj^j[jžj›jVjSuŒ nametypes”}”(jf‰j‰j&‰jw‰j‰j^‰jž‰jV‰uh}”(jch·j|jÇj#jæjtj)jj‚j[jj›jPjSj¡uŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.