net: dsa: microchip: Add error handling for ksz_switch_macaddr_get()
authorOleksij Rempel <o.rempel@pengutronix.de>
Thu, 26 Oct 2023 05:10:49 +0000 (07:10 +0200)
committerJakub Kicinski <kuba@kernel.org>
Fri, 27 Oct 2023 21:43:53 +0000 (14:43 -0700)
Enhance the ksz_switch_macaddr_get() function to handle errors that may
occur during the call to ksz_write8(). Specifically, this update checks
the return value of ksz_write8(), which may fail if regmap ranges
validation is not passed and returns the error code.

Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Reviewed-by: Florian Fainelli <florian.fainelli@broadcom.com>
Reviewed-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Link: https://lore.kernel.org/r/20231026051051.2316937-4-o.rempel@pengutronix.de
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/dsa/microchip/ksz_common.c

index 0c3adc389d0bee85f1de4113ef201cd811ab77bc..00be812bef409c64839aa05d183080134543a74a 100644 (file)
@@ -3640,7 +3640,7 @@ int ksz_switch_macaddr_get(struct dsa_switch *ds, int port,
        struct ksz_switch_macaddr *switch_macaddr;
        struct ksz_device *dev = ds->priv;
        const u16 *regs = dev->info->regs;
-       int i;
+       int i, ret;
 
        /* Make sure concurrent MAC address changes are blocked */
        ASSERT_RTNL();
@@ -3667,10 +3667,20 @@ int ksz_switch_macaddr_get(struct dsa_switch *ds, int port,
        dev->switch_macaddr = switch_macaddr;
 
        /* Program the switch MAC address to hardware */
-       for (i = 0; i < ETH_ALEN; i++)
-               ksz_write8(dev, regs[REG_SW_MAC_ADDR] + i, addr[i]);
+       for (i = 0; i < ETH_ALEN; i++) {
+               ret = ksz_write8(dev, regs[REG_SW_MAC_ADDR] + i, addr[i]);
+               if (ret)
+                       goto macaddr_drop;
+       }
 
        return 0;
+
+macaddr_drop:
+       dev->switch_macaddr = NULL;
+       refcount_set(&switch_macaddr->refcount, 0);
+       kfree(switch_macaddr);
+
+       return ret;
 }
 
 void ksz_switch_macaddr_put(struct dsa_switch *ds)