* [PATCH net v2 0/2] net: dsa: qca8k: fix qca8k driver for Turris 1.x
@ 2023-10-04 9:19 Marek Behún
2023-10-04 9:19 ` [PATCH net v2 1/2] net: dsa: qca8k: fix regmap bulk read/write methods on big endian systems Marek Behún
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Marek Behún @ 2023-10-04 9:19 UTC (permalink / raw)
To: Christian Marangi, David S. Miller, Paolo Abeni, netdev; +Cc: Marek Behún
Hi,
this is v2 of
https://lore.kernel.org/netdev/20231002104612.21898-1-kabel@kernel.org/
Changes since v1:
- fixed a typo in commit message noticed by Simon Horman
Marek Behún (2):
net: dsa: qca8k: fix regmap bulk read/write methods on big endian
systems
net: dsa: qca8k: fix potential MDIO bus conflict when accessing
internal PHYs via management frames
drivers/net/dsa/qca/qca8k-8xxx.c | 15 +++++++++++++--
1 file changed, 13 insertions(+), 2 deletions(-)
--
2.41.0
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH net v2 1/2] net: dsa: qca8k: fix regmap bulk read/write methods on big endian systems
2023-10-04 9:19 [PATCH net v2 0/2] net: dsa: qca8k: fix qca8k driver for Turris 1.x Marek Behún
@ 2023-10-04 9:19 ` Marek Behún
2023-10-05 10:48 ` Christian Marangi
2023-10-04 9:19 ` [PATCH net v2 2/2] net: dsa: qca8k: fix potential MDIO bus conflict when accessing internal PHYs via management frames Marek Behún
2023-10-06 10:50 ` [PATCH net v2 0/2] net: dsa: qca8k: fix qca8k driver for Turris 1.x patchwork-bot+netdevbpf
2 siblings, 1 reply; 6+ messages in thread
From: Marek Behún @ 2023-10-04 9:19 UTC (permalink / raw)
To: Christian Marangi, David S. Miller, Paolo Abeni, netdev; +Cc: Marek Behún
Commit c766e077d927 ("net: dsa: qca8k: convert to regmap read/write
API") introduced bulk read/write methods to qca8k's regmap.
The regmap bulk read/write methods get the register address in a buffer
passed as a void pointer parameter (the same buffer contains also the
read/written values). The register address occupies only as many bytes
as it requires at the beginning of this buffer. For example if the
.reg_bits member in regmap_config is 16 (as is the case for this
driver), the register address occupies only the first 2 bytes in this
buffer, so it can be cast to u16.
But the original commit implementing these bulk read/write methods cast
the buffer to u32:
u32 reg = *(u32 *)reg_buf & U16_MAX;
taking the first 4 bytes. This works on little endian systems where the
first 2 bytes of the buffer correspond to the low 16-bits, but it
obviously cannot work on big endian systems.
Fix this by casting the beginning of the buffer to u16 as
u32 reg = *(u16 *)reg_buf;
Fixes: c766e077d927 ("net: dsa: qca8k: convert to regmap read/write API")
Signed-off-by: Marek Behún <kabel@kernel.org>
---
drivers/net/dsa/qca/qca8k-8xxx.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/net/dsa/qca/qca8k-8xxx.c b/drivers/net/dsa/qca/qca8k-8xxx.c
index de1dc22cf683..d2df30640269 100644
--- a/drivers/net/dsa/qca/qca8k-8xxx.c
+++ b/drivers/net/dsa/qca/qca8k-8xxx.c
@@ -505,8 +505,8 @@ qca8k_bulk_read(void *ctx, const void *reg_buf, size_t reg_len,
void *val_buf, size_t val_len)
{
int i, count = val_len / sizeof(u32), ret;
- u32 reg = *(u32 *)reg_buf & U16_MAX;
struct qca8k_priv *priv = ctx;
+ u32 reg = *(u16 *)reg_buf;
if (priv->mgmt_master &&
!qca8k_read_eth(priv, reg, val_buf, val_len))
@@ -527,8 +527,8 @@ qca8k_bulk_gather_write(void *ctx, const void *reg_buf, size_t reg_len,
const void *val_buf, size_t val_len)
{
int i, count = val_len / sizeof(u32), ret;
- u32 reg = *(u32 *)reg_buf & U16_MAX;
struct qca8k_priv *priv = ctx;
+ u32 reg = *(u16 *)reg_buf;
u32 *val = (u32 *)val_buf;
if (priv->mgmt_master &&
--
2.41.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH net v2 2/2] net: dsa: qca8k: fix potential MDIO bus conflict when accessing internal PHYs via management frames
2023-10-04 9:19 [PATCH net v2 0/2] net: dsa: qca8k: fix qca8k driver for Turris 1.x Marek Behún
2023-10-04 9:19 ` [PATCH net v2 1/2] net: dsa: qca8k: fix regmap bulk read/write methods on big endian systems Marek Behún
@ 2023-10-04 9:19 ` Marek Behún
2023-10-05 10:49 ` Christian Marangi
2023-10-06 10:50 ` [PATCH net v2 0/2] net: dsa: qca8k: fix qca8k driver for Turris 1.x patchwork-bot+netdevbpf
2 siblings, 1 reply; 6+ messages in thread
From: Marek Behún @ 2023-10-04 9:19 UTC (permalink / raw)
To: Christian Marangi, David S. Miller, Paolo Abeni, netdev; +Cc: Marek Behún
Besides the QCA8337 switch the Turris 1.x device has on it's MDIO bus
also Micron ethernet PHY (dedicated to the WAN port).
We've been experiencing a strange behavior of the WAN ethernet
interface, wherein the WAN PHY started timing out the MDIO accesses, for
example when the interface was brought down and then back up.
Bisecting led to commit 2cd548566384 ("net: dsa: qca8k: add support for
phy read/write with mgmt Ethernet"), which added support to access the
QCA8337 switch's internal PHYs via management ethernet frames.
Connecting the MDIO bus pins onto an oscilloscope, I was able to see
that the MDIO bus was active whenever a request to read/write an
internal PHY register was done via an management ethernet frame.
My theory is that when the switch core always communicates with the
internal PHYs via the MDIO bus, even when externally we request the
access via ethernet. This MDIO bus is the same one via which the switch
and internal PHYs are accessible to the board, and the board may have
other devices connected on this bus. An ASCII illustration may give more
insight:
+---------+
+----| |
| | WAN PHY |
| +--| |
| | +---------+
| |
| | +----------------------------------+
| | | QCA8337 |
MDC | | | +-------+ |
------o-+--|--------o------------o--| | |
MDIO | | | | | PHY 1 |-|--to RJ45
--------o--|---o----+---------o--+--| | |
| | | | | +-------+ |
| +-------------+ | o--| | |
| | MDIO MDC | | | | PHY 2 |-|--to RJ45
eth1 | | | o--+--| | |
-----------|-|port0 | | | +-------+ |
| | | | o--| | |
| | switch core | | | | PHY 3 |-|--to RJ45
| +-------------+ o--+--| | |
| | | +-------+ |
| | o--| ... | |
+----------------------------------+
When we send a request to read an internal PHY register via an ethernet
management frame via eth1, the switch core receives the ethernet frame
on port 0 and then communicates with the internal PHY via MDIO. At this
time, other potential devices, such as the WAN PHY on Turris 1.x, cannot
use the MDIO bus, since it may cause a bus conflict.
Fix this issue by locking the MDIO bus even when we are accessing the
PHY registers via ethernet management frames.
Fixes: 2cd548566384 ("net: dsa: qca8k: add support for phy read/write with mgmt Ethernet")
Signed-off-by: Marek Behún <kabel@kernel.org>
---
drivers/net/dsa/qca/qca8k-8xxx.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/drivers/net/dsa/qca/qca8k-8xxx.c b/drivers/net/dsa/qca/qca8k-8xxx.c
index d2df30640269..4ce68e655a63 100644
--- a/drivers/net/dsa/qca/qca8k-8xxx.c
+++ b/drivers/net/dsa/qca/qca8k-8xxx.c
@@ -666,6 +666,15 @@ qca8k_phy_eth_command(struct qca8k_priv *priv, bool read, int phy,
goto err_read_skb;
}
+ /* It seems that accessing the switch's internal PHYs via management
+ * packets still uses the MDIO bus within the switch internally, and
+ * these accesses can conflict with external MDIO accesses to other
+ * devices on the MDIO bus.
+ * We therefore need to lock the MDIO bus onto which the switch is
+ * connected.
+ */
+ mutex_lock(&priv->bus->mdio_lock);
+
/* Actually start the request:
* 1. Send mdio master packet
* 2. Busy Wait for mdio master command
@@ -678,6 +687,7 @@ qca8k_phy_eth_command(struct qca8k_priv *priv, bool read, int phy,
mgmt_master = priv->mgmt_master;
if (!mgmt_master) {
mutex_unlock(&mgmt_eth_data->mutex);
+ mutex_unlock(&priv->bus->mdio_lock);
ret = -EINVAL;
goto err_mgmt_master;
}
@@ -765,6 +775,7 @@ qca8k_phy_eth_command(struct qca8k_priv *priv, bool read, int phy,
QCA8K_ETHERNET_TIMEOUT);
mutex_unlock(&mgmt_eth_data->mutex);
+ mutex_unlock(&priv->bus->mdio_lock);
return ret;
--
2.41.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH net v2 1/2] net: dsa: qca8k: fix regmap bulk read/write methods on big endian systems
2023-10-04 9:19 ` [PATCH net v2 1/2] net: dsa: qca8k: fix regmap bulk read/write methods on big endian systems Marek Behún
@ 2023-10-05 10:48 ` Christian Marangi
0 siblings, 0 replies; 6+ messages in thread
From: Christian Marangi @ 2023-10-05 10:48 UTC (permalink / raw)
To: Marek Behún; +Cc: David S. Miller, Paolo Abeni, netdev
On Wed, Oct 04, 2023 at 11:19:03AM +0200, Marek Behún wrote:
> Commit c766e077d927 ("net: dsa: qca8k: convert to regmap read/write
> API") introduced bulk read/write methods to qca8k's regmap.
>
> The regmap bulk read/write methods get the register address in a buffer
> passed as a void pointer parameter (the same buffer contains also the
> read/written values). The register address occupies only as many bytes
> as it requires at the beginning of this buffer. For example if the
> .reg_bits member in regmap_config is 16 (as is the case for this
> driver), the register address occupies only the first 2 bytes in this
> buffer, so it can be cast to u16.
>
> But the original commit implementing these bulk read/write methods cast
> the buffer to u32:
> u32 reg = *(u32 *)reg_buf & U16_MAX;
> taking the first 4 bytes. This works on little endian systems where the
> first 2 bytes of the buffer correspond to the low 16-bits, but it
> obviously cannot work on big endian systems.
>
> Fix this by casting the beginning of the buffer to u16 as
> u32 reg = *(u16 *)reg_buf;
>
> Fixes: c766e077d927 ("net: dsa: qca8k: convert to regmap read/write API")
> Signed-off-by: Marek Behún <kabel@kernel.org>
Just find time to test this on a friend's big-endian device and can confirm
this fix the problem. Thanks!
Tested-by: Christian Marangi <ansuelsmth@gmail.com>
Reviewed-by: Christian Marangi <ansuelsmth@gmail.com>
--
Ansuel
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH net v2 2/2] net: dsa: qca8k: fix potential MDIO bus conflict when accessing internal PHYs via management frames
2023-10-04 9:19 ` [PATCH net v2 2/2] net: dsa: qca8k: fix potential MDIO bus conflict when accessing internal PHYs via management frames Marek Behún
@ 2023-10-05 10:49 ` Christian Marangi
0 siblings, 0 replies; 6+ messages in thread
From: Christian Marangi @ 2023-10-05 10:49 UTC (permalink / raw)
To: Marek Behún; +Cc: David S. Miller, Paolo Abeni, netdev
On Wed, Oct 04, 2023 at 11:19:04AM +0200, Marek Behún wrote:
> Besides the QCA8337 switch the Turris 1.x device has on it's MDIO bus
> also Micron ethernet PHY (dedicated to the WAN port).
>
> We've been experiencing a strange behavior of the WAN ethernet
> interface, wherein the WAN PHY started timing out the MDIO accesses, for
> example when the interface was brought down and then back up.
>
> Bisecting led to commit 2cd548566384 ("net: dsa: qca8k: add support for
> phy read/write with mgmt Ethernet"), which added support to access the
> QCA8337 switch's internal PHYs via management ethernet frames.
>
> Connecting the MDIO bus pins onto an oscilloscope, I was able to see
> that the MDIO bus was active whenever a request to read/write an
> internal PHY register was done via an management ethernet frame.
>
> My theory is that when the switch core always communicates with the
> internal PHYs via the MDIO bus, even when externally we request the
> access via ethernet. This MDIO bus is the same one via which the switch
> and internal PHYs are accessible to the board, and the board may have
> other devices connected on this bus. An ASCII illustration may give more
> insight:
>
> +---------+
> +----| |
> | | WAN PHY |
> | +--| |
> | | +---------+
> | |
> | | +----------------------------------+
> | | | QCA8337 |
> MDC | | | +-------+ |
> ------o-+--|--------o------------o--| | |
> MDIO | | | | | PHY 1 |-|--to RJ45
> --------o--|---o----+---------o--+--| | |
> | | | | | +-------+ |
> | +-------------+ | o--| | |
> | | MDIO MDC | | | | PHY 2 |-|--to RJ45
> eth1 | | | o--+--| | |
> -----------|-|port0 | | | +-------+ |
> | | | | o--| | |
> | | switch core | | | | PHY 3 |-|--to RJ45
> | +-------------+ o--+--| | |
> | | | +-------+ |
> | | o--| ... | |
> +----------------------------------+
>
> When we send a request to read an internal PHY register via an ethernet
> management frame via eth1, the switch core receives the ethernet frame
> on port 0 and then communicates with the internal PHY via MDIO. At this
> time, other potential devices, such as the WAN PHY on Turris 1.x, cannot
> use the MDIO bus, since it may cause a bus conflict.
>
> Fix this issue by locking the MDIO bus even when we are accessing the
> PHY registers via ethernet management frames.
>
> Fixes: 2cd548566384 ("net: dsa: qca8k: add support for phy read/write with mgmt Ethernet")
> Signed-off-by: Marek Behún <kabel@kernel.org>
Reviewed-by: Christian Marangi <ansuelsmth@gmail.com>
--
Ansuel
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH net v2 0/2] net: dsa: qca8k: fix qca8k driver for Turris 1.x
2023-10-04 9:19 [PATCH net v2 0/2] net: dsa: qca8k: fix qca8k driver for Turris 1.x Marek Behún
2023-10-04 9:19 ` [PATCH net v2 1/2] net: dsa: qca8k: fix regmap bulk read/write methods on big endian systems Marek Behún
2023-10-04 9:19 ` [PATCH net v2 2/2] net: dsa: qca8k: fix potential MDIO bus conflict when accessing internal PHYs via management frames Marek Behún
@ 2023-10-06 10:50 ` patchwork-bot+netdevbpf
2 siblings, 0 replies; 6+ messages in thread
From: patchwork-bot+netdevbpf @ 2023-10-06 10:50 UTC (permalink / raw)
To: =?utf-8?q?Marek_Beh=C3=BAn_=3Ckabel=40kernel=2Eorg=3E?=
Cc: ansuelsmth, davem, pabeni, netdev
Hello:
This series was applied to netdev/net.git (main)
by David S. Miller <davem@davemloft.net>:
On Wed, 4 Oct 2023 11:19:02 +0200 you wrote:
> Hi,
>
> this is v2 of
> https://lore.kernel.org/netdev/20231002104612.21898-1-kabel@kernel.org/
>
> Changes since v1:
> - fixed a typo in commit message noticed by Simon Horman
>
> [...]
Here is the summary with links:
- [net,v2,1/2] net: dsa: qca8k: fix regmap bulk read/write methods on big endian systems
https://git.kernel.org/netdev/net/c/5652d1741574
- [net,v2,2/2] net: dsa: qca8k: fix potential MDIO bus conflict when accessing internal PHYs via management frames
https://git.kernel.org/netdev/net/c/526c8ee04bdb
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2023-10-06 10:50 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-10-04 9:19 [PATCH net v2 0/2] net: dsa: qca8k: fix qca8k driver for Turris 1.x Marek Behún
2023-10-04 9:19 ` [PATCH net v2 1/2] net: dsa: qca8k: fix regmap bulk read/write methods on big endian systems Marek Behún
2023-10-05 10:48 ` Christian Marangi
2023-10-04 9:19 ` [PATCH net v2 2/2] net: dsa: qca8k: fix potential MDIO bus conflict when accessing internal PHYs via management frames Marek Behún
2023-10-05 10:49 ` Christian Marangi
2023-10-06 10:50 ` [PATCH net v2 0/2] net: dsa: qca8k: fix qca8k driver for Turris 1.x patchwork-bot+netdevbpf
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).