Received: by 2002:a25:c593:0:0:0:0:0 with SMTP id v141csp6238712ybe; Tue, 17 Sep 2019 23:35:13 -0700 (PDT) X-Google-Smtp-Source: APXvYqw7gvy4aRxosbfstSmhVX1vmnDdU2fU55MRM/r+YwLCLpefs0Uo3aWHw7ze5I98QzcbTIff X-Received: by 2002:a17:906:9498:: with SMTP id t24mr7873325ejx.88.1568788513743; Tue, 17 Sep 2019 23:35:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1568788513; cv=none; d=google.com; s=arc-20160816; b=d8jGYDsyazYArzC/reBEGm81xiap96FaeWjmo7PTCM3C6h42lFP3nU483MNTNnLQJ0 Eti/EUK9DXujqOPRrgVGLakSLcB7R3ncasxrbd4MIDct8R2Wl+NU+Wz51eLGurepjjo8 FrGiGRozU+i8SHN8bRt8GRAKR2xYz+KRiaDgqZkH4lOSV63qjuLWxLa4L+A8XEgB7l3a t1KNZEBrhQwkoiQJFLN3tifl4F01rh2jIBJlXeR8teVwbBDnOb/+yLp9lvUOX3JzMmHg uJjnlFWhGswfpv3HFUifdiTSe2xk7payFq4cXvNivHzQf9Km3adn/IijicoxtOcvdMME vD+w== 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=yXkfqNkdtYUOwyRm5PMeKElJHA6sYl4LAl0R+rfn56Y=; b=FxTWRlJElhH7oyY5RR6gOxyhEGYYUzVchzNmpbUFkxne53ksQYVmfz05gZtGprQpxL omhOEtmrEiE9uiJJxjA3SmFoPd+3CPjrqRw79v0PuYw6A0zmyPFjwrvXm5AR4xlPN2N5 ygSgRZpOGtI6e0nuDZPQzZZUZ0M4FYuzDBJyyqsNNcHVT7C10WGJ6cYT7BPp7SY/rrVV 5MPXV4UAaGRTSj+/smscxZAkgdmEcaDDnANYz2zSCfYR4IWXBSD9KIprrgsbm4B+SXA+ axl6sDoLDnJjVcOHdQWOfjWlo0Ts5F/RMGCncECng2OCQEexRhLBv2Y0D4jTG5BE2Mwf rh6g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=WJnuDQjg; 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 w5si2866635edf.283.2019.09.17.23.34.50; Tue, 17 Sep 2019 23:35:13 -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=WJnuDQjg; 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 S1729744AbfIRGYA (ORCPT + 99 others); Wed, 18 Sep 2019 02:24:00 -0400 Received: from mail.kernel.org ([198.145.29.99]:44324 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727421AbfIRGX6 (ORCPT ); Wed, 18 Sep 2019 02:23:58 -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 0211321929; Wed, 18 Sep 2019 06:23:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1568787837; bh=mA0vg0jba1T63CeD1iqKyFizmayMalP7+5b33Fz/414=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=WJnuDQjguVZT0NyChNSEdHC4jqM0wp8m+A3yyxcqF+rhriPl8tX1o0CteJrlg9h1l CPYNn7a2C7NUzrU2aE98g11Mxagb3anGZgJT8vQfF0Pty1t3QzXvDyTignEJEVJCD8 Kfym84vDQrbuCxTdBW5YYOCZ1KUaUyDAQp/Bgr60= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Xiaolei Li , Miquel Raynal Subject: [PATCH 4.19 29/50] mtd: rawnand: mtk: Fix wrongly assigned OOB buffer pointer issue Date: Wed, 18 Sep 2019 08:19:12 +0200 Message-Id: <20190918061226.576830266@linuxfoundation.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20190918061223.116178343@linuxfoundation.org> References: <20190918061223.116178343@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: Xiaolei Li commit 336d4b138be2dad372b67a2388e42805c48aaa38 upstream. One main goal of the function mtk_nfc_update_ecc_stats is to check whether sectors are all empty. If they are empty, set these sectors's data buffer and OOB buffer as 0xff. But now, the sector OOB buffer pointer is wrongly assigned. We always do memset from sector 0. To fix this issue, pass start sector number to make OOB buffer pointer be properly assigned. Fixes: 1d6b1e464950 ("mtd: mediatek: driver for MTK Smart Device") Signed-off-by: Xiaolei Li Reviewed-by: Miquel Raynal Signed-off-by: Miquel Raynal Signed-off-by: Greg Kroah-Hartman --- drivers/mtd/nand/raw/mtk_nand.c | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) --- a/drivers/mtd/nand/raw/mtk_nand.c +++ b/drivers/mtd/nand/raw/mtk_nand.c @@ -863,19 +863,21 @@ static int mtk_nfc_write_oob_std(struct return mtk_nfc_write_page_raw(mtd, chip, NULL, 1, page); } -static int mtk_nfc_update_ecc_stats(struct mtd_info *mtd, u8 *buf, u32 sectors) +static int mtk_nfc_update_ecc_stats(struct mtd_info *mtd, u8 *buf, u32 start, + u32 sectors) { struct nand_chip *chip = mtd_to_nand(mtd); struct mtk_nfc *nfc = nand_get_controller_data(chip); struct mtk_nfc_nand_chip *mtk_nand = to_mtk_nand(chip); struct mtk_ecc_stats stats; + u32 reg_size = mtk_nand->fdm.reg_size; int rc, i; rc = nfi_readl(nfc, NFI_STA) & STA_EMP_PAGE; if (rc) { memset(buf, 0xff, sectors * chip->ecc.size); for (i = 0; i < sectors; i++) - memset(oob_ptr(chip, i), 0xff, mtk_nand->fdm.reg_size); + memset(oob_ptr(chip, start + i), 0xff, reg_size); return 0; } @@ -895,7 +897,7 @@ static int mtk_nfc_read_subpage(struct m u32 spare = mtk_nand->spare_per_sector; u32 column, sectors, start, end, reg; dma_addr_t addr; - int bitflips; + int bitflips = 0; size_t len; u8 *buf; int rc; @@ -962,14 +964,11 @@ static int mtk_nfc_read_subpage(struct m if (rc < 0) { dev_err(nfc->dev, "subpage done timeout\n"); bitflips = -EIO; - } else { - bitflips = 0; - if (!raw) { - rc = mtk_ecc_wait_done(nfc->ecc, ECC_DECODE); - bitflips = rc < 0 ? -ETIMEDOUT : - mtk_nfc_update_ecc_stats(mtd, buf, sectors); - mtk_nfc_read_fdm(chip, start, sectors); - } + } else if (!raw) { + rc = mtk_ecc_wait_done(nfc->ecc, ECC_DECODE); + bitflips = rc < 0 ? -ETIMEDOUT : + mtk_nfc_update_ecc_stats(mtd, buf, start, sectors); + mtk_nfc_read_fdm(chip, start, sectors); } dma_unmap_single(nfc->dev, addr, len, DMA_FROM_DEVICE);