]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
mtd: spinand: gigadevice: Fix the get ecc status issue
authorHan Xu <han.xu@nxp.com>
Wed, 8 Nov 2023 15:07:01 +0000 (09:07 -0600)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 6 Mar 2024 14:37:48 +0000 (14:37 +0000)
[ Upstream commit 59950610c0c00c7a06d8a75d2ee5d73dba4274cf ]

Some GigaDevice ecc_get_status functions use on-stack buffer for
spi_mem_op causes spi_mem_check_op failing, fix the issue by using
spinand scratchbuf.

Fixes: c40c7a990a46 ("mtd: spinand: Add support for GigaDevice GD5F1GQ4UExxG")
Signed-off-by: Han Xu <han.xu@nxp.com>
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
Link: https://lore.kernel.org/linux-mtd/20231108150701.593912-1-han.xu@nxp.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/mtd/nand/spi/gigadevice.c

index 1dd1c589809341734d98fb3ebb1eca0be8c91d3a..313fd45174dd55426db780ea27f6bd9eb389b1d2 100644 (file)
@@ -170,7 +170,7 @@ static int gd5fxgq4uexxg_ecc_get_status(struct spinand_device *spinand,
 {
        u8 status2;
        struct spi_mem_op op = SPINAND_GET_FEATURE_OP(GD5FXGQXXEXXG_REG_STATUS2,
-                                                     &status2);
+                                                     spinand->scratchbuf);
        int ret;
 
        switch (status & STATUS_ECC_MASK) {
@@ -191,6 +191,7 @@ static int gd5fxgq4uexxg_ecc_get_status(struct spinand_device *spinand,
                 * report the maximum of 4 in this case
                 */
                /* bits sorted this way (3...0): ECCS1,ECCS0,ECCSE1,ECCSE0 */
+               status2 = *(spinand->scratchbuf);
                return ((status & STATUS_ECC_MASK) >> 2) |
                        ((status2 & STATUS_ECC_MASK) >> 4);
 
@@ -212,7 +213,7 @@ static int gd5fxgq5xexxg_ecc_get_status(struct spinand_device *spinand,
 {
        u8 status2;
        struct spi_mem_op op = SPINAND_GET_FEATURE_OP(GD5FXGQXXEXXG_REG_STATUS2,
-                                                     &status2);
+                                                     spinand->scratchbuf);
        int ret;
 
        switch (status & STATUS_ECC_MASK) {
@@ -232,6 +233,7 @@ static int gd5fxgq5xexxg_ecc_get_status(struct spinand_device *spinand,
                 * 1 ... 4 bits are flipped (and corrected)
                 */
                /* bits sorted this way (1...0): ECCSE1, ECCSE0 */
+               status2 = *(spinand->scratchbuf);
                return ((status2 & STATUS_ECC_MASK) >> 4) + 1;
 
        case STATUS_ECC_UNCOR_ERROR: