aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBruce Allan <bruce.w.allan@intel.com>2013-03-20 03:23:11 -0400
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2013-03-28 03:01:52 -0400
commitd495bcb84d2c3abb5ad5e43cfeea0e305ceffb30 (patch)
tree6edb94fb74a39dee627bbaeb39b3d21df84acc29
parentea8179a72844b30d046cdcc932231872f2dbcc90 (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.h3
-rw-r--r--drivers/net/ethernet/intel/e1000e/ethtool.c63
-rw-r--r--drivers/net/ethernet/intel/e1000e/ich8lan.c55
-rw-r--r--drivers/net/ethernet/intel/e1000e/ich8lan.h3
-rw-r--r--drivers/net/ethernet/intel/e1000e/netdev.c36
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
51struct e1000_info; 52struct 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
355struct e1000_info { 358struct 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 **/
698static s32 e1000_write_emi_reg_locked(struct e1000_hw *hw, u16 addr, u16 data) 698s32 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);
781release: 782release:
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);
268void e1000_copy_rx_addrs_to_phy_ich8lan(struct e1000_hw *hw); 268void e1000_copy_rx_addrs_to_phy_ich8lan(struct e1000_hw *hw);
269s32 e1000_lv_jumbo_workaround_ich8lan(struct e1000_hw *hw, bool enable); 269s32 e1000_lv_jumbo_workaround_ich8lan(struct e1000_hw *hw, bool enable);
270s32 e1000_read_emi_reg_locked(struct e1000_hw *hw, u16 addr, u16 *data); 270s32 e1000_read_emi_reg_locked(struct e1000_hw *hw, u16 addr, u16 *data);
271s32 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);