net: lan743x: add generic implementation for phy interface selection
authorPavithra Sathyanarayanan <Pavithra.Sathyanarayanan@microchip.com>
Tue, 17 Jan 2023 14:16:13 +0000 (19:46 +0530)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 19 Jan 2023 12:50:11 +0000 (13:50 +0100)
Add logic to read the Phy interface from MAC_CR register for LAN743x
driver.

Checks for the LAN7430/31 or pci11x1x devices and the adapter
interface is updated accordingly. For LAN7431, adapter interface is set
based on Bit 19 of MAC_CR register as MII or RGMII which removes the
forced RGMII/GMII configurations in lan743x_phy_open().

Signed-off-by: Pavithra Sathyanarayanan <Pavithra.Sathyanarayanan@microchip.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/microchip/lan743x_main.c
drivers/net/ethernet/microchip/lan743x_main.h

index c4d16f4654b50d308c9ce36d9aa27ade944e3928..fe3026ed6f03dab217f92839e761b8eb06a4c8a0 100644 (file)
@@ -1469,6 +1469,24 @@ static void lan743x_phy_close(struct lan743x_adapter *adapter)
        netdev->phydev = NULL;
 }
 
+static void lan743x_phy_interface_select(struct lan743x_adapter *adapter)
+{
+       u32 id_rev;
+       u32 data;
+
+       data = lan743x_csr_read(adapter, MAC_CR);
+       id_rev = adapter->csr.id_rev & ID_REV_ID_MASK_;
+
+       if (adapter->is_pci11x1x && adapter->is_sgmii_en)
+               adapter->phy_interface = PHY_INTERFACE_MODE_SGMII;
+       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_))
+               adapter->phy_interface = PHY_INTERFACE_MODE_MII;
+       else
+               adapter->phy_interface = PHY_INTERFACE_MODE_RGMII;
+}
+
 static int lan743x_phy_open(struct lan743x_adapter *adapter)
 {
        struct net_device *netdev = adapter->netdev;
@@ -1486,14 +1504,11 @@ static int lan743x_phy_open(struct lan743x_adapter *adapter)
                if (!phydev)
                        goto return_error;
 
-               if (adapter->is_pci11x1x)
-                       ret = phy_connect_direct(netdev, phydev,
-                                                lan743x_phy_link_status_change,
-                                                PHY_INTERFACE_MODE_RGMII);
-               else
-                       ret = phy_connect_direct(netdev, phydev,
-                                                lan743x_phy_link_status_change,
-                                                PHY_INTERFACE_MODE_GMII);
+               lan743x_phy_interface_select(adapter);
+
+               ret = phy_connect_direct(netdev, phydev,
+                                        lan743x_phy_link_status_change,
+                                        adapter->phy_interface);
                if (ret)
                        goto return_error;
        }
index 8438c3dbcf36093f9054ccba9e44330996ab8bfd..52609fc13ad9504f50fadf2d4fb742eb4e4cc15f 100644 (file)
@@ -1042,6 +1042,7 @@ struct lan743x_adapter {
 #define LAN743X_ADAPTER_FLAG_OTP               BIT(0)
        u32                     flags;
        u32                     hw_cfg;
+       phy_interface_t         phy_interface;
 };
 
 #define LAN743X_COMPONENT_FLAG_RX(channel)  BIT(20 + (channel))