aboutsummaryrefslogtreecommitdiffstats
path: root/src/drivers/net/vmxnet3.c
diff options
context:
space:
mode:
authorCarl Henrik Lunde <chlunde@ping.uio.no>2015-09-16 11:10:04 +0100
committerMichael Brown <mcb30@ipxe.org>2015-09-16 11:10:30 +0100
commit3f8da985aa81e31b6e9482970f6ec594aecca552 (patch)
treee9c84d4f04041fe0621736017e55d92085a3ca0f /src/drivers/net/vmxnet3.c
parent1852803e462b8cdb864d3d07b9c544ef466c22b5 (diff)
downloadipxe-3f8da985aa81e31b6e9482970f6ec594aecca552.tar.gz
[vmxnet3] Avoid completely filling the TX descriptor ring
Modified-by: Michael Brown <mcb30@ipxe.org> Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/drivers/net/vmxnet3.c')
-rw-r--r--src/drivers/net/vmxnet3.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/src/drivers/net/vmxnet3.c b/src/drivers/net/vmxnet3.c
index 8d4f4b843..6a54dbf89 100644
--- a/src/drivers/net/vmxnet3.c
+++ b/src/drivers/net/vmxnet3.c
@@ -92,19 +92,24 @@ static int vmxnet3_transmit ( struct net_device *netdev,
struct io_buffer *iobuf ) {
struct vmxnet3_nic *vmxnet = netdev_priv ( netdev );
struct vmxnet3_tx_desc *tx_desc;
+ unsigned int fill;
unsigned int desc_idx;
unsigned int generation;
/* Check that we have a free transmit descriptor */
- desc_idx = ( vmxnet->count.tx_prod % VMXNET3_NUM_TX_DESC );
- generation = ( ( vmxnet->count.tx_prod & VMXNET3_NUM_TX_DESC ) ?
- 0 : cpu_to_le32 ( VMXNET3_TXF_GEN ) );
- if ( vmxnet->tx_iobuf[desc_idx] ) {
+ fill = ( vmxnet->count.tx_prod - vmxnet->count.tx_cons );
+ if ( fill >= VMXNET3_TX_FILL ) {
DBGC ( vmxnet, "VMXNET3 %p out of transmit descriptors\n",
vmxnet );
return -ENOBUFS;
}
+ /* Locate transmit descriptor */
+ desc_idx = ( vmxnet->count.tx_prod % VMXNET3_NUM_TX_DESC );
+ generation = ( ( vmxnet->count.tx_prod & VMXNET3_NUM_TX_DESC ) ?
+ 0 : cpu_to_le32 ( VMXNET3_TXF_GEN ) );
+ assert ( vmxnet->tx_iobuf[desc_idx] == NULL );
+
/* Increment producer counter */
vmxnet->count.tx_prod++;