diff mbox series

[1/1] net: phy: Fix reading LED reg property

Message ID 20230424134003.297827-1-alexander.stein@ew.tq-group.com (mailing list archive)
State Superseded
Delegated to: Netdev Maintainers
Headers show
Series [1/1] net: phy: Fix reading LED reg property | expand

Checks

Context Check Description
netdev/series_format warning Single patches do not need cover letters; Target tree name not specified in the subject
netdev/tree_selection success Guessed tree name to be net-next
netdev/fixes_present success Fixes tag not required for -next series
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 8 this patch: 8
netdev/cc_maintainers success CCed 10 of 10 maintainers
netdev/build_clang fail Errors and warnings before: 13 this patch: 13
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/deprecated_api success None detected
netdev/check_selftest success No net selftest shell script
netdev/verify_fixes success Fixes tag looks correct
netdev/build_allmodconfig_warn fail Errors and warnings before: 14 this patch: 14
netdev/checkpatch success total: 0 errors, 0 warnings, 0 checks, 19 lines checked
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0

Commit Message

Alexander Stein April 24, 2023, 1:40 p.m. UTC
'reg' is always encoded in 32 bits, thus it has to be read using the
function with the corresponding bit width.

Fixes: 01e5b728e9e4 ("net: phy: Add a binding for PHY LEDs")
Signed-off-by: Alexander Stein <alexander.stein@ew.tq-group.com>
---
phy_device::index is u8, so an intermediate step is necessary, without
changing the whole phydev LED API.

 drivers/net/phy/phy_device.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

Comments

Andrew Lunn April 24, 2023, 1:47 p.m. UTC | #1
On Mon, Apr 24, 2023 at 03:40:02PM +0200, Alexander Stein wrote:
> 'reg' is always encoded in 32 bits, thus it has to be read using the
> function with the corresponding bit width.

Hi Alexander

Is this an endian thing? Does it return the wrong value on big endian
systems?

I deliberately used of_property_read_u8() because it will perform a
range check, and if the value is bigger or smaller than 0-256 it will
return an error. Your change does not include such range checks, which
i don't like.

  Andrew
Alexander Stein April 24, 2023, 2:02 p.m. UTC | #2
Hi Andrew,

Am Montag, 24. April 2023, 15:47:14 CEST schrieb Andrew Lunn:
> On Mon, Apr 24, 2023 at 03:40:02PM +0200, Alexander Stein wrote:
> > 'reg' is always encoded in 32 bits, thus it has to be read using the
> > function with the corresponding bit width.
> 
> Hi Alexander
> 
> Is this an endian thing? Does it return the wrong value on big endian
> systems?

It is an endian issue, but the platform's endianess doesn't matter here. The 
encoding for device properties is (always) big-endian, so a 32-bit 'reg' value 
of '2' looks like this:

$ hexdump -C /sys/firmware/devicetree/base/soc@0/bus@30800000/
ethernet@30bf0000/mdio/ethernet-phy@3/leds/led@2/reg
00000000  00 00 00 02                                       |....|
00000004

Using of_property_read_u8 will only read the first byte, thus all values of 
reg result in 0.

> I deliberately used of_property_read_u8() because it will perform a
> range check, and if the value is bigger or smaller than 0-256 it will
> return an error. Your change does not include such range checks, which
> i don't like.

Sure, I can added this check.

Best regards,
Alexander
Andrew Lunn April 24, 2023, 2:51 p.m. UTC | #3
> $ hexdump -C /sys/firmware/devicetree/base/soc@0/bus@30800000/
> ethernet@30bf0000/mdio/ethernet-phy@3/leds/led@2/reg
> 00000000  00 00 00 02                                       |....|
> 00000004
> 
> Using of_property_read_u8 will only read the first byte, thus all values of 
> reg result in 0.

Ah! Thanks for the explanation. And the board i tested only had one
led, at reg = <0>; so it worked.

> > I deliberately used of_property_read_u8() because it will perform a
> > range check, and if the value is bigger or smaller than 0-256 it will
> > return an error. Your change does not include such range checks, which
> > i don't like.
> 
> Sure, I can added this check.

Great, thanks.

       Andrew
diff mbox series

Patch

diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c
index d373446ab5ac..d5c4c7f86a20 100644
--- a/drivers/net/phy/phy_device.c
+++ b/drivers/net/phy/phy_device.c
@@ -3028,6 +3028,7 @@  static int of_phy_led(struct phy_device *phydev,
 	struct led_init_data init_data = {};
 	struct led_classdev *cdev;
 	struct phy_led *phyled;
+	u32 index;
 	int err;
 
 	phyled = devm_kzalloc(dev, sizeof(*phyled), GFP_KERNEL);
@@ -3037,10 +3038,11 @@  static int of_phy_led(struct phy_device *phydev,
 	cdev = &phyled->led_cdev;
 	phyled->phydev = phydev;
 
-	err = of_property_read_u8(led, "reg", &phyled->index);
+	err = of_property_read_u32(led, "reg", &index);
 	if (err)
 		return err;
 
+	phyled->index = index;
 	if (phydev->drv->led_brightness_set)
 		cdev->brightness_set_blocking = phy_led_set_brightness;
 	if (phydev->drv->led_blink_set)