From: Greg Kroah-Hartman Date: Mon, 29 Aug 2022 08:06:53 +0000 (+0200) Subject: Revert "usbnet: smsc95xx: Fix deadlock on runtime resume" X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=7ae43647f499509aeba22c761e2345eee26e4cd0;p=linux.git Revert "usbnet: smsc95xx: Fix deadlock on runtime resume" This reverts commit b574d1e3e9a2432b5acd9c4a9dc8d70b6a37aaf1 which is commit 7b960c967f2aa01ab8f45c5a0bd78e754cffdeee upstream. It is reported to cause problems, so drop it from the 5.15.y tree until the root cause can be determined. Reported-by: Lukas Wunner Cc: Oleksij Rempel Cc: Ferry Toth Cc: Andrew Lunn Cc: Andre Edich Cc: David S. Miller Cc: Sasha Levin Link: https://lore.kernel.org/r/20220826132137.GA24932@wunner.de Signed-off-by: Greg Kroah-Hartman --- diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c index 460e90eb528f8..3eb62197c2f55 100644 --- a/drivers/net/usb/smsc95xx.c +++ b/drivers/net/usb/smsc95xx.c @@ -69,7 +69,6 @@ struct smsc95xx_priv { struct fwnode_handle *irqfwnode; struct mii_bus *mdiobus; struct phy_device *phydev; - struct task_struct *pm_task; }; static bool turbo_mode = true; @@ -79,14 +78,13 @@ MODULE_PARM_DESC(turbo_mode, "Enable multiple frames per Rx transaction"); static int __must_check __smsc95xx_read_reg(struct usbnet *dev, u32 index, u32 *data, int in_pm) { - struct smsc95xx_priv *pdata = dev->driver_priv; u32 buf; int ret; int (*fn)(struct usbnet *, u8, u8, u16, u16, void *, u16); BUG_ON(!dev); - if (current != pdata->pm_task) + if (!in_pm) fn = usbnet_read_cmd; else fn = usbnet_read_cmd_nopm; @@ -110,14 +108,13 @@ static int __must_check __smsc95xx_read_reg(struct usbnet *dev, u32 index, static int __must_check __smsc95xx_write_reg(struct usbnet *dev, u32 index, u32 data, int in_pm) { - struct smsc95xx_priv *pdata = dev->driver_priv; u32 buf; int ret; int (*fn)(struct usbnet *, u8, u8, u16, u16, const void *, u16); BUG_ON(!dev); - if (current != pdata->pm_task) + if (!in_pm) fn = usbnet_write_cmd; else fn = usbnet_write_cmd_nopm; @@ -1485,12 +1482,9 @@ static int smsc95xx_suspend(struct usb_interface *intf, pm_message_t message) u32 val, link_up; int ret; - pdata->pm_task = current; - ret = usbnet_suspend(intf, message); if (ret < 0) { netdev_warn(dev->net, "usbnet_suspend error\n"); - pdata->pm_task = NULL; return ret; } @@ -1730,7 +1724,6 @@ done: if (ret && PMSG_IS_AUTO(message)) usbnet_resume(intf); - pdata->pm_task = NULL; return ret; } @@ -1751,31 +1744,29 @@ static int smsc95xx_resume(struct usb_interface *intf) /* do this first to ensure it's cleared even in error case */ pdata->suspend_flags = 0; - pdata->pm_task = current; - if (suspend_flags & SUSPEND_ALLMODES) { /* clear wake-up sources */ ret = smsc95xx_read_reg_nopm(dev, WUCSR, &val); if (ret < 0) - goto done; + return ret; val &= ~(WUCSR_WAKE_EN_ | WUCSR_MPEN_); ret = smsc95xx_write_reg_nopm(dev, WUCSR, val); if (ret < 0) - goto done; + return ret; /* clear wake-up status */ ret = smsc95xx_read_reg_nopm(dev, PM_CTRL, &val); if (ret < 0) - goto done; + return ret; val &= ~PM_CTL_WOL_EN_; val |= PM_CTL_WUPS_; ret = smsc95xx_write_reg_nopm(dev, PM_CTRL, val); if (ret < 0) - goto done; + return ret; } phy_init_hw(pdata->phydev); @@ -1784,20 +1775,15 @@ static int smsc95xx_resume(struct usb_interface *intf) if (ret < 0) netdev_warn(dev->net, "usbnet_resume error\n"); -done: - pdata->pm_task = NULL; return ret; } static int smsc95xx_reset_resume(struct usb_interface *intf) { struct usbnet *dev = usb_get_intfdata(intf); - struct smsc95xx_priv *pdata = dev->driver_priv; int ret; - pdata->pm_task = current; ret = smsc95xx_reset(dev); - pdata->pm_task = NULL; if (ret < 0) return ret;