142-mtd-bcm47xxpart-don-t-fail-because-of-bit-flips.patch 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. From dfe4b4c732365fc1d83c2d2fd9cc18054ae850b7 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:24:05 +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. Bit-flip errors may occur on NAND flashes and are harmless. Handle them
  9. gracefully as read content is still reliable and can be parsed.
  10. Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
  11. ---
  12. drivers/mtd/bcm47xxpart.c | 38 ++++++++++++++++++++++----------------
  13. 1 file changed, 22 insertions(+), 16 deletions(-)
  14. --- a/drivers/mtd/bcm47xxpart.c
  15. +++ b/drivers/mtd/bcm47xxpart.c
  16. @@ -66,11 +66,13 @@ static const char *bcm47xxpart_trx_data_
  17. {
  18. uint32_t buf;
  19. size_t bytes_read;
  20. + int err;
  21. - if (mtd_read(master, offset, sizeof(buf), &bytes_read,
  22. - (uint8_t *)&buf) < 0) {
  23. - pr_err("mtd_read error while parsing (offset: 0x%X)!\n",
  24. - offset);
  25. + err = mtd_read(master, offset, sizeof(buf), &bytes_read,
  26. + (uint8_t *)&buf);
  27. + if (err && !mtd_is_bitflip(err)) {
  28. + pr_err("mtd_read error while parsing (offset: 0x%X): %d\n",
  29. + offset, err);
  30. goto out_default;
  31. }
  32. @@ -95,6 +97,7 @@ static int bcm47xxpart_parse(struct mtd_
  33. int trx_part = -1;
  34. int last_trx_part = -1;
  35. int possible_nvram_sizes[] = { 0x8000, 0xF000, 0x10000, };
  36. + int err;
  37. /*
  38. * Some really old flashes (like AT45DB*) had smaller erasesize-s, but
  39. @@ -128,10 +131,11 @@ static int bcm47xxpart_parse(struct mtd_
  40. }
  41. /* Read beginning of the block */
  42. - if (mtd_read(master, offset, BCM47XXPART_BYTES_TO_READ,
  43. - &bytes_read, (uint8_t *)buf) < 0) {
  44. - pr_err("mtd_read error while parsing (offset: 0x%X)!\n",
  45. - offset);
  46. + err = mtd_read(master, offset, BCM47XXPART_BYTES_TO_READ,
  47. + &bytes_read, (uint8_t *)buf);
  48. + if (err && !mtd_is_bitflip(err)) {
  49. + pr_err("mtd_read error while parsing (offset: 0x%X): %d\n",
  50. + offset, err);
  51. continue;
  52. }
  53. @@ -252,10 +256,11 @@ static int bcm47xxpart_parse(struct mtd_
  54. }
  55. /* Read middle of the block */
  56. - if (mtd_read(master, offset + 0x8000, 0x4,
  57. - &bytes_read, (uint8_t *)buf) < 0) {
  58. - pr_err("mtd_read error while parsing (offset: 0x%X)!\n",
  59. - offset);
  60. + err = mtd_read(master, offset + 0x8000, 0x4, &bytes_read,
  61. + (uint8_t *)buf);
  62. + if (err && !mtd_is_bitflip(err)) {
  63. + pr_err("mtd_read error while parsing (offset: 0x%X): %d\n",
  64. + offset, err);
  65. continue;
  66. }
  67. @@ -275,10 +280,11 @@ static int bcm47xxpart_parse(struct mtd_
  68. }
  69. offset = master->size - possible_nvram_sizes[i];
  70. - if (mtd_read(master, offset, 0x4, &bytes_read,
  71. - (uint8_t *)buf) < 0) {
  72. - pr_err("mtd_read error while reading at offset 0x%X!\n",
  73. - offset);
  74. + err = mtd_read(master, offset, 0x4, &bytes_read,
  75. + (uint8_t *)buf);
  76. + if (err && !mtd_is_bitflip(err)) {
  77. + pr_err("mtd_read error while reading (offset 0x%X): %d\n",
  78. + offset, err);
  79. continue;
  80. }