|
@@ -68,6 +68,7 @@
|
|
|
#include <linux/delay.h>
|
|
|
#include <linux/vmalloc.h>
|
|
|
#include <linux/export.h>
|
|
|
+#include <linux/string.h>
|
|
|
|
|
|
static int check_pattern_no_oob(uint8_t *buf, struct nand_bbt_descr *td)
|
|
|
{
|
|
@@ -89,19 +90,16 @@ static int check_pattern_no_oob(uint8_t *buf, struct nand_bbt_descr *td)
|
|
|
*/
|
|
|
static int check_pattern(uint8_t *buf, int len, int paglen, struct nand_bbt_descr *td)
|
|
|
{
|
|
|
- int i, end = 0;
|
|
|
+ int end = 0;
|
|
|
uint8_t *p = buf;
|
|
|
|
|
|
if (td->options & NAND_BBT_NO_OOB)
|
|
|
return check_pattern_no_oob(buf, td);
|
|
|
|
|
|
end = paglen + td->offs;
|
|
|
- if (td->options & NAND_BBT_SCANEMPTY) {
|
|
|
- for (i = 0; i < end; i++) {
|
|
|
- if (p[i] != 0xff)
|
|
|
- return -1;
|
|
|
- }
|
|
|
- }
|
|
|
+ if (td->options & NAND_BBT_SCANEMPTY)
|
|
|
+ if (memchr_inv(p, 0xff, end))
|
|
|
+ return -1;
|
|
|
p += end;
|
|
|
|
|
|
/* Compare the pattern */
|
|
@@ -111,10 +109,8 @@ static int check_pattern(uint8_t *buf, int len, int paglen, struct nand_bbt_desc
|
|
|
if (td->options & NAND_BBT_SCANEMPTY) {
|
|
|
p += td->len;
|
|
|
end += td->len;
|
|
|
- for (i = end; i < len; i++) {
|
|
|
- if (*p++ != 0xff)
|
|
|
- return -1;
|
|
|
- }
|
|
|
+ if (memchr_inv(p, 0xff, len - end))
|
|
|
+ return -1;
|
|
|
}
|
|
|
return 0;
|
|
|
}
|
|
@@ -130,14 +126,9 @@ static int check_pattern(uint8_t *buf, int len, int paglen, struct nand_bbt_desc
|
|
|
*/
|
|
|
static int check_short_pattern(uint8_t *buf, struct nand_bbt_descr *td)
|
|
|
{
|
|
|
- int i;
|
|
|
- uint8_t *p = buf;
|
|
|
-
|
|
|
/* Compare the pattern */
|
|
|
- for (i = 0; i < td->len; i++) {
|
|
|
- if (p[td->offs + i] != td->pattern[i])
|
|
|
- return -1;
|
|
|
- }
|
|
|
+ if (memcmp(buf + td->offs, td->pattern, td->len))
|
|
|
+ return -1;
|
|
|
return 0;
|
|
|
}
|
|
|
|