Received: by 2002:ac0:a594:0:0:0:0:0 with SMTP id m20-v6csp3412965imm; Fri, 25 May 2018 05:24:39 -0700 (PDT) X-Google-Smtp-Source: AB8JxZo9SD+qrPsD6ADF65LC6ATZ8UPWYqvfG92SD2yzKY7LTOrgNLRg6MKmidrEjOYq+Y11p+pa X-Received: by 2002:a63:18c:: with SMTP id 134-v6mr1862314pgb.138.1527251079415; Fri, 25 May 2018 05:24:39 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527251079; cv=none; d=google.com; s=arc-20160816; b=VPg13vdWT1AKOTS5nCKdkAmuxWLUiuRP8GHbXgpAcEYCZzMKYN7w7jmCfgmkNOsfEB +ApwQwQbuIlC1Qv7jkeqAf9B1BuLA+adfom/CTw7ozF6DcarT/WoncGYDvySRMUMp2J5 m3QcJygifJZzfkGQ/5eu6DxFJnSkrQPcbyGwIMhsjCBcjku1IZEAULU9JgbM574G+NKc 9kpHBHwpDPA1f5nIGbVzbvXjhSDgO/tFO0LeQhese4Dq3/OjLGFLTaUzYEFVAJcPOHMv CfiWWTg/j32CVQQ7BKApFNF1rXby1pMhKlVmOzatBsNaa11F8DNMpxC0YfiqWofFxgPf zAsw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dmarc-filter:dkim-signature:dkim-signature :arc-authentication-results; bh=dGsD8oZvh92fHte+SLQjde1uw1kM3SIUwqtcEY77ZjM=; b=xXce5zbFjRf8CJ1magbpSrwsuW2hoY2ugZwTqbzpW8mGEtXY69HFntzbDtwh814zwE zicUBKFvYxQ5PhEqrBB4BtalGUw2p3J7YYmgyybCsJiafJkJJtSh5q77AqoWN7YNuE90 aRxHNlqfC8x7MeMSQp1VGZ2qTXAGPvNsA5sF5PH4hGXxjxWZYjEiJVLGVw+MqYV+G2SU tevMx0ubnTDEjaY56NrM1hKStB10I7LIxaEuC3SEquS4nyZ9vma7w6OWDP7LRBcqHaXC PODl6sbA0zwHKyBrAX4VX53CmAWTMVc9NrFP5Ff+WxH2QhDcjhtteWKIpXya1ua816A7 y6mg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@codeaurora.org header.s=default header.b=Gc/IOGN2; dkim=pass header.i=@codeaurora.org header.s=default header.b=f592kFn3; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id b5-v6si24058135ple.417.2018.05.25.05.24.24; Fri, 25 May 2018 05:24:39 -0700 (PDT) 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=@codeaurora.org header.s=default header.b=Gc/IOGN2; dkim=pass header.i=@codeaurora.org header.s=default header.b=f592kFn3; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S967018AbeEYMWl (ORCPT + 99 others); Fri, 25 May 2018 08:22:41 -0400 Received: from smtp.codeaurora.org ([198.145.29.96]:48520 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S966947AbeEYMWg (ORCPT ); Fri, 25 May 2018 08:22:36 -0400 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id 0651C60C55; Fri, 25 May 2018 12:22:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1527250956; bh=vUeZzewOJNQGqi2BW3r9FfD0PyaoQm0Q6QUohnEeIAw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Gc/IOGN2So8E9ci/06JNNGwZovH9/RMDHKYjtr2AhernTWvyNkIsDKiMBjif/hHbd ZEHm0bi6XXz3Vy74u90/geeo4Im9/BQk3PyC0MT5hq4aPcYoEge9FcFuFYJsRTQZkp ytK61+bsfp/UaidmJ4g3KPb7PCwm+uK+vGAFv+U0= X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on pdx-caf-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.8 required=2.0 tests=ALL_TRUSTED,BAYES_00, DKIM_SIGNED,T_DKIM_INVALID autolearn=no autolearn_force=no version=3.4.0 Received: from absahu-linux.qualcomm.com (blr-c-bdr-fw-01_globalnat_allzones-outside.qualcomm.com [103.229.19.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: absahu@smtp.codeaurora.org) by smtp.codeaurora.org (Postfix) with ESMTPSA id 4698460117; Fri, 25 May 2018 12:22:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1527250954; bh=vUeZzewOJNQGqi2BW3r9FfD0PyaoQm0Q6QUohnEeIAw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=f592kFn3iQ+fpCwrQJQa8soHvgM+uz5ivZI6el+V4tgbINMgvXGBBJo/C+ASL2PiK F15KWhdke8rByE5Sl1f+sew9VNUhSnMnY1kdczSKgNsgYqGKsDq1ZQ1BvKHNkjKliR 0rQQpbEWdExYmviU0nf2SCd3ewa/tVHYFFI81RVM= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org 4698460117 Authentication-Results: pdx-caf-mail.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: pdx-caf-mail.web.codeaurora.org; spf=none smtp.mailfrom=absahu@codeaurora.org From: Abhishek Sahu To: Boris Brezillon Cc: David Woodhouse , Brian Norris , Marek Vasut , Richard Weinberger , Cyrille Pitchen , Miquel Raynal , linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mtd@lists.infradead.org, Andy Gross , Archit Taneja , Abhishek Sahu Subject: [PATCH v3 08/16] mtd: rawnand: qcom: erased page detection for uncorrectable errors only Date: Fri, 25 May 2018 17:51:36 +0530 Message-Id: <1527250904-21988-9-git-send-email-absahu@codeaurora.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1527250904-21988-1-git-send-email-absahu@codeaurora.org> References: <1527250904-21988-1-git-send-email-absahu@codeaurora.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Following is the flow in the HW if controller tries to read erased page: 1. First ECC uncorrectable error will be generated from ECC engine since ECC engine first calculates the ECC with all 0xff and match the calculated ECC with ECC code in OOB (which is again all 0xff). 2. After getting ECC error, erased CW detection logic will be applied which is different for BCH and RS ECC a. For BCH, HW checks if all the bytes in page are 0xff and then it updates the status in separate register NAND_ERASED_CW_DETECT_STATUS. b. For RS ECC, the HW reports the same error when reading an erased CW, but it notifies that it is an erased CW by placing special characters at certain offsets in the buffer. So the erased CW detect status should be checked only if ECC engine generated the uncorrectable error. Currently for all other operational errors also (like TIMEOUT, MPU errors, etc.), the erased CW detect logic is being applied so fix this and return EIO for other operational errors. Acked-by: Miquel Raynal Signed-off-by: Abhishek Sahu --- * Changes from v2: 1. Changed commit message slightly * Changes from v1: 1. Added more detail in commit message 2. Added comment before each if/else 3. Removed redundant check for BS_UNCORRECTABLE_BIT drivers/mtd/nand/raw/qcom_nandc.c | 65 ++++++++++++++++++++++++++------------- 1 file changed, 43 insertions(+), 22 deletions(-) diff --git a/drivers/mtd/nand/raw/qcom_nandc.c b/drivers/mtd/nand/raw/qcom_nandc.c index 7f85ef8..9a11827 100644 --- a/drivers/mtd/nand/raw/qcom_nandc.c +++ b/drivers/mtd/nand/raw/qcom_nandc.c @@ -1576,6 +1576,7 @@ static int parse_read_errors(struct qcom_nand_host *host, u8 *data_buf, struct nand_ecc_ctrl *ecc = &chip->ecc; unsigned int max_bitflips = 0; struct read_stats *buf; + bool flash_op_err = false; int i; buf = (struct read_stats *)nandc->reg_read_buf; @@ -1597,8 +1598,18 @@ static int parse_read_errors(struct qcom_nand_host *host, u8 *data_buf, buffer = le32_to_cpu(buf->buffer); erased_cw = le32_to_cpu(buf->erased_cw); - if (flash & (FS_OP_ERR | FS_MPU_ERR)) { + /* + * Check ECC failure for each codeword. ECC failure can + * happen in either of the following conditions + * 1. If number of bitflips are greater than ECC engine + * capability. + * 2. If this codeword contains all 0xff for which erased + * codeword detection check will be done. + */ + if ((flash & FS_OP_ERR) && (buffer & BS_UNCORRECTABLE_BIT)) { bool erased; + int ret, ecclen, extraooblen; + void *eccbuf; /* ignore erased codeword errors */ if (host->bch_enabled) { @@ -1616,29 +1627,36 @@ static int parse_read_errors(struct qcom_nand_host *host, u8 *data_buf, continue; } - if (buffer & BS_UNCORRECTABLE_BIT) { - int ret, ecclen, extraooblen; - void *eccbuf; + eccbuf = oob_buf ? oob_buf + oob_len : NULL; + ecclen = oob_buf ? host->ecc_bytes_hw : 0; + extraooblen = oob_buf ? oob_len : 0; - eccbuf = oob_buf ? oob_buf + oob_len : NULL; - ecclen = oob_buf ? host->ecc_bytes_hw : 0; - extraooblen = oob_buf ? oob_len : 0; - - /* - * make sure it isn't an erased page reported - * as not-erased by HW because of a few bitflips - */ - ret = nand_check_erased_ecc_chunk(data_buf, - data_len, eccbuf, ecclen, oob_buf, - extraooblen, ecc->strength); - if (ret < 0) { - mtd->ecc_stats.failed++; - } else { - mtd->ecc_stats.corrected += ret; - max_bitflips = - max_t(unsigned int, max_bitflips, ret); - } + /* + * make sure it isn't an erased page reported + * as not-erased by HW because of a few bitflips + */ + ret = nand_check_erased_ecc_chunk(data_buf, + data_len, eccbuf, ecclen, oob_buf, + extraooblen, ecc->strength); + if (ret < 0) { + mtd->ecc_stats.failed++; + } else { + mtd->ecc_stats.corrected += ret; + max_bitflips = + max_t(unsigned int, max_bitflips, ret); } + /* + * Check if MPU or any other operational error (timeout, + * device failure, etc.) happened for this codeword and + * make flash_op_err true. If flash_op_err is set, then + * EIO will be returned for page read. + */ + } else if (flash & (FS_OP_ERR | FS_MPU_ERR)) { + flash_op_err = true; + /* + * No ECC or operational errors happened. Check the number of + * bits corrected and update the ecc_stats.corrected. + */ } else { unsigned int stat; @@ -1652,6 +1670,9 @@ static int parse_read_errors(struct qcom_nand_host *host, u8 *data_buf, oob_buf += oob_len + ecc->bytes; } + if (flash_op_err) + return -EIO; + return max_bitflips; } -- QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation