--- a/drivers/net/stmmac/stmmac_main.c 2022-01-14 11:09:38.965900712 +0300 +++ b/drivers/net/stmmac/stmmac_main.c 2022-01-14 11:48:05.613133817 +0300 @@ -125,6 +125,10 @@ module_param(debug, int, S_IRUGO | S_IWUSR); MODULE_PARM_DESC(debug, "Message Level (0: no output, 16: all)"); +static int phymode = -1; +module_param(phymode, int, S_IRUGO | S_IWUSR); +MODULE_PARM_DESC(phymode, "PHY interface mode (0=MII,4=RMII,5=RGMII)"); + static int phyaddr = -1; module_param(phyaddr, int, S_IRUGO); MODULE_PARM_DESC(phyaddr, "Physical device address"); @@ -347,10 +351,21 @@ else netif_carrier_off(priv->dev); - /* Always RGMII mode */ - newval |= 0x20; + switch (priv->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: + newval |= 0x20; + break; + case PHY_INTERFACE_MODE_RMII: + newval |= 0x80; + break; + default: + break; + } - /* Shift left for GMAC1 */ + /* Shift left for GMAC1 */ newval <<= shift; newval |= oldval & ~(mask << shift); @@ -2235,6 +2250,9 @@ /* Override with kernel parameters if supplied XXX CRS XXX * this needs to have multiple instances */ + if (phymode >= 0) + plat_dat->interface = phymode; + if ((phyaddr >= 0) && (phyaddr <= 31)) plat_dat->phy_addr = phyaddr;