From patchwork Mon Jul 18 20:52:13 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Wang X-Patchwork-Id: 591633 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 1A7D5CCA479 for ; Mon, 18 Jul 2022 20:52:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235141AbiGRUw1 (ORCPT ); Mon, 18 Jul 2022 16:52:27 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52888 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235067AbiGRUwZ (ORCPT ); Mon, 18 Jul 2022 16:52:25 -0400 Received: from mailgw02.mediatek.com (unknown [210.61.82.184]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 70850326DB for ; Mon, 18 Jul 2022 13:52:24 -0700 (PDT) X-UUID: 622ecece87204d259fac9b3424429de0-20220719 X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.1.8, REQID:a382244a-9818-4005-8a2d-01634ffa64b0, OB:0, LO B:0,IP:0,URL:5,TC:0,Content:0,EDM:0,RT:0,SF:0,FILE:0,RULE:Release_Ham,ACTI ON:release,TS:5 X-CID-META: VersionHash:0f94e32, CLOUDID:e94d9e64-0b3f-4b2c-b3a6-ed5c044366a0, C OID:IGNORED,Recheck:0,SF:nil,TC:nil,Content:0,EDM:-3,IP:nil,URL:1,File:nil ,QS:nil,BEC:nil,COL:0 X-UUID: 622ecece87204d259fac9b3424429de0-20220719 Received: from mtkmbs10n2.mediatek.inc [(172.21.101.183)] by mailgw02.mediatek.com (envelope-from ) (Generic MTA with TLSv1.2 ECDHE-RSA-AES256-GCM-SHA384 256/256) with ESMTP id 1145465249; Tue, 19 Jul 2022 04:52:19 +0800 Received: from mtkmbs11n2.mediatek.inc (172.21.101.187) by mtkmbs11n1.mediatek.inc (172.21.101.185) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.792.3; Tue, 19 Jul 2022 04:52:17 +0800 Received: from mtkswgap22.mediatek.inc (172.21.77.33) by mtkmbs11n2.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.2.792.3 via Frontend Transport; Tue, 19 Jul 2022 04:52:17 +0800 From: To: , CC: , , , , , , , , , , , , , , , , , , , , , , , Subject: [PATCH 1/3] mt76: mt7921s: fix the deadlock caused by sdio->stat_work Date: Tue, 19 Jul 2022 04:52:13 +0800 Message-ID: X-Mailer: git-send-email 1.7.9.5 MIME-Version: 1.0 X-MTK: N Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org From: Sean Wang Because wake_work and sdio->stat_work share the same workqueue mt76->wq, if sdio->stat_work cannot acquire the mutex lock such as that was possibly held up by mt7921_mutex_acquire, we should exit immediately and schedule another stat_work to avoid blocking the mt7921_mutex_acquire. Also, if mt7921_mutex_acquire was called by sdio->stat_work self, the wake would be blocked by itself, so we have to changing into an unblocking wake (directly wakeup via mt7921_mcu_drv_pmctrl, not via the wake_work) in the context. Fixes: 48fab5bbef40 ("mt76: mt7921: introduce mt7921s support") Co-developed-by: YN Chen Signed-off-by: YN Chen Signed-off-by: Sean Wang --- .../net/wireless/mediatek/mt76/mt7921/mac.c | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/mac.c b/drivers/net/wireless/mediatek/mt76/mt7921/mac.c index 6bd9fc9228a2..75e719175e92 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7921/mac.c +++ b/drivers/net/wireless/mediatek/mt76/mt7921/mac.c @@ -1080,10 +1080,28 @@ bool mt7921_usb_sdio_tx_status_data(struct mt76_dev *mdev, u8 *update) { struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76); - mt7921_mutex_acquire(dev); + if (!mutex_trylock(&mdev->mutex)) { + /* Because wake_work and stat_work share the same workqueue + * mt76->wq, if sdio->stat_work cannot acquire the mutex lock, + * we should exit immediately and schedule another stat_work + * to avoid blocking the wake_work. + */ + struct work_struct *stat_work; + + stat_work = mt76_is_sdio(mdev) ? &mdev->sdio.stat_work : + &mdev->usb.stat_work; + queue_work(dev->mt76.wq, stat_work); + + goto out; + } + + mt7921_mcu_drv_pmctrl(dev); mt7921_mac_sta_poll(dev); - mt7921_mutex_release(dev); + mt76_connac_power_save_sched(&mdev->phy, &dev->pm); + mutex_unlock(&mdev->mutex); + +out: return false; } EXPORT_SYMBOL_GPL(mt7921_usb_sdio_tx_status_data); From patchwork Mon Jul 18 20:52:14 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Wang X-Patchwork-Id: 591634 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 B0418C43334 for ; Mon, 18 Jul 2022 20:52:26 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235027AbiGRUwZ (ORCPT ); Mon, 18 Jul 2022 16:52:25 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52870 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234420AbiGRUwY (ORCPT ); Mon, 18 Jul 2022 16:52:24 -0400 Received: from mailgw01.mediatek.com (unknown [60.244.123.138]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8329332464 for ; Mon, 18 Jul 2022 13:52:23 -0700 (PDT) X-UUID: b48e52d6634d430280ab902ebb583a6a-20220719 X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.1.8, REQID:eca0b0fc-93b8-47f6-b1e8-10f157814425, OB:0, LO B:10,IP:0,URL:5,TC:0,Content:0,EDM:0,RT:0,SF:95,FILE:0,RULE:Release_Ham,AC TION:release,TS:100 X-CID-INFO: VERSION:1.1.8, REQID:eca0b0fc-93b8-47f6-b1e8-10f157814425, OB:0, LOB: 10,IP:0,URL:5,TC:0,Content:0,EDM:0,RT:0,SF:95,FILE:0,RULE:Spam_GS981B3D,AC TION:quarantine,TS:100 X-CID-META: VersionHash:0f94e32, CLOUDID:5ba0d0d7-5d6d-4eaf-a635-828a3ee48b7c, C OID:d19e1bde2466,Recheck:0,SF:28|17|19|48,TC:nil,Content:0,EDM:-3,IP:nil,U RL:1,File:nil,QS:nil,BEC:nil,COL:0 X-UUID: b48e52d6634d430280ab902ebb583a6a-20220719 Received: from mtkcas11.mediatek.inc [(172.21.101.40)] by mailgw01.mediatek.com (envelope-from ) (Generic MTA with TLSv1.2 ECDHE-RSA-AES256-SHA384 256/256) with ESMTP id 621673868; Tue, 19 Jul 2022 04:52:19 +0800 Received: from mtkmbs11n2.mediatek.inc (172.21.101.187) by mtkmbs11n2.mediatek.inc (172.21.101.187) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.792.3; Tue, 19 Jul 2022 04:52:17 +0800 Received: from mtkswgap22.mediatek.inc (172.21.77.33) by mtkmbs11n2.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.2.792.3 via Frontend Transport; Tue, 19 Jul 2022 04:52:17 +0800 From: To: , CC: , , , , , , , , , , , , , , , , , , , , , , , Subject: [PATCH 2/3] mt76: sdio: poll sta stat when device transmits data Date: Tue, 19 Jul 2022 04:52:14 +0800 Message-ID: <1655553ca765a8c18abd6f9bb7e861e9eb590b24.1658176763.git.sean.wang@kernel.org> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: References: MIME-Version: 1.0 X-MTK: N Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org From: Sean Wang It is not meaningful to poll sta stat when there is no the data traffic. So polling sta stat when device have transmitted data instead to save CPU power. That implies that it is unallowed the stat_work to work while MCU is being initialized in the really early stage. That is a required patch for ("mt76: mt7663s: fix the deadlock caused by sdio->stat_work") because mt7615_mcu_set_drv_ctrl pointer isn't set done until MCU is ready. Fixes: d39b52e31aa6 ("mt76: introduce mt76_sdio module") Signed-off-by: Sean Wang --- drivers/net/wireless/mediatek/mt76/sdio.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/wireless/mediatek/mt76/sdio.c b/drivers/net/wireless/mediatek/mt76/sdio.c index aba2a9865821..3b9bb7cd08ad 100644 --- a/drivers/net/wireless/mediatek/mt76/sdio.c +++ b/drivers/net/wireless/mediatek/mt76/sdio.c @@ -478,7 +478,7 @@ static void mt76s_status_worker(struct mt76_worker *w) if (ndata_frames > 0) resched = true; - if (dev->drv->tx_status_data && + if (dev->drv->tx_status_data && ndata_frames > 0 && !test_and_set_bit(MT76_READING_STATS, &dev->phy.state) && !test_bit(MT76_STATE_SUSPEND, &dev->phy.state)) queue_work(dev->wq, &dev->sdio.stat_work); From patchwork Mon Jul 18 20:52:15 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Wang X-Patchwork-Id: 592125 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 77EE4C433EF for ; Mon, 18 Jul 2022 20:52:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235129AbiGRUw0 (ORCPT ); Mon, 18 Jul 2022 16:52:26 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52880 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234980AbiGRUwZ (ORCPT ); Mon, 18 Jul 2022 16:52:25 -0400 Received: from mailgw01.mediatek.com (unknown [60.244.123.138]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5AA97326D6 for ; Mon, 18 Jul 2022 13:52:24 -0700 (PDT) X-UUID: ae476c31a51a4f5e9c0b6d1a37ca3aa8-20220719 X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.1.8, REQID:a1cdb392-5ec7-4988-beb8-b47e91ed2450, OB:0, LO B:10,IP:0,URL:5,TC:0,Content:0,EDM:0,RT:0,SF:95,FILE:0,RULE:Release_Ham,AC TION:release,TS:100 X-CID-INFO: VERSION:1.1.8, REQID:a1cdb392-5ec7-4988-beb8-b47e91ed2450, OB:0, LOB: 10,IP:0,URL:5,TC:0,Content:0,EDM:0,RT:0,SF:95,FILE:0,RULE:Spam_GS981B3D,AC TION:quarantine,TS:100 X-CID-META: VersionHash:0f94e32, CLOUDID:80164e33-b9e4-42b8-b28a-6364427c76bb, C OID:681906c2c761,Recheck:0,SF:28|17|19|48,TC:nil,Content:0,EDM:-3,IP:nil,U RL:1,File:nil,QS:nil,BEC:nil,COL:0 X-UUID: ae476c31a51a4f5e9c0b6d1a37ca3aa8-20220719 Received: from mtkcas11.mediatek.inc [(172.21.101.40)] by mailgw01.mediatek.com (envelope-from ) (Generic MTA with TLSv1.2 ECDHE-RSA-AES256-SHA384 256/256) with ESMTP id 1759691411; Tue, 19 Jul 2022 04:52:19 +0800 Received: from mtkmbs11n2.mediatek.inc (172.21.101.187) by mtkmbs11n2.mediatek.inc (172.21.101.187) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.792.3; Tue, 19 Jul 2022 04:52:17 +0800 Received: from mtkswgap22.mediatek.inc (172.21.77.33) by mtkmbs11n2.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.2.792.3 via Frontend Transport; Tue, 19 Jul 2022 04:52:17 +0800 From: To: , CC: , , , , , , , , , , , , , , , , , , , , , , , Subject: [PATCH 3/3] mt76: mt7663s: fix the deadlock caused by sdio->stat_work Date: Tue, 19 Jul 2022 04:52:15 +0800 Message-ID: <106a510630a27440b49170e9586f9dfbe831848e.1658176763.git.sean.wang@kernel.org> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: References: MIME-Version: 1.0 X-MTK: N Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org From: Sean Wang Because wake_work and sdio->stat_work share the same workqueue mt76->wq, if sdio->stat_work cannot acquire the mutex lock such as that was possibly held up by mt7615_mutex_acquire, we should exit immediately and schedule another stat_work to avoid blocking the mt7615_mutex_acquire. Also, if mt7615_mutex_acquire was called by sdio->stat_work self, the wake would be blocked by itself, so we have to changing into an unblocking wake (directly wakeup via mt7615_mcu_drv_pmctrl, not via the wake_work) in the context. Fixes: a66cbdd6573d ("mt76: mt7615: introduce mt7663s support") Co-developed-by: YN Chen Signed-off-by: YN Chen Signed-off-by: Sean Wang --- .../wireless/mediatek/mt76/mt7615/usb_sdio.c | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/usb_sdio.c b/drivers/net/wireless/mediatek/mt76/mt7615/usb_sdio.c index 0052d103e276..5991b23e0d13 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7615/usb_sdio.c +++ b/drivers/net/wireless/mediatek/mt76/mt7615/usb_sdio.c @@ -157,10 +157,29 @@ bool mt7663_usb_sdio_tx_status_data(struct mt76_dev *mdev, u8 *update) { struct mt7615_dev *dev = container_of(mdev, struct mt7615_dev, mt76); - mt7615_mutex_acquire(dev); + if (!mutex_trylock(&mdev->mutex)) { + /* Because wake_work and stat_work share the same workqueue + * mt76->wq, if sdio->stat_work cannot acquire the mutex lock, + * we should exit immediately and schedule another stat_work + * to avoid blocking the wake_work. + */ + struct work_struct *stat_work; + + stat_work = mt76_is_sdio(mdev) ? &mdev->sdio.stat_work : + &mdev->usb.stat_work; + queue_work(dev->mt76.wq, stat_work); + + goto out; + } + + mt7615_mcu_set_drv_ctrl(dev); + mt7615_mac_sta_poll(dev); - mt7615_mutex_release(dev); + mt76_connac_power_save_sched(&mdev->phy, &dev->pm); + mutex_unlock(&mdev->mutex); + +out: return false; } EXPORT_SYMBOL_GPL(mt7663_usb_sdio_tx_status_data);