mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: netdev-bot+sashiko@kernel.org
To: v.strassheim@linutronix.de
Cc: robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org,
	andrew@lunn.ch, olteanv@gmail.com, davem@davemloft.net,
	edumazet@google.com, kuba@kernel.org, pabeni@redhat.com,
	horms@kernel.org, linux@armlinux.org.uk, andrew+netdev@lunn.ch,
	hkallweit1@gmail.com, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org, netdev@vger.kernel.org,
	martin.kaistra@linutronix.de, b.spranger@linutronix.de
Subject: Re: [PATCH net-next v3 5/8] net: mdio: Add SoC-e SWIP MDIO controller driver
Date: Sun, 27 Sep 2026 12:28:29 +0000	[thread overview]
Message-ID: <179051210920.2160803.11497808586391363644@kernel.org> (raw)
In-Reply-To: <20260923-devel-vstrassheim-soce-dsa-ml-v3-5-ddebafcb9ba7@linutronix.de>

Thank you for your contribution! Sashiko AI review found 2 potential
issue(s) to consider.

Critical: 0 · High: 0 · Medium: 2 · Low: 0

If you believe none of the issues are legitimate, please reply to each
issue of Medium severity or higher and explain why the AI is wrong.
If any of them are legitimate and you plan to respin, please let patchwork
know by including "pw-bot: cr" as a separate line at the end of your reply
(one such reply per series is enough).

- [Medium] soce_mdio_iomap() (drivers/net/mdio/mdio-soce.c:48) returns
  whatever devm_ioremap() returns.
- [Medium] The external MDIO bus selector (bits 26:16) lives in the same
  32-bit control register as OPSTATUS (bit 0), but the idle check does…

--

net: mdio: Add SoC-e SWIP MDIO controller driver

This adds a driver for the MDIO controller in SoC-e Ethernet switch IP
cores. It supports Clause 22 and Clause 45 accesses. The transaction
control register also holds an external MDIO bus selector in bits 26:16,
which a generic MMIO MDIO mux manages and which the driver preserves when
it starts a transaction.

> diff --git a/drivers/net/mdio/mdio-soce.c b/drivers/net/mdio/mdio-soce.c
> new file mode 100644
> index 0000000000000..59c0b3da483eb
> --- /dev/null
> +++ b/drivers/net/mdio/mdio-soce.c
> @@ -0,0 +1,239 @@

[ ... ]

> +static void __iomem *soce_mdio_iomap(struct device *dev, int index)
> +{
> +	struct resource res;
> +	int ret;
> +
> +	ret = of_address_to_resource(dev->of_node, index, &res);
> +	if (ret)
> +		return IOMEM_ERR_PTR(ret);
> +
> +	return devm_ioremap(dev, res.start, resource_size(&res));

[Severity: Medium]
Can a failed mapping get past the checks in soce_mdio_probe()?

devm_ioremap() returns NULL on failure, not an ERR_PTR. This happens both
when the devres allocation fails and when ioremap() fails:

lib/devres.c:__devm_ioremap() {
	void __iomem **ptr, *addr = NULL;
	...
	if (!ptr)
		return NULL;
	...
	} else
		devres_free(ptr);

	return addr;
}

soce_mdio_probe() checks both results only with IS_ERR():

	priv->data = soce_mdio_iomap(dev, SOCE_MDIO_DATA_IOMAP_IDX);
	if (IS_ERR(priv->data))
		return PTR_ERR(priv->data);

	priv->ctrl = soce_mdio_iomap(dev, SOCE_MDIO_CTRL_IOMAP_IDX);
	if (IS_ERR(priv->ctrl))
		return PTR_ERR(priv->ctrl);

IS_ERR(NULL) is false, so probe would continue into
devm_of_mdiobus_register() with a NULL base.

The first bus access would then dereference NULL. That access comes either
from a PHY child during registration or through the mux:

mdio_mux_read()
  soce_mdio_read()
    soce_mdio_wait_for_idle()
      readl_poll_timeout(NULL, ...)

Could soce_mdio_iomap() convert a NULL result into IOMEM_ERR_PTR(-ENOMEM),
or could probe use IS_ERR_OR_NULL()? A helper that also requests the region
doesn't fit here, because the parent switch driver already requests the
whole range.

> +}
> +
> +static int soce_mdio_wait_for_idle(struct soce_mdio *priv)
> +{
> +	void __iomem *ctrl = priv->ctrl;
> +	u32 val;
> +
> +	return readl_poll_timeout(ctrl, val,
> +		!(val & SOCE_MDIO_CTRL_OPSTATUS), 10,
> +		SOCE_MDIO_TIMEOUT_US);
> +}
> +
> +static void soce_mdio_start(struct soce_mdio *priv, u32 command)
> +{
> +	void __iomem *ctrl = priv->ctrl;
> +
> +	/* Keep the currently selected MDIO bus while updating op bits. */
> +	command |= readl(ctrl) & SOCE_MDIO_CTRL_BUS_MASK;
> +	writel(command, ctrl);
> +}
> +
> +static int soce_mdio_read(struct mii_bus *bus, int phy_addr, int regnum)
> +{
> +	struct soce_mdio *priv = bus->priv;
> +	void __iomem *data = priv->data;
> +	u32 command;
> +	int ret;
> +
> +	ret = soce_mdio_wait_for_idle(priv);
> +	if (ret)
> +		return ret;

[Severity: Medium]
Does this idle check also protect the bus selector bits in the same
register?

The commit message says:

    Return a timeout instead of waiting indefinitely, and allow a later
    access to retry if the hardware becomes idle again.

So when a completion wait returns -ETIMEDOUT, the engine may still be busy.
Nothing aborts or resets it before mdio_lock is released, and there is no
mii_bus->reset callback.

If the next access goes through the mux to a different child bus,
mdio_mux_read() calls switch_fn before it calls the parent's read callback:

drivers/net/mdio/mdio-mux.c:mdio_mux_read() {
	...
	r = pb->switch_fn(pb->current_child, cb->bus_number, pb->switch_data);
	...
	r = pb->mii_bus->read(pb->mii_bus, phy_id, regnum);
	...
}

mdio_mux_mmioreg_switch_fn() then rewrites the selector halfword without
checking OPSTATUS:

			x = ioread16(p);
			y = (x & ~s->mask) | desired_child;
			if (x != y) {
				iowrite16((x & ~s->mask) | desired_child, p);

This means soce_mdio_wait_for_idle() runs only after bits 26:16 have
already changed.

If the hardware doesn't latch the selector when a transaction starts, could
the rest of the timed-out frame be sent to a different external MDIO bus?
The original PHY would get a truncated frame and the newly selected bus
would get a fragment from the middle of it. Neither the mux's current_child
nor the return code would show that this happened.

soce_mdio_write() and the c45 variants have the same ordering. Does this IP
latch the selector per transaction, or does the idle check also need to
cover the selector writes?

-- 
Sashiko AI review · https://netdev-ai.bots.linux.dev/sashiko/#/patchset/20260923-devel-vstrassheim-soce-dsa-ml-v3-0-ddebafcb9ba7%40linutronix.de

  parent reply	other threads:[~2026-09-27 12:28 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-23 10:39 [PATCH net-next v3 0/8] net: dsa: Add SoC-e DSA driver Vasilij Strassheim
2026-09-23 10:39 ` [PATCH net-next v3 1/8] dt-bindings: vendor-prefixes: Add soce Vasilij Strassheim
2026-09-23 10:39 ` [PATCH net-next v3 2/8] dt-bindings: net: Add SoC-e SWIP MDIO controller Vasilij Strassheim
2026-09-25 22:55   ` Andrew Lunn
2026-09-30 14:00     ` Vasilij Strassheim
2026-09-30 15:14       ` Andrew Lunn
2026-09-30 17:13         ` Vasilij Strassheim
2026-09-30 18:24           ` Andrew Lunn
2026-09-27 12:28   ` netdev-bot+sashiko
2026-09-23 10:39 ` [PATCH net-next v3 3/8] dt-bindings: net: dsa: Add SoC-e SWIP switch Vasilij Strassheim
2026-09-25 23:05   ` Andrew Lunn
2026-09-30 17:16     ` Vasilij Strassheim
2026-09-27 12:28   ` netdev-bot+sashiko
2026-09-23 10:39 ` [PATCH net-next v3 4/8] net: dsa: Add tag handling for SoC-e switches Vasilij Strassheim
     [not found]   ` <20260924104003.A49F31F000FF@smtp.kernel.org>
2026-09-25 12:46     ` Vasilij Strassheim
2026-09-27 12:28   ` netdev-bot+sashiko
2026-09-23 10:39 ` [PATCH net-next v3 5/8] net: mdio: Add SoC-e SWIP MDIO controller driver Vasilij Strassheim
2026-09-25 23:10   ` Andrew Lunn
2026-09-30 17:23     ` Vasilij Strassheim
2026-09-30 18:20       ` Andrew Lunn
2026-09-27 12:28   ` netdev-bot+sashiko [this message]
2026-09-23 10:39 ` [PATCH net-next v3 6/8] net: dsa: soce: Add basic support for SoC-e switch IP cores Vasilij Strassheim
2026-09-25 23:17   ` Andrew Lunn
2026-09-30 17:26     ` Vasilij Strassheim
2026-09-25 23:20   ` Andrew Lunn
2026-09-30 18:15     ` Vasilij Strassheim
2026-09-30 18:29       ` Andrew Lunn
2026-09-30 18:49         ` Vasilij Strassheim
2026-09-27 12:28   ` netdev-bot+sashiko
2026-09-23 10:39 ` [PATCH net-next v3 7/8] net: dsa: soce: Add VLAN offload support Vasilij Strassheim
2026-09-25 23:32   ` Andrew Lunn
2026-09-30 18:32     ` Vasilij Strassheim
2026-09-27 12:28   ` netdev-bot+sashiko
2026-09-23 10:39 ` [PATCH net-next v3 8/8] net: dsa: soce: Disable unsupported hardware STP Vasilij Strassheim
2026-09-25 23:24   ` Andrew Lunn
2026-09-30 18:29     ` Vasilij Strassheim
2026-09-30 18:41       ` Andrew Lunn
2026-09-27 12:28   ` netdev-bot+sashiko

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=179051210920.2160803.11497808586391363644@kernel.org \
    --to=netdev-bot+sashiko@kernel.org \
    --cc=andrew+netdev@lunn.ch \
    --cc=andrew@lunn.ch \
    --cc=b.spranger@linutronix.de \
    --cc=conor+dt@kernel.org \
    --cc=davem@davemloft.net \
    --cc=devicetree@vger.kernel.org \
    --cc=edumazet@google.com \
    --cc=hkallweit1@gmail.com \
    --cc=horms@kernel.org \
    --cc=krzk+dt@kernel.org \
    --cc=kuba@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux@armlinux.org.uk \
    --cc=martin.kaistra@linutronix.de \
    --cc=netdev@vger.kernel.org \
    --cc=olteanv@gmail.com \
    --cc=pabeni@redhat.com \
    --cc=robh@kernel.org \
    --cc=v.strassheim@linutronix.de \
    /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

all inboxes | Powered by JetHome®