From b91853ae2adeed3facf078034737d16827682895 Mon Sep 17 00:00:00 2001 From: Jiri Slaby Date: Apr 20 2023 11:00:54 +0000 Subject: net: sfp: initialize sfp->i2c_block_size at sfp allocation (bsc#1012628). --- diff --git a/patches.kernel.org/6.2.12-106-net-sfp-initialize-sfp-i2c_block_size-at-sfp-a.patch b/patches.kernel.org/6.2.12-106-net-sfp-initialize-sfp-i2c_block_size-at-sfp-a.patch new file mode 100644 index 0000000..a156efa --- /dev/null +++ b/patches.kernel.org/6.2.12-106-net-sfp-initialize-sfp-i2c_block_size-at-sfp-a.patch @@ -0,0 +1,84 @@ +From: Ivan Bornyakov +Date: Thu, 6 Apr 2023 16:08:32 +0300 +Subject: [PATCH] net: sfp: initialize sfp->i2c_block_size at sfp allocation +References: bsc#1012628 +Patch-mainline: 6.2.12 +Git-commit: 813c2dd78618f108fdcf9cd726ea90f081ee2881 + +commit 813c2dd78618f108fdcf9cd726ea90f081ee2881 upstream. + +sfp->i2c_block_size is initialized at SFP module insertion in +sfp_sm_mod_probe(). Because of that, if SFP module was never inserted +since boot, sfp_read() call will lead to zero-length I2C read attempt, +and not all I2C controllers are happy with zero-length reads. + +One way to issue sfp_read() on empty SFP cage is to execute ethtool -m. +If SFP module was never plugged since boot, there will be a zero-length +I2C read attempt. + + # ethtool -m xge0 + i2c i2c-3: adapter quirk: no zero length (addr 0x0050, size 0, read) + Cannot get Module EEPROM data: Operation not supported + +If SFP module was plugged then removed at least once, +sfp->i2c_block_size will be initialized and ethtool -m will fail with +different exit code and without I2C error + + # ethtool -m xge0 + Cannot get Module EEPROM data: Remote I/O error + +Fix this by initializing sfp->i2_block_size at struct sfp allocation +stage so no wild sfp_read() could issue zero-length I2C read. + +Signed-off-by: Ivan Bornyakov +Fixes: 0d035bed2a4a ("net: sfp: VSOL V2801F / CarlitoxxPro CPGOS03-0490 v2.0 workaround") +Cc: stable@vger.kernel.org +Reviewed-by: Andrew Lunn +Signed-off-by: David S. Miller +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Jiri Slaby +--- + drivers/net/phy/sfp.c | 13 ++++++++----- + 1 file changed, 8 insertions(+), 5 deletions(-) + +diff --git a/drivers/net/phy/sfp.c b/drivers/net/phy/sfp.c +index 83b99d95..b224800d 100644 +--- a/drivers/net/phy/sfp.c ++++ b/drivers/net/phy/sfp.c +@@ -212,6 +212,12 @@ static const enum gpiod_flags gpio_flags[] = { + #define SFP_PHY_ADDR 22 + #define SFP_PHY_ADDR_ROLLBALL 17 + ++/* SFP_EEPROM_BLOCK_SIZE is the size of data chunk to read the EEPROM ++ * at a time. Some SFP modules and also some Linux I2C drivers do not like ++ * reads longer than 16 bytes. ++ */ ++#define SFP_EEPROM_BLOCK_SIZE 16 ++ + struct sff_data { + unsigned int gpios; + bool (*module_supported)(const struct sfp_eeprom_id *id); +@@ -1927,11 +1933,7 @@ static int sfp_sm_mod_probe(struct sfp *sfp, bool report) + u8 check; + int ret; + +- /* Some SFP modules and also some Linux I2C drivers do not like reads +- * longer than 16 bytes, so read the EEPROM in chunks of 16 bytes at +- * a time. +- */ +- sfp->i2c_block_size = 16; ++ sfp->i2c_block_size = SFP_EEPROM_BLOCK_SIZE; + + ret = sfp_read(sfp, false, 0, &id.base, sizeof(id.base)); + if (ret < 0) { +@@ -2614,6 +2616,7 @@ static struct sfp *sfp_alloc(struct device *dev) + return ERR_PTR(-ENOMEM); + + sfp->dev = dev; ++ sfp->i2c_block_size = SFP_EEPROM_BLOCK_SIZE; + + mutex_init(&sfp->sm_mutex); + mutex_init(&sfp->st_mutex); +-- +2.35.3 + diff --git a/series.conf b/series.conf index c953f7a..0758213 100644 --- a/series.conf +++ b/series.conf @@ -2333,6 +2333,7 @@ patches.kernel.org/6.2.12-103-ksmbd-avoid-out-of-bounds-access-in-decode_pre.patch patches.kernel.org/6.2.12-104-riscv-add-icache-flush-for-nommu-sigreturn-tra.patch patches.kernel.org/6.2.12-105-HID-intel-ish-hid-Fix-kernel-panic-during-warm.patch + patches.kernel.org/6.2.12-106-net-sfp-initialize-sfp-i2c_block_size-at-sfp-a.patch ######################################################## # Build fixes that apply to the vanilla kernel too.