diff options
author | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2011-12-14 13:02:09 +0100 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2011-12-14 13:02:09 +0100 |
commit | 704867ede0c3645075ff3438d1a4fd4977abaa8d (patch) | |
tree | fc89b31764132dc1b07e0af3e53219005cfb8f95 /drivers/ata/libata-eh.c | |
parent | Merge branch 'regmap/irq' into regmap-next (diff) | |
parent | MFD: DA9052/53 MFD core module add SPI support v2 (diff) | |
download | linux-704867ede0c3645075ff3438d1a4fd4977abaa8d.tar.xz linux-704867ede0c3645075ff3438d1a4fd4977abaa8d.zip |
Merge branch 'mfd/da9052' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/misc into regmap-next
Diffstat (limited to 'drivers/ata/libata-eh.c')
-rw-r--r-- | drivers/ata/libata-eh.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c index f22957c2769a..a9b282038000 100644 --- a/drivers/ata/libata-eh.c +++ b/drivers/ata/libata-eh.c @@ -2883,7 +2883,7 @@ int ata_eh_reset(struct ata_link *link, int classify, sata_scr_read(link, SCR_STATUS, &sstatus)) rc = -ERESTART; - if (rc == -ERESTART || try >= max_tries) { + if (try >= max_tries) { /* * Thaw host port even if reset failed, so that the port * can be retried on the next phy event. This risks @@ -2909,6 +2909,16 @@ int ata_eh_reset(struct ata_link *link, int classify, ata_eh_acquire(ap); } + /* + * While disks spinup behind PMP, some controllers fail sending SRST. + * They need to be reset - as well as the PMP - before retrying. + */ + if (rc == -ERESTART) { + if (ata_is_host_link(link)) + ata_eh_thaw_port(ap); + goto out; + } + if (try == max_tries - 1) { sata_down_spd_limit(link, 0); if (slave) |