123c123,130
< if (pkt->senderState) {
---
>
>
> if (pkt->result == Packet::Nacked) {
> DPRINTF(DMA, "Received nacked Pkt %#x with State: %#x Addr: %#x\n",
> pkt, pkt->senderState, pkt->getAddr());
> pkt->reinitNacked();
> sendDma(pkt, true);
> } else if (pkt->senderState) {
125,126c132,133
< DPRINTF(DMA, "Received response Packet %#x with senderState: %#x\n",
< pkt, pkt->senderState);
---
> DPRINTF(DMA, "Received response Pkt %#x with State: %#x Addr: %#x\n",
> pkt, pkt->senderState, pkt->getAddr());
127a135,137
> pendingCount--;
>
> assert(pendingCount >= 0);
129c139,144
< state->completionEvent->process();
---
>
> state->numBytes += pkt->req->getSize();
> if (state->totBytes == state->numBytes) {
> state->completionEvent->process();
> delete state;
> }
133,135c148
< DPRINTF(DMA, "Received response Packet %#x with no senderState\n", pkt);
< delete pkt->req;
< delete pkt;
---
> panic("Got packet without sender state... huh?\n");
157,158d169
< pendingCount--;
< assert(pendingCount >= 0);
172c183
< int prevSize = 0;
---
> DmaReqState *reqState = new DmaReqState(event, this, size);
181c192
< pkt->dataStatic(data + prevSize);
---
> pkt->dataStatic(data + gen.complete());
183c194
< prevSize += gen.size();
---
> pkt->senderState = reqState;
185,189d195
< // Set the last bit of the dma as the final packet for this dma
< // and set it's completion event.
< if (prevSize == size) {
< pkt->senderState = new DmaReqState(event, true);
< }
198c204
< DmaPort::sendDma(Packet *pkt)
---
> DmaPort::sendDma(Packet *pkt, bool front)
206,207c212,213
< DPRINTF(DMA, "Attempting to send Packet %#x with senderState: %#x\n",
< pkt, pkt->senderState);
---
> DPRINTF(DMA, "Attempting to send Packet %#x with addr: %#x\n",
> pkt, pkt->getAddr());
209c215,218
< transmitList.push_back(pkt);
---
> if (front)
> transmitList.push_front(pkt);
> else
> transmitList.push_back(pkt);
213,214d221
< pendingCount--;
< assert(pendingCount >= 0);
221c228,230
< state->completionEvent->schedule(curTick + (pkt->time - pkt->req->getTime()) +1);
---
> state->completionEvent->schedule(curTick + (pkt->time -
> pkt->req->getTime()) +1);
> delete state;