aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/generic/backport-5.4/831-v5.13-0005-firmware-bcm47xx_nvram-inline-code-checking-NVRAM-si.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/generic/backport-5.4/831-v5.13-0005-firmware-bcm47xx_nvram-inline-code-checking-NVRAM-si.patch')
-rw-r--r--target/linux/generic/backport-5.4/831-v5.13-0005-firmware-bcm47xx_nvram-inline-code-checking-NVRAM-si.patch70
1 files changed, 70 insertions, 0 deletions
diff --git a/target/linux/generic/backport-5.4/831-v5.13-0005-firmware-bcm47xx_nvram-inline-code-checking-NVRAM-si.patch b/target/linux/generic/backport-5.4/831-v5.13-0005-firmware-bcm47xx_nvram-inline-code-checking-NVRAM-si.patch
new file mode 100644
index 0000000000..21d250049e
--- /dev/null
+++ b/target/linux/generic/backport-5.4/831-v5.13-0005-firmware-bcm47xx_nvram-inline-code-checking-NVRAM-si.patch
@@ -0,0 +1,70 @@
+From f52da4ccfec9192e17f5c16260dfdd6d3ea76f65 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
+Date: Mon, 8 Mar 2021 10:03:20 +0100
+Subject: [PATCH] firmware: bcm47xx_nvram: inline code checking NVRAM size
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Separated function was not improving code quality much (or at all).
+Moreover it expected possible flash end address as argument and it was
+returning NVRAM size.
+
+The new code always operates on offsets which means less logic and less
+calculations.
+
+Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
+Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
+---
+ drivers/firmware/broadcom/bcm47xx_nvram.c | 25 +++++++----------------
+ 1 file changed, 7 insertions(+), 18 deletions(-)
+
+--- a/drivers/firmware/broadcom/bcm47xx_nvram.c
++++ b/drivers/firmware/broadcom/bcm47xx_nvram.c
+@@ -42,18 +42,6 @@ static bool bcm47xx_nvram_is_valid(void
+ return ((struct nvram_header *)nvram)->magic == NVRAM_MAGIC;
+ }
+
+-static u32 find_nvram_size(void __iomem *end)
+-{
+- int i;
+-
+- for (i = 0; i < ARRAY_SIZE(nvram_sizes); i++) {
+- if (bcm47xx_nvram_is_valid(end - nvram_sizes[i]))
+- return nvram_sizes[i];
+- }
+-
+- return 0;
+-}
+-
+ /**
+ * bcm47xx_nvram_copy - copy NVRAM to internal buffer
+ */
+@@ -85,7 +73,7 @@ static int bcm47xx_nvram_find_and_copy(v
+ {
+ size_t flash_size;
+ size_t offset;
+- u32 size;
++ int i;
+
+ if (nvram_len) {
+ pr_warn("nvram already initialized\n");
+@@ -93,12 +81,13 @@ static int bcm47xx_nvram_find_and_copy(v
+ }
+
+ /* TODO: when nvram is on nand flash check for bad blocks first. */
++
++ /* Try every possible flash size and check for NVRAM at its end */
+ for (flash_size = FLASH_MIN; flash_size <= res_size; flash_size <<= 1) {
+- /* Windowed flash access */
+- size = find_nvram_size(flash_start + flash_size);
+- if (size) {
+- offset = flash_size - size;
+- goto found;
++ for (i = 0; i < ARRAY_SIZE(nvram_sizes); i++) {
++ offset = flash_size - nvram_sizes[i];
++ if (bcm47xx_nvram_is_valid(flash_start + offset))
++ goto found;
+ }
+ }
+