mirror of
https://github.com/LiBwrt-op/openwrt-6.x.git
synced 2025-12-16 16:57:28 +00:00
This patch series greatly improve airoha snfi driver and fix a number of serious bugs. Fixed bugs: * Fix reading/writing of flashes with more than one plane per lun * Fill the buffer with 0xff before writing * Fix reading of flashes supporting continuous reading mode * Fix error paths Improvements: * Add support of dual/quad wires spi modes in exec_op(). This also fix flash reading/writing if dirmap can't be created. * Support of dualio/quadio flash reading commands Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy@iopsys.eu> Link: https://github.com/openwrt/openwrt/pull/20295 Signed-off-by: Robert Marko <robimarko@gmail.com>
103 lines
3.7 KiB
Diff
103 lines
3.7 KiB
Diff
From d8a0a67bf75c4cf2a760b6fa0002b0baff6e8b20 Mon Sep 17 00:00:00 2001
|
|
From: Mikhail Kshevetskiy <mikhail.kshevetskiy@iopsys.eu>
|
|
Date: Mon, 11 Aug 2025 20:32:40 +0300
|
|
Subject: [PATCH v6 06/13] spi: airoha: fix reading/writing of flashes with
|
|
more than one plane per lun
|
|
|
|
Attaching UBI on the flash with more than one plane per lun will lead to
|
|
the following error:
|
|
|
|
[ 2.980989] spi-nand spi0.0: Micron SPI NAND was found.
|
|
[ 2.986309] spi-nand spi0.0: 256 MiB, block size: 128 KiB, page size: 2048, OOB size: 128
|
|
[ 2.994978] 2 fixed-partitions partitions found on MTD device spi0.0
|
|
[ 3.001350] Creating 2 MTD partitions on "spi0.0":
|
|
[ 3.006159] 0x000000000000-0x000000020000 : "bl2"
|
|
[ 3.011663] 0x000000020000-0x000010000000 : "ubi"
|
|
...
|
|
[ 6.391748] ubi0: attaching mtd1
|
|
[ 6.412545] ubi0 error: ubi_attach: PEB 0 contains corrupted VID header, and the data does not contain all 0xFF
|
|
[ 6.422677] ubi0 error: ubi_attach: this may be a non-UBI PEB or a severe VID header corruption which requires manual inspection
|
|
[ 6.434249] Volume identifier header dump:
|
|
[ 6.438349] magic 55424923
|
|
[ 6.441482] version 1
|
|
[ 6.444007] vol_type 0
|
|
[ 6.446539] copy_flag 0
|
|
[ 6.449068] compat 0
|
|
[ 6.451594] vol_id 0
|
|
[ 6.454120] lnum 1
|
|
[ 6.456651] data_size 4096
|
|
[ 6.459442] used_ebs 1061644134
|
|
[ 6.462748] data_pad 0
|
|
[ 6.465274] sqnum 0
|
|
[ 6.467805] hdr_crc 61169820
|
|
[ 6.470943] Volume identifier header hexdump:
|
|
[ 6.475308] hexdump of PEB 0 offset 4096, length 126976
|
|
[ 6.507391] ubi0 warning: ubi_attach: valid VID header but corrupted EC header at PEB 4
|
|
[ 6.515415] ubi0 error: ubi_compare_lebs: unsupported on-flash UBI format
|
|
[ 6.522222] ubi0 error: ubi_attach_mtd_dev: failed to attach mtd1, error -22
|
|
[ 6.529294] UBI error: cannot attach mtd1
|
|
|
|
Non dirmap reading works good. Looking to spi_mem_no_dirmap_read() code we'll see:
|
|
|
|
static ssize_t spi_mem_no_dirmap_read(struct spi_mem_dirmap_desc *desc,
|
|
u64 offs, size_t len, void *buf)
|
|
{
|
|
struct spi_mem_op op = desc->info.op_tmpl;
|
|
int ret;
|
|
|
|
// --- see here ---
|
|
op.addr.val = desc->info.offset + offs;
|
|
//-----------------
|
|
op.data.buf.in = buf;
|
|
op.data.nbytes = len;
|
|
ret = spi_mem_adjust_op_size(desc->mem, &op);
|
|
if (ret)
|
|
return ret;
|
|
|
|
ret = spi_mem_exec_op(desc->mem, &op);
|
|
if (ret)
|
|
return ret;
|
|
|
|
return op.data.nbytes;
|
|
}
|
|
|
|
The similar happens for spi_mem_no_dirmap_write(). Thus the address
|
|
passed to the flash should take in the account the value of
|
|
desc->info.offset.
|
|
|
|
This patch fix dirmap reading/writing of flashes with more than one
|
|
plane per lun.
|
|
|
|
Fixes: a403997c12019 ("spi: airoha: add SPI-NAND Flash controller driver")
|
|
Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy@iopsys.eu>
|
|
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
|
|
---
|
|
drivers/spi/spi-airoha-snfi.c | 9 ++++++---
|
|
1 file changed, 6 insertions(+), 3 deletions(-)
|
|
|
|
--- a/drivers/spi/spi-airoha-snfi.c
|
|
+++ b/drivers/spi/spi-airoha-snfi.c
|
|
@@ -726,8 +726,9 @@ static ssize_t airoha_snand_dirmap_read(
|
|
if (err)
|
|
goto error_dma_unmap;
|
|
|
|
- /* set read addr */
|
|
- err = regmap_write(as_ctrl->regmap_nfi, REG_SPI_NFI_RD_CTL3, 0x0);
|
|
+ /* set read addr: zero page offset + descriptor read offset */
|
|
+ err = regmap_write(as_ctrl->regmap_nfi, REG_SPI_NFI_RD_CTL3,
|
|
+ desc->info.offset);
|
|
if (err)
|
|
goto error_dma_unmap;
|
|
|
|
@@ -860,7 +861,9 @@ static ssize_t airoha_snand_dirmap_write
|
|
if (err)
|
|
goto error_dma_unmap;
|
|
|
|
- err = regmap_write(as_ctrl->regmap_nfi, REG_SPI_NFI_PG_CTL2, 0x0);
|
|
+ /* set write addr: zero page offset + descriptor write offset */
|
|
+ err = regmap_write(as_ctrl->regmap_nfi, REG_SPI_NFI_PG_CTL2,
|
|
+ desc->info.offset);
|
|
if (err)
|
|
goto error_dma_unmap;
|
|
|