]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
net: phy: nxp-tja11xx: log critical health state
authorOleksij Rempel <o.rempel@pengutronix.de>
Wed, 11 Aug 2021 06:37:12 +0000 (08:37 +0200)
committerDavid S. Miller <davem@davemloft.net>
Thu, 12 Aug 2021 09:51:45 +0000 (10:51 +0100)
TJA1102 provides interrupt notification for the critical health states
like overtemperature and undervoltage.

The overtemperature bit is set if package temperature is beyond 155C°.
This functionality was tested by heating the package up to 200C°

The undervoltage bit is set if supply voltage drops beyond some critical
threshold. Currently not tested.

In a typical use case, both of this events should be logged and stored
(or send to some remote system) for further investigations.

Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/phy/nxp-tja11xx.c

index afd7afa1f498467e88f49dec13f70cba3637f604..9944cc5018068cdbd9883c94e005080ce2a08833 100644 (file)
 #define MII_INTSRC_LINK_FAIL           BIT(10)
 #define MII_INTSRC_LINK_UP             BIT(9)
 #define MII_INTSRC_MASK                        (MII_INTSRC_LINK_FAIL | MII_INTSRC_LINK_UP)
-#define MII_INTSRC_TEMP_ERR            BIT(1)
 #define MII_INTSRC_UV_ERR              BIT(3)
+#define MII_INTSRC_TEMP_ERR            BIT(1)
 
 #define MII_INTEN                      22
 #define MII_INTEN_LINK_FAIL            BIT(10)
 #define MII_INTEN_LINK_UP              BIT(9)
+#define MII_INTEN_UV_ERR               BIT(3)
+#define MII_INTEN_TEMP_ERR             BIT(1)
 
 #define MII_COMMSTAT                   23
 #define MII_COMMSTAT_LINK_UP           BIT(15)
@@ -607,7 +609,8 @@ static int tja11xx_config_intr(struct phy_device *phydev)
                if (err)
                        return err;
 
-               value = MII_INTEN_LINK_FAIL | MII_INTEN_LINK_UP;
+               value = MII_INTEN_LINK_FAIL | MII_INTEN_LINK_UP |
+                       MII_INTEN_UV_ERR | MII_INTEN_TEMP_ERR;
                err = phy_write(phydev, MII_INTEN, value);
        } else {
                err = phy_write(phydev, MII_INTEN, value);
@@ -622,6 +625,7 @@ static int tja11xx_config_intr(struct phy_device *phydev)
 
 static irqreturn_t tja11xx_handle_interrupt(struct phy_device *phydev)
 {
+       struct device *dev = &phydev->mdio.dev;
        int irq_status;
 
        irq_status = phy_read(phydev, MII_INTSRC);
@@ -630,6 +634,11 @@ static irqreturn_t tja11xx_handle_interrupt(struct phy_device *phydev)
                return IRQ_NONE;
        }
 
+       if (irq_status & MII_INTSRC_TEMP_ERR)
+               dev_warn(dev, "Overtemperature error detected (temp > 155C°).\n");
+       if (irq_status & MII_INTSRC_UV_ERR)
+               dev_warn(dev, "Undervoltage error detected.\n");
+
        if (!(irq_status & MII_INTSRC_MASK))
                return IRQ_NONE;