net: mvpp2: enable using phylink with ACPI
authorMarcin Wojtas <mw@semihalf.com>
Mon, 21 Jun 2021 17:30:27 +0000 (19:30 +0200)
committerDavid S. Miller <davem@davemloft.net>
Tue, 22 Jun 2021 16:54:55 +0000 (09:54 -0700)
Now that the MDIO and phylink are supported in the ACPI
world, enable to use them in the mvpp2 driver. Ensure a backward
compatibility with the firmware whose ACPI description does
not contain the necessary elements for the proper phy handling
and fall back to relying on the link interrupts instead.

Signed-off-by: Marcin Wojtas <mw@semihalf.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c

index 9bca8c8..a66ed31 100644 (file)
@@ -4793,9 +4793,8 @@ static int mvpp2_open(struct net_device *dev)
                goto err_cleanup_txqs;
        }
 
-       /* Phylink isn't supported yet in ACPI mode */
-       if (port->of_node) {
-               err = phylink_of_phy_connect(port->phylink, port->of_node, 0);
+       if (port->phylink) {
+               err = phylink_fwnode_phy_connect(port->phylink, port->fwnode, 0);
                if (err) {
                        netdev_err(port->dev, "could not attach PHY (%d)\n",
                                   err);
@@ -6703,6 +6702,19 @@ static void mvpp2_acpi_start(struct mvpp2_port *port)
                          SPEED_UNKNOWN, DUPLEX_UNKNOWN, false, false);
 }
 
+/* In order to ensure backward compatibility for ACPI, check if the port
+ * firmware node comprises the necessary description allowing to use phylink.
+ */
+static bool mvpp2_use_acpi_compat_mode(struct fwnode_handle *port_fwnode)
+{
+       if (!is_acpi_node(port_fwnode))
+               return false;
+
+       return (!fwnode_property_present(port_fwnode, "phy-handle") &&
+               !fwnode_property_present(port_fwnode, "managed") &&
+               !fwnode_get_named_child_node(port_fwnode, "fixed-link"));
+}
+
 /* Ports initialization */
 static int mvpp2_port_probe(struct platform_device *pdev,
                            struct fwnode_handle *port_fwnode,
@@ -6921,8 +6933,7 @@ static int mvpp2_port_probe(struct platform_device *pdev,
        dev->max_mtu = MVPP2_BM_JUMBO_PKT_SIZE;
        dev->dev.of_node = port_node;
 
-       /* Phylink isn't used w/ ACPI as of now */
-       if (port_node) {
+       if (!mvpp2_use_acpi_compat_mode(port_fwnode)) {
                port->phylink_config.dev = &dev->dev;
                port->phylink_config.type = PHYLINK_NETDEV;
 
@@ -6934,6 +6945,7 @@ static int mvpp2_port_probe(struct platform_device *pdev,
                }
                port->phylink = phylink;
        } else {
+               dev_warn(&pdev->dev, "Use link irqs for port#%d. FW update required\n", port->id);
                port->phylink = NULL;
        }