Skip to content

Commit

Permalink
net: ag71xx: extend link validation to support other SoCs
Browse files Browse the repository at this point in the history
Most (all?) QCA SoCs have two MAC with different supported link
capabilities. Extend ag71xx_mac_validate() to properly validate this
variants.

Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Oleksij Rempel authored and David S. Miller committed Apr 27, 2020
1 parent 3fd8dc2 commit 0767ec0
Showing 1 changed file with 38 additions and 5 deletions.
43 changes: 38 additions & 5 deletions drivers/net/ethernet/atheros/ag71xx.c
Original file line number Diff line number Diff line change
Expand Up @@ -871,13 +871,40 @@ static void ag71xx_mac_validate(struct phylink_config *config,
unsigned long *supported,
struct phylink_link_state *state)
{
struct ag71xx *ag = netdev_priv(to_net_dev(config->dev));
__ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, };

if (state->interface != PHY_INTERFACE_MODE_NA &&
state->interface != PHY_INTERFACE_MODE_GMII &&
state->interface != PHY_INTERFACE_MODE_MII) {
bitmap_zero(supported, __ETHTOOL_LINK_MODE_MASK_NBITS);
return;
switch (state->interface) {
case PHY_INTERFACE_MODE_NA:
break;
case PHY_INTERFACE_MODE_MII:
if ((ag71xx_is(ag, AR9330) && ag->mac_idx == 0) ||
ag71xx_is(ag, AR9340) ||
ag71xx_is(ag, QCA9530) ||
(ag71xx_is(ag, QCA9550) && ag->mac_idx == 1))
break;
goto unsupported;
case PHY_INTERFACE_MODE_GMII:
if ((ag71xx_is(ag, AR9330) && ag->mac_idx == 1) ||
(ag71xx_is(ag, AR9340) && ag->mac_idx == 1) ||
(ag71xx_is(ag, QCA9530) && ag->mac_idx == 1))
break;
goto unsupported;
case PHY_INTERFACE_MODE_SGMII:
if (ag71xx_is(ag, QCA9550) && ag->mac_idx == 0)
break;
goto unsupported;
case PHY_INTERFACE_MODE_RMII:
if (ag71xx_is(ag, AR9340) && ag->mac_idx == 0)
break;
goto unsupported;
case PHY_INTERFACE_MODE_RGMII:
if ((ag71xx_is(ag, AR9340) && ag->mac_idx == 0) ||
(ag71xx_is(ag, QCA9550) && ag->mac_idx == 1))
break;
goto unsupported;
default:
goto unsupported;
}

phylink_set(mask, MII);
Expand All @@ -889,6 +916,8 @@ static void ag71xx_mac_validate(struct phylink_config *config,
phylink_set(mask, 100baseT_Full);

if (state->interface == PHY_INTERFACE_MODE_NA ||
state->interface == PHY_INTERFACE_MODE_SGMII ||
state->interface == PHY_INTERFACE_MODE_RGMII ||
state->interface == PHY_INTERFACE_MODE_GMII) {
phylink_set(mask, 1000baseT_Full);
phylink_set(mask, 1000baseX_Full);
Expand All @@ -898,6 +927,10 @@ static void ag71xx_mac_validate(struct phylink_config *config,
__ETHTOOL_LINK_MODE_MASK_NBITS);
bitmap_and(state->advertising, state->advertising, mask,
__ETHTOOL_LINK_MODE_MASK_NBITS);

return;
unsupported:
bitmap_zero(supported, __ETHTOOL_LINK_MODE_MASK_NBITS);
}

static void ag71xx_mac_pcs_get_state(struct phylink_config *config,
Expand Down

0 comments on commit 0767ec0

Please sign in to comment.