diff options
author | Bruce Allan <bruce.w.allan@intel.com> | 2008-08-26 21:37:06 -0400 |
---|---|---|
committer | Jeff Garzik <jgarzik@redhat.com> | 2008-09-03 10:08:13 -0400 |
commit | 4662e82b2cb41c60826e50474dd86dd5c6372b0c (patch) | |
tree | 75a99d62d28ad8ff5d9557f4665bae177218bb2a /drivers/net/e1000e/ethtool.c | |
parent | f4187b56e1f8a05dd110875d5094b21b51ebd79b (diff) |
e1000e: add support for new 82574L part
This new part has the same feature set as previous parts with the addition
of MSI-X support.
Signed-off-by: Bruce Allan <bruce.w.allan@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
Diffstat (limited to 'drivers/net/e1000e/ethtool.c')
-rw-r--r-- | drivers/net/e1000e/ethtool.c | 38 |
1 files changed, 29 insertions, 9 deletions
diff --git a/drivers/net/e1000e/ethtool.c b/drivers/net/e1000e/ethtool.c index a89498dcb636..52b762eb1745 100644 --- a/drivers/net/e1000e/ethtool.c +++ b/drivers/net/e1000e/ethtool.c | |||
@@ -568,6 +568,7 @@ static int e1000_set_eeprom(struct net_device *netdev, | |||
568 | * and flush shadow RAM for 82573 controllers | 568 | * and flush shadow RAM for 82573 controllers |
569 | */ | 569 | */ |
570 | if ((ret_val == 0) && ((first_word <= NVM_CHECKSUM_REG) || | 570 | if ((ret_val == 0) && ((first_word <= NVM_CHECKSUM_REG) || |
571 | (hw->mac.type == e1000_82574) || | ||
571 | (hw->mac.type == e1000_82573))) | 572 | (hw->mac.type == e1000_82573))) |
572 | e1000e_update_nvm_checksum(hw); | 573 | e1000e_update_nvm_checksum(hw); |
573 | 574 | ||
@@ -779,6 +780,7 @@ static int e1000_reg_test(struct e1000_adapter *adapter, u64 *data) | |||
779 | toggle = 0x7FFFF3FF; | 780 | toggle = 0x7FFFF3FF; |
780 | break; | 781 | break; |
781 | case e1000_82573: | 782 | case e1000_82573: |
783 | case e1000_82574: | ||
782 | case e1000_ich8lan: | 784 | case e1000_ich8lan: |
783 | case e1000_ich9lan: | 785 | case e1000_ich9lan: |
784 | case e1000_ich10lan: | 786 | case e1000_ich10lan: |
@@ -887,10 +889,18 @@ static int e1000_intr_test(struct e1000_adapter *adapter, u64 *data) | |||
887 | u32 shared_int = 1; | 889 | u32 shared_int = 1; |
888 | u32 irq = adapter->pdev->irq; | 890 | u32 irq = adapter->pdev->irq; |
889 | int i; | 891 | int i; |
892 | int ret_val = 0; | ||
893 | int int_mode = E1000E_INT_MODE_LEGACY; | ||
890 | 894 | ||
891 | *data = 0; | 895 | *data = 0; |
892 | 896 | ||
893 | /* NOTE: we don't test MSI interrupts here, yet */ | 897 | /* NOTE: we don't test MSI/MSI-X interrupts here, yet */ |
898 | if (adapter->int_mode == E1000E_INT_MODE_MSIX) { | ||
899 | int_mode = adapter->int_mode; | ||
900 | e1000e_reset_interrupt_capability(adapter); | ||
901 | adapter->int_mode = E1000E_INT_MODE_LEGACY; | ||
902 | e1000e_set_interrupt_capability(adapter); | ||
903 | } | ||
894 | /* Hook up test interrupt handler just for this test */ | 904 | /* Hook up test interrupt handler just for this test */ |
895 | if (!request_irq(irq, &e1000_test_intr, IRQF_PROBE_SHARED, netdev->name, | 905 | if (!request_irq(irq, &e1000_test_intr, IRQF_PROBE_SHARED, netdev->name, |
896 | netdev)) { | 906 | netdev)) { |
@@ -898,7 +908,8 @@ static int e1000_intr_test(struct e1000_adapter *adapter, u64 *data) | |||
898 | } else if (request_irq(irq, &e1000_test_intr, IRQF_SHARED, | 908 | } else if (request_irq(irq, &e1000_test_intr, IRQF_SHARED, |
899 | netdev->name, netdev)) { | 909 | netdev->name, netdev)) { |
900 | *data = 1; | 910 | *data = 1; |
901 | return -1; | 911 | ret_val = -1; |
912 | goto out; | ||
902 | } | 913 | } |
903 | e_info("testing %s interrupt\n", (shared_int ? "shared" : "unshared")); | 914 | e_info("testing %s interrupt\n", (shared_int ? "shared" : "unshared")); |
904 | 915 | ||
@@ -988,7 +999,14 @@ static int e1000_intr_test(struct e1000_adapter *adapter, u64 *data) | |||
988 | /* Unhook test interrupt handler */ | 999 | /* Unhook test interrupt handler */ |
989 | free_irq(irq, netdev); | 1000 | free_irq(irq, netdev); |
990 | 1001 | ||
991 | return *data; | 1002 | out: |
1003 | if (int_mode == E1000E_INT_MODE_MSIX) { | ||
1004 | e1000e_reset_interrupt_capability(adapter); | ||
1005 | adapter->int_mode = int_mode; | ||
1006 | e1000e_set_interrupt_capability(adapter); | ||
1007 | } | ||
1008 | |||
1009 | return ret_val; | ||
992 | } | 1010 | } |
993 | 1011 | ||
994 | static void e1000_free_desc_rings(struct e1000_adapter *adapter) | 1012 | static void e1000_free_desc_rings(struct e1000_adapter *adapter) |
@@ -1769,11 +1787,13 @@ static void e1000_led_blink_callback(unsigned long data) | |||
1769 | static int e1000_phys_id(struct net_device *netdev, u32 data) | 1787 | static int e1000_phys_id(struct net_device *netdev, u32 data) |
1770 | { | 1788 | { |
1771 | struct e1000_adapter *adapter = netdev_priv(netdev); | 1789 | struct e1000_adapter *adapter = netdev_priv(netdev); |
1790 | struct e1000_hw *hw = &adapter->hw; | ||
1772 | 1791 | ||
1773 | if (!data) | 1792 | if (!data) |
1774 | data = INT_MAX; | 1793 | data = INT_MAX; |
1775 | 1794 | ||
1776 | if (adapter->hw.phy.type == e1000_phy_ife) { | 1795 | if ((hw->phy.type == e1000_phy_ife) || |
1796 | (hw->mac.type == e1000_82574)) { | ||
1777 | if (!adapter->blink_timer.function) { | 1797 | if (!adapter->blink_timer.function) { |
1778 | init_timer(&adapter->blink_timer); | 1798 | init_timer(&adapter->blink_timer); |
1779 | adapter->blink_timer.function = | 1799 | adapter->blink_timer.function = |
@@ -1783,16 +1803,16 @@ static int e1000_phys_id(struct net_device *netdev, u32 data) | |||
1783 | mod_timer(&adapter->blink_timer, jiffies); | 1803 | mod_timer(&adapter->blink_timer, jiffies); |
1784 | msleep_interruptible(data * 1000); | 1804 | msleep_interruptible(data * 1000); |
1785 | del_timer_sync(&adapter->blink_timer); | 1805 | del_timer_sync(&adapter->blink_timer); |
1786 | e1e_wphy(&adapter->hw, | 1806 | if (hw->phy.type == e1000_phy_ife) |
1787 | IFE_PHY_SPECIAL_CONTROL_LED, 0); | 1807 | e1e_wphy(hw, IFE_PHY_SPECIAL_CONTROL_LED, 0); |
1788 | } else { | 1808 | } else { |
1789 | e1000e_blink_led(&adapter->hw); | 1809 | e1000e_blink_led(hw); |
1790 | msleep_interruptible(data * 1000); | 1810 | msleep_interruptible(data * 1000); |
1791 | } | 1811 | } |
1792 | 1812 | ||
1793 | adapter->hw.mac.ops.led_off(&adapter->hw); | 1813 | hw->mac.ops.led_off(hw); |
1794 | clear_bit(E1000_LED_ON, &adapter->led_status); | 1814 | clear_bit(E1000_LED_ON, &adapter->led_status); |
1795 | adapter->hw.mac.ops.cleanup_led(&adapter->hw); | 1815 | hw->mac.ops.cleanup_led(hw); |
1796 | 1816 | ||
1797 | return 0; | 1817 | return 0; |
1798 | } | 1818 | } |