Skip to content

Commit b4223df

Browse files
juhosggregkh
authored andcommitted
spi: spi-qpic-snand: fix calculating of ECC OOB regions' properties
[ Upstream commit 13d0fe8 ] 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: 7304d19 ("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> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent 566f60f commit b4223df

File tree

1 file changed

+14
-6
lines changed

1 file changed

+14
-6
lines changed

drivers/spi/spi-qpic-snand.c

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -216,13 +216,21 @@ static int qcom_spi_ooblayout_ecc(struct mtd_info *mtd, int section,
216216
struct qcom_nand_controller *snandc = nand_to_qcom_snand(nand);
217217
struct qpic_ecc *qecc = snandc->qspi->ecc;
218218

219-
if (section > 1)
220-
return -ERANGE;
221-
222-
oobregion->length = qecc->ecc_bytes_hw + qecc->spare_bytes;
223-
oobregion->offset = mtd->oobsize - oobregion->length;
219+
switch (section) {
220+
case 0:
221+
oobregion->offset = 0;
222+
oobregion->length = qecc->bytes * (qecc->steps - 1) +
223+
qecc->bbm_size;
224+
return 0;
225+
case 1:
226+
oobregion->offset = qecc->bytes * (qecc->steps - 1) +
227+
qecc->bbm_size +
228+
qecc->steps * 4;
229+
oobregion->length = mtd->oobsize - oobregion->offset;
230+
return 0;
231+
}
224232

225-
return 0;
233+
return -ERANGE;
226234
}
227235

228236
static int qcom_spi_ooblayout_free(struct mtd_info *mtd, int section,

0 commit comments

Comments
 (0)