Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755051AbcJOVbT (ORCPT ); Sat, 15 Oct 2016 17:31:19 -0400 Received: from shards.monkeyblade.net ([184.105.139.130]:36416 "EHLO shards.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751332AbcJOVbM (ORCPT ); Sat, 15 Oct 2016 17:31:12 -0400 Date: Sat, 15 Oct 2016 17:31:08 -0400 (EDT) Message-Id: <20161015.173108.998320512006202215.davem@davemloft.net> To: ard.biesheuvel@linaro.org Cc: David.Laight@ACULAB.COM, romieu@fr.zoreil.com, nic_swsd@realtek.com, netdev@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH v2] r8169: set coherent DMA mask as well as streaming DMA mask From: David Miller In-Reply-To: References: <1476452433-20518-1-git-send-email-ard.biesheuvel@linaro.org> <063D6719AE5E284EB5DD2968C1650D6DB01FF652@AcuExch.aculab.com> X-Mailer: Mew version 6.7 on Emacs 24.5 / Mule 6.0 (HANACHIRUSATO) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Greylist: Sender succeeded SMTP AUTH, not delayed by milter-greylist-4.5.12 (shards.monkeyblade.net [149.20.54.216]); Sat, 15 Oct 2016 14:31:12 -0700 (PDT) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2257 Lines: 52 From: Ard Biesheuvel Date: Fri, 14 Oct 2016 14:48:51 +0100 > >> On 14 Oct 2016, at 14:42, David Laight wrote: >> >> From: Of Ard Biesheuvel >>> Sent: 14 October 2016 14:41 >>> PCI devices that are 64-bit DMA capable should set the coherent >>> DMA mask as well as the streaming DMA mask. On some architectures, >>> these are managed separately, and so the coherent DMA mask will be >>> left at its default value of 32 if it is not set explicitly. This >>> results in errors such as >>> >>> r8169 Gigabit Ethernet driver 2.3LK-NAPI loaded >>> hwdev DMA mask = 0x00000000ffffffff, dev_addr = 0x00000080fbfff000 >>> swiotlb: coherent allocation failed for device 0000:02:00.0 size=4096 >>> CPU: 0 PID: 1062 Comm: systemd-udevd Not tainted 4.8.0+ #35 >>> Hardware name: AMD Seattle/Seattle, BIOS 10:53:24 Oct 13 2016 >>> >>> on systems without memory that is 32-bit addressable by PCI devices. >>> >>> Signed-off-by: Ard Biesheuvel >>> --- >>> v2: dropped the hunk that sets the coherent DMA mask to DMA_BIT_MASK(32), >>> which is unnecessary given that it is the default >>> >>> drivers/net/ethernet/realtek/r8169.c | 3 ++- >>> 1 file changed, 2 insertions(+), 1 deletion(-) >>> >>> diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c >>> index e55638c7505a..bf000d819a21 100644 >>> --- a/drivers/net/ethernet/realtek/r8169.c >>> +++ b/drivers/net/ethernet/realtek/r8169.c >>> @@ -8273,7 +8273,8 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) >>> 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))) { >>> + !pci_set_dma_mask(pdev, DMA_BIT_MASK(64)) && >>> + !pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64))) { >> >> Isn't there a dma_set_mask_and_coherent() function ? >> > > Not of the pci_xxx variety afaik You can often use the "dev_*" variants intechangably with the pci_*() ones. In fact you'll find that for several architectures pci_*() is implemented via calls to dev_*().