diff options
Diffstat (limited to 'drivers/net/ethernet/intel/igb/igb_main.c')
| -rw-r--r-- | drivers/net/ethernet/intel/igb/igb_main.c | 47 | 
1 files changed, 22 insertions, 25 deletions
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c index 0a0bd819d95..7044aaadeca 100644 --- a/drivers/net/ethernet/intel/igb/igb_main.c +++ b/drivers/net/ethernet/intel/igb/igb_main.c @@ -4188,29 +4188,34 @@ static void igb_tx_map(struct igb_ring *tx_ring,  	struct sk_buff *skb = first->skb;  	struct igb_tx_buffer *tx_buffer;  	union e1000_adv_tx_desc *tx_desc; +	struct skb_frag_struct *frag;  	dma_addr_t dma; -	struct skb_frag_struct *frag = &skb_shinfo(skb)->frags[0]; -	unsigned int data_len = skb->data_len; -	unsigned int size = skb_headlen(skb); -	unsigned int paylen = skb->len - hdr_len; +	unsigned int data_len, size;  	u32 tx_flags = first->tx_flags;  	u32 cmd_type = igb_tx_cmd_type(skb, tx_flags);  	u16 i = tx_ring->next_to_use;  	tx_desc = IGB_TX_DESC(tx_ring, i); -	igb_tx_olinfo_status(tx_ring, tx_desc, tx_flags, paylen); +	igb_tx_olinfo_status(tx_ring, tx_desc, tx_flags, skb->len - hdr_len); + +	size = skb_headlen(skb); +	data_len = skb->data_len;  	dma = dma_map_single(tx_ring->dev, skb->data, size, DMA_TO_DEVICE); -	if (dma_mapping_error(tx_ring->dev, dma)) -		goto dma_error; -	/* record length, and DMA address */ -	dma_unmap_len_set(first, len, size); -	dma_unmap_addr_set(first, dma, dma); -	tx_desc->read.buffer_addr = cpu_to_le64(dma); +	tx_buffer = first; + +	for (frag = &skb_shinfo(skb)->frags[0];; frag++) { +		if (dma_mapping_error(tx_ring->dev, dma)) +			goto dma_error; + +		/* record length, and DMA address */ +		dma_unmap_len_set(tx_buffer, len, size); +		dma_unmap_addr_set(tx_buffer, dma, dma); + +		tx_desc->read.buffer_addr = cpu_to_le64(dma); -	for (;;) {  		while (unlikely(size > IGB_MAX_DATA_PER_TXD)) {  			tx_desc->read.cmd_type_len =  				cpu_to_le32(cmd_type ^ IGB_MAX_DATA_PER_TXD); @@ -4221,11 +4226,11 @@ static void igb_tx_map(struct igb_ring *tx_ring,  				tx_desc = IGB_TX_DESC(tx_ring, 0);  				i = 0;  			} +			tx_desc->read.olinfo_status = 0;  			dma += IGB_MAX_DATA_PER_TXD;  			size -= IGB_MAX_DATA_PER_TXD; -			tx_desc->read.olinfo_status = 0;  			tx_desc->read.buffer_addr = cpu_to_le64(dma);  		} @@ -4240,31 +4245,23 @@ static void igb_tx_map(struct igb_ring *tx_ring,  			tx_desc = IGB_TX_DESC(tx_ring, 0);  			i = 0;  		} +		tx_desc->read.olinfo_status = 0;  		size = skb_frag_size(frag);  		data_len -= size;  		dma = skb_frag_dma_map(tx_ring->dev, frag, 0, -				   size, DMA_TO_DEVICE); -		if (dma_mapping_error(tx_ring->dev, dma)) -			goto dma_error; +				       size, DMA_TO_DEVICE);  		tx_buffer = &tx_ring->tx_buffer_info[i]; -		dma_unmap_len_set(tx_buffer, len, size); -		dma_unmap_addr_set(tx_buffer, dma, dma); - -		tx_desc->read.olinfo_status = 0; -		tx_desc->read.buffer_addr = cpu_to_le64(dma); - -		frag++;  	} -	netdev_tx_sent_queue(txring_txq(tx_ring), first->bytecount); -  	/* write last descriptor with RS and EOP bits */  	cmd_type |= size | IGB_TXD_DCMD;  	tx_desc->read.cmd_type_len = cpu_to_le32(cmd_type); +	netdev_tx_sent_queue(txring_txq(tx_ring), first->bytecount); +  	/* set the timestamp */  	first->time_stamp = jiffies;  |