diff options
author | Roger Quadros <rogerq@ti.com> | 2014-10-21 09:53:27 -0400 |
---|---|---|
committer | Brian Norris <computersforpeace@gmail.com> | 2014-11-20 02:25:06 -0500 |
commit | 5a66088bffd9a5251e96ca5d0d46456ab9196287 (patch) | |
tree | 91bdd8b45c770fe3e3910d54357e09aff83f2cd2 | |
parent | 096916610f415e07cfe71d71a391011c617be5ed (diff) |
mtd: mtd_oobtest: Show the verification error location and data
Add a function memcmpshow() that compares the 2 data buffers
and shows the address:offset and data bytes on comparison failure.
This function does not break at a comparison failure but runs the
check for the whole data buffer.
Use memcmpshow() instead of memcmp() for all the verification paths.
Signed-off-by: Roger Quadros <rogerq@ti.com>
Signed-off-by: Sekhar Nori <nsekhar@ti.com>
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
-rw-r--r-- | drivers/mtd/tests/oobtest.c | 36 |
1 files changed, 29 insertions, 7 deletions
diff --git a/drivers/mtd/tests/oobtest.c b/drivers/mtd/tests/oobtest.c index dc4f9602b97e..edd859d96d85 100644 --- a/drivers/mtd/tests/oobtest.c +++ b/drivers/mtd/tests/oobtest.c | |||
@@ -115,6 +115,26 @@ static int write_whole_device(void) | |||
115 | return 0; | 115 | return 0; |
116 | } | 116 | } |
117 | 117 | ||
118 | /* Display the address, offset and data bytes at comparison failure */ | ||
119 | static int memcmpshow(loff_t addr, const void *cs, const void *ct, size_t count) | ||
120 | { | ||
121 | const unsigned char *su1, *su2; | ||
122 | int res; | ||
123 | int ret = 0; | ||
124 | size_t i = 0; | ||
125 | |||
126 | for (su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--, i++) { | ||
127 | res = *su1 ^ *su2; | ||
128 | if (res) { | ||
129 | pr_info("error @addr[0x%lx:0x%x] 0x%x -> 0x%x diff 0x%x\n", | ||
130 | (unsigned long)addr, i, *su1, *su2, res); | ||
131 | ret = 1; | ||
132 | } | ||
133 | } | ||
134 | |||
135 | return ret; | ||
136 | } | ||
137 | |||
118 | static int verify_eraseblock(int ebnum) | 138 | static int verify_eraseblock(int ebnum) |
119 | { | 139 | { |
120 | int i; | 140 | int i; |
@@ -139,8 +159,9 @@ static int verify_eraseblock(int ebnum) | |||
139 | errcnt += 1; | 159 | errcnt += 1; |
140 | return err ? err : -1; | 160 | return err ? err : -1; |
141 | } | 161 | } |
142 | if (memcmp(readbuf, writebuf + (use_len_max * i) + use_offset, | 162 | if (memcmpshow(addr, readbuf, |
143 | use_len)) { | 163 | writebuf + (use_len_max * i) + use_offset, |
164 | use_len)) { | ||
144 | pr_err("error: verify failed at %#llx\n", | 165 | pr_err("error: verify failed at %#llx\n", |
145 | (long long)addr); | 166 | (long long)addr); |
146 | errcnt += 1; | 167 | errcnt += 1; |
@@ -167,9 +188,9 @@ static int verify_eraseblock(int ebnum) | |||
167 | errcnt += 1; | 188 | errcnt += 1; |
168 | return err ? err : -1; | 189 | return err ? err : -1; |
169 | } | 190 | } |
170 | if (memcmp(readbuf + use_offset, | 191 | if (memcmpshow(addr, readbuf + use_offset, |
171 | writebuf + (use_len_max * i) + use_offset, | 192 | writebuf + (use_len_max * i) + use_offset, |
172 | use_len)) { | 193 | use_len)) { |
173 | pr_err("error: verify failed at %#llx\n", | 194 | pr_err("error: verify failed at %#llx\n", |
174 | (long long)addr); | 195 | (long long)addr); |
175 | errcnt += 1; | 196 | errcnt += 1; |
@@ -233,7 +254,7 @@ static int verify_eraseblock_in_one_go(int ebnum) | |||
233 | errcnt += 1; | 254 | errcnt += 1; |
234 | return err ? err : -1; | 255 | return err ? err : -1; |
235 | } | 256 | } |
236 | if (memcmp(readbuf, writebuf, len)) { | 257 | if (memcmpshow(addr, readbuf, writebuf, len)) { |
237 | pr_err("error: verify failed at %#llx\n", | 258 | pr_err("error: verify failed at %#llx\n", |
238 | (long long)addr); | 259 | (long long)addr); |
239 | errcnt += 1; | 260 | errcnt += 1; |
@@ -610,7 +631,8 @@ static int __init mtd_oobtest_init(void) | |||
610 | err = mtd_read_oob(mtd, addr, &ops); | 631 | err = mtd_read_oob(mtd, addr, &ops); |
611 | if (err) | 632 | if (err) |
612 | goto out; | 633 | goto out; |
613 | if (memcmp(readbuf, writebuf, mtd->ecclayout->oobavail * 2)) { | 634 | if (memcmpshow(addr, readbuf, writebuf, |
635 | mtd->ecclayout->oobavail * 2)) { | ||
614 | pr_err("error: verify failed at %#llx\n", | 636 | pr_err("error: verify failed at %#llx\n", |
615 | (long long)addr); | 637 | (long long)addr); |
616 | errcnt += 1; | 638 | errcnt += 1; |