Received: by 2002:a25:b323:0:0:0:0:0 with SMTP id l35csp1221960ybj; Fri, 20 Sep 2019 07:06:36 -0700 (PDT) X-Google-Smtp-Source: APXvYqz/pLoLxTT701AlNu3ghHKDU5uFocuH8DTts/iyHBBqN8JZfh9HuIcIOql4whwV6NoQgCb7 X-Received: by 2002:aa7:cd5a:: with SMTP id v26mr18368405edw.256.1568988396544; Fri, 20 Sep 2019 07:06:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1568988396; cv=none; d=google.com; s=arc-20160816; b=A1KGKbUTaUqYWWnJsBsxyUgdRScr58cvumdDtpJ+T/cXb/i7GjDxhtoRzE5jZxUeq3 o5EqcAG3zmIu25HV0MFFhp8mrjD8WvNS6f9IeDP5wR/Oo0zZQco2ptTi4k7pg8EYDmIR VfV4oYadXtjs02A+sgbyQfmw3vcX/SbMC46TPUX3xaxRDyElupeoq8IwCE+tsHGQla7M vXLnMmK99T7GrhfJNbwjV+NlZgPa3VqN3onYhNfDe3aIzwoN44znZO8yYOHCQMirF+Xb JtQSxC9fa/k/LlYgq6m+DoVCxsOebdZ9nEnn/ZpzQzve8245l2Ly/x5QkZxTVW4sOP1U llZA== 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=SBOAlUdrjyg25Yp7tNLgvsygaEGFOdP/RYhXFPc//Sk=; b=GpxV6FCyfV8bDHmYc9p5fHjzRrX+mYJ39hIP3ofrh5DaHn6QGp55hjSbeesZ6LqNQ9 sv09Uv4cqlXGOvn8RuN980Qf3i0VIpsxbxoUYPI/bQJVUB9m+J0JrKQY4zaaODlLQz2e 2eL52hu76g+UE8+0SHl2pgXgPNQytUKFrbgQ2ihekPUtxS7sPLkFcKeYVJpj6PEWHKU/ nPOl8QKhOEhspOveZibtV/Yga1loZrLN9WjPTCxzC9RBHlA24nvdtFac6xY0T4u7FpEm FMPjEg5+L1pHGZKNkd3xSbAGj9hmK3KnvNNYH3uN8RYLQTl7vtiyxqOXdhh0c9aodoTX Fehw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=xHvw5w0s; 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 j35si1611163eda.144.2019.09.20.07.06.13; Fri, 20 Sep 2019 07:06:36 -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=xHvw5w0s; 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 S2406620AbfISWTG (ORCPT + 99 others); Thu, 19 Sep 2019 18:19:06 -0400 Received: from mail.kernel.org ([198.145.29.99]:60882 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2390275AbfISWTE (ORCPT ); Thu, 19 Sep 2019 18:19:04 -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 5C2E521924; Thu, 19 Sep 2019 22:19:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1568931542; bh=nMVcyCBO+pu2YgbD35jIQJZ5asTgAX/Y8u6irtWayIg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=xHvw5w0s9V34//do5Lkj7HG6WrufFkeQkZOajDHsBO/c48+rypQH+n5VEBQB4aWlT XdwNoH4lDO/Z1akxGu/9qB/H4tLx+7eZe7qzbSQMHAExWc3jnFMsgqRmNncHjjN8KE NQXY6x8HUnch7HDdbTkfL488dgXdyNiHxDNJOGj4= 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.9 24/74] mtd: rawnand: mtk: Fix wrongly assigned OOB buffer pointer issue Date: Fri, 20 Sep 2019 00:03:37 +0200 Message-Id: <20190919214807.117496666@linuxfoundation.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20190919214800.519074117@linuxfoundation.org> References: <20190919214800.519074117@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/mtk_nand.c | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) --- a/drivers/mtd/nand/mtk_nand.c +++ b/drivers/mtd/nand/mtk_nand.c @@ -810,19 +810,21 @@ static int mtk_nfc_write_oob_std(struct return ret & NAND_STATUS_FAIL ? -EIO : 0; } -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; } @@ -842,7 +844,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; @@ -910,14 +912,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);