net: dm: fec: Support phy-reset-post-delay property
[oweals/u-boot.git] / drivers / net / pch_gbe.c
index 14323512b01e96a8ab6e17fe0bc146ee6a694748..2286dd07e932530e82ae6f09389d7d78f657ea0f 100644 (file)
@@ -1,9 +1,8 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * Copyright (C) 2015, Bin Meng <bmeng.cn@gmail.com>
  *
  * Intel Platform Controller Hub EG20T (codename Topcliff) GMAC Driver
- *
- * SPDX-License-Identifier:    GPL-2.0+
  */
 
 #include <common.h>
@@ -120,6 +119,8 @@ static void pch_gbe_rx_descs_init(struct udevice *dev)
                rx_desc[i].buffer_addr = dm_pci_virt_to_mem(priv->dev,
                        priv->rx_buff[i]);
 
+       flush_dcache_range((ulong)rx_desc, (ulong)&rx_desc[PCH_GBE_DESC_NUM]);
+
        writel(dm_pci_virt_to_mem(priv->dev, rx_desc),
               &mac_regs->rx_dsc_base);
        writel(sizeof(struct pch_gbe_rx_desc) * (PCH_GBE_DESC_NUM - 1),
@@ -137,6 +138,8 @@ static void pch_gbe_tx_descs_init(struct udevice *dev)
 
        memset(tx_desc, 0, sizeof(struct pch_gbe_tx_desc) * PCH_GBE_DESC_NUM);
 
+       flush_dcache_range((ulong)tx_desc, (ulong)&tx_desc[PCH_GBE_DESC_NUM]);
+
        writel(dm_pci_virt_to_mem(priv->dev, tx_desc),
               &mac_regs->tx_dsc_base);
        writel(sizeof(struct pch_gbe_tx_desc) * (PCH_GBE_DESC_NUM - 1),
@@ -245,6 +248,8 @@ static int pch_gbe_send(struct udevice *dev, void *packet, int length)
        u32 int_st;
        ulong start;
 
+       flush_dcache_range((ulong)packet, (ulong)packet + length);
+
        tx_head = &priv->tx_desc[0];
        tx_desc = &priv->tx_desc[priv->tx_idx];
 
@@ -258,6 +263,8 @@ static int pch_gbe_send(struct udevice *dev, void *packet, int length)
        tx_desc->dma_status = 0;
        tx_desc->gbec_status = 0;
 
+       flush_dcache_range((ulong)tx_desc, (ulong)&tx_desc[1]);
+
        /* Test the wrap-around condition */
        if (++priv->tx_idx >= PCH_GBE_DESC_NUM)
                priv->tx_idx = 0;
@@ -295,8 +302,12 @@ static int pch_gbe_recv(struct udevice *dev, int flags, uchar **packetp)
        if (virt_to_phys(rx_desc) == hw_desc)
                return -EAGAIN;
 
+       /* Invalidate the descriptor */
+       invalidate_dcache_range((ulong)rx_desc, (ulong)&rx_desc[1]);
+
        length = rx_desc->rx_words_eob - 3 - ETH_FCS_LEN;
        buffer = dm_pci_mem_to_virt(priv->dev, rx_desc->buffer_addr, length, 0);
+       invalidate_dcache_range((ulong)buffer, (ulong)buffer + length);
        *packetp = (uchar *)buffer;
 
        return length;
@@ -418,7 +429,7 @@ static int pch_gbe_phy_init(struct udevice *dev)
        return 0;
 }
 
-int pch_gbe_probe(struct udevice *dev)
+static int pch_gbe_probe(struct udevice *dev)
 {
        struct pch_gbe_priv *priv;
        struct eth_pdata *plat = dev_get_platdata(dev);
@@ -453,7 +464,7 @@ int pch_gbe_probe(struct udevice *dev)
        return pch_gbe_phy_init(dev);
 }
 
-int pch_gbe_remove(struct udevice *dev)
+static int pch_gbe_remove(struct udevice *dev)
 {
        struct pch_gbe_priv *priv = dev_get_priv(dev);