Fix a bug where we would improperly calculate if the FIFO was
authorNathan Binkert <binkertn@umich.edu>
Wed, 17 Nov 2004 04:59:51 +0000 (23:59 -0500)
committerNathan Binkert <binkertn@umich.edu>
Wed, 17 Nov 2004 04:59:51 +0000 (23:59 -0500)
full by adding a reserve feature to the packet fifo which allows
us to reserve space in the fifo if only part of a packet was
copied into the fifo.

dev/ns_gige.cc:
    use the new reserve feature in the fifo to properly determine
    when we're full.  assert that adding a packet to the fifo suceeds.
dev/pktfifo.hh:
    add the ability to reserve space in the fifo.  This is useful for
    partial writing of packets into the fifo.

--HG--
extra : convert_revision : 83f871f34fac237bb464c9513cf6490b5c62420e

dev/ns_gige.cc
dev/pktfifo.hh

index 401599126aff201aea41b6a94430c1cc40313673..e51e14f1d0ea091304a0b754e572f43d72a2ada0 100644 (file)
@@ -1341,9 +1341,6 @@ NSGigE::rxKick()
 
             // sanity check - i think the driver behaves like this
             assert(rxDescCnt >= rxPktBytes);
-
-            // Must clear the value before popping to decrement the
-            // reference count
             rxFifo.pop();
         }
 
@@ -1564,9 +1561,6 @@ NSGigE::transmit()
          * besides, it's functionally the same.
          */
         devIntrPost(ISR_TXOK);
-    } else {
-        DPRINTF(Ethernet,
-                "May need to rethink always sending the descriptors back?\n");
     }
 
    if (!txFifo.empty() && !txEvent.scheduled()) {
@@ -1822,7 +1816,11 @@ NSGigE::txKick()
                 // this is just because the receive can't handle a
                 // packet bigger want to make sure
                 assert(txPacket->length <= 1514);
-                txFifo.push(txPacket);
+#ifndef NDEBUG
+                bool success =
+#endif
+                    txFifo.push(txPacket);
+                assert(success);
 
                 /*
                  * this following section is not tqo spec, but
@@ -1903,6 +1901,7 @@ NSGigE::txKick()
         txPacketBufPtr += txXferLen;
         txFragPtr += txXferLen;
         txDescCnt -= txXferLen;
+        txFifo.reserve(txXferLen);
 
         txState = txFifoBlock;
         break;
index a54a49996625b66a38c6e269f9cf4cbc608445e2..0b2e95e2ab32a1afd268e2ed13193f5de55cbc23 100644 (file)
@@ -43,6 +43,7 @@ class PacketFifo
     std::list<PacketPtr> fifo;
     int _maxsize;
     int _size;
+    int _reserved;
 
   public:
     explicit PacketFifo(int max) : _maxsize(max), _size(0) {}
@@ -50,18 +51,27 @@ class PacketFifo
 
     int maxsize() const { return _maxsize; }
     int packets() const { return fifo.size(); }
-    int size() const { return _size; }
-    int avail() const { return _maxsize - _size; }
-    bool empty() const { return _size == 0; }
-    bool full() const { return _size >= _maxsize; }
+    int size() const { return _size + _reserved; }
+    int avail() const { return maxsize() - size(); }
+    bool empty() const { return size() == 0; }
+    bool full() const { return size() >= maxsize(); }
+
+    int reserve(int len = 0)
+    {
+        _reserved += len;
+        assert(avail() >= 0);
+        return _reserved;
+    }
 
     bool push(PacketPtr ptr)
     {
-        if (avail() < ptr->length)
+        assert(_reserved <= ptr->length);
+        if (avail() < ptr->length - _reserved)
             return false;
 
         _size += ptr->length;
         fifo.push_back(ptr);
+        _reserved = 0;
         return true;
     }