Merge zizzer.eecs.umich.edu:/bk/m5
into ziff.eecs.umich.edu:/z/binkertn/research/m5/latest --HG-- extra : convert_revision : 00c450b42a18d645cc9029e7ef56b4797b7308c5
This commit is contained in:
commit
f427445753
2 changed files with 21 additions and 12 deletions
|
@ -1341,9 +1341,6 @@ NSGigE::rxKick()
|
||||||
|
|
||||||
// sanity check - i think the driver behaves like this
|
// sanity check - i think the driver behaves like this
|
||||||
assert(rxDescCnt >= rxPktBytes);
|
assert(rxDescCnt >= rxPktBytes);
|
||||||
|
|
||||||
// Must clear the value before popping to decrement the
|
|
||||||
// reference count
|
|
||||||
rxFifo.pop();
|
rxFifo.pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1564,9 +1561,6 @@ NSGigE::transmit()
|
||||||
* besides, it's functionally the same.
|
* besides, it's functionally the same.
|
||||||
*/
|
*/
|
||||||
devIntrPost(ISR_TXOK);
|
devIntrPost(ISR_TXOK);
|
||||||
} else {
|
|
||||||
DPRINTF(Ethernet,
|
|
||||||
"May need to rethink always sending the descriptors back?\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!txFifo.empty() && !txEvent.scheduled()) {
|
if (!txFifo.empty() && !txEvent.scheduled()) {
|
||||||
|
@ -1822,7 +1816,11 @@ NSGigE::txKick()
|
||||||
// this is just because the receive can't handle a
|
// this is just because the receive can't handle a
|
||||||
// packet bigger want to make sure
|
// packet bigger want to make sure
|
||||||
assert(txPacket->length <= 1514);
|
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
|
* this following section is not tqo spec, but
|
||||||
|
@ -1903,6 +1901,7 @@ NSGigE::txKick()
|
||||||
txPacketBufPtr += txXferLen;
|
txPacketBufPtr += txXferLen;
|
||||||
txFragPtr += txXferLen;
|
txFragPtr += txXferLen;
|
||||||
txDescCnt -= txXferLen;
|
txDescCnt -= txXferLen;
|
||||||
|
txFifo.reserve(txXferLen);
|
||||||
|
|
||||||
txState = txFifoBlock;
|
txState = txFifoBlock;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -43,6 +43,7 @@ class PacketFifo
|
||||||
std::list<PacketPtr> fifo;
|
std::list<PacketPtr> fifo;
|
||||||
int _maxsize;
|
int _maxsize;
|
||||||
int _size;
|
int _size;
|
||||||
|
int _reserved;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit PacketFifo(int max) : _maxsize(max), _size(0) {}
|
explicit PacketFifo(int max) : _maxsize(max), _size(0) {}
|
||||||
|
@ -50,18 +51,27 @@ class PacketFifo
|
||||||
|
|
||||||
int maxsize() const { return _maxsize; }
|
int maxsize() const { return _maxsize; }
|
||||||
int packets() const { return fifo.size(); }
|
int packets() const { return fifo.size(); }
|
||||||
int size() const { return _size; }
|
int size() const { return _size + _reserved; }
|
||||||
int avail() const { return _maxsize - _size; }
|
int avail() const { return maxsize() - size(); }
|
||||||
bool empty() const { return _size == 0; }
|
bool empty() const { return size() == 0; }
|
||||||
bool full() const { return _size >= _maxsize; }
|
bool full() const { return size() >= maxsize(); }
|
||||||
|
|
||||||
|
int reserve(int len = 0)
|
||||||
|
{
|
||||||
|
_reserved += len;
|
||||||
|
assert(avail() >= 0);
|
||||||
|
return _reserved;
|
||||||
|
}
|
||||||
|
|
||||||
bool push(PacketPtr ptr)
|
bool push(PacketPtr ptr)
|
||||||
{
|
{
|
||||||
if (avail() < ptr->length)
|
assert(_reserved <= ptr->length);
|
||||||
|
if (avail() < ptr->length - _reserved)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
_size += ptr->length;
|
_size += ptr->length;
|
||||||
fifo.push_back(ptr);
|
fifo.push_back(ptr);
|
||||||
|
_reserved = 0;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue