* [PATCH net-next 1/7] dt-bindings: net: sff,sfp: update binding
2022-10-21 15:08 [PATCH net-next v2 0/7] net: sfp: improve high power module implementation Russell King (Oracle)
@ 2022-10-21 15:09 ` Russell King (Oracle)
2022-10-21 22:11 ` Rob Herring
2022-10-21 15:09 ` [PATCH net-next 2/7] net: sfp: check firmware provided max power Russell King (Oracle)
` (6 subsequent siblings)
7 siblings, 1 reply; 12+ messages in thread
From: Russell King (Oracle) @ 2022-10-21 15:09 UTC (permalink / raw)
To: David S. Miller, Jakub Kicinski
Cc: Andrew Lunn, devicetree, Eric Dumazet, Heiner Kallweit,
Krzysztof Kozlowski, netdev, Paolo Abeni, Rob Herring
Add a minimum and default for the maximum-power-milliwatt option;
module power levels were originally up to 1W, so this is the default
and the minimum power level we can have for a functional SFP cage.
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
Documentation/devicetree/bindings/net/sff,sfp.yaml | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/Documentation/devicetree/bindings/net/sff,sfp.yaml b/Documentation/devicetree/bindings/net/sff,sfp.yaml
index 06c66ab81c01..231c4d75e4b1 100644
--- a/Documentation/devicetree/bindings/net/sff,sfp.yaml
+++ b/Documentation/devicetree/bindings/net/sff,sfp.yaml
@@ -22,7 +22,8 @@ title: Small Form Factor (SFF) Committee Small Form-factor Pluggable (SFP)
phandle of an I2C bus controller for the SFP two wire serial
maximum-power-milliwatt:
- maxItems: 1
+ minimum: 1000
+ default: 1000
description:
Maximum module power consumption Specifies the maximum power consumption
allowable by a module in the slot, in milli-Watts. Presently, modules can
--
2.30.2
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH net-next 1/7] dt-bindings: net: sff,sfp: update binding
2022-10-21 15:09 ` [PATCH net-next 1/7] dt-bindings: net: sff,sfp: update binding Russell King (Oracle)
@ 2022-10-21 22:11 ` Rob Herring
0 siblings, 0 replies; 12+ messages in thread
From: Rob Herring @ 2022-10-21 22:11 UTC (permalink / raw)
To: Russell King (Oracle)
Cc: Eric Dumazet, Rob Herring, netdev, Jakub Kicinski,
Krzysztof Kozlowski, devicetree, Heiner Kallweit, Andrew Lunn,
David S. Miller, Paolo Abeni
On Fri, 21 Oct 2022 16:09:38 +0100, Russell King (Oracle) wrote:
> Add a minimum and default for the maximum-power-milliwatt option;
> module power levels were originally up to 1W, so this is the default
> and the minimum power level we can have for a functional SFP cage.
>
> Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
> ---
> Documentation/devicetree/bindings/net/sff,sfp.yaml | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
Reviewed-by: Rob Herring <robh@kernel.org>
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH net-next 2/7] net: sfp: check firmware provided max power
2022-10-21 15:08 [PATCH net-next v2 0/7] net: sfp: improve high power module implementation Russell King (Oracle)
2022-10-21 15:09 ` [PATCH net-next 1/7] dt-bindings: net: sff,sfp: update binding Russell King (Oracle)
@ 2022-10-21 15:09 ` Russell King (Oracle)
2022-10-21 15:09 ` [PATCH net-next 3/7] net: sfp: ignore power level 2 prior to SFF-8472 Rev 10.2 Russell King (Oracle)
` (5 subsequent siblings)
7 siblings, 0 replies; 12+ messages in thread
From: Russell King (Oracle) @ 2022-10-21 15:09 UTC (permalink / raw)
To: David S. Miller, Jakub Kicinski
Cc: Andrew Lunn, devicetree, Eric Dumazet, Heiner Kallweit,
Krzysztof Kozlowski, netdev, Paolo Abeni, Rob Herring
Check that the firmware provided maximum power is at least 1W, which
iis the minimum power level for any SFP module.
Now that we enforce the minimum of 1W, we can exit early from
sfp_module_parse_power() if the module power is 1W or less.
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
drivers/net/phy/sfp.c | 18 +++++++++++-------
1 file changed, 11 insertions(+), 7 deletions(-)
diff --git a/drivers/net/phy/sfp.c b/drivers/net/phy/sfp.c
index 40c9a64c5e30..f7ad4d5d9041 100644
--- a/drivers/net/phy/sfp.c
+++ b/drivers/net/phy/sfp.c
@@ -1766,6 +1766,12 @@ static int sfp_module_parse_power(struct sfp *sfp)
if (sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_HIGH_POWER_LEVEL))
power_mW = 2000;
+ /* Power level 1 modules (max. 1W) are always supported. */
+ if (power_mW <= 1000) {
+ sfp->module_power_mW = power_mW;
+ return 0;
+ }
+
supports_a2 = sfp->id.ext.sff8472_compliance !=
SFP_SFF8472_COMPLIANCE_NONE ||
sfp->id.ext.diagmon & SFP_DIAGMON_DDM;
@@ -1789,12 +1795,6 @@ static int sfp_module_parse_power(struct sfp *sfp)
}
}
- if (power_mW <= 1000) {
- /* Modules below 1W do not require a power change sequence */
- sfp->module_power_mW = power_mW;
- return 0;
- }
-
if (!supports_a2) {
/* The module power level is below the host maximum and the
* module appears not to implement bus address 0xa2, so assume
@@ -2729,8 +2729,12 @@ static int sfp_probe(struct platform_device *pdev)
device_property_read_u32(&pdev->dev, "maximum-power-milliwatt",
&sfp->max_power_mW);
- if (!sfp->max_power_mW)
+ if (sfp->max_power_mW < 1000) {
+ if (sfp->max_power_mW)
+ dev_warn(sfp->dev,
+ "Firmware bug: host maximum power should be at least 1W\n");
sfp->max_power_mW = 1000;
+ }
dev_info(sfp->dev, "Host maximum power %u.%uW\n",
sfp->max_power_mW / 1000, (sfp->max_power_mW / 100) % 10);
--
2.30.2
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH net-next 3/7] net: sfp: ignore power level 2 prior to SFF-8472 Rev 10.2
2022-10-21 15:08 [PATCH net-next v2 0/7] net: sfp: improve high power module implementation Russell King (Oracle)
2022-10-21 15:09 ` [PATCH net-next 1/7] dt-bindings: net: sff,sfp: update binding Russell King (Oracle)
2022-10-21 15:09 ` [PATCH net-next 2/7] net: sfp: check firmware provided max power Russell King (Oracle)
@ 2022-10-21 15:09 ` Russell King (Oracle)
2022-10-21 15:09 ` [PATCH net-next 4/7] net: sfp: ignore power level 3 prior to SFF-8472 Rev 11.4 Russell King (Oracle)
` (4 subsequent siblings)
7 siblings, 0 replies; 12+ messages in thread
From: Russell King (Oracle) @ 2022-10-21 15:09 UTC (permalink / raw)
To: David S. Miller, Jakub Kicinski
Cc: Andrew Lunn, devicetree, Eric Dumazet, Heiner Kallweit,
Krzysztof Kozlowski, netdev, Paolo Abeni, Rob Herring
Power level 2 was introduced by SFF-8472 revision 10.2. Ignore
the power declaration bit for modules that are not compliant with
at least this revision.
This should remove any spurious indication of 1.5W modules.
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
drivers/net/phy/sfp.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/net/phy/sfp.c b/drivers/net/phy/sfp.c
index f7ad4d5d9041..a7635b02524a 100644
--- a/drivers/net/phy/sfp.c
+++ b/drivers/net/phy/sfp.c
@@ -1761,7 +1761,8 @@ static int sfp_module_parse_power(struct sfp *sfp)
u32 power_mW = 1000;
bool supports_a2;
- if (sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_POWER_DECL))
+ if (sfp->id.ext.sff8472_compliance >= SFP_SFF8472_COMPLIANCE_REV10_2 &&
+ sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_POWER_DECL))
power_mW = 1500;
if (sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_HIGH_POWER_LEVEL))
power_mW = 2000;
--
2.30.2
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH net-next 4/7] net: sfp: ignore power level 3 prior to SFF-8472 Rev 11.4
2022-10-21 15:08 [PATCH net-next v2 0/7] net: sfp: improve high power module implementation Russell King (Oracle)
` (2 preceding siblings ...)
2022-10-21 15:09 ` [PATCH net-next 3/7] net: sfp: ignore power level 2 prior to SFF-8472 Rev 10.2 Russell King (Oracle)
@ 2022-10-21 15:09 ` Russell King (Oracle)
2022-10-21 15:09 ` [PATCH net-next 5/7] net: sfp: provide a definition for the power level select bit Russell King (Oracle)
` (3 subsequent siblings)
7 siblings, 0 replies; 12+ messages in thread
From: Russell King (Oracle) @ 2022-10-21 15:09 UTC (permalink / raw)
To: David S. Miller, Jakub Kicinski
Cc: Andrew Lunn, devicetree, Eric Dumazet, Heiner Kallweit,
Krzysztof Kozlowski, netdev, Paolo Abeni, Rob Herring
Power level 3 was included in SFF-8472 revision 11.9, but this does
not have a compliance code. Use revision 11.4 as the minimum
compliance level instead.
This should avoid any spurious indication of 2W modules.
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
drivers/net/phy/sfp.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/drivers/net/phy/sfp.c b/drivers/net/phy/sfp.c
index a7635b02524a..af676e28ba6a 100644
--- a/drivers/net/phy/sfp.c
+++ b/drivers/net/phy/sfp.c
@@ -1764,7 +1764,9 @@ static int sfp_module_parse_power(struct sfp *sfp)
if (sfp->id.ext.sff8472_compliance >= SFP_SFF8472_COMPLIANCE_REV10_2 &&
sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_POWER_DECL))
power_mW = 1500;
- if (sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_HIGH_POWER_LEVEL))
+ /* Added in Rev 11.9, but there is no compliance code for this */
+ if (sfp->id.ext.sff8472_compliance >= SFP_SFF8472_COMPLIANCE_REV11_4 &&
+ sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_HIGH_POWER_LEVEL))
power_mW = 2000;
/* Power level 1 modules (max. 1W) are always supported. */
--
2.30.2
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH net-next 5/7] net: sfp: provide a definition for the power level select bit
2022-10-21 15:08 [PATCH net-next v2 0/7] net: sfp: improve high power module implementation Russell King (Oracle)
` (3 preceding siblings ...)
2022-10-21 15:09 ` [PATCH net-next 4/7] net: sfp: ignore power level 3 prior to SFF-8472 Rev 11.4 Russell King (Oracle)
@ 2022-10-21 15:09 ` Russell King (Oracle)
2022-10-21 15:10 ` [PATCH net-next 6/7] net: sfp: add sfp_modify_u8() helper Russell King (Oracle)
` (2 subsequent siblings)
7 siblings, 0 replies; 12+ messages in thread
From: Russell King (Oracle) @ 2022-10-21 15:09 UTC (permalink / raw)
To: David S. Miller, Jakub Kicinski
Cc: Andrew Lunn, devicetree, Eric Dumazet, Heiner Kallweit,
Krzysztof Kozlowski, netdev, Paolo Abeni, Rob Herring
Provide a named definition for the power level select bit in the
extended status register, rather than using BIT(0) in the code.
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
drivers/net/phy/sfp.c | 6 +++---
include/linux/sfp.h | 2 ++
2 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/drivers/net/phy/sfp.c b/drivers/net/phy/sfp.c
index af676e28ba6a..16bce0ea68d9 100644
--- a/drivers/net/phy/sfp.c
+++ b/drivers/net/phy/sfp.c
@@ -1837,13 +1837,13 @@ static int sfp_sm_mod_hpower(struct sfp *sfp, bool enable)
* all bytes 0xff) at 0x51 but does not accept writes. In any case,
* if the bit is already set, we're already in high power mode.
*/
- if (!!(val & BIT(0)) == enable)
+ if (!!(val & SFP_EXT_STATUS_PWRLVL_SELECT) == enable)
return 0;
if (enable)
- val |= BIT(0);
+ val |= SFP_EXT_STATUS_PWRLVL_SELECT;
else
- val &= ~BIT(0);
+ val &= ~SFP_EXT_STATUS_PWRLVL_SELECT;
err = sfp_write(sfp, true, SFP_EXT_STATUS, &val, sizeof(val));
if (err != sizeof(val)) {
diff --git a/include/linux/sfp.h b/include/linux/sfp.h
index d1f343853b6c..01ae9f1dd2ad 100644
--- a/include/linux/sfp.h
+++ b/include/linux/sfp.h
@@ -489,6 +489,8 @@ enum {
SFP_WARN1_RXPWR_LOW = BIT(6),
SFP_EXT_STATUS = 0x76,
+ SFP_EXT_STATUS_PWRLVL_SELECT = BIT(0),
+
SFP_VSL = 0x78,
SFP_PAGE = 0x7f,
};
--
2.30.2
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH net-next 6/7] net: sfp: add sfp_modify_u8() helper
2022-10-21 15:08 [PATCH net-next v2 0/7] net: sfp: improve high power module implementation Russell King (Oracle)
` (4 preceding siblings ...)
2022-10-21 15:09 ` [PATCH net-next 5/7] net: sfp: provide a definition for the power level select bit Russell King (Oracle)
@ 2022-10-21 15:10 ` Russell King (Oracle)
2022-10-21 15:10 ` [PATCH net-next 7/7] net: sfp: get rid of DM7052 hack when enabling high power Russell King (Oracle)
2022-10-25 4:20 ` [PATCH net-next v2 0/7] net: sfp: improve high power module implementation patchwork-bot+netdevbpf
7 siblings, 0 replies; 12+ messages in thread
From: Russell King (Oracle) @ 2022-10-21 15:10 UTC (permalink / raw)
To: David S. Miller, Jakub Kicinski
Cc: Andrew Lunn, devicetree, Eric Dumazet, Heiner Kallweit,
Krzysztof Kozlowski, netdev, Paolo Abeni, Rob Herring
Add a helper to modify bits in a single byte in memory space, and use
it when updating the soft tx-disable flag in the module.
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
drivers/net/phy/sfp.c | 31 ++++++++++++++++++++++---------
1 file changed, 22 insertions(+), 9 deletions(-)
diff --git a/drivers/net/phy/sfp.c b/drivers/net/phy/sfp.c
index 16bce0ea68d9..921bbedd9b22 100644
--- a/drivers/net/phy/sfp.c
+++ b/drivers/net/phy/sfp.c
@@ -608,6 +608,22 @@ static int sfp_write(struct sfp *sfp, bool a2, u8 addr, void *buf, size_t len)
return sfp->write(sfp, a2, addr, buf, len);
}
+static int sfp_modify_u8(struct sfp *sfp, bool a2, u8 addr, u8 mask, u8 val)
+{
+ int ret;
+ u8 old, v;
+
+ ret = sfp_read(sfp, a2, addr, &old, sizeof(old));
+ if (ret != sizeof(old))
+ return ret;
+
+ v = (old & ~mask) | (val & mask);
+ if (v == old)
+ return sizeof(v);
+
+ return sfp_write(sfp, a2, addr, &v, sizeof(v));
+}
+
static unsigned int sfp_soft_get_state(struct sfp *sfp)
{
unsigned int state = 0;
@@ -633,17 +649,14 @@ static unsigned int sfp_soft_get_state(struct sfp *sfp)
static void sfp_soft_set_state(struct sfp *sfp, unsigned int state)
{
- u8 status;
+ u8 mask = SFP_STATUS_TX_DISABLE_FORCE;
+ u8 val = 0;
- if (sfp_read(sfp, true, SFP_STATUS, &status, sizeof(status)) ==
- sizeof(status)) {
- if (state & SFP_F_TX_DISABLE)
- status |= SFP_STATUS_TX_DISABLE_FORCE;
- else
- status &= ~SFP_STATUS_TX_DISABLE_FORCE;
+ if (state & SFP_F_TX_DISABLE)
+ val |= SFP_STATUS_TX_DISABLE_FORCE;
- sfp_write(sfp, true, SFP_STATUS, &status, sizeof(status));
- }
+
+ sfp_modify_u8(sfp, true, SFP_STATUS, mask, val);
}
static void sfp_soft_start_poll(struct sfp *sfp)
--
2.30.2
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH net-next 7/7] net: sfp: get rid of DM7052 hack when enabling high power
2022-10-21 15:08 [PATCH net-next v2 0/7] net: sfp: improve high power module implementation Russell King (Oracle)
` (5 preceding siblings ...)
2022-10-21 15:10 ` [PATCH net-next 6/7] net: sfp: add sfp_modify_u8() helper Russell King (Oracle)
@ 2022-10-21 15:10 ` Russell King (Oracle)
2022-10-25 4:20 ` [PATCH net-next v2 0/7] net: sfp: improve high power module implementation patchwork-bot+netdevbpf
7 siblings, 0 replies; 12+ messages in thread
From: Russell King (Oracle) @ 2022-10-21 15:10 UTC (permalink / raw)
To: David S. Miller, Jakub Kicinski
Cc: Andrew Lunn, devicetree, Eric Dumazet, Heiner Kallweit,
Krzysztof Kozlowski, netdev, Paolo Abeni, Rob Herring
Since we no longer mis-detect high-power mode with the DM7052 module,
we no longer need the hack in sfp_module_enable_high_power(), and can
now switch this to use sfp_modify_u8().
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
drivers/net/phy/sfp.c | 29 ++++++-----------------------
1 file changed, 6 insertions(+), 23 deletions(-)
diff --git a/drivers/net/phy/sfp.c b/drivers/net/phy/sfp.c
index 921bbedd9b22..39fd1811375c 100644
--- a/drivers/net/phy/sfp.c
+++ b/drivers/net/phy/sfp.c
@@ -1837,31 +1837,14 @@ static int sfp_module_parse_power(struct sfp *sfp)
static int sfp_sm_mod_hpower(struct sfp *sfp, bool enable)
{
- u8 val;
int err;
- err = sfp_read(sfp, true, SFP_EXT_STATUS, &val, sizeof(val));
- if (err != sizeof(val)) {
- dev_err(sfp->dev, "Failed to read EEPROM: %pe\n", ERR_PTR(err));
- return -EAGAIN;
- }
-
- /* DM7052 reports as a high power module, responds to reads (with
- * all bytes 0xff) at 0x51 but does not accept writes. In any case,
- * if the bit is already set, we're already in high power mode.
- */
- if (!!(val & SFP_EXT_STATUS_PWRLVL_SELECT) == enable)
- return 0;
-
- if (enable)
- val |= SFP_EXT_STATUS_PWRLVL_SELECT;
- else
- val &= ~SFP_EXT_STATUS_PWRLVL_SELECT;
-
- err = sfp_write(sfp, true, SFP_EXT_STATUS, &val, sizeof(val));
- if (err != sizeof(val)) {
- dev_err(sfp->dev, "Failed to write EEPROM: %pe\n",
- ERR_PTR(err));
+ err = sfp_modify_u8(sfp, true, SFP_EXT_STATUS,
+ SFP_EXT_STATUS_PWRLVL_SELECT,
+ enable ? SFP_EXT_STATUS_PWRLVL_SELECT : 0);
+ if (err != sizeof(u8)) {
+ dev_err(sfp->dev, "failed to %sable high power: %pe\n",
+ enable ? "en" : "dis", ERR_PTR(err));
return -EAGAIN;
}
--
2.30.2
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH net-next v2 0/7] net: sfp: improve high power module implementation
2022-10-21 15:08 [PATCH net-next v2 0/7] net: sfp: improve high power module implementation Russell King (Oracle)
` (6 preceding siblings ...)
2022-10-21 15:10 ` [PATCH net-next 7/7] net: sfp: get rid of DM7052 hack when enabling high power Russell King (Oracle)
@ 2022-10-25 4:20 ` patchwork-bot+netdevbpf
7 siblings, 0 replies; 12+ messages in thread
From: patchwork-bot+netdevbpf @ 2022-10-25 4:20 UTC (permalink / raw)
To: Russell King
Cc: davem, kuba, andrew, devicetree, edumazet, hkallweit1,
krzysztof.kozlowski+dt, netdev, pabeni, robh+dt
Hello:
This series was applied to netdev/net-next.git (master)
by Jakub Kicinski <kuba@kernel.org>:
On Fri, 21 Oct 2022 16:08:29 +0100 you wrote:
> Hi,
>
> This series aims to improve the power level switching between standard
> level 1 and the higher power levels.
>
> The first patch updates the DT binding documentation to include the
> minimum and default of 1W, which is the base level that every SFP cage
> must support. Hence, it makes sense to document this in the binding.
>
> [...]
Here is the summary with links:
- [net-next,1/7] dt-bindings: net: sff,sfp: update binding
https://git.kernel.org/netdev/net-next/c/a272bcb9e5ef
- [net-next,2/7] net: sfp: check firmware provided max power
https://git.kernel.org/netdev/net-next/c/02eaf5a79100
- [net-next,3/7] net: sfp: ignore power level 2 prior to SFF-8472 Rev 10.2
https://git.kernel.org/netdev/net-next/c/18cc659e95ab
- [net-next,4/7] net: sfp: ignore power level 3 prior to SFF-8472 Rev 11.4
https://git.kernel.org/netdev/net-next/c/f8810ca75829
- [net-next,5/7] net: sfp: provide a definition for the power level select bit
https://git.kernel.org/netdev/net-next/c/398900498485
- [net-next,6/7] net: sfp: add sfp_modify_u8() helper
https://git.kernel.org/netdev/net-next/c/a3c536fc7580
- [net-next,7/7] net: sfp: get rid of DM7052 hack when enabling high power
https://git.kernel.org/netdev/net-next/c/bd1432f68ddc
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
^ permalink raw reply [flat|nested] 12+ messages in thread