• Lukas Wunner's avatar
    PCI: pciehp: Differentiate between surprise and safe removal · 11e87702
    Lukas Wunner authored
    When removing PCI devices below a hotplug bridge, pciehp marks them as
    disconnected if the card is no longer present in the slot or it quiesces
    them if the card is still present (by disabling INTx interrupts, bus
    mastering and SERR# reporting).
    
    To detect whether the card is still present, pciehp checks the Presence
    Detect State bit in the Slot Status register.  The problem with this
    approach is that even if the card is present, the link to it may be
    down, and it that case it would be better to mark the devices as
    disconnected instead of trying to quiesce them.  Moreover, if the card
    in the slot was quickly replaced by another one, the Presence Detect
    State bit would be set, yet trying to quiesce the new card's devices
    would be wrong and the correct thing to do is to mark the previous
    card's devices as disconnected.
    
    Instead of looking at the Presence Detect State bit, it is better to
    differentiate whether the card was surprise removed versus safely
    removed (via sysfs or an Attention Button press).  On surprise removal,
    the devices should be marked as disconnected, whereas on safe removal it
    is correct to quiesce the devices.
    
    The knowledge whether a surprise removal or a safe removal is at hand
    does exist further up in the call stack:  A surprise removal is
    initiated by pciehp_handle_presence_or_link_change(), a safe removal by
    pciehp_handle_disable_request().
    
    Pass that information down to pciehp_unconfigure_device() and use it in
    lieu of the Presence Detect State bit.  While there, add kernel-doc to
    pciehp_unconfigure_device() and pciehp_configure_device().
    Tested-by: default avatarAlexandru Gagniuc <mr.nuke.me@gmail.com>
    Signed-off-by: default avatarLukas Wunner <lukas@wunner.de>
    Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
    Cc: Keith Busch <keith.busch@intel.com>
    11e87702
pciehp.h 8.29 KB