ewrk3: convert to set_phys_id
authorstephen hemminger <shemminger@vyatta.com>
Wed, 6 Apr 2011 11:58:36 +0000 (11:58 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 6 Apr 2011 22:05:46 +0000 (15:05 -0700)
Use ethtool infrastructure for blinking, which is now does
locking at higher level.

Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ewrk3.c

index 380d061..c7ce443 100644 (file)
@@ -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 -EINVAL;
 
-       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,
 };
 
 /*