aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorTodd Fujinaka <todd.fujinaka@intel.com>2014-08-29 02:43:13 -0400
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2014-09-06 08:00:39 -0400
commitc4c112f1585fde3926976da8962ba84d342d8869 (patch)
tree894675f29f44c2d41eea56dd0555caf59c3a071e /drivers/net
parent887a79f4a8cce981bb74bf56e1ee25786f235e66 (diff)
igb: add flags to set eee advertisement mode
Change e1000_set_eee and e1000_set_eee_i35(0|4) to allow changes in the advertised EEE speeds from ethtool. Adds two boolean flags to e1000_set_eee_i35(0|4) to pass in advertised speed data. Signed-off-by: Todd Fujinaka <todd.fujinaka@intel.com> Tested-by: Aaron Brown <aaron.f.brown@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/ethernet/intel/igb/e1000_82575.c31
-rw-r--r--drivers/net/ethernet/intel/igb/e1000_82575.h4
-rw-r--r--drivers/net/ethernet/intel/igb/igb_ethtool.c24
-rw-r--r--drivers/net/ethernet/intel/igb/igb_main.c8
4 files changed, 49 insertions, 18 deletions
diff --git a/drivers/net/ethernet/intel/igb/e1000_82575.c b/drivers/net/ethernet/intel/igb/e1000_82575.c
index 236a6183a865..051ea94bdcd3 100644
--- a/drivers/net/ethernet/intel/igb/e1000_82575.c
+++ b/drivers/net/ethernet/intel/igb/e1000_82575.c
@@ -2548,11 +2548,13 @@ s32 igb_read_emi_reg(struct e1000_hw *hw, u16 addr, u16 *data)
2548/** 2548/**
2549 * igb_set_eee_i350 - Enable/disable EEE support 2549 * igb_set_eee_i350 - Enable/disable EEE support
2550 * @hw: pointer to the HW structure 2550 * @hw: pointer to the HW structure
2551 * @adv1G: boolean flag enabling 1G EEE advertisement
2552 * @adv100m: boolean flag enabling 100M EEE advertisement
2551 * 2553 *
2552 * Enable/disable EEE based on setting in dev_spec structure. 2554 * Enable/disable EEE based on setting in dev_spec structure.
2553 * 2555 *
2554 **/ 2556 **/
2555s32 igb_set_eee_i350(struct e1000_hw *hw) 2557s32 igb_set_eee_i350(struct e1000_hw *hw, bool adv1G, bool adv100M)
2556{ 2558{
2557 u32 ipcnfg, eeer; 2559 u32 ipcnfg, eeer;
2558 2560
@@ -2566,7 +2568,16 @@ s32 igb_set_eee_i350(struct e1000_hw *hw)
2566 if (!(hw->dev_spec._82575.eee_disable)) { 2568 if (!(hw->dev_spec._82575.eee_disable)) {
2567 u32 eee_su = rd32(E1000_EEE_SU); 2569 u32 eee_su = rd32(E1000_EEE_SU);
2568 2570
2569 ipcnfg |= (E1000_IPCNFG_EEE_1G_AN | E1000_IPCNFG_EEE_100M_AN); 2571 if (adv100M)
2572 ipcnfg |= E1000_IPCNFG_EEE_100M_AN;
2573 else
2574 ipcnfg &= ~E1000_IPCNFG_EEE_100M_AN;
2575
2576 if (adv1G)
2577 ipcnfg |= E1000_IPCNFG_EEE_1G_AN;
2578 else
2579 ipcnfg &= ~E1000_IPCNFG_EEE_1G_AN;
2580
2570 eeer |= (E1000_EEER_TX_LPI_EN | E1000_EEER_RX_LPI_EN | 2581 eeer |= (E1000_EEER_TX_LPI_EN | E1000_EEER_RX_LPI_EN |
2571 E1000_EEER_LPI_FC); 2582 E1000_EEER_LPI_FC);
2572 2583
@@ -2593,11 +2604,13 @@ out:
2593/** 2604/**
2594 * igb_set_eee_i354 - Enable/disable EEE support 2605 * igb_set_eee_i354 - Enable/disable EEE support
2595 * @hw: pointer to the HW structure 2606 * @hw: pointer to the HW structure
2607 * @adv1G: boolean flag enabling 1G EEE advertisement
2608 * @adv100m: boolean flag enabling 100M EEE advertisement
2596 * 2609 *
2597 * Enable/disable EEE legacy mode based on setting in dev_spec structure. 2610 * Enable/disable EEE legacy mode based on setting in dev_spec structure.
2598 * 2611 *
2599 **/ 2612 **/
2600s32 igb_set_eee_i354(struct e1000_hw *hw) 2613s32 igb_set_eee_i354(struct e1000_hw *hw, bool adv1G, bool adv100M)
2601{ 2614{
2602 struct e1000_phy_info *phy = &hw->phy; 2615 struct e1000_phy_info *phy = &hw->phy;
2603 s32 ret_val = 0; 2616 s32 ret_val = 0;
@@ -2636,8 +2649,16 @@ s32 igb_set_eee_i354(struct e1000_hw *hw)
2636 if (ret_val) 2649 if (ret_val)
2637 goto out; 2650 goto out;
2638 2651
2639 phy_data |= E1000_EEE_ADV_100_SUPPORTED | 2652 if (adv100M)
2640 E1000_EEE_ADV_1000_SUPPORTED; 2653 phy_data |= E1000_EEE_ADV_100_SUPPORTED;
2654 else
2655 phy_data &= ~E1000_EEE_ADV_100_SUPPORTED;
2656
2657 if (adv1G)
2658 phy_data |= E1000_EEE_ADV_1000_SUPPORTED;
2659 else
2660 phy_data &= ~E1000_EEE_ADV_1000_SUPPORTED;
2661
2641 ret_val = igb_write_xmdio_reg(hw, E1000_EEE_ADV_ADDR_I354, 2662 ret_val = igb_write_xmdio_reg(hw, E1000_EEE_ADV_ADDR_I354,
2642 E1000_EEE_ADV_DEV_I354, 2663 E1000_EEE_ADV_DEV_I354,
2643 phy_data); 2664 phy_data);
diff --git a/drivers/net/ethernet/intel/igb/e1000_82575.h b/drivers/net/ethernet/intel/igb/e1000_82575.h
index b407c55738fa..2154aea7aa7e 100644
--- a/drivers/net/ethernet/intel/igb/e1000_82575.h
+++ b/drivers/net/ethernet/intel/igb/e1000_82575.h
@@ -263,8 +263,8 @@ void igb_vmdq_set_loopback_pf(struct e1000_hw *, bool);
263void igb_vmdq_set_replication_pf(struct e1000_hw *, bool); 263void igb_vmdq_set_replication_pf(struct e1000_hw *, bool);
264u16 igb_rxpbs_adjust_82580(u32 data); 264u16 igb_rxpbs_adjust_82580(u32 data);
265s32 igb_read_emi_reg(struct e1000_hw *, u16 addr, u16 *data); 265s32 igb_read_emi_reg(struct e1000_hw *, u16 addr, u16 *data);
266s32 igb_set_eee_i350(struct e1000_hw *); 266s32 igb_set_eee_i350(struct e1000_hw *, bool adv1G, bool adv100M);
267s32 igb_set_eee_i354(struct e1000_hw *); 267s32 igb_set_eee_i354(struct e1000_hw *, bool adv1G, bool adv100M);
268s32 igb_get_eee_status_i354(struct e1000_hw *hw, bool *status); 268s32 igb_get_eee_status_i354(struct e1000_hw *hw, bool *status);
269 269
270#define E1000_I2C_THERMAL_SENSOR_ADDR 0xF8 270#define E1000_I2C_THERMAL_SENSOR_ADDR 0xF8
diff --git a/drivers/net/ethernet/intel/igb/igb_ethtool.c b/drivers/net/ethernet/intel/igb/igb_ethtool.c
index c737d1f40838..02cfd3b14762 100644
--- a/drivers/net/ethernet/intel/igb/igb_ethtool.c
+++ b/drivers/net/ethernet/intel/igb/igb_ethtool.c
@@ -2675,6 +2675,7 @@ static int igb_set_eee(struct net_device *netdev,
2675 struct igb_adapter *adapter = netdev_priv(netdev); 2675 struct igb_adapter *adapter = netdev_priv(netdev);
2676 struct e1000_hw *hw = &adapter->hw; 2676 struct e1000_hw *hw = &adapter->hw;
2677 struct ethtool_eee eee_curr; 2677 struct ethtool_eee eee_curr;
2678 bool adv1g_eee = true, adv100m_eee = true;
2678 s32 ret_val; 2679 s32 ret_val;
2679 2680
2680 if ((hw->mac.type < e1000_i350) || 2681 if ((hw->mac.type < e1000_i350) ||
@@ -2701,12 +2702,14 @@ static int igb_set_eee(struct net_device *netdev,
2701 return -EINVAL; 2702 return -EINVAL;
2702 } 2703 }
2703 2704
2704 if (edata->advertised & 2705 if (!edata->advertised || (edata->advertised &
2705 ~(ADVERTISE_100_FULL | ADVERTISE_1000_FULL)) { 2706 ~(ADVERTISE_100_FULL | ADVERTISE_1000_FULL))) {
2706 dev_err(&adapter->pdev->dev, 2707 dev_err(&adapter->pdev->dev,
2707 "EEE Advertisement supports only 100Tx and or 100T full duplex\n"); 2708 "EEE Advertisement supports only 100Tx and/or 100T full duplex\n");
2708 return -EINVAL; 2709 return -EINVAL;
2709 } 2710 }
2711 adv100m_eee = !!(edata->advertised & ADVERTISE_100_FULL);
2712 adv1g_eee = !!(edata->advertised & ADVERTISE_1000_FULL);
2710 2713
2711 } else if (!edata->eee_enabled) { 2714 } else if (!edata->eee_enabled) {
2712 dev_err(&adapter->pdev->dev, 2715 dev_err(&adapter->pdev->dev,
@@ -2718,10 +2721,6 @@ static int igb_set_eee(struct net_device *netdev,
2718 if (hw->dev_spec._82575.eee_disable != !edata->eee_enabled) { 2721 if (hw->dev_spec._82575.eee_disable != !edata->eee_enabled) {
2719 hw->dev_spec._82575.eee_disable = !edata->eee_enabled; 2722 hw->dev_spec._82575.eee_disable = !edata->eee_enabled;
2720 adapter->flags |= IGB_FLAG_EEE; 2723 adapter->flags |= IGB_FLAG_EEE;
2721 if (hw->mac.type == e1000_i350)
2722 igb_set_eee_i350(hw);
2723 else
2724 igb_set_eee_i354(hw);
2725 2724
2726 /* reset link */ 2725 /* reset link */
2727 if (netif_running(netdev)) 2726 if (netif_running(netdev))
@@ -2730,6 +2729,17 @@ static int igb_set_eee(struct net_device *netdev,
2730 igb_reset(adapter); 2729 igb_reset(adapter);
2731 } 2730 }
2732 2731
2732 if (hw->mac.type == e1000_i354)
2733 ret_val = igb_set_eee_i354(hw, adv1g_eee, adv100m_eee);
2734 else
2735 ret_val = igb_set_eee_i350(hw, adv1g_eee, adv100m_eee);
2736
2737 if (ret_val) {
2738 dev_err(&adapter->pdev->dev,
2739 "Problem setting EEE advertisement options\n");
2740 return -EINVAL;
2741 }
2742
2733 return 0; 2743 return 0;
2734} 2744}
2735 2745
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c
index 4c023f0e54e4..6cf0c17ad9c4 100644
--- a/drivers/net/ethernet/intel/igb/igb_main.c
+++ b/drivers/net/ethernet/intel/igb/igb_main.c
@@ -2012,10 +2012,10 @@ void igb_reset(struct igb_adapter *adapter)
2012 case e1000_i350: 2012 case e1000_i350:
2013 case e1000_i210: 2013 case e1000_i210:
2014 case e1000_i211: 2014 case e1000_i211:
2015 igb_set_eee_i350(hw); 2015 igb_set_eee_i350(hw, true, true);
2016 break; 2016 break;
2017 case e1000_i354: 2017 case e1000_i354:
2018 igb_set_eee_i354(hw); 2018 igb_set_eee_i354(hw, true, true);
2019 break; 2019 break;
2020 default: 2020 default:
2021 break; 2021 break;
@@ -2619,7 +2619,7 @@ static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
2619 case e1000_i210: 2619 case e1000_i210:
2620 case e1000_i211: 2620 case e1000_i211:
2621 /* Enable EEE for internal copper PHY devices */ 2621 /* Enable EEE for internal copper PHY devices */
2622 err = igb_set_eee_i350(hw); 2622 err = igb_set_eee_i350(hw, true, true);
2623 if ((!err) && 2623 if ((!err) &&
2624 (!hw->dev_spec._82575.eee_disable)) { 2624 (!hw->dev_spec._82575.eee_disable)) {
2625 adapter->eee_advert = 2625 adapter->eee_advert =
@@ -2630,7 +2630,7 @@ static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
2630 case e1000_i354: 2630 case e1000_i354:
2631 if ((rd32(E1000_CTRL_EXT) & 2631 if ((rd32(E1000_CTRL_EXT) &
2632 E1000_CTRL_EXT_LINK_MODE_SGMII)) { 2632 E1000_CTRL_EXT_LINK_MODE_SGMII)) {
2633 err = igb_set_eee_i354(hw); 2633 err = igb_set_eee_i354(hw, true, true);
2634 if ((!err) && 2634 if ((!err) &&
2635 (!hw->dev_spec._82575.eee_disable)) { 2635 (!hw->dev_spec._82575.eee_disable)) {
2636 adapter->eee_advert = 2636 adapter->eee_advert =