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} |