diff options
author | Carl Henrik Lunde <chlunde@ping.uio.no> | 2015-09-16 11:10:04 +0100 |
---|---|---|
committer | Michael Brown <mcb30@ipxe.org> | 2015-09-16 11:10:30 +0100 |
commit | 3f8da985aa81e31b6e9482970f6ec594aecca552 (patch) | |
tree | e9c84d4f04041fe0621736017e55d92085a3ca0f /src/drivers/net/vmxnet3.c | |
parent | 1852803e462b8cdb864d3d07b9c544ef466c22b5 (diff) | |
download | ipxe-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.c | 13 |
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++; |