Only issue responses if we aren;t already blocked
[gem5.git] / src / dev / io_device.cc
index 660efabfde71cf13e205c9624548a213c58d9f52..408d8de3edd6e09034ad50f1c9d7529db44cd10e 100644 (file)
@@ -29,6 +29,7 @@
  *          Nathan Binkert
  */
 
+#include "base/chunk_generator.hh"
 #include "base/trace.hh"
 #include "dev/io_device.hh"
 #include "sim/builder.hh"
 
 
 PioPort::PioPort(PioDevice *dev, System *s, std::string pname)
-    : Port(dev->name() + pname), device(dev), sys(s),
-      outTiming(0), drainEvent(NULL)
+    : SimpleTimingPort(dev->name() + pname), device(dev)
 { }
 
 
 Tick
 PioPort::recvAtomic(Packet *pkt)
 {
-    return device->recvAtomic(pkt);
-}
-
-void
-PioPort::recvFunctional(Packet *pkt)
-{
-    device->recvAtomic(pkt);
+    return pkt->isRead() ? device->read(pkt) : device->write(pkt);
 }
 
 void
@@ -61,71 +55,6 @@ PioPort::getDeviceAddressRanges(AddrRangeList &resp, AddrRangeList &snoop)
 }
 
 
-void
-PioPort::recvRetry()
-{
-    bool result = true;
-    while (result && transmitList.size()) {
-        result = Port::sendTiming(transmitList.front());
-        if (result)
-            transmitList.pop_front();
-    }
-   if (transmitList.size() == 0 && drainEvent) {
-       drainEvent->process();
-       drainEvent = NULL;
-   }
-}
-
-void
-PioPort::SendEvent::process()
-{
-    port->outTiming--;
-    assert(port->outTiming >= 0);
-    if (port->Port::sendTiming(packet))
-       if (port->transmitList.size() == 0 && port->drainEvent) {
-           port->drainEvent->process();
-           port->drainEvent = NULL;
-       }
-       return;
-
-    port->transmitList.push_back(packet);
-}
-
-void
-PioPort::resendNacked(Packet *pkt) {
-    pkt->reinitNacked();
-    if (transmitList.size()) {
-         transmitList.push_front(pkt);
-    } else {
-        if (!Port::sendTiming(pkt))
-            transmitList.push_front(pkt);
-    }
-};
-
-
-bool
-PioPort::recvTiming(Packet *pkt)
-{
-    if (pkt->result == Packet::Nacked) {
-        resendNacked(pkt);
-    } else {
-        Tick latency = device->recvAtomic(pkt);
-        // turn packet around to go back to requester
-        pkt->makeTimingResponse();
-        sendTiming(pkt, latency);
-    }
-    return true;
-}
-
-unsigned int
-PioPort::drain(Event *de)
-{
-    if (outTiming == 0 && transmitList.size() == 0)
-        return 0;
-    drainEvent = de;
-    return 1;
-}
-
 PioDevice::~PioDevice()
 {
     if (pioPort)