[PATCH 4/7] spi: spi-qpic-snand: use the common qcom_nandc_config_cw_write() function
sashiko-bot at kernel.org
sashiko-bot at kernel.org
Mon Nov 9 11:45:48 PST 2026
Thank you for your contribution! Sashiko AI review found no new issues
in this patch, but noticed 1 related pre-existing issue it does not
introduce:
- [Critical] spi: qpic-snand: improper raw OOB write handling in
qcom_spi_program_execute() [1]
--
commit 31ce15b93da7dda82ea19398b4abcc5e1c175880
Author: Gabor Juhos <j4g8y7 at gmail.com>
spi: spi-qpic-snand: use the common qcom_nandc_config_cw_write() function
This commit replaces the local qcom_spi_config_cw_write() helper with the
common qcom_nandc_config_cw_write() function from qpic_common.
> diff --git a/drivers/spi/spi-qpic-snand.c b/drivers/spi/spi-qpic-snand.c
> index a825bdb93a8a1..6774a0a5db2a7 100644
> --- a/drivers/spi/spi-qpic-snand.c
> +++ b/drivers/spi/spi-qpic-snand.c
[ ... ]
> @@ -1271,7 +1260,7 @@ static int qcom_spi_program_oob(struct qcom_nand_controller *snandc,
> oob_buf, 0, snandc->qspi->mtd->oobavail);
> qcom_nandc_config_page_write(snandc);
> qcom_write_data_dma(snandc, FLASH_BUF_ACC, snandc->data_buffer, data_size + oob_size, 0);
> - qcom_spi_config_cw_write(snandc);
> + qcom_nandc_config_cw_write(snandc);
>
> ret = qcom_submit_descs(snandc);
> if (ret) {
[Severity: Critical]
This problem wasn't introduced by this patch, but does qcom_spi_program_oob()
[1] silently discard raw OOB writes such as bad block markers from
spinand_markbad()?
spinand_markbad() issues a raw OOB write with datalen = 0, ooblen = 2, and
mode = MTD_OPS_RAW, which sets page_rw = false, oob_rw = true, and
raw_rw = true in qcom_spi_ecc_prepare_io_req_pipelined(). However,
qcom_spi_program_execute() ignores raw_rw when page_rw is false and routes
the write to qcom_spi_program_oob():
drivers/spi/spi-qpic-snand.c:qcom_spi_program_execute() {
if (snandc->qspi->page_rw && snandc->qspi->raw_rw)
return qcom_spi_program_raw(snandc, op);
if (snandc->qspi->page_rw)
return qcom_spi_program_ecc(snandc, op);
if (snandc->qspi->oob_rw)
return qcom_spi_program_oob(snandc, op);
...
}
qcom_spi_program_oob() sets oob_buf to snandc->qspi->data_buf (the start of
the page buffer rather than the OOB offset) and unconditionally enables ECC
via ecc_cfg->ecc_bch_cfg. As a result, mtd_ooblayout_get_databytes() reads
0xff instead of the bad block marker and programs it to flash with ECC
enabled, leaving defective blocks unmarked and allowing subsequent writes to
failing blocks.
[1] https://sashiko.dev/#/bug/linux-da37c243-e4f1-4870-8190-46ae2f5b3282
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261109-qpic-snand-use-common-functions-v1-0-1e8601e2db84@gmail.com?part=4
More information about the linux-mtd
mailing list