From: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
To: Baochen Qiang <quic_bqiang@quicinc.com>
Cc: ath11k@lists.infradead.org, linux-wireless@vger.kernel.org,
linux-arm-msm@vger.kernel.org, mhi@lists.linux.dev,
davem@davemloft.net, edumazet@google.com, kuba@kernel.org,
pabeni@redhat.com, netdev@vger.kernel.org
Subject: Re: [PATCH v4 2/3] net: qrtr: support suspend/hibernation
Date: Thu, 29 Feb 2024 15:42:54 +0530 [thread overview]
Message-ID: <20240229101254.GC2999@thinkpad> (raw)
In-Reply-To: <20240228022243.17762-3-quic_bqiang@quicinc.com>
On Wed, Feb 28, 2024 at 10:22:42AM +0800, Baochen Qiang wrote:
> MHI devices may not be destroyed during suspend/hibernation, so need
> to unprepare/prepare MHI channels throughout the transition, this is
> done by adding suspend/resume callbacks.
>
> The suspend callback is called in the late suspend stage, this means
> MHI channels are still alive at suspend stage, and that makes it
> possible for an MHI controller driver to communicate with others over
> those channels at suspend stage. While the resume callback is called
> in the early resume stage, for a similar reason.
>
> Also note that we won't do unprepare/prepare when MHI device is in
> suspend state because it's pointless if MHI is only meant to go through
> a suspend/resume transition, instead of a complete power cycle.
>
> Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3.6510.30
>
> Signed-off-by: Baochen Qiang <quic_bqiang@quicinc.com>
Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
- Mani
> ---
> net/qrtr/mhi.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 46 insertions(+)
>
> diff --git a/net/qrtr/mhi.c b/net/qrtr/mhi.c
> index 9ced13c0627a..69f53625a049 100644
> --- a/net/qrtr/mhi.c
> +++ b/net/qrtr/mhi.c
> @@ -118,6 +118,51 @@ static const struct mhi_device_id qcom_mhi_qrtr_id_table[] = {
> };
> MODULE_DEVICE_TABLE(mhi, qcom_mhi_qrtr_id_table);
>
> +static int __maybe_unused qcom_mhi_qrtr_pm_suspend_late(struct device *dev)
> +{
> + struct mhi_device *mhi_dev = container_of(dev, struct mhi_device, dev);
> + enum mhi_state state;
> +
> + state = mhi_get_mhi_state(mhi_dev->mhi_cntrl);
> + /*
> + * If the device is in suspend state, then no need for the
> + * client driver to unprepare the channels.
> + */
> + if (state == MHI_STATE_M3)
> + return 0;
> +
> + mhi_unprepare_from_transfer(mhi_dev);
> +
> + return 0;
> +}
> +
> +static int __maybe_unused qcom_mhi_qrtr_pm_resume_early(struct device *dev)
> +{
> + struct mhi_device *mhi_dev = container_of(dev, struct mhi_device, dev);
> + enum mhi_state state;
> + int rc;
> +
> + state = mhi_get_mhi_state(mhi_dev->mhi_cntrl);
> + /*
> + * If the device is in suspend state, we won't unprepare channels
> + * in suspend callback, therefore no need to prepare channels when
> + * resume.
> + */
> + if (state == MHI_STATE_M3)
> + return 0;
> +
> + rc = mhi_prepare_for_transfer_autoqueue(mhi_dev);
> + if (rc)
> + dev_err(dev, "failed to prepare for autoqueue transfer %d\n", rc);
> +
> + return rc;
> +}
> +
> +static const struct dev_pm_ops qcom_mhi_qrtr_pm_ops = {
> + SET_LATE_SYSTEM_SLEEP_PM_OPS(qcom_mhi_qrtr_pm_suspend_late,
> + qcom_mhi_qrtr_pm_resume_early)
> +};
> +
> static struct mhi_driver qcom_mhi_qrtr_driver = {
> .probe = qcom_mhi_qrtr_probe,
> .remove = qcom_mhi_qrtr_remove,
> @@ -126,6 +171,7 @@ static struct mhi_driver qcom_mhi_qrtr_driver = {
> .id_table = qcom_mhi_qrtr_id_table,
> .driver = {
> .name = "qcom_mhi_qrtr",
> + .pm = &qcom_mhi_qrtr_pm_ops,
> },
> };
>
> --
> 2.25.1
>
--
மணிவண்ணன் சதாசிவம்
next prev parent reply other threads:[~2024-02-29 10:13 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-28 2:22 [PATCH v4 0/3] wifi: ath11k: hibernation support Baochen Qiang
2024-02-28 2:22 ` [PATCH v4 1/3] bus: mhi: host: add mhi_power_down_keep_dev() Baochen Qiang
2024-02-28 15:09 ` Jeff Johnson
2024-02-29 10:12 ` Manivannan Sadhasivam
2024-02-29 10:33 ` Baochen Qiang
2024-02-29 19:35 ` Kalle Valo
2024-03-01 2:04 ` Baochen Qiang
2024-03-01 12:25 ` Manivannan Sadhasivam
2024-03-04 2:01 ` Baochen Qiang
2024-02-28 2:22 ` [PATCH v4 2/3] net: qrtr: support suspend/hibernation Baochen Qiang
2024-02-28 15:12 ` Jeff Johnson
2024-02-29 10:12 ` Manivannan Sadhasivam [this message]
2024-02-28 2:22 ` [PATCH v4 3/3] wifi: ath11k: support hibernation Baochen Qiang
2024-02-28 15:31 ` Jeff Johnson
2024-02-29 2:30 ` Baochen Qiang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240229101254.GC2999@thinkpad \
--to=manivannan.sadhasivam@linaro.org \
--cc=ath11k@lists.infradead.org \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=kuba@kernel.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-wireless@vger.kernel.org \
--cc=mhi@lists.linux.dev \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=quic_bqiang@quicinc.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.