|
@@ -2848,7 +2848,7 @@ static int e1000_tx_map(struct e1000_adapter *adapter,
|
|
|
struct e1000_buffer *buffer_info;
|
|
|
unsigned int len = skb_headlen(skb);
|
|
|
unsigned int offset = 0, size, count = 0, i;
|
|
|
- unsigned int f;
|
|
|
+ unsigned int f, bytecount, segs;
|
|
|
|
|
|
i = tx_ring->next_to_use;
|
|
|
|
|
@@ -2949,7 +2949,13 @@ static int e1000_tx_map(struct e1000_adapter *adapter,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ segs = skb_shinfo(skb)->gso_segs ?: 1;
|
|
|
+ /* multiply data chunks by size of headers */
|
|
|
+ bytecount = ((segs - 1) * skb_headlen(skb)) + skb->len;
|
|
|
+
|
|
|
tx_ring->buffer_info[i].skb = skb;
|
|
|
+ tx_ring->buffer_info[i].segs = segs;
|
|
|
+ tx_ring->buffer_info[i].bytecount = bytecount;
|
|
|
tx_ring->buffer_info[first].next_to_watch = i;
|
|
|
|
|
|
return count;
|
|
@@ -3623,14 +3629,8 @@ static bool e1000_clean_tx_irq(struct e1000_adapter *adapter,
|
|
|
cleaned = (i == eop);
|
|
|
|
|
|
if (cleaned) {
|
|
|
- struct sk_buff *skb = buffer_info->skb;
|
|
|
- unsigned int segs, bytecount;
|
|
|
- segs = skb_shinfo(skb)->gso_segs ?: 1;
|
|
|
- /* multiply data chunks by size of headers */
|
|
|
- bytecount = ((segs - 1) * skb_headlen(skb)) +
|
|
|
- skb->len;
|
|
|
- total_tx_packets += segs;
|
|
|
- total_tx_bytes += bytecount;
|
|
|
+ total_tx_packets += buffer_info->segs;
|
|
|
+ total_tx_bytes += buffer_info->bytecount;
|
|
|
}
|
|
|
e1000_unmap_and_free_tx_resource(adapter, buffer_info);
|
|
|
tx_desc->upper.data = 0;
|