Merge git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next
[platform/kernel/linux-starfive.git] / drivers / net / ethernet / marvell / mvpp2 / mvpp2_main.c
index c316775..3229baf 100644 (file)
@@ -3543,21 +3543,17 @@ static void mvpp2_rx_error(struct mvpp2_port *port,
 }
 
 /* Handle RX checksum offload */
-static void mvpp2_rx_csum(struct mvpp2_port *port, u32 status,
-                         struct sk_buff *skb)
+static int mvpp2_rx_csum(struct mvpp2_port *port, u32 status)
 {
        if (((status & MVPP2_RXD_L3_IP4) &&
             !(status & MVPP2_RXD_IP4_HEADER_ERR)) ||
            (status & MVPP2_RXD_L3_IP6))
                if (((status & MVPP2_RXD_L4_UDP) ||
                     (status & MVPP2_RXD_L4_TCP)) &&
-                    (status & MVPP2_RXD_L4_CSUM_OK)) {
-                       skb->csum = 0;
-                       skb->ip_summed = CHECKSUM_UNNECESSARY;
-                       return;
-               }
+                    (status & MVPP2_RXD_L4_CSUM_OK))
+                       return CHECKSUM_UNNECESSARY;
 
-       skb->ip_summed = CHECKSUM_NONE;
+       return CHECKSUM_NONE;
 }
 
 /* Allocate a new skb and add it to BM pool */
@@ -4010,7 +4006,7 @@ static int mvpp2_rx(struct mvpp2_port *port, struct napi_struct *napi,
 
                skb_reserve(skb, MVPP2_MH_SIZE + MVPP2_SKB_HEADROOM);
                skb_put(skb, rx_bytes);
-               mvpp2_rx_csum(port, rx_status, skb);
+               skb->ip_summed = mvpp2_rx_csum(port, rx_status);
                skb->protocol = eth_type_trans(skb, dev);
 
                napi_gro_receive(napi, skb);
@@ -4789,9 +4785,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);
@@ -6699,6 +6694,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,
@@ -6774,7 +6782,6 @@ static int mvpp2_port_probe(struct platform_device *pdev,
        port = netdev_priv(dev);
        port->dev = dev;
        port->fwnode = port_fwnode;
-       port->has_phy = !!of_find_property(port_node, "phy", NULL);
        port->ntxqs = ntxqs;
        port->nrxqs = nrxqs;
        port->priv = priv;
@@ -6917,8 +6924,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;
 
@@ -6930,6 +6936,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;
        }