Enable RMII interface in the lan743x driver for PHY and MAC
configuration.
- Select RMII interface in lan743x_phy_interface_select().
- Update phylink supported_interfaces and MAC capabilities.
- Enable RMII via RMII_CTL in lan743x_hardware_init().
- Define RMII_CTL register and enable bit in lan743x_main.h.
Signed-off-by: Thangaraj Samynathan <thangaraj.s@microchip.com>
---
drivers/net/ethernet/microchip/lan743x_main.c | 18 ++++++++++++++++++
drivers/net/ethernet/microchip/lan743x_main.h | 3 +++
2 files changed, 21 insertions(+)
diff --git a/drivers/net/ethernet/microchip/lan743x_main.c b/drivers/net/ethernet/microchip/lan743x_main.c
index b7b1584d867d..86d35810460f 100644
--- a/drivers/net/ethernet/microchip/lan743x_main.c
+++ b/drivers/net/ethernet/microchip/lan743x_main.c
@@ -1370,6 +1370,8 @@ static void lan743x_phy_interface_select(struct lan743x_adapter *adapter)
if (adapter->is_pci11x1x && adapter->is_sgmii_en)
adapter->phy_interface = PHY_INTERFACE_MODE_SGMII;
+ else if (adapter->is_pci11x1x && adapter->is_rmii_en)
+ adapter->phy_interface = PHY_INTERFACE_MODE_RMII;
else if (id_rev == ID_REV_ID_LAN7430_)
adapter->phy_interface = PHY_INTERFACE_MODE_GMII;
else if ((id_rev == ID_REV_ID_LAN7431_) && (data & MAC_CR_MII_EN_))
@@ -3158,6 +3160,13 @@ static int lan743x_phylink_create(struct lan743x_adapter *adapter)
__set_bit(PHY_INTERFACE_MODE_MII,
adapter->phylink_config.supported_interfaces);
break;
+ case PHY_INTERFACE_MODE_RMII:
+ __set_bit(PHY_INTERFACE_MODE_RMII,
+ adapter->phylink_config.supported_interfaces);
+ adapter->phylink_config.mac_capabilities &= ~MAC_1000FD;
+ adapter->phylink_config.lpi_capabilities = 0;
+ break;
+
default:
phy_interface_set_rgmii(adapter->phylink_config.supported_interfaces);
}
@@ -3165,6 +3174,9 @@ static int lan743x_phylink_create(struct lan743x_adapter *adapter)
memcpy(adapter->phylink_config.lpi_interfaces,
adapter->phylink_config.supported_interfaces,
sizeof(adapter->phylink_config.lpi_interfaces));
+ if (adapter->phy_interface == PHY_INTERFACE_MODE_RMII)
+ __clear_bit(PHY_INTERFACE_MODE_RMII,
+ adapter->phylink_config.lpi_interfaces);
pl = phylink_create(&adapter->phylink_config, NULL,
adapter->phy_interface, &lan743x_phylink_mac_ops);
@@ -3509,6 +3521,7 @@ static int lan743x_hardware_init(struct lan743x_adapter *adapter,
{
struct lan743x_tx *tx;
u32 sgmii_ctl;
+ u32 rmii_ctl;
int index;
int ret;
@@ -3530,6 +3543,11 @@ static int lan743x_hardware_init(struct lan743x_adapter *adapter,
sgmii_ctl |= SGMII_CTL_SGMII_POWER_DN_;
}
lan743x_csr_write(adapter, SGMII_CTL, sgmii_ctl);
+ if (adapter->is_rmii_en) {
+ rmii_ctl = lan743x_csr_read(adapter, RMII_CTL);
+ rmii_ctl |= RMII_CTL_RMII_ENABLE_;
+ lan743x_csr_write(adapter, RMII_CTL, rmii_ctl);
+ }
} else {
adapter->max_tx_channels = LAN743X_MAX_TX_CHANNELS;
adapter->used_tx_channels = LAN743X_USED_TX_CHANNELS;
diff --git a/drivers/net/ethernet/microchip/lan743x_main.h b/drivers/net/ethernet/microchip/lan743x_main.h
index 1d7d37456553..03f3727ed8f7 100644
--- a/drivers/net/ethernet/microchip/lan743x_main.h
+++ b/drivers/net/ethernet/microchip/lan743x_main.h
@@ -324,6 +324,9 @@
#define MAC_WUCSR2_IPV6_TCPSYN_RCD_ BIT(5)
#define MAC_WUCSR2_IPV4_TCPSYN_RCD_ BIT(4)
+#define RMII_CTL (0x710)
+#define RMII_CTL_RMII_ENABLE_ BIT(0)
+
#define SGMII_ACC (0x720)
#define SGMII_ACC_SGMII_BZY_ BIT(31)
#define SGMII_ACC_SGMII_WR_ BIT(30)
--
2.34.1
On Fri, Mar 27, 2026 at 11:10:08AM +0530, Thangaraj Samynathan wrote:
> Enable RMII interface in the lan743x driver for PHY and MAC
> configuration.
>
> - Select RMII interface in lan743x_phy_interface_select().
> - Update phylink supported_interfaces and MAC capabilities.
> - Enable RMII via RMII_CTL in lan743x_hardware_init().
> - Define RMII_CTL register and enable bit in lan743x_main.h.
>
> Signed-off-by: Thangaraj Samynathan <thangaraj.s@microchip.com>
> ---
> drivers/net/ethernet/microchip/lan743x_main.c | 18 ++++++++++++++++++
> drivers/net/ethernet/microchip/lan743x_main.h | 3 +++
> 2 files changed, 21 insertions(+)
>
> diff --git a/drivers/net/ethernet/microchip/lan743x_main.c b/drivers/net/ethernet/microchip/lan743x_main.c
> index b7b1584d867d..86d35810460f 100644
> --- a/drivers/net/ethernet/microchip/lan743x_main.c
> +++ b/drivers/net/ethernet/microchip/lan743x_main.c
> @@ -1370,6 +1370,8 @@ static void lan743x_phy_interface_select(struct lan743x_adapter *adapter)
>
> if (adapter->is_pci11x1x && adapter->is_sgmii_en)
> adapter->phy_interface = PHY_INTERFACE_MODE_SGMII;
> + else if (adapter->is_pci11x1x && adapter->is_rmii_en)
> + adapter->phy_interface = PHY_INTERFACE_MODE_RMII;
> else if (id_rev == ID_REV_ID_LAN7430_)
> adapter->phy_interface = PHY_INTERFACE_MODE_GMII;
> else if ((id_rev == ID_REV_ID_LAN7431_) && (data & MAC_CR_MII_EN_))
> @@ -3158,6 +3160,13 @@ static int lan743x_phylink_create(struct lan743x_adapter *adapter)
> __set_bit(PHY_INTERFACE_MODE_MII,
> adapter->phylink_config.supported_interfaces);
> break;
> + case PHY_INTERFACE_MODE_RMII:
> + __set_bit(PHY_INTERFACE_MODE_RMII,
> + adapter->phylink_config.supported_interfaces);
> + adapter->phylink_config.mac_capabilities &= ~MAC_1000FD;
Phylink already knows that gigabit isn't supported with RMII. See
phy_caps_from_interface():
case PHY_INTERFACE_MODE_REVRMII:
case PHY_INTERFACE_MODE_RMII:
case PHY_INTERFACE_MODE_SMII:
case PHY_INTERFACE_MODE_REVMII:
case PHY_INTERFACE_MODE_MII:
link_caps |= BIT(LINK_CAPA_10HD) | BIT(LINK_CAPA_10FD);
fallthrough;
case PHY_INTERFACE_MODE_100BASEX:
link_caps |= BIT(LINK_CAPA_100HD) | BIT(LINK_CAPA_100FD);
break;
which is used by phylink_get_capabilities() to reduce the MAC
capabilities depending on the interface and rate matching.
The only case to do this is where the MAC really has no 1G support.
--
RMK's Patch system: https://www.armlinux.org.uk/developer/patches/
FTTP is here! 80Mbps down 10Mbps up. Decent connectivity at last!
Hi, On 27/03/2026 06:40, Thangaraj Samynathan wrote: > Enable RMII interface in the lan743x driver for PHY and MAC > configuration. > > - Select RMII interface in lan743x_phy_interface_select(). > - Update phylink supported_interfaces and MAC capabilities. > - Enable RMII via RMII_CTL in lan743x_hardware_init(). > - Define RMII_CTL register and enable bit in lan743x_main.h. > > Signed-off-by: Thangaraj Samynathan <thangaraj.s@microchip.com> > --- > drivers/net/ethernet/microchip/lan743x_main.c | 18 ++++++++++++++++++ > drivers/net/ethernet/microchip/lan743x_main.h | 3 +++ > 2 files changed, 21 insertions(+) > > diff --git a/drivers/net/ethernet/microchip/lan743x_main.c b/drivers/net/ethernet/microchip/lan743x_main.c > index b7b1584d867d..86d35810460f 100644 > --- a/drivers/net/ethernet/microchip/lan743x_main.c > +++ b/drivers/net/ethernet/microchip/lan743x_main.c > @@ -1370,6 +1370,8 @@ static void lan743x_phy_interface_select(struct lan743x_adapter *adapter) > > if (adapter->is_pci11x1x && adapter->is_sgmii_en) > adapter->phy_interface = PHY_INTERFACE_MODE_SGMII; > + else if (adapter->is_pci11x1x && adapter->is_rmii_en) > + adapter->phy_interface = PHY_INTERFACE_MODE_RMII; > else if (id_rev == ID_REV_ID_LAN7430_) > adapter->phy_interface = PHY_INTERFACE_MODE_GMII; > else if ((id_rev == ID_REV_ID_LAN7431_) && (data & MAC_CR_MII_EN_)) > @@ -3158,6 +3160,13 @@ static int lan743x_phylink_create(struct lan743x_adapter *adapter) > __set_bit(PHY_INTERFACE_MODE_MII, > adapter->phylink_config.supported_interfaces); > break; > + case PHY_INTERFACE_MODE_RMII: > + __set_bit(PHY_INTERFACE_MODE_RMII, > + adapter->phylink_config.supported_interfaces); > + adapter->phylink_config.mac_capabilities &= ~MAC_1000FD; Some followup should take care of removing the 1000FD cap for MII as well. Same for the LPI caps, is there a similiar limitation for MII ? Otherwise, this patch looks good to me so, Reviewed-by: Maxime Chevallier <maxime.chevallier@bootlin.com> Maxime
On 27/03/2026 09:47, Maxime Chevallier wrote: > Hi, > > On 27/03/2026 06:40, Thangaraj Samynathan wrote: >> Enable RMII interface in the lan743x driver for PHY and MAC >> configuration. >> >> - Select RMII interface in lan743x_phy_interface_select(). >> - Update phylink supported_interfaces and MAC capabilities. >> - Enable RMII via RMII_CTL in lan743x_hardware_init(). >> - Define RMII_CTL register and enable bit in lan743x_main.h. >> >> Signed-off-by: Thangaraj Samynathan <thangaraj.s@microchip.com> >> --- >> drivers/net/ethernet/microchip/lan743x_main.c | 18 ++++++++++++++++++ >> drivers/net/ethernet/microchip/lan743x_main.h | 3 +++ >> 2 files changed, 21 insertions(+) >> >> diff --git a/drivers/net/ethernet/microchip/lan743x_main.c b/drivers/net/ethernet/microchip/lan743x_main.c >> index b7b1584d867d..86d35810460f 100644 >> --- a/drivers/net/ethernet/microchip/lan743x_main.c >> +++ b/drivers/net/ethernet/microchip/lan743x_main.c >> @@ -1370,6 +1370,8 @@ static void lan743x_phy_interface_select(struct lan743x_adapter *adapter) >> >> if (adapter->is_pci11x1x && adapter->is_sgmii_en) >> adapter->phy_interface = PHY_INTERFACE_MODE_SGMII; >> + else if (adapter->is_pci11x1x && adapter->is_rmii_en) >> + adapter->phy_interface = PHY_INTERFACE_MODE_RMII; >> else if (id_rev == ID_REV_ID_LAN7430_) >> adapter->phy_interface = PHY_INTERFACE_MODE_GMII; >> else if ((id_rev == ID_REV_ID_LAN7431_) && (data & MAC_CR_MII_EN_)) >> @@ -3158,6 +3160,13 @@ static int lan743x_phylink_create(struct lan743x_adapter *adapter) >> __set_bit(PHY_INTERFACE_MODE_MII, >> adapter->phylink_config.supported_interfaces); >> break; >> + case PHY_INTERFACE_MODE_RMII: >> + __set_bit(PHY_INTERFACE_MODE_RMII, >> + adapter->phylink_config.supported_interfaces); >> + adapter->phylink_config.mac_capabilities &= ~MAC_1000FD; > > Some followup should take care of removing the 1000FD cap for MII as > well. Well as Russell says, no need for that :) Maxime
© 2016 - 2026 Red Hat, Inc.