From nobody Sun Sep 14 03:54:33 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id C14B5C54E94 for ; Thu, 26 Jan 2023 13:26:35 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235500AbjAZN0e (ORCPT ); Thu, 26 Jan 2023 08:26:34 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34374 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231875AbjAZN0Z (ORCPT ); Thu, 26 Jan 2023 08:26:25 -0500 Received: from mail-wr1-x436.google.com (mail-wr1-x436.google.com [IPv6:2a00:1450:4864:20::436]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E7A161042F for ; Thu, 26 Jan 2023 05:26:22 -0800 (PST) Received: by mail-wr1-x436.google.com with SMTP id m7so1755761wru.8 for ; Thu, 26 Jan 2023 05:26:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=semihalf.com; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=zFzGTdSeUZShJWXng6t6oHRfoqpnOHHMtiWs6jD2Vic=; b=XhOGfFeOSoOxVr49ozuK+4qkVy+qC5ACfg0BOrhkkhy6IPmycsJxMJpjVxJKXdhaZx xATowXGJTqYYR2y6+dayzGUR6pQejgROXgkf3qCQKxs8GzG7rvXVO1mX/qhsIDwOTV17 hc2au1yJtOv/Y/F8lriRkkQgUK1/ol4irRzzKxdvpedtN9QUOtH8H1wj9TblMjIJD6do O/R4hZWjJj4MsqSgxCIxM+tWLFfRq6zu6pVaKjGfyDRGsZ7xHR1BdkhA/xLgGToB0c8H 3J8gJLpOQhz5pWs88cs5CCPN913xG2kZw6AiCvH85Bq5EZpQUeW1dZIvBTEdHV/qENUw qdCg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=zFzGTdSeUZShJWXng6t6oHRfoqpnOHHMtiWs6jD2Vic=; b=VWlB07fkaOJ5wCVz5+K7XH/ChvwZSRhqdsFA8GG9ESBjwzQci8qqqksZyza5fbhPwR XO9HGyLqL3wRLCesAyuTvyKjgCEAQZkz+bpy9ntQplmm/rX46lkvO6JKR8le8r6Vh3BN XwB40E+jfkOh8Ip4J6qMdl7ZiWrd53G/SYZmFaezYuf8LpqVSkrIXuLwa+xrFvr1pxre l00H2xrKem4EUbI1IevMuvhQDbQoip+nnaITLuzs8N/F0UA9FppXuPbnK7552YIS6rU2 uCRjMA8HE6ZlnEC1sygxK3hazx/VrrpeNNLWid7SfbQDLF2NOTB9CQhjc+bD8XpwSnbq 4bAw== X-Gm-Message-State: AFqh2kpc6/JWh8KA0JeGrNnRHaySUX2vUT6WsALIA71571jqjA/XEjKh qk8nQEJ1r9+FjCbFByn6SqVqyw== X-Google-Smtp-Source: AMrXdXvo0Jms8syJaFSQpLL3dxh6mz5xXK7rVBeq324YVtfeYEwpmism+Lx8dgm/Vxpe2T5o2di5iw== X-Received: by 2002:adf:b509:0:b0:2bf:9465:641 with SMTP id a9-20020adfb509000000b002bf94650641mr17292252wrd.65.1674739581382; Thu, 26 Jan 2023 05:26:21 -0800 (PST) Received: from orzel1.c.googlers.com.com (44.232.78.34.bc.googleusercontent.com. [34.78.232.44]) by smtp.gmail.com with ESMTPSA id p2-20020a5d4582000000b002b6bcc0b64dsm1326108wrq.4.2023.01.26.05.26.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Jan 2023 05:26:21 -0800 (PST) From: =?UTF-8?q?Kornel=20Dul=C4=99ba?= To: netdev@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Chandrashekar Devegowda , Intel Corporation , Chiranjeevi Rapolu , Liu Haijun , M Chetan Kumar , Ricardo Martinez , Loic Poulain , Sergey Ryazanov , Johannes Berg , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , rad@semihalf.com, mw@semihalf.com, upstream@semihalf.com, =?UTF-8?q?Kornel=20Dul=C4=99ba?= Subject: [PATCH 1/2] net: wwan: t7xx: Fix Runtime PM resume sequence Date: Thu, 26 Jan 2023 13:25:34 +0000 Message-Id: <20230126132535.80339-2-mindal@semihalf.com> X-Mailer: git-send-email 2.39.1.456.gfc5497dd1b-goog In-Reply-To: <20230126132535.80339-1-mindal@semihalf.com> References: <20230126132535.80339-1-mindal@semihalf.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Resume device before calling napi_schedule, instead of doing in the napi poll routine. Polling is done in softrq context. We can't call the PM resume logic from there as it's blocking and not irq safe. In order to make it work modify the interrupt handler to be run from irq handler thread. Fixes: 5545b7b9f294 ("net: wwan: t7xx: Add NAPI support") Signed-off-by: Kornel Dul=C4=99ba --- drivers/net/wwan/t7xx/t7xx_hif_dpmaif.c | 11 +++++++- drivers/net/wwan/t7xx/t7xx_hif_dpmaif_rx.c | 29 +++++++++++++++------- drivers/net/wwan/t7xx/t7xx_netdev.c | 16 +++++++++++- 3 files changed, 45 insertions(+), 11 deletions(-) diff --git a/drivers/net/wwan/t7xx/t7xx_hif_dpmaif.c b/drivers/net/wwan/t7x= x/t7xx_hif_dpmaif.c index 7eff3531b9a5..7ff33c1d6ac7 100644 --- a/drivers/net/wwan/t7xx/t7xx_hif_dpmaif.c +++ b/drivers/net/wwan/t7xx/t7xx_hif_dpmaif.c @@ -152,6 +152,15 @@ static irqreturn_t t7xx_dpmaif_isr_handler(int irq, vo= id *data) } =20 t7xx_pcie_mac_clear_int(dpmaif_ctrl->t7xx_dev, isr_para->pcie_int); + + return IRQ_WAKE_THREAD; +} + +static irqreturn_t t7xx_dpmaif_isr_thread(int irq, void *data) +{ + struct dpmaif_isr_para *isr_para =3D data; + struct dpmaif_ctrl *dpmaif_ctrl =3D isr_para->dpmaif_ctrl; + t7xx_dpmaif_irq_cb(isr_para); t7xx_pcie_mac_set_int(dpmaif_ctrl->t7xx_dev, isr_para->pcie_int); return IRQ_HANDLED; @@ -188,7 +197,7 @@ static void t7xx_dpmaif_register_pcie_irq(struct dpmaif= _ctrl *dpmaif_ctrl) t7xx_pcie_mac_clear_int(t7xx_dev, int_type); =20 t7xx_dev->intr_handler[int_type] =3D t7xx_dpmaif_isr_handler; - t7xx_dev->intr_thread[int_type] =3D NULL; + t7xx_dev->intr_thread[int_type] =3D t7xx_dpmaif_isr_thread; t7xx_dev->callback_param[int_type] =3D isr_para; =20 t7xx_pcie_mac_clear_int_status(t7xx_dev, int_type); diff --git a/drivers/net/wwan/t7xx/t7xx_hif_dpmaif_rx.c b/drivers/net/wwan/= t7xx/t7xx_hif_dpmaif_rx.c index aa2174a10437..f4ff2198b5ef 100644 --- a/drivers/net/wwan/t7xx/t7xx_hif_dpmaif_rx.c +++ b/drivers/net/wwan/t7xx/t7xx_hif_dpmaif_rx.c @@ -840,14 +840,13 @@ int t7xx_dpmaif_napi_rx_poll(struct napi_struct *napi= , const int budget) =20 if (!rxq->que_started) { atomic_set(&rxq->rx_processing, 0); + pm_runtime_put_autosuspend(rxq->dpmaif_ctrl->dev); dev_err(rxq->dpmaif_ctrl->dev, "Work RXQ: %d has not been started\n", rx= q->index); return work_done; } =20 - if (!rxq->sleep_lock_pending) { - pm_runtime_get_noresume(rxq->dpmaif_ctrl->dev); + if (!rxq->sleep_lock_pending) t7xx_pci_disable_sleep(t7xx_dev); - } =20 ret =3D try_wait_for_completion(&t7xx_dev->sleep_lock_acquire); if (!ret) { @@ -876,22 +875,22 @@ int t7xx_dpmaif_napi_rx_poll(struct napi_struct *napi= , const int budget) napi_complete_done(napi, work_done); t7xx_dpmaif_clr_ip_busy_sts(&rxq->dpmaif_ctrl->hw_info); t7xx_dpmaif_dlq_unmask_rx_done(&rxq->dpmaif_ctrl->hw_info, rxq->index); + t7xx_pci_enable_sleep(rxq->dpmaif_ctrl->t7xx_dev); + pm_runtime_mark_last_busy(rxq->dpmaif_ctrl->dev); + pm_runtime_put_autosuspend(rxq->dpmaif_ctrl->dev); + atomic_set(&rxq->rx_processing, 0); } else { t7xx_dpmaif_clr_ip_busy_sts(&rxq->dpmaif_ctrl->hw_info); } =20 - t7xx_pci_enable_sleep(rxq->dpmaif_ctrl->t7xx_dev); - pm_runtime_mark_last_busy(rxq->dpmaif_ctrl->dev); - pm_runtime_put_noidle(rxq->dpmaif_ctrl->dev); - atomic_set(&rxq->rx_processing, 0); - return work_done; } =20 void t7xx_dpmaif_irq_rx_done(struct dpmaif_ctrl *dpmaif_ctrl, const unsign= ed int que_mask) { struct dpmaif_rx_queue *rxq; - int qno; + struct dpmaif_ctrl *ctrl; + int qno, ret; =20 qno =3D ffs(que_mask) - 1; if (qno < 0 || qno > DPMAIF_RXQ_NUM - 1) { @@ -900,6 +899,18 @@ void t7xx_dpmaif_irq_rx_done(struct dpmaif_ctrl *dpmai= f_ctrl, const unsigned int } =20 rxq =3D &dpmaif_ctrl->rxq[qno]; + ctrl =3D rxq->dpmaif_ctrl; + /* We need to make sure that the modem has been resumed before + * calling napi. This can't be done inside the polling function + * as we could be blocked waiting for device to be resumed, + * which can't be done from softirq context the poll function + * is running in. + */ + ret =3D pm_runtime_resume_and_get(ctrl->dev); + if (ret < 0 && ret !=3D -EACCES) { + dev_err(ctrl->dev, "Failed to resume device: %d\n", ret); + return; + } napi_schedule(&rxq->napi); } =20 diff --git a/drivers/net/wwan/t7xx/t7xx_netdev.c b/drivers/net/wwan/t7xx/t7= xx_netdev.c index 494a28e386a3..3ef4a8a4f8fd 100644 --- a/drivers/net/wwan/t7xx/t7xx_netdev.c +++ b/drivers/net/wwan/t7xx/t7xx_netdev.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -45,12 +46,25 @@ =20 static void t7xx_ccmni_enable_napi(struct t7xx_ccmni_ctrl *ctlb) { - int i; + struct dpmaif_ctrl *ctrl; + int i, ret; + + ctrl =3D ctlb->hif_ctrl; =20 if (ctlb->is_napi_en) return; =20 for (i =3D 0; i < RXQ_NUM; i++) { + /* The usage count has to be bumped every time before calling + * napi_schedule. It will be decresed in the poll routine, + * right after napi_complete_done is called. + */ + ret =3D pm_runtime_resume_and_get(ctrl->dev); + if (ret < 0) { + dev_err(ctrl->dev, "Failed to resume device: %d\n", + ret); + return; + } napi_enable(ctlb->napi[i]); napi_schedule(ctlb->napi[i]); } --=20 2.39.1.456.gfc5497dd1b-goog From nobody Sun Sep 14 03:54:33 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 15177C54E94 for ; Thu, 26 Jan 2023 13:26:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236766AbjAZN0g (ORCPT ); Thu, 26 Jan 2023 08:26:36 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34410 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236740AbjAZN01 (ORCPT ); Thu, 26 Jan 2023 08:26:27 -0500 Received: from mail-wr1-x42b.google.com (mail-wr1-x42b.google.com [IPv6:2a00:1450:4864:20::42b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8F1DB3A9C for ; Thu, 26 Jan 2023 05:26:24 -0800 (PST) Received: by mail-wr1-x42b.google.com with SMTP id q5so1808108wrv.0 for ; Thu, 26 Jan 2023 05:26:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=semihalf.com; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=fn4tvNjsH5gVRykTKfXGnLpudCIBWpRMrX6rY6I14Hk=; b=puxiwPzgodNGKieKAN0SMyNYUGS1OeGngmB0PP6Y2OjVqqkmj3KGt+YBHaHBvh0C8r yrKTFXU2rnHIYxFJT1K6PMRreBQ0PDHFH9oM1IJ3+LMTxvuboNUIRhxW3Ienfcub65PA 808tg3IUA2TBcSFkwx4yDAej2IzfV66lAdkklEmx2ERDl23RYHLRTrAVnY/KsxnDk+XW zkUGLcjYYvHajrkzC8XfXVDJJmP9fao4gAqWzTv8j7I6WX5tggc6zs57JjChwI7OwLfI OJ3S1QbfOVDZn+o7qaY0Y/Ju/J5qAvORFZtGYatyiu7Vy2b8LPc2aOePcAa2msdjNIXY UK0A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=fn4tvNjsH5gVRykTKfXGnLpudCIBWpRMrX6rY6I14Hk=; b=JbUMIMBle8e76I3hd/fR0iGto8fPlGAUhznMACLR4290m7Jh6aEK4Es6n8f1BNKhJi pdmDiqv6ooSECu8v0LUUCUduhwLt6ufqffWYf73coIfTeUtB7cvy6IMpY63cJwI51qzM 82IjiWT2nF8bMkInkoNenWSTWpXQxFj5OdHqRnlLlWsmFlh0HDycb+T9BDjjtnGjsnHc jz4y5da0uRdRWv46dlliecyy42UWsF2sE8IiM5k5bAHRV/q/MTYi+mbpZpIrZLfnfRhA +fLPUP3cnF5pe2e12mMn+q6GnXHbPAySj0NKUCZJL6snXAye85bahwE4LpwHzZ3L4FmF hnTQ== X-Gm-Message-State: AFqh2krKq0/XF0cm/h62YlNfsFwrE1Kau04DpaHEs1D8RTSSGyXp2ZVi bWgPb1Rojm97O/LlYIKUH3TfyQ== X-Google-Smtp-Source: AMrXdXsi7X+m/gSTnbURH3bafi2Xz82h2tt8zAyrAztWpjVfrR+v2h5SzTteZhpPoSUNUaN9nsSFEw== X-Received: by 2002:a05:6000:98d:b0:25f:8ead:96cc with SMTP id by13-20020a056000098d00b0025f8ead96ccmr35145658wrb.70.1674739583099; Thu, 26 Jan 2023 05:26:23 -0800 (PST) Received: from orzel1.c.googlers.com.com (44.232.78.34.bc.googleusercontent.com. [34.78.232.44]) by smtp.gmail.com with ESMTPSA id p2-20020a5d4582000000b002b6bcc0b64dsm1326108wrq.4.2023.01.26.05.26.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Jan 2023 05:26:22 -0800 (PST) From: =?UTF-8?q?Kornel=20Dul=C4=99ba?= To: netdev@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Chandrashekar Devegowda , Intel Corporation , Chiranjeevi Rapolu , Liu Haijun , M Chetan Kumar , Ricardo Martinez , Loic Poulain , Sergey Ryazanov , Johannes Berg , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , rad@semihalf.com, mw@semihalf.com, upstream@semihalf.com, =?UTF-8?q?Kornel=20Dul=C4=99ba?= Subject: [PATCH 2/2] net: wwan: t7xx: Fix Runtime PM initialization Date: Thu, 26 Jan 2023 13:25:35 +0000 Message-Id: <20230126132535.80339-3-mindal@semihalf.com> X-Mailer: git-send-email 2.39.1.456.gfc5497dd1b-goog In-Reply-To: <20230126132535.80339-1-mindal@semihalf.com> References: <20230126132535.80339-1-mindal@semihalf.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org For PCI devices the Runtime PM refcount is incremented twice: 1. During device enumeration with a call to pm_runtime_forbid. 2. Just before a driver probe logic is called. Because of that in order to enable Runtime PM on a given device we have to call both pm_runtime_allow and pm_runtime_put_noidle, once it's ready to be runtime suspended. The former was missing causing the pm refcount to never reach 0. Fixes: d10b3a695ba0 ("net: wwan: t7xx: Runtime PM") Signed-off-by: Kornel Dul=C4=99ba --- drivers/net/wwan/t7xx/t7xx_pci.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/net/wwan/t7xx/t7xx_pci.c b/drivers/net/wwan/t7xx/t7xx_= pci.c index 871f2a27a398..226fc1703e90 100644 --- a/drivers/net/wwan/t7xx/t7xx_pci.c +++ b/drivers/net/wwan/t7xx/t7xx_pci.c @@ -121,6 +121,8 @@ void t7xx_pci_pm_init_late(struct t7xx_pci_dev *t7xx_de= v) iowrite32(T7XX_L1_BIT(0), IREG_BASE(t7xx_dev) + ENABLE_ASPM_LOWPWR); atomic_set(&t7xx_dev->md_pm_state, MTK_PM_RESUMED); =20 + pm_runtime_mark_last_busy(&t7xx_dev->pdev->dev); + pm_runtime_allow(&t7xx_dev->pdev->dev); pm_runtime_put_noidle(&t7xx_dev->pdev->dev); } =20 --=20 2.39.1.456.gfc5497dd1b-goog