If the length of the memory address range passed to the "mtest" command is 
not of the form 2^x - 1, not all address lines are tested. This bug is 
inherited from the original software at 
http://www.netrino.com/Embedded-Systems/How-To/Memory-Test-Suite-C. Fix 
this.

Signed-off-by: Guennadi Liakhovetski <[EMAIL PROTECTED]>

---

diff --git a/common/cmd_mem.c b/common/cmd_mem.c
index a994211..2b55e7e 100644
--- a/common/cmd_mem.c
+++ b/common/cmd_mem.c
@@ -661,7 +661,7 @@ int do_mem_mtest (cmd_tbl_t *cmdtp, int flag, int argc, 
char *argv[])
        ulong   readback;
 
 #if defined(CFG_ALT_MEMTEST)
-       vu_long addr_mask;
+       vu_long len;
        vu_long offset;
        vu_long test_offset;
        vu_long pattern;
@@ -800,24 +800,24 @@ int do_mem_mtest (cmd_tbl_t *cmdtp, int flag, int argc, 
char *argv[])
                 * Returns:     0 if the test succeeds, 1 if the test fails.
                 *
                 * ## NOTE ##   Be sure to specify start and end
-                *              addresses such that addr_mask has
+                *              addresses such that len has
                 *              lots of bits set. For example an
                 *              address range of 01000000 02000000 is
                 *              bad while a range of 01000000
                 *              01ffffff is perfect.
                 */
-               addr_mask = ((ulong)end - (ulong)start)/sizeof(vu_long);
+               len = ((ulong)end - (ulong)start)/sizeof(vu_long);
                pattern = (vu_long) 0xaaaaaaaa;
                anti_pattern = (vu_long) 0x55555555;
 
                PRINTF("%s:%d: addr mask = 0x%.8lx\n",
                        __FUNCTION__, __LINE__,
-                       addr_mask);
+                       len);
                /*
                 * Write the default pattern at each of the
                 * power-of-two offsets.
                 */
-               for (offset = 1; (offset & addr_mask) != 0; offset <<= 1) {
+               for (offset = 1; offset < len; offset <<= 1) {
                        start[offset] = pattern;
                }
 
@@ -827,7 +827,7 @@ int do_mem_mtest (cmd_tbl_t *cmdtp, int flag, int argc, 
char *argv[])
                test_offset = 0;
                start[test_offset] = anti_pattern;
 
-               for (offset = 1; (offset & addr_mask) != 0; offset <<= 1) {
+               for (offset = 1; offset < len; offset <<= 1) {
                    temp = start[offset];
                    if (temp != pattern) {
                        printf ("\nFAILURE: Address bit stuck high @ 0x%.8lx:"
@@ -841,10 +841,10 @@ int do_mem_mtest (cmd_tbl_t *cmdtp, int flag, int argc, 
char *argv[])
                /*
                 * Check for addr bits stuck low or shorted.
                 */
-               for (test_offset = 1; (test_offset & addr_mask) != 0; 
test_offset <<= 1) {
+               for (test_offset = 1; test_offset < len; test_offset <<= 1) {
                    start[test_offset] = anti_pattern;
 
-                   for (offset = 1; (offset & addr_mask) != 0; offset <<= 1) {
+                   for (offset = 1; offset < len; offset <<= 1) {
                        temp = start[offset];
                        if ((temp != pattern) && (offset != test_offset)) {
                            printf ("\nFAILURE: Address bit stuck low or 
shorted @"

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
U-Boot-Users mailing list
U-Boot-Users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/u-boot-users

Reply via email to