]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: usb: lan78xx: Add error handling to lan78xx_init_ltm
authorOleksij Rempel <o.rempel@pengutronix.de>
Wed, 4 Dec 2024 08:41:39 +0000 (09:41 +0100)
committerJakub Kicinski <kuba@kernel.org>
Sat, 7 Dec 2024 01:53:07 +0000 (17:53 -0800)
Convert `lan78xx_init_ltm` to return error codes and handle errors
properly.  Previously, errors during the LTM initialization process were
not propagated, potentially leading to undetected issues. This patch
ensures:

- Errors in `lan78xx_read_reg` and `lan78xx_write_reg` are checked and
  handled.
- Errors are logged with detailed messages using `%pe` for clarity.
- The function exits immediately on error, returning the error code.

Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Link: https://patch.msgid.link/20241204084142.1152696-8-o.rempel@pengutronix.de
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/usb/lan78xx.c

index 29f6e1a36e206fc5988348f0acdafba666de2ef4..33cda7f3dd12e8294b923172f7a90f2f006028f4 100644 (file)
@@ -2807,13 +2807,16 @@ static int lan78xx_vlan_rx_kill_vid(struct net_device *netdev,
        return 0;
 }
 
-static void lan78xx_init_ltm(struct lan78xx_net *dev)
+static int lan78xx_init_ltm(struct lan78xx_net *dev)
 {
+       u32 regs[6] = { 0 };
        int ret;
        u32 buf;
-       u32 regs[6] = { 0 };
 
        ret = lan78xx_read_reg(dev, USB_CFG1, &buf);
+       if (ret < 0)
+               goto init_ltm_failed;
+
        if (buf & USB_CFG1_LTM_ENABLE_) {
                u8 temp[2];
                /* Get values from EEPROM first */
@@ -2824,7 +2827,7 @@ static void lan78xx_init_ltm(struct lan78xx_net *dev)
                                                              24,
                                                              (u8 *)regs);
                                if (ret < 0)
-                                       return;
+                                       return ret;
                        }
                } else if (lan78xx_read_otp(dev, 0x3F, 2, temp) == 0) {
                        if (temp[0] == 24) {
@@ -2833,17 +2836,40 @@ static void lan78xx_init_ltm(struct lan78xx_net *dev)
                                                           24,
                                                           (u8 *)regs);
                                if (ret < 0)
-                                       return;
+                                       return ret;
                        }
                }
        }
 
-       lan78xx_write_reg(dev, LTM_BELT_IDLE0, regs[0]);
-       lan78xx_write_reg(dev, LTM_BELT_IDLE1, regs[1]);
-       lan78xx_write_reg(dev, LTM_BELT_ACT0, regs[2]);
-       lan78xx_write_reg(dev, LTM_BELT_ACT1, regs[3]);
-       lan78xx_write_reg(dev, LTM_INACTIVE0, regs[4]);
-       lan78xx_write_reg(dev, LTM_INACTIVE1, regs[5]);
+       ret = lan78xx_write_reg(dev, LTM_BELT_IDLE0, regs[0]);
+       if (ret < 0)
+               goto init_ltm_failed;
+
+       ret = lan78xx_write_reg(dev, LTM_BELT_IDLE1, regs[1]);
+       if (ret < 0)
+               goto init_ltm_failed;
+
+       ret = lan78xx_write_reg(dev, LTM_BELT_ACT0, regs[2]);
+       if (ret < 0)
+               goto init_ltm_failed;
+
+       ret = lan78xx_write_reg(dev, LTM_BELT_ACT1, regs[3]);
+       if (ret < 0)
+               goto init_ltm_failed;
+
+       ret = lan78xx_write_reg(dev, LTM_INACTIVE0, regs[4]);
+       if (ret < 0)
+               goto init_ltm_failed;
+
+       ret = lan78xx_write_reg(dev, LTM_INACTIVE1, regs[5]);
+       if (ret < 0)
+               goto init_ltm_failed;
+
+       return 0;
+
+init_ltm_failed:
+       netdev_err(dev->net, "Failed to init LTM with error %pe\n", ERR_PTR(ret));
+       return ret;
 }
 
 static int lan78xx_urb_config_init(struct lan78xx_net *dev)
@@ -2939,7 +2965,9 @@ static int lan78xx_reset(struct lan78xx_net *dev)
                return ret;
 
        /* Init LTM */
-       lan78xx_init_ltm(dev);
+       ret = lan78xx_init_ltm(dev);
+       if (ret < 0)
+               return ret;
 
        ret = lan78xx_write_reg(dev, BURST_CAP, dev->burst_cap);
        if (ret < 0)