Commit 7b1b3afa authored by stephen hemminger's avatar stephen hemminger Committed by David S. Miller

ewrk3: convert to set_phys_id

Use ethtool infrastructure for blinking, which is now does
locking at higher level.
Signed-off-by: default avatarStephen Hemminger <shemminger@vyatta.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 94469f75
...@@ -1604,55 +1604,47 @@ static u32 ewrk3_get_link(struct net_device *dev) ...@@ -1604,55 +1604,47 @@ static u32 ewrk3_get_link(struct net_device *dev)
return !(cmr & CMR_LINK); 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); struct ewrk3_private *lp = netdev_priv(dev);
unsigned long iobase = dev->base_addr; unsigned long iobase = dev->base_addr;
unsigned long flags;
u8 cr; 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 */ spin_lock_irq(&lp->hw_lock);
if (lp->led_mask == 0) {
spin_unlock_irqrestore(&lp->hw_lock, flags);
return -EBUSY;
}
switch (state) {
case ETHTOOL_ID_ACTIVE:
/* Prevent ISR from twiddling the LED */ /* Prevent ISR from twiddling the LED */
lp->led_mask = 0; lp->led_mask = 0;
spin_unlock_irq(&lp->hw_lock);
return -EINVAL;
while (count--) { case ETHTOOL_ID_ON:
/* Toggle the LED */
cr = inb(EWRK3_CR); 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);
/* Exit if we got a signal */ case ETHTOOL_ID_OFF:
if (signal_pending(current)) cr = inb(EWRK3_CR);
outb(cr & ~CR_LED, EWRK3_CR);
break; break;
}
case ETHTOOL_ID_INACTIVE:
lp->led_mask = CR_LED; lp->led_mask = CR_LED;
cr = inb(EWRK3_CR); cr = inb(EWRK3_CR);
outb(cr & ~CR_LED, EWRK3_CR); outb(cr & ~CR_LED, EWRK3_CR);
spin_unlock_irqrestore(&lp->hw_lock, flags); }
return signal_pending(current) ? -ERESTARTSYS : 0; spin_unlock_irq(&lp->hw_lock);
return 0;
} }
static const struct ethtool_ops ethtool_ops_203 = { static const struct ethtool_ops ethtool_ops_203 = {
.get_drvinfo = ewrk3_get_drvinfo, .get_drvinfo = ewrk3_get_drvinfo,
.get_settings = ewrk3_get_settings, .get_settings = ewrk3_get_settings,
.set_settings = ewrk3_set_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 = { static const struct ethtool_ops ethtool_ops = {
...@@ -1660,7 +1652,7 @@ static const struct ethtool_ops ethtool_ops = { ...@@ -1660,7 +1652,7 @@ static const struct ethtool_ops ethtool_ops = {
.get_settings = ewrk3_get_settings, .get_settings = ewrk3_get_settings,
.set_settings = ewrk3_set_settings, .set_settings = ewrk3_set_settings,
.get_link = ewrk3_get_link, .get_link = ewrk3_get_link,
.phys_id = ewrk3_phys_id, .set_phys_id = ewrk3_set_phys_id,
}; };
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment