From mboxrd@z Thu Jan 1 00:00:00 1970 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: 7bit 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 @@ -76,11 +77,19 @@ static netdev_tx_t mhi_ndo_xmit(struct sk_buff *skb, struct net_device *ndev) struct mhi_device *mdev = mhi_netdev->mdev; int err; + err = pm_runtime_get(&mdev->dev); + if (err < 0 && err != -EINPROGRESS) { + dev_err(&mdev->dev, "pm_runtime_get failed %d\n", err); + pm_runtime_put_noidle(&mdev->dev); + goto exit_drop; + } + err = 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; } @@ -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 == -ENOTCONN) { u64_stats_update_end(&mhi_netdev->stats.tx_syncp); + pm_runtime_put(&mdev->dev); return; } @@ -261,6 +271,7 @@ static void mhi_net_ul_callback(struct mhi_device *mhi_dev, } u64_stats_update_end(&mhi_netdev->stats.tx_syncp); + 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) size = mhi_netdev->mru ? mhi_netdev->mru : READ_ONCE(ndev->mtu); + err = 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 = 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(); } + 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) == 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, SET_NETDEV_DEV(ndev, &mhi_dev->dev); + pm_runtime_no_callbacks(&mhi_dev->dev); + err = devm_pm_runtime_set_active_enabled(&mhi_dev->dev); + if (err) + return err; + + err = 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 = mhi_net_newlink(mhi_dev, ndev); if (err) { free_netdev(ndev); + pm_runtime_put(&mhi_dev->dev); return err; } + pm_runtime_put(&mhi_dev->dev); return 0; } static void mhi_net_remove(struct mhi_device *mhi_dev) { struct mhi_net_dev *mhi_netdev = dev_get_drvdata(&mhi_dev->dev); + int err; + + err = 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_net_dellink(mhi_dev, mhi_netdev->ndev); + + if (!err) + pm_runtime_put(&mhi_dev->dev); } static const struct mhi_device_info mhi_hwip0 = { -- 2.34.1