<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Microsoft Windows USB Core Team Blog </title><link>http://blogs.msdn.com/b/usbcoreblog/</link><description /><dc:language>en-US</dc:language><generator>Telligent Evolution Platform Developer Build (Build: 5.6.50428.7875)</generator><item><title>USB 2.1, 2.0, 1.1 device enumeration changes in Windows 8</title><link>http://blogs.msdn.com/b/usbcoreblog/archive/2013/04/11/usb-2-1-2-0-1-1-device-enumeration-changes-in-windows-8.aspx</link><pubDate>Thu, 11 Apr 2013 21:44:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10410449</guid><dc:creator>USB Blog</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/usbcoreblog/rsscomments.aspx?WeblogPostID=10410449</wfw:commentRss><comments>http://blogs.msdn.com/b/usbcoreblog/archive/2013/04/11/usb-2-1-2-0-1-1-device-enumeration-changes-in-windows-8.aspx#comments</comments><description>&lt;p&gt;Authored by Martin Borve [MSFT]&lt;/p&gt;
&lt;p&gt;In 2009 we posted a &lt;a href="http://blogs.msdn.com/b/usbcoreblog/archive/2009/10/31/how-does-usb-stack-enumerate-a-device.aspx"&gt;detailed description of how Windows 7 enumerates a USB device&lt;/a&gt;. In Windows 8, we&amp;rsquo;ve made modifications in the USB driver stack on how the stack enumerates USB 2.1, 2.0, and 1.1 devices. Those modifications support new USB features and improve device enumeration performance. The purpose of this article is to bring awareness to these subtle changes and enable device/firmware builders to easily determine the root cause of enumeration failures.&lt;/p&gt;
&lt;h2&gt;Reduced Timing Delays&lt;/h2&gt;
&lt;p&gt;Before Windows 8, the timing for delays were approximately 15-30 milliseconds longer than delays required by the official USB 2.0 specification. Cumulatively, those delays added several 100 milliseconds to the device enumeration time. In Windows 8, we&amp;rsquo;ve reduced the timing delays to 0-15 milliseconds resulting in faster enumeration.&lt;/p&gt;
&lt;h2&gt;Elimination of Second-Port Reset for High-Speed Devices&lt;/h2&gt;
&lt;p&gt;Before Windows 8, the USB driver stack reset the device&amp;rsquo;s upstream port &lt;a href="http://blogs.msdn.com/b/usbcoreblog/archive/2009/10/31/how-does-usb-stack-enumerate-a-device.aspx#_Second_Port_Reset"&gt;twice&lt;/a&gt;. That behavior was to support legacy USB devices that were confused by the second request for the Device Descriptor. To allow those devices to enumerate successfully, the driver stack had to reset the upstream port between the first and second requests for the Device Descriptor. This second reset was expensive in terms of enumeration time.&lt;/p&gt;
&lt;p&gt;Because that second reset was required just to support legacy low and full-speed devices, we&amp;rsquo;ve removed it for high-speed devices in Windows 8. Just in case the first attempt to enumerate a high-speed device fails, the driver stack reverts to resetting the port twice when it retries enumeration for the device.&lt;/p&gt;
&lt;h2&gt;BOS Descriptor Query and Validation&lt;/h2&gt;
&lt;p&gt;The USB 3.0 and USB 2.0 LPM specifications define a new USB descriptor called the Binary Device Object Store (BOS). The BOS descriptor returns a set of device-level capability descriptors for the USB device. For a USB device, which reports a &lt;strong&gt;bcdUSB&lt;/strong&gt; value greater than 0x0200 in their device descriptor, in Windows 8, the USB driver stack requests for the BOS descriptor header immediately after the &lt;a href="http://blogs.msdn.com/b/usbcoreblog/archive/2009/10/31/how-does-usb-stack-enumerate-a-device.aspx#_Language_ID_Query"&gt;Language ID query&lt;/a&gt; request. If that request fails, the driver stack proceeds to the Product ID String query request.&lt;/p&gt;
&lt;p&gt;If the request for the BOS descriptor header succeeds, the driver stack requests the entire BOS descriptor set by using the value returned in the BOS descriptor&amp;rsquo;s &lt;strong&gt;wTotalLength&lt;/strong&gt; field as the request length. If that request fails, the&amp;nbsp;&lt;span style="font-family: 'Arial','sans-serif'; font-size: 10pt; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA;"&gt;driver stack will fail enumeration of the device.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; To make sure your device enumerates on Windows 8 and future versions of Windows, do not rely on the sequence in which the USB driver stack queries for the BOS descriptor. Instead, make sure that the device reports correct values to pass validation checks as described in these sections.&lt;/p&gt;
&lt;h3&gt;BOS Descriptor Validation&lt;/h3&gt;
&lt;p&gt;The USB driver stack validates the retrieved BOS descriptor. Make sure that in your device:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The number of bytes greater than or equal to the size of the BOS descriptor.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;bDescriptorType&lt;/strong&gt; indicates the BOS Descriptor type (0x0F).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;bLength&lt;/strong&gt; is the correct size of the BOS descriptor.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;wTotalLength&lt;/strong&gt; is greater than or equal to the size of the BOS descriptor.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;wTotalLength&lt;/strong&gt; is large enough to contain the number of capability descriptors reported in &lt;strong&gt;bNumDeviceCaps&lt;/strong&gt;. The device computes the value by assuming a minimal 2-byte capability descriptor containing &lt;strong&gt;bLength&lt;/strong&gt; and &lt;strong&gt;bDescriptorType&lt;/strong&gt; fields, multiplied by the &lt;strong&gt;bNumDeviceCaps&lt;/strong&gt; value, and added to the size of the BOS descriptor.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;bNumDeviceCaps&lt;/strong&gt; is not zero.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If any of those validation checks fail, the driver stack will fail enumeration of the device. Otherwise the stack validates each Device Capability Descriptor.&lt;/p&gt;
&lt;h3&gt;Device Capability Descriptors Validation&lt;/h3&gt;
&lt;h4&gt;Generic Device Capability Descriptor Validation&lt;/h4&gt;
&lt;p&gt;For each device capability descriptor returned within the BOS descriptor set, the USB driver stack validates these conditions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;There is enough space left in the descriptor set for a capability descriptor.&lt;/li&gt;
&lt;li&gt;The capability descriptor&amp;rsquo;s &lt;strong&gt;bLength&lt;/strong&gt; value does not overrun the end of the descriptor set.&lt;/li&gt;
&lt;li&gt;The capability descriptor&amp;rsquo;s &lt;strong&gt;bLength&lt;/strong&gt; value is non-zero.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If any of those validations fail, the driver stack discards the BOS descriptor and proceeds to the Product ID String query.&lt;/p&gt;
&lt;h4&gt;Validation of USB 2.0 Extension Capability Descriptor&lt;/h4&gt;
&lt;p&gt;The driver stack validates the USB 2.0 Extension Capability Descriptor. If your device has that descriptor, make sure that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;bLength&lt;/strong&gt; is set to the size of the USB 2.0 Extension Descriptor.&lt;/li&gt;
&lt;li&gt;The reserved bits of the &lt;strong&gt;bmAttributes&lt;/strong&gt; field are zero.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If any of those validation checks fail, the driver stack discards the BOS descriptor and proceeds to the Product ID String query.&lt;/p&gt;
&lt;h4&gt;Validation of SuperSpeed USB Device Capability Descriptor&lt;/h4&gt;
&lt;p&gt;The driver stack validates the USB 2.0 Extension Capability Descriptor. If your device has that descriptor, make sure that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;bLength&lt;/strong&gt; is set to the size of the SuperSpeed USB Device Capability Descriptor.&lt;/li&gt;
&lt;li&gt;The reserved bits of the &lt;strong&gt;bmAttributes&lt;/strong&gt; field are zero.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;wSpeedsSupported&lt;/strong&gt; field is non-zero.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;wU2DevExitLat&lt;/strong&gt; is less than 0x0800.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If any of those validations fail, the driver stack discards the BOS descriptor and proceeds to the Product ID String query.&lt;/p&gt;
&lt;h4&gt;Validation of Container ID Descriptor&lt;/h4&gt;
&lt;p&gt;The USB driver stack validates the Container ID Descriptor. If your device has that descriptor, make sure that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;bLength&lt;/strong&gt; is set to the size of the Container ID Capability Descriptor.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;bReserved&lt;/strong&gt; field is zero.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If any of those validations fail, the driver stack discards the BOS descriptor and proceeds to the Product ID String query.&lt;/p&gt;
&lt;h4&gt;Other Capability Descriptors&lt;/h4&gt;
&lt;p&gt;The USB driver stack performs generic validation checks on any other capability descriptors found. Beyond that they are ignored.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10410449" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/usbcoreblog/archive/tags/usbport/">usbport</category><category domain="http://blogs.msdn.com/b/usbcoreblog/archive/tags/ehci/">ehci</category><category domain="http://blogs.msdn.com/b/usbcoreblog/archive/tags/ohci/">ohci</category><category domain="http://blogs.msdn.com/b/usbcoreblog/archive/tags/Windows+8/">Windows 8</category><category domain="http://blogs.msdn.com/b/usbcoreblog/archive/tags/usb3/">usb3</category></item><item><title>Help! My USB 3.0 Device is Operating at a Lower Speed</title><link>http://blogs.msdn.com/b/usbcoreblog/archive/2013/03/26/help-my-usb-3-0-device-is-operating-at-a-lower-speed.aspx</link><pubDate>Tue, 26 Mar 2013 18:40:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10405503</guid><dc:creator>USB Blog</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/usbcoreblog/rsscomments.aspx?WeblogPostID=10405503</wfw:commentRss><comments>http://blogs.msdn.com/b/usbcoreblog/archive/2013/03/26/help-my-usb-3-0-device-is-operating-at-a-lower-speed.aspx#comments</comments><description>&lt;p&gt;Authored by Andrea Keating [MSFT]&lt;/p&gt;
&lt;p&gt;If you have upgraded a system with USB 3.0 controllers from Windows 7 to Windows 8 and notice that the connected USB 3.0 devices are not operating at SuperSpeed (see &lt;a href="http://blogs.msdn.com/b/usbcoreblog/archive/2012/06/27/how-to-determine-whether-a-usb-3-0-device-is-operating-at-superspeed.aspx"&gt;How to determine if a USB device is operating at SuperSpeed&lt;/a&gt;) then this article will help you troubleshoot and fix the issue.&lt;/p&gt;
&lt;p&gt;Microsoft provides a new USB driver stack for USB 3.0 in Windows 8. The new stack includes an in-box host controller driver that works with all available controllers. We recommend that you do &lt;em&gt;not&lt;/em&gt; load a 3&lt;sup&gt;rd&lt;/sup&gt; party driver for your USB 3.0 controller (or XHCI controller) on Windows 8 because of compatibility issues. Different USB 3.0 controllers vary slightly in speed, however all USB 3.0 controllers are significantly faster than 2.0 controllers.&lt;/p&gt;
&lt;p&gt;Read the troubleshooting section in &lt;a href="http://blogs.msdn.com/b/usbcoreblog/archive/2012/06/27/how-to-determine-whether-a-usb-3-0-device-is-operating-at-superspeed.aspx"&gt;How to determine if a USB device is operating at SuperSpeed&lt;/a&gt; to identify the most common issues. That section describes common issues related to setup or improper hardware configuration.&lt;/p&gt;
&lt;p&gt;This post describes issues related to the BIOS.&lt;/p&gt;
&lt;h3&gt;Make sure that the xHCI controller is enabled in the BIOS&lt;/h3&gt;
&lt;p&gt;Check that your BIOS setting enables the xHCI controller. Some older systems that have been upgraded to Windows 8 allow for SuperSpeed port to be routed to an EHCI controller in the BIOS. That option disables the USB 3.0 ports of an xHCI controller and exposes only the USB 2.0 ports. Those USB 2.0 ports appear under an EHCI controller. In this image, notice that the Legacy USB Support (EHCI) option is enabled through the &lt;strong&gt;Auto&lt;/strong&gt; option and XHCI handoff is &lt;strong&gt;Enabled&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62/0118.Picture-1.jpg"&gt;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62/0118.Picture-1.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="center"&gt;BIOS example -xHCI controller is enabled&lt;/p&gt;
&lt;p align="center"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62/5684.Picture2.jpg"&gt;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62/5684.Picture2.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="center"&gt;BIOS example -xHCI controller is enabled&lt;/p&gt;
&lt;p&gt;Depending on your system, the option to enable an xHCI controller may or may not appear in the BIOS. If there is such an option, it might not be in the same location as shown in the image. To check your BIOS option, follow instructions from the boot screen about how to enter setup. For many systems you can do so by pressing F2, however that can be different.&lt;/p&gt;
&lt;h3&gt;Make sure that your system has the latest BIOS version (applies to upgraded systems with Intel controllers)&lt;/h3&gt;
&lt;p&gt;On some systems with Intel xHCI controllers, SuperSpeed devices can operate at a lower speed. The issue is system-related and only seen in systems that have been upgraded from Windows 7 to Windows 8. It does not apply to &lt;em&gt;all&lt;/em&gt; systems with Intel xHCI controllers. Typically, we see the issue in a system that have an older BIOS version. Specifically, when the BIOS enables the legacy (EHCI) controller but does not display an option to disable it. That causes the port to be always routed to the EHCI controller until the BIOS is updated.&lt;/p&gt;
&lt;p&gt;To identify if your system has an Intel xHCI controller, locate the controller in Device Manager. The controller named &lt;strong&gt;Intel USB 3.0 eXtensible Host Controller - 0100 (Microsoft)&lt;/strong&gt; in this image experiences the issue discussed.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62/2744.Picture3.jpg"&gt;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62/2744.Picture3.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Contact your system vendor and get a BIOS update, if required. Those updates are usually available on the vendor&amp;rsquo;s Web site. If the newer BIOS does not fix the issue, ask your system vendor to identify a BIOS version that is compatible with Windows 8.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10405503" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/usbcoreblog/archive/tags/Windows+8/">Windows 8</category><category domain="http://blogs.msdn.com/b/usbcoreblog/archive/tags/usb3/">usb3</category></item><item><title>Supporting D3Cold for USB Devices</title><link>http://blogs.msdn.com/b/usbcoreblog/archive/2013/02/19/supporting-d3cold-for-usb-devices.aspx</link><pubDate>Tue, 19 Feb 2013 00:01:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10395021</guid><dc:creator>USB Blog</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/usbcoreblog/rsscomments.aspx?WeblogPostID=10395021</wfw:commentRss><comments>http://blogs.msdn.com/b/usbcoreblog/archive/2013/02/19/supporting-d3cold-for-usb-devices.aspx#comments</comments><description>&lt;p&gt;Authored by Vivek Gupta [MSFT]&lt;/p&gt;
&lt;p&gt;Windows 8 supports a new device power state called the &lt;em&gt;D3cold state&lt;/em&gt;. Adopting D3cold for USB presents some unique challenges for USB devices and drivers. In this blog post, I will talk about those challenges and certain restrictions. This post assumes that you are familiar with the content presented in &lt;a href="http://msdn.microsoft.com/en-us/library/windows/hardware/hh967717(v=vs.85).aspx"&gt;Supporting D3cold in a Driver.&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;What does D3cold mean for USB devices?&lt;/h3&gt;
&lt;p&gt;The deepest sleep state for a USB device defined in the USB specification is &lt;a href="http://blogs.msdn.com/b/usbcoreblog/archive/2011/05/11/demystifying-usb-selective-suspend.aspx"&gt;selective suspend&lt;/a&gt;. Whenever the power policy owner (often the function driver for the device) requests a D0-&amp;gt;D2 or D0-&amp;gt;D3 transition, the Microsoft-provided USB driver stack sends the device to the selective suspended state. In that state, the device consumes power in the range of few milliwatts. For traditional PC platforms, that power consumption is insignificant compared to the total system power consumption while the system is in S0. Therefore sending devices to selective suspend to conserve power has traditionally been good enough.&lt;/p&gt;
&lt;p&gt;However, for newer platforms that support &lt;a href="http://channel9.msdn.com/events/BUILD/BUILD2011/HW-456T"&gt;connected standby&lt;/a&gt;, the overall system power consumption in S0 can be extremely low. For such a system, even the few milliwatts that a USB device consumes while in selective suspend, starts to matter. With the goal of optimizing power for the new systems, we have defined D3cold for internal USB devices. In that state, the system cuts power to the device, the device drops off the bus, and the device does not consume &lt;em&gt;any&lt;/em&gt; power.&lt;/p&gt;
&lt;h3&gt;Behavior of the USB driver stack for supporting D3cold&lt;/h3&gt;
&lt;p&gt;Typically a device drops off the bus when the user surprise-removes (unplugs) the device. When a device is surprise removed, the USB stack detects the removal and reports it to PnP manager as removed, so the device stack can be torn down.&lt;/p&gt;
&lt;p&gt;When a device enters D3cold, the hardware state is very similar to the surprise removal state but USB driver stack behaves differently. For D3cold, the driver stack does &lt;em&gt;not&lt;/em&gt; report the device as removed and the device stack remains just the same. Later, when the device exits D3cold, the driver stack restores the USB configuration for the device. In Windows 8, only the USB 3.0 driver stack restores configuration but not the USB 2.0 driver stack. Therefore D3cold is not supported by the USB 2.0 driver stack. For information about USB 2.0 and USB 3.0 driver stacks, see &lt;a href="http://msdn.microsoft.com/en-us/library/windows/hardware/hh406256(v=vs.85).aspx"&gt;USB Driver Stack Architecture&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Supporting D3cold in ACPI firmware&lt;/h3&gt;
&lt;p&gt;In order for power to be cut in D3cold the ACPI firmware should describe power resources appropriately. More information about how to enable D3cold in ACPI, refer to the &lt;a href="http://www.acpi.info/spec.htm"&gt;ACPI specification&lt;/a&gt;. In particular, see the _PR3 method.&lt;/p&gt;
&lt;p&gt;The USB driver stack only supports D3cold for internal devices. That is because there is no way for the driver stack to distinguish between a device that is in D3cold and another device that has been surprise-removed by the user. Because internal devices cannot be surprise-removed, it is safe for the driver stack to assume that the device is in D3cold state. Therefore, the USB driver stack&amp;nbsp;enables D3cold only for those USB devices that are marked as non-removable in ACPI.&lt;/p&gt;
&lt;h3&gt;Expected behavior of a function driver for supporting D3Cold&lt;/h3&gt;
&lt;p&gt;In D3cold, a USB device drops off the bus. Because of that behavior, the USB stack needs to do some extra work to ensure that the process of the device entering and exiting D3cold remains transparent to the end user and applications.&lt;/p&gt;
&lt;p&gt;To support D3cold, the function driver must implement these functionalities:&lt;/p&gt;
&lt;h5&gt;Enabling D3cold support&lt;/h5&gt;
&lt;p&gt;To support D3cold, the function driver must explicitly enable the state. The driver can do that either by using the &lt;a href="http://msdn.microsoft.com/en-us/library/windows/hardware/hh967707(v=vs.85).aspx"&gt;D3cold interface&lt;/a&gt; or by modifying the &lt;strong&gt;DDInstall.HW&lt;/strong&gt; section of the device INF. For information about those modifications, see &lt;a href="http://msdn.microsoft.com/en-us/library/windows/hardware/hh967716(v=vs.85).aspx"&gt;the Remarks section in this topic&lt;/a&gt;.&lt;/p&gt;
&lt;h5&gt;Sending D3cold request&lt;/h5&gt;
&lt;p&gt;To send the device to D3cold, the function driver must use D3 as the target device power state with IRP_MN_SET_POWER. Traditionally, if the driver uses the &lt;a href="http://msdn.microsoft.com/en-us/library/windows/hardware/ff537270(v=vs.85).aspx"&gt;idle IRP mechanism&lt;/a&gt; with D3, USB driver stack fails the idle IRP on receiving the power IRP with D3. To avoid that behavior, the driver must set a new registry entry in the hardware key for the device:&lt;/p&gt;
&lt;p&gt;Path: &lt;strong&gt;HKLM\System\CCS\Enum&lt;em&gt;\&lt;/em&gt;&lt;/strong&gt;&lt;em&gt;&amp;lt;DeviceId&amp;gt;&lt;/em&gt;&lt;strong&gt;\&lt;/strong&gt;&lt;em&gt;&amp;lt;InstanceID&amp;gt;&lt;/em&gt;&lt;strong&gt;\Device Parameters&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Name: &lt;strong&gt;AllowIdleIrpInD3&lt;/strong&gt; &lt;br /&gt; Type: &lt;strong&gt;REG_DWORD&lt;/strong&gt; &lt;br /&gt; Value: &lt;strong&gt;1&lt;/strong&gt;&lt;/p&gt;
&lt;h5&gt;Saving device state information&lt;/h5&gt;
&lt;p&gt;Then there is the question of the device losing its internal device state (such as information about the USB configuration) in D3cold. Even though the USB driver stack (only the USB 3.0 driver stack) restores the configuration state of the device, there might be additional device or class-specific state settings that get lost in D3cold. If there is any such setting, the function driver is responsible for preserving that state information. That implementation is similar to the driver&amp;rsquo;s functionality when the device resumes from a system sleep transition.&lt;/p&gt;
&lt;p&gt;The function driver does not know exactly when the device transitions from D3 to D3cold. Therefore the driver must be prepared to save state information before it sends the D3 IRP. D3cold interface provides query functions that can help the driver optimize that behavior. By calling &lt;a href="http://msdn.microsoft.com/en-us/library/windows/hardware/hh967711(v=vs.85).aspx"&gt;&lt;em&gt;GetD3ColdCapability&lt;/em&gt;&lt;/a&gt;, the driver can determine whether its device can enter D3cold. By calling &lt;a href="http://msdn.microsoft.com/en-us/library/windows/hardware/hh967713(v=vs.85).aspx"&gt;&lt;em&gt;GetLastTransitionStatus&lt;/em&gt;&lt;/a&gt;, the driver determines whether the device successfully entered D3cold.&lt;/p&gt;
&lt;h5&gt;Detecting surprise power on&lt;/h5&gt;
&lt;p&gt;Though this is not unique to USB, it&amp;rsquo;s worth calling out that the function driver should be registered with the &lt;a href="http://msdn.microsoft.com/en-us/library/windows/hardware/hh450958(v=vs.85).aspx"&gt;power framework&lt;/a&gt; so that the function driver can bring back the device to D0 in the case of &lt;a href="http://msdn.microsoft.com/en-us/library/windows/hardware/hh967718(v=vs.85).aspx"&gt;surprise power on&lt;/a&gt;. If the driver chooses not to register with the power framework, then D3Cold can only be enabled in the case where the device does not share a power rail with any other device.&lt;/p&gt;
&lt;h4&gt;Latency in resuming from D3 cold&lt;/h4&gt;
&lt;p&gt;For a USB device to support D3cold, it should be able to connect to the USB bus within 1 second of being powered on. This is because after the function driver initiates a resume from D3cold state, power is restored to the device and then USB driver stack waits for the device to re-appear on the bus so that the stack can enumerate the device. If the device takes longer than 1 second, the driver stack does not wait for the device and reports the device as missing (removed).&lt;/p&gt;
&lt;h4&gt;Wait-wake IRP support with D3cold&lt;/h4&gt;
&lt;p&gt;Because the USB device is not attached to the bus in D3cold, there is no in-band support for wake from D3cold. Therefore, D3cold should be enabled only for those scenarios that do not require device-initiated wake. In fact the USB driver stack does not allow a wait-wake IRP in conjunction with a D3 IRP. If the function driver sends a wait-wake IRP followed by a D3 IRP, the driver stack fails the wait-wake IRP.&lt;/p&gt;
&lt;p&gt;However, on some system configurations, there might be a mechanism to perform out-of-band wake from D3 cold with the help of ACPI. For example, there might be a dedicated GPIO line for that purpose. If appropriate methods are defined in the ACPI, ACPI filter driver pends the wait-wake IRP and completes it only when the out-of-band wake event occurs. In that case, the USB driver stack never gets the wait-wake IRP; therefore it&amp;rsquo;s ok for the function driver to send a wait-wake IRP with the D3 IRP. However, because ACPI always keeps the wait-wake IRP pending, the driver stack does not arm the device for in-band wake, even when the device transitions to D3hot. Therefore, if the device requires USB wake from D3hot, the device must use the same out-of-band mechanism to enable the device for wake and then propagate the device wake event.&lt;/p&gt;
&lt;h4&gt;D3cold for composite devices&lt;/h4&gt;
&lt;p&gt;A composite device has multiple functions, each managed by its own function driver. The following guidelines apply for such devices as long as the parent driver for the entire device is the Microsoft-provided &lt;a href="http://msdn.microsoft.com/en-us/library/windows/hardware/ff539234(v=vs.85).aspx"&gt;USB Generic Parent Driver (Usbccgp.sys)&lt;/a&gt;. In order to support D3cold on a composite device,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Function driver for each of the functions must enable D3cold.&lt;/li&gt;
&lt;li&gt;The ACPI firmware must report the device as D3cold-capable.&lt;/li&gt;
&lt;li&gt;Device should be on a dedicated power rail.&lt;/li&gt;
&lt;li&gt;Device must not be a SuperSpeed device. This restriction is primarily&amp;nbsp; because USBCCGP driver on Windows 8 hasn&amp;rsquo;t been enlightened to handle &amp;ldquo;surprise power-on&amp;rdquo; for composite SuperSpeed devices.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Summary&lt;/h4&gt;
&lt;p&gt;To summarize, in addition to the requirements listed in the MSDN documentation, D3cold for a USB device can be enabled only on Windows 8 if the following restrictions are met.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The devices must be connected downstream of an xHCI controller and should be marked internal in ACPI.&lt;/li&gt;
&lt;li&gt;Power resources described in ACPI must indicate that the power should be cut from the device when it enters D3.&lt;/li&gt;
&lt;li&gt;The device must be able to connect to the bus within 1 second after it is powered on.&lt;/li&gt;
&lt;li&gt;If the device is composite, it must be on a dedicated power rail and it must not be a SuperSpeed device. Each function driver should opt into D3cold.&lt;/li&gt;
&lt;li&gt;The function driver must enable D3cold for only those scenarios that do not require device-initiated wake. If the device does require wake, the system should implement an out-of-band wake for both D3hot and D3cold.&lt;/li&gt;
&lt;li&gt;The function driver must be responsible for handling loss of state information and must be able to deal with loss of non-USB state while resuming from low power state.&lt;/li&gt;
&lt;li&gt;The function driver must register with the power framework. Otherwise, the device must be on a dedicated power rail.&lt;/li&gt;
&lt;li&gt;If the device driver uses the idle IRP mechanism, it must set the AllowIdleIrpInD3 registry entry.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you are a device manufacturer, read the restriction described in this post and decide if it is possible to enable D3cold for your device. Improper implementation of D3cold for the device can lead to poor user experience.&lt;/p&gt;
&lt;hr align="left" size="1" width="33%" /&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10395021" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/usbcoreblog/archive/tags/usb3/">usb3</category></item><item><title>How to install WinUSB.sys without a custom INF?</title><link>http://blogs.msdn.com/b/usbcoreblog/archive/2012/09/26/how-to-install-winusb-sys-without-a-custom-inf.aspx</link><pubDate>Wed, 26 Sep 2012 22:16:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10353588</guid><dc:creator>USB Blog</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/usbcoreblog/rsscomments.aspx?WeblogPostID=10353588</wfw:commentRss><comments>http://blogs.msdn.com/b/usbcoreblog/archive/2012/09/26/how-to-install-winusb-sys-without-a-custom-inf.aspx#comments</comments><description>&lt;p&gt;Authored by Eliyas Yakub [MSFT] and Qiang Qiu [MSFT]&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/hardware/ff540196(v=vs.85).aspx"&gt;WinUSB&lt;/a&gt; is a Microsoft-provided kernel-mode client driver for USB devices. If you are developing a USB device for which Windows doesn&amp;rsquo;t include an in-box class driver, you can use Winusb.sys as the device driver instead of writing your own driver. In this blog, we&amp;rsquo;ll explain how you can build your device so that the Winusb.sys gets installed automatically on Windows 8 and earlier versions of the operating system.&lt;/p&gt;
&lt;p&gt;Prior to Windows 8 if you choose Winusb.sys as the function driver for your device, you have to write a custom INF (see &lt;a href="http://msdn.microsoft.com/en-us/library/windows/hardware/ff540283(v=vs.85).aspx#inf"&gt;Writing an .Inf File for WinUSB Installation&lt;/a&gt;, and then install the driver on the target machine. The custom INF must specify your device specific hardware ID and also include sections from the inbox Winusb.inf. Those sections are required for instantiating the service, copying inbox binaries, and registering DeviceInterfaceGUID that is required by applications to find the device and talk to it.&lt;/p&gt;
&lt;p&gt;In Windows 8, the in-box Winusb.inf file has been updated. The INF includes an install section that references a compatible ID called USB\MS_COMP_WINUSB. It also includes a newly defined setup class called &amp;ldquo;USBDevice&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;The compatible ID and USBDevice definitions are shown here:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;[Version] &lt;br /&gt; Class=USBDevice &lt;br /&gt;ClassGuid={88BAE032-5A81-49f0-BC3D-A4FF138216D6}&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;[Generic.Section.NTamd64] &lt;br /&gt; %USB\MS_COMP_WINUSB.DeviceDesc%=WINUSB,USB\MS_COMP_WINUSB &lt;br /&gt;&amp;nbsp;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In order to match the compatible ID, the device must provide the ID by using &lt;a href="http://msdn.microsoft.com/en-us/library/windows/hardware/gg463179.aspx"&gt;Microsoft OS Descriptors&lt;/a&gt;. By building a device that reports the &lt;em&gt;MS_COMP_WINUSB&lt;/em&gt; compatible ID, you can avoid writing a custom INF. The ability to provide compatible IDs through Microsoft OS descriptors has existed for several OS releases and has been widely used by other classes of devices, such as MTP, RNDIS, and Bluetooth.&lt;/p&gt;
&lt;p&gt;The new USBDevice class is used for USB devices that do not conform to a USB-specific class specification. We will talk about need for defining this new USBDevice class later in this document.&lt;/p&gt;
&lt;p&gt;Here are the steps for installing your device automatically using WinUSB.INF:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The device must provide a compatible-ID using the extended &lt;i&gt;MS OS feature descriptor&lt;/i&gt; as described in &lt;a href="http://technet.microsoft.com/en-us/library/hh450799(v=vs.85).aspx#required__microsoft_os_descriptors_in_firmware"&gt;WinUSB Device&lt;/a&gt;. This is sufficient to match the in-box Winusb.inf and load the WinUSB driver module.&lt;/li&gt;
&lt;li&gt;However, to find the device from your application, configure the device, and perform I/O operations, you need to register its DeviceInterfaceGUID. In previous versions of Windows, that registration was done through the custom INF. Starting in Windows 8, your device should report the interface GUID by using &lt;i&gt;extended properties OS feature descriptor&lt;/i&gt; as described in the &lt;a href="http://technet.microsoft.com/en-us/library/hh450799(v=vs.85).aspx#required__microsoft_os_descriptors_in_firmware"&gt;WinUSB Device&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;There are several device registry settings, that control the behavior of WinUSB, such as selective suspend, power policy ownership, idle timeout, wake settings. Those properties can also be provided by including one or more extended properties feature descriptors on the device.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;WinUSB compatible ID support on earlier versions of Windows&lt;/h3&gt;
&lt;p&gt;As stated earlier, the ability to provide compatible and sub-compatible IDs through Microsoft OS Descriptors has existed since Windows XP SP3, and has been widely used by other classes of devices such as MTP, RNDIS, and Bluetooth. To enable the use of compatible ID for WinUSB devices, a new certified INF is now available on Windows update for down-level operating systems. If your computer is configured to get driver update automatically, the WinUSB driver will get installed without any user intervention by using the new INF package.&lt;/p&gt;
&lt;p&gt;For some reason, if you have to provide an INF then there is no point in building your device with compatible-ID because you cannot certify the INF with a compatible-ID match. You must use device specific hardware-ID in your INF.&lt;/p&gt;
&lt;h3&gt;USBDevice Class&lt;/h3&gt;
&lt;p&gt;For years, development community has misused the &amp;ldquo;USB&amp;rdquo; setup class by using it for their unclassified devices instead of defining a custom class. The USB controller class is strictly used for installing controllers, hubs, and composite devices. For instance, if you use &amp;ldquo;USB&amp;rdquo; class for a class filter driver for a device, the filter gets applied to other USB stack drivers which are also part of that class. Misusing the &amp;ldquo;USB&amp;rdquo; class has led to reliability and performance issues.&lt;/p&gt;
&lt;p&gt;To prevent that scenario, we have defined a new class, &amp;ldquo;USBDevice&amp;rdquo; for devices that do not belong to any other class.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Class=USBDevice &lt;br /&gt;ClassGuid={88BAE032-5A81-49f0-BC3D-A4FF138216D6}&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;When a device is installed by using WinUSB.INF on Windows 8, it automatically installs the device under the &amp;ldquo;USBDevice&amp;rdquo; class. This class is system-defined on Windows 8. On down-level OS versions, this class is defined by the new INF available through Windows Update. Note that this class is not limited to WinUSB. If you have a custom driver for your device, you can use the &amp;ldquo;USBDevice&amp;rdquo; setup class in the INF.&lt;/p&gt;
&lt;p&gt;For some reason, if you have to install the device under a custom class then you do need to write your own INF. If you do write your INF then there is no point in building the device to report compatible-ID because you cannot certify your INF with a compatible-ID match. You have to use most device specific hardware-ID in your INF.&lt;/p&gt;
&lt;h3&gt;Showing a meaningful device description in Device Manager&lt;/h3&gt;
&lt;p&gt;Typically the description of the device that is shown in Device Manager is derived from the INF file. One drawback of using a generic in-box INF to install the driver is that all devices installed through that INF get the same device description, which is "WinUsb Device". This is not ideal.&lt;/p&gt;
&lt;p&gt;To uniquely identify and differentiate the device in Device Manager, Windows 8 provides a new property on a device class that instructs the system to give precedence to the device description reported by the device (iProduct string descriptor) over the description that comes from the INF. The USBDevice class defined in Windows 8 has this property. In other words, when a device is installed under USBDevice class, system queries the device for a device description and sets the Device Manager string to whatever is retrieved in the query. The device description provided in the INF is ignored.&lt;/p&gt;
&lt;p&gt;The new class property is not supported on earlier versions of Windows. So if you really care about having a customized description for your device on earlier version of Windows, you have to write your own custom INF.&lt;/p&gt;
&lt;p&gt;In the Device Manager images shown in this blog post, notice the device description strings: &amp;ldquo;MUTT&amp;rdquo;, &amp;ldquo;FX3&amp;rdquo;, and &amp;ldquo;SuperMUTT&amp;rdquo;. Those strings are provided by the USB device in its product string descriptor.&lt;/p&gt;
&lt;h3&gt;Examples&lt;/h3&gt;
&lt;p&gt;We built couple of test devices using &lt;a href="http://blogs.msdn.com/b/usbcoreblog/archive/2012/08/08/mutt-software-package-is-now-available.aspx"&gt;MUTT&lt;/a&gt; to demonstrate how this feature works. We have below snapshots of device manager and registry settings to show what the compat-id and device description looks.&lt;/p&gt;
&lt;h3&gt;Example 1: Single Interface Device&lt;/h3&gt;
&lt;p&gt;&lt;a name="_Example_1:_A"&gt;&lt;/a&gt;This picture is for a single interface MUTT device that provides &amp;ldquo;WINUSB&amp;rdquo; as the compatibleID and as a result Winusb.sys gets loaded as the function driver for the device.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62-metablogapi/4606.clip_5F00_image002_5F00_4DAE9D3B.jpg"&gt;&lt;img width="244" height="178" title="clip_image002" style="display: inline; background-image: none;" alt="clip_image002" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62-metablogapi/5367.clip_5F00_image002_5F00_thumb_5F00_6D5D7703.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Example 2: Composite Device&lt;/h3&gt;
&lt;p&gt;&lt;a name="_Custom_property_section"&gt;&lt;/a&gt;&lt;a name="_Example_2:_USB"&gt;&lt;/a&gt;This image shows how a composite device appears that provides WINUSB compatible-ID for each of the functions in Device Manager.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62-metablogapi/8004.clip_5F00_image004_5F00_4D426A46.jpg"&gt;&lt;img width="244" height="184" title="clip_image004" style="display: inline; background-image: none;" alt="clip_image004" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62-metablogapi/5850.clip_5F00_image004_5F00_thumb_5F00_3131AB5B.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62-metablogapi/4382.clip_5F00_image0026_5F00_550D8511.jpg"&gt;&lt;img width="244" height="178" title="clip_image002[6]" style="display: inline; background-image: none;" alt="clip_image002[6]" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62-metablogapi/2248.clip_5F00_image0026_5F00_thumb_5F00_66EA18DE.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;a name="_Example_3:_USB"&gt;&lt;/a&gt;Example 3: Providing selective suspend and system wake settings&lt;/h3&gt;
&lt;p&gt;Until now, in order to configure power management features of WinUSB, you had to write registry entry values in the HW.AddReg section of your custom INF. The details can be found in &lt;a href="http://msdn.microsoft.com/en-us/library/windows/hardware/ff728834(v=vs.85).aspx"&gt;WinUSB Power Management&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Now you can configure the behavior of Winusb.sys through the device itself. You can report registry values through the extended properties OS feature descriptor that enable or disable features in WinUSB for that device. In this example, we updated the single interface MUTT device to configure &lt;i&gt;selective suspend&lt;/i&gt; and &lt;em&gt;system wake&lt;/em&gt; capabilities of the device&lt;em&gt;..&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Selective suspend allows the device to enter low-power state when it is idle. System wake refers to the ability to a device to wake up a system when the system is in low-power state.&lt;/p&gt;
&lt;p&gt;For selective suspend and system wake, these registry entries are required.&lt;/p&gt;
&lt;table border="0" cellspacing="0" cellpadding="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="27%" valign="top"&gt;
&lt;p&gt;Registry Key&lt;/p&gt;
&lt;/td&gt;
&lt;td width="72%" valign="top"&gt;
&lt;p&gt;Description&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="27%" valign="top"&gt;
&lt;p&gt;DeviceIdleEnabled&lt;/p&gt;
&lt;/td&gt;
&lt;td width="72%" valign="top"&gt;
&lt;p&gt;This value is set to 1 to indicate that the device can power down when idle (selective suspend).&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="27%" valign="top"&gt;
&lt;p&gt;DefaultIdleState&lt;/p&gt;
&lt;/td&gt;
&lt;td width="72%" valign="top"&gt;
&lt;p&gt;This value is set to 1 to indicate that the device can be suspended when idle by default.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="27%" valign="top"&gt;
&lt;p&gt;DefaultIdleTimeout&lt;/p&gt;
&lt;/td&gt;
&lt;td width="72%" valign="top"&gt;
&lt;p&gt;This value is set to 5000 in milliseconds to indicate the amount of time in milliseconds to wait before determining that a device is idle.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="27%" valign="top"&gt;
&lt;p&gt;UserSetDeviceIdleEnabled&lt;/p&gt;
&lt;/td&gt;
&lt;td width="72%" valign="top"&gt;
&lt;p&gt;This value is set to 1 to allow the user to control the ability of the device to enable or disable USB selective suspend. A check box &lt;b&gt;Allow the computer to turn off this device to save power&lt;/b&gt; on the device &lt;b&gt;Power Management&lt;/b&gt; property page and the user can check or uncheck the box to enable or disable USB selective suspend.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="27%" valign="top"&gt;
&lt;p&gt;SystemWakeEnabled&lt;/p&gt;
&lt;/td&gt;
&lt;td width="72%" valign="top"&gt;
&lt;p&gt;This value is set to 1 to allow the user to control the ability of the device to wake the system from a low-power state. A check box &lt;b&gt;Allow this device to wake the computer&lt;/b&gt; shows up in the device power management property page and the user can check or uncheck the box to enable or disable USB system wake.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;After the device is enumerated and initialized, these registry entries get written under the Device Parameters section of the hardware key. The picture below shows the registry entries for the customer properties that are reported by the device using extended properties OS feature descriptor.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62-metablogapi/3716.clip_5F00_image006_5F00_11169E9E.jpg"&gt;&lt;img width="244" height="78" title="clip_image006" style="display: inline; background-image: none;" alt="clip_image006" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62-metablogapi/1663.clip_5F00_image006_5F00_thumb_5F00_70FB91E0.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This image shows device&amp;rsquo;s &lt;b&gt;Power Management Properties&lt;/b&gt; page:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62-metablogapi/0167.clip_5F00_image008_5F00_50E08523.jpg"&gt;&lt;img width="219" height="244" title="clip_image008" style="display: inline; background-image: none;" alt="clip_image008" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62-metablogapi/1638.clip_5F00_image008_5F00_thumb_5F00_45B6FAD9.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;&lt;a name="_WinUSB_compatible_ID"&gt;&lt;/a&gt;Summary&lt;/h3&gt;
&lt;p&gt;We explored in this article how you can build a device by using Microsoft OS descriptors to provide compatible ID and configuration information so that Winusb.sys is installed automatically as a function driver. This feature is available on Windows 8 and earlier versions up to Windows XP SP3. We hope that by reading this post you will understand best practices for using the new USBDevice class.&lt;/p&gt;
&lt;p&gt;-Eliyas Yakub and Qiang Qiu&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10353588" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/usbcoreblog/archive/tags/Windows+7/">Windows 7</category><category domain="http://blogs.msdn.com/b/usbcoreblog/archive/tags/Power/">Power</category><category domain="http://blogs.msdn.com/b/usbcoreblog/archive/tags/Windows+8/">Windows 8</category></item><item><title>MUTT Software Package is now available</title><link>http://blogs.msdn.com/b/usbcoreblog/archive/2012/08/08/mutt-software-package-is-now-available.aspx</link><pubDate>Wed, 08 Aug 2012 19:35:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10338004</guid><dc:creator>USB Blog</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/usbcoreblog/rsscomments.aspx?WeblogPostID=10338004</wfw:commentRss><comments>http://blogs.msdn.com/b/usbcoreblog/archive/2012/08/08/mutt-software-package-is-now-available.aspx#comments</comments><description>&lt;p&gt;The Microsoft USB Test Tool (MUTT) software package contains test tools for hardware test engineers to test interoperability of their USB controller or hub with the &lt;a title="Microsoft USB driver stack" href="http://msdn.microsoft.com/en-us/library/windows/hardware/hh406256(v=VS.85).aspx"&gt;Microsoft USB driver stack&lt;/a&gt;. The package contains two downloads: the tools package and a readme document.&lt;/p&gt;
&lt;p&gt;The tools package contains several tools that perform stress and transfer tests (including power transitions) and SuperSpeed tests. The package also contains the USB Hardware Verifier tool (see this &lt;a title="USB Hardware Verifier tool" href="http://blogs.msdn.com/b/usbcoreblog/archive/2012/07/13/common-issues-in-usb-3-0-devices.aspx"&gt;blog post&lt;/a&gt;). The document gives you a brief overview of the types of MUTT hardware, provides step-by-step guidance about various tests you should run, and suggests topologies for controller, hub, device, and BIOS/UEFI testing.&amp;nbsp;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/hardware/jj590752"&gt;Download the tools package and documentation&lt;/a&gt; from MSDN.&lt;/p&gt;
&lt;p&gt;-USB Core Team [MSFT]&lt;/p&gt;
&lt;p&gt;-----&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Selected version history:&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;/em&gt;2012/08/08: Initial post&lt;/p&gt;
&lt;p&gt;2012/10/18: Version 1.8 published&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10338004" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/usbcoreblog/archive/tags/etw/">etw</category><category domain="http://blogs.msdn.com/b/usbcoreblog/archive/tags/Windows+8/">Windows 8</category><category domain="http://blogs.msdn.com/b/usbcoreblog/archive/tags/usb3/">usb3</category></item><item><title>How to Capture and Read USB ETW Traces in Windows 8</title><link>http://blogs.msdn.com/b/usbcoreblog/archive/2012/08/07/how-to-trace-usb-3-activity.aspx</link><pubDate>Tue, 07 Aug 2012 16:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10333151</guid><dc:creator>USB Blog</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/usbcoreblog/rsscomments.aspx?WeblogPostID=10333151</wfw:commentRss><comments>http://blogs.msdn.com/b/usbcoreblog/archive/2012/08/07/how-to-trace-usb-3-activity.aspx#comments</comments><description>&lt;p&gt;&lt;span style="font-family: Arial;"&gt;Authored by Philip Ries [MSFT]&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Windows 8 provides a USB driver stack to support USB 3.0 devices. The Microsoft-provided USB 3.0 driver stack consists of three drivers: Usbxhci.sys, Ucx01000.sys, and Usbhub3.sys. All three drivers work together to add native support to Windows for most USB 3.0 host controllers. The new driver stack supports SuperSpeed, high-speed, full-speed, and low-speed devices.&lt;/p&gt;
&lt;p&gt;The USB 2.0 driver stack is supported on Windows 8. For tracing purposes, the USB 2.0 driver stack consists of: Usbport.sys, Usbhub.sys.&lt;/p&gt;
&lt;p&gt;Through event traces, the USB 3.0 driver stack provides a view into the fine-grained activity of the host controller and all devices connected to it. In this blog post, I will show you how to capture USB ETW event traces and get you started with the parser. I&amp;rsquo;ll also discuss some new parser features and filters and briefly explain how to use capture filters to narrow down the event traces for a specific scenario.&lt;/p&gt;
&lt;div style="padding: 3pt 8pt; border: 1pt solid windowtext; font-family: arial; margin-right: 18pt; margin-left: 58pt;"&gt;
&lt;p&gt;Event traces from the USB 3.0 driver stack are similar to the &lt;a href="http://blogs.msdn.com/b/usbcoreblog/archive/2009/12/04/etw-in-the-windows-7-usb-core-stack.aspx"&gt;USB 2.0 driver stack traces&lt;/a&gt;, which were introduced in Windows 7. Event traces from the USB 2.0 driver stack can be captured on a Windows 8 computer, too. The way you capture event traces from USB 2.0 and USB 3.0 driver stacks is similar. You can capture events from the USB 2.0 or USB 3.0 driver stack independently.&lt;/p&gt;
&lt;p&gt;When you connect a USB 2.0 device to a USB 3.0 host controller, you get event traces from the USB 3.0 driver stack. This behavior can be confusing because you will view new USB 3.0 driver stack events for a USB 2.0 device.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;I recommend that you&lt;strong&gt; &lt;/strong&gt;always capture event traces from both USB 2.0 and 3.0 driver stacks in Windows 8. That way, you don&amp;rsquo;t have to figure out the type of host controller to which the device is connected, before capturing event traces.&lt;/p&gt;
&lt;h1&gt;Capturing USB event traces&lt;/h1&gt;
&lt;p&gt;You can capture USB event traces without installing any software.&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Open an elevated command prompt window&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;One way is to type "command prompt" on the Start screen. Right-click on the &lt;strong&gt;Command Prompt &lt;/strong&gt;shown in the result, and select &lt;strong&gt;Run as administrator&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol start="2"&gt;
&lt;li&gt;Disconnect the USB devices that you are not interested in. Fewer devices result in smaller traces making it easier to read and analyze.&lt;/li&gt;
&lt;/ol&gt;&lt;ol start="3"&gt;
&lt;li&gt;Start a capture session by pasting this sequence of commands:&lt;/li&gt;
&lt;/ol&gt;
&lt;div style="font-family: Consolas,Courier,monospace; font-size: 9pt; padding: 0px; margin: 0px; margin-left: 40px; background-color: #c0c0c0;"&gt;
&lt;pre style="white-space: pre-wrap;"&gt;logman create trace -n usbtrace -o %SystemRoot%\Tracing\usbtrace.etl -nb 128 640 -bs 128
logman update trace -n usbtrace -p Microsoft-Windows-USB-USBXHCI (Default,PartialDataBusTrace)
logman update trace -n usbtrace -p Microsoft-Windows-USB-UCX (Default,PartialDataBusTrace)
logman update trace -n usbtrace -p Microsoft-Windows-USB-USBHUB3 (Default,PartialDataBusTrace)
logman update trace -n usbtrace -p Microsoft-Windows-USB-USBPORT
logman update trace -n usbtrace -p Microsoft-Windows-USB-USBHUB
logman update trace -n usbtrace -p Microsoft-Windows-Kernel-IoTrace 0 2
logman start -n usbtrace
&lt;/pre&gt;
&lt;/div&gt;
&lt;ol start="4"&gt;
&lt;li&gt;Perform the action that you want to capture. For example, plug in a USB flash drive that shows up as an Unknown device in Device Manager. The session captures &lt;a href="http://blogs.msdn.com/b/usbcoreblog/archive/2010/09/11/9915562.aspx"&gt;device enumeration activities&lt;/a&gt;. Keep the command prompt window open.&lt;/li&gt;
&lt;li&gt;Stop the session when you're finished by pasting this sequence of commands:&lt;/li&gt;
&lt;/ol&gt;
&lt;div style="font-family: Consolas,Courier,monospace; font-size: 9pt; padding: 0px; margin: 0px; margin-left: 40px; background-color: #c0c0c0;"&gt;
&lt;pre style="white-space: pre-wrap;"&gt;logman stop -n usbtrace 
logman delete -n usbtrace
move /Y %SystemRoot%\Tracing\usbtrace_000001.etl %SystemRoot%\Tracing\usbtrace.etl
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;The preceding capture session generates an etl file, named usbtrace.etl. The trace file is stored at %SystemRoot%\Tracing\usbtrace.etl (C:\Windows\Tracing\usbtrace.etl). Move the file to another location or rename it in order to avoid overwriting it when you capture the next session.&lt;/p&gt;
&amp;nbsp;&amp;nbsp;
&lt;div style="padding: 3pt 8pt; border: 1pt solid windowtext; font-family: arial; margin-right: 18pt; margin-left: 58pt;"&gt;
&lt;p&gt;The file contains event traces from the USB 3.0 and USB 2.0 driver stacks. If you want to pare down the trace to just one USB driver stack, remove the other driver stack from your next trace session. You can do so by modifying the command sequence shown in step 3 to remove the "logman update" lines corresponding to the driver stack you want to remove from the trace session. You can find the driver names comprising each driver stack at the beginning of this post.&lt;/p&gt;
&lt;/div&gt;
&lt;h1&gt;USB ETW Parsers&lt;/h1&gt;
&lt;p&gt;You can view USB ETW event traces using Microsoft Network Monitor, also referred to as Netmon. Netmon won&amp;rsquo;t parse the trace out of the box; it also requires USB ETW parsers, which are text files written in Network Monitor Parser Language (NPL) that describe the structure of USB ETW event traces and define USB-specific columns and filters that the user can use. These parsers make Netmon the best tool for analyzing USB ETW traces.&lt;/p&gt;
&lt;p&gt;This blog post is being released ahead of an easier, Web-based way to get the parsers. For the time being only, parsing the trace additionally requires the Windows Driver Kit (WDK). This blog post will be updated when we have an easier solution for you. We anticipate changing only steps 3-5.&lt;/p&gt;
&lt;p&gt;USB ETW parser setup requires Windows 7 or a later version of Windows. You can read a trace file on a Windows 7 computer even when the file contains event traces captured on a Windows 8 computer.&lt;/p&gt;
&lt;p&gt;To install USB ETW parsers:&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Determine whether you have 32-bit Windows or 64-bit Windows:
&lt;ul&gt;
&lt;li&gt;Open the Start Menu.&lt;/li&gt;
&lt;li&gt;Right click &lt;strong&gt;Computer&lt;/strong&gt; and select &lt;strong&gt;Properties&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Look at the &lt;strong&gt;System type&lt;/strong&gt; field. (Note: 32-bit corresponds to &amp;ldquo;x86&amp;rdquo; for the downloads).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Install Netmon:&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Go to the bottom of the &lt;strong&gt;Quick details &lt;/strong&gt;on the &lt;a href="http://go.microsoft.com/fwlink/?LinkID=103158"&gt;Netmon 3.4 download page&lt;/a&gt; and press the &lt;strong&gt;Download&lt;/strong&gt; button for your system type.&lt;/li&gt;
&lt;li&gt;Download and run the exe. When it asks about setup type, Typical is fine.&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Download and install the &lt;a href="http://msdn.microsoft.com/en-us/windows/hardware/hh852362.aspx"&gt;Windows Driver Kit for Windows 8&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Allow execution of PowerShell scripts:&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Open the Start screen, type "powershell", right click on the &lt;strong&gt;Windows PowerShell &lt;/strong&gt;result, and select &lt;strong&gt;Run as administrator&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Type or paste the following command:&lt;/li&gt;
&lt;/ul&gt;
&lt;/ol&gt;
&lt;div style="font-family: Consolas,Courier,monospace; font-size: 9pt; padding: 0px; margin: 0px; margin-left: 40px; background-color: #c0c0c0;"&gt;
&lt;pre style="white-space: pre-wrap;"&gt;Set-ExecutionPolicy RemoteSigned -Force
&lt;/pre&gt;
&lt;/div&gt;
&lt;ol start="4"&gt;
&lt;li&gt;Close the PowerShell window&lt;/li&gt;
&lt;li&gt;Open a PowerShell window (you don't need to &lt;strong&gt;Run as administrator&lt;/strong&gt;) and run the following commands. Adjust the path if you installed the kit to a different location:&lt;/li&gt;
&lt;/ol&gt;
&lt;div style="font-family: Consolas,Courier,monospace; font-size: 9pt; padding: 0px; margin: 0px; margin-left: 40px; background-color: #c0c0c0;"&gt;
&lt;pre style="white-space: pre-wrap;"&gt;cd "C:\Program Files (x86)\Windows Kits\8.0\Tools\x86\Network Monitor Parsers\usb"
..\NplAutoProfile.ps1
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Now you're set up! You can now launch Netmon and open an .etl trace by selecting &lt;strong&gt;File&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Open&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Capture&lt;/strong&gt;.&lt;/p&gt;
&lt;h1&gt;What's New in USB ETW Parser for USB 3.0&lt;/h1&gt;
&lt;p&gt;Before you learn about the USB 3.0 features of the USB ETW parser, I recommend that you read &lt;a href="http://blogs.msdn.com/b/usbcoreblog/archive/2009/12/21/answering-the-question-what-s-wrong-with-my-device-using-usb-etw.aspx"&gt;my previous tutorial on reading USB 2.0 driver stack traces&lt;/a&gt;. That post describes techniques that apply to the new parser. In this post I'll point out the key additions to what you can do with the events from the USB 3.0 driver stack on Windows 8.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: The event trace is made up of individual events, each of which indicates something that happened in the driver stack. Each event conforms to one of several types defined by the driver stack. Important types of events from the USB 2.0 driver stack are also defined in the USB 3.0 driver stack. However, there are subtle differences between those types. As an example, let&amp;rsquo;s look at a USB control transfer completion event type.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p style="margin: 0 0 0 0;"&gt;USB 2.0 driver stack event type:&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;Description: USBPort:Complete URB_FUNCTION_CONTROL_TRANSFER_EX with Data&lt;/p&gt;
&lt;p&gt;Frame Details pane: Contains idVendor (also known as USB VID) and idProduct (also known as USB PID)&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;USB 3.0 driver stack event type:&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;Description: UsbUcx:Complete URB_FUNCTION_CONTROL_TRANSFER_EX with data&lt;/p&gt;
&lt;p&gt;Frame Details pane: Does not contain idVendor or idPid. Instead, you can add new columns to the Frame Summary pane&amp;mdash;see below.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;New columns&lt;/h4&gt;
&lt;p&gt;USB 3.0 driver stack traces provide useful device information in new columns that are not available for USB 2.0 driver stack traces, such as &lt;strong&gt;USB Device Description&lt;/strong&gt;, &lt;strong&gt;USB Vid&lt;/strong&gt;, and &lt;strong&gt;USB Pid&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Plus, all USB event traces, even traces from the USB 2.0 driver stack, now show more information about the request as each URB completes. Notice values, such as, "673280 of 1048576" under &lt;strong&gt;USB Length&lt;/strong&gt;. Those values indicate the actual transfer length of each URB on completion with the context of the total request length (original TransferBufferLength specified by the client driver). Also, you can see how long (in seconds) it took for a request to complete under the &lt;strong&gt;USB Request Duration&lt;/strong&gt; column.&lt;/p&gt;
&lt;p&gt;You can write new filters such as these for event traces from USB 2.0 and USB 3.0 driver stacks:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;USBIsError == 1 // Any error events from the USB drivers&lt;/p&gt;
&lt;p&gt;USBIsDisconnect == 1 // Show when any device disconnected&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;All columns can be filtered. Just right-click a cell and Netmon creates a filter based on its value and the column name.&lt;/p&gt;
&lt;h4&gt;Activity ID tracing&lt;/h4&gt;
&lt;p&gt;Drivers in the USB driver stack (both 2.0 and 3.0) act as ETW event trace providers. When you are capturing event traces on Windows 7 or later, you can capture traces from other providers, such as other drivers and applications alongside events from the USB driver stack. You can then read the combined log (assuming that you have created a Netmon parser for your provider's event traces).&lt;/p&gt;
&lt;p&gt;In traces captured on Windows 8, you can also associate events across providers (from applications, client driver, and the USB driver stack) by using &lt;em&gt;activity ID GUIDs&lt;/em&gt;. An application can include activity ID GUIDs by calling &lt;a href="http://msdn.microsoft.com/en-us/library/windows/hardware/ff545578%28v=vs.85%29.aspx"&gt;EtwActivityIdControl&lt;/a&gt; (EVENT_ACTIVITY_CTRL_SET_ID). A kernel-mode driver calls &lt;a href="http://msdn.microsoft.com/en-us/library/windows/hardware/hh439382%28v=vs.85%29.aspx"&gt;IoSetActivityIdIrp&lt;/a&gt;. Those calls tell the USB driver stack about the activity to which the requested work is related. Events from multiple providers can be associated in Netmon when the events have the same activity ID GUID. Based on those GUIDs, Netmon can show you the set of USB events that resulted from an instrumented activity at an upper layer.&lt;/p&gt;
&lt;p&gt;While viewing combined event traces from other providers in Netmon, right-click an event from an application and choose &lt;strong&gt;Find Conversations&lt;/strong&gt; -&amp;gt; &lt;strong&gt;NetEvent&lt;/strong&gt; to see associated driver events.&lt;/p&gt;
&lt;h4&gt;Keywords: Capture filters&lt;/h4&gt;
&lt;p&gt;By using &lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/dd996915%28v=vs.85%29.aspx"&gt;ETW keywords&lt;/a&gt;, you can customize how much information you want to view about events captured from the USB 3.0 driver stack. Notice ETW keywords such as &lt;strong&gt;Default&lt;/strong&gt; and &lt;strong&gt;PartialDataBusTrace&lt;/strong&gt; in the capture command line. Those words are ETW keywords that indicate the types of events you want to view. You can filter events based on keywords depending on your requirements. Events that match any of your keywords are saved.&lt;/p&gt;
&lt;p&gt;Note that this method of filtering is for use at capture time, not during analysis.&lt;/p&gt;
&lt;p&gt;Here are keywords for filtering USB 3.0 driver stack events:&lt;/p&gt;
&lt;div style="margin-left: 15px;"&gt;
&lt;p&gt;&lt;strong&gt;Default&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Shows events that are useful for general troubleshooting. The events are similar to USB 2.0 ETW events but do not include any USB transfer events.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;StateMachine&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Shows driver-internal state machine transitions. The events are not included in the &lt;strong&gt;Default&lt;/strong&gt; keyword.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rundown&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Shows device information events at the beginning of the trace and captures the starting state of the USB tree. The device information &lt;strong&gt;Rundown&lt;/strong&gt; events are important to save so that the trace contains details, such as the USB descriptors and USB Device Description, of connected devices. These events are included in the &lt;strong&gt;Default&lt;/strong&gt; keyword. When you don&amp;rsquo;t use the &lt;strong&gt;Default&lt;/strong&gt; keyword, you should use the &lt;strong&gt;Rundown&lt;/strong&gt; keyword. The remaining &lt;strong&gt;Rundown&lt;/strong&gt; events provide information on recent state transitions of the driver-internal state machines. These events are included in the &lt;strong&gt;StateMachine&lt;/strong&gt; keyword.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Power&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Shows a subset of &lt;strong&gt;Default&lt;/strong&gt; events. Shows device power transition events.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;IRP&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Shows a subset of &lt;strong&gt;Default&lt;/strong&gt; events. The events show IRPs from the client driver and IRPs resulting from user-mode requests. However, valid USB transfer (URB) requests are not shown with the IRP keyword, and require &lt;strong&gt;HeadersBusTrace, PartialDataBusTrace, or FullDataBusTrace&lt;/strong&gt; in order to be shown.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HeadersBusTrace&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Shows all USB transfer events but doesn't save data packets.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PartialDataBusTrace&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Shows all USB transfer events and saves a limited payload of bus data.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;FullDataBusTrace&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Shows all USB transfer events and saves up to 4 KB of bus data for bulk, interrupt, and control transfers. Note that only the first buffer of a &lt;a href="http://msdn.microsoft.com/en-us/library/windows/hardware/hh450848%28v=vs.85%29.aspx"&gt;chained MDL&lt;/a&gt; is logged. Isochronous bus data is never logged (though the &lt;a href="http://msdn.microsoft.com/en-us/library/windows/hardware/ff540414%28v=vs.85%29.aspx"&gt;URB_ISOCH_TRANSFER request structure&lt;/a&gt; is saved).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HWVerifyHost&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Shows a subset of &lt;strong&gt;Default&lt;/strong&gt; events. The events indicate when an error occurs in the USB host controller hardware.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HWVerifyHub&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Shows a subset of &lt;strong&gt;Default&lt;/strong&gt; events. The events indicate when an error occurs in the USB hub hardware.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HWVerifyDevice&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Shows a subset of &lt;strong&gt;Default&lt;/strong&gt; events. The events indicate when an error occurs in the USB device hardware.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;As an example, here is a sequence of commands that start a session to capture USB device power transitions. Due to the selection of providers (the USB 3.0 driver stack), events are captured only for devices that are connected downstream of a USB 3.0 host controller.&lt;/p&gt;
&lt;div style="font-family: Consolas,Courier,monospace; font-size: 9pt; padding: 0px; margin: 0px; margin-left: 40px; background-color: #c0c0c0;"&gt;
&lt;pre style="white-space: pre-wrap;"&gt;logman create trace -n usbtrace -o %SystemRoot%\Tracing\usbtrace.etl -nb 128 640 -bs 128
logman update trace -n usbtrace -p Microsoft-Windows-USB-USBXHCI (Rundown,Power)
logman update trace -n usbtrace -p Microsoft-Windows-USB-UCX (Rundown,Power)
logman update trace -n usbtrace -p Microsoft-Windows-USB-USBHUB3 (Rundown,Power)
logman update trace -n usbtrace -p Microsoft-Windows-Kernel-IoTrace 0 2
logman start -n usbtrace
&lt;/pre&gt;
&lt;/div&gt;
&lt;h4&gt;Example trace&lt;/h4&gt;
&lt;p&gt;In the final part of the following three-part video, from the 2011 BUILD conference, I demonstrate an end-to-end diagnosis using ETW traces from the USB 3.0 driver stack, plus how to read a combined trace with Activity IDs. Skip to 33:30 for this ETW content. Here is a &lt;a href="http://blogs.msdn.com/controlpanel/blogs/posteditor.aspx/channel9.msdn.com/Events/BUILD/BUILD2011/HW-258P"&gt;direct link&lt;/a&gt; if you have any problems.&lt;/p&gt;
&lt;p&gt;&lt;iframe style="height: 326px; width: 576px;" src="http://channel9.msdn.com/Events/BUILD/BUILD2011/HW-258P/player?w=576&amp;amp;h=326&amp;amp;autoplay=0" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;USB driver stack event traces in Windows are a powerful tool for diagnosis. We hope that you and the USB hardware ecosystem will benefit from these improvements in Windows 8.&lt;/p&gt;
&lt;h4&gt;Boot tracing (special tracing commands)&lt;/h4&gt;
&lt;p style="font-size: 9pt;"&gt;(added Feb. 8 2013)&lt;/p&gt;
&lt;p&gt;If you want to view USB event traces of the activity that takes place when the system boots, you need a different set of commands. This way of capturing traces can be useful if you encounter an issue that occurs only when the system boots, rather than while the system is running. Start the trace by entering the following commands in an elevated command window:&lt;/p&gt;
&lt;div style="font-family: Consolas,Courier,monospace; font-size: 9pt; padding: 0px; margin: 0px; margin-left: 40px; background-color: #c0c0c0;"&gt;
&lt;pre style="white-space: pre-wrap;"&gt;logman create trace autosession\UsbBootTrace -o UsbBootTrace.etl -ets -nb 128 640 -bs 128
logman update autosession\UsbBootTrace -ets -p Microsoft-Windows-USB-USBPORT
logman update autosession\UsbBootTrace -ets -p Microsoft-Windows-USB-USBHUB
logman create trace autosession\UsbBootTrace -o UsbBootTrace.etl -ets -nb 128 640 -bs 128
logman update autosession\UsbBootTrace -ets -p Microsoft-Windows-USB-USBXHCI Default
logman update autosession\UsbBootTrace -ets -p Microsoft-Windows-USB-UCX Default,PartialDataBusTrace,StateMachine
logman update autosession\UsbBootTrace -ets -p Microsoft-Windows-USB-USBHUB3 Default,PartialDataBusTrace,StateMachine
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Then reboot. When you're ready to stop the trace, enter the following commands in an elevated command window:&lt;/p&gt;
&lt;div style="font-family: Consolas,Courier,monospace; font-size: 9pt; padding: 0px; margin: 0px; margin-left: 40px; background-color: #c0c0c0;"&gt;
&lt;pre style="white-space: pre-wrap;"&gt;logman stop UsbBootTrace -ets
logman delete autosession\UsbBootTrace -ets
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;In this case, you will find the trace file (UsbBootTrace.etl) in the directory where you ran the commands that started the trace. Note that if you reboot before you stop the trace, the trace file will be overwritten.&lt;/p&gt;
&lt;p&gt;- Philip Ries&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Arial;"&gt;Software development engineer on the core USB team.&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10333151" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/usbcoreblog/archive/tags/etw/">etw</category><category domain="http://blogs.msdn.com/b/usbcoreblog/archive/tags/Windows+8/">Windows 8</category><category domain="http://blogs.msdn.com/b/usbcoreblog/archive/tags/usb3/">usb3</category></item><item><title>Using WinUSB for USB 3.0 (SuperSpeed) Devices on Windows 8</title><link>http://blogs.msdn.com/b/usbcoreblog/archive/2012/07/26/using-winusb-for-usb-3-0-superspeed-devices-on-windows-8.aspx</link><pubDate>Thu, 26 Jul 2012 20:27:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10333895</guid><dc:creator>USB Blog</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/usbcoreblog/rsscomments.aspx?WeblogPostID=10333895</wfw:commentRss><comments>http://blogs.msdn.com/b/usbcoreblog/archive/2012/07/26/using-winusb-for-usb-3-0-superspeed-devices-on-windows-8.aspx#comments</comments><description>&lt;p&gt;Authored by Eliyas Yakub [MSFT]&lt;/p&gt;
&lt;p&gt;In this blog, I&amp;rsquo;ll answer some of the frequently asked questions about WinUSB and its support for SuperSpeed (USB 3.0) devices on Windows 8. &lt;a href="http://msdn.microsoft.com/en-us/library/windows/hardware/ff540196(v=vs.85).aspx"&gt;WinUSB&lt;/a&gt; is a generic kernel-mode driver for USB devices. If you are developing a USB device for which Windows doesn&amp;rsquo;t provide an in-box class driver, you can use Winusb.sys as the device driver instead of writing your own.&lt;/p&gt;
&lt;h4&gt;Can&amp;nbsp;I&amp;nbsp;use WinUSB&amp;nbsp;to communicate with&amp;nbsp;a SuperSpeed device?&lt;/h4&gt;
&lt;p&gt;Yes. WinUSB works with USB 3.0 devices. If you are writing an application that calls &lt;a href="http://msdn.microsoft.com/en-us/library/windows/hardware/ff540046(v=vs.85).aspx#winusb"&gt;WinUSB functions&lt;/a&gt;, you don&amp;rsquo;t need to change the application for SuperSpeed devices. The existing WinUSB functions can transfer data to and from the device&amp;rsquo;s bulk and interrupt endpoints.&lt;/p&gt;
&lt;h4&gt;Does WinUSB support USB isochronous transfers?&lt;/h4&gt;
&lt;p&gt;No. At this time, WinUSB cannot perform data transfers to or from isochronous endpoints of a device.&lt;/p&gt;
&lt;h4&gt;Does WinUSB support SuperSpeed Streams transfer type?&lt;/h4&gt;
&lt;p&gt;SuperSpeed bulk endpoints support a new capability called &lt;i&gt;streams&lt;/i&gt;. The capability multiplexes logical data streams into a single bulk endpoint. Generally speaking, WinUSB does not support communication with individual streams of a SuperSpeed bulk&amp;nbsp;endpoint. At this&amp;nbsp;time, you can&amp;nbsp;only perform transfers to the endpoint as a whole.&lt;/p&gt;
&lt;h3&gt;How can an application obtain a SuperSpeed device capability descriptor?&lt;/h3&gt;
&lt;p&gt;A USB 3.0 device capability descriptor is used by the Microsoft-provided USB driver stack to configure the device. The descriptor is not useful for applications and USB client drivers. However, if an application wants, it can obtain the descriptor by first retrieving the BOS descriptor (see USB_BOS_DESCRIPTOR_TYPE in usbspec.h)&amp;nbsp; by calling the &lt;a href="http://msdn.microsoft.com/en-us/library/windows/hardware/ff540257(v=vs.85).aspx"&gt;WinUsb_GetDescriptor&lt;/a&gt; function, and then parsing for the device capability descriptor.&lt;/p&gt;
&lt;h4&gt;How can an application obtain a SuperSpeed endpoint companion descriptor?&lt;/h4&gt;
&lt;p&gt;Because WinUSB doesn&amp;rsquo;t support isochronous transfers or streams of a USB 3.0 bulk endpoint, the application doesn&amp;rsquo;t need the endpoint companion descriptor. However, the application can obtain the descriptor by first retrieving the configuration descriptor and then parsing it for endpoint companion descriptor.&lt;/p&gt;
&lt;p&gt;Alternatively, your application can send some IOCTL requests to retrieve those descriptors. The USB core stack provides generic &lt;a href="http://msdn.microsoft.com/en-us/library/windows/hardware/ff537421(v=vs.85).aspx#user-mode_ioctls_for_usb_client_drivers"&gt;IOCTLs&lt;/a&gt; to obtain information about USB device topology and descriptors. Mostly that information is used by diagnostic tools. There is a sample in the WDK called &lt;a href="http://code.msdn.microsoft.com/windowshardware/USBView-sample-application-e3241039/view/SourceCode"&gt;USBVIEW&lt;/a&gt; that demonstrates how to use those IOCTLs to retrieve all descriptors.&lt;/p&gt;
&lt;h4&gt;Are there any improvements in WPP/ETW tracing?&lt;/h4&gt;
&lt;p&gt;WinUSB performs extensive WPP tracing but not ETW tracing. In Windows 8, we made these improvements for WPP tracing making it easier for you to debug device issues:&lt;/p&gt;
&lt;p&gt;You can get debug trace messages from WinUSB.sys (see &lt;a href="http://blogs.msdn.com/b/usbcoreblog/archive/2010/02/05/how-to-generate-and-view-a-winusb-debug-trace-log.aspx"&gt;How to collect and view WinUSB WPP&lt;/a&gt; traces in Windows 7). To view and format messages in an ETL file, you need TMF files. Prior to Windows 8, we had to provide the TMF files separately (as a download on the blog). Any time, a fix was made to WinUSB, we had to repost the TMF files to match the new binary.&lt;/p&gt;
&lt;p&gt;In Windows 8, TMF information for WinUSB.SYS is available in its public PDB file. If you are using Traceview.exe (included in the WDK for Windows 8) to view an ETL file, you can point it to the public PDB file. The tool will extract the PDB and format the ETL. You could also run Tracepdb.exe to extract the TMF files from the PDB file and then use utilities such as Tracelog.exe to view them.&lt;/p&gt;
&lt;p&gt;We extended WPP to &lt;b&gt;always&lt;/b&gt; log trace messages in WinUSB&amp;rsquo;s internal circular buffer called &lt;i&gt;Inflight Recorder (IFR)&lt;/i&gt;. You can view trace messages from this buffer any time by using a kernel-mode debugger. A new debugger extension DLL called rcdrkd.dll (short form of recorder kd) is shipped in the debugger package. The extension can find the trace buffers, format them by using the TMF information from a matching PDB file, and display the output in the debugger.&lt;/p&gt;
&lt;p&gt;Here is an example on how to load the extension and use the command. For more information about this debugger extension, see &lt;a href="http://msdn.microsoft.com/en-us/library/windows/hardware/hh920376(v=vs.85).aspx"&gt;RCDRKD Extensions&lt;/a&gt;.&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;0: kd&amp;gt; !load C:\WinDDK\8.0\Debuggers\x64\winext\rcdrkd.dll&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;0: kd&amp;gt; !rcdrlogdump winusb&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;Trace searchpath is:&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;Trace format prefix is: %7!u!: %!FUNC! -&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;Trying to extract TMF information from - C:\Debuggers\sym\winusb.pdb\02D00B5E5A9242669A9907D98CACC2521\winusb.pdb&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;--- start of log ---&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;1: DriverEntry - DriverObject 0xFFFFFA8009DD16F0&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;2: WinUSB_GetRegParams - CyclePortEnabled is set to FALSE&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;3: WinUSB_AddDevice - Default PowerPolicy: WinUSB is the power policy owner.&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;4: WinUSB_AddDevice - Default PowerPolicy: EnableIdle = 0x00000001(true)&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;5: WinUSB_AddDevice - Default PowerPolicy: SystemWakeEnabled = 0x00000000(false)&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;6: WinUSB_AddDevice - Default PowerPolicy: SuspendDelay = 5000 ms&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;7: WinUSB_AddDevice - Default PowerPolicy: DeviceIdleEnabled = 0x00000001(true)&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;8: WinUSB_AddDevice - Default PowerPolicy: UserSetDeviceIdleEnabled = 0x00000001(true)&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;9: WinUSB_AddDevice - Default PowerPolicy: DefaultDeviceIdleState = 0x00000001(true)&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;10: WinUSB_AddDevice - Default PowerPolicy: IdleConfigured = 0x00000000(false)&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;11: WinUSB_AddDevice - Default PipePolicy: ShortPacketTerminate = 0x00000000(false)&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;12: WinUSB_AddDevice - Default PipePolicy: AutoClearStall = 0x00000000(false)&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;13: WinUSB_AddDevice - Default PipePolicy: PipeTransferTimeout = 0&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;14: WinUSB_AddDevice - Default PipePolicy: IgnoreShortPackets = 0x00000000(false)&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;15: WinUSB_AddDevice - Default PipePolicy: AllowPartialReads = 0x00000001(true)&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;16: WinUSB_AddDevice - Default PipePolicy: AutoFlush = 0x00000000(false)&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;17: WinUSB_AddDevice - Default PipePolicy: RawIo = 0x00000000(false)&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;18: WinUSB_AddDevice - Default PipePolicy: ResetOnResume = 0x00000000(false)&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;19: WinUSB_PrepareHardware - Preparing hardware for WDF device (0000057FF84C4CD8)&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;20: WinUSB_PrepareHardware - Created UsbDevice (0000057FF90CDC68)&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;21: WinUSB_PrepareHardware - Resetting Default settings for WDFDevice (0000057FF84C4CD8)&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;22: WinUSB_D0Entry - Starting Read Io Target for WdfUsbPipe (0000057FF5100DE8)&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;23: WinUSB_D0Entry - Starting Read Io Target for WdfUsbPipe (0000057FF59F3BA8)&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;24: WinUSB_DeviceControl - IOCTL_WINUSB_VERSION_EXCHANGE&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;25: WinUSB_DeviceControl - IOCTL_WINUSB_GET_DESCRIPTOR&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;26: WinUSB_DeviceControl - IOCTL_WINUSB_GET_DESCRIPTOR&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;27: WinUSB_DeviceControl - IOCTL_WINUSB_GET_DESCRIPTOR&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;28: WinUSB_DeviceControl - IOCTL_WINUSB_RESET_DEFAULTS&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;29: WinUSB_DeviceControl - IOCTL_WINUSB_GET_DESCRIPTOR&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;30: WinUSB_DeviceControl - IOCTL_WINUSB_GET_DESCRIPTOR&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;31: WinUSB_DeviceControl - IOCTL_WINUSB_SET_POWER_POLICY&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;32: WinUSB_DeviceControl - IOCTL_WINUSB_SET_POWER_POLICY&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;33: WinUSB_SetPowerPolicy - Existing power policy same as passed in power policy.&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;34: WinUSB_D0Exit - Stopping Read Io Target for WdfUsbPipe (0000057FF5100DE8) to cancel pending IO&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;Have you done anything to make installation of WinUSB easier?&lt;/h4&gt;
&lt;p&gt;Yes we have. You can now install automatically Winusb.sys for your device by using an in-box INF on Windows 8, Windows 7, and Windows Vista. I will talk about this in the next blog. So stay tuned!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10333895" width="1" height="1"&gt;</description></item><item><title>Common issues in USB 3.0 devices</title><link>http://blogs.msdn.com/b/usbcoreblog/archive/2012/07/13/common-issues-in-usb-3-0-devices.aspx</link><pubDate>Fri, 13 Jul 2012 00:44:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10329449</guid><dc:creator>USB Blog</dc:creator><slash:comments>14</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/usbcoreblog/rsscomments.aspx?WeblogPostID=10329449</wfw:commentRss><comments>http://blogs.msdn.com/b/usbcoreblog/archive/2012/07/13/common-issues-in-usb-3-0-devices.aspx#comments</comments><description>&lt;h3&gt;1 Introduction&lt;/h3&gt;
&lt;p&gt;My name is Vivek Gupta; I am an engineer in Microsoft. I am part of the team that developed the USB 3.0 stack in Windows 8.&lt;/p&gt;
&lt;p&gt;USB 3.0 offers significant improvement in performance and power over USB 2.0. However, like any new technology, it also brings its own set of new challenges. During the development of USB3.0 stack in Windows 8, we observed some common mistakes made by hardware vendors when developing USB 3.0 hardware. I am going to talk about these issues with the goal of helping hardware designers avoid these errors in future designs. I am also going to talk about how to catch some of these failures using a tool that we have developed called USB Hardware Verifier. In this blog entry, I am going to focus only on the issues related to devices. We will cover the issues related to hubs and controllers in future blog entries.&lt;/p&gt;
&lt;h3&gt;2 Design choices on how to deal with failures&lt;/h3&gt;
&lt;h4&gt;2.1 Transient Failures&lt;/h4&gt;
&lt;p&gt;Some of the issues that we encountered are just transient failures that do not happen consistently. For example: a link going into an error state or an occasional transfer failure. Our driver stack typically tries to be resilient towards such failures by initiating an appropriate error recovery action or if applicable, retrying the operation in progress. Of course if such errors happen frequently, then they will lead to a poor end user experience. These types of errors give an impression to the user that the hardware is flaky. For example a device failing transfers could cause the device enumeration to take longer or fail altogether.&lt;/p&gt;
&lt;h4&gt;2.2 Consistent Failures&lt;/h4&gt;
&lt;p&gt;Then there are more consistent failures where hardware is behaving in a non-spec compliant manner by design. For example a device returning invalid descriptor or repeatedly failing a spec required control transfer. We had a design choice regarding how our driver stack should deal with such failures. In many cases, these errors are not fatal i.e. we could choose to ignore the error and go on working with that hardware. However, the problem with that approach is that we are essentially guessing the intent of the hardware and we might have to default to non-optimal values. This in turn could lead to sub optimal user experience, examples of which I will give below. Moreover, since the hardware &amp;ldquo;works&amp;rdquo;, there is no forcing function for the hardware vendors to fix these issues and we lose the ability to ensure the quality of Windows experience. Therefore we consciously try to detect such issues and fail the hardware explicitly as early as possible. For example, if a device returns an invalid descriptor, we will fail the enumeration of the device and the device will come up with an error code in Device Manager.&lt;/p&gt;
&lt;p&gt;There are a few exceptions to the above design pattern. In some scenarios, it might not be efficient to look for such errors and we decided to avoid the performance penalty. Then there are cases where we realized that the specification is ambiguous and the hardware issue is really due to a different interpretation of the specification by the hardware vendor. In such cases, we try to get the specification updated to clear up the ambiguity but also keep working with the hardware. Finally, we wanted to maintain backwards compatibility with Windows 7 for old devices and hubs. For USB 2.0 or lower devices, our goal was to maintain the Windows 7 behavior for hardware errors. If the device version is greater than USB2.0, then we are stricter about requiring spec compliant behavior.&lt;/p&gt;
&lt;h4&gt;2.3 Workarounds&lt;/h4&gt;
&lt;p&gt;As we were developing the Windows 8 USB 3.0 stack, we also implemented specific workarounds for specific hardware where we allowed non-spec compliant behavior and interpreted the hardware behavior in a manner not dictated by the specifications. This was typically done only if we got a confirmation from the hardware vendor about the intended behavior, such that we didn&amp;rsquo;t need to &amp;ldquo;guess&amp;rdquo; the intent of the hardware and only after we had received assurance that the behavior would be fixed in the next version. As we approached the end of Windows 8 development we stopped implementing any additional workarounds and over time we became much more critical about applying workarounds to new hardware, as new hardware had plenty of time to test with Windows 8. With the broad availability of Windows 8 and the USB 3.0 stack, hardware vendors should be able to successfully build their hardware in a compliant way, thus avoiding the need for adding workarounds.&lt;/p&gt;
&lt;h3&gt;3 Catching the failures&lt;/h3&gt;
&lt;p&gt;As we will see later in the document that in many cases, hardware issues manifest themselves in ways such that it is not trivial to determine the exact failure just by looking at the end to end behavior. In order to enable our hardware partners to catch these errors really early in the development cycle, we created a tool that catches and reports these errors. We refer to this tool as &amp;ldquo;USB Hardware Verifier&amp;rdquo;.&amp;nbsp;This tool is part of the &lt;a href="http://msdn.microsoft.com/en-us/windows/hardware/jj590752"&gt;MUTT software package&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;3.1 Usage&lt;/h4&gt;
&lt;p&gt;Usage of the tool involves three steps: starting a session, running the desired tests with your hardware and then stopping the session. This tool captures hardware events as they occur. It gives the user the ability to display information about those events in real time and at the same time, allows the user to capture the information in a trace file that can be parsed at a later time. The tool also provides an ability to filter events based on the VendorId and ProductId of the hardware so that the user can target a specific hardware.&lt;/p&gt;
&lt;p&gt;To start the session, run the tool at an elevated command prompt and to stop the session at any time, simply press CTRL+C.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;USB3HWVerifierAnalyzer.exe&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The tool supports these options:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;-v &amp;lt;VendorID&amp;gt;&lt;/em&gt; : Logs all hardware verifier events for the specified VendorID&lt;/p&gt;
&lt;p&gt;&lt;em&gt;-p &amp;lt;ProductID&amp;gt;&lt;/em&gt; : Logs all hardware verifier events for the specified ProductID&lt;/p&gt;
&lt;p&gt;&lt;em&gt;-f &amp;lt;ETL file&amp;gt;&lt;/em&gt; :&amp;nbsp; Parses the specified ETL file. Note that this option is used to parse an existing ETL file offline.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;/v output&lt;/em&gt; :&amp;nbsp; Displays all events to the console.&lt;/p&gt;
&lt;p&gt;At the end of the session, a file named &lt;i&gt;AllEvents.etl&lt;/i&gt; is added in the current directory. This file contains trace information about all events that were captured during the session. The command window also shows detailed report after the session ends. This report categorizes the information by controller, hub, or device, making it easier to read. The report contains a &lt;i&gt;key&lt;/i&gt; that you can use to filter events based on those categories. Note that while displaying information in real time, the tool might not capture some information (such as VID/PID) related to events that occur before the device gets fully enumerated. The missing information is available in the detailed report though.&lt;/p&gt;
&lt;p&gt;Here is an example output from the USB hardware verifier tool.&lt;/p&gt;
&lt;table border="1" cellspacing="0" cellpadding="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="677" valign="top"&gt;
&lt;p style="margin: 0 0 0 0;"&gt;&amp;hellip; &lt;br /&gt;12983512883.067484s: (UsbHub3/176):&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Event Message:&lt;span style="background-color: #ffff00;"&gt;DescriptorValidationError20HubPortPwrCtrlMaskZero&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; VendorID/ProductID: 0x45E/0x1234&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DeviceInterfacePath: \??\USB#VID_045E&amp;amp;PID_1234#6&amp;amp;c4be011&amp;amp;0&amp;amp;2#{f18a0e88-c30c-11d0-8815-00a0c906bed8}&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DeviceDescription: Generic USB Hub&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PortPath:&amp;nbsp; 0x2, 0x0, 0x0, 0x0, 0x0, 0x0&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;12983512888.452400s: (UsbHub3/173)&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Event Message: SuperSpeed Device is Connected on the 2.0 Bus:&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PortPath:&amp;nbsp; 0x2, 0x4, 0x0, 0x0, 0x0, 0x0&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;12983512900.098652s: (UsbHub3/176):&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Event Message:&lt;span style="background-color: #ffff00;"&gt;DescriptorValidationErrorCompanionIsochEndpointWBytesPerIntervalTooLarge&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PortPath:&amp;nbsp; 0x3, 0x0, 0x0, 0x0, 0x0, 0x0&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;12983512900.098654s: (UsbHub3/176):&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Event Message:DescriptorValidationErrorCompanionIsochEndpointWBytesPerIntervalTooLarge&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PortPath:&amp;nbsp; 0x3, 0x0, 0x0, 0x0, 0x0, 0x0&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;12983512900.098656s: (UsbHub3/176):&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Event Message:DescriptorValidationErrorCompanionIsochEndpointWBytesPerIntervalTooLarge&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PortPath:&amp;nbsp; 0x3, 0x0, 0x0, 0x0, 0x0, 0x0&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;&amp;hellip;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;In the above output, you will notice that the tool is reporting an error (highlighted) for the hub where the port power control mask is zero in the hub descriptor. Similarly, it is reporting a number of errors for a device. The first error (highlighted) is about the companion endpoint descriptor for an isoch endpoint having &lt;i&gt;WBytesPerInterval&lt;/i&gt; field too large. In the real time output, the details of this device are not displayed. However, the following test report shows those details.&lt;/p&gt;
&lt;p&gt;The following output shows an example test report for the preceding session&lt;/p&gt;
&lt;table border="1" cellspacing="0" cellpadding="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="677" valign="top"&gt;
&lt;p style="margin: 0 0 0 0;"&gt;**********************************************************************************************&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;Test Results:&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;Below is a report of all the Hardware verifier events encountered. The Key field refers to a Controller, hub, or device. During the lifetime of this utility, all unfiltered events are captured in file AllEvents.etl (in current directory). The Key in below report can be used to filter events in AllEvents.etl file&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;**********************************************************************************************&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;Record #1 (Key = 0x57ff0de4858)&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;&amp;nbsp; VendorID/ProductID: 0x45E/0x1234&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;&amp;nbsp; DeviceInterfacePath: \??\USB#VID_045E&amp;amp;PID_1234#6&amp;amp;c4be011&amp;amp;0&amp;amp;2#{f18a0e88-c30c-11d0-8815-00a0c906bed8}&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;&amp;nbsp; DeviceDescription: Generic USB Hub&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;&amp;nbsp; PortPath:&amp;nbsp; 0x2, 0x0, 0x0, 0x0, 0x0, 0x0&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;&amp;nbsp; All errors encountered:&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #1: (UsbHub3/176): DescriptorValidationError20HubPortPwrCtrlMaskZero&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;&amp;nbsp;&amp;nbsp; Record #2 (Key = 0x57ff79fd4e8)&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;&amp;nbsp; VendorID/ProductID: 0x45E/0x3456&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;&amp;nbsp; PortPath:&amp;nbsp; 0x3, 0x0, 0x0, 0x0, 0x0, 0x0&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;&amp;nbsp; All errors encountered:&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #1: (UsbHub3/176): DescriptorValidationErrorCompanionIsochEndpointWBytesPerIntervalTooLarge&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #2: (UsbHub3/176): DescriptorValidationErrorCompanionIsochEndpointWBytesPerIntervalTooLarge&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #3: (UsbHub3/176): DescriptorValidationErrorCompanionIsochEndpointWBytesPerIntervalTooLarge&lt;/p&gt;
&lt;p style="margin: 0 0 0 0;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;hellip;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;4 Hardware Failures&lt;/h3&gt;
&lt;p&gt;I will now talk in detail about some of the common issues that we encountered. For each issue, I will also point out whether it can be caught by the USB hardware verifier tool and if so, what is the failure string corresponding to the issue.&lt;/p&gt;
&lt;h4&gt;4.1 U1/U2 Related Issues&lt;/h4&gt;
&lt;p&gt;The USB 3.0 specification introduces two new link power management states U1 and U2. A big share of hardware issues that we encountered were related to the implementation of these states. I have already talked in detail about these states and the related problems in &lt;a href="http://msdn.microsoft.com/en-us/library/windows/hardware/hh533443"&gt;this&lt;/a&gt; paper. I will not be covering those failures here; I strongly encourage you to read that paper&lt;/p&gt;
&lt;h4&gt;4.2 2.0 LPM Related Issues&lt;/h4&gt;
&lt;p&gt;We added limited support for 2.0 LPM in the Windows 8 USB 3.0 stack. We have seen some issues related to this mechanism. I will cover this topic in detail in a future blog entry.&lt;/p&gt;
&lt;h4&gt;4.3 Invalid Descriptors&lt;/h4&gt;
&lt;p&gt;As part of device enumeration, the USB core stack reads, parses and validates the descriptors reported by the device. Some devices report descriptors that are not valid as per the USB spec. In the USB hardware verifier output, these failures can be identified by the tag &lt;b&gt;&lt;i&gt;DeviceHwVerifierDescriptorValidationFailure&lt;/i&gt;&lt;/b&gt;. Since there are many variations of this failure, each specific failure has an associated tag starting with the string &lt;b&gt;&lt;i&gt;DescriptorValidationError&lt;/i&gt;, &lt;/b&gt;some examples of which are given below.&lt;/p&gt;
&lt;h5&gt;4.3.1 Missing or zero Container Id&lt;/h5&gt;
&lt;p&gt;The concept of &lt;a href="http://msdn.microsoft.com/en-us/library/windows/hardware/ff540024(v=vs.85).aspx"&gt;Container Id&lt;/a&gt; was introduced in Windows 7. In the USB world, container ID was reported as part of the MS OS descriptor. With USB 3.0 and USB 2.1 addendum, this concept was adopted in the USB specification. Devices are required to report Container ID (&lt;i&gt;USB 3.0 specification Section 9.6.2.3&lt;/i&gt;) as part of their BOS descriptors. However, we have observed that some devices do not report the Container Id descriptor or report it as all zeroes. We will fail the enumeration for such a device because if we ignored this failure and enumerated the device, the device might work but might not appear correctly in the UI. In the USB hardware verifier output, this failure can be identified by tag &lt;b&gt;&lt;i&gt;DescriptorValidationErrorMSOSContainerIdAllZeroes&lt;/i&gt;&lt;/b&gt;.&lt;/p&gt;
&lt;h5&gt;4.3.2 Invalid U1/U2 exit latencies&lt;/h5&gt;
&lt;p&gt;U1 and U2 are power states introduced in USB 3.0. Some devices report edU1/U2 exit latencies that were not valid. We will fail the enumeration for such a device. If we ignored this failure, we wouldn&amp;rsquo;t know the real values for the device and would be forced to disable U1/U2 leading to more power consumption.&lt;/p&gt;
&lt;p&gt;In the USB hardware verifier output, these failures can be identified by the tags &lt;b&gt;&lt;i&gt;DescriptorValidationErrorSuperSpeedCapBU1DevExitLatTooLarge&lt;/i&gt;&lt;/b&gt; and &lt;b&gt;&lt;i&gt;DescriptorValidationErrorSuperSpeedCapBU2DevExitLatTooLarge&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h4&gt;4.4 SuperSpeed devices connecting on the 2.0 port&lt;/h4&gt;
&lt;p&gt;We observed that sometimes a SuperSpeed device would connect to USB 2.0 even though the device is connected to a 3.0 connector and SuperSpeed is available on that port. This can happen either when the device is initially attached or after a system sleep resume cycle. Such behavior can lead to reduced functionality and non-ideal user experience.&lt;/p&gt;
&lt;p&gt;In the USB hardware verifier output, this failure can be identified by the tag &lt;b&gt;&lt;i&gt;DeviceHwVerifierSuperSpeedDeviceWorkingAtLowerSpeed&lt;/i&gt;&lt;/b&gt;. However, if the device is deliberately connected behind a 2.0 Hub for testing purposes, then it is expected that the device will work at 2.0 and in that case, please ignore this failure.&lt;/p&gt;
&lt;h4&gt;4.5 SuperSpeed devices reporting old USB version when operating at 2.0&lt;/h4&gt;
&lt;p&gt;When a 3.0 device is plugged in behind a 2.0 Hub or controller, it will operate at one of the 2.0 speeds. Devices in this scenario are required to report their bcdUSB in the Device Descriptor as 0210 (USB 3.0 Specification Section 9.2.6.6). However some devices reported this value as 0200. When a device does that, the driver stack cannot detect this error and therefore the device will enumerate and continue to work. However, the driver stack will not query for the BOS descriptor for such a device and hence will not be able to indicate that the device can perform faster when connected to USB 3.0. The user will get the lower speed and potentially reduced functionality without knowing the remedy. This failure cannot be caught by the USB hardware verifier.&lt;/p&gt;
&lt;h4&gt;4.6 Devices connecting at both 2.0 and SuperSpeed simultaneously&lt;/h4&gt;
&lt;p&gt;The USB 3.0 specification clearly states that any USB 3.0 device, that is not a hub, should not connect at both USB 2.0 and SuperSpeed simultaneously (USB 3.0 Specification Section 9.2.6.6). Such devices are not supported by Windows and can lead to unknown behavior. In Windows 8, we do not explicitly prevent such a device from enumerating and therefore it might seem that these devices are working with Windows. However, there are good chances that these devices might not work at all with future versions of Windows. This failure cannot be caught by the USB hardware verifier.&lt;/p&gt;
&lt;h4&gt;4.7 Wake capability in Interface descriptor&lt;/h4&gt;
&lt;p&gt;For 3.0 devices, supporting remote wake also involves supporting function wake (&lt;i&gt;USB 3.0 Specification Section 9.2.5.3&lt;/i&gt;). So there are two places where a device needs to indicate that it is remote wake capable. First is the &amp;ldquo;&lt;i&gt;Remote Wake&lt;/i&gt;&amp;rdquo; bit of &lt;i&gt;bmAttributes&lt;/i&gt; in the configuration descriptor (&lt;i&gt;USB 3.0 Specification Section 9.6.3&lt;/i&gt;) and the second place is in the &amp;ldquo;&lt;i&gt;Function Remote Wake Capable&lt;/i&gt;&amp;rdquo; in the Get Status for the first interface of each function in the device (&lt;i&gt;USB 3.0 Specification Section 9.4.5)&lt;/i&gt;. We expect devices to report consistent information in these bits. For single function devices, we expect these bits to match. For multi-function devices, we expect the Remote Wake bit in the configuration descriptor to be 1 if at least one of the functions reports 1 for the Function Remote Wake Capable bit. However, we have observed some devices did not report the interface status correctly. In such cases, we are forced to choose one bit over another. A wrong guess on our part could lead to incorrect power capabilities and the client driver making a wrong decision about whether to arm the device for wake or not. It could also result in client driver not enabling Selective Suspend for the device.&lt;/p&gt;
&lt;p&gt;In the USB hardware verifier output, these failures can be identified by the tag &lt;b&gt;&lt;i&gt;DeviceHwVerifierInterfaceWakeCapabilityMismatch&lt;/i&gt;&lt;/b&gt;.&lt;/p&gt;
&lt;h4&gt;4.8 Not supporting 3.0 specific requests&lt;/h4&gt;
&lt;p&gt;Some devices failed the standard control transfers that are new additions to the USB 3.0 specification over USB 2.0. These transfers are used to relay information to the device. It is quite likely that the information relayed in the request is not interesting to some devices. However, since these are standard requests, we expect devices to always succeed the transfer as required by the USB 3.0 specification. As it is, the failure of this transfer is not a problem from the point of view of the driver stack because quite likely the device is not interested in that information at all. However the driver stack cannot differentiate between a device that always fails this transfer because it does not need this information versus a device that needs the information but happens to fail the transfer because of a transient error (in which case the driver stack should retry).&lt;/p&gt;
&lt;h5&gt;4.8.1 Set Isoch delay&lt;/h5&gt;
&lt;p&gt;&amp;ldquo;SET_ISOCH_DELAY&amp;rdquo; (&lt;i&gt;USB 3.0 Specification Section 9.4.11&lt;/i&gt;) is a standard control transfer sent to inform the device of the delay from the time a host transmits a packet to the time it is received by the device. Unfortunately we saw a significant number of devices fail this transfer and as a result, we were forced to ignore this transfer failure in the Windows 8 driver stack.&lt;/p&gt;
&lt;p&gt;In the USB hardware verifier output, this failure can be identified by the tag &lt;b&gt;&lt;i&gt;DeviceHwVerifierSetIsochDelayFailure&lt;/i&gt;&lt;/b&gt;.&lt;/p&gt;
&lt;h5&gt;4.8.2 Set SEL&lt;/h5&gt;
&lt;p&gt;&amp;ldquo;SET_SEL&amp;rdquo; (&lt;i&gt;USB 3.0 Specification Section 9.4.12&lt;/i&gt;) is a standard control transfer sent to inform the device about U1 and U2 exit latencies of the path from the host to the device. Our Windows 8 driver stack ignores the failure of this transfer if the device stalled the transfer as it indicates that the device is consciously returning failure. If the transfer fails for any other reason, then the driver stack fails the device enumeration.&lt;/p&gt;
&lt;p&gt;In the USB hardware verifier output, this failure can be identified by the tag &lt;b&gt;&lt;i&gt;DeviceHwVerifierSetSelFailure&lt;/i&gt;&lt;/b&gt;.&lt;/p&gt;
&lt;h4&gt;4.9 Different Serial Number on re-enumeration&lt;/h4&gt;
&lt;p&gt;Some devices reported one serial number during the initial enumeration on device attach and then reported a different serial number on re-enumeration after a port reset. Re-enumeration can happen while resuming from system sleep or it can be initiated by the client driver. While re-enumerating the device, we match the serial number of the device with the initial serial number to ensure it is the same device. This step is particularly important on system resume where the user has the opportunity to replace the device. If the serial number does not match, then the re-enumeration is failed and the device is surprise removed before it is enumerated again. This sequence is particularly problematic if the device is a boot device, in which case the system will crash.&lt;/p&gt;
&lt;p&gt;In the USB hardware verifier output, this failure can be identified by the tag &lt;b&gt;&lt;i&gt;DeviceHwVerifierSerialNumberMismatchOnRenumeration&lt;/i&gt;&lt;/b&gt;.&lt;/p&gt;
&lt;h4&gt;4.10 Device disappearing on system resume&lt;/h4&gt;
&lt;p&gt;When the system goes to sleep, some controllers or platforms will cut the VBUS off and cause the downstream devices to disconnect from the bus. When the system resumes and VBUS is reapplied, these devices will connect back. If the device is bus powered, then it will also need to power back on before connecting on the bus.&lt;/p&gt;
&lt;p&gt;If the driver stack reads the port status during system resume and finds that the device is back, the driver will re-enumerate the device and re-store its configuration without letting the operating system know that the device re-connected. As a result, this re-enumeration is transparent to applications. Any operations in progress before the system went to sleep can continue without interruption.&lt;/p&gt;
&lt;p&gt;However, if the driver stack finds that the device has not connected back, it will report the device as missing to the operating system. When the device connects back, there will be a new instance created for the device and the device will start working. However, the surprise removal of the old instance of the device will interrupt any applications that were using the device before the system went to sleep. For example if a file copy was in progress for a storage device, it will fail. Also, creating a new instance will take some time and the user might see a delay in device becoming available after resume.&lt;/p&gt;
&lt;p&gt;To mitigate this issue, we implemented a heuristics in our Windows 8 driver stack. When the driver stack finds that the device is not connected on system resume, it gives a grace period (which is currently set to one second) to the device to connect back before reporting the device missing. However, we observed that some devices take longer than this to connect back, leading to surprise removal and a poor end user experience.&lt;/p&gt;
&lt;p&gt;In the USB hardware verifier output, this failure can be identified by the tag &lt;b&gt;&lt;i&gt;HubHwVerifierPortDeviceDisconnected&lt;/i&gt;&lt;/b&gt;. However, please note that this tag will appear whenever the device is disconnected. So if you did indeed remove the device, then ignore this tag.&lt;/p&gt;
&lt;h4&gt;4.11 SuperSpeed devices requiring additional delays&lt;/h4&gt;
&lt;p&gt;We found that some SuperSpeed devices required a delay between two operations initiated by the driver stack even though the specification mandates them to not be dependent on such a delay. Often these delays were such that they were part of the USB 2.0 specification but have been removed in the USB 3.0 specification.&lt;/p&gt;
&lt;p&gt;These errors cannot be detected as such by the USB hardware verifier. However, these failures will most likely manifest themselves as the device not completing the next control transfer successfully. These failures can be identified in the USB hardware verifier output by the tag &lt;b&gt;&lt;i&gt;DeviceHwVerifierControlTransferFailure&lt;/i&gt;&lt;/b&gt;. One tricky part with catching such errors is that they might not happen consistently and might only reproduce with specific host controllers and topologies. Therefore it is always a good idea to test a device with multiple host controllers and in various topologies.&lt;/p&gt;
&lt;h5&gt;4.11.1 Delay after connect&lt;/h5&gt;
&lt;p&gt;When a SuperSpeed device connects to a host, it goes through a sequence of operations in the hardware before the connect bit goes to 1 and a connect change is indicated. By the time the host gets the connect change, the device must be ready to respond to host requests. But we saw that some devices got confused if the host started communicating with the device immediately which leads to the device failing enumeration. It is not even possible to implement a device specific workaround for this issue as we have not even received the device descriptor of the device at that point in enumeration.&lt;/p&gt;
&lt;h5&gt;4.11.2 Delay after reset&lt;/h5&gt;
&lt;p&gt;The USB 3.0 specification mandates that after a port is successfully reset or resumed, the USB driver stack is allowed to access the device attached to the port immediately and it is expected to respond to data transfers (&lt;i&gt;USB 3.0 Specification Section 9.2.6.2)&lt;/i&gt;. Unfortunately some devices got confused if the driver stack did that and failed enumeration.&lt;/p&gt;
&lt;h4&gt;4.12 Devices disconnecting on disable/suspend&lt;/h4&gt;
&lt;p&gt;When the user chooses to &amp;ldquo;Safely remove hardware&amp;rdquo; from the task bar, our driver stack disables the port that the device is attached to. However, we observed that when we disabled or suspended some devices, they would disconnect from the port. This causes unexpected surprise removal of the device. Moreover, since the driver re-enumerates a new instance of the device, the port comes back in enabled state. This can lead to end user confusion. For example, If the device has an indicator light, it does not go off and user might get confused as to whether it is indeed safe to remove the device. Also, it leads to the device consuming more power without any good reason to do so.&lt;/p&gt;
&lt;p&gt;Note that this behavior changed from Windows 7 to Windows 8. In Windows 7, we didn&amp;rsquo;t disable the port. The reason we changed the behavior from Windows 7 to Windows 8 is because Windows 7 behavior leaves the port in the enabled state and leads to the same problems that we discussed above: end user confusion and more power consumption.&lt;/p&gt;
&lt;p&gt;In the USB hardware verifier output, this failure can be identified by the tag &lt;b&gt;&lt;i&gt;HubHwVerifierPortDeviceDisconnected&lt;/i&gt;&lt;/b&gt;. However, please note that this tag will appear whenever the device is disconnected. So if you did indeed the remove the device, then ignore this tag.&lt;/p&gt;
&lt;h3&gt;5 Conclusion&lt;/h3&gt;
&lt;p&gt;In this blog, I talked about some of the issues that we encountered with USB 3.0 devices. We hope that the future versions of the devices will avoid these issues leading to a better end user experience and a great Windows experience. We urge our hardware partners to start using the USB hardware verifier tool early in their development cycle so that the errors can be caught and fixed without incurring high costs.&lt;/p&gt;
&lt;p&gt;There have been several errata to the USB 3.0 specification. These errata are aimed at removing the ambiguities and filling the gaps. Often these improvements weed out inter-operability issues between software and hardware as well as between hardware components. We strongly encourage the hardware vendors to follow the latest versions of these specifications to provide the best user experience.&lt;/p&gt;
&lt;p&gt;In the subsequent blog entries in future, we will talk about issues related to hubs and controllers. Stay tuned!&lt;/p&gt;
&lt;p&gt;&lt;a name="_Hlt228982151"&gt;&lt;/a&gt;&lt;a name="_Hlt228982780"&gt;&lt;/a&gt;&lt;a name="_Hlt229026212"&gt;&lt;/a&gt;&lt;a name="_Hlt228981231"&gt;&lt;/a&gt;&lt;a name="_Hlt228983139"&gt;&lt;/a&gt;&lt;a name="_Hlt228985685"&gt;&lt;/a&gt;&lt;a name="_Hlt228985983"&gt;&lt;/a&gt;&lt;a name="_Hlt229022149"&gt;&lt;/a&gt;&lt;a name="_Hlt229024334"&gt;&lt;/a&gt;&lt;a name="_Hlt229026088"&gt;&lt;/a&gt;&lt;a name="_Hlt229027000"&gt;&lt;/a&gt;&lt;a name="_Hlt229027004"&gt;&lt;/a&gt;&lt;a name="_Hlt229053426"&gt;&lt;/a&gt;&lt;a name="_Hlt229294380"&gt;&lt;/a&gt;&lt;a name="_Hlt229033377"&gt;&lt;/a&gt;&lt;a name="_Hlt229033382"&gt;&lt;/a&gt;&lt;a name="_Hlt229035494"&gt;&lt;/a&gt;&lt;a name="_Hlt229035705"&gt;&lt;/a&gt;&lt;a name="_Hlt229035793"&gt;&lt;/a&gt;&lt;a name="_Hlt229053635"&gt;&lt;/a&gt;&lt;a name="_COMPONENT_ARCHITECTURE"&gt;&lt;/a&gt;&lt;a name="_Tools_Usage_And"&gt;&lt;/a&gt;&lt;a name="_State_Machine_Verification:"&gt;&lt;/a&gt;&lt;a name="_Power_management"&gt;&lt;/a&gt;&lt;a name="_Toc228092473"&gt;&lt;/a&gt;&lt;a name="_Toc228092972"&gt;&lt;/a&gt;&lt;a name="_Toc228093478"&gt;&lt;/a&gt;&lt;a name="_Toc228093977"&gt;&lt;/a&gt;&lt;a name="_Toc228094477"&gt;&lt;/a&gt;&lt;a name="_Toc228095275"&gt;&lt;/a&gt;&lt;a name="_Toc228095773"&gt;&lt;/a&gt;&lt;a name="_Toc228096271"&gt;&lt;/a&gt;&lt;a name="_Toc228096771"&gt;&lt;/a&gt;&lt;a name="_Toc228097275"&gt;&lt;/a&gt;&lt;a name="_Toc228097779"&gt;&lt;/a&gt;&lt;a name="_Toc228116128"&gt;&lt;/a&gt;&lt;a name="_Toc228211222"&gt;&lt;/a&gt;&lt;a name="_Hlt228610599"&gt;&lt;/a&gt;&lt;a name="_Hlt228633960"&gt;&lt;/a&gt;&lt;a name="_Hlt228633941"&gt;&lt;/a&gt;&lt;a name="_Hlt228637516"&gt;&lt;/a&gt;&lt;a name="_Kernel_Mode_I/O"&gt;&lt;/a&gt;&lt;a name="_Toc231976221"&gt;&lt;/a&gt;&lt;a name="_Toc231977156"&gt;&lt;/a&gt;&lt;a name="_Link_power_management"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;hr width="33%" size="1" align="left" /&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10329449" width="1" height="1"&gt;</description></item><item><title>How to determine whether a USB 3.0 device is operating at SuperSpeed?</title><link>http://blogs.msdn.com/b/usbcoreblog/archive/2012/06/27/how-to-determine-whether-a-usb-3-0-device-is-operating-at-superspeed.aspx</link><pubDate>Wed, 27 Jun 2012 20:59:35 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10324757</guid><dc:creator>USB Blog</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/usbcoreblog/rsscomments.aspx?WeblogPostID=10324757</wfw:commentRss><comments>http://blogs.msdn.com/b/usbcoreblog/archive/2012/06/27/how-to-determine-whether-a-usb-3-0-device-is-operating-at-superspeed.aspx#comments</comments><description>&lt;p&gt;How to determine whether a USB 3.0 device is operating at SuperSpeed?&lt;/p&gt;  &lt;p&gt;Note: The information provided in this blog post applies to Windows 8.&lt;/p&gt;  &lt;p&gt;Hi, I am Sanket Patel, a software developer on the USB team. In this blog post, I will describe some ways in which you can determine whether a USB 3.0 device that is attached to a PC running Windows 8 version of the operating system, is operating at the optimal connection speed - SuperSpeed.&lt;/p&gt;  &lt;p&gt;USB 3.0 introduces a new operating speed called SuperSpeed. Compared to USB 2.0 bandwidth of 480 Mbps, SuperSpeed supports 5.0 Gbps making it 10 times faster than USB 2.0. USB 3.0 also supports lower operating speeds: high speed, full speed, and low speed. Along with increased bandwidth, USB 3.0 host controllers and devices come with the promise of compatibility. USB 3.0 controllers are required to work with all existing USB devices. The fact that current PCs ship with both USB 2.0 and USB 3.0 ports presents an interesting challenge: how should you determine whether a USB 3.0 device is indeed operating at SuperSpeed?&lt;/p&gt;  &lt;p&gt;Here are some ways to determine the operating speed of the USB device:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="#_Make_sure_that"&gt;Make sure that you have USB 3.0-capable hardware&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="#_View_the_device"&gt;View device information in Device Manager&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="#_Look_for_UI"&gt;Look for Windows 8 UI messages&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="#_Use_USBView_to"&gt;Use USBView to view the bus speed&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="#_Determine_bus_speed"&gt;Determine the bus speed programmatically&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="#_Troubleshooting"&gt;Troubleshooting&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;&lt;a name="_Make_sure_that"&gt;&lt;/a&gt;Make sure that you have USB 3.0-capable hardware&lt;/h4&gt;  &lt;p&gt;Typically, newer PCs with USB 3.0 support have both USB 3.0 and USB 2.0 controllers, and both those ports are exposed. The receptacles on USB 3.0 ports are usually blue to distinguish from the receptacles on USB 2.0 ports, which are black. So, if the PC has a blue port, that is a good indication of USB 3.0 support. Note this is not a requirement of the official USB specification, rather a convention adopted by some PC makers. &lt;/p&gt;  &lt;p&gt;Figure 1 shows a typical USB 2.0 port. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62-metablogapi/3288.clip_5F00_image0024_5F00_5A144310.jpg"&gt;&lt;img title="clip_image002[4]" style="margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="clip_image002[4]" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62-metablogapi/2211.clip_5F00_image0024_5F00_thumb_5F00_52F50698.jpg" width="244" height="121" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="center"&gt;Figure 1. USB 2.0 port with a black receptacle&lt;/p&gt;  &lt;p&gt;Figure 2 shows a typical USB 3.0 port.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62-metablogapi/7506.clip_5F00_image0044_5F00_60C74C93.jpg"&gt;&lt;img title="clip_image004[4]" style="margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="clip_image004[4]" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62-metablogapi/6428.clip_5F00_image0044_5F00_thumb_5F00_59A8101B.jpg" width="244" height="122" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="center"&gt;Figure 2. USB 3.0 port with a blue receptacle&lt;/p&gt;  &lt;p&gt;If the PC does not use blue receptacle for the USB 3.0 ports, it might have a USB 3.0 logo (&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62-metablogapi/2318.clip_5F00_image0064_5F00_398D035E.gif"&gt;&lt;img title="clip_image006[4]" style="margin: 0px; display: inline; background-image: none;" border="0" alt="clip_image006[4]" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62-metablogapi/5751.clip_5F00_image0064_5F00_thumb_5F00_1971F6A1.gif" width="43" height="27" /&gt;&lt;/a&gt;) next to the port. &lt;/p&gt;  &lt;p&gt;Figure 3 shows the USB 2.0 logo.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62-metablogapi/1541.clip_5F00_image0084_5F00_4B69972B.jpg"&gt;&lt;img title="clip_image008[4]" style="margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="clip_image008[4]" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62-metablogapi/2112.clip_5F00_image0084_5F00_thumb_5F00_40400CE1.jpg" width="244" height="121" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="center"&gt;Figure 3. USB 2.0 logo&lt;/p&gt;  &lt;p&gt;Figure 4 shows the USB 3.0 logo.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62-metablogapi/7411.clip_5F00_image0104_5F00_0B337DB1.jpg"&gt;&lt;img title="clip_image010[4]" style="margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="clip_image010[4]" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62-metablogapi/1538.clip_5F00_image0104_5F00_thumb_5F00_6B1870F3.jpg" width="244" height="121" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="center"&gt;Figure 4. USB 3.0 logo&lt;/p&gt;  &lt;p&gt;&lt;a name="_View_the_device"&gt;&lt;/a&gt;You should also look for the logo on USB 3.0 devices and cables. Figure 5 shows the USB 3.0 logo on the connector of a USB 3.0 cable.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62-metablogapi/7485.clip_5F00_image0124_5F00_4AFD6436.jpg"&gt;&lt;img title="clip_image012[4]" style="margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="clip_image012[4]" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62-metablogapi/6013.clip_5F00_image0124_5F00_thumb_5F00_2AE25779.jpg" width="244" height="111" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="center"&gt;Figure 5 USB 3.0 logo on USB 3.0 cable&lt;/p&gt;  &lt;h4&gt;View device information in Device Manager&lt;/h4&gt;  &lt;p&gt;Next, confirm that Windows enumerated the host controller as a USB 3.0 controller. To confirm that, open &lt;b&gt;Device Manager&lt;/b&gt; and locate the controller under the &lt;b&gt;Universal Serial Bus controllers&lt;/b&gt; node. If Windows recognized it as a USB 3.0 controller, &lt;b&gt;USB 3.0 eXtensible Host Controller&lt;/b&gt; is appended to the device description as shown in Figure 6. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62-metablogapi/1145.clip_5F00_image0144_5F00_189990B7.gif"&gt;&lt;img title="clip_image014[4]" style="margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="clip_image014[4]" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62-metablogapi/7002.clip_5F00_image0144_5F00_thumb_5F00_787E83F9.gif" width="244" height="35" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="center"&gt;Figure 6. USB 3.0 eXtensible Host Controller in Device Manager&lt;/p&gt;  &lt;h4&gt;&lt;a name="_Determine_whether_the"&gt;&lt;/a&gt;&lt;a name="_Look_for_UI"&gt;&lt;/a&gt;Look for Windows 8 UI messages to determine whether the USB 3.0 device is operating at SuperSpeed &lt;/h4&gt;  &lt;p&gt;To indicate whether the USB 3.0 device is operating at SuperSpeed, Windows 8 shows UI messages in specific places. If the PC has USB 3.0 controller to which a USB 3.0 device is attached, Windows 8 shows &lt;b&gt;Connected to USB 3.0&lt;/b&gt; when the device is operating at SuperSpeed. If the operating speed is lower than SuperSpeed, the message is &lt;b&gt;Device can perform faster when connected to USB 3.0&lt;/b&gt;. &lt;/p&gt;  &lt;p&gt;You can view those UI messages in PC Settings. &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Open the Charms Bar by dragging the cursor to top right of the screen or by pressing Win + C. &lt;/li&gt;    &lt;li&gt;Select &lt;b&gt;Settings&lt;/b&gt; and then &lt;b&gt;Change PC settings&lt;/b&gt;. &lt;/li&gt;    &lt;li&gt;Select the &lt;b&gt;Devices&lt;/b&gt; under &lt;b&gt;PC settings&lt;/b&gt; application. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Figure 7 shows the UI message when the USB 3.0 device is operating at SuperSpeed.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62-metablogapi/1638.clip_5F00_image0164_5F00_2A762484.gif"&gt;&lt;img title="clip_image016[4]" style="margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="clip_image016[4]" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62-metablogapi/7180.clip_5F00_image0164_5F00_thumb_5F00_51443AC4.gif" width="244" height="120" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="center"&gt;Figure 7. PC settings – UI message for a USB 3.0 device that is operating at SuperSpeed&lt;/p&gt;  &lt;p&gt;Figure 8 shows the UI message when the USB device is operating at a bus speed that is lower than SuperSpeed.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62-metablogapi/6332.clip_5F00_image0184_5F00_110E214A.gif"&gt;&lt;img title="clip_image018[4]" style="margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="clip_image018[4]" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62-metablogapi/0564.clip_5F00_image0184_5F00_thumb_5F00_09EEE4D2.gif" width="244" height="120" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="center"&gt;Figure 8. PC settings – UI message for a USB 3.0 device that is operating at a speed lower than SuperSpeed&lt;/p&gt;  &lt;p&gt;You can view similar messages in &lt;b&gt;Devices and Printers&lt;/b&gt;, as shown in figures 9 and 10.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62-metablogapi/5758.clip_5F00_image0204_5F00_7EC55A87.gif"&gt;&lt;img title="clip_image020[4]" style="margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="clip_image020[4]" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62-metablogapi/6320.clip_5F00_image0204_5F00_thumb_5F00_259370C8.gif" width="244" height="178" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="center"&gt;Figure 9. Devices and Printers - UI message for a USB 3.0 device that is operating at SuperSpeed&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62-metablogapi/5342.clip_5F00_image0224_5F00_0578640B.gif"&gt;&lt;img title="clip_image022[4]" style="margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="clip_image022[4]" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62-metablogapi/3288.clip_5F00_image0224_5F00_thumb_5F00_7E592792.gif" width="244" height="172" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="center"&gt;Figure 10. Devices and Printers – UI message for a USB 3.0 device that is operating at a speed lower than SuperSpeed&lt;/p&gt;  &lt;p&gt;If the USB 3.0 device is a storage device, Windows Explorer shows similar messages when the volume label is selected, as shown in figures 11 and 12. Note that the &lt;b&gt;View -&amp;gt; Details&lt;/b&gt; pane must be selected for the message to be visible.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62-metablogapi/0640.clip_5F00_image0244_5F00_5E3E1AD5.gif"&gt;&lt;img title="clip_image024[4]" style="margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="clip_image024[4]" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62-metablogapi/3782.clip_5F00_image0244_5F00_thumb_5F00_701AAEA2.gif" width="244" height="171" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="center"&gt;Figure 11. Windows Explorer - message for a USB 3.0 device that is operating at SuperSpeed&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62-metablogapi/4857.clip_5F00_image0264_5F00_4FFFA1E5.gif"&gt;&lt;img title="clip_image026[4]" style="margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="clip_image026[4]" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62-metablogapi/6318.clip_5F00_image0264_5F00_thumb_5F00_24BB0ADE.gif" width="244" height="171" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="center"&gt;Figure 12. Windows Explorer - UI message for a USB 3.0 device that is operating at a speed lower than SuperSpeed&lt;/p&gt;  &lt;h4&gt;&lt;a name="_Use_USBView_to"&gt;&lt;/a&gt;Use USBView to view device information about the bus speed&lt;/h4&gt;  &lt;p&gt;If you are writing a device driver, the USBView tool might be more useful for verifying the bus speed. The tool is included in the Windows Driver Kit (WDK) 8 Release Preview (RP), which is available for download at &lt;a href="http://msdn.microsoft.com/en-us/windows/hardware/gg454513/"&gt;this Web site&lt;/a&gt;. USBView in this release has been updated to display SuperSpeed information. &lt;/p&gt;  &lt;p&gt;Figure 13 shows a USB 3.0 device operating at SuperSpeed in USBView.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62-metablogapi/6835.clip_5F00_image0284_5F00_56B2AB68.gif"&gt;&lt;img title="clip_image028[4]" style="margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="clip_image028[4]" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62-metablogapi/8154.clip_5F00_image0284_5F00_thumb_5F00_35BF38C1.gif" width="244" height="71" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="center"&gt;Figure 13. USBView – Message for a USB 3.0 device that is operating at SuperSpeed&lt;/p&gt;  &lt;h4&gt;&lt;a name="_Determine_bus_speed"&gt;&lt;/a&gt;Determine the bus speed programmatically&lt;/h4&gt;  &lt;p&gt;If you are a device driver developer, the &lt;a href="http://msdn.microsoft.com/en-us/library/windows/hardware/hh406256(v=VS.85).aspx"&gt;USB driver stack&lt;/a&gt; exposes a new IOCTL, &lt;a href="http://msdn.microsoft.com/en-US/library/windows/hardware/hh450861(v=VS.85).aspx"&gt;IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX_V2&lt;/a&gt;, which you can use to query speed information for USB 3.0 devices.&lt;/p&gt;  &lt;h4&gt;&lt;a name="_Troubleshooting"&gt;&lt;/a&gt;Troubleshooting&lt;/h4&gt;  &lt;p&gt;Here are a few things to try if you find that your USB 3.0 device is capable of operating at SuperSpeed but is operating a lower bus speed:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Make sure that you do not have a USB 2.0 hub between the device and the PC. That is because USB 3.0 devices that are attached to a USB 2.0 hub can only operate at high speed. In this case, either switch to a USB 3.0 hub or attach the device directly to the USB 3.0 port on the PC.&lt;/li&gt;    &lt;li&gt;Ensure that the USB 3.0 hub that your device is attached to appears correctly in Device Manager.&amp;#160; For certain unsupported USB 3.0 hubs, Windows may disable the SuperSpeed portion of the hub and report it as “Non Functional” in Device Manager. &lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;p&gt;Figure 14 shows a non-functional hub in Device Manager.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62-metablogapi/6011.clip_5F00_image0304_5F00_15A42C04.gif"&gt;&lt;img title="clip_image030[4]" style="margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="clip_image030[4]" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62-metablogapi/0243.clip_5F00_image0304_5F00_thumb_5F00_75891F46.gif" width="244" height="74" /&gt;&lt;/a&gt;Figure 14. SuperSpeed USB Hub is not functional&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Make sure that the cable that is used to connect the device is a USB 3.0 cable. It is also possible that the USB 3.0 cable has signal integrity issues. In that case, the device might switch to high speed. If that happens, you must change the USB 3.0 cable.&lt;/li&gt;    &lt;li&gt;Update the firmware for the USB 3.0 device by obtaining the latest version from the manufacturer site. Some USB 3.0 device manufacturers release fixes, for bugs found in the device, as firmware updates.&lt;/li&gt;    &lt;li&gt;Update the firmware for the USB 3.0 controller by obtaining the latest version from the manufacturer site. Some USB 3.0 controller manufacturers release fixes, for bugs found in the controller, as firmware updates.&lt;/li&gt;    &lt;li&gt;Update the BIOS for your system by obtaining the latest version from the manufacturer.&amp;#160; On some motherboards, the BIOS can incorrectly route a device that is connected to a USB 3.0 controller to a USB 2.0 controller. That incorrect routing allows the USB 3.0 device to operate at high speed but not at SuperSpeed. A BIOS update might fix such a problem.&lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;Summary&lt;/h4&gt;  &lt;p&gt;In this blog post, we discussed ways of making sure that you get optimal experience with your USB 3.0 device attached to a USB 3.0 controller on a PC. If you have any questions, please leave us a comment.&lt;/p&gt;  &lt;p&gt;-Sanket Patel&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10324757" width="1" height="1"&gt;</description></item><item><title>New for Windows 8: Problem Descriptions for USB Devices and Hubs in Device Manager</title><link>http://blogs.msdn.com/b/usbcoreblog/archive/2012/06/08/new-for-windows-8-problem-descriptions-for-usb-devices-and-hubs-in-device-manager.aspx</link><pubDate>Fri, 08 Jun 2012 19:10:18 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10317547</guid><dc:creator>USB Blog</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/usbcoreblog/rsscomments.aspx?WeblogPostID=10317547</wfw:commentRss><comments>http://blogs.msdn.com/b/usbcoreblog/archive/2012/06/08/new-for-windows-8-problem-descriptions-for-usb-devices-and-hubs-in-device-manager.aspx#comments</comments><description>&lt;p&gt;Perhaps the most commonly encountered problem with USB devices is enumeration failure. If a USB device fails to enumerate successfully it will appear in Device Manager with a problem code of 43, and will be listed as an “Unknown Device” If Windows was unable to identify the device before it failed enumeration. There are a number of reasons why a USB device can fail to enumerate, however the specific reason for the failure has not been easily discovered without using diagnostic tools such as &lt;a href="http://blogs.msdn.com/b/usbcoreblog/archive/2009/12/21/answering-the-question-what-s-wrong-with-my-device-using-usb-etw.aspx"&gt;USB ETW logging&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Windows 8 will now provide a problem description in Device Manager for USB devices that have failed to enumerate, and for USB hubs that have failed during operation. When one of these failures occurs, the USB device’s status on its “General” property page will display a problem description indicating what the failure was. Below is an example device status for a USB device that failed because it returned an invalid USB configuration descriptor. The problem description is highlighted.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62-metablogapi/3660.image_5F00_62599FD9.png"&gt;&lt;img title="image" style="display: inline; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-62-metablogapi/8055.image_5F00_thumb_5F00_1B0449E7.png" width="263" height="293" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The possible problem descriptions that can be returned for a USB device that failed enumeration in Windows 8 are:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;A request for the USB device descriptor failed.&lt;/li&gt;    &lt;li&gt;The USB set address request failed.&lt;/li&gt;    &lt;li&gt;A USB port reset request failed.&lt;/li&gt;    &lt;li&gt;A previous instance of the USB device was not removed.&lt;/li&gt;    &lt;li&gt;The USB device returned an invalid USB configuration descriptor.&lt;/li&gt;    &lt;li&gt;The USB device returned an invalid USB device descriptor.&lt;/li&gt;    &lt;li&gt;Unable to access the registry.&lt;/li&gt;    &lt;li&gt;A request for the USB configuration descriptor failed.&lt;/li&gt;    &lt;li&gt;A request for the USB device's port status failed.&lt;/li&gt;    &lt;li&gt;The USB device returned an invalid serial number string.&lt;/li&gt;    &lt;li&gt;The USB set SEL request failed.&lt;/li&gt;    &lt;li&gt;A request for the USB BOS descriptor failed.&lt;/li&gt;    &lt;li&gt;A request for the USB device qualifier descriptor failed.&lt;/li&gt;    &lt;li&gt;A request for the USB serial number string descriptor failed.&lt;/li&gt;    &lt;li&gt;A request for the USB language ID string descriptor failed.&lt;/li&gt;    &lt;li&gt;A request for the USB product description string descriptor failed.&lt;/li&gt;    &lt;li&gt;A request for the Microsoft OS extended configuration descriptor failed.&lt;/li&gt;    &lt;li&gt;A request for the Microsoft OS container ID descriptor failed.&lt;/li&gt;    &lt;li&gt;The USB device returned an invalid USB BOS descriptor.&lt;/li&gt;    &lt;li&gt;The USB device returned an invalid USB device qualifier descriptor.&lt;/li&gt;    &lt;li&gt;The USB device returned an invalid USB language ID string descriptor.&lt;/li&gt;    &lt;li&gt;The USB device returned an invalid Microsoft OS container ID descriptor.&lt;/li&gt;    &lt;li&gt;The USB device returned an invalid Microsoft OS extended configuration descriptor.&lt;/li&gt;    &lt;li&gt;The USB device returned an invalid product description string descriptor.&lt;/li&gt;    &lt;li&gt;The SuperSpeed link to the USB device keeps going to an error state SSInactive.&lt;/li&gt;    &lt;li&gt;The SuperSpeed link to the USB device keeps going to an error state Compliance. If the device is removable, remove the device and then disable/enable from device manager to recover.&lt;/li&gt;    &lt;li&gt;The USB device is not compatible with Windows.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The possible problem descriptions for a USB hub failure in Windows 8 are:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;The USB hub returned an invalid port status.&lt;/li&gt;    &lt;li&gt;The USB hub failed a control transfer request.&lt;/li&gt;    &lt;li&gt;The USB hub failed an interrupt transfer request.&lt;/li&gt;    &lt;li&gt;The USB hub failed to reset. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;To resolve these errors a user should follow the steps outlined in the blog post &lt;a href="http://blogs.msdn.com/b/usbcoreblog/archive/2011/10/15/things-to-try-when-your-usb-device-is-an-quot-unknown-device-quot.aspx"&gt;What to Try When Your USB Device is an &amp;quot;Unknown Device&amp;quot;&lt;/a&gt;. A USB device developer encountering any of these errors should investigate further using &lt;a href="http://blogs.msdn.com/b/usbcoreblog/archive/2009/12/21/answering-the-question-what-s-wrong-with-my-device-using-usb-etw.aspx"&gt;USB ETW logging&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;-Martin Borve&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10317547" width="1" height="1"&gt;</description></item></channel></rss>