[PATCH] ath79: ar8216: make switch register access atomic
Felix Fietkau
nbd at nbd.name
Mon Sep 21 12:37:38 EDT 2020
On 2020-09-21 18:26, Chuanhong Guo wrote:
> Hi!
>
> On Mon, Sep 21, 2020 at 9:24 PM Felix Fietkau <nbd at nbd.name> wrote:
>> > +
>> > + split_addr((u32) reg, &r1, &r2, &page);
>> > +
>> > ++ local_irq_save(flags);
>> > + mutex_lock(&bus->mdio_lock);
>> Taking a mutex in an irq-disabled section is basically asking for a
>> deadlock. What router is this issue reproduced on?
>
> Any ar934x/qca953x router using built-in switch, based on
> Flyspray bug reports. I can reproduce it on ar9341/tp-link-wr841n-v8
> As there's an ancient commit about the same issue I guess
> it appears on ar724x/ar933x as well.
> here's the commit message:
> commit 5d77f370d695c9a70f25ffb8367db64efadaaedd
> Author: Gabor Juhos <juhosg at openwrt.org>
> Date: Sun May 8 16:32:53 2011 +0000
>
> ar71xx: ag71xx: make switch register access atomic
>
> Reading of the PHY registers occasionally returns with bogus values
> under heavy load. This misleads the PHY driver and thus causes false
> link/speed change notifications which leads to performance loss.
> [and some dmesg after this]
>
>> What else is running at the time this happens?
>
> I'm using a minimal wr841n-v8 image. (make menuconfig,
> select the device, save and build the firmware)
> no extra background tasks are running.
> swconfig led trigger is used so the kernel is constantly
> polling port status from switch in the background.
I have another idea what you could try. Many SoCs enable both MDIO
busses, and maybe they have some shared resources/state in the hw.
You could try making a global spinlock in ag71xx_mdio.c and do
spin_lock_bh(&mdio_lock) in ag71xx_mdio_mii_read and ag71xx_mdio_mii_write
- Felix
More information about the openwrt-devel
mailing list