]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
net: usb: lan78xx: Add error handling to lan78xx_get_regs
authorOleksij Rempel <o.rempel@pengutronix.de>
Mon, 16 Dec 2024 12:09:36 +0000 (13:09 +0100)
committerJakub Kicinski <kuba@kernel.org>
Wed, 18 Dec 2024 03:51:54 +0000 (19:51 -0800)
Update `lan78xx_get_regs` to handle errors during register and PHY
reads. Log warnings for failed reads and exit the function early if an
error occurs. Drop all previously logged registers to signal
inconsistent readings to the user space. This ensures that invalid data
is not returned to users.

Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
Link: https://patch.msgid.link/20241216120941.1690908-2-o.rempel@pengutronix.de
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/usb/lan78xx.c

index 4661d131b19048e0ace0964cb9f188fdeaab6e97..270345fcad651f0431cd65c4c5d1aa958844a8cf 100644 (file)
@@ -2108,20 +2108,44 @@ static void
 lan78xx_get_regs(struct net_device *netdev, struct ethtool_regs *regs,
                 void *buf)
 {
-       u32 *data = buf;
-       int i, j;
        struct lan78xx_net *dev = netdev_priv(netdev);
+       unsigned int data_count = 0;
+       u32 *data = buf;
+       int i, j, ret;
 
        /* Read Device/MAC registers */
-       for (i = 0; i < ARRAY_SIZE(lan78xx_regs); i++)
-               lan78xx_read_reg(dev, lan78xx_regs[i], &data[i]);
+       for (i = 0; i < ARRAY_SIZE(lan78xx_regs); i++) {
+               ret = lan78xx_read_reg(dev, lan78xx_regs[i], &data[i]);
+               if (ret < 0) {
+                       netdev_warn(dev->net,
+                                   "failed to read register 0x%08x\n",
+                                   lan78xx_regs[i]);
+                       goto clean_data;
+               }
+
+               data_count++;
+       }
 
        if (!netdev->phydev)
                return;
 
        /* Read PHY registers */
-       for (j = 0; j < 32; i++, j++)
-               data[i] = phy_read(netdev->phydev, j);
+       for (j = 0; j < 32; i++, j++) {
+               ret = phy_read(netdev->phydev, j);
+               if (ret < 0) {
+                       netdev_warn(dev->net,
+                                   "failed to read PHY register 0x%02x\n", j);
+                       goto clean_data;
+               }
+
+               data[i] = ret;
+               data_count++;
+       }
+
+       return;
+
+clean_data:
+       memset(data, 0, data_count * sizeof(u32));
 }
 
 static const struct ethtool_ops lan78xx_ethtool_ops = {