From 2cae8c07cb8c03a98aecbb8c7fb14c1922772adb Mon Sep 17 00:00:00 2001 From: Florian Fainelli Date: Fri, 21 Sep 2018 16:43:58 -0700 Subject: [PATCH 1/2] net: dsa: b53: Fix B53_SERDES_DIGITAL_CONTROL offset Maths went wrong, to get 0x20, we need to do 0x1e + (x) * 2, not 0x18, fix that offset so we access the correct registers. This would make us not access the correct SerDes Digital control words, status would be fine and so we would not be correctly flipping between Fiber and SGMII modes resulting in incorrect status words being pulled into the SerDes digital status register. Fixes: 0e01491de646 ("net: dsa: b53: Add SerDes support") Signed-off-by: Florian Fainelli Signed-off-by: David S. Miller --- drivers/net/dsa/b53/b53_serdes.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/dsa/b53/b53_serdes.h b/drivers/net/dsa/b53/b53_serdes.h index eed7c9357091..3bb4f91aec9e 100644 --- a/drivers/net/dsa/b53/b53_serdes.h +++ b/drivers/net/dsa/b53/b53_serdes.h @@ -20,7 +20,7 @@ #define SERDES_ID0_REV_LETTER_SHIFT 14 #define B53_SERDES_MII_REG(x) (0x20 + (x) * 2) -#define B53_SERDES_DIGITAL_CONTROL(x) (0x18 + (x) * 2) +#define B53_SERDES_DIGITAL_CONTROL(x) (0x1e + (x) * 2) #define B53_SERDES_DIGITAL_STATUS 0x28 /* SERDES_DIGITAL_CONTROL1 */ From 55a4d2eac327fca4b22544f98d86d6e7b7981913 Mon Sep 17 00:00:00 2001 From: Florian Fainelli Date: Fri, 21 Sep 2018 16:43:59 -0700 Subject: [PATCH 2/2] net: dsa: b53: Also include SGMII for mac_config and mac_link_state In both 802.3z and SGMII modes we need to configure the MAC accordingly to flip between Fiber and SGMII modes, and we need to read the MAC status from the SGMII in-band control word. Fixes: 0e01491de646 ("net: dsa: b53: Add SerDes support") Signed-off-by: Florian Fainelli Signed-off-by: David S. Miller --- drivers/net/dsa/b53/b53_common.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c index dbf5b86a07fe..700d86dd5e13 100644 --- a/drivers/net/dsa/b53/b53_common.c +++ b/drivers/net/dsa/b53/b53_common.c @@ -1172,8 +1172,9 @@ int b53_phylink_mac_link_state(struct dsa_switch *ds, int port, struct b53_device *dev = ds->priv; int ret = -EOPNOTSUPP; - if (phy_interface_mode_is_8023z(state->interface) && - dev->ops->serdes_link_state) + if ((phy_interface_mode_is_8023z(state->interface) || + state->interface == PHY_INTERFACE_MODE_SGMII) && + dev->ops->serdes_link_state) ret = dev->ops->serdes_link_state(dev, port, state); return ret; @@ -1195,8 +1196,9 @@ void b53_phylink_mac_config(struct dsa_switch *ds, int port, return; } - if (phy_interface_mode_is_8023z(state->interface) && - dev->ops->serdes_config) + if ((phy_interface_mode_is_8023z(state->interface) || + state->interface == PHY_INTERFACE_MODE_SGMII) && + dev->ops->serdes_config) dev->ops->serdes_config(dev, port, mode, state); } EXPORT_SYMBOL(b53_phylink_mac_config);