From patchwork Mon Jun 24 09:56:23 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Greg Kroah-Hartman X-Patchwork-Id: 167559 Delivered-To: patch@linaro.org Received: by 2002:a92:4782:0:0:0:0:0 with SMTP id e2csp4003353ilk; Mon, 24 Jun 2019 02:59:10 -0700 (PDT) X-Google-Smtp-Source: APXvYqzmNf3uQsw4q+w3ggpXBuKbijZ6F2dD4ipyznfMUjlbedEeI0HY5xzdzTixC8gU4di26ttC X-Received: by 2002:a17:90a:1ac5:: with SMTP id p63mr23275448pjp.25.1561370349951; Mon, 24 Jun 2019 02:59:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1561370349; cv=none; d=google.com; s=arc-20160816; b=JADsWZ3fi2TI+nvT670JKhYffljYN95EMCG0KhRdwum6zcFnVADymqvHLmmbBCAg1t 5VhsImCVFLoed9+mNC3m+c5i4DyCEfAeV0n9kK212BcttbVHiTOxM+pF6tSEjQjwZ0ps YHgllPBerOWK9SaiT3m/Izzo4X3LPK8avYNj3aALX92ulP0luY6bfRaSswYKuh597RSC FpzFZcRQc7Q66O3qFadjmtf1vrbitCyOzKUjz417NUJznfaJWcoXj4R5k/CPH11/mgUF rFylwCHZts4SLgNAMm2D6knoVkT9xUBnxNMCfiGPcQTgJBwKSBlzrLVSwPP5k6mkyfO5 sxOA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=QcUDsFIsHvcPsKPTkd7zYe7/omaaX0a7YDq+toQKxxE=; b=g2DJdxkqf1MrYHdypmjjMhKKvUvOGwjZjFTrcavsrY4C1GsD+T/ghR7mha7p5kpMMP mo046zoIzsL1MPQQMkT9hPFUZdk/JbB6Fnh1RVvMQZHWCn2e8c2iUm1F1lPQbBeyJEdP KWt2IoO2PqtUpCorE/SAzRWdZeqJ/R2tYXK9ibCPM3an4j5dNWIgEhSsCnn0REgHLUxJ 1oILeDvpyh/DmWvzoeKR/bp6uzkZ4wQSYPvddP+QNOZrNtzRT4qDdcu0AR/L4sO7OKNb n6gdLdxWOWYlKVwckdjYQLgFOtVbyOrTGg8/Hh+DvdQevSovUbGC2N/x/zstPk3uhslI Llkg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=GjrDDwEd; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id d18si4025141pll.238.2019.06.24.02.59.09; Mon, 24 Jun 2019 02:59:09 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=GjrDDwEd; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729151AbfFXJ7I (ORCPT + 30 others); Mon, 24 Jun 2019 05:59:08 -0400 Received: from mail.kernel.org ([198.145.29.99]:57950 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729120AbfFXJ7C (ORCPT ); Mon, 24 Jun 2019 05:59:02 -0400 Received: from localhost (f4.8f.5177.ip4.static.sl-reverse.com [119.81.143.244]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 7E7AB205ED; Mon, 24 Jun 2019 09:59:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1561370342; bh=JLVeObjHjzNKx1lln9DG18Z8xT0aOW4ZUEfxrfdGs3Q=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=GjrDDwEdYBiiUqJcGF3XMFRjIo3rJn8kIRyNSpp6Y5CSWTruAbdK6EbY8Y11I45d0 jrDItPkNsDK07iSoXrbtzKJn3noim3xxd2ZxrZx4/3mNiB7zIbbIxLzzXEmbofenf+ T3cOuRDe7cvHSiWP+0Dg1MSIlQDAJYMYjjgn64o4= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Douglas Anderson , Ulf Hansson Subject: [PATCH 4.14 05/51] mmc: core: Prevent processing SDIO IRQs when the card is suspended Date: Mon, 24 Jun 2019 17:56:23 +0800 Message-Id: <20190624092306.562108995@linuxfoundation.org> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190624092305.919204959@linuxfoundation.org> References: <20190624092305.919204959@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Ulf Hansson commit 83293386bc95cf5e9f0c0175794455835bd1cb4a upstream. Processing of SDIO IRQs must obviously be prevented while the card is system suspended, otherwise we may end up trying to communicate with an uninitialized SDIO card. Reports throughout the years shows that this is not only a theoretical problem, but a real issue. So, let's finally fix this problem, by keeping track of the state for the card and bail out before processing the SDIO IRQ, in case the card is suspended. Cc: stable@vger.kernel.org Reported-by: Douglas Anderson Tested-by: Douglas Anderson Signed-off-by: Ulf Hansson Signed-off-by: Greg Kroah-Hartman --- drivers/mmc/core/sdio.c | 13 ++++++++++++- drivers/mmc/core/sdio_irq.c | 4 ++++ 2 files changed, 16 insertions(+), 1 deletion(-) --- a/drivers/mmc/core/sdio.c +++ b/drivers/mmc/core/sdio.c @@ -907,6 +907,10 @@ static int mmc_sdio_pre_suspend(struct m */ static int mmc_sdio_suspend(struct mmc_host *host) { + /* Prevent processing of SDIO IRQs in suspended state. */ + mmc_card_set_suspended(host->card); + cancel_delayed_work_sync(&host->sdio_irq_work); + mmc_claim_host(host); if (mmc_card_keep_power(host) && mmc_card_wake_sdio_irq(host)) @@ -962,13 +966,20 @@ static int mmc_sdio_resume(struct mmc_ho err = sdio_enable_4bit_bus(host->card); } - if (!err && host->sdio_irqs) { + if (err) + goto out; + + /* Allow SDIO IRQs to be processed again. */ + mmc_card_clr_suspended(host->card); + + if (host->sdio_irqs) { if (!(host->caps2 & MMC_CAP2_SDIO_IRQ_NOTHREAD)) wake_up_process(host->sdio_irq_thread); else if (host->caps & MMC_CAP_SDIO_IRQ) host->ops->enable_sdio_irq(host, 1); } +out: mmc_release_host(host); host->pm_flags &= ~MMC_PM_KEEP_POWER; --- a/drivers/mmc/core/sdio_irq.c +++ b/drivers/mmc/core/sdio_irq.c @@ -38,6 +38,10 @@ static int process_sdio_pending_irqs(str unsigned char pending; struct sdio_func *func; + /* Don't process SDIO IRQs if the card is suspended. */ + if (mmc_card_suspended(card)) + return 0; + /* * Optimization, if there is only 1 function interrupt registered * and we know an IRQ was signaled then call irq handler directly.