Received: by 2002:a05:7208:9594:b0:7e:5202:c8b4 with SMTP id gs20csp2296985rbb; Tue, 27 Feb 2024 18:23:38 -0800 (PST) X-Forwarded-Encrypted: i=3; AJvYcCWwvoKsO20SId9XlXEkawugJjbx49EA6GvGJkP8pZqg3Qn43j+Hd6xobqID4oBOb6KZHW/AAHvXGbPpDU36rHWO2MIsRSLC36egbepaxw== X-Google-Smtp-Source: AGHT+IGL4QJFPGaVqwKPmepTCkcpiPDIhHJKTfz5iwO4nnVfZyDMqqbJ2T5P5ql5nnO9/wjn4O3r X-Received: by 2002:a17:90b:4b4f:b0:29a:f227:a7ce with SMTP id mi15-20020a17090b4b4f00b0029af227a7cemr1072926pjb.12.1709087018721; Tue, 27 Feb 2024 18:23:38 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1709087018; cv=pass; d=google.com; s=arc-20160816; b=rUbWELLVpWV8y7KQcP+GrXBh2g6iQbuwbVGMV6hZaoGzsZ15lpHYK36UEGFORjV6qp FaaFK4EPX+3n5fIJTsYyb7tMErPxAExbi3RokP1Jg43X9m5DRoQBXH2qWT8UmlQR9anj 24an3+yu/K+F/VV1KvjbBu9EFccxWd+Y34f0e2TKxTwuNXTo4jQtZlS5TdCxg/4I+jwX xHtXLs64jRZaIyCwIZYxy6mC+i3jNJx1LHQeb1qc3LP0Cy5Ew0zvnuxFoyZq+XioOkyE +RibSdyxs6sdhkwNf/WVDDWgQ3A2fwkLiZI3GGzc337LpHNBF5Z9yyf5/Z+EJD4fOK/E AwLA== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=T3vSBlEzkaGHFGN34YgOwaijg7xlCZ270ALmHFqkhwQ=; fh=HUZY1mAwsL2RV4ebiSFRpiMBK5XT8gtCNRH/y4zO0W8=; b=UTmYvv+Sr8uzlpJry/f6C0Ug2Lu954ePXbMTE5/CUvTq8q1j2FlKS8sRz85tGNk0IF kH4uTFz04Xxk4w78MA2lgHSY7X8hTkoCfgdXa7m34diHvPmX0lQpoYk8H9AO2HhVVZDG ZR9Ea/Ijpvachwd3BKAPgxX2fLVrBXSqJukw1LyzRwFdsGMNsLgcHICJv10idshLAXm4 6EyELlg802IQEJ0mvlJSEBXsfaB8xLFuZKtSycmF0osQC1wXF/ZTExrUgWHuOsBfL5Wf dUJ2ob8nV+mNKykajjiWS/+BWGWoqP4B0bQIY4AIOjRHX6IhkJHngHbZ9SHkQUv0cAL8 CE/A==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@quicinc.com header.s=qcppdkim1 header.b=T9MBieMJ; arc=pass (i=1 spf=pass spfdomain=quicinc.com dkim=pass dkdomain=quicinc.com dmarc=pass fromdomain=quicinc.com); spf=pass (google.com: domain of linux-wireless+bounces-4130-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="linux-wireless+bounces-4130-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=quicinc.com Return-Path: Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [2604:1380:45e3:2400::1]) by mx.google.com with ESMTPS id nv11-20020a17090b1b4b00b0029a370d6f78si443518pjb.46.2024.02.27.18.23.38 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Feb 2024 18:23:38 -0800 (PST) Received-SPF: pass (google.com: domain of linux-wireless+bounces-4130-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) client-ip=2604:1380:45e3:2400::1; Authentication-Results: mx.google.com; dkim=pass header.i=@quicinc.com header.s=qcppdkim1 header.b=T9MBieMJ; arc=pass (i=1 spf=pass spfdomain=quicinc.com dkim=pass dkdomain=quicinc.com dmarc=pass fromdomain=quicinc.com); spf=pass (google.com: domain of linux-wireless+bounces-4130-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="linux-wireless+bounces-4130-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=quicinc.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sv.mirrors.kernel.org (Postfix) with ESMTPS id 5F7F028406A for ; Wed, 28 Feb 2024 02:23:38 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id B0C651DDFF; Wed, 28 Feb 2024 02:23:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com header.b="T9MBieMJ" X-Original-To: linux-wireless@vger.kernel.org Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 23DD11CAAB; Wed, 28 Feb 2024 02:23:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709086994; cv=none; b=CGcnWnhgYmObXgCQ5vsKZ16d/TjQCzj0YN0CF73teeShxdNclRZMwbf8yp3grNWuMS1GLHSVKm+kmlOn0ryQG39l9xS/VkRlW1/VvyfsnNqrt4qFkR+LRg/TxSlYYvQF00QPMevexH6w6Pu08jMrMeSFEHi1FuMK31D8mB/s3jw= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709086994; c=relaxed/simple; bh=Zs0enebDVUoLgccbVVbSO5ka5/eX9KcPfYfpiafBA9g=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=BLhYT5zNOVakFDyoaeu/INRlStsUFxWhkt5oG/ddvk57tBY1mYV8eUO5lrXfaOLxQH4zP65bW0ScBBTH/TTnbP8U5XpYQpatVtblOr6DdXU4KUZl8cBIeq8MC3zgQXcV8+QQB79JsrgbrcPAHb+1rNgk8HCuqQjNGKDm3tohEb8= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=quicinc.com; spf=pass smtp.mailfrom=quicinc.com; dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com header.b=T9MBieMJ; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=quicinc.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=quicinc.com Received: from pps.filterd (m0279868.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.17.1.24/8.17.1.24) with ESMTP id 41RNu4gh024782; Wed, 28 Feb 2024 02:23:02 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h= from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding:content-type; s= qcppdkim1; bh=T3vSBlEzkaGHFGN34YgOwaijg7xlCZ270ALmHFqkhwQ=; b=T9 MBieMJQO9YdTO5DQwl0IifN96V1F3L69MG0oIdvkb2krUNuj1PfNfrxc8lRfC5hH t4jbdxq6x+Su8tgz/nSpANDjWm/zvmuyDAVxRVe1JBmJAdg+KWdTwAJ4edlr0kvg 2V+DowGvcE+NAv9atnd9jvErGGVWhHHedomp6HZUwHs9XSLeeNPNaJu2kf3HAlsU Df/5q972umTWsV+KI72uM732LWR/fI3867s74ZjVx29px9FSvF2KVHQsRaQbWgE/ 0vVnXUG/Yz3vfeyy0qAkRau4a0JvKL1JtAeXlVR7iqGA4myG7WRs1GrP7ipyLDm5 LHKJ7UmXfZf25+E6pI4A== Received: from nalasppmta04.qualcomm.com (Global_NAT1.qualcomm.com [129.46.96.20]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 3wh507b61t-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 28 Feb 2024 02:23:02 +0000 (GMT) Received: from nalasex01a.na.qualcomm.com (nalasex01a.na.qualcomm.com [10.47.209.196]) by NALASPPMTA04.qualcomm.com (8.17.1.5/8.17.1.5) with ESMTPS id 41S2N1ux008787 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 28 Feb 2024 02:23:01 GMT Received: from bqiang-SFF.qca.qualcomm.com (10.80.80.8) by nalasex01a.na.qualcomm.com (10.47.209.196) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1118.40; Tue, 27 Feb 2024 18:22:58 -0800 From: Baochen Qiang To: , CC: , , , , , , , , Subject: [PATCH v4 2/3] net: qrtr: support suspend/hibernation Date: Wed, 28 Feb 2024 10:22:42 +0800 Message-ID: <20240228022243.17762-3-quic_bqiang@quicinc.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20240228022243.17762-1-quic_bqiang@quicinc.com> References: <20240228022243.17762-1-quic_bqiang@quicinc.com> Precedence: bulk X-Mailing-List: linux-wireless@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-ClientProxiedBy: nasanex01b.na.qualcomm.com (10.46.141.250) To nalasex01a.na.qualcomm.com (10.47.209.196) X-QCInternal: smtphost X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800 signatures=585085 X-Proofpoint-ORIG-GUID: 7W2VQWoSnkcjzY2VsGUzhCY2cKnVzAaZ X-Proofpoint-GUID: 7W2VQWoSnkcjzY2VsGUzhCY2cKnVzAaZ X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.272,Aquarius:18.0.1011,Hydra:6.0.619,FMLib:17.11.176.26 definitions=2024-02-28_01,2024-02-27_01,2023-05-22_02 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 suspectscore=0 clxscore=1015 mlxscore=0 malwarescore=0 impostorscore=0 phishscore=0 lowpriorityscore=0 mlxlogscore=981 priorityscore=1501 spamscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2402120000 definitions=main-2402280017 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 --- 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