linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Geert Uytterhoeven <geert@linux-m68k.org>
To: Heiner Kallweit <hkallweit1@gmail.com>
Cc: Krzysztof Kozlowski <krzk@kernel.org>,
	Andrew Lunn <andrew@lunn.ch>,
	"David S. Miller" <davem@davemloft.net>,
	Florian Fainelli <f.fainelli@gmail.com>,
	netdev <netdev@vger.kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Linux ARM <linux-arm-kernel@lists.infradead.org>,
	Stefan Agner <stefan@agner.ch>,
	Linux-Renesas <linux-renesas-soc@vger.kernel.org>
Subject: Re: [BUG bisect] Missing Micrel driver on VF50 (net: phy: check return code when requesting PHY driver module)
Date: Tue, 22 Jan 2019 14:51:58 +0100	[thread overview]
Message-ID: <CAMuHMdUz6J2cG-NCYPTRyS=1QZHGBWUFZPqj4ShEdioQLqu9qw@mail.gmail.com> (raw)
In-Reply-To: <67560e58-93b3-2bfa-9d5d-5956dae47806@gmail.com>

Hi Heiner,

On Fri, Jan 18, 2019 at 9:58 PM Heiner Kallweit <hkallweit1@gmail.com> wrote:
> On 18.01.2019 09:48, Krzysztof Kozlowski wrote:
> > On Fri, 18 Jan 2019 at 09:39, Krzysztof Kozlowski <krzk@kernel.org> wrote:
> >> On today's next (next-20190118) my Colibri VF50 board fails to boot up
> >> from network (DHCP, NFSv4 root). Looks like missing network adapter.
> >> Expected:
> >> [ 3.041773] Micrel KSZ8041 400d1000.ethernet-1:00: attached PHY driver
> >> [Micrel KSZ8041] (mii_bus:phy_addr=400d1000.ethernet-1:00, irq=POLL)
> >>
> >> Result:
> >> [ 15.614964] Root-NFS: no NFS server address
> >> [ 15.619353] VFS: Unable to mount root fs via NFS, trying floppy.
> >> [ 15.626762] VFS: Cannot open root device "nfs" or unknown-block(2,0): error -6
> >> [ 15.634252] Please append a correct "root=" boot option; here are the
> >> available partitions:
> >> [ 15.642791] 0100 16384 ram0
> >> [ 15.642804] (driver?)
> >> [ 15.649076] Kernel panic - not syncing: VFS: Unable to mount root fs
> >> on unknown-block(2,0)
> >> [ 15.657423] ---[ end Kernel panic - not syncing: VFS: Unable to mount
> >> root fs on unknown-block(2,0) ]---
> >>
> >> Bisect pointed to:
> >>     net: phy: check return code when requesting PHY driver module
> >
> > I see now in the logs:
> > [ 2.436822] mdio_bus 400d1000.ethernet-1:00: error -2 loading PHY
> > driver module for ID 0x00221513
> > which is kind of misleading. There is no initramfs so there is no
> > usermod library at this point. It is not needed. This seems to break
> > all DHCP/NFS root boots without initrd/initramfs.
> >
> Thanks for the report. Could you please provide your kernel config
> and the syslog of a boot before or w/o the patch in question?
>
> If you boot via nfs then I'd expect that the PHY driver is built-in and
> not a module. Therefore it's not fully clear to me yet why
> request_module() returns -ENOENT.

I'm seeing the same booting nfsroot on several Renesas boards.
E.g. on r8a7791/koelsch:

    mdio_bus ee700000.ethernet-ffffffff:01: error -2 loading PHY
driver module for ID 0x00221537
    sh-eth ee700000.ethernet: MDIO init failed: -2

This failure happens only when CONFIG_MODULES=y.
Reverting commit 13d0ab6750b20957 ("net: phy: check return code when
requesting PHY driver module") fixes the issue.

phy_request_driver_module() tries to load module
"mdio:00000000001000100001010100110111", which fails.
When CONFIG_MODULES=n, the error is ignored, and everything works fine.

0b00000000001000100001010100110111 == 0x00221537 == PHY_ID_KSZ8041RNLI,
which is served by drivers/net/phy/micrel.c.
Interestingly, CONFIG_MICREL_PHY=y, so I'm wondering why the PHY subsystem
tries to load a module for a driver which is already present in the first
place?

Oh, the following comment tries to explain:

        /* Request the appropriate module unconditionally; don't
         * bother trying to do so only if it isn't already loaded,
         * because that gets complicated. A hotplug event would have
         * done an unconditional modprobe anyway.

Hence request_module() failures are normal.

       ret = request_module(MDIO_MODULE_PREFIX MDIO_ID_FMT,
                            MDIO_ID_ARGS(phy_id));
       /* we only check for failures in executing the usermode binary,
        * not whether a PHY driver module exists for the PHY ID
        */
       if (IS_ENABLED(CONFIG_MODULES) && ret < 0) {
               phydev_err(dev, "error %d loading PHY driver module for
ID 0x%08x\n",
                          ret, phy_id);
               return ret;
       }

However:

    /**
     * __request_module - try to load a kernel module
     * @wait: wait (or not) for the operation to complete
     * @fmt: printf style format string for the name of the module
     * @...: arguments as specified in the format string
     *
     * Load a module using the user mode module loader. The function returns
     * zero on success or a negative errno code or positive exit code from
     * "modprobe" on failure.

So perhaps the check should be for "ret > 0"?

Gr{oetje,eeting}s,

                        Geert

-- 
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds

  parent reply	other threads:[~2019-01-22 13:52 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-01-18  8:39 [BUG bisect] Missing Micrel driver on VF50 (net: phy: check return code when requesting PHY driver module) Krzysztof Kozlowski
2019-01-18  8:48 ` Krzysztof Kozlowski
2019-01-18 20:58   ` Heiner Kallweit
2019-01-18 21:30     ` Heiner Kallweit
2019-01-19  9:51       ` Krzysztof Kozlowski
2019-01-22 13:51     ` Geert Uytterhoeven [this message]
2019-01-22 14:22       ` Krzysztof Kozlowski

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAMuHMdUz6J2cG-NCYPTRyS=1QZHGBWUFZPqj4ShEdioQLqu9qw@mail.gmail.com' \
    --to=geert@linux-m68k.org \
    --cc=andrew@lunn.ch \
    --cc=davem@davemloft.net \
    --cc=f.fainelli@gmail.com \
    --cc=hkallweit1@gmail.com \
    --cc=krzk@kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-renesas-soc@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=stefan@agner.ch \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).