From a08553b3b36cc309d3f112208f8451ad85d240eb Mon Sep 17 00:00:00 2001 From: David Bauer Date: Thu, 11 Jan 2024 13:05:39 +0100 Subject: [PATCH] ath79: read back reset register Read back the reset register in order to flush the cache. This fixes spurious reboot hangs on TP-Link TL-WDR3600 and TL-WDR4300 with Zentel DRAM chips. This issue was fixed in the past, but switching to the reset-driver specific implementation removed the cache barrier which was previously implicitly added by reading back the register in question. Link: freifunk-gluon/gluon#2904 Link: openwrt#13043 Link: https://dev.archive.openwrt.org/ticket/17839 Link: f8a7bfe1cb2c ("MIPS: ath79: fix system restart") Signed-off-by: David Bauer (cherry picked from commit 2fe8ecd880396b5ae25fe9583aaa1d71be0b8468) --- ...reset-ath79-read-back-reset-register.patch | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 target/linux/ath79/patches-5.10/100-reset-ath79-read-back-reset-register.patch diff --git a/target/linux/ath79/patches-5.10/100-reset-ath79-read-back-reset-register.patch b/target/linux/ath79/patches-5.10/100-reset-ath79-read-back-reset-register.patch new file mode 100644 index 0000000000..8e66fa8b6e --- /dev/null +++ b/target/linux/ath79/patches-5.10/100-reset-ath79-read-back-reset-register.patch @@ -0,0 +1,33 @@ +From 5d25f925d3f72ceadf922f946d5422ad77fbfc20 Mon Sep 17 00:00:00 2001 +From: David Bauer +Date: Thu, 11 Jan 2024 13:01:18 +0100 +Subject: [PATCH] reset: ath79: read back reset register + +Read back the reset register in order to flush the cache. This fixes +spurious reboot hangs on TP-Link TL-WDR3600 and TL-WDR4300 with Zentel +DRAM chips. + +This issue was fixed in the past, but switching to the reset-driver +specific implementation removed the old fix. + +Link: https://github.com/freifunk-gluon/gluon/issues/2904 +Link: https://github.com/openwrt/openwrt/issues/13043 +Link: https://dev.archive.openwrt.org/ticket/17839 +Link: f8a7bfe1cb2c ("MIPS: ath79: fix system restart") + +Signed-off-by: David Bauer +--- + drivers/reset/reset-ath79.c | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/drivers/reset/reset-ath79.c ++++ b/drivers/reset/reset-ath79.c +@@ -37,6 +37,8 @@ static int ath79_reset_update(struct res + else + val &= ~BIT(id); + writel(val, ath79_reset->base); ++ /* Flush cache */ ++ readl(ath79_reset->base); + spin_unlock_irqrestore(&ath79_reset->lock, flags); + + return 0; -- 2.30.2