aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/ethernet/intel/e1000/e1000.h2
-rw-r--r--drivers/net/ethernet/intel/e1000/e1000_main.c18
2 files changed, 11 insertions, 9 deletions
diff --git a/drivers/net/ethernet/intel/e1000/e1000.h b/drivers/net/ethernet/intel/e1000/e1000.h
index 24f41da8c4be..4ea87b19ac1a 100644
--- a/drivers/net/ethernet/intel/e1000/e1000.h
+++ b/drivers/net/ethernet/intel/e1000/e1000.h
@@ -150,6 +150,8 @@ struct e1000_buffer {
150 unsigned long time_stamp; 150 unsigned long time_stamp;
151 u16 length; 151 u16 length;
152 u16 next_to_watch; 152 u16 next_to_watch;
153 unsigned int segs;
154 unsigned int bytecount;
153 u16 mapped_as_page; 155 u16 mapped_as_page;
154}; 156};
155 157
diff --git a/drivers/net/ethernet/intel/e1000/e1000_main.c b/drivers/net/ethernet/intel/e1000/e1000_main.c
index 7c280e5832b2..4a32c15524c9 100644
--- a/drivers/net/ethernet/intel/e1000/e1000_main.c
+++ b/drivers/net/ethernet/intel/e1000/e1000_main.c
@@ -2848,7 +2848,7 @@ static int e1000_tx_map(struct e1000_adapter *adapter,
2848 struct e1000_buffer *buffer_info; 2848 struct e1000_buffer *buffer_info;
2849 unsigned int len = skb_headlen(skb); 2849 unsigned int len = skb_headlen(skb);
2850 unsigned int offset = 0, size, count = 0, i; 2850 unsigned int offset = 0, size, count = 0, i;
2851 unsigned int f; 2851 unsigned int f, bytecount, segs;
2852 2852
2853 i = tx_ring->next_to_use; 2853 i = tx_ring->next_to_use;
2854 2854
@@ -2949,7 +2949,13 @@ static int e1000_tx_map(struct e1000_adapter *adapter,
2949 } 2949 }
2950 } 2950 }
2951 2951
2952 segs = skb_shinfo(skb)->gso_segs ?: 1;
2953 /* multiply data chunks by size of headers */
2954 bytecount = ((segs - 1) * skb_headlen(skb)) + skb->len;
2955
2952 tx_ring->buffer_info[i].skb = skb; 2956 tx_ring->buffer_info[i].skb = skb;
2957 tx_ring->buffer_info[i].segs = segs;
2958 tx_ring->buffer_info[i].bytecount = bytecount;
2953 tx_ring->buffer_info[first].next_to_watch = i; 2959 tx_ring->buffer_info[first].next_to_watch = i;
2954 2960
2955 return count; 2961 return count;
@@ -3623,14 +3629,8 @@ static bool e1000_clean_tx_irq(struct e1000_adapter *adapter,
3623 cleaned = (i == eop); 3629 cleaned = (i == eop);
3624 3630
3625 if (cleaned) { 3631 if (cleaned) {
3626 struct sk_buff *skb = buffer_info->skb; 3632 total_tx_packets += buffer_info->segs;
3627 unsigned int segs, bytecount; 3633 total_tx_bytes += buffer_info->bytecount;
3628 segs = skb_shinfo(skb)->gso_segs ?: 1;
3629 /* multiply data chunks by size of headers */
3630 bytecount = ((segs - 1) * skb_headlen(skb)) +
3631 skb->len;
3632 total_tx_packets += segs;
3633 total_tx_bytes += bytecount;
3634 } 3634 }
3635 e1000_unmap_and_free_tx_resource(adapter, buffer_info); 3635 e1000_unmap_and_free_tx_resource(adapter, buffer_info);
3636 tx_desc->upper.data = 0; 3636 tx_desc->upper.data = 0;