Merge branch 'misc.namei' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
[linux-2.6-microblaze.git] / drivers / net / ethernet / stmicro / stmmac / stmmac_main.c
index ed0cd39..ece02b3 100644 (file)
@@ -5347,7 +5347,7 @@ static int stmmac_napi_poll_rxtx(struct napi_struct *napi, int budget)
        struct stmmac_channel *ch =
                container_of(napi, struct stmmac_channel, rxtx_napi);
        struct stmmac_priv *priv = ch->priv_data;
-       int rx_done, tx_done;
+       int rx_done, tx_done, rxtx_done;
        u32 chan = ch->index;
 
        priv->xstats.napi_poll++;
@@ -5357,14 +5357,16 @@ static int stmmac_napi_poll_rxtx(struct napi_struct *napi, int budget)
 
        rx_done = stmmac_rx_zc(priv, budget, chan);
 
+       rxtx_done = max(tx_done, rx_done);
+
        /* If either TX or RX work is not complete, return budget
         * and keep pooling
         */
-       if (tx_done >= budget || rx_done >= budget)
+       if (rxtx_done >= budget)
                return budget;
 
        /* all work done, exit the polling mode */
-       if (napi_complete_done(napi, rx_done)) {
+       if (napi_complete_done(napi, rxtx_done)) {
                unsigned long flags;
 
                spin_lock_irqsave(&ch->lock, flags);
@@ -5375,7 +5377,7 @@ static int stmmac_napi_poll_rxtx(struct napi_struct *napi, int budget)
                spin_unlock_irqrestore(&ch->lock, flags);
        }
 
-       return min(rx_done, budget - 1);
+       return min(rxtx_done, budget - 1);
 }
 
 /**
@@ -7121,8 +7123,6 @@ int stmmac_suspend(struct device *dev)
        if (!ndev || !netif_running(ndev))
                return 0;
 
-       phylink_mac_change(priv->phylink, false);
-
        mutex_lock(&priv->lock);
 
        netif_device_detach(ndev);
@@ -7148,14 +7148,6 @@ int stmmac_suspend(struct device *dev)
                stmmac_pmt(priv, priv->hw, priv->wolopts);
                priv->irq_wake = 1;
        } else {
-               mutex_unlock(&priv->lock);
-               rtnl_lock();
-               if (device_may_wakeup(priv->device))
-                       phylink_speed_down(priv->phylink, false);
-               phylink_stop(priv->phylink);
-               rtnl_unlock();
-               mutex_lock(&priv->lock);
-
                stmmac_mac_set(priv, priv->ioaddr, false);
                pinctrl_pm_select_sleep_state(priv->device);
                /* Disable clock in case of PWM is off */
@@ -7169,6 +7161,16 @@ int stmmac_suspend(struct device *dev)
 
        mutex_unlock(&priv->lock);
 
+       rtnl_lock();
+       if (device_may_wakeup(priv->device) && priv->plat->pmt) {
+               phylink_suspend(priv->phylink, true);
+       } else {
+               if (device_may_wakeup(priv->device))
+                       phylink_speed_down(priv->phylink, false);
+               phylink_suspend(priv->phylink, false);
+       }
+       rtnl_unlock();
+
        if (priv->dma_cap.fpesel) {
                /* Disable FPE */
                stmmac_fpe_configure(priv, priv->ioaddr,
@@ -7259,13 +7261,15 @@ int stmmac_resume(struct device *dev)
                        return ret;
        }
 
-       if (!device_may_wakeup(priv->device) || !priv->plat->pmt) {
-               rtnl_lock();
-               phylink_start(priv->phylink);
-               /* We may have called phylink_speed_down before */
-               phylink_speed_up(priv->phylink);
-               rtnl_unlock();
+       rtnl_lock();
+       if (device_may_wakeup(priv->device) && priv->plat->pmt) {
+               phylink_resume(priv->phylink);
+       } else {
+               phylink_resume(priv->phylink);
+               if (device_may_wakeup(priv->device))
+                       phylink_speed_up(priv->phylink);
        }
+       rtnl_unlock();
 
        rtnl_lock();
        mutex_lock(&priv->lock);
@@ -7286,8 +7290,6 @@ int stmmac_resume(struct device *dev)
        mutex_unlock(&priv->lock);
        rtnl_unlock();
 
-       phylink_mac_change(priv->phylink, true);
-
        netif_device_attach(ndev);
 
        return 0;