mirror of
https://github.com/torvalds/linux.git
synced 2024-11-15 00:21:59 +00:00
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);
|
||||
}
|
||||
|
||||
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_irq(&lp->hw_lock);
|
||||
|
||||
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 */
|
||||
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 */
|
||||
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,
|
||||
};
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user