From: Martin Blumenstingl <martin.blumenstingl@googlemail.com> Date: 2021-01-03 01:27:02
While testing the lantiq_gswip driver in OpenWrt at least one board had
a non-working Ethernet port connected to an internal 100Mbit/s PHY22F
GPHY. The problem which could be observed:
- the PHY would detect the link just fine
- ethtool stats would see the TX counter rise
- the RX counter in ethtool was stuck at zero
It turns out that two independent patches are needed to fix this:
- first we need to enable the MII data lines also for internal PHYs
- second we need to program the GSWIP_MII_CFG registers for all ports
except the CPU port
These two patches have also been tested by back-porting them on top of
Linux 5.4.86 in OpenWrt.
Special thanks to Hauke for debugging and brainstorming this on IRC
with me!
Martin Blumenstingl (2):
net: dsa: lantiq_gswip: Enable GSWIP_MII_CFG_EN also for internal PHYs
net: dsa: lantiq_gswip: Fix GSWIP_MII_CFG(p) register access
drivers/net/dsa/lantiq_gswip.c | 27 +++++++--------------------
1 file changed, 7 insertions(+), 20 deletions(-)
--
2.30.0
From: Martin Blumenstingl <martin.blumenstingl@googlemail.com> Date: 2021-01-03 01:27:02
Enable GSWIP_MII_CFG_EN also for internal PHYs to make traffic flow.
Without this the PHY link is detected properly and ethtool statistics
for TX are increasing but there's no RX traffic coming in.
Fixes: 14fceff4771e51 ("net: dsa: Add Lantiq / Intel DSA driver for vrx200")
Cc: stable@vger.kernel.org
Suggested-by: Hauke Mehrtens <hauke@hauke-m.de>
Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
---
drivers/net/dsa/lantiq_gswip.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
@@ -1541,9 +1541,7 @@ static void gswip_phylink_mac_link_up(struct dsa_switch *ds, int port,{structgswip_priv*priv=ds->priv;-/* Enable the xMII interface only for the external PHY */-if(interface!=PHY_INTERFACE_MODE_INTERNAL)-gswip_mii_mask_cfg(priv,0,GSWIP_MII_CFG_EN,port);+gswip_mii_mask_cfg(priv,0,GSWIP_MII_CFG_EN,port);}staticvoidgswip_get_strings(structdsa_switch*ds,intport,u32stringset,
From: Martin Blumenstingl <martin.blumenstingl@googlemail.com> Date: 2021-01-03 01:27:22
There is one GSWIP_MII_CFG register for each switch-port except the CPU
port. The register offset for the first port is 0x0, 0x02 for the
second, 0x04 for the third and so on.
Update the driver to not only restrict the GSWIP_MII_CFG registers to
ports 0, 1 and 5. Handle ports 0..5 instead but skip the CPU port. This
means we are not overwriting the configuration for the third port (port
two since we start counting from zero) with the settings for the sixth
port (with number five) anymore.
The GSWIP_MII_PCDU(p) registers are not updated because there's really
only three (one for each of the following ports: 0, 1, 5).
Fixes: 14fceff4771e51 ("net: dsa: Add Lantiq / Intel DSA driver for vrx200")
Cc: stable@vger.kernel.org
Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
---
drivers/net/dsa/lantiq_gswip.c | 23 ++++++-----------------
1 file changed, 6 insertions(+), 17 deletions(-)
@@ -392,17 +390,9 @@ static void gswip_mii_mask(struct gswip_priv *priv, u32 clear, u32 set,staticvoidgswip_mii_mask_cfg(structgswip_priv*priv,u32clear,u32set,intport){-switch(port){-case0:-gswip_mii_mask(priv,clear,set,GSWIP_MII_CFG0);-break;-case1:-gswip_mii_mask(priv,clear,set,GSWIP_MII_CFG1);-break;-case5:-gswip_mii_mask(priv,clear,set,GSWIP_MII_CFG5);-break;-}+/* There's no MII_CFG register for the CPU port */+if(!dsa_is_cpu_port(priv->ds,port))+gswip_mii_mask(priv,clear,set,GSWIP_MII_CFGp(port));}staticvoidgswip_mii_mask_pcdu(structgswip_priv*priv,u32clear,u32set,
@@ -822,9 +812,8 @@ static int gswip_setup(struct dsa_switch *ds)gswip_mdio_mask(priv,0xff,0x09,GSWIP_MDIO_MDC_CFG1);/* Disable the xMII link */-gswip_mii_mask_cfg(priv,GSWIP_MII_CFG_EN,0,0);-gswip_mii_mask_cfg(priv,GSWIP_MII_CFG_EN,0,1);-gswip_mii_mask_cfg(priv,GSWIP_MII_CFG_EN,0,5);+for(i=0;i<priv->hw_info->max_ports;i++)+gswip_mii_mask_cfg(priv,GSWIP_MII_CFG_EN,0,i);/* enable special tag insertion on cpu port */gswip_switch_mask(priv,0,GSWIP_FDMA_PCTRL_STEN,
Enable GSWIP_MII_CFG_EN also for internal PHYs to make traffic flow.
Without this the PHY link is detected properly and ethtool statistics
for TX are increasing but there's no RX traffic coming in.
Fixes: 14fceff4771e51 ("net: dsa: Add Lantiq / Intel DSA driver for vrx200")
Cc: stable@vger.kernel.org
Suggested-by: Hauke Mehrtens <hauke@hauke-m.de>
Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
@@ -1541,9 +1541,7 @@ static void gswip_phylink_mac_link_up(struct dsa_switch *ds, int port,{structgswip_priv*priv=ds->priv;-/* Enable the xMII interface only for the external PHY */-if(interface!=PHY_INTERFACE_MODE_INTERNAL)-gswip_mii_mask_cfg(priv,0,GSWIP_MII_CFG_EN,port);+gswip_mii_mask_cfg(priv,0,GSWIP_MII_CFG_EN,port);}staticvoidgswip_get_strings(structdsa_switch*ds,intport,u32stringset,
There is one GSWIP_MII_CFG register for each switch-port except the CPU
port. The register offset for the first port is 0x0, 0x02 for the
second, 0x04 for the third and so on.
Update the driver to not only restrict the GSWIP_MII_CFG registers to
ports 0, 1 and 5. Handle ports 0..5 instead but skip the CPU port. This
means we are not overwriting the configuration for the third port (port
two since we start counting from zero) with the settings for the sixth
port (with number five) anymore.
The GSWIP_MII_PCDU(p) registers are not updated because there's really
only three (one for each of the following ports: 0, 1, 5).
Fixes: 14fceff4771e51 ("net: dsa: Add Lantiq / Intel DSA driver for vrx200")
Cc: stable@vger.kernel.org
Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
@@ -392,17 +390,9 @@ static void gswip_mii_mask(struct gswip_priv *priv, u32 clear, u32 set,staticvoidgswip_mii_mask_cfg(structgswip_priv*priv,u32clear,u32set,intport){-switch(port){-case0:-gswip_mii_mask(priv,clear,set,GSWIP_MII_CFG0);-break;-case1:-gswip_mii_mask(priv,clear,set,GSWIP_MII_CFG1);-break;-case5:-gswip_mii_mask(priv,clear,set,GSWIP_MII_CFG5);-break;-}+/* There's no MII_CFG register for the CPU port */+if(!dsa_is_cpu_port(priv->ds,port))+gswip_mii_mask(priv,clear,set,GSWIP_MII_CFGp(port));}staticvoidgswip_mii_mask_pcdu(structgswip_priv*priv,u32clear,u32set,
@@ -822,9 +812,8 @@ static int gswip_setup(struct dsa_switch *ds)gswip_mdio_mask(priv,0xff,0x09,GSWIP_MDIO_MDC_CFG1);/* Disable the xMII link */-gswip_mii_mask_cfg(priv,GSWIP_MII_CFG_EN,0,0);-gswip_mii_mask_cfg(priv,GSWIP_MII_CFG_EN,0,1);-gswip_mii_mask_cfg(priv,GSWIP_MII_CFG_EN,0,5);+for(i=0;i<priv->hw_info->max_ports;i++)+gswip_mii_mask_cfg(priv,GSWIP_MII_CFG_EN,0,i);/* enable special tag insertion on cpu port */gswip_switch_mask(priv,0,GSWIP_FDMA_PCTRL_STEN,
From: Andrew Lunn <andrew@lunn.ch> Date: 2021-01-03 02:10:19
On Sun, Jan 03, 2021 at 02:25:43AM +0100, Martin Blumenstingl wrote:
Enable GSWIP_MII_CFG_EN also for internal PHYs to make traffic flow.
Without this the PHY link is detected properly and ethtool statistics
for TX are increasing but there's no RX traffic coming in.
Fixes: 14fceff4771e51 ("net: dsa: Add Lantiq / Intel DSA driver for vrx200")
Cc: stable@vger.kernel.org
Hi Martin
No need to Cc: stable. David or Jakub will handle the backport to
stable. You should however set the subject to [PATCH net 1/2] and
base the patches on the net tree, not net-next.
Andrew
From: Martin Blumenstingl <martin.blumenstingl@googlemail.com> Date: 2021-01-03 02:13:30
Hi Andrew,
On Sun, Jan 3, 2021 at 3:09 AM Andrew Lunn [off-list ref] wrote:
On Sun, Jan 03, 2021 at 02:25:43AM +0100, Martin Blumenstingl wrote:
quoted
Enable GSWIP_MII_CFG_EN also for internal PHYs to make traffic flow.
Without this the PHY link is detected properly and ethtool statistics
for TX are increasing but there's no RX traffic coming in.
Fixes: 14fceff4771e51 ("net: dsa: Add Lantiq / Intel DSA driver for vrx200")
Cc: stable@vger.kernel.org
Hi Martin
No need to Cc: stable. David or Jakub will handle the backport to
stable. You should however set the subject to [PATCH net 1/2] and
base the patches on the net tree, not net-next.
do you recommend re-sending these patches and changing the subject?
the lantiq_gswip.c driver is identical in -net and -net-next and so
the patch will apply fine in both cases
Best regards,
Martin
Enable GSWIP_MII_CFG_EN also for internal PHYs to make traffic flow.
Without this the PHY link is detected properly and ethtool statistics
for TX are increasing but there's no RX traffic coming in.
Fixes: 14fceff4771e51 ("net: dsa: Add Lantiq / Intel DSA driver for vrx200")
Cc: stable@vger.kernel.org
Suggested-by: Hauke Mehrtens <hauke@hauke-m.de>
Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
There is one GSWIP_MII_CFG register for each switch-port except the CPU
port. The register offset for the first port is 0x0, 0x02 for the
second, 0x04 for the third and so on.
Update the driver to not only restrict the GSWIP_MII_CFG registers to
ports 0, 1 and 5. Handle ports 0..5 instead but skip the CPU port. This
means we are not overwriting the configuration for the third port (port
two since we start counting from zero) with the settings for the sixth
port (with number five) anymore.
The GSWIP_MII_PCDU(p) registers are not updated because there's really
only three (one for each of the following ports: 0, 1, 5).
Fixes: 14fceff4771e51 ("net: dsa: Add Lantiq / Intel DSA driver for vrx200")
Cc: stable@vger.kernel.org
Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
From: Jakub Kicinski <kuba@kernel.org> Date: 2021-01-04 21:53:23
On Sun, 3 Jan 2021 03:12:21 +0100 Martin Blumenstingl wrote:
Hi Andrew,
On Sun, Jan 3, 2021 at 3:09 AM Andrew Lunn [off-list ref] wrote:
quoted
On Sun, Jan 03, 2021 at 02:25:43AM +0100, Martin Blumenstingl wrote:
quoted
Enable GSWIP_MII_CFG_EN also for internal PHYs to make traffic flow.
Without this the PHY link is detected properly and ethtool statistics
for TX are increasing but there's no RX traffic coming in.
Fixes: 14fceff4771e51 ("net: dsa: Add Lantiq / Intel DSA driver for vrx200")
Cc: stable@vger.kernel.org
Hi Martin
No need to Cc: stable. David or Jakub will handle the backport to
stable. You should however set the subject to [PATCH net 1/2] and
base the patches on the net tree, not net-next.
do you recommend re-sending these patches and changing the subject?
the lantiq_gswip.c driver is identical in -net and -net-next and so
the patch will apply fine in both cases
Resend is pretty much always a safe bet. But since as you said trees
are identical at the moment I made an exception applied as is :)
Thanks everyone!
From: Martin Blumenstingl <martin.blumenstingl@googlemail.com> Date: 2021-01-04 23:55:30
Hi Jakub,
On Mon, Jan 4, 2021 at 10:52 PM Jakub Kicinski [off-list ref] wrote:
On Sun, 3 Jan 2021 03:12:21 +0100 Martin Blumenstingl wrote:
quoted
Hi Andrew,
On Sun, Jan 3, 2021 at 3:09 AM Andrew Lunn [off-list ref] wrote:
quoted
On Sun, Jan 03, 2021 at 02:25:43AM +0100, Martin Blumenstingl wrote:
quoted
Enable GSWIP_MII_CFG_EN also for internal PHYs to make traffic flow.
Without this the PHY link is detected properly and ethtool statistics
for TX are increasing but there's no RX traffic coming in.
Fixes: 14fceff4771e51 ("net: dsa: Add Lantiq / Intel DSA driver for vrx200")
Cc: stable@vger.kernel.org
Hi Martin
No need to Cc: stable. David or Jakub will handle the backport to
stable. You should however set the subject to [PATCH net 1/2] and
base the patches on the net tree, not net-next.
do you recommend re-sending these patches and changing the subject?
the lantiq_gswip.c driver is identical in -net and -net-next and so
the patch will apply fine in both cases
Resend is pretty much always a safe bet. But since as you said trees
are identical at the moment I made an exception applied as is :)