]> www.infradead.org Git - mtd-utils.git/commitdiff
nandwrite: Factor out buffer checking code
authorMarek Vasut <marex@denx.de>
Fri, 9 Dec 2016 01:47:41 +0000 (02:47 +0100)
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>
Fri, 9 Dec 2016 08:06:45 +0000 (09:06 +0100)
Pull the buffer content checking code into separate function and
simplify the code invoking it slightly.

Signed-off-by: Marek Vasut <marex@denx.de>
Reviewed-by: Boris Brezillon <boris.brezillon@free-electrons.com>
Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
include/common.h
nand-utils/nandwrite.c

index 32b5d231be7e57908531815659d66468b1caf7e8..2812f49ad39b5187bf9e94aa4acb7d937eb12862 100644 (file)
@@ -181,6 +181,31 @@ static inline int is_power_of_2(unsigned long long n)
        return (n != 0 && ((n & (n - 1)) == 0));
 }
 
+/* Check whether buffer is filled with character 'pattern' */
+static inline int buffer_check_pattern(unsigned char *buffer, size_t size,
+                                      unsigned char pattern)
+{
+       /* Invalid input */
+       if (!buffer || (size == 0))
+               return 0;
+
+       /* No match on first byte */
+       if (*buffer != pattern)
+               return 0;
+
+       /* First byte matched and buffer is 1 byte long, OK. */
+       if (size == 1)
+               return 1;
+
+       /*
+        * Check buffer longer than 1 byte. We already know that buffer[0]
+        * matches the pattern, so the test below only checks whether the
+        * buffer[0...size-2] == buffer[1...size-1] , which is a test for
+        * whether the buffer is filled with constant value.
+        */
+       return !memcmp(buffer, buffer + 1, size - 1);
+}
+
 /**
  * simple_strtoX - convert a hex/dec/oct string into a number
  * @snum: buffer to convert
index b376869e78c2b288c1ffd3f75924215aed06fee1..9602a6e35b9c6047e5c577b38cad582356cdadda 100644 (file)
@@ -523,18 +523,8 @@ int main(int argc, char * const argv[])
                        }
                }
 
-               allffs = 0;
-               if (skipallffs) 
-               {
-                       for (ii = 0; ii < mtd.min_io_size; ii += sizeof(uint32_t))
-                       {
-                               if (*(uint32_t*)(writebuf + ii) != 0xffffffff)
-                                       break;
-                       }
-                       if (ii == mtd.min_io_size)
-                               allffs = 1;
-               }
-               if (!allffs) {
+               ret = 0;
+               if (!skipallffs || !buffer_check_pattern(writebuf, mtd.min_io_size, 0xff)) {
                        /* Write out data */
                        ret = mtd_write(mtd_desc, &mtd, fd, mtdoffset / mtd.eb_size,
                                        mtdoffset % mtd.eb_size,
@@ -543,9 +533,8 @@ int main(int argc, char * const argv[])
                                        writeoob ? oobbuf : NULL,
                                        writeoob ? mtd.oob_size : 0,
                                        write_mode);
-               } else  {
-                       ret = 0;
                }
+
                if (ret) {
                        long long i;
                        if (errno != EIO) {