diff options
Diffstat (limited to 'drivers/net/e1000/e1000_ethtool.c')
-rw-r--r-- | drivers/net/e1000/e1000_ethtool.c | 62 |
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 */ | 1758 | static 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 | |||
1762 | static 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; | |
1775 | static 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, |