diff options
Diffstat (limited to 'drivers/net/igb/igb_main.c')
| -rw-r--r-- | drivers/net/igb/igb_main.c | 487 | 
1 files changed, 408 insertions, 79 deletions
diff --git a/drivers/net/igb/igb_main.c b/drivers/net/igb/igb_main.c index c19b1e0caec..589cf4a6427 100644 --- a/drivers/net/igb/igb_main.c +++ b/drivers/net/igb/igb_main.c @@ -201,6 +201,336 @@ MODULE_DESCRIPTION("Intel(R) Gigabit Ethernet Network Driver");  MODULE_LICENSE("GPL");  MODULE_VERSION(DRV_VERSION); +struct igb_reg_info { +	u32 ofs; +	char *name; +}; + +static const struct igb_reg_info igb_reg_info_tbl[] = { + +	/* General Registers */ +	{E1000_CTRL, "CTRL"}, +	{E1000_STATUS, "STATUS"}, +	{E1000_CTRL_EXT, "CTRL_EXT"}, + +	/* Interrupt Registers */ +	{E1000_ICR, "ICR"}, + +	/* RX Registers */ +	{E1000_RCTL, "RCTL"}, +	{E1000_RDLEN(0), "RDLEN"}, +	{E1000_RDH(0), "RDH"}, +	{E1000_RDT(0), "RDT"}, +	{E1000_RXDCTL(0), "RXDCTL"}, +	{E1000_RDBAL(0), "RDBAL"}, +	{E1000_RDBAH(0), "RDBAH"}, + +	/* TX Registers */ +	{E1000_TCTL, "TCTL"}, +	{E1000_TDBAL(0), "TDBAL"}, +	{E1000_TDBAH(0), "TDBAH"}, +	{E1000_TDLEN(0), "TDLEN"}, +	{E1000_TDH(0), "TDH"}, +	{E1000_TDT(0), "TDT"}, +	{E1000_TXDCTL(0), "TXDCTL"}, +	{E1000_TDFH, "TDFH"}, +	{E1000_TDFT, "TDFT"}, +	{E1000_TDFHS, "TDFHS"}, +	{E1000_TDFPC, "TDFPC"}, + +	/* List Terminator */ +	{} +}; + +/* + * igb_regdump - register printout routine + */ +static void igb_regdump(struct e1000_hw *hw, struct igb_reg_info *reginfo) +{ +	int n = 0; +	char rname[16]; +	u32 regs[8]; + +	switch (reginfo->ofs) { +	case E1000_RDLEN(0): +		for (n = 0; n < 4; n++) +			regs[n] = rd32(E1000_RDLEN(n)); +		break; +	case E1000_RDH(0): +		for (n = 0; n < 4; n++) +			regs[n] = rd32(E1000_RDH(n)); +		break; +	case E1000_RDT(0): +		for (n = 0; n < 4; n++) +			regs[n] = rd32(E1000_RDT(n)); +		break; +	case E1000_RXDCTL(0): +		for (n = 0; n < 4; n++) +			regs[n] = rd32(E1000_RXDCTL(n)); +		break; +	case E1000_RDBAL(0): +		for (n = 0; n < 4; n++) +			regs[n] = rd32(E1000_RDBAL(n)); +		break; +	case E1000_RDBAH(0): +		for (n = 0; n < 4; n++) +			regs[n] = rd32(E1000_RDBAH(n)); +		break; +	case E1000_TDBAL(0): +		for (n = 0; n < 4; n++) +			regs[n] = rd32(E1000_RDBAL(n)); +		break; +	case E1000_TDBAH(0): +		for (n = 0; n < 4; n++) +			regs[n] = rd32(E1000_TDBAH(n)); +		break; +	case E1000_TDLEN(0): +		for (n = 0; n < 4; n++) +			regs[n] = rd32(E1000_TDLEN(n)); +		break; +	case E1000_TDH(0): +		for (n = 0; n < 4; n++) +			regs[n] = rd32(E1000_TDH(n)); +		break; +	case E1000_TDT(0): +		for (n = 0; n < 4; n++) +			regs[n] = rd32(E1000_TDT(n)); +		break; +	case E1000_TXDCTL(0): +		for (n = 0; n < 4; n++) +			regs[n] = rd32(E1000_TXDCTL(n)); +		break; +	default: +		printk(KERN_INFO "%-15s %08x\n", +			reginfo->name, rd32(reginfo->ofs)); +		return; +	} + +	snprintf(rname, 16, "%s%s", reginfo->name, "[0-3]"); +	printk(KERN_INFO "%-15s ", rname); +	for (n = 0; n < 4; n++) +		printk(KERN_CONT "%08x ", regs[n]); +	printk(KERN_CONT "\n"); +} + +/* + * igb_dump - Print registers, tx-rings and rx-rings + */ +static void igb_dump(struct igb_adapter *adapter) +{ +	struct net_device *netdev = adapter->netdev; +	struct e1000_hw *hw = &adapter->hw; +	struct igb_reg_info *reginfo; +	int n = 0; +	struct igb_ring *tx_ring; +	union e1000_adv_tx_desc *tx_desc; +	struct my_u0 { u64 a; u64 b; } *u0; +	struct igb_buffer *buffer_info; +	struct igb_ring *rx_ring; +	union e1000_adv_rx_desc *rx_desc; +	u32 staterr; +	int i = 0; + +	if (!netif_msg_hw(adapter)) +		return; + +	/* Print netdevice Info */ +	if (netdev) { +		dev_info(&adapter->pdev->dev, "Net device Info\n"); +		printk(KERN_INFO "Device Name     state            " +			"trans_start      last_rx\n"); +		printk(KERN_INFO "%-15s %016lX %016lX %016lX\n", +		netdev->name, +		netdev->state, +		netdev->trans_start, +		netdev->last_rx); +	} + +	/* Print Registers */ +	dev_info(&adapter->pdev->dev, "Register Dump\n"); +	printk(KERN_INFO " Register Name   Value\n"); +	for (reginfo = (struct igb_reg_info *)igb_reg_info_tbl; +	     reginfo->name; reginfo++) { +		igb_regdump(hw, reginfo); +	} + +	/* Print TX Ring Summary */ +	if (!netdev || !netif_running(netdev)) +		goto exit; + +	dev_info(&adapter->pdev->dev, "TX Rings Summary\n"); +	printk(KERN_INFO "Queue [NTU] [NTC] [bi(ntc)->dma  ]" +		" leng ntw timestamp\n"); +	for (n = 0; n < adapter->num_tx_queues; n++) { +		tx_ring = adapter->tx_ring[n]; +		buffer_info = &tx_ring->buffer_info[tx_ring->next_to_clean]; +		printk(KERN_INFO " %5d %5X %5X %016llX %04X %3X %016llX\n", +			   n, tx_ring->next_to_use, tx_ring->next_to_clean, +			   (u64)buffer_info->dma, +			   buffer_info->length, +			   buffer_info->next_to_watch, +			   (u64)buffer_info->time_stamp); +	} + +	/* Print TX Rings */ +	if (!netif_msg_tx_done(adapter)) +		goto rx_ring_summary; + +	dev_info(&adapter->pdev->dev, "TX Rings Dump\n"); + +	/* Transmit Descriptor Formats +	 * +	 * Advanced Transmit Descriptor +	 *   +--------------------------------------------------------------+ +	 * 0 |         Buffer Address [63:0]                                | +	 *   +--------------------------------------------------------------+ +	 * 8 | PAYLEN  | PORTS  |CC|IDX | STA | DCMD  |DTYP|MAC|RSV| DTALEN | +	 *   +--------------------------------------------------------------+ +	 *   63      46 45    40 39 38 36 35 32 31   24             15       0 +	 */ + +	for (n = 0; n < adapter->num_tx_queues; n++) { +		tx_ring = adapter->tx_ring[n]; +		printk(KERN_INFO "------------------------------------\n"); +		printk(KERN_INFO "TX QUEUE INDEX = %d\n", tx_ring->queue_index); +		printk(KERN_INFO "------------------------------------\n"); +		printk(KERN_INFO "T [desc]     [address 63:0  ] " +			"[PlPOCIStDDM Ln] [bi->dma       ] " +			"leng  ntw timestamp        bi->skb\n"); + +		for (i = 0; tx_ring->desc && (i < tx_ring->count); i++) { +			tx_desc = E1000_TX_DESC_ADV(*tx_ring, i); +			buffer_info = &tx_ring->buffer_info[i]; +			u0 = (struct my_u0 *)tx_desc; +			printk(KERN_INFO "T [0x%03X]    %016llX %016llX %016llX" +				" %04X  %3X %016llX %p", i, +				le64_to_cpu(u0->a), +				le64_to_cpu(u0->b), +				(u64)buffer_info->dma, +				buffer_info->length, +				buffer_info->next_to_watch, +				(u64)buffer_info->time_stamp, +				buffer_info->skb); +			if (i == tx_ring->next_to_use && +				i == tx_ring->next_to_clean) +				printk(KERN_CONT " NTC/U\n"); +			else if (i == tx_ring->next_to_use) +				printk(KERN_CONT " NTU\n"); +			else if (i == tx_ring->next_to_clean) +				printk(KERN_CONT " NTC\n"); +			else +				printk(KERN_CONT "\n"); + +			if (netif_msg_pktdata(adapter) && buffer_info->dma != 0) +				print_hex_dump(KERN_INFO, "", +					DUMP_PREFIX_ADDRESS, +					16, 1, phys_to_virt(buffer_info->dma), +					buffer_info->length, true); +		} +	} + +	/* Print RX Rings Summary */ +rx_ring_summary: +	dev_info(&adapter->pdev->dev, "RX Rings Summary\n"); +	printk(KERN_INFO "Queue [NTU] [NTC]\n"); +	for (n = 0; n < adapter->num_rx_queues; n++) { +		rx_ring = adapter->rx_ring[n]; +		printk(KERN_INFO " %5d %5X %5X\n", n, +			   rx_ring->next_to_use, rx_ring->next_to_clean); +	} + +	/* Print RX Rings */ +	if (!netif_msg_rx_status(adapter)) +		goto exit; + +	dev_info(&adapter->pdev->dev, "RX Rings Dump\n"); + +	/* Advanced Receive Descriptor (Read) Format +	 *    63                                           1        0 +	 *    +-----------------------------------------------------+ +	 *  0 |       Packet Buffer Address [63:1]           |A0/NSE| +	 *    +----------------------------------------------+------+ +	 *  8 |       Header Buffer Address [63:1]           |  DD  | +	 *    +-----------------------------------------------------+ +	 * +	 * +	 * Advanced Receive Descriptor (Write-Back) Format +	 * +	 *   63       48 47    32 31  30      21 20 17 16   4 3     0 +	 *   +------------------------------------------------------+ +	 * 0 | Packet     IP     |SPH| HDR_LEN   | RSV|Packet|  RSS | +	 *   | Checksum   Ident  |   |           |    | Type | Type | +	 *   +------------------------------------------------------+ +	 * 8 | VLAN Tag | Length | Extended Error | Extended Status | +	 *   +------------------------------------------------------+ +	 *   63       48 47    32 31            20 19               0 +	 */ + +	for (n = 0; n < adapter->num_rx_queues; n++) { +		rx_ring = adapter->rx_ring[n]; +		printk(KERN_INFO "------------------------------------\n"); +		printk(KERN_INFO "RX QUEUE INDEX = %d\n", rx_ring->queue_index); +		printk(KERN_INFO "------------------------------------\n"); +		printk(KERN_INFO "R  [desc]      [ PktBuf     A0] " +			"[  HeadBuf   DD] [bi->dma       ] [bi->skb] " +			"<-- Adv Rx Read format\n"); +		printk(KERN_INFO "RWB[desc]      [PcsmIpSHl PtRs] " +			"[vl er S cks ln] ---------------- [bi->skb] " +			"<-- Adv Rx Write-Back format\n"); + +		for (i = 0; i < rx_ring->count; i++) { +			buffer_info = &rx_ring->buffer_info[i]; +			rx_desc = E1000_RX_DESC_ADV(*rx_ring, i); +			u0 = (struct my_u0 *)rx_desc; +			staterr = le32_to_cpu(rx_desc->wb.upper.status_error); +			if (staterr & E1000_RXD_STAT_DD) { +				/* Descriptor Done */ +				printk(KERN_INFO "RWB[0x%03X]     %016llX " +					"%016llX ---------------- %p", i, +					le64_to_cpu(u0->a), +					le64_to_cpu(u0->b), +					buffer_info->skb); +			} else { +				printk(KERN_INFO "R  [0x%03X]     %016llX " +					"%016llX %016llX %p", i, +					le64_to_cpu(u0->a), +					le64_to_cpu(u0->b), +					(u64)buffer_info->dma, +					buffer_info->skb); + +				if (netif_msg_pktdata(adapter)) { +					print_hex_dump(KERN_INFO, "", +						DUMP_PREFIX_ADDRESS, +						16, 1, +						phys_to_virt(buffer_info->dma), +						rx_ring->rx_buffer_len, true); +					if (rx_ring->rx_buffer_len +						< IGB_RXBUFFER_1024) +						print_hex_dump(KERN_INFO, "", +						  DUMP_PREFIX_ADDRESS, +						  16, 1, +						  phys_to_virt( +						    buffer_info->page_dma + +						    buffer_info->page_offset), +						  PAGE_SIZE/2, true); +				} +			} + +			if (i == rx_ring->next_to_use) +				printk(KERN_CONT " NTU\n"); +			else if (i == rx_ring->next_to_clean) +				printk(KERN_CONT " NTC\n"); +			else +				printk(KERN_CONT "\n"); + +		} +	} + +exit: +	return; +} + +  /**   * igb_read_clock - read raw cycle counter (to be used by time counter)   */ @@ -350,7 +680,7 @@ static int igb_alloc_queues(struct igb_adapter *adapter)  			goto err;  		ring->count = adapter->tx_ring_count;  		ring->queue_index = i; -		ring->pdev = adapter->pdev; +		ring->dev = &adapter->pdev->dev;  		ring->netdev = adapter->netdev;  		/* For 82575, context index must be unique per ring. */  		if (adapter->hw.mac.type == e1000_82575) @@ -364,7 +694,7 @@ static int igb_alloc_queues(struct igb_adapter *adapter)  			goto err;  		ring->count = adapter->rx_ring_count;  		ring->queue_index = i; -		ring->pdev = adapter->pdev; +		ring->dev = &adapter->pdev->dev;  		ring->netdev = adapter->netdev;  		ring->rx_buffer_len = MAXIMUM_ETHERNET_VLAN_SIZE;  		ring->flags = IGB_RING_FLAG_RX_CSUM; /* enable rx checksum */ @@ -1398,15 +1728,15 @@ static int __devinit igb_probe(struct pci_dev *pdev,  		return err;  	pci_using_dac = 0; -	err = pci_set_dma_mask(pdev, DMA_BIT_MASK(64)); +	err = dma_set_mask(&pdev->dev, DMA_BIT_MASK(64));  	if (!err) { -		err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)); +		err = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(64));  		if (!err)  			pci_using_dac = 1;  	} else { -		err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32)); +		err = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32));  		if (err) { -			err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32)); +			err = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32));  			if (err) {  				dev_err(&pdev->dev, "No usable DMA "  					"configuration, aborting\n"); @@ -1638,6 +1968,7 @@ static int __devinit igb_probe(struct pci_dev *pdev,  	dev_info(&pdev->dev, "%s: (PCIe:%s:%s) %pM\n",  		 netdev->name,  		 ((hw->bus.speed == e1000_bus_speed_2500) ? "2.5Gb/s" : +		  (hw->bus.speed == e1000_bus_speed_5000) ? "5.0Gb/s" :  		                                            "unknown"),  		 ((hw->bus.width == e1000_bus_width_pcie_x4) ? "Width x4" :  		  (hw->bus.width == e1000_bus_width_pcie_x2) ? "Width x2" : @@ -2079,7 +2410,7 @@ static int igb_close(struct net_device *netdev)   **/  int igb_setup_tx_resources(struct igb_ring *tx_ring)  { -	struct pci_dev *pdev = tx_ring->pdev; +	struct device *dev = tx_ring->dev;  	int size;  	size = sizeof(struct igb_buffer) * tx_ring->count; @@ -2092,9 +2423,10 @@ int igb_setup_tx_resources(struct igb_ring *tx_ring)  	tx_ring->size = tx_ring->count * sizeof(union e1000_adv_tx_desc);  	tx_ring->size = ALIGN(tx_ring->size, 4096); -	tx_ring->desc = pci_alloc_consistent(pdev, -	                                     tx_ring->size, -					     &tx_ring->dma); +	tx_ring->desc = dma_alloc_coherent(dev, +					   tx_ring->size, +					   &tx_ring->dma, +					   GFP_KERNEL);  	if (!tx_ring->desc)  		goto err; @@ -2105,7 +2437,7 @@ int igb_setup_tx_resources(struct igb_ring *tx_ring)  err:  	vfree(tx_ring->buffer_info); -	dev_err(&pdev->dev, +	dev_err(dev,  		"Unable to allocate memory for the transmit descriptor ring\n");  	return -ENOMEM;  } @@ -2229,7 +2561,7 @@ static void igb_configure_tx(struct igb_adapter *adapter)   **/  int igb_setup_rx_resources(struct igb_ring *rx_ring)  { -	struct pci_dev *pdev = rx_ring->pdev; +	struct device *dev = rx_ring->dev;  	int size, desc_len;  	size = sizeof(struct igb_buffer) * rx_ring->count; @@ -2244,8 +2576,10 @@ int igb_setup_rx_resources(struct igb_ring *rx_ring)  	rx_ring->size = rx_ring->count * desc_len;  	rx_ring->size = ALIGN(rx_ring->size, 4096); -	rx_ring->desc = pci_alloc_consistent(pdev, rx_ring->size, -					     &rx_ring->dma); +	rx_ring->desc = dma_alloc_coherent(dev, +					   rx_ring->size, +					   &rx_ring->dma, +					   GFP_KERNEL);  	if (!rx_ring->desc)  		goto err; @@ -2258,8 +2592,8 @@ int igb_setup_rx_resources(struct igb_ring *rx_ring)  err:  	vfree(rx_ring->buffer_info);  	rx_ring->buffer_info = NULL; -	dev_err(&pdev->dev, "Unable to allocate memory for " -		"the receive descriptor ring\n"); +	dev_err(dev, "Unable to allocate memory for the receive descriptor" +		" ring\n");  	return -ENOMEM;  } @@ -2635,8 +2969,8 @@ void igb_free_tx_resources(struct igb_ring *tx_ring)  	if (!tx_ring->desc)  		return; -	pci_free_consistent(tx_ring->pdev, tx_ring->size, -	                    tx_ring->desc, tx_ring->dma); +	dma_free_coherent(tx_ring->dev, tx_ring->size, +			  tx_ring->desc, tx_ring->dma);  	tx_ring->desc = NULL;  } @@ -2660,15 +2994,15 @@ void igb_unmap_and_free_tx_resource(struct igb_ring *tx_ring,  {  	if (buffer_info->dma) {  		if (buffer_info->mapped_as_page) -			pci_unmap_page(tx_ring->pdev, +			dma_unmap_page(tx_ring->dev,  					buffer_info->dma,  					buffer_info->length, -					PCI_DMA_TODEVICE); +					DMA_TO_DEVICE);  		else -			pci_unmap_single(tx_ring->pdev, +			dma_unmap_single(tx_ring->dev,  					buffer_info->dma,  					buffer_info->length, -					PCI_DMA_TODEVICE); +					DMA_TO_DEVICE);  		buffer_info->dma = 0;  	}  	if (buffer_info->skb) { @@ -2739,8 +3073,8 @@ void igb_free_rx_resources(struct igb_ring *rx_ring)  	if (!rx_ring->desc)  		return; -	pci_free_consistent(rx_ring->pdev, rx_ring->size, -	                    rx_ring->desc, rx_ring->dma); +	dma_free_coherent(rx_ring->dev, rx_ring->size, +			  rx_ring->desc, rx_ring->dma);  	rx_ring->desc = NULL;  } @@ -2776,10 +3110,10 @@ static void igb_clean_rx_ring(struct igb_ring *rx_ring)  	for (i = 0; i < rx_ring->count; i++) {  		buffer_info = &rx_ring->buffer_info[i];  		if (buffer_info->dma) { -			pci_unmap_single(rx_ring->pdev, +			dma_unmap_single(rx_ring->dev,  			                 buffer_info->dma,  					 rx_ring->rx_buffer_len, -					 PCI_DMA_FROMDEVICE); +					 DMA_FROM_DEVICE);  			buffer_info->dma = 0;  		} @@ -2788,10 +3122,10 @@ static void igb_clean_rx_ring(struct igb_ring *rx_ring)  			buffer_info->skb = NULL;  		}  		if (buffer_info->page_dma) { -			pci_unmap_page(rx_ring->pdev, +			dma_unmap_page(rx_ring->dev,  			               buffer_info->page_dma,  				       PAGE_SIZE / 2, -				       PCI_DMA_FROMDEVICE); +				       DMA_FROM_DEVICE);  			buffer_info->page_dma = 0;  		}  		if (buffer_info->page) { @@ -3479,7 +3813,7 @@ static inline bool igb_tx_csum_adv(struct igb_ring *tx_ring,  				   struct sk_buff *skb, u32 tx_flags)  {  	struct e1000_adv_tx_context_desc *context_desc; -	struct pci_dev *pdev = tx_ring->pdev; +	struct device *dev = tx_ring->dev;  	struct igb_buffer *buffer_info;  	u32 info = 0, tu_cmd = 0;  	unsigned int i; @@ -3530,7 +3864,7 @@ static inline bool igb_tx_csum_adv(struct igb_ring *tx_ring,  				break;  			default:  				if (unlikely(net_ratelimit())) -					dev_warn(&pdev->dev, +					dev_warn(dev,  					    "partial checksum but proto=%x!\n",  					    skb->protocol);  				break; @@ -3564,59 +3898,61 @@ static inline int igb_tx_map_adv(struct igb_ring *tx_ring, struct sk_buff *skb,  				 unsigned int first)  {  	struct igb_buffer *buffer_info; -	struct pci_dev *pdev = tx_ring->pdev; -	unsigned int len = skb_headlen(skb); +	struct device *dev = tx_ring->dev; +	unsigned int hlen = skb_headlen(skb);  	unsigned int count = 0, i;  	unsigned int f; +	u16 gso_segs = skb_shinfo(skb)->gso_segs ?: 1;  	i = tx_ring->next_to_use;  	buffer_info = &tx_ring->buffer_info[i]; -	BUG_ON(len >= IGB_MAX_DATA_PER_TXD); -	buffer_info->length = len; +	BUG_ON(hlen >= IGB_MAX_DATA_PER_TXD); +	buffer_info->length = hlen;  	/* set time_stamp *before* dma to help avoid a possible race */  	buffer_info->time_stamp = jiffies;  	buffer_info->next_to_watch = i; -	buffer_info->dma = pci_map_single(pdev, skb->data, len, -					  PCI_DMA_TODEVICE); -	if (pci_dma_mapping_error(pdev, buffer_info->dma)) +	buffer_info->dma = dma_map_single(dev, skb->data, hlen, +					  DMA_TO_DEVICE); +	if (dma_mapping_error(dev, buffer_info->dma))  		goto dma_error;  	for (f = 0; f < skb_shinfo(skb)->nr_frags; f++) { -		struct skb_frag_struct *frag; +		struct skb_frag_struct *frag = &skb_shinfo(skb)->frags[f]; +		unsigned int len = frag->size;  		count++;  		i++;  		if (i == tx_ring->count)  			i = 0; -		frag = &skb_shinfo(skb)->frags[f]; -		len = frag->size; -  		buffer_info = &tx_ring->buffer_info[i];  		BUG_ON(len >= IGB_MAX_DATA_PER_TXD);  		buffer_info->length = len;  		buffer_info->time_stamp = jiffies;  		buffer_info->next_to_watch = i;  		buffer_info->mapped_as_page = true; -		buffer_info->dma = pci_map_page(pdev, +		buffer_info->dma = dma_map_page(dev,  						frag->page,  						frag->page_offset,  						len, -						PCI_DMA_TODEVICE); -		if (pci_dma_mapping_error(pdev, buffer_info->dma)) +						DMA_TO_DEVICE); +		if (dma_mapping_error(dev, buffer_info->dma))  			goto dma_error;  	}  	tx_ring->buffer_info[i].skb = skb; -	tx_ring->buffer_info[i].gso_segs = skb_shinfo(skb)->gso_segs ?: 1; +	tx_ring->buffer_info[i].shtx = skb_shinfo(skb)->tx_flags; +	/* multiply data chunks by size of headers */ +	tx_ring->buffer_info[i].bytecount = ((gso_segs - 1) * hlen) + skb->len; +	tx_ring->buffer_info[i].gso_segs = gso_segs;  	tx_ring->buffer_info[first].next_to_watch = i;  	return ++count;  dma_error: -	dev_err(&pdev->dev, "TX DMA map failed\n"); +	dev_err(dev, "TX DMA map failed\n");  	/* clear timestamp and dma mappings for failed buffer_info mapping */  	buffer_info->dma = 0; @@ -3854,6 +4190,8 @@ static void igb_reset_task(struct work_struct *work)  	struct igb_adapter *adapter;  	adapter = container_of(work, struct igb_adapter, reset_task); +	igb_dump(adapter); +	netdev_err(adapter->netdev, "Reset adapter\n");  	igb_reinit_locked(adapter);  } @@ -4952,22 +5290,21 @@ static void igb_systim_to_hwtstamp(struct igb_adapter *adapter,  /**   * igb_tx_hwtstamp - utility function which checks for TX time stamp   * @q_vector: pointer to q_vector containing needed info - * @skb: packet that was just sent + * @buffer: pointer to igb_buffer structure   *   * If we were asked to do hardware stamping and such a time stamp is   * available, then it must have been for this skb here because we only   * allow only one such packet into the queue.   */ -static void igb_tx_hwtstamp(struct igb_q_vector *q_vector, struct sk_buff *skb) +static void igb_tx_hwtstamp(struct igb_q_vector *q_vector, struct igb_buffer *buffer_info)  {  	struct igb_adapter *adapter = q_vector->adapter; -	union skb_shared_tx *shtx = skb_tx(skb);  	struct e1000_hw *hw = &adapter->hw;  	struct skb_shared_hwtstamps shhwtstamps;  	u64 regval;  	/* if skb does not support hw timestamp or TX stamp not valid exit */ -	if (likely(!shtx->hardware) || +	if (likely(!buffer_info->shtx.hardware) ||  	    !(rd32(E1000_TSYNCTXCTL) & E1000_TSYNCTXCTL_VALID))  		return; @@ -4975,7 +5312,7 @@ static void igb_tx_hwtstamp(struct igb_q_vector *q_vector, struct sk_buff *skb)  	regval |= (u64)rd32(E1000_TXSTMPH) << 32;  	igb_systim_to_hwtstamp(adapter, &shhwtstamps, regval); -	skb_tstamp_tx(skb, &shhwtstamps); +	skb_tstamp_tx(buffer_info->skb, &shhwtstamps);  }  /** @@ -4990,7 +5327,6 @@ static bool igb_clean_tx_irq(struct igb_q_vector *q_vector)  	struct net_device *netdev = tx_ring->netdev;  	struct e1000_hw *hw = &adapter->hw;  	struct igb_buffer *buffer_info; -	struct sk_buff *skb;  	union e1000_adv_tx_desc *tx_desc, *eop_desc;  	unsigned int total_bytes = 0, total_packets = 0;  	unsigned int i, eop, count = 0; @@ -5006,19 +5342,12 @@ static bool igb_clean_tx_irq(struct igb_q_vector *q_vector)  			tx_desc = E1000_TX_DESC_ADV(*tx_ring, i);  			buffer_info = &tx_ring->buffer_info[i];  			cleaned = (i == eop); -			skb = buffer_info->skb; -			if (skb) { -				unsigned int segs, bytecount; +			if (buffer_info->skb) { +				total_bytes += buffer_info->bytecount;  				/* gso_segs is currently only valid for tcp */ -				segs = buffer_info->gso_segs; -				/* multiply data chunks by size of headers */ -				bytecount = ((segs - 1) * skb_headlen(skb)) + -					    skb->len; -				total_packets += segs; -				total_bytes += bytecount; - -				igb_tx_hwtstamp(q_vector, skb); +				total_packets += buffer_info->gso_segs; +				igb_tx_hwtstamp(q_vector, buffer_info);  			}  			igb_unmap_and_free_tx_resource(tx_ring, buffer_info); @@ -5058,7 +5387,7 @@ static bool igb_clean_tx_irq(struct igb_q_vector *q_vector)  		    !(rd32(E1000_STATUS) & E1000_STATUS_TXOFF)) {  			/* detected Tx unit hang */ -			dev_err(&tx_ring->pdev->dev, +			dev_err(tx_ring->dev,  				"Detected Tx Unit Hang\n"  				"  Tx Queue             <%d>\n"  				"  TDH                  <%x>\n" @@ -5137,7 +5466,7 @@ static inline void igb_rx_checksum_adv(struct igb_ring *ring,  	if (status_err & (E1000_RXD_STAT_TCPCS | E1000_RXD_STAT_UDPCS))  		skb->ip_summed = CHECKSUM_UNNECESSARY; -	dev_dbg(&ring->pdev->dev, "cksum success: bits %08X\n", status_err); +	dev_dbg(ring->dev, "cksum success: bits %08X\n", status_err);  }  static void igb_rx_hwtstamp(struct igb_q_vector *q_vector, u32 staterr, @@ -5192,7 +5521,7 @@ static bool igb_clean_rx_irq_adv(struct igb_q_vector *q_vector,  {  	struct igb_ring *rx_ring = q_vector->rx_ring;  	struct net_device *netdev = rx_ring->netdev; -	struct pci_dev *pdev = rx_ring->pdev; +	struct device *dev = rx_ring->dev;  	union e1000_adv_rx_desc *rx_desc , *next_rxd;  	struct igb_buffer *buffer_info , *next_buffer;  	struct sk_buff *skb; @@ -5232,9 +5561,9 @@ static bool igb_clean_rx_irq_adv(struct igb_q_vector *q_vector,  		cleaned_count++;  		if (buffer_info->dma) { -			pci_unmap_single(pdev, buffer_info->dma, +			dma_unmap_single(dev, buffer_info->dma,  					 rx_ring->rx_buffer_len, -					 PCI_DMA_FROMDEVICE); +					 DMA_FROM_DEVICE);  			buffer_info->dma = 0;  			if (rx_ring->rx_buffer_len >= IGB_RXBUFFER_1024) {  				skb_put(skb, length); @@ -5244,11 +5573,11 @@ static bool igb_clean_rx_irq_adv(struct igb_q_vector *q_vector,  		}  		if (length) { -			pci_unmap_page(pdev, buffer_info->page_dma, -				       PAGE_SIZE / 2, PCI_DMA_FROMDEVICE); +			dma_unmap_page(dev, buffer_info->page_dma, +				       PAGE_SIZE / 2, DMA_FROM_DEVICE);  			buffer_info->page_dma = 0; -			skb_fill_page_desc(skb, skb_shinfo(skb)->nr_frags++, +			skb_fill_page_desc(skb, skb_shinfo(skb)->nr_frags,  						buffer_info->page,  						buffer_info->page_offset,  						length); @@ -5353,12 +5682,12 @@ void igb_alloc_rx_buffers_adv(struct igb_ring *rx_ring, int cleaned_count)  				buffer_info->page_offset ^= PAGE_SIZE / 2;  			}  			buffer_info->page_dma = -				pci_map_page(rx_ring->pdev, buffer_info->page, +				dma_map_page(rx_ring->dev, buffer_info->page,  					     buffer_info->page_offset,  					     PAGE_SIZE / 2, -					     PCI_DMA_FROMDEVICE); -			if (pci_dma_mapping_error(rx_ring->pdev, -			                          buffer_info->page_dma)) { +					     DMA_FROM_DEVICE); +			if (dma_mapping_error(rx_ring->dev, +					      buffer_info->page_dma)) {  				buffer_info->page_dma = 0;  				rx_ring->rx_stats.alloc_failed++;  				goto no_buffers; @@ -5376,12 +5705,12 @@ void igb_alloc_rx_buffers_adv(struct igb_ring *rx_ring, int cleaned_count)  			buffer_info->skb = skb;  		}  		if (!buffer_info->dma) { -			buffer_info->dma = pci_map_single(rx_ring->pdev, +			buffer_info->dma = dma_map_single(rx_ring->dev,  			                                  skb->data,  							  bufsz, -							  PCI_DMA_FROMDEVICE); -			if (pci_dma_mapping_error(rx_ring->pdev, -			                          buffer_info->dma)) { +							  DMA_FROM_DEVICE); +			if (dma_mapping_error(rx_ring->dev, +					      buffer_info->dma)) {  				buffer_info->dma = 0;  				rx_ring->rx_stats.alloc_failed++;  				goto no_buffers;  |