Skip to content

igb: conditionalize I2C bit banging on external thermal sensor support

Corinna Vinschen requested to merge vinschen/centos-stream-9:bz2173594 into main

Commit a97f8783a937 ("igb: unbreak I2C bit-banging on i350") introduced
code to change I2C settings to bit banging unconditionally.

However, this patch introduced a regression: On an Intel S2600CWR
Server Board with three NICs:

  • 1x dual-port copper
    Intel I350 Gigabit Network Connection [8086:1521] (rev 01)
    fw 1.63, 0x80000dda

  • 2x quad-port SFP+ with copper SFP Avago ABCU-5700RZ
    Intel I350 Gigabit Fiber Network Connection [8086:1522] (rev 01)
    fw 1.52.0

the SFP NICs no longer get link at all. Reverting commit a97f8783a937
or switching to the Intel out-of-tree driver both fix the problem.

Per the igb out-of-tree driver, I2C bit banging on i350 depends on
support for an external thermal sensor (ETS). However, commit
a97f8783a937 added bit banging unconditionally. Additionally, the
out-of-tree driver always calls init_thermal_sensor_thresh on probe,
while our driver only calls init_thermal_sensor_thresh only in
igb_reset(), and only if an ETS is present, ignoring the internal
thermal sensor. The affected SFPs don't provide an ETS. Per Intel,
the behaviour is a result of i350 firmware requirements.

This patch fixes the problem by aligning the behaviour to the
out-of-tree driver:

  • split igb_init_i2c() into two functions:

    • igb_init_i2c() only performs the basic I2C initialization.
    • igb_set_i2c_bb() makes sure that E1000_CTRL_I2C_ENA is set
      and enables bit-banging.
  • igb_probe() only calls igb_set_i2c_bb() if an ETS is present.

  • igb_probe() calls init_thermal_sensor_thresh() unconditionally.

  • igb_reset() aligns its behaviour to igb_probe(), i. e., call
    igb_set_i2c_bb() if an ETS is present and call
    init_thermal_sensor_thresh() unconditionally.

Fixes: a97f8783a937 ("igb: unbreak I2C bit-banging on i350")
Tested-by: Mateusz Palczewski mateusz.palczewski@intel.com
Co-developed-by: Jamie Bainbridge jbainbri@redhat.com
Signed-off-by: Jamie Bainbridge jbainbri@redhat.com
Signed-off-by: Corinna Vinschen vinschen@redhat.com
Signed-off-by: Tony Nguyen anthony.l.nguyen@intel.com
Link: https://lore.kernel.org/r/20230214185549.1306522-1-anthony.l.nguyen@intel.com
Signed-off-by: Jakub Kicinski kuba@kernel.org
(cherry picked from commit 5d54cb1767e06025819daa6769e0f18dcbc60936)
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2173594
Signed-off-by: Corinna Vinschen vinschen@redhat.com

721d3034 (Corinna Vinschen)
igb: conditionalize I2C bit banging on external thermal sensor support

drivers/net/ethernet/intel/igb/igb_main.c | 42 +++++++++++++++++++++++--------
1 file changed, 32 insertions(+), 10 deletions(-)

Merge request reports