]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
mtd: spinand: macronix: Fix ECC Status Read
authorHaolin Li <li.haolin@qq.com>
Sun, 5 Sep 2021 14:41:41 +0000 (22:41 +0800)
committerJagan Teki <jagan@amarulasolutions.com>
Fri, 8 Oct 2021 12:29:34 +0000 (17:59 +0530)
According to datasheet, the upper four bits are reserved or used for
reflecting the ECC status of the accumulated pages. The error bits
number for the worst segment of the current page is encoded on lower
four bits. Fix it by masking the upper bits.

This same issue has been already fixed in the linux kernel by:
"mtd: spinand: macronix: Fix ECC Status Read"
(sha1: f4cb4d7b46f6409382fd981eec9556e1f3c1dc5d)

Apply the same fix in the U-Boot driver.

Signed-off-by: Haolin Li <li.haolin@qq.com>
Reviewed-by: Jagan Teki <jagan@amarulasolutions.com>
drivers/mtd/nand/spi/macronix.c

index f4a8e816398ae08f0aad2a76e290e9bc7731de67..6d643a8000dd6672149b10312bfea735844176ce 100644 (file)
@@ -14,6 +14,8 @@
 #include <linux/mtd/spinand.h>
 
 #define SPINAND_MFR_MACRONIX           0xC2
+#define MACRONIX_ECCSR_MASK            0x0F
+
 
 static SPINAND_OP_VARIANTS(read_cache_variants,
                SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0),
@@ -59,7 +61,13 @@ static int mx35lf1ge4ab_get_eccsr(struct spinand_device *spinand, u8 *eccsr)
                                          SPI_MEM_OP_DUMMY(1, 1),
                                          SPI_MEM_OP_DATA_IN(1, eccsr, 1));
 
-       return spi_mem_exec_op(spinand->slave, &op);
+       int ret = spi_mem_exec_op(spinand->slave, &op);
+
+       if (ret)
+               return ret;
+
+       *eccsr &= MACRONIX_ECCSR_MASK;
+       return 0;
 }
 
 static int mx35lf1ge4ab_ecc_get_status(struct spinand_device *spinand,