tport.cc (3241:76bb7218674f) tport.cc (3263:e532da529c9f)
1/*
2 * Copyright (c) 2006 The Regents of The University of Michigan
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met: redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer;

--- 44 unchanged lines hidden (view full) ---

53 sendTimingLater(pkt, latency);
54 }
55 return true;
56}
57
58void
59SimpleTimingPort::recvRetry()
60{
1/*
2 * Copyright (c) 2006 The Regents of The University of Michigan
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met: redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer;

--- 44 unchanged lines hidden (view full) ---

53 sendTimingLater(pkt, latency);
54 }
55 return true;
56}
57
58void
59SimpleTimingPort::recvRetry()
60{
61 bool result = true;
62
63 assert(transmitList.size());
64 while (result && transmitList.size()) {
65 result = sendTiming(transmitList.front());
66 if (result)
67 transmitList.pop_front();
61 assert(outTiming > 0);
62 assert(!transmitList.empty());
63 if (sendTiming(transmitList.front())) {
64 transmitList.pop_front();
65 outTiming--;
66 DPRINTF(Bus, "No Longer waiting on retry\n");
67 if (!transmitList.empty())
68 sendTimingLater(transmitList.front(), 1);
68 }
69 }
69 if (transmitList.size() == 0 && drainEvent) {
70
71 if (transmitList.empty() && drainEvent) {
70 drainEvent->process();
71 drainEvent = NULL;
72 }
73}
74
75void
76SimpleTimingPort::SendEvent::process()
77{
72 drainEvent->process();
73 drainEvent = NULL;
74 }
75}
76
77void
78SimpleTimingPort::SendEvent::process()
79{
78 port->outTiming--;
79 assert(port->outTiming >= 0);
80 if (port->transmitList.size()) {
80 assert(port->outTiming > 0);
81 if (!port->transmitList.empty() && port->transmitList.front() != packet) {
82 //We are not the head of the list
81 port->transmitList.push_back(packet);
82 } else if (port->sendTiming(packet)) {
83 // send successful
83 port->transmitList.push_back(packet);
84 } else if (port->sendTiming(packet)) {
85 // send successful
84 if (port->transmitList.size() == 0 && port->drainEvent) {
86 if (port->transmitList.size()) {
87 port->transmitList.pop_front();
88 port->outTiming--;
89 if (!port->transmitList.empty())
90 port->sendTimingLater(port->transmitList.front(), 1);
91 }
92 if (port->transmitList.empty() && port->drainEvent) {
85 port->drainEvent->process();
86 port->drainEvent = NULL;
87 }
88 } else {
89 // send unsuccessful (due to flow control). Will get retry
93 port->drainEvent->process();
94 port->drainEvent = NULL;
95 }
96 } else {
97 // send unsuccessful (due to flow control). Will get retry
90 // callback later; save for then.
91 port->transmitList.push_back(packet);
98 // callback later; save for then if not already
99 DPRINTF(Bus, "Waiting on retry\n");
100 if (!(port->transmitList.front() == packet))
101 port->transmitList.push_back(packet);
92 }
93}
94
95
96unsigned int
97SimpleTimingPort::drain(Event *de)
98{
99 if (outTiming == 0 && transmitList.size() == 0)
100 return 0;
101 drainEvent = de;
102 return 1;
103}
102 }
103}
104
105
106unsigned int
107SimpleTimingPort::drain(Event *de)
108{
109 if (outTiming == 0 && transmitList.size() == 0)
110 return 0;
111 drainEvent = de;
112 return 1;
113}