Commit 77586156 authored by Oleksij Rempel's avatar Oleksij Rempel Committed by Jakub Kicinski
Browse files

net: usb: lan78xx: Add error handling to lan78xx_init_ltm



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: default avatarOleksij Rempel <o.rempel@pengutronix.de>
Reviewed-by: default avatarAndrew Lunn <andrew@lunn.ch>
Link: https://patch.msgid.link/20241204084142.1152696-8-o.rempel@pengutronix.de


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 8b1b2ca8
Loading
Loading
Loading
Loading
+39 −11
Original line number Diff line number Diff line
@@ -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)