aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/e1000e/ethtool.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/e1000e/ethtool.c')
-rw-r--r--drivers/net/e1000e/ethtool.c71
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 */ 1854static 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
1860void 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
1871static 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
1879static 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,