|
@@ -78,6 +78,8 @@ static void e1000_power_down_phy_copper_82571(struct e1000_hw *hw);
|
|
static void e1000_put_hw_semaphore_82573(struct e1000_hw *hw);
|
|
static void e1000_put_hw_semaphore_82573(struct e1000_hw *hw);
|
|
static s32 e1000_get_hw_semaphore_82574(struct e1000_hw *hw);
|
|
static s32 e1000_get_hw_semaphore_82574(struct e1000_hw *hw);
|
|
static void e1000_put_hw_semaphore_82574(struct e1000_hw *hw);
|
|
static void e1000_put_hw_semaphore_82574(struct e1000_hw *hw);
|
|
|
|
+static s32 e1000_set_d0_lplu_state_82574(struct e1000_hw *hw, bool active);
|
|
|
|
+static s32 e1000_set_d3_lplu_state_82574(struct e1000_hw *hw, bool active);
|
|
|
|
|
|
/**
|
|
/**
|
|
* e1000_init_phy_params_82571 - Init PHY func ptrs.
|
|
* e1000_init_phy_params_82571 - Init PHY func ptrs.
|
|
@@ -113,6 +115,8 @@ static s32 e1000_init_phy_params_82571(struct e1000_hw *hw)
|
|
phy->type = e1000_phy_bm;
|
|
phy->type = e1000_phy_bm;
|
|
phy->ops.acquire = e1000_get_hw_semaphore_82574;
|
|
phy->ops.acquire = e1000_get_hw_semaphore_82574;
|
|
phy->ops.release = e1000_put_hw_semaphore_82574;
|
|
phy->ops.release = e1000_put_hw_semaphore_82574;
|
|
|
|
+ phy->ops.set_d0_lplu_state = e1000_set_d0_lplu_state_82574;
|
|
|
|
+ phy->ops.set_d3_lplu_state = e1000_set_d3_lplu_state_82574;
|
|
break;
|
|
break;
|
|
default:
|
|
default:
|
|
return -E1000_ERR_PHY;
|
|
return -E1000_ERR_PHY;
|
|
@@ -655,6 +659,58 @@ static void e1000_put_hw_semaphore_82574(struct e1000_hw *hw)
|
|
mutex_unlock(&swflag_mutex);
|
|
mutex_unlock(&swflag_mutex);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * e1000_set_d0_lplu_state_82574 - Set Low Power Linkup D0 state
|
|
|
|
+ * @hw: pointer to the HW structure
|
|
|
|
+ * @active: true to enable LPLU, false to disable
|
|
|
|
+ *
|
|
|
|
+ * Sets the LPLU D0 state according to the active flag.
|
|
|
|
+ * LPLU will not be activated unless the
|
|
|
|
+ * device autonegotiation advertisement meets standards of
|
|
|
|
+ * either 10 or 10/100 or 10/100/1000 at all duplexes.
|
|
|
|
+ * This is a function pointer entry point only called by
|
|
|
|
+ * PHY setup routines.
|
|
|
|
+ **/
|
|
|
|
+static s32 e1000_set_d0_lplu_state_82574(struct e1000_hw *hw, bool active)
|
|
|
|
+{
|
|
|
|
+ u16 data = er32(POEMB);
|
|
|
|
+
|
|
|
|
+ if (active)
|
|
|
|
+ data |= E1000_PHY_CTRL_D0A_LPLU;
|
|
|
|
+ else
|
|
|
|
+ data &= ~E1000_PHY_CTRL_D0A_LPLU;
|
|
|
|
+
|
|
|
|
+ ew32(POEMB, data);
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * e1000_set_d3_lplu_state_82574 - Sets low power link up state for D3
|
|
|
|
+ * @hw: pointer to the HW structure
|
|
|
|
+ * @active: boolean used to enable/disable lplu
|
|
|
|
+ *
|
|
|
|
+ * The low power link up (lplu) state is set to the power management level D3
|
|
|
|
+ * when active is true, else clear lplu for D3. LPLU
|
|
|
|
+ * is used during Dx states where the power conservation is most important.
|
|
|
|
+ * During driver activity, SmartSpeed should be enabled so performance is
|
|
|
|
+ * maintained.
|
|
|
|
+ **/
|
|
|
|
+static s32 e1000_set_d3_lplu_state_82574(struct e1000_hw *hw, bool active)
|
|
|
|
+{
|
|
|
|
+ u16 data = er32(POEMB);
|
|
|
|
+
|
|
|
|
+ if (!active) {
|
|
|
|
+ data &= ~E1000_PHY_CTRL_NOND0A_LPLU;
|
|
|
|
+ } else if ((hw->phy.autoneg_advertised == E1000_ALL_SPEED_DUPLEX) ||
|
|
|
|
+ (hw->phy.autoneg_advertised == E1000_ALL_NOT_GIG) ||
|
|
|
|
+ (hw->phy.autoneg_advertised == E1000_ALL_10_SPEED)) {
|
|
|
|
+ data |= E1000_PHY_CTRL_NOND0A_LPLU;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ ew32(POEMB, data);
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* e1000_acquire_nvm_82571 - Request for access to the EEPROM
|
|
* e1000_acquire_nvm_82571 - Request for access to the EEPROM
|
|
* @hw: pointer to the HW structure
|
|
* @hw: pointer to the HW structure
|