Fixed x86 GRUB config label
[librecmc/librecmc.git] / target / linux / generic / patches-4.4 / 041-mtd-bcm47xxpart-don-t-fail-because-of-bit-flips.patch
1 From 36bcc0c9c2bc8f56569cd735ba531a51358d7c2b Mon Sep 17 00:00:00 2001
2 From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
3 Date: Sun, 6 Dec 2015 11:31:38 +0100
4 Subject: [PATCH] mtd: bcm47xxpart: don't fail because of bit-flips
5 MIME-Version: 1.0
6 Content-Type: text/plain; charset=UTF-8
7 Content-Transfer-Encoding: 8bit
8
9 Bit-flip errors may occur on NAND flashes and are harmless. Handle them
10 gracefully as read content is still reliable and can be parsed.
11
12 Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
13 Signed-off-by: Brian Norris <computersforpeace@gmail.com>
14 ---
15  drivers/mtd/bcm47xxpart.c | 38 ++++++++++++++++++++++----------------
16  1 file changed, 22 insertions(+), 16 deletions(-)
17
18 --- a/drivers/mtd/bcm47xxpart.c
19 +++ b/drivers/mtd/bcm47xxpart.c
20 @@ -66,11 +66,13 @@ static const char *bcm47xxpart_trx_data_
21  {
22         uint32_t buf;
23         size_t bytes_read;
24 +       int err;
25  
26 -       if (mtd_read(master, offset, sizeof(buf), &bytes_read,
27 -                    (uint8_t *)&buf) < 0) {
28 -               pr_err("mtd_read error while parsing (offset: 0x%X)!\n",
29 -                       offset);
30 +       err  = mtd_read(master, offset, sizeof(buf), &bytes_read,
31 +                       (uint8_t *)&buf);
32 +       if (err && !mtd_is_bitflip(err)) {
33 +               pr_err("mtd_read error while parsing (offset: 0x%X): %d\n",
34 +                       offset, err);
35                 goto out_default;
36         }
37  
38 @@ -95,6 +97,7 @@ static int bcm47xxpart_parse(struct mtd_
39         int trx_part = -1;
40         int last_trx_part = -1;
41         int possible_nvram_sizes[] = { 0x8000, 0xF000, 0x10000, };
42 +       int err;
43  
44         /*
45          * Some really old flashes (like AT45DB*) had smaller erasesize-s, but
46 @@ -128,10 +131,11 @@ static int bcm47xxpart_parse(struct mtd_
47                 }
48  
49                 /* Read beginning of the block */
50 -               if (mtd_read(master, offset, BCM47XXPART_BYTES_TO_READ,
51 -                            &bytes_read, (uint8_t *)buf) < 0) {
52 -                       pr_err("mtd_read error while parsing (offset: 0x%X)!\n",
53 -                              offset);
54 +               err = mtd_read(master, offset, BCM47XXPART_BYTES_TO_READ,
55 +                              &bytes_read, (uint8_t *)buf);
56 +               if (err && !mtd_is_bitflip(err)) {
57 +                       pr_err("mtd_read error while parsing (offset: 0x%X): %d\n",
58 +                              offset, err);
59                         continue;
60                 }
61  
62 @@ -254,10 +258,11 @@ static int bcm47xxpart_parse(struct mtd_
63                 }
64  
65                 /* Read middle of the block */
66 -               if (mtd_read(master, offset + 0x8000, 0x4,
67 -                            &bytes_read, (uint8_t *)buf) < 0) {
68 -                       pr_err("mtd_read error while parsing (offset: 0x%X)!\n",
69 -                              offset);
70 +               err = mtd_read(master, offset + 0x8000, 0x4, &bytes_read,
71 +                              (uint8_t *)buf);
72 +               if (err && !mtd_is_bitflip(err)) {
73 +                       pr_err("mtd_read error while parsing (offset: 0x%X): %d\n",
74 +                              offset, err);
75                         continue;
76                 }
77  
78 @@ -277,10 +282,11 @@ static int bcm47xxpart_parse(struct mtd_
79                 }
80  
81                 offset = master->size - possible_nvram_sizes[i];
82 -               if (mtd_read(master, offset, 0x4, &bytes_read,
83 -                            (uint8_t *)buf) < 0) {
84 -                       pr_err("mtd_read error while reading at offset 0x%X!\n",
85 -                              offset);
86 +               err = mtd_read(master, offset, 0x4, &bytes_read,
87 +                              (uint8_t *)buf);
88 +               if (err && !mtd_is_bitflip(err)) {
89 +                       pr_err("mtd_read error while reading (offset 0x%X): %d\n",
90 +                              offset, err);
91                         continue;
92                 }
93