From patchwork Wed Jan 29 22:38:02 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ulf Hansson X-Patchwork-Id: 3554991 Return-Path: X-Original-To: patchwork-linux-mmc@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 4ED779F3E6 for ; Wed, 29 Jan 2014 22:38:35 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 781C220170 for ; Wed, 29 Jan 2014 22:38:34 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id B15AE2017E for ; Wed, 29 Jan 2014 22:38:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751975AbaA2Wid (ORCPT ); Wed, 29 Jan 2014 17:38:33 -0500 Received: from mail-lb0-f170.google.com ([209.85.217.170]:46084 "EHLO mail-lb0-f170.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751744AbaA2Wic (ORCPT ); Wed, 29 Jan 2014 17:38:32 -0500 Received: by mail-lb0-f170.google.com with SMTP id u14so1961393lbd.15 for ; Wed, 29 Jan 2014 14:38:31 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=q5yKR00hnc2nddI4NuI/BQXEQghKqIIb+GnphVtz9MI=; b=g/xCEyWFVZMo4HG9ejpIZsRXAkjL9mHOIjvl7e8JgRUS4IAtKdX+OdU6mfyOoX6aK4 KhI7Ji2prAh8p14VIJHnii3IattgbFCJNfbWsfOIh6YMZ5LxTSg/c5rzpN0zyspGDDSo OJre26BrpjJIvA/4BECoTw9Orc7shb5i3+YDEKuJWHlAJ+UV5l4Vh86VmMm5QRTwlKRb ITsWuF+WoXQjhnS1M9jpx7bh08TxMDO7ZUMBp+BPqecyg8TUfavp4M9R9o1eWRPM6Zb5 ChuxC8slIFPMse21G8/SkpcXdA88JEcVQgY+RJ/pDvV3OMwxb1yU4dJd33YIrFtH0E2w RUhw== X-Gm-Message-State: ALoCoQm3jvyXZ9xkaJOgtEfUXH04MjCYOH+kiSd2IvLNS0J5gYlXP1A7OKMZNs7WjNG+Y0HcFi/8 X-Received: by 10.152.28.137 with SMTP id b9mr7222829lah.4.1391035111222; Wed, 29 Jan 2014 14:38:31 -0800 (PST) Received: from linaro-ulf.lan (90-231-160-185-no158.tbcn.telia.com. [90.231.160.185]) by mx.google.com with ESMTPSA id wt2sm3998221lbb.2.2014.01.29.14.38.29 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Wed, 29 Jan 2014 14:38:30 -0800 (PST) From: Ulf Hansson To: linux-mmc@vger.kernel.org, Chris Ball Cc: Dong Aisheng , Stephen Warren , Vladimir Zapolskiy , Adrian Hunter , Ulf Hansson Subject: [PATCH 10/13] mmc: block: Respect hw busy detection in card_busy_detect() Date: Wed, 29 Jan 2014 23:38:02 +0100 Message-Id: <1391035085-2747-11-git-send-email-ulf.hansson@linaro.org> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1391035085-2747-1-git-send-email-ulf.hansson@linaro.org> References: <1391035085-2747-1-git-send-email-ulf.hansson@linaro.org> Sender: linux-mmc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-mmc@vger.kernel.org X-Spam-Status: No, score=-7.4 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Currently for write request we don't trust the hw busy detection to be fully handled by host, thus we also poll the card's status until we see it's gets out of the busy state. Still there are scenarios where it will a benefit to trust the hw busy detection done by the host, since no additional polling is needed. Let's prepare card_busy_detect() to be able to handle this. Signed-off-by: Ulf Hansson --- drivers/mmc/card/block.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index 9568999..fec5e98 100644 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c @@ -751,7 +751,7 @@ static int get_card_status(struct mmc_card *card, u32 *status, int retries) } static int card_busy_detect(struct mmc_card *card, unsigned int timeout_ms, - struct request *req, int *gen_err) + bool hw_busy_detect, struct request *req, int *gen_err) { unsigned long timeout = jiffies + msecs_to_jiffies(timeout_ms); int err = 0; @@ -771,6 +771,11 @@ static int card_busy_detect(struct mmc_card *card, unsigned int timeout_ms, *gen_err = 1; } + /* We may rely on the host hw to handle busy detection.*/ + if ((card->host->caps & MMC_CAP_WAIT_WHILE_BUSY) && + hw_busy_detect) + break; + /* * Timeout if the device never becomes ready for data and never * leaves the program state. @@ -1210,7 +1215,8 @@ static int mmc_blk_err_check(struct mmc_card *card, gen_err = 1; } - err = card_busy_detect(card, MMC_BLK_TIMEOUT_MS, req, &gen_err); + err = card_busy_detect(card, MMC_BLK_TIMEOUT_MS, false, req, + &gen_err); if (err) return MMC_BLK_CMD_ERR; }