linux/drivers/mtd
Pratyush Yadav d15638bf76 Revert "mtd: spi-nor: core: replace dummy buswidth from addr to data"
This reverts commit 98d1fb94ce.

The commit uses data nbits instead of addr nbits for dummy phase. This
causes a regression for all boards where spi-tx-bus-width is smaller
than spi-rx-bus-width. It is a common pattern for boards to have
spi-tx-bus-width == 1 and spi-rx-bus-width > 1. The regression causes
all reads with a dummy phase to become unavailable for such boards,
leading to a usually slower 0-dummy-cycle read being selected.

Most controllers' supports_op hooks call spi_mem_default_supports_op().
In spi_mem_default_supports_op(), spi_mem_check_buswidth() is called to
check if the buswidths for the op can actually be supported by the
board's wiring. This wiring information comes from (among other things)
the spi-{tx,rx}-bus-width DT properties. Based on these properties,
SPI_TX_* or SPI_RX_* flags are set by of_spi_parse_dt().
spi_mem_check_buswidth() then uses these flags to make the decision
whether an op can be supported by the board's wiring (in a way,
indirectly checking against spi-{rx,tx}-bus-width).

Now the tricky bit here is that spi_mem_check_buswidth() does:

	if (op->dummy.nbytes &&
	    spi_check_buswidth_req(mem, op->dummy.buswidth, true))
		return false;

The true argument to spi_check_buswidth_req() means the op is treated as
a TX op. For a board that has say 1-bit TX and 4-bit RX, a 4-bit dummy
TX is considered as unsupported, and the op gets rejected.

The commit being reverted uses the data buswidth for dummy buswidth. So
for reads, the RX buswidth gets used for the dummy phase, uncovering
this issue. In reality, a dummy phase is neither RX nor TX. As the name
suggests, these are just dummy cycles that send or receive no data, and
thus don't really need to have any buswidth at all.

Ideally, dummy phases should not be checked against the board's wiring
capabilities at all, and should only be sanity-checked for having a sane
buswidth value. Since we are now at rc7 and such a change might
introduce many unexpected bugs, revert the commit for now. It can be
sent out later along with the spi_mem_check_buswidth() fix.

Fixes: 98d1fb94ce ("mtd: spi-nor: core: replace dummy buswidth from addr to data")
Reported-by: Alexander Stein <alexander.stein@ew.tq-group.com>
Closes: https://lore.kernel.org/linux-mtd/3342163.44csPzL39Z@steina-w/
Tested-by: Alexander Stein <alexander.stein@ew.tq-group.com>
Reviewed-by: Tudor Ambarus <tudor.ambarus@linaro.org>
Signed-off-by: Pratyush Yadav <pratyush@kernel.org>
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
2025-01-15 18:44:23 +01:00
..
chips mtd: cfi_cmdset_0002: remove redundant assignment to variable ret 2024-10-21 11:57:43 +02:00
devices mtd: Switch back to struct platform_driver::remove() 2024-10-21 11:58:07 +02:00
hyperbus mtd: Switch back to struct platform_driver::remove() 2024-10-21 11:58:07 +02:00
lpddr mtd: Switch back to struct platform_driver::remove() 2024-10-21 11:58:07 +02:00
maps mtd: Switch back to struct platform_driver::remove() 2024-10-21 11:58:07 +02:00
nand mtd: rawnand: omap2: Fix build warnings with W=1 2024-12-05 11:15:00 +01:00
parsers mtd: parsers: bcm47xxpart: make read-only array possible_nvram_sizes static const 2024-08-23 19:25:49 +02:00
spi-nor Revert "mtd: spi-nor: core: replace dummy buswidth from addr to data" 2025-01-15 18:44:23 +01:00
tests mtd: tests: Include <linux/prandom.h> instead of <linux/random.h> 2024-10-03 18:19:52 +02:00
ubi mtd: ubi: remove redundant check on bytes_left at end of function 2024-11-14 19:54:27 +01:00
ftl.c
inftlcore.c
inftlmount.c
Kconfig
Makefile
mtd_blkdevs.c block: move the add_random flag to queue_limits 2024-06-19 07:58:28 -06:00
mtdblock_ro.c mtdblock: make warning messages ratelimited 2023-07-27 17:16:14 +02:00
mtdblock.c mtdblock: make warning messages ratelimited 2023-07-27 17:16:14 +02:00
mtdchar.c mtdchar: mark bits of ioctl handler noinline 2023-06-01 18:12:31 +02:00
mtdconcat.c mtd: concat: Use kmemdup_array instead of kmemdup for multiple allocation 2024-08-23 19:25:51 +02:00
mtdcore.c * MTD 2024-05-16 09:04:52 -07:00
mtdcore.h mtd: use refcount to prevent corruption 2023-07-12 13:30:08 +02:00
mtdoops.c mtd: mtdoops: Fix kmsgdump parameter renaming. 2024-07-22 17:56:22 +02:00
mtdpart.c mtd: mtdpart: check for subpartitions parsing result 2023-10-16 10:50:32 +02:00
mtdpstore.c
mtdsuper.c mtd: key superblock by device number 2023-08-31 12:47:15 +02:00
mtdswap.c
nftlcore.c
nftlmount.c
rfd_ftl.c
sm_ftl.c mtd: sm_ftl: Fix typos in comments 2023-06-22 23:00:43 +02:00
sm_ftl.h
ssfdc.c mtd: ssfdc: Improve a size determination in ssfdcr_add_mtd() 2024-02-05 14:22:39 +01:00