aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/ethernet/freescale/fec_main.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
index 03785cd14b7c..bfb2bb00c493 100644
--- a/drivers/net/ethernet/freescale/fec_main.c
+++ b/drivers/net/ethernet/freescale/fec_main.c
@@ -1065,12 +1065,15 @@ static void fec_enet_work(struct work_struct *work)
1065 container_of(work, 1065 container_of(work,
1066 struct fec_enet_private, 1066 struct fec_enet_private,
1067 delay_work.delay_work.work); 1067 delay_work.delay_work.work);
1068 struct net_device *ndev = fep->netdev;
1068 1069
1069 if (fep->delay_work.timeout) { 1070 if (fep->delay_work.timeout) {
1070 fep->delay_work.timeout = false; 1071 fep->delay_work.timeout = false;
1071 rtnl_lock(); 1072 rtnl_lock();
1072 fec_restart(fep->netdev, fep->full_duplex); 1073 if (netif_device_present(ndev) || netif_running(ndev)) {
1073 netif_wake_queue(fep->netdev); 1074 fec_restart(ndev, fep->full_duplex);
1075 netif_wake_queue(ndev);
1076 }
1074 rtnl_unlock(); 1077 rtnl_unlock();
1075 } 1078 }
1076 1079
@@ -1504,7 +1507,14 @@ static void fec_enet_adjust_link(struct net_device *ndev)
1504 return; 1507 return;
1505 } 1508 }
1506 1509
1507 if (phy_dev->link) { 1510 /*
1511 * If the netdev is down, or is going down, we're not interested
1512 * in link state events, so just mark our idea of the link as down
1513 * and ignore the event.
1514 */
1515 if (!netif_running(ndev) || !netif_device_present(ndev)) {
1516 fep->link = 0;
1517 } else if (phy_dev->link) {
1508 if (!fep->link) { 1518 if (!fep->link) {
1509 fep->link = phy_dev->link; 1519 fep->link = phy_dev->link;
1510 status_change = 1; 1520 status_change = 1;
@@ -2184,6 +2194,7 @@ fec_enet_open(struct net_device *ndev)
2184 return ret; 2194 return ret;
2185 } 2195 }
2186 2196
2197 fec_restart(ndev, fep->full_duplex);
2187 napi_enable(&fep->napi); 2198 napi_enable(&fep->napi);
2188 phy_start(fep->phy_dev); 2199 phy_start(fep->phy_dev);
2189 netif_start_queue(ndev); 2200 netif_start_queue(ndev);
@@ -2350,8 +2361,6 @@ static int fec_set_features(struct net_device *netdev,
2350 fec_stop(netdev); 2361 fec_stop(netdev);
2351 fec_restart(netdev, fep->phy_dev->duplex); 2362 fec_restart(netdev, fep->phy_dev->duplex);
2352 netif_wake_queue(netdev); 2363 netif_wake_queue(netdev);
2353 } else {
2354 fec_restart(netdev, fep->phy_dev->duplex);
2355 } 2364 }
2356 } 2365 }
2357 2366