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

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
Loading
Loading
Loading
Loading
+0 −17
Original line number Diff line number Diff line
@@ -4,7 +4,6 @@
 */

#include <linux/delay.h>
#include <linux/pm_runtime.h>

#include "iosm_ipc_chnl_cfg.h"
#include "iosm_ipc_devlink.h"
@@ -632,11 +631,6 @@ static void ipc_imem_run_state_worker(struct work_struct *instance)
	/* Complete all memory stores after setting bit */
	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;

err_ipc_mux_deinit:
@@ -1240,7 +1234,6 @@ void ipc_imem_cleanup(struct iosm_imem *ipc_imem)

	/* forward MDM_NOT_READY to listeners */
	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->tdupdate_timer);
@@ -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);
	}

	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;
devlink_channel_fail:
	ipc_devlink_deinit(ipc_imem->ipc_devlink);
+0 −2
Original line number Diff line number Diff line
@@ -103,8 +103,6 @@ struct ipc_chnl_cfg;
#define FULLY_FUNCTIONAL 0
#define IOSM_DEVLINK_INIT 1

#define IPC_MEM_AUTO_SUSPEND_DELAY_MS 5000

/* List of the supported UL/DL pipes. */
enum ipc_mem_pipes {
	IPC_MEM_PIPE_0 = 0,
+1 −3
Original line number Diff line number Diff line
@@ -6,7 +6,6 @@
#include <linux/acpi.h>
#include <linux/bitfield.h>
#include <linux/module.h>
#include <linux/pm_runtime.h>
#include <net/rtnetlink.h>

#include "iosm_ipc_imem.h"
@@ -438,8 +437,7 @@ static int __maybe_unused ipc_pcie_resume_cb(struct device *dev)
	return 0;
}

static DEFINE_RUNTIME_DEV_PM_OPS(iosm_ipc_pm, ipc_pcie_suspend_cb,
				 ipc_pcie_resume_cb, NULL);
static SIMPLE_DEV_PM_OPS(iosm_ipc_pm, ipc_pcie_suspend_cb, ipc_pcie_resume_cb);

static struct pci_driver iosm_ipc_driver = {
	.name = KBUILD_MODNAME,
+1 −16
Original line number Diff line number Diff line
@@ -3,8 +3,6 @@
 * Copyright (C) 2020-21 Intel Corporation.
 */

#include <linux/pm_runtime.h>

#include "iosm_ipc_chnl_cfg.h"
#include "iosm_ipc_imem_ops.h"
#include "iosm_ipc_port.h"
@@ -15,16 +13,12 @@ static int ipc_port_ctrl_start(struct wwan_port *port)
	struct iosm_cdev *ipc_port = wwan_port_get_drvdata(port);
	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->chl_id,
						   IPC_HP_CDEV_OPEN);
	if (!ipc_port->channel)
		ret = -EIO;

	pm_runtime_mark_last_busy(ipc_port->ipc_imem->dev);
	pm_runtime_put_autosuspend(ipc_port->ipc_imem->dev);

	return ret;
}

@@ -33,24 +27,15 @@ static void ipc_port_ctrl_stop(struct wwan_port *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);
	pm_runtime_mark_last_busy(ipc_port->ipc_imem->dev);
	pm_runtime_put_autosuspend(ipc_port->ipc_imem->dev);
}

/* transfer control data to modem */
static int ipc_port_ctrl_tx(struct wwan_port *port, struct sk_buff *skb)
{
	struct iosm_cdev *ipc_port = wwan_port_get_drvdata(port);
	int ret;

	pm_runtime_get_sync(ipc_port->ipc_imem->dev);
	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;
	return ipc_imem_sys_cdev_write(ipc_port, skb);
}

static const struct wwan_port_ops ipc_wwan_ctrl_ops = {
+0 −8
Original line number Diff line number Diff line
@@ -3,9 +3,7 @@
 * Copyright (C) 2020-2021 Intel Corporation.
 */

#include <linux/pm_runtime.h>
#include <linux/wwan.h>

#include "iosm_ipc_trace.h"

/* sub buffer size and number of sub buffer */
@@ -99,8 +97,6 @@ static ssize_t ipc_trace_ctrl_file_write(struct file *filp,
	if (ret)
		return ret;

	pm_runtime_get_sync(ipc_trace->ipc_imem->dev);

	mutex_lock(&ipc_trace->trc_mutex);
	if (val == TRACE_ENABLE && ipc_trace->mode != TRACE_ENABLE) {
		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,
	ret = count;
unlock:
	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;
}

Loading