Received: by 2002:ad5:4acb:0:0:0:0:0 with SMTP id n11csp5912453imw; Wed, 20 Jul 2022 15:31:09 -0700 (PDT) X-Google-Smtp-Source: AGRyM1urL8NhXi5qJoQDADuqRMZqHCaMqXw22uSAo8ViM67rTbEg6DqBnvTCYy/SGNMT1usX05TA X-Received: by 2002:a63:f95c:0:b0:412:9d5b:fbfd with SMTP id q28-20020a63f95c000000b004129d5bfbfdmr35157078pgk.103.1658356268966; Wed, 20 Jul 2022 15:31:08 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1658356268; cv=none; d=google.com; s=arc-20160816; b=zCmOPrMrE7trZW0pB3oj8ds3vAnr9dg8tfEuHJLBFBWzvrI4XZd7yV7vfLb2Wu5CRL fPL9k2XaJp8j45m7g99W301zz8BGviibOPMlICdUM9u2T1DrLO2Xy0Io3xrnJl9jQ97g Ag0HcinVaQed85okL6Ageer4V5HAyUJidQ3CKsKiS7soDdZHBV81R8/WLzLeY5zLprR4 4GxWwVaI9+eV9tw3LbdHfUNEAMRRY3RD3H6L+NfOXzQRuT7Y2wbFL2i4fHIwTkvPHO8r iXCk5SAWPYRB4zOMzbCWgfhXETGZX+Kq1U6cjel0COzuJRbNTg3Hlv+BT+By6AqnYILk CHCA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:references:in-reply-to:message-id :date:subject:cc:to:from; bh=JiYeLDTjPl1YCY6DR3DRu1qSRQC2eHaAqNUKJHwRW/U=; b=fFDD7We2yJk4A3NeHGf91V/0nUvwQMOepQlVfz69I9MHl2sXx045Y+jJHI/1oL49fz GDebybiB+4xFIVinq7EYr1itt7Dk04FKN4vtkB8+x5rIZ014zKgKG4MblQQqDUxz8j8H wGObek1B6A2GHSOnrJ2AEpN+iuVBLypBO/poWwgD/CXGFaX1tJNBT6e6AE1Ht8LDzILA F1GBxx/ZckubrekcA8ZIT7B9YDQBO1cTWy4NCeTjss0KuBI3R6AQW6u10C/7ep4uQ4Ta 1O7p61m278fbc6BZu4Gi9NDp+vy7PNeXM6o4G5GPitrmivB6G6d7r31fVJrAeG/K0HHr WKlA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-wireless-owner@vger.kernel.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=mediatek.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id g10-20020a056a000b8a00b00525425b20f0si462487pfj.257.2022.07.20.15.30.59; Wed, 20 Jul 2022 15:31:08 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-wireless-owner@vger.kernel.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=mediatek.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230440AbiGTWZ7 (ORCPT + 65 others); Wed, 20 Jul 2022 18:25:59 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58376 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229449AbiGTWZ6 (ORCPT ); Wed, 20 Jul 2022 18:25:58 -0400 Received: from mailgw02.mediatek.com (unknown [210.61.82.184]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id ABD5D55B6 for ; Wed, 20 Jul 2022 15:25:51 -0700 (PDT) X-UUID: 644307b5d3ab4422a7d1bcd47ab8712e-20220721 X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.1.8,REQID:1bbe364b-8c76-4435-bbdd-1c4a301cad63,OB:30,L OB:10,IP:0,URL:5,TC:0,Content:-5,EDM:0,RT:0,SF:95,FILE:0,RULE:Release_Ham, ACTION:release,TS:95 X-CID-INFO: VERSION:1.1.8,REQID:1bbe364b-8c76-4435-bbdd-1c4a301cad63,OB:30,LOB :10,IP:0,URL:5,TC:0,Content:-5,EDM:0,RT:0,SF:95,FILE:0,RULE:Spam_GS981B3D, ACTION:quarantine,TS:95 X-CID-META: VersionHash:0f94e32,CLOUDID:5b9f06d8-5d6d-4eaf-a635-828a3ee48b7c,C OID:dfdc1513ed4c,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: 644307b5d3ab4422a7d1bcd47ab8712e-20220721 Received: from mtkcas10.mediatek.inc [(172.21.101.39)] by mailgw02.mediatek.com (envelope-from ) (Generic MTA with TLSv1.2 ECDHE-RSA-AES256-SHA384 256/256) with ESMTP id 802798640; Thu, 21 Jul 2022 06:25:42 +0800 Received: from mtkmbs11n1.mediatek.inc (172.21.101.185) by mtkmbs10n2.mediatek.inc (172.21.101.183) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.792.3; Thu, 21 Jul 2022 06:25:42 +0800 Received: from mtkswgap22.mediatek.inc (172.21.77.33) by mtkmbs11n1.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.2.792.3 via Frontend Transport; Thu, 21 Jul 2022 06:25:41 +0800 From: To: , CC: , , , , , , , , , , , , , , , , , , , , , , , Subject: [PATCH v2 3/4] mt76: mt7921u: fix race issue between reset and suspend/resume Date: Thu, 21 Jul 2022 06:25:39 +0800 Message-ID: <983945d762b95c0259cc8d7702e5e25fffcc0ef0.1658355599.git.sean.wang@kernel.org> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <5f835553ee8b76e4a4ed83f9562eaa0b1a24c1e6.1658355599.git.sean.wang@kernel.org> References: <5f835553ee8b76e4a4ed83f9562eaa0b1a24c1e6.1658355599.git.sean.wang@kernel.org> MIME-Version: 1.0 Content-Type: text/plain X-MTK: N X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,RCVD_IN_MSPIKE_H2, SPF_HELO_PASS,SPF_PASS,UNPARSEABLE_RELAY autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org From: Sean Wang It is unexpected that the reset work is running simultaneously with the suspend or resume context and it is possible that reset work is still running even after mt7921 is suspended if we don't fix the race issue. Thus, the suspend procedure should be waiting until the reset is completed at the beginning and ignore the subsequent the reset requests. In case there is an error that happens during either suspend or resume handler, we will schedule a reset task to recover the error before returning the error code to ensure we can immediately fix the error there. Fixes: df3e4143ba8a ("mt76: mt7921u: add suspend/resume support") Co-developed-by: YN Chen Signed-off-by: YN Chen Signed-off-by: Sean Wang --- v2: use flush_work instead of cancel_work_sync --- .../net/wireless/mediatek/mt76/mt7921/usb.c | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/usb.c b/drivers/net/wireless/mediatek/mt76/mt7921/usb.c index dd3b8884e162..613d5cefffc7 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7921/usb.c +++ b/drivers/net/wireless/mediatek/mt76/mt7921/usb.c @@ -300,11 +300,15 @@ static void mt7921u_disconnect(struct usb_interface *usb_intf) static int mt7921u_suspend(struct usb_interface *intf, pm_message_t state) { struct mt7921_dev *dev = usb_get_intfdata(intf); + struct mt76_connac_pm *pm = &dev->pm; int err; + pm->suspended = true; + flush_work(&dev->reset_work); + err = mt76_connac_mcu_set_hif_suspend(&dev->mt76, true); if (err) - return err; + goto failed; mt76u_stop_rx(&dev->mt76); mt76u_stop_tx(&dev->mt76); @@ -312,11 +316,20 @@ static int mt7921u_suspend(struct usb_interface *intf, pm_message_t state) set_bit(MT76_STATE_SUSPEND, &dev->mphy.state); return 0; + +failed: + pm->suspended = false; + + if (err < 0) + mt7921_reset(&dev->mt76); + + return err; } static int mt7921u_resume(struct usb_interface *intf) { struct mt7921_dev *dev = usb_get_intfdata(intf); + struct mt76_connac_pm *pm = &dev->pm; bool reinit = true; int err, i; @@ -338,16 +351,23 @@ static int mt7921u_resume(struct usb_interface *intf) if (reinit || mt7921_dma_need_reinit(dev)) { err = mt7921u_dma_init(dev, true); if (err) - return err; + goto failed; } clear_bit(MT76_STATE_SUSPEND, &dev->mphy.state); err = mt76u_resume_rx(&dev->mt76); if (err < 0) - return err; + goto failed; + + err = mt76_connac_mcu_set_hif_suspend(&dev->mt76, false); +failed: + pm->suspended = false; + + if (err < 0) + mt7921_reset(&dev->mt76); - return mt76_connac_mcu_set_hif_suspend(&dev->mt76, false); + return err; } #endif /* CONFIG_PM */ -- 2.25.1