aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatt Carlson <mcarlson@broadcom.com>2011-07-27 10:20:50 -0400
committerDavid S. Miller <davem@davemloft.net>2011-07-28 01:39:31 -0400
commite01ee14d499e5d09c0a9db0cac2545a018849e3d (patch)
tree752b0783203f4131dbe2d9af945f5090003646e2
parent0d681b27b0efc962a3038a316e78373de7bfe1ce (diff)
tg3: Add partial fragment unmapping code
The following patches are going to break skb fragments into smaller sizes. This patch attempts to make the change easier to digest by only addressing the skb teardown portion. The patch modifies the driver to skip over any BDs that have a flag set that indicates the BD isn't the beginning of an skb fragment. Such BDs were a result of segmentation and do not need a pci_unmap_page() call. Signed-off-by: Matt Carlson <mcarlson@broadcom.com> Reviewed-by: Michael Chan <mchan@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/tg3.c26
-rw-r--r--drivers/net/tg3.h1
2 files changed, 27 insertions, 0 deletions
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c
index 3f69f1ace267..90b68a229745 100644
--- a/drivers/net/tg3.c
+++ b/drivers/net/tg3.c
@@ -4840,6 +4840,12 @@ static void tg3_tx(struct tg3_napi *tnapi)
4840 4840
4841 ri->skb = NULL; 4841 ri->skb = NULL;
4842 4842
4843 while (ri->fragmented) {
4844 ri->fragmented = false;
4845 sw_idx = NEXT_TX(sw_idx);
4846 ri = &tnapi->tx_buffers[sw_idx];
4847 }
4848
4843 sw_idx = NEXT_TX(sw_idx); 4849 sw_idx = NEXT_TX(sw_idx);
4844 4850
4845 for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { 4851 for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
@@ -4851,6 +4857,13 @@ static void tg3_tx(struct tg3_napi *tnapi)
4851 dma_unmap_addr(ri, mapping), 4857 dma_unmap_addr(ri, mapping),
4852 skb_shinfo(skb)->frags[i].size, 4858 skb_shinfo(skb)->frags[i].size,
4853 PCI_DMA_TODEVICE); 4859 PCI_DMA_TODEVICE);
4860
4861 while (ri->fragmented) {
4862 ri->fragmented = false;
4863 sw_idx = NEXT_TX(sw_idx);
4864 ri = &tnapi->tx_buffers[sw_idx];
4865 }
4866
4854 sw_idx = NEXT_TX(sw_idx); 4867 sw_idx = NEXT_TX(sw_idx);
4855 } 4868 }
4856 4869
@@ -5926,6 +5939,13 @@ static void tg3_tx_skb_unmap(struct tg3_napi *tnapi, u32 entry, int last)
5926 dma_unmap_addr(txb, mapping), 5939 dma_unmap_addr(txb, mapping),
5927 skb_headlen(skb), 5940 skb_headlen(skb),
5928 PCI_DMA_TODEVICE); 5941 PCI_DMA_TODEVICE);
5942
5943 while (txb->fragmented) {
5944 txb->fragmented = false;
5945 entry = NEXT_TX(entry);
5946 txb = &tnapi->tx_buffers[entry];
5947 }
5948
5929 for (i = 0; i < last; i++) { 5949 for (i = 0; i < last; i++) {
5930 skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; 5950 skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
5931 5951
@@ -5935,6 +5955,12 @@ static void tg3_tx_skb_unmap(struct tg3_napi *tnapi, u32 entry, int last)
5935 pci_unmap_page(tnapi->tp->pdev, 5955 pci_unmap_page(tnapi->tp->pdev,
5936 dma_unmap_addr(txb, mapping), 5956 dma_unmap_addr(txb, mapping),
5937 frag->size, PCI_DMA_TODEVICE); 5957 frag->size, PCI_DMA_TODEVICE);
5958
5959 while (txb->fragmented) {
5960 txb->fragmented = false;
5961 entry = NEXT_TX(entry);
5962 txb = &tnapi->tx_buffers[entry];
5963 }
5938 } 5964 }
5939} 5965}
5940 5966
diff --git a/drivers/net/tg3.h b/drivers/net/tg3.h
index f6986ca50d80..466dd7add12b 100644
--- a/drivers/net/tg3.h
+++ b/drivers/net/tg3.h
@@ -2655,6 +2655,7 @@ struct ring_info {
2655struct tg3_tx_ring_info { 2655struct tg3_tx_ring_info {
2656 struct sk_buff *skb; 2656 struct sk_buff *skb;
2657 DEFINE_DMA_UNMAP_ADDR(mapping); 2657 DEFINE_DMA_UNMAP_ADDR(mapping);
2658 bool fragmented;
2658}; 2659};
2659 2660
2660struct tg3_link_config { 2661struct tg3_link_config {