[PATCH] ath79: ar8216: make switch register access atomic

Baptiste Jonglez baptiste at bitsofnetworks.org
Sat Oct 3 19:01:52 EDT 2020


Hi,

Thanks a lot for fixing this!

Can you backport it to openwrt-19.07?  ath79 is also affected there.

Regards,
Baptiste

On 21-09-20, Chuanhong Guo wrote:
> reg accesses on integrated ar8229 sometimes fails. As a result, phy read
> got incorrect port status and wan link goes down and up mysteriously.
> After comparing ar8216 with the old driver, these local_irq_save/restore
> calls are the only meaningful differences I could find and it does fix
> the issue.
> The same changes were added in svn r26856 by Gabor Juhos:
> ar71xx: ag71xx: make switch register access atomic
> 
> As I can't find the underlying problem either, this hack is broght
> back to fix the unstable link issue.
> This hack is only suitable for ath79 mdio and may easily break the
> driver on other platform. Limit it to ath79-only as a target patch.
> 
> Fixes: FS#2216
> Fixes: FS#3226
> Signed-off-by: Chuanhong Guo <gch981213 at gmail.com>
> ---
>  .../930-ar8216-make-reg-access-atomic.patch   | 61 +++++++++++++++++++
>  1 file changed, 61 insertions(+)
>  create mode 100644 target/linux/ath79/patches-5.4/930-ar8216-make-reg-access-atomic.patch
> 
> diff --git a/target/linux/ath79/patches-5.4/930-ar8216-make-reg-access-atomic.patch b/target/linux/ath79/patches-5.4/930-ar8216-make-reg-access-atomic.patch
> new file mode 100644
> index 0000000000..42f3305195
> --- /dev/null
> +++ b/target/linux/ath79/patches-5.4/930-ar8216-make-reg-access-atomic.patch
> @@ -0,0 +1,61 @@
> +From b3797d1a92afe97c173b00fdb7824cedba24eef0 Mon Sep 17 00:00:00 2001
> +From: Chuanhong Guo <gch981213 at gmail.com>
> +Date: Sun, 20 Sep 2020 01:00:45 +0800
> +Subject: [PATCH] ath79: ar8216: make switch register access atomic
> +
> +due to some unknown reason these register accesses sometimes fail
> +on the integrated switch without this patch.
> +
> +THIS ONLY WORKS ON ATH79 AND MAY BREAK THE DRIVER ON OTHER PLATFORMS!
> +The mdio bus on ath79 works in polling mode and doesn't rely on
> +any interrupt. This patch breaks the driver on any mdio master
> +with interrupts used.
> +
> +---
> +--- a/drivers/net/phy/ar8216.c
> ++++ b/drivers/net/phy/ar8216.c
> +@@ -253,12 +253,14 @@ ar8xxx_mii_write32(struct ar8xxx_priv *p
> + u32
> + ar8xxx_read(struct ar8xxx_priv *priv, int reg)
> + {
> ++	unsigned long flags;
> + 	struct mii_bus *bus = priv->mii_bus;
> + 	u16 r1, r2, page;
> + 	u32 val;
> + 
> + 	split_addr((u32) reg, &r1, &r2, &page);
> + 
> ++	local_irq_save(flags);
> + 	mutex_lock(&bus->mdio_lock);
> + 
> + 	bus->write(bus, 0x18, 0, page);
> +@@ -266,6 +268,7 @@ ar8xxx_read(struct ar8xxx_priv *priv, in
> + 	val = ar8xxx_mii_read32(priv, 0x10 | r2, r1);
> + 
> + 	mutex_unlock(&bus->mdio_lock);
> ++	local_irq_restore(flags);
> + 
> + 	return val;
> + }
> +@@ -273,11 +276,13 @@ ar8xxx_read(struct ar8xxx_priv *priv, in
> + void
> + ar8xxx_write(struct ar8xxx_priv *priv, int reg, u32 val)
> + {
> ++	unsigned long flags;
> + 	struct mii_bus *bus = priv->mii_bus;
> + 	u16 r1, r2, page;
> + 
> + 	split_addr((u32) reg, &r1, &r2, &page);
> + 
> ++	local_irq_save(flags);
> + 	mutex_lock(&bus->mdio_lock);
> + 
> + 	bus->write(bus, 0x18, 0, page);
> +@@ -285,6 +290,7 @@ ar8xxx_write(struct ar8xxx_priv *priv, i
> + 	ar8xxx_mii_write32(priv, 0x10 | r2, r1, val);
> + 
> + 	mutex_unlock(&bus->mdio_lock);
> ++	local_irq_restore(flags);
> + }
> + 
> + u32
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://lists.openwrt.org/pipermail/openwrt-devel/attachments/20201004/8f3af2ac/attachment.sig>


More information about the openwrt-devel mailing list