diff options
| -rw-r--r-- | drivers/net/e1000/e1000_ethtool.c | 15 | ||||
| -rw-r--r-- | drivers/net/e1000/e1000_hw.c | 38 | ||||
| -rw-r--r-- | drivers/net/e1000/e1000_hw.h | 1 |
3 files changed, 40 insertions, 14 deletions
diff --git a/drivers/net/e1000/e1000_ethtool.c b/drivers/net/e1000/e1000_ethtool.c index cf5c5f46341f..060915532923 100644 --- a/drivers/net/e1000/e1000_ethtool.c +++ b/drivers/net/e1000/e1000_ethtool.c | |||
| @@ -1786,21 +1786,8 @@ e1000_phys_id(struct net_device *netdev, uint32_t data) | |||
| 1786 | mod_timer(&adapter->blink_timer, jiffies); | 1786 | mod_timer(&adapter->blink_timer, jiffies); |
| 1787 | msleep_interruptible(data * 1000); | 1787 | msleep_interruptible(data * 1000); |
| 1788 | del_timer_sync(&adapter->blink_timer); | 1788 | del_timer_sync(&adapter->blink_timer); |
| 1789 | } else if (adapter->hw.mac_type < e1000_82573) { | ||
| 1790 | E1000_WRITE_REG(&adapter->hw, LEDCTL, | ||
| 1791 | (E1000_LEDCTL_LED2_BLINK_RATE | | ||
| 1792 | E1000_LEDCTL_LED0_BLINK | E1000_LEDCTL_LED2_BLINK | | ||
| 1793 | (E1000_LEDCTL_MODE_LED_ON << E1000_LEDCTL_LED2_MODE_SHIFT) | | ||
| 1794 | (E1000_LEDCTL_MODE_LINK_ACTIVITY << E1000_LEDCTL_LED0_MODE_SHIFT) | | ||
| 1795 | (E1000_LEDCTL_MODE_LED_OFF << E1000_LEDCTL_LED1_MODE_SHIFT))); | ||
| 1796 | msleep_interruptible(data * 1000); | ||
| 1797 | } else { | 1789 | } else { |
| 1798 | E1000_WRITE_REG(&adapter->hw, LEDCTL, | 1790 | e1000_blink_led_start(&adapter->hw); |
| 1799 | (E1000_LEDCTL_LED2_BLINK_RATE | | ||
| 1800 | E1000_LEDCTL_LED1_BLINK | E1000_LEDCTL_LED2_BLINK | | ||
| 1801 | (E1000_LEDCTL_MODE_LED_ON << E1000_LEDCTL_LED2_MODE_SHIFT) | | ||
| 1802 | (E1000_LEDCTL_MODE_LINK_ACTIVITY << E1000_LEDCTL_LED1_MODE_SHIFT) | | ||
| 1803 | (E1000_LEDCTL_MODE_LED_OFF << E1000_LEDCTL_LED0_MODE_SHIFT))); | ||
| 1804 | msleep_interruptible(data * 1000); | 1791 | msleep_interruptible(data * 1000); |
| 1805 | } | 1792 | } |
| 1806 | 1793 | ||
diff --git a/drivers/net/e1000/e1000_hw.c b/drivers/net/e1000/e1000_hw.c index 749d621a07da..1c5b18478fb2 100644 --- a/drivers/net/e1000/e1000_hw.c +++ b/drivers/net/e1000/e1000_hw.c | |||
| @@ -5537,6 +5537,44 @@ e1000_setup_led(struct e1000_hw *hw) | |||
| 5537 | } | 5537 | } |
| 5538 | 5538 | ||
| 5539 | /****************************************************************************** | 5539 | /****************************************************************************** |
| 5540 | * Used on 82571 and later Si that has LED blink bits. | ||
| 5541 | * Callers must use their own timer and should have already called | ||
| 5542 | * e1000_id_led_init() | ||
| 5543 | * Call e1000_cleanup led() to stop blinking | ||
| 5544 | * | ||
| 5545 | * hw - Struct containing variables accessed by shared code | ||
| 5546 | *****************************************************************************/ | ||
| 5547 | int32_t | ||
| 5548 | e1000_blink_led_start(struct e1000_hw *hw) | ||
| 5549 | { | ||
| 5550 | int16_t i; | ||
| 5551 | uint32_t ledctl_blink = 0; | ||
| 5552 | |||
| 5553 | DEBUGFUNC("e1000_id_led_blink_on"); | ||
| 5554 | |||
| 5555 | if (hw->mac_type < e1000_82571) { | ||
| 5556 | /* Nothing to do */ | ||
| 5557 | return E1000_SUCCESS; | ||
| 5558 | } | ||
| 5559 | if (hw->media_type == e1000_media_type_fiber) { | ||
| 5560 | /* always blink LED0 for PCI-E fiber */ | ||
| 5561 | ledctl_blink = E1000_LEDCTL_LED0_BLINK | | ||
| 5562 | (E1000_LEDCTL_MODE_LED_ON << E1000_LEDCTL_LED0_MODE_SHIFT); | ||
| 5563 | } else { | ||
| 5564 | /* set the blink bit for each LED that's "on" (0x0E) in ledctl_mode2 */ | ||
| 5565 | ledctl_blink = hw->ledctl_mode2; | ||
| 5566 | for (i=0; i < 4; i++) | ||
| 5567 | if (((hw->ledctl_mode2 >> (i * 8)) & 0xFF) == | ||
| 5568 | E1000_LEDCTL_MODE_LED_ON) | ||
| 5569 | ledctl_blink |= (E1000_LEDCTL_LED0_BLINK << (i * 8)); | ||
| 5570 | } | ||
| 5571 | |||
| 5572 | E1000_WRITE_REG(hw, LEDCTL, ledctl_blink); | ||
| 5573 | |||
| 5574 | return E1000_SUCCESS; | ||
| 5575 | } | ||
| 5576 | |||
| 5577 | /****************************************************************************** | ||
| 5540 | * Restores the saved state of the SW controlable LED. | 5578 | * Restores the saved state of the SW controlable LED. |
| 5541 | * | 5579 | * |
| 5542 | * hw - Struct containing variables accessed by shared code | 5580 | * hw - Struct containing variables accessed by shared code |
diff --git a/drivers/net/e1000/e1000_hw.h b/drivers/net/e1000/e1000_hw.h index 467c9ed944f8..941b47d61674 100644 --- a/drivers/net/e1000/e1000_hw.h +++ b/drivers/net/e1000/e1000_hw.h | |||
| @@ -401,6 +401,7 @@ int32_t e1000_setup_led(struct e1000_hw *hw); | |||
| 401 | int32_t e1000_cleanup_led(struct e1000_hw *hw); | 401 | int32_t e1000_cleanup_led(struct e1000_hw *hw); |
| 402 | int32_t e1000_led_on(struct e1000_hw *hw); | 402 | int32_t e1000_led_on(struct e1000_hw *hw); |
| 403 | int32_t e1000_led_off(struct e1000_hw *hw); | 403 | int32_t e1000_led_off(struct e1000_hw *hw); |
| 404 | int32_t e1000_blink_led_start(struct e1000_hw *hw); | ||
| 404 | 405 | ||
| 405 | /* Adaptive IFS Functions */ | 406 | /* Adaptive IFS Functions */ |
| 406 | 407 | ||
