diff options
author | Todd Fujinaka <todd.fujinaka@intel.com> | 2014-08-29 02:43:13 -0400 |
---|---|---|
committer | Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 2014-09-06 08:00:39 -0400 |
commit | c4c112f1585fde3926976da8962ba84d342d8869 (patch) | |
tree | 894675f29f44c2d41eea56dd0555caf59c3a071e /drivers/net | |
parent | 887a79f4a8cce981bb74bf56e1ee25786f235e66 (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.c | 31 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/igb/e1000_82575.h | 4 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/igb/igb_ethtool.c | 24 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/igb/igb_main.c | 8 |
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 | **/ |
2555 | s32 igb_set_eee_i350(struct e1000_hw *hw) | 2557 | s32 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 | **/ |
2600 | s32 igb_set_eee_i354(struct e1000_hw *hw) | 2613 | s32 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); | |||
263 | void igb_vmdq_set_replication_pf(struct e1000_hw *, bool); | 263 | void igb_vmdq_set_replication_pf(struct e1000_hw *, bool); |
264 | u16 igb_rxpbs_adjust_82580(u32 data); | 264 | u16 igb_rxpbs_adjust_82580(u32 data); |
265 | s32 igb_read_emi_reg(struct e1000_hw *, u16 addr, u16 *data); | 265 | s32 igb_read_emi_reg(struct e1000_hw *, u16 addr, u16 *data); |
266 | s32 igb_set_eee_i350(struct e1000_hw *); | 266 | s32 igb_set_eee_i350(struct e1000_hw *, bool adv1G, bool adv100M); |
267 | s32 igb_set_eee_i354(struct e1000_hw *); | 267 | s32 igb_set_eee_i354(struct e1000_hw *, bool adv1G, bool adv100M); |
268 | s32 igb_get_eee_status_i354(struct e1000_hw *hw, bool *status); | 268 | s32 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 = |