aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/vmxnet3
diff options
context:
space:
mode:
authorBhavesh Davda <bhavesh@vmware.com>2010-07-24 10:43:29 -0400
committerDavid S. Miller <davem@davemloft.net>2010-07-25 20:06:52 -0400
commit1f4b16128439b225c2986f06d015c848c290d7d9 (patch)
tree037a896cab8614b4b3ba2c3305d0d48f24642385 /drivers/net/vmxnet3
parent690a1f2002a3091bd18a501f46c9530f10481463 (diff)
net-next: Fix an overflow bug in vmxnet3 Tx descriptor
Fix an overflow bug in vmxnet3 Tx descriptor This patch fixes a bug where a 16K buffer on a Tx descriptor was overflowing into the 'gen' bit in the descriptor thereby corrupting the descriptor and stalling the transmit ring. Signed-off-by: Bhavesh Davda <bhavesh@vmware.com> Signed-off-by: Shreyas Bhatewara <sbhatewara@vmware.com> Signed-off-by: Matthew Delco <delcoM@vmware.com> Signed-off-by: Ronghua Zhang <ronghua@vmware.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/vmxnet3')
-rw-r--r--drivers/net/vmxnet3/vmxnet3_drv.c13
-rw-r--r--drivers/net/vmxnet3/vmxnet3_int.h4
2 files changed, 11 insertions, 6 deletions
diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c b/drivers/net/vmxnet3/vmxnet3_drv.c
index 9d64186050f3..abe0ff53daf3 100644
--- a/drivers/net/vmxnet3/vmxnet3_drv.c
+++ b/drivers/net/vmxnet3/vmxnet3_drv.c
@@ -664,8 +664,13 @@ vmxnet3_map_pkt(struct sk_buff *skb, struct vmxnet3_tx_ctx *ctx,
664 while (len) { 664 while (len) {
665 u32 buf_size; 665 u32 buf_size;
666 666
667 buf_size = len > VMXNET3_MAX_TX_BUF_SIZE ? 667 if (len < VMXNET3_MAX_TX_BUF_SIZE) {
668 VMXNET3_MAX_TX_BUF_SIZE : len; 668 buf_size = len;
669 dw2 |= len;
670 } else {
671 buf_size = VMXNET3_MAX_TX_BUF_SIZE;
672 /* spec says that for TxDesc.len, 0 == 2^14 */
673 }
669 674
670 tbi = tq->buf_info + tq->tx_ring.next2fill; 675 tbi = tq->buf_info + tq->tx_ring.next2fill;
671 tbi->map_type = VMXNET3_MAP_SINGLE; 676 tbi->map_type = VMXNET3_MAP_SINGLE;
@@ -673,13 +678,13 @@ vmxnet3_map_pkt(struct sk_buff *skb, struct vmxnet3_tx_ctx *ctx,
673 skb->data + buf_offset, buf_size, 678 skb->data + buf_offset, buf_size,
674 PCI_DMA_TODEVICE); 679 PCI_DMA_TODEVICE);
675 680
676 tbi->len = buf_size; /* this automatically convert 2^14 to 0 */ 681 tbi->len = buf_size;
677 682
678 gdesc = tq->tx_ring.base + tq->tx_ring.next2fill; 683 gdesc = tq->tx_ring.base + tq->tx_ring.next2fill;
679 BUG_ON(gdesc->txd.gen == tq->tx_ring.gen); 684 BUG_ON(gdesc->txd.gen == tq->tx_ring.gen);
680 685
681 gdesc->txd.addr = cpu_to_le64(tbi->dma_addr); 686 gdesc->txd.addr = cpu_to_le64(tbi->dma_addr);
682 gdesc->dword[2] = cpu_to_le32(dw2 | buf_size); 687 gdesc->dword[2] = cpu_to_le32(dw2);
683 gdesc->dword[3] = 0; 688 gdesc->dword[3] = 0;
684 689
685 dev_dbg(&adapter->netdev->dev, 690 dev_dbg(&adapter->netdev->dev,
diff --git a/drivers/net/vmxnet3/vmxnet3_int.h b/drivers/net/vmxnet3/vmxnet3_int.h
index 762a6a7763fe..2121c735cabd 100644
--- a/drivers/net/vmxnet3/vmxnet3_int.h
+++ b/drivers/net/vmxnet3/vmxnet3_int.h
@@ -68,10 +68,10 @@
68/* 68/*
69 * Version numbers 69 * Version numbers
70 */ 70 */
71#define VMXNET3_DRIVER_VERSION_STRING "1.0.13.0-k" 71#define VMXNET3_DRIVER_VERSION_STRING "1.0.14.0-k"
72 72
73/* a 32-bit int, each byte encode a verion number in VMXNET3_DRIVER_VERSION */ 73/* a 32-bit int, each byte encode a verion number in VMXNET3_DRIVER_VERSION */
74#define VMXNET3_DRIVER_VERSION_NUM 0x01000B00 74#define VMXNET3_DRIVER_VERSION_NUM 0x01000E00
75 75
76 76
77/* 77/*