diff options
Diffstat (limited to 'drivers/net/ethernet/freescale/fec.c')
| -rw-r--r-- | drivers/net/ethernet/freescale/fec.c | 33 | 
1 files changed, 19 insertions, 14 deletions
diff --git a/drivers/net/ethernet/freescale/fec.c b/drivers/net/ethernet/freescale/fec.c index 069a155d16e..911d0253dbb 100644 --- a/drivers/net/ethernet/freescale/fec.c +++ b/drivers/net/ethernet/freescale/fec.c @@ -934,24 +934,28 @@ static void fec_enet_adjust_link(struct net_device *ndev)  		goto spin_unlock;  	} -	/* Duplex link change */  	if (phy_dev->link) { -		if (fep->full_duplex != phy_dev->duplex) { -			fec_restart(ndev, phy_dev->duplex); -			/* prevent unnecessary second fec_restart() below */ +		if (!fep->link) {  			fep->link = phy_dev->link;  			status_change = 1;  		} -	} -	/* Link on or off change */ -	if (phy_dev->link != fep->link) { -		fep->link = phy_dev->link; -		if (phy_dev->link) +		if (fep->full_duplex != phy_dev->duplex) +			status_change = 1; + +		if (phy_dev->speed != fep->speed) { +			fep->speed = phy_dev->speed; +			status_change = 1; +		} + +		/* if any of the above changed restart the FEC */ +		if (status_change)  			fec_restart(ndev, phy_dev->duplex); -		else +	} else { +		if (fep->link) {  			fec_stop(ndev); -		status_change = 1; +			status_change = 1; +		}  	}  spin_unlock: @@ -1328,7 +1332,7 @@ static int fec_enet_ioctl(struct net_device *ndev, struct ifreq *rq, int cmd)  static void fec_enet_free_buffers(struct net_device *ndev)  {  	struct fec_enet_private *fep = netdev_priv(ndev); -	int i; +	unsigned int i;  	struct sk_buff *skb;  	struct bufdesc	*bdp; @@ -1352,7 +1356,7 @@ static void fec_enet_free_buffers(struct net_device *ndev)  static int fec_enet_alloc_buffers(struct net_device *ndev)  {  	struct fec_enet_private *fep = netdev_priv(ndev); -	int i; +	unsigned int i;  	struct sk_buff *skb;  	struct bufdesc	*bdp; @@ -1437,6 +1441,7 @@ fec_enet_close(struct net_device *ndev)  	struct fec_enet_private *fep = netdev_priv(ndev);  	/* Don't know what to do yet. */ +	napi_disable(&fep->napi);  	fep->opened = 0;  	netif_stop_queue(ndev);  	fec_stop(ndev); @@ -1593,7 +1598,7 @@ static int fec_enet_init(struct net_device *ndev)  	struct fec_enet_private *fep = netdev_priv(ndev);  	struct bufdesc *cbd_base;  	struct bufdesc *bdp; -	int i; +	unsigned int i;  	/* Allocate memory for buffer descriptors. */  	cbd_base = dma_alloc_coherent(NULL, PAGE_SIZE, &fep->bd_dma,  |