Smart Power Down is a power saving feature in newer e1000 hardware. We
disable it because it causes time to link to be long, but make it a
user choice.
Signed-off-by: Jesse Brandeburg [EMAIL PROTECTED]
Signed-off-by: Auke Kok [EMAIL PROTECTED]
---
drivers/net/e1000/e1000.h |1 +
drivers/net/e1000/e1000_main.c | 15 +++
drivers/net/e1000/e1000_param.c | 25 +
3 files changed, 41 insertions(+), 0 deletions(-)
diff --git a/drivers/net/e1000/e1000.h b/drivers/net/e1000/e1000.h
index 2b96ad0..dbdaa33 100644
--- a/drivers/net/e1000/e1000.h
+++ b/drivers/net/e1000/e1000.h
@@ -338,6 +338,7 @@ struct e1000_adapter {
#ifdef NETIF_F_TSO
boolean_t tso_force;
#endif
+ boolean_t smart_power_down; /* phy smart power down */
unsigned long flags;
};
diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c
index 76e36a4..ea18f30 100644
--- a/drivers/net/e1000/e1000_main.c
+++ b/drivers/net/e1000/e1000_main.c
@@ -607,6 +607,21 @@ e1000_reset(struct e1000_adapter *adapte
e1000_reset_adaptive(adapter-hw);
e1000_phy_get_info(adapter-hw, adapter-phy_info);
+
+ if (!adapter-smart_power_down
+ (adapter-hw.mac_type == e1000_82571 ||
+adapter-hw.mac_type == e1000_82572)) {
+ uint16_t phy_data = 0;
+ /* speed up time to link by disabling smart power down, ignore
+* the return value of this function because there is nothing
+* different we would do if it failed */
+ e1000_read_phy_reg(adapter-hw, IGP02E1000_PHY_POWER_MGMT,
+ phy_data);
+ phy_data = ~IGP02E1000_PM_SPD;
+ e1000_write_phy_reg(adapter-hw, IGP02E1000_PHY_POWER_MGMT,
+ phy_data);
+ }
+
if (adapter-en_mng_pt) {
manc = E1000_READ_REG(adapter-hw, MANC);
manc |= (E1000_MANC_ARP_EN | E1000_MANC_EN_MNG2HOST);
diff --git a/drivers/net/e1000/e1000_param.c b/drivers/net/e1000/e1000_param.c
index e55f896..a8d9295 100644
--- a/drivers/net/e1000/e1000_param.c
+++ b/drivers/net/e1000/e1000_param.c
@@ -183,6 +183,15 @@ E1000_PARAM(RxAbsIntDelay, Receive Abso
E1000_PARAM(InterruptThrottleRate, Interrupt Throttling Rate);
+/* Enable Smart Power Down of the PHY
+ *
+ * Valid Range: 0, 1
+ *
+ * Default Value: 0 (disabled)
+ */
+
+E1000_PARAM(SmartPowerDownEnable, Enable PHY smart power down);
+
#define AUTONEG_ADV_DEFAULT 0x2F
#define AUTONEG_ADV_MASK 0x2F
#define FLOW_CONTROL_DEFAULT FLOW_CONTROL_FULL
@@ -494,6 +503,22 @@ e1000_check_options(struct e1000_adapter
adapter-itr = opt.def;
}
}
+ { /* Smart Power Down */
+ struct e1000_option opt = {
+ .type = enable_option,
+ .name = PHY Smart Power Down,
+ .err = defaulting to Disabled,
+ .def = OPTION_DISABLED
+ };
+
+ if (num_SmartPowerDownEnable bd) {
+ int spd = SmartPowerDownEnable[bd];
+ e1000_validate_option(spd, opt, adapter);
+ adapter-smart_power_down = spd;
+ } else {
+ adapter-smart_power_down = opt.def;
+ }
+ }
switch (adapter-hw.media_type) {
case e1000_media_type_fiber:
--
Auke Kok [EMAIL PROTECTED]
-
To unsubscribe from this list: send the line unsubscribe netdev in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html