| From 6868225e3e92399068be9a5f1635752d91012ad5 Mon Sep 17 00:00:00 2001 |
| From: Lin Ming <ming.m.lin@intel.com> |
| Date: Thu, 3 May 2012 22:15:07 +0800 |
| Subject: libata: skip old error history when counting probe trials |
| |
| From: Lin Ming <ming.m.lin@intel.com> |
| |
| commit 6868225e3e92399068be9a5f1635752d91012ad5 upstream. |
| |
| Commit d902747("[libata] Add ATA transport class") introduced |
| ATA_EFLAG_OLD_ER to mark entries in the error ring as cleared. |
| |
| But ata_count_probe_trials_cb() didn't check this flag and it still |
| counts the old error history. So wrong probe trials count is returned |
| and it causes problem, for example, SATA link speed is slowed down from |
| 3.0Gbps to 1.5Gbps. |
| |
| Fix it by checking ATA_EFLAG_OLD_ER in ata_count_probe_trials_cb(). |
| |
| Signed-off-by: Lin Ming <ming.m.lin@intel.com> |
| Signed-off-by: Jeff Garzik <jgarzik@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/ata/libata-eh.c | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/ata/libata-eh.c |
| +++ b/drivers/ata/libata-eh.c |
| @@ -3487,7 +3487,8 @@ static int ata_count_probe_trials_cb(str |
| u64 now = get_jiffies_64(); |
| int *trials = void_arg; |
| |
| - if (ent->timestamp < now - min(now, interval)) |
| + if ((ent->eflags & ATA_EFLAG_OLD_ER) || |
| + (ent->timestamp < now - min(now, interval))) |
| return -1; |
| |
| (*trials)++; |