mtd: devices: fix mchp23k256 read and write
authorAngelo Dureghello <angelo.dureghello@timesys.com>
Wed, 30 Oct 2019 11:39:57 +0000 (12:39 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 23 Jan 2020 07:22:57 +0000 (08:22 +0100)
commit 14f89e088155314d311e4d4dd9f2b4ccaeef92b2 upstream.

Due to the use of sizeof(), command size set for the spi transfer
was wrong. Driver was sending and receiving always 1 byte less
and especially on write, it was hanging.

echo -n -e "\\x1\\x2\\x3\\x4" > /dev/mtd1

And read part too now works as expected.

hexdump -C -n16 /dev/mtd1
00000000  01 02 03 04 ab f3 ad c2  ab e3 f4 36 dd 38 04 15
00000010

Fixes: 4379075a870b ("mtd: mchp23k256: Add support for mchp23lcv1024")
Signed-off-by: Angelo Dureghello <angelo.dureghello@timesys.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/mtd/devices/mchp23k256.c

index b20d02b..77c872f 100644 (file)
@@ -64,15 +64,17 @@ static int mchp23k256_write(struct mtd_info *mtd, loff_t to, size_t len,
        struct spi_transfer transfer[2] = {};
        struct spi_message message;
        unsigned char command[MAX_CMD_SIZE];
-       int ret;
+       int ret, cmd_len;
 
        spi_message_init(&message);
 
+       cmd_len = mchp23k256_cmdsz(flash);
+
        command[0] = MCHP23K256_CMD_WRITE;
        mchp23k256_addr2cmd(flash, to, command);
 
        transfer[0].tx_buf = command;
-       transfer[0].len = mchp23k256_cmdsz(flash);
+       transfer[0].len = cmd_len;
        spi_message_add_tail(&transfer[0], &message);
 
        transfer[1].tx_buf = buf;
@@ -88,8 +90,8 @@ static int mchp23k256_write(struct mtd_info *mtd, loff_t to, size_t len,
        if (ret)
                return ret;
 
-       if (retlen && message.actual_length > sizeof(command))
-               *retlen += message.actual_length - sizeof(command);
+       if (retlen && message.actual_length > cmd_len)
+               *retlen += message.actual_length - cmd_len;
 
        return 0;
 }
@@ -101,16 +103,18 @@ static int mchp23k256_read(struct mtd_info *mtd, loff_t from, size_t len,
        struct spi_transfer transfer[2] = {};
        struct spi_message message;
        unsigned char command[MAX_CMD_SIZE];
-       int ret;
+       int ret, cmd_len;
 
        spi_message_init(&message);
 
+       cmd_len = mchp23k256_cmdsz(flash);
+
        memset(&transfer, 0, sizeof(transfer));
        command[0] = MCHP23K256_CMD_READ;
        mchp23k256_addr2cmd(flash, from, command);
 
        transfer[0].tx_buf = command;
-       transfer[0].len = mchp23k256_cmdsz(flash);
+       transfer[0].len = cmd_len;
        spi_message_add_tail(&transfer[0], &message);
 
        transfer[1].rx_buf = buf;
@@ -126,8 +130,8 @@ static int mchp23k256_read(struct mtd_info *mtd, loff_t from, size_t len,
        if (ret)
                return ret;
 
-       if (retlen && message.actual_length > sizeof(command))
-               *retlen += message.actual_length - sizeof(command);
+       if (retlen && message.actual_length > cmd_len)
+               *retlen += message.actual_length - cmd_len;
 
        return 0;
 }