From patchwork Mon Dec 15 11:59:17 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lee Jones X-Patchwork-Id: 42252 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-wi0-f197.google.com (mail-wi0-f197.google.com [209.85.212.197]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 560A221772 for ; Mon, 15 Dec 2014 12:01:43 +0000 (UTC) Received: by mail-wi0-f197.google.com with SMTP id l15sf3432415wiw.8 for ; Mon, 15 Dec 2014 04:01:42 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:delivered-to:from:to:cc:subject :date:message-id:in-reply-to:references:sender:precedence:list-id :x-original-sender:x-original-authentication-results:mailing-list :list-post:list-help:list-archive:list-unsubscribe; bh=jlfKBSJQJ+BwazDTbqW5SFIaUrqVReOUREA5JLHowSY=; b=exjjc5EWMu73PcKp4Iz9SAcWaYUIyFPs+9q2bUqgr2+OqIdQf1fYySoU+BMwnYbaCH W9HGKy3T87CK38GXOrSrQ/6BXzS2ggXrPdH5bBiwJd5/fUKqZT67D9hnNCPKUwUNciAc 9l9do47skCykYPGDEnLzUGlCzgqzNozWOwrr5yY/FCh+Dk2ghlae2YprPpbsWAuz3/U2 QXqxuGxOtXnVXHaBB6Khdx33obH7E6hL635Sxo7J6Fuc+fj9mUttnExHi1U9MB1rqasA OS6ZI0036WbOK/YeagMIgBaJhYXD+IAWYMURlRCZyjgGzAXpHthDDQpQau6sOJjjhjgS 5lgg== X-Gm-Message-State: ALoCoQkvI4S380xnKzjzGLppcCSXGBnwHIQiLfF8VWYlAPqEapT6UtcoXrcTLnq+DnkFxXYA4ox9 X-Received: by 10.152.2.40 with SMTP id 8mr242616lar.7.1418644902608; Mon, 15 Dec 2014 04:01:42 -0800 (PST) MIME-Version: 1.0 X-BeenThere: patchwork-forward@linaro.org Received: by 10.152.7.42 with SMTP id g10ls656694laa.56.gmail; Mon, 15 Dec 2014 04:01:42 -0800 (PST) X-Received: by 10.152.2.41 with SMTP id 9mr29053897lar.47.1418644902333; Mon, 15 Dec 2014 04:01:42 -0800 (PST) Received: from mail-la0-f49.google.com (mail-la0-f49.google.com. [209.85.215.49]) by mx.google.com with ESMTPS id m2si10208327lbs.81.2014.12.15.04.01.42 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 15 Dec 2014 04:01:42 -0800 (PST) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.215.49 as permitted sender) client-ip=209.85.215.49; Received: by mail-la0-f49.google.com with SMTP id hs14so9099517lab.22 for ; Mon, 15 Dec 2014 04:01:42 -0800 (PST) X-Received: by 10.152.2.41 with SMTP id 9mr29053876lar.47.1418644902027; Mon, 15 Dec 2014 04:01:42 -0800 (PST) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.112.142.69 with SMTP id ru5csp692358lbb; Mon, 15 Dec 2014 04:01:40 -0800 (PST) X-Received: by 10.70.133.98 with SMTP id pb2mr765286pdb.137.1418644899947; Mon, 15 Dec 2014 04:01:39 -0800 (PST) Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id vs9si13568492pbc.142.2014.12.15.04.01.39 for ; Mon, 15 Dec 2014 04:01:39 -0800 (PST) Received-SPF: none (google.com: linux-kernel-owner@vger.kernel.org does not designate permitted sender hosts) client-ip=209.132.180.67; Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752015AbaLOMBh (ORCPT + 27 others); Mon, 15 Dec 2014 07:01:37 -0500 Received: from mail-yh0-f47.google.com ([209.85.213.47]:53812 "EHLO mail-yh0-f47.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751338AbaLOL7v (ORCPT ); Mon, 15 Dec 2014 06:59:51 -0500 Received: by mail-yh0-f47.google.com with SMTP id f73so5047366yha.20 for ; Mon, 15 Dec 2014 03:59:51 -0800 (PST) X-Received: by 10.170.188.87 with SMTP id f84mr24747261yke.125.1418644790958; Mon, 15 Dec 2014 03:59:50 -0800 (PST) Received: from localhost.localdomain (host109-148-232-11.range109-148.btcentralplus.com. [109.148.232.11]) by mx.google.com with ESMTPSA id d91sm5783468yhq.53.2014.12.15.03.59.48 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 15 Dec 2014 03:59:50 -0800 (PST) From: Lee Jones To: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, computersforpeace@gmail.com, linux-mtd@lists.infradead.org Cc: lee.jones@linaro.org, kernel@stlinux.com, Angus Clark Subject: [PATCH v3 10/13] mtd: st_spi_fsm: Improve busy wait handling Date: Mon, 15 Dec 2014 11:59:17 +0000 Message-Id: <1418644760-18773-11-git-send-email-lee.jones@linaro.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1418644760-18773-1-git-send-email-lee.jones@linaro.org> References: <1418644760-18773-1-git-send-email-lee.jones@linaro.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: list List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: lee.jones@linaro.org X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.215.49 as permitted sender) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , From: Angus Clark In this patch, the fsm_wait_busy() function is updated to a take a timeout parameter. This allows us to specify different timeout delays depending on the operation being performed. Previously, a fixed, worst-case delay (corresponding to the Chip Erase operation, ~300s!) was used. For the moment, we have defined conservative delays for each relevant operation, which should accommodate all existing devices. In principle, one could set the delays according the device probed, but there is probably little to be gained. Signed-off-by: Angus Clark Signed-off-by: Lee Jones --- drivers/mtd/devices/st_spi_fsm.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/drivers/mtd/devices/st_spi_fsm.c b/drivers/mtd/devices/st_spi_fsm.c index 7c024ec..3424574 100644 --- a/drivers/mtd/devices/st_spi_fsm.c +++ b/drivers/mtd/devices/st_spi_fsm.c @@ -267,7 +267,12 @@ #define FLASH_PAGESIZE 256 /* In Bytes */ #define FLASH_PAGESIZE_32 (FLASH_PAGESIZE / 4) /* In uint32_t */ -#define FLASH_MAX_BUSY_WAIT (300 * HZ) /* Maximum 'CHIPERASE' time */ +/* Maximum operation times (in ms) */ +#define FLASH_MAX_CHIP_ERASE_MS 500000 /* Chip Erase time */ +#define FLASH_MAX_SEC_ERASE_MS 30000 /* Sector Erase time */ +#define FLASH_MAX_PAGE_WRITE_MS 100 /* Write Page time */ +#define FLASH_MAX_STA_WRITE_MS 4000 /* Write status reg time */ +#define FSM_MAX_WAIT_SEQ_MS 1000 /* FSM execution time */ /* * Flags to tweak operation of default read/write/erase routines @@ -1003,7 +1008,7 @@ static int stfsm_enter_32bit_addr(struct stfsm *fsm, int enter) return 0; } -static uint8_t stfsm_wait_busy(struct stfsm *fsm) +static uint8_t stfsm_wait_busy(struct stfsm *fsm, unsigned int max_time_ms) { struct stfsm_seq *seq = &stfsm_seq_read_status_fifo; unsigned long deadline; @@ -1021,7 +1026,7 @@ static uint8_t stfsm_wait_busy(struct stfsm *fsm) /* * Repeat until busy bit is deasserted, or timeout, or error (S25FLxxxS) */ - deadline = jiffies + FLASH_MAX_BUSY_WAIT; + deadline = jiffies + msecs_to_jiffies(max_time_ms); while (!timeout) { if (time_after_eq(jiffies, deadline)) timeout = 1; @@ -1100,7 +1105,7 @@ static int stfsm_write_status(struct stfsm *fsm, uint8_t cmd, stfsm_wait_seq(fsm); if (wait_busy) - stfsm_wait_busy(fsm); + stfsm_wait_busy(fsm, FLASH_MAX_STA_WRITE_MS); return 0; } @@ -1497,7 +1502,7 @@ static void stfsm_s25fl_write_dyb(struct stfsm *fsm, uint32_t offs, uint8_t dby) stfsm_load_seq(fsm, &seq); stfsm_wait_seq(fsm); - stfsm_wait_busy(fsm); + stfsm_wait_busy(fsm, FLASH_MAX_STA_WRITE_MS); } static int stfsm_s25fl_clear_status_reg(struct stfsm *fsm) @@ -1800,7 +1805,7 @@ static int stfsm_write(struct stfsm *fsm, const uint8_t *buf, stfsm_wait_seq(fsm); /* Wait for completion */ - ret = stfsm_wait_busy(fsm); + ret = stfsm_wait_busy(fsm, FLASH_MAX_PAGE_WRITE_MS); if (ret && fsm->configuration & CFG_S25FL_CHECK_ERROR_FLAGS) stfsm_s25fl_clear_status_reg(fsm); @@ -1872,7 +1877,7 @@ static int stfsm_erase_sector(struct stfsm *fsm, uint32_t offset) stfsm_wait_seq(fsm); /* Wait for completion */ - ret = stfsm_wait_busy(fsm); + ret = stfsm_wait_busy(fsm, FLASH_MAX_SEC_ERASE_MS); if (ret && fsm->configuration & CFG_S25FL_CHECK_ERROR_FLAGS) stfsm_s25fl_clear_status_reg(fsm); @@ -1902,7 +1907,7 @@ static int stfsm_erase_chip(struct stfsm *fsm) stfsm_wait_seq(fsm); - return stfsm_wait_busy(fsm); + return stfsm_wait_busy(fsm, FLASH_MAX_CHIP_ERASE_MS); } /*