Realtek ECC engine (was NAND errors)

markus.stockhausen at gmx.de markus.stockhausen at gmx.de
Mon Aug 11 06:58:56 PDT 2025


Hi Miquel,

on the weekend I was able to hack together a very basic working version of 
the Realtek ECC engine. See https://github.com/openwrt/openwrt/pull/19746
Until now I was only focused on the devices that are available for testing 
(Linksys LGS328C & LGS352C). Driver can now handle exactly the identified 
data layout:

- 2048 bytes data (4*512 bytes)
- 64 bytes OOB consisting of
  - 4*6 bytes tag
  - 4*10 bytes ECC

There are two things I do not yet understand:

1. Interaction between request handling and mtd_ooblayout_ops. For now I 
simply take the request data & oob buffers and put data where it "seems"
right.

2. The hardware does a lot of good things. It returns ok/errors/bitflips
and I can simply pass them back. But how do I tell the upper layers that
4 bitflips are getting close to the 6 bits the engine can handle. Is it
in the driver or DTS? That currently reads.

soc: soc {
	compatible = "simple-bus";
	#address-cells = <1>;
	#size-cells = <1>;
	ranges = <0x0 0x18000000 0x20000>;

	ecc0: ecc at 1a600 {
		status = "okay";
		compatible = "realtek,nand-ecc-engine";
		reg = <0x1a600 0x54>;
	};	

	snand: spi at 1a400 {
		compatible = "realtek,rtl9301-snand";
		reg = <0x1a400 0x44>;
		interrupt-parent = <&intc>;
		interrupts = <19 2>;
		clocks = <&lx_clk>;
		#address-cells = <1>;
		#size-cells = <0>;	
		status = "okay";

		flash at 0 {
			compatible = "spi-nand";
			reg = <0>;
			nand-ecc-engine = <&ecc0>;
			partitions {
				compatible = "fixed-partitions";

Thanks in advance.

Markus




More information about the linux-mtd mailing list