diff options
| -rw-r--r-- | drivers/net/ucc_geth.c | 15 | 
1 files changed, 9 insertions, 6 deletions
| diff --git a/drivers/net/ucc_geth.c b/drivers/net/ucc_geth.c index a4c3f5708246..cf6653f71d23 100644 --- a/drivers/net/ucc_geth.c +++ b/drivers/net/ucc_geth.c @@ -2065,9 +2065,6 @@ static void ucc_geth_stop(struct ucc_geth_private *ugeth)  	/* Disable Rx and Tx */  	clrbits32(&ug_regs->maccfg1, MACCFG1_ENABLE_RX | MACCFG1_ENABLE_TX); -	phy_disconnect(ugeth->phydev); -	ugeth->phydev = NULL; -  	ucc_geth_memclean(ugeth);  } @@ -3550,7 +3547,10 @@ static int ucc_geth_close(struct net_device *dev)  	napi_disable(&ugeth->napi); +	cancel_work_sync(&ugeth->timeout_work);  	ucc_geth_stop(ugeth); +	phy_disconnect(ugeth->phydev); +	ugeth->phydev = NULL;  	free_irq(ugeth->ug_info->uf_info.irq, ugeth->ndev); @@ -3579,8 +3579,12 @@ static void ucc_geth_timeout_work(struct work_struct *work)  		 * Must reset MAC *and* PHY. This is done by reopening  		 * the device.  		 */ -		ucc_geth_close(dev); -		ucc_geth_open(dev); +		netif_tx_stop_all_queues(dev); +		ucc_geth_stop(ugeth); +		ucc_geth_init_mac(ugeth); +		/* Must start PHY here */ +		phy_start(ugeth->phydev); +		netif_tx_start_all_queues(dev);  	}  	netif_tx_schedule_all(dev); @@ -3594,7 +3598,6 @@ static void ucc_geth_timeout(struct net_device *dev)  {  	struct ucc_geth_private *ugeth = netdev_priv(dev); -	netif_carrier_off(dev);  	schedule_work(&ugeth->timeout_work);  } | 
