Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1395518

[PATCH v7 06/10] mtd: spi-nor: check return value from write

Path csiph.com!aioe.org!bofh.it!news.nic.it!robomod
From Brian Norris <computersforpeace@gmail.com>
Newsgroups linux.kernel
Subject [PATCH v7 06/10] mtd: spi-nor: check return value from write
Date Fri, 06 May 2016 02:40:02 +0200
Message-ID <rvBYe-2li-9@gated-at.bofh.it> (permalink)
References <rvBYd-2li-3@gated-at.bofh.it>
Dkim-Signature v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=lyzmPEcJkwx33/144UQotcK4JN9/oJFBxEvD6DAbRYA=; b=XiSqCEOmBALWP6x5UspQ+ZRtOwscFqyaSm/1Aabnty0zPx7N0H6O8zqibtD9vKYDiT 12ACsjGymwvkpDk5hFOmam9hWJvUZcgu994pakWnLiURJ6lGixToLf/V0JrtJWvLXCXE joSOwBF3NIXU0u8aQs7pbg0r6ihCr1+6yIjiJPcLsznK1Nnt6v6bOvFVXwVovoKUDsBJ y2SJuC5Fe2JOxqAels5m2mzcMQUCFfcQmWG1uFVWITGx9zzMA52GRmnFaF/Cu11pr6nF uJ6910IRYivSX6YUqQMdmJ4mqx9qbT0wzS8b/d9SzV/c+lXNAhT6TACdb1TOCh51KRD4 PG1w==
X-Google-Dkim-Signature v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=lyzmPEcJkwx33/144UQotcK4JN9/oJFBxEvD6DAbRYA=; b=lFnNmxnT37aF8bdF3OYFU55XO1gl5xrxWYxgQX5qvBl/d9albWvZlum9ODXVr6Wd3Y n9JtLoc0568TTFRYyEwU4bMI5qmQKKSwFJslVdX0db4lEzPxe5cC9k2BJt64K9TLAMTZ yJDO0oUh/V6dkopJp/p3fCX558IfznfnEtH10NXx+tvHIVLkCqLF0mvTxDqvhNvmSKbH b77vWSrdBcsjCeRZ+/i6cCBkUHrDroQ8qVh1sk19586t0fo9crUloeA/8WsTQL0AYvdB qVAzhvfzyciuMX83RlaQ85QX37iDREvdT7h+SfgzGkIrPfmfKhqKHeEzBOEuIQBiiDOZ ++0Q==
X-Gm-Message-State AOPr4FWuPiGQdI60p8T5gwdF9xWSbXulohdv9ncfNbU9OTnoVLy8EWsG4TemxFuPaas2jQ==
X-Received by 10.66.65.169 with SMTP id y9mr24938242pas.102.1462494760307; Thu, 05 May 2016 17:32:40 -0700 (PDT)
X-Mailer git-send-email 2.8.0.rc3.226.g39d4020
Sender robomod@news.nic.it
List-ID <linux-kernel.vger.kernel.org>
X-Mailing-List linux-kernel@vger.kernel.org
Approved robomod@news.nic.it
Lines 119
Organization linux.* mail to news gateway
X-Original-Cc Heiner Kallweit <hkallweit1@gmail.com>, Brian Norris <computersforpeace@gmail.com>, Han Xu <han.xu@nxp.com>, Michal Suchanek <hramrach@gmail.com>, Boris Brezillon <boris.brezillon@free-electrons.com>, Javier Martinez Canillas <javier@osg.samsung.com>, Rafal Milecki <zajec5@gmail.com>, Jagan Teki <jteki@openedev.com>, "Andrew F. Davis" <afd@ti.com>, Mika Westerberg <mika.westerberg@linux.intel.com>, Gabor Juhos <juhosg@openwrt.org>, Bean Huo <beanhuo@micron.com>, linux-kernel@vger.kernel.org, Bayi Cheng <bayi.cheng@mediatek.com>, Joachim Eastwood <manabian@gmail.com>, Cyrille Pitchen <cyrille.pitchen@atmel.com>
X-Original-Date Thu, 5 May 2016 17:31:52 -0700
X-Original-Message-ID <1462494716-95312-7-git-send-email-computersforpeace@gmail.com>
X-Original-References <1462494716-95312-1-git-send-email-computersforpeace@gmail.com>
X-Original-Sender linux-kernel-owner@vger.kernel.org
Xref csiph.com linux.kernel:1395518

Show key headers only | View raw


From: Michal Suchanek <hramrach@gmail.com>

SPI NOR hardware drivers now return useful value from their write
functions so check them.

Signed-off-by: Michal Suchanek <hramrach@gmail.com>
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
---
v6 -> v7:
 * no change

 drivers/mtd/spi-nor/spi-nor.c | 45 ++++++++++++++++++++++++++++++-------------
 1 file changed, 32 insertions(+), 13 deletions(-)

diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c
index f7ffec60a460..dd5c9eb9b9e0 100644
--- a/drivers/mtd/spi-nor/spi-nor.c
+++ b/drivers/mtd/spi-nor/spi-nor.c
@@ -1062,10 +1062,14 @@ static int sst_write(struct mtd_info *mtd, loff_t to, size_t len,
 		nor->program_opcode = SPINOR_OP_BP;
 
 		/* write one byte. */
-		nor->write(nor, to, 1, retlen, buf);
+		ret = nor->write(nor, to, 1, retlen, buf);
+		if (ret < 0)
+			goto sst_write_err;
+		WARN(ret != 1, "While writing 1 byte written %i bytes\n",
+		     (int)ret);
 		ret = spi_nor_wait_till_ready(nor);
 		if (ret)
-			goto time_out;
+			goto sst_write_err;
 	}
 	to += actual;
 
@@ -1074,10 +1078,14 @@ static int sst_write(struct mtd_info *mtd, loff_t to, size_t len,
 		nor->program_opcode = SPINOR_OP_AAI_WP;
 
 		/* write two bytes. */
-		nor->write(nor, to, 2, retlen, buf + actual);
+		ret = nor->write(nor, to, 2, retlen, buf + actual);
+		if (ret < 0)
+			goto sst_write_err;
+		WARN(ret != 2, "While writing 2 bytes written %i bytes\n",
+		     (int)ret);
 		ret = spi_nor_wait_till_ready(nor);
 		if (ret)
-			goto time_out;
+			goto sst_write_err;
 		to += 2;
 		nor->sst_write_second = true;
 	}
@@ -1086,21 +1094,24 @@ static int sst_write(struct mtd_info *mtd, loff_t to, size_t len,
 	write_disable(nor);
 	ret = spi_nor_wait_till_ready(nor);
 	if (ret)
-		goto time_out;
+		goto sst_write_err;
 
 	/* Write out trailing byte if it exists. */
 	if (actual != len) {
 		write_enable(nor);
 
 		nor->program_opcode = SPINOR_OP_BP;
-		nor->write(nor, to, 1, retlen, buf + actual);
-
+		ret = nor->write(nor, to, 1, retlen, buf + actual);
+		if (ret < 0)
+			goto sst_write_err;
+		WARN(ret != 1, "While writing 1 byte written %i bytes\n",
+		     (int)ret);
 		ret = spi_nor_wait_till_ready(nor);
 		if (ret)
-			goto time_out;
+			goto sst_write_err;
 		write_disable(nor);
 	}
-time_out:
+sst_write_err:
 	spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_WRITE);
 	return ret;
 }
@@ -1129,14 +1140,18 @@ static int spi_nor_write(struct mtd_info *mtd, loff_t to, size_t len,
 
 	/* do all the bytes fit onto one page? */
 	if (page_offset + len <= nor->page_size) {
-		nor->write(nor, to, len, retlen, buf);
+		ret = nor->write(nor, to, len, retlen, buf);
+		if (ret < 0)
+			goto write_err;
 	} else {
 		/* the size of data remaining on the first page */
 		page_size = nor->page_size - page_offset;
-		nor->write(nor, to, page_size, retlen, buf);
+		ret = nor->write(nor, to, page_size, retlen, buf);
+		if (ret < 0)
+			goto write_err;
 
 		/* write everything in nor->page_size chunks */
-		for (i = page_size; i < len; i += page_size) {
+		for (i = ret; i < len; ) {
 			page_size = len - i;
 			if (page_size > nor->page_size)
 				page_size = nor->page_size;
@@ -1147,7 +1162,11 @@ static int spi_nor_write(struct mtd_info *mtd, loff_t to, size_t len,
 
 			write_enable(nor);
 
-			nor->write(nor, to + i, page_size, retlen, buf + i);
+			ret = nor->write(nor, to + i, page_size, retlen,
+					 buf + i);
+			if (ret < 0)
+				goto write_err;
+			i += ret;
 		}
 	}
 
-- 
2.8.0.rc3.226.g39d4020

Back to linux.kernel | Previous | Next | Find similar | Unroll thread


Thread

[PATCH v7 06/10] mtd: spi-nor: check return value from write Brian Norris <computersforpeace@gmail.com> - 2016-05-06 02:40 +0200

csiph-web