• Rafael J. Wysocki's avatar
    ACPI / hotplug / PCI: Check for new devices on enabled slots · 4ebe3450
    Rafael J. Wysocki authored
    The current implementation of acpiphp_check_bridge() is pretty dumb:
     - It enables a slot if it's not enabled and the slot status is
       ACPI_STA_ALL.
     - It disables a slot if it's enabled and the slot status is not
       ACPI_STA_ALL.
    
    This behavior is not sufficient to handle the Thunderbolt daisy
    chaining case properly, however, because in that case the bus
    behind the already enabled slot needs to be rescanned for new
    devices.
    
    For this reason, modify acpiphp_check_bridge() so that slots are
    disabled and stopped if they are not in the ACPI_STA_ALL state.
    
    For slots in the ACPI_STA_ALL state, devices behind them that don't
    respond are trimmed using a new function, trim_stale_devices(),
    introduced specifically for this purpose.  That function walks
    the given bus and checks each device on it.  If the device doesn't
    respond, it is assumed to be gone and is removed.
    
    Once all of the stale devices directy behind the slot have been
    removed, acpiphp_check_bridge() will start looking for new devices
    that might have appeared on the given bus.  It will do that even if
    the slot is already enabled (SLOT_ENABLED is set for it).
    
    In addition to that, make the bus check notification ignore
    SLOT_ENABLED and go for enable_device() directly if bridge is NULL,
    so that devices behind the slot are re-enumerated in that case too.
    
    This change is based on earlier patches from Kirill A Shutemov
    and Mika Westerberg.
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    Tested-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
    4ebe3450
acpiphp_glue.c 27.4 KB