diff options
author | Bruce Allan <bruce.w.allan@intel.com> | 2013-03-20 03:23:11 -0400 |
---|---|---|
committer | Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 2013-03-28 03:01:52 -0400 |
commit | d495bcb84d2c3abb5ad5e43cfeea0e305ceffb30 (patch) | |
tree | 6edb94fb74a39dee627bbaeb39b3d21df84acc29 | |
parent | ea8179a72844b30d046cdcc932231872f2dbcc90 (diff) |
e1000e: EEE capability advertisement not set/disabled as required
Devices supported by the driver which support EEE (currently 82579, I217
and I218) are advertising EEE capabilities during auto-negotiation even
when EEE has been disabled. In addition to not acting as expected, this
also caused the EEE status reported by 'ethtool --show-eee' to be wrong
when two of these devices are connected back-to-back and EEE is disabled
on one. In addition to fixing this issue, the ability for the user to
specify which speeds (100 or 1000 full-duplex) to advertise EEE support
has been added.
Signed-off-by: Bruce Allan <bruce.w.allan@intel.com>
Tested-by: Jeff Pieper <jeffrey.e.pieper@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
-rw-r--r-- | drivers/net/ethernet/intel/e1000e/e1000.h | 3 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/e1000e/ethtool.c | 63 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/e1000e/ich8lan.c | 55 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/e1000e/ich8lan.h | 3 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/e1000e/netdev.c | 36 |
5 files changed, 88 insertions, 72 deletions
diff --git a/drivers/net/ethernet/intel/e1000e/e1000.h b/drivers/net/ethernet/intel/e1000e/e1000.h index e371f771cf8b..82f1c84282db 100644 --- a/drivers/net/ethernet/intel/e1000e/e1000.h +++ b/drivers/net/ethernet/intel/e1000e/e1000.h | |||
@@ -46,6 +46,7 @@ | |||
46 | #include <linux/ptp_clock_kernel.h> | 46 | #include <linux/ptp_clock_kernel.h> |
47 | #include <linux/ptp_classify.h> | 47 | #include <linux/ptp_classify.h> |
48 | #include <linux/mii.h> | 48 | #include <linux/mii.h> |
49 | #include <linux/mdio.h> | ||
49 | #include "hw.h" | 50 | #include "hw.h" |
50 | 51 | ||
51 | struct e1000_info; | 52 | struct e1000_info; |
@@ -350,6 +351,8 @@ struct e1000_adapter { | |||
350 | struct timecounter tc; | 351 | struct timecounter tc; |
351 | struct ptp_clock *ptp_clock; | 352 | struct ptp_clock *ptp_clock; |
352 | struct ptp_clock_info ptp_clock_info; | 353 | struct ptp_clock_info ptp_clock_info; |
354 | |||
355 | u16 eee_advert; | ||
353 | }; | 356 | }; |
354 | 357 | ||
355 | struct e1000_info { | 358 | struct e1000_info { |
diff --git a/drivers/net/ethernet/intel/e1000e/ethtool.c b/drivers/net/ethernet/intel/e1000e/ethtool.c index e835e7b95f81..7c8ca658d553 100644 --- a/drivers/net/ethernet/intel/e1000e/ethtool.c +++ b/drivers/net/ethernet/intel/e1000e/ethtool.c | |||
@@ -35,7 +35,6 @@ | |||
35 | #include <linux/slab.h> | 35 | #include <linux/slab.h> |
36 | #include <linux/delay.h> | 36 | #include <linux/delay.h> |
37 | #include <linux/vmalloc.h> | 37 | #include <linux/vmalloc.h> |
38 | #include <linux/mdio.h> | ||
39 | #include <linux/pm_runtime.h> | 38 | #include <linux/pm_runtime.h> |
40 | 39 | ||
41 | #include "e1000.h" | 40 | #include "e1000.h" |
@@ -2076,23 +2075,20 @@ static int e1000e_get_eee(struct net_device *netdev, struct ethtool_eee *edata) | |||
2076 | { | 2075 | { |
2077 | struct e1000_adapter *adapter = netdev_priv(netdev); | 2076 | struct e1000_adapter *adapter = netdev_priv(netdev); |
2078 | struct e1000_hw *hw = &adapter->hw; | 2077 | struct e1000_hw *hw = &adapter->hw; |
2079 | u16 cap_addr, adv_addr, lpa_addr, pcs_stat_addr, phy_data, lpi_ctrl; | 2078 | u16 cap_addr, lpa_addr, pcs_stat_addr, phy_data; |
2080 | u32 status, ret_val; | 2079 | u32 ret_val; |
2081 | 2080 | ||
2082 | if (!(adapter->flags & FLAG_IS_ICH) || | 2081 | if (!(adapter->flags2 & FLAG2_HAS_EEE)) |
2083 | !(adapter->flags2 & FLAG2_HAS_EEE)) | ||
2084 | return -EOPNOTSUPP; | 2082 | return -EOPNOTSUPP; |
2085 | 2083 | ||
2086 | switch (hw->phy.type) { | 2084 | switch (hw->phy.type) { |
2087 | case e1000_phy_82579: | 2085 | case e1000_phy_82579: |
2088 | cap_addr = I82579_EEE_CAPABILITY; | 2086 | cap_addr = I82579_EEE_CAPABILITY; |
2089 | adv_addr = I82579_EEE_ADVERTISEMENT; | ||
2090 | lpa_addr = I82579_EEE_LP_ABILITY; | 2087 | lpa_addr = I82579_EEE_LP_ABILITY; |
2091 | pcs_stat_addr = I82579_EEE_PCS_STATUS; | 2088 | pcs_stat_addr = I82579_EEE_PCS_STATUS; |
2092 | break; | 2089 | break; |
2093 | case e1000_phy_i217: | 2090 | case e1000_phy_i217: |
2094 | cap_addr = I217_EEE_CAPABILITY; | 2091 | cap_addr = I217_EEE_CAPABILITY; |
2095 | adv_addr = I217_EEE_ADVERTISEMENT; | ||
2096 | lpa_addr = I217_EEE_LP_ABILITY; | 2092 | lpa_addr = I217_EEE_LP_ABILITY; |
2097 | pcs_stat_addr = I217_EEE_PCS_STATUS; | 2093 | pcs_stat_addr = I217_EEE_PCS_STATUS; |
2098 | break; | 2094 | break; |
@@ -2111,10 +2107,7 @@ static int e1000e_get_eee(struct net_device *netdev, struct ethtool_eee *edata) | |||
2111 | edata->supported = mmd_eee_cap_to_ethtool_sup_t(phy_data); | 2107 | edata->supported = mmd_eee_cap_to_ethtool_sup_t(phy_data); |
2112 | 2108 | ||
2113 | /* EEE Advertised */ | 2109 | /* EEE Advertised */ |
2114 | ret_val = e1000_read_emi_reg_locked(hw, adv_addr, &phy_data); | 2110 | edata->advertised = mmd_eee_adv_to_ethtool_adv_t(adapter->eee_advert); |
2115 | if (ret_val) | ||
2116 | goto release; | ||
2117 | edata->advertised = mmd_eee_adv_to_ethtool_adv_t(phy_data); | ||
2118 | 2111 | ||
2119 | /* EEE Link Partner Advertised */ | 2112 | /* EEE Link Partner Advertised */ |
2120 | ret_val = e1000_read_emi_reg_locked(hw, lpa_addr, &phy_data); | 2113 | ret_val = e1000_read_emi_reg_locked(hw, lpa_addr, &phy_data); |
@@ -2132,25 +2125,11 @@ release: | |||
2132 | if (ret_val) | 2125 | if (ret_val) |
2133 | return -ENODATA; | 2126 | return -ENODATA; |
2134 | 2127 | ||
2135 | e1e_rphy(hw, I82579_LPI_CTRL, &lpi_ctrl); | ||
2136 | status = er32(STATUS); | ||
2137 | |||
2138 | /* Result of the EEE auto negotiation - there is no register that | 2128 | /* Result of the EEE auto negotiation - there is no register that |
2139 | * has the status of the EEE negotiation so do a best-guess based | 2129 | * has the status of the EEE negotiation so do a best-guess based |
2140 | * on whether both Tx and Rx LPI indications have been received or | 2130 | * on whether Tx or Rx LPI indications have been received. |
2141 | * base it on the link speed, the EEE advertised speeds on both ends | ||
2142 | * and the speeds on which EEE is enabled locally. | ||
2143 | */ | 2131 | */ |
2144 | if (((phy_data & E1000_EEE_TX_LPI_RCVD) && | 2132 | if (phy_data & (E1000_EEE_TX_LPI_RCVD | E1000_EEE_RX_LPI_RCVD)) |
2145 | (phy_data & E1000_EEE_RX_LPI_RCVD)) || | ||
2146 | ((status & E1000_STATUS_SPEED_100) && | ||
2147 | (edata->advertised & ADVERTISED_100baseT_Full) && | ||
2148 | (edata->lp_advertised & ADVERTISED_100baseT_Full) && | ||
2149 | (lpi_ctrl & I82579_LPI_CTRL_100_ENABLE)) || | ||
2150 | ((status & E1000_STATUS_SPEED_1000) && | ||
2151 | (edata->advertised & ADVERTISED_1000baseT_Full) && | ||
2152 | (edata->lp_advertised & ADVERTISED_1000baseT_Full) && | ||
2153 | (lpi_ctrl & I82579_LPI_CTRL_1000_ENABLE))) | ||
2154 | edata->eee_active = true; | 2133 | edata->eee_active = true; |
2155 | 2134 | ||
2156 | edata->eee_enabled = !hw->dev_spec.ich8lan.eee_disable; | 2135 | edata->eee_enabled = !hw->dev_spec.ich8lan.eee_disable; |
@@ -2167,19 +2146,10 @@ static int e1000e_set_eee(struct net_device *netdev, struct ethtool_eee *edata) | |||
2167 | struct ethtool_eee eee_curr; | 2146 | struct ethtool_eee eee_curr; |
2168 | s32 ret_val; | 2147 | s32 ret_val; |
2169 | 2148 | ||
2170 | if (!(adapter->flags & FLAG_IS_ICH) || | ||
2171 | !(adapter->flags2 & FLAG2_HAS_EEE)) | ||
2172 | return -EOPNOTSUPP; | ||
2173 | |||
2174 | ret_val = e1000e_get_eee(netdev, &eee_curr); | 2149 | ret_val = e1000e_get_eee(netdev, &eee_curr); |
2175 | if (ret_val) | 2150 | if (ret_val) |
2176 | return ret_val; | 2151 | return ret_val; |
2177 | 2152 | ||
2178 | if (eee_curr.advertised != edata->advertised) { | ||
2179 | e_err("Setting EEE advertisement is not supported\n"); | ||
2180 | return -EINVAL; | ||
2181 | } | ||
2182 | |||
2183 | if (eee_curr.tx_lpi_enabled != edata->tx_lpi_enabled) { | 2153 | if (eee_curr.tx_lpi_enabled != edata->tx_lpi_enabled) { |
2184 | e_err("Setting EEE tx-lpi is not supported\n"); | 2154 | e_err("Setting EEE tx-lpi is not supported\n"); |
2185 | return -EINVAL; | 2155 | return -EINVAL; |
@@ -2190,16 +2160,21 @@ static int e1000e_set_eee(struct net_device *netdev, struct ethtool_eee *edata) | |||
2190 | return -EINVAL; | 2160 | return -EINVAL; |
2191 | } | 2161 | } |
2192 | 2162 | ||
2193 | if (hw->dev_spec.ich8lan.eee_disable != !edata->eee_enabled) { | 2163 | if (edata->advertised & ~(ADVERTISE_100_FULL | ADVERTISE_1000_FULL)) { |
2194 | hw->dev_spec.ich8lan.eee_disable = !edata->eee_enabled; | 2164 | e_err("EEE advertisement supports only 100TX and/or 1000T full-duplex\n"); |
2195 | 2165 | return -EINVAL; | |
2196 | /* reset the link */ | ||
2197 | if (netif_running(netdev)) | ||
2198 | e1000e_reinit_locked(adapter); | ||
2199 | else | ||
2200 | e1000e_reset(adapter); | ||
2201 | } | 2166 | } |
2202 | 2167 | ||
2168 | adapter->eee_advert = ethtool_adv_to_mmd_eee_adv_t(edata->advertised); | ||
2169 | |||
2170 | hw->dev_spec.ich8lan.eee_disable = !edata->eee_enabled; | ||
2171 | |||
2172 | /* reset the link */ | ||
2173 | if (netif_running(netdev)) | ||
2174 | e1000e_reinit_locked(adapter); | ||
2175 | else | ||
2176 | e1000e_reset(adapter); | ||
2177 | |||
2203 | return 0; | 2178 | return 0; |
2204 | } | 2179 | } |
2205 | 2180 | ||
diff --git a/drivers/net/ethernet/intel/e1000e/ich8lan.c b/drivers/net/ethernet/intel/e1000e/ich8lan.c index 3b1c1a7e5dac..174507ccd7d7 100644 --- a/drivers/net/ethernet/intel/e1000e/ich8lan.c +++ b/drivers/net/ethernet/intel/e1000e/ich8lan.c | |||
@@ -695,7 +695,7 @@ s32 e1000_read_emi_reg_locked(struct e1000_hw *hw, u16 addr, u16 *data) | |||
695 | * | 695 | * |
696 | * Assumes the SW/FW/HW Semaphore is already acquired. | 696 | * Assumes the SW/FW/HW Semaphore is already acquired. |
697 | **/ | 697 | **/ |
698 | static s32 e1000_write_emi_reg_locked(struct e1000_hw *hw, u16 addr, u16 data) | 698 | s32 e1000_write_emi_reg_locked(struct e1000_hw *hw, u16 addr, u16 data) |
699 | { | 699 | { |
700 | return __e1000_access_emi_reg_locked(hw, addr, &data, false); | 700 | return __e1000_access_emi_reg_locked(hw, addr, &data, false); |
701 | } | 701 | } |
@@ -712,11 +712,22 @@ static s32 e1000_set_eee_pchlan(struct e1000_hw *hw) | |||
712 | { | 712 | { |
713 | struct e1000_dev_spec_ich8lan *dev_spec = &hw->dev_spec.ich8lan; | 713 | struct e1000_dev_spec_ich8lan *dev_spec = &hw->dev_spec.ich8lan; |
714 | s32 ret_val; | 714 | s32 ret_val; |
715 | u16 lpi_ctrl; | 715 | u16 lpa, pcs_status, adv, adv_addr, lpi_ctrl, data; |
716 | 716 | ||
717 | if ((hw->phy.type != e1000_phy_82579) && | 717 | switch (hw->phy.type) { |
718 | (hw->phy.type != e1000_phy_i217)) | 718 | case e1000_phy_82579: |
719 | lpa = I82579_EEE_LP_ABILITY; | ||
720 | pcs_status = I82579_EEE_PCS_STATUS; | ||
721 | adv_addr = I82579_EEE_ADVERTISEMENT; | ||
722 | break; | ||
723 | case e1000_phy_i217: | ||
724 | lpa = I217_EEE_LP_ABILITY; | ||
725 | pcs_status = I217_EEE_PCS_STATUS; | ||
726 | adv_addr = I217_EEE_ADVERTISEMENT; | ||
727 | break; | ||
728 | default: | ||
719 | return 0; | 729 | return 0; |
730 | } | ||
720 | 731 | ||
721 | ret_val = hw->phy.ops.acquire(hw); | 732 | ret_val = hw->phy.ops.acquire(hw); |
722 | if (ret_val) | 733 | if (ret_val) |
@@ -731,34 +742,24 @@ static s32 e1000_set_eee_pchlan(struct e1000_hw *hw) | |||
731 | 742 | ||
732 | /* Enable EEE if not disabled by user */ | 743 | /* Enable EEE if not disabled by user */ |
733 | if (!dev_spec->eee_disable) { | 744 | if (!dev_spec->eee_disable) { |
734 | u16 lpa, pcs_status, data; | ||
735 | |||
736 | /* Save off link partner's EEE ability */ | 745 | /* Save off link partner's EEE ability */ |
737 | switch (hw->phy.type) { | ||
738 | case e1000_phy_82579: | ||
739 | lpa = I82579_EEE_LP_ABILITY; | ||
740 | pcs_status = I82579_EEE_PCS_STATUS; | ||
741 | break; | ||
742 | case e1000_phy_i217: | ||
743 | lpa = I217_EEE_LP_ABILITY; | ||
744 | pcs_status = I217_EEE_PCS_STATUS; | ||
745 | break; | ||
746 | default: | ||
747 | ret_val = -E1000_ERR_PHY; | ||
748 | goto release; | ||
749 | } | ||
750 | ret_val = e1000_read_emi_reg_locked(hw, lpa, | 746 | ret_val = e1000_read_emi_reg_locked(hw, lpa, |
751 | &dev_spec->eee_lp_ability); | 747 | &dev_spec->eee_lp_ability); |
752 | if (ret_val) | 748 | if (ret_val) |
753 | goto release; | 749 | goto release; |
754 | 750 | ||
751 | /* Read EEE advertisement */ | ||
752 | ret_val = e1000_read_emi_reg_locked(hw, adv_addr, &adv); | ||
753 | if (ret_val) | ||
754 | goto release; | ||
755 | |||
755 | /* Enable EEE only for speeds in which the link partner is | 756 | /* Enable EEE only for speeds in which the link partner is |
756 | * EEE capable. | 757 | * EEE capable and for which we advertise EEE. |
757 | */ | 758 | */ |
758 | if (dev_spec->eee_lp_ability & I82579_EEE_1000_SUPPORTED) | 759 | if (adv & dev_spec->eee_lp_ability & I82579_EEE_1000_SUPPORTED) |
759 | lpi_ctrl |= I82579_LPI_CTRL_1000_ENABLE; | 760 | lpi_ctrl |= I82579_LPI_CTRL_1000_ENABLE; |
760 | 761 | ||
761 | if (dev_spec->eee_lp_ability & I82579_EEE_100_SUPPORTED) { | 762 | if (adv & dev_spec->eee_lp_ability & I82579_EEE_100_SUPPORTED) { |
762 | e1e_rphy_locked(hw, MII_LPA, &data); | 763 | e1e_rphy_locked(hw, MII_LPA, &data); |
763 | if (data & LPA_100FULL) | 764 | if (data & LPA_100FULL) |
764 | lpi_ctrl |= I82579_LPI_CTRL_100_ENABLE; | 765 | lpi_ctrl |= I82579_LPI_CTRL_100_ENABLE; |
@@ -770,13 +771,13 @@ static s32 e1000_set_eee_pchlan(struct e1000_hw *hw) | |||
770 | dev_spec->eee_lp_ability &= | 771 | dev_spec->eee_lp_ability &= |
771 | ~I82579_EEE_100_SUPPORTED; | 772 | ~I82579_EEE_100_SUPPORTED; |
772 | } | 773 | } |
773 | |||
774 | /* R/Clr IEEE MMD 3.1 bits 11:10 - Tx/Rx LPI Received */ | ||
775 | ret_val = e1000_read_emi_reg_locked(hw, pcs_status, &data); | ||
776 | if (ret_val) | ||
777 | goto release; | ||
778 | } | 774 | } |
779 | 775 | ||
776 | /* R/Clr IEEE MMD 3.1 bits 11:10 - Tx/Rx LPI Received */ | ||
777 | ret_val = e1000_read_emi_reg_locked(hw, pcs_status, &data); | ||
778 | if (ret_val) | ||
779 | goto release; | ||
780 | |||
780 | ret_val = e1e_wphy_locked(hw, I82579_LPI_CTRL, lpi_ctrl); | 781 | ret_val = e1e_wphy_locked(hw, I82579_LPI_CTRL, lpi_ctrl); |
781 | release: | 782 | release: |
782 | hw->phy.ops.release(hw); | 783 | hw->phy.ops.release(hw); |
diff --git a/drivers/net/ethernet/intel/e1000e/ich8lan.h b/drivers/net/ethernet/intel/e1000e/ich8lan.h index 00ba6c912cc8..21d21b97979f 100644 --- a/drivers/net/ethernet/intel/e1000e/ich8lan.h +++ b/drivers/net/ethernet/intel/e1000e/ich8lan.h | |||
@@ -212,7 +212,7 @@ | |||
212 | #define I82577_MSE_THRESHOLD 0x0887 /* 82577 Mean Square Error Threshold */ | 212 | #define I82577_MSE_THRESHOLD 0x0887 /* 82577 Mean Square Error Threshold */ |
213 | #define I82579_MSE_LINK_DOWN 0x2411 /* MSE count before dropping link */ | 213 | #define I82579_MSE_LINK_DOWN 0x2411 /* MSE count before dropping link */ |
214 | #define I82579_RX_CONFIG 0x3412 /* Receive configuration */ | 214 | #define I82579_RX_CONFIG 0x3412 /* Receive configuration */ |
215 | #define I82579_EEE_PCS_STATUS 0x182D /* IEEE MMD Register 3.1 >> 8 */ | 215 | #define I82579_EEE_PCS_STATUS 0x182E /* IEEE MMD Register 3.1 >> 8 */ |
216 | #define I82579_EEE_CAPABILITY 0x0410 /* IEEE MMD Register 3.20 */ | 216 | #define I82579_EEE_CAPABILITY 0x0410 /* IEEE MMD Register 3.20 */ |
217 | #define I82579_EEE_ADVERTISEMENT 0x040E /* IEEE MMD Register 7.60 */ | 217 | #define I82579_EEE_ADVERTISEMENT 0x040E /* IEEE MMD Register 7.60 */ |
218 | #define I82579_EEE_LP_ABILITY 0x040F /* IEEE MMD Register 7.61 */ | 218 | #define I82579_EEE_LP_ABILITY 0x040F /* IEEE MMD Register 7.61 */ |
@@ -268,4 +268,5 @@ s32 e1000_configure_k1_ich8lan(struct e1000_hw *hw, bool k1_enable); | |||
268 | void e1000_copy_rx_addrs_to_phy_ich8lan(struct e1000_hw *hw); | 268 | void e1000_copy_rx_addrs_to_phy_ich8lan(struct e1000_hw *hw); |
269 | s32 e1000_lv_jumbo_workaround_ich8lan(struct e1000_hw *hw, bool enable); | 269 | s32 e1000_lv_jumbo_workaround_ich8lan(struct e1000_hw *hw, bool enable); |
270 | s32 e1000_read_emi_reg_locked(struct e1000_hw *hw, u16 addr, u16 *data); | 270 | s32 e1000_read_emi_reg_locked(struct e1000_hw *hw, u16 addr, u16 *data); |
271 | s32 e1000_write_emi_reg_locked(struct e1000_hw *hw, u16 addr, u16 data); | ||
271 | #endif /* _E1000E_ICH8LAN_H_ */ | 272 | #endif /* _E1000E_ICH8LAN_H_ */ |
diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c index 142ca39a68f6..0459fe3a06bd 100644 --- a/drivers/net/ethernet/intel/e1000e/netdev.c +++ b/drivers/net/ethernet/intel/e1000e/netdev.c | |||
@@ -3875,6 +3875,38 @@ void e1000e_reset(struct e1000_adapter *adapter) | |||
3875 | /* initialize systim and reset the ns time counter */ | 3875 | /* initialize systim and reset the ns time counter */ |
3876 | e1000e_config_hwtstamp(adapter); | 3876 | e1000e_config_hwtstamp(adapter); |
3877 | 3877 | ||
3878 | /* Set EEE advertisement as appropriate */ | ||
3879 | if (adapter->flags2 & FLAG2_HAS_EEE) { | ||
3880 | s32 ret_val; | ||
3881 | u16 adv_addr; | ||
3882 | |||
3883 | switch (hw->phy.type) { | ||
3884 | case e1000_phy_82579: | ||
3885 | adv_addr = I82579_EEE_ADVERTISEMENT; | ||
3886 | break; | ||
3887 | case e1000_phy_i217: | ||
3888 | adv_addr = I217_EEE_ADVERTISEMENT; | ||
3889 | break; | ||
3890 | default: | ||
3891 | dev_err(&adapter->pdev->dev, | ||
3892 | "Invalid PHY type setting EEE advertisement\n"); | ||
3893 | return; | ||
3894 | } | ||
3895 | |||
3896 | ret_val = hw->phy.ops.acquire(hw); | ||
3897 | if (ret_val) { | ||
3898 | dev_err(&adapter->pdev->dev, | ||
3899 | "EEE advertisement - unable to acquire PHY\n"); | ||
3900 | return; | ||
3901 | } | ||
3902 | |||
3903 | e1000_write_emi_reg_locked(hw, adv_addr, | ||
3904 | hw->dev_spec.ich8lan.eee_disable ? | ||
3905 | 0 : adapter->eee_advert); | ||
3906 | |||
3907 | hw->phy.ops.release(hw); | ||
3908 | } | ||
3909 | |||
3878 | if (!netif_running(adapter->netdev) && | 3910 | if (!netif_running(adapter->netdev) && |
3879 | !test_bit(__E1000_TESTING, &adapter->state)) { | 3911 | !test_bit(__E1000_TESTING, &adapter->state)) { |
3880 | e1000_power_down_phy(adapter); | 3912 | e1000_power_down_phy(adapter); |
@@ -6540,6 +6572,10 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
6540 | goto err_flashmap; | 6572 | goto err_flashmap; |
6541 | } | 6573 | } |
6542 | 6574 | ||
6575 | /* Set default EEE advertisement */ | ||
6576 | if (adapter->flags2 & FLAG2_HAS_EEE) | ||
6577 | adapter->eee_advert = MDIO_EEE_100TX | MDIO_EEE_1000T; | ||
6578 | |||
6543 | /* construct the net_device struct */ | 6579 | /* construct the net_device struct */ |
6544 | netdev->netdev_ops = &e1000e_netdev_ops; | 6580 | netdev->netdev_ops = &e1000e_netdev_ops; |
6545 | e1000e_set_ethtool_ops(netdev); | 6581 | e1000e_set_ethtool_ops(netdev); |