Loading drivers/net/ewrk3.c +24 −32 Original line number Diff line number Diff line Loading @@ -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); 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); /* Wait a little while */ spin_unlock_irqrestore(&lp->hw_lock, flags); msleep(250); spin_lock_irqsave(&lp->hw_lock, flags); outb(cr | CR_LED, EWRK3_CR); break; /* Exit if we got a signal */ if (signal_pending(current)) case ETHTOOL_ID_OFF: cr = inb(EWRK3_CR); outb(cr & ~CR_LED, EWRK3_CR); break; } case ETHTOOL_ID_INACTIVE: 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; } spin_unlock_irq(&lp->hw_lock); 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 = { Loading @@ -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 Loading
drivers/net/ewrk3.c +24 −32 Original line number Diff line number Diff line Loading @@ -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); 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); /* Wait a little while */ spin_unlock_irqrestore(&lp->hw_lock, flags); msleep(250); spin_lock_irqsave(&lp->hw_lock, flags); outb(cr | CR_LED, EWRK3_CR); break; /* Exit if we got a signal */ if (signal_pending(current)) case ETHTOOL_ID_OFF: cr = inb(EWRK3_CR); outb(cr & ~CR_LED, EWRK3_CR); break; } case ETHTOOL_ID_INACTIVE: 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; } spin_unlock_irq(&lp->hw_lock); 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 = { Loading @@ -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