Re: [PATCH v2 2/2] net: mvpp2: fix phylink handling of invalid PHY modes

2018-12-04 Thread David Miller
From: Baruch Siach 
Date: Tue,  4 Dec 2018 16:03:53 +0200

> The .validate phylink callback should empty the supported bitmap when
> the interface mode is invalid.
> 
> Cc: Maxime Chevallier 
> Cc: Antoine Tenart 
> Reported-by: Russell King 
> Signed-off-by: Baruch Siach 

Applied.


[PATCH v2 2/2] net: mvpp2: fix phylink handling of invalid PHY modes

2018-12-04 Thread Baruch Siach
The .validate phylink callback should empty the supported bitmap when
the interface mode is invalid.

Cc: Maxime Chevallier 
Cc: Antoine Tenart 
Reported-by: Russell King 
Signed-off-by: Baruch Siach 
---
v2:
  New patch in this series
---
 .../net/ethernet/marvell/mvpp2/mvpp2_main.c   | 33 ++-
 1 file changed, 32 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c 
b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
index eb1dc8abc359..125ea99418df 100644
--- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
+++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
@@ -4375,8 +4375,27 @@ static void mvpp2_phylink_validate(struct net_device 
*dev,
   unsigned long *supported,
   struct phylink_link_state *state)
 {
+   struct mvpp2_port *port = netdev_priv(dev);
__ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, };
 
+   /* Invalid combinations */
+   switch (state->interface) {
+   case PHY_INTERFACE_MODE_10GKR:
+   case PHY_INTERFACE_MODE_XAUI:
+   if (port->gop_id != 0)
+   goto empty_set;
+   break;
+   case PHY_INTERFACE_MODE_RGMII:
+   case PHY_INTERFACE_MODE_RGMII_ID:
+   case PHY_INTERFACE_MODE_RGMII_RXID:
+   case PHY_INTERFACE_MODE_RGMII_TXID:
+   if (port->gop_id == 0)
+   goto empty_set;
+   break;
+   default:
+   break;
+   }
+
phylink_set(mask, Autoneg);
phylink_set_port_modes(mask);
phylink_set(mask, Pause);
@@ -4384,6 +4403,7 @@ static void mvpp2_phylink_validate(struct net_device *dev,
 
switch (state->interface) {
case PHY_INTERFACE_MODE_10GKR:
+   case PHY_INTERFACE_MODE_XAUI:
case PHY_INTERFACE_MODE_NA:
phylink_set(mask, 1baseCR_Full);
phylink_set(mask, 1baseSR_Full);
@@ -4392,7 +4412,11 @@ static void mvpp2_phylink_validate(struct net_device 
*dev,
phylink_set(mask, 1baseER_Full);
phylink_set(mask, 1baseKR_Full);
/* Fall-through */
-   default:
+   case PHY_INTERFACE_MODE_RGMII:
+   case PHY_INTERFACE_MODE_RGMII_ID:
+   case PHY_INTERFACE_MODE_RGMII_RXID:
+   case PHY_INTERFACE_MODE_RGMII_TXID:
+   case PHY_INTERFACE_MODE_SGMII:
phylink_set(mask, 10baseT_Half);
phylink_set(mask, 10baseT_Full);
phylink_set(mask, 100baseT_Half);
@@ -4404,11 +4428,18 @@ static void mvpp2_phylink_validate(struct net_device 
*dev,
phylink_set(mask, 1000baseT_Full);
phylink_set(mask, 1000baseX_Full);
phylink_set(mask, 2500baseX_Full);
+   break;
+   default:
+   goto empty_set;
}
 
bitmap_and(supported, supported, mask, __ETHTOOL_LINK_MODE_MASK_NBITS);
bitmap_and(state->advertising, state->advertising, mask,
   __ETHTOOL_LINK_MODE_MASK_NBITS);
+   return;
+
+empty_set:
+   bitmap_zero(supported, __ETHTOOL_LINK_MODE_MASK_NBITS);
 }
 
 static void mvpp22_xlg_link_state(struct mvpp2_port *port,
-- 
2.19.2