USB 3.0 versus USB 2.0 - a huge disappointment

1. Introduction

For better or worse products based on the USB 2.0 interface became wide spread and used on almost all computer systems.

Relatively new, the USB 3.0 interface promised a large increase in the speed 5gbit/s vs 480mbit/s for USB 2.0 .

Does the increase in raw speed in USB 3.0 interface translate to having much faster products than ones based on USB 2.0 ?!

We have looked very thoroughly through the specifications, did design software and performed tests.

What we found is disappointing - the USB 3.0 products may be faster in some few specific cases, but overall in most other cases would offer the same performance as the USB 2.0 based products.


2. A look at the specs

There are 2 major document for the USB 3.0 interface:
- USB 3.0 specification , provided by USB Implementers forum
- and, xHCI Specification for USB , provided by Intel

A person reading these documents may spend weeks, or months studying these documents.

The overall impression of an outsider may be that the spec developers were in a competition on how to make the interface more complex and more complicated. And they outdid each other!

Only a few terms from USB 2.0 spec like 'ports' and 'pipes/endpoints' match while USB 3.0 spec. introduces a bunch of new and sometimes weird terms like - 'doorbell registers' , 'slot' , 'interrupter' , 'device context' , 'command ring' , 'event ring' ...

By design, USB 2.0 has transactions being accumulated and then starting on a time periods called 'frames' - with a period of 125us (micro-frame). In such a way the interface handles relatively large chunks of data coming with relatively low frequency.

The USB 3.0 spec. does not mention 'frames' and at least 'on paper' a transaction may start at any time.

However the xHCI spec shows:
- in chapter 5.5.1 - Microframe index register
- and, in chapter 6.2.3 - Endpoint context , has the 'Interval' field: The period between consecutive requests to USB endpoint to send/receive data. An Interval value of 0 means a period of 125us.

So, can USB 3.0 transactions start at any time or on every 125us?
The answer will be revealed shortly.


3. A look at the implementation - in drivers

We took a look at the way the specifications were implemented - the way the xHCI drivers from different operating systems or vendors initialize and use the xHCI host controller chip.

The hardware used in the evaluation did include 2 xHCI host cards:
- PCI Express -x1 host controller card , having NEC chip
- ExpressCard host controller , having Renesas chip

The operating systems used in the evaluation did include:
- Windows 7 64bit; the OS does not have native USB 3.0 support; users have to install drivers from vendors;
- Windows 8.1 64bit; the OS does have native USB 3.0 support;
- Linux - Ubuntu 13.10 / 3.11.0 kernel; the OS does have native USB 3.0 support;

Newer drivers, included in the OS - for Windows 8.1 and Linux 3.8.xx and later kernels put everything into a single basket. A single 'interrupter' is used for command transfers ring and device endpoint transfer rings.

Older drivers, provided by vendors - tested in Windows 7 used separate 'interrupters', one for command transfers ring and one for each device endpoint transfer rings.

In our opinion using a single 'interrupter' for all devices may lead to problems with servicing multiple USB devices.

Unfortunately, the better designed drivers by vendors will be made obsolete, replaced by the standard OS included drivers.


4. Speed test - USB 3.0 versus USB 2.0

Going back to the question - can USB 3.0 transactions start at any time or on every 125us? To answer it we did design a test and used the following hardware:
- one USB 2.0 disk device - 2 GBytes size, and one USB 3.0 disk device - 16 GBytes in size
- ExpressCard based xHCI host controller plugged in a notebook

test hardware - USB2 and USB3 disk, ExpressCard USB3 host

Linux OS allows performing USB transactions on user level - we used the following code fragment to build a program and run it on Ubuntu 13.10 :

--------------------------------
fh = open(...);

for (i=0; i<0x10000; i++)
{
   tr.type = GET_DEVICE_DESCRIPTOR;
   tr.len = 0x10;
   ioctl(fh, ...);
}

close(fh)
--------------------------------

A 'device descriptor' is a standard data structure inside every USB device which include - vendor id, product id, device class, power requirements ...

The 64k iterations loop reads 16bytes of the 'device descriptor' of the specific 'open' USB device - either the USB 2.0 disk or the USB 3.0 disk.

Running the app reveals that regardless of the fact that the 16bytes are read from the USB 3.0 device with 5gbit/s speed, the time to complete the 64k loop is about the same as the time for 480mbit/s USB 2.0 device.

This means that the USB 3.0 transactions depend on the start of a 125us 'frame'.

In practical terms a noticeable performance difference between USB 2.0 and USB 3.0 devices will be shown only with specific high data rate, continuously streaming devices.

The above revealed fact puts into a question the USB 3.0 and USB 3.1 interfaces - why design and use 5 or 10gbit/s device when it may perform not much better than USB 2.0 / 480 mbit/s device?!