|
@@ -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);
|