diff options
Diffstat (limited to 'drivers/net/gianfar.c')
| -rw-r--r-- | drivers/net/gianfar.c | 29 | 
1 files changed, 24 insertions, 5 deletions
| diff --git a/drivers/net/gianfar.c b/drivers/net/gianfar.c index 1b8deca8b9f8..3f7eab42aef1 100644 --- a/drivers/net/gianfar.c +++ b/drivers/net/gianfar.c @@ -296,6 +296,20 @@ err_out:  	return err;  } +/* Ioctl MII Interface */ +static int gfar_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) +{ +	struct gfar_private *priv = netdev_priv(dev); + +	if (!netif_running(dev)) +		return -EINVAL; + +	if (!priv->phydev) +		return -ENODEV; + +	return phy_mii_ioctl(priv->phydev, if_mii(rq), cmd); +} +  /* Set up the ethernet device structure, private data,   * and anything else we need before we start */  static int gfar_probe(struct of_device *ofdev, @@ -366,6 +380,7 @@ static int gfar_probe(struct of_device *ofdev,  	dev->set_multicast_list = gfar_set_multi;  	dev->ethtool_ops = &gfar_ethtool_ops; +	dev->do_ioctl = gfar_ioctl;  	if (priv->device_flags & FSL_GIANFAR_DEV_HAS_CSUM) {  		priv->rx_csum_enable = 1; @@ -1408,15 +1423,11 @@ static void gfar_vlan_rx_register(struct net_device *dev,  {  	struct gfar_private *priv = netdev_priv(dev);  	unsigned long flags; -	struct vlan_group *old_grp;  	u32 tempval;  	spin_lock_irqsave(&priv->rxlock, flags); -	old_grp = priv->vlgrp; - -	if (old_grp == grp) -		return; +	priv->vlgrp = grp;  	if (grp) {  		/* Enable VLAN tag insertion */ @@ -1607,10 +1618,18 @@ static int gfar_clean_tx_ring(struct net_device *dev)  static void gfar_schedule_cleanup(struct net_device *dev)  {  	struct gfar_private *priv = netdev_priv(dev); +	unsigned long flags; + +	spin_lock_irqsave(&priv->txlock, flags); +	spin_lock(&priv->rxlock); +  	if (netif_rx_schedule_prep(&priv->napi)) {  		gfar_write(&priv->regs->imask, IMASK_RTX_DISABLED);  		__netif_rx_schedule(&priv->napi);  	} + +	spin_unlock(&priv->rxlock); +	spin_unlock_irqrestore(&priv->txlock, flags);  }  /* Interrupt Handler for Transmit complete */ | 
