Keep orginal locking and error handling. Signed-off-by: Stephen Hemminger --- a/drivers/net/ewrk3.c 2011-04-04 13:41:41.717791151 -0700 +++ b/drivers/net/ewrk3.c 2011-04-04 13:46:55.425138028 -0700 @@ -1604,55 +1604,51 @@ static u32 ewrk3_get_link(struct net_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; - } + switch (state) { + case ETHTOOL_ID_ACTIVE: + /* Bail if a PHYS_ID is already in progress */ + if (lp->led_mask == 0) { + spin_unlock_irqrestore(&lp->hw_lock, flags); + return -EBUSY; + } - /* Prevent ISR from twiddling the LED */ - lp->led_mask = 0; + /* Prevent ISR from twiddling the LED */ + lp->led_mask = 0; + spin_unlock_irqrestore(&lp->hw_lock, flags); + return -EINVAL; - while (count--) { + case ETHTOOL_ID_ON: + case ETHTOOL_ID_OFF: /* Toggle the LED */ cr = inb(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); - - /* 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); } - - 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 +1656,7 @@ static const struct ethtool_ops ethtool_ .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, }; /* -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html