diff options
Diffstat (limited to 'drivers/net/e1000e/ethtool.c')
-rw-r--r-- | drivers/net/e1000e/ethtool.c | 71 |
1 files changed, 21 insertions, 50 deletions
diff --git a/drivers/net/e1000e/ethtool.c b/drivers/net/e1000e/ethtool.c index a31d280ffb6d..1d7bf4049c02 100644 --- a/drivers/net/e1000e/ethtool.c +++ b/drivers/net/e1000e/ethtool.c | |||
@@ -1851,64 +1851,35 @@ static int e1000_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol) | |||
1851 | return 0; | 1851 | return 0; |
1852 | } | 1852 | } |
1853 | 1853 | ||
1854 | /* toggle LED 4 times per second = 2 "blinks" per second */ | 1854 | static int e1000_set_phys_id(struct net_device *netdev, |
1855 | #define E1000_ID_INTERVAL (HZ/4) | 1855 | enum ethtool_phys_id_state state) |
1856 | |||
1857 | /* bit defines for adapter->led_status */ | ||
1858 | #define E1000_LED_ON 0 | ||
1859 | |||
1860 | void e1000e_led_blink_task(struct work_struct *work) | ||
1861 | { | ||
1862 | struct e1000_adapter *adapter = container_of(work, | ||
1863 | struct e1000_adapter, led_blink_task); | ||
1864 | |||
1865 | if (test_and_change_bit(E1000_LED_ON, &adapter->led_status)) | ||
1866 | adapter->hw.mac.ops.led_off(&adapter->hw); | ||
1867 | else | ||
1868 | adapter->hw.mac.ops.led_on(&adapter->hw); | ||
1869 | } | ||
1870 | |||
1871 | static void e1000_led_blink_callback(unsigned long data) | ||
1872 | { | ||
1873 | struct e1000_adapter *adapter = (struct e1000_adapter *) data; | ||
1874 | |||
1875 | schedule_work(&adapter->led_blink_task); | ||
1876 | mod_timer(&adapter->blink_timer, jiffies + E1000_ID_INTERVAL); | ||
1877 | } | ||
1878 | |||
1879 | static int e1000_phys_id(struct net_device *netdev, u32 data) | ||
1880 | { | 1856 | { |
1881 | struct e1000_adapter *adapter = netdev_priv(netdev); | 1857 | struct e1000_adapter *adapter = netdev_priv(netdev); |
1882 | struct e1000_hw *hw = &adapter->hw; | 1858 | struct e1000_hw *hw = &adapter->hw; |
1883 | 1859 | ||
1884 | if (!data) | 1860 | switch (state) { |
1885 | data = INT_MAX; | 1861 | case ETHTOOL_ID_ACTIVE: |
1862 | if (!hw->mac.ops.blink_led) | ||
1863 | return 2; /* cycle on/off twice per second */ | ||
1886 | 1864 | ||
1887 | if ((hw->phy.type == e1000_phy_ife) || | 1865 | hw->mac.ops.blink_led(hw); |
1888 | (hw->mac.type == e1000_pchlan) || | 1866 | break; |
1889 | (hw->mac.type == e1000_pch2lan) || | 1867 | |
1890 | (hw->mac.type == e1000_82583) || | 1868 | case ETHTOOL_ID_INACTIVE: |
1891 | (hw->mac.type == e1000_82574)) { | ||
1892 | if (!adapter->blink_timer.function) { | ||
1893 | init_timer(&adapter->blink_timer); | ||
1894 | adapter->blink_timer.function = | ||
1895 | e1000_led_blink_callback; | ||
1896 | adapter->blink_timer.data = (unsigned long) adapter; | ||
1897 | } | ||
1898 | mod_timer(&adapter->blink_timer, jiffies); | ||
1899 | msleep_interruptible(data * 1000); | ||
1900 | del_timer_sync(&adapter->blink_timer); | ||
1901 | if (hw->phy.type == e1000_phy_ife) | 1869 | if (hw->phy.type == e1000_phy_ife) |
1902 | e1e_wphy(hw, IFE_PHY_SPECIAL_CONTROL_LED, 0); | 1870 | e1e_wphy(hw, IFE_PHY_SPECIAL_CONTROL_LED, 0); |
1903 | } else { | 1871 | hw->mac.ops.led_off(hw); |
1904 | e1000e_blink_led(hw); | 1872 | hw->mac.ops.cleanup_led(hw); |
1905 | msleep_interruptible(data * 1000); | 1873 | break; |
1906 | } | ||
1907 | 1874 | ||
1908 | hw->mac.ops.led_off(hw); | 1875 | case ETHTOOL_ID_ON: |
1909 | clear_bit(E1000_LED_ON, &adapter->led_status); | 1876 | adapter->hw.mac.ops.led_on(&adapter->hw); |
1910 | hw->mac.ops.cleanup_led(hw); | 1877 | break; |
1911 | 1878 | ||
1879 | case ETHTOOL_ID_OFF: | ||
1880 | adapter->hw.mac.ops.led_off(&adapter->hw); | ||
1881 | break; | ||
1882 | } | ||
1912 | return 0; | 1883 | return 0; |
1913 | } | 1884 | } |
1914 | 1885 | ||
@@ -2074,7 +2045,7 @@ static const struct ethtool_ops e1000_ethtool_ops = { | |||
2074 | .set_tso = e1000_set_tso, | 2045 | .set_tso = e1000_set_tso, |
2075 | .self_test = e1000_diag_test, | 2046 | .self_test = e1000_diag_test, |
2076 | .get_strings = e1000_get_strings, | 2047 | .get_strings = e1000_get_strings, |
2077 | .phys_id = e1000_phys_id, | 2048 | .set_phys_id = e1000_set_phys_id, |
2078 | .get_ethtool_stats = e1000_get_ethtool_stats, | 2049 | .get_ethtool_stats = e1000_get_ethtool_stats, |
2079 | .get_sset_count = e1000e_get_sset_count, | 2050 | .get_sset_count = e1000e_get_sset_count, |
2080 | .get_coalesce = e1000_get_coalesce, | 2051 | .get_coalesce = e1000_get_coalesce, |