From nobody Sun May 24 18:43:18 2026 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 DCEFE3C73C9 for ; Fri, 22 May 2026 10:00:59 +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=1779444062; cv=none; b=mht+alkE5+dtAX7EFA5A40BzUWOA5g7/2vW+8iU8SQOXvazVULJ6UtHsqy43xV21x6Ui2ko9UVnWgotzwLCPiR5vTlZqrQa0oxUECXinRrDcLId+N/+hh8Ic+3JvjjkFwApPZiX7brt7EXCHHidDOcXWYuq00TRTWvRTn3y+H1o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779444062; c=relaxed/simple; bh=eEEN3EXZH9+ocSgYvv06EBOEmhgPIImBeQeRcWVT6hU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=oLuwYg1QYbw/iTXTzy4wkLLrIsBRtlcfGywdUvyOioEyJ5AaCMaEuonT6tLPyVMOE37bOoJ7pZfI2ON+lUmqWUPd0fzakf9KF9KMR9DuhJ45yrFLtds7LVi325JKsmrbRhwDUAAexAeRmYC2mKwUc+5Tvgr0wvh3dtrZKxKLmSc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=eHh7X2gG; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=csiyx7o0; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="eHh7X2gG"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="csiyx7o0" Received: from pps.filterd (m0279873.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 64M7Wvt8778902 for ; Fri, 22 May 2026 10:00:59 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= YR4rbS+4WUMiEynV2sZr8pSzcK/RqiAN6yJ9tTgtN8c=; b=eHh7X2gGrSZekNOb xkDmqbEW54k9aNsjuHmVMXxsX8I8pWfkpIefqSA1ncFswM3zO7mNthHR9mPKM43H gdAmQwJvnzvcpAHEzUyu5HWmyqySgPIKvuiNNnXArB1Dm6Ws4O1XZvQdrUbrb0rM e5nH7dsWC7/h2UU/D6aL/v3gFuGWLccts+1ZPuEuleYzrW0DdofrlBxGwwdzeXO1 n2Hx1KrVjELW8du55RA5vhG3FBDWrn0xMTbfzGDQr2TFvHW37LDxACLaIp8TgmjJ 581P1XwAw4f3uPjgmxmq5AAPMezvBPq0QMjka/UXu0OVM2KHvs1t2VIbYinr6PTk RKTB0w== Received: from mail-pf1-f199.google.com (mail-pf1-f199.google.com [209.85.210.199]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4eac7at5s5-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 22 May 2026 10:00:58 +0000 (GMT) Received: by mail-pf1-f199.google.com with SMTP id d2e1a72fcca58-82fa366fb79so9513654b3a.2 for ; Fri, 22 May 2026 03:00:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1779444058; x=1780048858; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=YR4rbS+4WUMiEynV2sZr8pSzcK/RqiAN6yJ9tTgtN8c=; b=csiyx7o00JbeY2fYsF0w1GZ0I0hnbeB7NfnOT3YR8yK3Jg4bEA71CV8t5zSQKZ+iuI aZmJU0Bkg/ytsgihmwTPzWOBj+3auW+IOfDJeBnGM4/87+FwgIoeUScQyxTW3ZnHP0f7 42vBfnmfoAifMToB8Crnz0bD4aG6HH4+OBuTNzQRcotKkvT7V5fFd8Lk0/303IH3KMK5 k3ljlorDh5XJVaIsmAGedspSiWqZwRZhqE28S6PmT0UCwrnmdUr/Kda564l3kGejnIWy KEzCUFqadpbMAkzvfIMJ8MzQ87oYC0FNa5bPDlXrs3dKFxQ8fzXpBqnZNVOVW2lzoz3l TxvA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779444058; x=1780048858; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=YR4rbS+4WUMiEynV2sZr8pSzcK/RqiAN6yJ9tTgtN8c=; b=IXmrJcuCZzGHyOmlv7XSIS6Eev5xrk3VtnPqBp55AJDOOVED/dUkNsNyuH6dqtX8AS 5Kjgie3wg2ZR9R24Yw0AK0tUfR8BgGcyhvU7YD7bsTdfN7rJBu8iwW6L5NvSploK0wYE zafLjw5UM+82VwVN0Hgzkc70gpqOrm4dH5VIQII+G2H0od6/2DapDB3de8kc8ER4I+Hj G4VfymPZQh8Viz7CMAdSrpGZ4KT5zGFgmojyULr8/csiQw/DdnQ/XdQUmgVULQy95gPs sdBSNPbEjTFn8G3XVY+C0VtFd0qu4cy+AjZ5occqSdXy6m7VxRPOe10MZcNYuIw/dep4 u5sQ== X-Forwarded-Encrypted: i=1; AFNElJ+UKhPBXFDOHJr+YDy1FdOXhnG9QHqOzFFGsYo2ZVqmHVfcw9eHgmcmPKMONY/R8LWzLp9PRb/bauXqDKM=@vger.kernel.org X-Gm-Message-State: AOJu0YytxrDDiqafD1E3HVODPyYHtS6xv4yNfe/r/fsGc/P4Kpix0p3d ykjSRwuLBzFascQUgVHRCdIocfxYCxdzle7HC1ZxkA5gKe2zzjEYAyjDCPoDcc/4V5QtrWF6UM5 AK+vZ2JevGmb5h1DmKHHw1VOsmn5W2qKKzEEgSmMl/y3Los37viB8qwzTGNQkrpYw88U= X-Gm-Gg: Acq92OHWcUh3uWK6xtuyrGeabcv7QdIIP/YJ8JxuFipclJWXS7XclapoAMWta9Xak9D R9R3b2cI1wJs+PHosrx29K6CAqk1jYf4nLjCf9BBv6bLjEK293UL57W/md2HksR5Eu5MSre0iTX MyCD1BNBIJTUyhmZUDWfaDCZRVR7m5d+VcIqoO49q1ukx3BWQFTJkVc/Gv+VaA+I11Wu6MkAWXx f0OzptDrEYiljTaUI0DpIGPUYtG0FS/yJ+LxQKGpYsiZULPkhwT5ZKmoffMEHr+xhaZo8WPob7u fYpw9kOBDlJ3Cv+siW6eJh8TTXUTo09H6dHUo/iU/kUpEcnuFz/5rqPidpdBErKrPXHSMIRrphT IbaPG2CF4bV0lNBM2v2aimI0yk0mbEjxBAeuKlSe0HDTPYDEJPkofyGu6 X-Received: by 2002:a05:6a00:2daa:b0:82f:42bc:3386 with SMTP id d2e1a72fcca58-8415f1a5318mr3309598b3a.21.1779444057713; Fri, 22 May 2026 03:00:57 -0700 (PDT) X-Received: by 2002:a05:6a00:2daa:b0:82f:42bc:3386 with SMTP id d2e1a72fcca58-8415f1a5318mr3309509b3a.21.1779444056898; Fri, 22 May 2026 03:00:56 -0700 (PDT) Received: from hu-krichai-hyd.qualcomm.com ([202.46.23.25]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-84164ac9b74sm1516641b3a.3.2026.05.22.03.00.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 22 May 2026 03:00:56 -0700 (PDT) From: Krishna Chaitanya Chundru Date: Fri, 22 May 2026 15:30:32 +0530 Subject: [PATCH v2 1/6] bus: mhi: Replace controller runtime_get/put callbacks with direct PM runtime APIs Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260522-mhi_runtimepm-v2-1-fbebf41a82bb@oss.qualcomm.com> References: <20260522-mhi_runtimepm-v2-0-fbebf41a82bb@oss.qualcomm.com> In-Reply-To: <20260522-mhi_runtimepm-v2-0-fbebf41a82bb@oss.qualcomm.com> To: Manivannan Sadhasivam , Jeff Hugo , Carl Vanderlip , Oded Gabbay , Jeff Johnson , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Loic Poulain , Sergey Ryazanov , Johannes Berg Cc: mhi@lists.linux.dev, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-wireless@vger.kernel.org, ath11k@lists.infradead.org, ath12k@lists.infradead.org, netdev@vger.kernel.org, mayank.rana@oss.qualcomm.com, quic_vbadigan@quicinc.com, vivek.pernamitta@oss.qualcomm.com, Krishna Chaitanya Chundru , Konrad Dybcio X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1779444039; l=4878; i=krishna.chundru@oss.qualcomm.com; s=20230907; h=from:subject:message-id; bh=eEEN3EXZH9+ocSgYvv06EBOEmhgPIImBeQeRcWVT6hU=; b=yYhT3RpS8Nz/uaR392bqwxteKBb/FYzWe1XQYz9VQyNj0buTC58NW65aH4cKIQFB4iRyHRzbO TWR0AthcqCIB6R0xOUx+HaDt8erCDViPTRy7/AJD6uO/Nw6HrkjyI/U X-Developer-Key: i=krishna.chundru@oss.qualcomm.com; a=ed25519; pk=10CL2pdAKFyzyOHbfSWHCD0X0my7CXxj8gJScmn1FAg= X-Proofpoint-ORIG-GUID: JqdTEZWXzZUKfyEjV9-oIfixjWabmPo3 X-Authority-Analysis: v=2.4 cv=JrbBas4C c=1 sm=1 tr=0 ts=6a10295a cx=c_pps a=WW5sKcV1LcKqjgzy2JUPuA==:117 a=ZePRamnt/+rB5gQjfz0u9A==:17 a=IkcTkHD0fZMA:10 a=NGcC8JguVDcA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=rJkE3RaqiGZ5pbrm-msn:22 a=EUspDBNiAAAA:8 a=A_fZCR7qwrwYhkduS1cA:9 a=QEXdDO2ut3YA:10 a=OpyuDcXvxspvyRM73sMx:22 X-Proofpoint-GUID: JqdTEZWXzZUKfyEjV9-oIfixjWabmPo3 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTIyMDA5OSBTYWx0ZWRfXz7AWH4vydmN/ 2TnNlP23KWepFae4l71IymyL/LI/kTHuW4AYwd0Pq/+DaaeW48+FA//JDA4R84XpxsywRKMokV+ Cvs6HRuKZyzecPGuPR1YZctkc5dneO4BfmdXmG+z7nvPxTk1gfAv9EJ8gd1UIGocMZBrQjpfval CzdWMYD+CxQoC/zTggjrZD8DKM0xVLY3FBXQLsQLuAy+aN6CD62gvDCLYJcJj7r1Igp5F86Vh83 rpjshriRtIIh2Mzs5gasBsCUT/qicPhg0SkuYNvZ962n2RzpZgyc9CDNzTyWg54ei3UD8Ch9tTK fDMa9STT1a98tR9+Tw73HiKlhRk121c4V6uy7sNUTr9L6FzBWf0ZLKIGxiLz4StZMGb+VktFkYV a6U9dgjOV7GJFLOKGDcc/rI+y6ZFyg117XvFASiHPvsCfFHiPdMKI4Dwq5mFXFYAEWFS1SlO45G 8Xzm83X6SThMMarY+dw== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-22_02,2026-05-18_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 impostorscore=0 suspectscore=0 clxscore=1015 adultscore=0 lowpriorityscore=0 spamscore=0 malwarescore=0 phishscore=0 bulkscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605130000 definitions=main-2605220099 Remove the runtime_get() and runtime_put() function pointers from the MHI controller and replace their call sites with direct calls to pm_runtime_get() and pm_runtime_put(). Also add pm_runtime_mark_last_busy() before each pm_runtime_put() call to properly update the last busy timestamp for autosuspend. The removed callbacks provided no additional logic beyond wrapping the PM runtime APIs, so eliminate the indirection and the requirement for drivers to implement these no-op callbacks. Signed-off-by: Krishna Chaitanya Chundru Reviewed-by: Konrad Dybcio --- drivers/bus/mhi/host/init.c | 1 - drivers/bus/mhi/host/internal.h | 7 +++++-- drivers/bus/mhi/host/main.c | 19 ++++++++++++------- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/drivers/bus/mhi/host/init.c b/drivers/bus/mhi/host/init.c index 0a728ca2c494..9f3ee4a14418 100644 --- a/drivers/bus/mhi/host/init.c +++ b/drivers/bus/mhi/host/init.c @@ -927,7 +927,6 @@ int mhi_register_controller(struct mhi_controller *mhi_= cntrl, int ret, i; =20 if (!mhi_cntrl || !mhi_cntrl->cntrl_dev || !mhi_cntrl->regs || - !mhi_cntrl->runtime_get || !mhi_cntrl->runtime_put || !mhi_cntrl->status_cb || !mhi_cntrl->read_reg || !mhi_cntrl->write_reg || !mhi_cntrl->nr_irqs || !mhi_cntrl->irq || !mhi_cntrl->reg_len) diff --git a/drivers/bus/mhi/host/internal.h b/drivers/bus/mhi/host/interna= l.h index 7b0ee5e3a12d..a7493aabc6fa 100644 --- a/drivers/bus/mhi/host/internal.h +++ b/drivers/bus/mhi/host/internal.h @@ -7,6 +7,8 @@ #ifndef _MHI_INT_H #define _MHI_INT_H =20 +#include + #include "../common.h" =20 extern const struct bus_type mhi_bus_type; @@ -352,8 +354,9 @@ static inline bool mhi_is_active(struct mhi_controller = *mhi_cntrl) static inline void mhi_trigger_resume(struct mhi_controller *mhi_cntrl) { pm_wakeup_event(&mhi_cntrl->mhi_dev->dev, 0); - mhi_cntrl->runtime_get(mhi_cntrl); - mhi_cntrl->runtime_put(mhi_cntrl); + pm_runtime_get(mhi_cntrl->cntrl_dev); + pm_runtime_mark_last_busy(mhi_cntrl->cntrl_dev); + pm_runtime_put(mhi_cntrl->cntrl_dev); } =20 /* Register access methods */ diff --git a/drivers/bus/mhi/host/main.c b/drivers/bus/mhi/host/main.c index 53c0ffe30070..71919c2e9462 100644 --- a/drivers/bus/mhi/host/main.c +++ b/drivers/bus/mhi/host/main.c @@ -661,7 +661,8 @@ static int parse_xfer_event(struct mhi_controller *mhi_= cntrl, if (mhi_chan->dir =3D=3D DMA_TO_DEVICE) { atomic_dec(&mhi_cntrl->pending_pkts); /* Release the reference got from mhi_queue() */ - mhi_cntrl->runtime_put(mhi_cntrl); + pm_runtime_mark_last_busy(mhi_cntrl->cntrl_dev); + pm_runtime_put(mhi_cntrl->cntrl_dev); } =20 read_lock_bh(&mhi_chan->lock); @@ -1138,7 +1139,7 @@ static int mhi_queue(struct mhi_device *mhi_dev, stru= ct mhi_buf_info *buf_info, * for host->device buffer, balanced put is done on buffer completion * for device->host buffer, balanced put is after ringing the DB */ - mhi_cntrl->runtime_get(mhi_cntrl); + pm_runtime_get(mhi_cntrl->cntrl_dev); =20 /* Assert dev_wake (to exit/prevent M1/M2)*/ mhi_cntrl->wake_toggle(mhi_cntrl); @@ -1149,8 +1150,10 @@ static int mhi_queue(struct mhi_device *mhi_dev, str= uct mhi_buf_info *buf_info, if (likely(MHI_DB_ACCESS_VALID(mhi_cntrl))) mhi_ring_chan_db(mhi_cntrl, mhi_chan); =20 - if (dir =3D=3D DMA_FROM_DEVICE) - mhi_cntrl->runtime_put(mhi_cntrl); + if (dir =3D=3D DMA_FROM_DEVICE) { + pm_runtime_mark_last_busy(mhi_cntrl->cntrl_dev); + pm_runtime_put(mhi_cntrl->cntrl_dev); + } =20 read_unlock_irqrestore(&mhi_cntrl->pm_lock, flags); =20 @@ -1352,7 +1355,7 @@ static int mhi_update_channel_state(struct mhi_contro= ller *mhi_cntrl, ret =3D mhi_device_get_sync(mhi_cntrl->mhi_dev); if (ret) return ret; - mhi_cntrl->runtime_get(mhi_cntrl); + pm_runtime_get(mhi_cntrl->cntrl_dev); =20 reinit_completion(&mhi_chan->completion); ret =3D mhi_send_cmd(mhi_cntrl, mhi_chan, cmd); @@ -1383,7 +1386,8 @@ static int mhi_update_channel_state(struct mhi_contro= ller *mhi_cntrl, =20 trace_mhi_channel_command_end(mhi_cntrl, mhi_chan, to_state, TPS("Updated= ")); exit_channel_update: - mhi_cntrl->runtime_put(mhi_cntrl); + pm_runtime_mark_last_busy(mhi_cntrl->cntrl_dev); + pm_runtime_put(mhi_cntrl->cntrl_dev); mhi_device_put(mhi_cntrl->mhi_dev); =20 return ret; @@ -1524,7 +1528,8 @@ static void mhi_reset_data_chan(struct mhi_controller= *mhi_cntrl, if (mhi_chan->dir =3D=3D DMA_TO_DEVICE) { atomic_dec(&mhi_cntrl->pending_pkts); /* Release the reference got from mhi_queue() */ - mhi_cntrl->runtime_put(mhi_cntrl); + pm_runtime_mark_last_busy(mhi_cntrl->cntrl_dev); + pm_runtime_put(mhi_cntrl->cntrl_dev); } =20 if (!buf_info->pre_mapped) --=20 2.34.1 From nobody Sun May 24 18:43:18 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.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 05C0832AAC6 for ; Fri, 22 May 2026 10:01:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779444069; cv=none; b=c5VqTJ9nnPaVCigI9WvP1l8CX2Fm3MREVzCfqFEfsj4wIlPNwoX2H82FbtSLaqcxF1PfjPtbu5K3VJ7Br4HyuD9iaJ5ACoH5yT2gsgMKkj1wajvStLlc9cyVPSdMTGxqXVlVWOvAZ7+azBuzhbp/jHgC1ifCdFL6XjyGqMNC6lw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779444069; c=relaxed/simple; bh=UBj9I2ZVbQBtANcm1Eq+93YFWtxJuvyInNBweC3+uv4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=VfwJLUInuHWOWz11mUBtu76Yo/TGvxqQ59iMdkJ5OLJbmwweCRh4DzYP1G8IrivLdLmRO4meeY4sCYc1BunO1aZyjhG+jei1qcX2hfF+PLhy5bja0XzP+L3QJ6c6jAl4foT+sqnDsR1FrCiKCWvt+8xNfxPbLEnCau6ryddMEzY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=DMMVqtwj; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=KL/zB0WO; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="DMMVqtwj"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="KL/zB0WO" Received: from pps.filterd (m0279864.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 64M6bvvC1297936 for ; Fri, 22 May 2026 10:01:07 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= Bd+nfDwDIbDnF5mLnuaN9+Mk0Lao6hQ83OhFSeujfCQ=; b=DMMVqtwjFUO5A5ba PHXzJrQrW4s5dtoZxgR7e7xc12CAp2Oy8N8Bu3nWnTUq4D7z4ueSCSwOMEt6J6dD DGCS1vxxT3Tib9zmxfd0MqOjRP5eH3aBdloXsnXT9iKYvSLZn+iD64amHlA8wJ8J SehF/RkyLz71llNTdyhXDbqcdoX9dUZgLvLewrciT9iIQM+1UKwFv/KR7lIB5pOg neAzKnI5KVnD2g3fq9+/XgSbcfzd4RZ1hroGzJBj8xONyNiGA0gEM2mUatzUtZ6n zXVd2DU9llaqbnAEOK1cTg1EmxMndtF5+/G7Fckskq0e4WM4ghJvZCl+en1SVJrW HPFEYg== Received: from mail-pg1-f197.google.com (mail-pg1-f197.google.com [209.85.215.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4eaah0adet-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 22 May 2026 10:01:07 +0000 (GMT) Received: by mail-pg1-f197.google.com with SMTP id 41be03b00d2f7-c82c477290bso3844868a12.3 for ; Fri, 22 May 2026 03:01:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1779444067; x=1780048867; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=Bd+nfDwDIbDnF5mLnuaN9+Mk0Lao6hQ83OhFSeujfCQ=; b=KL/zB0WOplbSmeG9cn3O0Vfk18FJC5ODdhlCEYAoRc4FI7Z4UhT/SKB8W0cKZtSCD+ oHPYauncEbjNjjBqNkHhoWBhT0STt6mjkqNwZzee5Qpo5SsB0sPoZxDErQWDsy4RsZ3y 1N9D28pn3Er+WL76xQhJwcx4e2se1LLkp8j8nWb0BBsedYQE0zsgML5TOc4yCoOaOajl 6D7J24Vjcu/dBOkgxlgLDheXBBcKBV3Tvqcl+RLh+/4SJiouEfmfblQhgsbxG5B04ZUf BCIivwZyIaXmfh6UnOvV8WF0v0QX1hhXY7NiVEyhvW+3jwrvEHPjITT7VqYQ9IICdR/u Lxog== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779444067; x=1780048867; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=Bd+nfDwDIbDnF5mLnuaN9+Mk0Lao6hQ83OhFSeujfCQ=; b=GoZVmSKFILLTkuhom/enEIVNSmCLoyv7WUlOOYWImjQASsZWkGEASSYYN4UaoX2l8P M/+ecJk7isGrgA5exCpwciTiKZg0986LFMspPkHNv7+eEkKM6gktSqC6Ck9hWwctgpZe TdN1dBDziHwdBqdf8XiMCqxm5d4pcCG+7l8sohgQazFrQfkghDmBN6yNjFokJKQ4+cvm cSdf40/KswM2ejbHg39+CBjnOk5sfEDiULXFHfqcOhdmU9s2B0Ls85N9ckSYDDDPvlhz AwGYPpW1YFpH5Za7jE1WyHZKPGkCScTM0BbuQHcdkLiITrt7aDmJYg32880t4rFiBdop ajWw== X-Forwarded-Encrypted: i=1; AFNElJ/8AF3upZtFoPeehyJNGaYfnHPUk5OPziDgpcZS+O4M+OW5Gj6ji2jtWUbo97bGu7k/0Om6emPrYg/ct9M=@vger.kernel.org X-Gm-Message-State: AOJu0YwYwXk9dQdkPp1En09wfJiXyUQNf3avy7AWfCdUglmWqzijrTji Y75FcfMb094QuJqHOh9DUMfifDOeXaJxZja9Gdvh7dgHUV7NhgWzz5a7Wla35eCTBymXWTUQkEM i+hHLpn4moVW+99TYy7BHew5gVuRYzjDYQXWM7MTZm1704fssNNtdEtX7Yii5P/z8SJE= X-Gm-Gg: Acq92OECG4tBHqgrV/E7XLdCtOsziwTxrlvIus4mIyxbM8e6czrD/0GVs2a5rPULTg/ T+rKZiRjci0dMjEpe66kb3SAkSR0bqheakFAqFig6T0UhoPqKozj/qw4bxYLF2TTQ5lA9tjtmsD vAQaYU6lhxvoTXtUtSAqdz/nEjmczs4f3mrmSdRXw7RFRAQuGhiqeOjJ+PKL7FMg79NKxtytsNF 1+8BbRJ4YMgYK63dDazlKGNd/CJzih/OXybm1mZzDbCH4Ke4gHpWJYY6P1K3ibTS/zh8bT+JNSQ XTZgaCj8rWlAsCDIGlOeYOnY/79pOFGxSa74dQ9maYUiNI9NAvIoiR6b0oHY0wR4bGSDKfTtxgu KcqTfZe9T7rSQHA1NTDkvQNfjOS4q4aPsrar80VmOOpcBNwn4d+nX0e1b X-Received: by 2002:a05:6a00:3e04:b0:82a:7471:eb90 with SMTP id d2e1a72fcca58-8415f66c854mr3352539b3a.30.1779444066403; Fri, 22 May 2026 03:01:06 -0700 (PDT) X-Received: by 2002:a05:6a00:3e04:b0:82a:7471:eb90 with SMTP id d2e1a72fcca58-8415f66c854mr3352459b3a.30.1779444065675; Fri, 22 May 2026 03:01:05 -0700 (PDT) Received: from hu-krichai-hyd.qualcomm.com ([202.46.23.25]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-84164ac9b74sm1516641b3a.3.2026.05.22.03.00.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 22 May 2026 03:01:05 -0700 (PDT) From: Krishna Chaitanya Chundru Date: Fri, 22 May 2026 15:30:33 +0530 Subject: [PATCH v2 2/6] bus: mhi: Drop controller runtime PM callback indirection Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260522-mhi_runtimepm-v2-2-fbebf41a82bb@oss.qualcomm.com> References: <20260522-mhi_runtimepm-v2-0-fbebf41a82bb@oss.qualcomm.com> In-Reply-To: <20260522-mhi_runtimepm-v2-0-fbebf41a82bb@oss.qualcomm.com> To: Manivannan Sadhasivam , Jeff Hugo , Carl Vanderlip , Oded Gabbay , Jeff Johnson , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Loic Poulain , Sergey Ryazanov , Johannes Berg Cc: mhi@lists.linux.dev, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-wireless@vger.kernel.org, ath11k@lists.infradead.org, ath12k@lists.infradead.org, netdev@vger.kernel.org, mayank.rana@oss.qualcomm.com, quic_vbadigan@quicinc.com, vivek.pernamitta@oss.qualcomm.com, Krishna Chaitanya Chundru , Konrad Dybcio X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1779444039; l=7368; i=krishna.chundru@oss.qualcomm.com; s=20230907; h=from:subject:message-id; bh=UBj9I2ZVbQBtANcm1Eq+93YFWtxJuvyInNBweC3+uv4=; b=guQyGJqG4mutdLlQ1ChKaWEf2g1AbTVPnm7d7mM85MeEF+AFm5bB3tofJI+ZSZEhBZZl45OeD YNohaHam4p7DV60pWefjYxjri5JSGcRQkh5MsvyEpd1J63k03Al+5Aa X-Developer-Key: i=krishna.chundru@oss.qualcomm.com; a=ed25519; pk=10CL2pdAKFyzyOHbfSWHCD0X0my7CXxj8gJScmn1FAg= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTIyMDA5OSBTYWx0ZWRfX9cYoQ/Uy6Jyt xqqmqOYUyfA7MfBUtngu8fo9CNz+wvEzwGSXt5vNoYbbr9zCBdSjljO7O8g42xZEzfEjkGcRwnL lnBv/Wruy2BVWklK8fTB77Rpnp6PZ1wTsj0FOnmZ6ZyxIpwJGkHcGqws2ko1AVLTfcyv4GPMwCI L9YU0+gi3OusJ4KuSqNCrdHmcJ9Wzee2oqC2+DTt7fvHeE4JsD6uYuTR9goDCuaTMi8r8ip3v7K VOx/SdXJ4jDzHnd2J6EHJf0GQKckU1e+un9oct4G7tvBvAeFiqIRAuq9OT7YGpXZcQYeByWdJV8 NrbsHk5XHo+a3BCy0WZzH75s8iLV77Sk6CfR1l/7CLdfbfqzEZakR9UwtSa6piYpIt50bAESDq5 zIhBS3ZUfiR0fDMY3nstkBcX1MJdm/r5RKsmOOgruiVIiTWP3sILZ3CwsNLJJAhlAfQwz2M22vR SyueTCMHWcBv/JpeJFQ== X-Proofpoint-GUID: 1U9CRoEvI9pcD6C7DS7qwmUSsm4LHiBW X-Authority-Analysis: v=2.4 cv=LNdWhpW9 c=1 sm=1 tr=0 ts=6a102963 cx=c_pps a=rz3CxIlbcmazkYymdCej/Q==:117 a=ZePRamnt/+rB5gQjfz0u9A==:17 a=IkcTkHD0fZMA:10 a=NGcC8JguVDcA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=DJpcGTmdVt4CTyJn9g5Z:22 a=EUspDBNiAAAA:8 a=GfE3bLbzyHi1VA9kviUA:9 a=QEXdDO2ut3YA:10 a=bFCP_H2QrGi7Okbo017w:22 X-Proofpoint-ORIG-GUID: 1U9CRoEvI9pcD6C7DS7qwmUSsm4LHiBW X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-22_02,2026-05-18_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 clxscore=1015 malwarescore=0 lowpriorityscore=0 priorityscore=1501 bulkscore=0 impostorscore=0 phishscore=0 spamscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605130000 definitions=main-2605220099 The MHI controller interface exposes runtime_get and runtime_put callbacks to abstract runtime PM handling from the MHI core. This indirection is unnecessary since the MHI core can directly use the generic pm_runtime_* APIs, and the existing implementations are either no-ops or trivial wrappers around those same APIs. Remove the runtime_get and runtime_put function pointers from struct mhi_controller and update all users in the MHI host stack to call the standard runtime PM helpers directly. Signed-off-by: Krishna Chaitanya Chundru Reviewed-by: Konrad Dybcio --- drivers/accel/qaic/mhi_controller.c | 11 ----------- drivers/bus/mhi/host/pci_generic.c | 24 +++--------------------- drivers/net/wireless/ath/ath11k/mhi.c | 10 ---------- drivers/net/wireless/ath/ath12k/mhi.c | 11 ----------- include/linux/mhi.h | 4 ---- 5 files changed, 3 insertions(+), 57 deletions(-) diff --git a/drivers/accel/qaic/mhi_controller.c b/drivers/accel/qaic/mhi_c= ontroller.c index 4d787f77ce41..68cabfd2df2d 100644 --- a/drivers/accel/qaic/mhi_controller.c +++ b/drivers/accel/qaic/mhi_controller.c @@ -776,15 +776,6 @@ static void mhi_write_reg(struct mhi_controller *mhi_c= ntrl, void __iomem *addr, writel_relaxed(val, addr); } =20 -static int mhi_runtime_get(struct mhi_controller *mhi_cntrl) -{ - return 0; -} - -static void mhi_runtime_put(struct mhi_controller *mhi_cntrl) -{ -} - static void mhi_status_cb(struct mhi_controller *mhi_cntrl, enum mhi_callb= ack reason) { struct qaic_device *qdev =3D pci_get_drvdata(to_pci_dev(mhi_cntrl->cntrl_= dev)); @@ -845,8 +836,6 @@ struct mhi_controller *qaic_mhi_register_controller(str= uct pci_dev *pci_dev, voi mhi_cntrl->iova_start =3D 0; mhi_cntrl->iova_stop =3D PHYS_ADDR_MAX - 1; mhi_cntrl->status_cb =3D mhi_status_cb; - mhi_cntrl->runtime_get =3D mhi_runtime_get; - mhi_cntrl->runtime_put =3D mhi_runtime_put; mhi_cntrl->read_reg =3D mhi_read_reg; mhi_cntrl->write_reg =3D mhi_write_reg; mhi_cntrl->regs =3D mhi_bar; diff --git a/drivers/bus/mhi/host/pci_generic.c b/drivers/bus/mhi/host/pci_= generic.c index 750da3dbb4c6..cbd2b442df83 100644 --- a/drivers/bus/mhi/host/pci_generic.c +++ b/drivers/bus/mhi/host/pci_generic.c @@ -1220,23 +1220,6 @@ static int mhi_pci_get_irqs(struct mhi_controller *m= hi_cntrl, return 0; } =20 -static int mhi_pci_runtime_get(struct mhi_controller *mhi_cntrl) -{ - /* The runtime_get() MHI callback means: - * Do whatever is requested to leave M3. - */ - return pm_runtime_get(mhi_cntrl->cntrl_dev); -} - -static void mhi_pci_runtime_put(struct mhi_controller *mhi_cntrl) -{ - /* The runtime_put() MHI callback means: - * Device can be moved in M3 state. - */ - pm_runtime_mark_last_busy(mhi_cntrl->cntrl_dev); - pm_runtime_put(mhi_cntrl->cntrl_dev); -} - static void mhi_pci_recovery_work(struct work_struct *work) { struct mhi_pci_device *mhi_pdev =3D container_of(work, struct mhi_pci_dev= ice, @@ -1324,7 +1307,7 @@ static int mhi_pci_generic_edl_trigger(struct mhi_con= troller *mhi_cntrl) } =20 pm_wakeup_event(&mhi_cntrl->mhi_dev->dev, 0); - mhi_cntrl->runtime_get(mhi_cntrl); + pm_runtime_get(mhi_cntrl->cntrl_dev); =20 ret =3D mhi_get_channel_doorbell_offset(mhi_cntrl, &val); if (ret) @@ -1338,7 +1321,8 @@ static int mhi_pci_generic_edl_trigger(struct mhi_con= troller *mhi_cntrl) mhi_soc_reset(mhi_cntrl); =20 err_get_chdb: - mhi_cntrl->runtime_put(mhi_cntrl); + pm_runtime_mark_last_busy(mhi_cntrl->cntrl_dev); + pm_runtime_put(mhi_cntrl->cntrl_dev); mhi_device_put(mhi_cntrl->mhi_dev); =20 return ret; @@ -1385,8 +1369,6 @@ static int mhi_pci_probe(struct pci_dev *pdev, const = struct pci_device_id *id) mhi_cntrl->read_reg =3D mhi_pci_read_reg; mhi_cntrl->write_reg =3D mhi_pci_write_reg; mhi_cntrl->status_cb =3D mhi_pci_status_cb; - mhi_cntrl->runtime_get =3D mhi_pci_runtime_get; - mhi_cntrl->runtime_put =3D mhi_pci_runtime_put; mhi_cntrl->mru =3D info->mru_default; mhi_cntrl->name =3D info->name; =20 diff --git a/drivers/net/wireless/ath/ath11k/mhi.c b/drivers/net/wireless/a= th/ath11k/mhi.c index f994233df2bb..db163a708064 100644 --- a/drivers/net/wireless/ath/ath11k/mhi.c +++ b/drivers/net/wireless/ath/ath11k/mhi.c @@ -226,14 +226,6 @@ static int ath11k_mhi_get_msi(struct ath11k_pci *ab_pc= i) return 0; } =20 -static int ath11k_mhi_op_runtime_get(struct mhi_controller *mhi_cntrl) -{ - return 0; -} - -static void ath11k_mhi_op_runtime_put(struct mhi_controller *mhi_cntrl) -{ -} =20 static char *ath11k_mhi_op_callback_to_str(enum mhi_callback reason) { @@ -380,8 +372,6 @@ int ath11k_mhi_register(struct ath11k_pci *ab_pci) mhi_ctrl->sbl_size =3D SZ_512K; mhi_ctrl->seg_len =3D SZ_512K; mhi_ctrl->fbc_download =3D true; - mhi_ctrl->runtime_get =3D ath11k_mhi_op_runtime_get; - mhi_ctrl->runtime_put =3D ath11k_mhi_op_runtime_put; mhi_ctrl->status_cb =3D ath11k_mhi_op_status_cb; mhi_ctrl->read_reg =3D ath11k_mhi_op_read_reg; mhi_ctrl->write_reg =3D ath11k_mhi_op_write_reg; diff --git a/drivers/net/wireless/ath/ath12k/mhi.c b/drivers/net/wireless/a= th/ath12k/mhi.c index ee87f00bc5de..9122837e5206 100644 --- a/drivers/net/wireless/ath/ath12k/mhi.c +++ b/drivers/net/wireless/ath/ath12k/mhi.c @@ -100,15 +100,6 @@ static int ath12k_mhi_get_msi(struct ath12k_pci *ab_pc= i) return 0; } =20 -static int ath12k_mhi_op_runtime_get(struct mhi_controller *mhi_cntrl) -{ - return 0; -} - -static void ath12k_mhi_op_runtime_put(struct mhi_controller *mhi_cntrl) -{ -} - static char *ath12k_mhi_op_callback_to_str(enum mhi_callback reason) { switch (reason) { @@ -256,8 +247,6 @@ int ath12k_mhi_register(struct ath12k_pci *ab_pci) mhi_ctrl->sbl_size =3D SZ_512K; mhi_ctrl->seg_len =3D SZ_512K; mhi_ctrl->fbc_download =3D true; - mhi_ctrl->runtime_get =3D ath12k_mhi_op_runtime_get; - mhi_ctrl->runtime_put =3D ath12k_mhi_op_runtime_put; mhi_ctrl->status_cb =3D ath12k_mhi_op_status_cb; mhi_ctrl->read_reg =3D ath12k_mhi_op_read_reg; mhi_ctrl->write_reg =3D ath12k_mhi_op_write_reg; diff --git a/include/linux/mhi.h b/include/linux/mhi.h index fb3ba639f4f8..46ac60d01846 100644 --- a/include/linux/mhi.h +++ b/include/linux/mhi.h @@ -361,8 +361,6 @@ struct mhi_controller_config { * @wake_get: CB function to assert device wake (optional) * @wake_put: CB function to de-assert device wake (optional) * @wake_toggle: CB function to assert and de-assert device wake (optional) - * @runtime_get: CB function to controller runtime resume (required) - * @runtime_put: CB function to decrement pm usage (required) * @map_single: CB function to create TRE buffer * @unmap_single: CB function to destroy TRE buffer * @read_reg: Read a MHI register via the physical link (required) @@ -441,8 +439,6 @@ struct mhi_controller { void (*wake_get)(struct mhi_controller *mhi_cntrl, bool override); void (*wake_put)(struct mhi_controller *mhi_cntrl, bool override); void (*wake_toggle)(struct mhi_controller *mhi_cntrl); - int (*runtime_get)(struct mhi_controller *mhi_cntrl); - void (*runtime_put)(struct mhi_controller *mhi_cntrl); int (*map_single)(struct mhi_controller *mhi_cntrl, struct mhi_buf_info *buf); void (*unmap_single)(struct mhi_controller *mhi_cntrl, --=20 2.34.1 From nobody Sun May 24 18:43:18 2026 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 9FC8038887B for ; Fri, 22 May 2026 10:01:17 +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=1779444079; cv=none; b=ms0h9ZytCHYtD84qPcgTwi5SRNHfxdmJpv7Hy6XzfzvMgiWeNUG3+rMKreNvx359DDpmNU/Bd2zmCFR9I5RWLT2ESTScJcQ8LxwjMO76RQ/dyb12KO2ADo9W3KY8m5DPR3wO7p+TWlmBOBUSFmVRo6SeFSyXKS/+grNkMa3thuY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779444079; c=relaxed/simple; bh=y3Md+/LJdRoPfa8fSBTst//7iA3QrqSh3tsJRClRwKA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=UEwRfPzGhzXL5Vm826TqvJQHxQB79ib+e9lCyOcjDUk3Vm+sOISiDzGd7c99oarbQMAtzk5cpkG6XO/0VeQ9fb2PYxqHWVg2qjqu2FX5CZB5kJeuyBaUk0H+DD/MLS25fhQhhhfww+hEV1EFv+LLdpvHsHeTW6crL6DvWR9AbD4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=jqjpioQF; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=WMosYht3; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="jqjpioQF"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="WMosYht3" Received: from pps.filterd (m0279871.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 64M5xBZC777951 for ; Fri, 22 May 2026 10:01:16 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= 89GZyqjxzP4kzPz+TzUkPQL4cVAEH+s+D1a55Or7dm0=; b=jqjpioQFFAri1m2v HbJL84xCVFhlIq0d2UiQ47xNCEwDEpYfl4QL2066E9UNWXygtvKtJX6KVopUig/B DNCs1cdIbKI7+ComLVYO15cK90mYoNtvznOcMR7Pw8RmqruWrK/FwqkO21zVgCBK BGtMJPVA+o5ViB3j7kd4mCSt1nju/CF1aR0HxDv8B2oJFbuE0NkFGMdP0EDG41PL 2EARo6n8CCNkcRm9atfIEi0uo7M3xl0W6uCWvjaXHbMUrrZvkd43nV+sABOxFnxR QFVHmfwgpIAYWljVCxKScvyUUXS3b4Wc3qsYtvf0yKf+zVnB4cPFQ+LMUzoQGMTs inJCFg== Received: from mail-pf1-f197.google.com (mail-pf1-f197.google.com [209.85.210.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4ea94h2xh4-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 22 May 2026 10:01:16 +0000 (GMT) Received: by mail-pf1-f197.google.com with SMTP id d2e1a72fcca58-82f9429f49cso10540852b3a.3 for ; Fri, 22 May 2026 03:01:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1779444075; x=1780048875; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=89GZyqjxzP4kzPz+TzUkPQL4cVAEH+s+D1a55Or7dm0=; b=WMosYht3MVMArPKL0lwi1xACPiyEN2Ockb3Yf2/a/yzCha+jqneKvO1Tfsx8pYHWjE PvCO+WHPT5p3cwPbfeN8MvemJBKQFrfYkQaaIARbL586NayjWQ2sGct1tcR+Q9e2BnSr 3XIwKvInmRRBqelq74pEvIOPtZrFdUnR3PNaSWjB7r2J0Pel3rN4lyxxPeXDia4Z1sgQ i74eg3J2DYQmvBKDzpmbpJK1OE8dUB5hX2yqK6WkCyqqZnwOr/yIAxQv+lP+VA75agyw Pxja88xcWsUXsPPHeqhSSP+fOqXhMqNkx/9gyqVxHbtSvRJCXoQPbZ0OZ87vVCZCv06A 8YLg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779444075; x=1780048875; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=89GZyqjxzP4kzPz+TzUkPQL4cVAEH+s+D1a55Or7dm0=; b=AGuzQDYGPpDo3iRBlxmPwsw7mfzDocug0uErqxjDSu7nrCwJw47Gsp/rrsX8te9eLL 1MZuvIjIPg2pBDIqVYdYuMxMNYlL9tJglHDD882kZsc8CWTdDVwPxqKKAvm3yd/am4eK Lq17IB9Gc5QN1IL0pWw0m+jSmFOKEfZ8R+ynedWfhh8imdlZgaXQSIyhjWRhVTq6rONO GBfMob7JLTKDT3cj1OeIkPdX8HJbjn6flAJ2AFpeBULmw2+SW3OfO3kVM/fGl6SGuJrx jJmbiR6L6hc+vf+5xOunhOL3QEZnYUtxcQ4jRaLIp7gQFM+mVtPAA70DvkuI05rt7N/n RIsg== X-Forwarded-Encrypted: i=1; AFNElJ+yZv8pLyTmfnCp+dFztYIycxYS0H2nDhuSMSxHmahzBXkMp/9e9ccXa13onvctP6DkhZXiXhQnFP5J03I=@vger.kernel.org X-Gm-Message-State: AOJu0Yx6b9HeQvC3wh1jKf8V1tatnO9omRcskuHIutHHYtj/iNp6v5zR TEFuqN/VHOUAaMxLXtjsvJYSjvNAOuwXCYFq9uvP0HQBRkkJ3zNuCaeGFZwv81TaAWNJaMMCf6h bxOvdvaNeXgf9HOjPBx1YC6hzXQERYt75oRjMHSytbFQTPggEwliz3SqGbx88v3i8QA4= X-Gm-Gg: Acq92OGFfQNPYOIYds9Vy+f7XECr1NqfWxez+O1zOM+Ix1fLvCsJyV/yKi3pEi77DHl VKaRT1Do7tbi796BlzZiiDsKj/Pez40WSe9VzSZDUnOgzc9S5RAKq1dgzOPT4OKKypj/QqWeVjG qb5+cSTM7NGWdPyj8s7HDZL7TFdEzGfnISvs3gQ4uQ66Qpo6gg7WDqiaGzQeP1TU/C427AloZgN MCA/9uJk5eNWMh5GmqafN1OKfwuqpxxA0vc/5xSeTuLoryCLmf+bLCBwo/10AzbaGOJrKuWPtT8 inbjd6jJ5KcliPYcetTNfvNHiQcuGlhqKuWQdvY3vCVrwma5wVMWkpF3FASLL/wEwDF/OT1pQoQ NA33Wigk08Y2tAXKV7zrULDMZ4aFeDipkVEvBJHBC1BiF9JOQafDEQUww X-Received: by 2002:a05:6a00:1807:b0:81f:31c3:2e34 with SMTP id d2e1a72fcca58-8415f330494mr3326871b3a.25.1779444074785; Fri, 22 May 2026 03:01:14 -0700 (PDT) X-Received: by 2002:a05:6a00:1807:b0:81f:31c3:2e34 with SMTP id d2e1a72fcca58-8415f330494mr3326808b3a.25.1779444074141; Fri, 22 May 2026 03:01:14 -0700 (PDT) Received: from hu-krichai-hyd.qualcomm.com ([202.46.23.25]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-84164ac9b74sm1516641b3a.3.2026.05.22.03.01.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 22 May 2026 03:01:13 -0700 (PDT) From: Krishna Chaitanya Chundru Date: Fri, 22 May 2026 15:30:34 +0530 Subject: [PATCH v2 3/6] net: mhi_net: Hold runtime PM during active data path operations Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260522-mhi_runtimepm-v2-3-fbebf41a82bb@oss.qualcomm.com> References: <20260522-mhi_runtimepm-v2-0-fbebf41a82bb@oss.qualcomm.com> In-Reply-To: <20260522-mhi_runtimepm-v2-0-fbebf41a82bb@oss.qualcomm.com> To: Manivannan Sadhasivam , Jeff Hugo , Carl Vanderlip , Oded Gabbay , Jeff Johnson , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Loic Poulain , Sergey Ryazanov , Johannes Berg Cc: mhi@lists.linux.dev, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-wireless@vger.kernel.org, ath11k@lists.infradead.org, ath12k@lists.infradead.org, netdev@vger.kernel.org, mayank.rana@oss.qualcomm.com, quic_vbadigan@quicinc.com, vivek.pernamitta@oss.qualcomm.com, Krishna Chaitanya Chundru X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1779444039; l=4173; i=krishna.chundru@oss.qualcomm.com; s=20230907; h=from:subject:message-id; bh=y3Md+/LJdRoPfa8fSBTst//7iA3QrqSh3tsJRClRwKA=; b=s+sHbgZoUcbrkhk1NuhJt9uKCZYJuw6T6gtb1ZC0H9M7hSgDCA1Etn58jrZgjHnvT0SCRG62Q V7oqxMJp/lHBjYl/lZQf2obhPMwRXspe8hoAXlE3MFihEsy0yCkGb4V X-Developer-Key: i=krishna.chundru@oss.qualcomm.com; a=ed25519; pk=10CL2pdAKFyzyOHbfSWHCD0X0my7CXxj8gJScmn1FAg= X-Proofpoint-GUID: lHaejjksPNxBR_Z3MhAispXsX8SGhg2F X-Authority-Analysis: v=2.4 cv=QblWeMbv c=1 sm=1 tr=0 ts=6a10296c cx=c_pps a=rEQLjTOiSrHUhVqRoksmgQ==:117 a=ZePRamnt/+rB5gQjfz0u9A==:17 a=IkcTkHD0fZMA:10 a=NGcC8JguVDcA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=3WHJM1ZQz_JShphwDgj5:22 a=EUspDBNiAAAA:8 a=-cKO2LIWXEwUer3o84gA:9 a=QEXdDO2ut3YA:10 a=2VI0MkxyNR6bbpdq8BZq:22 X-Proofpoint-ORIG-GUID: lHaejjksPNxBR_Z3MhAispXsX8SGhg2F X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTIyMDA5OSBTYWx0ZWRfX9yElkR4cbdih FOI+3q/Vu7IM6LVdownI5ZPWgKBEm0UDBUIbBE46Ty3x8btZhLoqKgfwdJlgbkPEmdCgVEz39hB /Ld+TBlL2PwZaeCCUJC8ts6icDYJwmQRumNadlfiPRLhH7XIJFLN6w2QYCvjKCZkcNm/wPzbuOu /J4bLxugr2OlIQOj7CEzC2xwTTU43RvLKYU3jWaCEqY8oM+ToAg215m3d4ag9X59XyzaiavpJAP Zleca4mH+T2HVmB2/dIWRY/mfy8ojADtdAliZHMhEDjauVFVibCYLwgkI/YhK2BckNfjjY/euS8 A0XTExzn/oMWynt6UgEpO+QOfgmNfyRd3VPuizSeJTaYWXBfP9De9x38Y4Pef8BxeKszYqEhgCX qsVF6QQmdYjIN2TzySE++REzn6gbxDfXssM3aKE61/Yc4ikpaCnQocZF50ure0xjgSAYpNZ+Bw4 ZaxaOoBvDxxE4vHiu+A== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-22_02,2026-05-18_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 impostorscore=0 malwarescore=0 lowpriorityscore=0 spamscore=0 suspectscore=0 adultscore=0 clxscore=1015 priorityscore=1501 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605130000 definitions=main-2605220099 The mhi_net driver does not coordinate with runtime PM, which allows the underlying MHI controller to be runtime-suspended while transmit, receive, or RX buffer refill operations are in progress. This can lead to stalled transfers or failed queueing once runtime PM is enabled in the MHI core. Add runtime PM reference counting to the mhi_net data path to keep the controller active for the duration of TX, RX, and buffer management operations. Enable runtime PM during probe and take/release references explicitly around these critical paths. Signed-off-by: Krishna Chaitanya Chundru --- drivers/net/mhi_net.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/drivers/net/mhi_net.c b/drivers/net/mhi_net.c index ae169929a9d8..5d7f9ccdb17b 100644 --- a/drivers/net/mhi_net.c +++ b/drivers/net/mhi_net.c @@ -9,6 +9,7 @@ #include #include #include +#include #include #include =20 @@ -76,11 +77,19 @@ static netdev_tx_t mhi_ndo_xmit(struct sk_buff *skb, st= ruct net_device *ndev) struct mhi_device *mdev =3D mhi_netdev->mdev; int err; =20 + err =3D pm_runtime_get(&mdev->dev); + if (err < 0 && err !=3D -EINPROGRESS) { + dev_err(&mdev->dev, "pm_runtime_get failed %d\n", err); + pm_runtime_put_noidle(&mdev->dev); + goto exit_drop; + } + err =3D mhi_queue_skb(mdev, DMA_TO_DEVICE, skb, skb->len, MHI_EOT); if (unlikely(err)) { net_err_ratelimited("%s: Failed to queue TX buf (%d)\n", ndev->name, err); dev_kfree_skb_any(skb); + pm_runtime_put(&mdev->dev); goto exit_drop; } =20 @@ -251,6 +260,7 @@ static void mhi_net_ul_callback(struct mhi_device *mhi_= dev, /* MHI layer stopping/resetting the UL channel */ if (mhi_res->transaction_status =3D=3D -ENOTCONN) { u64_stats_update_end(&mhi_netdev->stats.tx_syncp); + pm_runtime_put(&mdev->dev); return; } =20 @@ -261,6 +271,7 @@ static void mhi_net_ul_callback(struct mhi_device *mhi_= dev, } u64_stats_update_end(&mhi_netdev->stats.tx_syncp); =20 + pm_runtime_put(&mdev->dev); if (netif_queue_stopped(ndev) && !mhi_queue_is_full(mdev, DMA_TO_DEVICE)) netif_wake_queue(ndev); } @@ -277,6 +288,12 @@ static void mhi_net_rx_refill_work(struct work_struct = *work) =20 size =3D mhi_netdev->mru ? mhi_netdev->mru : READ_ONCE(ndev->mtu); =20 + err =3D pm_runtime_resume_and_get(&mdev->dev); + if (err) { + dev_err(&mdev->dev, "pm_runtime_resume_and_get failed %d\n", err); + return; + } + while (!mhi_queue_is_full(mdev, DMA_FROM_DEVICE)) { skb =3D netdev_alloc_skb(ndev, size); if (unlikely(!skb)) @@ -296,6 +313,7 @@ static void mhi_net_rx_refill_work(struct work_struct *= work) cond_resched(); } =20 + pm_runtime_put(&mdev->dev); /* If we're still starved of rx buffers, reschedule later */ if (mhi_get_free_desc_count(mdev, DMA_FROM_DEVICE) =3D=3D mhi_netdev->rx_= queue_sz) schedule_delayed_work(&mhi_netdev->rx_refill, HZ / 2); @@ -362,20 +380,41 @@ static int mhi_net_probe(struct mhi_device *mhi_dev, =20 SET_NETDEV_DEV(ndev, &mhi_dev->dev); =20 + pm_runtime_no_callbacks(&mhi_dev->dev); + err =3D devm_pm_runtime_set_active_enabled(&mhi_dev->dev); + if (err) + return err; + + err =3D pm_runtime_resume_and_get(&mhi_dev->dev); + if (err) { + dev_err(&mhi_dev->dev, "pm_runtime_resume_and_get failed %d\n", err); + return err; + } + err =3D mhi_net_newlink(mhi_dev, ndev); if (err) { free_netdev(ndev); + pm_runtime_put(&mhi_dev->dev); return err; } =20 + pm_runtime_put(&mhi_dev->dev); return 0; } =20 static void mhi_net_remove(struct mhi_device *mhi_dev) { struct mhi_net_dev *mhi_netdev =3D dev_get_drvdata(&mhi_dev->dev); + int err; + + err =3D pm_runtime_resume_and_get(&mhi_dev->dev); + if (err) + dev_err(&mhi_dev->dev, "pm_runtime_resume_and_get failed %d\n", err); =20 mhi_net_dellink(mhi_dev, mhi_netdev->ndev); + + if (!err) + pm_runtime_put(&mhi_dev->dev); } =20 static const struct mhi_device_info mhi_hwip0 =3D { --=20 2.34.1 From nobody Sun May 24 18:43:18 2026 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 8838932AAC6 for ; Fri, 22 May 2026 10:01:25 +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=1779444087; cv=none; b=iCHM6HGFS3+as/uk6yRN1rMsbOLMTz8SgonQqjJ1AEgm8i7LGT7o72k/pXNM+ybvynxxxJ+OzFsD62AN7fYyR0JuPBj+xbpOuf+AzwNkxwI6jvKM2T0Vb6IdaNAbXaRQuFLqzBBtyxH/X2W4tQGNbEr3YPrHl2awTXivoIbVoxs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779444087; c=relaxed/simple; bh=BhFCU11Vli0eY4peRB1YT42TDHVLDyHFog9G3pGgq0Q=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=UDZbBk79XbIAJOfZC2YV+Z5viTDvGfAvy2x1QgtRbcaxgFo42bsBuzy3mpp826tJfB3yzqtzkI3tFftrXa1/A6Dnqntg+5R9Wkz21wgla+Eqsj8MCEEQ5tr2xJNU7a3SURK5YdLWwHW1pJiCTcyiOCUJMsVDbMdjClp5r7cQw8Q= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=RgzlyxGB; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=f4aQfsgI; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="RgzlyxGB"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="f4aQfsgI" Received: from pps.filterd (m0279871.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 64M5sXNT777027 for ; Fri, 22 May 2026 10:01:24 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= P+6QIFUay/hg2xkAFLiW+meafenw/9VGhbxcOU+YUEk=; b=RgzlyxGB94tPSA5n VmceMUIf6T/pLYNQQdcpkxCalmE7Lg26vv2WwJqGcuj4W7nHxcjpcLM1mBh+iXE+ 72/xMMGiPCSy7eXlSFdyXhFM5lU2AVcEYijhJ3Pvwg8nESKOBXpZmVgkT4GMycdv ic8HSEjmbIz0XqwzDPbrZirpSCFDLRtUNlBVker1EaBUd4nnlU7n8EjkQSNIJLS4 8Z+eaVoJpuyr42ZlyZia5YePGd9O5XuqnE9GP7ajY929j37pU30rk4XZMrBPB8KH 5TmBdinMtcQfwbL69AJe9yj5FeSUdPjKDOny2ntiBeYmvcT8iiep0pyxYhJKlwvw VQ3lWg== Received: from mail-pf1-f198.google.com (mail-pf1-f198.google.com [209.85.210.198]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4ea94h2xjb-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 22 May 2026 10:01:24 +0000 (GMT) Received: by mail-pf1-f198.google.com with SMTP id d2e1a72fcca58-83f24cd00f8so3887490b3a.0 for ; Fri, 22 May 2026 03:01:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1779444083; x=1780048883; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=P+6QIFUay/hg2xkAFLiW+meafenw/9VGhbxcOU+YUEk=; b=f4aQfsgIMef3SiBknHfadiM5Nq9zyv0FFfVjVDmXaMfT7Ar01ufma5xf7Eq0G9djDi jZ2hsDEw2h12kmd0SZDrcPLDq7duxVe9UA59IKgskOI4sQZpcwYaLCc9TgY67Ux7xRus yljGHNnNmxowlUKaeQGuGDUdDpvL6XvyoUeoa/xSpJpXvDcvAlixbMeM9qdxI2mCsUq9 4p/CeGYm1jVy7MbjLLJyxN1NerDZ6w2QzpXhn1RaiMUgoaMYsftOLxjpiU+8YB6DBcD0 lha55/sPdstYlMJWAuylGikZ2g5Le+RYl1dLwvj/AWTzt8h3EuFsGzKHuRYL90ceIW4T uXbw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779444083; x=1780048883; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=P+6QIFUay/hg2xkAFLiW+meafenw/9VGhbxcOU+YUEk=; b=VSmTP2XXaxjXu5HLoGs45N8vGz1X3B4a/pYYO4J/viLA/IiWAMGSW16BXnJPIZYTY9 YjKhFFBn1l67snHg42id3IrtYG7XB746xsm5gDniVnfbez560baGmg5VpjRcL1PYDgyu vQNTmp1Kh7x6ZI2H+AXRGvpgUuopZcCXkwUhd2bhWlO4HXzfMQNE+K0yuvElOYgiSrPI hsrC8RVlthbPMKjMEoqbTAgsrtjeVkPooDZWm/DSoc8gGebWXyvvKhsI9jreANjYDVDe Us+T+TJ8Xx2sNsyXvpTsobDGk+Ci1TUFF0Ibn5SVrrpKmlE7ZAshTDVIcHUwPIz7TAJz 60pw== X-Forwarded-Encrypted: i=1; AFNElJ+zsWdFdLF1lq8POLjIweKLL0BAeutisJ16kqiYYgduyajAMV3PGECHp8OzSWLTGh0jWQQfq5AajEYCHJM=@vger.kernel.org X-Gm-Message-State: AOJu0Ywokoc/lWG238izuAXaOzUBoOOBBJcPf9rzBMlZ3iXC8cgto0bP Whpi2BPtd+DTS6tthmDa6ZUxiSIqERgRm0bRTOA2DwmXQLUqCFHf5KSxsu5nBelDEXlNbDd6e7j 5mXAClsDIgaTTDVJ8Q/FmUIxTk8/uG6BYwsv+MkWeldnvP2T1RfjvrLPqX+y9K6TR2pk= X-Gm-Gg: Acq92OE+ouz2ftEDP7DBoLfQIpXjqWfcQX6wYyCN6SZL6qtvsWcI7LJirvwyXxe3aDd XtHPfJPqzH+kOJhKm9oW4AXisGZPmr//iV74XhVKes3wMcyrOz591CV8DChK3g55zMZiNsq3A9k Cqswe3Epezemr21/CYKV+EHdL/cRgf3jgMXYhkYltiQ1GUh4A6xIlaCPBQpv+JGNxmUaZ9IyDmy XBA+npPPsLhCOJD3xzb1m09aPUQPa1QihvQgbsM6N4hFBl8qHuvPCOvY8x1etbUDDnxCPNrhbQo OYtp4WPeBTOaNmK+Ui3Vcp8jaMOB781whAqVCjwtB65pMNJwKjC1fP9enwucd9PPjVSvb6Huwks 0IfUgSVxgvJfb8ZILrhP7jbShrnDiPPWivz/98bVG1fgLc/h7igkHP1Ud X-Received: by 2002:a05:6a00:438b:b0:82c:9f7e:518c with SMTP id d2e1a72fcca58-8415f32e17amr3015032b3a.25.1779444083208; Fri, 22 May 2026 03:01:23 -0700 (PDT) X-Received: by 2002:a05:6a00:438b:b0:82c:9f7e:518c with SMTP id d2e1a72fcca58-8415f32e17amr3014968b3a.25.1779444082645; Fri, 22 May 2026 03:01:22 -0700 (PDT) Received: from hu-krichai-hyd.qualcomm.com ([202.46.23.25]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-84164ac9b74sm1516641b3a.3.2026.05.22.03.01.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 22 May 2026 03:01:22 -0700 (PDT) From: Krishna Chaitanya Chundru Date: Fri, 22 May 2026 15:30:35 +0530 Subject: [PATCH v2 4/6] net: qrtr: Hold runtime PM during active data path operations Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260522-mhi_runtimepm-v2-4-fbebf41a82bb@oss.qualcomm.com> References: <20260522-mhi_runtimepm-v2-0-fbebf41a82bb@oss.qualcomm.com> In-Reply-To: <20260522-mhi_runtimepm-v2-0-fbebf41a82bb@oss.qualcomm.com> To: Manivannan Sadhasivam , Jeff Hugo , Carl Vanderlip , Oded Gabbay , Jeff Johnson , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Loic Poulain , Sergey Ryazanov , Johannes Berg Cc: mhi@lists.linux.dev, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-wireless@vger.kernel.org, ath11k@lists.infradead.org, ath12k@lists.infradead.org, netdev@vger.kernel.org, mayank.rana@oss.qualcomm.com, quic_vbadigan@quicinc.com, vivek.pernamitta@oss.qualcomm.com, Krishna Chaitanya Chundru X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1779444039; l=5157; i=krishna.chundru@oss.qualcomm.com; s=20230907; h=from:subject:message-id; bh=BhFCU11Vli0eY4peRB1YT42TDHVLDyHFog9G3pGgq0Q=; b=UVBS6HbShn+y5fJQr2GY5SAYIopHLLknf3feWh42YxN8Cfo16vZuvf1XVAOydKz7dA3b3K6eD /OQhLOIVtQKBDTOurt56nsyDbIEnzo5jjzEyQsOPqQr9m2m8ymwcde3 X-Developer-Key: i=krishna.chundru@oss.qualcomm.com; a=ed25519; pk=10CL2pdAKFyzyOHbfSWHCD0X0my7CXxj8gJScmn1FAg= X-Proofpoint-GUID: xgTUtB2TCb2y1UuTkWvZBTuFQJLF2951 X-Authority-Analysis: v=2.4 cv=QblWeMbv c=1 sm=1 tr=0 ts=6a102974 cx=c_pps a=m5Vt/hrsBiPMCU0y4gIsQw==:117 a=ZePRamnt/+rB5gQjfz0u9A==:17 a=IkcTkHD0fZMA:10 a=NGcC8JguVDcA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=3WHJM1ZQz_JShphwDgj5:22 a=EUspDBNiAAAA:8 a=mqvsnErzViNTL7-QoTgA:9 a=QEXdDO2ut3YA:10 a=IoOABgeZipijB_acs4fv:22 X-Proofpoint-ORIG-GUID: xgTUtB2TCb2y1UuTkWvZBTuFQJLF2951 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTIyMDA5OSBTYWx0ZWRfX9loEwg/rDE/7 WS7h/JjNBUgRIgUVO4kB4O99Y67xOwCkOvgQd95PwGe2gBc1z1x0NVode7xcIRt60hQrc/pQFM+ Qk6jSl+pXy4AV9m+5E4H8k/UXSXGFycOzwo/gfrPdL+CVkPuD5mHl218D9d+NeqCMzCLVJLIY5U aFaGueXP3TtRG7gFNkHqQ4At3HCAaYvM43TrqP9CrUvmJy38ULP5/8BIqVtTKtoRz/sBTZ2Abai OlghcD7aLTm+OZ8nY52ESclCDZVYQcnQH2Mbb2PnjswJrIW6RT6KXAenv845Wpg0TnEwLsNAwYZ tssQNvzn9xoA4ZsD5pGriuBvIbvetgx6l0CFGaaHvMUWSsIaUJ/AbUOkTnKtmnZRyksuv6HqGF1 xW6Z3wh3NRNO+D9Tsu2vlVd7DZXh6nl4NIkiM0j9PwiQ1iFlXsyrbyKCRzkGVbbXPkl5DwEyYwf KGsl1LQPZ/lnMHAVMoQ== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-22_02,2026-05-18_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 impostorscore=0 malwarescore=0 lowpriorityscore=0 spamscore=0 suspectscore=0 adultscore=0 clxscore=1015 priorityscore=1501 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605130000 definitions=main-2605220099 The QRTR MHI transport driver does not coordinate with runtime PM, which allows the underlying MHI controller to be runtime-suspended while transmit, receive, or RX buffer refill operations are in progress. This can lead to stalled transfers or failed buffer queueing once runtime PM is enabled in the MHI core. Add runtime PM reference counting around TX, RX, and buffer management operations to keep the controller active for the duration of each critical section. Enable runtime PM during probe and take explicit references around these data path operations. Signed-off-by: Krishna Chaitanya Chundru --- net/qrtr/mhi.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++= --- 1 file changed, 54 insertions(+), 3 deletions(-) diff --git a/net/qrtr/mhi.c b/net/qrtr/mhi.c index 80e341d2f8a4..cba7a5daf7a4 100644 --- a/net/qrtr/mhi.c +++ b/net/qrtr/mhi.c @@ -6,6 +6,7 @@ #include #include #include +#include #include #include =20 @@ -38,11 +39,20 @@ static void qcom_mhi_qrtr_dl_callback(struct mhi_device= *mhi_dev, if (rc =3D=3D -EINVAL) dev_err(qdev->dev, "invalid ipcrouter packet\n"); =20 + rc =3D pm_runtime_get(&qdev->mhi_dev->dev); + if (rc < 0 && rc !=3D -EINPROGRESS) { + dev_err(&mhi_dev->dev, "pm_runtime_get failed %d\n", rc); + pm_runtime_put_noidle(&qdev->mhi_dev->dev); + return; + } + /* Done with the buffer, now recycle it for future use */ rc =3D mhi_queue_buf(mhi_dev, DMA_FROM_DEVICE, mhi_res->buf_addr, mhi_dev->mhi_cntrl->buffer_len, MHI_EOT); if (rc) dev_err(&mhi_dev->dev, "Failed to recycle the buffer: %d\n", rc); + + pm_runtime_put(&mhi_dev->dev); } =20 /* From QRTR to MHI */ @@ -54,6 +64,8 @@ static void qcom_mhi_qrtr_ul_callback(struct mhi_device *= mhi_dev, if (skb->sk) sock_put(skb->sk); consume_skb(skb); + + pm_runtime_put(&mhi_dev->dev); } =20 /* Send data over MHI */ @@ -69,13 +81,21 @@ static int qcom_mhi_qrtr_send(struct qrtr_endpoint *ep,= struct sk_buff *skb) if (rc) goto free_skb; =20 + rc =3D pm_runtime_resume_and_get(&qdev->mhi_dev->dev); + if (rc) { + dev_err(&qdev->mhi_dev->dev, "pm_runtime_resume_and_get failed %d\n", rc= ); + goto free_skb; + } + rc =3D mhi_queue_skb(qdev->mhi_dev, DMA_TO_DEVICE, skb, skb->len, MHI_EOT); if (rc) - goto free_skb; + goto runtime_put; =20 return rc; =20 +runtime_put: + pm_runtime_put(&qdev->mhi_dev->dev); free_skb: if (skb->sk) sock_put(skb->sk); @@ -90,20 +110,30 @@ static int qcom_mhi_qrtr_queue_dl_buffers(struct mhi_d= evice *mhi_dev) void *buf; int ret; =20 + ret =3D pm_runtime_resume_and_get(&mhi_dev->dev); + if (ret) { + dev_err(&mhi_dev->dev, "pm_runtime_resume_and_get failed %d\n", ret); + return ret; + } + free_desc =3D mhi_get_free_desc_count(mhi_dev, DMA_FROM_DEVICE); while (free_desc--) { buf =3D devm_kmalloc(&mhi_dev->dev, mhi_dev->mhi_cntrl->buffer_len, GFP_= KERNEL); - if (!buf) + if (!buf) { + pm_runtime_put(&mhi_dev->dev); return -ENOMEM; + } =20 ret =3D mhi_queue_buf(mhi_dev, DMA_FROM_DEVICE, buf, mhi_dev->mhi_cntrl-= >buffer_len, MHI_EOT); if (ret) { dev_err(&mhi_dev->dev, "Failed to queue buffer: %d\n", ret); + pm_runtime_put(&mhi_dev->dev); return ret; } } =20 + pm_runtime_put(&mhi_dev->dev); return 0; } =20 @@ -121,12 +151,22 @@ static int qcom_mhi_qrtr_probe(struct mhi_device *mhi= _dev, qdev->dev =3D &mhi_dev->dev; qdev->ep.xmit =3D qcom_mhi_qrtr_send; =20 + pm_runtime_no_callbacks(&mhi_dev->dev); + rc =3D devm_pm_runtime_set_active_enabled(&mhi_dev->dev); + if (rc) + return rc; + + rc =3D pm_runtime_resume_and_get(&mhi_dev->dev); + if (rc) { + dev_err(&mhi_dev->dev, "pm_runtime_resume_and_get failed %d\n", rc); + return rc; + } dev_set_drvdata(&mhi_dev->dev, qdev); =20 /* start channels */ rc =3D mhi_prepare_for_transfer(mhi_dev); if (rc) - return rc; + goto runtime_put; =20 rc =3D qrtr_endpoint_register(&qdev->ep, QRTR_EP_NID_AUTO); if (rc) @@ -138,12 +178,15 @@ static int qcom_mhi_qrtr_probe(struct mhi_device *mhi= _dev, =20 dev_dbg(qdev->dev, "Qualcomm MHI QRTR driver probed\n"); =20 + pm_runtime_put(&mhi_dev->dev); return 0; =20 err_unregister: qrtr_endpoint_unregister(&qdev->ep); err_unprepare: mhi_unprepare_from_transfer(mhi_dev); +runtime_put: + pm_runtime_put(&mhi_dev->dev); =20 return rc; } @@ -151,10 +194,18 @@ static int qcom_mhi_qrtr_probe(struct mhi_device *mhi= _dev, static void qcom_mhi_qrtr_remove(struct mhi_device *mhi_dev) { struct qrtr_mhi_dev *qdev =3D dev_get_drvdata(&mhi_dev->dev); + int err; + + err =3D pm_runtime_resume_and_get(&mhi_dev->dev); + if (err) + dev_err(&mhi_dev->dev, "pm_runtime_resume_and_get failed %d\n", err); =20 qrtr_endpoint_unregister(&qdev->ep); mhi_unprepare_from_transfer(mhi_dev); dev_set_drvdata(&mhi_dev->dev, NULL); + + if (!err) + pm_runtime_put(&mhi_dev->dev); } =20 static const struct mhi_device_id qcom_mhi_qrtr_id_table[] =3D { --=20 2.34.1 From nobody Sun May 24 18:43:18 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.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 9544332AAC6 for ; Fri, 22 May 2026 10:01:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779444095; cv=none; b=X0mnPAeqLjhmZ7Flbe9htnqe+U1f7ItAdf/oe+L/o4N8hfAZ/0V5Vxej/B++rgKcUgE7qz/Gvv8FAWq9x1/ftckYnAKUgTxcelWB9dNNvcyUD88BWm5UpoKrvTke6HC34VC+6XM1DXSac/rWJXi5g+CCjhnTXmmabb8JDRMBV+o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779444095; c=relaxed/simple; bh=vGJb93aYUaQ8jo1tSvCSFnkGptC5OIX1Pw2nFhM0VA8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=FT451myakhNEYEwUXlJVdIo9mkOBzxbIv313IhSNse4ZRw2wtSpG3ivhyhbrJokkEylm6W50LWvA28czgAXMo8FmpWtRkXnIGw8w5CZWmU0bg4ALsWwD4IvCuZfhfVby8iegluyIRze872iw3sIvRQnuUw+heS1XZFrqzXrz/i4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=aB4/UNTx; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=Jhtr0b5h; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="aB4/UNTx"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="Jhtr0b5h" Received: from pps.filterd (m0279867.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 64M8agpm399180 for ; Fri, 22 May 2026 10:01:33 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= 4bR4ejhF0h4W2ccu0JEwLdaUkh6Z3ndW9f2Ipfo1SaM=; b=aB4/UNTxbpSN1RC/ 1dG3EFP85XnO7MT7R2W4Qs0lipz9XHR4AqH5O/T458jYczzhH9G7qHfvZjAgUgBI VvxFvf4a6EKgKH3kzJIOIwANo/pZpIXHy1nU3aLqbcb9+0nQX1kzj/o7raFPvblj gcVKLOBnnpwt9+bz2NHLdKvGDNqK/EecVXNA8U8lNbFf6RF9oWMOsYUEbcHiA49x etdmiOPpYg4zrKLhqZGR/7ff41oKhdoS3aUXrE7zX5xpQD8I+ztT/YobcKmGa8CO PnYbS/AukIu7j4O8tvvolAql4or1OHnTNVsqHw5BpQFqMxuBVzAmhDLM/qfd5hI3 Vh2QxQ== Received: from mail-pf1-f200.google.com (mail-pf1-f200.google.com [209.85.210.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4ea5p9us32-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 22 May 2026 10:01:32 +0000 (GMT) Received: by mail-pf1-f200.google.com with SMTP id d2e1a72fcca58-8353fbc7ad5so3632724b3a.3 for ; Fri, 22 May 2026 03:01:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1779444092; x=1780048892; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=4bR4ejhF0h4W2ccu0JEwLdaUkh6Z3ndW9f2Ipfo1SaM=; b=Jhtr0b5hmY6oWkIeP7REkNf3bVgL3939X/slx4sNKyr6rMaeuLSPJK9Tu/TvwOuTOC iexjTnvtnnSwv6reyH8+lPDJL4BPc2/jDunhdu3TYS2UmJRVpPXh1/hXUIid4CpAfhat koxGLxge3/CiKemonCs+ivrIxYzgNx8wpXgRScjiv5Har2TlD6RozC5ZzCsbMS4doJsv LIQTiTrUe/epOyBfHP0JiFV6rcRwK4gumE5UsvAq2tUgCzJ9iam4/TUNOojZ676gHXtL Omrr6CydFWtBN8SQ27Yf2X8Fbux8cNQbRCiBU8arrGLUbNw9XZtlf8CWrr4ikDf/+RyN RQfg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779444092; x=1780048892; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=4bR4ejhF0h4W2ccu0JEwLdaUkh6Z3ndW9f2Ipfo1SaM=; b=VNILLK5Cj/SURLNuTXKuK7xxPxuORp3Gq8hfedfo5av4wkTkH9+Tvs0M2MkC9ATj/R GMHtE78SrzhLsvAc+CLHBJz9N0WHWoTiZ7CmRoHHfnoQJtyeb1zfGXDvLUJFXR4awMN9 MrvlFJyLgX7Ni02/fVOHj1txoqeAGjiHyacdTqPJMdISRpjBCdUdA6Fng6+NsTf985XT NeKEbgkOlhCq9JMepuxxKXBbaKgp2le6t6EJlxXwGcmeAB1f4etg7N3nUqakdkfoUAwJ GoZRfb/FgvMxoKzsnZfsvouTHu/fPGXMdbmA7+HLQkjEEguEbNOrNqaXBr4hem7NMtgr +sLQ== X-Forwarded-Encrypted: i=1; AFNElJ/6uZep1EI350/vKW/PdBrHA6XLojifRVvT+ayx/Atk8nq71sh233v3knNsMAsn4KGyCoJi6gpPZhvyF5s=@vger.kernel.org X-Gm-Message-State: AOJu0YzjCWvV3k6HsO9/w3BlKFuYfW6Yf8eVCDnOYbCIzaNuXyCwCPqG Ky0GOPKlb+YSAs8oDhAiQsd6aZYCVIQULgRGcu2q6OxS+KZ8fkX/xHBRXKC7ADfs4Lc/WeIEwCU m0GpOut5t5MFrhTSLz7cMTowD0G6JvRyHG0PtbJbbgUz7i+gqpmFXE6pL36BJ/VzzurU= X-Gm-Gg: Acq92OGf5Pbbhb3/5tPLCiYuZO2lY4PLxQyRJs4XNvHVXnkvXt0/tXJ9558r0UkyrAn hkDt+OHVr+dCC9wzrhhHF6uO7v+VYX1ak3UFSnWOXt5dMYsC18lh8jgls2yCgcY/l64HEoF7sdU M8ZvSkXqQajOm5yvfXIza3ehkEWC/BOzmGb0MlVzhn/ok+6dUlu3sBQSuDT+yH/E3skiqUaQA1I f0Z+OVCtiUNxinfB09JLJjTMJSRxaSWJ0PTZv3uXc5d80PQLDitcYM1wr/becEOdu21q1vP/seh pV/Ca2+X8BeEGSwhFnecBS8eH21+zDL5yMRoLTrgaESKweoKSDHmvkm69egBT6pN492huTVaSf2 wcAJzVwVsVoEFq0Z0qn+hVBECngY/RpPQiCUmlWF5dDJQ48mVz+6OLcpz X-Received: by 2002:a05:6a00:1988:b0:824:3bd9:aac6 with SMTP id d2e1a72fcca58-8415f158d1bmr2990086b3a.16.1779444091930; Fri, 22 May 2026 03:01:31 -0700 (PDT) X-Received: by 2002:a05:6a00:1988:b0:824:3bd9:aac6 with SMTP id d2e1a72fcca58-8415f158d1bmr2990025b3a.16.1779444091299; Fri, 22 May 2026 03:01:31 -0700 (PDT) Received: from hu-krichai-hyd.qualcomm.com ([202.46.23.25]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-84164ac9b74sm1516641b3a.3.2026.05.22.03.01.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 22 May 2026 03:01:30 -0700 (PDT) From: Krishna Chaitanya Chundru Date: Fri, 22 May 2026 15:30:36 +0530 Subject: [PATCH v2 5/6] net: wwan: Hold runtime PM during active data path operations Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260522-mhi_runtimepm-v2-5-fbebf41a82bb@oss.qualcomm.com> References: <20260522-mhi_runtimepm-v2-0-fbebf41a82bb@oss.qualcomm.com> In-Reply-To: <20260522-mhi_runtimepm-v2-0-fbebf41a82bb@oss.qualcomm.com> To: Manivannan Sadhasivam , Jeff Hugo , Carl Vanderlip , Oded Gabbay , Jeff Johnson , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Loic Poulain , Sergey Ryazanov , Johannes Berg Cc: mhi@lists.linux.dev, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-wireless@vger.kernel.org, ath11k@lists.infradead.org, ath12k@lists.infradead.org, netdev@vger.kernel.org, mayank.rana@oss.qualcomm.com, quic_vbadigan@quicinc.com, vivek.pernamitta@oss.qualcomm.com, Krishna Chaitanya Chundru X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1779444039; l=10149; i=krishna.chundru@oss.qualcomm.com; s=20230907; h=from:subject:message-id; bh=vGJb93aYUaQ8jo1tSvCSFnkGptC5OIX1Pw2nFhM0VA8=; b=5HBYYXQJRnjFECEDyTxAMsVcYHphefIrjpOXjPGckvK/1sqC+W9+kiVtG9bbrgpJFZpJ24t7g QTVXR1LTohwBnb5K2h0l2+2Ptqd/7bRJefIPqDTarqjhDq3aBiTiykq X-Developer-Key: i=krishna.chundru@oss.qualcomm.com; a=ed25519; pk=10CL2pdAKFyzyOHbfSWHCD0X0my7CXxj8gJScmn1FAg= X-Authority-Analysis: v=2.4 cv=DKm/JSNb c=1 sm=1 tr=0 ts=6a10297c cx=c_pps a=mDZGXZTwRPZaeRUbqKGCBw==:117 a=ZePRamnt/+rB5gQjfz0u9A==:17 a=IkcTkHD0fZMA:10 a=NGcC8JguVDcA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=eoimf2acIAo5FJnRuUoq:22 a=EUspDBNiAAAA:8 a=2zpQ2AhS3inu96TDYMYA:9 a=QEXdDO2ut3YA:10 a=zc0IvFSfCIW2DFIPzwfm:22 X-Proofpoint-GUID: 0tAKx1AqOyrqS4OPaiMOleIcNSY7QDME X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTIyMDA5OSBTYWx0ZWRfX5XY/LzJxjgZN E7GZWFtVloSlDS5Cn6E+D8qUb8VpapE3hbb+SFjIk3xaEUYj8p9/7oywm4xK2WtDdSI8DxXLPv6 a+yqttm5PMcI6lurwn8t/6lbIP7Mk1SpeypNB1e+uwBfmDEEl6g8SkgL+fJmRCFJeBC4sjTsfHh 7DAFLJarV/UM51DGgpjSTycswQ4dTLKlaidja8P/jmTCUXB7I7WKXISWRMIN2EIkdB6UU+2NuRZ jSKmM1JJRqi7DSWNi2dcMGy3qTZH1NOUgdlZnykADDXJlRYnynWjiIm9YhT4PBIOD0dBAZlyVXZ aPxDu05uCO73XBgpwXKT5xIjzI2rwfKAXhJP2Z/XgHb5h7j0zuA170Nd2I0uE7GIt0q9O5kd/Z9 /yva9XoNDaSlLrbWeaxRrRolFF0huuHmgeR3FlQ+o35GIHzKTS6pFPSBqsZRuVmMEqeNeO9zTTP c84BWY2nZ+94RxTsaUg== X-Proofpoint-ORIG-GUID: 0tAKx1AqOyrqS4OPaiMOleIcNSY7QDME X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-22_02,2026-05-18_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 malwarescore=0 spamscore=0 phishscore=0 suspectscore=0 priorityscore=1501 clxscore=1015 impostorscore=0 adultscore=0 lowpriorityscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605130000 definitions=main-2605220099 The mhi_wwan_ctrl and mhi_wwan_mbim drivers do not coordinate with runtime PM, which allows the underlying MHI controller to be runtime suspended while transmit, receive, or RX buffer refill operations are in progress. This can lead to stalled transfers or failed queueing once runtime PM is enabled in the MHI core. Enable runtime PM during probe and take explicit references around TX, RX, and buffer management operations so the controller remains active for the duration of each critical path. Signed-off-by: Krishna Chaitanya Chundru --- drivers/net/wwan/mhi_wwan_ctrl.c | 60 ++++++++++++++++++++++++++++++++++++= +++- drivers/net/wwan/mhi_wwan_mbim.c | 44 ++++++++++++++++++++++++++++- 2 files changed, 102 insertions(+), 2 deletions(-) diff --git a/drivers/net/wwan/mhi_wwan_ctrl.c b/drivers/net/wwan/mhi_wwan_c= trl.c index fa73861db6ad..0fe0f24c0df4 100644 --- a/drivers/net/wwan/mhi_wwan_ctrl.c +++ b/drivers/net/wwan/mhi_wwan_ctrl.c @@ -4,6 +4,7 @@ #include #include #include +#include #include =20 /* MHI wwan flags */ @@ -79,6 +80,13 @@ static void mhi_wwan_ctrl_refill_work(struct work_struct= *work) { struct mhi_wwan_dev *mhiwwan =3D container_of(work, struct mhi_wwan_dev, = rx_refill); struct mhi_device *mhi_dev =3D mhiwwan->mhi_dev; + int err; + + err =3D pm_runtime_resume_and_get(&mhi_dev->dev); + if (err) { + dev_err(&mhi_dev->dev, "pm_runtime_resume_and_get failed %d\n", err); + return; + } =20 while (mhi_wwan_rx_budget_dec(mhiwwan)) { struct sk_buff *skb; @@ -102,17 +110,27 @@ static void mhi_wwan_ctrl_refill_work(struct work_str= uct *work) break; } } + pm_runtime_put(&mhi_dev->dev); } =20 static int mhi_wwan_ctrl_start(struct wwan_port *port) { struct mhi_wwan_dev *mhiwwan =3D wwan_port_get_drvdata(port); + struct mhi_device *mhi_dev =3D mhiwwan->mhi_dev; int ret; =20 + ret =3D pm_runtime_resume_and_get(&mhi_dev->dev); + if (ret) { + dev_err(&mhi_dev->dev, "pm_runtime_resume_and_get failed %d\n", ret); + return ret; + } + /* Start mhi device's channel(s) */ ret =3D mhi_prepare_for_transfer(mhiwwan->mhi_dev); - if (ret) + if (ret) { + pm_runtime_put(&mhi_dev->dev); return ret; + } =20 /* Don't allocate more buffers than MHI channel queue size */ mhiwwan->rx_budget =3D mhi_get_free_desc_count(mhiwwan->mhi_dev, DMA_FROM= _DEVICE); @@ -123,12 +141,15 @@ static int mhi_wwan_ctrl_start(struct wwan_port *port) mhi_wwan_ctrl_refill_work(&mhiwwan->rx_refill); } =20 + pm_runtime_put(&mhi_dev->dev); return 0; } =20 static void mhi_wwan_ctrl_stop(struct wwan_port *port) { struct mhi_wwan_dev *mhiwwan =3D wwan_port_get_drvdata(port); + struct mhi_device *mhi_dev =3D mhiwwan->mhi_dev; + int err; =20 spin_lock_bh(&mhiwwan->rx_lock); clear_bit(MHI_WWAN_RX_REFILL, &mhiwwan->flags); @@ -136,12 +157,20 @@ static void mhi_wwan_ctrl_stop(struct wwan_port *port) =20 cancel_work_sync(&mhiwwan->rx_refill); =20 + err =3D pm_runtime_resume_and_get(&mhi_dev->dev); + if (err) + dev_err(&mhi_dev->dev, "pm_runtime_resume_and_get failed %d\n", err); + mhi_unprepare_from_transfer(mhiwwan->mhi_dev); + + if (!err) + pm_runtime_put(&mhi_dev->dev); } =20 static int mhi_wwan_ctrl_tx(struct wwan_port *port, struct sk_buff *skb) { struct mhi_wwan_dev *mhiwwan =3D wwan_port_get_drvdata(port); + struct mhi_device *mhi_dev =3D mhiwwan->mhi_dev; int ret; =20 if (skb->len > mhiwwan->mtu) @@ -150,6 +179,12 @@ static int mhi_wwan_ctrl_tx(struct wwan_port *port, st= ruct sk_buff *skb) if (!test_bit(MHI_WWAN_UL_CAP, &mhiwwan->flags)) return -EOPNOTSUPP; =20 + ret =3D pm_runtime_resume_and_get(&mhi_dev->dev); + if (ret) { + dev_err(&mhi_dev->dev, "pm_runtime_resume_and_get failed %d\n", ret); + return ret; + } + /* Queue the packet for MHI transfer and check fullness of the queue */ spin_lock_bh(&mhiwwan->tx_lock); ret =3D mhi_queue_skb(mhiwwan->mhi_dev, DMA_TO_DEVICE, skb, skb->len, MHI= _EOT); @@ -157,6 +192,9 @@ static int mhi_wwan_ctrl_tx(struct wwan_port *port, str= uct sk_buff *skb) wwan_port_txoff(port); spin_unlock_bh(&mhiwwan->tx_lock); =20 + if (ret) + pm_runtime_put(&mhi_dev->dev); + return ret; } =20 @@ -179,6 +217,8 @@ static void mhi_ul_xfer_cb(struct mhi_device *mhi_dev, /* MHI core has done with the buffer, release it */ consume_skb(skb); =20 + pm_runtime_put(&mhi_dev->dev); + /* There is likely new slot available in the MHI queue, re-allow TX */ spin_lock_bh(&mhiwwan->tx_lock); if (!mhi_queue_is_full(mhiwwan->mhi_dev, DMA_TO_DEVICE)) @@ -217,11 +257,26 @@ static int mhi_wwan_ctrl_probe(struct mhi_device *mhi= _dev, struct mhi_controller *cntrl =3D mhi_dev->mhi_cntrl; struct mhi_wwan_dev *mhiwwan; struct wwan_port *port; + int err; =20 mhiwwan =3D kzalloc_obj(*mhiwwan); if (!mhiwwan) return -ENOMEM; =20 + pm_runtime_no_callbacks(&mhi_dev->dev); + err =3D devm_pm_runtime_set_active_enabled(&mhi_dev->dev); + if (err) { + kfree(mhiwwan); + return err; + } + + err =3D pm_runtime_resume_and_get(&mhi_dev->dev); + if (err) { + dev_err(&mhi_dev->dev, "pm_runtime_resume_and_get failed %d\n", err); + kfree(mhiwwan); + return err; + } + mhiwwan->mhi_dev =3D mhi_dev; mhiwwan->mtu =3D MHI_WWAN_MAX_MTU; INIT_WORK(&mhiwwan->rx_refill, mhi_wwan_ctrl_refill_work); @@ -240,11 +295,14 @@ static int mhi_wwan_ctrl_probe(struct mhi_device *mhi= _dev, &wwan_pops, NULL, mhiwwan); if (IS_ERR(port)) { kfree(mhiwwan); + pm_runtime_put(&mhi_dev->dev); return PTR_ERR(port); } =20 mhiwwan->wwan_port =3D port; =20 + pm_runtime_put(&mhi_dev->dev); + return 0; }; =20 diff --git a/drivers/net/wwan/mhi_wwan_mbim.c b/drivers/net/wwan/mhi_wwan_m= bim.c index 1d7e3ad900c1..56e660ecfcb4 100644 --- a/drivers/net/wwan/mhi_wwan_mbim.c +++ b/drivers/net/wwan/mhi_wwan_mbim.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -153,9 +154,18 @@ static netdev_tx_t mhi_mbim_ndo_xmit(struct sk_buff *s= kb, struct net_device *nde { struct mhi_mbim_link *link =3D wwan_netdev_drvpriv(ndev); struct mhi_mbim_context *mbim =3D link->mbim; + struct mhi_device *mhi_dev =3D mbim->mdev; unsigned long flags; int err =3D -ENOMEM; =20 + err =3D pm_runtime_get(&mhi_dev->dev); + if (err < 0 && err !=3D -EINPROGRESS) { + dev_err(&mhi_dev->dev, "pm_runtime_get Failed %d\n", err); + pm_runtime_put_noidle(&mhi_dev->dev); + dev_kfree_skb_any(skb); + return NETDEV_TX_OK; + } + /* Serialize MHI channel queuing and MBIM seq */ spin_lock_irqsave(&mbim->tx_lock, flags); =20 @@ -184,6 +194,7 @@ static netdev_tx_t mhi_mbim_ndo_xmit(struct sk_buff *sk= b, struct net_device *nde return NETDEV_TX_OK; =20 exit_drop: + pm_runtime_put(&mhi_dev->dev); u64_stats_update_begin(&link->tx_syncp); u64_stats_inc(&link->tx_dropped); u64_stats_update_end(&link->tx_syncp); @@ -396,6 +407,10 @@ static void mhi_net_rx_refill_work(struct work_struct = *work) struct mhi_device *mdev =3D mbim->mdev; int err; =20 + err =3D pm_runtime_get(&mdev->dev); + if (err < 0 && err !=3D -EINPROGRESS) + dev_err(&mdev->dev, "pm_runtime_get Failed %d\n", err); + while (!mhi_queue_is_full(mdev, DMA_FROM_DEVICE)) { struct sk_buff *skb =3D alloc_skb(mbim->mru, GFP_KERNEL); =20 @@ -415,6 +430,8 @@ static void mhi_net_rx_refill_work(struct work_struct *= work) cond_resched(); } =20 + pm_runtime_put(&mdev->dev); + /* If we're still starved of rx buffers, reschedule later */ if (mhi_get_free_desc_count(mdev, DMA_FROM_DEVICE) =3D=3D mbim->rx_queue_= sz) schedule_delayed_work(&mbim->rx_refill, HZ / 2); @@ -501,6 +518,7 @@ static void mhi_mbim_ul_callback(struct mhi_device *mhi= _dev, /* MHI layer stopping/resetting the UL channel */ if (mhi_res->transaction_status =3D=3D -ENOTCONN) { u64_stats_update_end(&link->tx_syncp); + pm_runtime_put(&mhi_dev->dev); return; } =20 @@ -511,6 +529,8 @@ static void mhi_mbim_ul_callback(struct mhi_device *mhi= _dev, } u64_stats_update_end(&link->tx_syncp); =20 + pm_runtime_put(&mhi_dev->dev); + if (netif_queue_stopped(ndev) && !mhi_queue_is_full(mbim->mdev, DMA_TO_DE= VICE)) netif_wake_queue(ndev); } @@ -614,6 +634,17 @@ static int mhi_mbim_probe(struct mhi_device *mhi_dev, = const struct mhi_device_id if (!mbim) return -ENOMEM; =20 + pm_runtime_no_callbacks(&mhi_dev->dev); + err =3D devm_pm_runtime_set_active_enabled(&mhi_dev->dev); + if (err) + return err; + + err =3D pm_runtime_get(&mhi_dev->dev); + if (err < 0 && err !=3D -EINPROGRESS) { + dev_err(&mhi_dev->dev, "pm_runtime_get Failed %d\n", err); + return err; + } + spin_lock_init(&mbim->tx_lock); dev_set_drvdata(&mhi_dev->dev, mbim); mbim->mdev =3D mhi_dev; @@ -623,8 +654,12 @@ static int mhi_mbim_probe(struct mhi_device *mhi_dev, = const struct mhi_device_id =20 /* Start MHI channels */ err =3D mhi_prepare_for_transfer(mhi_dev); - if (err) + if (err) { + pm_runtime_put(&mhi_dev->dev); return err; + } + + pm_runtime_put(&mhi_dev->dev); =20 /* Number of transfer descriptors determines size of the queue */ mbim->rx_queue_sz =3D mhi_get_free_desc_count(mhi_dev, DMA_FROM_DEVICE); @@ -637,12 +672,19 @@ static void mhi_mbim_remove(struct mhi_device *mhi_de= v) { struct mhi_mbim_context *mbim =3D dev_get_drvdata(&mhi_dev->dev); struct mhi_controller *cntrl =3D mhi_dev->mhi_cntrl; + int err; + + err =3D pm_runtime_get(&mhi_dev->dev); + if (err < 0 && err !=3D -EINPROGRESS) + dev_err(&mhi_dev->dev, "pm_runtime_get Failed %d\n", err); =20 mhi_unprepare_from_transfer(mhi_dev); cancel_delayed_work_sync(&mbim->rx_refill); wwan_unregister_ops(&cntrl->mhi_dev->dev); kfree_skb(mbim->skbagg_head); dev_set_drvdata(&mhi_dev->dev, NULL); + + pm_runtime_put(&mhi_dev->dev); } =20 static const struct mhi_device_id mhi_mbim_id_table[] =3D { --=20 2.34.1 From nobody Sun May 24 18:43:18 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.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 67F653C65FA for ; Fri, 22 May 2026 10:01:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779444104; cv=none; b=PoIkOCjb5VOPuXQhZKktqOA2z0+xr4+6Gv6b/It9dVr8es1y/ATFuRIg/MCm3k18kEgp+jIykmtA+xUuHcPIflTwnS6K2lb/4eTNP33g4kS8gEU67y+og6jdxP4pF/UKKubYJ+mN1kMQjd8oT14We79xubFqt+cWQ5HJ6AcKYZA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779444104; c=relaxed/simple; bh=iFHxbTO6wE35Tl3kqwnkO8A1IQ+NptFsGOPDlaw/GEs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=jMyasnN1/gqzvJxPfkkY1c85Z0boXh4x72bThvbp6usBM5CUwESjUtj//rJ9u7EBmyxscR/tExQNkWhVbWj4F4gCLde7+jDVnp68cJ29NUQ/oMw6EY2oQRwleyPpbH1DDVy/flFG3YVcJTATjAaKB/FzRUG1mXkdpNRwcZG/srw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=RlcEFI4D; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=e8/7QdzX; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="RlcEFI4D"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="e8/7QdzX" Received: from pps.filterd (m0279862.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 64M8uuHc3005135 for ; Fri, 22 May 2026 10:01:42 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= 5DXeyrdoWr0DcgBTdRbVLV0jwA0imqVGVhlRKg6Geqg=; b=RlcEFI4DbYPXiWK4 QIlBKbaRJedey4Bt6BSXn+z+qgw4dOjuyVZIn6+f4an/HrlkBJNeKn0426wyIWID DWGe0brdpGtxASKeEc9MAkgbfRunDdZwezz8A0DGQgex6gFV8Z2extNKtZ/1dmYL ZZOtc7ZT1PobKIdaS79++SrbhMjyh+cve2dXWjCyGPU5OGYMvMqND7Lxoke7LbzA cT5AtlMq/0QACA3d8DTQ/PMFAU489910ptdIyDy99iyevn9v2c1GnzjVbNN+aOaR h5D9tH3ylLKZkfS5CetSbU3z4mGceFP11qQRbDBZT81idOZgoyyuY7BTPDWutLQo FHdDAA== Received: from mail-pf1-f200.google.com (mail-pf1-f200.google.com [209.85.210.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4eafrt9f04-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 22 May 2026 10:01:42 +0000 (GMT) Received: by mail-pf1-f200.google.com with SMTP id d2e1a72fcca58-82f6b984b3aso3467632b3a.3 for ; Fri, 22 May 2026 03:01:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1779444102; x=1780048902; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=5DXeyrdoWr0DcgBTdRbVLV0jwA0imqVGVhlRKg6Geqg=; b=e8/7QdzX3yUWZa0Rblaoh4TYBfyn+8K0gB9FGX1tr/L4w/9k6hWX5mE4a0b6gC9vxB +784VI0VkFieuH68D9RoKSn7J/gQYv0dafDc10XWupcAGWLx5pjzjGirD+Tr4C0+QDtJ 0R8TLu95aXEKPHZ+JspJeRCrRbZKr5LRhNN3SdFBsPTDASivaLoMkWvsVoKoUGco6L84 DCxM5ZStvGFzJhqKvKlbUqQMKMyG/E1HosL3aoBR8VWCKnkZlqfyyKBgl1t/sYmpFcXt Udnl/+bN6YpavUtpkilIEmGlz7w2pPz9+mwd+YCtc4jvTyFBNgjG0v4UTIyRwoOG7ftf mFVQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779444102; x=1780048902; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=5DXeyrdoWr0DcgBTdRbVLV0jwA0imqVGVhlRKg6Geqg=; b=lO7I9tZQmoQs18lRuyVjKaos2/KpDRGHXM2nuRHSLhyycDA1br9brs0Y+vwrUCXWzX ZRWdSBpzytXLI46QnSA1SebA+rHh4a/j4DatzjD6mu4cZXOTQX66iFXsyf3ridQ7i7Si LveGiujOpyo4q+K+ISeV/J96tME9KsyHXjlN1+ShE7uEn7qqUO6omaR5D4ZHDbRqQCX7 j1H+HWa8JrlbjywZWOqfBDCG0eqFgw18cbJR1Ro1Cpg2B26dQYgLwIoM0nWBnhGKUb3b voKTHcLJRv65aLcNC7Vie23hEYCPGg8v2EssdaDy0UH7dOe6fX+od2O4dCfZV7T1zuC7 54Sw== X-Forwarded-Encrypted: i=1; AFNElJ8kQGzcHp5m9+J7sr5vdz1kw6giBezA3wcOem1HE68x3UAxWM5rPnw19o+tc4Ldp8Cl/IQfKJLR8UyG1ls=@vger.kernel.org X-Gm-Message-State: AOJu0Yz0W16Ahb9h4Zz/Ho1zSS+MMlLxy3WOhnDMLpdr6iF4v+EQ69Dv oXGHS+RWhnd12tcHixEA+xTflg25wPpfJGoBWYaU9u7umrphwauptJSQbdUNDuTWkx4oz8CshBx kAFjw8ZVTMOF/rxdebIpDjJohQC2vFo6s1apENlxZ5ZmUKT9iDeF5tPqs1vrR1fhktI0= X-Gm-Gg: Acq92OEuYmblVmnjXHifAeiroXfsZEAMqwu0wlddmANLPXAPvdh2WrMUvdIzFVfHbFq aG9elTQDm4WTpXkWP/qbdtEHqj3YSxtAnbwBQ6/v69/Zz4ClGS0H9ra3d9RwmpChfsj4Yyk4sMm ep3lFVDjvOonljDo3Wbc/NtZJWwmL3lay7Nw/Bd3DMz5jpfPGUqUW0+wEVfPtfFb1njxv9OQiq+ aLQPHl4KrAOznRSR55tVUjPc6W+T4peklREE/kjxB6O1eqGZA6g0ej53iQNBuMrton4kPZkj1ih 06kpgenAw2Qyeoob5N8jYVxPy8Hi7yio/TlaMdH0XAt+XyGxgbHGNummA+SJFEdNm3vJxUiTgQa ASg2J9P5u2Hraeo8QXAjjs3uDKIpvPgenebqUq1znSVb8VcG9Fb8S2nlYpFRglLTxvkI= X-Received: by 2002:a05:6a00:bd11:b0:82f:24e:6a48 with SMTP id d2e1a72fcca58-8415f2e0caamr3187460b3a.5.1779444100468; Fri, 22 May 2026 03:01:40 -0700 (PDT) X-Received: by 2002:a05:6a00:bd11:b0:82f:24e:6a48 with SMTP id d2e1a72fcca58-8415f2e0caamr3187406b3a.5.1779444099822; Fri, 22 May 2026 03:01:39 -0700 (PDT) Received: from hu-krichai-hyd.qualcomm.com ([202.46.23.25]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-84164ac9b74sm1516641b3a.3.2026.05.22.03.01.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 22 May 2026 03:01:39 -0700 (PDT) From: Krishna Chaitanya Chundru Date: Fri, 22 May 2026 15:30:37 +0530 Subject: [PATCH v2 6/6] bus: mhi: host: Fix runtime PM ownership between clients and controller Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260522-mhi_runtimepm-v2-6-fbebf41a82bb@oss.qualcomm.com> References: <20260522-mhi_runtimepm-v2-0-fbebf41a82bb@oss.qualcomm.com> In-Reply-To: <20260522-mhi_runtimepm-v2-0-fbebf41a82bb@oss.qualcomm.com> To: Manivannan Sadhasivam , Jeff Hugo , Carl Vanderlip , Oded Gabbay , Jeff Johnson , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Loic Poulain , Sergey Ryazanov , Johannes Berg Cc: mhi@lists.linux.dev, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-wireless@vger.kernel.org, ath11k@lists.infradead.org, ath12k@lists.infradead.org, netdev@vger.kernel.org, mayank.rana@oss.qualcomm.com, quic_vbadigan@quicinc.com, vivek.pernamitta@oss.qualcomm.com, Krishna Chaitanya Chundru X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1779444039; l=7532; i=krishna.chundru@oss.qualcomm.com; s=20230907; h=from:subject:message-id; bh=iFHxbTO6wE35Tl3kqwnkO8A1IQ+NptFsGOPDlaw/GEs=; b=Leraca11cxKZ9kv0wOGI3YHGBWBAYMU7jDrEbEBi0YqgqfKAQk5bm2D7Lfh9uEh0W7ZzT5vKK DtD9ugdBFwRClFNTiqzjFY0NRel2cgOG3a2qFCZJSiB8OgzBE27Wzzh X-Developer-Key: i=krishna.chundru@oss.qualcomm.com; a=ed25519; pk=10CL2pdAKFyzyOHbfSWHCD0X0my7CXxj8gJScmn1FAg= X-Authority-Analysis: v=2.4 cv=JN0LdcKb c=1 sm=1 tr=0 ts=6a102986 cx=c_pps a=mDZGXZTwRPZaeRUbqKGCBw==:117 a=ZePRamnt/+rB5gQjfz0u9A==:17 a=IkcTkHD0fZMA:10 a=NGcC8JguVDcA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=_K5XuSEh1TEqbUxoQ0s3:22 a=EUspDBNiAAAA:8 a=A8rfxp3GyOsx1I41rDQA:9 a=QEXdDO2ut3YA:10 a=zc0IvFSfCIW2DFIPzwfm:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTIyMDA5OSBTYWx0ZWRfX+XgUu6lVdYnw kHqYG4fHFqN/jFDH1u6WrcHSUAyJRIf9ORR68mQaQlYxglVmJ9th0hdFXIaDzIu0blGs+x/C0Zs afDz6C1kgV9fXZogBliCtxia7uRwUXlpgjxyBEGqQKXXsNPUMeJrK58RC8txbe+rTjEff+APAc0 1WzDhafzs2K8uWXmVC+O3ZzCtzXXJ0KoUFJIkCs3IQz0nIxJ7TxS5VOU77rOLwjlH7qhYcg/r2f yUIG7WZoy7EKnWgHWeOaJc+K2E+KK9Vj628zzP+28U/yP3gydQAY61H40MDvG8XHTQsqXXlrIWY tnL1+d0sq32HfLucOXaZoZRH42THbR8ER0YkfOOFZN6qcIZ/+1YLNZXaOLzKfuWGtCp5QniZwMT U62Bewxoq6fflNGwLMCNe5TxCCn+uI3cLbUB4+nPMzfhzaX2WwYQI7D7FbxGj0mb4PNcQAKtWnv Ym6Jnl1HfhYe+oJrp2g== X-Proofpoint-GUID: CCISGB813O675j5sedyQfnfU3DsEg8ou X-Proofpoint-ORIG-GUID: CCISGB813O675j5sedyQfnfU3DsEg8ou X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-22_02,2026-05-18_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 lowpriorityscore=0 suspectscore=0 malwarescore=0 impostorscore=0 phishscore=0 bulkscore=0 clxscore=1015 spamscore=0 priorityscore=1501 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605130000 definitions=main-2605220099 The current MHI runtime PM model allows the core to take power references directly on the controller device without visibility into client driver activity. As a result, a controller driver may runtime-suspend the hardware while one or more MHI client devices are still actively in use. This happens because the MHI core historically managed runtime PM internally, rather than relying on standard parent-child PM dependency tracking. The controller driver therefore has no way to infer whether MHI clients still require the controller to remain active. Fix this by enabling runtime PM on the MHI bus device (mhi_dev) and routing runtime PM references through it. Client drivers now hold runtime PM references on their own mhi_dev, allowing the PM framework to naturally propagate activity to the controller via the device hierarchy. The existing mhi_device_get_sync() and mhi_device_put() helpers are retained, as they serve as the synchronization point between the MHI power state machine and runtime PM, combining runtime PM reference management with MHI wake handling. Signed-off-by: Krishna Chaitanya Chundru --- drivers/bus/mhi/host/init.c | 3 +++ drivers/bus/mhi/host/internal.h | 6 +++--- drivers/bus/mhi/host/main.c | 26 ++------------------------ drivers/bus/mhi/host/pm.c | 18 ++++++++---------- 4 files changed, 16 insertions(+), 37 deletions(-) diff --git a/drivers/bus/mhi/host/init.c b/drivers/bus/mhi/host/init.c index 9f3ee4a14418..002f3abb8103 100644 --- a/drivers/bus/mhi/host/init.c +++ b/drivers/bus/mhi/host/init.c @@ -1034,6 +1034,9 @@ int mhi_register_controller(struct mhi_controller *mh= i_cntrl, =20 mhi_cntrl->mhi_dev =3D mhi_dev; =20 + pm_runtime_no_callbacks(&mhi_cntrl->mhi_dev->dev); + devm_pm_runtime_set_active_enabled(&mhi_cntrl->mhi_dev->dev); + mhi_create_debugfs(mhi_cntrl); =20 return 0; diff --git a/drivers/bus/mhi/host/internal.h b/drivers/bus/mhi/host/interna= l.h index a7493aabc6fa..434ed4705d25 100644 --- a/drivers/bus/mhi/host/internal.h +++ b/drivers/bus/mhi/host/internal.h @@ -354,9 +354,9 @@ static inline bool mhi_is_active(struct mhi_controller = *mhi_cntrl) static inline void mhi_trigger_resume(struct mhi_controller *mhi_cntrl) { pm_wakeup_event(&mhi_cntrl->mhi_dev->dev, 0); - pm_runtime_get(mhi_cntrl->cntrl_dev); - pm_runtime_mark_last_busy(mhi_cntrl->cntrl_dev); - pm_runtime_put(mhi_cntrl->cntrl_dev); + pm_runtime_get(&mhi_cntrl->mhi_dev->dev); + pm_runtime_mark_last_busy(&mhi_cntrl->mhi_dev->dev); + pm_runtime_put(&mhi_cntrl->mhi_dev->dev); } =20 /* Register access methods */ diff --git a/drivers/bus/mhi/host/main.c b/drivers/bus/mhi/host/main.c index 71919c2e9462..f0b09657de29 100644 --- a/drivers/bus/mhi/host/main.c +++ b/drivers/bus/mhi/host/main.c @@ -658,12 +658,8 @@ static int parse_xfer_event(struct mhi_controller *mhi= _cntrl, /* notify client */ mhi_chan->xfer_cb(mhi_chan->mhi_dev, &result); =20 - if (mhi_chan->dir =3D=3D DMA_TO_DEVICE) { + if (mhi_chan->dir =3D=3D DMA_TO_DEVICE) atomic_dec(&mhi_cntrl->pending_pkts); - /* Release the reference got from mhi_queue() */ - pm_runtime_mark_last_busy(mhi_cntrl->cntrl_dev); - pm_runtime_put(mhi_cntrl->cntrl_dev); - } =20 read_lock_bh(&mhi_chan->lock); } @@ -1135,12 +1131,6 @@ static int mhi_queue(struct mhi_device *mhi_dev, str= uct mhi_buf_info *buf_info, =20 read_lock_irqsave(&mhi_cntrl->pm_lock, flags); =20 - /* Packet is queued, take a usage ref to exit M3 if necessary - * for host->device buffer, balanced put is done on buffer completion - * for device->host buffer, balanced put is after ringing the DB - */ - pm_runtime_get(mhi_cntrl->cntrl_dev); - /* Assert dev_wake (to exit/prevent M1/M2)*/ mhi_cntrl->wake_toggle(mhi_cntrl); =20 @@ -1150,11 +1140,6 @@ static int mhi_queue(struct mhi_device *mhi_dev, str= uct mhi_buf_info *buf_info, if (likely(MHI_DB_ACCESS_VALID(mhi_cntrl))) mhi_ring_chan_db(mhi_cntrl, mhi_chan); =20 - if (dir =3D=3D DMA_FROM_DEVICE) { - pm_runtime_mark_last_busy(mhi_cntrl->cntrl_dev); - pm_runtime_put(mhi_cntrl->cntrl_dev); - } - read_unlock_irqrestore(&mhi_cntrl->pm_lock, flags); =20 return ret; @@ -1355,7 +1340,6 @@ static int mhi_update_channel_state(struct mhi_contro= ller *mhi_cntrl, ret =3D mhi_device_get_sync(mhi_cntrl->mhi_dev); if (ret) return ret; - pm_runtime_get(mhi_cntrl->cntrl_dev); =20 reinit_completion(&mhi_chan->completion); ret =3D mhi_send_cmd(mhi_cntrl, mhi_chan, cmd); @@ -1386,8 +1370,6 @@ static int mhi_update_channel_state(struct mhi_contro= ller *mhi_cntrl, =20 trace_mhi_channel_command_end(mhi_cntrl, mhi_chan, to_state, TPS("Updated= ")); exit_channel_update: - pm_runtime_mark_last_busy(mhi_cntrl->cntrl_dev); - pm_runtime_put(mhi_cntrl->cntrl_dev); mhi_device_put(mhi_cntrl->mhi_dev); =20 return ret; @@ -1525,12 +1507,8 @@ static void mhi_reset_data_chan(struct mhi_controlle= r *mhi_cntrl, while (tre_ring->rp !=3D tre_ring->wp) { struct mhi_buf_info *buf_info =3D buf_ring->rp; =20 - if (mhi_chan->dir =3D=3D DMA_TO_DEVICE) { + if (mhi_chan->dir =3D=3D DMA_TO_DEVICE) atomic_dec(&mhi_cntrl->pending_pkts); - /* Release the reference got from mhi_queue() */ - pm_runtime_mark_last_busy(mhi_cntrl->cntrl_dev); - pm_runtime_put(mhi_cntrl->cntrl_dev); - } =20 if (!buf_info->pre_mapped) mhi_cntrl->unmap_single(mhi_cntrl, buf_info); diff --git a/drivers/bus/mhi/host/pm.c b/drivers/bus/mhi/host/pm.c index f799503c8f36..278fc2ffb820 100644 --- a/drivers/bus/mhi/host/pm.c +++ b/drivers/bus/mhi/host/pm.c @@ -429,6 +429,7 @@ static int mhi_pm_mission_mode_transition(struct mhi_co= ntroller *mhi_cntrl) =20 if (MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state)) { ret =3D -EIO; + read_unlock_bh(&mhi_cntrl->pm_lock); goto error_mission_mode; } =20 @@ -459,11 +460,9 @@ static int mhi_pm_mission_mode_transition(struct mhi_c= ontroller *mhi_cntrl) */ mhi_create_devices(mhi_cntrl); =20 - read_lock_bh(&mhi_cntrl->pm_lock); =20 error_mission_mode: - mhi_cntrl->wake_put(mhi_cntrl, false); - read_unlock_bh(&mhi_cntrl->pm_lock); + mhi_device_put(mhi_cntrl->mhi_dev); =20 return ret; } @@ -1038,9 +1037,11 @@ int __mhi_device_get_sync(struct mhi_controller *mhi= _cntrl) read_unlock_bh(&mhi_cntrl->pm_lock); return -EIO; } + read_unlock_bh(&mhi_cntrl->pm_lock); + + pm_runtime_get_sync(&mhi_cntrl->mhi_dev->dev); + read_lock_bh(&mhi_cntrl->pm_lock); mhi_cntrl->wake_get(mhi_cntrl, true); - if (MHI_PM_IN_SUSPEND_STATE(mhi_cntrl->pm_state)) - mhi_trigger_resume(mhi_cntrl); read_unlock_bh(&mhi_cntrl->pm_lock); =20 ret =3D wait_event_timeout(mhi_cntrl->state_event, @@ -1049,9 +1050,7 @@ int __mhi_device_get_sync(struct mhi_controller *mhi_= cntrl) msecs_to_jiffies(mhi_cntrl->timeout_ms)); =20 if (!ret || MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state)) { - read_lock_bh(&mhi_cntrl->pm_lock); - mhi_cntrl->wake_put(mhi_cntrl, false); - read_unlock_bh(&mhi_cntrl->pm_lock); + mhi_device_put(mhi_cntrl->mhi_dev); return -EIO; } =20 @@ -1339,11 +1338,10 @@ void mhi_device_put(struct mhi_device *mhi_dev) =20 mhi_dev->dev_wake--; read_lock_bh(&mhi_cntrl->pm_lock); - if (MHI_PM_IN_SUSPEND_STATE(mhi_cntrl->pm_state)) - mhi_trigger_resume(mhi_cntrl); =20 mhi_cntrl->wake_put(mhi_cntrl, false); read_unlock_bh(&mhi_cntrl->pm_lock); + pm_runtime_put(&mhi_cntrl->mhi_dev->dev); } EXPORT_SYMBOL_GPL(mhi_device_put); =20 --=20 2.34.1