aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/e1000e/e1000.h1
-rw-r--r--drivers/net/e1000e/hw.h1
-rw-r--r--drivers/net/e1000e/ich8lan.c41
-rw-r--r--drivers/net/e1000e/param.c28
4 files changed, 70 insertions, 1 deletions
diff --git a/drivers/net/e1000e/e1000.h b/drivers/net/e1000e/e1000.h
index 0e59f15be110..c233496b1f47 100644
--- a/drivers/net/e1000e/e1000.h
+++ b/drivers/net/e1000e/e1000.h
@@ -423,6 +423,7 @@ struct e1000_info {
423#define FLAG2_IS_DISCARDING (1 << 2) 423#define FLAG2_IS_DISCARDING (1 << 2)
424#define FLAG2_DISABLE_ASPM_L1 (1 << 3) 424#define FLAG2_DISABLE_ASPM_L1 (1 << 3)
425#define FLAG2_HAS_PHY_STATS (1 << 4) 425#define FLAG2_HAS_PHY_STATS (1 << 4)
426#define FLAG2_HAS_EEE (1 << 5)
426 427
427#define E1000_RX_DESC_PS(R, i) \ 428#define E1000_RX_DESC_PS(R, i) \
428 (&(((union e1000_rx_desc_packet_split *)((R).desc))[i])) 429 (&(((union e1000_rx_desc_packet_split *)((R).desc))[i]))
diff --git a/drivers/net/e1000e/hw.h b/drivers/net/e1000e/hw.h
index 96116ce5e5cc..eecb2eca507b 100644
--- a/drivers/net/e1000e/hw.h
+++ b/drivers/net/e1000e/hw.h
@@ -937,6 +937,7 @@ struct e1000_dev_spec_ich8lan {
937 bool kmrn_lock_loss_workaround_enabled; 937 bool kmrn_lock_loss_workaround_enabled;
938 struct e1000_shadow_ram shadow_ram[E1000_ICH8_SHADOW_RAM_WORDS]; 938 struct e1000_shadow_ram shadow_ram[E1000_ICH8_SHADOW_RAM_WORDS];
939 bool nvm_k1_enabled; 939 bool nvm_k1_enabled;
940 bool eee_disable;
940}; 941};
941 942
942struct e1000_hw { 943struct e1000_hw {
diff --git a/drivers/net/e1000e/ich8lan.c b/drivers/net/e1000e/ich8lan.c
index 8274499b7df6..5e55de002487 100644
--- a/drivers/net/e1000e/ich8lan.c
+++ b/drivers/net/e1000e/ich8lan.c
@@ -131,6 +131,10 @@
131/* PHY Power Management Control */ 131/* PHY Power Management Control */
132#define HV_PM_CTRL PHY_REG(770, 17) 132#define HV_PM_CTRL PHY_REG(770, 17)
133 133
134/* PHY Low Power Idle Control */
135#define I82579_LPI_CTRL PHY_REG(772, 20)
136#define I82579_LPI_CTRL_ENABLE_MASK 0x6000
137
134/* Strapping Option Register - RO */ 138/* Strapping Option Register - RO */
135#define E1000_STRAP 0x0000C 139#define E1000_STRAP 0x0000C
136#define E1000_STRAP_SMBUS_ADDRESS_MASK 0x00FE0000 140#define E1000_STRAP_SMBUS_ADDRESS_MASK 0x00FE0000
@@ -569,6 +573,35 @@ static s32 e1000_init_mac_params_ich8lan(struct e1000_adapter *adapter)
569} 573}
570 574
571/** 575/**
576 * e1000_set_eee_pchlan - Enable/disable EEE support
577 * @hw: pointer to the HW structure
578 *
579 * Enable/disable EEE based on setting in dev_spec structure. The bits in
580 * the LPI Control register will remain set only if/when link is up.
581 **/
582static s32 e1000_set_eee_pchlan(struct e1000_hw *hw)
583{
584 s32 ret_val = 0;
585 u16 phy_reg;
586
587 if (hw->phy.type != e1000_phy_82579)
588 goto out;
589
590 ret_val = e1e_rphy(hw, I82579_LPI_CTRL, &phy_reg);
591 if (ret_val)
592 goto out;
593
594 if (hw->dev_spec.ich8lan.eee_disable)
595 phy_reg &= ~I82579_LPI_CTRL_ENABLE_MASK;
596 else
597 phy_reg |= I82579_LPI_CTRL_ENABLE_MASK;
598
599 ret_val = e1e_wphy(hw, I82579_LPI_CTRL, phy_reg);
600out:
601 return ret_val;
602}
603
604/**
572 * e1000_check_for_copper_link_ich8lan - Check for link (Copper) 605 * e1000_check_for_copper_link_ich8lan - Check for link (Copper)
573 * @hw: pointer to the HW structure 606 * @hw: pointer to the HW structure
574 * 607 *
@@ -625,6 +658,11 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw)
625 */ 658 */
626 e1000e_check_downshift(hw); 659 e1000e_check_downshift(hw);
627 660
661 /* Enable/Disable EEE after link up */
662 ret_val = e1000_set_eee_pchlan(hw);
663 if (ret_val)
664 goto out;
665
628 /* 666 /*
629 * If we are forcing speed/duplex, then we simply return since 667 * If we are forcing speed/duplex, then we simply return since
630 * we have already determined whether we have link or not. 668 * we have already determined whether we have link or not.
@@ -3820,7 +3858,8 @@ struct e1000_info e1000_pch2_info = {
3820 | FLAG_HAS_FLASH 3858 | FLAG_HAS_FLASH
3821 | FLAG_HAS_JUMBO_FRAMES 3859 | FLAG_HAS_JUMBO_FRAMES
3822 | FLAG_APME_IN_WUC, 3860 | FLAG_APME_IN_WUC,
3823 .flags2 = FLAG2_HAS_PHY_STATS, 3861 .flags2 = FLAG2_HAS_PHY_STATS
3862 | FLAG2_HAS_EEE,
3824 .pba = 18, 3863 .pba = 18,
3825 .max_hw_frame_size = DEFAULT_JUMBO, 3864 .max_hw_frame_size = DEFAULT_JUMBO,
3826 .get_variants = e1000_get_variants_ich8lan, 3865 .get_variants = e1000_get_variants_ich8lan,
diff --git a/drivers/net/e1000e/param.c b/drivers/net/e1000e/param.c
index a150e48a117f..a74846097afd 100644
--- a/drivers/net/e1000e/param.c
+++ b/drivers/net/e1000e/param.c
@@ -161,6 +161,15 @@ E1000_PARAM(WriteProtectNVM, "Write-protect NVM [WARNING: disabling this can lea
161E1000_PARAM(CrcStripping, "Enable CRC Stripping, disable if your BMC needs " \ 161E1000_PARAM(CrcStripping, "Enable CRC Stripping, disable if your BMC needs " \
162 "the CRC"); 162 "the CRC");
163 163
164/*
165 * Enable/disable EEE (a.k.a. IEEE802.3az)
166 *
167 * Valid Range: 0, 1
168 *
169 * Default Value: 1
170 */
171E1000_PARAM(EEE, "Enable/disable on parts that support the feature");
172
164struct e1000_option { 173struct e1000_option {
165 enum { enable_option, range_option, list_option } type; 174 enum { enable_option, range_option, list_option } type;
166 const char *name; 175 const char *name;
@@ -477,4 +486,23 @@ void __devinit e1000e_check_options(struct e1000_adapter *adapter)
477 } 486 }
478 } 487 }
479 } 488 }
489 { /* EEE for parts supporting the feature */
490 static const struct e1000_option opt = {
491 .type = enable_option,
492 .name = "EEE Support",
493 .err = "defaulting to Enabled",
494 .def = OPTION_ENABLED
495 };
496
497 if (adapter->flags2 & FLAG2_HAS_EEE) {
498 /* Currently only supported on 82579 */
499 if (num_EEE > bd) {
500 unsigned int eee = EEE[bd];
501 e1000_validate_option(&eee, &opt, adapter);
502 hw->dev_spec.ich8lan.eee_disable = !eee;
503 } else {
504 hw->dev_spec.ich8lan.eee_disable = !opt.def;
505 }
506 }
507 }
480} 508}