2015-11-11 08:50:52

by Jongman Heo

[permalink] [raw]
Subject: [4.4 regression] 46a7fd8a : pcnet32: use pci_set_dma_mask insted of pci_dma_supported


Hi,

I'm using Fedora 23 Linux Guest on top of VMWare workstation (version 10), running on Windows 7 Host.

After pulling Merge branch 'akpm' from latest Linus git, my ethernet interface doesn't work.

>From dmesg, I can see that pcnet32 doesn't support 32bit PCI busmaster DMA, as follows.

[ 1.616867] libphy: Fixed MDIO Bus: probed
[ 1.616871] pcnet32: pcnet32.c:v1.35 21.Apr.2008 [email protected]
[ 1.617232] pcnet32: architecture does not support 32bit PCI busmaster DMA
[ 1.617304] VMware vmxnet3 virtual NIC driver - version 1.4.3.0-k-NAPI

Without the commit, pcnet32 ethernet is recognized correctly.

[ 1.173395] libphy: Fixed MDIO Bus: probed
[ 1.173399] pcnet32: pcnet32.c:v1.35 21.Apr.2008 [email protected]
[ 1.173637] pcnet32: PCnet/PCI II 79C970A at 0x2000, 00:0c:29:07:e2:51 assigned IRQ 19
[ 1.173746] pcnet32: eth0: registered as PCnet/PCI II 79C970A
[ 1.173799] pcnet32: 1 cards_found
[ 1.173802] VMware vmxnet3 virtual NIC driver - version 1.4.2.0-k-NAPI


Below is git bisect log.

46a7fd8a9b302116b3263bc8e47f8f08c0d3a2ca is the first bad commit
commit 46a7fd8a9b302116b3263bc8e47f8f08c0d3a2ca
Author: Christoph Hellwig <[email protected]>
Date: Tue Nov 10 14:45:17 2015 -0800

pcnet32: use pci_set_dma_mask insted of pci_dma_supported

All drivers should be using dma_set_mask / pci_set_dma_mask to try to
set the dma mask instead of just querying it. Without that some iommu
implementations may not work.

pci_dma_supported is removed entirely, but dma_supported stays for
dma_ops implementations for now.

This patch (of 15):

This ensures the dma mask that is supported by the driver is recorded
in the device structure.

Signed-off-by: Christoph Hellwig <[email protected]>
Acked-by: Don Fry <[email protected]>
Cc: "David S. Miller" <[email protected]>
Cc: "James E.J. Bottomley" <[email protected]>
Cc: Alan Stern <[email protected]>
Cc: Alexandre Courbot <[email protected]>
Cc: Alexey Khoroshilov <[email protected]>
Cc: Ben Skeggs <[email protected]>
Cc: Christoph Hellwig <[email protected]>
Cc: Daniel Vetter <[email protected]>
Cc: Dave Airlie <[email protected]>
Cc: David Airlie <[email protected]>
Cc: Greg Kroah-Hartman <[email protected]>
Cc: Hans Verkuil <[email protected]>
Cc: Helge Deller <[email protected]>
Cc: Jiri Slaby <[email protected]>
Cc: Mauro Carvalho Chehab <[email protected]>
Cc: Pawel Osciak <[email protected]>
Cc: Sakari Ailus <[email protected]>
Cc: Sergey Kozlov <[email protected]>
Cc: Shradha Shah <[email protected]>
Cc: Solarflare linux maintainers <[email protected]>
Cc: Steven Toth <[email protected]>
Cc: Thierry Reding <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>

:040000 040000 dd0a67b69180edc5243578c8504cd2bd5d4efe24 1f92cb3d86111d725f4cf6a84076e8d9eee04362 M drivers

# git bisect log
git bisect start
# bad: [c5a37883f42be712a989e54d5d6c0159b0e56599] Merge branch 'akpm' (patches from Andrew)
git bisect bad c5a37883f42be712a989e54d5d6c0159b0e56599
# good: [ae36ce07abbdde3521dc0ef7e32143b88718cd21] Merge branch 'drm-fixes' of git://people.freedesktop.org/~airlied/linux
git bisect good ae36ce07abbdde3521dc0ef7e32143b88718cd21
# good: [be596aaa74090f553c61505ad03bb7a7460e5d23] Add current selection check.
git bisect good be596aaa74090f553c61505ad03bb7a7460e5d23
# good: [5dfe5b2c714a5bea0908c1e00da0e8e00535f55c] Merge branch 'misc' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild
git bisect good 5dfe5b2c714a5bea0908c1e00da0e8e00535f55c
# bad: [111be8b28d87769dfbde901602d262902575805d] cx88: use pci_set_dma_mask insted of pci_dma_supported
git bisect bad 111be8b28d87769dfbde901602d262902575805d
# good: [3368e8fbcda539e4f9d6cdb750f23c25021698c9] lib/string.c: add ULL suffix to the constant definition
git bisect good 3368e8fbcda539e4f9d6cdb750f23c25021698c9
# bad: [bad007bca7b7643fea786737071c86088ba2803b] tw68-core: use pci_set_dma_mask insted of pci_dma_supported
git bisect bad bad007bca7b7643fea786737071c86088ba2803b
# bad: [46a7fd8a9b302116b3263bc8e47f8f08c0d3a2ca] pcnet32: use pci_set_dma_mask insted of pci_dma_supported
git bisect bad 46a7fd8a9b302116b3263bc8e47f8f08c0d3a2ca
# first bad commit: [46a7fd8a9b302116b3263bc8e47f8f08c0d3a2ca] pcnet32: use pci_set_dma_mask insted of pci_dma_supported????{.n?+???????+%?????ݶ??w??{.n?+????{??G?????{ay?ʇڙ?,j??f???h?????????z_??(?階?ݢj"???m??????G????????????&???~???iO???z??v?^?m???? ????????I?


2015-11-11 11:58:26

by Christoph Hellwig

[permalink] [raw]
Subject: Re: [4.4 regression] 46a7fd8a : pcnet32: use pci_set_dma_mask insted of pci_dma_supported

Can you try the patch below?

diff --git a/drivers/net/ethernet/amd/pcnet32.c b/drivers/net/ethernet/amd/pcnet32.c
index e2afabf..7ccebae 100644
--- a/drivers/net/ethernet/amd/pcnet32.c
+++ b/drivers/net/ethernet/amd/pcnet32.c
@@ -1500,10 +1500,11 @@ pcnet32_probe_pci(struct pci_dev *pdev, const struct pci_device_id *ent)
return -ENODEV;
}

- if (!pci_set_dma_mask(pdev, PCNET32_DMA_MASK)) {
+ err = pci_set_dma_mask(pdev, PCNET32_DMA_MASK);
+ if (err) {
if (pcnet32_debug & NETIF_MSG_PROBE)
pr_err("architecture does not support 32bit PCI busmaster DMA\n");
- return -ENODEV;
+ return err;
}
if (!request_region(ioaddr, PCNET32_TOTAL_SIZE, "pcnet32_probe_pci")) {
if (pcnet32_debug & NETIF_MSG_PROBE)

2015-11-12 01:21:00

by Jongman Heo

[permalink] [raw]
Subject: Re: Re: [4.4 regression] 46a7fd8a : pcnet32: use pci_set_dma_mask insted of pci_dma_supported

>
> ------- Original Message -------
> Sender : Christoph Hellwig<[email protected]>
> Date : 2015-11-11 20:58 (GMT+09:00)
> Title : Re: [4.4 regression] 46a7fd8a : pcnet32: use pci_set_dma_mask insted of pci_dma_supported
>
> Can you try the patch below?
>
> diff --git a/drivers/net/ethernet/amd/pcnet32.c b/drivers/net/ethernet/amd/pcnet32.c
> index e2afabf..7ccebae 100644
> --- a/drivers/net/ethernet/amd/pcnet32.c
> +++ b/drivers/net/ethernet/amd/pcnet32.c
> @@ -1500,10 +1500,11 @@ pcnet32_probe_pci(struct pci_dev *pdev, const struct pci_device_id *ent)
> return -ENODEV;
> }
>
> - if (!pci_set_dma_mask(pdev, PCNET32_DMA_MASK)) {
> + err = pci_set_dma_mask(pdev, PCNET32_DMA_MASK);
> + if (err) {
> if (pcnet32_debug & NETIF_MSG_PROBE)
> pr_err("architecture does not support 32bit PCI busmaster DMA\n");
> - return -ENODEV;
> + return err;
> }
> if (!request_region(ioaddr, PCNET32_TOTAL_SIZE, "pcnet32_probe_pci")) {
> if (pcnet32_debug & NETIF_MSG_PROBE)
>

Yes, now ethernet device works with the patch.

Thanks,
Jongman Heo.????{.n?+???????+%?????ݶ??w??{.n?+????{??G?????{ay?ʇڙ?,j??f???h?????????z_??(?階?ݢj"???m??????G????????????&???~???iO???z??v?^?m???? ????????I?

2015-11-16 04:22:21

by Don Fry

[permalink] [raw]
Subject: Re: [4.4 regression] 46a7fd8a : pcnet32: use pci_set_dma_mask insted of pci_dma_supported

On Wed, 2015-11-11 at 12:58 +0100, Christoph Hellwig wrote:
> Can you try the patch below?

Acked-by: Don Fry <[email protected]>
--
Since pci_set_dma_mask() returns the opposite of pci_dma_supported(),
this fix is required for proper operation. The original patch in
October was faulty.
>
> diff --git a/drivers/net/ethernet/amd/pcnet32.c b/drivers/net/ethernet/amd/pcnet32.c
> index e2afabf..7ccebae 100644
> --- a/drivers/net/ethernet/amd/pcnet32.c
> +++ b/drivers/net/ethernet/amd/pcnet32.c
> @@ -1500,10 +1500,11 @@ pcnet32_probe_pci(struct pci_dev *pdev, const struct pci_device_id *ent)
> return -ENODEV;
> }
>
> - if (!pci_set_dma_mask(pdev, PCNET32_DMA_MASK)) {
> + err = pci_set_dma_mask(pdev, PCNET32_DMA_MASK);
> + if (err) {
> if (pcnet32_debug & NETIF_MSG_PROBE)
> pr_err("architecture does not support 32bit PCI busmaster DMA\n");
> - return -ENODEV;
> + return err;
> }
> if (!request_region(ioaddr, PCNET32_TOTAL_SIZE, "pcnet32_probe_pci")) {
> if (pcnet32_debug & NETIF_MSG_PROBE)