ewrk3: convert to set_phys_id
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>
This commit is contained in:
parent
94469f7532
commit
7b1b3afadf
|
@ -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 */
|
spin_lock_irq(&lp->hw_lock);
|
||||||
count = data << 2;
|
|
||||||
|
|
||||||
spin_lock_irqsave(&lp->hw_lock, flags);
|
switch (state) {
|
||||||
|
case ETHTOOL_ID_ACTIVE:
|
||||||
|
/* Prevent ISR from twiddling the LED */
|
||||||
|
lp->led_mask = 0;
|
||||||
|
spin_unlock_irq(&lp->hw_lock);
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
/* Bail if a PHYS_ID is already in progress */
|
case ETHTOOL_ID_ON:
|
||||||
if (lp->led_mask == 0) {
|
|
||||||
spin_unlock_irqrestore(&lp->hw_lock, flags);
|
|
||||||
return -EBUSY;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Prevent ISR from twiddling the LED */
|
|
||||||
lp->led_mask = 0;
|
|
||||||
|
|
||||||
while (count--) {
|
|
||||||
/* 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 */
|
case ETHTOOL_ID_OFF:
|
||||||
spin_unlock_irqrestore(&lp->hw_lock, flags);
|
cr = inb(EWRK3_CR);
|
||||||
msleep(250);
|
outb(cr & ~CR_LED, EWRK3_CR);
|
||||||
spin_lock_irqsave(&lp->hw_lock, flags);
|
break;
|
||||||
|
|
||||||
/* Exit if we got a signal */
|
case ETHTOOL_ID_INACTIVE:
|
||||||
if (signal_pending(current))
|
lp->led_mask = CR_LED;
|
||||||
break;
|
cr = inb(EWRK3_CR);
|
||||||
|
outb(cr & ~CR_LED, EWRK3_CR);
|
||||||
}
|
}
|
||||||
|
spin_unlock_irq(&lp->hw_lock);
|
||||||
|
|
||||||
lp->led_mask = CR_LED;
|
return 0;
|
||||||
cr = inb(EWRK3_CR);
|
|
||||||
outb(cr & ~CR_LED, EWRK3_CR);
|
|
||||||
spin_unlock_irqrestore(&lp->hw_lock, flags);
|
|
||||||
return signal_pending(current) ? -ERESTARTSYS : 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 = {
|
||||||
.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,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue