Revert "usbnet: smsc95xx: Fix deadlock on runtime resume"
This reverts commit b574d1e3e9 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 <lukas@wunner.de>
Cc: Oleksij Rempel <o.rempel@pengutronix.de>
Cc: Ferry Toth <fntoth@gmail.com>
Cc: Andrew Lunn <andrew@lunn.ch>
Cc: Andre Edich <andre.edich@microchip.com>
Cc: David S. Miller <davem@davemloft.net>
Cc: Sasha Levin <sashal@kernel.org>
Link: https://lore.kernel.org/r/20220826132137.GA24932@wunner.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user