Skip to content

Commit 6cb858e

Browse files
Pratyush YadavBrian Maly
authored andcommitted
Revert "mtd: spi-nor: core: replace dummy buswidth from addr to data"
[ Upstream commit d15638b ] This reverts commit 98d1fb9. 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: 98d1fb9 ("mtd: spi-nor: core: replace dummy buswidth from addr to data") Reported-by: Alexander Stein <[email protected]> Closes: https://lore.kernel.org/linux-mtd/3342163.44csPzL39Z@steina-w/ Tested-by: Alexander Stein <[email protected]> Reviewed-by: Tudor Ambarus <[email protected]> Signed-off-by: Pratyush Yadav <[email protected]> Signed-off-by: Miquel Raynal <[email protected]> Signed-off-by: Sasha Levin <[email protected]> (cherry picked from commit 37c63955ca6854091d1e8af82053d4e68412db11) FOF: 0225 Signed-off-by: Brian Maly <[email protected]>
1 parent 99e2e2a commit 6cb858e

File tree

1 file changed

+1
-1
lines changed

1 file changed

+1
-1
lines changed

drivers/mtd/spi-nor/core.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ void spi_nor_spimem_setup_op(const struct spi_nor *nor,
9090
op->addr.buswidth = spi_nor_get_protocol_addr_nbits(proto);
9191

9292
if (op->dummy.nbytes)
93-
op->dummy.buswidth = spi_nor_get_protocol_data_nbits(proto);
93+
op->dummy.buswidth = spi_nor_get_protocol_addr_nbits(proto);
9494

9595
if (op->data.nbytes)
9696
op->data.buswidth = spi_nor_get_protocol_data_nbits(proto);

0 commit comments

Comments
 (0)