In case of this switch we work with 32bit registers on top of 16bit
bus. Some registers (for example access to forwarding database) have
trigger bit on the first 16bit half of request and the result +
configuration of request in the second half. Without this patch, we would
trigger database operation and overwrite result in one run.
To make it work properly, we should do the second part of transfer
before the first one is done.
So far, this rule seems to work for all registers on this switch.
Fixes: ec6698c272de ("net: dsa: add support for Atheros AR9331 built-in switch")
Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
---
drivers/net/dsa/qca/ar9331.c | 14 +++++++++++---
1 file changed, 11 insertions(+), 3 deletions(-)
@@ -837,16 +837,24 @@ static int ar9331_mdio_write(void *ctx, u32 reg, u32 val)return0;}-ret=__ar9331_mdio_write(sbus,AR9331_SW_MDIO_PHY_MODE_REG,reg,val);+/* In case of this switch we work with 32bit registers on top of 16bit+*bus.Someregisters(forexampleaccesstoforwardingdatabase)have+*triggerbitonthefirst16bithalfofrequest,theresultand+*configurationofrequestinthesecondhalf.+*Tomakeitworkproperly,weshoulddothesecondpartoftransfer+*beforethefirstoneisdone.+*/+ret=__ar9331_mdio_write(sbus,AR9331_SW_MDIO_PHY_MODE_REG,reg+2,+val>>16);if(ret<0)gotoerror;-ret=__ar9331_mdio_write(sbus,AR9331_SW_MDIO_PHY_MODE_REG,reg+2,-val>>16);+ret=__ar9331_mdio_write(sbus,AR9331_SW_MDIO_PHY_MODE_REG,reg,val);if(ret<0)gotoerror;return0;+error:dev_err_ratelimited(&sbus->dev,"Bus error. Failed to write register.\n");returnret;
In case of this switch we work with 32bit registers on top of 16bit
bus. Some registers (for example access to forwarding database) have
trigger bit on the first 16bit half of request and the result +
configuration of request in the second half. Without this patch, we would
trigger database operation and overwrite result in one run.
To make it work properly, we should do the second part of transfer
before the first one is done.
So far, this rule seems to work for all registers on this switch.
Fixes: ec6698c272de ("net: dsa: add support for Atheros AR9331 built-in switch")
Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
From: Vladimir Oltean <olteanv@gmail.com> Date: 2021-08-03 09:53:44
On Tue, Aug 03, 2021 at 08:37:46AM +0200, Oleksij Rempel wrote:
In case of this switch we work with 32bit registers on top of 16bit
bus. Some registers (for example access to forwarding database) have
trigger bit on the first 16bit half of request and the result +
configuration of request in the second half. Without this patch, we would
trigger database operation and overwrite result in one run.
To make it work properly, we should do the second part of transfer
before the first one is done.
So far, this rule seems to work for all registers on this switch.
Fixes: ec6698c272de ("net: dsa: add support for Atheros AR9331 built-in switch")
Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
---
Hello:
This patch was applied to netdev/net.git (refs/heads/master):
On Tue, 3 Aug 2021 08:37:46 +0200 you wrote:
In case of this switch we work with 32bit registers on top of 16bit
bus. Some registers (for example access to forwarding database) have
trigger bit on the first 16bit half of request and the result +
configuration of request in the second half. Without this patch, we would
trigger database operation and overwrite result in one run.
To make it work properly, we should do the second part of transfer
before the first one is done.
[...]