io_device.cc (5539:6a27bc3fc267) io_device.cc (5606:6da7a58b0bc8)
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;

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

112 DPRINTF(DMA, "Received nacked %s addr %#x\n",
113 pkt->cmdString(), pkt->getAddr());
114
115 if (backoffTime < device->minBackoffDelay)
116 backoffTime = device->minBackoffDelay;
117 else if (backoffTime < device->maxBackoffDelay)
118 backoffTime <<= 1;
119
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;

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

112 DPRINTF(DMA, "Received nacked %s addr %#x\n",
113 pkt->cmdString(), pkt->getAddr());
114
115 if (backoffTime < device->minBackoffDelay)
116 backoffTime = device->minBackoffDelay;
117 else if (backoffTime < device->maxBackoffDelay)
118 backoffTime <<= 1;
119
120 backoffEvent.reschedule(curTick + backoffTime, true);
120 reschedule(backoffEvent, curTick + backoffTime, true);
121
122 DPRINTF(DMA, "Backoff time set to %d ticks\n", backoffTime);
123
124 pkt->reinitNacked();
125 queueDma(pkt, true);
126 } else if (pkt->senderState) {
127 DmaReqState *state;
128 backoffTime >>= 2;

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

134
135 assert(pendingCount >= 0);
136 assert(state);
137
138 state->numBytes += pkt->req->getSize();
139 assert(state->totBytes >= state->numBytes);
140 if (state->totBytes == state->numBytes) {
141 if (state->delay)
121
122 DPRINTF(DMA, "Backoff time set to %d ticks\n", backoffTime);
123
124 pkt->reinitNacked();
125 queueDma(pkt, true);
126 } else if (pkt->senderState) {
127 DmaReqState *state;
128 backoffTime >>= 2;

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

134
135 assert(pendingCount >= 0);
136 assert(state);
137
138 state->numBytes += pkt->req->getSize();
139 assert(state->totBytes >= state->numBytes);
140 if (state->totBytes == state->numBytes) {
141 if (state->delay)
142 state->completionEvent->schedule(state->delay + curTick);
142 schedule(state->completionEvent, curTick + state->delay);
143 else
144 state->completionEvent->process();
145 delete state;
146 }
147 delete pkt->req;
148 delete pkt;
149
150 if (pendingCount == 0 && drainEvent) {

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

204 inRetry = true;
205 DPRINTF(DMA, "-- Failed, queued\n");
206 }
207 } while (!backoffTime && result && transmitList.size());
208
209 if (transmitList.size() && backoffTime && !inRetry) {
210 DPRINTF(DMA, "Scheduling backoff for %d\n", curTick+backoffTime);
211 if (!backoffEvent.scheduled())
143 else
144 state->completionEvent->process();
145 delete state;
146 }
147 delete pkt->req;
148 delete pkt;
149
150 if (pendingCount == 0 && drainEvent) {

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

204 inRetry = true;
205 DPRINTF(DMA, "-- Failed, queued\n");
206 }
207 } while (!backoffTime && result && transmitList.size());
208
209 if (transmitList.size() && backoffTime && !inRetry) {
210 DPRINTF(DMA, "Scheduling backoff for %d\n", curTick+backoffTime);
211 if (!backoffEvent.scheduled())
212 backoffEvent.schedule(backoffTime+curTick);
212 schedule(backoffEvent, backoffTime + curTick);
213 }
214 DPRINTF(DMA, "TransmitList: %d, backoffTime: %d inRetry: %d es: %d\n",
215 transmitList.size(), backoffTime, inRetry,
216 backoffEvent.scheduled());
217}
218
219
220void

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

292 DPRINTF(DMA, "-- Failed: queued\n");
293 }
294 } while (result && !backoffTime && transmitList.size());
295
296 if (transmitList.size() && backoffTime && !inRetry &&
297 !backoffEvent.scheduled()) {
298 DPRINTF(DMA, "-- Scheduling backoff timer for %d\n",
299 backoffTime+curTick);
213 }
214 DPRINTF(DMA, "TransmitList: %d, backoffTime: %d inRetry: %d es: %d\n",
215 transmitList.size(), backoffTime, inRetry,
216 backoffEvent.scheduled());
217}
218
219
220void

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

292 DPRINTF(DMA, "-- Failed: queued\n");
293 }
294 } while (result && !backoffTime && transmitList.size());
295
296 if (transmitList.size() && backoffTime && !inRetry &&
297 !backoffEvent.scheduled()) {
298 DPRINTF(DMA, "-- Scheduling backoff timer for %d\n",
299 backoffTime+curTick);
300 backoffEvent.schedule(backoffTime+curTick);
300 schedule(backoffEvent, backoffTime + curTick);
301 }
302 } else if (state == Enums::atomic) {
303 transmitList.pop_front();
304
305 Tick lat;
306 DPRINTF(DMA, "--Sending DMA for addr: %#x size: %d\n",
307 pkt->req->getPaddr(), pkt->req->getSize());
308 lat = sendAtomic(pkt);
309 assert(pkt->senderState);
310 DmaReqState *state = dynamic_cast<DmaReqState*>(pkt->senderState);
311 assert(state);
312 state->numBytes += pkt->req->getSize();
313
314 DPRINTF(DMA, "--Received response for DMA for addr: %#x size: %d nb: %d, tot: %d sched %d\n",
315 pkt->req->getPaddr(), pkt->req->getSize(), state->numBytes,
316 state->totBytes, state->completionEvent->scheduled());
317
318 if (state->totBytes == state->numBytes) {
319 assert(!state->completionEvent->scheduled());
301 }
302 } else if (state == Enums::atomic) {
303 transmitList.pop_front();
304
305 Tick lat;
306 DPRINTF(DMA, "--Sending DMA for addr: %#x size: %d\n",
307 pkt->req->getPaddr(), pkt->req->getSize());
308 lat = sendAtomic(pkt);
309 assert(pkt->senderState);
310 DmaReqState *state = dynamic_cast<DmaReqState*>(pkt->senderState);
311 assert(state);
312 state->numBytes += pkt->req->getSize();
313
314 DPRINTF(DMA, "--Received response for DMA for addr: %#x size: %d nb: %d, tot: %d sched %d\n",
315 pkt->req->getPaddr(), pkt->req->getSize(), state->numBytes,
316 state->totBytes, state->completionEvent->scheduled());
317
318 if (state->totBytes == state->numBytes) {
319 assert(!state->completionEvent->scheduled());
320 state->completionEvent->schedule(curTick + lat + state->delay);
320 schedule(state->completionEvent, curTick + lat + state->delay);
321 delete state;
322 delete pkt->req;
323 }
324 pendingCount--;
325 assert(pendingCount >= 0);
326 delete pkt;
327
328 if (pendingCount == 0 && drainEvent) {

--- 13 unchanged lines hidden ---
321 delete state;
322 delete pkt->req;
323 }
324 pendingCount--;
325 assert(pendingCount >= 0);
326 delete pkt;
327
328 if (pendingCount == 0 && drainEvent) {

--- 13 unchanged lines hidden ---