From d6299c82d55b7ec9b70466d08732739316e886ce Mon Sep 17 00:00:00 2001 From: Matt Carlson Date: Wed, 27 Jul 2011 14:20:50 +0000 Subject: [PATCH] --- yaml --- r: 261073 b: refs/heads/master c: e01ee14d499e5d09c0a9db0cac2545a018849e3d h: refs/heads/master i: 261071: 65b296036afa9898fc71f476e9f3ce02be2eb912 v: v3 --- [refs] | 2 +- trunk/drivers/net/tg3.c | 26 ++++++++++++++++++++++++++ trunk/drivers/net/tg3.h | 1 + 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 5a13f1287208..a68689f94fe0 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 0d681b27b0efc962a3038a316e78373de7bfe1ce +refs/heads/master: e01ee14d499e5d09c0a9db0cac2545a018849e3d diff --git a/trunk/drivers/net/tg3.c b/trunk/drivers/net/tg3.c index 3f69f1ace267..90b68a229745 100644 --- a/trunk/drivers/net/tg3.c +++ b/trunk/drivers/net/tg3.c @@ -4840,6 +4840,12 @@ static void tg3_tx(struct tg3_napi *tnapi) ri->skb = NULL; + while (ri->fragmented) { + ri->fragmented = false; + sw_idx = NEXT_TX(sw_idx); + ri = &tnapi->tx_buffers[sw_idx]; + } + sw_idx = NEXT_TX(sw_idx); for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { @@ -4851,6 +4857,13 @@ static void tg3_tx(struct tg3_napi *tnapi) dma_unmap_addr(ri, mapping), skb_shinfo(skb)->frags[i].size, PCI_DMA_TODEVICE); + + while (ri->fragmented) { + ri->fragmented = false; + sw_idx = NEXT_TX(sw_idx); + ri = &tnapi->tx_buffers[sw_idx]; + } + sw_idx = NEXT_TX(sw_idx); } @@ -5926,6 +5939,13 @@ static void tg3_tx_skb_unmap(struct tg3_napi *tnapi, u32 entry, int last) dma_unmap_addr(txb, mapping), skb_headlen(skb), PCI_DMA_TODEVICE); + + while (txb->fragmented) { + txb->fragmented = false; + entry = NEXT_TX(entry); + txb = &tnapi->tx_buffers[entry]; + } + for (i = 0; i < last; i++) { skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; @@ -5935,6 +5955,12 @@ static void tg3_tx_skb_unmap(struct tg3_napi *tnapi, u32 entry, int last) pci_unmap_page(tnapi->tp->pdev, dma_unmap_addr(txb, mapping), frag->size, PCI_DMA_TODEVICE); + + while (txb->fragmented) { + txb->fragmented = false; + entry = NEXT_TX(entry); + txb = &tnapi->tx_buffers[entry]; + } } } diff --git a/trunk/drivers/net/tg3.h b/trunk/drivers/net/tg3.h index f6986ca50d80..466dd7add12b 100644 --- a/trunk/drivers/net/tg3.h +++ b/trunk/drivers/net/tg3.h @@ -2655,6 +2655,7 @@ struct ring_info { struct tg3_tx_ring_info { struct sk_buff *skb; DEFINE_DMA_UNMAP_ADDR(mapping); + bool fragmented; }; struct tg3_link_config {