diff options
author | Bhavesh Davda <bhavesh@vmware.com> | 2010-07-24 10:43:29 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-07-25 20:06:52 -0400 |
commit | 1f4b16128439b225c2986f06d015c848c290d7d9 (patch) | |
tree | 037a896cab8614b4b3ba2c3305d0d48f24642385 /drivers/net/vmxnet3 | |
parent | 690a1f2002a3091bd18a501f46c9530f10481463 (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.c | 13 | ||||
-rw-r--r-- | drivers/net/vmxnet3/vmxnet3_int.h | 4 |
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 | /* |