]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
spi: spi-qpic-snand: fix calculating of ECC OOB regions' properties
authorGabor Juhos <j4g8y7@gmail.com>
Tue, 5 Aug 2025 16:05:42 +0000 (18:05 +0200)
committerMark Brown <broonie@kernel.org>
Thu, 7 Aug 2025 13:46:33 +0000 (14:46 +0100)
The OOB layout used by the driver has two distinct regions which contains
hardware specific ECC data, yet the qcom_spi_ooblayout_ecc() function sets
the same offset and length values for both regions which is clearly wrong.

Change the code to calculate the correct values for both regions.

For reference, the following table shows the computed offset and length
values for various OOB size/ECC strength configurations:

                              +-----------------+-----------------+
                              |before the change| after the change|
  +-------+----------+--------+--------+--------+--------+--------+
  |  OOB  |   ECC    | region | region | region | region | region |
  |  size | strength | index  | offset | length | offset | length |
  +-------+----------+--------+--------+--------+--------+--------+
  |  128  |     8    |    0   |   113  |   15   |    0   |   49   |
  |       |          |    1   |   113  |   15   |   65   |   63   |
  +-------+----------+--------+--------+--------+--------+--------+
  |  128  |     4    |    0   |   117  |   11   |    0   |   37   |
  |       |          |    1   |   117  |   11   |   53   |   75   |
  +-------+----------+--------+--------+--------+--------+--------+
  |   64  |     4    |    0   |    53  |   11   |    0   |   37   |
  |       |          |    1   |    53  |   11   |   53   |   11   |
  +-------+----------+--------+--------+--------+--------+--------+

Fixes: 7304d1909080 ("spi: spi-qpic: add driver for QCOM SPI NAND flash Interface")
Signed-off-by: Gabor Juhos <j4g8y7@gmail.com>
Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Link: https://patch.msgid.link/20250805-qpic-snand-oob-ecc-fix-v2-1-e6f811c70d6f@gmail.com
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi-qpic-snand.c

index 5216d60e01aab26f927baaea24296571a77527cb..7b76d2c82a5287df13ee6fcebc4abbe58ca861ee 100644 (file)
@@ -210,13 +210,21 @@ static int qcom_spi_ooblayout_ecc(struct mtd_info *mtd, int section,
        struct qcom_nand_controller *snandc = nand_to_qcom_snand(nand);
        struct qpic_ecc *qecc = snandc->qspi->ecc;
 
-       if (section > 1)
-               return -ERANGE;
-
-       oobregion->length = qecc->ecc_bytes_hw + qecc->spare_bytes;
-       oobregion->offset = mtd->oobsize - oobregion->length;
+       switch (section) {
+       case 0:
+               oobregion->offset = 0;
+               oobregion->length = qecc->bytes * (qecc->steps - 1) +
+                                   qecc->bbm_size;
+               return 0;
+       case 1:
+               oobregion->offset = qecc->bytes * (qecc->steps - 1) +
+                                   qecc->bbm_size +
+                                   qecc->steps * 4;
+               oobregion->length = mtd->oobsize - oobregion->offset;
+               return 0;
+       }
 
-       return 0;
+       return -ERANGE;
 }
 
 static int qcom_spi_ooblayout_free(struct mtd_info *mtd, int section,