From 20a7945b82a4aefcb9ca0a14978412e4ae0057c9 Mon Sep 17 00:00:00 2001 From: Robert Marko Date: Tue, 11 Jan 2022 00:28:42 +0100 Subject: [PATCH 07/11] qca807x: add a LED quirk for Xiaomi AX9000 Xiaomi AX9000 has a single LED for each of 4 gigabit ethernet ports that are connected to QCA8075, and that LED is connected to the 100M LED pin. So, by default it will only work when in 10 or 100Mbit mode, this is quite annoying and makes no sense(If they have connected it to the 1000Mbit LED pin then it would have worked for 10/100 by default as well). So, to solve this add a check for system compatible as we cant parse if from DTS in any other way and set the 100M LED to blink on 1000Base-T as well. Signed-off-by: Robert Marko --- include/hsl/phy/malibu_phy.h | 2 ++ src/hsl/phy/malibu_phy.c | 11 +++++++++++ 2 files changed, 13 insertions(+) --- a/include/hsl/phy/malibu_phy.h +++ b/include/hsl/phy/malibu_phy.h @@ -94,6 +94,7 @@ extern "C" #define MALIBU_DAC_CTRL_MASK 0x380 #define MALIBU_DAC_CTRL_VALUE 0x280 #define MALIBU_LED_1000_CTRL1_100_10_MASK 0x30 +#define MALIBU_LED_100_CTRL1_1000_MASK 0x40 #define MALIBU_PHY_EEE_ADV_100M 0x0002 #define MALIBU_PHY_EEE_ADV_1000M 0x0004 @@ -118,6 +119,7 @@ extern "C" #define MALIBU_PHY_MMD7_EGRESS_COUNTER_HIGH 0x802d #define MALIBU_PHY_MMD7_EGRESS_COUNTER_LOW 0x802e #define MALIBU_PHY_MMD7_EGRESS_ERROR_COUNTER 0x802f +#define MALIBU_PHY_MMD7_LED_100_CTRL1 0x8074 #define MALIBU_PHY_MMD7_LED_1000_CTRL1 0x8076 --- a/src/hsl/phy/malibu_phy.c +++ b/src/hsl/phy/malibu_phy.c @@ -15,6 +15,8 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#include + #include "sw.h" #include "fal_port_ctrl.h" #include "hsl_api.h" @@ -2708,6 +2710,15 @@ malibu_phy_hw_init(a_uint32_t dev_id, a_ led_status |= MALIBU_LED_1000_CTRL1_100_10_MASK; malibu_phy_mmd_write(dev_id, phy_addr, MALIBU_PHY_MMD7_NUM, MALIBU_PHY_MMD7_LED_1000_CTRL1, led_status); + if (of_machine_is_compatible("xiaomi,ax9000")) { + /* add 1000M link LED behavior for Xiaomi AX9000 */ + led_status = malibu_phy_mmd_read(dev_id, phy_addr, MALIBU_PHY_MMD7_NUM, + MALIBU_PHY_MMD7_LED_100_CTRL1); + led_status &= ~MALIBU_LED_100_CTRL1_1000_MASK; + led_status |= MALIBU_LED_100_CTRL1_1000_MASK; + malibu_phy_mmd_write(dev_id, phy_addr, MALIBU_PHY_MMD7_NUM, + MALIBU_PHY_MMD7_LED_100_CTRL1, led_status); + } /*disable Extended next page*/ phy_data = malibu_phy_reg_read(dev_id, phy_addr, MALIBU_AUTONEG_ADVERT); phy_data &= ~MALIBU_EXTENDED_NEXT_PAGE_EN;