diff options
Diffstat (limited to 'drivers/block/aoe/aoecmd.c')
-rw-r--r-- | drivers/block/aoe/aoecmd.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/drivers/block/aoe/aoecmd.c b/drivers/block/aoe/aoecmd.c index 621fdbbc4cd..c0bdc1fe21f 100644 --- a/drivers/block/aoe/aoecmd.c +++ b/drivers/block/aoe/aoecmd.c | |||
@@ -461,8 +461,15 @@ calc_rttavg(struct aoedev *d, int rtt) | |||
461 | register long n; | 461 | register long n; |
462 | 462 | ||
463 | n = rtt; | 463 | n = rtt; |
464 | if (n < MINTIMER) | 464 | if (n < 0) { |
465 | n = MINTIMER; | 465 | n = -rtt; |
466 | if (n < MINTIMER) | ||
467 | n = MINTIMER; | ||
468 | else if (n > MAXTIMER) | ||
469 | n = MAXTIMER; | ||
470 | d->mintimer += (n - d->mintimer) >> 1; | ||
471 | } else if (n < d->mintimer) | ||
472 | n = d->mintimer; | ||
466 | else if (n > MAXTIMER) | 473 | else if (n > MAXTIMER) |
467 | n = MAXTIMER; | 474 | n = MAXTIMER; |
468 | 475 | ||
@@ -498,8 +505,10 @@ aoecmd_ata_rsp(struct sk_buff *skb) | |||
498 | 505 | ||
499 | spin_lock_irqsave(&d->lock, flags); | 506 | spin_lock_irqsave(&d->lock, flags); |
500 | 507 | ||
501 | f = getframe(d, be32_to_cpu(hin->tag)); | 508 | n = be32_to_cpu(hin->tag); |
509 | f = getframe(d, n); | ||
502 | if (f == NULL) { | 510 | if (f == NULL) { |
511 | calc_rttavg(d, -tsince(n)); | ||
503 | spin_unlock_irqrestore(&d->lock, flags); | 512 | spin_unlock_irqrestore(&d->lock, flags); |
504 | snprintf(ebuf, sizeof ebuf, | 513 | snprintf(ebuf, sizeof ebuf, |
505 | "%15s e%d.%d tag=%08x@%08lx\n", | 514 | "%15s e%d.%d tag=%08x@%08lx\n", |
@@ -724,6 +733,7 @@ aoecmd_cfg_rsp(struct sk_buff *skb) | |||
724 | return; | 733 | return; |
725 | } | 734 | } |
726 | d->flags |= DEVFL_PAUSE; /* force pause */ | 735 | d->flags |= DEVFL_PAUSE; /* force pause */ |
736 | d->mintimer = MINTIMER; | ||
727 | d->fw_ver = be16_to_cpu(ch->fwver); | 737 | d->fw_ver = be16_to_cpu(ch->fwver); |
728 | 738 | ||
729 | /* check for already outstanding ataid */ | 739 | /* check for already outstanding ataid */ |