diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/net/ethernet/realtek/r8169.c | 44 | 
1 files changed, 25 insertions, 19 deletions
| diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c index 94f08f1e841c..0e62d74b09b3 100644 --- a/drivers/net/ethernet/realtek/r8169.c +++ b/drivers/net/ethernet/realtek/r8169.c @@ -345,7 +345,7 @@ static const struct pci_device_id rtl8169_pci_tbl[] = {  MODULE_DEVICE_TABLE(pci, rtl8169_pci_tbl);  static int rx_buf_sz = 16383; -static int use_dac; +static int use_dac = -1;  static struct {  	u32 msg_enable;  } debug = { -1 }; @@ -8224,20 +8224,6 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)  		goto err_out_mwi_2;  	} -	tp->cp_cmd = 0; - -	if ((sizeof(dma_addr_t) > 4) && -	    !pci_set_dma_mask(pdev, DMA_BIT_MASK(64)) && use_dac) { -		tp->cp_cmd |= PCIDAC; -		dev->features |= NETIF_F_HIGHDMA; -	} else { -		rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32)); -		if (rc < 0) { -			netif_err(tp, probe, dev, "DMA configuration failed\n"); -			goto err_out_free_res_3; -		} -	} -  	/* ioremap MMIO region */  	ioaddr = ioremap(pci_resource_start(pdev, region), R8169_REGS_SIZE);  	if (!ioaddr) { @@ -8253,6 +8239,25 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)  	/* Identify chip attached to board */  	rtl8169_get_mac_version(tp, dev, cfg->default_ver); +	tp->cp_cmd = 0; + +	if ((sizeof(dma_addr_t) > 4) && +	    (use_dac == 1 || (use_dac == -1 && pci_is_pcie(pdev) && +			      tp->mac_version >= RTL_GIGA_MAC_VER_18)) && +	    !pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) { + +		/* CPlusCmd Dual Access Cycle is only needed for non-PCIe */ +		if (!pci_is_pcie(pdev)) +			tp->cp_cmd |= PCIDAC; +		dev->features |= NETIF_F_HIGHDMA; +	} else { +		rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32)); +		if (rc < 0) { +			netif_err(tp, probe, dev, "DMA configuration failed\n"); +			goto err_out_unmap_4; +		} +	} +  	rtl_init_rxcfg(tp);  	rtl_irq_disable(tp); @@ -8412,12 +8417,12 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)  					   &tp->counters_phys_addr, GFP_KERNEL);  	if (!tp->counters) {  		rc = -ENOMEM; -		goto err_out_msi_4; +		goto err_out_msi_5;  	}  	rc = register_netdev(dev);  	if (rc < 0) -		goto err_out_cnt_5; +		goto err_out_cnt_6;  	pci_set_drvdata(pdev, dev); @@ -8451,12 +8456,13 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)  out:  	return rc; -err_out_cnt_5: +err_out_cnt_6:  	dma_free_coherent(&pdev->dev, sizeof(*tp->counters), tp->counters,  			  tp->counters_phys_addr); -err_out_msi_4: +err_out_msi_5:  	netif_napi_del(&tp->napi);  	rtl_disable_msi(pdev, tp); +err_out_unmap_4:  	iounmap(ioaddr);  err_out_free_res_3:  	pci_release_regions(pdev); | 
