| From b51c7c76bbe58a06cf052f662ebd27b3ad6e3efe Mon Sep 17 00:00:00 2001 |
| From: Angelo Dureghello <angelo.dureghello@timesys.com> |
| Date: Wed, 30 Oct 2019 12:39:57 +0100 |
| Subject: [PATCH] mtd: devices: fix mchp23k256 read and write |
| |
| 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: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/mtd/devices/mchp23k256.c b/drivers/mtd/devices/mchp23k256.c |
| index b20d02b4f830..77c872fd3d83 100644 |
| --- a/drivers/mtd/devices/mchp23k256.c |
| +++ b/drivers/mtd/devices/mchp23k256.c |
| @@ -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; |
| } |
| -- |
| 2.7.4 |
| |