diff options
author | Stefan Roese <sr@denx.de> | 2018-01-30 11:02:55 +0100 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2018-02-12 18:17:23 +0100 |
commit | 3b61e5121d5c4d0ea79fe90ced8df2fe5cb67dc2 (patch) | |
tree | 43ba1a2f9308a993f08299e2a14c35c44fe246e4 /drivers | |
parent | libata: Fix compile warning with ATA_DEBUG enabled (diff) | |
download | linux-3b61e5121d5c4d0ea79fe90ced8df2fe5cb67dc2.tar.xz linux-3b61e5121d5c4d0ea79fe90ced8df2fe5cb67dc2.zip |
ahci: Add check for device presence (PCIe hot unplug) in ahci_stop_engine()
Exit directly with ENODEV, if the AHCI controller is not available
anymore. Otherwise a delay of 500ms for each port is added to the remove
function while trying to issue a command on the non-existent controller.
Signed-off-by: Stefan Roese <sr@denx.de>
Cc: Tejun Heo <tj@kernel.org>
Signed-off-by: Tejun Heo <tj@kernel.org>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/ata/libahci.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c index a0de7a38430c..7adcf3caabd0 100644 --- a/drivers/ata/libahci.c +++ b/drivers/ata/libahci.c @@ -665,6 +665,16 @@ int ahci_stop_engine(struct ata_port *ap) if ((tmp & (PORT_CMD_START | PORT_CMD_LIST_ON)) == 0) return 0; + /* + * Don't try to issue commands but return with ENODEV if the + * AHCI controller not available anymore (e.g. due to PCIe hot + * unplugging). Otherwise a 500ms delay for each port is added. + */ + if (tmp == 0xffffffff) { + dev_err(ap->host->dev, "AHCI controller unavailable!\n"); + return -ENODEV; + } + /* setting HBA to idle */ tmp &= ~PORT_CMD_START; writel(tmp, port_mmio + PORT_CMD); |