Commit fccb6ea5 authored by Tejun Heo's avatar Tejun Heo Committed by Jeff Garzik

libata: clear HOTPLUG flag after a reset

ATA_EHI_HOTPLUGGED is a hint for reset functions indicating the the
port might have gone through hotplug/unplug just before entering EH.
Reset functions modify their behaviors a bit to handle the situation
better - e.g. using longer debouncing delay.

Currently, once HOTPLUG is set, it isn't cleared till the end of EH.
This is unnecessary and makes EH take longer.  Clear the HOTPLUGGED
flag after a reset try (successful or not).
Signed-off-by: default avatarTejun Heo <htejun@gmail.com>
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent f8f1e1cc
...@@ -1714,7 +1714,7 @@ static int ata_eh_reset(struct ata_port *ap, int classify, ...@@ -1714,7 +1714,7 @@ static int ata_eh_reset(struct ata_port *ap, int classify,
} else } else
ata_port_printk(ap, KERN_ERR, ata_port_printk(ap, KERN_ERR,
"prereset failed (errno=%d)\n", rc); "prereset failed (errno=%d)\n", rc);
return rc; goto out;
} }
} }
...@@ -1727,7 +1727,8 @@ static int ata_eh_reset(struct ata_port *ap, int classify, ...@@ -1727,7 +1727,8 @@ static int ata_eh_reset(struct ata_port *ap, int classify,
/* prereset told us not to reset, bang classes and return */ /* prereset told us not to reset, bang classes and return */
for (i = 0; i < ATA_MAX_DEVICES; i++) for (i = 0; i < ATA_MAX_DEVICES; i++)
classes[i] = ATA_DEV_NONE; classes[i] = ATA_DEV_NONE;
return 0; rc = 0;
goto out;
} }
/* did prereset() screw up? if so, fix up to avoid oopsing */ /* did prereset() screw up? if so, fix up to avoid oopsing */
...@@ -1763,7 +1764,8 @@ static int ata_eh_reset(struct ata_port *ap, int classify, ...@@ -1763,7 +1764,8 @@ static int ata_eh_reset(struct ata_port *ap, int classify,
ata_port_printk(ap, KERN_ERR, ata_port_printk(ap, KERN_ERR,
"follow-up softreset required " "follow-up softreset required "
"but no softreset avaliable\n"); "but no softreset avaliable\n");
return -EINVAL; rc = -EINVAL;
goto out;
} }
ata_eh_about_to_do(ap, NULL, ATA_EH_RESET_MASK); ata_eh_about_to_do(ap, NULL, ATA_EH_RESET_MASK);
...@@ -1773,7 +1775,8 @@ static int ata_eh_reset(struct ata_port *ap, int classify, ...@@ -1773,7 +1775,8 @@ static int ata_eh_reset(struct ata_port *ap, int classify,
classes[0] == ATA_DEV_UNKNOWN) { classes[0] == ATA_DEV_UNKNOWN) {
ata_port_printk(ap, KERN_ERR, ata_port_printk(ap, KERN_ERR,
"classification failed\n"); "classification failed\n");
return -EINVAL; rc = -EINVAL;
goto out;
} }
} }
...@@ -1818,7 +1821,9 @@ static int ata_eh_reset(struct ata_port *ap, int classify, ...@@ -1818,7 +1821,9 @@ static int ata_eh_reset(struct ata_port *ap, int classify,
ata_eh_done(ap, NULL, ehc->i.action & ATA_EH_RESET_MASK); ata_eh_done(ap, NULL, ehc->i.action & ATA_EH_RESET_MASK);
ehc->i.action |= ATA_EH_REVALIDATE; ehc->i.action |= ATA_EH_REVALIDATE;
} }
out:
/* clear hotplug flag */
ehc->i.flags &= ~ATA_EHI_HOTPLUGGED;
return rc; return rc;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment