wifi: mt76: mt7996: support per-band LED control
authorJen-Hao Cheng <jen-hao.cheng@mediatek.com>
Thu, 17 Aug 2023 08:01:54 +0000 (16:01 +0800)
committerFelix Fietkau <nbd@nbd.name>
Sat, 30 Sep 2023 18:03:04 +0000 (20:03 +0200)
Extend settings of LED registers to support per-band configuration.

Signed-off-by: Jen-Hao Cheng <jen-hao.cheng@mediatek.com>
Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7996/init.c
drivers/net/wireless/mediatek/mt76/mt7996/regs.h

index f01fab4a6ab1f077aad13171aee7b27028660c40..cc707a6c98cfc8787ed3953bf22274edb249852d 100644 (file)
@@ -54,23 +54,31 @@ static void mt7996_led_set_config(struct led_classdev *led_cdev,
        dev = container_of(mphy->dev, struct mt7996_dev, mt76);
 
        /* select TX blink mode, 2: only data frames */
-       mt76_rmw_field(dev, MT_TMAC_TCR0(0), MT_TMAC_TCR0_TX_BLINK, 2);
+       mt76_rmw_field(dev, MT_TMAC_TCR0(mphy->band_idx), MT_TMAC_TCR0_TX_BLINK, 2);
 
        /* enable LED */
-       mt76_wr(dev, MT_LED_EN(0), 1);
+       mt76_wr(dev, MT_LED_EN(mphy->band_idx), 1);
 
        /* set LED Tx blink on/off time */
        val = FIELD_PREP(MT_LED_TX_BLINK_ON_MASK, delay_on) |
              FIELD_PREP(MT_LED_TX_BLINK_OFF_MASK, delay_off);
-       mt76_wr(dev, MT_LED_TX_BLINK(0), val);
+       mt76_wr(dev, MT_LED_TX_BLINK(mphy->band_idx), val);
+
+       /* turn LED off */
+       if (delay_off == 0xff && delay_on == 0x0) {
+               val = MT_LED_CTRL_POLARITY | MT_LED_CTRL_KICK;
+       } else {
+               /* control LED */
+               val = MT_LED_CTRL_BLINK_MODE | MT_LED_CTRL_KICK;
+               if (mphy->band_idx == MT_BAND1)
+                       val |= MT_LED_CTRL_BLINK_BAND_SEL;
+       }
 
-       /* control LED */
-       val = MT_LED_CTRL_BLINK_MODE | MT_LED_CTRL_KICK;
        if (mphy->leds.al)
                val |= MT_LED_CTRL_POLARITY;
 
-       mt76_wr(dev, MT_LED_CTRL(0), val);
-       mt76_clear(dev, MT_LED_CTRL(0), MT_LED_CTRL_KICK);
+       mt76_wr(dev, MT_LED_CTRL(mphy->band_idx), val);
+       mt76_clear(dev, MT_LED_CTRL(mphy->band_idx), MT_LED_CTRL_KICK);
 }
 
 static int mt7996_led_set_blink(struct led_classdev *led_cdev,
@@ -223,6 +231,12 @@ mt7996_init_wiphy(struct ieee80211_hw *hw)
                ieee80211_hw_set(hw, SUPPORTS_VHT_EXT_NSS_BW);
        }
 
+       /* init led callbacks */
+       if (IS_ENABLED(CONFIG_MT76_LEDS)) {
+               phy->mt76->leds.cdev.brightness_set = mt7996_led_set_brightness;
+               phy->mt76->leds.cdev.blink_set = mt7996_led_set_blink;
+       }
+
        mt76_set_stream_caps(phy->mt76, true);
        mt7996_set_stream_vht_txbf_caps(phy);
        mt7996_set_stream_he_eht_caps(phy);
@@ -870,12 +884,6 @@ int mt7996_register_device(struct mt7996_dev *dev)
 
        mt7996_init_wiphy(hw);
 
-       /* init led callbacks */
-       if (IS_ENABLED(CONFIG_MT76_LEDS)) {
-               dev->mphy.leds.cdev.brightness_set = mt7996_led_set_brightness;
-               dev->mphy.leds.cdev.blink_set = mt7996_led_set_blink;
-       }
-
        ret = mt76_register_device(&dev->mt76, true, mt76_rates,
                                   ARRAY_SIZE(mt76_rates));
        if (ret)
index 97beab924517bccb80698c05b4db70d27bae05ca..57022906216c5c2a31be739b96666dc37ddab725 100644 (file)
@@ -509,6 +509,7 @@ enum base_rev {
 
 #define MT_LED_CTRL(_n)                                MT_LED_PHYS(0x00 + ((_n) * 4))
 #define MT_LED_CTRL_KICK                       BIT(7)
+#define MT_LED_CTRL_BLINK_BAND_SEL             BIT(4)
 #define MT_LED_CTRL_BLINK_MODE                 BIT(2)
 #define MT_LED_CTRL_POLARITY                   BIT(1)