]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
net: phy: realtek: support for TRIGGER_NETDEV_LINK on RTL8211E and RTL8211F
authorAleksander Jan Bajkowski <olek2@wp.pl>
Mon, 25 Aug 2025 21:09:49 +0000 (23:09 +0200)
committerJakub Kicinski <kuba@kernel.org>
Thu, 28 Aug 2025 00:13:32 +0000 (17:13 -0700)
This patch adds support for the TRIGGER_NETDEV_LINK trigger. It activates
the LED when a link is established, regardless of the speed.

Tested on Orange Pi PC2 with RTL8211E PHY.

Signed-off-by: Aleksander Jan Bajkowski <olek2@wp.pl>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Link: https://patch.msgid.link/20250825211059.143231-1-olek2@wp.pl
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/phy/realtek/realtek_main.c

index b2d0c0f88f751947b32919b02bb8a9a312e5ebec..82d8e1335215d3af1fa12d3f9c5160ac4bd8324f 100644 (file)
@@ -756,7 +756,8 @@ static int rtl8211f_resume(struct phy_device *phydev)
 static int rtl8211x_led_hw_is_supported(struct phy_device *phydev, u8 index,
                                        unsigned long rules)
 {
-       const unsigned long mask = BIT(TRIGGER_NETDEV_LINK_10) |
+       const unsigned long mask = BIT(TRIGGER_NETDEV_LINK) |
+                                  BIT(TRIGGER_NETDEV_LINK_10) |
                                   BIT(TRIGGER_NETDEV_LINK_100) |
                                   BIT(TRIGGER_NETDEV_LINK_1000) |
                                   BIT(TRIGGER_NETDEV_RX) |
@@ -814,6 +815,12 @@ static int rtl8211f_led_hw_control_get(struct phy_device *phydev, u8 index,
        if (val & RTL8211F_LEDCR_LINK_1000)
                __set_bit(TRIGGER_NETDEV_LINK_1000, rules);
 
+       if ((val & RTL8211F_LEDCR_LINK_10) &&
+           (val & RTL8211F_LEDCR_LINK_100) &&
+           (val & RTL8211F_LEDCR_LINK_1000)) {
+               __set_bit(TRIGGER_NETDEV_LINK, rules);
+       }
+
        if (val & RTL8211F_LEDCR_ACT_TXRX) {
                __set_bit(TRIGGER_NETDEV_RX, rules);
                __set_bit(TRIGGER_NETDEV_TX, rules);
@@ -831,14 +838,20 @@ static int rtl8211f_led_hw_control_set(struct phy_device *phydev, u8 index,
        if (index >= RTL8211x_LED_COUNT)
                return -EINVAL;
 
-       if (test_bit(TRIGGER_NETDEV_LINK_10, &rules))
+       if (test_bit(TRIGGER_NETDEV_LINK, &rules) ||
+           test_bit(TRIGGER_NETDEV_LINK_10, &rules)) {
                reg |= RTL8211F_LEDCR_LINK_10;
+       }
 
-       if (test_bit(TRIGGER_NETDEV_LINK_100, &rules))
+       if (test_bit(TRIGGER_NETDEV_LINK, &rules) ||
+           test_bit(TRIGGER_NETDEV_LINK_100, &rules)) {
                reg |= RTL8211F_LEDCR_LINK_100;
+       }
 
-       if (test_bit(TRIGGER_NETDEV_LINK_1000, &rules))
+       if (test_bit(TRIGGER_NETDEV_LINK, &rules) ||
+           test_bit(TRIGGER_NETDEV_LINK_1000, &rules)) {
                reg |= RTL8211F_LEDCR_LINK_1000;
+       }
 
        if (test_bit(TRIGGER_NETDEV_RX, &rules) ||
            test_bit(TRIGGER_NETDEV_TX, &rules)) {
@@ -886,6 +899,12 @@ static int rtl8211e_led_hw_control_get(struct phy_device *phydev, u8 index,
        if (cr2 & RTL8211E_LEDCR2_LINK_1000)
                __set_bit(TRIGGER_NETDEV_LINK_1000, rules);
 
+       if ((cr2 & RTL8211E_LEDCR2_LINK_10) &&
+           (cr2 & RTL8211E_LEDCR2_LINK_100) &&
+           (cr2 & RTL8211E_LEDCR2_LINK_1000)) {
+               __set_bit(TRIGGER_NETDEV_LINK, rules);
+       }
+
        return ret;
 }
 
@@ -913,14 +932,20 @@ static int rtl8211e_led_hw_control_set(struct phy_device *phydev, u8 index,
        if (ret < 0)
                return ret;
 
-       if (test_bit(TRIGGER_NETDEV_LINK_10, &rules))
+       if (test_bit(TRIGGER_NETDEV_LINK, &rules) ||
+           test_bit(TRIGGER_NETDEV_LINK_10, &rules)) {
                cr2 |= RTL8211E_LEDCR2_LINK_10;
+       }
 
-       if (test_bit(TRIGGER_NETDEV_LINK_100, &rules))
+       if (test_bit(TRIGGER_NETDEV_LINK, &rules) ||
+           test_bit(TRIGGER_NETDEV_LINK_100, &rules)) {
                cr2 |= RTL8211E_LEDCR2_LINK_100;
+       }
 
-       if (test_bit(TRIGGER_NETDEV_LINK_1000, &rules))
+       if (test_bit(TRIGGER_NETDEV_LINK, &rules) ||
+           test_bit(TRIGGER_NETDEV_LINK_1000, &rules)) {
                cr2 |= RTL8211E_LEDCR2_LINK_1000;
+       }
 
        cr2 <<= RTL8211E_LEDCR2_SHIFT * index;
        ret = rtl821x_modify_ext_page(phydev, RTL8211E_LEDCR_EXT_PAGE,