aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/e1000/e1000_ethtool.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/e1000/e1000_ethtool.c')
-rw-r--r--drivers/net/e1000/e1000_ethtool.c62
1 files changed, 23 insertions, 39 deletions
diff --git a/drivers/net/e1000/e1000_ethtool.c b/drivers/net/e1000/e1000_ethtool.c
index f4d0922ec65b..ec0fa426cce2 100644
--- a/drivers/net/e1000/e1000_ethtool.c
+++ b/drivers/net/e1000/e1000_ethtool.c
@@ -158,9 +158,9 @@ static int e1000_get_settings(struct net_device *netdev,
158 158
159 e1000_get_speed_and_duplex(hw, &adapter->link_speed, 159 e1000_get_speed_and_duplex(hw, &adapter->link_speed,
160 &adapter->link_duplex); 160 &adapter->link_duplex);
161 ecmd->speed = adapter->link_speed; 161 ethtool_cmd_speed_set(ecmd, adapter->link_speed);
162 162
163 /* unfortunatly FULL_DUPLEX != DUPLEX_FULL 163 /* unfortunately FULL_DUPLEX != DUPLEX_FULL
164 * and HALF_DUPLEX != DUPLEX_HALF */ 164 * and HALF_DUPLEX != DUPLEX_HALF */
165 165
166 if (adapter->link_duplex == FULL_DUPLEX) 166 if (adapter->link_duplex == FULL_DUPLEX)
@@ -168,7 +168,7 @@ static int e1000_get_settings(struct net_device *netdev,
168 else 168 else
169 ecmd->duplex = DUPLEX_HALF; 169 ecmd->duplex = DUPLEX_HALF;
170 } else { 170 } else {
171 ecmd->speed = -1; 171 ethtool_cmd_speed_set(ecmd, -1);
172 ecmd->duplex = -1; 172 ecmd->duplex = -1;
173 } 173 }
174 174
@@ -197,11 +197,13 @@ static int e1000_set_settings(struct net_device *netdev,
197 ADVERTISED_TP | 197 ADVERTISED_TP |
198 ADVERTISED_Autoneg; 198 ADVERTISED_Autoneg;
199 ecmd->advertising = hw->autoneg_advertised; 199 ecmd->advertising = hw->autoneg_advertised;
200 } else 200 } else {
201 if (e1000_set_spd_dplx(adapter, ecmd->speed + ecmd->duplex)) { 201 u32 speed = ethtool_cmd_speed(ecmd);
202 if (e1000_set_spd_dplx(adapter, speed, ecmd->duplex)) {
202 clear_bit(__E1000_RESETTING, &adapter->flags); 203 clear_bit(__E1000_RESETTING, &adapter->flags);
203 return -EINVAL; 204 return -EINVAL;
204 } 205 }
206 }
205 207
206 /* reset the link */ 208 /* reset the link */
207 209
@@ -1753,46 +1755,28 @@ static int e1000_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
1753 return 0; 1755 return 0;
1754} 1756}
1755 1757
1756/* toggle LED 4 times per second = 2 "blinks" per second */ 1758static int e1000_set_phys_id(struct net_device *netdev,
1757#define E1000_ID_INTERVAL (HZ/4) 1759 enum ethtool_phys_id_state state)
1758
1759/* bit defines for adapter->led_status */
1760#define E1000_LED_ON 0
1761
1762static void e1000_led_blink_callback(unsigned long data)
1763{ 1760{
1764 struct e1000_adapter *adapter = (struct e1000_adapter *) data; 1761 struct e1000_adapter *adapter = netdev_priv(netdev);
1765 struct e1000_hw *hw = &adapter->hw; 1762 struct e1000_hw *hw = &adapter->hw;
1766 1763
1767 if (test_and_change_bit(E1000_LED_ON, &adapter->led_status)) 1764 switch (state) {
1768 e1000_led_off(hw); 1765 case ETHTOOL_ID_ACTIVE:
1769 else 1766 e1000_setup_led(hw);
1770 e1000_led_on(hw); 1767 return 2;
1771 1768
1772 mod_timer(&adapter->blink_timer, jiffies + E1000_ID_INTERVAL); 1769 case ETHTOOL_ID_ON:
1773} 1770 e1000_led_on(hw);
1774 1771 break;
1775static int e1000_phys_id(struct net_device *netdev, u32 data)
1776{
1777 struct e1000_adapter *adapter = netdev_priv(netdev);
1778 struct e1000_hw *hw = &adapter->hw;
1779 1772
1780 if (!data) 1773 case ETHTOOL_ID_OFF:
1781 data = INT_MAX; 1774 e1000_led_off(hw);
1775 break;
1782 1776
1783 if (!adapter->blink_timer.function) { 1777 case ETHTOOL_ID_INACTIVE:
1784 init_timer(&adapter->blink_timer); 1778 e1000_cleanup_led(hw);
1785 adapter->blink_timer.function = e1000_led_blink_callback;
1786 adapter->blink_timer.data = (unsigned long)adapter;
1787 } 1779 }
1788 e1000_setup_led(hw);
1789 mod_timer(&adapter->blink_timer, jiffies);
1790 msleep_interruptible(data * 1000);
1791 del_timer_sync(&adapter->blink_timer);
1792
1793 e1000_led_off(hw);
1794 clear_bit(E1000_LED_ON, &adapter->led_status);
1795 e1000_cleanup_led(hw);
1796 1780
1797 return 0; 1781 return 0;
1798} 1782}
@@ -1929,7 +1913,7 @@ static const struct ethtool_ops e1000_ethtool_ops = {
1929 .set_tso = e1000_set_tso, 1913 .set_tso = e1000_set_tso,
1930 .self_test = e1000_diag_test, 1914 .self_test = e1000_diag_test,
1931 .get_strings = e1000_get_strings, 1915 .get_strings = e1000_get_strings,
1932 .phys_id = e1000_phys_id, 1916 .set_phys_id = e1000_set_phys_id,
1933 .get_ethtool_stats = e1000_get_ethtool_stats, 1917 .get_ethtool_stats = e1000_get_ethtool_stats,
1934 .get_sset_count = e1000_get_sset_count, 1918 .get_sset_count = e1000_get_sset_count,
1935 .get_coalesce = e1000_get_coalesce, 1919 .get_coalesce = e1000_get_coalesce,