• Mathias Nyman's avatar
    usb: hub: Fix usb enumeration issue due to address0 race · 6ae6dc22
    Mathias Nyman authored
    xHC hardware can only have one slot in default state with address 0
    waiting for a unique address at a time, otherwise "undefined behavior
    may occur" according to xhci spec 5.4.3.4
    
    The address0_mutex exists to prevent this across both xhci roothubs.
    
    If hub_port_init() fails, it may unlock the mutex and exit with a xhci
    slot in default state. If the other xhci roothub calls hub_port_init()
    at this point we end up with two slots in default state.
    
    Make sure the address0_mutex protects the slot default state across
    hub_port_init() retries, until slot is addressed or disabled.
    
    Note, one known minor case is not fixed by this patch.
    If device needs to be reset during resume, but fails all hub_port_init()
    retries in usb_reset_and_verify_device(), then it's possible the slot is
    still left in default state when address0_mutex is unlocked.
    
    Cc: <stable@vger.kernel.org>
    Fixes: 638139eb ("usb: hub: allow to process more usb hub events in parallel")
    Signed-off-by: default avatarMathias Nyman <mathias.nyman@linux.intel.com>
    Link: https://lore.kernel.org/r/20211115221630.871204-1-mathias.nyman@linux.intel.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    6ae6dc22
hub.c 178 KB