Only issue responses if we aren;t already blocked
[gem5.git] / src / mem / tport.cc
index 55c301c87f9c2e185ddc83fb83c9fdb2aebe50d3..528067170566c6c9bca20541fbbbd1aa464bacb9 100644 (file)
@@ -47,9 +47,11 @@ SimpleTimingPort::recvTiming(Packet *pkt)
     // if we ever added it back.
     assert(pkt->result != Packet::Nacked);
     Tick latency = recvAtomic(pkt);
-    // turn packet around to go back to requester
-    pkt->makeTimingResponse();
-    sendTimingLater(pkt, latency);
+    // turn packet around to go back to requester if response expected
+    if (pkt->needsResponse()) {
+        pkt->makeTimingResponse();
+        sendTimingLater(pkt, latency);
+    }
     return true;
 }
 
@@ -57,6 +59,8 @@ void
 SimpleTimingPort::recvRetry()
 {
     bool result = true;
+
+    assert(transmitList.size());
     while (result && transmitList.size()) {
         result = sendTiming(transmitList.front());
         if (result)
@@ -73,8 +77,10 @@ SimpleTimingPort::SendEvent::process()
 {
     port->outTiming--;
     assert(port->outTiming >= 0);
-    if (port->sendTiming(packet)) {
-        // send successfule
+    if (port->transmitList.size()) {
+        port->transmitList.push_back(packet);
+    } else if (port->sendTiming(packet)) {
+        // send successful
         if (port->transmitList.size() == 0 && port->drainEvent) {
             port->drainEvent->process();
             port->drainEvent = NULL;