| From foo@baz Sun Nov 19 11:32:28 CET 2017 |
| From: Aaron Sierra <asierra@xes-inc.com> |
| Date: Tue, 29 Nov 2016 10:03:56 -0600 |
| Subject: igb: reset the PHY before reading the PHY ID |
| |
| From: Aaron Sierra <asierra@xes-inc.com> |
| |
| |
| [ Upstream commit 182785335447957409282ca745aa5bc3968facee ] |
| |
| Several people have reported firmware leaving the I210/I211 PHY's page |
| select register set to something other than the default of zero. This |
| causes the first accesses, PHY_IDx register reads, to access something |
| else, resulting in device probe failure: |
| |
| igb: Intel(R) Gigabit Ethernet Network Driver - version 5.4.0-k |
| igb: Copyright (c) 2007-2014 Intel Corporation. |
| igb: probe of 0000:01:00.0 failed with error -2 |
| |
| This problem began for them after a previous patch I submitted was |
| applied: |
| |
| commit 2a3cdead8b408351fa1e3079b220fa331480ffbc |
| Author: Aaron Sierra <asierra@xes-inc.com> |
| Date: Tue Nov 3 12:37:09 2015 -0600 |
| |
| igb: Remove GS40G specific defines/functions |
| |
| I personally experienced this problem after attempting to PXE boot from |
| I210 devices using this firmware: |
| |
| Intel(R) Boot Agent GE v1.5.78 |
| Copyright (C) 1997-2014, Intel Corporation |
| |
| Resetting the PHY before reading from it, ensures the page select |
| register is in its default state and doesn't make assumptions about |
| the PHY's register set before the PHY has been probed. |
| |
| Cc: Matwey V. Kornilov <matwey@sai.msu.ru> |
| Cc: Chris Arges <carges@vectranetworks.com> |
| Cc: Jochen Henneberg <jh@henneberg-systemdesign.com> |
| Signed-off-by: Aaron Sierra <asierra@xes-inc.com> |
| Tested-by: Matwey V. Kornilov <matwey@sai.msu.ru> |
| Tested-by: Chris J Arges <christopherarges@gmail.com> |
| Tested-by: Aaron Brown <aaron.f.brown@intel.com> |
| Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> |
| Signed-off-by: Sasha Levin <alexander.levin@verizon.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/net/ethernet/intel/igb/e1000_82575.c | 11 +++++++++++ |
| 1 file changed, 11 insertions(+) |
| |
| --- a/drivers/net/ethernet/intel/igb/e1000_82575.c |
| +++ b/drivers/net/ethernet/intel/igb/e1000_82575.c |
| @@ -245,6 +245,17 @@ static s32 igb_init_phy_params_82575(str |
| hw->bus.func = (rd32(E1000_STATUS) & E1000_STATUS_FUNC_MASK) >> |
| E1000_STATUS_FUNC_SHIFT; |
| |
| + /* Make sure the PHY is in a good state. Several people have reported |
| + * firmware leaving the PHY's page select register set to something |
| + * other than the default of zero, which causes the PHY ID read to |
| + * access something other than the intended register. |
| + */ |
| + ret_val = hw->phy.ops.reset(hw); |
| + if (ret_val) { |
| + hw_dbg("Error resetting the PHY.\n"); |
| + goto out; |
| + } |
| + |
| /* Set phy->phy_addr and phy->id. */ |
| igb_write_phy_reg_82580(hw, I347AT4_PAGE_SELECT, 0); |
| ret_val = igb_get_phy_id_82575(hw); |