Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp4750908pxj; Wed, 12 May 2021 12:23:06 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyXyUbtFdwWWuKgv6YKOdZoTJDlNBbka0P9r5QbCfZPYx/iDZmB2mM0jjlm+D+C8hULWDZi X-Received: by 2002:a17:906:8a51:: with SMTP id gx17mr39058833ejc.549.1620847386224; Wed, 12 May 2021 12:23:06 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1620847386; cv=none; d=google.com; s=arc-20160816; b=y69jWo7fmO0obEZMy57O4dbngvEO1WRdnaBRpum3SDlTgQWg5anCUKU0uxKcJZSmMx g4N/rvqwqse6JauFe4FP8pScBKzs7Vpxprw8R52nEsUoriORIfh5Nx+BdXd4yKD0WOVZ VJwGPvjRwR5NJzgIZwq66HhN/Fxa1kRcNijuX2FlFiClbm6hA4l+xmZxDsYEVJPZBF5Q 5uZfR8Q56FSHOR7fHHuExeV5trtoNy9prPfOMlJuSuZ0M1GmfhHIqpoDHrtWc+p9Kx3p BELh1to3exD4VUDWGJz/eoW/oQXcevzFrkquhNousXy1FSO34hmHg0k58E78btp4kVl4 r2gg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=Z32399aFGp7KNNJX6KsJ0l0CIaI5vhK8/jLCyF/NzZY=; b=O7jEJbnY2uuuisSnBQ9EIlCyvwqgfvVOZMkx4bmUyTPbA40ncXIJPlh52njKKRQ2fT ocYRQXPgpKNaciNHG6BGuJ97vIHWe5nKQdhbxRvg8vahIasgqYSw9hcQ6wEDE4AfbXpM jkd0AteXG4HYY9KtNuxr2iuAHOrtkz4iWzeDEt22SzjMEAPmsN/PUh4vkP7Jru8UVoX9 JBXipCerrARznOtcaxL5Qau/5wGaDMduyZBUh9C/Y9aEgSvHI2pVyOHpMmEstPBJgC3l 85EvFjVhk1umKCaNz1+qqSCB5aG+ij0CQGCCyAjtPUJzmW2JCZQ4JMvhVMQbW1T9+D/Q TswQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=gneHKz9C; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id w12si731438ejq.76.2021.05.12.12.22.42; Wed, 12 May 2021 12:23:06 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=gneHKz9C; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1378399AbhELTQI (ORCPT + 99 others); Wed, 12 May 2021 15:16:08 -0400 Received: from mail.kernel.org ([198.145.29.99]:42466 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S244429AbhELQqI (ORCPT ); Wed, 12 May 2021 12:46:08 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 3BA7B61E76; Wed, 12 May 2021 16:14:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1620836098; bh=duAe1FrZC4y4/RYe4QCNSLaIoM7Stfdqv5l+hkpzsVs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=gneHKz9CExiqlzDT0M1UTEfj2NVInm/SsrvzLVcOTSCCZsHXP6Yynj6WqsM+xqtSC viARXqcomY9NCtaT4SUu5rhSMpiJRpLMBqpVZwviZI9zOz1Upkmu4ZZuz9Y2zve8ra 9INFGdHEcYwGAn0RUt+p/A0UsPEYwoncpxdQKKPI= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Po-Hao Huang , Ping-Ke Shih , Kalle Valo , Sasha Levin Subject: [PATCH 5.12 610/677] rtw88: refine napi deinit flow Date: Wed, 12 May 2021 16:50:56 +0200 Message-Id: <20210512144857.633429335@linuxfoundation.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210512144837.204217980@linuxfoundation.org> References: <20210512144837.204217980@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Po-Hao Huang [ Upstream commit 7bd3760c71f7a18485d2c10ea0887e1d41519f4e ] We used to stop napi before disabling irqs. And it turns out to cause some problem when we try to stop device while interrupt arrives. To safely stop pci, we do three steps: 1. disable interrupt 2. synchronize_irq 3. stop_napi Since step 2 and 3 may not finish as expected when interrupt is enabled, use rtwpci->running to decide whether interrupt should be re-enabled at the time. Fixes: 9e2fd29864c5 ("rtw88: add napi support") Signed-off-by: Po-Hao Huang Signed-off-by: Ping-Ke Shih Signed-off-by: Kalle Valo Link: https://lore.kernel.org/r/20210415084703.27255-4-pkshih@realtek.com Signed-off-by: Sasha Levin --- drivers/net/wireless/realtek/rtw88/pci.c | 19 ++++++++++++++----- drivers/net/wireless/realtek/rtw88/pci.h | 1 + 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/realtek/rtw88/pci.c index 786a48649946..6b5c885798a4 100644 --- a/drivers/net/wireless/realtek/rtw88/pci.c +++ b/drivers/net/wireless/realtek/rtw88/pci.c @@ -581,23 +581,30 @@ static int rtw_pci_start(struct rtw_dev *rtwdev) { struct rtw_pci *rtwpci = (struct rtw_pci *)rtwdev->priv; + rtw_pci_napi_start(rtwdev); + spin_lock_bh(&rtwpci->irq_lock); + rtwpci->running = true; rtw_pci_enable_interrupt(rtwdev, rtwpci, false); spin_unlock_bh(&rtwpci->irq_lock); - rtw_pci_napi_start(rtwdev); - return 0; } static void rtw_pci_stop(struct rtw_dev *rtwdev) { struct rtw_pci *rtwpci = (struct rtw_pci *)rtwdev->priv; + struct pci_dev *pdev = rtwpci->pdev; + spin_lock_bh(&rtwpci->irq_lock); + rtwpci->running = false; + rtw_pci_disable_interrupt(rtwdev, rtwpci); + spin_unlock_bh(&rtwpci->irq_lock); + + synchronize_irq(pdev->irq); rtw_pci_napi_stop(rtwdev); spin_lock_bh(&rtwpci->irq_lock); - rtw_pci_disable_interrupt(rtwdev, rtwpci); rtw_pci_dma_release(rtwdev, rtwpci); spin_unlock_bh(&rtwpci->irq_lock); } @@ -1138,7 +1145,8 @@ static irqreturn_t rtw_pci_interrupt_threadfn(int irq, void *dev) rtw_fw_c2h_cmd_isr(rtwdev); /* all of the jobs for this interrupt have been done */ - rtw_pci_enable_interrupt(rtwdev, rtwpci, rx); + if (rtwpci->running) + rtw_pci_enable_interrupt(rtwdev, rtwpci, rx); spin_unlock_bh(&rtwpci->irq_lock); return IRQ_HANDLED; @@ -1558,7 +1566,8 @@ static int rtw_pci_napi_poll(struct napi_struct *napi, int budget) if (work_done < budget) { napi_complete_done(napi, work_done); spin_lock_bh(&rtwpci->irq_lock); - rtw_pci_enable_interrupt(rtwdev, rtwpci, false); + if (rtwpci->running) + rtw_pci_enable_interrupt(rtwdev, rtwpci, false); spin_unlock_bh(&rtwpci->irq_lock); /* When ISR happens during polling and before napi_complete * while no further data is received. Data on the dma_ring will diff --git a/drivers/net/wireless/realtek/rtw88/pci.h b/drivers/net/wireless/realtek/rtw88/pci.h index e76fc549a788..0ffae887527a 100644 --- a/drivers/net/wireless/realtek/rtw88/pci.h +++ b/drivers/net/wireless/realtek/rtw88/pci.h @@ -211,6 +211,7 @@ struct rtw_pci { spinlock_t irq_lock; u32 irq_mask[4]; bool irq_enabled; + bool running; /* napi structure */ struct net_device netdev; -- 2.30.2