mtd: spi-nor: Remove recently added nor->addr_width == 3 test

Remove undocumented nor->addr_width == 3 test. This was added in commit
5d40b3d384 ("mtd: spi-nor: Add parallel and stacked memories support")
without any explanation in the commit message. Remove it.

This also has a bad side-effect which breaks READ operation of every SPI NOR
which does not use addr_width == 3, e.g. s25fs512s does not work at all. This
is because if addr_width != 3, rem_bank_len is always 0, and if rem_bank_len
is 0, then read_len is 0 and if read_len is 0, then the spi_nor_read() returns
-EIO.

Basic reproducer is as follows:
"
=> sf probe ; sf read 0x50000000 0 0x10000
SF: Detected s25fs512s with page size 256 Bytes, erase size 256 KiB, total 64 MiB
device 0 offset 0x0, size 0x10000
SF: 65536 bytes @ 0x0 Read: ERROR -5
"

Fixes: 5d40b3d384 ("mtd: spi-nor: Add parallel and stacked memories support")
Signed-off-by: Marek Vasut <marek.vasut+renesas@mailbox.org>
This commit is contained in:
Marek Vasut 2024-10-26 22:16:18 +02:00 committed by Tom Rini
parent 8963d433eb
commit 19e189b1de

View file

@ -1595,16 +1595,14 @@ static int spi_nor_read(struct mtd_info *mtd, loff_t from, size_t len,
} }
while (len) { while (len) {
if (nor->addr_width == 3) {
if (nor->flags & SNOR_F_HAS_PARALLEL) { if (nor->flags & SNOR_F_HAS_PARALLEL) {
bank = (u32)from / (SZ_16M << 0x01); bank = (u32)from / (SZ_16M << 0x01);
rem_bank_len = ((SZ_16M << 0x01) * rem_bank_len = ((SZ_16M << 0x01) * (bank + 1)) - from;
(bank + 1)) - from;
} else { } else {
bank = (u32)from / SZ_16M; bank = (u32)from / SZ_16M;
rem_bank_len = (SZ_16M * (bank + 1)) - from; rem_bank_len = (SZ_16M * (bank + 1)) - from;
} }
}
offset = from; offset = from;
if (nor->flags & SNOR_F_HAS_STACKED) { if (nor->flags & SNOR_F_HAS_STACKED) {
@ -1619,13 +1617,11 @@ static int spi_nor_read(struct mtd_info *mtd, loff_t from, size_t len,
if (nor->flags & SNOR_F_HAS_PARALLEL) if (nor->flags & SNOR_F_HAS_PARALLEL)
offset /= 2; offset /= 2;
if (nor->addr_width == 3) {
#ifdef CONFIG_SPI_FLASH_BAR #ifdef CONFIG_SPI_FLASH_BAR
ret = write_bar(nor, offset); ret = write_bar(nor, offset);
if (ret < 0) if (ret < 0)
return log_ret(ret); return log_ret(ret);
#endif #endif
}
if (len < rem_bank_len) if (len < rem_bank_len)
read_len = len; read_len = len;
@ -2012,13 +2008,12 @@ static int spi_nor_write(struct mtd_info *mtd, loff_t to, size_t len,
} }
} }
if (nor->addr_width == 3) {
#ifdef CONFIG_SPI_FLASH_BAR #ifdef CONFIG_SPI_FLASH_BAR
ret = write_bar(nor, offset); ret = write_bar(nor, offset);
if (ret < 0) if (ret < 0)
return ret; return ret;
#endif #endif
}
/* the size of data remaining on the first page */ /* the size of data remaining on the first page */
page_remain = min_t(size_t, page_remain = min_t(size_t,
nor->page_size - page_offset, len - i); nor->page_size - page_offset, len - i);