diff options
Diffstat (limited to 'drivers/net/ewrk3.c')
| -rw-r--r-- | drivers/net/ewrk3.c | 58 | 
1 files changed, 25 insertions, 33 deletions
diff --git a/drivers/net/ewrk3.c b/drivers/net/ewrk3.c index 380d0614a89..b5f6173130f 100644 --- a/drivers/net/ewrk3.c +++ b/drivers/net/ewrk3.c @@ -1545,7 +1545,7 @@ static int ewrk3_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)  	}  	ecmd->supported |= SUPPORTED_10baseT_Half; -	ecmd->speed = SPEED_10; +	ethtool_cmd_speed_set(ecmd, SPEED_10);  	ecmd->duplex = DUPLEX_HALF;  	return 0;  } @@ -1604,55 +1604,47 @@ static u32 ewrk3_get_link(struct net_device *dev)  	return !(cmr & CMR_LINK);  } -static int ewrk3_phys_id(struct net_device *dev, u32 data) +static int ewrk3_set_phys_id(struct net_device *dev, +			     enum ethtool_phys_id_state state)  {  	struct ewrk3_private *lp = netdev_priv(dev);  	unsigned long iobase = dev->base_addr; -	unsigned long flags;  	u8 cr; -	int count; - -	/* Toggle LED 4x per second */ -	count = data << 2; -	spin_lock_irqsave(&lp->hw_lock, flags); - -	/* Bail if a PHYS_ID is already in progress */ -	if (lp->led_mask == 0) { -		spin_unlock_irqrestore(&lp->hw_lock, flags); -		return -EBUSY; -	} +	spin_lock_irq(&lp->hw_lock); -	/* Prevent ISR from twiddling the LED */ -	lp->led_mask = 0; +	switch (state) { +	case ETHTOOL_ID_ACTIVE: +		/* Prevent ISR from twiddling the LED */ +		lp->led_mask = 0; +		spin_unlock_irq(&lp->hw_lock); +		return 2;	/* cycle on/off twice per second */ -	while (count--) { -		/* Toggle the LED */ +	case ETHTOOL_ID_ON:  		cr = inb(EWRK3_CR); -		outb(cr ^ CR_LED, EWRK3_CR); +		outb(cr | CR_LED, EWRK3_CR); +		break; -		/* Wait a little while */ -		spin_unlock_irqrestore(&lp->hw_lock, flags); -		msleep(250); -		spin_lock_irqsave(&lp->hw_lock, flags); +	case ETHTOOL_ID_OFF: +		cr = inb(EWRK3_CR); +		outb(cr & ~CR_LED, EWRK3_CR); +		break; -		/* Exit if we got a signal */ -		if (signal_pending(current)) -			break; +	case ETHTOOL_ID_INACTIVE: +		lp->led_mask = CR_LED; +		cr = inb(EWRK3_CR); +		outb(cr & ~CR_LED, EWRK3_CR);  	} +	spin_unlock_irq(&lp->hw_lock); -	lp->led_mask = CR_LED; -	cr = inb(EWRK3_CR); -	outb(cr & ~CR_LED, EWRK3_CR); -	spin_unlock_irqrestore(&lp->hw_lock, flags); -	return signal_pending(current) ? -ERESTARTSYS : 0; +	return 0;  }  static const struct ethtool_ops ethtool_ops_203 = {  	.get_drvinfo = ewrk3_get_drvinfo,  	.get_settings = ewrk3_get_settings,  	.set_settings = ewrk3_set_settings, -	.phys_id = ewrk3_phys_id, +	.set_phys_id = ewrk3_set_phys_id,  };  static const struct ethtool_ops ethtool_ops = { @@ -1660,7 +1652,7 @@ static const struct ethtool_ops ethtool_ops = {  	.get_settings = ewrk3_get_settings,  	.set_settings = ewrk3_set_settings,  	.get_link = ewrk3_get_link, -	.phys_id = ewrk3_phys_id, +	.set_phys_id = ewrk3_set_phys_id,  };  /*  |