e1000e: add custom set_d[0|3]_lplu_state function pointer for 82574
82574 needs to configure Low Power Link Up (or LPLU) differently than the other parts in the 8257x family supported by the driver. Signed-off-by: Bruce Allan <bruce.w.allan@intel.com> Tested-by: Emil Tantilov <emil.s.tantilov@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
31dbe5b4ac
commit
77996d1d4c
2 changed files with 57 additions and 0 deletions
|
@ -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 s32 e1000_get_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.
|
||||
|
@ -113,6 +115,8 @@ static s32 e1000_init_phy_params_82571(struct e1000_hw *hw)
|
|||
phy->type = e1000_phy_bm;
|
||||
phy->ops.acquire = e1000_get_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;
|
||||
default:
|
||||
return -E1000_ERR_PHY;
|
||||
|
@ -655,6 +659,58 @@ static void e1000_put_hw_semaphore_82574(struct e1000_hw *hw)
|
|||
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
|
||||
* @hw: pointer to the HW structure
|
||||
|
|
|
@ -83,6 +83,7 @@ enum e1e_registers {
|
|||
E1000_EXTCNF_CTRL = 0x00F00, /* Extended Configuration Control */
|
||||
E1000_EXTCNF_SIZE = 0x00F08, /* Extended Configuration Size */
|
||||
E1000_PHY_CTRL = 0x00F10, /* PHY Control Register in CSR */
|
||||
#define E1000_POEMB E1000_PHY_CTRL /* PHY OEM Bits */
|
||||
E1000_PBA = 0x01000, /* Packet Buffer Allocation - RW */
|
||||
E1000_PBS = 0x01008, /* Packet Buffer Size */
|
||||
E1000_EEMNGCTL = 0x01010, /* MNG EEprom Control */
|
||||
|
|
Reference in a new issue