5b1dee3eb198e8eb7a933bf3b93afcb632564862
[openwrt/staging/xback.git] /
1 From: Gabor Juhos <j4g8y7@gmail.com>
2 Date: Fri, 02 May 2025 21:31:17 +0200
3 Subject: [PATCH next 2/2] spi: spi-qpic-snand: add support for 8 bits ECC
4 strength
5
6 Even though the hardware supports 8 bits ECC strength, but that is not
7 handled in the driver yet. This change adds the missing bits in order
8 to allow using the driver with chips which require 8 bits ECC strength.
9
10 No functional changes intended with regard to the existing 4 bits ECC
11 strength support.
12
13 Tested on an IPQ9574 platform using a GigaDevice GD5F2GM7REYIG chip.
14
15 Signed-off-by: Gabor Juhos <j4g8y7@gmail.com>
16 ---
17 mtdtest results:
18
19 # dmesg | grep nand
20 [ 0.678143] spi-nand spi0.0: GigaDevice SPI NAND was found.
21 [ 0.687393] spi-nand spi0.0: 256 MiB, block size: 128 KiB, page size: 2048, OOB size: 128
22 # cat /proc/mtd
23 dev: size erasesize name
24 mtd0: 10000000 00020000 "spi0.0"
25 # insmod mtd_test
26 # insmod mtd_speedtest dev=0
27 [ 63.128425]
28 [ 63.128452] =================================================
29 [ 63.128979] mtd_speedtest: MTD device: 0
30 [ 63.134622] mtd_speedtest: MTD device size 268435456, eraseblock size 131072, page size 2048, count of eraseblocks 2048, pages per eraseblock 64, OOB size 128
31 [ 63.139561] mtd_test: scanning for bad eraseblocks
32 [ 63.756447] mtd_test: scanned 2048 eraseblocks, 0 are bad
33 [ 71.085514] mtd_speedtest: testing eraseblock write speed
34 [ 202.745977] mtd_speedtest: eraseblock write speed is 1991 KiB/s
35 [ 202.746022] mtd_speedtest: testing eraseblock read speed
36 [ 284.104591] mtd_speedtest: eraseblock read speed is 3222 KiB/s
37 [ 291.405533] mtd_speedtest: testing page write speed
38 [ 422.516341] mtd_speedtest: page write speed is 1999 KiB/s
39 [ 422.516384] mtd_speedtest: testing page read speed
40 [ 504.144630] mtd_speedtest: page read speed is 3211 KiB/s
41 [ 511.476726] mtd_speedtest: testing 2 page write speed
42 [ 643.114443] mtd_speedtest: 2 page write speed is 1991 KiB/s
43 [ 643.114485] mtd_speedtest: testing 2 page read speed
44 [ 724.434752] mtd_speedtest: 2 page read speed is 3223 KiB/s
45 [ 724.434796] mtd_speedtest: Testing erase speed
46 [ 731.792729] mtd_speedtest: erase speed is 35648 KiB/s
47 [ 731.792772] mtd_speedtest: Testing 2x multi-block erase speed
48 [ 739.162513] mtd_speedtest: 2x multi-block erase speed is 35589 KiB/s
49 [ 739.162558] mtd_speedtest: Testing 4x multi-block erase speed
50 [ 746.486241] mtd_speedtest: 4x multi-block erase speed is 35820 KiB/s
51 [ 746.486287] mtd_speedtest: Testing 8x multi-block erase speed
52 [ 753.789683] mtd_speedtest: 8x multi-block erase speed is 35919 KiB/s
53 [ 753.789728] mtd_speedtest: Testing 16x multi-block erase speed
54 [ 761.093075] mtd_speedtest: 16x multi-block erase speed is 35920 KiB/s
55 [ 761.093120] mtd_speedtest: Testing 32x multi-block erase speed
56 [ 768.396145] mtd_speedtest: 32x multi-block erase speed is 35922 KiB/s
57 [ 768.396222] mtd_speedtest: Testing 64x multi-block erase speed
58 [ 775.699819] mtd_speedtest: 64x multi-block erase speed is 35918 KiB/s
59 [ 775.699863] mtd_speedtest: finished
60 [ 775.705259] =================================================
61 # insmod mtd_readtest dev=0
62 [ 919.060671]
63 [ 919.060699] =================================================
64 [ 919.061226] mtd_readtest: MTD device: 0
65 [ 919.066957] mtd_readtest: MTD device size 268435456, eraseblock size 131072, page size 2048, count of eraseblocks 2048, pages per eraseblock 64, OOB size 128
66 [ 919.070556] mtd_test: scanning for bad eraseblocks
67 [ 919.086016] mtd_test: scanned 2048 eraseblocks, 0 are bad
68 [ 919.089465] mtd_readtest: testing page read
69 [ 1090.778227] mtd_readtest: finished
70 [ 1090.778286] =================================================
71 # insmod mtd_pagetest dev=0
72 [ 1216.297313]
73 [ 1216.297341] =================================================
74 [ 1216.297867] mtd_pagetest: MTD device: 0
75 [ 1216.303509] mtd_pagetest: MTD device size 268435456, eraseblock size 131072, page size 2048, count of eraseblocks 2048, pages per eraseblock 64, OOB size 128
76 [ 1216.307213] mtd_test: scanning for bad eraseblocks
77 [ 1216.322680] mtd_test: scanned 2048 eraseblocks, 0 are bad
78 [ 1216.326077] mtd_pagetest: erasing whole device
79 [ 1223.694968] mtd_pagetest: erased 2048 eraseblocks
80 [ 1223.695009] mtd_pagetest: writing whole device
81 [ 1223.763930] mtd_pagetest: written up to eraseblock 0
82 [ 1240.268942] mtd_pagetest: written up to eraseblock 256
83 [ 1256.641498] mtd_pagetest: written up to eraseblock 512
84 [ 1273.139048] mtd_pagetest: written up to eraseblock 768
85 [ 1289.718929] mtd_pagetest: written up to eraseblock 1024
86 [ 1306.244553] mtd_pagetest: written up to eraseblock 1280
87 [ 1322.939723] mtd_pagetest: written up to eraseblock 1536
88 [ 1339.246937] mtd_pagetest: written up to eraseblock 1792
89 [ 1355.613729] mtd_pagetest: written 2048 eraseblocks
90 [ 1355.613770] mtd_pagetest: verifying all eraseblocks
91 [ 1355.854290] mtd_pagetest: verified up to eraseblock 0
92 [ 1416.657733] mtd_pagetest: verified up to eraseblock 256
93 [ 1477.384593] mtd_pagetest: verified up to eraseblock 512
94 [ 1538.008142] mtd_pagetest: verified up to eraseblock 768
95 [ 1599.080797] mtd_pagetest: verified up to eraseblock 1024
96 [ 1660.775431] mtd_pagetest: verified up to eraseblock 1280
97 [ 1722.177149] mtd_pagetest: verified up to eraseblock 1536
98 [ 1783.090166] mtd_pagetest: verified up to eraseblock 1792
99 [ 1844.450757] mtd_pagetest: verified 2048 eraseblocks
100 [ 1844.450798] mtd_pagetest: crosstest
101 [ 1844.455676] mtd_pagetest: reading page at 0x0
102 [ 1844.458603] mtd_pagetest: reading page at 0xffff800
103 [ 1844.463047] mtd_pagetest: reading page at 0x0
104 [ 1844.467790] mtd_pagetest: verifying pages read at 0x0 match
105 [ 1844.471636] mtd_pagetest: crosstest ok
106 [ 1844.477062] mtd_pagetest: erasecrosstest
107 [ 1844.480833] mtd_pagetest: erasing block 0
108 [ 1844.488498] mtd_pagetest: writing 1st page of block 0
109 [ 1844.489821] mtd_pagetest: reading 1st page of block 0
110 [ 1844.494475] mtd_pagetest: verifying 1st page of block 0
111 [ 1844.498942] mtd_pagetest: erasing block 0
112 [ 1844.507505] mtd_pagetest: writing 1st page of block 0
113 [ 1844.509042] mtd_pagetest: erasing block 2047
114 [ 1844.516725] mtd_pagetest: reading 1st page of block 0
115 [ 1844.518087] mtd_pagetest: verifying 1st page of block 0
116 [ 1844.522415] mtd_pagetest: erasecrosstest ok
117 [ 1844.527495] mtd_pagetest: erasetest
118 [ 1844.531613] mtd_pagetest: erasing block 0
119 [ 1844.538671] mtd_pagetest: writing 1st page of block 0
120 [ 1844.540249] mtd_pagetest: erasing block 0
121 [ 1844.547869] mtd_pagetest: reading 1st page of block 0
122 [ 1844.548927] mtd_pagetest: verifying 1st page of block 0 is all 0xff
123 [ 1844.553326] mtd_pagetest: erasetest ok
124 [ 1844.559440] mtd_pagetest: finished with 0 errors
125 [ 1844.563233] =================================================
126 # insmod mtd_subpagetest dev=0
127 [ 1942.429708]
128 [ 1942.429736] =================================================
129 [ 1942.430262] mtd_subpagetest: MTD device: 0
130 [ 1942.435905] mtd_subpagetest: MTD device size 268435456, eraseblock size 131072, page size 2048, subpage size 2048, count of eraseblocks 2048, pages per eraseblock 64, OOB size 128
131 [ 1942.439994] mtd_test: scanning for bad eraseblocks
132 [ 1942.457111] mtd_test: scanned 2048 eraseblocks, 0 are bad
133 [ 1949.824564] mtd_subpagetest: writing whole device
134 [ 1949.826670] mtd_subpagetest: written up to eraseblock 0
135 [ 1950.351816] mtd_subpagetest: written up to eraseblock 256
136 [ 1950.875797] mtd_subpagetest: written up to eraseblock 512
137 [ 1951.399912] mtd_subpagetest: written up to eraseblock 768
138 [ 1951.923618] mtd_subpagetest: written up to eraseblock 1024
139 [ 1952.447361] mtd_subpagetest: written up to eraseblock 1280
140 [ 1952.970834] mtd_subpagetest: written up to eraseblock 1536
141 [ 1953.494635] mtd_subpagetest: written up to eraseblock 1792
142 [ 1954.016265] mtd_subpagetest: written 2048 eraseblocks
143 [ 1954.016294] mtd_subpagetest: verifying all eraseblocks
144 [ 1954.021617] mtd_subpagetest: verified up to eraseblock 0
145 [ 1954.347458] mtd_subpagetest: verified up to eraseblock 256
146 [ 1954.667446] mtd_subpagetest: verified up to eraseblock 512
147 [ 1954.987343] mtd_subpagetest: verified up to eraseblock 768
148 [ 1955.307385] mtd_subpagetest: verified up to eraseblock 1024
149 [ 1955.627462] mtd_subpagetest: verified up to eraseblock 1280
150 [ 1955.947277] mtd_subpagetest: verified up to eraseblock 1536
151 [ 1956.266834] mtd_subpagetest: verified up to eraseblock 1792
152 [ 1956.585581] mtd_subpagetest: verified 2048 eraseblocks
153 [ 1963.889308] mtd_subpagetest: verifying all eraseblocks for 0xff
154 [ 1963.930487] mtd_subpagetest: verified up to eraseblock 0
155 [ 1974.592567] mtd_subpagetest: verified up to eraseblock 256
156 [ 1985.180953] mtd_subpagetest: verified up to eraseblock 512
157 [ 1995.805397] mtd_subpagetest: verified up to eraseblock 768
158 [ 2006.348859] mtd_subpagetest: verified up to eraseblock 1024
159 [ 2016.900530] mtd_subpagetest: verified up to eraseblock 1280
160 [ 2027.447587] mtd_subpagetest: verified up to eraseblock 1536
161 [ 2037.962383] mtd_subpagetest: verified up to eraseblock 1792
162 [ 2048.587863] mtd_subpagetest: verified 2048 eraseblocks
163 [ 2048.587906] mtd_subpagetest: writing whole device
164 [ 2048.648174] mtd_subpagetest: written up to eraseblock 0
165 [ 2062.643145] mtd_subpagetest: written up to eraseblock 256
166 [ 2076.699015] mtd_subpagetest: written up to eraseblock 512
167 [ 2091.004910] mtd_subpagetest: written up to eraseblock 768
168 [ 2105.149879] mtd_subpagetest: written up to eraseblock 1024
169 [ 2119.470691] mtd_subpagetest: written up to eraseblock 1280
170 [ 2133.746861] mtd_subpagetest: written up to eraseblock 1536
171 [ 2147.776477] mtd_subpagetest: written up to eraseblock 1792
172 [ 2161.947734] mtd_subpagetest: written 2048 eraseblocks
173 [ 2161.947776] mtd_subpagetest: verifying all eraseblocks
174 [ 2161.986109] mtd_subpagetest: verified up to eraseblock 0
175 [ 2170.818316] mtd_subpagetest: verified up to eraseblock 256
176 [ 2179.596875] mtd_subpagetest: verified up to eraseblock 512
177 [ 2188.405116] mtd_subpagetest: verified up to eraseblock 768
178 [ 2197.188588] mtd_subpagetest: verified up to eraseblock 1024
179 [ 2206.002204] mtd_subpagetest: verified up to eraseblock 1280
180 [ 2214.784815] mtd_subpagetest: verified up to eraseblock 1536
181 [ 2223.557141] mtd_subpagetest: verified up to eraseblock 1792
182 [ 2232.472832] mtd_subpagetest: verified 2048 eraseblocks
183 [ 2239.818213] mtd_subpagetest: verifying all eraseblocks for 0xff
184 [ 2239.861404] mtd_subpagetest: verified up to eraseblock 0
185 [ 2250.439035] mtd_subpagetest: verified up to eraseblock 256
186 [ 2261.176485] mtd_subpagetest: verified up to eraseblock 512
187 [ 2271.713183] mtd_subpagetest: verified up to eraseblock 768
188 [ 2282.356892] mtd_subpagetest: verified up to eraseblock 1024
189 [ 2292.891424] mtd_subpagetest: verified up to eraseblock 1280
190 [ 2303.543110] mtd_subpagetest: verified up to eraseblock 1536
191 [ 2314.116690] mtd_subpagetest: verified up to eraseblock 1792
192 [ 2324.607804] mtd_subpagetest: verified 2048 eraseblocks
193 [ 2324.607846] mtd_subpagetest: finished with 0 errors
194 [ 2324.611859] =================================================
195 # insmod mtd_oobtest dev=0
196 [ 2336.159109]
197 [ 2336.159138] =================================================
198 [ 2336.159664] mtd_oobtest: MTD device: 0
199 [ 2336.165308] mtd_oobtest: MTD device size 268435456, eraseblock size 131072, page size 2048, count of eraseblocks 2048, pages per eraseblock 64, OOB size 128
200 [ 2336.169043] mtd_test: scanning for bad eraseblocks
201 [ 2336.184354] mtd_test: scanned 2048 eraseblocks, 0 are bad
202 [ 2336.187716] mtd_oobtest: test 1 of 5
203 [ 2343.495966] mtd_oobtest: writing OOBs of whole device
204 [ 2343.496073] mtd_oobtest: written up to eraseblock 0
205 [ 2343.516803] mtd_oobtest: written up to eraseblock 256
206 [ 2343.533527] mtd_oobtest: written up to eraseblock 512
207 [ 2343.549945] mtd_oobtest: written up to eraseblock 768
208 [ 2343.563666] mtd_oobtest: written up to eraseblock 1024
209 [ 2343.575186] mtd_oobtest: written up to eraseblock 1280
210 [ 2343.584310] mtd_oobtest: written up to eraseblock 1536
211 [ 2343.593011] mtd_oobtest: written up to eraseblock 1792
212 [ 2343.600847] mtd_oobtest: written 2048 eraseblocks
213 [ 2343.600861] mtd_oobtest: verifying all eraseblocks
214 [ 2343.604542] mtd_oobtest: verified up to eraseblock 0
215 [ 2343.616606] mtd_oobtest: verified up to eraseblock 256
216 [ 2343.623992] mtd_oobtest: verified up to eraseblock 512
217 [ 2343.631390] mtd_oobtest: verified up to eraseblock 768
218 [ 2343.638788] mtd_oobtest: verified up to eraseblock 1024
219 [ 2343.646184] mtd_oobtest: verified up to eraseblock 1280
220 [ 2343.653570] mtd_oobtest: verified up to eraseblock 1536
221 [ 2343.660970] mtd_oobtest: verified up to eraseblock 1792
222 [ 2343.668356] mtd_oobtest: verified 2048 eraseblocks
223 [ 2343.668369] mtd_oobtest: test 2 of 5
224 [ 2350.985635] mtd_oobtest: writing OOBs of whole device
225 [ 2350.985743] mtd_oobtest: written up to eraseblock 0
226 [ 2351.006445] mtd_oobtest: written up to eraseblock 256
227 [ 2351.023170] mtd_oobtest: written up to eraseblock 512
228 [ 2351.039645] mtd_oobtest: written up to eraseblock 768
229 [ 2351.053395] mtd_oobtest: written up to eraseblock 1024
230 [ 2351.064954] mtd_oobtest: written up to eraseblock 1280
231 [ 2351.074144] mtd_oobtest: written up to eraseblock 1536
232 [ 2351.082848] mtd_oobtest: written up to eraseblock 1792
233 [ 2351.090707] mtd_oobtest: written 2048 eraseblocks
234 [ 2351.090721] mtd_oobtest: verifying all eraseblocks
235 [ 2351.094373] mtd_oobtest: verified up to eraseblock 0
236 [ 2351.099353] mtd_oobtest: verified up to eraseblock 256
237 [ 2351.104460] mtd_oobtest: verified up to eraseblock 512
238 [ 2351.109437] mtd_oobtest: verified up to eraseblock 768
239 [ 2351.114528] mtd_oobtest: verified up to eraseblock 1024
240 [ 2351.119683] mtd_oobtest: verified up to eraseblock 1280
241 [ 2351.124772] mtd_oobtest: verified up to eraseblock 1536
242 [ 2351.129996] mtd_oobtest: verified up to eraseblock 1792
243 [ 2351.135187] mtd_oobtest: verified 2048 eraseblocks
244 [ 2351.140130] mtd_oobtest: test 3 of 5
245 [ 2358.448438] mtd_oobtest: writing OOBs of whole device
246 [ 2358.448546] mtd_oobtest: written up to eraseblock 0
247 [ 2358.469297] mtd_oobtest: written up to eraseblock 256
248 [ 2358.486095] mtd_oobtest: written up to eraseblock 512
249 [ 2358.501993] mtd_oobtest: written up to eraseblock 768
250 [ 2358.515473] mtd_oobtest: written up to eraseblock 1024
251 [ 2358.526708] mtd_oobtest: written up to eraseblock 1280
252 [ 2358.535426] mtd_oobtest: written up to eraseblock 1536
253 [ 2358.544152] mtd_oobtest: written up to eraseblock 1792
254 [ 2358.551732] mtd_oobtest: written 2048 eraseblocks
255 [ 2358.551744] mtd_oobtest: verifying all eraseblocks
256 [ 2358.555424] mtd_oobtest: verified up to eraseblock 0
257 [ 2358.567572] mtd_oobtest: verified up to eraseblock 256
258 [ 2358.575045] mtd_oobtest: verified up to eraseblock 512
259 [ 2358.582537] mtd_oobtest: verified up to eraseblock 768
260 [ 2358.590024] mtd_oobtest: verified up to eraseblock 1024
261 [ 2358.597511] mtd_oobtest: verified up to eraseblock 1280
262 [ 2358.604984] mtd_oobtest: verified up to eraseblock 1536
263 [ 2358.612468] mtd_oobtest: verified up to eraseblock 1792
264 [ 2358.619923] mtd_oobtest: verified 2048 eraseblocks
265 [ 2358.619936] mtd_oobtest: test 4 of 5
266 [ 2365.924669] mtd_oobtest: attempting to start write past end of OOB
267 [ 2365.924711] mtd_oobtest: an error is expected...
268 [ 2365.929795] mtd_oobtest: error occurred as expected
269 [ 2365.934520] mtd_oobtest: attempting to start read past end of OOB
270 [ 2365.939150] mtd_oobtest: an error is expected...
271 [ 2365.945371] mtd_oobtest: error occurred as expected
272 [ 2365.950087] mtd_oobtest: attempting to write past end of device
273 [ 2365.954660] mtd_oobtest: an error is expected...
274 [ 2365.960623] mtd_oobtest: error occurred as expected
275 [ 2365.965422] mtd_oobtest: attempting to read past end of device
276 [ 2365.970064] mtd_oobtest: an error is expected...
277 [ 2365.975925] mtd_oobtest: error occurred as expected
278 [ 2365.984256] mtd_oobtest: attempting to write past end of device
279 [ 2365.985300] mtd_oobtest: an error is expected...
280 [ 2365.991242] mtd_oobtest: error: wrote past end of device
281 [ 2365.996064] mtd_oobtest: attempting to read past end of device
282 [ 2366.001389] mtd_oobtest: an error is expected...
283 [ 2366.007028] mtd_oobtest: error: read past end of device
284 [ 2366.011776] mtd_oobtest: test 5 of 5
285 [ 2373.317991] mtd_oobtest: writing OOBs of whole device
286 [ 2373.318034] mtd_oobtest: written up to eraseblock 0
287 [ 2373.322028] mtd_oobtest: written up to eraseblock 0
288 [ 2373.327465] mtd_oobtest: written up to eraseblock 256
289 [ 2373.331576] mtd_oobtest: written up to eraseblock 256
290 [ 2373.337501] mtd_oobtest: written up to eraseblock 512
291 [ 2373.341820] mtd_oobtest: written up to eraseblock 512
292 [ 2373.347566] mtd_oobtest: written up to eraseblock 768
293 [ 2373.351888] mtd_oobtest: written up to eraseblock 768
294 [ 2373.357634] mtd_oobtest: written up to eraseblock 1024
295 [ 2373.361957] mtd_oobtest: written up to eraseblock 1024
296 [ 2373.367710] mtd_oobtest: written up to eraseblock 1280
297 [ 2373.372113] mtd_oobtest: written up to eraseblock 1280
298 [ 2373.377841] mtd_oobtest: written up to eraseblock 1536
299 [ 2373.382355] mtd_oobtest: written up to eraseblock 1536
300 [ 2373.387962] mtd_oobtest: written up to eraseblock 1792
301 [ 2373.392597] mtd_oobtest: written up to eraseblock 1792
302 [ 2373.398190] mtd_oobtest: written 2047 eraseblocks
303 [ 2373.402838] mtd_oobtest: verifying all eraseblocks
304 [ 2373.407629] mtd_oobtest: verified up to eraseblock 0
305 [ 2373.412483] mtd_oobtest: verified up to eraseblock 256
306 [ 2373.417625] mtd_oobtest: verified up to eraseblock 512
307 [ 2373.422518] mtd_oobtest: verified up to eraseblock 768
308 [ 2373.427650] mtd_oobtest: verified up to eraseblock 1024
309 [ 2373.432760] mtd_oobtest: verified up to eraseblock 1280
310 [ 2373.437912] mtd_oobtest: verified up to eraseblock 1536
311 [ 2373.443091] mtd_oobtest: verified up to eraseblock 1792
312 [ 2373.448337] mtd_oobtest: verified 2047 eraseblocks
313 [ 2373.453358] mtd_oobtest: finished with 2 errors
314 [ 2373.458250] =================================================
315
316 Note: the two errors are present even even without this patch when testing
317 the driver with a flash chip requiring 4 bits ECC strength.
318
319 # insmod mtd_stresstest dev=0
320 [ 2383.256453]
321 [ 2383.256482] =================================================
322 [ 2383.257008] mtd_stresstest: MTD device: 0
323 [ 2383.262650] mtd_stresstest: MTD device size 268435456, eraseblock size 131072, page size 2048, count of eraseblocks 2048, pages per eraseblock 64, OOB size 128
324 [ 2383.268254] mtd_test: scanning for bad eraseblocks
325 [ 2383.281992] mtd_test: scanned 2048 eraseblocks, 0 are bad
326 [ 2383.285565] mtd_stresstest: doing operations
327 [ 2383.291047] mtd_stresstest: 0 operations done
328 [ 2427.841267] mtd_stresstest: 1024 operations done
329 [ 2471.142229] mtd_stresstest: 2048 operations done
330 [ 2514.405277] mtd_stresstest: 3072 operations done
331 [ 2555.451926] mtd_stresstest: 4096 operations done
332 [ 2598.107133] mtd_stresstest: 5120 operations done
333 [ 2639.936952] mtd_stresstest: 6144 operations done
334 [ 2680.724751] mtd_stresstest: 7168 operations done
335 [ 2720.344163] mtd_stresstest: 8192 operations done
336 [ 2761.645640] mtd_stresstest: 9216 operations done
337 [ 2791.760534] mtd_stresstest: finished, 10000 operations done
338 [ 2791.760817] =================================================
339 #
340 ---
341 drivers/spi/spi-qpic-snand.c | 21 ++++++++++++++++-----
342 1 file changed, 16 insertions(+), 5 deletions(-)
343
344 --- a/drivers/spi/spi-qpic-snand.c
345 +++ b/drivers/spi/spi-qpic-snand.c
346 @@ -283,9 +283,22 @@ static int qcom_spi_ecc_init_ctx_pipelin
347 goto err_free_ecc_cfg;
348 }
349
350 - if (ecc_cfg->strength != 4) {
351 + switch (ecc_cfg->strength) {
352 + case 4:
353 + ecc_cfg->ecc_mode = ECC_MODE_4BIT;
354 + ecc_cfg->ecc_bytes_hw = 7;
355 + ecc_cfg->spare_bytes = 4;
356 + break;
357 +
358 + case 8:
359 + ecc_cfg->ecc_mode = ECC_MODE_8BIT;
360 + ecc_cfg->ecc_bytes_hw = 13;
361 + ecc_cfg->spare_bytes = 2;
362 + break;
363 +
364 + default:
365 dev_err(snandc->dev,
366 - "only 4 bits ECC strength is supported\n");
367 + "only 4 or 8 bits ECC strength is supported\n");
368 ret = -EOPNOTSUPP;
369 goto err_free_ecc_cfg;
370 }
371 @@ -302,8 +315,6 @@ static int qcom_spi_ecc_init_ctx_pipelin
372 nand->ecc.ctx.priv = ecc_cfg;
373 snandc->qspi->mtd = mtd;
374
375 - ecc_cfg->ecc_bytes_hw = 7;
376 - ecc_cfg->spare_bytes = 4;
377 ecc_cfg->bbm_size = 1;
378 ecc_cfg->bch_enabled = true;
379 ecc_cfg->bytes = ecc_cfg->ecc_bytes_hw + ecc_cfg->spare_bytes + ecc_cfg->bbm_size;
380 @@ -349,7 +360,7 @@ static int qcom_spi_ecc_init_ctx_pipelin
381 FIELD_PREP(ECC_SW_RESET, 0) |
382 FIELD_PREP(ECC_NUM_DATA_BYTES_MASK, ecc_cfg->cw_data) |
383 FIELD_PREP(ECC_FORCE_CLK_OPEN, 1) |
384 - FIELD_PREP(ECC_MODE_MASK, ECC_MODE_4BIT) |
385 + FIELD_PREP(ECC_MODE_MASK, ecc_cfg->ecc_mode) |
386 FIELD_PREP(ECC_PARITY_SIZE_BYTES_BCH_MASK, ecc_cfg->ecc_bytes_hw);
387
388 ecc_cfg->ecc_buf_cfg = 0x203 << NUM_STEPS;