aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ata/libata-eh.c
diff options
context:
space:
mode:
authorTejun Heo <htejun@gmail.com>2007-10-09 02:06:10 -0400
committerJeff Garzik <jeff@garzik.org>2007-10-12 14:55:47 -0400
commitafaa5c373d2c49ee4865847031b82f1377f609d0 (patch)
tree785203bd4538d2e3c36622ebc2eac93652c7e19e /drivers/ata/libata-eh.c
parent2b789108fc1dcba22050a7e6e29ae5ebaea427dd (diff)
libata: implement ATA_PFLAG_RESETTING
Implement ATA_PFLAG_RESETTING. This flag is set while reset is in progress. It's set before prereset is called and cleared after reset fails or postreset is finished. This flag itself doesn't have any function. It will be used by LLDs to tell whether reset is in progress if it needs to behave differently during reset. Signed-off-by: Tejun Heo <htejun@gmail.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to 'drivers/ata/libata-eh.c')
-rw-r--r--drivers/ata/libata-eh.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
index c0e9a42e6ae7..1f84e40fa6ae 100644
--- a/drivers/ata/libata-eh.c
+++ b/drivers/ata/libata-eh.c
@@ -2063,6 +2063,7 @@ int ata_eh_reset(struct ata_link *link, int classify,
2063 ata_prereset_fn_t prereset, ata_reset_fn_t softreset, 2063 ata_prereset_fn_t prereset, ata_reset_fn_t softreset,
2064 ata_reset_fn_t hardreset, ata_postreset_fn_t postreset) 2064 ata_reset_fn_t hardreset, ata_postreset_fn_t postreset)
2065{ 2065{
2066 struct ata_port *ap = link->ap;
2066 struct ata_eh_context *ehc = &link->eh_context; 2067 struct ata_eh_context *ehc = &link->eh_context;
2067 unsigned int *classes = ehc->classes; 2068 unsigned int *classes = ehc->classes;
2068 int verbose = !(ehc->i.flags & ATA_EHI_QUIET); 2069 int verbose = !(ehc->i.flags & ATA_EHI_QUIET);
@@ -2071,9 +2072,14 @@ int ata_eh_reset(struct ata_link *link, int classify,
2071 unsigned long deadline; 2072 unsigned long deadline;
2072 unsigned int action; 2073 unsigned int action;
2073 ata_reset_fn_t reset; 2074 ata_reset_fn_t reset;
2075 unsigned long flags;
2074 int rc; 2076 int rc;
2075 2077
2076 /* about to reset */ 2078 /* about to reset */
2079 spin_lock_irqsave(ap->lock, flags);
2080 ap->pflags |= ATA_PFLAG_RESETTING;
2081 spin_unlock_irqrestore(ap->lock, flags);
2082
2077 ata_eh_about_to_do(link, NULL, ehc->i.action & ATA_EH_RESET_MASK); 2083 ata_eh_about_to_do(link, NULL, ehc->i.action & ATA_EH_RESET_MASK);
2078 2084
2079 /* Determine which reset to use and record in ehc->i.action. 2085 /* Determine which reset to use and record in ehc->i.action.
@@ -2231,6 +2237,11 @@ int ata_eh_reset(struct ata_link *link, int classify,
2231 out: 2237 out:
2232 /* clear hotplug flag */ 2238 /* clear hotplug flag */
2233 ehc->i.flags &= ~ATA_EHI_HOTPLUGGED; 2239 ehc->i.flags &= ~ATA_EHI_HOTPLUGGED;
2240
2241 spin_lock_irqsave(ap->lock, flags);
2242 ap->pflags &= ~ATA_PFLAG_RESETTING;
2243 spin_unlock_irqrestore(ap->lock, flags);
2244
2234 return rc; 2245 return rc;
2235} 2246}
2236 2247