Skip to content

Commit f1d388f

Browse files
tq-schiffernbroonie
authored andcommitted
spi: cadence-quadspi: fix incorrect supports_op() return value
Since the conversion to spi-mem, the driver advertised support for various operations that cqspi_set_protocol() was never expected to handle correctly - in particuar all non-DTR operations with command or address buswidth > 1. For DTR, all operations except for 8-8-8 would fail, as cqspi_set_protocol() returns -EINVAL. In non-DTR mode, this resulted in data corruption for SPI-NOR flashes that support such operations. As a minimal fix that can be backported to stable kernels, simply disallow the unsupported operations again to avoid this issue. Fixes: a314f63 ("mtd: spi-nor: Convert cadence-quadspi to use spi-mem framework") Signed-off-by: Matthias Schiffer <matthias.schiffer@ew.tq-group.com> Link: https://lore.kernel.org/r/20220406132832.199777-1-matthias.schiffer@ew.tq-group.com Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent 299d8b7 commit f1d388f

1 file changed

Lines changed: 17 additions & 2 deletions

File tree

drivers/spi/spi-cadence-quadspi.c

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1415,9 +1415,24 @@ static bool cqspi_supports_mem_op(struct spi_mem *mem,
14151415
all_false = !op->cmd.dtr && !op->addr.dtr && !op->dummy.dtr &&
14161416
!op->data.dtr;
14171417

1418-
/* Mixed DTR modes not supported. */
1419-
if (!(all_true || all_false))
1418+
if (all_true) {
1419+
/* Right now we only support 8-8-8 DTR mode. */
1420+
if (op->cmd.nbytes && op->cmd.buswidth != 8)
1421+
return false;
1422+
if (op->addr.nbytes && op->addr.buswidth != 8)
1423+
return false;
1424+
if (op->data.nbytes && op->data.buswidth != 8)
1425+
return false;
1426+
} else if (all_false) {
1427+
/* Only 1-1-X ops are supported without DTR */
1428+
if (op->cmd.nbytes && op->cmd.buswidth > 1)
1429+
return false;
1430+
if (op->addr.nbytes && op->addr.buswidth > 1)
1431+
return false;
1432+
} else {
1433+
/* Mixed DTR modes are not supported. */
14201434
return false;
1435+
}
14211436

14221437
return spi_mem_default_supports_op(mem, op);
14231438
}

0 commit comments

Comments
 (0)