[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <Yowv95s7g7Ou5U8J@lunn.ch>
Date: Tue, 24 May 2022 03:08:07 +0200
From: Andrew Lunn <andrew@...n.ch>
To: Lukas Wunner <lukas@...ner.de>
Cc: Marek Szyprowski <m.szyprowski@...sung.com>,
"David S. Miller" <davem@...emloft.net>,
Jakub Kicinski <kuba@...nel.org>,
Paolo Abeni <pabeni@...hat.com>,
Eric Dumazet <edumazet@...gle.com>, netdev@...r.kernel.org,
linux-usb@...r.kernel.org,
Steve Glendinning <steve.glendinning@...well.net>,
UNGLinuxDriver@...rochip.com, Oliver Neukum <oneukum@...e.com>,
Andre Edich <andre.edich@...rochip.com>,
Oleksij Rempel <linux@...pel-privat.de>,
Martyn Welch <martyn.welch@...labora.com>,
Gabriel Hojda <ghojda@...urs.ro>,
Christoph Fritz <chf.fritz@...glemail.com>,
Lino Sanfilippo <LinoSanfilippo@....de>,
Philipp Rosenberger <p.rosenberger@...bus.com>,
Heiner Kallweit <hkallweit1@...il.com>,
Russell King <linux@...linux.org.uk>,
Ferry Toth <fntoth@...il.com>,
Krzysztof Kozlowski <krzk@...nel.org>,
'Linux Samsung SOC' <linux-samsung-soc@...r.kernel.org>
Subject: Re: [PATCH net-next v3 5/7] usbnet: smsc95xx: Forward PHY interrupts
to PHY driver to avoid polling
> @@ -976,6 +977,25 @@ static irqreturn_t phy_interrupt(int irq, void *phy_dat)
> struct phy_driver *drv = phydev->drv;
> irqreturn_t ret;
>
> + if (IS_ENABLED(CONFIG_PM_SLEEP) &&
> + (phydev->mdio.dev.power.is_prepared ||
> + phydev->mdio.dev.power.is_suspended)) {
> + struct net_device *netdev = phydev->attached_dev;
> +
> + if (netdev) {
> + struct device *parent = netdev->dev.parent;
> +
> + if (netdev->wol_enabled)
> + pm_system_wakeup();
> + else if (device_may_wakeup(&netdev->dev))
> + pm_wakeup_dev_event(&netdev->dev, 0, true);
> + else if (parent && device_may_wakeup(parent))
> + pm_wakeup_dev_event(parent, 0, true);
> + }
> +
> + return IRQ_HANDLED;
I'm not sure you can just throw the interrupt away. There have been
issues with WoL, where the WoL signal has been applied to a PMC, not
an actual interrupt. Yet the PHY driver assumes it is an
interrupt. And in order for WoL to work correctly, it needs the
interrupt handler to be called. We said the hardware is broken, WoL
cannot work for that setup.
Here you have correct hardware, but you are throwing the interrupt
away, which will have the same result. So i think you need to abort
the suspend, get the bus working again, and call the interrupt
handler. If this is a WoL interrupt you are supposed to be waking up
anyway.
Andrew
Powered by blists - more mailing lists