diff options
| -rw-r--r-- | drivers/net/tg3.c | 26 | ||||
| -rw-r--r-- | drivers/net/tg3.h | 1 |
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 { | |||
| 2655 | struct tg3_tx_ring_info { | 2655 | struct 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 | ||
| 2660 | struct tg3_link_config { | 2661 | struct tg3_link_config { |
