Backport upstream solution for working around SPI controller maximum message sizes. Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com>
		
			
				
	
	
		
			55 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			55 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
From 26f9bcad29a6c240881bd4efc90f16a9990dd6c2 Mon Sep 17 00:00:00 2001
 | 
						|
From: Michal Suchanek <hramrach@gmail.com>
 | 
						|
Date: Thu, 5 May 2016 17:31:55 -0700
 | 
						|
Subject: [PATCH 09/10] mtd: spi-nor: add read loop
 | 
						|
 | 
						|
mtdblock and ubi do not handle the situation when read returns less data
 | 
						|
than requested. Loop in spi-nor until buffer is filled or an error is
 | 
						|
returned.
 | 
						|
 | 
						|
Signed-off-by: Michal Suchanek <hramrach@gmail.com>
 | 
						|
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
 | 
						|
Tested-by Cyrille Pitchen <cyrille.pitchen@atmel.com>
 | 
						|
Acked-by: Michal Suchanek <hramrach@gmail.com>
 | 
						|
Tested-by: Michal Suchanek <hramrach@gmail.com>
 | 
						|
---
 | 
						|
 drivers/mtd/spi-nor/spi-nor.c | 25 +++++++++++++++++++------
 | 
						|
 1 file changed, 19 insertions(+), 6 deletions(-)
 | 
						|
 | 
						|
--- a/drivers/mtd/spi-nor/spi-nor.c
 | 
						|
+++ b/drivers/mtd/spi-nor/spi-nor.c
 | 
						|
@@ -890,14 +890,27 @@ static int spi_nor_read(struct mtd_info
 | 
						|
 	if (ret)
 | 
						|
 		return ret;
 | 
						|
 
 | 
						|
-	ret = nor->read(nor, from, len, buf);
 | 
						|
+	while (len) {
 | 
						|
+		ret = nor->read(nor, from, len, buf);
 | 
						|
+		if (ret == 0) {
 | 
						|
+			/* We shouldn't see 0-length reads */
 | 
						|
+			ret = -EIO;
 | 
						|
+			goto read_err;
 | 
						|
+		}
 | 
						|
+		if (ret < 0)
 | 
						|
+			goto read_err;
 | 
						|
 
 | 
						|
-	spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_READ);
 | 
						|
-	if (ret < 0)
 | 
						|
-		return ret;
 | 
						|
+		WARN_ON(ret > len);
 | 
						|
+		*retlen += ret;
 | 
						|
+		buf += ret;
 | 
						|
+		from += ret;
 | 
						|
+		len -= ret;
 | 
						|
+	}
 | 
						|
+	ret = 0;
 | 
						|
 
 | 
						|
-	*retlen += ret;
 | 
						|
-	return 0;
 | 
						|
+read_err:
 | 
						|
+	spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_READ);
 | 
						|
+	return ret;
 | 
						|
 }
 | 
						|
 
 | 
						|
 static int sst_write(struct mtd_info *mtd, loff_t to, size_t len,
 |