]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[intel] Avoid completely filling the TX descriptor ring
authorMichael Brown <mcb30@ipxe.org>
Tue, 22 Apr 2014 12:12:54 +0000 (13:12 +0100)
committerMichael Brown <mcb30@ipxe.org>
Tue, 22 Apr 2014 12:12:54 +0000 (13:12 +0100)
It is unclear from the datasheets whether or not the TX ring can be
completely filled (i.e. whether writing the tail value as equal to the
current head value will cause the ring to be treated as completely
full or completely empty).  It is very plausible that this edge case
could differ in behaviour between real hardware and the many
implementations of an emulated Intel NIC found in various virtual
machines.  Err on the side of caution and always leave at least one
ring entry empty.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/drivers/net/intel.c
src/drivers/net/intel.h

index 04e86dd40ac305c86a431e3eb47cd4fc59b70d95..f56012634947947ab52a60c406800701f640ca2e 100644 (file)
@@ -593,7 +593,7 @@ int intel_transmit ( struct net_device *netdev, struct io_buffer *iobuf ) {
        physaddr_t address;
 
        /* Get next transmit descriptor */
-       if ( ( intel->tx.prod - intel->tx.cons ) >= INTEL_NUM_TX_DESC ) {
+       if ( ( intel->tx.prod - intel->tx.cons ) >= INTEL_TX_FILL ) {
                DBGC ( intel, "INTEL %p out of transmit descriptors\n", intel );
                return -ENOBUFS;
        }
index 20b4255e1c299f76e591428ac94780bd8f52bf6f..8ce9ea97316728af37891c1d9b110cfe32164c1f 100644 (file)
@@ -156,6 +156,9 @@ enum intel_descriptor_status {
  */
 #define INTEL_NUM_TX_DESC 16
 
+/** Transmit descriptor ring maximum fill level */
+#define INTEL_TX_FILL ( INTEL_NUM_TX_DESC - 1 )
+
 /** Receive/Transmit Descriptor Base Address Low (offset) */
 #define INTEL_xDBAL 0x00