Why does Windows show "This device can perform faster" notification if I connect it clumsily?
I noticed that on both Windows XP and 7 (and 2 different computers respectively) I could manage to get that "This device can perform faster if you connect it to a high-speed USB 2.0 port" notification to pop up if I connect the cable very slowly (or struggle a bit doing it with just one hand). If I connect it quickly enough or normally, with both hands, there is no notification. In either case, all such devices appear to function normally.
What I think happens is that the contact between wires gets interrupted for enough time during slow/clumsy connection that the USB controller thinks it's not 2.0 but slower. But why does it think so? Or why does it not just say "You are bad at connecting cables, please unplug and try again"?
The message refers to negotiating old full speed (FS) data rate of 12 Mbit/s, instead of the high speed (HS) data rate which is 480 Mbit/s. It must be really difficult to get this effect from a USB2 port. USB2.0 HS protocol gets established after a fairly complicated negotiation between a device and host, because initially every HS devices acts as a FS device.
The normal process is as follows:
HS-capable device pulls up the D+ line after it gets VBUS signal with 1-1.5kΩ resistor to 3.3V. Just as a FS device would do.
Host port detects the D+=high, and after a minimum 100ms de-bouncing delay, the host asserts USB_RESET state on the bus, driving both D+ and D- lines to ground with 45Ω drivers for 10 or 50ms.
If the device is FS, it does nothing and waits until the end of USB_RESET.
If the device is HS, it would drive D- high using HS driver (18mA source) for about 1ms. This will create a pulse with amplitude about 800mV (18ma into 45Ω load) called "Chirp-K";
Upon detection of the END of Chirp-K, if the host is capable of HS mode, it drives this signal back (same 18mA into own 45Ω load), now for about 50µs. If it is a FS host, it ignores the Chirp-K, and proceeds as FS.
Then, if the host is capable of HS mode, it switches its drive into D+ wire, forming "Chirp-J", again for 50µs;
The host repeats this alternating 50µs pattern for the entire duration of the USB_RESET state (10ms on hub ports, 50ms on root hub ports);
After three alternating chirp-K/J, the device recognizes that the host is HS, and switches into HS mode itself. This implies turning on HS termination on the device end, which makes the total wire resistance to 22Ω, and the chirp signal amplitude drops to 400mV, to a standard HS signaling level.
Host proceeds with HS start-of-frame (SOF) packets, and starts enumeration process in HS mode.
Now it is anyone's guess which part of wiggling did break this protocol, and made the host to mark the port as FS.
When you plug in a device in a USB2 port, the computer first tries to negotiate a connection using the USB2 data protocol.
When that fails, it tries again using the USB1 data protocol.
My best guess is that the physical connection (due to wiggling the contacts) is not stable yet during the USB2 negotiation. So it falls back to USB1, even though the device is a USB2 device.
Funny enough Windows does realize that the device should be capable of USB2 speed (information it gets from the driver) and so Windows concludes that the USB port you plugged it in to was a slow USB1 port. Windows doesn't seem to check whether the port itself is USB2 capable.
And that is why you get the somewhat misleading error-message.
P.S. Just tried it myself with a Windows 10 machine: Same effect there.