|
@@ -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,
|
|
|
};
|
|
|
|
|
|
/*
|