e1000: add smart power down code
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 <jesse.brandeburg@intel.com> Signed-off-by: Auke Kok <auke-jan.h.kok@intel.com>
This commit is contained in:
@@ -338,6 +338,7 @@ struct e1000_adapter {
|
|||||||
#ifdef NETIF_F_TSO
|
#ifdef NETIF_F_TSO
|
||||||
boolean_t tso_force;
|
boolean_t tso_force;
|
||||||
#endif
|
#endif
|
||||||
|
boolean_t smart_power_down; /* phy smart power down */
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -607,6 +607,21 @@ e1000_reset(struct e1000_adapter *adapter)
|
|||||||
|
|
||||||
e1000_reset_adaptive(&adapter->hw);
|
e1000_reset_adaptive(&adapter->hw);
|
||||||
e1000_phy_get_info(&adapter->hw, &adapter->phy_info);
|
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) {
|
if (adapter->en_mng_pt) {
|
||||||
manc = E1000_READ_REG(&adapter->hw, MANC);
|
manc = E1000_READ_REG(&adapter->hw, MANC);
|
||||||
manc |= (E1000_MANC_ARP_EN | E1000_MANC_EN_MNG2HOST);
|
manc |= (E1000_MANC_ARP_EN | E1000_MANC_EN_MNG2HOST);
|
||||||
|
@@ -183,6 +183,15 @@ E1000_PARAM(RxAbsIntDelay, "Receive Absolute Interrupt Delay");
|
|||||||
|
|
||||||
E1000_PARAM(InterruptThrottleRate, "Interrupt Throttling Rate");
|
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_DEFAULT 0x2F
|
||||||
#define AUTONEG_ADV_MASK 0x2F
|
#define AUTONEG_ADV_MASK 0x2F
|
||||||
#define FLOW_CONTROL_DEFAULT FLOW_CONTROL_FULL
|
#define FLOW_CONTROL_DEFAULT FLOW_CONTROL_FULL
|
||||||
@@ -494,6 +503,22 @@ e1000_check_options(struct e1000_adapter *adapter)
|
|||||||
adapter->itr = opt.def;
|
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) {
|
switch (adapter->hw.media_type) {
|
||||||
case e1000_media_type_fiber:
|
case e1000_media_type_fiber:
|
||||||
|
Reference in New Issue
Block a user