mirror of
https://xff.cz/git/u-boot/
synced 2025-09-01 16:52:14 +02:00
mtd: nand: Fix nand write error with bad block addresses above 32-bit
Nand writes should skip the bad blocks with "nand write" command. In case of bad blocks with above 32-bit address, nand_block_isbad() returns false due to truncated bad block address. In below code segment, if (nand_block_isbad(mtd, offset & ~(mtd->erasesize - 1))) offset is 64-bit and mtd->erasesize is 32-bit, hence the truncation is happening. Cast 'mtd->erasesize' with loff_t to fix this issue. Signed-off-by: T Karthik Reddy <t.karthik.reddy@xilinx.com> Signed-off-by: Michal Simek <michal.simek@xilinx.com>
This commit is contained in:
committed by
Tom Rini
parent
142775a52b
commit
1e2c5bb9e7
@@ -635,14 +635,14 @@ int nand_write_skip_bad(struct mtd_info *mtd, loff_t offset, size_t *length,
|
|||||||
}
|
}
|
||||||
|
|
||||||
while (left_to_write > 0) {
|
while (left_to_write > 0) {
|
||||||
|
loff_t block_start = offset & ~(loff_t)(mtd->erasesize - 1);
|
||||||
size_t block_offset = offset & (mtd->erasesize - 1);
|
size_t block_offset = offset & (mtd->erasesize - 1);
|
||||||
size_t write_size, truncated_write_size;
|
size_t write_size, truncated_write_size;
|
||||||
|
|
||||||
WATCHDOG_RESET();
|
WATCHDOG_RESET();
|
||||||
|
|
||||||
if (nand_block_isbad(mtd, offset & ~(mtd->erasesize - 1))) {
|
if (nand_block_isbad(mtd, block_start)) {
|
||||||
printf("Skip bad block 0x%08llx\n",
|
printf("Skip bad block 0x%08llx\n", block_start);
|
||||||
offset & ~(mtd->erasesize - 1));
|
|
||||||
offset += mtd->erasesize - block_offset;
|
offset += mtd->erasesize - block_offset;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user