From 3c7e0ec752c1d2c61b9e8c1233bb904d836b4e4e Mon Sep 17 00:00:00 2001 From: Ron Dreslinski Date: Wed, 11 Oct 2006 19:25:48 -0400 Subject: [PATCH] Fix bus in FS mode. src/mem/bus.cc: Add debugging statement src/mem/bus.hh: Fix implementation of bus for subsequent recvTimings while handling a retry request. src/mem/tport.cc: Rework timing port to retry properly --HG-- extra : convert_revision : fbfb5e8b4a625e49c6cd764da1df46a4f336b1b2 --- src/mem/bus.cc | 1 + src/mem/bus.hh | 16 +++++++++------- src/mem/tport.cc | 38 ++++++++++++++++++++++++-------------- 3 files changed, 34 insertions(+), 21 deletions(-) diff --git a/src/mem/bus.cc b/src/mem/bus.cc index b34944ed7..8dd16874a 100644 --- a/src/mem/bus.cc +++ b/src/mem/bus.cc @@ -173,6 +173,7 @@ Bus::recvTiming(Packet *pkt) port = findPort(pkt->getAddr(), pkt->getSrc()); } else { //Snoop didn't succeed + DPRINTF(Bus, "Adding a retry to RETRY list %i\n", pktPort); addToRetryList(pktPort); return false; } diff --git a/src/mem/bus.hh b/src/mem/bus.hh index a168c3c49..b1cbbe1e3 100644 --- a/src/mem/bus.hh +++ b/src/mem/bus.hh @@ -224,13 +224,15 @@ class Bus : public MemObject port->onRetryList(true); retryList.push_back(port); } else { - // The device was retrying a packet. It didn't work, so we'll leave - // it at the head of the retry list. - inRetry = false; - -/* // We shouldn't be receiving a packet from one port when a different - // one is retrying. - assert(port == retryingPort);*/ + if (port->onRetryList()) { + // The device was retrying a packet. It didn't work, so we'll leave + // it at the head of the retry list. + assert(port == retryList.front()); + inRetry = false; + } + else { + retryList.push_back(port); + } } } diff --git a/src/mem/tport.cc b/src/mem/tport.cc index 528067170..456878d0a 100644 --- a/src/mem/tport.cc +++ b/src/mem/tport.cc @@ -58,15 +58,17 @@ SimpleTimingPort::recvTiming(Packet *pkt) void SimpleTimingPort::recvRetry() { - bool result = true; - - assert(transmitList.size()); - while (result && transmitList.size()) { - result = sendTiming(transmitList.front()); - if (result) - transmitList.pop_front(); + assert(outTiming > 0); + assert(!transmitList.empty()); + if (sendTiming(transmitList.front())) { + transmitList.pop_front(); + outTiming--; + DPRINTF(Bus, "No Longer waiting on retry\n"); + if (!transmitList.empty()) + sendTimingLater(transmitList.front(), 1); } - if (transmitList.size() == 0 && drainEvent) { + + if (transmitList.empty() && drainEvent) { drainEvent->process(); drainEvent = NULL; } @@ -75,20 +77,28 @@ SimpleTimingPort::recvRetry() void SimpleTimingPort::SendEvent::process() { - port->outTiming--; - assert(port->outTiming >= 0); - if (port->transmitList.size()) { + assert(port->outTiming > 0); + if (!port->transmitList.empty() && port->transmitList.front() != packet) { + //We are not the head of the list port->transmitList.push_back(packet); } else if (port->sendTiming(packet)) { // send successful - if (port->transmitList.size() == 0 && port->drainEvent) { + if (port->transmitList.size()) { + port->transmitList.pop_front(); + port->outTiming--; + if (!port->transmitList.empty()) + port->sendTimingLater(port->transmitList.front(), 1); + } + if (port->transmitList.empty() && port->drainEvent) { port->drainEvent->process(); port->drainEvent = NULL; } } else { // send unsuccessful (due to flow control). Will get retry - // callback later; save for then. - port->transmitList.push_back(packet); + // callback later; save for then if not already + DPRINTF(Bus, "Waiting on retry\n"); + if (!(port->transmitList.front() == packet)) + port->transmitList.push_back(packet); } }