]> Pileus Git - ~andy/linux/blobdiff - drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
net: stmmac: Silence PTP init errors on hw without PTP
[~andy/linux] / drivers / net / ethernet / stmicro / stmmac / stmmac_main.c
index 0d2c4cb0996b3155a59586fe4fa855cdfc70fa3a..a395bb24cdf2c4b2ba5cd255ed8354dbe44552c0 100644 (file)
@@ -51,9 +51,9 @@
 #include <linux/net_tstamp.h>
 #include "stmmac_ptp.h"
 #include "stmmac.h"
+#include <linux/reset.h>
 
 #define STMMAC_ALIGN(x)        L1_CACHE_ALIGN(x)
-#define JUMBO_LEN      9000
 
 /* Module parameters */
 #define TX_TIMEO       5000
@@ -92,7 +92,7 @@ static int tc = TC_DEFAULT;
 module_param(tc, int, S_IRUGO | S_IWUSR);
 MODULE_PARM_DESC(tc, "DMA threshold control value");
 
-#define DMA_BUFFER_SIZE        BUF_SIZE_2KiB
+#define DMA_BUFFER_SIZE        BUF_SIZE_4KiB
 static int buf_sz = DMA_BUFFER_SIZE;
 module_param(buf_sz, int, S_IRUGO | S_IWUSR);
 MODULE_PARM_DESC(buf_sz, "DMA buffer size");
@@ -333,7 +333,7 @@ static void stmmac_get_tx_hwtstamp(struct stmmac_priv *priv,
                return;
 
        /* exit if skb doesn't support hw tstamp */
-       if (likely(!(skb_shinfo(skb)->tx_flags & SKBTX_IN_PROGRESS)))
+       if (likely(!skb || !(skb_shinfo(skb)->tx_flags & SKBTX_IN_PROGRESS)))
                return;
 
        if (priv->adv_ts)
@@ -993,6 +993,8 @@ static int init_dma_desc_rings(struct net_device *dev)
        if (bfsize < BUF_SIZE_16KiB)
                bfsize = stmmac_set_bfsize(dev->mtu, priv->dma_buf_sz);
 
+       priv->dma_buf_sz = bfsize;
+
        if (netif_msg_probe(priv))
                pr_debug("%s: txsize %d, rxsize %d, bfsize %d\n", __func__,
                         txsize, rxsize, bfsize);
@@ -1022,7 +1024,6 @@ static int init_dma_desc_rings(struct net_device *dev)
        }
        priv->cur_rx = 0;
        priv->dirty_rx = (unsigned int)(i - rxsize);
-       priv->dma_buf_sz = bfsize;
        buf_sz = bfsize;
 
        /* Setup the chained descriptor addresses */
@@ -1080,21 +1081,24 @@ static void dma_free_tx_skbufs(struct stmmac_priv *priv)
        int i;
 
        for (i = 0; i < priv->dma_tx_size; i++) {
-               if (priv->tx_skbuff[i] != NULL) {
-                       struct dma_desc *p;
-                       if (priv->extend_desc)
-                               p = &((priv->dma_etx + i)->basic);
-                       else
-                               p = priv->dma_tx + i;
+               struct dma_desc *p;
 
-                       if (priv->tx_skbuff_dma[i])
-                               dma_unmap_single(priv->device,
-                                                priv->tx_skbuff_dma[i],
-                                                priv->hw->desc->get_tx_len(p),
-                                                DMA_TO_DEVICE);
+               if (priv->extend_desc)
+                       p = &((priv->dma_etx + i)->basic);
+               else
+                       p = priv->dma_tx + i;
+
+               if (priv->tx_skbuff_dma[i]) {
+                       dma_unmap_single(priv->device,
+                                        priv->tx_skbuff_dma[i],
+                                        priv->hw->desc->get_tx_len(p),
+                                        DMA_TO_DEVICE);
+                       priv->tx_skbuff_dma[i] = 0;
+               }
+
+               if (priv->tx_skbuff[i] != NULL) {
                        dev_kfree_skb_any(priv->tx_skbuff[i]);
                        priv->tx_skbuff[i] = NULL;
-                       priv->tx_skbuff_dma[i] = 0;
                }
        }
 }
@@ -1620,7 +1624,7 @@ static int stmmac_hw_setup(struct net_device *dev)
                priv->plat->bus_setup(priv->ioaddr);
 
        /* Initialize the MAC Core */
-       priv->hw->mac->core_init(priv->ioaddr);
+       priv->hw->mac->core_init(priv->ioaddr, dev->mtu);
 
        /* Enable the MAC Rx/Tx */
        stmmac_set_mac(priv->ioaddr, true);
@@ -1631,7 +1635,7 @@ static int stmmac_hw_setup(struct net_device *dev)
        stmmac_mmc_setup(priv);
 
        ret = stmmac_init_ptp(priv);
-       if (ret)
+       if (ret && ret != -EOPNOTSUPP)
                pr_warn("%s: failed PTP initialisation\n", __func__);
 
 #ifdef CONFIG_STMMAC_DEBUG_FS
@@ -1866,8 +1870,6 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev)
 
        first = desc;
 
-       priv->tx_skbuff[entry] = skb;
-
        /* To program the descriptors according to the size of the frame */
        if (priv->mode == STMMAC_RING_MODE) {
                is_jumbo = priv->hw->ring->is_jumbo_frm(skb->len,
@@ -1895,6 +1897,7 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev)
                const skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
                int len = skb_frag_size(frag);
 
+               priv->tx_skbuff[entry] = NULL;
                entry = (++priv->cur_tx) % txsize;
                if (priv->extend_desc)
                        desc = (struct dma_desc *)(priv->dma_etx + entry);
@@ -1904,7 +1907,6 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev)
                desc->des2 = skb_frag_dma_map(priv->device, frag, 0, len,
                                              DMA_TO_DEVICE);
                priv->tx_skbuff_dma[entry] = desc->des2;
-               priv->tx_skbuff[entry] = NULL;
                priv->hw->desc->prepare_tx_desc(desc, 0, len, csum_insertion,
                                                priv->mode);
                wmb();
@@ -1912,6 +1914,8 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev)
                wmb();
        }
 
+       priv->tx_skbuff[entry] = skb;
+
        /* Finalize the latest segment. */
        priv->hw->desc->close_tx_desc(desc);
 
@@ -2270,6 +2274,9 @@ static int stmmac_change_mtu(struct net_device *dev, int new_mtu)
        else
                max_mtu = SKB_MAX_HEAD(NET_SKB_PAD + NET_IP_ALIGN);
 
+       if (priv->plat->maxmtu < max_mtu)
+               max_mtu = priv->plat->maxmtu;
+
        if ((new_mtu < 46) || (new_mtu > max_mtu)) {
                pr_err("%s: invalid MTU, max MTU is: %d\n", dev->name, max_mtu);
                return -EINVAL;
@@ -2728,10 +2735,24 @@ struct stmmac_priv *stmmac_dvr_probe(struct device *device,
        if (IS_ERR(priv->stmmac_clk)) {
                dev_warn(priv->device, "%s: warning: cannot get CSR clock\n",
                         __func__);
+               ret = PTR_ERR(priv->stmmac_clk);
                goto error_clk_get;
        }
        clk_prepare_enable(priv->stmmac_clk);
 
+       priv->stmmac_rst = devm_reset_control_get(priv->device,
+                                                 STMMAC_RESOURCE_NAME);
+       if (IS_ERR(priv->stmmac_rst)) {
+               if (PTR_ERR(priv->stmmac_rst) == -EPROBE_DEFER) {
+                       ret = -EPROBE_DEFER;
+                       goto error_hw_init;
+               }
+               dev_info(priv->device, "no reset control found\n");
+               priv->stmmac_rst = NULL;
+       }
+       if (priv->stmmac_rst)
+               reset_control_deassert(priv->stmmac_rst);
+
        /* Init MAC and get the capabilities */
        ret = stmmac_hw_init(priv);
        if (ret)
@@ -2808,7 +2829,7 @@ error_hw_init:
 error_clk_get:
        free_netdev(ndev);
 
-       return NULL;
+       return ERR_PTR(ret);
 }
 
 /**
@@ -2832,6 +2853,8 @@ int stmmac_dvr_remove(struct net_device *ndev)
                stmmac_mdio_unregister(ndev);
        netif_carrier_off(ndev);
        unregister_netdev(ndev);
+       if (priv->stmmac_rst)
+               reset_control_assert(priv->stmmac_rst);
        clk_disable_unprepare(priv->stmmac_clk);
        free_netdev(ndev);