From patchwork Sat May 14 10:41:25 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ard Biesheuvel X-Patchwork-Id: 67802 Delivered-To: patch@linaro.org Received: by 10.140.92.199 with SMTP id b65csp675888qge; Sat, 14 May 2016 03:41:38 -0700 (PDT) X-Received: by 10.98.93.131 with SMTP id n3mr30196101pfj.141.1463222498717; Sat, 14 May 2016 03:41:38 -0700 (PDT) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id ty2si30431689pac.54.2016.05.14.03.41.38; Sat, 14 May 2016 03:41:38 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of netdev-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org; spf=pass (google.com: best guess record for domain of netdev-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=netdev-owner@vger.kernel.org; dmarc=pass (p=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752059AbcENKld (ORCPT + 4 others); Sat, 14 May 2016 06:41:33 -0400 Received: from mail-wm0-f44.google.com ([74.125.82.44]:38156 "EHLO mail-wm0-f44.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751974AbcENKlc (ORCPT ); Sat, 14 May 2016 06:41:32 -0400 Received: by mail-wm0-f44.google.com with SMTP id g17so65491334wme.1 for ; Sat, 14 May 2016 03:41:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id; bh=NI4mqc5DR6pFo7P7YRol+0JtwtegY1tQ/vKZWCWCLH0=; b=cvZBunmpOXw/8cz3N+XmZNzhWAACZOmVgvtF4mL0XquD8OV39PhBo/503ZzbUsBjJ7 hTvimC3Ig8B3F2DbhVekItSx0L/Ti7lmAau8+ZDrqpKsaCtT39hTiaKPKNg/yzsRSfwv bqnK3kDFNWSN8hcqcemM+toxHxqhUCntQMbOQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=NI4mqc5DR6pFo7P7YRol+0JtwtegY1tQ/vKZWCWCLH0=; b=d4iI7GFrv4wbBhiSU8GDdjlpz4aXtGtfTzWLq/Xt3A4paMm2oihgR6AKXgE2pG9A5s 60yJbLyuvJ6nqXC9FBxJGXXvFqewHN0y4pm2lWJiyzCOM4egaz+dQ6R3VGXvivOcX80P sHtH/0m9M12yZm3XEXF0A7G1F3/WQxY0DJ2NRM2qL4ac/MJf63GsEK09ZehF0W6SIlgs B/ROkcYfbI3DBlhU6YQWALK3T5pah57jOJ/rOvfhjNjC0TdoQorqeayT6fSB00DivMAC yXbS7ttpLX70Bur3VbPqAKWU+jtEusvjGinLibfwummMbOGs+umt0vd+2YXuEDvFflcO JdWA== X-Gm-Message-State: AOPr4FUBUZnNPdCMp9ChWrfo3ZIh8YSFKGEGawpIlHzMlTL4sXhd/XVJ6XGH0VdJJfh6HUgI X-Received: by 10.28.97.213 with SMTP id v204mr8450971wmb.50.1463222490282; Sat, 14 May 2016 03:41:30 -0700 (PDT) Received: from localhost.localdomain ([195.55.142.58]) by smtp.gmail.com with ESMTPSA id jr8sm23023787wjb.15.2016.05.14.03.41.28 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sat, 14 May 2016 03:41:29 -0700 (PDT) From: Ard Biesheuvel To: netdev@vger.kernel.org, romieu@fr.zoreil.com Cc: ricardo.salveti@linaro.org, leif.lindholm@linaro.org, graeme.gregory@linaro.org, amit.kucheria@linaro.org, davem@davemloft.net, Ard Biesheuvel , Realtek linux nic maintainers Subject: [PATCH] r8169: default to 64-bit DMA on recent PCIe chips Date: Sat, 14 May 2016 12:41:25 +0200 Message-Id: <1463222485-4513-1-git-send-email-ard.biesheuvel@linaro.org> X-Mailer: git-send-email 2.7.4 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org The current logic around the 'use_dac' module parameter prevents the r81969 driver from being loadable on 64-bit systems without any RAM below 4 GB when the parameter is left at its default value. So introduce a new default value -1 which indicates that 64-bit DMA should be enabled on sufficiently recent PCIe chips, i.e., versions RTL_GIGA_MAC_VER_18 or later. Explicit param values of 0 or 1 retain the existing behavior of unconditionally enabling/disabling 64-bit DMA on 64-bit architectures (i.e., regardless of the type and version of the chip) Since PCIe chips do not need to CPlusCmd Dual Address Cycle to be set, make that conditional on the device type as well. Cc: Realtek linux nic maintainers Signed-off-by: Ard Biesheuvel --- This is a followup to 'r8169: default to 64-bit DMA on systems without memory below 4 GB' [1]. At the request of Francois, this version bases the decision whether to use 64-bit DMA by default on whether the device is PCIe and sufficiently recent, rather than whether the platform requires 64-bit DMA because it does not have any memory below 4 GB to begin with. This is safer, since it will prevent the use of such problematic cards on these platforms. [1] http://article.gmane.org/gmane.linux.network/412246 drivers/net/ethernet/realtek/r8169.c | 48 +++++++++++--------- 1 file changed, 27 insertions(+), 21 deletions(-) -- 2.7.4 diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c index 94f08f1e841c..80bb8ea265ad 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) { @@ -8247,11 +8233,30 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) } tp->mmio_addr = ioaddr; + /* Identify chip attached to board */ + rtl8169_get_mac_version(tp, dev, cfg->default_ver); + if (!pci_is_pcie(pdev)) netif_info(tp, probe, dev, "not PCI Express\n"); - /* 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); @@ -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);