• S
    nvme-pci: harden drive presence detect in nvme_dev_disable() · b98235d3
    Stefan Roese 提交于
    On our ZynqMP system we observe, that a NVMe drive that resets itself
    while doing a firmware update causes a Kernel crash like this:
    
    [ 67.720772] pcieport 0000:02:02.0: pciehp: Slot(2): Link Down
    [ 67.720783] pcieport 0000:02:02.0: pciehp: Slot(2): Card not present
    [ 67.720795] nvme 0000:04:00.0: PME# disabled
    [ 67.720849] Internal error: synchronous external abort: 96000010 [#1] PREEMPT SMP
    [ 67.720853] nwl-pcie fd0e0000.pcie: Slave error
    
    Analysis: When nvme_dev_disable() is called because of this PCIe hotplug
    event, pci_is_enabled() is still true. And accessing the NVMe drive
    which is currently not available as it's in reboot process causes this
    "synchronous external abort" on this ARM64 platform.
    
    This patch adds the pci_device_is_present() check as well, which returns
    false in this "Card not present" hot-plug case. With this change, the
    NVMe driver does not try to access the NVMe registers any more and the
    FW update finishes without any problems.
    Signed-off-by: NStefan Roese <sr@denx.de>
    Signed-off-by: NChristoph Hellwig <hch@lst.de>
    b98235d3
pci.c 91.6 KB