• Elric Fu's avatar
    USB: fix bug of device descriptor got from superspeed device · d8aec3db
    Elric Fu authored
    When the Seagate Goflex USB3.0 device is attached to VIA xHCI
    host, sometimes the device will downgrade mode to high speed.
    By the USB analyzer, I found the device finished the link
    training process and worked at superspeed mode. But the device
    descriptor got from the device shows the device works at 2.1.
    It is very strange and seems like the device controller of
    Seagate Goflex has a little confusion.
    
    The first 8 bytes of device descriptor should be:
    12 01 00 03 00 00 00 09
    
    But the first 8 bytes of wrong device descriptor are:
    12 01 10 02 00 00 00 40
    
    The wrong device descriptor caused the initialization of mass
    storage failed. After a while, the device would be recognized
    as a high speed device and works fine.
    
    This patch will warm reset the device to fix the issue after
    finding the bcdUSB field of device descriptor isn't 0x0300
    but the speed mode of device is superspeed.
    
    This patch should be backported to kernels as old as 3.2, or ones that
    contain the commit 75d7cf72 "usbcore:
    refine warm reset logic".
    Signed-off-by: default avatarElric Fu <elricfu1@gmail.com>
    Acked-by: default avatarAndiry Xu <Andiry.Xu@amd.com>
    Acked-by: default avatarSergei Shtylyov <sshtylyov@mvista.com>
    Signed-off-by: default avatarSarah Sharp <sarah.a.sharp@linux.intel.com>
    Cc: stable@vger.kernel.org
    d8aec3db
hub.c 120 KB