From patchwork Wed Mar 7 13:20:16 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: 130888 Delivered-To: patch@linaro.org Received: by 10.46.66.2 with SMTP id p2csp5175973lja; Wed, 7 Mar 2018 05:21:56 -0800 (PST) X-Google-Smtp-Source: AG47ELtLduDYS/AJfpas/FVbr7bQzkNJEFo4zutSexRX8DJM9GYHqhmIunQZDVFI7OwT90F4T9sQ X-Received: by 10.99.95.81 with SMTP id t78mr18403411pgb.380.1520428916652; Wed, 07 Mar 2018 05:21:56 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1520428916; cv=none; d=google.com; s=arc-20160816; b=vex9IF+tl78r3K1XcHwDGYhgXvRpejMmeOvCXT+m7GNslIcbfKcU2+Vn2FOR13tCew 8d2vBJxs33KIJnQbV1bE1cGBSbojjhkH/0r+JnSpu4CiKtVxD5d0bLPZhO2P6kEz2rz0 YvsAgzTu9FhMruxQfQV8T1THejz4ArFQr0DBZ2aFSk0BK//zAZKnWGMbfsuD6beF2BG2 hJhCl1vMAuCbrSAqO5xg65vQBpmYE+ePog7oNQMa6CVl1PqAro2hd5Y49lz3/uUl68X4 8j2aQ2As6zFFoBNjFIx8nR+OD5XzL2vjM9zgVlLLIP5uha4nKp6rDg6oWbfdOcU89g96 mc5Q== 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=1gwdo/CKuRCnjpKAXeBGUro0b3mZzlF6GCGD9bxos6U=; b=tUig643E67At46gqkLENhI/sFPy7n+P89gu5erBSJb7POiTNKz1pZJctJwKRMYGO+L 9i7puHXktI7SvbceAH2KsssJJ5ggEY0zchPyyBX9m4mJUxPiTydWZRiLQGMVRnsGqDh+ Qz5Hw+XiY2glmYsSjsRc3mdSpQRJo2U/hBliyHeflImqk2v6YPCav8IW2VwquIfQtIhJ OZZhjsHDtZds0KFfv8K4owQoKisdBVvOWWjA+gHeZP+lPyDxraL/LBWmqS5Ayua75kIz EUYUm5YUbIysVzW5lNQlmnWccpa8F+ExfN83myFnRpXYnlfZ78BS/dAKgrNqI3Wv8IwM 8i8g== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@ti.com header.s=ti-com-17Q1 header.b=TRXFbhZ6; spf=pass (google.com: best guess record for domain of linux-omap-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-omap-owner@vger.kernel.org; dmarc=fail (p=QUARANTINE sp=NONE dis=QUARANTINE) 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 102-v6si13016815plf.132.2018.03.07.05.21.56; Wed, 07 Mar 2018 05:21:56 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-omap-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@ti.com header.s=ti-com-17Q1 header.b=TRXFbhZ6; spf=pass (google.com: best guess record for domain of linux-omap-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-omap-owner@vger.kernel.org; dmarc=fail (p=QUARANTINE sp=NONE dis=QUARANTINE) header.from=ti.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754599AbeCGNVy (ORCPT + 5 others); Wed, 7 Mar 2018 08:21:54 -0500 Received: from lelnx194.ext.ti.com ([198.47.27.80]:61935 "EHLO lelnx194.ext.ti.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754591AbeCGNVt (ORCPT ); Wed, 7 Mar 2018 08:21:49 -0500 Received: from dflxv15.itg.ti.com ([128.247.5.124]) by lelnx194.ext.ti.com (8.15.1/8.15.1) with ESMTP id w27DL0lo010844; Wed, 7 Mar 2018 07:21:00 -0600 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ti.com; s=ti-com-17Q1; t=1520428860; bh=iatXKMiiDVqAIckIPJLyo8Odql8U4binSLFUrqOADEE=; h=From:To:CC:Subject:Date:In-Reply-To:References; b=TRXFbhZ65Ku15/LwM801YusnI9ASGql2Nh9PPGKSIpPz9RGgHI4C/V6u00WLdPnzy KUuz4EXjddl718R/VSbD+7oXm/oFYAgjYLfuiAohV9kCgY8+FyaeYcBoOTq+f6wD60 /6KYHTOOvAOJ5cstmXYVgtd5grCvUdqkTs0ZGiXI= Received: from DLEE103.ent.ti.com (dlee103.ent.ti.com [157.170.170.33]) by dflxv15.itg.ti.com (8.14.3/8.13.8) with ESMTP id w27DL0TG003485; Wed, 7 Mar 2018 07:21:00 -0600 Received: from DLEE113.ent.ti.com (157.170.170.24) by DLEE103.ent.ti.com (157.170.170.33) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1261.35; Wed, 7 Mar 2018 07:20:59 -0600 Received: from dflp33.itg.ti.com (10.64.6.16) by DLEE113.ent.ti.com (157.170.170.24) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.1261.35 via Frontend Transport; Wed, 7 Mar 2018 07:20:59 -0600 Received: from a0393678ub.india.ti.com (ileax41-snat.itg.ti.com [10.172.224.153]) by dflp33.itg.ti.com (8.14.3/8.13.8) with ESMTP id w27DKMnR018331; Wed, 7 Mar 2018 07:20:56 -0600 From: Kishon Vijay Abraham I To: Ulf Hansson , Tony Lindgren , Adrian Hunter CC: Rob Herring , Mark Rutland , Russell King , , , , , , Subject: [PATCH v3 07/11] mmc: sdhci: Program a relatively accurate SW timeout value Date: Wed, 7 Mar 2018 18:50:16 +0530 Message-ID: <20180307132020.30951-8-kishon@ti.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20180307132020.30951-1-kishon@ti.com> References: <20180307132020.30951-1-kishon@ti.com> MIME-Version: 1.0 X-EXCLAIMER-MD-CONFIG: e1e8a2fd-e40a-4ac6-ac9b-f7e9cc9ee180 Sender: linux-omap-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-omap@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 | 47 ++++++++++++++++++++++++++++++++++++++++------- drivers/mmc/host/sdhci.h | 10 ++++++++++ 2 files changed, 50 insertions(+), 7 deletions(-) -- 2.11.0 -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Signed-off-by: Adrian Hunter Signed-off-by: Adrian Hunter Signed-off-by: Kishon Vijay Abraham I Signed-off-by: Adrian Hunter diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index 1dd117cbeb6e..baab67bfa39b 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c @@ -709,6 +709,36 @@ static u32 sdhci_sdma_address(struct sdhci_host *host) return sg_dma_address(host->data->sg); } +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; + u64 transfer_time; + struct mmc_ios *ios = &mmc->ios; + unsigned char bus_width = 1 << ios->bus_width; + unsigned int blksz; + unsigned int freq; + + if (data) { + blksz = data->blksz; + freq = host->mmc->actual_clock ? : host->clock; + transfer_time = (u64)blksz * NSEC_PER_SEC * (8 / bus_width); + do_div(transfer_time, 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 = (u64)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; @@ -766,6 +796,7 @@ static u8 sdhci_calc_timeout(struct sdhci_host *host, struct mmc_command *cmd) if (count >= 0xF) break; } + sdhci_calc_sw_timeout(host, cmd, target_timeout); return count; } @@ -1175,13 +1206,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->mrq, timeout); - host->cmd = cmd; if (sdhci_data_line_cmd(cmd)) { WARN_ON(host->data_cmd); @@ -1221,6 +1245,15 @@ 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 (host->data_timeout > 0) { + timeout += nsecs_to_jiffies(host->data_timeout); + host->data_timeout = 0; + } else { + timeout += 10 * HZ; + } + sdhci_mod_timer(host, cmd->mrq, 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 ff283ee08854..29b242fd17de 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 100KHz clock could take upto 2.48ms. + * 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 10ms. + */ +#define MMC_CMD_TRANSFER_TIME (10 * NSEC_PER_MSEC) /* max 10 ms */ + enum sdhci_cookie { COOKIE_UNMAPPED, COOKIE_PRE_MAPPED, /* mapped by sdhci_pre_req() */ @@ -555,6 +563,8 @@ struct sdhci_host { /* Host SDMA buffer boundary. */ u32 sdma_boundary; + u64 data_timeout; + unsigned long private[0] ____cacheline_aligned; };