Merge branch 'linux-linaro-lsk-v4.4-android' of git://git.linaro.org/kernel/linux...
[firefly-linux-kernel-4.4.55.git] / drivers / net / ethernet / stmicro / stmmac / stmmac_main.c
index 4b100ef4af9fcb4471ad4de89866f8ffb230e448..9c2daa87b6d5f0f01deef024877a2d7a4cafc945 100644 (file)
@@ -1621,6 +1621,9 @@ static void stmmac_check_ether_addr(struct stmmac_priv *priv)
        if (!is_valid_ether_addr(priv->dev->dev_addr)) {
                priv->hw->mac->get_umac_addr(priv->hw,
                                             priv->dev->dev_addr, 0);
+               if (likely(priv->plat->get_eth_addr))
+                       priv->plat->get_eth_addr(priv->plat->bsp_priv,
+                               priv->dev->dev_addr);
                if (!is_valid_ether_addr(priv->dev->dev_addr))
                        eth_hw_addr_random(priv->dev);
                pr_info("%s: device MAC address %pM\n", priv->dev->name,
@@ -1745,9 +1748,11 @@ static int stmmac_hw_setup(struct net_device *dev, bool init_ptp)
        }
 
 #ifdef CONFIG_DEBUG_FS
-       ret = stmmac_init_fs(dev);
-       if (ret < 0)
-               pr_warn("%s: failed debugFS registration\n", __func__);
+       if (init_ptp) {
+               ret = stmmac_init_fs(dev);
+               if (ret < 0)
+                       pr_warn("%s: failed debugFS registration\n", __func__);
+       }
 #endif
        /* Start the ball rolling... */
        pr_debug("%s: DMA RX/TX processes started...\n", dev->name);
@@ -3039,13 +3044,13 @@ int stmmac_suspend(struct net_device *ndev)
        if (priv->phydev)
                phy_stop(priv->phydev);
 
-       spin_lock_irqsave(&priv->lock, flags);
-
        netif_device_detach(ndev);
        netif_stop_queue(ndev);
 
        napi_disable(&priv->napi);
 
+       spin_lock_irqsave(&priv->lock, flags);
+
        /* Stop TX/RX DMA */
        priv->hw->dma->stop_tx(priv->ioaddr);
        priv->hw->dma->stop_rx(priv->ioaddr);
@@ -3084,8 +3089,6 @@ int stmmac_resume(struct net_device *ndev)
        if (!netif_running(ndev))
                return 0;
 
-       spin_lock_irqsave(&priv->lock, flags);
-
        /* Power Down bit, into the PM register, is cleared
         * automatically as soon as a magic packet or a Wake-up frame
         * is received. Anyway, it's better to manually clear
@@ -3093,7 +3096,9 @@ int stmmac_resume(struct net_device *ndev)
         * from another devices (e.g. serial console).
         */
        if (device_may_wakeup(priv->device)) {
+               spin_lock_irqsave(&priv->lock, flags);
                priv->hw->mac->pmt(priv->hw, 0);
+               spin_unlock_irqrestore(&priv->lock, flags);
                priv->irq_wake = 0;
        } else {
                pinctrl_pm_select_default_state(priv->device);
@@ -3107,6 +3112,8 @@ int stmmac_resume(struct net_device *ndev)
 
        netif_device_attach(ndev);
 
+       spin_lock_irqsave(&priv->lock, flags);
+
        priv->cur_rx = 0;
        priv->dirty_rx = 0;
        priv->dirty_tx = 0;