From patchwork Mon Feb 5 12:50:24 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kishon Vijay Abraham I X-Patchwork-Id: 126859 Delivered-To: patch@linaro.org Received: by 10.46.124.24 with SMTP id x24csp1944802ljc; Mon, 5 Feb 2018 04:55:23 -0800 (PST) X-Google-Smtp-Source: AH8x225gjcwyQFOpHNn08/4xlcYaGx4DoI7BL/cwetHzxxp4HZAGq0y2lInwQGYHUmN9c5wyaYrR X-Received: by 10.98.147.154 with SMTP id r26mr48476871pfk.207.1517835323530; Mon, 05 Feb 2018 04:55:23 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1517835323; cv=none; d=google.com; s=arc-20160816; b=rvRBfRhwVBAwIgHppnbeyX3r2IfRTBfS0dKv1XN2xuIIqt6cmsdDA0trm3VDfzQu7i Dm1K/7Lk3bYWZX1i1MnmUzM971e0459L7JZeT69FB5OwVTHBvYAWhD19kqXQWU8CIVmH Mwp3b1N3P+iPoGr5LReTXqAXTSWV8zN0s13euCRURTsJPmLKWZ7f/t6bartYRevZ+ghv 9VyR2jV4w6E7StccOkgNdJLeKrbV56AMVhVIjG/XvSAIpqQvrO7JTDP5cYuP8YRsc4C9 qhYGYfvEUHSQKBhw3wLiiQL1j4fSvMMpKIYmhd36mYQyCCjMdytL7QHUtV79coNZSqXz 9elg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature :arc-authentication-results; bh=weUU6NEXXT5DQU+Q6aQT+3H1YVrMDP3UCuXAKMrXXq4=; b=DpOSR2CLdoSS8gzQxYjsFMOejn7M7owidorABGBUSPvGkpF9QxlB1EBJZOE0guX6TX B6Pk1qYuLzCut7aHk1m/k8U6d1Gc8O+TRtXmQg4BTUDQL7yEH0Byp0klfPJ8bWiFFrBD 7fhsfWtCn/4ENGOjlLuQUt9DyhTh5pfw/9UbCCeW70lighO5X+zOAOvm873KOuLe1zZI JFCA82QWnxQ3/1jP/9862QDDR4I/Zb2DtxhYaqM+pMkFwmuH1N/DKfBSqTd8XspUPE4i uthSOUaAdNYkS0NdZi2OGaW6vnUP7jSMFKZs759lQacmGupZyovJFggrTuSVbrUob+Qw DTEQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@ti.com header.s=ti-com-17Q1 header.b=K+J6vvRg; 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; dmarc=pass (p=QUARANTINE sp=NONE dis=NONE) header.from=ti.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id a80si6833656pfa.6.2018.02.05.04.55.23; Mon, 05 Feb 2018 04:55:23 -0800 (PST) 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=@ti.com header.s=ti-com-17Q1 header.b=K+J6vvRg; 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; dmarc=pass (p=QUARANTINE sp=NONE dis=NONE) header.from=ti.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753298AbeBEMzV (ORCPT + 28 others); Mon, 5 Feb 2018 07:55:21 -0500 Received: from fllnx209.ext.ti.com ([198.47.19.16]:29250 "EHLO fllnx209.ext.ti.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753019AbeBEMvg (ORCPT ); Mon, 5 Feb 2018 07:51:36 -0500 Received: from dlelxv90.itg.ti.com ([172.17.2.17]) by fllnx209.ext.ti.com (8.15.1/8.15.1) with ESMTP id w15CpKst010711; Mon, 5 Feb 2018 06:51:20 -0600 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ti.com; s=ti-com-17Q1; t=1517835080; bh=i4kqLZLgCErWl/Ox9o1blp+m9db1p6YI6j3whPTha7I=; h=From:To:CC:Subject:Date:In-Reply-To:References; b=K+J6vvRgIS01QY3at48QUfH8osm+oGl3LB4RKHYCf9TukmoBYUfuthv7qAmkPGxjc vzDGu5c6z4sxAjGX8S9qfpBfFcU0PIcb2RISJR8bVcUFN1pYcRrrt67C0+jxI5NrAu rDOOIfye02tHQmlnm3P8FBcKz+wJH3bQgstMk084= Received: from DFLE101.ent.ti.com (dfle101.ent.ti.com [10.64.6.22]) by dlelxv90.itg.ti.com (8.14.3/8.13.8) with ESMTP id w15CpK5l020474; Mon, 5 Feb 2018 06:51:20 -0600 Received: from DFLE110.ent.ti.com (10.64.6.31) by DFLE101.ent.ti.com (10.64.6.22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1261.35; Mon, 5 Feb 2018 06:51:20 -0600 Received: from dlep32.itg.ti.com (157.170.170.100) by DFLE110.ent.ti.com (10.64.6.31) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.1261.35 via Frontend Transport; Mon, 5 Feb 2018 06:51:20 -0600 Received: from a0393678ub.india.ti.com (ileax41-snat.itg.ti.com [10.172.224.153]) by dlep32.itg.ti.com (8.14.3/8.13.8) with ESMTP id w15CoaGg023963; Mon, 5 Feb 2018 06:51:17 -0600 From: Kishon Vijay Abraham I To: Ulf Hansson , Tony Lindgren , Adrian Hunter CC: Rob Herring , Mark Rutland , Russell King , Kishon Vijay Abraham I , , , , , Subject: [PATCH v2 11/16] mmc: sdhci: Program a relatively accurate SW timeout value Date: Mon, 5 Feb 2018 18:20:24 +0530 Message-ID: <20180205125029.21570-12-kishon@ti.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20180205125029.21570-1-kishon@ti.com> References: <20180205125029.21570-1-kishon@ti.com> MIME-Version: 1.0 X-EXCLAIMER-MD-CONFIG: e1e8a2fd-e40a-4ac6-ac9b-f7e9cc9ee180 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org sdhci has a 10 second timeout to catch devices that stop responding. Instead of programming 10 second arbitrary value, calculate the total time it would take for the entire transfer to happen and program the timeout value accordingly. Signed-off-by: Kishon Vijay Abraham I --- drivers/mmc/host/sdhci.c | 46 +++++++++++++++++++++++++++++++++++++++------- drivers/mmc/host/sdhci.h | 10 ++++++++++ 2 files changed, 49 insertions(+), 7 deletions(-) -- 2.11.0 diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index 0489572d1892..d52f9e7eabe2 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c @@ -673,6 +673,37 @@ static void sdhci_adma_table_post(struct sdhci_host *host, } } +static void sdhci_calc_sw_timeout(struct sdhci_host *host, + struct mmc_command *cmd, + unsigned int target_timeout) +{ + struct mmc_data *data = cmd->data; + struct mmc_host *mmc = host->mmc; + unsigned long long transfer_time; + struct mmc_ios *ios = &mmc->ios; + unsigned char bus_width = ios->bus_width; + unsigned int blksz; + unsigned int freq; + + if (data) { + blksz = data->blksz; + freq = host->mmc->actual_clock ? host->mmc->actual_clock : + host->clock; + transfer_time = (unsigned long long)(blksz * NSEC_PER_SEC * + (8 / bus_width)) / freq; + /* multiply by '2' to account for any unknowns */ + transfer_time = transfer_time * 2; + /* calculate timeout for the entire data */ + host->data_timeout = (data->blocks * ((target_timeout * + NSEC_PER_USEC) + + transfer_time)); + } else { + host->data_timeout = target_timeout * NSEC_PER_USEC; + } + + host->data_timeout += MMC_CMD_TRANSFER_TIME; +} + static u8 sdhci_calc_timeout(struct sdhci_host *host, struct mmc_command *cmd) { u8 count; @@ -742,6 +773,7 @@ static u8 sdhci_calc_timeout(struct sdhci_host *host, struct mmc_command *cmd) host->hw_timeout_disabled = true; } } + sdhci_calc_sw_timeout(host, cmd, target_timeout); return count; } @@ -1130,13 +1162,6 @@ void sdhci_send_command(struct sdhci_host *host, struct mmc_command *cmd) mdelay(1); } - timeout = jiffies; - if (!cmd->data && cmd->busy_timeout > 9000) - timeout += DIV_ROUND_UP(cmd->busy_timeout, 1000) * HZ + HZ; - else - timeout += 10 * HZ; - sdhci_mod_timer(host, cmd, timeout); - host->cmd = cmd; if (sdhci_data_line_cmd(cmd)) { WARN_ON(host->data_cmd); @@ -1176,6 +1201,13 @@ void sdhci_send_command(struct sdhci_host *host, struct mmc_command *cmd) cmd->opcode == MMC_SEND_TUNING_BLOCK_HS200) flags |= SDHCI_CMD_DATA; + timeout = jiffies; + if (sdhci_data_line_cmd(cmd)) + timeout += nsecs_to_jiffies(host->data_timeout); + else + timeout += 10 * HZ; + sdhci_mod_timer(host, cmd, timeout); + sdhci_writew(host, SDHCI_MAKE_CMD(cmd->opcode, flags), SDHCI_COMMAND); } EXPORT_SYMBOL_GPL(sdhci_send_command); diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h index 3a967a56fcc3..b73577d77856 100644 --- a/drivers/mmc/host/sdhci.h +++ b/drivers/mmc/host/sdhci.h @@ -332,6 +332,14 @@ struct sdhci_adma2_64_desc { /* Allow for a a command request and a data request at the same time */ #define SDHCI_MAX_MRQS 2 +/* + * 48bit command and 136 bit response in 400KHz clock should take 0.46ms. + * However since the start time of the command, the time between + * command and response, and the time between response and start of data is + * not known, set the command transfer time to 2ms. + */ +#define MMC_CMD_TRANSFER_TIME (2 * NSEC_PER_MSEC) /* max 2 ms */ + enum sdhci_cookie { COOKIE_UNMAPPED, COOKIE_PRE_MAPPED, /* mapped by sdhci_pre_req() */ @@ -554,6 +562,8 @@ struct sdhci_host { /* Host SDMA buffer boundary. */ u32 sdma_boundary; + unsigned long long data_timeout; + unsigned long private[0] ____cacheline_aligned; };