Commit 1db34aa5 authored by Bagas Sanjaya's avatar Bagas Sanjaya Committed by David S. Miller

Revert "net: wwan: iosm: enable runtime pm support for 7560"

Runtime power management support breaks Intel LTE modem where dmesg dump
showes timeout errors:

```
[   72.027442] iosm 0000:01:00.0: msg timeout
[   72.531638] iosm 0000:01:00.0: msg timeout
[   73.035414] iosm 0000:01:00.0: msg timeout
[   73.540359] iosm 0000:01:00.0: msg timeout
```

Furthermore, when shutting down with `poweroff` and modem attached, the
system rebooted instead of powering down as expected. The modem works
again only after power cycling.

Revert runtime power management support for IOSM driver as introduced by
commit e4f5073d ("net: wwan: iosm: enable runtime pm support for
7560").

Fixes: e4f5073d ("net: wwan: iosm: enable runtime pm support for 7560")
Reported-by: default avatarMartin <mwolf@adiumentum.com>
Closes: https://bugzilla.kernel.org/show_bug.cgi?id=217996
Link: https://lore.kernel.org/r/267abf02-4b60-4a2e-92cd-709e3da6f7d3@gmail.com/Signed-off-by: default avatarBagas Sanjaya <bagasdotme@gmail.com>
Reviewed-by: default avatarLoic Poulain <loic.poulain@linaro.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 1d30162f
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
*/ */
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/pm_runtime.h>
#include "iosm_ipc_chnl_cfg.h" #include "iosm_ipc_chnl_cfg.h"
#include "iosm_ipc_devlink.h" #include "iosm_ipc_devlink.h"
...@@ -632,11 +631,6 @@ static void ipc_imem_run_state_worker(struct work_struct *instance) ...@@ -632,11 +631,6 @@ static void ipc_imem_run_state_worker(struct work_struct *instance)
/* Complete all memory stores after setting bit */ /* Complete all memory stores after setting bit */
smp_mb__after_atomic(); smp_mb__after_atomic();
if (ipc_imem->pcie->pci->device == INTEL_CP_DEVICE_7560_ID) {
pm_runtime_mark_last_busy(ipc_imem->dev);
pm_runtime_put_autosuspend(ipc_imem->dev);
}
return; return;
err_ipc_mux_deinit: err_ipc_mux_deinit:
...@@ -1240,7 +1234,6 @@ void ipc_imem_cleanup(struct iosm_imem *ipc_imem) ...@@ -1240,7 +1234,6 @@ void ipc_imem_cleanup(struct iosm_imem *ipc_imem)
/* forward MDM_NOT_READY to listeners */ /* forward MDM_NOT_READY to listeners */
ipc_uevent_send(ipc_imem->dev, UEVENT_MDM_NOT_READY); ipc_uevent_send(ipc_imem->dev, UEVENT_MDM_NOT_READY);
pm_runtime_get_sync(ipc_imem->dev);
hrtimer_cancel(&ipc_imem->td_alloc_timer); hrtimer_cancel(&ipc_imem->td_alloc_timer);
hrtimer_cancel(&ipc_imem->tdupdate_timer); hrtimer_cancel(&ipc_imem->tdupdate_timer);
...@@ -1426,16 +1419,6 @@ struct iosm_imem *ipc_imem_init(struct iosm_pcie *pcie, unsigned int device_id, ...@@ -1426,16 +1419,6 @@ struct iosm_imem *ipc_imem_init(struct iosm_pcie *pcie, unsigned int device_id,
set_bit(IOSM_DEVLINK_INIT, &ipc_imem->flag); set_bit(IOSM_DEVLINK_INIT, &ipc_imem->flag);
} }
if (!pm_runtime_enabled(ipc_imem->dev))
pm_runtime_enable(ipc_imem->dev);
pm_runtime_set_autosuspend_delay(ipc_imem->dev,
IPC_MEM_AUTO_SUSPEND_DELAY_MS);
pm_runtime_use_autosuspend(ipc_imem->dev);
pm_runtime_allow(ipc_imem->dev);
pm_runtime_mark_last_busy(ipc_imem->dev);
return ipc_imem; return ipc_imem;
devlink_channel_fail: devlink_channel_fail:
ipc_devlink_deinit(ipc_imem->ipc_devlink); ipc_devlink_deinit(ipc_imem->ipc_devlink);
......
...@@ -103,8 +103,6 @@ struct ipc_chnl_cfg; ...@@ -103,8 +103,6 @@ struct ipc_chnl_cfg;
#define FULLY_FUNCTIONAL 0 #define FULLY_FUNCTIONAL 0
#define IOSM_DEVLINK_INIT 1 #define IOSM_DEVLINK_INIT 1
#define IPC_MEM_AUTO_SUSPEND_DELAY_MS 5000
/* List of the supported UL/DL pipes. */ /* List of the supported UL/DL pipes. */
enum ipc_mem_pipes { enum ipc_mem_pipes {
IPC_MEM_PIPE_0 = 0, IPC_MEM_PIPE_0 = 0,
......
...@@ -6,7 +6,6 @@ ...@@ -6,7 +6,6 @@
#include <linux/acpi.h> #include <linux/acpi.h>
#include <linux/bitfield.h> #include <linux/bitfield.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/pm_runtime.h>
#include <net/rtnetlink.h> #include <net/rtnetlink.h>
#include "iosm_ipc_imem.h" #include "iosm_ipc_imem.h"
...@@ -438,8 +437,7 @@ static int __maybe_unused ipc_pcie_resume_cb(struct device *dev) ...@@ -438,8 +437,7 @@ static int __maybe_unused ipc_pcie_resume_cb(struct device *dev)
return 0; return 0;
} }
static DEFINE_RUNTIME_DEV_PM_OPS(iosm_ipc_pm, ipc_pcie_suspend_cb, static SIMPLE_DEV_PM_OPS(iosm_ipc_pm, ipc_pcie_suspend_cb, ipc_pcie_resume_cb);
ipc_pcie_resume_cb, NULL);
static struct pci_driver iosm_ipc_driver = { static struct pci_driver iosm_ipc_driver = {
.name = KBUILD_MODNAME, .name = KBUILD_MODNAME,
......
...@@ -3,8 +3,6 @@ ...@@ -3,8 +3,6 @@
* Copyright (C) 2020-21 Intel Corporation. * Copyright (C) 2020-21 Intel Corporation.
*/ */
#include <linux/pm_runtime.h>
#include "iosm_ipc_chnl_cfg.h" #include "iosm_ipc_chnl_cfg.h"
#include "iosm_ipc_imem_ops.h" #include "iosm_ipc_imem_ops.h"
#include "iosm_ipc_port.h" #include "iosm_ipc_port.h"
...@@ -15,16 +13,12 @@ static int ipc_port_ctrl_start(struct wwan_port *port) ...@@ -15,16 +13,12 @@ static int ipc_port_ctrl_start(struct wwan_port *port)
struct iosm_cdev *ipc_port = wwan_port_get_drvdata(port); struct iosm_cdev *ipc_port = wwan_port_get_drvdata(port);
int ret = 0; int ret = 0;
pm_runtime_get_sync(ipc_port->ipc_imem->dev);
ipc_port->channel = ipc_imem_sys_port_open(ipc_port->ipc_imem, ipc_port->channel = ipc_imem_sys_port_open(ipc_port->ipc_imem,
ipc_port->chl_id, ipc_port->chl_id,
IPC_HP_CDEV_OPEN); IPC_HP_CDEV_OPEN);
if (!ipc_port->channel) if (!ipc_port->channel)
ret = -EIO; ret = -EIO;
pm_runtime_mark_last_busy(ipc_port->ipc_imem->dev);
pm_runtime_put_autosuspend(ipc_port->ipc_imem->dev);
return ret; return ret;
} }
...@@ -33,24 +27,15 @@ static void ipc_port_ctrl_stop(struct wwan_port *port) ...@@ -33,24 +27,15 @@ static void ipc_port_ctrl_stop(struct wwan_port *port)
{ {
struct iosm_cdev *ipc_port = wwan_port_get_drvdata(port); struct iosm_cdev *ipc_port = wwan_port_get_drvdata(port);
pm_runtime_get_sync(ipc_port->ipc_imem->dev);
ipc_imem_sys_port_close(ipc_port->ipc_imem, ipc_port->channel); ipc_imem_sys_port_close(ipc_port->ipc_imem, ipc_port->channel);
pm_runtime_mark_last_busy(ipc_port->ipc_imem->dev);
pm_runtime_put_autosuspend(ipc_port->ipc_imem->dev);
} }
/* transfer control data to modem */ /* transfer control data to modem */
static int ipc_port_ctrl_tx(struct wwan_port *port, struct sk_buff *skb) static int ipc_port_ctrl_tx(struct wwan_port *port, struct sk_buff *skb)
{ {
struct iosm_cdev *ipc_port = wwan_port_get_drvdata(port); struct iosm_cdev *ipc_port = wwan_port_get_drvdata(port);
int ret;
pm_runtime_get_sync(ipc_port->ipc_imem->dev); return ipc_imem_sys_cdev_write(ipc_port, skb);
ret = ipc_imem_sys_cdev_write(ipc_port, skb);
pm_runtime_mark_last_busy(ipc_port->ipc_imem->dev);
pm_runtime_put_autosuspend(ipc_port->ipc_imem->dev);
return ret;
} }
static const struct wwan_port_ops ipc_wwan_ctrl_ops = { static const struct wwan_port_ops ipc_wwan_ctrl_ops = {
......
...@@ -3,9 +3,7 @@ ...@@ -3,9 +3,7 @@
* Copyright (C) 2020-2021 Intel Corporation. * Copyright (C) 2020-2021 Intel Corporation.
*/ */
#include <linux/pm_runtime.h>
#include <linux/wwan.h> #include <linux/wwan.h>
#include "iosm_ipc_trace.h" #include "iosm_ipc_trace.h"
/* sub buffer size and number of sub buffer */ /* sub buffer size and number of sub buffer */
...@@ -99,8 +97,6 @@ static ssize_t ipc_trace_ctrl_file_write(struct file *filp, ...@@ -99,8 +97,6 @@ static ssize_t ipc_trace_ctrl_file_write(struct file *filp,
if (ret) if (ret)
return ret; return ret;
pm_runtime_get_sync(ipc_trace->ipc_imem->dev);
mutex_lock(&ipc_trace->trc_mutex); mutex_lock(&ipc_trace->trc_mutex);
if (val == TRACE_ENABLE && ipc_trace->mode != TRACE_ENABLE) { if (val == TRACE_ENABLE && ipc_trace->mode != TRACE_ENABLE) {
ipc_trace->channel = ipc_imem_sys_port_open(ipc_trace->ipc_imem, ipc_trace->channel = ipc_imem_sys_port_open(ipc_trace->ipc_imem,
...@@ -121,10 +117,6 @@ static ssize_t ipc_trace_ctrl_file_write(struct file *filp, ...@@ -121,10 +117,6 @@ static ssize_t ipc_trace_ctrl_file_write(struct file *filp,
ret = count; ret = count;
unlock: unlock:
mutex_unlock(&ipc_trace->trc_mutex); mutex_unlock(&ipc_trace->trc_mutex);
pm_runtime_mark_last_busy(ipc_trace->ipc_imem->dev);
pm_runtime_put_autosuspend(ipc_trace->ipc_imem->dev);
return ret; return ret;
} }
......
...@@ -6,7 +6,6 @@ ...@@ -6,7 +6,6 @@
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include <linux/if_arp.h> #include <linux/if_arp.h>
#include <linux/if_link.h> #include <linux/if_link.h>
#include <linux/pm_runtime.h>
#include <linux/rtnetlink.h> #include <linux/rtnetlink.h>
#include <linux/wwan.h> #include <linux/wwan.h>
#include <net/pkt_sched.h> #include <net/pkt_sched.h>
...@@ -52,13 +51,11 @@ static int ipc_wwan_link_open(struct net_device *netdev) ...@@ -52,13 +51,11 @@ static int ipc_wwan_link_open(struct net_device *netdev)
struct iosm_netdev_priv *priv = wwan_netdev_drvpriv(netdev); struct iosm_netdev_priv *priv = wwan_netdev_drvpriv(netdev);
struct iosm_wwan *ipc_wwan = priv->ipc_wwan; struct iosm_wwan *ipc_wwan = priv->ipc_wwan;
int if_id = priv->if_id; int if_id = priv->if_id;
int ret = 0;
if (if_id < IP_MUX_SESSION_START || if (if_id < IP_MUX_SESSION_START ||
if_id >= ARRAY_SIZE(ipc_wwan->sub_netlist)) if_id >= ARRAY_SIZE(ipc_wwan->sub_netlist))
return -EINVAL; return -EINVAL;
pm_runtime_get_sync(ipc_wwan->ipc_imem->dev);
/* get channel id */ /* get channel id */
priv->ch_id = ipc_imem_sys_wwan_open(ipc_wwan->ipc_imem, if_id); priv->ch_id = ipc_imem_sys_wwan_open(ipc_wwan->ipc_imem, if_id);
...@@ -66,8 +63,7 @@ static int ipc_wwan_link_open(struct net_device *netdev) ...@@ -66,8 +63,7 @@ static int ipc_wwan_link_open(struct net_device *netdev)
dev_err(ipc_wwan->dev, dev_err(ipc_wwan->dev,
"cannot connect wwan0 & id %d to the IPC mem layer", "cannot connect wwan0 & id %d to the IPC mem layer",
if_id); if_id);
ret = -ENODEV; return -ENODEV;
goto err_out;
} }
/* enable tx path, DL data may follow */ /* enable tx path, DL data may follow */
...@@ -76,11 +72,7 @@ static int ipc_wwan_link_open(struct net_device *netdev) ...@@ -76,11 +72,7 @@ static int ipc_wwan_link_open(struct net_device *netdev)
dev_dbg(ipc_wwan->dev, "Channel id %d allocated to if_id %d", dev_dbg(ipc_wwan->dev, "Channel id %d allocated to if_id %d",
priv->ch_id, priv->if_id); priv->ch_id, priv->if_id);
err_out: return 0;
pm_runtime_mark_last_busy(ipc_wwan->ipc_imem->dev);
pm_runtime_put_autosuspend(ipc_wwan->ipc_imem->dev);
return ret;
} }
/* Bring-down the wwan net link */ /* Bring-down the wwan net link */
...@@ -90,12 +82,9 @@ static int ipc_wwan_link_stop(struct net_device *netdev) ...@@ -90,12 +82,9 @@ static int ipc_wwan_link_stop(struct net_device *netdev)
netif_stop_queue(netdev); netif_stop_queue(netdev);
pm_runtime_get_sync(priv->ipc_wwan->ipc_imem->dev);
ipc_imem_sys_wwan_close(priv->ipc_wwan->ipc_imem, priv->if_id, ipc_imem_sys_wwan_close(priv->ipc_wwan->ipc_imem, priv->if_id,
priv->ch_id); priv->ch_id);
priv->ch_id = -1; priv->ch_id = -1;
pm_runtime_mark_last_busy(priv->ipc_wwan->ipc_imem->dev);
pm_runtime_put_autosuspend(priv->ipc_wwan->ipc_imem->dev);
return 0; return 0;
} }
...@@ -117,7 +106,6 @@ static netdev_tx_t ipc_wwan_link_transmit(struct sk_buff *skb, ...@@ -117,7 +106,6 @@ static netdev_tx_t ipc_wwan_link_transmit(struct sk_buff *skb,
if_id >= ARRAY_SIZE(ipc_wwan->sub_netlist)) if_id >= ARRAY_SIZE(ipc_wwan->sub_netlist))
return -EINVAL; return -EINVAL;
pm_runtime_get(ipc_wwan->ipc_imem->dev);
/* Send the SKB to device for transmission */ /* Send the SKB to device for transmission */
ret = ipc_imem_sys_wwan_transmit(ipc_wwan->ipc_imem, ret = ipc_imem_sys_wwan_transmit(ipc_wwan->ipc_imem,
if_id, priv->ch_id, skb); if_id, priv->ch_id, skb);
...@@ -131,14 +119,9 @@ static netdev_tx_t ipc_wwan_link_transmit(struct sk_buff *skb, ...@@ -131,14 +119,9 @@ static netdev_tx_t ipc_wwan_link_transmit(struct sk_buff *skb,
ret = NETDEV_TX_BUSY; ret = NETDEV_TX_BUSY;
dev_err(ipc_wwan->dev, "unable to push packets"); dev_err(ipc_wwan->dev, "unable to push packets");
} else { } else {
pm_runtime_mark_last_busy(ipc_wwan->ipc_imem->dev);
pm_runtime_put_autosuspend(ipc_wwan->ipc_imem->dev);
goto exit; goto exit;
} }
pm_runtime_mark_last_busy(ipc_wwan->ipc_imem->dev);
pm_runtime_put_autosuspend(ipc_wwan->ipc_imem->dev);
return ret; return ret;
exit: exit:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment