Received: by 2002:a05:6a10:1d13:0:0:0:0 with SMTP id pp19csp341045pxb; Wed, 25 Aug 2021 04:46:53 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxg9d/Swau0lBHOs3LhZ0ltevc0pbg3FKZM2iMzjUtiS7mWUkUKDihxGMHxO49pCK+0NhI+ X-Received: by 2002:a05:6402:1cb9:: with SMTP id cz25mr21747701edb.11.1629892013153; Wed, 25 Aug 2021 04:46:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1629892013; cv=none; d=google.com; s=arc-20160816; b=bLvllDDUNJl4VVR7vXkhN7hfqY7c11a8mNnSIuqvu94SybWGX1gyWjPIDFVaimi8Jb q2m9GP2t035Tp06NJ71NEQ8De3rDP9At3Dqo1PED2Z4ugByLAgBDJc6QD7s/nPJmLbzQ KQSWYdMPIsiU4arO0tB1TNHj7jiQKKYdiI3LMBxAppzl9IH+d+j/IH5dTR3PHLMhfEV4 KLKNeEhQo2r7T4Sd5lES7h9bb4nnxTPSGWmvG9FpzgU/IdR0Biqe9yjQepPtuWUIiP3E tPXkuutvX5lomZcdrMo1xuBrs51cCedE+CEKns/H2EMm8yWakYH0Svs26TmldlxP4GGc NT4A== 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 :message-id:date:subject:cc:to:from:dkim-signature; bh=pnDCS9LO85um9r3L/+JpcPWish798PmLV+vnNCGgXic=; b=tgVrjTpwEw60TONQdMpYVdjYesN5ZMWT3axMVYQHsOZ1GtqxdJNGJGX++8tzjD5GB8 dv7eLqHf1a+/3Lh7NAHX0d8C/j0k5OxlGnKKAOtuxRZbaY0CyEBnMT/wErXvD7IrbS53 t/l4A2mkwajXGAJU1wlyH8+sXEQCH3gCRhru7VMAOBqSejl21GXG2uTw5WT10qMS9KN9 bKPe1WoHt3GsVet1g9GPtrrkjHetvwAxr1SOj1Y/hTuPKP7TkdaC1G8NPWAkubzq0cKl e7DVJYIcirhVESgaFbO29lZxsi7/amcZ5U6DSWVkHNbSHTUg/+0MP2BYwQHUGoiAtgby dw6w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass (test mode) header.i=@axis.com header.s=axis-central1 header.b=mUIa2K0J; 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=axis.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id nd36si12837702ejc.253.2021.08.25.04.46.28; Wed, 25 Aug 2021 04:46:53 -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 (test mode) header.i=@axis.com header.s=axis-central1 header.b=mUIa2K0J; 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=axis.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240109AbhHYLnU (ORCPT + 99 others); Wed, 25 Aug 2021 07:43:20 -0400 Received: from smtp1.axis.com ([195.60.68.17]:58774 "EHLO smtp1.axis.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232199AbhHYLnT (ORCPT ); Wed, 25 Aug 2021 07:43:19 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=axis.com; q=dns/txt; s=axis-central1; t=1629891754; x=1661427754; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=pnDCS9LO85um9r3L/+JpcPWish798PmLV+vnNCGgXic=; b=mUIa2K0Jl0Z4cUsvZl8fHoC45nZ3XSRzRIBb5JcAtHhfkbOXfOMfyOH/ GgAmo7sIfa2BILaTqCvH7xq6yM/YoqSue6lyropsyUbL0xfcPES1oESi2 hf4CiNaid2qgN9MgWK+UCt+JueJ7WQ7rYccUzVSoDFOJUZ1WXbpZm9acQ o7e+PEjKuZIq1QE/6HE2et4ezRhRYI5EqtAapc3e8ZAEMwn2z6IZGty19 +HJHHYXs08kClvpR7JaA+V3MENqTdLMosCbnkILXFHgPvoAOXwVZwsjKX OAYLzbqBNbxs+CVkR+vkiYlCoZ4Ya7OUMjuPUhpDW19IbXLk58ck2N1uf w==; From: Vincent Whitchurch To: Jaehoon Chung , Ulf Hansson CC: , Vincent Whitchurch , , Subject: [PATCH] mmc: dw_mmc: Only inject fault before done/error Date: Wed, 25 Aug 2021 13:42:13 +0200 Message-ID: <20210825114213.7429-1-vincent.whitchurch@axis.com> X-Mailer: git-send-email 2.28.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The fault injection function can set EVENT_DATA_ERROR but skip the setting of ->data_status to an error status if it hits just after a data over interrupt. This confuses the tasklet which can later end up triggering the WARN_ON(host->cmd || ..) in dw_mci_request_end() since dw_mci_data_complete() would return success. Prevent the fault injection function from doing this since this is not a real case, and ensure that the fault injection doesn't race with a real error either. Signed-off-by: Vincent Whitchurch --- drivers/mmc/host/dw_mmc.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c index 6578cc64ae9e..380f9aa56eb2 100644 --- a/drivers/mmc/host/dw_mmc.c +++ b/drivers/mmc/host/dw_mmc.c @@ -1802,10 +1802,15 @@ static enum hrtimer_restart dw_mci_fault_timer(struct hrtimer *t) spin_lock_irqsave(&host->irq_lock, flags); - if (!host->data_status) + /* + * Only inject an error if we haven't already got an error or data over + * interrupt. + */ + if (!host->data_status) { host->data_status = SDMMC_INT_DCRC; - set_bit(EVENT_DATA_ERROR, &host->pending_events); - tasklet_schedule(&host->tasklet); + set_bit(EVENT_DATA_ERROR, &host->pending_events); + tasklet_schedule(&host->tasklet); + } spin_unlock_irqrestore(&host->irq_lock, flags); @@ -2721,12 +2726,16 @@ static irqreturn_t dw_mci_interrupt(int irq, void *dev_id) } if (pending & DW_MCI_DATA_ERROR_FLAGS) { + spin_lock(&host->irq_lock); + /* if there is an error report DATA_ERROR */ mci_writel(host, RINTSTS, DW_MCI_DATA_ERROR_FLAGS); host->data_status = pending; smp_wmb(); /* drain writebuffer */ set_bit(EVENT_DATA_ERROR, &host->pending_events); tasklet_schedule(&host->tasklet); + + spin_unlock(&host->irq_lock); } if (pending & SDMMC_INT_DATA_OVER) { -- 2.28.0