Skip to content

Commit 5b0d7d7

Browse files
joabreudavem330
authored andcommitted
net: stmmac: Add the missing speeds that XGMAC supports
XGMAC supports following speeds: - 10G XGMII - 5G XGMII - 2.5G XGMII - 2.5G GMII - 1G GMII - 100M MII - 10M MII Add them to the stmmac driver. Signed-off-by: Jose Abreu <[email protected]> Cc: Joao Pinto <[email protected]> Cc: David S. Miller <[email protected]> Cc: Giuseppe Cavallaro <[email protected]> Cc: Alexandre Torgue <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 900a81c commit 5b0d7d7

File tree

4 files changed

+86
-23
lines changed

4 files changed

+86
-23
lines changed

drivers/net/ethernet/stmicro/stmmac/common.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -392,8 +392,12 @@ struct mac_link {
392392
u32 speed100;
393393
u32 speed1000;
394394
u32 speed2500;
395-
u32 speed10000;
396395
u32 duplex;
396+
struct {
397+
u32 speed2500;
398+
u32 speed5000;
399+
u32 speed10000;
400+
} xgmii;
397401
};
398402

399403
struct mii_regs {

drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,14 @@
1515
/* MAC Registers */
1616
#define XGMAC_TX_CONFIG 0x00000000
1717
#define XGMAC_CONFIG_SS_OFF 29
18-
#define XGMAC_CONFIG_SS_MASK GENMASK(30, 29)
18+
#define XGMAC_CONFIG_SS_MASK GENMASK(31, 29)
1919
#define XGMAC_CONFIG_SS_10000 (0x0 << XGMAC_CONFIG_SS_OFF)
20-
#define XGMAC_CONFIG_SS_2500 (0x2 << XGMAC_CONFIG_SS_OFF)
21-
#define XGMAC_CONFIG_SS_1000 (0x3 << XGMAC_CONFIG_SS_OFF)
20+
#define XGMAC_CONFIG_SS_2500_GMII (0x2 << XGMAC_CONFIG_SS_OFF)
21+
#define XGMAC_CONFIG_SS_1000_GMII (0x3 << XGMAC_CONFIG_SS_OFF)
22+
#define XGMAC_CONFIG_SS_100_MII (0x4 << XGMAC_CONFIG_SS_OFF)
23+
#define XGMAC_CONFIG_SS_5000 (0x5 << XGMAC_CONFIG_SS_OFF)
24+
#define XGMAC_CONFIG_SS_2500 (0x6 << XGMAC_CONFIG_SS_OFF)
25+
#define XGMAC_CONFIG_SS_10_MII (0x7 << XGMAC_CONFIG_SS_OFF)
2226
#define XGMAC_CONFIG_SARC GENMASK(22, 20)
2327
#define XGMAC_CONFIG_SARC_SHIFT 20
2428
#define XGMAC_CONFIG_JD BIT(16)

drivers/net/ethernet/stmicro/stmmac/dwxgmac2_core.c

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ static void dwxgmac2_core_init(struct mac_device_info *hw,
3636

3737
switch (hw->ps) {
3838
case SPEED_10000:
39-
tx |= hw->link.speed10000;
39+
tx |= hw->link.xgmii.speed10000;
4040
break;
4141
case SPEED_2500:
4242
tx |= hw->link.speed2500;
@@ -381,11 +381,13 @@ int dwxgmac2_setup(struct stmmac_priv *priv)
381381
mac->mcast_bits_log2 = ilog2(mac->multicast_filter_bins);
382382

383383
mac->link.duplex = 0;
384-
mac->link.speed10 = 0;
385-
mac->link.speed100 = 0;
386-
mac->link.speed1000 = XGMAC_CONFIG_SS_1000;
387-
mac->link.speed2500 = XGMAC_CONFIG_SS_2500;
388-
mac->link.speed10000 = XGMAC_CONFIG_SS_10000;
384+
mac->link.speed10 = XGMAC_CONFIG_SS_10_MII;
385+
mac->link.speed100 = XGMAC_CONFIG_SS_100_MII;
386+
mac->link.speed1000 = XGMAC_CONFIG_SS_1000_GMII;
387+
mac->link.speed2500 = XGMAC_CONFIG_SS_2500_GMII;
388+
mac->link.xgmii.speed2500 = XGMAC_CONFIG_SS_2500;
389+
mac->link.xgmii.speed5000 = XGMAC_CONFIG_SS_5000;
390+
mac->link.xgmii.speed10000 = XGMAC_CONFIG_SS_10000;
389391
mac->link.speed_mask = XGMAC_CONFIG_SS_MASK;
390392

391393
mac->mii.addr = XGMAC_MDIO_ADDR;

drivers/net/ethernet/stmicro/stmmac/stmmac_main.c

Lines changed: 66 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -805,14 +805,43 @@ static void stmmac_validate(struct phylink_config *config,
805805
struct phylink_link_state *state)
806806
{
807807
struct stmmac_priv *priv = netdev_priv(to_net_dev(config->dev));
808+
__ETHTOOL_DECLARE_LINK_MODE_MASK(mac_supported) = { 0, };
808809
__ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, };
809810
int tx_cnt = priv->plat->tx_queues_to_use;
810811
int max_speed = priv->plat->max_speed;
811812

813+
phylink_set(mac_supported, 10baseT_Half);
814+
phylink_set(mac_supported, 10baseT_Full);
815+
phylink_set(mac_supported, 100baseT_Half);
816+
phylink_set(mac_supported, 100baseT_Full);
817+
818+
phylink_set(mac_supported, Autoneg);
819+
phylink_set(mac_supported, Pause);
820+
phylink_set(mac_supported, Asym_Pause);
821+
phylink_set_port_modes(mac_supported);
822+
823+
if (priv->plat->has_gmac ||
824+
priv->plat->has_gmac4 ||
825+
priv->plat->has_xgmac) {
826+
phylink_set(mac_supported, 1000baseT_Half);
827+
phylink_set(mac_supported, 1000baseT_Full);
828+
phylink_set(mac_supported, 1000baseKX_Full);
829+
}
830+
812831
/* Cut down 1G if asked to */
813832
if ((max_speed > 0) && (max_speed < 1000)) {
814833
phylink_set(mask, 1000baseT_Full);
815834
phylink_set(mask, 1000baseX_Full);
835+
} else if (priv->plat->has_xgmac) {
836+
phylink_set(mac_supported, 2500baseT_Full);
837+
phylink_set(mac_supported, 5000baseT_Full);
838+
phylink_set(mac_supported, 10000baseSR_Full);
839+
phylink_set(mac_supported, 10000baseLR_Full);
840+
phylink_set(mac_supported, 10000baseER_Full);
841+
phylink_set(mac_supported, 10000baseLRM_Full);
842+
phylink_set(mac_supported, 10000baseT_Full);
843+
phylink_set(mac_supported, 10000baseKX4_Full);
844+
phylink_set(mac_supported, 10000baseKR_Full);
816845
}
817846

818847
/* Half-Duplex can only work with single queue */
@@ -822,7 +851,12 @@ static void stmmac_validate(struct phylink_config *config,
822851
phylink_set(mask, 1000baseT_Half);
823852
}
824853

825-
bitmap_andnot(supported, supported, mask, __ETHTOOL_LINK_MODE_MASK_NBITS);
854+
bitmap_and(supported, supported, mac_supported,
855+
__ETHTOOL_LINK_MODE_MASK_NBITS);
856+
bitmap_andnot(supported, supported, mask,
857+
__ETHTOOL_LINK_MODE_MASK_NBITS);
858+
bitmap_and(state->advertising, state->advertising, mac_supported,
859+
__ETHTOOL_LINK_MODE_MASK_NBITS);
826860
bitmap_andnot(state->advertising, state->advertising, mask,
827861
__ETHTOOL_LINK_MODE_MASK_NBITS);
828862
}
@@ -842,18 +876,37 @@ static void stmmac_mac_config(struct phylink_config *config, unsigned int mode,
842876
ctrl = readl(priv->ioaddr + MAC_CTRL_REG);
843877
ctrl &= ~priv->hw->link.speed_mask;
844878

845-
switch (state->speed) {
846-
case SPEED_1000:
847-
ctrl |= priv->hw->link.speed1000;
848-
break;
849-
case SPEED_100:
850-
ctrl |= priv->hw->link.speed100;
851-
break;
852-
case SPEED_10:
853-
ctrl |= priv->hw->link.speed10;
854-
break;
855-
default:
856-
return;
879+
if (state->interface == PHY_INTERFACE_MODE_USXGMII) {
880+
switch (state->speed) {
881+
case SPEED_10000:
882+
ctrl |= priv->hw->link.xgmii.speed10000;
883+
break;
884+
case SPEED_5000:
885+
ctrl |= priv->hw->link.xgmii.speed5000;
886+
break;
887+
case SPEED_2500:
888+
ctrl |= priv->hw->link.xgmii.speed2500;
889+
break;
890+
default:
891+
return;
892+
}
893+
} else {
894+
switch (state->speed) {
895+
case SPEED_2500:
896+
ctrl |= priv->hw->link.speed2500;
897+
break;
898+
case SPEED_1000:
899+
ctrl |= priv->hw->link.speed1000;
900+
break;
901+
case SPEED_100:
902+
ctrl |= priv->hw->link.speed100;
903+
break;
904+
case SPEED_10:
905+
ctrl |= priv->hw->link.speed10;
906+
break;
907+
default:
908+
return;
909+
}
857910
}
858911

859912
priv->speed = state->speed;

0 commit comments

Comments
 (0)