• Corinna Vinschen's avatar
    igb: conditionalize I2C bit banging on external thermal sensor support · 5d54cb17
    Corinna Vinschen authored
    Commit a97f8783 ("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 a97f8783
    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
    a97f8783 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: a97f8783 ("igb: unbreak I2C bit-banging on i350")
    Tested-by: default avatarMateusz Palczewski <mateusz.palczewski@intel.com>
    Co-developed-by: default avatarJamie Bainbridge <jbainbri@redhat.com>
    Signed-off-by: default avatarJamie Bainbridge <jbainbri@redhat.com>
    Signed-off-by: default avatarCorinna Vinschen <vinschen@redhat.com>
    Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
    Link: https://lore.kernel.org/r/20230214185549.1306522-1-anthony.l.nguyen@intel.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    5d54cb17
igb_main.c 271 KB