From a139e4394d473ce1927d8f800640cf9688c70652 Mon Sep 17 00:00:00 2001
From: Gabe Black <gblack@eecs.umich.edu>
Date: Wed, 11 Oct 2006 00:26:21 -0400
Subject: Make the bus work if the other sides recvRetry doesn't call
 sendTiming for some reason.

--HG--
extra : convert_revision : e722ddb0354a5c021dc7c44a3e2f0a64e962442b
---
 src/mem/bus.cc | 21 ++++++++++++++++++---
 1 file changed, 18 insertions(+), 3 deletions(-)

(limited to 'src')

diff --git a/src/mem/bus.cc b/src/mem/bus.cc
index 03c1a4209..6065ee1f1 100644
--- a/src/mem/bus.cc
+++ b/src/mem/bus.cc
@@ -214,9 +214,24 @@ Bus::recvRetry(int id)
         retryList.front()->sendRetry();
         // If inRetry is still true, sendTiming wasn't called
         if (inRetry)
-            panic("Port %s didn't call sendTiming in it's recvRetry\n",\
-                    retryList.front()->getPeer()->name());
-        //assert(!inRetry);
+        {
+            retryList.front()->onRetryList(false);
+            retryList.pop_front();
+            inRetry = false;
+
+            //Bring tickNextIdle up to the present
+            while (tickNextIdle < curTick)
+                tickNextIdle += clock;
+
+            //Burn a cycle for the missed grant.
+            tickNextIdle += clock;
+
+            if (!busIdle.scheduled()) {
+                busIdle.schedule(tickNextIdle);
+            } else {
+                busIdle.reschedule(tickNextIdle);
+            }
+        }
     }
 }
 
-- 
cgit v1.2.3