mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-19 02:04:19 +08:00
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: Tejun Heo <htejun@gmail.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
This commit is contained in:
parent
f8f1e1cc0c
commit
fccb6ea5c2
@ -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,
|
|||||||
/* 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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user