OSDN Git Service

net: dsa: microchip: improving error handling for 8-bit register RMW operations
authorOleksij Rempel <o.rempel@pengutronix.de>
Fri, 26 May 2023 07:34:41 +0000 (09:34 +0200)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 30 May 2023 07:48:17 +0000 (09:48 +0200)
This patch refines the error handling mechanism for 8-bit register
read-modify-write operations. In case of a failure, it now logs an error
message detailing the problematic offset. This enhancement aids in
debugging by providing more precise information when these operations
encounter issues.

Furthermore, the ksz_prmw8() function has been updated to return error
values rather than void, enabling calling functions to appropriately
respond to errors.

Additionally, in case of an error that affects both the current and
future accesses, the PHY driver will log the errors consistently, akin
to the existing behavior in all ksz_read*/ksz_write* helpers.

Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/dsa/microchip/ksz_common.h

index 8abecaf..b86f1e2 100644 (file)
@@ -508,7 +508,14 @@ static inline int ksz_write64(struct ksz_device *dev, u32 reg, u64 value)
 
 static inline int ksz_rmw8(struct ksz_device *dev, int offset, u8 mask, u8 val)
 {
-       return regmap_update_bits(dev->regmap[0], offset, mask, val);
+       int ret;
+
+       ret = regmap_update_bits(dev->regmap[0], offset, mask, val);
+       if (ret)
+               dev_err(dev->dev, "can't rmw 8bit reg 0x%x: %pe\n", offset,
+                       ERR_PTR(ret));
+
+       return ret;
 }
 
 static inline int ksz_pread8(struct ksz_device *dev, int port, int offset,
@@ -549,12 +556,21 @@ static inline int ksz_pwrite32(struct ksz_device *dev, int port, int offset,
                           data);
 }
 
-static inline void ksz_prmw8(struct ksz_device *dev, int port, int offset,
-                            u8 mask, u8 val)
+static inline int ksz_prmw8(struct ksz_device *dev, int port, int offset,
+                           u8 mask, u8 val)
 {
-       regmap_update_bits(dev->regmap[0],
-                          dev->dev_ops->get_port_addr(port, offset),
-                          mask, val);
+       int ret;
+
+       ret = regmap_update_bits(dev->regmap[0],
+                                dev->dev_ops->get_port_addr(port, offset),
+                                mask, val);
+       if (ret)
+               dev_err(dev->dev, "can't rmw 8bit reg 0x%x: %pe\n",
+                       dev->dev_ops->get_port_addr(port, offset),
+                       ERR_PTR(ret));
+
+       return ret;
+
 }
 
 static inline void ksz_regmap_lock(void *__mtx)