diff options
author | Nathan Binkert <binkertn@umich.edu> | 2005-11-28 18:40:58 -0500 |
---|---|---|
committer | Nathan Binkert <binkertn@umich.edu> | 2005-11-28 18:40:58 -0500 |
commit | 36373fa465b813ac7d19e85f4cf68238cef4a035 (patch) | |
tree | d37808ac64be27808dab6c1f3d3fa118cc64e5ee /dev | |
parent | 108cfe53d6ac09c18dc531230a38bdc1c25bd2cb (diff) | |
download | gem5-36373fa465b813ac7d19e85f4cf68238cef4a035.tar.xz |
Virtualized SINIC fixes
dev/pktfifo.hh:
we can't modify i because it's used further down to remove
the packet from the fifo. Instead, copy the iterator and
modify that to get the previous packet.
dev/sinic.cc:
- don't change the transmit state and kick the machine unless
we're at the head of the txList.
- add a couple of debugging statements to figure out how far
along we've gotten in processing a packet.
- assert that the current tx vnic has something to do when
we start processing the state machine.
--HG--
extra : convert_revision : 588fe2c7d810be0e3d8d39c5cc0ec8a72119517e
Diffstat (limited to 'dev')
-rw-r--r-- | dev/pktfifo.hh | 6 | ||||
-rw-r--r-- | dev/sinic.cc | 8 |
2 files changed, 11 insertions, 3 deletions
diff --git a/dev/pktfifo.hh b/dev/pktfifo.hh index 61e4ead1b..e63fd291f 100644 --- a/dev/pktfifo.hh +++ b/dev/pktfifo.hh @@ -113,8 +113,10 @@ class PacketFifo { PacketPtr &packet = *i; if (i != fifo.begin()) { - --i; - (*i)->slack += packet->length; + iterator prev = i; + --prev; + assert(prev != fifo.end()); + (*prev)->slack += packet->length; } else { _size -= packet->length; _size -= packet->slack; diff --git a/dev/sinic.cc b/dev/sinic.cc index 6a30f93d4..69239df32 100644 --- a/dev/sinic.cc +++ b/dev/sinic.cc @@ -561,7 +561,7 @@ Device::regWrite(Addr daddr, int cpu, const uint8_t *data) vnic.TxData = reg64; if (txList.empty() || txList.front() != index) txList.push_back(index); - if (txEnable && txState == txIdle) { + if (txEnable && txState == txIdle && txList.front() == index) { txState = txFifoBlock; txKick(); } @@ -943,12 +943,17 @@ Device::rxKick() vnic->RxDone |= Regs::RxDone_Complete; if (vnic->rxPacketBytes == rxDmaLen) { + DPRINTF(EthernetSM, "rxKick: packet complete on vnic %d\n", + rxList.front()); rxFifo.remove(vnic->rxPacket); vnic->rxPacket = rxFifo.end(); } else { vnic->RxDone |= Regs::RxDone_More; vnic->rxPacketBytes -= rxDmaLen; vnic->rxPacketOffset += rxDmaLen; + DPRINTF(EthernetSM, + "rxKick: packet not complete on vnic %d: %d bytes left\n", + rxList.front(), vnic->rxPacketBytes); } rxList.pop_front(); @@ -1074,6 +1079,7 @@ Device::txKick() switch (txState) { case txFifoBlock: + assert(Regs::get_TxDone_Busy(vnic->TxData)); if (!txPacket) { // Grab a new packet from the fifo. txPacket = new PacketData(16384); |