Virtualized SINIC fixes
authorNathan Binkert <binkertn@umich.edu>
Mon, 28 Nov 2005 23:40:58 +0000 (18:40 -0500)
committerNathan Binkert <binkertn@umich.edu>
Mon, 28 Nov 2005 23:40:58 +0000 (18:40 -0500)
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

dev/pktfifo.hh
dev/sinic.cc

index 61e4ead1bfd035eb60117471ebb823f77d7ab2c5..e63fd291fa1b52bb635e9b7cdee372d90f8449c1 100644 (file)
@@ -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;
index 6a30f93d46607d827b5c95a1656e4565f716b01a..69239df32f3699b3e806ab58b699a240c2c87181 100644 (file)
@@ -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);