mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-01 22:54:01 +00:00
mtd: devices: fix mchp23k256 read and write
commit14f89e0881
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:4379075a87
("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>
This commit is contained in:
parent
a5278ac54c
commit
5bebd8dbc5
1 changed files with 12 additions and 8 deletions
|
@ -68,15 +68,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;
|
||||
|
@ -92,8 +94,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;
|
||||
}
|
||||
|
@ -105,16 +107,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;
|
||||
|
@ -130,8 +134,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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue