[Intel-wired-lan] [PATCH v1] igc: Add PHY power management control
Neftin, Sasha
sasha.neftin at intel.com
Thu Dec 12 12:08:14 UTC 2019
On 12/12/2019 13:33, Paul Menzel wrote:
> Dear Sasha,
>
>
> On 2019-12-12 12:29, Sasha Neftin wrote:
>> PHY power management control should provide a reliable and accurate
>> indication of PHY reset completion and decrease the delay time
>> after a PHY reset
>>
>> Signed-off-by: Sasha Neftin <sasha.neftin at intel.com>
>> ---
>> drivers/net/ethernet/intel/igc/igc_defines.h | 1 +
>> drivers/net/ethernet/intel/igc/igc_phy.c | 9 +++++++++
>> drivers/net/ethernet/intel/igc/igc_regs.h | 1 +
>> 3 files changed, 11 insertions(+)
>>
>> diff --git a/drivers/net/ethernet/intel/igc/igc_defines.h b/drivers/net/ethernet/intel/igc/igc_defines.h
>> index 2121fc34e300..71a4b0281c03 100644
>> --- a/drivers/net/ethernet/intel/igc/igc_defines.h
>> +++ b/drivers/net/ethernet/intel/igc/igc_defines.h
>> @@ -460,6 +460,7 @@
>> /* PHY Status Register */
>> #define MII_SR_LINK_STATUS 0x0004 /* Link Status 1 = link */
>> #define MII_SR_AUTONEG_COMPLETE 0x0020 /* Auto Neg Complete */
>> +#define IGC_PHY_RST_COMP 0x0100 /* Internal PHY reset completion */
>>
>> /* PHY 1000 MII Register/Bit Definitions */
>> /* PHY Registers defined by IEEE */
>> diff --git a/drivers/net/ethernet/intel/igc/igc_phy.c b/drivers/net/ethernet/intel/igc/igc_phy.c
>> index f4b05af0dd2f..e19e861df719 100644
>> --- a/drivers/net/ethernet/intel/igc/igc_phy.c
>> +++ b/drivers/net/ethernet/intel/igc/igc_phy.c
>> @@ -173,6 +173,7 @@ s32 igc_check_downshift(struct igc_hw *hw)
>> s32 igc_phy_hw_reset(struct igc_hw *hw)
>> {
>> struct igc_phy_info *phy = &hw->phy;
>> + u32 phpm = 0, timeout = 10000;
>
> Just use `unsigned int` for `timeout`?
>
u32 is unsigned int.
> phpm does not need to be initialized to 0?
RST_COMP indication in the PHPM register is clear on reading. I once
'read' the PHPM before polling and make sure zero value.
>
>> s32 ret_val;
>> u32 ctrl;
>>
>> @@ -186,6 +187,8 @@ s32 igc_phy_hw_reset(struct igc_hw *hw)
>> if (ret_val)
>> goto out;
>>
>> + phpm = rd32(IGC_I225_PHPM);
>> +
>> ctrl = rd32(IGC_CTRL);
>> wr32(IGC_CTRL, ctrl | IGC_CTRL_PHY_RST);
>> wrfl();
>> @@ -195,6 +198,12 @@ s32 igc_phy_hw_reset(struct igc_hw *hw)
>> wr32(IGC_CTRL, ctrl);
>> wrfl();
>>
>> + do {
>> + phpm = rd32(IGC_I225_PHPM);
>> + timeout--;
>> + udelay(1);
>> + } while (!(phpm & IGC_PHY_RST_COMP) && timeout);
>
> Print an error, when the timeout is reached?
Good idea. I will add hw_dbg in v2. Thanks.
>
>> +
>> usleep_range(1500, 2000);
>>
>> phy->ops.release(hw);
>> diff --git a/drivers/net/ethernet/intel/igc/igc_regs.h b/drivers/net/ethernet/intel/igc/igc_regs.h
>> index c82111051898..164c42b39dfa 100644
>> --- a/drivers/net/ethernet/intel/igc/igc_regs.h
>> +++ b/drivers/net/ethernet/intel/igc/igc_regs.h
>> @@ -12,6 +12,7 @@
>> #define IGC_MDIC 0x00020 /* MDI Control - RW */
>> #define IGC_MDICNFG 0x00E04 /* MDC/MDIO Configuration - RW */
>> #define IGC_CONNSW 0x00034 /* Copper/Fiber switch control - RW */
>> +#define IGC_I225_PHPM 0x00E14 /* I225 PHY Power Management */
>>
>> /* Internal Packet Buffer Size Registers */
>> #define IGC_RXPBS 0x02404 /* Rx Packet Buffer Size - RW */
>>
>
Hello Paul,
Thank you very much for your comments.
Sasha
More information about the Intel-wired-lan
mailing list