Received: by 2002:a05:6a10:17d3:0:0:0:0 with SMTP id hz19csp1874630pxb; Sun, 18 Apr 2021 09:46:20 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwHMH7ebfT8tsRSmEk/moaUhObaA1INUqA0Ii9e5UnlQC7AB7Ua/7+eNPMIYzTom1hejevl X-Received: by 2002:a17:90b:4b86:: with SMTP id lr6mr11695054pjb.77.1618764380228; Sun, 18 Apr 2021 09:46:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1618764380; cv=none; d=google.com; s=arc-20160816; b=an6Lmr1ZPhozkialr+oalBm1TcDb/GnIN1f2AYd0BN70Ozpe6epZvUQcWy1MCtxydD /MXqsZ1nANoIdD4KDqjPJqQWvbV5VhHS9WVyK7PHXY0j08CV9ZKtYUz6roGveM5eedfg Rfq2C//EnNevs4gMioSS+orTn5kFT+30Tp4KCpsFL6MB/UDTz45/V4UOH2a6FCeqTQoM RS+d0s8X0CL6dgHKh6EBK6ATlysE0bMyx4KfRBfptRrttdBdNqjsUxjjbYhcNu4oVRJy t3A8ingTv6EcMa7848oqiMoph9xxiWflaOFlUL4ZMN54kNQVZ9bFVJV6M4DirbmBaw3l nTGQ== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=Y+W9rssEpKmZsNk1D4qe1I0+UREEVfsz1QPj1VAXOaQ=; b=R9pk8Q7wi2THVPfMjRhF3m2C6K4tFa5k5eX+076/5Q3vCr/aTgJAdLx1FY+v3f/qCe XuEOL1EjZ8TCR/xC5U2GA8Hj35PKxD5pANe8bvKQjXT4lqhWWKC7V0K09/fYYQnmersC XB/D5SZ/jenpqLSNzHN2ZaNlxwEsAcx4rC/wcmmnKOBwJSjykFyP+XlrYG/TXrYi24gJ Nl2dYh44xtaczhYWFXdDGEAy+Ir9dj6F1PeH29MhXopRzDggwTMbhEKMFSyI1oe4ca35 ch6DDGqB1nwZRUNZpZdVkQx6bzOb6g1vEfMxXF83pLfDmns3Cwi+cJgxL4Nc8jkLscmt nmIg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=AgAzdmfW; spf=pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-wireless-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id k7si14533270pgl.450.2021.04.18.09.46.07; Sun, 18 Apr 2021 09:46:20 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-wireless-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=@kernel.org header.s=k20201202 header.b=AgAzdmfW; spf=pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-wireless-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231953AbhDRQq1 (ORCPT + 99 others); Sun, 18 Apr 2021 12:46:27 -0400 Received: from mail.kernel.org ([198.145.29.99]:49706 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231844AbhDRQq0 (ORCPT ); Sun, 18 Apr 2021 12:46:26 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 5E62261359; Sun, 18 Apr 2021 16:45:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1618764358; bh=w2CK4bFzudJhD34L7P7Ztg+tIF929ttsnYfncIacNAA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=AgAzdmfWiaZKc7husPbqz/iux7Oiuc98YNawIPqhBCss7QVkhPGKK1R0uPBuvcbHf fjM+Y4FTg+OuCDt94f74aWW34y3RqfeCwMpwkT5gIkI9DEDyIcYb4UvmMKWpTw7gk4 Ia3C8HlSP6QYHqavkQr88oXH0oH+7kbO4QgSLXu47a4w9VxIgQh+pqNJPjem60fSdw BZQLOwEjqiDI3Z44r9vf5KGg1lrLyNmHY4xJ+b7qWJtOplYcRqZ7CXxNgB6bzv5Pay 2Y5wSL0Ml1JStSUZoE7V+CavU98rOSE0bDnopcknoeKE3MNmNePWXB0xvHr75iWiem cpHcbaWqVT5cA== From: Lorenzo Bianconi To: nbd@nbd.name Cc: linux-wireless@vger.kernel.org, lorenzo.bianconi@redhat.com, sean.wang@mediatek.com Subject: [PATCH 02/19] mt76: mt7663: fix a race between mt7615_mcu_drv_pmctrl and mt7615_mcu_fw_pmctrl Date: Sun, 18 Apr 2021 18:45:28 +0200 Message-Id: <732fb9447efb541029536b7d48f0cdfa1c585c0a.1618763001.git.lorenzo@kernel.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org Introduce a mutex in order to avoid a race between mt7615_mcu_lp_drv_pmctrl and mt7615_mcu_fw_pmctrl routines since they are run two independent works Fixes: 1f549009b5b2 ("mt76: mt7615: do not request {driver,fw}_own if already granted") Signed-off-by: Lorenzo Bianconi --- .../net/wireless/mediatek/mt76/mt7615/init.c | 1 + .../net/wireless/mediatek/mt76/mt7615/mcu.c | 20 +++++++++++++------ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/init.c b/drivers/net/wireless/mediatek/mt76/mt7615/init.c index d84662fb0304..5429536e8d43 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7615/init.c +++ b/drivers/net/wireless/mediatek/mt76/mt7615/init.c @@ -505,6 +505,7 @@ void mt7615_init_device(struct mt7615_dev *dev) INIT_DELAYED_WORK(&dev->pm.ps_work, mt7615_pm_power_save_work); INIT_WORK(&dev->pm.wake_work, mt7615_pm_wake_work); + mutex_init(&dev->pm.mutex); init_completion(&dev->pm.wake_cmpl); spin_lock_init(&dev->pm.txq_lock); set_bit(MT76_STATE_PM, &dev->mphy.state); diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c index 364daef4b0be..7081bb4a28bd 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +++ b/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c @@ -323,9 +323,11 @@ static int mt7615_mcu_drv_pmctrl(struct mt7615_dev *dev) static int mt7615_mcu_lp_drv_pmctrl(struct mt7615_dev *dev) { struct mt76_phy *mphy = &dev->mt76.phy; - int i; + int i, err = 0; + + mutex_lock(&dev->pm.mutex); - if (!test_and_clear_bit(MT76_STATE_PM, &mphy->state)) + if (!test_bit(MT76_STATE_PM, &mphy->state)) goto out; for (i = 0; i < MT7615_DRV_OWN_RETRY_COUNT; i++) { @@ -337,14 +339,16 @@ static int mt7615_mcu_lp_drv_pmctrl(struct mt7615_dev *dev) if (i == MT7615_DRV_OWN_RETRY_COUNT) { dev_err(dev->mt76.dev, "driver own failed\n"); - set_bit(MT76_STATE_PM, &mphy->state); - return -EIO; + err = -EIO; + goto out; } + clear_bit(MT76_STATE_PM, &mphy->state); out: dev->pm.last_activity = jiffies; + mutex_unlock(&dev->pm.mutex); - return 0; + return err; } static int mt7615_mcu_fw_pmctrl(struct mt7615_dev *dev) @@ -353,8 +357,10 @@ static int mt7615_mcu_fw_pmctrl(struct mt7615_dev *dev) int err = 0; u32 addr; + mutex_lock(&dev->pm.mutex); + if (test_and_set_bit(MT76_STATE_PM, &mphy->state)) - return 0; + goto out; mt7622_trigger_hif_int(dev, true); @@ -370,6 +376,8 @@ static int mt7615_mcu_fw_pmctrl(struct mt7615_dev *dev) } mt7622_trigger_hif_int(dev, false); +out: + mutex_unlock(&dev->pm.mutex); return err; } -- 2.30.2