]> git.baikalelectronics.ru Git - kernel.git/commit
nvme-pci: harden drive presence detect in nvme_dev_disable()
authorStefan Roese <sr@denx.de>
Fri, 6 May 2022 10:15:34 +0000 (12:15 +0200)
committerChristoph Hellwig <hch@lst.de>
Mon, 16 May 2022 06:07:19 +0000 (08:07 +0200)
commit9de6067a527e512fa0e815ed30c5e5c215feb46c
tree881a557da4c5f25064526fc901e34fd1bbb12ab9
parent4fc2980b7151b463448f5b4b0cac7ddf3ded535d
nvme-pci: harden drive presence detect in nvme_dev_disable()

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: Stefan Roese <sr@denx.de>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/nvme/host/pci.c