41 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			41 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
From: Tim Harvey <tharvey@gateworks.com>
 | 
						|
Subject: mtd: allow partial block unlock
 | 
						|
 | 
						|
This allows sysupgrade for devices such as the Gateworks Avila/Cambria
 | 
						|
product families based on the ixp4xx using the redboot bootloader with
 | 
						|
combined FIS directory and RedBoot config partitions on larger FLASH
 | 
						|
devices with larger eraseblocks.
 | 
						|
 | 
						|
This second iteration of this patch addresses previous issues:
 | 
						|
- whitespace breakage fixed
 | 
						|
- unlock in all scenarios
 | 
						|
- simplification and fix logic bug
 | 
						|
 | 
						|
[john@phrozen.org: this should be moved to the ixp4xx folder]
 | 
						|
 | 
						|
Signed-off-by: Tim Harvey <tharvey@gateworks.com>
 | 
						|
---
 | 
						|
 drivers/mtd/mtdpart.c | 11 ++++++++++-
 | 
						|
 1 file changed, 10 insertions(+), 1 deletion(-)
 | 
						|
 | 
						|
--- a/drivers/mtd/mtdpart.c
 | 
						|
+++ b/drivers/mtd/mtdpart.c
 | 
						|
@@ -357,7 +357,16 @@ static int part_lock(struct mtd_info *mt
 | 
						|
 static int part_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
 | 
						|
 {
 | 
						|
 	struct mtd_part *part = mtd_to_part(mtd);
 | 
						|
-	return part->parent->_unlock(part->parent, ofs + part->offset, len);
 | 
						|
+
 | 
						|
+	ofs += part->offset;
 | 
						|
+
 | 
						|
+	if (mtd->flags & MTD_ERASE_PARTIAL) {
 | 
						|
+		/* round up len to next erasesize and round down offset to prev block */
 | 
						|
+		len = (mtd_div_by_eb(len, part->parent) + 1) * part->parent->erasesize;
 | 
						|
+		ofs &= ~(part->parent->erasesize - 1);
 | 
						|
+	}
 | 
						|
+
 | 
						|
+	return part->parent->_unlock(part->parent, ofs, len);
 | 
						|
 }
 | 
						|
 
 | 
						|
 static int part_is_locked(struct mtd_info *mtd, loff_t ofs, uint64_t len)
 |