net: stmmac: convert glue drivers to use stmmac_get_phy_intf_sel()
Subsystems (9)
v2 cover net: stmmac: convert glue drivers to use stmmac_get_phy_intf_sel()
This series converts the remaining glue drivers that support multi-interface to use stmmac_get_phy_intf_sel(). The reason these drivers are not converted to the set_phy_intf_sel() method is because it is unclear whether there are ordering dependencies that would prevent it.
For example, reading the stm32mp2 documentation, it is required to set the ETH1_SEL field while the dwmac core is in reset and before clocks are enabled. This requirement can not be satsified at the moment (but could with further changes.)
v2:
- sending meson8b seperately
- updated a number of commit descriptions: PHY_INTF_SEL_xxx -> PHY_INTF_SEL_x, added note where GMII no longer errors out.
.../net/ethernet/stmicro/stmmac/dwmac-loongson1.c | 18 ++--- .../net/ethernet/stmicro/stmmac/dwmac-mediatek.c | 77 ++++++++-------------- .../net/ethernet/stmicro/stmmac/dwmac-starfive.c | 24 ++----- drivers/net/ethernet/stmicro/stmmac/dwmac-stm32.c | 44 +++++++------ .../net/ethernet/stmicro/stmmac/dwmac-visconti.c | 26 ++------ 5 files changed, 70 insertions(+), 119 deletions(-)
Signature · 2 lines
RMK's Patch system: https://www.armlinux.org.uk/developer/patches/ FTTP is here! 80Mbps down 10Mbps up. Decent connectivity at last!
PATCH v2 1/13 net: stmmac: loongson1: use PHY_INTF_SEL_x
Use PHY_INTF_SEL_x definitions for phy_intf_sel bitfield.
--- drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c +2 -2
@@ -38,8 +38,8 @@#define GMAC_SHUT BIT(6)#define PHY_INTF_SELI GENMASK(30, 28) -#define PHY_INTF_MII FIELD_PREP(PHY_INTF_SELI, 0) -#define PHY_INTF_RMII FIELD_PREP(PHY_INTF_SELI, 4) +#define PHY_INTF_MII FIELD_PREP(PHY_INTF_SELI, PHY_INTF_SEL_GMII_MII) +#define PHY_INTF_RMII FIELD_PREP(PHY_INTF_SELI, PHY_INTF_SEL_RMII)struct ls1x_dwmac {struct plat_stmmacenet_data *plat_dat;
Signature · 1 line
2.47.3
PATCH v2 2/13 net: stmmac: loongson1: use PHY_INTF_SEL_x directly
In reply to Russell King (Oracle)Use the PHY_INTF_SEL_xx values directly in ls1c_dwmac_syscon_init(), converting them to the PHY_INTF_SELI bitfield when calling regmap_update_bits().
--- drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-)
drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c +5 -6
@@ -38,8 +38,6 @@#define GMAC_SHUT BIT(6)#define PHY_INTF_SELI GENMASK(30, 28) -#define PHY_INTF_MII FIELD_PREP(PHY_INTF_SELI, PHY_INTF_SEL_GMII_MII) -#define PHY_INTF_RMII FIELD_PREP(PHY_INTF_SELI, PHY_INTF_SEL_RMII)struct ls1x_dwmac {struct plat_stmmacenet_data *plat_dat;
@@ -140,15 +138,14 @@ static int ls1c_dwmac_syscon_init(struct platform_device *pdev, void *priv)struct ls1x_dwmac *dwmac = priv;struct plat_stmmacenet_data *plat = dwmac->plat_dat;struct regmap *regmap = dwmac->regmap; +int phy_intf_sel;switch (plat->phy_interface) {case PHY_INTERFACE_MODE_MII : -regmap_update_bits (regmap,LS1X_SYSCON1 ,PHY_INTF_SELI , -PHY_INTF_MII ); + phy_intf_sel =PHY_INTF_SEL_GMII_MII ;break ;case PHY_INTERFACE_MODE_RMII : -regmap_update_bits (regmap,LS1X_SYSCON1 ,PHY_INTF_SELI , -PHY_INTF_RMII ); + phy_intf_sel =PHY_INTF_SEL_RMII ;break ;default : dev_err(&pdev->dev, "Unsupported PHY-mode %u\n",
@@ -156,6 +153,8 @@ static int ls1c_dwmac_syscon_init(struct platform_device *pdev, void *priv)return -EOPNOTSUPP ; } +regmap_update_bits (regmap,LS1X_SYSCON1 ,PHY_INTF_SELI , +FIELD_PREP (PHY_INTF_SELI , phy_intf_sel));regmap_update_bits (regmap,LS1X_SYSCON0 ,GMAC0_SHUT ,0 );return 0 ;
Signature · 1 line
2.47.3
PATCH v2 3/13 net: stmmac: loongson1: use stmmac_get_phy_intf_sel()
In reply to Russell King (Oracle)Use stmmac_get_phy_intf_sel() to decode the PHY interface mode to the phy_intf_sel value, validate the result and use that to set the control register to select the operating mode for the DWMAC core.
Note that this will allow GMII as well as MII as the phy_intf_sel value is the same for both.
--- drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-)
drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c +3 -8
@@ -140,14 +140,9 @@ static int ls1c_dwmac_syscon_init(struct platform_device *pdev, void *priv)struct regmap *regmap = dwmac->regmap;int phy_intf_sel; -switch (plat->phy_interface) { -case PHY_INTERFACE_MODE_MII : - phy_intf_sel =PHY_INTF_SEL_GMII_MII ; -break ; -case PHY_INTERFACE_MODE_RMII : - phy_intf_sel =PHY_INTF_SEL_RMII ; -break ; -default : + phy_intf_sel =stmmac_get_phy_intf_sel (plat->phy_interface); +if (phy_intf_sel !=PHY_INTF_SEL_GMII_MII && + phy_intf_sel !=PHY_INTF_SEL_RMII ) {dev_err (&pdev->dev,"Unsupported PHY-mode %u\n" , plat->phy_interface);return -EOPNOTSUPP ;
Signature · 1 line
2.47.3
PATCH v2 4/13 net: stmmac: mediatek: use PHY_INTF_SEL_x
In reply to Russell King (Oracle)Use PHY_INTF_SEL_x definitions for the fields that correspond to the phy_intf_sel inputs to the dwmac core.
--- .../ethernet/stmicro/stmmac/dwmac-mediatek.c | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-)
drivers/net/ethernet/stmicro/stmmac/dwmac-mediatek.c +8 -10
@@ -17,9 +17,6 @@/* Peri Configuration register for mt2712 */ #define PERI_ETH_PHY_INTF_SEL 0x418 -#define PHY_INTF_MII 0 -#define PHY_INTF_RGMII 1 -#define PHY_INTF_RMII 4#define RMII_CLK_SRC_RXC BIT(4)#define RMII_CLK_SRC_INTERNAL BIT(5)
@@ -118,16 +115,16 @@ static int mt2712_set_interface(struct mediatek_dwmac_plat_data *plat)/* select phy interface in top control domain */ switch (plat->phy_mode) {case PHY_INTERFACE_MODE_MII : - intf_val |=PHY_INTF_MII ; + intf_val |=PHY_INTF_SEL_GMII_MII ;break ;case PHY_INTERFACE_MODE_RMII : - intf_val |= (PHY_INTF_RMII | rmii_rxc | rmii_clk_from_mac); + intf_val |=PHY_INTF_SEL_RMII | rmii_rxc | rmii_clk_from_mac;break ;case PHY_INTERFACE_MODE_RGMII :case PHY_INTERFACE_MODE_RGMII_TXID :case PHY_INTERFACE_MODE_RGMII_RXID :case PHY_INTERFACE_MODE_RGMII_ID : - intf_val |=PHY_INTF_RGMII ; + intf_val |=PHY_INTF_SEL_RGMII ;break ;default :dev_err (plat->dev,"phy interface not supported\n" );
@@ -297,17 +294,18 @@ static int mt8195_set_interface(struct mediatek_dwmac_plat_data *plat)/* select phy interface in top control domain */ switch (plat->phy_mode) {case PHY_INTERFACE_MODE_MII : - intf_val |=FIELD_PREP (MT8195_ETH_INTF_SEL ,PHY_INTF_MII ); + intf_val |=FIELD_PREP (MT8195_ETH_INTF_SEL , +PHY_INTF_SEL_GMII_MII );break ;case PHY_INTERFACE_MODE_RMII : - intf_val |= (rmii_rxc | rmii_clk_from_mac); - intf_val |=FIELD_PREP (MT8195_ETH_INTF_SEL ,PHY_INTF_RMII ); + intf_val |= rmii_rxc | rmii_clk_from_mac; + intf_val |=FIELD_PREP (MT8195_ETH_INTF_SEL ,PHY_INTF_SEL_RMII );break ;case PHY_INTERFACE_MODE_RGMII :case PHY_INTERFACE_MODE_RGMII_TXID :case PHY_INTERFACE_MODE_RGMII_RXID :case PHY_INTERFACE_MODE_RGMII_ID : - intf_val |=FIELD_PREP (MT8195_ETH_INTF_SEL ,PHY_INTF_RGMII ); + intf_val |=FIELD_PREP (MT8195_ETH_INTF_SEL ,PHY_INTF_SEL_RGMII );break ;default :dev_err (plat->dev,"phy interface not supported\n" );
Signature · 1 line
2.47.3
PATCH v2 5/13 net: stmmac: mediatek: use stmmac_get_phy_intf_sel()
In reply to Russell King (Oracle)Use stmmac_get_phy_intf_sel() to decode the PHY interface mode to the phy_intf_sel value, validate the result, and pass that into the implementation specific ->dwmac_set_phy_interface() method. Use this to configure the PHY interface selection field.
--- .../ethernet/stmicro/stmmac/dwmac-mediatek.c | 43 +++++++++++-------- 1 file changed, 25 insertions(+), 18 deletions(-)
drivers/net/ethernet/stmicro/stmmac/dwmac-mediatek.c +25 -18
@@ -85,7 +85,8 @@ struct mediatek_dwmac_plat_data { };struct mediatek_dwmac_variant { -int (*dwmac_set_phy_interface)(struct mediatek_dwmac_plat_data *plat); +int (*dwmac_set_phy_interface)(struct mediatek_dwmac_plat_data *plat, +u8 phy_intf_sel);int (*dwmac_set_delay)(struct mediatek_dwmac_plat_data *plat);/* clock ids to be requested */
@@ -106,25 +107,25 @@ static const char * const mt8195_dwmac_clk_l[] = { "axi", "apb", "mac_cg", "mac_main", "ptp_ref" }; -static int mt2712_set_interface (struct mediatek_dwmac_plat_data *plat) +static int mt2712_set_interface (struct mediatek_dwmac_plat_data *plat, +u8 phy_intf_sel) {int rmii_clk_from_mac = plat->rmii_clk_from_mac ?RMII_CLK_SRC_INTERNAL :0 ;int rmii_rxc = plat->rmii_rxc ?RMII_CLK_SRC_RXC :0 ; -u32 intf_val =0 ; +u32 intf_val; + + intf_val = phy_intf_sel;/* select phy interface in top control domain */ switch (plat->phy_mode) { -case PHY_INTERFACE_MODE_MII : - intf_val |=PHY_INTF_SEL_GMII_MII ; -break ;case PHY_INTERFACE_MODE_RMII : - intf_val |=PHY_INTF_SEL_RMII | rmii_rxc | rmii_clk_from_mac; + intf_val |= rmii_rxc | rmii_clk_from_mac;break ; +case PHY_INTERFACE_MODE_MII :case PHY_INTERFACE_MODE_RGMII :case PHY_INTERFACE_MODE_RGMII_TXID :case PHY_INTERFACE_MODE_RGMII_RXID :case PHY_INTERFACE_MODE_RGMII_ID : - intf_val |=PHY_INTF_SEL_RGMII ;break ;default :dev_err (plat->dev,"phy interface not supported\n" );
@@ -285,27 +286,25 @@ static const struct mediatek_dwmac_variant mt2712_gmac_variant = { .tx_delay_max = 17600, }; -static int mt8195_set_interface (struct mediatek_dwmac_plat_data *plat) +static int mt8195_set_interface (struct mediatek_dwmac_plat_data *plat, +u8 phy_intf_sel) {int rmii_clk_from_mac = plat->rmii_clk_from_mac ?MT8195_RMII_CLK_SRC_INTERNAL :0 ;int rmii_rxc = plat->rmii_rxc ?MT8195_RMII_CLK_SRC_RXC :0 ; -u32 intf_val =0 ; +u32 intf_val; + + intf_val =FIELD_PREP (MT8195_ETH_INTF_SEL , phy_intf_sel);/* select phy interface in top control domain */ switch (plat->phy_mode) { -case PHY_INTERFACE_MODE_MII : - intf_val |=FIELD_PREP (MT8195_ETH_INTF_SEL , -PHY_INTF_SEL_GMII_MII ); -break ;case PHY_INTERFACE_MODE_RMII : intf_val |= rmii_rxc | rmii_clk_from_mac; - intf_val |=FIELD_PREP (MT8195_ETH_INTF_SEL ,PHY_INTF_SEL_RMII );break ; +case PHY_INTERFACE_MODE_MII :case PHY_INTERFACE_MODE_RGMII :case PHY_INTERFACE_MODE_RGMII_TXID :case PHY_INTERFACE_MODE_RGMII_RXID :case PHY_INTERFACE_MODE_RGMII_ID : - intf_val |=FIELD_PREP (MT8195_ETH_INTF_SEL ,PHY_INTF_SEL_RGMII );break ;default :dev_err (plat->dev,"phy interface not supported\n" );
@@ -525,10 +524,18 @@ static int mediatek_dwmac_init(struct device *dev, void *priv) {struct mediatek_dwmac_plat_data *plat = priv;const struct mediatek_dwmac_variant *variant = plat->variant; -int ret; +int phy_intf_sel, ret;if (variant->dwmac_set_phy_interface) { - ret = variant->dwmac_set_phy_interface (plat); + phy_intf_sel =stmmac_get_phy_intf_sel (plat->phy_mode); +if (phy_intf_sel !=PHY_INTF_SEL_GMII_MII && + phy_intf_sel !=PHY_INTF_SEL_RGMII && + phy_intf_sel !=PHY_INTF_SEL_RMII ) { +dev_err (plat->dev,"phy interface not supported\n" ); +return phy_intf_sel <0 ? phy_intf_sel : -EINVAL ; + } + + ret = variant->dwmac_set_phy_interface (plat, phy_intf_sel);if (ret) {dev_err (dev,"failed to set phy interface, err = %d\n" , ret);return ret;
Signature · 1 line
2.47.3
PATCH v2 6/13 net: stmmac: mediatek: simplify set_interface() methods
In reply to Russell King (Oracle)Use the phy_intf_sel field value when deciding what other options to apply for the configuration register.
Note that this will allow GMII as well as MII as the phy_intf_sel value is the same for both.
--- .../ethernet/stmicro/stmmac/dwmac-mediatek.c | 50 +++++-------------- 1 file changed, 12 insertions(+), 38 deletions(-)
drivers/net/ethernet/stmicro/stmmac/dwmac-mediatek.c +12 -38
@@ -110,26 +110,13 @@ static const char * const mt8195_dwmac_clk_l[] = {static int mt2712_set_interface (struct mediatek_dwmac_plat_data *plat,u8 phy_intf_sel) { -int rmii_clk_from_mac = plat->rmii_clk_from_mac ?RMII_CLK_SRC_INTERNAL :0 ; -int rmii_rxc = plat->rmii_rxc ?RMII_CLK_SRC_RXC :0 ; -u32 intf_val; +u32 intf_val = phy_intf_sel; - intf_val = phy_intf_sel; - -/* select phy interface in top control domain */ -switch (plat->phy_mode) { -case PHY_INTERFACE_MODE_RMII : - intf_val |= rmii_rxc | rmii_clk_from_mac; -break ; -case PHY_INTERFACE_MODE_MII : -case PHY_INTERFACE_MODE_RGMII : -case PHY_INTERFACE_MODE_RGMII_TXID : -case PHY_INTERFACE_MODE_RGMII_RXID : -case PHY_INTERFACE_MODE_RGMII_ID : -break ; -default : -dev_err (plat->dev,"phy interface not supported\n" ); -return -EINVAL ; +if (phy_intf_sel ==PHY_INTF_SEL_RMII ) { +if (plat->rmii_clk_from_mac) + intf_val |=RMII_CLK_SRC_INTERNAL ; +if (plat->rmii_rxc) + intf_val |=RMII_CLK_SRC_RXC ; }regmap_write (plat->peri_regmap,PERI_ETH_PHY_INTF_SEL , intf_val);
@@ -289,26 +276,13 @@ static const struct mediatek_dwmac_variant mt2712_gmac_variant = {static int mt8195_set_interface (struct mediatek_dwmac_plat_data *plat,u8 phy_intf_sel) { -int rmii_clk_from_mac = plat->rmii_clk_from_mac ?MT8195_RMII_CLK_SRC_INTERNAL :0 ; -int rmii_rxc = plat->rmii_rxc ?MT8195_RMII_CLK_SRC_RXC :0 ; -u32 intf_val; +u32 intf_val =FIELD_PREP (MT8195_ETH_INTF_SEL , phy_intf_sel); - intf_val =FIELD_PREP (MT8195_ETH_INTF_SEL , phy_intf_sel); - -/* select phy interface in top control domain */ -switch (plat->phy_mode) { -case PHY_INTERFACE_MODE_RMII : - intf_val |= rmii_rxc | rmii_clk_from_mac; -break ; -case PHY_INTERFACE_MODE_MII : -case PHY_INTERFACE_MODE_RGMII : -case PHY_INTERFACE_MODE_RGMII_TXID : -case PHY_INTERFACE_MODE_RGMII_RXID : -case PHY_INTERFACE_MODE_RGMII_ID : -break ; -default : -dev_err (plat->dev,"phy interface not supported\n" ); -return -EINVAL ; +if (phy_intf_sel ==PHY_INTF_SEL_RMII ) { +if (plat->rmii_clk_from_mac) + intf_val |=MT8195_RMII_CLK_SRC_INTERNAL ; +if (plat->rmii_rxc) + intf_val |=MT8195_RMII_CLK_SRC_RXC ; }/* MT8195 only support external PHY */
Signature · 1 line
2.47.3
PATCH v2 7/13 net: stmmac: starfive: use PHY_INTF_SEL_x to select PHY interface
In reply to Russell King (Oracle)Use the common dwmac definitions for the PHY interface selection field.
--- drivers/net/ethernet/stmicro/stmmac/dwmac-starfive.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/stmicro/stmmac/dwmac-starfive.c +2 -2
@@ -15,8 +15,8 @@#include "stmmac_platform.h" -#define STARFIVE_DWMAC_PHY_INFT_RGMII 0x1 -#define STARFIVE_DWMAC_PHY_INFT_RMII 0x4 +#define STARFIVE_DWMAC_PHY_INFT_RGMII PHY_INTF_SEL_RGMII +#define STARFIVE_DWMAC_PHY_INFT_RMII PHY_INTF_SEL_RMII#define STARFIVE_DWMAC_PHY_INFT_FIELD 0x7U#define JH7100_SYSMAIN_REGISTER49_DLYCHAIN 0xc8
Signature · 1 line
2.47.3
PATCH v2 8/13 net: stmmac: starfive: use stmmac_get_phy_intf_sel()
In reply to Russell King (Oracle)Use stmmac_get_phy_intf_sel() to decode the PHY interface mode to the phy_intf_sel value, validate the result and use that to set the control register to select the operating mode for the DWMAC core.
--- .../ethernet/stmicro/stmmac/dwmac-starfive.c | 24 +++++-------------- 1 file changed, 6 insertions(+), 18 deletions(-)
drivers/net/ethernet/stmicro/stmmac/dwmac-starfive.c +6 -18
@@ -15,8 +15,6 @@#include "stmmac_platform.h" -#define STARFIVE_DWMAC_PHY_INFT_RGMII PHY_INTF_SEL_RGMII -#define STARFIVE_DWMAC_PHY_INFT_RMII PHY_INTF_SEL_RMII#define STARFIVE_DWMAC_PHY_INFT_FIELD 0x7U#define JH7100_SYSMAIN_REGISTER49_DLYCHAIN 0xc8
@@ -35,25 +33,15 @@ static int starfive_dwmac_set_mode(struct plat_stmmacenet_data *plat_dat)struct starfive_dwmac *dwmac = plat_dat->bsp_priv;struct regmap *regmap;unsigned int args[2 ]; -unsigned int mode; +int phy_intf_sel;int err; -switch (plat_dat->phy_interface) { -case PHY_INTERFACE_MODE_RMII : - mode =STARFIVE_DWMAC_PHY_INFT_RMII ; -break ; - -case PHY_INTERFACE_MODE_RGMII : -case PHY_INTERFACE_MODE_RGMII_ID : -case PHY_INTERFACE_MODE_RGMII_RXID : -case PHY_INTERFACE_MODE_RGMII_TXID : - mode =STARFIVE_DWMAC_PHY_INFT_RGMII ; -break ; - -default : + phy_intf_sel =stmmac_get_phy_intf_sel (plat_dat->phy_interface); +if (phy_intf_sel !=PHY_INTF_SEL_RGMII && + phy_intf_sel !=PHY_INTF_SEL_RMII ) {dev_err (dwmac->dev,"unsupported interface %s\n" ,phy_modes (plat_dat->phy_interface)); -return -EINVAL ; +return phy_intf_sel <0 ? phy_intf_sel : -EINVAL ; } regmap = syscon_regmap_lookup_by_phandle_args(dwmac->dev->of_node,
@@ -65,7 +53,7 @@ static int starfive_dwmac_set_mode(struct plat_stmmacenet_data *plat_dat)/* args[0]:offset args[1]: shift */ err =regmap_update_bits (regmap, args[0 ],STARFIVE_DWMAC_PHY_INFT_FIELD << args[1 ], - mode << args[1 ]); + phy_intf_sel << args[1 ]);if (err)return dev_err_probe (dwmac->dev, err,"error setting phy mode\n" );
Signature · 1 line
2.47.3
PATCH v2 9/13 net: stmmac: stm32: use PHY_INTF_SEL_x to select PHY interface
In reply to Russell King (Oracle)Convert dwmac-stm32 to use the PHY_INTF_SEL_x definitions.
For stm32mp1, the original definitions used constant 0 (GMII, 0 << 21), BIT(21) (RGMII, 1 << 21) and BIT(23) (RMII, 4 << 21) to define these, but from the values it can be clearly seen that these are the PHY_INTF_SEL_x inputs to the dwmac.
For stm32mp2, the original definitions cover a bitfield 6:4 in the SYSCFG Ethernet1 control register (according to documentation) and use the PHY_INTF_SEL_x values.
Use the common dwmac definitions for the PHY interface selection field by adding the bitfield mask, and using FIELD_PREP() for the bitfield values.
This removes this incorrect use of BIT().
--- .../net/ethernet/stmicro/stmmac/dwmac-stm32.c | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-)
drivers/net/ethernet/stmicro/stmmac/dwmac-stm32.c +14 -6
@@ -47,9 +47,13 @@*------------------------------------------ */ #define SYSCFG_PMCR_ETH_SEL_MII BIT(20) -#define SYSCFG_PMCR_ETH_SEL_RGMII BIT(21) -#define SYSCFG_PMCR_ETH_SEL_RMII BIT(23) -#define SYSCFG_PMCR_ETH_SEL_GMII 0 +#define SYSCFG_PMCR_PHY_INTF_SEL_MASK GENMASK(23, 21) +#define SYSCFG_PMCR_ETH_SEL_RGMII \ + FIELD_PREP(SYSCFG_PMCR_PHY_INTF_SEL_MASK, PHY_INTF_SEL_RGMII) +#define SYSCFG_PMCR_ETH_SEL_RMII \ + FIELD_PREP(SYSCFG_PMCR_PHY_INTF_SEL_MASK, PHY_INTF_SEL_RMII) +#define SYSCFG_PMCR_ETH_SEL_GMII \ + FIELD_PREP(SYSCFG_PMCR_PHY_INTF_SEL_MASK, PHY_INTF_SEL_GMII_MII)#define SYSCFG_MCU_ETH_SEL_MII 0#define SYSCFG_MCU_ETH_SEL_RMII 1
@@ -60,9 +64,13 @@#define SYSCFG_ETHCR_ETH_CLK_SEL BIT(1)#define SYSCFG_ETHCR_ETH_REF_CLK_SEL BIT(0) -#define SYSCFG_ETHCR_ETH_SEL_MII 0 -#define SYSCFG_ETHCR_ETH_SEL_RGMII BIT(4) -#define SYSCFG_ETHCR_ETH_SEL_RMII BIT(6) +#define SYSCFG_ETHCR_ETH_SEL_MASK GENMASK(6, 4) +#define SYSCFG_ETHCR_ETH_SEL_MII FIELD_PREP(SYSCFG_ETHCR_ETH_SEL_MASK, \ + PHY_INTF_SEL_GMII_MII) +#define SYSCFG_ETHCR_ETH_SEL_RGMII FIELD_PREP(SYSCFG_ETHCR_ETH_SEL_MASK, \ + PHY_INTF_SEL_RGMII) +#define SYSCFG_ETHCR_ETH_SEL_RMII FIELD_PREP(SYSCFG_ETHCR_ETH_SEL_MASK, \ + PHY_INTF_SEL_RMII)/* STM32MPx register definitions *
Signature · 1 line
2.47.3
PATCH v2 10/13 net: stmmac: stm32: use PHY_INTF_SEL_x directly
In reply to Russell King (Oracle)Rather than defining separate constants for each, use the PHY_INTF_SEL_x definitions in the switch()es configuring the control register, and use one FIELD_PREP() to convert phy_intf_sel to the register value.
--- .../net/ethernet/stmicro/stmmac/dwmac-stm32.c | 32 ++++++++----------- 1 file changed, 13 insertions(+), 19 deletions(-)
drivers/net/ethernet/stmicro/stmmac/dwmac-stm32.c +13 -19
@@ -48,30 +48,17 @@*/ #define SYSCFG_PMCR_ETH_SEL_MII BIT(20)#define SYSCFG_PMCR_PHY_INTF_SEL_MASK GENMASK(23, 21) -#define SYSCFG_PMCR_ETH_SEL_RGMII \ - FIELD_PREP(SYSCFG_PMCR_PHY_INTF_SEL_MASK, PHY_INTF_SEL_RGMII) -#define SYSCFG_PMCR_ETH_SEL_RMII \ - FIELD_PREP(SYSCFG_PMCR_PHY_INTF_SEL_MASK, PHY_INTF_SEL_RMII) -#define SYSCFG_PMCR_ETH_SEL_GMII \ - FIELD_PREP(SYSCFG_PMCR_PHY_INTF_SEL_MASK, PHY_INTF_SEL_GMII_MII)#define SYSCFG_MCU_ETH_SEL_MII 0#define SYSCFG_MCU_ETH_SEL_RMII 1/* STM32MP2 register definitions */ #define SYSCFG_MP2_ETH_MASK GENMASK(31, 0) +#define SYSCFG_ETHCR_ETH_SEL_MASK GENMASK(6, 4)#define SYSCFG_ETHCR_ETH_PTP_CLK_SEL BIT(2)#define SYSCFG_ETHCR_ETH_CLK_SEL BIT(1)#define SYSCFG_ETHCR_ETH_REF_CLK_SEL BIT(0) -#define SYSCFG_ETHCR_ETH_SEL_MASK GENMASK(6, 4) -#define SYSCFG_ETHCR_ETH_SEL_MII FIELD_PREP(SYSCFG_ETHCR_ETH_SEL_MASK, \ - PHY_INTF_SEL_GMII_MII) -#define SYSCFG_ETHCR_ETH_SEL_RGMII FIELD_PREP(SYSCFG_ETHCR_ETH_SEL_MASK, \ - PHY_INTF_SEL_RGMII) -#define SYSCFG_ETHCR_ETH_SEL_RMII FIELD_PREP(SYSCFG_ETHCR_ETH_SEL_MASK, \ - PHY_INTF_SEL_RMII) -/* STM32MPx register definitions * * Below table summarizes the clock requirement and clock sources for
@@ -244,10 +231,12 @@ static int stm32mp1_configure_pmcr(struct plat_stmmacenet_data *plat_dat) {struct stm32_dwmac *dwmac = plat_dat->bsp_priv;u32 reg = dwmac->mode_reg; +u8 phy_intf_sel;int val =0 ;switch (plat_dat->phy_interface) {case PHY_INTERFACE_MODE_MII : + phy_intf_sel =PHY_INTF_SEL_GMII_MII ;/* * STM32MP15xx supports both MII and GMII, STM32MP13xx MII only. * SYSCFG_PMCSETR ETH_SELMII is present only on STM32MP15xx and
@@ -258,12 +247,12 @@ static int stm32mp1_configure_pmcr(struct plat_stmmacenet_data *plat_dat) val |=SYSCFG_PMCR_ETH_SEL_MII ;break ;case PHY_INTERFACE_MODE_GMII : - val =SYSCFG_PMCR_ETH_SEL_GMII ; + phy_intf_sel =PHY_INTF_SEL_GMII_MII ;if (dwmac->enable_eth_ck) val |=SYSCFG_PMCR_ETH_CLK_SEL ;break ;case PHY_INTERFACE_MODE_RMII : - val =SYSCFG_PMCR_ETH_SEL_RMII ; + phy_intf_sel =PHY_INTF_SEL_RMII ;if (dwmac->enable_eth_ck) val |=SYSCFG_PMCR_ETH_REF_CLK_SEL ;break ;
@@ -271,7 +260,7 @@ static int stm32mp1_configure_pmcr(struct plat_stmmacenet_data *plat_dat)case PHY_INTERFACE_MODE_RGMII_ID :case PHY_INTERFACE_MODE_RGMII_RXID :case PHY_INTERFACE_MODE_RGMII_TXID : - val =SYSCFG_PMCR_ETH_SEL_RGMII ; + phy_intf_sel =PHY_INTF_SEL_RGMII ;if (dwmac->enable_eth_ck) val |=SYSCFG_PMCR_ETH_CLK_SEL ;break ;
@@ -284,6 +273,8 @@ static int stm32mp1_configure_pmcr(struct plat_stmmacenet_data *plat_dat)dev_dbg (dwmac->dev,"Mode %s" ,phy_modes (plat_dat->phy_interface)); + val |=FIELD_PREP (SYSCFG_PMCR_PHY_INTF_SEL_MASK , phy_intf_sel); +/* Shift value at correct ethernet MAC offset in SYSCFG_PMCSETR */ val <<=ffs (dwmac->mode_mask) -ffs (SYSCFG_MP1_ETH_MASK );
@@ -299,6 +290,7 @@ static int stm32mp1_configure_pmcr(struct plat_stmmacenet_data *plat_dat)static int stm32mp2_configure_syscfg (struct plat_stmmacenet_data *plat_dat) {struct stm32_dwmac *dwmac = plat_dat->bsp_priv; +u8 phy_intf_sel =PHY_INTF_SEL_GMII_MII ;u32 reg = dwmac->mode_reg;int val =0 ;
@@ -307,7 +299,7 @@ static int stm32mp2_configure_syscfg(struct plat_stmmacenet_data *plat_dat)/* ETH_REF_CLK_SEL bit in SYSCFG register is not applicable in MII mode */ break ;case PHY_INTERFACE_MODE_RMII : - val =SYSCFG_ETHCR_ETH_SEL_RMII ; + phy_intf_sel =PHY_INTF_SEL_RMII ;if (dwmac->enable_eth_ck) {/* Internal clock ETH_CLK of 50MHz from RCC is used */ val |=SYSCFG_ETHCR_ETH_REF_CLK_SEL ;
@@ -317,7 +309,7 @@ static int stm32mp2_configure_syscfg(struct plat_stmmacenet_data *plat_dat)case PHY_INTERFACE_MODE_RGMII_ID :case PHY_INTERFACE_MODE_RGMII_RXID :case PHY_INTERFACE_MODE_RGMII_TXID : - val =SYSCFG_ETHCR_ETH_SEL_RGMII ; + phy_intf_sel =PHY_INTF_SEL_RGMII ; fallthrough;case PHY_INTERFACE_MODE_GMII :if (dwmac->enable_eth_ck) {
@@ -334,6 +326,8 @@ static int stm32mp2_configure_syscfg(struct plat_stmmacenet_data *plat_dat)dev_dbg (dwmac->dev,"Mode %s" ,phy_modes (plat_dat->phy_interface)); + val |=FIELD_PREP (SYSCFG_ETHCR_ETH_SEL_MASK , phy_intf_sel); +/* Select PTP (IEEE1588) clock selection from RCC (ck_ker_ethxptp) */ val |=SYSCFG_ETHCR_ETH_PTP_CLK_SEL ;
Signature · 1 line
2.47.3
PATCH v2 11/13 net: stmmac: stm32: use stmmac_get_phy_intf_sel()
In reply to Russell King (Oracle)Use stmmac_get_phy_intf_sel() to decode the PHY interface mode to the phy_intf_sel value. As both configure functions would end up with the same code, call this from stm32mp1_set_mode(), validate the result and pass the resulting value into the stm32 configure function. Use this value to set the operating mode for the DWMAC core.
--- .../net/ethernet/stmicro/stmmac/dwmac-stm32.c | 42 ++++++++++--------- 1 file changed, 22 insertions(+), 20 deletions(-)
drivers/net/ethernet/stmicro/stmmac/dwmac-stm32.c +22 -20
@@ -227,16 +227,17 @@ static int stm32mp1_validate_ethck_rate(struct plat_stmmacenet_data *plat_dat)return -EINVAL ; } -static int stm32mp1_configure_pmcr (struct plat_stmmacenet_data *plat_dat) +static int stm32mp1_configure_pmcr (struct plat_stmmacenet_data *plat_dat, +u8 phy_intf_sel) {struct stm32_dwmac *dwmac = plat_dat->bsp_priv;u32 reg = dwmac->mode_reg; -u8 phy_intf_sel; -int val =0 ; +int val; + + val =FIELD_PREP (SYSCFG_PMCR_PHY_INTF_SEL_MASK , phy_intf_sel);switch (plat_dat->phy_interface) {case PHY_INTERFACE_MODE_MII : - phy_intf_sel =PHY_INTF_SEL_GMII_MII ;/* * STM32MP15xx supports both MII and GMII, STM32MP13xx MII only. * SYSCFG_PMCSETR ETH_SELMII is present only on STM32MP15xx and
@@ -247,12 +248,10 @@ static int stm32mp1_configure_pmcr(struct plat_stmmacenet_data *plat_dat) val |=SYSCFG_PMCR_ETH_SEL_MII ;break ;case PHY_INTERFACE_MODE_GMII : - phy_intf_sel =PHY_INTF_SEL_GMII_MII ;if (dwmac->enable_eth_ck) val |=SYSCFG_PMCR_ETH_CLK_SEL ;break ;case PHY_INTERFACE_MODE_RMII : - phy_intf_sel =PHY_INTF_SEL_RMII ;if (dwmac->enable_eth_ck) val |=SYSCFG_PMCR_ETH_REF_CLK_SEL ;break ;
@@ -260,7 +259,6 @@ static int stm32mp1_configure_pmcr(struct plat_stmmacenet_data *plat_dat)case PHY_INTERFACE_MODE_RGMII_ID :case PHY_INTERFACE_MODE_RGMII_RXID :case PHY_INTERFACE_MODE_RGMII_TXID : - phy_intf_sel =PHY_INTF_SEL_RGMII ;if (dwmac->enable_eth_ck) val |=SYSCFG_PMCR_ETH_CLK_SEL ;break ;
@@ -273,8 +271,6 @@ static int stm32mp1_configure_pmcr(struct plat_stmmacenet_data *plat_dat)dev_dbg (dwmac->dev,"Mode %s" ,phy_modes (plat_dat->phy_interface)); - val |=FIELD_PREP (SYSCFG_PMCR_PHY_INTF_SEL_MASK , phy_intf_sel); -/* Shift value at correct ethernet MAC offset in SYSCFG_PMCSETR */ val <<=ffs (dwmac->mode_mask) -ffs (SYSCFG_MP1_ETH_MASK );
@@ -287,19 +283,20 @@ static int stm32mp1_configure_pmcr(struct plat_stmmacenet_data *plat_dat) dwmac->mode_mask, val); } -static int stm32mp2_configure_syscfg (struct plat_stmmacenet_data *plat_dat) +static int stm32mp2_configure_syscfg (struct plat_stmmacenet_data *plat_dat, +u8 phy_intf_sel) {struct stm32_dwmac *dwmac = plat_dat->bsp_priv; -u8 phy_intf_sel =PHY_INTF_SEL_GMII_MII ;u32 reg = dwmac->mode_reg; -int val =0 ; +int val; + + val =FIELD_PREP (SYSCFG_ETHCR_ETH_SEL_MASK , phy_intf_sel);switch (plat_dat->phy_interface) {case PHY_INTERFACE_MODE_MII :/* ETH_REF_CLK_SEL bit in SYSCFG register is not applicable in MII mode */ break ;case PHY_INTERFACE_MODE_RMII : - phy_intf_sel =PHY_INTF_SEL_RMII ;if (dwmac->enable_eth_ck) {/* Internal clock ETH_CLK of 50MHz from RCC is used */ val |=SYSCFG_ETHCR_ETH_REF_CLK_SEL ;
@@ -309,8 +306,6 @@ static int stm32mp2_configure_syscfg(struct plat_stmmacenet_data *plat_dat)case PHY_INTERFACE_MODE_RGMII_ID :case PHY_INTERFACE_MODE_RGMII_RXID :case PHY_INTERFACE_MODE_RGMII_TXID : - phy_intf_sel =PHY_INTF_SEL_RGMII ; - fallthrough;case PHY_INTERFACE_MODE_GMII :if (dwmac->enable_eth_ck) {/* Internal clock ETH_CLK of 125MHz from RCC is used */
@@ -326,8 +321,6 @@ static int stm32mp2_configure_syscfg(struct plat_stmmacenet_data *plat_dat)dev_dbg (dwmac->dev,"Mode %s" ,phy_modes (plat_dat->phy_interface)); - val |=FIELD_PREP (SYSCFG_ETHCR_ETH_SEL_MASK , phy_intf_sel); -/* Select PTP (IEEE1588) clock selection from RCC (ck_ker_ethxptp) */ val |=SYSCFG_ETHCR_ETH_PTP_CLK_SEL ;
@@ -339,7 +332,7 @@ static int stm32mp2_configure_syscfg(struct plat_stmmacenet_data *plat_dat)static int stm32mp1_set_mode (struct plat_stmmacenet_data *plat_dat) {struct stm32_dwmac *dwmac = plat_dat->bsp_priv; -int ret; +int phy_intf_sel, ret; ret =stm32mp1_select_ethck_external (plat_dat);if (ret)
@@ -349,10 +342,19 @@ static int stm32mp1_set_mode(struct plat_stmmacenet_data *plat_dat)if (ret)return ret; + phy_intf_sel =stmmac_get_phy_intf_sel (plat_dat->phy_interface); +if (phy_intf_sel !=PHY_INTF_SEL_GMII_MII && + phy_intf_sel !=PHY_INTF_SEL_RGMII && + phy_intf_sel !=PHY_INTF_SEL_RMII ) { +dev_err (dwmac->dev,"Mode %s not supported\n" , +phy_modes (plat_dat->phy_interface)); +return phy_intf_sel <0 ? phy_intf_sel : -EINVAL ; + } +if (!dwmac->ops->is_mp2) -return stm32mp1_configure_pmcr (plat_dat); +return stm32mp1_configure_pmcr (plat_dat, phy_intf_sel);else -return stm32mp2_configure_syscfg (plat_dat); +return stm32mp2_configure_syscfg (plat_dat, phy_intf_sel); }static int stm32mcu_set_mode (struct plat_stmmacenet_data *plat_dat)
Signature · 1 line
2.47.3
PATCH v2 12/13 net: stmmac: visconti: use PHY_INTF_SEL_x to select PHY interface
In reply to Russell King (Oracle)Convert dwmac-visconti to use the PHY_INTF_SEL_x definitions. The original definitions used constant 0, BIT(0) (==1) and BIT(2) (==4) to define these, but the values of the bits corresponds with the PHY_INTF_SEL_x values, so it is highly likely that these are not individual bits, but the PHY_INTF_SEL_x bitfield.
This removes this incorrect use of BIT().
--- drivers/net/ethernet/stmicro/stmmac/dwmac-visconti.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/net/ethernet/stmicro/stmmac/dwmac-visconti.c +3 -3
@@ -42,9 +42,9 @@#define ETHER_CLK_SEL_RX_TX_CLK_EN (ETHER_CLK_SEL_RX_CLK_EN | ETHER_CLK_SEL_TX_CLK_EN) -#define ETHER_CONFIG_INTF_MII 0 -#define ETHER_CONFIG_INTF_RGMII BIT(0) -#define ETHER_CONFIG_INTF_RMII BIT(2) +#define ETHER_CONFIG_INTF_MII PHY_INTF_SEL_GMII_MII +#define ETHER_CONFIG_INTF_RGMII PHY_INTF_SEL_RGMII +#define ETHER_CONFIG_INTF_RMII PHY_INTF_SEL_RMIIstruct visconti_eth {void __iomem *reg;
Signature · 1 line
2.47.3
PATCH v2 13/13 net: stmmac: visconti: use stmmac_get_phy_intf_sel()
In reply to Russell King (Oracle)Use stmmac_get_phy_intf_sel() to decode the PHY interface mode to the phy_intf_sel value, validate the result and use that to set the control register to select the operating mode for the DWMAC core.
Note that this will allow GMII as well as MII as the phy_intf_sel value is the same for both.
--- .../ethernet/stmicro/stmmac/dwmac-visconti.c | 26 +++++-------------- 1 file changed, 6 insertions(+), 20 deletions(-)
drivers/net/ethernet/stmicro/stmmac/dwmac-visconti.c +6 -20
@@ -42,10 +42,6 @@#define ETHER_CLK_SEL_RX_TX_CLK_EN (ETHER_CLK_SEL_RX_CLK_EN | ETHER_CLK_SEL_TX_CLK_EN) -#define ETHER_CONFIG_INTF_MII PHY_INTF_SEL_GMII_MII -#define ETHER_CONFIG_INTF_RGMII PHY_INTF_SEL_RGMII -#define ETHER_CONFIG_INTF_RMII PHY_INTF_SEL_RMII -struct visconti_eth {void __iomem *reg;struct clk *phy_ref_clk;
@@ -150,22 +146,12 @@ static int visconti_eth_init_hw(struct platform_device *pdev, struct plat_stmmac {struct visconti_eth *dwmac = plat_dat->bsp_priv;unsigned int clk_sel_val; -u32 phy_intf_sel; - -switch (plat_dat->phy_interface) { -case PHY_INTERFACE_MODE_RGMII : -case PHY_INTERFACE_MODE_RGMII_ID : -case PHY_INTERFACE_MODE_RGMII_RXID : -case PHY_INTERFACE_MODE_RGMII_TXID : - phy_intf_sel =ETHER_CONFIG_INTF_RGMII ; -break ; -case PHY_INTERFACE_MODE_MII : - phy_intf_sel =ETHER_CONFIG_INTF_MII ; -break ; -case PHY_INTERFACE_MODE_RMII : - phy_intf_sel =ETHER_CONFIG_INTF_RMII ; -break ; -default : +int phy_intf_sel; + + phy_intf_sel =stmmac_get_phy_intf_sel (plat_dat->phy_interface); +if (phy_intf_sel !=PHY_INTF_SEL_GMII_MII && + phy_intf_sel !=PHY_INTF_SEL_RGMII && + phy_intf_sel !=PHY_INTF_SEL_RMII ) {dev_err (&pdev->dev,"Unsupported phy-mode (%d)\n" , plat_dat->phy_interface);return -EOPNOTSUPP ; }
Signature · 1 line
2.47.3
Re: [PATCH net-next v2 07/13] net: stmmac: starfive: use PHY_INTF_SEL_x to select PHY interface
In reply to Russell King (Oracle)Quoting Russell King (Oracle) (2025-11-11 09:12:18)
Quoted 3 lines
Use the common dwmac definitions for the PHY interface selection field.
Signed-off-by Russell King (Oracle) <[email protected]>
Re: [PATCH net-next v2 08/13] net: stmmac: starfive: use stmmac_get_phy_intf_sel()
In reply to Russell King (Oracle)Quoting Russell King (Oracle) (2025-11-11 09:12:23)
Quoted 5 lines
Use
stmmac_get_phy_intf_sel()to decode the PHY interface mode to thephy_intf_selvalue, validate the result and use that to set the control register to select the operating mode for the DWMAC core.Signed-off-by Russell King (Oracle) <[email protected]>
Re: [PATCH net-next v2 01/13] net: stmmac: loongson1: use PHY_INTF_SEL_x
In reply to Russell King (Oracle)Quoted 3 lines · Russell King (Oracle)
Use
PHY_INTF_SEL_xdefinitions forphy_intf_selbitfield.Signed-off-by Russell King (Oracle) <[email protected]>
Maxime
Re: [PATCH net-next v2 02/13] net: stmmac: loongson1: use PHY_INTF_SEL_x directly
In reply to Russell King (Oracle)Quoted 5 lines · Russell King (Oracle)
Use the
PHY_INTF_SEL_xxvalues directly inls1c_dwmac_syscon_init(), converting them to thePHY_INTF_SELIbitfield when callingregmap_update_bits().Signed-off-by Russell King (Oracle) <[email protected]>
Maxime
Quoted 45 lines
--- drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-)drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c +5
-6@@ -38,8 +38,6 @@#define GMAC_SHUT BIT(6)#define PHY_INTF_SELI GENMASK(30, 28) -#define PHY_INTF_MII FIELD_PREP(PHY_INTF_SELI, PHY_INTF_SEL_GMII_MII) -#define PHY_INTF_RMII FIELD_PREP(PHY_INTF_SELI, PHY_INTF_SEL_RMII)struct ls1x_dwmac {struct plat_stmmacenet_data *plat_dat;@@ -140,15 +138,14 @@ static int ls1c_dwmac_syscon_init(struct platform_device *pdev, void *priv)struct ls1x_dwmac *dwmac = priv;struct plat_stmmacenet_data *plat = dwmac->plat_dat;struct regmap *regmap = dwmac->regmap; +int phy_intf_sel;switch (plat->phy_interface) {case PHY_INTERFACE_MODE_MII : -regmap_update_bits (regmap,LS1X_SYSCON1 ,PHY_INTF_SELI , -PHY_INTF_MII ); + phy_intf_sel =PHY_INTF_SEL_GMII_MII ;break ;case PHY_INTERFACE_MODE_RMII : -regmap_update_bits (regmap,LS1X_SYSCON1 ,PHY_INTF_SELI , -PHY_INTF_RMII ); + phy_intf_sel =PHY_INTF_SEL_RMII ;break ;default : dev_err(&pdev->dev, "Unsupported PHY-mode %u\n",@@ -156,6 +153,8 @@ static int ls1c_dwmac_syscon_init(struct platform_device *pdev, void *priv)return -EOPNOTSUPP ; } +regmap_update_bits (regmap,LS1X_SYSCON1 ,PHY_INTF_SELI , +FIELD_PREP (PHY_INTF_SELI , phy_intf_sel));regmap_update_bits (regmap,LS1X_SYSCON0 ,GMAC0_SHUT ,0 );return 0 ;
Re: [PATCH net-next v2 03/13] net: stmmac: loongson1: use stmmac_get_phy_intf_sel()
In reply to Russell King (Oracle)Quoted 8 lines · Russell King (Oracle)
Use
stmmac_get_phy_intf_sel()to decode the PHY interface mode to thephy_intf_selvalue, validate the result and use that to set the control register to select the operating mode for the DWMAC core.Note that this will allow GMII as well as MII as the
phy_intf_selvalue is the same for both.Signed-off-by Russell King (Oracle) <[email protected]>
Maxime
Quoted 26 lines
--- drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-)drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c +3
-8@@ -140,14 +140,9 @@ static int ls1c_dwmac_syscon_init(struct platform_device *pdev, void *priv)struct regmap *regmap = dwmac->regmap;int phy_intf_sel; -switch (plat->phy_interface) { -case PHY_INTERFACE_MODE_MII : - phy_intf_sel =PHY_INTF_SEL_GMII_MII ; -break ; -case PHY_INTERFACE_MODE_RMII : - phy_intf_sel =PHY_INTF_SEL_RMII ; -break ; -default : + phy_intf_sel =stmmac_get_phy_intf_sel (plat->phy_interface); +if (phy_intf_sel !=PHY_INTF_SEL_GMII_MII && + phy_intf_sel !=PHY_INTF_SEL_RMII ) {dev_err (&pdev->dev,"Unsupported PHY-mode %u\n" , plat->phy_interface);return -EOPNOTSUPP ;
Re: [PATCH net-next v2 04/13] net: stmmac: mediatek: use PHY_INTF_SEL_x
In reply to Russell King (Oracle)Quoted 4 lines · Russell King (Oracle)
Use
PHY_INTF_SEL_xdefinitions for the fields that correspond to thephy_intf_selinputs to the dwmac core.Signed-off-by Russell King (Oracle) <[email protected]>
Maxime
Quoted 61 lines
--- .../ethernet/stmicro/stmmac/dwmac-mediatek.c | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-)drivers/net/ethernet/stmicro/stmmac/dwmac-mediatek.c +8
-10@@ -17,9 +17,6 @@/* Peri Configuration register for mt2712 */ #define PERI_ETH_PHY_INTF_SEL 0x418 -#define PHY_INTF_MII 0 -#define PHY_INTF_RGMII 1 -#define PHY_INTF_RMII 4#define RMII_CLK_SRC_RXC BIT(4)#define RMII_CLK_SRC_INTERNAL BIT(5)@@ -118,16 +115,16 @@ static int mt2712_set_interface(struct mediatek_dwmac_plat_data *plat)/* select phy interface in top control domain */ switch (plat->phy_mode) {case PHY_INTERFACE_MODE_MII : - intf_val |=PHY_INTF_MII ; + intf_val |=PHY_INTF_SEL_GMII_MII ;break ;case PHY_INTERFACE_MODE_RMII : - intf_val |= (PHY_INTF_RMII | rmii_rxc | rmii_clk_from_mac); + intf_val |=PHY_INTF_SEL_RMII | rmii_rxc | rmii_clk_from_mac;break ;case PHY_INTERFACE_MODE_RGMII :case PHY_INTERFACE_MODE_RGMII_TXID :case PHY_INTERFACE_MODE_RGMII_RXID :case PHY_INTERFACE_MODE_RGMII_ID : - intf_val |=PHY_INTF_RGMII ; + intf_val |=PHY_INTF_SEL_RGMII ;break ;default :dev_err (plat->dev,"phy interface not supported\n" );@@ -297,17 +294,18 @@ static int mt8195_set_interface(struct mediatek_dwmac_plat_data *plat)/* select phy interface in top control domain */ switch (plat->phy_mode) {case PHY_INTERFACE_MODE_MII : - intf_val |=FIELD_PREP (MT8195_ETH_INTF_SEL ,PHY_INTF_MII ); + intf_val |=FIELD_PREP (MT8195_ETH_INTF_SEL , +PHY_INTF_SEL_GMII_MII );break ;case PHY_INTERFACE_MODE_RMII : - intf_val |= (rmii_rxc | rmii_clk_from_mac); - intf_val |=FIELD_PREP (MT8195_ETH_INTF_SEL ,PHY_INTF_RMII ); + intf_val |= rmii_rxc | rmii_clk_from_mac; + intf_val |=FIELD_PREP (MT8195_ETH_INTF_SEL ,PHY_INTF_SEL_RMII );break ;case PHY_INTERFACE_MODE_RGMII :case PHY_INTERFACE_MODE_RGMII_TXID :case PHY_INTERFACE_MODE_RGMII_RXID :case PHY_INTERFACE_MODE_RGMII_ID : - intf_val |=FIELD_PREP (MT8195_ETH_INTF_SEL ,PHY_INTF_RGMII ); + intf_val |=FIELD_PREP (MT8195_ETH_INTF_SEL ,PHY_INTF_SEL_RGMII );break ;default :dev_err (plat->dev,"phy interface not supported\n" );
Re: [PATCH net-next v2 05/13] net: stmmac: mediatek: use stmmac_get_phy_intf_sel()
In reply to Russell King (Oracle)Quoted 6 lines · Russell King (Oracle)
Use
stmmac_get_phy_intf_sel()to decode the PHY interface mode to thephy_intf_selvalue, validate the result, and pass that into the implementation specific ->dwmac_set_phy_interface() method. Use this to configure the PHY interface selection field.Signed-off-by Russell King (Oracle) <[email protected]>
Maxime
Quoted 106 lines
--- .../ethernet/stmicro/stmmac/dwmac-mediatek.c | 43 +++++++++++-------- 1 file changed, 25 insertions(+), 18 deletions(-)drivers/net/ethernet/stmicro/stmmac/dwmac-mediatek.c +25
-18@@ -85,7 +85,8 @@ struct mediatek_dwmac_plat_data { };struct mediatek_dwmac_variant { -int (*dwmac_set_phy_interface)(struct mediatek_dwmac_plat_data *plat); +int (*dwmac_set_phy_interface)(struct mediatek_dwmac_plat_data *plat, +u8 phy_intf_sel);int (*dwmac_set_delay)(struct mediatek_dwmac_plat_data *plat);/* clock ids to be requested */ @@ -106,25 +107,25 @@ static const char * const mt8195_dwmac_clk_l[] = { "axi", "apb", "mac_cg", "mac_main", "ptp_ref" }; -static int mt2712_set_interface (struct mediatek_dwmac_plat_data *plat) +static int mt2712_set_interface (struct mediatek_dwmac_plat_data *plat, +u8 phy_intf_sel) {int rmii_clk_from_mac = plat->rmii_clk_from_mac ?RMII_CLK_SRC_INTERNAL :0 ;int rmii_rxc = plat->rmii_rxc ?RMII_CLK_SRC_RXC :0 ; -u32 intf_val =0 ; +u32 intf_val; + + intf_val = phy_intf_sel;/* select phy interface in top control domain */ switch (plat->phy_mode) { -case PHY_INTERFACE_MODE_MII : - intf_val |=PHY_INTF_SEL_GMII_MII ; -break ;case PHY_INTERFACE_MODE_RMII : - intf_val |=PHY_INTF_SEL_RMII | rmii_rxc | rmii_clk_from_mac; + intf_val |= rmii_rxc | rmii_clk_from_mac;break ; +case PHY_INTERFACE_MODE_MII :case PHY_INTERFACE_MODE_RGMII :case PHY_INTERFACE_MODE_RGMII_TXID :case PHY_INTERFACE_MODE_RGMII_RXID :case PHY_INTERFACE_MODE_RGMII_ID : - intf_val |=PHY_INTF_SEL_RGMII ;break ;default :dev_err (plat->dev,"phy interface not supported\n" );@@ -285,27 +286,25 @@ static const struct mediatek_dwmac_variant mt2712_gmac_variant = { .tx_delay_max = 17600, }; -static int mt8195_set_interface (struct mediatek_dwmac_plat_data *plat) +static int mt8195_set_interface (struct mediatek_dwmac_plat_data *plat, +u8 phy_intf_sel) {int rmii_clk_from_mac = plat->rmii_clk_from_mac ?MT8195_RMII_CLK_SRC_INTERNAL :0 ;int rmii_rxc = plat->rmii_rxc ?MT8195_RMII_CLK_SRC_RXC :0 ; -u32 intf_val =0 ; +u32 intf_val; + + intf_val =FIELD_PREP (MT8195_ETH_INTF_SEL , phy_intf_sel);/* select phy interface in top control domain */ switch (plat->phy_mode) { -case PHY_INTERFACE_MODE_MII : - intf_val |=FIELD_PREP (MT8195_ETH_INTF_SEL , -PHY_INTF_SEL_GMII_MII ); -break ;case PHY_INTERFACE_MODE_RMII : intf_val |= rmii_rxc | rmii_clk_from_mac; - intf_val |=FIELD_PREP (MT8195_ETH_INTF_SEL ,PHY_INTF_SEL_RMII );break ; +case PHY_INTERFACE_MODE_MII :case PHY_INTERFACE_MODE_RGMII :case PHY_INTERFACE_MODE_RGMII_TXID :case PHY_INTERFACE_MODE_RGMII_RXID :case PHY_INTERFACE_MODE_RGMII_ID : - intf_val |=FIELD_PREP (MT8195_ETH_INTF_SEL ,PHY_INTF_SEL_RGMII );break ;default :dev_err (plat->dev,"phy interface not supported\n" );@@ -525,10 +524,18 @@ static int mediatek_dwmac_init(struct device *dev, void *priv) {struct mediatek_dwmac_plat_data *plat = priv;const struct mediatek_dwmac_variant *variant = plat->variant; -int ret; +int phy_intf_sel, ret;if (variant->dwmac_set_phy_interface) { - ret = variant->dwmac_set_phy_interface (plat); + phy_intf_sel =stmmac_get_phy_intf_sel (plat->phy_mode); +if (phy_intf_sel !=PHY_INTF_SEL_GMII_MII && + phy_intf_sel !=PHY_INTF_SEL_RGMII && + phy_intf_sel !=PHY_INTF_SEL_RMII ) { +dev_err (plat->dev,"phy interface not supported\n" ); +return phy_intf_sel <0 ? phy_intf_sel : -EINVAL ; + } + + ret = variant->dwmac_set_phy_interface (plat, phy_intf_sel);if (ret) {dev_err (dev,"failed to set phy interface, err = %d\n" , ret);return ret;
Re: [PATCH net-next v2 06/13] net: stmmac: mediatek: simplify set_interface() methods
In reply to Russell King (Oracle)Quoted 7 lines · Russell King (Oracle)
Use the
phy_intf_selfield value when deciding what other options to apply for the configuration register.Note that this will allow GMII as well as MII as the
phy_intf_selvalue is the same for both.Signed-off-by Russell King (Oracle) <[email protected]>
Maxime
Quoted 74 lines
--- .../ethernet/stmicro/stmmac/dwmac-mediatek.c | 50 +++++-------------- 1 file changed, 12 insertions(+), 38 deletions(-)drivers/net/ethernet/stmicro/stmmac/dwmac-mediatek.c +12
-38@@ -110,26 +110,13 @@ static const char * const mt8195_dwmac_clk_l[] = {static int mt2712_set_interface (struct mediatek_dwmac_plat_data *plat,u8 phy_intf_sel) { -int rmii_clk_from_mac = plat->rmii_clk_from_mac ?RMII_CLK_SRC_INTERNAL :0 ; -int rmii_rxc = plat->rmii_rxc ?RMII_CLK_SRC_RXC :0 ; -u32 intf_val; +u32 intf_val = phy_intf_sel; - intf_val = phy_intf_sel; - -/* select phy interface in top control domain */ -switch (plat->phy_mode) { -case PHY_INTERFACE_MODE_RMII : - intf_val |= rmii_rxc | rmii_clk_from_mac; -break ; -case PHY_INTERFACE_MODE_MII : -case PHY_INTERFACE_MODE_RGMII : -case PHY_INTERFACE_MODE_RGMII_TXID : -case PHY_INTERFACE_MODE_RGMII_RXID : -case PHY_INTERFACE_MODE_RGMII_ID : -break ; -default : -dev_err (plat->dev,"phy interface not supported\n" ); -return -EINVAL ; +if (phy_intf_sel ==PHY_INTF_SEL_RMII ) { +if (plat->rmii_clk_from_mac) + intf_val |=RMII_CLK_SRC_INTERNAL ; +if (plat->rmii_rxc) + intf_val |=RMII_CLK_SRC_RXC ; }regmap_write (plat->peri_regmap,PERI_ETH_PHY_INTF_SEL , intf_val);@@ -289,26 +276,13 @@ static const struct mediatek_dwmac_variant mt2712_gmac_variant = {static int mt8195_set_interface (struct mediatek_dwmac_plat_data *plat,u8 phy_intf_sel) { -int rmii_clk_from_mac = plat->rmii_clk_from_mac ?MT8195_RMII_CLK_SRC_INTERNAL :0 ; -int rmii_rxc = plat->rmii_rxc ?MT8195_RMII_CLK_SRC_RXC :0 ; -u32 intf_val; +u32 intf_val =FIELD_PREP (MT8195_ETH_INTF_SEL , phy_intf_sel); - intf_val =FIELD_PREP (MT8195_ETH_INTF_SEL , phy_intf_sel); - -/* select phy interface in top control domain */ -switch (plat->phy_mode) { -case PHY_INTERFACE_MODE_RMII : - intf_val |= rmii_rxc | rmii_clk_from_mac; -break ; -case PHY_INTERFACE_MODE_MII : -case PHY_INTERFACE_MODE_RGMII : -case PHY_INTERFACE_MODE_RGMII_TXID : -case PHY_INTERFACE_MODE_RGMII_RXID : -case PHY_INTERFACE_MODE_RGMII_ID : -break ; -default : -dev_err (plat->dev,"phy interface not supported\n" ); -return -EINVAL ; +if (phy_intf_sel ==PHY_INTF_SEL_RMII ) { +if (plat->rmii_clk_from_mac) + intf_val |=MT8195_RMII_CLK_SRC_INTERNAL ; +if (plat->rmii_rxc) + intf_val |=MT8195_RMII_CLK_SRC_RXC ; }/* MT8195 only support external PHY */
This series was applied to netdev/net-next.git (main) by Jakub Kicinski <[email protected]>:
Hello:
This series was applied to netdev/net-next.git (main) by Jakub Kicinski <[email protected]>:
Quoted 6 lines · On Tue, 11 Nov 2025 08:11:25 +0000 you wrote:
This series converts the remaining glue drivers that support multi-interface to use
stmmac_get_phy_intf_sel(). The reason these drivers are not converted to theset_phy_intf_sel()method is because it is unclear whether there are ordering dependencies that would prevent it.
Quoted 6 lines
For example, reading the stm32mp2 documentation, it is required to set the
ETH1_SELfield while the dwmac core is in reset and before clocks are enabled. This requirement can not be satsified at the moment (but could with further changes.)[...]
Here is the summary with links:
- [net-next,v2,01/13] net: stmmac: loongson1: use PHY_INTF_SEL_x
https://git.kernel.org/netdev/net-next/c/5d88b24c1de8 - [net-next,v2,02/13] net: stmmac: loongson1: use PHY_INTF_SEL_x directly https://git.kernel.org/netdev/net-next/c/031f7a05d4b3 - [net-next,v2,03/13] net: stmmac: loongson1: use stmmac_get_phy_intf_sel() https://git.kernel.org/netdev/net-next/c/83eb6c7e1864 - [net-next,v2,04/13] net: stmmac: mediatek: use PHY_INTF_SEL_x https://git.kernel.org/netdev/net-next/c/c3308d380e2c - [net-next,v2,05/13] net: stmmac: mediatek: use stmmac_get_phy_intf_sel() https://git.kernel.org/netdev/net-next/c/d9c7964fd934 - [net-next,v2,06/13] net: stmmac: mediatek: simplify set_interface() methods https://git.kernel.org/netdev/net-next/c/f06620091fe7 - [net-next,v2,07/13] net: stmmac: starfive: use PHY_INTF_SEL_x to select PHY interface https://git.kernel.org/netdev/net-next/c/f0917b475378 - [net-next,v2,08/13] net: stmmac: starfive: use stmmac_get_phy_intf_sel() https://git.kernel.org/netdev/net-next/c/d22045997b53 - [net-next,v2,09/13] net: stmmac: stm32: use PHY_INTF_SEL_x to select PHY interface https://git.kernel.org/netdev/net-next/c/73130c298fa0 - [net-next,v2,10/13] net: stmmac: stm32: use PHY_INTF_SEL_x directly https://git.kernel.org/netdev/net-next/c/07669cf12ea8 - [net-next,v2,11/13] net: stmmac: stm32: use stmmac_get_phy_intf_sel() https://git.kernel.org/netdev/net-next/c/45c5e24a53f1 - [net-next,v2,12/13] net: stmmac: visconti: use PHY_INTF_SEL_x to select PHY interface https://git.kernel.org/netdev/net-next/c/bb68e0183e04 - [net-next,v2,13/13] net: stmmac: visconti: use stmmac_get_phy_intf_sel() https://git.kernel.org/netdev/net-next/c/ccb4ff9f24e2
You are awesome, thank you!
Signature · 2 lines
Deet-doot-dot, I am a bot. https://korg.docs.kernel.org/patchwork/pwbot.html