Received: by 2002:a25:b794:0:0:0:0:0 with SMTP id n20csp2763637ybh; Mon, 5 Aug 2019 06:28:42 -0700 (PDT) X-Google-Smtp-Source: APXvYqxwzSdCB1fPbrkWP/B9aGR4qGpb9gNcVwFYmz9wd5pQgSa6zxvhy9SBU4yj6LZn++jeOajb X-Received: by 2002:aa7:81d9:: with SMTP id c25mr74322099pfn.255.1565011722416; Mon, 05 Aug 2019 06:28:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1565011722; cv=none; d=google.com; s=arc-20160816; b=lcdIx3xLp3mvQ1QGU9m4Sv+gyhtd2X99YFv9a+3M2wgcCZ1XgDXvY+s6hrjGw9j7Yi FJE7XDZiu18IbZqnH9SAQkVszo5HYMv26Ka0z9WNvd01XQE8Pqgd52LAjNBIkmHtxKuv ixYB+43dpKqR0ORq+Yo7uWF8Ba9VJ7GfJOHq/nZ+mYr9J9je+6SWuZoACrtabMjklzVG Ei7JXM735988eLsEDSy30Db1V8PRQyDTqojgU3BKNTVr+nasb8ohOft6ey3Yqn9iAgAc OuaiSUKJW+raBt7sCXBtYEc0Hd85e246K7JBL0NJETFvNE67eDCJG6kfp2ZrfDdkcxWk bgcg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=PpSfJStZJHqVh6vQePF76HTPu8yZpFAnarp/cZ8vDv4=; b=MVBYWnbckBdkCAiFNT7pFSkD4ZZg7mFBfOnHLmtOIG0BXfbQhQXvzVsi9dJ1jkARXC 6KW8l6TurNjBAAcK5SPgykXMJ0FJNQHFxMHF9bPCisy5xxquoJsMW5QYWMbPza1TC4PW DxAlzHgndfzA8WFG15XFdGtc3nVY6bH+sTG8lzb8olpFubJOpNJqRSpZ64Er8NpVkHui dubU4xFh5SZqrG1/6ZDP16+/wXn5jSa9R0ubaVPF5ODns5tzgL6ztTcsLKEJwToqFJQ+ xHSv+o2JMsAAAIYav5QlpPpSoLNq1YrKdCWONt1qi1wf8ztyVPD/W5f8Y/wR8OfsDPNj 9Ahg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=jyHA3Fje; 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 m143si44709414pfd.224.2019.08.05.06.28.27; Mon, 05 Aug 2019 06:28:42 -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=@kernel.org header.s=default header.b=jyHA3Fje; 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 S1730684AbfHEN14 (ORCPT + 99 others); Mon, 5 Aug 2019 09:27:56 -0400 Received: from mail.kernel.org ([198.145.29.99]:60910 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730951AbfHENYJ (ORCPT ); Mon, 5 Aug 2019 09:24:09 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 243712075B; Mon, 5 Aug 2019 13:24:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1565011447; bh=zgnIYBAxB2jrEJmNoprGrBSkqiAFi5O/SGlURM4Rtug=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=jyHA3Fje9NLfU+Yv0uWgEjQdxtL19Hxk/9LFXlNxjkb5/hM9BtLWCVN6rKm3A4jr3 vYAFo3ahZVQ09hWUfgBOYtLuOguV0782XVlc51vqJdw7IQuN1fmyvz3CcrX2KLCqWr iB1Z3ulZOq7VHUWEL7u6HC1LdVNGXdbGV/mYKTLY= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Marco Felsch , Boris Brezillon , Miquel Raynal Subject: [PATCH 5.2 092/131] mtd: rawnand: micron: handle on-die "ECC-off" devices correctly Date: Mon, 5 Aug 2019 15:02:59 +0200 Message-Id: <20190805124958.129040120@linuxfoundation.org> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190805124951.453337465@linuxfoundation.org> References: <20190805124951.453337465@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Marco Felsch commit 8493b2a06fc5b77ef5c579dc32b12761f7b7a84c upstream. Some devices are not supposed to support on-die ECC but experience shows that internal ECC machinery can actually be enabled through the "SET FEATURE (EFh)" command, even if a read of the "READ ID Parameter Tables" returns that it is not. Currently, the driver checks the "READ ID Parameter" field directly after having enabled the feature. If the check fails it returns immediately but leaves the ECC on. When using buggy chips like MT29F2G08ABAGA and MT29F2G08ABBGA, all future read/program cycles will go through the on-die ECC, confusing the host controller which is supposed to be the one handling correction. To address this in a common way we need to turn off the on-die ECC directly after reading the "READ ID Parameter" and before checking the "ECC status". Cc: stable@vger.kernel.org Fixes: dbc44edbf833 ("mtd: rawnand: micron: Fix on-die ECC detection logic") Signed-off-by: Marco Felsch Reviewed-by: Boris Brezillon Signed-off-by: Miquel Raynal Signed-off-by: Greg Kroah-Hartman --- drivers/mtd/nand/raw/nand_micron.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) --- a/drivers/mtd/nand/raw/nand_micron.c +++ b/drivers/mtd/nand/raw/nand_micron.c @@ -390,6 +390,14 @@ static int micron_supports_on_die_ecc(st (chip->id.data[4] & MICRON_ID_INTERNAL_ECC_MASK) != 0x2) return MICRON_ON_DIE_UNSUPPORTED; + /* + * It seems that there are devices which do not support ECC officially. + * At least the MT29F2G08ABAGA / MT29F2G08ABBGA devices supports + * enabling the ECC feature but don't reflect that to the READ_ID table. + * So we have to guarantee that we disable the ECC feature directly + * after we did the READ_ID table command. Later we can evaluate the + * ECC_ENABLE support. + */ ret = micron_nand_on_die_ecc_setup(chip, true); if (ret) return MICRON_ON_DIE_UNSUPPORTED; @@ -398,13 +406,13 @@ static int micron_supports_on_die_ecc(st if (ret) return MICRON_ON_DIE_UNSUPPORTED; - if (!(id[4] & MICRON_ID_ECC_ENABLED)) - return MICRON_ON_DIE_UNSUPPORTED; - ret = micron_nand_on_die_ecc_setup(chip, false); if (ret) return MICRON_ON_DIE_UNSUPPORTED; + if (!(id[4] & MICRON_ID_ECC_ENABLED)) + return MICRON_ON_DIE_UNSUPPORTED; + ret = nand_readid_op(chip, 0, id, sizeof(id)); if (ret) return MICRON_ON_DIE_UNSUPPORTED;