Skip to contentSkip to conversation

ahci: Add check for device presence (PCIe hot unplug) in ahci_stop_engine()

PATCH Applied Stefan Roese 2 participants 2 messages Jan 30, 2018 – Feb 12, 2018 libata

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 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.

---
 drivers/ata/libahci.c | 10 ++++++++++
 1 file changed, 10 insertions(+)
drivers/ata/libahci.c +10 -0
index a0de7a38430c..7adcf3caabd0 100644
@@ -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);
Signature · 1 line
2.16.1
Applied
#1 lore raw
Quoted 6 lines · Stefan Roese

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.

Applied to libata/for-4.16-fixes.

Thanks.

Signature · 1 line
tejun